Fix build

This commit is contained in:
Clément Fournier
2023-02-12 18:21:54 +01:00
parent fb9f49624d
commit ddbfc90c14
40 changed files with 174 additions and 276 deletions

View File

@ -20,6 +20,9 @@ alias i := install
cleanInstallEverything *FLAGS: cleanInstallEverything *FLAGS:
mvnd clean install -Dmaven.javadoc.skip -Dkotlin.compiler.incremental -fae {{FLAGS}} mvnd clean install -Dmaven.javadoc.skip -Dkotlin.compiler.incremental -fae {{FLAGS}}
installEverything *FLAGS:
mvnd install -Dmaven.javadoc.skip -Dkotlin.compiler.incremental -fae {{FLAGS}}
testCore *FLAGS: testCore *FLAGS:
mvnd test checkstyle:check pmd:check -Dmaven.javadoc.skip -Dkotlin.compiler.incremental -pl pmd-core {{FLAGS}} mvnd test checkstyle:check pmd:check -Dmaven.javadoc.skip -Dkotlin.compiler.incremental -pl pmd-core {{FLAGS}}
@ -46,6 +49,6 @@ lintChanged DIFF="master" *FLAGS="":
lint projects="pmd-java": lint projects="pmd-java":
mvnd checkstyle:check pmd:check -pl {{projects}} -fae mvnd checkstyle:check pmd:check -pl {{projects}} -fae
lintAll: lintAll *FLAGS:
mvnd checkstyle:check pmd:check -fae mvnd checkstyle:check pmd:check -fae {{FLAGS}}

View File

@ -8,7 +8,7 @@
<target name="all" depends="testBasic"/> <target name="all" depends="testBasic"/>
<target name="testBasic"> <target name="testBasic">
<cpd minimumTokenCount="20" outputFile="${pmd.home}/target/cpd.ant.tests" language="cpddummy"> <cpd minimumTokenCount="20" outputFile="${pmd.home}/target/cpd.ant.tests" language="dummy">
<fileset dir="${pmd.home}/src/main/"> <fileset dir="${pmd.home}/src/main/">
<include name="**/*.java"/> <include name="**/*.java"/>
</fileset> </fileset>

View File

@ -4,13 +4,13 @@
package net.sourceforge.pmd.lang.apex; package net.sourceforge.pmd.lang.apex;
import net.sourceforge.pmd.lang.apex.cpd.ApexTokenizer;
import net.sourceforge.pmd.cpd.Tokenizer; import net.sourceforge.pmd.cpd.Tokenizer;
import net.sourceforge.pmd.lang.Language; import net.sourceforge.pmd.lang.Language;
import net.sourceforge.pmd.lang.LanguageModuleBase; import net.sourceforge.pmd.lang.LanguageModuleBase;
import net.sourceforge.pmd.lang.LanguageProcessor; import net.sourceforge.pmd.lang.LanguageProcessor;
import net.sourceforge.pmd.lang.LanguagePropertyBundle; import net.sourceforge.pmd.lang.LanguagePropertyBundle;
import net.sourceforge.pmd.lang.LanguageRegistry; import net.sourceforge.pmd.lang.LanguageRegistry;
import net.sourceforge.pmd.lang.apex.cpd.ApexTokenizer;
import apex.jorje.services.Version; import apex.jorje.services.Version;

View File

@ -4,32 +4,60 @@
package net.sourceforge.pmd.lang.apex.cpd; package net.sourceforge.pmd.lang.apex.cpd;
import java.io.IOException;
import java.util.Locale; import java.util.Locale;
import org.antlr.v4.runtime.CharStream; import org.antlr.runtime.ANTLRReaderStream;
import org.antlr.runtime.ANTLRStringStream;
import org.antlr.runtime.Lexer;
import org.antlr.runtime.Token;
import net.sourceforge.pmd.cpd.TokenFactory;
import net.sourceforge.pmd.cpd.Tokenizer; import net.sourceforge.pmd.cpd.Tokenizer;
import net.sourceforge.pmd.cpd.internal.AntlrTokenizer; import net.sourceforge.pmd.lang.apex.ApexJorjeLogging;
import net.sourceforge.pmd.lang.apex.ApexLanguageProperties; import net.sourceforge.pmd.lang.apex.ApexLanguageProperties;
import net.sourceforge.pmd.lang.ast.impl.antlr4.AntlrToken; import net.sourceforge.pmd.lang.ast.TokenMgrError;
import net.sourceforge.pmd.lang.document.TextDocument;
import apex.jorje.parser.impl.ApexLexer;
public class ApexTokenizer implements Tokenizer {
public class ApexTokenizer extends AntlrTokenizer {
private final boolean caseSensitive; private final boolean caseSensitive;
public ApexTokenizer(ApexLanguageProperties properties) { public ApexTokenizer(ApexLanguageProperties properties) {
this.caseSensitive = properties.getProperty(Tokenizer.CPD_CASE_SENSITIVE); this.caseSensitive = properties.getProperty(Tokenizer.CPD_CASE_SENSITIVE);
ApexJorjeLogging.disableLogging();
} }
@Override @Override
protected String getImage(AntlrToken token) { public void tokenize(TextDocument document, TokenFactory tokenEntries) throws IOException {
if (caseSensitive) {
return token.getImage();
}
return token.getImage().toLowerCase(Locale.ROOT);
}
ANTLRStringStream ass = new ANTLRReaderStream(document.newReader());
ApexLexer lexer = new ApexLexer(ass) {
@Override @Override
protected org.antlr.v4.runtime.Lexer getLexerForSource(CharStream charStream) { public void emitErrorMessage(String msg) {
return new com.nawforce.runtime.parsers.ApexLexer(charStream); throw new TokenMgrError(getLine(), getCharPositionInLine(), getSourceName(), msg, null);
}
};
Token token = lexer.nextToken();
while (token.getType() != Token.EOF) {
if (token.getChannel() != Lexer.HIDDEN) {
String tokenText = token.getText();
if (!caseSensitive) {
tokenText = tokenText.toLowerCase(Locale.ROOT);
}
tokenEntries.recordToken(
tokenText,
token.getLine(),
token.getCharPositionInLine() + 1,
token.getLine(),
token.getCharPositionInLine() + tokenText.length() + 1
);
}
token = lexer.nextToken();
}
} }
} }

