async function clear_output() {
let elem = document.getElementById('code-result');
+ elem.className = ""; // NOTE: This clears all the classes, not just the "errored" one!
elem.innerHTML = "";
}
-async function write_output(msg) {
+async function write_output(msg, has_error) {
let elem = document.getElementById('code-result');
+ if (has_error != null && has_error) elem.className = "errored";
elem.innerHTML += msg;
}
write_output(e.data.data);
break;
}
+
+ case 'errored': {
+ write_output(e.data.data, true);
+ break;
+ }
case 'terminated': {
wasm_worker = null;
async function submit_code() {
clear_output();
- let code = ace.edit('code-editor').getValue();
+ let editor = ace.edit('code-editor');
+ let code = editor.getValue();
let response = await fetch(window.ROOT_ENDPOINT + "/compile", {
method: 'POST',
if (response.status == 200) {
// Successful compile
+ // Clear errors in the gutter first
+ editor.getSession().setAnnotations([]);
+
run_wasm(await response.arrayBuffer());
} else {
// Compile error
- write_output("Failed to compile code\n");
- write_output(await response.text());
+ let response_text = await response.text();
+
+ write_output("Failed to compile code\n", true);
+ write_output(response_text, true);
+
+ // Add the errors as gutter items in ACE
+ let annotations = [];
+ let lines = response_text.split("\n");
+ for (let line of lines) {
+ let e = /\(\/tmp\/[^:]+:(\d+),(\d+)\) (.*)/.exec(line);
+ if (e != null) {
+ annotations.push({
+ row: parseInt(e[1]) - 1,
+ column: parseInt(e[2]),
+ text: e[3],
+ type: "error",
+ });
+ }
+ }
+
+ editor.getSession().setAnnotations(annotations);
}
}