From 9c3434a07b3fade47a3d27922902e0f6ca16271a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Fournier?= Date: Mon, 13 Feb 2023 14:53:14 +0100 Subject: [PATCH] Split cpd/pmd specific methods into... subinterfaces of Language --- .../pmd/lang/apex/ApexLanguageModule.java | 9 ++-- .../net/sourceforge/pmd/cpd/CpdAnalysis.java | 3 +- .../pmd/cpd/CpdCapableLanguage.java | 32 +++++++++++++ .../pmd/cpd/PmdCapableLanguage.java | 31 ++++++++++++ .../net/sourceforge/pmd/lang/Language.java | 47 ------------------- .../pmd/lang/LanguageProcessorRegistry.java | 7 ++- .../pmd/lang/LanguageRegistry.java | 6 ++- .../pmd/lang/PlainTextLanguage.java | 3 +- .../lang/impl/CpdOnlyLanguageModuleBase.java | 8 +--- .../lang/impl/SimpleLanguageModuleBase.java | 12 ++--- .../pmd/cpd/MatchAlgorithmTest.java | 3 +- .../pmd/lang/DummyLanguageModule.java | 3 +- .../pmd/lang/LanguageModuleBaseTest.java | 10 ++-- .../pmd/lang/java/JavaLanguageModule.java | 9 ++-- .../ecmascript/EcmascriptLanguageModule.java | 5 +- .../pmd/lang/jsp/JspLanguageModule.java | 3 +- .../pmd/cpd/test/CpdTextComparisonTest.kt | 4 +- .../pmd/lang/ast/test/BaseParsingHelper.kt | 5 +- .../pmd/lang/plsql/PLSQLLanguageModule.java | 5 +- .../pmd/lang/vf/VfLanguageModule.java | 5 +- 20 files changed, 115 insertions(+), 95 deletions(-) create mode 100644 pmd-core/src/main/java/net/sourceforge/pmd/cpd/CpdCapableLanguage.java create mode 100644 pmd-core/src/main/java/net/sourceforge/pmd/cpd/PmdCapableLanguage.java diff --git a/pmd-apex/src/main/java/net/sourceforge/pmd/lang/apex/ApexLanguageModule.java b/pmd-apex/src/main/java/net/sourceforge/pmd/lang/apex/ApexLanguageModule.java index 5ef1260d54..489fa4c194 100644 --- a/pmd-apex/src/main/java/net/sourceforge/pmd/lang/apex/ApexLanguageModule.java +++ b/pmd-apex/src/main/java/net/sourceforge/pmd/lang/apex/ApexLanguageModule.java @@ -4,8 +4,9 @@ package net.sourceforge.pmd.lang.apex; +import net.sourceforge.pmd.cpd.CpdCapableLanguage; +import net.sourceforge.pmd.cpd.PmdCapableLanguage; import net.sourceforge.pmd.cpd.Tokenizer; -import net.sourceforge.pmd.lang.Language; import net.sourceforge.pmd.lang.LanguageModuleBase; import net.sourceforge.pmd.lang.LanguageProcessor; import net.sourceforge.pmd.lang.LanguagePropertyBundle; @@ -14,7 +15,7 @@ import net.sourceforge.pmd.lang.apex.cpd.ApexTokenizer; import apex.jorje.services.Version; -public class ApexLanguageModule extends LanguageModuleBase { +public class ApexLanguageModule extends LanguageModuleBase implements PmdCapableLanguage, CpdCapableLanguage { public static final String NAME = "Apex"; public static final String TERSE_NAME = "apex"; @@ -39,7 +40,7 @@ public class ApexLanguageModule extends LanguageModuleBase { return new ApexTokenizer((ApexLanguageProperties) bundle); } - public static Language getInstance() { - return LanguageRegistry.PMD.getLanguageByFullName(NAME); + public static ApexLanguageModule getInstance() { + return (ApexLanguageModule) LanguageRegistry.PMD.getLanguageById(TERSE_NAME); } } diff --git a/pmd-core/src/main/java/net/sourceforge/pmd/cpd/CpdAnalysis.java b/pmd-core/src/main/java/net/sourceforge/pmd/cpd/CpdAnalysis.java index 0d8da039f6..2e4e5911a0 100644 --- a/pmd-core/src/main/java/net/sourceforge/pmd/cpd/CpdAnalysis.java +++ b/pmd-core/src/main/java/net/sourceforge/pmd/cpd/CpdAnalysis.java @@ -136,7 +136,8 @@ public final class CpdAnalysis implements AutoCloseable { sourceManager.getTextFiles().stream() .map(it -> it.getLanguageVersion().getLanguage()) .distinct() - .collect(Collectors.toMap(lang -> lang, lang -> lang.createCpdTokenizer(configuration.getLanguageProperties(lang)))); + .filter(it -> it instanceof CpdCapableLanguage) + .collect(Collectors.toMap(lang -> lang, lang -> ((CpdCapableLanguage) lang).createCpdTokenizer(configuration.getLanguageProperties(lang)))); Map numberOfTokensPerFile = new HashMap<>(); diff --git a/pmd-core/src/main/java/net/sourceforge/pmd/cpd/CpdCapableLanguage.java b/pmd-core/src/main/java/net/sourceforge/pmd/cpd/CpdCapableLanguage.java new file mode 100644 index 0000000000..45c54f7494 --- /dev/null +++ b/pmd-core/src/main/java/net/sourceforge/pmd/cpd/CpdCapableLanguage.java @@ -0,0 +1,32 @@ +/* + * BSD-style license; for more info see http://pmd.sourceforge.net/license.html + */ + +package net.sourceforge.pmd.cpd; + +import net.sourceforge.pmd.lang.Language; +import net.sourceforge.pmd.lang.LanguagePropertyBundle; + +/** + * A language that also supports {@link CpdAnalysis CPD}. + * + * @author Clément Fournier + */ +public interface CpdCapableLanguage extends Language { + + + /** + * Create a new {@link Tokenizer} for this language, given + * a property bundle with configuration. The bundle was created by + * this instance using {@link #newPropertyBundle()}. It can be assumed + * that the bundle will never be mutated anymore, and this method + * takes ownership of it. + * + * @param bundle A bundle of properties created by this instance. + * + * @return A new language processor + */ + default Tokenizer createCpdTokenizer(LanguagePropertyBundle bundle) { + return new AnyTokenizer(); + } +} diff --git a/pmd-core/src/main/java/net/sourceforge/pmd/cpd/PmdCapableLanguage.java b/pmd-core/src/main/java/net/sourceforge/pmd/cpd/PmdCapableLanguage.java new file mode 100644 index 0000000000..06e50ea658 --- /dev/null +++ b/pmd-core/src/main/java/net/sourceforge/pmd/cpd/PmdCapableLanguage.java @@ -0,0 +1,31 @@ +/* + * BSD-style license; for more info see http://pmd.sourceforge.net/license.html + */ + +package net.sourceforge.pmd.cpd; + +import net.sourceforge.pmd.lang.Language; +import net.sourceforge.pmd.lang.LanguageProcessor; +import net.sourceforge.pmd.lang.LanguagePropertyBundle; + +/** + * A language that also supports {@link CpdAnalysis CPD}. + * + * @author Clément Fournier + */ +public interface PmdCapableLanguage extends Language { + + /** + * Create a new {@link LanguageProcessor} for this language, given + * a property bundle with configuration. The bundle was created by + * this instance using {@link #newPropertyBundle()}. It can be assumed + * that the bundle will never be mutated anymore, and this method + * takes ownership of it. + * + * @param bundle A bundle of properties created by this instance. + * + * @return A new language processor + */ + LanguageProcessor createProcessor(LanguagePropertyBundle bundle); + +} diff --git a/pmd-core/src/main/java/net/sourceforge/pmd/lang/Language.java b/pmd-core/src/main/java/net/sourceforge/pmd/lang/Language.java index 53e865c7d6..ad31b2afb3 100644 --- a/pmd-core/src/main/java/net/sourceforge/pmd/lang/Language.java +++ b/pmd-core/src/main/java/net/sourceforge/pmd/lang/Language.java @@ -8,9 +8,6 @@ import java.util.List; import java.util.ServiceLoader; import java.util.Set; -import net.sourceforge.pmd.cpd.AnyTokenizer; -import net.sourceforge.pmd.cpd.Tokenizer; - /** * Represents a language module, and provides access to language-specific * functionality. You can get a language instance from a {@link LanguageRegistry}. @@ -159,50 +156,6 @@ public interface Language extends Comparable { return new LanguagePropertyBundle(this); } - /** - * Return true if this language supports parsing files into an AST. - * In that case {@link #createProcessor(LanguagePropertyBundle)} should - * also be implemented. - */ - default boolean supportsParsing() { - return false; - } - - /** - * Create a new {@link LanguageProcessor} for this language, given - * a property bundle with configuration. The bundle was created by - * this instance using {@link #newPropertyBundle()}. It can be assumed - * that the bundle will never be mutated anymore, and this method - * takes ownership of it. - * - * @param bundle A bundle of properties created by this instance. - * - * @return A new language processor - * - * @throws UnsupportedOperationException if this language does not support PMD - */ - default LanguageProcessor createProcessor(LanguagePropertyBundle bundle) { - throw new UnsupportedOperationException(this + " does not support running a PMD analysis."); - } - - - /** - * Create a new {@link Tokenizer} for this language, given - * a property bundle with configuration. The bundle was created by - * this instance using {@link #newPropertyBundle()}. It can be assumed - * that the bundle will never be mutated anymore, and this method - * takes ownership of it. - * - * @param bundle A bundle of properties created by this instance. - * - * @return A new language processor - * - * @throws UnsupportedOperationException if this language does not support CPD - */ - default Tokenizer createCpdTokenizer(LanguagePropertyBundle bundle) { - return new AnyTokenizer(); - } - /** * Returns a set of the IDs of languages that this language instance diff --git a/pmd-core/src/main/java/net/sourceforge/pmd/lang/LanguageProcessorRegistry.java b/pmd-core/src/main/java/net/sourceforge/pmd/lang/LanguageProcessorRegistry.java index 506ca11d2f..69e8b9e89a 100644 --- a/pmd-core/src/main/java/net/sourceforge/pmd/lang/LanguageProcessorRegistry.java +++ b/pmd-core/src/main/java/net/sourceforge/pmd/lang/LanguageProcessorRegistry.java @@ -18,6 +18,7 @@ import org.checkerframework.checker.nullness.qual.NonNull; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import net.sourceforge.pmd.cpd.PmdCapableLanguage; import net.sourceforge.pmd.internal.util.IOUtil; import net.sourceforge.pmd.properties.PropertyDescriptor; import net.sourceforge.pmd.properties.PropertySource; @@ -119,6 +120,10 @@ public final class LanguageProcessorRegistry implements AutoCloseable { MessageReporter messageReporter) { Set processors = new HashSet<>(); for (Language language : registry) { + if (!(language instanceof PmdCapableLanguage)) { + LOG.trace("Not instantiating language {} because it does not support PMD", language); + continue; + } LanguagePropertyBundle properties = languageProperties.getOrDefault(language, language.newPropertyBundle()); if (!properties.getLanguage().equals(language)) { throw new IllegalArgumentException("Mismatched language"); @@ -128,7 +133,7 @@ public final class LanguageProcessorRegistry implements AutoCloseable { // readLanguagePropertiesFromEnv(properties, messageReporter); - processors.add(language.createProcessor(properties)); + processors.add(((PmdCapableLanguage) language).createProcessor(properties)); } catch (IllegalArgumentException e) { messageReporter.error(e); // todo } diff --git a/pmd-core/src/main/java/net/sourceforge/pmd/lang/LanguageRegistry.java b/pmd-core/src/main/java/net/sourceforge/pmd/lang/LanguageRegistry.java index 205be5bf14..5853a4f745 100644 --- a/pmd-core/src/main/java/net/sourceforge/pmd/lang/LanguageRegistry.java +++ b/pmd-core/src/main/java/net/sourceforge/pmd/lang/LanguageRegistry.java @@ -25,6 +25,8 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import net.sourceforge.pmd.annotation.DeprecatedUntil700; +import net.sourceforge.pmd.cpd.CpdCapableLanguage; +import net.sourceforge.pmd.cpd.PmdCapableLanguage; import net.sourceforge.pmd.util.CollectionUtil; /** @@ -44,13 +46,13 @@ public final class LanguageRegistry implements Iterable { * Contains the languages that support PMD and are found on the classpath * of the classloader of this class. This can be used as a "default" registry. */ - public static final LanguageRegistry PMD = ALL_LANGUAGES.filter(Language::supportsParsing); + public static final LanguageRegistry PMD = ALL_LANGUAGES.filter(it -> it instanceof PmdCapableLanguage); /** * Contains the languages that support CPD and are found on the classpath * of the classloader of this class. */ - public static final LanguageRegistry CPD = ALL_LANGUAGES; + public static final LanguageRegistry CPD = ALL_LANGUAGES.filter(it -> it instanceof CpdCapableLanguage); private final Set languages; diff --git a/pmd-core/src/main/java/net/sourceforge/pmd/lang/PlainTextLanguage.java b/pmd-core/src/main/java/net/sourceforge/pmd/lang/PlainTextLanguage.java index 07945c453a..4df7968745 100644 --- a/pmd-core/src/main/java/net/sourceforge/pmd/lang/PlainTextLanguage.java +++ b/pmd-core/src/main/java/net/sourceforge/pmd/lang/PlainTextLanguage.java @@ -6,6 +6,7 @@ package net.sourceforge.pmd.lang; import net.sourceforge.pmd.annotation.Experimental; import net.sourceforge.pmd.cpd.AnyTokenizer; +import net.sourceforge.pmd.cpd.CpdCapableLanguage; import net.sourceforge.pmd.cpd.Tokenizer; import net.sourceforge.pmd.lang.ast.AstInfo; import net.sourceforge.pmd.lang.ast.Parser; @@ -26,7 +27,7 @@ import net.sourceforge.pmd.lang.impl.SimpleLanguageModuleBase; * @since 6.48.0 */ @Experimental -public final class PlainTextLanguage extends SimpleLanguageModuleBase { +public final class PlainTextLanguage extends SimpleLanguageModuleBase implements CpdCapableLanguage { private static final Language INSTANCE = new PlainTextLanguage(); diff --git a/pmd-core/src/main/java/net/sourceforge/pmd/lang/impl/CpdOnlyLanguageModuleBase.java b/pmd-core/src/main/java/net/sourceforge/pmd/lang/impl/CpdOnlyLanguageModuleBase.java index f67f7e7dec..b66848e2ed 100644 --- a/pmd-core/src/main/java/net/sourceforge/pmd/lang/impl/CpdOnlyLanguageModuleBase.java +++ b/pmd-core/src/main/java/net/sourceforge/pmd/lang/impl/CpdOnlyLanguageModuleBase.java @@ -4,6 +4,7 @@ package net.sourceforge.pmd.lang.impl; +import net.sourceforge.pmd.cpd.CpdCapableLanguage; import net.sourceforge.pmd.cpd.Tokenizer; import net.sourceforge.pmd.lang.LanguageModuleBase; import net.sourceforge.pmd.lang.LanguagePropertyBundle; @@ -13,7 +14,7 @@ import net.sourceforge.pmd.lang.LanguagePropertyBundle; * * @author Clément Fournier */ -public abstract class CpdOnlyLanguageModuleBase extends LanguageModuleBase { +public abstract class CpdOnlyLanguageModuleBase extends LanguageModuleBase implements CpdCapableLanguage { /** * Construct a module instance using the given metadata. The metadata must @@ -25,11 +26,6 @@ public abstract class CpdOnlyLanguageModuleBase extends LanguageModuleBase { super(metadata); } - @Override - public boolean supportsParsing() { - return false; - } - @Override public abstract Tokenizer createCpdTokenizer(LanguagePropertyBundle bundle); } diff --git a/pmd-core/src/main/java/net/sourceforge/pmd/lang/impl/SimpleLanguageModuleBase.java b/pmd-core/src/main/java/net/sourceforge/pmd/lang/impl/SimpleLanguageModuleBase.java index 23cf5ee7b1..ebce185f6a 100644 --- a/pmd-core/src/main/java/net/sourceforge/pmd/lang/impl/SimpleLanguageModuleBase.java +++ b/pmd-core/src/main/java/net/sourceforge/pmd/lang/impl/SimpleLanguageModuleBase.java @@ -8,6 +8,8 @@ import java.util.function.Function; import org.checkerframework.checker.nullness.qual.NonNull; +import net.sourceforge.pmd.cpd.CpdCapableLanguage; +import net.sourceforge.pmd.cpd.PmdCapableLanguage; import net.sourceforge.pmd.lang.LanguageModuleBase; import net.sourceforge.pmd.lang.LanguageProcessor; import net.sourceforge.pmd.lang.LanguagePropertyBundle; @@ -15,12 +17,13 @@ import net.sourceforge.pmd.lang.LanguageVersionHandler; /** * The simplest implementation of a language, where only a {@link LanguageVersionHandler} - * needs to be implemented. + * needs to be implemented. A default {@link CpdCapableLanguage} implementation + * is provided. * * @author Clément Fournier * @since 7.0.0 */ -public abstract class SimpleLanguageModuleBase extends LanguageModuleBase { +public class SimpleLanguageModuleBase extends LanguageModuleBase implements PmdCapableLanguage, CpdCapableLanguage { private final Function handler; @@ -33,11 +36,6 @@ public abstract class SimpleLanguageModuleBase extends LanguageModuleBase { this.handler = makeHandler; } - @Override - public boolean supportsParsing() { - return true; - } - @Override public LanguageProcessor createProcessor(LanguagePropertyBundle bundle) { LanguageVersionHandler services = handler.apply(bundle); diff --git a/pmd-core/src/test/java/net/sourceforge/pmd/cpd/MatchAlgorithmTest.java b/pmd-core/src/test/java/net/sourceforge/pmd/cpd/MatchAlgorithmTest.java index 03f4061255..6fb50927d6 100644 --- a/pmd-core/src/test/java/net/sourceforge/pmd/cpd/MatchAlgorithmTest.java +++ b/pmd-core/src/test/java/net/sourceforge/pmd/cpd/MatchAlgorithmTest.java @@ -14,7 +14,6 @@ import java.util.Iterator; import org.junit.jupiter.api.Test; import net.sourceforge.pmd.lang.DummyLanguageModule; -import net.sourceforge.pmd.lang.Language; import net.sourceforge.pmd.lang.document.TextDocument; import net.sourceforge.pmd.lang.document.TextFile; @@ -36,7 +35,7 @@ class MatchAlgorithmTest { @Test void testSimple() throws IOException { - Language dummy = DummyLanguageModule.getInstance(); + DummyLanguageModule dummy = DummyLanguageModule.getInstance(); Tokenizer tokenizer = dummy.createCpdTokenizer(dummy.newPropertyBundle()); String fileName = "Foo.dummy"; TextFile textFile = TextFile.forCharSeq(getSampleCode(), fileName, dummy.getDefaultVersion()); diff --git a/pmd-core/src/test/java/net/sourceforge/pmd/lang/DummyLanguageModule.java b/pmd-core/src/test/java/net/sourceforge/pmd/lang/DummyLanguageModule.java index b36c86e36e..749124c65a 100644 --- a/pmd-core/src/test/java/net/sourceforge/pmd/lang/DummyLanguageModule.java +++ b/pmd-core/src/test/java/net/sourceforge/pmd/lang/DummyLanguageModule.java @@ -7,6 +7,7 @@ package net.sourceforge.pmd.lang; import java.util.Objects; import net.sourceforge.pmd.RuleViolation; +import net.sourceforge.pmd.cpd.CpdCapableLanguage; import net.sourceforge.pmd.cpd.Tokenizer; import net.sourceforge.pmd.lang.ast.DummyNode; import net.sourceforge.pmd.lang.ast.DummyNode.DummyRootNode; @@ -22,7 +23,7 @@ import net.sourceforge.pmd.reporting.ViolationDecorator; /** * Dummy language used for testing PMD. */ -public class DummyLanguageModule extends SimpleLanguageModuleBase { +public class DummyLanguageModule extends SimpleLanguageModuleBase implements CpdCapableLanguage { public static final String NAME = "Dummy"; public static final String TERSE_NAME = "dummy"; diff --git a/pmd-core/src/test/java/net/sourceforge/pmd/lang/LanguageModuleBaseTest.java b/pmd-core/src/test/java/net/sourceforge/pmd/lang/LanguageModuleBaseTest.java index 64fae5a9c8..f14c208f69 100644 --- a/pmd-core/src/test/java/net/sourceforge/pmd/lang/LanguageModuleBaseTest.java +++ b/pmd-core/src/test/java/net/sourceforge/pmd/lang/LanguageModuleBaseTest.java @@ -13,6 +13,7 @@ import static org.junit.jupiter.api.Assertions.assertThrows; import org.junit.jupiter.api.Test; import net.sourceforge.pmd.lang.LanguageModuleBase.LanguageMetadata; +import net.sourceforge.pmd.lang.impl.SimpleLanguageModuleBase; /** * @author Clément Fournier @@ -57,12 +58,9 @@ class LanguageModuleBaseTest { } private static LanguageModuleBase makeLanguage(LanguageMetadata meta) { - return new LanguageModuleBase(meta) { - @Override - public LanguageProcessor createProcessor(LanguagePropertyBundle bundle) { - throw new UnsupportedOperationException("fake instance"); - } - }; + return new SimpleLanguageModuleBase(meta, p -> { + throw new UnsupportedOperationException("fake instance"); + }); } diff --git a/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/JavaLanguageModule.java b/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/JavaLanguageModule.java index 522331adec..1347ace2bf 100644 --- a/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/JavaLanguageModule.java +++ b/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/JavaLanguageModule.java @@ -4,8 +4,9 @@ package net.sourceforge.pmd.lang.java; +import net.sourceforge.pmd.cpd.CpdCapableLanguage; +import net.sourceforge.pmd.cpd.PmdCapableLanguage; import net.sourceforge.pmd.cpd.Tokenizer; -import net.sourceforge.pmd.lang.Language; import net.sourceforge.pmd.lang.LanguageModuleBase; import net.sourceforge.pmd.lang.LanguageProcessor; import net.sourceforge.pmd.lang.LanguagePropertyBundle; @@ -17,7 +18,7 @@ import net.sourceforge.pmd.lang.java.internal.JavaLanguageProperties; /** * Created by christoferdutz on 20.09.14. */ -public class JavaLanguageModule extends LanguageModuleBase { +public class JavaLanguageModule extends LanguageModuleBase implements PmdCapableLanguage, CpdCapableLanguage { public static final String NAME = "Java"; public static final String TERSE_NAME = "java"; @@ -61,7 +62,7 @@ public class JavaLanguageModule extends LanguageModuleBase { return new JavaTokenizer((JavaLanguageProperties) bundle); } - public static Language getInstance() { - return LanguageRegistry.PMD.getLanguageByFullName(NAME); + public static JavaLanguageModule getInstance() { + return (JavaLanguageModule) LanguageRegistry.PMD.getLanguageByFullName(NAME); } } diff --git a/pmd-javascript/src/main/java/net/sourceforge/pmd/lang/ecmascript/EcmascriptLanguageModule.java b/pmd-javascript/src/main/java/net/sourceforge/pmd/lang/ecmascript/EcmascriptLanguageModule.java index fe3c46da3f..508ef6629a 100644 --- a/pmd-javascript/src/main/java/net/sourceforge/pmd/lang/ecmascript/EcmascriptLanguageModule.java +++ b/pmd-javascript/src/main/java/net/sourceforge/pmd/lang/ecmascript/EcmascriptLanguageModule.java @@ -5,7 +5,6 @@ package net.sourceforge.pmd.lang.ecmascript; import net.sourceforge.pmd.cpd.Tokenizer; -import net.sourceforge.pmd.lang.Language; import net.sourceforge.pmd.lang.LanguagePropertyBundle; import net.sourceforge.pmd.lang.LanguageRegistry; import net.sourceforge.pmd.lang.ecmascript.ast.EcmascriptParser; @@ -26,8 +25,8 @@ public class EcmascriptLanguageModule extends SimpleLanguageModuleBase { properties -> () -> new EcmascriptParser(properties)); } - public static Language getInstance() { - return LanguageRegistry.PMD.getLanguageByFullName(NAME); + public static EcmascriptLanguageModule getInstance() { + return (EcmascriptLanguageModule) LanguageRegistry.PMD.getLanguageByFullName(NAME); } @Override diff --git a/pmd-jsp/src/main/java/net/sourceforge/pmd/lang/jsp/JspLanguageModule.java b/pmd-jsp/src/main/java/net/sourceforge/pmd/lang/jsp/JspLanguageModule.java index 89a68e336d..1fd9b0ca88 100644 --- a/pmd-jsp/src/main/java/net/sourceforge/pmd/lang/jsp/JspLanguageModule.java +++ b/pmd-jsp/src/main/java/net/sourceforge/pmd/lang/jsp/JspLanguageModule.java @@ -4,6 +4,7 @@ package net.sourceforge.pmd.lang.jsp; +import net.sourceforge.pmd.cpd.CpdCapableLanguage; import net.sourceforge.pmd.cpd.Tokenizer; import net.sourceforge.pmd.lang.LanguagePropertyBundle; import net.sourceforge.pmd.lang.impl.SimpleLanguageModuleBase; @@ -12,7 +13,7 @@ import net.sourceforge.pmd.lang.jsp.cpd.JSPTokenizer; /** * Created by christoferdutz on 20.09.14. */ -public class JspLanguageModule extends SimpleLanguageModuleBase { +public class JspLanguageModule extends SimpleLanguageModuleBase implements CpdCapableLanguage { public static final String NAME = "Java Server Pages"; public static final String TERSE_NAME = "jsp"; diff --git a/pmd-lang-test/src/main/kotlin/net/sourceforge/pmd/cpd/test/CpdTextComparisonTest.kt b/pmd-lang-test/src/main/kotlin/net/sourceforge/pmd/cpd/test/CpdTextComparisonTest.kt index 6458cbcf52..73f69075cd 100644 --- a/pmd-lang-test/src/main/kotlin/net/sourceforge/pmd/cpd/test/CpdTextComparisonTest.kt +++ b/pmd-lang-test/src/main/kotlin/net/sourceforge/pmd/cpd/test/CpdTextComparisonTest.kt @@ -24,12 +24,12 @@ import java.util.* * Baseline files are saved in txt files. */ abstract class CpdTextComparisonTest( - val language: Language, + val language: CpdCapableLanguage, override val extensionIncludingDot: String ) : BaseTextComparisonTest() { constructor(langId: String, extensionIncludingDot: String) : this( - LanguageRegistry.CPD.getLanguageById(langId)!!, + LanguageRegistry.CPD.getLanguageById(langId) as CpdCapableLanguage, extensionIncludingDot ) diff --git a/pmd-lang-test/src/main/kotlin/net/sourceforge/pmd/lang/ast/test/BaseParsingHelper.kt b/pmd-lang-test/src/main/kotlin/net/sourceforge/pmd/lang/ast/test/BaseParsingHelper.kt index 06647a855d..d38cc1bb1a 100644 --- a/pmd-lang-test/src/main/kotlin/net/sourceforge/pmd/lang/ast/test/BaseParsingHelper.kt +++ b/pmd-lang-test/src/main/kotlin/net/sourceforge/pmd/lang/ast/test/BaseParsingHelper.kt @@ -4,6 +4,7 @@ package net.sourceforge.pmd.lang.ast.test import net.sourceforge.pmd.* +import net.sourceforge.pmd.cpd.PmdCapableLanguage import net.sourceforge.pmd.internal.util.IOUtil import net.sourceforge.pmd.lang.* import net.sourceforge.pmd.lang.ast.Node @@ -64,9 +65,9 @@ abstract class BaseParsingHelper, T : RootNode ?: throw AssertionError("Unsupported version $version for language $language") } - val language: Language + val language: PmdCapableLanguage get() = - params.languageRegistry.getLanguageByFullName(langName) + params.languageRegistry.getLanguageByFullName(langName) as? PmdCapableLanguage? ?: run { val langNames = params.languageRegistry.commaSeparatedList { it.name } throw AssertionError("'$langName' is not a supported language (available $langNames)") diff --git a/pmd-plsql/src/main/java/net/sourceforge/pmd/lang/plsql/PLSQLLanguageModule.java b/pmd-plsql/src/main/java/net/sourceforge/pmd/lang/plsql/PLSQLLanguageModule.java index 66bfdf0f32..1fcf3d2555 100644 --- a/pmd-plsql/src/main/java/net/sourceforge/pmd/lang/plsql/PLSQLLanguageModule.java +++ b/pmd-plsql/src/main/java/net/sourceforge/pmd/lang/plsql/PLSQLLanguageModule.java @@ -6,7 +6,6 @@ package net.sourceforge.pmd.lang.plsql; import net.sourceforge.pmd.cpd.PLSQLTokenizer; import net.sourceforge.pmd.cpd.Tokenizer; -import net.sourceforge.pmd.lang.Language; import net.sourceforge.pmd.lang.LanguagePropertyBundle; import net.sourceforge.pmd.lang.LanguageRegistry; import net.sourceforge.pmd.lang.impl.SimpleLanguageModuleBase; @@ -50,7 +49,7 @@ public class PLSQLLanguageModule extends SimpleLanguageModuleBase { return new PLSQLTokenizer(bundle); } - public static Language getInstance() { - return LanguageRegistry.PMD.getLanguageById("plsql"); + public static PLSQLLanguageModule getInstance() { + return (PLSQLLanguageModule) LanguageRegistry.PMD.getLanguageById("plsql"); } } diff --git a/pmd-visualforce/src/main/java/net/sourceforge/pmd/lang/vf/VfLanguageModule.java b/pmd-visualforce/src/main/java/net/sourceforge/pmd/lang/vf/VfLanguageModule.java index cba2e8c13d..72d0ff6e1e 100644 --- a/pmd-visualforce/src/main/java/net/sourceforge/pmd/lang/vf/VfLanguageModule.java +++ b/pmd-visualforce/src/main/java/net/sourceforge/pmd/lang/vf/VfLanguageModule.java @@ -4,19 +4,20 @@ package net.sourceforge.pmd.lang.vf; +import net.sourceforge.pmd.cpd.CpdCapableLanguage; import net.sourceforge.pmd.cpd.Tokenizer; -import net.sourceforge.pmd.lang.vf.cpd.VfTokenizer; import net.sourceforge.pmd.lang.Language; import net.sourceforge.pmd.lang.LanguagePropertyBundle; import net.sourceforge.pmd.lang.LanguageRegistry; import net.sourceforge.pmd.lang.apex.ApexLanguageModule; import net.sourceforge.pmd.lang.impl.SimpleLanguageModuleBase; +import net.sourceforge.pmd.lang.vf.cpd.VfTokenizer; /** * @author sergey.gorbaty */ -public class VfLanguageModule extends SimpleLanguageModuleBase { +public class VfLanguageModule extends SimpleLanguageModuleBase implements CpdCapableLanguage { public static final String NAME = "Salesforce VisualForce"; public static final String TERSE_NAME = "vf";