forked from phoedos/pmd
Abstract ant wrapper for antlr
This commit is contained in:
32
antlr4-wrapper.xml
Normal file
32
antlr4-wrapper.xml
Normal file
@ -0,0 +1,32 @@
|
||||
<!--
|
||||
~ BSD-style license; for more info see http://pmd.sourceforge.net/license.html
|
||||
-->
|
||||
|
||||
<project name="pmd" default="adapt-antlr-sources" basedir="../../../../">
|
||||
|
||||
<property name="target-package-dir" value="${antlr4.outputDirectory}/net/sourceforge/pmd/lang/${lang-terse-name}/ast"/>
|
||||
|
||||
<target name="adapt-antlr-sources" description="Adapt antlr sources to the PMD codebase">
|
||||
|
||||
<replace file="${target-package-dir}/${lang-name}Parser.java"
|
||||
token="TopLevelContext extends ${lang-name}InnerNode"
|
||||
value="TopLevelContext extends ${lang-name}InnerNode implements net.sourceforge.pmd.lang.ast.RootNode"/>
|
||||
|
||||
<replace file="${target-package-dir}/${lang-name}Parser.java"
|
||||
token="_ctx = _localctx;"
|
||||
value="_ctx = _localctx.asAntlrNode();"/>
|
||||
|
||||
<replace file="${target-package-dir}/${lang-name}Parser.java"
|
||||
token="visitor.visitChildren(this)"
|
||||
value="visitor.visitChildren(asAntlrNode())"/>
|
||||
|
||||
<replaceregexp flags="g" file="${target-package-dir}/${lang-name}Parser.java">
|
||||
<regexp pattern="_sempred\(\((\w+)\)_localctx,"/>
|
||||
<substitution expression="_sempred\((\1) asPmdNode(_localctx),"/>
|
||||
</replaceregexp>
|
||||
|
||||
<replace file="${target-package-dir}/${lang-name}Visitor.java"
|
||||
token="extends ParseTreeVisitor"
|
||||
value="extends net.sourceforge.pmd.lang.ast.impl.antlr4.PmdAntlrVisitor"/>
|
||||
</target>
|
||||
</project>
|
@ -6,10 +6,12 @@ package net.sourceforge.pmd.lang.ast.impl.antlr4;
|
||||
|
||||
import org.antlr.v4.runtime.Parser;
|
||||
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.TerminalNode;
|
||||
|
||||
import net.sourceforge.pmd.lang.ast.Node;
|
||||
import net.sourceforge.pmd.lang.ast.impl.GenericNode;
|
||||
|
||||
/**
|
||||
@ -30,6 +32,11 @@ public abstract class AntlrGeneratedParserBase<N extends GenericNode<N>> extends
|
||||
|
||||
public abstract BaseAntlrTerminalNode<N> createPmdTerminal(ParserRuleContext parent, Token t);
|
||||
|
||||
|
||||
protected Node asPmdNode(RuleContext ctx) {
|
||||
return ((BaseAntlrNode.AntlrToPmdParseTreeAdapter<?>) ctx).getPmdNode();
|
||||
}
|
||||
|
||||
protected void enterRule(BaseAntlrInnerNode<N> ptree, int state, int alt) {
|
||||
enterRule(ptree.asAntlrNode(), state, alt);
|
||||
}
|
||||
|
@ -23,8 +23,6 @@ import org.checkerframework.checker.nullness.qual.Nullable;
|
||||
*/
|
||||
public class AntlrNameDictionary {
|
||||
|
||||
public static final int ROOT_RULE_IDX = -1;
|
||||
|
||||
private final String[] terminalXpathNames;
|
||||
private final String[] nonTermXpathNames;
|
||||
private final Vocabulary vocabulary;
|
||||
@ -155,12 +153,7 @@ public class AntlrNameDictionary {
|
||||
}
|
||||
|
||||
public @NonNull String getXPathNameOfRule(int idx) {
|
||||
if (idx >= 0 && idx < nonTermXpathNames.length) {
|
||||
return nonTermXpathNames[idx];
|
||||
} else if (idx == ROOT_RULE_IDX) {
|
||||
return "FileRoot";
|
||||
}
|
||||
throw new IllegalArgumentException("I don't know rule type " + idx);
|
||||
}
|
||||
|
||||
public int getMaxRuleIndex() {
|
||||
|
@ -17,9 +17,33 @@
|
||||
<build>
|
||||
<plugins>
|
||||
<plugin>
|
||||
<!-- this needs to run before the ant task -->
|
||||
<groupId>org.antlr</groupId>
|
||||
<artifactId>antlr4-maven-plugin</artifactId>
|
||||
</plugin>
|
||||
<plugin>
|
||||
<groupId>org.apache.maven.plugins</groupId>
|
||||
<artifactId>maven-antrun-plugin</artifactId>
|
||||
<inherited>true</inherited>
|
||||
<executions>
|
||||
<execution>
|
||||
<id>antlr-cleanup</id>
|
||||
<phase>generate-sources</phase>
|
||||
<goals>
|
||||
<goal>run</goal>
|
||||
</goals>
|
||||
<configuration>
|
||||
<target>
|
||||
<ant antfile="${antlr4.ant.wrapper}">
|
||||
<property name="lang-name" value="Swift" />
|
||||
<property name="lang-terse-name" value="swift" />
|
||||
</ant>
|
||||
</target>
|
||||
</configuration>
|
||||
</execution>
|
||||
</executions>
|
||||
</plugin>
|
||||
|
||||
<plugin>
|
||||
<artifactId>maven-resources-plugin</artifactId>
|
||||
<configuration>
|
||||
|
@ -42,6 +42,7 @@ import net.sourceforge.pmd.lang.ast.impl.antlr4.*;
|
||||
|
||||
static final AntlrNameDictionary DICO = new AntlrNameDictionary(VOCABULARY, ruleNames);
|
||||
|
||||
@Override
|
||||
public SwiftTerminalNode createPmdTerminal(ParserRuleContext parent, Token t) {
|
||||
return new SwiftTerminalNode(t);
|
||||
}
|
||||
|
@ -10,20 +10,21 @@ import org.antlr.v4.runtime.Lexer;
|
||||
|
||||
import net.sourceforge.pmd.lang.ParserOptions;
|
||||
import net.sourceforge.pmd.lang.ast.impl.antlr4.AntlrBaseParser;
|
||||
import net.sourceforge.pmd.lang.swift.ast.SwiftParser.TopLevelContext;
|
||||
|
||||
/**
|
||||
* Adapter for the SwiftParser.
|
||||
*/
|
||||
public final class PmdSwiftParser extends AntlrBaseParser<SwiftNode, SwiftFileNode> {
|
||||
public final class PmdSwiftParser extends AntlrBaseParser<SwiftNode, TopLevelContext> {
|
||||
|
||||
public PmdSwiftParser(final ParserOptions parserOptions) {
|
||||
super(parserOptions);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected SwiftFileNode parse(final Lexer lexer) {
|
||||
protected TopLevelContext parse(final Lexer lexer) {
|
||||
SwiftParser parser = new SwiftParser(new CommonTokenStream(lexer));
|
||||
return new SwiftFileNode(parser.topLevel());
|
||||
return parser.topLevel();
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -1,28 +0,0 @@
|
||||
/*
|
||||
* 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.tree.ParseTreeVisitor;
|
||||
|
||||
import net.sourceforge.pmd.lang.ast.RootNode;
|
||||
import net.sourceforge.pmd.lang.ast.impl.antlr4.AntlrNameDictionary;
|
||||
import net.sourceforge.pmd.lang.swift.ast.SwiftParser.TopLevelContext;
|
||||
|
||||
public final class SwiftFileNode extends SwiftInnerNode implements RootNode {
|
||||
|
||||
SwiftFileNode(TopLevelContext root) {
|
||||
asAntlrNode().addChild(root.asAntlrNode());
|
||||
}
|
||||
|
||||
@Override
|
||||
protected int getRuleIndex() {
|
||||
return AntlrNameDictionary.ROOT_RULE_IDX;
|
||||
}
|
||||
|
||||
@Override
|
||||
public <T> T accept(ParseTreeVisitor<? extends T> visitor) {
|
||||
return visitor.visitChildren(asAntlrNode());
|
||||
}
|
||||
}
|
@ -4,7 +4,8 @@
|
||||
|
||||
package net.sourceforge.pmd.lang.swift.ast;
|
||||
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
import org.checkerframework.checker.nullness.qual.NonNull;
|
||||
|
||||
import net.sourceforge.pmd.lang.ast.test.BaseTreeDumpTest;
|
||||
import net.sourceforge.pmd.lang.ast.test.NodePrintersKt;
|
||||
@ -18,7 +19,7 @@ public class BaseSwiftTreeDumpTest extends BaseTreeDumpTest {
|
||||
super(NodePrintersKt.getSimpleNodePrinter(), ".swift");
|
||||
}
|
||||
|
||||
@NotNull
|
||||
@NonNull
|
||||
@Override
|
||||
public SwiftParsingHelper getParser() {
|
||||
return SwiftParsingHelper.DEFAULT.withResourceContext(getClass(), "testdata");
|
||||
|
@ -8,17 +8,18 @@ import org.jetbrains.annotations.NotNull;
|
||||
|
||||
import net.sourceforge.pmd.lang.ast.test.BaseParsingHelper;
|
||||
import net.sourceforge.pmd.lang.swift.SwiftLanguageModule;
|
||||
import net.sourceforge.pmd.lang.swift.ast.SwiftParser.TopLevelContext;
|
||||
|
||||
/**
|
||||
*
|
||||
*/
|
||||
public class SwiftParsingHelper extends BaseParsingHelper<SwiftParsingHelper, SwiftFileNode> {
|
||||
public class SwiftParsingHelper extends BaseParsingHelper<SwiftParsingHelper, TopLevelContext> {
|
||||
|
||||
public static final SwiftParsingHelper DEFAULT = new SwiftParsingHelper(Params.getDefaultNoProcess());
|
||||
|
||||
|
||||
public SwiftParsingHelper(@NotNull Params params) {
|
||||
super(SwiftLanguageModule.NAME, SwiftFileNode.class, params);
|
||||
super(SwiftLanguageModule.NAME, TopLevelContext.class, params);
|
||||
}
|
||||
|
||||
@NotNull
|
||||
|
@ -151,14 +151,14 @@
|
||||
| | | | | +- Expression
|
||||
| | | | | +- PrefixExpression
|
||||
| | | | | +- PostfixExpression
|
||||
| | | | | | +- PrimaryExpression
|
||||
| | | | | | +- Keyword
|
||||
| | | | | | +- T-self
|
||||
| | | | | +- PostfixExpression
|
||||
| | | | | | +- PostfixExpression
|
||||
| | | | | | | +- PrimaryExpression
|
||||
| | | | | | | +- Keyword
|
||||
| | | | | | | +- T-self
|
||||
| | | | | | +- T-dot
|
||||
| | | | | | +- Identifier
|
||||
| | | | | | +- T-Identifier
|
||||
| | | | | +- PostfixExpression
|
||||
| | | | | +- PostfixOperator
|
||||
| | | | | +- Operator
|
||||
| | | | | +- OperatorHead
|
||||
@ -199,10 +199,10 @@
|
||||
| | | | | +- Expression
|
||||
| | | | | +- PrefixExpression
|
||||
| | | | | +- PostfixExpression
|
||||
| | | | | +- PostfixExpression
|
||||
| | | | | | +- PrimaryExpression
|
||||
| | | | | | +- Identifier
|
||||
| | | | | | +- T-Identifier
|
||||
| | | | | +- PostfixExpression
|
||||
| | | | | +- T-dot
|
||||
| | | | | +- Identifier
|
||||
| | | | | +- T-Identifier
|
||||
@ -215,14 +215,14 @@
|
||||
| | | | | +- Expression
|
||||
| | | | | +- PrefixExpression
|
||||
| | | | | +- PostfixExpression
|
||||
| | | | | | +- PrimaryExpression
|
||||
| | | | | | +- Keyword
|
||||
| | | | | | +- T-self
|
||||
| | | | | +- PostfixExpression
|
||||
| | | | | | +- PostfixExpression
|
||||
| | | | | | | +- PrimaryExpression
|
||||
| | | | | | | +- Keyword
|
||||
| | | | | | | +- T-self
|
||||
| | | | | | +- T-dot
|
||||
| | | | | | +- Identifier
|
||||
| | | | | | +- T-Identifier
|
||||
| | | | | +- PostfixExpression
|
||||
| | | | | +- PostfixOperator
|
||||
| | | | | +- Operator
|
||||
| | | | | +- OperatorHead
|
||||
@ -231,10 +231,10 @@
|
||||
| | | | +- Expression
|
||||
| | | | +- PrefixExpression
|
||||
| | | | +- PostfixExpression
|
||||
| | | | +- PostfixExpression
|
||||
| | | | | +- PrimaryExpression
|
||||
| | | | | +- Identifier
|
||||
| | | | | +- T-Identifier
|
||||
| | | | +- PostfixExpression
|
||||
| | | | +- FunctionCallArgumentClause
|
||||
| | | | +- T-lparen
|
||||
| | | | +- FunctionCallArgumentList
|
||||
@ -280,10 +280,10 @@
|
||||
| | | | +- Expression
|
||||
| | | | +- PrefixExpression
|
||||
| | | | +- PostfixExpression
|
||||
| | | | +- PostfixExpression
|
||||
| | | | | +- PrimaryExpression
|
||||
| | | | | +- Identifier
|
||||
| | | | | +- T-Identifier
|
||||
| | | | +- PostfixExpression
|
||||
| | | | +- T-dot
|
||||
| | | | +- Identifier
|
||||
| | | | +- T-Identifier
|
||||
@ -317,10 +317,10 @@
|
||||
| | | +- Expression
|
||||
| | | +- PrefixExpression
|
||||
| | | +- PostfixExpression
|
||||
| | | +- PostfixExpression
|
||||
| | | | +- PrimaryExpression
|
||||
| | | | +- Identifier
|
||||
| | | | +- T-Identifier
|
||||
| | | +- PostfixExpression
|
||||
| | | +- T-dot
|
||||
| | | +- Identifier
|
||||
| | | +- T-Identifier
|
||||
|
3
pom.xml
3
pom.xml
@ -108,6 +108,9 @@
|
||||
<javacc.jar>${settings.localRepository}/net/java/dev/javacc/javacc/${javacc.version}/javacc-${javacc.version}.jar</javacc.jar>
|
||||
<javacc.outputDirectory>${project.build.directory}/generated-sources/javacc</javacc.outputDirectory>
|
||||
<javacc.ant.wrapper>${project.basedir}/../javacc-wrapper.xml</javacc.ant.wrapper>
|
||||
|
||||
<antlr4.outputDirectory>${project.build.directory}/generated-sources/antlr4</antlr4.outputDirectory>
|
||||
<antlr4.ant.wrapper>${project.basedir}/../antlr4-wrapper.xml</antlr4.ant.wrapper>
|
||||
</properties>
|
||||
|
||||
<build>
|
||||
|
Reference in New Issue
Block a user