Delete old CPD Language interface

reorganize cpd modules
This commit is contained in:
Clément Fournier
2023-02-12 17:32:56 +01:00
parent 8fbd830daa
commit fb9f49624d
87 changed files with 402 additions and 476 deletions

51
justfile Normal file
View File

@ -0,0 +1,51 @@
pmdJavaDeps := "pmd-core,pmd-lang-test,pmd-test,pmd-java"
commonBuildOpts := "-Dkotlin.compiler.incremental"
genJavaAst:
rm -f pmd-java/target/generated-sources/javacc/last-generated-timestamp
mvnd generate-sources -pl pmd-java
reGenAllSources:
rm -rf pmd-*/target/generated-sources
rm pmd-*/target/last-generated-timestamp
mvnd generate-sources
install MOD:
mvnd install -Dmaven.javadoc.skip -Dkotlin.compiler.incremental -pl "pmd-{{MOD}}"
alias i := install
cleanInstallEverything *FLAGS:
mvnd clean install -Dmaven.javadoc.skip -Dkotlin.compiler.incremental -fae {{FLAGS}}
testCore *FLAGS:
mvnd test checkstyle:check pmd:check -Dmaven.javadoc.skip -Dkotlin.compiler.incremental -pl pmd-core {{FLAGS}}
testJava *FLAGS:
mvnd test checkstyle:check pmd:check -Dmaven.javadoc.skip -Dkotlin.compiler.incremental -pl pmd-java {{FLAGS}}
installJavaAndDeps *FLAGS:
mvnd install -Dmaven.javadoc.skip -Dkotlin.compiler.incremental -pl {{pmdJavaDeps}} {{FLAGS}}
installJava *FLAGS:
mvnd install -Dmaven.javadoc.skip -Dkotlin.compiler.incremental -pl pmd-java {{FLAGS}}
lintChanged DIFF="master" *FLAGS="":
#!/bin/env zsh
changed=$(git diff --name-only {{DIFF}})
changed=${(f)changed}
projects=${changed%%/*} # remove all but first segment
echo $projects
# todo filter to pmd-*
mvnd checkstyle:check pmd:check -pl $projects -fae
lint projects="pmd-java":
mvnd checkstyle:check pmd:check -pl {{projects}} -fae
lintAll:
mvnd checkstyle:check pmd:check -fae

View File

@ -28,15 +28,15 @@ public class PmdLanguageVersionTypeSupport implements ITypeConverter<LanguageVer
// Explicit language-version pairs, such as "java-18" or "apex-54".
// We build these directly to retain aliases. "java-8" works, but the canonical name for the LanguageVersion is java-1.8
return LanguageRegistry.PMD.getLanguages().stream()
.flatMap(l -> l.getVersionNamesAndAliases().stream().map(v -> l.getTerseName() + "-" + v))
.flatMap(l -> l.getVersionNamesAndAliases().stream().map(v -> l.getId() + "-" + v))
.collect(Collectors.toCollection(TreeSet::new)).iterator();
}
@Override
public LanguageVersion convert(final String value) throws Exception {
return LanguageRegistry.PMD.getLanguages().stream()
.filter(l -> value.startsWith(l.getTerseName() + "-"))
.map(l -> l.getVersion(value.substring(l.getTerseName().length() + 1)))
.filter(l -> value.startsWith(l.getId() + "-"))
.map(l -> l.getVersion(value.substring(l.getId().length() + 1)))
.filter(Objects::nonNull)
.findFirst()
.orElseThrow(() -> new TypeConversionException("Unknown language version: " + value));

View File

@ -1,61 +0,0 @@
/**
* BSD-style license; for more info see http://pmd.sourceforge.net/license.html
*/
package net.sourceforge.pmd.cpd;
import java.io.FilenameFilter;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.Arrays;
import java.util.List;
import java.util.Properties;
import java.util.function.Predicate;
import net.sourceforge.pmd.internal.util.PredicateUtil;
public abstract class AbstractLanguage implements Language {
private final String name;
private final String terseName;
private final Tokenizer tokenizer;
private final Predicate<String> fileFilter;
private final List<String> extensions;
public AbstractLanguage(String name, String terseName, Tokenizer tokenizer, String... extensions) {
this.name = name;
this.terseName = terseName;
this.tokenizer = tokenizer;
this.fileFilter = PredicateUtil.toNormalizedFileFilter(PredicateUtil.getFileExtensionFilter(extensions).or(it -> Files.isDirectory(Paths.get(it))));
this.extensions = Arrays.asList(extensions);
}
@Override
public FilenameFilter getFileFilter() {
return (dir, name) -> fileFilter.test(dir.toPath().resolve(name).toString());
}
@Override
public Tokenizer getTokenizer() {
return tokenizer;
}
@Override
public void setProperties(Properties properties) {
// needs to be implemented by subclasses.
}
@Override
public String getName() {
return name;
}
@Override
public String getTerseName() {
return terseName;
}
@Override
public List<String> getExtensions() {
return extensions;
}
}

View File

@ -1,23 +0,0 @@
/**
* BSD-style license; for more info see http://pmd.sourceforge.net/license.html
*/
package net.sourceforge.pmd.cpd;
import java.io.FilenameFilter;
import java.util.List;
import java.util.Properties;
public interface Language {
String getName();
String getTerseName();
Tokenizer getTokenizer();
FilenameFilter getFileFilter();
void setProperties(Properties properties);
List<String> getExtensions();
}

View File

@ -5,8 +5,8 @@
package net.sourceforge.pmd.cpd.token;
import net.sourceforge.pmd.cpd.token.internal.BaseTokenFilter;
import net.sourceforge.pmd.lang.TokenManager;
import net.sourceforge.pmd.lang.ast.impl.antlr4.AntlrToken;
import net.sourceforge.pmd.lang.ast.impl.antlr4.AntlrTokenManager;
/**
* A generic filter for Antlr-based token managers that allows to use comments
@ -18,7 +18,7 @@ public class AntlrTokenFilter extends BaseTokenFilter<AntlrToken> {
* Creates a new AntlrTokenFilter
* @param tokenManager The token manager from which to retrieve tokens to be filtered
*/
public AntlrTokenFilter(final AntlrTokenManager tokenManager) {
public AntlrTokenFilter(final TokenManager<AntlrToken> tokenManager) {
super(tokenManager);
}

View File

@ -8,6 +8,7 @@ import java.util.List;
import java.util.ServiceLoader;
import java.util.Set;
import net.sourceforge.pmd.cpd.AnyTokenizer;
import net.sourceforge.pmd.cpd.Tokenizer;
/**
@ -199,7 +200,7 @@ public interface Language extends Comparable<Language> {
* @throws UnsupportedOperationException if this language does not support CPD
*/
default Tokenizer createCpdTokenizer(LanguagePropertyBundle bundle) {
throw new UnsupportedOperationException(this + " does not support running a CPD analysis.");
return new AnyTokenizer();
}

View File

@ -272,13 +272,13 @@ public abstract class LanguageModuleBase implements Language {
* assigned to the language. Parameters should not start with a period
* {@code .}.
*
* @param e1 First extensions
* @param extensionWithoutPeriod First extensions
* @param others Other extensions (optional)
*
* @throws NullPointerException If any extension is null
*/
public LanguageMetadata extensions(String e1, String... others) {
this.extensions = new ArrayList<>(setOf(e1, others));
public LanguageMetadata extensions(String extensionWithoutPeriod, String... others) {
this.extensions = new ArrayList<>(setOf(extensionWithoutPeriod, others));
AssertionUtil.requireContainsNoNullValue("extensions", this.extensions);
return this;
}

View File

@ -1,19 +0,0 @@
/**
* BSD-style license; for more info see http://pmd.sourceforge.net/license.html
*/
package net.sourceforge.pmd.cpd;
/**
* Language implementation for Fortran
*
* @author Romain PELISSE belaran@gmail.com
*/
public class FortranLanguage extends AbstractLanguage {
/**
* Create a Fortran Language instance.
*/
public FortranLanguage() {
super("Fortran", "fortran", new AnyTokenizer("!"), ".for", ".f", ".f66", ".f77", ".f90");
}
}

View File

@ -0,0 +1,29 @@
/*
* BSD-style license; for more info see http://pmd.sourceforge.net/license.html
*/
package net.sourceforge.pmd.lang.fortran;
import net.sourceforge.pmd.cpd.AnyTokenizer;
import net.sourceforge.pmd.cpd.Tokenizer;
import net.sourceforge.pmd.lang.CpdOnlyLanguageModuleBase;
import net.sourceforge.pmd.lang.LanguagePropertyBundle;
/**
* Language implementation for Fortran
*
* @author Romain PELISSE belaran@gmail.com
*/
public class FortranLanguageModule extends CpdOnlyLanguageModuleBase {
/**
* Create a Fortran Language instance.
*/
public FortranLanguageModule() {
super(LanguageMetadata.withId("fortran").name("Fortran").extensions("for", "f", "f66", "f77", "f90"));
}
@Override
public Tokenizer createCpdTokenizer(LanguagePropertyBundle bundle) {
return new AnyTokenizer("!");
}
}

View File

@ -1 +0,0 @@
net.sourceforge.pmd.cpd.FortranLanguage

View File

@ -0,0 +1 @@
net.sourceforge.pmd.lang.fortran.FortranLanguageModule

View File

@ -1,8 +1,8 @@
/**
/*
* BSD-style license; for more info see http://pmd.sourceforge.net/license.html
*/
package net.sourceforge.pmd.cpd;
package net.sourceforge.pmd.lang.fortran.cpd;
import org.junit.jupiter.api.Test;
@ -15,12 +15,7 @@ import net.sourceforge.pmd.cpd.test.CpdTextComparisonTest;
class FortranTokenizerTest extends CpdTextComparisonTest {
FortranTokenizerTest() {
super(".for");
}
@Override
protected String getResourcePrefix() {
return "../lang/fortran/cpd/testdata";
super("fortran", ".for");
}
@Test

View File

@ -0,0 +1,28 @@
/*
* BSD-style license; for more info see http://pmd.sourceforge.net/license.html
*/
package net.sourceforge.pmd.lang.gherkin;
import net.sourceforge.pmd.cpd.Tokenizer;
import net.sourceforge.pmd.lang.CpdOnlyLanguageModuleBase;
import net.sourceforge.pmd.lang.LanguagePropertyBundle;
import net.sourceforge.pmd.lang.gherkin.cpd.GherkinTokenizer;
/**
* Language implementation for Gherkin.
*/
public class GherkinLanguageModule extends CpdOnlyLanguageModuleBase {
/**
* Creates a new Gherkin Language instance.
*/
public GherkinLanguageModule() {
super(LanguageMetadata.withId("gherkin").name("Gherkin").extensions("feature"));
}
@Override
public Tokenizer createCpdTokenizer(LanguagePropertyBundle bundle) {
return new GherkinTokenizer();
}
}

View File

@ -1,20 +0,0 @@
/**
* BSD-style license; for more info see http://pmd.sourceforge.net/license.html
*/
package net.sourceforge.pmd.lang.gherkin.cpd;
import net.sourceforge.pmd.cpd.AbstractLanguage;
/**
* Language implementation for Gherkin.
*/
public class GherkinLanguage extends AbstractLanguage {
/**
* Creates a new Gherkin Language instance.
*/
public GherkinLanguage() {
super("Gherkin", "gherkin", new GherkinTokenizer(), ".feature");
}
}

View File

@ -1 +0,0 @@
net.sourceforge.pmd.lang.gherkin.cpd.GherkinLanguage

View File

@ -0,0 +1 @@
net.sourceforge.pmd.lang.gherkin.GherkinLanguageModule

View File

@ -2,7 +2,7 @@
* BSD-style license; for more info see http://pmd.sourceforge.net/license.html
*/
package net.sourceforge.pmd.cpd;
package net.sourceforge.pmd.lang.gherkin.cpd;
import org.junit.jupiter.api.Test;
@ -10,12 +10,7 @@ import net.sourceforge.pmd.cpd.test.CpdTextComparisonTest;
class GherkinTokenizerTest extends CpdTextComparisonTest {
GherkinTokenizerTest() {
super(".feature");
}
@Override
protected String getResourcePrefix() {
return "../lang/gherkin/cpd/testdata";
super("gherkin", ".feature");
}
@Test

View File

@ -1,15 +0,0 @@
/**
* BSD-style license; for more info see http://pmd.sourceforge.net/license.html
*/
package net.sourceforge.pmd.cpd;
/**
* @author oinume@gmail.com
*/
public class GoLanguage extends AbstractLanguage {
public GoLanguage() {
super("Go", "go", new GoTokenizer(), ".go");
}
}

View File

@ -0,0 +1,22 @@
/*
* BSD-style license; for more info see http://pmd.sourceforge.net/license.html
*/
package net.sourceforge.pmd.lang.go;
import net.sourceforge.pmd.cpd.Tokenizer;
import net.sourceforge.pmd.lang.CpdOnlyLanguageModuleBase;
import net.sourceforge.pmd.lang.LanguagePropertyBundle;
import net.sourceforge.pmd.lang.go.cpd.GoTokenizer;
public class GoLanguageModule extends CpdOnlyLanguageModuleBase {
public GoLanguageModule() {
super(LanguageMetadata.withId("go").name("Go").extensions("go"));
}
@Override
public Tokenizer createCpdTokenizer(LanguagePropertyBundle bundle) {
return new GoTokenizer();
}
}

View File

@ -1,8 +1,8 @@
/**
/*
* BSD-style license; for more info see http://pmd.sourceforge.net/license.html
*/
package net.sourceforge.pmd.cpd;
package net.sourceforge.pmd.lang.go.cpd;
import org.antlr.v4.runtime.CharStream;
import org.antlr.v4.runtime.Lexer;

View File

@ -1 +0,0 @@
net.sourceforge.pmd.cpd.GoLanguage

View File

@ -0,0 +1 @@
net.sourceforge.pmd.lang.go.GoLanguageModule

View File

@ -1,8 +1,8 @@
/**
/*
* BSD-style license; for more info see http://pmd.sourceforge.net/license.html
*/
package net.sourceforge.pmd.cpd;
package net.sourceforge.pmd.lang.go.cpd;
import org.junit.jupiter.api.Test;
@ -11,12 +11,7 @@ import net.sourceforge.pmd.cpd.test.CpdTextComparisonTest;
class GoTokenizerTest extends CpdTextComparisonTest {
GoTokenizerTest() {
super(".go");
}
@Override
protected String getResourcePrefix() {
return "../lang/go/cpd/testdata";
super("go", ".go");
}
@Test

View File

@ -1,18 +0,0 @@
/**
* BSD-style license; for more info see http://pmd.sourceforge.net/license.html
*/
package net.sourceforge.pmd.cpd;
/**
* Language implementation for Groovy
*/
public class GroovyLanguage extends AbstractLanguage {
/**
* Creates a new Groovy Language instance.
*/
public GroovyLanguage() {
super("Groovy", "groovy", new GroovyTokenizer(), ".groovy");
}
}

View File

@ -0,0 +1,28 @@
/*
* BSD-style license; for more info see http://pmd.sourceforge.net/license.html
*/
package net.sourceforge.pmd.lang.groovy;
import net.sourceforge.pmd.lang.groovy.cpd.GroovyTokenizer;
import net.sourceforge.pmd.cpd.Tokenizer;
import net.sourceforge.pmd.lang.CpdOnlyLanguageModuleBase;
import net.sourceforge.pmd.lang.LanguagePropertyBundle;
/**
* Language implementation for Groovy
*/
public class GroovyLanguageModule extends CpdOnlyLanguageModuleBase {
/**
* Creates a new Groovy Language instance.
*/
public GroovyLanguageModule() {
super(LanguageMetadata.withId("groovy").name("Groovy").extensions("groovy"));
}
@Override
public Tokenizer createCpdTokenizer(LanguagePropertyBundle bundle) {
return new GroovyTokenizer();
}
}

View File

@ -1,12 +1,14 @@
/**
/*
* BSD-style license; for more info see http://pmd.sourceforge.net/license.html
*/
package net.sourceforge.pmd.cpd;
package net.sourceforge.pmd.lang.groovy.cpd;
import org.codehaus.groovy.antlr.SourceInfo;
import org.codehaus.groovy.antlr.parser.GroovyLexer;
import net.sourceforge.pmd.cpd.TokenFactory;
import net.sourceforge.pmd.cpd.Tokenizer;
import net.sourceforge.pmd.lang.ast.TokenMgrError;
import net.sourceforge.pmd.lang.document.TextDocument;

View File

@ -1 +0,0 @@
net.sourceforge.pmd.cpd.GroovyLanguage

View File

@ -0,0 +1 @@
net.sourceforge.pmd.lang.groovy.GroovyLanguageModule

View File

@ -1,8 +1,8 @@
/**
/*
* BSD-style license; for more info see http://pmd.sourceforge.net/license.html
*/
package net.sourceforge.pmd.cpd;
package net.sourceforge.pmd.lang.groovy.cpd;
import org.junit.jupiter.api.Test;
@ -11,13 +11,9 @@ import net.sourceforge.pmd.cpd.test.CpdTextComparisonTest;
class GroovyTokenizerTest extends CpdTextComparisonTest {
GroovyTokenizerTest() {
super(".groovy");
super("groovy", ".groovy");
}
@Override
protected String getResourcePrefix() {
return "../lang/groovy/cpd/testdata";
}
@Test
void testSample() {

View File

@ -1,16 +0,0 @@
/*
* BSD-style license; for more info see http://pmd.sourceforge.net/license.html
*/
package net.sourceforge.pmd.lang.html;
import net.sourceforge.pmd.cpd.AbstractLanguage;
import net.sourceforge.pmd.lang.html.ast.HtmlTokenizer;
public final class HtmlCpdLanguage extends AbstractLanguage {
public HtmlCpdLanguage() {
super("HTML", "html", new HtmlTokenizer(), ".html");
}
}

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