Fix error nodes
This commit is contained in:
@ -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<N extends GenericNode<N>> 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<N> createPmdTerminal(ParserRuleContext parent, Token t);
|
||||
|
||||
public abstract BaseAntlrErrorNode<N> 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<N> ptree, int state, int alt) {
|
||||
enterRule(ptree.asAntlrNode(), state, alt);
|
||||
}
|
||||
|
||||
public void enterOuterAlt(BaseAntlrInnerNode<N> localctx, int altNum) {
|
||||
protected void enterOuterAlt(BaseAntlrInnerNode<N> localctx, int altNum) {
|
||||
enterOuterAlt(localctx.asAntlrNode(), altNum);
|
||||
}
|
||||
|
||||
|
||||
public void pushNewRecursionContext(BaseAntlrInnerNode<N> localctx, int state, int ruleIndex) {
|
||||
protected void pushNewRecursionContext(BaseAntlrInnerNode<N> localctx, int state, int ruleIndex) {
|
||||
pushNewRecursionContext(localctx.asAntlrNode(), state, ruleIndex);
|
||||
}
|
||||
|
||||
public void enterRecursionRule(BaseAntlrInnerNode<N> localctx, int state, int ruleIndex, int precedence) {
|
||||
protected void enterRecursionRule(BaseAntlrInnerNode<N> localctx, int state, int ruleIndex, int precedence) {
|
||||
enterRecursionRule(localctx.asAntlrNode(), state, ruleIndex, precedence);
|
||||
|
||||
}
|
||||
|
||||
public boolean sempred(BaseAntlrInnerNode<N> _localctx, int ruleIndex, int predIndex) {
|
||||
protected boolean sempred(BaseAntlrInnerNode<N> _localctx, int ruleIndex, int predIndex) {
|
||||
return sempred(_localctx.asAntlrNode(), ruleIndex, predIndex);
|
||||
}
|
||||
|
||||
|
@ -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<N extends GenericNode<N>> extends BaseAntlrTerminalNode<N> {
|
||||
|
||||
protected BaseAntlrErrorNode(Token symbol) {
|
||||
super(symbol, true);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected final AntlrErrorPmdAdapter<N> asAntlrNode() {
|
||||
return (AntlrErrorPmdAdapter<N>) super.asAntlrNode();
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public <T> T accept(ParseTreeVisitor<? extends T> visitor) {
|
||||
return visitor.visitErrorNode(asAntlrNode());
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getXPathNodeName() {
|
||||
return "Error";
|
||||
}
|
||||
}
|
@ -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<N extends GenericNode<N>>
|
||||
private final AntlrTerminalPmdAdapter<N> 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<N extends GenericNode<N>>
|
||||
return 0;
|
||||
}
|
||||
|
||||
@Override
|
||||
public <T> T accept(ParseTreeVisitor<? extends T> visitor) {
|
||||
return visitor.visitTerminal(asAntlrNode());
|
||||
}
|
||||
|
||||
protected int getTokenKind() {
|
||||
return antlrNode.symbol.getTokenIndex();
|
||||
}
|
||||
@ -52,7 +67,7 @@ public abstract class BaseAntlrTerminalNode<N extends GenericNode<N>>
|
||||
throw new IndexOutOfBoundsException("Index " + index + " for terminal node");
|
||||
}
|
||||
|
||||
static final class AntlrTerminalPmdAdapter<N extends GenericNode<N>> extends TerminalNodeImpl implements AntlrToPmdParseTreeAdapter<N> {
|
||||
protected static class AntlrTerminalPmdAdapter<N extends GenericNode<N>> extends TerminalNodeImpl implements AntlrToPmdParseTreeAdapter<N> {
|
||||
|
||||
private final BaseAntlrTerminalNode<N> pmdNode;
|
||||
|
||||
@ -78,4 +93,16 @@ public abstract class BaseAntlrTerminalNode<N extends GenericNode<N>>
|
||||
}
|
||||
}
|
||||
|
||||
protected static class AntlrErrorPmdAdapter<N extends GenericNode<N>> extends AntlrTerminalPmdAdapter<N> implements ErrorNode {
|
||||
|
||||
public AntlrErrorPmdAdapter(BaseAntlrTerminalNode<N> pmdNode, Token symbol) {
|
||||
super(pmdNode, symbol);
|
||||
}
|
||||
|
||||
@Override
|
||||
public <T> T accept(ParseTreeVisitor<? extends T> visitor) {
|
||||
return visitor.visitErrorNode(this);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -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 {
|
||||
|
@ -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<SwiftNode> implements SwiftNode {
|
||||
|
||||
SwiftErrorNode(Token token) {
|
||||
super(token);
|
||||
}
|
||||
|
||||
}
|
Reference in New Issue
Block a user