diff --git a/pmd-apex/src/main/java/net/sourceforge/pmd/lang/apex/ast/ASTApexFile.java b/pmd-apex/src/main/java/net/sourceforge/pmd/lang/apex/ast/ASTApexFile.java index 315f746c7c..d95cc39255 100644 --- a/pmd-apex/src/main/java/net/sourceforge/pmd/lang/apex/ast/ASTApexFile.java +++ b/pmd-apex/src/main/java/net/sourceforge/pmd/lang/apex/ast/ASTApexFile.java @@ -9,6 +9,7 @@ import java.util.Map; import org.checkerframework.checker.nullness.qual.NonNull; +import net.sourceforge.pmd.lang.LanguageVersion; import net.sourceforge.pmd.lang.ast.RootNode; import net.sourceforge.pmd.lang.ast.SourceCodePositioner; @@ -17,10 +18,14 @@ import apex.jorje.semantic.ast.compilation.Compilation; public final class ASTApexFile extends AbstractApexNode implements RootNode { + private final LanguageVersion languageVersion; private Map suppressMap = Collections.emptyMap(); - ASTApexFile(SourceCodePositioner source, AbstractApexNode child) { + ASTApexFile(SourceCodePositioner source, + LanguageVersion languageVersion, + AbstractApexNode child) { super(child.getNode()); + this.languageVersion = languageVersion; addChild(child, 0); this.beginLine = 1; this.endLine = source.getLastLine(); @@ -29,6 +34,11 @@ public final class ASTApexFile extends AbstractApexNode implements Root child.setCoords(child.getBeginLine(), child.getBeginColumn(), source.getLastLine(), source.getLastLineColumn()); } + @Override + public LanguageVersion getLanguageVersion() { + return languageVersion; + } + @Override public double getApexVersion() { return getNode().getDefiningType().getCodeUnitDetails().getVersion().getExternal(); diff --git a/pmd-apex/src/main/java/net/sourceforge/pmd/lang/apex/ast/ApexParser.java b/pmd-apex/src/main/java/net/sourceforge/pmd/lang/apex/ast/ApexParser.java index 66fd4756a1..9ee158bc54 100644 --- a/pmd-apex/src/main/java/net/sourceforge/pmd/lang/apex/ast/ApexParser.java +++ b/pmd-apex/src/main/java/net/sourceforge/pmd/lang/apex/ast/ApexParser.java @@ -35,7 +35,7 @@ public final class ApexParser implements Parser { SourceCodePositioner positioner = new SourceCodePositioner(sourceCode); final ApexTreeBuilder treeBuilder = new ApexTreeBuilder(sourceCode, task.getCommentMarker(), positioner); AbstractApexNode treeRoot = treeBuilder.build(astRoot); - ASTApexFile fileNode = new ASTApexFile(positioner, treeRoot); + ASTApexFile fileNode = new ASTApexFile(positioner, task.getLanguageVersion(), treeRoot); fileNode.setNoPmdComments(treeBuilder.getSuppressMap()); return fileNode; } catch (apex.jorje.services.exception.ParseException e) { diff --git a/pmd-apex/src/test/java/net/sourceforge/pmd/lang/apex/rule/AbstractApexRuleTest.java b/pmd-apex/src/test/java/net/sourceforge/pmd/lang/apex/rule/AbstractApexRuleTest.java index 816db827d5..ff753e0324 100644 --- a/pmd-apex/src/test/java/net/sourceforge/pmd/lang/apex/rule/AbstractApexRuleTest.java +++ b/pmd-apex/src/test/java/net/sourceforge/pmd/lang/apex/rule/AbstractApexRuleTest.java @@ -46,9 +46,9 @@ public class AbstractApexRuleTest extends ApexParserTestBase { ApexNode node = parse(code); ReportBuilderListener reportBuilder = new ReportBuilderListener(); - try (RuleContext ctx = new RuleContext()) { - ctx.setLanguageVersion(apex.getDefaultVersion()); + try (RuleContext ctx = new RuleContext(reportBuilder)) { TopLevelRule rule = new TopLevelRule(); + rule.setMessage("Message"); rule.apply(node, ctx); } assertEquals(1, reportBuilder.getReport().getViolations().size()); diff --git a/pmd-core/src/main/java/net/sourceforge/pmd/RuleContext.java b/pmd-core/src/main/java/net/sourceforge/pmd/RuleContext.java index e9be38bbbd..ab8cff7598 100644 --- a/pmd-core/src/main/java/net/sourceforge/pmd/RuleContext.java +++ b/pmd-core/src/main/java/net/sourceforge/pmd/RuleContext.java @@ -14,7 +14,6 @@ import org.checkerframework.checker.nullness.qual.NonNull; import net.sourceforge.pmd.Report.ProcessingError; import net.sourceforge.pmd.Report.SuppressedViolation; -import net.sourceforge.pmd.lang.LanguageVersion; import net.sourceforge.pmd.lang.ast.Node; import net.sourceforge.pmd.lang.rule.ParametricRuleViolation; import net.sourceforge.pmd.lang.rule.RuleViolationFactory; @@ -44,7 +43,6 @@ public class RuleContext implements AutoCloseable { private Report report = new Report(); private File sourceCodeFile; - private LanguageVersion languageVersion; private boolean ignoreExceptions = true; private final ThreadSafeAnalysisListener listener; @@ -52,6 +50,7 @@ public class RuleContext implements AutoCloseable { /** * Default constructor. */ + @Deprecated public RuleContext() { listener = ThreadSafeAnalysisListener.noop(); } @@ -109,7 +108,7 @@ public class RuleContext implements AutoCloseable { Objects.requireNonNull(formatArgs); // at some point each Node will know its language version - RuleViolationFactory fact = getLanguageVersion().getLanguageVersionHandler().getRuleViolationFactory(); + RuleViolationFactory fact = location.getLanguageVersion().getLanguageVersionHandler().getRuleViolationFactory(); RuleViolation violation = fact.createViolation(rule, location, getSourceCodeFilename(), makeMessage(message, formatArgs)); if (beginLine != -1 && endLine != -1) { @@ -207,32 +206,6 @@ public class RuleContext implements AutoCloseable { + "Setting the filename here has no effect. Use RuleContext::setSourceCodeFile(File) instead."); } - /** - * Get the LanguageVersion associated with the current source file. - * - * @return The LanguageVersion, null if unknown. - * - * @deprecated Will be replaced by a method on Node (nodes will - * know their language version). - */ - @Deprecated - public LanguageVersion getLanguageVersion() { - return this.languageVersion; - } - - /** - * Set the LanguageVersion associated with the current source file. This may - * be set to null to indicate the version is unknown and should - * be automatically determined. - * - * @param languageVersion - * The LanguageVersion. - */ - @Deprecated - public void setLanguageVersion(LanguageVersion languageVersion) { - this.languageVersion = languageVersion; - } - /** * Configure whether exceptions during applying a rule should be ignored or * not. If set to true then such exceptions are logged as @@ -261,9 +234,4 @@ public class RuleContext implements AutoCloseable { return ignoreExceptions; } - public static RuleContext throwingExceptions() { - RuleContext ctx = new RuleContext(); - ctx.setIgnoreExceptions(false); - return ctx; - } } diff --git a/pmd-core/src/main/java/net/sourceforge/pmd/lang/ast/Node.java b/pmd-core/src/main/java/net/sourceforge/pmd/lang/ast/Node.java index b2972344d3..30bc73e5cd 100644 --- a/pmd-core/src/main/java/net/sourceforge/pmd/lang/ast/Node.java +++ b/pmd-core/src/main/java/net/sourceforge/pmd/lang/ast/Node.java @@ -12,6 +12,7 @@ import java.util.Objects; import org.checkerframework.checker.nullness.qual.NonNull; import org.checkerframework.checker.nullness.qual.Nullable; +import net.sourceforge.pmd.lang.LanguageVersion; import net.sourceforge.pmd.lang.ast.NodeStream.DescendantNodeStream; import net.sourceforge.pmd.lang.ast.internal.StreamImpl; import net.sourceforge.pmd.lang.rule.xpath.Attribute; @@ -298,6 +299,11 @@ public interface Node { } + default LanguageVersion getLanguageVersion() { + return getRoot().getLanguageVersion(); + } + + /** * Gets the name of the node that is used to match it with XPath queries. * diff --git a/pmd-core/src/main/java/net/sourceforge/pmd/lang/ast/RootNode.java b/pmd-core/src/main/java/net/sourceforge/pmd/lang/ast/RootNode.java index e7be304c5f..a56efa49bd 100644 --- a/pmd-core/src/main/java/net/sourceforge/pmd/lang/ast/RootNode.java +++ b/pmd-core/src/main/java/net/sourceforge/pmd/lang/ast/RootNode.java @@ -9,6 +9,7 @@ import java.util.Map; import net.sourceforge.pmd.annotation.Experimental; import net.sourceforge.pmd.annotation.InternalApi; +import net.sourceforge.pmd.lang.LanguageVersion; /** * This interface identifies the root node of an AST. Each language @@ -37,4 +38,7 @@ public interface RootNode extends Node { return Collections.emptyMap(); } + + @Override + LanguageVersion getLanguageVersion(); } diff --git a/pmd-core/src/main/java/net/sourceforge/pmd/lang/ast/impl/javacc/JjtreeParserAdapter.java b/pmd-core/src/main/java/net/sourceforge/pmd/lang/ast/impl/javacc/JjtreeParserAdapter.java index d871f4906e..81ac66b6da 100644 --- a/pmd-core/src/main/java/net/sourceforge/pmd/lang/ast/impl/javacc/JjtreeParserAdapter.java +++ b/pmd-core/src/main/java/net/sourceforge/pmd/lang/ast/impl/javacc/JjtreeParserAdapter.java @@ -4,6 +4,7 @@ package net.sourceforge.pmd.lang.ast.impl.javacc; +import net.sourceforge.pmd.lang.LanguageVersion; import net.sourceforge.pmd.lang.Parser; import net.sourceforge.pmd.lang.ast.CharStream; import net.sourceforge.pmd.lang.ast.ParseException; @@ -34,13 +35,13 @@ public abstract class JjtreeParserAdapter implements Parser CharStream charStream = newCharStream(doc); try { - return parseImpl(charStream, task.getCommentMarker()); + return parseImpl(charStream, task.getCommentMarker(), task.getLanguageVersion()); } catch (TokenMgrError tme) { throw tme.setFileName(task.getFileDisplayName()); } } - protected abstract R parseImpl(CharStream cs, String suppressMarker) throws ParseException; + protected abstract R parseImpl(CharStream cs, String suppressMarker, LanguageVersion languageVersion) throws ParseException; @Override diff --git a/pmd-core/src/main/java/net/sourceforge/pmd/lang/rule/internal/RuleApplicator.java b/pmd-core/src/main/java/net/sourceforge/pmd/lang/rule/internal/RuleApplicator.java index 1de6c25b84..67da779d6f 100644 --- a/pmd-core/src/main/java/net/sourceforge/pmd/lang/rule/internal/RuleApplicator.java +++ b/pmd-core/src/main/java/net/sourceforge/pmd/lang/rule/internal/RuleApplicator.java @@ -49,13 +49,13 @@ public class RuleApplicator { private void applyOnIndex(TreeIndex idx, Collection rules, RuleContext ctx) { for (Rule rule : rules) { - if (!RuleSet.applies(rule, ctx.getLanguageVersion())) { - continue; - } Iterator targets = rule.getTargetSelector().getVisitedNodes(idx); while (targets.hasNext()) { Node node = targets.next(); + if (!RuleSet.applies(rule, node.getLanguageVersion())) { + continue; + } try (TimedOperation rcto = TimeTracker.startOperation(TimedOperationCategory.RULE, rule.getName())) { rule.apply(node, ctx); diff --git a/pmd-core/src/main/java/net/sourceforge/pmd/processor/PmdRunnable.java b/pmd-core/src/main/java/net/sourceforge/pmd/processor/PmdRunnable.java index c6b6a08471..c3251c0c5c 100644 --- a/pmd-core/src/main/java/net/sourceforge/pmd/processor/PmdRunnable.java +++ b/pmd-core/src/main/java/net/sourceforge/pmd/processor/PmdRunnable.java @@ -85,9 +85,7 @@ public class PmdRunnable implements Runnable { LOCAL_THREAD_CONTEXT.set(tc); } try (RuleContext ruleCtx = new RuleContext(ruleContext.startFileAnalysis(dataSource))) { - LanguageVersion langVersion = configuration.getLanguageVersionOfFile(file.getPath()); - ruleCtx.setLanguageVersion(langVersion); ruleCtx.setSourceCodeFile(file); if (LOG.isLoggable(Level.FINE)) { diff --git a/pmd-core/src/test/java/net/sourceforge/pmd/AbstractRuleTest.java b/pmd-core/src/test/java/net/sourceforge/pmd/AbstractRuleTest.java index f5c988db57..bc0d632b54 100644 --- a/pmd-core/src/test/java/net/sourceforge/pmd/AbstractRuleTest.java +++ b/pmd-core/src/test/java/net/sourceforge/pmd/AbstractRuleTest.java @@ -17,8 +17,6 @@ import org.junit.Test; import net.sourceforge.pmd.Report.ReportBuilderListener; import net.sourceforge.pmd.Report.SuppressedViolation; -import net.sourceforge.pmd.lang.DummyLanguageModule; -import net.sourceforge.pmd.lang.LanguageRegistry; import net.sourceforge.pmd.lang.ast.DummyNode; import net.sourceforge.pmd.lang.ast.DummyRoot; import net.sourceforge.pmd.lang.ast.Node; @@ -104,7 +102,6 @@ public class AbstractRuleTest { r.setMessage("Message ${packageName} ${className} ${methodName} ${variableName} ${testInt} ${noSuchProperty}"); ReportBuilderListener listener = new ReportBuilderListener(); try (RuleContext ctx = new RuleContext(listener)) { - ctx.setLanguageVersion(LanguageRegistry.getLanguage(DummyLanguageModule.NAME).getDefaultVersion()); ctx.setSourceCodeFile(new File("filename")); DummyNode s = new DummyRoot(); s.setCoords(5, 1, 6, 1); diff --git a/pmd-core/src/test/java/net/sourceforge/pmd/RuleContextTest.java b/pmd-core/src/test/java/net/sourceforge/pmd/RuleContextTest.java index 48a3dae587..a4cdf96ce8 100644 --- a/pmd-core/src/test/java/net/sourceforge/pmd/RuleContextTest.java +++ b/pmd-core/src/test/java/net/sourceforge/pmd/RuleContextTest.java @@ -13,8 +13,6 @@ import org.junit.Assert; import org.junit.Test; import net.sourceforge.pmd.Report.ReportBuilderListener; -import net.sourceforge.pmd.lang.DummyLanguageModule; -import net.sourceforge.pmd.lang.LanguageRegistry; import net.sourceforge.pmd.lang.ast.impl.DummyTreeUtil; import junit.framework.JUnit4TestAdapter; @@ -34,7 +32,6 @@ public class RuleContextTest { public void testMessage() throws Exception { ReportBuilderListener listener = new ReportBuilderListener(); try (RuleContext ctx = new RuleContext(listener)) { - ctx.setLanguageVersion(LanguageRegistry.getLanguage(DummyLanguageModule.NAME).getDefaultVersion()); ctx.addViolationWithMessage(new FooRule(), DummyTreeUtil.tree(DummyTreeUtil::root), "message with \"'{'\""); } @@ -46,7 +43,6 @@ public class RuleContextTest { public void testMessageArgs() throws Exception { ReportBuilderListener listener = new ReportBuilderListener(); try (RuleContext ctx = new RuleContext(listener)) { - ctx.setLanguageVersion(LanguageRegistry.getLanguage(DummyLanguageModule.NAME).getDefaultVersion()); ctx.addViolationWithMessage(new FooRule(), DummyTreeUtil.tree(DummyTreeUtil::root), "message with 1 argument: \"{0}\"", "testarg1"); } diff --git a/pmd-core/src/test/java/net/sourceforge/pmd/RuleSetTest.java b/pmd-core/src/test/java/net/sourceforge/pmd/RuleSetTest.java index cfd8947bf4..724ccbfca9 100644 --- a/pmd-core/src/test/java/net/sourceforge/pmd/RuleSetTest.java +++ b/pmd-core/src/test/java/net/sourceforge/pmd/RuleSetTest.java @@ -419,7 +419,6 @@ public class RuleSetTest { ReportBuilderListener reportBuilder = new ReportBuilderListener(); try (RuleContext ctx = new RuleContext(reportBuilder)) { ctx.setSourceCodeFile(file); - ctx.setLanguageVersion(dummyLang.getDefaultVersion()); ruleSets.apply(makeCompilationUnits(), ctx); } assertEquals("Violations", 2, reportBuilder.getReport().getViolations().size()); @@ -436,7 +435,6 @@ public class RuleSetTest { try (RuleContext ctx = new RuleContext(reportBuilder)) { ctx.setSourceCodeFile(file); - ctx.setLanguageVersion(LanguageRegistry.getLanguage(DummyLanguageModule.NAME).getDefaultVersion()); ruleSets.apply(makeCompilationUnits(), ctx); } assertEquals("Violations", 1, reportBuilder.getReport().getViolations().size()); @@ -500,7 +498,6 @@ public class RuleSetTest { .build(); ReportBuilderListener reportBuilder = new ReportBuilderListener(); try (RuleContext context = new RuleContext(reportBuilder)) { - context.setLanguageVersion(dummyLang.getDefaultVersion()); context.setSourceCodeFile(new File("foo.dummy")); context.setIgnoreExceptions(true); // the default ruleset.apply(makeCompilationUnits(), context); @@ -525,7 +522,6 @@ public class RuleSetTest { .build(); RuleContext context = new RuleContext(); context.setReport(new Report()); - context.setLanguageVersion(dummyLang.getDefaultVersion()); context.setSourceCodeFile(new File(RuleSetTest.class.getName() + ".ruleExceptionShouldBeThrownIfNotIgnored")); context.setIgnoreExceptions(false); ruleset.apply(makeCompilationUnits(), context); @@ -546,7 +542,6 @@ public class RuleSetTest { }).build(); ReportBuilderListener reportBuilder = new ReportBuilderListener(); try (RuleContext context = new RuleContext(reportBuilder)) { - context.setLanguageVersion(dummyLang.getDefaultVersion()); context.setSourceCodeFile(new File("foo.dummy")); context.setIgnoreExceptions(true); // the default ruleset.apply(makeCompilationUnits(), context); @@ -589,7 +584,6 @@ public class RuleSetTest { ReportBuilderListener reportBuilder = new ReportBuilderListener(); try (RuleContext context = new RuleContext(reportBuilder)) { - context.setLanguageVersion(dummyLang.getDefaultVersion()); context.setSourceCodeFile(new File("foo.dummy")); context.setIgnoreExceptions(true); // the default rulesets.apply(makeCompilationUnits(), context); diff --git a/pmd-core/src/test/java/net/sourceforge/pmd/lang/ast/DummyRoot.java b/pmd-core/src/test/java/net/sourceforge/pmd/lang/ast/DummyRoot.java index 5bedfffc7b..6d477640d4 100644 --- a/pmd-core/src/test/java/net/sourceforge/pmd/lang/ast/DummyRoot.java +++ b/pmd-core/src/test/java/net/sourceforge/pmd/lang/ast/DummyRoot.java @@ -7,21 +7,45 @@ package net.sourceforge.pmd.lang.ast; import java.util.Collections; import java.util.Map; +import net.sourceforge.pmd.lang.DummyLanguageModule; +import net.sourceforge.pmd.lang.LanguageRegistry; +import net.sourceforge.pmd.lang.LanguageVersion; import net.sourceforge.pmd.lang.ast.impl.GenericNode; public class DummyRoot extends DummyNode implements GenericNode, RootNode { private final Map suppressMap; + private LanguageVersion languageVersion; - public DummyRoot(Map suppressMap) { + public DummyRoot(Map suppressMap, LanguageVersion languageVersion) { super(); this.suppressMap = suppressMap; + this.languageVersion = languageVersion; + } + + public DummyRoot(Map suppressMap) { + this(suppressMap, LanguageRegistry.getLanguage(DummyLanguageModule.NAME).getDefaultVersion()); } public DummyRoot() { this(Collections.emptyMap()); } + public DummyRoot(LanguageVersion languageVersion) { + this(Collections.emptyMap(), languageVersion); + } + + + @Override + public LanguageVersion getLanguageVersion() { + return languageVersion; + } + + public DummyRoot setLanguageVersion(LanguageVersion languageVersion) { + this.languageVersion = languageVersion; + return this; + } + @Override public Map getNoPmdComments() { return suppressMap; diff --git a/pmd-core/src/test/java/net/sourceforge/pmd/lang/rule/XPathRuleTest.java b/pmd-core/src/test/java/net/sourceforge/pmd/lang/rule/XPathRuleTest.java index 4da28353ce..6e13547dcc 100644 --- a/pmd-core/src/test/java/net/sourceforge/pmd/lang/rule/XPathRuleTest.java +++ b/pmd-core/src/test/java/net/sourceforge/pmd/lang/rule/XPathRuleTest.java @@ -14,9 +14,6 @@ import org.junit.Test; import net.sourceforge.pmd.Report.ReportBuilderListener; import net.sourceforge.pmd.RuleContext; import net.sourceforge.pmd.junit.JavaUtilLoggingRule; -import net.sourceforge.pmd.lang.DummyLanguageModule; -import net.sourceforge.pmd.lang.LanguageRegistry; -import net.sourceforge.pmd.lang.LanguageVersion; import net.sourceforge.pmd.lang.ast.DummyNode; import net.sourceforge.pmd.lang.ast.DummyNodeWithDeprecatedAttribute; import net.sourceforge.pmd.lang.ast.DummyRoot; @@ -44,12 +41,10 @@ public class XPathRuleTest { loggingRule.clear(); - LanguageVersion dummyVersion = LanguageRegistry.getLanguage(DummyLanguageModule.NAME).getDefaultVersion(); DummyNode firstNode = newNode(); ReportBuilderListener reportBuilder = new ReportBuilderListener(); try (RuleContext ctx = new RuleContext(reportBuilder)) { - ctx.setLanguageVersion(dummyVersion); // with another rule forked from the same one (in multithreaded processor) xpr.apply(firstNode, ctx); } @@ -65,7 +60,6 @@ public class XPathRuleTest { reportBuilder = new ReportBuilderListener(); try (RuleContext ctx = new RuleContext(reportBuilder)) { - ctx.setLanguageVersion(dummyVersion); // with another node xpr.apply(newNode(), ctx); } @@ -77,7 +71,6 @@ public class XPathRuleTest { reportBuilder = new ReportBuilderListener(); try (RuleContext ctx = new RuleContext(reportBuilder)) { - ctx.setLanguageVersion(dummyVersion); // with another rule forked from the same one (in multithreaded processor) xpr.deepCopy().apply(newNode(), ctx); } @@ -88,7 +81,6 @@ public class XPathRuleTest { reportBuilder = new ReportBuilderListener(); try (RuleContext ctx = new RuleContext(reportBuilder)) { - ctx.setLanguageVersion(dummyVersion); // with another rule on the same node, new warnings XPathRule otherRule = makeRule(version, "OtherRule"); otherRule.setRuleSetName("rset.xml"); diff --git a/pmd-core/src/test/java/net/sourceforge/pmd/renderers/SummaryHTMLRendererTest.java b/pmd-core/src/test/java/net/sourceforge/pmd/renderers/SummaryHTMLRendererTest.java index 388d2f99cb..11c28463f6 100644 --- a/pmd-core/src/test/java/net/sourceforge/pmd/renderers/SummaryHTMLRendererTest.java +++ b/pmd-core/src/test/java/net/sourceforge/pmd/renderers/SummaryHTMLRendererTest.java @@ -19,8 +19,6 @@ import net.sourceforge.pmd.Report.ProcessingError; import net.sourceforge.pmd.Report.ReportBuilderListener; import net.sourceforge.pmd.ReportTest; import net.sourceforge.pmd.RuleContext; -import net.sourceforge.pmd.lang.DummyLanguageModule; -import net.sourceforge.pmd.lang.LanguageRegistry; import net.sourceforge.pmd.lang.ast.DummyRoot; public class SummaryHTMLRendererTest extends AbstractRendererTest { @@ -152,7 +150,6 @@ public class SummaryHTMLRendererTest extends AbstractRendererTest { Map suppressions = Collections.singletonMap(1, "test"); ReportBuilderListener listener = new ReportBuilderListener(); try (RuleContext ctx = new RuleContext(listener)) { - ctx.setLanguageVersion(LanguageRegistry.getLanguage(DummyLanguageModule.NAME).getDefaultVersion()); DummyRoot root = new DummyRoot(suppressions); root.setCoords(1, 10, 4, 5); ctx.addViolationWithPosition(new FooRule(), root, 1, 1, "suppress test"); diff --git a/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/ast/ASTCompilationUnit.java b/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/ast/ASTCompilationUnit.java index df16d01973..f16cc0f410 100644 --- a/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/ast/ASTCompilationUnit.java +++ b/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/ast/ASTCompilationUnit.java @@ -11,6 +11,7 @@ import java.util.Map; import org.checkerframework.checker.nullness.qual.NonNull; import net.sourceforge.pmd.annotation.InternalApi; +import net.sourceforge.pmd.lang.LanguageVersion; import net.sourceforge.pmd.lang.ast.Node; import net.sourceforge.pmd.lang.ast.RootNode; import net.sourceforge.pmd.lang.ast.impl.GenericNode; @@ -22,6 +23,7 @@ public class ASTCompilationUnit extends AbstractJavaTypeNode implements JavaNode private ClassTypeResolver classTypeResolver; private List comments; private Map noPmdComments = Collections.emptyMap(); + private LanguageVersion languageVersion; @InternalApi @Deprecated @@ -33,6 +35,17 @@ public class ASTCompilationUnit extends AbstractJavaTypeNode implements JavaNode return comments; } + + @Override + public LanguageVersion getLanguageVersion() { + return languageVersion; + } + + void setLanguageVersion(LanguageVersion languageVersion) { + this.languageVersion = languageVersion; + } + + @InternalApi @Deprecated public void setComments(List comments) { 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 69ad05bc3d..3c39d2d6a6 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.CharStream; import net.sourceforge.pmd.lang.ast.ParseException; import net.sourceforge.pmd.lang.ast.impl.javacc.JavaCharStream; @@ -37,7 +38,7 @@ public class JavaParser extends JjtreeParserAdapter { } @Override - protected ASTCompilationUnit parseImpl(CharStream cs, String suppressMarker) throws ParseException { + protected ASTCompilationUnit parseImpl(CharStream cs, String suppressMarker, LanguageVersion languageVersion) throws ParseException { JavaParserImpl parser = new JavaParserImpl(cs); if (suppressMarker != null) { parser.setSuppressMarker(suppressMarker); @@ -47,6 +48,7 @@ public class JavaParser extends JjtreeParserAdapter { ASTCompilationUnit acu = parser.CompilationUnit(); acu.setNoPmdComments(parser.getSuppressMap()); + acu.setLanguageVersion(languageVersion); checker.check(acu); return acu; } diff --git a/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/rule/performance/BigIntegerInstantiationRule.java b/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/rule/performance/BigIntegerInstantiationRule.java index b2627c00b8..ed6c6d61a3 100644 --- a/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/rule/performance/BigIntegerInstantiationRule.java +++ b/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/rule/performance/BigIntegerInstantiationRule.java @@ -7,7 +7,6 @@ package net.sourceforge.pmd.lang.java.rule.performance; import java.math.BigDecimal; import java.math.BigInteger; -import net.sourceforge.pmd.RuleContext; import net.sourceforge.pmd.lang.LanguageRegistry; import net.sourceforge.pmd.lang.ast.Node; import net.sourceforge.pmd.lang.java.JavaLanguageModule; @@ -34,8 +33,7 @@ public class BigIntegerInstantiationRule extends AbstractJavaRule { return super.visit(node, data); } - boolean jdk15 = ((RuleContext) data).getLanguageVersion() - .compareTo(LanguageRegistry.getLanguage(JavaLanguageModule.NAME).getVersion("1.5")) >= 0; + boolean jdk15 = node.getLanguageVersion().compareTo(LanguageRegistry.getLanguage(JavaLanguageModule.NAME).getVersion("1.5")) >= 0; if ((TypeTestUtil.isA(BigInteger.class, (ASTClassOrInterfaceType) type) || jdk15 && TypeTestUtil.isA(BigDecimal.class, (ASTClassOrInterfaceType) type)) && !node.hasDescendantOfType(ASTArrayDimsAndInits.class)) { diff --git a/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/rule/performance/UnnecessaryWrapperObjectCreationRule.java b/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/rule/performance/UnnecessaryWrapperObjectCreationRule.java index c3131f7bd1..05679348c2 100644 --- a/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/rule/performance/UnnecessaryWrapperObjectCreationRule.java +++ b/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/rule/performance/UnnecessaryWrapperObjectCreationRule.java @@ -8,7 +8,6 @@ import static net.sourceforge.pmd.util.CollectionUtil.setOf; import java.util.Set; -import net.sourceforge.pmd.RuleContext; import net.sourceforge.pmd.lang.LanguageRegistry; import net.sourceforge.pmd.lang.ast.Node; import net.sourceforge.pmd.lang.java.JavaLanguageModule; @@ -37,7 +36,7 @@ public class UnnecessaryWrapperObjectCreationRule extends AbstractJavaRule { image = image.substring(10); } - boolean checkBoolean = ((RuleContext) data).getLanguageVersion() + boolean checkBoolean = node.getLanguageVersion() .compareTo(LanguageRegistry.getLanguage(JavaLanguageModule.NAME).getVersion("1.5")) >= 0; if (PREFIX_SET.contains(image) || checkBoolean && "Boolean.valueOf".equals(image)) { diff --git a/pmd-java/src/test/java/net/sourceforge/pmd/lang/java/rule/XPathRuleTest.java b/pmd-java/src/test/java/net/sourceforge/pmd/lang/java/rule/XPathRuleTest.java index 8a496befbe..156badcda3 100644 --- a/pmd-java/src/test/java/net/sourceforge/pmd/lang/java/rule/XPathRuleTest.java +++ b/pmd-java/src/test/java/net/sourceforge/pmd/lang/java/rule/XPathRuleTest.java @@ -18,15 +18,16 @@ import net.sourceforge.pmd.Rule; import net.sourceforge.pmd.RuleContext; import net.sourceforge.pmd.RuleViolation; import net.sourceforge.pmd.lang.LanguageRegistry; -import net.sourceforge.pmd.lang.LanguageVersion; import net.sourceforge.pmd.lang.ast.Node; import net.sourceforge.pmd.lang.java.JavaLanguageModule; import net.sourceforge.pmd.lang.java.JavaParsingHelper; import net.sourceforge.pmd.lang.java.ast.ASTCompilationUnit; import net.sourceforge.pmd.lang.rule.XPathRule; import net.sourceforge.pmd.lang.rule.xpath.XPathVersion; +import net.sourceforge.pmd.lang.rule.xpath.impl.XPathHandler; import net.sourceforge.pmd.lang.rule.xpath.internal.DeprecatedAttrLogger; import net.sourceforge.pmd.lang.rule.xpath.internal.SaxonXPathRuleQuery; +import net.sourceforge.pmd.processor.ThreadSafeAnalysisListener; import net.sourceforge.pmd.properties.PropertyDescriptor; import net.sourceforge.pmd.properties.PropertyFactory; import net.sourceforge.pmd.testframework.RuleTst; @@ -111,33 +112,30 @@ public class XPathRuleTest extends RuleTst { @Test public void testImageOfPrimarySuffix() throws Exception { final String SUFFIX = "import java.io.File;\n" + "\n" + "public class TestSuffix {\n" - + " public static void main(String args[]) {\n" + " new File(\"subdirectory\").list();\n" - + " }\n" + "}"; - LanguageVersion language = LanguageRegistry.getLanguage(JavaLanguageModule.NAME).getDefaultVersion(); + + " public static void main(String args[]) {\n" + " new File(\"subdirectory\").list();\n" + + " }\n" + "}"; ASTCompilationUnit cu = JavaParsingHelper.WITH_PROCESSING.parse(SUFFIX); - RuleContext ruleContext = new RuleContext(); - ruleContext.setLanguageVersion(language); + try (RuleContext ruleContext = new RuleContext(ThreadSafeAnalysisListener.noop())) { - String xpath = "//PrimarySuffix[@Image='list']"; + String xpath = "//PrimarySuffix[@Image='list']"; - // XPATH version 2.0 - SaxonXPathRuleQuery xpathRuleQuery = new SaxonXPathRuleQuery(xpath, - XPathVersion.XPATH_2_0, - new HashMap<>(), - language.getLanguageVersionHandler().getXPathHandler(), - DeprecatedAttrLogger.noop()); - List nodes = xpathRuleQuery.evaluate(cu); - assertEquals(1, nodes.size()); + SaxonXPathRuleQuery xpathRuleQuery = new SaxonXPathRuleQuery(xpath, + XPathVersion.DEFAULT, + new HashMap<>(), + XPathHandler.noFunctionDefinitions(), + DeprecatedAttrLogger.noop()); + List nodes = xpathRuleQuery.evaluate(cu); + assertEquals(1, nodes.size()); + } } /** * Following sibling check: See https://sourceforge.net/p/pmd/bugs/1209/ * - * @throws Exception - * any error + * @throws Exception any error */ @Test - public void testFollowingSibling() { + public void testFollowingSibling() throws Exception { final String source = "public class dummy {\n" + " public String toString() {\n" + " String test = \"bad example\";\n" @@ -145,23 +143,22 @@ public class XPathRuleTest extends RuleTst { + " return test;\n" + " }\n" + "}"; - LanguageVersion language = LanguageRegistry.getLanguage(JavaLanguageModule.NAME).getDefaultVersion(); ASTCompilationUnit cu = JavaParsingHelper.WITH_PROCESSING.parse(source); - RuleContext ruleContext = new RuleContext(); - ruleContext.setLanguageVersion(language); + try (RuleContext ruleContext = new RuleContext(ThreadSafeAnalysisListener.noop())) { - String xpath = "//Block/BlockStatement/following-sibling::BlockStatement"; + String xpath = "//Block/BlockStatement/following-sibling::BlockStatement"; - // XPATH version 2.0 - SaxonXPathRuleQuery xpathRuleQuery = new SaxonXPathRuleQuery(xpath, - XPathVersion.XPATH_2_0, - new HashMap<>(), - language.getLanguageVersionHandler().getXPathHandler(), - DeprecatedAttrLogger.noop()); - List nodes = xpathRuleQuery.evaluate(cu); - assertEquals(2, nodes.size()); - assertEquals(4, nodes.get(0).getBeginLine()); - assertEquals(5, nodes.get(1).getBeginLine()); + + SaxonXPathRuleQuery xpathRuleQuery = new SaxonXPathRuleQuery(xpath, + XPathVersion.DEFAULT, + new HashMap<>(), + XPathHandler.noFunctionDefinitions(), + DeprecatedAttrLogger.noop()); + List nodes = xpathRuleQuery.evaluate(cu); + assertEquals(2, nodes.size()); + assertEquals(4, nodes.get(0).getBeginLine()); + assertEquals(5, nodes.get(1).getBeginLine()); + } } private static Report getReportForTestString(Rule r, String test) throws PMDException { diff --git a/pmd-javascript/src/main/java/net/sourceforge/pmd/lang/ecmascript/ast/ASTAstRoot.java b/pmd-javascript/src/main/java/net/sourceforge/pmd/lang/ecmascript/ast/ASTAstRoot.java index c87c140b95..f8c6194af5 100644 --- a/pmd-javascript/src/main/java/net/sourceforge/pmd/lang/ecmascript/ast/ASTAstRoot.java +++ b/pmd-javascript/src/main/java/net/sourceforge/pmd/lang/ecmascript/ast/ASTAstRoot.java @@ -9,16 +9,27 @@ import java.util.Map; import org.mozilla.javascript.ast.AstRoot; +import net.sourceforge.pmd.lang.LanguageVersion; import net.sourceforge.pmd.lang.ast.RootNode; public final class ASTAstRoot extends AbstractEcmascriptNode implements RootNode { private Map noPmdComments = Collections.emptyMap(); + private LanguageVersion languageVersion; public ASTAstRoot(AstRoot astRoot) { super(astRoot); } + @Override + public LanguageVersion getLanguageVersion() { + return languageVersion; + } + + void setLanguageVersion(LanguageVersion languageVersion) { + this.languageVersion = languageVersion; + } + @Override protected R acceptJsVisitor(EcmascriptVisitor visitor, P data) { return visitor.visit(this, data); diff --git a/pmd-javascript/src/main/java/net/sourceforge/pmd/lang/ecmascript/ast/EcmascriptParser.java b/pmd-javascript/src/main/java/net/sourceforge/pmd/lang/ecmascript/ast/EcmascriptParser.java index 18aae28613..11e458c81b 100644 --- a/pmd-javascript/src/main/java/net/sourceforge/pmd/lang/ecmascript/ast/EcmascriptParser.java +++ b/pmd-javascript/src/main/java/net/sourceforge/pmd/lang/ecmascript/ast/EcmascriptParser.java @@ -23,14 +23,8 @@ import net.sourceforge.pmd.lang.ecmascript.EcmascriptParserOptions; public class EcmascriptParser { protected final EcmascriptParserOptions parserOptions; - private Map suppressMap; - private String suppressMarker = "NOPMD"; // that's the default value - public EcmascriptParser(EcmascriptParserOptions parserOptions) { this.parserOptions = parserOptions; - if (parserOptions.getSuppressMarker() != null) { - suppressMarker = parserOptions.getSuppressMarker(); - } } protected AstRoot parseEcmascript(final String sourceCode, final List parseProblems) @@ -62,8 +56,10 @@ public class EcmascriptParser { final AstRoot astRoot = parseEcmascript(sourceCode, parseProblems); final EcmascriptTreeBuilder treeBuilder = new EcmascriptTreeBuilder(sourceCode, parseProblems); ASTAstRoot tree = (ASTAstRoot) treeBuilder.build(astRoot); + tree.setLanguageVersion(task.getLanguageVersion()); - suppressMap = new HashMap<>(); + String suppressMarker = task.getCommentMarker(); + Map suppressMap = new HashMap<>(); if (astRoot.getComments() != null) { for (Comment comment : astRoot.getComments()) { int nopmd = comment.getValue().indexOf(suppressMarker); @@ -78,7 +74,4 @@ public class EcmascriptParser { return tree; } - public Map getSuppressMap() { - return suppressMap; - } } diff --git a/pmd-jsp/src/main/java/net/sourceforge/pmd/lang/jsp/ast/ASTCompilationUnit.java b/pmd-jsp/src/main/java/net/sourceforge/pmd/lang/jsp/ast/ASTCompilationUnit.java index 0c1a148d33..b504899846 100644 --- a/pmd-jsp/src/main/java/net/sourceforge/pmd/lang/jsp/ast/ASTCompilationUnit.java +++ b/pmd-jsp/src/main/java/net/sourceforge/pmd/lang/jsp/ast/ASTCompilationUnit.java @@ -4,14 +4,27 @@ package net.sourceforge.pmd.lang.jsp.ast; +import net.sourceforge.pmd.lang.LanguageVersion; import net.sourceforge.pmd.lang.ast.RootNode; public final class ASTCompilationUnit extends AbstractJspNode implements RootNode { + private LanguageVersion languageVersion; + ASTCompilationUnit(int id) { super(id); } + @Override + public LanguageVersion getLanguageVersion() { + return languageVersion; + } + + ASTCompilationUnit setLanguageVersion(LanguageVersion languageVersion) { + this.languageVersion = languageVersion; + return this; + } + @Override protected R acceptVisitor(JspVisitor visitor, P data) { return visitor.visit(this, data); diff --git a/pmd-jsp/src/main/java/net/sourceforge/pmd/lang/jsp/ast/JspParser.java b/pmd-jsp/src/main/java/net/sourceforge/pmd/lang/jsp/ast/JspParser.java index e0380cf30e..bef51acd48 100644 --- a/pmd-jsp/src/main/java/net/sourceforge/pmd/lang/jsp/ast/JspParser.java +++ b/pmd-jsp/src/main/java/net/sourceforge/pmd/lang/jsp/ast/JspParser.java @@ -6,6 +6,7 @@ package net.sourceforge.pmd.lang.jsp.ast; import org.checkerframework.checker.nullness.qual.Nullable; +import net.sourceforge.pmd.lang.LanguageVersion; import net.sourceforge.pmd.lang.ast.CharStream; import net.sourceforge.pmd.lang.ast.ParseException; import net.sourceforge.pmd.lang.ast.impl.javacc.JavaccTokenDocument; @@ -27,8 +28,8 @@ public final class JspParser extends JjtreeParserAdapter { } @Override - protected ASTCompilationUnit parseImpl(CharStream cs, String suppressMarker) throws ParseException { - return new JspParserImpl(cs).CompilationUnit(); + protected ASTCompilationUnit parseImpl(CharStream cs, String suppressMarker, LanguageVersion languageVersion) throws ParseException { + return new JspParserImpl(cs).CompilationUnit().setLanguageVersion(languageVersion); } } diff --git a/pmd-jsp/src/test/java/net/sourceforge/pmd/lang/jsp/ast/XPathJspRuleTest.java b/pmd-jsp/src/test/java/net/sourceforge/pmd/lang/jsp/ast/XPathJspRuleTest.java index 9e21527423..0d2b1be161 100644 --- a/pmd-jsp/src/test/java/net/sourceforge/pmd/lang/jsp/ast/XPathJspRuleTest.java +++ b/pmd-jsp/src/test/java/net/sourceforge/pmd/lang/jsp/ast/XPathJspRuleTest.java @@ -4,26 +4,20 @@ package net.sourceforge.pmd.lang.jsp.ast; -import static net.sourceforge.pmd.util.CollectionUtil.listOf; import static org.junit.Assert.assertEquals; import org.junit.Test; -import net.sourceforge.pmd.PMDConfiguration; import net.sourceforge.pmd.PMDException; import net.sourceforge.pmd.Report; import net.sourceforge.pmd.Rule; -import net.sourceforge.pmd.RuleContext; -import net.sourceforge.pmd.RuleSet; import net.sourceforge.pmd.RuleViolation; -import net.sourceforge.pmd.RulesetsFactoryUtils; import net.sourceforge.pmd.lang.LanguageRegistry; import net.sourceforge.pmd.lang.jsp.JspLanguageModule; import net.sourceforge.pmd.lang.rule.XPathRule; import net.sourceforge.pmd.lang.rule.xpath.XPathVersion; -import net.sourceforge.pmd.processor.PmdRunnable; +import net.sourceforge.pmd.lang.rule.xpath.XPathVersion; import net.sourceforge.pmd.testframework.RuleTst; -import net.sourceforge.pmd.util.datasource.DataSource; public class XPathJspRuleTest extends RuleTst { @@ -37,14 +31,7 @@ public class XPathJspRuleTest extends RuleTst { rule.setMessage("Test"); rule.setLanguage(LanguageRegistry.getLanguage(JspLanguageModule.NAME)); - RuleSet rules = RulesetsFactoryUtils.defaultFactory().createSingleRuleRuleSet(rule); - - Report report = new PmdRunnable( - DataSource.forString(MATCH, "test.jsp"), - RuleContext.throwingExceptions(), - listOf(rules), - new PMDConfiguration() - ).call(); + Report report = JspParsingHelper.DEFAULT.executeRule(rule, MATCH); assertEquals("One violation expected!", 1, report.getViolations().size()); 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 7ecbe3f4d0..fc5c9440a9 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 @@ -214,5 +214,9 @@ abstract class BaseParsingHelper, T : RootNode return reportBuilder.report } + @JvmOverloads + fun executeRuleOnResource(rule: Rule, resourcePath: String, configuration: PMDConfiguration = PMDConfiguration()): Report = + executeRule(rule, readResource(resourcePath), configuration) + } diff --git a/pmd-modelica/src/main/java/net/sourceforge/pmd/lang/modelica/ast/ASTStoredDefinition.java b/pmd-modelica/src/main/java/net/sourceforge/pmd/lang/modelica/ast/ASTStoredDefinition.java index 0bf29bffc5..6220b055a0 100644 --- a/pmd-modelica/src/main/java/net/sourceforge/pmd/lang/modelica/ast/ASTStoredDefinition.java +++ b/pmd-modelica/src/main/java/net/sourceforge/pmd/lang/modelica/ast/ASTStoredDefinition.java @@ -4,6 +4,7 @@ package net.sourceforge.pmd.lang.modelica.ast; +import net.sourceforge.pmd.lang.LanguageVersion; import net.sourceforge.pmd.lang.ast.RootNode; import net.sourceforge.pmd.lang.modelica.resolver.CompositeName; @@ -12,6 +13,7 @@ import net.sourceforge.pmd.lang.modelica.resolver.CompositeName; */ public class ASTStoredDefinition extends AbstractModelicaNode implements RootNode { private boolean hasBOM = false; + private LanguageVersion languageVersion; ASTStoredDefinition(int id) { super(id); @@ -26,6 +28,16 @@ public class ASTStoredDefinition extends AbstractModelicaNode implements RootNod hasBOM = true; } + @Override + public LanguageVersion getLanguageVersion() { + return languageVersion; + } + + ASTStoredDefinition setLanguageVersion(LanguageVersion languageVersion) { + this.languageVersion = languageVersion; + return this; + } + /** * Returns whether this source file contains Byte Order Mark. */ 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 b3d2a88abe..aef19b525d 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,6 +4,7 @@ package net.sourceforge.pmd.lang.modelica.ast; +import net.sourceforge.pmd.lang.LanguageVersion; import net.sourceforge.pmd.lang.ast.CharStream; import net.sourceforge.pmd.lang.ast.ParseException; import net.sourceforge.pmd.lang.ast.impl.javacc.JavaccTokenDocument; @@ -18,8 +19,8 @@ public class ModelicaParser extends JjtreeParserAdapter { } @Override - protected ASTStoredDefinition parseImpl(CharStream cs, String suppressMarker) throws ParseException { - return new ModelicaParserImpl(cs).StoredDefinition(); + protected ASTStoredDefinition parseImpl(CharStream cs, String suppressMarker, LanguageVersion languageVersion) throws ParseException { + return new ModelicaParserImpl(cs).StoredDefinition().setLanguageVersion(languageVersion); } } diff --git a/pmd-plsql/src/main/java/net/sourceforge/pmd/lang/plsql/ast/ASTInput.java b/pmd-plsql/src/main/java/net/sourceforge/pmd/lang/plsql/ast/ASTInput.java index fd4851ea56..c900c57c00 100644 --- a/pmd-plsql/src/main/java/net/sourceforge/pmd/lang/plsql/ast/ASTInput.java +++ b/pmd-plsql/src/main/java/net/sourceforge/pmd/lang/plsql/ast/ASTInput.java @@ -4,14 +4,27 @@ package net.sourceforge.pmd.lang.plsql.ast; +import net.sourceforge.pmd.lang.LanguageVersion; import net.sourceforge.pmd.lang.ast.RootNode; public final class ASTInput extends AbstractPLSQLNode implements RootNode { + private LanguageVersion languageVersion; + ASTInput(int id) { super(id); } + @Override + public LanguageVersion getLanguageVersion() { + return languageVersion; + } + + ASTInput setLanguageVersion(LanguageVersion languageVersion) { + this.languageVersion = languageVersion; + return this; + } + @Override public Object jjtAccept(PLSQLParserVisitor visitor, Object data) { return visitor.visit(this, data); diff --git a/pmd-plsql/src/main/java/net/sourceforge/pmd/lang/plsql/ast/PLSQLParser.java b/pmd-plsql/src/main/java/net/sourceforge/pmd/lang/plsql/ast/PLSQLParser.java index ec4550a91f..e3be5d4ab6 100644 --- a/pmd-plsql/src/main/java/net/sourceforge/pmd/lang/plsql/ast/PLSQLParser.java +++ b/pmd-plsql/src/main/java/net/sourceforge/pmd/lang/plsql/ast/PLSQLParser.java @@ -6,6 +6,7 @@ package net.sourceforge.pmd.lang.plsql.ast; import org.checkerframework.checker.nullness.qual.Nullable; +import net.sourceforge.pmd.lang.LanguageVersion; import net.sourceforge.pmd.lang.ast.CharStream; import net.sourceforge.pmd.lang.ast.ParseException; import net.sourceforge.pmd.lang.ast.impl.javacc.JavaccTokenDocument; @@ -24,8 +25,8 @@ public class PLSQLParser extends JjtreeParserAdapter { } @Override - protected ASTInput parseImpl(CharStream cs, String suppressMarker) throws ParseException { - return new PLSQLParserImpl(cs).Input(); + protected ASTInput parseImpl(CharStream cs, String suppressMarker, LanguageVersion languageVersion) throws ParseException { + return new PLSQLParserImpl(cs).Input().setLanguageVersion(languageVersion); } } diff --git a/pmd-plsql/src/test/java/net/sourceforge/pmd/lang/plsql/PLSQLXPathRuleTest.java b/pmd-plsql/src/test/java/net/sourceforge/pmd/lang/plsql/PLSQLXPathRuleTest.java index 37c387d69e..a585591d04 100644 --- a/pmd-plsql/src/test/java/net/sourceforge/pmd/lang/plsql/PLSQLXPathRuleTest.java +++ b/pmd-plsql/src/test/java/net/sourceforge/pmd/lang/plsql/PLSQLXPathRuleTest.java @@ -59,7 +59,6 @@ public class PLSQLXPathRuleTest extends AbstractPLSQLParserTst { ReportBuilderListener reportBuilder = new ReportBuilderListener(); try (RuleContext ctx = new RuleContext()) { - ctx.setLanguageVersion(plsql.getDefaultVersion()); rule.apply(node, ctx); } diff --git a/pmd-scala-modules/pmd-scala-common/src/main/java/net/sourceforge/pmd/lang/scala/ast/ASTSource.java b/pmd-scala-modules/pmd-scala-common/src/main/java/net/sourceforge/pmd/lang/scala/ast/ASTSource.java index a95556f4ef..a19f70bfda 100644 --- a/pmd-scala-modules/pmd-scala-common/src/main/java/net/sourceforge/pmd/lang/scala/ast/ASTSource.java +++ b/pmd-scala-modules/pmd-scala-common/src/main/java/net/sourceforge/pmd/lang/scala/ast/ASTSource.java @@ -4,6 +4,7 @@ package net.sourceforge.pmd.lang.scala.ast; +import net.sourceforge.pmd.lang.LanguageVersion; import net.sourceforge.pmd.lang.ast.RootNode; import scala.meta.Source; @@ -13,10 +14,21 @@ import scala.meta.Source; */ public final class ASTSource extends AbstractScalaNode implements RootNode { + private LanguageVersion languageVersion; + ASTSource(Source scalaNode) { super(scalaNode); } + @Override + public LanguageVersion getLanguageVersion() { + return languageVersion; + } + + void setLanguageVersion(LanguageVersion languageVersion) { + this.languageVersion = languageVersion; + } + @Override protected R acceptVisitor(ScalaParserVisitor visitor, P data) { return visitor.visit(this, data); diff --git a/pmd-scala-modules/pmd-scala-common/src/main/java/net/sourceforge/pmd/lang/scala/ast/ScalaParser.java b/pmd-scala-modules/pmd-scala-common/src/main/java/net/sourceforge/pmd/lang/scala/ast/ScalaParser.java index fd4bb04d77..6c6d2c0641 100644 --- a/pmd-scala-modules/pmd-scala-common/src/main/java/net/sourceforge/pmd/lang/scala/ast/ScalaParser.java +++ b/pmd-scala-modules/pmd-scala-common/src/main/java/net/sourceforge/pmd/lang/scala/ast/ScalaParser.java @@ -38,7 +38,9 @@ public final class ScalaParser implements Parser { public ASTSource parse(ParserTask task) throws ParseException { Input.VirtualFile virtualFile = new Input.VirtualFile(task.getFileDisplayName(), task.getSourceText()); Source src = new ScalametaParser(virtualFile, dialect).parseSource(); - return (ASTSource) new ScalaTreeBuilder().build(src); + ASTSource root = (ASTSource) new ScalaTreeBuilder().build(src); + root.setLanguageVersion(task.getLanguageVersion()); + return root; } } diff --git a/pmd-scala-modules/pmd-scala-common/src/test/java/net/sourceforge/pmd/lang/scala/ast/ScalaParsingHelper.java b/pmd-scala-modules/pmd-scala-common/src/test/java/net/sourceforge/pmd/lang/scala/ast/ScalaParsingHelper.java index 251210f4ed..111815dbca 100644 --- a/pmd-scala-modules/pmd-scala-common/src/test/java/net/sourceforge/pmd/lang/scala/ast/ScalaParsingHelper.java +++ b/pmd-scala-modules/pmd-scala-common/src/test/java/net/sourceforge/pmd/lang/scala/ast/ScalaParsingHelper.java @@ -4,18 +4,8 @@ package net.sourceforge.pmd.lang.scala.ast; -import static net.sourceforge.pmd.util.CollectionUtil.listOf; - -import net.sourceforge.pmd.PMDConfiguration; -import net.sourceforge.pmd.Report; -import net.sourceforge.pmd.Rule; -import net.sourceforge.pmd.RuleContext; -import net.sourceforge.pmd.RuleSet; -import net.sourceforge.pmd.RulesetsFactoryUtils; import net.sourceforge.pmd.lang.ast.test.BaseParsingHelper; import net.sourceforge.pmd.lang.scala.ScalaLanguageModule; -import net.sourceforge.pmd.processor.PmdRunnable; -import net.sourceforge.pmd.util.datasource.DataSource; public final class ScalaParsingHelper extends BaseParsingHelper { @@ -31,17 +21,4 @@ public final class ScalaParsingHelper extends BaseParsingHelper { DummyRootNode node = new DummyRootNode(); node.setCoords(1, 1, 1, 2); + node.setLanguageVersion(task.getLanguageVersion()); node.setImage("Foo"); return node; }; @@ -52,6 +54,20 @@ public class DummyLanguageModule extends BaseLanguageModule { public static class DummyRootNode extends DummyNode implements RootNode { + + private LanguageVersion languageVersion; + + @Override + public LanguageVersion getLanguageVersion() { + return languageVersion; + } + + public DummyRootNode setLanguageVersion(LanguageVersion languageVersion) { + this.languageVersion = languageVersion; + return this; + } + + } diff --git a/pmd-visualforce/src/main/java/net/sourceforge/pmd/lang/vf/ast/ASTCompilationUnit.java b/pmd-visualforce/src/main/java/net/sourceforge/pmd/lang/vf/ast/ASTCompilationUnit.java index 33e14f1fe3..7dede888f9 100644 --- a/pmd-visualforce/src/main/java/net/sourceforge/pmd/lang/vf/ast/ASTCompilationUnit.java +++ b/pmd-visualforce/src/main/java/net/sourceforge/pmd/lang/vf/ast/ASTCompilationUnit.java @@ -4,14 +4,27 @@ package net.sourceforge.pmd.lang.vf.ast; +import net.sourceforge.pmd.lang.LanguageVersion; import net.sourceforge.pmd.lang.ast.RootNode; public final class ASTCompilationUnit extends AbstractVfNode implements RootNode { + private LanguageVersion languageVersion; + ASTCompilationUnit(int id) { super(id); } + @Override + public LanguageVersion getLanguageVersion() { + return languageVersion; + } + + ASTCompilationUnit setLanguageVersion(LanguageVersion languageVersion) { + this.languageVersion = languageVersion; + return this; + } + @Override public Object jjtAccept(VfParserVisitor visitor, Object data) { return visitor.visit(this, data); diff --git a/pmd-visualforce/src/main/java/net/sourceforge/pmd/lang/vf/ast/VfParser.java b/pmd-visualforce/src/main/java/net/sourceforge/pmd/lang/vf/ast/VfParser.java index bc33ababc8..b28525735c 100644 --- a/pmd-visualforce/src/main/java/net/sourceforge/pmd/lang/vf/ast/VfParser.java +++ b/pmd-visualforce/src/main/java/net/sourceforge/pmd/lang/vf/ast/VfParser.java @@ -6,6 +6,7 @@ package net.sourceforge.pmd.lang.vf.ast; import org.checkerframework.checker.nullness.qual.Nullable; +import net.sourceforge.pmd.lang.LanguageVersion; import net.sourceforge.pmd.lang.ast.CharStream; import net.sourceforge.pmd.lang.ast.ParseException; import net.sourceforge.pmd.lang.ast.impl.javacc.JavaccTokenDocument; @@ -27,8 +28,8 @@ public final class VfParser extends JjtreeParserAdapter { } @Override - protected ASTCompilationUnit parseImpl(CharStream cs, String suppressMarker) throws ParseException { - return new VfParserImpl(cs).CompilationUnit(); + protected ASTCompilationUnit parseImpl(CharStream cs, String suppressMarker, LanguageVersion languageVersion) throws ParseException { + return new VfParserImpl(cs).CompilationUnit().setLanguageVersion(languageVersion); } } diff --git a/pmd-vm/src/main/java/net/sourceforge/pmd/lang/vm/ast/ASTTemplate.java b/pmd-vm/src/main/java/net/sourceforge/pmd/lang/vm/ast/ASTTemplate.java index a3c3b31388..5985079b84 100644 --- a/pmd-vm/src/main/java/net/sourceforge/pmd/lang/vm/ast/ASTTemplate.java +++ b/pmd-vm/src/main/java/net/sourceforge/pmd/lang/vm/ast/ASTTemplate.java @@ -4,14 +4,27 @@ package net.sourceforge.pmd.lang.vm.ast; +import net.sourceforge.pmd.lang.LanguageVersion; import net.sourceforge.pmd.lang.ast.RootNode; public final class ASTTemplate extends AbstractVmNode implements RootNode { + private LanguageVersion languageVersion; + public ASTTemplate(int id) { super(id); } + @Override + public LanguageVersion getLanguageVersion() { + return languageVersion; + } + + ASTTemplate setLanguageVersion(LanguageVersion languageVersion) { + this.languageVersion = languageVersion; + return this; + } + @Override public Object jjtAccept(VmParserVisitor visitor, Object data) { diff --git a/pmd-vm/src/main/java/net/sourceforge/pmd/lang/vm/ast/VmParser.java b/pmd-vm/src/main/java/net/sourceforge/pmd/lang/vm/ast/VmParser.java index d89e848f35..b55be62bf2 100644 --- a/pmd-vm/src/main/java/net/sourceforge/pmd/lang/vm/ast/VmParser.java +++ b/pmd-vm/src/main/java/net/sourceforge/pmd/lang/vm/ast/VmParser.java @@ -6,6 +6,7 @@ package net.sourceforge.pmd.lang.vm.ast; import org.checkerframework.checker.nullness.qual.Nullable; +import net.sourceforge.pmd.lang.LanguageVersion; import net.sourceforge.pmd.lang.ast.CharStream; import net.sourceforge.pmd.lang.ast.ParseException; import net.sourceforge.pmd.lang.ast.impl.javacc.JavaccToken; @@ -23,8 +24,8 @@ public class VmParser extends JjtreeParserAdapter { } @Override - protected ASTTemplate parseImpl(CharStream cs, String suppressMarker) throws ParseException { - return new VmParserImpl(cs).Template(); + protected ASTTemplate parseImpl(CharStream cs, String suppressMarker, LanguageVersion languageVersion) throws ParseException { + return new VmParserImpl(cs).Template().setLanguageVersion(languageVersion); } diff --git a/pmd-xml/src/main/java/net/sourceforge/pmd/lang/xml/ast/internal/XmlParserImpl.java b/pmd-xml/src/main/java/net/sourceforge/pmd/lang/xml/ast/internal/XmlParserImpl.java index f61ada28a8..762fc9cdcc 100644 --- a/pmd-xml/src/main/java/net/sourceforge/pmd/lang/xml/ast/internal/XmlParserImpl.java +++ b/pmd-xml/src/main/java/net/sourceforge/pmd/lang/xml/ast/internal/XmlParserImpl.java @@ -17,6 +17,7 @@ import org.w3c.dom.Node; import org.xml.sax.InputSource; import org.xml.sax.SAXException; +import net.sourceforge.pmd.lang.LanguageVersion; import net.sourceforge.pmd.lang.Parser.ParserTask; import net.sourceforge.pmd.lang.ast.ParseException; import net.sourceforge.pmd.lang.ast.RootNode; @@ -27,7 +28,7 @@ import net.sourceforge.pmd.lang.xml.ast.XmlNode; public class XmlParserImpl { private final XmlParserOptions parserOptions; - private Map nodeCache = new HashMap<>(); + private final Map nodeCache = new HashMap<>(); public XmlParserImpl(XmlParserOptions parserOptions) { @@ -61,7 +62,7 @@ public class XmlParserImpl { public RootXmlNode parse(ParserTask task) { String xmlData = task.getSourceText(); Document document = parseDocument(xmlData); - RootXmlNode root = new RootXmlNode(this, document); + RootXmlNode root = new RootXmlNode(this, document, task.getLanguageVersion()); DOMLineNumbers lineNumbers = new DOMLineNumbers(root, xmlData); lineNumbers.determine(); nodeCache.put(document, root); @@ -90,8 +91,17 @@ public class XmlParserImpl { * The root should implement {@link RootNode}. */ public static class RootXmlNode extends XmlNodeWrapper implements RootNode { - RootXmlNode(XmlParserImpl parser, Node domNode) { + + private final LanguageVersion languageVersion; + + RootXmlNode(XmlParserImpl parser, Node domNode, LanguageVersion languageVersion) { super(parser, domNode); + this.languageVersion = languageVersion; + } + + @Override + public LanguageVersion getLanguageVersion() { + return languageVersion; } }