diff --git a/pmd-core/src/main/java/net/sourceforge/pmd/lang/ast/impl/antlr4/AntlrGeneratedParserBase.java b/pmd-core/src/main/java/net/sourceforge/pmd/lang/ast/impl/antlr4/AntlrGeneratedParserBase.java index 90261a5018..1c8c3d26fa 100644 --- a/pmd-core/src/main/java/net/sourceforge/pmd/lang/ast/impl/antlr4/AntlrGeneratedParserBase.java +++ b/pmd-core/src/main/java/net/sourceforge/pmd/lang/ast/impl/antlr4/AntlrGeneratedParserBase.java @@ -9,6 +9,7 @@ import org.antlr.v4.runtime.ParserRuleContext; import org.antlr.v4.runtime.RuleContext; import org.antlr.v4.runtime.Token; import org.antlr.v4.runtime.TokenStream; +import org.antlr.v4.runtime.tree.ErrorNode; import org.antlr.v4.runtime.tree.TerminalNode; import net.sourceforge.pmd.lang.ast.Node; @@ -30,32 +31,42 @@ public abstract class AntlrGeneratedParserBase> extends return createPmdTerminal(parent, t).asAntlrNode(); } + @Override + public ErrorNode createErrorNode(ParserRuleContext parent, Token t) { + return createPmdError(parent, t).asAntlrNode(); + } + + // Those two need to return a node that implements eg SwiftNode + public abstract BaseAntlrTerminalNode createPmdTerminal(ParserRuleContext parent, Token t); + public abstract BaseAntlrErrorNode createPmdError(ParserRuleContext parent, Token t); + protected Node asPmdNode(RuleContext ctx) { return ((BaseAntlrNode.AntlrToPmdParseTreeAdapter) ctx).getPmdNode(); } + // Necessary API to build the trees + protected void enterRule(BaseAntlrInnerNode ptree, int state, int alt) { enterRule(ptree.asAntlrNode(), state, alt); } - public void enterOuterAlt(BaseAntlrInnerNode localctx, int altNum) { + protected void enterOuterAlt(BaseAntlrInnerNode localctx, int altNum) { enterOuterAlt(localctx.asAntlrNode(), altNum); } - - public void pushNewRecursionContext(BaseAntlrInnerNode localctx, int state, int ruleIndex) { + protected void pushNewRecursionContext(BaseAntlrInnerNode localctx, int state, int ruleIndex) { pushNewRecursionContext(localctx.asAntlrNode(), state, ruleIndex); } - public void enterRecursionRule(BaseAntlrInnerNode localctx, int state, int ruleIndex, int precedence) { + protected void enterRecursionRule(BaseAntlrInnerNode localctx, int state, int ruleIndex, int precedence) { enterRecursionRule(localctx.asAntlrNode(), state, ruleIndex, precedence); } - public boolean sempred(BaseAntlrInnerNode _localctx, int ruleIndex, int predIndex) { + protected boolean sempred(BaseAntlrInnerNode _localctx, int ruleIndex, int predIndex) { return sempred(_localctx.asAntlrNode(), ruleIndex, predIndex); } diff --git a/pmd-core/src/main/java/net/sourceforge/pmd/lang/ast/impl/antlr4/BaseAntlrErrorNode.java b/pmd-core/src/main/java/net/sourceforge/pmd/lang/ast/impl/antlr4/BaseAntlrErrorNode.java new file mode 100644 index 0000000000..e060160026 --- /dev/null +++ b/pmd-core/src/main/java/net/sourceforge/pmd/lang/ast/impl/antlr4/BaseAntlrErrorNode.java @@ -0,0 +1,33 @@ +/* + * BSD-style license; for more info see http://pmd.sourceforge.net/license.html + */ + +package net.sourceforge.pmd.lang.ast.impl.antlr4; + +import org.antlr.v4.runtime.Token; +import org.antlr.v4.runtime.tree.ParseTreeVisitor; + +import net.sourceforge.pmd.lang.ast.impl.GenericNode; + +public abstract class BaseAntlrErrorNode> extends BaseAntlrTerminalNode { + + protected BaseAntlrErrorNode(Token symbol) { + super(symbol, true); + } + + @Override + protected final AntlrErrorPmdAdapter asAntlrNode() { + return (AntlrErrorPmdAdapter) super.asAntlrNode(); + } + + + @Override + public T accept(ParseTreeVisitor visitor) { + return visitor.visitErrorNode(asAntlrNode()); + } + + @Override + public String getXPathNodeName() { + return "Error"; + } +} diff --git a/pmd-core/src/main/java/net/sourceforge/pmd/lang/ast/impl/antlr4/BaseAntlrTerminalNode.java b/pmd-core/src/main/java/net/sourceforge/pmd/lang/ast/impl/antlr4/BaseAntlrTerminalNode.java index 0c3b69b446..e2afa26553 100644 --- a/pmd-core/src/main/java/net/sourceforge/pmd/lang/ast/impl/antlr4/BaseAntlrTerminalNode.java +++ b/pmd-core/src/main/java/net/sourceforge/pmd/lang/ast/impl/antlr4/BaseAntlrTerminalNode.java @@ -6,6 +6,8 @@ package net.sourceforge.pmd.lang.ast.impl.antlr4; import org.antlr.v4.runtime.RuleContext; import org.antlr.v4.runtime.Token; +import org.antlr.v4.runtime.tree.ErrorNode; +import org.antlr.v4.runtime.tree.ParseTreeVisitor; import org.antlr.v4.runtime.tree.TerminalNodeImpl; import net.sourceforge.pmd.lang.ast.impl.GenericNode; @@ -20,7 +22,15 @@ public abstract class BaseAntlrTerminalNode> private final AntlrTerminalPmdAdapter antlrNode; protected BaseAntlrTerminalNode(Token symbol) { - this.antlrNode = new AntlrTerminalPmdAdapter<>(this, symbol); + this(symbol, false); + } + + BaseAntlrTerminalNode(Token symbol, boolean isError) { + if (isError) { + this.antlrNode = new AntlrTerminalPmdAdapter<>(this, symbol); + } else { + this.antlrNode = new AntlrErrorPmdAdapter<>(this, symbol); + } } @Override @@ -43,6 +53,11 @@ public abstract class BaseAntlrTerminalNode> return 0; } + @Override + public T accept(ParseTreeVisitor visitor) { + return visitor.visitTerminal(asAntlrNode()); + } + protected int getTokenKind() { return antlrNode.symbol.getTokenIndex(); } @@ -52,7 +67,7 @@ public abstract class BaseAntlrTerminalNode> throw new IndexOutOfBoundsException("Index " + index + " for terminal node"); } - static final class AntlrTerminalPmdAdapter> extends TerminalNodeImpl implements AntlrToPmdParseTreeAdapter { + protected static class AntlrTerminalPmdAdapter> extends TerminalNodeImpl implements AntlrToPmdParseTreeAdapter { private final BaseAntlrTerminalNode pmdNode; @@ -78,4 +93,16 @@ public abstract class BaseAntlrTerminalNode> } } + protected static class AntlrErrorPmdAdapter> extends AntlrTerminalPmdAdapter implements ErrorNode { + + public AntlrErrorPmdAdapter(BaseAntlrTerminalNode pmdNode, Token symbol) { + super(pmdNode, symbol); + } + + @Override + public T accept(ParseTreeVisitor visitor) { + return visitor.visitErrorNode(this); + } + } + } diff --git a/pmd-swift/src/main/antlr4/net/sourceforge/pmd/lang/swift/ast/Swift.g4 b/pmd-swift/src/main/antlr4/net/sourceforge/pmd/lang/swift/ast/Swift.g4 index 5265ff18e4..ff61633f01 100644 --- a/pmd-swift/src/main/antlr4/net/sourceforge/pmd/lang/swift/ast/Swift.g4 +++ b/pmd-swift/src/main/antlr4/net/sourceforge/pmd/lang/swift/ast/Swift.g4 @@ -46,6 +46,11 @@ import net.sourceforge.pmd.lang.ast.impl.antlr4.*; public SwiftTerminalNode createPmdTerminal(ParserRuleContext parent, Token t) { return new SwiftTerminalNode(t); } + + @Override + public SwiftTerminalNode createPmdError(ParserRuleContext parent, Token t) { + return new SwiftErrorNode(t); + } } options { diff --git a/pmd-swift/src/main/java/net/sourceforge/pmd/lang/swift/ast/SwiftErrorNode.java b/pmd-swift/src/main/java/net/sourceforge/pmd/lang/swift/ast/SwiftErrorNode.java new file mode 100644 index 0000000000..bcd48d13f6 --- /dev/null +++ b/pmd-swift/src/main/java/net/sourceforge/pmd/lang/swift/ast/SwiftErrorNode.java @@ -0,0 +1,17 @@ +/* + * BSD-style license; for more info see http://pmd.sourceforge.net/license.html + */ + +package net.sourceforge.pmd.lang.swift.ast; + +import org.antlr.v4.runtime.Token; + +import net.sourceforge.pmd.lang.ast.impl.antlr4.BaseAntlrErrorNode; + +public final class SwiftErrorNode extends BaseAntlrErrorNode implements SwiftNode { + + SwiftErrorNode(Token token) { + super(token); + } + +}