Fix error nodes

This commit is contained in:
Clément Fournier
2020-05-02 03:08:08 +02:00
parent 1359f792c2
commit cc97807d41
5 changed files with 100 additions and 7 deletions

View File

@ -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);
}

View File

@ -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";
}
}

View File

@ -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);
}
}
}

View File

@ -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 {

View File

@ -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);
}
}