diff --git a/app/src/processing/app/syntax/PdeTextAreaPainter.java b/app/src/processing/app/syntax/PdeTextAreaPainter.java index b49875ab2..b63fa5674 100644 --- a/app/src/processing/app/syntax/PdeTextAreaPainter.java +++ b/app/src/processing/app/syntax/PdeTextAreaPainter.java @@ -147,6 +147,7 @@ public class PdeTextAreaPainter extends TextAreaPainter { protected void paintErrorLine(Graphics gfx, int line, int x) { List problems = getEditor().findProblems(line); for (Problem problem : problems) { + System.out.println("here"); int lineOffsetStart = textArea.getLineStartOffset(line); int lineOffsetStop = textArea.getLineStopOffset(line); @@ -326,7 +327,7 @@ public class PdeTextAreaPainter extends TextAreaPainter { public String getToolTipText(MouseEvent event) { fontMetrics = getFontMetrics(); int line = event.getY() / fontMetrics.getHeight() + textArea.getFirstLine(); - if (line >= 0 || line < textArea.getLineCount()) {getPreprocessIssues + if (line >= 0 || line < textArea.getLineCount()) { List problems = getEditor().findProblems(line); for (Problem problem : problems) { int lineStart = textArea.getLineStartOffset(line); @@ -338,8 +339,6 @@ public class PdeTextAreaPainter extends TextAreaPainter { int startOffset = Math.max(errorStart, lineStart) - lineStart; int stopOffset = Math.min(errorEnd, lineEnd) - lineStart; - System.out.println(lineStart + "\t" + lineEnd + "\t" + errorStart + "\t" + errorEnd + "\t" + startOffset + "\t" + stopOffset); - int x = event.getX(); if (x >= textArea.offsetToX(line, startOffset) && diff --git a/app/src/processing/app/ui/Editor.java b/app/src/processing/app/ui/Editor.java index d81ffdc2a..a7e588585 100644 --- a/app/src/processing/app/ui/Editor.java +++ b/app/src/processing/app/ui/Editor.java @@ -2630,10 +2630,11 @@ public abstract class Editor extends JFrame implements RunnerListener { .filter(p -> p.getTabIndex() == currentTab) .filter(p -> { int pStartLine = p.getLineNumber(); - int lineOffset = textarea.getLineOfOffset(pStartLine); + int lineOffset = textarea.getLineStartOffset(pStartLine); int pEndOffset = lineOffset + p.getStopOffset(); int pEndLine = textarea.getLineOfOffset(pEndOffset); + System.out.println(line + "\t" + pStartLine + "\t" + pEndLine); return line >= pStartLine && line <= pEndLine; }) .collect(Collectors.toList()); diff --git a/java/src/processing/mode/java/JavaEditor.java b/java/src/processing/mode/java/JavaEditor.java index 338a6bd29..198c1150c 100644 --- a/java/src/processing/mode/java/JavaEditor.java +++ b/java/src/processing/mode/java/JavaEditor.java @@ -118,7 +118,7 @@ public class JavaEditor extends Editor { // setting breakpoints will flag sketch as modified, so override this here getSketch().setModified(false); - preprocService = new PreprocService(this.jmode, this.sketch); + preprocService = new PreprocService(this.jmode, this.sketch, this); // long t5 = System.currentTimeMillis(); diff --git a/java/src/processing/mode/java/PreprocService.java b/java/src/processing/mode/java/PreprocService.java index 8557f6f39..3d59032b6 100644 --- a/java/src/processing/mode/java/PreprocService.java +++ b/java/src/processing/mode/java/PreprocService.java @@ -93,13 +93,15 @@ public class PreprocService { private volatile boolean running; private CompletableFuture preprocessingTask = new CompletableFuture<>(); + private JavaEditor editor; + private CompletableFuture lastCallback = new CompletableFuture<>() {{ complete(null); // initialization block }}; /** - * Create a new preprocessing service to support an editor. + * Create a new preprocessing service to support the language server. */ public PreprocService(JavaMode javaMode, Sketch sketch) { this.javaMode = javaMode; @@ -112,6 +114,21 @@ public class PreprocService { preprocessingThread.start(); } + /** + * Create a new preprocessing service to support an editor. + */ + public PreprocService(JavaMode javaMode, Sketch sketch, JavaEditor editor) { + this.javaMode = javaMode; + this.sketch = sketch; + this.editor = editor; + + // Register listeners for first run + whenDone(this::fireListeners); + + preprocessingThread = new Thread(this::mainLoop, "ECS"); + preprocessingThread.start(); + } + /** * The "main loop" for the background thread that checks for code issues. */ @@ -411,10 +428,18 @@ public class PreprocService { throw new RuntimeException("Unexpected sketch exception in preprocessing: " + e); } + final int endNumLines = numLines; + if (preprocessorResult.getPreprocessIssues().size() > 0) { - preprocessorResult.getPreprocessIssues().stream() + if (editor == null) { + preprocessorResult.getPreprocessIssues().stream() .map((x) -> ProblemFactory.build(x, tabLineStarts)) .forEach(result.otherProblems::add); + } else { + preprocessorResult.getPreprocessIssues().stream() + .map((x) -> ProblemFactory.build(x, tabLineStarts, endNumLines, editor)) + .forEach(result.otherProblems::add); + } result.hasSyntaxErrors = true; }