From 5c2260bd0fe1008e5e17bc54e306570e81bdbd2d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Fournier?= Date: Thu, 21 Jul 2022 05:24:33 +0200 Subject: [PATCH] fix more modules --- .../pmd/lang/LanguageProcessorRegistry.java | 11 +++++++-- .../net/sourceforge/pmd/lang/ast/Parser.java | 1 + .../pmd/lang/rule/AbstractDelegateRule.java | 6 +++++ .../pmd/lang/html/HtmlLanguageModule.java | 5 ++++ .../pmd/lang/html/ast/HtmlTokenizer.java | 23 +++++++++++++++---- .../sourceforge/pmd/LanguageVersionTest.java | 2 +- .../java/net/sourceforge/pmd/cli/CLITest.java | 2 +- .../pmd/lang/ast/test/BaseParsingHelper.kt | 5 ++-- 8 files changed, 45 insertions(+), 10 deletions(-) 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 bbe3d634dc..089ce9dd50 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 @@ -11,7 +11,6 @@ import java.util.HashMap; import java.util.Iterator; import java.util.Locale; import java.util.Map; -import java.util.Objects; import java.util.Properties; import org.checkerframework.checker.nullness.qual.NonNull; @@ -36,7 +35,10 @@ public final class LanguageProcessorRegistry implements Iterable, Auto } public @NonNull LanguageProcessor getProcessor(Language l) { - return Objects.requireNonNull(processors.get(l)); + net.sourceforge.pmd.lang.LanguageProcessor obj = processors.get(l); + if (obj == null) + throw new IllegalStateException("Language " + l.getId() + " is not initialized in " + this); + return obj; } @Override @@ -158,6 +160,11 @@ public final class LanguageProcessorRegistry implements Iterable, Auto } + @Override + public String toString() { + return "LanguageProcessorRegistry(" + new LanguageRegistry(processors.keySet()).commaSeparatedList(Language::getId) +")"; + } + public static class LanguageTerminationException extends RuntimeException { public LanguageTerminationException(Throwable cause) { diff --git a/pmd-core/src/main/java/net/sourceforge/pmd/lang/ast/Parser.java b/pmd-core/src/main/java/net/sourceforge/pmd/lang/ast/Parser.java index 39d1cb6281..2e574b4e72 100644 --- a/pmd-core/src/main/java/net/sourceforge/pmd/lang/ast/Parser.java +++ b/pmd-core/src/main/java/net/sourceforge/pmd/lang/ast/Parser.java @@ -45,6 +45,7 @@ public interface Parser { this.textDoc = Objects.requireNonNull(textDoc, "Text document was null"); this.reporter = Objects.requireNonNull(reporter, "reporter was null"); this.lpRegistry = AssertionUtil.requireParamNotNull("lpRegistry", lpRegistry); + Objects.requireNonNull(lpRegistry.getProcessor(textDoc.getLanguageVersion().getLanguage())); } diff --git a/pmd-core/src/main/java/net/sourceforge/pmd/lang/rule/AbstractDelegateRule.java b/pmd-core/src/main/java/net/sourceforge/pmd/lang/rule/AbstractDelegateRule.java index be57a2cbc7..973da1ca34 100644 --- a/pmd-core/src/main/java/net/sourceforge/pmd/lang/rule/AbstractDelegateRule.java +++ b/pmd-core/src/main/java/net/sourceforge/pmd/lang/rule/AbstractDelegateRule.java @@ -11,6 +11,7 @@ import net.sourceforge.pmd.Rule; import net.sourceforge.pmd.RuleContext; import net.sourceforge.pmd.RulePriority; import net.sourceforge.pmd.lang.Language; +import net.sourceforge.pmd.lang.LanguageProcessor; import net.sourceforge.pmd.lang.LanguageVersion; import net.sourceforge.pmd.lang.ast.Node; import net.sourceforge.pmd.properties.MultiValuePropertyDescriptor; @@ -242,6 +243,11 @@ public abstract class AbstractDelegateRule implements Rule { rule.end(ctx); } + @Override + public void initialize(LanguageProcessor languageProcessor) { + rule.initialize(languageProcessor); + } + /** * @see Rule#hasDescriptor(PropertyDescriptor) */ diff --git a/pmd-html/src/main/java/net/sourceforge/pmd/lang/html/HtmlLanguageModule.java b/pmd-html/src/main/java/net/sourceforge/pmd/lang/html/HtmlLanguageModule.java index 0c3addea75..f242c180be 100644 --- a/pmd-html/src/main/java/net/sourceforge/pmd/lang/html/HtmlLanguageModule.java +++ b/pmd-html/src/main/java/net/sourceforge/pmd/lang/html/HtmlLanguageModule.java @@ -5,6 +5,7 @@ package net.sourceforge.pmd.lang.html; +import net.sourceforge.pmd.lang.LanguageRegistry; import net.sourceforge.pmd.lang.impl.SimpleLanguageModuleBase; public final class HtmlLanguageModule extends SimpleLanguageModuleBase { @@ -17,4 +18,8 @@ public final class HtmlLanguageModule extends SimpleLanguageModuleBase { .extensions("html", "htm", "xhtml", "xht", "shtml"), new HtmlHandler()); } + + public static HtmlLanguageModule getInstance() { + return (HtmlLanguageModule) LanguageRegistry.PMD.getLanguageById(TERSE_NAME); + } } diff --git a/pmd-html/src/main/java/net/sourceforge/pmd/lang/html/ast/HtmlTokenizer.java b/pmd-html/src/main/java/net/sourceforge/pmd/lang/html/ast/HtmlTokenizer.java index c3fc1b7be1..7efaff1b94 100644 --- a/pmd-html/src/main/java/net/sourceforge/pmd/lang/html/ast/HtmlTokenizer.java +++ b/pmd-html/src/main/java/net/sourceforge/pmd/lang/html/ast/HtmlTokenizer.java @@ -11,20 +11,33 @@ import net.sourceforge.pmd.cpd.SourceCode; import net.sourceforge.pmd.cpd.TokenEntry; import net.sourceforge.pmd.cpd.Tokenizer; import net.sourceforge.pmd.cpd.Tokens; +import net.sourceforge.pmd.lang.LanguageProcessor; +import net.sourceforge.pmd.lang.LanguageProcessorRegistry; import net.sourceforge.pmd.lang.ast.Parser.ParserTask; import net.sourceforge.pmd.lang.ast.SemanticErrorReporter; -import net.sourceforge.pmd.lang.document.CpdCompat; import net.sourceforge.pmd.lang.document.TextDocument; +import net.sourceforge.pmd.lang.document.TextFile; +import net.sourceforge.pmd.lang.html.HtmlLanguageModule; public class HtmlTokenizer implements Tokenizer { @Override public void tokenize(SourceCode sourceCode, Tokens tokenEntries) { - try (TextDocument textDoc = TextDocument.create(CpdCompat.cpdCompat(sourceCode))) { + HtmlLanguageModule html = HtmlLanguageModule.getInstance(); + TextFile tf = TextFile.forCharSeq( + sourceCode.getCodeBuffer(), + sourceCode.getFileName(), + html.getDefaultVersion() + ); + + try (LanguageProcessor processor = html.createProcessor(html.newPropertyBundle()); + TextDocument textDoc = TextDocument.create(tf)) { + ParserTask task = new ParserTask( textDoc, - SemanticErrorReporter.noop(),// fixme - lpRegistry); + SemanticErrorReporter.noop(), // fixme + LanguageProcessorRegistry.singleton(processor) + ); HtmlParser parser = new HtmlParser(); ASTHtmlDocument root = parser.parse(task); @@ -32,6 +45,8 @@ public class HtmlTokenizer implements Tokenizer { traverse(root, tokenEntries); } catch (IOException e) { throw new UncheckedIOException(e); + } catch (Exception e) { + throw new RuntimeException(e); } finally { tokenEntries.add(TokenEntry.EOF); } diff --git a/pmd-javascript/src/test/java/net/sourceforge/pmd/LanguageVersionTest.java b/pmd-javascript/src/test/java/net/sourceforge/pmd/LanguageVersionTest.java index 5786dc0e26..83a7f8e484 100644 --- a/pmd-javascript/src/test/java/net/sourceforge/pmd/LanguageVersionTest.java +++ b/pmd-javascript/src/test/java/net/sourceforge/pmd/LanguageVersionTest.java @@ -21,7 +21,7 @@ public class LanguageVersionTest extends AbstractLanguageVersionTest { @Parameters public static Collection data() { return Arrays.asList(new Object[][] { { EcmascriptLanguageModule.NAME, EcmascriptLanguageModule.TERSE_NAME, - "ES6", + "", getLanguage(EcmascriptLanguageModule.NAME).getDefaultVersion(), }, }); } } diff --git a/pmd-javascript/src/test/java/net/sourceforge/pmd/cli/CLITest.java b/pmd-javascript/src/test/java/net/sourceforge/pmd/cli/CLITest.java index d0c036549b..1ce46f59a2 100644 --- a/pmd-javascript/src/test/java/net/sourceforge/pmd/cli/CLITest.java +++ b/pmd-javascript/src/test/java/net/sourceforge/pmd/cli/CLITest.java @@ -27,6 +27,6 @@ public class CLITest extends BaseCLITest { "-l", "ecmascript", "--debug"); - assertThat(log, containsPattern("Adding file .*\\.js \\(lang: ecmascript ES6\\)")); + assertThat(log, containsPattern("Adding file .*\\.js \\(lang: ecmascript\\)")); } } 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 a77b110405..0b7ddc07ba 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 @@ -138,7 +138,7 @@ abstract class BaseParsingHelper, T : RootNode @JvmOverloads fun newProcessor(params: Params = this.params): LanguageProcessor { val props = language.newPropertyBundle().apply { - setLanguageVersion(params.defaultVerString) + setLanguageVersion(params.defaultVerString ?: defaultVersion.version) setProperty(LanguagePropertyBundle.SUPPRESS_MARKER, params.suppressMarker) } return language.createProcessor(props) @@ -225,8 +225,9 @@ abstract class BaseParsingHelper, T : RootNode rule.language = language val config = PMDConfiguration().apply { suppressMarker = params.suppressMarker - setDefaultLanguageVersion(defaultVersion) + forceLanguageVersion = defaultVersion isIgnoreIncrementalAnalysis = true + threads = 1 } return PmdAnalysis.create(config).use { pmd ->