Fix compilation issues

This commit is contained in:
Clément Fournier
2021-09-15 16:55:37 +02:00
parent de6ddbd624
commit 5d278c049b
7 changed files with 102 additions and 15 deletions

View File

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

View 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());
}

View File

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

View File

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

View File

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

View File

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

View File

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