From 5dcbb3b7cda9b66a6db3afdf7faa7f644fc32376 Mon Sep 17 00:00:00 2001 From: Danny van Bruggen <55701+matozoid@users.noreply.github.com> Date: Thu, 15 Jul 2021 21:54:54 +0200 Subject: [PATCH 1/2] Issue #2, "some syntax errors don't get highlighted" --- .../parser/ANTLRParseTreeToPSIConverter.java | 19 +++++++++++++++---- .../adaptor/parser/SyntaxErrorListener.java | 12 +++++++++--- 2 files changed, 24 insertions(+), 7 deletions(-) diff --git a/src/main/java/org/antlr/intellij/adaptor/parser/ANTLRParseTreeToPSIConverter.java b/src/main/java/org/antlr/intellij/adaptor/parser/ANTLRParseTreeToPSIConverter.java index a2fd340..37e5b24 100644 --- a/src/main/java/org/antlr/intellij/adaptor/parser/ANTLRParseTreeToPSIConverter.java +++ b/src/main/java/org/antlr/intellij/adaptor/parser/ANTLRParseTreeToPSIConverter.java @@ -6,6 +6,7 @@ import org.antlr.intellij.adaptor.lexer.PSIElementTypeFactory; import org.antlr.intellij.adaptor.lexer.RuleIElementType; import org.antlr.intellij.adaptor.lexer.TokenIElementType; +import org.antlr.v4.runtime.RecognitionException; import org.antlr.v4.runtime.ANTLRErrorListener; import org.antlr.v4.runtime.Parser; import org.antlr.v4.runtime.ParserRuleContext; @@ -30,7 +31,7 @@ public class ANTLRParseTreeToPSIConverter implements ParseTreeListener { protected final Language language; protected final PsiBuilder builder; - protected List syntaxErrors; + protected Map syntaxErrors; protected final Deque markers = new ArrayDeque(); protected final List tokenElementTypes; @@ -48,8 +49,8 @@ public ANTLRParseTreeToPSIConverter(Language language, Parser parser, PsiBuilder for (ANTLRErrorListener listener : parser.getErrorListeners()) { if (listener instanceof SyntaxErrorListener) { - syntaxErrors = ((SyntaxErrorListener)listener).getSyntaxErrors(); - for (SyntaxError error : syntaxErrors) { + syntaxErrors = ((SyntaxErrorListener) listener).getErrorMap(); + for (SyntaxError error : syntaxErrors.values()) { // record first error per token int StartIndex = error.getOffendingSymbol().getStartIndex(); if ( !tokenToErrorMap.containsKey(StartIndex) ) { @@ -115,6 +116,7 @@ public void visitTerminal(TerminalNode node) { * prediction started (which we use to find syntax errors). So, * SyntaxError objects return start not offending token in this case. */ + @Override public void visitErrorNode(ErrorNode node) { ProgressIndicatorProvider.checkCanceled(); @@ -159,6 +161,15 @@ public void enterEveryRule(ParserRuleContext ctx) { public void exitEveryRule(ParserRuleContext ctx) { ProgressIndicatorProvider.checkCanceled(); PsiBuilder.Marker marker = markers.pop(); - marker.done(getRuleElementTypes().get(ctx.getRuleIndex())); + if (ctx.exception != null) { + SyntaxError error = syntaxErrors.get(ctx.exception); + if (error != null) { + marker.error(error.getMessage()); + } else { + marker.done(getRuleElementTypes().get(ctx.getRuleIndex())); + } + } else { + marker.done(getRuleElementTypes().get(ctx.getRuleIndex())); + } } } diff --git a/src/main/java/org/antlr/intellij/adaptor/parser/SyntaxErrorListener.java b/src/main/java/org/antlr/intellij/adaptor/parser/SyntaxErrorListener.java index 4fd5fb6..02eff81 100644 --- a/src/main/java/org/antlr/intellij/adaptor/parser/SyntaxErrorListener.java +++ b/src/main/java/org/antlr/intellij/adaptor/parser/SyntaxErrorListener.java @@ -7,19 +7,25 @@ import org.antlr.v4.runtime.misc.Utils; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; +import java.util.Map; /** Traps errors from parsing language of plugin. E.g., for a Java plugin, * this would catch errors when people type invalid Java code into .java file. * This swallows the errors as the PSI tree has error nodes. */ public class SyntaxErrorListener extends BaseErrorListener { - private final List syntaxErrors = new ArrayList(); + private final Map syntaxErrors = new HashMap<>(); public SyntaxErrorListener() { } public List getSyntaxErrors() { + return new ArrayList<>(syntaxErrors.values()); + } + + Map getErrorMap() { return syntaxErrors; } @@ -29,11 +35,11 @@ public void syntaxError(Recognizer recognizer, int line, int charPositionInLine, String msg, RecognitionException e) { - syntaxErrors.add(new SyntaxError(recognizer, (Token)offendingSymbol, line, charPositionInLine, msg, e)); + syntaxErrors.put(e, new SyntaxError(recognizer, (Token) offendingSymbol, line, charPositionInLine, msg, e)); } @Override public String toString() { - return Utils.join(syntaxErrors.iterator(), "\n"); + return Utils.join(syntaxErrors.values().iterator(), "\n"); } } From 46e9a53d5ff188661fc645804eb9fbd8aea23d34 Mon Sep 17 00:00:00 2001 From: Danny van Bruggen <55701+matozoid@users.noreply.github.com> Date: Thu, 15 Jul 2021 22:48:02 +0200 Subject: [PATCH 2/2] Update contributors.txt --- contributors.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/contributors.txt b/contributors.txt index 3bf0043..74f5397 100644 --- a/contributors.txt +++ b/contributors.txt @@ -55,3 +55,4 @@ YYYY/MM/DD, github id, Full name, email 2016/02/23, yegorpetrov, Yegor Petrov, petrov.yegor@gmail.com 2016/03/12, vemilyus, Alexander Katlein, mail@vemilyus.com 2018/12/20, bjansen, Bastien Jansen, bastien.jansen@gmx.com +2021/07/15, matozoid, Danny van Bruggen, hexagonaal@gmail.com