From f2646c44c3a1321f6d8228463c7636fc6a74f22e Mon Sep 17 00:00:00 2001 From: Sam Pottinger Date: Sun, 20 Aug 2023 14:01:27 -0700 Subject: [PATCH] Better EDT error placement. --- .../app/syntax/PdeTextAreaPainter.java | 6 ++- app/src/processing/app/ui/Editor.java | 18 +++++++- .../processing/mode/java/ErrorChecker.java | 2 +- .../processing/mode/java/lsp/PdeAdapter.java | 45 +++++++++++++------ 4 files changed, 52 insertions(+), 19 deletions(-) diff --git a/app/src/processing/app/syntax/PdeTextAreaPainter.java b/app/src/processing/app/syntax/PdeTextAreaPainter.java index 2c83a518b..a19fcba58 100644 --- a/app/src/processing/app/syntax/PdeTextAreaPainter.java +++ b/app/src/processing/app/syntax/PdeTextAreaPainter.java @@ -151,7 +151,8 @@ public class PdeTextAreaPainter extends TextAreaPainter { int lineOffsetStop = textArea.getLineStopOffset(line); int wiggleStart = lineOffsetStart + problem.getStartOffset(); - int wiggleStop = lineOffsetStart + problem.getStopOffset(); + int stopOffset = Editor.getProblemEditorLineStop(problem, lineOffsetStart, lineOffsetStop); + int wiggleStop = lineOffsetStart + stopOffset; int y = textArea.lineToY(line) + getLineDisplacement(); @@ -330,7 +331,8 @@ public class PdeTextAreaPainter extends TextAreaPainter { int lineEnd = textArea.getLineStopOffset(line); int errorStart = lineStart + problem.getStartOffset(); - int errorEnd = lineStart + problem.getStopOffset(); + int stopOffsetLine = Editor.getProblemEditorLineStop(problem, lineStart, lineEnd); + int errorEnd = lineStart + stopOffsetLine; int startOffset = Math.max(errorStart, lineStart) - lineStart; int stopOffset = Math.min(errorEnd, lineEnd) - lineStart; diff --git a/app/src/processing/app/ui/Editor.java b/app/src/processing/app/ui/Editor.java index 911df7a49..966099693 100644 --- a/app/src/processing/app/ui/Editor.java +++ b/app/src/processing/app/ui/Editor.java @@ -1028,6 +1028,16 @@ public abstract class Editor extends JFrame implements RunnerListener { } } + static public int getProblemEditorLineStop(Problem problem, int lineStart, int lineStop) { + int stopOffset = problem.getStopOffset(); + System.out.println("> " + lineStart + " " + lineStop + " " + stopOffset); + if (stopOffset == -1) { + stopOffset = lineStop - lineStart; + } + System.out.println("< " + lineStart + " " + lineStop + " " + stopOffset); + return stopOffset; + } + // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . @@ -2563,8 +2573,11 @@ public abstract class Editor extends JFrame implements RunnerListener { int tabIndex = p.getTabIndex(); int lineNumber = p.getLineNumber(); int lineStart = textarea.getLineStartOffset(lineNumber); + int lineEnd = textarea.getLineStopOffset(lineNumber); int tabToStartOffset = lineStart + p.getStartOffset(); - int tabToStopOffset = lineStart + p.getStopOffset(); + + int lineStopOffset = getProblemEditorLineStop(p, lineStart, lineEnd); + int tabToStopOffset = lineStart + lineStopOffset; highlight(tabIndex, tabToStartOffset, tabToStopOffset); } @@ -2631,7 +2644,8 @@ public abstract class Editor extends JFrame implements RunnerListener { .filter(p -> { int pStartLine = p.getLineNumber(); int lineOffset = textarea.getLineStartOffset(pStartLine); - int pEndOffset = lineOffset + p.getStopOffset(); + int stopOffset = p.getStopOffset(); + int pEndOffset = lineOffset + (stopOffset == -1 ? 0 : stopOffset); int pEndLine = textarea.getLineOfOffset(pEndOffset); return line >= pStartLine && line <= pEndLine; diff --git a/java/src/processing/mode/java/ErrorChecker.java b/java/src/processing/mode/java/ErrorChecker.java index e631fbd4f..512d71d57 100644 --- a/java/src/processing/mode/java/ErrorChecker.java +++ b/java/src/processing/mode/java/ErrorChecker.java @@ -199,7 +199,7 @@ public class ErrorChecker { String badCode = ps.getPdeCode(in); int line = ps.tabOffsetToTabLine(in.tabIndex, in.startTabOffset); JavaProblem p = JavaProblem.fromIProblem(iproblem, in.tabIndex, line, badCode); - p.setPDEOffsets(0, iproblem.getSourceEnd() - iproblem.getSourceStart()); + p.setPDEOffsets(0, -1); return p; } return null; diff --git a/java/src/processing/mode/java/lsp/PdeAdapter.java b/java/src/processing/mode/java/lsp/PdeAdapter.java index 1a58f3c8e..65925e7a7 100644 --- a/java/src/processing/mode/java/lsp/PdeAdapter.java +++ b/java/src/processing/mode/java/lsp/PdeAdapter.java @@ -110,6 +110,12 @@ class PdeAdapter { return new Offset(line, col); } + static Offset toLineEndCol(String s, int offset) { + Offset before = toLineCol(s, offset); + int remaining = s.substring(offset).indexOf('\n'); + return new Offset(before.line, before.col + remaining); + } + /** * Converts a tabOffset to a position within a tab @@ -232,21 +238,32 @@ class PdeAdapter { int startOffset = prob.getStartOffset(); int endOffset = prob.getStopOffset(); + Position startPosition = new Position( + prob.getLineNumber(), + PdeAdapter + .toLineCol(code.getProgram(), startOffset) + .col - 1 + ); + + Position stopPosition; + if (endOffset == -1) { + stopPosition = new Position( + prob.getLineNumber(), + PdeAdapter + .toLineEndCol(code.getProgram(), startOffset) + .col - 1 + ); + } else { + stopPosition = new Position( + prob.getLineNumber(), + PdeAdapter + .toLineCol(code.getProgram(), endOffset) + .col - 1 + ); + } + Diagnostic dia = new Diagnostic( - new Range( - new Position( - prob.getLineNumber(), - PdeAdapter - .toLineCol(code.getProgram(), startOffset) - .col - 1 - ), - new Position( - prob.getLineNumber(), - PdeAdapter - .toLineCol(code.getProgram(), endOffset) - .col - 1 - ) - ), + new Range(startPosition, stopPosition), prob.getMessage() ); dia.setSeverity(