diff --git a/pmd-core/src/main/java/net/sourceforge/pmd/PmdAnalysis.java b/pmd-core/src/main/java/net/sourceforge/pmd/PmdAnalysis.java index c923617925..22d6ffe30f 100644 --- a/pmd-core/src/main/java/net/sourceforge/pmd/PmdAnalysis.java +++ b/pmd-core/src/main/java/net/sourceforge/pmd/PmdAnalysis.java @@ -362,7 +362,7 @@ public final class PmdAnalysis implements AutoCloseable { List analyses = new ArrayList<>(); try { - for (Language lang : lpRegistry) { + for (Language lang : lpRegistry.getLanguages()) { analyses.add(lpRegistry.getProcessor(lang).launchAnalysis(analysisTask)); } } finally { diff --git a/pmd-core/src/test/java/net/sourceforge/pmd/processor/PmdRunnableTest.java b/pmd-core/src/test/java/net/sourceforge/pmd/processor/PmdRunnableTest.java index 62f2b7adf4..7cc999eabc 100644 --- a/pmd-core/src/test/java/net/sourceforge/pmd/processor/PmdRunnableTest.java +++ b/pmd-core/src/test/java/net/sourceforge/pmd/processor/PmdRunnableTest.java @@ -35,7 +35,6 @@ import net.sourceforge.pmd.internal.SystemProps; import net.sourceforge.pmd.internal.util.AssertionUtil; import net.sourceforge.pmd.internal.util.ContextedAssertionError; import net.sourceforge.pmd.lang.DummyLanguageModule; -import net.sourceforge.pmd.lang.LanguagePropertyBundle; import net.sourceforge.pmd.lang.LanguageRegistry; import net.sourceforge.pmd.lang.LanguageVersion; import net.sourceforge.pmd.lang.ast.Node; @@ -167,31 +166,29 @@ public class PmdRunnableTest { .addVersion(THROWS_SEMANTIC_ERROR) .addVersion(PARSER_REPORTS_SEMANTIC_ERROR) .addDefaultVersion(""), - props -> () -> makeParser(props)); + ThrowingLanguageModule::makeParser); } - private static Parser makeParser(LanguagePropertyBundle bundle) { - switch (bundle.getLanguageVersion().getVersion()) { - case THROWS_ASSERTION_ERROR: - return task -> { + private static Parser makeParser() { + return task -> { + switch (task.getLanguageVersion().getVersion()) { + case THROWS_ASSERTION_ERROR: throw new AssertionError("test error while parsing"); - }; - case PARSER_REPORTS_SEMANTIC_ERROR: - return task -> { + case PARSER_REPORTS_SEMANTIC_ERROR: { RootNode root = DummyLanguageModule.readLispNode(task); task.getReporter().error(root, TEST_MESSAGE_SEMANTIC_ERROR); return root; - }; - case THROWS_SEMANTIC_ERROR: - return task -> { + } + case THROWS_SEMANTIC_ERROR: { RootNode root = DummyLanguageModule.readLispNode(task); throw task.getReporter().error(root, TEST_MESSAGE_SEMANTIC_ERROR); - }; - case "": - return DummyLanguageModule::readLispNode; - default: - throw AssertionUtil.shouldNotReachHere(""); - } + } + case "": + return DummyLanguageModule.readLispNode(task); + default: + throw AssertionUtil.shouldNotReachHere(""); + } + }; } } 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 7efaff1b94..e7fad1cbe9 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 @@ -24,18 +24,18 @@ public class HtmlTokenizer implements Tokenizer { @Override public void tokenize(SourceCode sourceCode, Tokens tokenEntries) { HtmlLanguageModule html = HtmlLanguageModule.getInstance(); - TextFile tf = TextFile.forCharSeq( - sourceCode.getCodeBuffer(), - sourceCode.getFileName(), - html.getDefaultVersion() - ); try (LanguageProcessor processor = html.createProcessor(html.newPropertyBundle()); + TextFile tf = TextFile.forCharSeq( + sourceCode.getCodeBuffer(), + sourceCode.getFileName(), + html.getDefaultVersion() + ); TextDocument textDoc = TextDocument.create(tf)) { ParserTask task = new ParserTask( textDoc, - SemanticErrorReporter.noop(), // fixme + SemanticErrorReporter.noop(), LanguageProcessorRegistry.singleton(processor) ); diff --git a/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/ast/JavaParser.java b/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/ast/JavaParser.java index 9005056eaa..298279c679 100644 --- a/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/ast/JavaParser.java +++ b/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/ast/JavaParser.java @@ -4,6 +4,7 @@ package net.sourceforge.pmd.lang.java.ast; +import net.sourceforge.pmd.lang.LanguageVersion; import net.sourceforge.pmd.lang.ast.AstInfo; import net.sourceforge.pmd.lang.ast.CharStream; import net.sourceforge.pmd.lang.ast.ParseException; @@ -12,8 +13,10 @@ import net.sourceforge.pmd.lang.ast.impl.javacc.JavaccTokenDocument; import net.sourceforge.pmd.lang.ast.impl.javacc.JjtreeParserAdapter; import net.sourceforge.pmd.lang.document.TextDocument; import net.sourceforge.pmd.lang.java.ast.internal.LanguageLevelChecker; +import net.sourceforge.pmd.lang.java.ast.internal.ReportingStrategy; import net.sourceforge.pmd.lang.java.internal.JavaAstProcessor; import net.sourceforge.pmd.lang.java.internal.JavaLanguageProcessor; +import net.sourceforge.pmd.lang.java.internal.JavaLanguageProperties; /** * Adapter for the JavaParser, using the specified grammar version. @@ -23,16 +26,13 @@ import net.sourceforge.pmd.lang.java.internal.JavaLanguageProcessor; */ public class JavaParser extends JjtreeParserAdapter { - private final LanguageLevelChecker checker; private final String suppressMarker; private final JavaLanguageProcessor javaProcessor; private final boolean postProcess; - public JavaParser(LanguageLevelChecker checker, - String suppressMarker, + public JavaParser(String suppressMarker, JavaLanguageProcessor javaProcessor, boolean postProcess) { - this.checker = checker; this.suppressMarker = suppressMarker; this.javaProcessor = javaProcessor; this.postProcess = postProcess; @@ -51,18 +51,29 @@ public class JavaParser extends JjtreeParserAdapter { @Override protected ASTCompilationUnit parseImpl(CharStream cs, ParserTask task) throws ParseException { + + LanguageVersion version = task.getLanguageVersion(); + int jdkVersion = JavaLanguageProperties.getInternalJdkVersion(version); + boolean preview = JavaLanguageProperties.isPreviewEnabled(version); + JavaParserImpl parser = new JavaParserImpl(cs); parser.setSuppressMarker(suppressMarker); - parser.setJdkVersion(checker.getJdkVersion()); - parser.setPreview(checker.isPreviewEnabled()); + parser.setJdkVersion(jdkVersion); + parser.setPreview(preview); ASTCompilationUnit root = parser.CompilationUnit(); root.setAstInfo(new AstInfo<>(task, root, parser.getSuppressMap())); - checker.check(root); + + LanguageLevelChecker levelChecker = + new LanguageLevelChecker<>(jdkVersion, + preview, + // TODO change this strategy with a new lang property + ReportingStrategy.reporterThatThrows()); + + levelChecker.check(root); if (postProcess) { - JavaAstProcessor processor = JavaAstProcessor.create(javaProcessor, task.getReporter()); - processor.process(root); + JavaAstProcessor.process(javaProcessor, task.getReporter(), javaProcessor.newTypeInfLogger(), root); } return root; diff --git a/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/internal/JavaAstProcessor.java b/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/internal/JavaAstProcessor.java index 21d1d71b76..81269df8de 100644 --- a/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/internal/JavaAstProcessor.java +++ b/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/internal/JavaAstProcessor.java @@ -44,17 +44,20 @@ public final class JavaAstProcessor { private SymbolResolver symResolver; private final UnresolvedClassStore unresolvedTypes; + private final ASTCompilationUnit acu; private JavaAstProcessor(JavaLanguageProcessor globalProc, SemanticErrorReporter logger, - TypeInferenceLogger typeInfLogger) { + TypeInferenceLogger typeInfLogger, + ASTCompilationUnit acu) { this.symResolver = globalProc.getTypeSystem().bootstrapResolver(); this.globalProc = globalProc; this.logger = logger; this.typeInferenceLogger = typeInfLogger; this.unresolvedTypes = new UnresolvedClassStore(globalProc.getTypeSystem()); + this.acu = acu; } public UnresolvedClassStore getUnresolvedStore() { @@ -109,13 +112,13 @@ public final class JavaAstProcessor { } public int getJdkVersion() { - return globalProc.getProperties().getInternalJdkVersion(); + return JavaLanguageProperties.getInternalJdkVersion(acu.getLanguageVersion()); } /** * Performs semantic analysis on the given source file. */ - public void process(ASTCompilationUnit acu) { + public void process() { SymbolResolver knownSyms = TimeTracker.bench("1. Symbol resolution", () -> SymbolResolutionPass.traverse(this, acu)); @@ -139,19 +142,19 @@ public final class JavaAstProcessor { } - public static JavaAstProcessor create(JavaLanguageProcessor globalProcessor, + public static void process(JavaLanguageProcessor globalProcessor, SemanticErrorReporter semanticErrorReporter, - TypeInferenceLogger typeInfLogger) { + TypeInferenceLogger typeInfLogger, + ASTCompilationUnit ast) { - return new JavaAstProcessor( + JavaAstProcessor astProc = new JavaAstProcessor( globalProcessor, semanticErrorReporter, - typeInfLogger + typeInfLogger, + ast ); - } - public static JavaAstProcessor create(JavaLanguageProcessor globalProcessor, SemanticErrorReporter reporter) { - return create(globalProcessor, reporter, globalProcessor.newTypeInfLogger()); + astProc.process(); } } diff --git a/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/internal/JavaLanguageProcessor.java b/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/internal/JavaLanguageProcessor.java index c9395509c6..ab228819ce 100644 --- a/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/internal/JavaLanguageProcessor.java +++ b/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/internal/JavaLanguageProcessor.java @@ -6,13 +6,9 @@ package net.sourceforge.pmd.lang.java.internal; import java.util.Objects; -import net.sourceforge.pmd.processor.BatchLanguageProcessor; -import net.sourceforge.pmd.lang.LanguageVersion; import net.sourceforge.pmd.lang.LanguageVersionHandler; import net.sourceforge.pmd.lang.ast.Parser; import net.sourceforge.pmd.lang.java.ast.JavaParser; -import net.sourceforge.pmd.lang.java.ast.internal.LanguageLevelChecker; -import net.sourceforge.pmd.lang.java.ast.internal.ReportingStrategy; import net.sourceforge.pmd.lang.java.internal.JavaLanguageProperties.InferenceLoggingVerbosity; import net.sourceforge.pmd.lang.java.rule.internal.JavaRuleViolationFactory; import net.sourceforge.pmd.lang.java.rule.xpath.internal.BaseContextNodeTestFun; @@ -28,6 +24,7 @@ import net.sourceforge.pmd.lang.java.types.internal.infer.TypeInferenceLogger.Ve import net.sourceforge.pmd.lang.metrics.LanguageMetricsProvider; import net.sourceforge.pmd.lang.rule.RuleViolationFactory; import net.sourceforge.pmd.lang.rule.xpath.impl.XPathHandler; +import net.sourceforge.pmd.processor.BatchLanguageProcessor; import net.sourceforge.pmd.util.designerbindings.DesignerBindings; /** @@ -45,15 +42,9 @@ public class JavaLanguageProcessor extends BatchLanguageProcessor levelChecker = - new LanguageLevelChecker<>(properties.getInternalJdkVersion(), - properties.isPreviewEnabled(), - // TODO change this strategy with a new lang property - ReportingStrategy.reporterThatThrows()); - String suppressMarker = properties.getSuppressMarker(); - this.parser = new JavaParser(levelChecker, suppressMarker, this, true); - this.parserWithoutProcessing = new JavaParser(levelChecker, suppressMarker, this, false); + this.parser = new JavaParser(suppressMarker, this, true); + this.parserWithoutProcessing = new JavaParser(suppressMarker, this, false); } public JavaLanguageProcessor(JavaLanguageProperties properties) { @@ -66,10 +57,6 @@ public class JavaLanguageProcessor extends BatchLanguageProcessor