forked from phoedos/pmd
Fix compilation issues
This commit is contained in:
@ -31,9 +31,45 @@
|
||||
<property name="base-visitor-name" value="${lang-name}BaseVisitor"/>
|
||||
<property name="base-visitor-file" value="${target-package-dir}/${base-visitor-name}.java"/>
|
||||
|
||||
<property name="listener-name" value="${lang-name}Listener"/>
|
||||
<property name="listener-file" value="${target-package-dir}/${visitor-name}.java"/>
|
||||
|
||||
<property name="base-listener-name" value="${lang-name}BaseListener"/>
|
||||
<property name="base-listener-file" value="${target-package-dir}/${base-visitor-name}.java"/>
|
||||
|
||||
<property name="node-itf-name" value="${lang-name}Node"/>
|
||||
<property name="base-class-name" value="Abstract${lang-name}Node"/>
|
||||
|
||||
<condition property="rename-parser">
|
||||
<and>
|
||||
<not>
|
||||
<available file="${parser-file}"/>
|
||||
</not>
|
||||
<available file="${target-package-dir}/${lang-name}.java"/>
|
||||
</and>
|
||||
</condition>
|
||||
|
||||
<target name="rename-parser" description="Rename the parser to our conventional name if needed"
|
||||
if="rename-parser">
|
||||
<replace file="${target-package-dir}/${lang-name}.java">
|
||||
<replacefilter token="class ${lang-name} "
|
||||
value="class ${parser-name} "/>
|
||||
<replacefilter token="public ${lang-name}(TokenStream input)"
|
||||
value="public ${parser-name}(TokenStream input)"/>
|
||||
</replace>
|
||||
<replace dir="${target-package-dir}">
|
||||
<include name="${lang-name}.java"/>
|
||||
<include name="${visitor-name}.java"/>
|
||||
<include name="${base-visitor-name}.java"/>
|
||||
<include name="${listener-name}.java"/>
|
||||
<include name="${base-listener-name}.java"/>
|
||||
<replacefilter token="${lang-name}." value="${parser-name}."/>
|
||||
</replace>
|
||||
|
||||
<move file="${target-package-dir}/${lang-name}.java"
|
||||
tofile="${parser-file}"/>
|
||||
</target>
|
||||
|
||||
<target name="cpd-language" description="Adapt Antlr sources for CPD-only languages">
|
||||
<!-- We only need the Lexer file. -->
|
||||
<delete file="${parser-file}"/>
|
||||
@ -45,7 +81,7 @@
|
||||
</delete>
|
||||
</target>
|
||||
|
||||
<target name="pmd-language" description="Adapt Antlr sources for PMD languages">
|
||||
<target name="pmd-language" description="Adapt Antlr sources for PMD languages" depends="rename-parser">
|
||||
|
||||
<!-- Adapt parser. -->
|
||||
<replace file="${parser-file}">
|
||||
|
@ -88,6 +88,12 @@ public abstract class BaseAntlrInnerNode<N extends AntlrNode<N>> extends BaseAnt
|
||||
return pmdWrapper != null ? pmdWrapper.asAntlrNode() : null;
|
||||
}
|
||||
|
||||
protected List<TerminalNode> getTokens(int kind) {
|
||||
return children(BaseAntlrTerminalNode.class)
|
||||
.filter(it -> it.getTokenKind() == kind)
|
||||
.toList(BaseAntlrTerminalNode::asAntlrNode);
|
||||
}
|
||||
|
||||
protected void copyFrom(BaseAntlrInnerNode<N> other) {
|
||||
asAntlrNode().copyFrom(other.asAntlrNode());
|
||||
}
|
||||
|
@ -36,7 +36,7 @@
|
||||
<ant antfile="${antlr4.ant.wrapper}" target="pmd-language">
|
||||
<property name="lang-name" value="Kotlin" />
|
||||
<property name="lang-terse-name" value="kotlin" />
|
||||
<property name="root-node-name" value="TopLevel" />
|
||||
<property name="root-node-name" value="File" />
|
||||
<property name="node-prefix" value="Kt" />
|
||||
</ant>
|
||||
</target>
|
||||
|
@ -9,11 +9,30 @@ import net.sourceforge.pmd.lang.ast.impl.antlr4.*;
|
||||
import net.sourceforge.pmd.lang.ast.AstVisitor;
|
||||
}
|
||||
|
||||
options { tokenVocab = KotlinLexer; }
|
||||
@parser::members {
|
||||
|
||||
static final AntlrNameDictionary DICO = new KotlinNameDictionary(VOCABULARY, ruleNames);
|
||||
|
||||
@Override
|
||||
public KotlinTerminalNode createPmdTerminal(ParserRuleContext parent, Token t) {
|
||||
return new KotlinTerminalNode(t);
|
||||
}
|
||||
|
||||
@Override
|
||||
public KotlinErrorNode createPmdError(ParserRuleContext parent, Token t) {
|
||||
return new KotlinErrorNode(t);
|
||||
}
|
||||
}
|
||||
|
||||
options {
|
||||
tokenVocab = KotlinLexer;
|
||||
contextSuperClass = 'KotlinInnerNode';
|
||||
superClass = 'AntlrGeneratedParserBase<KotlinNode>';
|
||||
}
|
||||
|
||||
// SECTION: general
|
||||
|
||||
kotlinFile
|
||||
file
|
||||
: shebangLine? NL* fileAnnotation* packageHeader importList topLevelObject* EOF
|
||||
;
|
||||
|
||||
|
@ -0,0 +1,24 @@
|
||||
/*
|
||||
* BSD-style license; for more info see http://pmd.sourceforge.net/license.html
|
||||
*/
|
||||
|
||||
package net.sourceforge.pmd.lang.kotlin.ast;
|
||||
|
||||
import org.antlr.v4.runtime.Vocabulary;
|
||||
import org.checkerframework.checker.nullness.qual.Nullable;
|
||||
|
||||
import net.sourceforge.pmd.lang.ast.impl.antlr4.AntlrNameDictionary;
|
||||
|
||||
|
||||
final class KotlinNameDictionary extends AntlrNameDictionary {
|
||||
|
||||
KotlinNameDictionary(Vocabulary vocab, String[] ruleNames) {
|
||||
super(vocab, ruleNames);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected @Nullable String nonAlphaNumName(String name) {
|
||||
// todo
|
||||
return super.nonAlphaNumName(name);
|
||||
}
|
||||
}
|
@ -4,28 +4,29 @@
|
||||
|
||||
package net.sourceforge.pmd.lang.kotlin.ast;
|
||||
|
||||
import org.antlr.v4.runtime.ParserRuleContext;
|
||||
|
||||
import net.sourceforge.pmd.lang.ast.AstInfo;
|
||||
import net.sourceforge.pmd.lang.ast.Parser.ParserTask;
|
||||
import net.sourceforge.pmd.lang.ast.RootNode;
|
||||
import net.sourceforge.pmd.lang.kotlin.ast.KotlinParser.KtTopLevel;
|
||||
import org.antlr.v4.runtime.ParserRuleContext;
|
||||
import net.sourceforge.pmd.lang.kotlin.ast.KotlinParser.KtFile;
|
||||
|
||||
// package private base class
|
||||
abstract class KotlinRootNode extends KotlinInnerNode implements RootNode {
|
||||
|
||||
private AstInfo<KtTopLevel> astInfo;
|
||||
private AstInfo<KtFile> astInfo;
|
||||
|
||||
KotlinRootNode(ParserRuleContext parent, int invokingStateNumber) {
|
||||
super(parent, invokingStateNumber);
|
||||
}
|
||||
|
||||
@Override
|
||||
public AstInfo<KtTopLevel> getAstInfo() {
|
||||
public AstInfo<KtFile> getAstInfo() {
|
||||
return astInfo;
|
||||
}
|
||||
|
||||
KtTopLevel makeAstInfo(ParserTask task) {
|
||||
KtTopLevel me = (KtTopLevel) this;
|
||||
KtFile makeAstInfo(ParserTask task) {
|
||||
KtFile me = (KtFile) this;
|
||||
this.astInfo = new AstInfo<>(task, me);
|
||||
return me;
|
||||
}
|
||||
|
@ -4,21 +4,22 @@
|
||||
|
||||
package net.sourceforge.pmd.lang.kotlin.ast;
|
||||
|
||||
import net.sourceforge.pmd.lang.ast.impl.antlr4.AntlrBaseParser;
|
||||
import net.sourceforge.pmd.lang.kotlin.ast.KotlinParser.KtTopLevel;
|
||||
import org.antlr.v4.runtime.CharStream;
|
||||
import org.antlr.v4.runtime.CommonTokenStream;
|
||||
import org.antlr.v4.runtime.Lexer;
|
||||
|
||||
import net.sourceforge.pmd.lang.ast.impl.antlr4.AntlrBaseParser;
|
||||
import net.sourceforge.pmd.lang.kotlin.ast.KotlinParser.KtFile;
|
||||
|
||||
/**
|
||||
* Adapter for the KotlinParser.
|
||||
*/
|
||||
public final class PmdKotlinParser extends AntlrBaseParser<KotlinNode, KtTopLevel> {
|
||||
public final class PmdKotlinParser extends AntlrBaseParser<KotlinNode, KtFile> {
|
||||
|
||||
@Override
|
||||
protected KtTopLevel parse(final Lexer lexer, ParserTask task) {
|
||||
protected KtFile parse(final Lexer lexer, ParserTask task) {
|
||||
KotlinParser parser = new KotlinParser(new CommonTokenStream(lexer));
|
||||
return parser.topLevel().makeAstInfo(task);
|
||||
return parser.file().makeAstInfo(task);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
Reference in New Issue
Block a user