View File

@ -124,7 +124,7 @@ public class CpdCommand extends AbstractAnalysisPmdSubcommand {
final CPDConfiguration configuration = toConfiguration(); final CPDConfiguration configuration = toConfiguration();
try (CpdAnalysis cpd = new CpdAnalysis(configuration)){ try (CpdAnalysis cpd = new CpdAnalysis(configuration)) {
MutableBoolean hasViolations = new MutableBoolean(); MutableBoolean hasViolations = new MutableBoolean();
cpd.performAnalysis(report -> hasViolations.setValue(!report.getMatches().isEmpty())); cpd.performAnalysis(report -> hasViolations.setValue(!report.getMatches().isEmpty()));

View File

@ -62,8 +62,8 @@ public class AnyTokenizer implements Tokenizer {
} }
@Override @Override
public void tokenize(TextDocument sourceCode, TokenFactory tokens) { public void tokenize(TextDocument document, TokenFactory tokens) {
Chars text = sourceCode.getText(); Chars text = document.getText();
Matcher matcher = pattern.matcher(text); Matcher matcher = pattern.matcher(text);
int lineNo = 1; int lineNo = 1;
int lastLineStart = 0; int lastLineStart = 0;

View File

@ -62,11 +62,11 @@ import javax.swing.table.TableModel;
import net.sourceforge.pmd.PMDVersion; import net.sourceforge.pmd.PMDVersion;
import net.sourceforge.pmd.cpd.renderer.CPDReportRenderer; import net.sourceforge.pmd.cpd.renderer.CPDReportRenderer;
import net.sourceforge.pmd.lang.CpdOnlyLanguageModuleBase;
import net.sourceforge.pmd.lang.Language; import net.sourceforge.pmd.lang.Language;
import net.sourceforge.pmd.lang.LanguageModuleBase.LanguageMetadata; import net.sourceforge.pmd.lang.LanguageModuleBase.LanguageMetadata;
import net.sourceforge.pmd.lang.LanguagePropertyBundle; import net.sourceforge.pmd.lang.LanguagePropertyBundle;
import net.sourceforge.pmd.lang.LanguageRegistry; import net.sourceforge.pmd.lang.LanguageRegistry;
import net.sourceforge.pmd.lang.impl.CpdOnlyLanguageModuleBase;
public class GUI implements CPDListener { public class GUI implements CPDListener {

View File

@ -26,10 +26,8 @@ public interface Tokenizer {
PropertyDescriptor<Boolean> CPD_ANONYMIZE_IDENTIFIERS = PropertyDescriptor<Boolean> CPD_ANONYMIZE_IDENTIFIERS =
PropertyFactory.booleanProperty("cpdAnonymizeIdentifiers") PropertyFactory.booleanProperty("cpdAnonymizeIdentifiers")
.defaultValue(false) .defaultValue(false)
.desc("Anonymize identifiers. They are still part of the token stream but all literals appear to have the same value.") .desc("Anonymize identifiers. They are still part of the token stream but all identifiers appear to have the same value.")
.build(); .build();
PropertyDescriptor<Boolean> CPD_IGNORE_IMPORTS = PropertyDescriptor<Boolean> CPD_IGNORE_IMPORTS =
PropertyFactory.booleanProperty("cpdIgnoreImports") PropertyFactory.booleanProperty("cpdIgnoreImports")
.defaultValue(true) .defaultValue(true)
@ -41,48 +39,17 @@ public interface Tokenizer {
.defaultValue(false) .defaultValue(false)
.desc("Ignore metadata such as Java annotations or C# attributes.") .desc("Ignore metadata such as Java annotations or C# attributes.")
.build(); .build();
PropertyDescriptor<Boolean> CPD_CASE_SENSITIVE = PropertyDescriptor<Boolean> CPD_CASE_SENSITIVE =
PropertyFactory.booleanProperty("cpdCaseSensitive") PropertyFactory.booleanProperty("cpdCaseSensitive")
.defaultValue(true) .defaultValue(false)
.desc("Whether CPD should ignore the case of tokens. Affects all tokens.") .desc("Whether CPD should ignore the case of tokens. Affects all tokens.")
.build(); .build();
String IGNORE_LITERALS = "ignore_literals"; @Deprecated // TODO what to do with this?
String IGNORE_IDENTIFIERS = "ignore_identifiers";
String IGNORE_ANNOTATIONS = "ignore_annotations";
/**
* Ignore sequences of literals (e.g, <code>0,0,0,0...</code>).
*/
String OPTION_IGNORE_LITERAL_SEQUENCES = "net.sourceforge.pmd.cpd.Tokenizer.skipLiteralSequences";
/**
* Ignore using directives in C#. The default value is <code>false</code>.
*/
String IGNORE_USINGS = "ignore_usings";
/**
* Enables or disabled skipping of blocks like a pre-processor. It is a
* boolean property. The default value is <code>true</code>.
*
* @see #OPTION_SKIP_BLOCKS_PATTERN
*/
String OPTION_SKIP_BLOCKS = "net.sourceforge.pmd.cpd.Tokenizer.skipBlocks";
/**
* Configures the pattern, to find the blocks to skip. It is a string
* property and contains of two parts, separated by {@code |}. The first
* part is the start pattern, the second part is the ending pattern. Default
* value is "{@code #if 0|#endif}".
*
* @see #DEFAULT_SKIP_BLOCKS_PATTERN
*/
String OPTION_SKIP_BLOCKS_PATTERN = "net.sourceforge.pmd.cpd.Tokenizer.skipBlocksPattern";
String DEFAULT_SKIP_BLOCKS_PATTERN = "#if 0|#endif"; String DEFAULT_SKIP_BLOCKS_PATTERN = "#if 0|#endif";
void tokenize(TextDocument sourceCode, TokenFactory tokens) throws IOException; void tokenize(TextDocument document, TokenFactory tokens) throws IOException;
static void tokenize(Tokenizer tokenizer, TextDocument textDocument, Tokens tokens) throws IOException { static void tokenize(Tokenizer tokenizer, TextDocument textDocument, Tokens tokens) throws IOException {
try (TokenFactory tf = TokenFactory.forFile(textDocument, tokens)) { try (TokenFactory tf = TokenFactory.forFile(textDocument, tokens)) {

View File

@ -1,68 +0,0 @@
/*
* BSD-style license; for more info see http://pmd.sourceforge.net/license.html
*/
package net.sourceforge.pmd.internal;
import java.util.Collections;
import java.util.Comparator;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.LinkedHashSet;
import java.util.Map;
import java.util.ServiceConfigurationError;
import java.util.ServiceLoader;
import java.util.Set;
import java.util.TreeSet;
import net.sourceforge.pmd.annotation.InternalApi;
@InternalApi
public abstract class LanguageServiceBase<T> {
protected interface NameExtractor<T> {
String getName(T language);
}
protected final Set<T> languages;
protected final Map<String, T> languagesByName;
protected final Map<String, T> languagesByTerseName;
protected LanguageServiceBase(final Class<T> serviceType, final Comparator<T> comparator,
final NameExtractor<T> nameExtractor, final NameExtractor<T> terseNameExtractor) {
Set<T> sortedLangs = new TreeSet<>(comparator);
// Use current class' classloader instead of the threads context classloader, see https://github.com/pmd/pmd/issues/1788
ServiceLoader<T> languageLoader = ServiceLoader.load(serviceType, getClass().getClassLoader());
Iterator<T> iterator = languageLoader.iterator();
while (true) {
// this loop is weird, but both hasNext and next may throw ServiceConfigurationError,
// it's more robust that way
try {
if (iterator.hasNext()) {
T language = iterator.next();
sortedLangs.add(language);
} else {
break;
}
} catch (UnsupportedClassVersionError | ServiceConfigurationError e) {
// Some languages require java8 and are therefore only available
// if java8 or later is used as runtime.
System.err.println("Ignoring language for PMD: " + e.toString());
}
}
// using a linked hash map to maintain insertion order
languages = Collections.unmodifiableSet(new LinkedHashSet<>(sortedLangs));
// TODO there may be languages with duplicate names
Map<String, T> byName = new LinkedHashMap<>();
Map<String, T> byTerseName = new LinkedHashMap<>();
for (T language : sortedLangs) {
byName.put(nameExtractor.getName(language), language);
byTerseName.put(terseNameExtractor.getName(language), language);
}
languagesByName = Collections.unmodifiableMap(byName);
languagesByTerseName = Collections.unmodifiableMap(byTerseName);
}
}

View File

@ -2,9 +2,11 @@
* BSD-style license; for more info see http://pmd.sourceforge.net/license.html * BSD-style license; for more info see http://pmd.sourceforge.net/license.html
*/ */
package net.sourceforge.pmd.lang; package net.sourceforge.pmd.lang.impl;
import net.sourceforge.pmd.cpd.Tokenizer; import net.sourceforge.pmd.cpd.Tokenizer;
import net.sourceforge.pmd.lang.LanguageModuleBase;
import net.sourceforge.pmd.lang.LanguagePropertyBundle;
/** /**
* Base class for language modules that only support CPD and not PMD. * Base class for language modules that only support CPD and not PMD.

View File

@ -1,4 +1,4 @@
/** /*
* BSD-style license; for more info see http://pmd.sourceforge.net/license.html * BSD-style license; for more info see http://pmd.sourceforge.net/license.html
*/ */
@ -13,12 +13,10 @@ import java.util.Iterator;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;
import net.sourceforge.pmd.lang.DummyLanguageModule;
import net.sourceforge.pmd.lang.Language; import net.sourceforge.pmd.lang.Language;
import net.sourceforge.pmd.lang.LanguagePropertyBundle;
import net.sourceforge.pmd.lang.document.Chars;
import net.sourceforge.pmd.lang.document.TextDocument; import net.sourceforge.pmd.lang.document.TextDocument;
import net.sourceforge.pmd.lang.document.TextFile; import net.sourceforge.pmd.lang.document.TextFile;
import net.sourceforge.pmd.lang.java.JavaLanguageModule;
class MatchAlgorithmTest { class MatchAlgorithmTest {
@ -38,15 +36,15 @@ class MatchAlgorithmTest {
@Test @Test
void testSimple() throws IOException { void testSimple() throws IOException {
Language java = JavaLanguageModule.getInstance(); Language dummy = DummyLanguageModule.getInstance();
Tokenizer tokenizer = java.createCpdTokenizer(java.newPropertyBundle()); Tokenizer tokenizer = dummy.createCpdTokenizer(dummy.newPropertyBundle());
String fileName = "Foo.java"; String fileName = "Foo.dummy";
TextFile textFile = TextFile.forCharSeq(getSampleCode(), fileName, java.getDefaultVersion()); TextFile textFile = TextFile.forCharSeq(getSampleCode(), fileName, dummy.getDefaultVersion());
SourceManager sourceManager = new SourceManager(listOf(textFile)); SourceManager sourceManager = new SourceManager(listOf(textFile));
Tokens tokens = new Tokens(); Tokens tokens = new Tokens();
TextDocument sourceCode = sourceManager.get(textFile); TextDocument sourceCode = sourceManager.get(textFile);
Tokenizer.tokenize(tokenizer, sourceCode, tokens); Tokenizer.tokenize(tokenizer, sourceCode, tokens);
assertEquals(41, tokens.size()); assertEquals(44, tokens.size());
MatchAlgorithm matchAlgorithm = new MatchAlgorithm(tokens, 5); MatchAlgorithm matchAlgorithm = new MatchAlgorithm(tokens, 5);
matchAlgorithm.findMatches(); matchAlgorithm.findMatches();
@ -61,34 +59,10 @@ class MatchAlgorithmTest {
assertEquals(3, mark1.getBeginLine()); assertEquals(3, mark1.getBeginLine());
assertEquals(fileName, mark1.getFilename()); assertEquals(fileName, mark1.getFilename());
assertEquals(Chars.wrap(LINE_3), sourceManager.getSlice(mark1)); assertEquals(LINE_3 + "\n", sourceManager.getSlice(mark1).toString());
assertEquals(4, mark2.getBeginLine()); assertEquals(4, mark2.getBeginLine());
assertEquals(fileName, mark2.getFilename()); assertEquals(fileName, mark2.getFilename());
assertEquals(Chars.wrap(LINE_4), sourceManager.getSlice(mark2)); assertEquals(LINE_4 + "\n", sourceManager.getSlice(mark2).toString());
}
@Test
void testIgnore() throws IOException {
Language java = JavaLanguageModule.getInstance();
LanguagePropertyBundle bundle = java.newPropertyBundle();
bundle.setProperty(Tokenizer.CPD_ANONYMIZE_IDENTIFIERS, true);
bundle.setProperty(Tokenizer.CPD_ANONYMIZE_LITERALS, true);
Tokenizer tokenizer = java.createCpdTokenizer(bundle);
TextDocument sourceCode = TextDocument.readOnlyString(getSampleCode(), "Foo.java", java.getDefaultVersion());
Tokens tokens = new Tokens();
Tokenizer.tokenize(tokenizer, sourceCode, tokens);
MatchAlgorithm matchAlgorithm = new MatchAlgorithm(tokens, 5);
matchAlgorithm.findMatches();
Iterator<Match> matches = matchAlgorithm.matches();
Match match = matches.next();
assertFalse(matches.hasNext());
Iterator<Mark> marks = match.iterator();
marks.next();
marks.next();
marks.next();
assertFalse(marks.hasNext());
} }
} }

View File

@ -7,6 +7,7 @@ package net.sourceforge.pmd.lang;
import java.util.Objects; import java.util.Objects;
import net.sourceforge.pmd.RuleViolation; import net.sourceforge.pmd.RuleViolation;
import net.sourceforge.pmd.cpd.Tokenizer;
import net.sourceforge.pmd.lang.ast.DummyNode; import net.sourceforge.pmd.lang.ast.DummyNode;
import net.sourceforge.pmd.lang.ast.DummyNode.DummyRootNode; import net.sourceforge.pmd.lang.ast.DummyNode.DummyRootNode;
import net.sourceforge.pmd.lang.ast.ParseException; import net.sourceforge.pmd.lang.ast.ParseException;
@ -45,6 +46,14 @@ public class DummyLanguageModule extends SimpleLanguageModuleBase {
return (DummyLanguageModule) Objects.requireNonNull(LanguageRegistry.PMD.getLanguageByFullName(NAME)); return (DummyLanguageModule) Objects.requireNonNull(LanguageRegistry.PMD.getLanguageByFullName(NAME));
} }
@Override
public LanguagePropertyBundle newPropertyBundle() {
LanguagePropertyBundle bundle = super.newPropertyBundle();
bundle.definePropertyDescriptor(Tokenizer.CPD_ANONYMIZE_LITERALS);
bundle.definePropertyDescriptor(Tokenizer.CPD_ANONYMIZE_IDENTIFIERS);
return bundle;
}
public LanguageVersion getVersionWhereParserThrows() { public LanguageVersion getVersionWhereParserThrows() {
return getVersion(PARSER_THROWS); return getVersion(PARSER_THROWS);
} }

View File

@ -6,9 +6,9 @@ package net.sourceforge.pmd.lang.cpp;
import net.sourceforge.pmd.cpd.CPPTokenizer; import net.sourceforge.pmd.cpd.CPPTokenizer;
import net.sourceforge.pmd.cpd.Tokenizer; import net.sourceforge.pmd.cpd.Tokenizer;
import net.sourceforge.pmd.lang.CpdOnlyLanguageModuleBase;
import net.sourceforge.pmd.lang.LanguagePropertyBundle; import net.sourceforge.pmd.lang.LanguagePropertyBundle;
import net.sourceforge.pmd.lang.LanguageRegistry; import net.sourceforge.pmd.lang.LanguageRegistry;
import net.sourceforge.pmd.lang.impl.CpdOnlyLanguageModuleBase;
import net.sourceforge.pmd.properties.PropertyDescriptor; import net.sourceforge.pmd.properties.PropertyDescriptor;
import net.sourceforge.pmd.properties.PropertyFactory; import net.sourceforge.pmd.properties.PropertyFactory;

View File

@ -4,11 +4,11 @@
package net.sourceforge.pmd.lang.cs; package net.sourceforge.pmd.lang.cs;
import net.sourceforge.pmd.cpd.CsTokenizer;
import net.sourceforge.pmd.cpd.Tokenizer; import net.sourceforge.pmd.cpd.Tokenizer;
import net.sourceforge.pmd.lang.CpdOnlyLanguageModuleBase;
import net.sourceforge.pmd.lang.LanguagePropertyBundle; import net.sourceforge.pmd.lang.LanguagePropertyBundle;
import net.sourceforge.pmd.lang.LanguageRegistry; import net.sourceforge.pmd.lang.LanguageRegistry;
import net.sourceforge.pmd.lang.cs.cpd.CsTokenizer;
import net.sourceforge.pmd.lang.impl.CpdOnlyLanguageModuleBase;
/** /**
* Defines the Language module for C#. * Defines the Language module for C#.

View File

@ -1,12 +1,13 @@
/** /*
* BSD-style license; for more info see http://pmd.sourceforge.net/license.html * BSD-style license; for more info see http://pmd.sourceforge.net/license.html
*/ */
package net.sourceforge.pmd.cpd; package net.sourceforge.pmd.lang.cs.cpd;
import org.antlr.v4.runtime.CharStream; import org.antlr.v4.runtime.CharStream;
import org.antlr.v4.runtime.Lexer; import org.antlr.v4.runtime.Lexer;
import net.sourceforge.pmd.cpd.Tokenizer;
import net.sourceforge.pmd.cpd.internal.AntlrTokenizer; import net.sourceforge.pmd.cpd.internal.AntlrTokenizer;
import net.sourceforge.pmd.cpd.token.AntlrTokenFilter; import net.sourceforge.pmd.cpd.token.AntlrTokenFilter;
import net.sourceforge.pmd.cpd.token.internal.BaseTokenFilter; import net.sourceforge.pmd.cpd.token.internal.BaseTokenFilter;

View File

@ -2,28 +2,22 @@
* BSD-style license; for more info see http://pmd.sourceforge.net/license.html * BSD-style license; for more info see http://pmd.sourceforge.net/license.html
*/ */
package net.sourceforge.pmd.cpd; package net.sourceforge.pmd.lang.cs.cpd;
import static org.junit.jupiter.api.Assertions.assertThrows; import static org.junit.jupiter.api.Assertions.assertThrows;
import java.util.Properties; import org.checkerframework.checker.nullness.qual.NonNull;
import org.jetbrains.annotations.NotNull;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;
import net.sourceforge.pmd.cpd.Tokenizer;
import net.sourceforge.pmd.cpd.test.CpdTextComparisonTest; import net.sourceforge.pmd.cpd.test.CpdTextComparisonTest;
import net.sourceforge.pmd.lang.LanguagePropertyBundle; import net.sourceforge.pmd.cpd.test.LanguagePropertyConfig;
import net.sourceforge.pmd.lang.ast.TokenMgrError; import net.sourceforge.pmd.lang.ast.TokenMgrError;
class CsTokenizerTest extends CpdTextComparisonTest { class CsTokenizerTest extends CpdTextComparisonTest {
CsTokenizerTest() { CsTokenizerTest() {
super(".cs"); super("cs", ".cs");
}
@Override
protected String getResourcePrefix() {
return "../lang/cs/cpd/testdata";
} }
@Test @Test
@ -107,23 +101,28 @@ class CsTokenizerTest extends CpdTextComparisonTest {
doTest("attributes", "_ignored", skipAttributes()); doTest("attributes", "_ignored", skipAttributes());
} }
private Properties ignoreUsings() { private LanguagePropertyConfig ignoreUsings() {
return properties(true, false, false); return properties(true, false, false);
} }
private Properties skipLiteralSequences() { private LanguagePropertyConfig skipLiteralSequences() {
return properties(false, true, false); return properties(false, true, false);
} }
private Properties skipAttributes() { private LanguagePropertyConfig skipAttributes() {
return properties(false, false, true); return properties(false, false, true);
} }
private Properties properties(boolean ignoreUsings, boolean ignoreLiteralSequences, boolean ignoreAttributes) { @Override
Properties properties = new Properties(); public @NonNull LanguagePropertyConfig defaultProperties() {
properties.setProperty(Tokenizer.IGNORE_USINGS, Boolean.toString(ignoreUsings)); return properties(false, false, false);
properties.setProperty(Tokenizer.OPTION_IGNORE_LITERAL_SEQUENCES, Boolean.toString(ignoreLiteralSequences)); }
properties.setProperty(Tokenizer.IGNORE_ANNOTATIONS, Boolean.toString(ignoreAttributes));
return properties; private LanguagePropertyConfig properties(boolean ignoreUsings, boolean ignoreLiteralSequences, boolean ignoreAttributes) {
return properties -> {
properties.setProperty(Tokenizer.CPD_IGNORE_IMPORTS, ignoreUsings);
properties.setProperty(Tokenizer.CPD_IGNORE_LITERAL_SEQUENCES, ignoreLiteralSequences);
properties.setProperty(Tokenizer.CPD_IGNORE_METADATA, ignoreAttributes);
};
} }
} }

View File

@ -4,10 +4,10 @@
package net.sourceforge.pmd.lang.dart; package net.sourceforge.pmd.lang.dart;
import net.sourceforge.pmd.lang.dart.cpd.DartTokenizer;
import net.sourceforge.pmd.cpd.Tokenizer; import net.sourceforge.pmd.cpd.Tokenizer;
import net.sourceforge.pmd.lang.CpdOnlyLanguageModuleBase;
import net.sourceforge.pmd.lang.LanguagePropertyBundle; import net.sourceforge.pmd.lang.LanguagePropertyBundle;
import net.sourceforge.pmd.lang.dart.cpd.DartTokenizer;
import net.sourceforge.pmd.lang.impl.CpdOnlyLanguageModuleBase;
/** /**
* Language implementation for Dart * Language implementation for Dart

View File

@ -6,8 +6,8 @@ package net.sourceforge.pmd.lang.fortran;
import net.sourceforge.pmd.cpd.AnyTokenizer; import net.sourceforge.pmd.cpd.AnyTokenizer;
import net.sourceforge.pmd.cpd.Tokenizer; import net.sourceforge.pmd.cpd.Tokenizer;
import net.sourceforge.pmd.lang.CpdOnlyLanguageModuleBase;
import net.sourceforge.pmd.lang.LanguagePropertyBundle; import net.sourceforge.pmd.lang.LanguagePropertyBundle;
import net.sourceforge.pmd.lang.impl.CpdOnlyLanguageModuleBase;
/** /**
* Language implementation for Fortran * Language implementation for Fortran

View File

@ -5,9 +5,9 @@
package net.sourceforge.pmd.lang.gherkin; package net.sourceforge.pmd.lang.gherkin;
import net.sourceforge.pmd.cpd.Tokenizer; import net.sourceforge.pmd.cpd.Tokenizer;
import net.sourceforge.pmd.lang.CpdOnlyLanguageModuleBase;
import net.sourceforge.pmd.lang.LanguagePropertyBundle; import net.sourceforge.pmd.lang.LanguagePropertyBundle;
import net.sourceforge.pmd.lang.gherkin.cpd.GherkinTokenizer; import net.sourceforge.pmd.lang.gherkin.cpd.GherkinTokenizer;
import net.sourceforge.pmd.lang.impl.CpdOnlyLanguageModuleBase;
/** /**
* Language implementation for Gherkin. * Language implementation for Gherkin.

View File

@ -5,9 +5,9 @@
package net.sourceforge.pmd.lang.go; package net.sourceforge.pmd.lang.go;
import net.sourceforge.pmd.cpd.Tokenizer; import net.sourceforge.pmd.cpd.Tokenizer;
import net.sourceforge.pmd.lang.CpdOnlyLanguageModuleBase;
import net.sourceforge.pmd.lang.LanguagePropertyBundle; import net.sourceforge.pmd.lang.LanguagePropertyBundle;
import net.sourceforge.pmd.lang.go.cpd.GoTokenizer; import net.sourceforge.pmd.lang.go.cpd.GoTokenizer;
import net.sourceforge.pmd.lang.impl.CpdOnlyLanguageModuleBase;
public class GoLanguageModule extends CpdOnlyLanguageModuleBase { public class GoLanguageModule extends CpdOnlyLanguageModuleBase {

View File

@ -4,10 +4,10 @@
package net.sourceforge.pmd.lang.groovy; package net.sourceforge.pmd.lang.groovy;
import net.sourceforge.pmd.lang.groovy.cpd.GroovyTokenizer;
import net.sourceforge.pmd.cpd.Tokenizer; import net.sourceforge.pmd.cpd.Tokenizer;
import net.sourceforge.pmd.lang.CpdOnlyLanguageModuleBase;
import net.sourceforge.pmd.lang.LanguagePropertyBundle; import net.sourceforge.pmd.lang.LanguagePropertyBundle;
import net.sourceforge.pmd.lang.groovy.cpd.GroovyTokenizer;
import net.sourceforge.pmd.lang.impl.CpdOnlyLanguageModuleBase;
/** /**
* Language implementation for Groovy * Language implementation for Groovy

View File

@ -22,8 +22,8 @@ import groovyjarjarantlr.TokenStreamException;
public class GroovyTokenizer implements Tokenizer { public class GroovyTokenizer implements Tokenizer {
@Override @Override
public void tokenize(TextDocument sourceCode, TokenFactory tokens) { public void tokenize(TextDocument document, TokenFactory tokens) {
GroovyLexer lexer = new GroovyLexer(sourceCode.newReader()); GroovyLexer lexer = new GroovyLexer(document.newReader());
TokenStream tokenStream = lexer.plumb(); TokenStream tokenStream = lexer.plumb();
try { try {

View File

@ -19,13 +19,13 @@ import net.sourceforge.pmd.lang.html.HtmlLanguageModule;
public class HtmlTokenizer implements Tokenizer { public class HtmlTokenizer implements Tokenizer {
@Override @Override
public void tokenize(TextDocument sourceCode, TokenFactory tokens) { public void tokenize(TextDocument document, TokenFactory tokens) {
HtmlLanguageModule html = HtmlLanguageModule.getInstance(); HtmlLanguageModule html = HtmlLanguageModule.getInstance();
try (LanguageProcessor processor = html.createProcessor(html.newPropertyBundle())) { try (LanguageProcessor processor = html.createProcessor(html.newPropertyBundle())) {
ParserTask task = new ParserTask( ParserTask task = new ParserTask(
sourceCode, document,
SemanticErrorReporter.noop(), SemanticErrorReporter.noop(),
LanguageProcessorRegistry.singleton(processor) LanguageProcessorRegistry.singleton(processor)
); );

View File

@ -1,12 +1,15 @@
/** /*
* BSD-style license; for more info see http://pmd.sourceforge.net/license.html * BSD-style license; for more info see http://pmd.sourceforge.net/license.html
*/ */
package net.sourceforge.pmd.cpd; package net.sourceforge.pmd.lang.java.cpd;
import java.util.Deque; import java.util.Deque;
import java.util.LinkedList; import java.util.LinkedList;
import net.sourceforge.pmd.cpd.TokenEntry;
import net.sourceforge.pmd.cpd.TokenFactory;
import net.sourceforge.pmd.cpd.Tokenizer;
import net.sourceforge.pmd.cpd.internal.JavaCCTokenizer; import net.sourceforge.pmd.cpd.internal.JavaCCTokenizer;
import net.sourceforge.pmd.cpd.token.JavaCCTokenFilter; import net.sourceforge.pmd.cpd.token.JavaCCTokenFilter;
import net.sourceforge.pmd.lang.TokenManager; import net.sourceforge.pmd.lang.TokenManager;

View File

@ -1,27 +1,20 @@
/** /*
* BSD-style license; for more info see http://pmd.sourceforge.net/license.html * BSD-style license; for more info see http://pmd.sourceforge.net/license.html
*/ */
package net.sourceforge.pmd.cpd; package net.sourceforge.pmd.lang.java.cpd;
import java.util.Properties;
import org.junit.jupiter.api.Disabled;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;
import net.sourceforge.pmd.cpd.Tokenizer;
import net.sourceforge.pmd.cpd.test.CpdTextComparisonTest; import net.sourceforge.pmd.cpd.test.CpdTextComparisonTest;
import net.sourceforge.pmd.cpd.test.LanguagePropertyConfig;
import net.sourceforge.pmd.lang.java.JavaLanguageModule;
// TODO - enable test
@Disabled("Needs to be enabled after java-grammar changes are finalized")
class JavaTokenizerTest extends CpdTextComparisonTest { class JavaTokenizerTest extends CpdTextComparisonTest {
JavaTokenizerTest() { JavaTokenizerTest() {
super(".java"); super(JavaLanguageModule.getInstance(), ".java");
}
@Override
protected String getResourcePrefix() {
return "../lang/java/cpd/testdata";
} }
@Test @Test
@ -85,32 +78,32 @@ class JavaTokenizerTest extends CpdTextComparisonTest {
} }
private static Properties ignoreAnnotations() { private static LanguagePropertyConfig ignoreAnnotations() {
return properties(true, false, false); return properties(true, false, false);
} }
private static Properties ignoreIdents() { private static LanguagePropertyConfig ignoreIdents() {
return properties(false, false, true); return properties(false, false, true);
} }
private static Properties ignoreLiterals() { private static LanguagePropertyConfig ignoreLiterals() {
return properties(false, true, false); return properties(false, true, false);
} }
@Override @Override
public Properties defaultProperties() { public LanguagePropertyConfig defaultProperties() {
return properties(false, false, false); return properties(false, false, false);
} }
private static Properties properties(boolean ignoreAnnotations, private static LanguagePropertyConfig properties(boolean ignoreAnnotations,
boolean ignoreLiterals, boolean ignoreLiterals,
boolean ignoreIdents) { boolean ignoreIdents) {
Properties properties = new Properties(); return properties -> {
properties.setProperty(Tokenizer.IGNORE_ANNOTATIONS, Boolean.toString(ignoreAnnotations)); properties.setProperty(Tokenizer.CPD_IGNORE_METADATA, ignoreAnnotations);
properties.setProperty(Tokenizer.IGNORE_IDENTIFIERS, Boolean.toString(ignoreIdents)); properties.setProperty(Tokenizer.CPD_ANONYMIZE_IDENTIFIERS, ignoreIdents);
properties.setProperty(Tokenizer.IGNORE_LITERALS, Boolean.toString(ignoreLiterals)); properties.setProperty(Tokenizer.CPD_ANONYMIZE_LITERALS, ignoreLiterals);
return properties; };
} }

View File

@ -4,12 +4,12 @@
package net.sourceforge.pmd.lang.ecmascript; package net.sourceforge.pmd.lang.ecmascript;
import net.sourceforge.pmd.lang.ecmascript.cpd.EcmascriptTokenizer;
import net.sourceforge.pmd.cpd.Tokenizer; import net.sourceforge.pmd.cpd.Tokenizer;
import net.sourceforge.pmd.lang.Language; import net.sourceforge.pmd.lang.Language;
import net.sourceforge.pmd.lang.LanguagePropertyBundle; import net.sourceforge.pmd.lang.LanguagePropertyBundle;
import net.sourceforge.pmd.lang.LanguageRegistry; import net.sourceforge.pmd.lang.LanguageRegistry;
import net.sourceforge.pmd.lang.ecmascript.ast.EcmascriptParser; import net.sourceforge.pmd.lang.ecmascript.ast.EcmascriptParser;
import net.sourceforge.pmd.lang.ecmascript.cpd.EcmascriptTokenizer;
import net.sourceforge.pmd.lang.impl.SimpleLanguageModuleBase; import net.sourceforge.pmd.lang.impl.SimpleLanguageModuleBase;
/** /**

View File

@ -5,10 +5,10 @@
package net.sourceforge.pmd.lang.kotlin; package net.sourceforge.pmd.lang.kotlin;
import net.sourceforge.pmd.annotation.Experimental; import net.sourceforge.pmd.annotation.Experimental;
import net.sourceforge.pmd.cpd.KotlinTokenizer;
import net.sourceforge.pmd.cpd.Tokenizer; import net.sourceforge.pmd.cpd.Tokenizer;
import net.sourceforge.pmd.lang.LanguagePropertyBundle; import net.sourceforge.pmd.lang.LanguagePropertyBundle;
import net.sourceforge.pmd.lang.impl.SimpleLanguageModuleBase; import net.sourceforge.pmd.lang.impl.SimpleLanguageModuleBase;
import net.sourceforge.pmd.lang.kotlin.cpd.KotlinTokenizer;
/** /**
* Language Module for Kotlin * Language Module for Kotlin

View File

@ -1,16 +1,16 @@
/** /*
* BSD-style license; for more info see http://pmd.sourceforge.net/license.html * BSD-style license; for more info see http://pmd.sourceforge.net/license.html
*/ */
package net.sourceforge.pmd.cpd; package net.sourceforge.pmd.lang.kotlin.cpd;
import org.antlr.v4.runtime.CharStream; import org.antlr.v4.runtime.CharStream;
import org.antlr.v4.runtime.Lexer; import org.antlr.v4.runtime.Lexer;
import net.sourceforge.pmd.cpd.internal.AntlrTokenizer; import net.sourceforge.pmd.cpd.internal.AntlrTokenizer;
import net.sourceforge.pmd.cpd.token.AntlrTokenFilter; import net.sourceforge.pmd.cpd.token.AntlrTokenFilter;
import net.sourceforge.pmd.lang.TokenManager;
import net.sourceforge.pmd.lang.ast.impl.antlr4.AntlrToken; import net.sourceforge.pmd.lang.ast.impl.antlr4.AntlrToken;
import net.sourceforge.pmd.lang.ast.impl.antlr4.AntlrTokenManager;
import net.sourceforge.pmd.lang.kotlin.ast.KotlinLexer; import net.sourceforge.pmd.lang.kotlin.ast.KotlinLexer;
/** /**
@ -24,7 +24,7 @@ public class KotlinTokenizer extends AntlrTokenizer {
} }
@Override @Override
protected AntlrTokenFilter getTokenFilter(final AntlrTokenManager tokenManager) { protected TokenManager<AntlrToken> filterTokenStream(TokenManager<AntlrToken> tokenManager) {
return new KotlinTokenFilter(tokenManager); return new KotlinTokenFilter(tokenManager);
} }
@ -40,7 +40,7 @@ public class KotlinTokenizer extends AntlrTokenizer {
private boolean discardingPackageAndImport = false; private boolean discardingPackageAndImport = false;
private boolean discardingNL = false; private boolean discardingNL = false;
/* default */ KotlinTokenFilter(final AntlrTokenManager tokenManager) { /* default */ KotlinTokenFilter(final TokenManager<AntlrToken> tokenManager) {
super(tokenManager); super(tokenManager);
} }

View File

@ -1,8 +1,8 @@
/** /*
* BSD-style license; for more info see http://pmd.sourceforge.net/license.html * BSD-style license; for more info see http://pmd.sourceforge.net/license.html
*/ */
package net.sourceforge.pmd.cpd; package net.sourceforge.pmd.lang.kotlin.cpd;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;
@ -14,11 +14,6 @@ class KotlinTokenizerTest extends CpdTextComparisonTest {
super("kotlin", ".kt"); super("kotlin", ".kt");
} }
@Override
protected String getResourcePrefix() {
return "../lang/kotlin/cpd/testdata";
}
@Test @Test
void testComments() { void testComments() {
doTest("comment"); doTest("comment");

View File

@ -5,8 +5,8 @@
package net.sourceforge.pmd.lang.lua; package net.sourceforge.pmd.lang.lua;
import net.sourceforge.pmd.cpd.Tokenizer; import net.sourceforge.pmd.cpd.Tokenizer;
import net.sourceforge.pmd.lang.CpdOnlyLanguageModuleBase;
import net.sourceforge.pmd.lang.LanguagePropertyBundle; import net.sourceforge.pmd.lang.LanguagePropertyBundle;
import net.sourceforge.pmd.lang.impl.CpdOnlyLanguageModuleBase;
import net.sourceforge.pmd.lang.lua.cpd.LuaTokenizer; import net.sourceforge.pmd.lang.lua.cpd.LuaTokenizer;
/** /**
@ -18,8 +18,15 @@ public class LuaLanguageModule extends CpdOnlyLanguageModuleBase {
super(LanguageMetadata.withId("lua").name("Lua").extensions("lua")); super(LanguageMetadata.withId("lua").name("Lua").extensions("lua"));
} }
@Override
public LanguagePropertyBundle newPropertyBundle() {
LanguagePropertyBundle bundle = super.newPropertyBundle();
bundle.definePropertyDescriptor(Tokenizer.CPD_IGNORE_LITERAL_SEQUENCES);
return bundle;
}
@Override @Override
public Tokenizer createCpdTokenizer(LanguagePropertyBundle bundle) { public Tokenizer createCpdTokenizer(LanguagePropertyBundle bundle) {
return new LuaTokenizer(); return new LuaTokenizer(bundle);
} }
} }

Some files were not shown because too many files have changed in this diff Show More