On exit, augment the stacktrace and link it to the editors

This commit is contained in:
Ralf Teusner
2016-07-04 17:36:26 +02:00
parent 6e7c250ad1
commit 34fc1c4504

View File

@ -19,6 +19,15 @@ $(function() {
var SERVER_SEND_EVENT = 2;
var editors = [];
var editor_for_file = new Map();
var tracepositions_regexes = {
python: /File "(.+?)", line (\d+)/g,
java: /(.*\.java):(\d):/g
};
var tracepositions_regex;
var active_file = undefined;
var active_frame = undefined;
var running = false;
@ -404,12 +413,23 @@ $(function() {
editor.setTheme(THEME);
editor.commands.bindKey("ctrl+alt+0", null);
editors.push(editor);
editor_for_file.set($(element).parent().data('filename'), editor);
var session = editor.getSession();
session.setMode($(element).data('mode'));
session.setTabSize($(element).data('indent-size'));
session.setUseSoftTabs(true);
session.setUseWrapMode(true);
// set regex for parsing error traces based on the mode of the main file.
if( $(element).parent().data('role') == "main_file"){
var mode = $(element).data('mode');
if(mode == "ace/mode/python"){
tracepositions_regex = tracepositions_regexes.python;
} else if (mode = "ace/mode/java"){
tracepositions_regex = tracepositions_regexes.java;
}
}
var file_id = $(element).data('id');
/*
@ -876,7 +896,9 @@ $(function() {
}
var showWorkspaceTab = function(event) {
event.preventDefault();
if(event){
event.preventDefault();
}
showTab(0);
};
@ -1036,6 +1058,7 @@ $(function() {
case 'exit':
killWebsocketAndContainer();
handleStderrOutputForFlowr();
augmentStacktraceInOutput();
break;
case 'timeout':
// just show the timeout message here. Another exit command is sent by the rails backend when the socket to the docker container closes.
@ -1047,6 +1070,41 @@ $(function() {
}
};
var jumpToSourceLine = function(event){
var file = $(event.target).data('file');
var line = $(event.target).data('line');
showWorkspaceTab(null);
// set active file ?!?!
var frame = $('div.frame[data-filename="' + file + '"]');
showFrame(frame);
var editor = editor_for_file.get(file);
editor.gotoLine(line, 0);
};
var augmentStacktraceInOutput = function() {
if(tracepositions_regex){
var element = $('#output>pre');
var text = element.text();
element.on( "click", "a", jumpToSourceLine);
var matches;
while(matches = tracepositions_regex.exec(text)){
var frame = $('div.frame[data-filename="' + matches[1] + '"]')
if(frame.length > 0){
element.html(text.replace(matches[0], "<a href='#' data-file='" + matches[1] + "' data-line='" + matches[2] + "'>" + matches[0] + "</a>"));
}
}
}
};
var renderWebsocketOutput = function(msg){
var element = findOrCreateRenderElement(0);
element.append(msg.data);