This commit is contained in:
Clément Fournier
2020-09-02 09:25:48 +02:00
parent e76a1d6eb8
commit c88919bbc7
12 changed files with 24 additions and 228 deletions

View File

@ -26,10 +26,10 @@ public abstract class JavaCCTokenizer implements Tokenizer {
@SuppressWarnings("PMD.CloseResource")
protected TokenManager<JavaccToken> getLexerForSource(SourceCode sourceCode) throws IOException, MalformedSourceException {
TextDocument textDocument = TextDocument.create(CpdCompat.cpdCompat(sourceCode));
return makeLexerImpl(CharStream.create(textDocument, newTokenDoc()));
return makeLexerImpl(CharStream.create(textDocument, tokenBehavior()));
}
protected TokenDocumentBehavior newTokenDoc() {
protected TokenDocumentBehavior tokenBehavior() {
return TokenDocumentBehavior.DEFAULT;
}

View File

@ -11,6 +11,7 @@ import java.util.function.Function;
import org.checkerframework.checker.nullness.qual.NonNull;
import org.checkerframework.checker.nullness.qual.Nullable;
import net.sourceforge.pmd.cpd.internal.JavaCCTokenizer;
import net.sourceforge.pmd.lang.ast.impl.TokenDocument;
import net.sourceforge.pmd.lang.ast.impl.javacc.io.EscapeTranslator;
import net.sourceforge.pmd.lang.ast.impl.javacc.io.MalformedSourceException;
@ -18,12 +19,14 @@ import net.sourceforge.pmd.util.document.TextDocument;
/**
* Token document for Javacc implementations. This is a helper object
* for generated token managers.
* for generated token managers. Note: the extension point is a custom
* implementation of {@link TokenDocumentBehavior}, see {@link JjtreeParserAdapter#tokenBehavior()},
* {@link JavaCCTokenizer#tokenBehavior()}
*/
public class JavaccTokenDocument extends TokenDocument<JavaccToken> {
public final class JavaccTokenDocument extends TokenDocument<JavaccToken> {
private final TokenDocumentBehavior behavior;
final StringPool stringPool = new StringPool();
private final StringPool stringPool = new StringPool();
private JavaccToken first;
@ -143,28 +146,10 @@ public class JavaccTokenDocument extends TokenDocument<JavaccToken> {
}
}
/**
* Returns true if the lexer should accumulate the image of MORE
* tokens into the StringBuilder jjimage. This is useless in our
* current implementations. The default returns false, which makes
* {@link CharStream#appendSuffix(StringBuilder, int)} a noop.
*/
public boolean useMarkSuffix() {
boolean useMarkSuffix() {
return behavior.useMarkSuffix();
}
/**
* Translate the escapes of the source document. The default implementation
* does not perform any escaping.
*
* @param text Source doc
*
* @see EscapeTranslator
*/
protected TextDocument translate(TextDocument text) throws MalformedSourceException {
return behavior.translate(text);
}
/**
* Open the document. This is only meant to be used by a Javacc-generated
* parser.
@ -193,26 +178,18 @@ public class JavaccTokenDocument extends TokenDocument<JavaccToken> {
return first.next;
}
final String computeImage(JavaccToken t) {
String computeImage(JavaccToken t) {
CharSequence imageCs = t.getImageCs();
if (imageCs instanceof String) {
return (String) imageCs;
}
return stringPool.toString(imageCs, isImagePooled(t));
}
protected boolean isImagePooled(JavaccToken t) {
return behavior.isImagePooled(t);
return stringPool.toString(imageCs, behavior.isImagePooled(t));
}
/**
* Returns a string that describes the token kind.
*
* @param kind Kind of token
*
* @return A descriptive string
* @see TokenDocumentBehavior#describeKind(int)
*/
public final @NonNull String describeKind(int kind) {
public @NonNull String describeKind(int kind) {
return behavior.describeKind(kind);
}

View File

@ -113,6 +113,7 @@ public abstract class EscapeTranslator implements AutoCloseable {
return startOffsetInclusive;
}
@Override
public void close() {
this.bufpos = -1;
this.input = null;

View File

@ -59,7 +59,7 @@ public class CPPTokenizer extends JavaCCTokenizer {
@Override
protected TokenDocumentBehavior newTokenDoc() {
protected TokenDocumentBehavior tokenBehavior() {
return new TokenDocumentBehavior(CppTokenKinds.TOKEN_NAMES) {
@Override

View File

@ -21,7 +21,7 @@ public class CppCharStreamTest {
@NonNull
public CharStream charStreamFor(String source) throws IOException {
TextDocument textDoc = TextDocument.readOnlyString(source, TextFile.UNKNOWN_FILENAME, CpdCompat.dummyVersion());
return CharStream.create(new CPPTokenizer().newTokenDoc(textDoc));
return CharStream.create(textDoc, new CPPTokenizer().tokenBehavior());
}
@Test

View File

@ -44,7 +44,7 @@ public class JavaTokenizer extends JavaCCTokenizer {
}
@Override
protected JavaccTokenDocument.TokenDocumentBehavior newTokenDoc() {
protected JavaccTokenDocument.TokenDocumentBehavior tokenBehavior() {
return InternalApiBridge.javaTokenDoc();
}

View File

@ -23,7 +23,7 @@ public class JSPTokenizer extends JavaCCTokenizer {
}
@Override
protected JavaccTokenDocument.TokenDocumentBehavior newTokenDoc() {
protected JavaccTokenDocument.TokenDocumentBehavior tokenBehavior() {
return JspParser.getTokenBehavior();
}

View File

@ -1,179 +0,0 @@
<project name="pmd" default="alljavacc" basedir="../../">
<property name="javacc-home.path" value="target/lib" />
<target name="alljavacc"
description="Generates all JavaCC aspects within PMD"
depends="checkUpToDate,init,plsqljjtree,cleanup" />
<target name="checkUpToDate">
<uptodate property="javaccBuildNotRequired" targetfile="${target}/last-generated-timestamp">
<srcfiles dir="etc/grammar" includes="*.jj*"/>
</uptodate>
<echo message="up to date check: javaccBuildNotRequired=${javaccBuildNotRequired}"/>
</target>
<target name="init" unless="javaccBuildNotRequired">
<mkdir dir="${javacc-home.path}" />
<copy file="${javacc.jar}" tofile="${javacc-home.path}/javacc.jar" />
<mkdir dir="${target}"/>
<touch file="${target}/last-generated-timestamp"/>
</target>
<target name="cleanup">
<delete dir="${javacc-home.path}" />
</target>
<target name="plsqljjtree" description="Generates the PlSQL parser and AST source files" unless="javaccBuildNotRequired">
<delete dir="${target}/net/sourceforge/pmd/lang/plsql/ast" />
<mkdir dir="${target}/net/sourceforge/pmd/lang/plsql/ast" />
<jjtree target="etc/grammar/PldocAST.jjt"
outputdirectory="${target}/net/sourceforge/pmd/lang/plsql/ast"
javacchome="${javacc-home.path}" />
<!-- Ensure generated using CharStream interface -->
<javacc static="false"
target="${target}/net/sourceforge/pmd/lang/plsql/ast/PldocAST.jj"
outputdirectory="${target}/net/sourceforge/pmd/lang/plsql/ast"
javacchome="${javacc-home.path}" />
<delete file="${target}/net/sourceforge/pmd/lang/plsql/ast/SimpleNode.java" />
<delete file="${target}/net/sourceforge/pmd/lang/plsql/ast/Node.java" />
<delete file="${target}/net/sourceforge/pmd/lang/plsql/ast/CharStream.java" />
<delete file="${target}/net/sourceforge/pmd/lang/plsql/ast/TokenMgrError.java" />
<delete file="${target}/net/sourceforge/pmd/lang/plsql/ast/ASTArguments.java" />
<delete file="${target}/net/sourceforge/pmd/lang/plsql/ast/ASTComparisonCondition.java" />
<delete file="${target}/net/sourceforge/pmd/lang/plsql/ast/ASTCompoundCondition.java" />
<delete file="${target}/net/sourceforge/pmd/lang/plsql/ast/ASTDatatype.java" />
<delete file="${target}/net/sourceforge/pmd/lang/plsql/ast/ASTExtractExpression.java" />
<delete file="${target}/net/sourceforge/pmd/lang/plsql/ast/ASTFetchStatement.java" />
<delete file="${target}/net/sourceforge/pmd/lang/plsql/ast/ASTFormalParameter.java" />
<delete file="${target}/net/sourceforge/pmd/lang/plsql/ast/ASTIfStatement.java" />
<delete file="${target}/net/sourceforge/pmd/lang/plsql/ast/ASTInnerCrossJoinClause.java" />
<delete file="${target}/net/sourceforge/pmd/lang/plsql/ast/ASTInput.java" />
<delete file="${target}/net/sourceforge/pmd/lang/plsql/ast/ASTMethodDeclaration.java" />
<delete file="${target}/net/sourceforge/pmd/lang/plsql/ast/ASTMethodDeclarator.java" />
<delete file="${target}/net/sourceforge/pmd/lang/plsql/ast/ASTName.java" />
<delete file="${target}/net/sourceforge/pmd/lang/plsql/ast/ASTOuterJoinClause.java" />
<delete file="${target}/net/sourceforge/pmd/lang/plsql/ast/ASTOuterJoinType.java" />
<delete file="${target}/net/sourceforge/pmd/lang/plsql/ast/ASTInlineConstraint.java" />
<delete file="${target}/net/sourceforge/pmd/lang/plsql/ast/ASTOutOfLineConstraint.java" />
<delete file="${target}/net/sourceforge/pmd/lang/plsql/ast/ASTPackageBody.java" />
<delete file="${target}/net/sourceforge/pmd/lang/plsql/ast/ASTPackageSpecification.java" />
<delete file="${target}/net/sourceforge/pmd/lang/plsql/ast/ASTQueryBlock.java" />
<delete file="${target}/net/sourceforge/pmd/lang/plsql/ast/ASTPrimaryPrefix.java" />
<delete file="${target}/net/sourceforge/pmd/lang/plsql/ast/ASTPrimarySuffix.java" />
<delete file="${target}/net/sourceforge/pmd/lang/plsql/ast/ASTProgramUnit.java" />
<delete file="${target}/net/sourceforge/pmd/lang/plsql/ast/ASTRegexpLikeCondition.java" />
<delete file="${target}/net/sourceforge/pmd/lang/plsql/ast/ASTSelectIntoStatement.java" />
<delete file="${target}/net/sourceforge/pmd/lang/plsql/ast/ASTSelectStatement.java" />
<delete file="${target}/net/sourceforge/pmd/lang/plsql/ast/ASTSqlStatement.java" />
<delete file="${target}/net/sourceforge/pmd/lang/plsql/ast/ASTStringLiteral.java" />
<delete file="${target}/net/sourceforge/pmd/lang/plsql/ast/ASTSubqueryOperation.java" />
<delete file="${target}/net/sourceforge/pmd/lang/plsql/ast/ASTTriggerTimingPointSection.java" />
<delete file="${target}/net/sourceforge/pmd/lang/plsql/ast/ASTTriggerUnit.java" />
<delete file="${target}/net/sourceforge/pmd/lang/plsql/ast/ASTTypeMethod.java" />
<delete file="${target}/net/sourceforge/pmd/lang/plsql/ast/ASTTypeSpecification.java" />
<delete file="${target}/net/sourceforge/pmd/lang/plsql/ast/ASTVariableOrConstantDeclaratorId.java" />
<replace file="${target}/net/sourceforge/pmd/lang/plsql/ast/PLSQLParserVisitor.java"
token="SimpleNode"
value="PLSQLNode" />
<replace file="${target}/net/sourceforge/pmd/lang/plsql/ast/PLSQLParserTokenManager.java"
token="class PLSQLParserTokenManager"
value="class PLSQLParserTokenManager extends net.sourceforge.pmd.lang.ast.impl.javacc.AbstractTokenManager" />
<replace file="${target}/net/sourceforge/pmd/lang/plsql/ast/JJTPLSQLParserState.java">
<replacetoken>public class</replacetoken>
<replacevalue><![CDATA[import net.sourceforge.pmd.lang.ast.Node;
public class]]></replacevalue>
</replace>
<replace file="${target}/net/sourceforge/pmd/lang/plsql/ast/ParseException.java"
token="extends Exception"
value="extends net.sourceforge.pmd.lang.ast.ParseException" />
<replace file="${target}/net/sourceforge/pmd/lang/plsql/ast/Token.java">
<replacetoken>public class Token implements java.io.Serializable</replacetoken>
<replacevalue><![CDATA[import net.sourceforge.pmd.lang.ast.GenericToken;
public class Token implements GenericToken, java.io.Serializable]]></replacevalue>
</replace>
<!--Add implementation methods of GenericToken-->
<replace file="${target}/net/sourceforge/pmd/lang/plsql/ast/Token.java">
<replacetoken>public Token specialToken;</replacetoken>
<replacevalue><![CDATA[public Token specialToken;
@Override
public GenericToken getNext() {
return next;
}
@Override
public GenericToken getPreviousComment() {
return specialToken;
}
@Override
public String getImage() {
return image;
}
@Override
public int getBeginLine() {
return beginLine;
}
@Override
public int getEndLine() {
return endLine;
}
@Override
public int getBeginColumn() {
return beginColumn;
}
@Override
public int getEndColumn() {
return endColumn;
}
]]></replacevalue>
</replace>
<replaceregexp>
<regexp pattern="public (?:class|interface)" />
<substitution expression="@Deprecated${line.separator}@net.sourceforge.pmd.annotation.InternalApi${line.separator}\0" />
<fileset dir="${target}/net/sourceforge/pmd/lang/plsql/ast">
<exclude name="AST*.java" />
<exclude name="ParseException.java" />
<exclude name="*ParserVisitor.java"/>
</fileset>
</replaceregexp>
<replaceregexp>
<regexp pattern="(?m)\*/\s+(public class ParseException )" />
<substitution expression="*${line.separator} * @deprecated Use superclass {@link net.sourceforge.pmd.lang.ast.ParseException}${line.separator} */${line.separator}@Deprecated${line.separator}@net.sourceforge.pmd.annotation.InternalApi${line.separator}\1" />
<fileset file="${target}/net/sourceforge/pmd/lang/plsql/ast/ParseException.java"/>
</replaceregexp>
<!-- deprecate/internalize AST constructors -->
<replaceregexp>
<regexp pattern=" public AST\w+\(int id\) \{" />
<substitution expression=" @Deprecated${line.separator} @net.sourceforge.pmd.annotation.InternalApi${line.separator}\0" />
<fileset dir="${target}/net/sourceforge/pmd/lang/plsql/ast">
<include name="AST*.java" />
</fileset>
</replaceregexp>
<replaceregexp>
<regexp pattern=" public AST\w+\(PLSQLParser p, int id\) \{" />
<substitution expression=" @Deprecated${line.separator} @net.sourceforge.pmd.annotation.InternalApi${line.separator}\0" />
<fileset dir="${target}/net/sourceforge/pmd/lang/plsql/ast">
<include name="AST*.java" />
</fileset>
</replaceregexp>
</target>
</project>

View File

@ -4,13 +4,10 @@
package net.sourceforge.pmd.lang.plsql.ast;
import org.checkerframework.checker.nullness.qual.Nullable;
import net.sourceforge.pmd.lang.ast.ParseException;
import net.sourceforge.pmd.lang.ast.impl.javacc.JavaccTokenDocument;
import net.sourceforge.pmd.lang.ast.impl.javacc.CharStream;
import net.sourceforge.pmd.lang.ast.impl.javacc.JavaccTokenDocument.TokenDocumentBehavior;
import net.sourceforge.pmd.lang.ast.impl.javacc.JjtreeParserAdapter;
import net.sourceforge.pmd.lang.ast.impl.javacc.CharStream;
public class PLSQLParser extends JjtreeParserAdapter<ASTInput> {

View File

@ -32,7 +32,7 @@ public class PythonTokenizer extends JavaCCTokenizer {
}
@Override
protected JavaccTokenDocument.TokenDocumentBehavior newTokenDoc() {
protected JavaccTokenDocument.TokenDocumentBehavior tokenBehavior() {
return TOKEN_BEHAVIOR;
}

View File

@ -25,7 +25,7 @@ public class VfTokenizer extends JavaCCTokenizer {
}
@Override
protected TokenDocumentBehavior newTokenDoc() {
protected TokenDocumentBehavior tokenBehavior() {
return new JavaccTokenDocument.TokenDocumentBehavior(VfTokenKinds.TOKEN_NAMES,
EscapeTranslator.translatorFor(JavaEscapeTranslator::new));
}