From c519b84024d4ee5af551d3782ca3ccaee30f449a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Fournier?= Date: Tue, 15 Dec 2020 11:34:19 +0100 Subject: [PATCH] Remove Modelica processing stages --- .../pmd/benchmark/TimeTracker.java | 13 ++++++ .../lang/java/ast/AstDisambiguationPass.java | 4 +- .../lang/java/internal/JavaAstProcessor.java | 22 ++-------- .../pmd/lang/modelica/ModelicaHandler.java | 7 --- .../pmd/lang/modelica/ast/ModelicaParser.java | 6 ++- .../internal/ModelicaProcessingStage.java | 43 ------------------- .../resolver/ModelicaSymbolFacade.java | 11 ++++- .../resolver/ScopeAndDeclarationFinder.java | 2 +- .../modelica/rule/AbstractModelicaRule.java | 9 ---- 9 files changed, 34 insertions(+), 83 deletions(-) delete mode 100644 pmd-modelica/src/main/java/net/sourceforge/pmd/lang/modelica/internal/ModelicaProcessingStage.java diff --git a/pmd-core/src/main/java/net/sourceforge/pmd/benchmark/TimeTracker.java b/pmd-core/src/main/java/net/sourceforge/pmd/benchmark/TimeTracker.java index 2eb42776bb..510f57862d 100644 --- a/pmd-core/src/main/java/net/sourceforge/pmd/benchmark/TimeTracker.java +++ b/pmd-core/src/main/java/net/sourceforge/pmd/benchmark/TimeTracker.java @@ -12,6 +12,7 @@ import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentMap; import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.atomic.AtomicLong; +import java.util.function.Supplier; /** * A time tracker class to measure time spent on different sections of PMD analysis. @@ -157,6 +158,18 @@ public final class TimeTracker { } } + public static void bench(String label, Runnable runnable) { + try (TimedOperation to = startOperation(TimedOperationCategory.LANGUAGE_SPECIFIC_PROCESSING, label)) { + runnable.run(); + } + } + + public static T bench(String label, Supplier runnable) { + try (TimedOperation to = startOperation(TimedOperationCategory.LANGUAGE_SPECIFIC_PROCESSING, label)) { + return runnable.get(); + } + } + /** * An entry in the open timers queue. Defines an operation that has started and hasn't finished yet. */ diff --git a/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/ast/AstDisambiguationPass.java b/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/ast/AstDisambiguationPass.java index d698822019..a12e18f7bd 100644 --- a/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/ast/AstDisambiguationPass.java +++ b/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/ast/AstDisambiguationPass.java @@ -13,11 +13,11 @@ import java.util.Iterator; import org.checkerframework.checker.nullness.qual.NonNull; import org.checkerframework.checker.nullness.qual.Nullable; +import net.sourceforge.pmd.benchmark.TimeTracker; import net.sourceforge.pmd.lang.ast.Node; import net.sourceforge.pmd.lang.ast.NodeStream; import net.sourceforge.pmd.lang.ast.impl.javacc.JavaccToken; import net.sourceforge.pmd.lang.java.ast.ASTAssignableExpr.ASTNamedReferenceExpr; -import net.sourceforge.pmd.lang.java.internal.JavaAstProcessor; import net.sourceforge.pmd.lang.java.symbols.JClassSymbol; import net.sourceforge.pmd.lang.java.symbols.JTypeDeclSymbol; import net.sourceforge.pmd.lang.java.symbols.table.JSymbolTable; @@ -57,7 +57,7 @@ final class AstDisambiguationPass { */ public static void disambigWithCtx(NodeStream nodes, ReferenceCtx ctx) { assert ctx != null : "Null context"; - JavaAstProcessor.bench("AST disambiguation", () -> nodes.forEach(it -> it.acceptVisitor(DisambigVisitor.INSTANCE, ctx))); + TimeTracker.bench("AST disambiguation", () -> nodes.forEach(it -> it.acceptVisitor(DisambigVisitor.INSTANCE, ctx))); } 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 b9c7d32353..8fd6f62ebe 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 @@ -6,13 +6,10 @@ package net.sourceforge.pmd.lang.java.internal; import java.util.IdentityHashMap; import java.util.Map; -import java.util.function.Supplier; import java.util.logging.Level; import java.util.logging.Logger; import net.sourceforge.pmd.benchmark.TimeTracker; -import net.sourceforge.pmd.benchmark.TimedOperation; -import net.sourceforge.pmd.benchmark.TimedOperationCategory; import net.sourceforge.pmd.lang.LanguageVersion; import net.sourceforge.pmd.lang.ast.NodeStream; import net.sourceforge.pmd.lang.ast.SemanticErrorReporter; @@ -136,7 +133,7 @@ public final class JavaAstProcessor { */ public void process(ASTCompilationUnit acu) { - SymbolResolver knownSyms = bench("Symbol resolution", () -> SymbolResolutionPass.traverse(this, acu)); + SymbolResolver knownSyms = TimeTracker.bench("Symbol resolution", () -> SymbolResolutionPass.traverse(this, acu)); // Now symbols are on the relevant nodes this.symResolver = SymbolResolver.layer(knownSyms, this.symResolver); @@ -145,9 +142,9 @@ public final class JavaAstProcessor { // as scopes depend on type resolution in some cases. InternalApiBridge.initTypeResolver(acu, this, typeInferenceLogger); - bench("2. Symbol table resolution", () -> SymbolTableResolver.traverse(this, acu)); - bench("3. AST disambiguation", () -> InternalApiBridge.disambigWithCtx(NodeStream.of(acu), ReferenceCtx.root(this, acu))); - bench("4. Comment assignment", () -> InternalApiBridge.assignComments(acu)); + TimeTracker.bench("2. Symbol table resolution", () -> SymbolTableResolver.traverse(this, acu)); + TimeTracker.bench("3. AST disambiguation", () -> InternalApiBridge.disambigWithCtx(NodeStream.of(acu), ReferenceCtx.root(this, acu))); + TimeTracker.bench("4. Comment assignment", () -> InternalApiBridge.assignComments(acu)); bench("5. Usage resolution", () -> InternalApiBridge.usageResolution(this, acu)); bench("6. Override resolution", () -> InternalApiBridge.overrideResolution(this, acu)); } @@ -202,15 +199,4 @@ public final class JavaAstProcessor { ); } - public static void bench(String label, Runnable runnable) { - try (TimedOperation ignored = TimeTracker.startOperation(TimedOperationCategory.LANGUAGE_SPECIFIC_PROCESSING, label)) { - runnable.run(); - } - } - - public static T bench(String label, Supplier runnable) { - try (TimedOperation ignored = TimeTracker.startOperation(TimedOperationCategory.LANGUAGE_SPECIFIC_PROCESSING, label)) { - return runnable.get(); - } - } } diff --git a/pmd-modelica/src/main/java/net/sourceforge/pmd/lang/modelica/ModelicaHandler.java b/pmd-modelica/src/main/java/net/sourceforge/pmd/lang/modelica/ModelicaHandler.java index 1fe768cdb8..2deb0547f9 100644 --- a/pmd-modelica/src/main/java/net/sourceforge/pmd/lang/modelica/ModelicaHandler.java +++ b/pmd-modelica/src/main/java/net/sourceforge/pmd/lang/modelica/ModelicaHandler.java @@ -7,16 +7,9 @@ package net.sourceforge.pmd.lang.modelica; import net.sourceforge.pmd.lang.AbstractPmdLanguageVersionHandler; import net.sourceforge.pmd.lang.ast.Parser; import net.sourceforge.pmd.lang.modelica.ast.ModelicaParser; -import net.sourceforge.pmd.lang.modelica.internal.ModelicaProcessingStage; public class ModelicaHandler extends AbstractPmdLanguageVersionHandler { - public ModelicaHandler() { - super(ModelicaProcessingStage.class); - } - - - @Override public Parser getParser() { return new ModelicaParser(); diff --git a/pmd-modelica/src/main/java/net/sourceforge/pmd/lang/modelica/ast/ModelicaParser.java b/pmd-modelica/src/main/java/net/sourceforge/pmd/lang/modelica/ast/ModelicaParser.java index 3712b7e6e1..2e7d2e0d79 100644 --- a/pmd-modelica/src/main/java/net/sourceforge/pmd/lang/modelica/ast/ModelicaParser.java +++ b/pmd-modelica/src/main/java/net/sourceforge/pmd/lang/modelica/ast/ModelicaParser.java @@ -4,10 +4,12 @@ package net.sourceforge.pmd.lang.modelica.ast; +import net.sourceforge.pmd.benchmark.TimeTracker; import net.sourceforge.pmd.lang.ast.CharStream; import net.sourceforge.pmd.lang.ast.ParseException; import net.sourceforge.pmd.lang.ast.impl.javacc.JavaccTokenDocument; import net.sourceforge.pmd.lang.ast.impl.javacc.JjtreeParserAdapter; +import net.sourceforge.pmd.lang.modelica.resolver.ModelicaSymbolFacade; public class ModelicaParser extends JjtreeParserAdapter { @@ -19,7 +21,9 @@ public class ModelicaParser extends JjtreeParserAdapter { @Override protected ASTStoredDefinition parseImpl(CharStream cs, ParserTask task) throws ParseException { - return new ModelicaParserImpl(cs).StoredDefinition().makeTaskInfo(task); + ASTStoredDefinition root = new ModelicaParserImpl(cs).StoredDefinition().makeTaskInfo(task); + TimeTracker.bench("Modelica symbols", () -> ModelicaSymbolFacade.process(root)); + return root; } } diff --git a/pmd-modelica/src/main/java/net/sourceforge/pmd/lang/modelica/internal/ModelicaProcessingStage.java b/pmd-modelica/src/main/java/net/sourceforge/pmd/lang/modelica/internal/ModelicaProcessingStage.java deleted file mode 100644 index 30f6266a59..0000000000 --- a/pmd-modelica/src/main/java/net/sourceforge/pmd/lang/modelica/internal/ModelicaProcessingStage.java +++ /dev/null @@ -1,43 +0,0 @@ -/* - * BSD-style license; for more info see http://pmd.sourceforge.net/license.html - */ - -package net.sourceforge.pmd.lang.modelica.internal; - -import net.sourceforge.pmd.lang.Language; -import net.sourceforge.pmd.lang.LanguageRegistry; -import net.sourceforge.pmd.lang.ast.AstAnalysisContext; -import net.sourceforge.pmd.lang.ast.AstProcessingStage; -import net.sourceforge.pmd.lang.ast.RootNode; -import net.sourceforge.pmd.lang.modelica.ModelicaLanguageModule; -import net.sourceforge.pmd.lang.modelica.ast.ASTStoredDefinition; -import net.sourceforge.pmd.lang.modelica.resolver.ModelicaSymbolFacade; - -/** - * @author Clément Fournier - */ -public enum ModelicaProcessingStage implements AstProcessingStage { - SYMBOL_RESOLUTION("Symbol resolution") { - @Override - public void processAST(RootNode rootNode, AstAnalysisContext configuration) { - new ModelicaSymbolFacade().initializeWith((ASTStoredDefinition) rootNode); - } - }; - - private final String displayName; - - ModelicaProcessingStage(String displayName) { - this.displayName = displayName; - } - - - @Override - public Language getLanguage() { - return LanguageRegistry.getLanguage(ModelicaLanguageModule.NAME); - } - - @Override - public String getDisplayName() { - return displayName; - } -} diff --git a/pmd-modelica/src/main/java/net/sourceforge/pmd/lang/modelica/resolver/ModelicaSymbolFacade.java b/pmd-modelica/src/main/java/net/sourceforge/pmd/lang/modelica/resolver/ModelicaSymbolFacade.java index cf91c2edda..6786d3193f 100644 --- a/pmd-modelica/src/main/java/net/sourceforge/pmd/lang/modelica/resolver/ModelicaSymbolFacade.java +++ b/pmd-modelica/src/main/java/net/sourceforge/pmd/lang/modelica/resolver/ModelicaSymbolFacade.java @@ -4,10 +4,17 @@ package net.sourceforge.pmd.lang.modelica.resolver; +import net.sourceforge.pmd.annotation.InternalApi; import net.sourceforge.pmd.lang.modelica.ast.ASTStoredDefinition; -public class ModelicaSymbolFacade { - public void initializeWith(ASTStoredDefinition node) { +@InternalApi +public final class ModelicaSymbolFacade { + + private ModelicaSymbolFacade() { + // util class + } + + public static void process(ASTStoredDefinition node) { ScopeAndDeclarationFinder sc = new ScopeAndDeclarationFinder(); node.acceptVisitor(sc, null); } diff --git a/pmd-modelica/src/main/java/net/sourceforge/pmd/lang/modelica/resolver/ScopeAndDeclarationFinder.java b/pmd-modelica/src/main/java/net/sourceforge/pmd/lang/modelica/resolver/ScopeAndDeclarationFinder.java index 66a47e3cf9..fb3bceb9a9 100644 --- a/pmd-modelica/src/main/java/net/sourceforge/pmd/lang/modelica/resolver/ScopeAndDeclarationFinder.java +++ b/pmd-modelica/src/main/java/net/sourceforge/pmd/lang/modelica/resolver/ScopeAndDeclarationFinder.java @@ -14,7 +14,7 @@ import net.sourceforge.pmd.lang.modelica.ast.InternalModelicaNodeApi; import net.sourceforge.pmd.lang.modelica.ast.ModelicaNode; import net.sourceforge.pmd.lang.modelica.ast.ModelicaParserVisitorAdapter; -public class ScopeAndDeclarationFinder extends ModelicaParserVisitorAdapter { +class ScopeAndDeclarationFinder extends ModelicaParserVisitorAdapter { private final Deque scopes = new ArrayDeque<>(); ScopeAndDeclarationFinder() { diff --git a/pmd-modelica/src/main/java/net/sourceforge/pmd/lang/modelica/rule/AbstractModelicaRule.java b/pmd-modelica/src/main/java/net/sourceforge/pmd/lang/modelica/rule/AbstractModelicaRule.java index 417cd767fb..5950b7fe9c 100644 --- a/pmd-modelica/src/main/java/net/sourceforge/pmd/lang/modelica/rule/AbstractModelicaRule.java +++ b/pmd-modelica/src/main/java/net/sourceforge/pmd/lang/modelica/rule/AbstractModelicaRule.java @@ -6,11 +6,9 @@ package net.sourceforge.pmd.lang.modelica.rule; import net.sourceforge.pmd.RuleContext; import net.sourceforge.pmd.lang.LanguageRegistry; -import net.sourceforge.pmd.lang.ast.AstProcessingStage; import net.sourceforge.pmd.lang.ast.Node; import net.sourceforge.pmd.lang.modelica.ModelicaLanguageModule; import net.sourceforge.pmd.lang.modelica.ast.ModelicaParserVisitor; -import net.sourceforge.pmd.lang.modelica.internal.ModelicaProcessingStage; import net.sourceforge.pmd.lang.rule.AbstractRule; /** @@ -26,11 +24,4 @@ public abstract class AbstractModelicaRule extends AbstractRule implements Model target.acceptVisitor(this, ctx); } - @Override - public boolean dependsOn(AstProcessingStage stage) { - if (!(stage instanceof ModelicaProcessingStage)) { - throw new IllegalArgumentException("Processing stage wasn't a Modelica one: " + stage); - } - return true; - } }