diff --git a/src/main/java/jace/assembly/AcmeCompiler.java b/src/main/java/jace/assembly/AcmeCompiler.java index 8990541..7de9c98 100644 --- a/src/main/java/jace/assembly/AcmeCompiler.java +++ b/src/main/java/jace/assembly/AcmeCompiler.java @@ -24,7 +24,8 @@ public class AcmeCompiler implements CompileResult { boolean successful = false; File compiledAsset = null; - Map errorsAndWarnings = new LinkedHashMap<>(); + Map errors = new LinkedHashMap<>(); + Map warnings = new LinkedHashMap<>(); List otherWarnings = new ArrayList<>(); List rawOutput = new ArrayList<>(); @@ -39,8 +40,13 @@ public class AcmeCompiler implements CompileResult { } @Override - public Map getErrorsAndWarnings() { - return errorsAndWarnings; + public Map getErrors() { + return errors; + } + + @Override + public Map getWarnings() { + return warnings; } @Override @@ -101,11 +107,33 @@ public class AcmeCompiler implements CompileResult { restoreSystemOutput(); System.setProperty("user.dir", oldPath); } - String output = baosOut.toString(); - String errors = baosErr.toString(); - System.out.println("output: "+output); - System.out.println("error: "+errors); - + rawOutput.add("Error output:"); + extractOutput(baosErr.toString()); + rawOutput.add(""); + rawOutput.add("------------------------------"); + rawOutput.add("Standard output:"); + extractOutput(baosOut.toString()); + } + + public void extractOutput(String output) throws NumberFormatException { + for (String line : output.split("\\n")) { + rawOutput.add(line); + int lineNumberStart = line.indexOf(", line") + 6; + if (lineNumberStart > 6) { + int lineNumberEnd = line.indexOf(' ', lineNumberStart+1); + int actualLineNumber = Integer.parseUnsignedInt(line.substring(lineNumberStart, lineNumberEnd).trim()); + String message = line.substring(lineNumberEnd).trim(); + if (line.startsWith("Error")) { + errors.put(actualLineNumber, message); + } else { + warnings.put(actualLineNumber, message); + } + } else { + if (line.trim().length() > 1) { + otherWarnings.add(line); + } + } + } } public void restoreSystemOutput() { diff --git a/src/main/java/jace/ide/CompileResult.java b/src/main/java/jace/ide/CompileResult.java index db88503..0b01e8e 100644 --- a/src/main/java/jace/ide/CompileResult.java +++ b/src/main/java/jace/ide/CompileResult.java @@ -13,7 +13,9 @@ public interface CompileResult { public T getCompiledAsset(); - public Map getErrorsAndWarnings(); + public Map getErrors(); + + public Map getWarnings(); public List getOtherMessages(); diff --git a/src/main/java/jace/ide/IdeController.java b/src/main/java/jace/ide/IdeController.java index 86e01d3..47b3fa4 100644 --- a/src/main/java/jace/ide/IdeController.java +++ b/src/main/java/jace/ide/IdeController.java @@ -18,6 +18,7 @@ import javafx.collections.ListChangeListener; import javafx.event.ActionEvent; import javafx.event.Event; import javafx.fxml.FXML; +import javafx.scene.control.Label; import javafx.scene.control.Menu; import javafx.scene.control.MenuItem; import javafx.scene.control.Tab; @@ -200,12 +201,18 @@ public class IdeController { @FXML void executeClicked(ActionEvent event) { - getCurrentProgram().ifPresent(proxy -> proxy.execute()); + getCurrentProgram().ifPresent(program -> { + program.execute(); + updateStatusMessages(program.lastResult); + }); } @FXML void testCompileClicked(ActionEvent event) { - getCurrentProgram().ifPresent(proxy -> proxy.test()); + getCurrentProgram().ifPresent(program -> { + program.test(); + updateStatusMessages(program.lastResult); + }); } @FXML @@ -242,4 +249,12 @@ public class IdeController { runMenu.setDisable(hasNoItems); }); } + + private void updateStatusMessages(CompileResult lastResult) { + String message = "Compiler was " + (lastResult.isSuccessful() ? " successful" : " NOT SUCCESSFUL"); + message += " -- "; + message += lastResult.getErrors().size() + " error(s) and "+lastResult.getWarnings().size()+" warning(s) reported."; + statusBar.getItems().clear(); + statusBar.getItems().add(new Label(message)); + } } diff --git a/src/main/java/jace/ide/Program.java b/src/main/java/jace/ide/Program.java index 2fa24f0..405e7ae 100644 --- a/src/main/java/jace/ide/Program.java +++ b/src/main/java/jace/ide/Program.java @@ -29,36 +29,6 @@ public class Program { public static String CODEMIRROR_EDITOR = "/codemirror/editor.html"; - public void save(File newTarget) { - FileWriter writer = null; - if (newTarget == null && targetFile == null) { - return; - } - if (newTarget != null) { - targetFile = newTarget; - } - filename = targetFile.getName(); - try { - writer = new FileWriter(targetFile, false); - writer.append(getValue()); - writer.close(); - } catch (IOException ex) { - Logger.getLogger(Program.class.getName()).log(Level.SEVERE, null, ex); - } finally { - try { - if (writer != null) { - writer.close(); - } - } catch (IOException ex) { - Logger.getLogger(Program.class.getName()).log(Level.SEVERE, null, ex); - } - } - } - - public boolean isChanged() { - return (Boolean) codeMirror.call("isClean"); - } - public static enum DocumentType { applesoft(new ApplesoftHandler(), "textfile", "*.bas"), assembly(new AssemblyHandler(), "textfile", "*.a", "*.s", "*.asm"), plain(new TextHandler(), "textfile", "*.txt"), hex(new TextHandler(), "textfile", "*.bin", "*.raw"); @@ -165,7 +135,8 @@ public class Program { public void createEditor() { String document = targetFile == null ? getHandler().getNewDocumentContent() : getFileContents(targetFile); String optionString = buildOptions(); - codeMirror = (JSObject) editor.getEngine().executeScript("CodeMirror(document.body, " + optionString + ");"); + editor.getEngine().executeScript("var codeMirror = CodeMirror(document.body, " + optionString + ");"); + codeMirror = (JSObject) editor.getEngine().executeScript("codeMirror"); setValue(document); } @@ -195,6 +166,37 @@ public class Program { return ""; } + + public void save(File newTarget) { + FileWriter writer = null; + if (newTarget == null && targetFile == null) { + return; + } + if (newTarget != null) { + targetFile = newTarget; + } + filename = targetFile.getName(); + try { + writer = new FileWriter(targetFile, false); + writer.append(getValue()); + writer.close(); + } catch (IOException ex) { + Logger.getLogger(Program.class.getName()).log(Level.SEVERE, null, ex); + } finally { + try { + if (writer != null) { + writer.close(); + } + } catch (IOException ex) { + Logger.getLogger(Program.class.getName()).log(Level.SEVERE, null, ex); + } + } + } + + public boolean isChanged() { + return (Boolean) codeMirror.call("isClean"); + } + private String buildOptions() { StringBuilder builder = new StringBuilder(); builder.append("{"); @@ -215,6 +217,7 @@ public class Program { public void execute() { lastResult = getHandler().compile(this); + manageCompileResult(lastResult); if (lastResult.isSuccessful()) { getHandler().execute(lastResult); } @@ -222,8 +225,23 @@ public class Program { public void test() { lastResult = getHandler().compile(this); + manageCompileResult(lastResult); } + private void manageCompileResult(CompileResult lastResult) { + editor.getEngine().executeScript("clearHighlights()"); + lastResult.getWarnings().forEach((line,message) -> + editor.getEngine().executeScript("highlightLine("+line+",false,\""+escapeString(message)+"\");") + ); + lastResult.getErrors().forEach((line,message) -> + editor.getEngine().executeScript("highlightLine("+line+",true,\""+escapeString(message)+"\");") + ); + } + + private String escapeString(Object message) { + return String.valueOf(message).replaceAll("\\\"", """); + } + public void log(String message) { System.out.println(message); } diff --git a/src/main/java/jace/ide/TextHandler.java b/src/main/java/jace/ide/TextHandler.java index 674ecd4..535ab41 100644 --- a/src/main/java/jace/ide/TextHandler.java +++ b/src/main/java/jace/ide/TextHandler.java @@ -32,7 +32,12 @@ class TextHandler implements LanguageHandler { } @Override - public Map getErrorsAndWarnings() { + public Map getErrors() { + return Collections.EMPTY_MAP; + } + + @Override + public Map getWarnings() { return Collections.EMPTY_MAP; } diff --git a/src/main/resources/codemirror/editor.html b/src/main/resources/codemirror/editor.html index bbd763c..dd058c6 100644 --- a/src/main/resources/codemirror/editor.html +++ b/src/main/resources/codemirror/editor.html @@ -1,6 +1,7 @@ Jace IDE + @@ -14,6 +15,38 @@ overflow-x: hidden; overflow-y: hidden; } + .line-error { + background: #FBC2C4 !important; + color: #8a1f11 !important; + } + .line-warning { + background: #F8FFAB !important; + color: #000080 !important; + } + \ No newline at end of file