From f8f11715a6fb80eff4b53d468cbb7e09e98eb264 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Fournier?= Date: Sun, 15 Nov 2020 20:08:47 +0100 Subject: [PATCH 1/3] Fix merge --- .../main/java/net/sourceforge/pmd/PMD.java | 7 +- .../java/net/sourceforge/pmd/RuleContext.java | 2 +- .../net/sourceforge/pmd/RuleSetFactory.java | 3 - .../net/sourceforge/pmd/RuleSetLoader.java | 4 +- .../java/net/sourceforge/pmd/RuleSets.java | 2 +- .../pmd/ant/internal/PMDTaskImpl.java | 17 +++-- .../lang/rule/ParametricRuleViolation.java | 2 +- .../lang/rule/internal/RuleApplicator.java | 6 +- .../pmd/processor/MonoThreadProcessor.java | 22 ++++-- .../pmd/processor/PmdRunnable.java | 8 +-- .../pmd/reporting/package-info.java | 12 ++++ .../net/sourceforge/pmd/AbstractRuleTest.java | 4 +- .../java/net/sourceforge/pmd/ReportTest.java | 3 +- .../pmd/RuleViolationComparatorTest.java | 3 +- .../sourceforge/pmd/RuleViolationTest.java | 13 ++-- .../pmd/lang/DummyLanguageModule.java | 2 +- .../sourceforge/pmd/lang/ast/DummyNode.java | 5 ++ .../pmd/processor/GlobalListenerTest.java | 2 +- .../processor/MultiThreadProcessorTest.java | 2 +- .../PmdRunnableTest.java} | 68 ++++++++++--------- .../pmd/renderers/AbstractRendererTest.java | 3 +- .../pmd/renderers/XMLRendererTest.java | 3 +- .../pmd/renderers/XSLTRendererTest.java | 3 +- .../pmd/docs/GenerateRuleDocsCmd.java | 2 +- .../pmd/AbstractRuleSetFactoryTest.java | 4 +- 25 files changed, 119 insertions(+), 83 deletions(-) create mode 100644 pmd-core/src/main/java/net/sourceforge/pmd/reporting/package-info.java rename pmd-core/src/test/java/net/sourceforge/pmd/{SourceCodeProcessorTest.java => processor/PmdRunnableTest.java} (53%) diff --git a/pmd-core/src/main/java/net/sourceforge/pmd/PMD.java b/pmd-core/src/main/java/net/sourceforge/pmd/PMD.java index 49eaa49cfe..c40154b7e8 100644 --- a/pmd-core/src/main/java/net/sourceforge/pmd/PMD.java +++ b/pmd-core/src/main/java/net/sourceforge/pmd/PMD.java @@ -129,7 +129,11 @@ public final class PMD { // Load the RuleSets final RuleSetLoader ruleSetFactory = RuleSetLoader.fromPmdConfig(configuration); - final List ruleSets = RulesetsFactoryUtils.getRuleSetsWithBenchmark(configuration.getRuleSets(), ruleSetFactory); + + final List ruleSets; + try (TimedOperation ignored = TimeTracker.startOperation(TimedOperationCategory.LOAD_RULES)) { + ruleSets = RulesetsFactoryUtils.getRuleSets(configuration.getRuleSets(), ruleSetFactory); + } if (ruleSets == null) { return PMDCommandLineInterface.NO_ERRORS_STATUS; } @@ -262,7 +266,6 @@ public final class PMD { } return brokenRules; - return report; } 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 e0bbc1069a..2bacc0d051 100644 --- a/pmd-core/src/main/java/net/sourceforge/pmd/RuleContext.java +++ b/pmd-core/src/main/java/net/sourceforge/pmd/RuleContext.java @@ -69,7 +69,7 @@ public final class RuleContext { Objects.requireNonNull(message, "Message was null"); Objects.requireNonNull(formatArgs, "Format arguments were null, use an empty array"); - RuleViolationFactory fact = location.getLanguageVersion().getLanguageVersionHandler().getRuleViolationFactory(); + RuleViolationFactory fact = location.getAstInfo().getLanguageVersion().getLanguageVersionHandler().getRuleViolationFactory(); RuleViolation violation = fact.createViolation(rule, location, makeMessage(message, formatArgs)); if (beginLine != -1 && endLine != -1) { diff --git a/pmd-core/src/main/java/net/sourceforge/pmd/RuleSetFactory.java b/pmd-core/src/main/java/net/sourceforge/pmd/RuleSetFactory.java index d88e3c2d83..edf9ed427e 100644 --- a/pmd-core/src/main/java/net/sourceforge/pmd/RuleSetFactory.java +++ b/pmd-core/src/main/java/net/sourceforge/pmd/RuleSetFactory.java @@ -33,9 +33,6 @@ import org.xml.sax.InputSource; import org.xml.sax.SAXException; import net.sourceforge.pmd.RuleSet.RuleSetBuilder; -import net.sourceforge.pmd.lang.Language; -import net.sourceforge.pmd.lang.LanguageRegistry; -import net.sourceforge.pmd.lang.rule.MockRule; import net.sourceforge.pmd.lang.rule.RuleReference; import net.sourceforge.pmd.rules.RuleFactory; import net.sourceforge.pmd.util.ResourceLoader; diff --git a/pmd-core/src/main/java/net/sourceforge/pmd/RuleSetLoader.java b/pmd-core/src/main/java/net/sourceforge/pmd/RuleSetLoader.java index 032372ae7c..61364fafb0 100644 --- a/pmd-core/src/main/java/net/sourceforge/pmd/RuleSetLoader.java +++ b/pmd-core/src/main/java/net/sourceforge/pmd/RuleSetLoader.java @@ -185,7 +185,7 @@ public final class RuleSetLoader { public List getStandardRuleSets() throws RuleSetNotFoundException { String rulesetsProperties; List ruleSetReferenceIds = new ArrayList<>(); - for (Language language : LanguageRegistry.findWithRuleSupport()) { + for (Language language : LanguageRegistry.getLanguages()) { Properties props = new Properties(); rulesetsProperties = "category/" + language.getTerseName() + "/categories.properties"; try (InputStream inputStream = resourceLoader.loadClassPathResourceAsStreamOrThrow(rulesetsProperties)) { @@ -202,6 +202,6 @@ public final class RuleSetLoader { + System.getProperty("java.class.path"), ioe); } } - return toFactory().createRuleSets(ruleSetReferenceIds).getRuleSetsInternal(); + return toFactory().createRuleSets(ruleSetReferenceIds); } } diff --git a/pmd-core/src/main/java/net/sourceforge/pmd/RuleSets.java b/pmd-core/src/main/java/net/sourceforge/pmd/RuleSets.java index 0312f92a37..cabbd72164 100644 --- a/pmd-core/src/main/java/net/sourceforge/pmd/RuleSets.java +++ b/pmd-core/src/main/java/net/sourceforge/pmd/RuleSets.java @@ -135,7 +135,7 @@ public class RuleSets { ruleApplicator.index(root); } - File file = new File(root.getSourceCodeFile()); + File file = new File(root.getAstInfo().getFileName()); for (RuleSet ruleSet : ruleSets) { if (ruleSet.applies(file)) { ruleApplicator.apply(ruleSet.getRules(), listener); diff --git a/pmd-core/src/main/java/net/sourceforge/pmd/ant/internal/PMDTaskImpl.java b/pmd-core/src/main/java/net/sourceforge/pmd/ant/internal/PMDTaskImpl.java index fcef66adc8..b15053c006 100644 --- a/pmd-core/src/main/java/net/sourceforge/pmd/ant/internal/PMDTaskImpl.java +++ b/pmd-core/src/main/java/net/sourceforge/pmd/ant/internal/PMDTaskImpl.java @@ -4,6 +4,8 @@ package net.sourceforge.pmd.ant.internal; +import static java.util.Arrays.asList; + import java.io.File; import java.io.IOException; import java.util.ArrayList; @@ -24,11 +26,8 @@ import net.sourceforge.pmd.PMDConfiguration; import net.sourceforge.pmd.Rule; import net.sourceforge.pmd.RulePriority; import net.sourceforge.pmd.RuleSet; -import net.sourceforge.pmd.RuleSetFactory; -import net.sourceforge.pmd.RuleSetNotFoundException; import net.sourceforge.pmd.RuleSetLoader; -import net.sourceforge.pmd.RuleSets; -import net.sourceforge.pmd.RulesetsFactoryUtils; +import net.sourceforge.pmd.RuleSetNotFoundException; import net.sourceforge.pmd.ant.Formatter; import net.sourceforge.pmd.ant.PMDTask; import net.sourceforge.pmd.ant.SourceLanguage; @@ -40,7 +39,6 @@ import net.sourceforge.pmd.reporting.GlobalAnalysisListener; import net.sourceforge.pmd.reporting.GlobalAnalysisListener.ViolationCounterListener; import net.sourceforge.pmd.util.ClasspathClassLoader; import net.sourceforge.pmd.util.IOUtil; -import net.sourceforge.pmd.util.ResourceLoader; import net.sourceforge.pmd.util.datasource.DataSource; import net.sourceforge.pmd.util.datasource.FileDataSource; import net.sourceforge.pmd.util.log.AntLogHandler; @@ -113,7 +111,8 @@ public class PMDTaskImpl { // Substitute env variables/properties configuration.setRuleSets(project.replaceProperties(ruleSets)); } - rules = ruleSetFactory.createRuleSets(configuration.getRuleSets()); + List paths = asList(configuration.getRuleSets().split(",")); + rules = rulesetLoader.loadFromResources(paths); logRulesUsed(rules); } catch (RuleSetNotFoundException e) { throw new BuildException(e.getMessage(), e); @@ -202,7 +201,7 @@ public class PMDTaskImpl { }; } - private ResourceLoader setupResourceLoader() { + private ClassLoader setupResourceLoader() { if (classpath == null) { classpath = new Path(project); } @@ -219,8 +218,8 @@ public class PMDTaskImpl { // are loaded twice // and exist in multiple class loaders final boolean parentFirst = true; - return new ResourceLoader(new AntClassLoader(Thread.currentThread().getContextClassLoader(), - project, classpath, parentFirst)); + return new AntClassLoader(Thread.currentThread().getContextClassLoader(), + project, classpath, parentFirst); } private void setupClassLoader() { diff --git a/pmd-core/src/main/java/net/sourceforge/pmd/lang/rule/ParametricRuleViolation.java b/pmd-core/src/main/java/net/sourceforge/pmd/lang/rule/ParametricRuleViolation.java index 61b5d9a683..4a890624da 100644 --- a/pmd-core/src/main/java/net/sourceforge/pmd/lang/rule/ParametricRuleViolation.java +++ b/pmd-core/src/main/java/net/sourceforge/pmd/lang/rule/ParametricRuleViolation.java @@ -37,7 +37,7 @@ public class ParametricRuleViolation implements RuleViolation { public ParametricRuleViolation(Rule theRule, T node, String message) { this.rule = AssertionUtil.requireParamNotNull("rule", theRule); this.description = AssertionUtil.requireParamNotNull("message", message); - this.filename = node.getSourceCodeFile(); + this.filename = node.getAstInfo().getFileName(); beginLine = node.getBeginLine(); beginColumn = node.getBeginColumn(); 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 d7bed9d8ba..e0c5bcf611 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 @@ -54,7 +54,7 @@ public class RuleApplicator { Iterator targets = rule.getTargetSelector().getVisitedNodes(idx); while (targets.hasNext()) { Node node = targets.next(); - if (!RuleSet.applies(rule, node.getLanguageVersion())) { + if (!RuleSet.applies(rule, node.getAstInfo().getLanguageVersion())) { continue; } @@ -62,12 +62,12 @@ public class RuleApplicator { rule.apply(node, ctx); rcto.close(1); } catch (RuntimeException | StackOverflowError | AssertionError e) { - if (e instanceof Error && !SystemProps.isErrorRecoveryMode()) { + if (e instanceof Error && !SystemProps.isErrorRecoveryMode()) { // NOPMD throw e; } // The listener handles logging if needed, // it may also rethrow the error. - listener.onError(new ProcessingError(e, node.getSourceCodeFile())); + listener.onError(new ProcessingError(e, node.getAstInfo().getFileName())); } } } finally { diff --git a/pmd-core/src/main/java/net/sourceforge/pmd/processor/MonoThreadProcessor.java b/pmd-core/src/main/java/net/sourceforge/pmd/processor/MonoThreadProcessor.java index 37ea2794f6..eba5ac7332 100644 --- a/pmd-core/src/main/java/net/sourceforge/pmd/processor/MonoThreadProcessor.java +++ b/pmd-core/src/main/java/net/sourceforge/pmd/processor/MonoThreadProcessor.java @@ -25,12 +25,7 @@ final class MonoThreadProcessor extends AbstractPMDProcessor { @SuppressWarnings("PMD.CloseResource") // closed by the PMDRunnable public void processFiles(RuleSets rulesets, List files, GlobalAnalysisListener listener) { for (DataSource file : files) { - new PmdRunnable(file, listener, configuration) { - @Override - protected RuleSets getRulesets() { - return rulesets; - } - }.run(); + new MonothreadRunnable(rulesets, file, listener, configuration).run(); } } @@ -38,4 +33,19 @@ final class MonoThreadProcessor extends AbstractPMDProcessor { public void close() { // nothing to do } + + static final class MonothreadRunnable extends PmdRunnable { + + private final RuleSets ruleSets; + + MonothreadRunnable(RuleSets ruleSets, DataSource dataSource, GlobalAnalysisListener ruleContext, PMDConfiguration configuration) { + super(dataSource, ruleContext, configuration); + this.ruleSets = ruleSets; + } + + @Override + protected RuleSets getRulesets() { + return ruleSets; + } + } } 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 7216cc2cfc..7ef26fc25d 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 @@ -17,9 +17,9 @@ import net.sourceforge.pmd.benchmark.TimedOperationCategory; import net.sourceforge.pmd.internal.RulesetStageDependencyHelper; import net.sourceforge.pmd.internal.SystemProps; import net.sourceforge.pmd.lang.LanguageVersion; -import net.sourceforge.pmd.lang.Parser; -import net.sourceforge.pmd.lang.Parser.ParserTask; import net.sourceforge.pmd.lang.ast.FileAnalysisException; +import net.sourceforge.pmd.lang.ast.Parser; +import net.sourceforge.pmd.lang.ast.Parser.ParserTask; import net.sourceforge.pmd.lang.ast.RootNode; import net.sourceforge.pmd.lang.ast.SemanticErrorReporter; import net.sourceforge.pmd.reporting.FileAnalysisListener; @@ -78,7 +78,7 @@ abstract class PmdRunnable implements Runnable { try { processSource(listener, langVersion, ruleSets); } catch (Exception | StackOverflowError | AssertionError e) { - if (e instanceof Error && !SystemProps.isErrorRecoveryMode()) { + if (e instanceof Error && !SystemProps.isErrorRecoveryMode()) { // NOPMD: throw e; } configuration.getAnalysisCache().analysisFailed(file); @@ -92,7 +92,7 @@ abstract class PmdRunnable implements Runnable { } catch (FileAnalysisException e) { throw e; // bubble managed exceptions, they were already reported } catch (Exception e) { - throw FileAnalysisException.wrap(file.getPath(), "Exception while closing listener", e); + throw FileAnalysisException.wrap(file.getPath(), "An unknown exception occurred", e); } TimeTracker.finishThread(); diff --git a/pmd-core/src/main/java/net/sourceforge/pmd/reporting/package-info.java b/pmd-core/src/main/java/net/sourceforge/pmd/reporting/package-info.java new file mode 100644 index 0000000000..f78fc0ba7a --- /dev/null +++ b/pmd-core/src/main/java/net/sourceforge/pmd/reporting/package-info.java @@ -0,0 +1,12 @@ +/* + * BSD-style license; for more info see http://pmd.sourceforge.net/license.html + */ + +/** + * Logic about reporting: violations, suppression etc. + * + *

TODO move {@link net.sourceforge.pmd.Report}, {@link net.sourceforge.pmd.RuleViolation}, + * {@link net.sourceforge.pmd.RuleContext}, {@link net.sourceforge.pmd.ViolationSuppressor}, + * {@link net.sourceforge.pmd.lang.rule.RuleViolationFactory} into this package + */ +package net.sourceforge.pmd.reporting; 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 6045d4608f..edf68f1086 100644 --- a/pmd-core/src/test/java/net/sourceforge/pmd/AbstractRuleTest.java +++ b/pmd-core/src/test/java/net/sourceforge/pmd/AbstractRuleTest.java @@ -70,7 +70,7 @@ public class AbstractRuleTest { public void testCreateRV() { MyRule r = new MyRule(); r.setRuleSetName("foo"); - DummyNode s = new DummyNode().withFileName("filename"); + DummyNode s = new DummyRoot().withFileName("filename"); s.setCoords(5, 5, 5, 10); RuleViolation rv = new ParametricRuleViolation<>(r, s, r.getMessage()); assertEquals("Line number mismatch!", 5, rv.getBeginLine()); @@ -83,7 +83,7 @@ public class AbstractRuleTest { @Test public void testCreateRV2() { MyRule r = new MyRule(); - DummyNode s = new DummyNode().withFileName("filename"); + DummyNode s = new DummyRoot().withFileName("filename"); s.setCoords(5, 5, 5, 10); RuleViolation rv = new ParametricRuleViolation<>(r, s, "specificdescription"); assertEquals("Line number mismatch!", 5, rv.getBeginLine()); diff --git a/pmd-core/src/test/java/net/sourceforge/pmd/ReportTest.java b/pmd-core/src/test/java/net/sourceforge/pmd/ReportTest.java index abd4176fe0..491aa81284 100644 --- a/pmd-core/src/test/java/net/sourceforge/pmd/ReportTest.java +++ b/pmd-core/src/test/java/net/sourceforge/pmd/ReportTest.java @@ -13,6 +13,7 @@ import java.io.StringWriter; import org.junit.Test; import net.sourceforge.pmd.lang.ast.DummyNode; +import net.sourceforge.pmd.lang.ast.DummyRoot; import net.sourceforge.pmd.lang.ast.Node; import net.sourceforge.pmd.lang.rule.MockRule; import net.sourceforge.pmd.lang.rule.ParametricRuleViolation; @@ -64,8 +65,8 @@ public class ReportTest { } private static DummyNode getNode(int line, int column) { + DummyNode parent = new DummyRoot(); DummyNode s = new DummyNode(); - DummyNode parent = new DummyNode(); parent.setCoords(line, column, line, column + 1); parent.addChild(s, 0); s.setCoords(line, column, line, column + 1); diff --git a/pmd-core/src/test/java/net/sourceforge/pmd/RuleViolationComparatorTest.java b/pmd-core/src/test/java/net/sourceforge/pmd/RuleViolationComparatorTest.java index 01d69e9853..1474d3dfe6 100644 --- a/pmd-core/src/test/java/net/sourceforge/pmd/RuleViolationComparatorTest.java +++ b/pmd-core/src/test/java/net/sourceforge/pmd/RuleViolationComparatorTest.java @@ -16,6 +16,7 @@ import java.util.Random; import org.junit.Test; import net.sourceforge.pmd.lang.ast.DummyNode; +import net.sourceforge.pmd.lang.ast.DummyRoot; import net.sourceforge.pmd.lang.ast.Node; import net.sourceforge.pmd.lang.rule.MockRule; import net.sourceforge.pmd.lang.rule.ParametricRuleViolation; @@ -70,7 +71,7 @@ public class RuleViolationComparatorTest { private RuleViolation createJavaRuleViolation(Rule rule, String fileName, int beginLine, String description, int beginColumn, int endLine, int endColumn) { - DummyNode simpleNode = new DummyNode().withFileName(fileName); + DummyNode simpleNode = new DummyRoot().withFileName(fileName); simpleNode.setCoords(beginLine, beginColumn, endLine, endColumn); return new ParametricRuleViolation(rule, simpleNode, description); } diff --git a/pmd-core/src/test/java/net/sourceforge/pmd/RuleViolationTest.java b/pmd-core/src/test/java/net/sourceforge/pmd/RuleViolationTest.java index b00cf3b247..067c4a42e1 100644 --- a/pmd-core/src/test/java/net/sourceforge/pmd/RuleViolationTest.java +++ b/pmd-core/src/test/java/net/sourceforge/pmd/RuleViolationTest.java @@ -13,6 +13,7 @@ import org.junit.Ignore; import org.junit.Test; import net.sourceforge.pmd.lang.ast.DummyNode; +import net.sourceforge.pmd.lang.ast.DummyRoot; import net.sourceforge.pmd.lang.ast.Node; import net.sourceforge.pmd.lang.rule.MockRule; import net.sourceforge.pmd.lang.rule.ParametricRuleViolation; @@ -24,7 +25,7 @@ public class RuleViolationTest { @Test public void testConstructor1() { Rule rule = new MockRule("name", "desc", "msg", "rulesetname"); - DummyNode s = new DummyNode().withFileName("filename"); + DummyNode s = new DummyRoot().withFileName("filename"); s.setCoords(2, 1, 2, 3); RuleViolation r = new ParametricRuleViolation(rule, s, rule.getMessage()); assertEquals("object mismatch", rule, r.getRule()); @@ -35,7 +36,7 @@ public class RuleViolationTest { @Test public void testConstructor2() { Rule rule = new MockRule("name", "desc", "msg", "rulesetname"); - DummyNode s = new DummyNode().withFileName("filename"); + DummyNode s = new DummyRoot().withFileName("filename"); s.setCoords(2, 1, 2, 3); RuleViolation r = new ParametricRuleViolation(rule, s, "description"); assertEquals("object mismatch", rule, r.getRule()); @@ -48,10 +49,10 @@ public class RuleViolationTest { public void testComparatorWithDifferentFilenames() { Rule rule = new MockRule("name", "desc", "msg", "rulesetname"); Comparator comp = RuleViolation.DEFAULT_COMPARATOR; - DummyNode s = new DummyNode().withFileName("filename1"); + DummyNode s = new DummyRoot().withFileName("filename1"); s.setCoords(10, 1, 11, 3); RuleViolation r1 = new ParametricRuleViolation(rule, s, "description"); - DummyNode s1 = new DummyNode().withFileName("filename2"); + DummyNode s1 = new DummyRoot().withFileName("filename2"); s1.setCoords(10, 1, 11, 3); RuleViolation r2 = new ParametricRuleViolation(rule, s1, "description"); assertEquals(-1, comp.compare(r1, r2)); @@ -62,9 +63,9 @@ public class RuleViolationTest { public void testComparatorWithSameFileDifferentLines() { Rule rule = new MockRule("name", "desc", "msg", "rulesetname"); Comparator comp = RuleViolation.DEFAULT_COMPARATOR; - DummyNode s = new DummyNode().withFileName("filename1"); + DummyNode s = new DummyRoot().withFileName("filename1"); s.setCoords(10, 1, 15, 10); - DummyNode s1 = new DummyNode().withFileName("filename1"); + DummyNode s1 = new DummyRoot().withFileName("filename1"); s1.setCoords(20, 1, 25, 10); RuleViolation r1 = new ParametricRuleViolation(rule, s, "description"); RuleViolation r2 = new ParametricRuleViolation(rule, s1, "description"); 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 036bf0df8a..d3e9dae10f 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 @@ -65,7 +65,7 @@ public class DummyLanguageModule extends BaseLanguageModule { public static class HandlerWithParserThatThrows extends Handler { @Override public Parser getParser(ParserOptions parserOptions) { - return task -> { + return task -> { throw new AssertionError("test error while parsing"); }; } diff --git a/pmd-core/src/test/java/net/sourceforge/pmd/lang/ast/DummyNode.java b/pmd-core/src/test/java/net/sourceforge/pmd/lang/ast/DummyNode.java index 3594f8822e..eabd184a42 100644 --- a/pmd-core/src/test/java/net/sourceforge/pmd/lang/ast/DummyNode.java +++ b/pmd-core/src/test/java/net/sourceforge/pmd/lang/ast/DummyNode.java @@ -85,6 +85,11 @@ public class DummyNode extends AbstractNodeWithTextCoordinates rulesets; private LanguageVersion dummyThrows; private LanguageVersion dummyDefault; + private PMDConfiguration configuration; + private PmdRunnable pmdRunnable; + private GlobalReportBuilderListener reportBuilder; @Before public void prepare() { Language dummyLanguage = LanguageRegistry.findLanguageByTerseName(DummyLanguageModule.TERSE_NAME); dummyDefault = dummyLanguage.getDefaultVersion(); dummyThrows = dummyLanguage.getVersion("1.9-throws"); + DataSource dataSource = DataSource.forString("test", "test.dummy"); - processor = new SourceCodeProcessor(new PMDConfiguration()); - sourceCode = new StringReader("test"); Rule rule = new RuleThatThrows(); - rulesets = Arrays.asList(RulesetsFactoryUtils.defaultFactory().createSingleRuleRuleSet(rule)); + configuration = new PMDConfiguration(); + reportBuilder = new GlobalReportBuilderListener(); + pmdRunnable = new MonothreadRunnable(new RuleSets(RuleSet.forSingleRule(rule)), + dataSource, + reportBuilder, + configuration); - ctx = new RuleContext(); } @Test public void inErrorRecoveryModeErrorsShouldBeLoggedByParser() { System.setProperty(SystemProps.PMD_ERROR_RECOVERY, ""); - ctx.setLanguageVersion(dummyThrows); + configuration.setDefaultLanguageVersion(dummyThrows); - Assert.assertThrows(PMDException.class, () -> { - processor.processSourceCode(sourceCode, new RuleSets(rulesets), ctx); - }); - // the error is actually logged by PmdRunnable + pmdRunnable.run(); + reportBuilder.close(); + Assert.assertEquals(1, reportBuilder.getResult().getProcessingErrors().size()); } @Test - public void inErrorRecoveryModeErrorsShouldBeLoggedByRule() throws Exception { + public void inErrorRecoveryModeErrorsShouldBeLoggedByRule() { System.setProperty(SystemProps.PMD_ERROR_RECOVERY, ""); - ctx.setLanguageVersion(dummyDefault); + configuration.setDefaultLanguageVersion(dummyDefault); - processor.processSourceCode(sourceCode, new RuleSets(rulesets), ctx); - Assert.assertEquals(1, ctx.getReport().getProcessingErrors().size()); - Assert.assertSame(AssertionError.class, ctx.getReport().getProcessingErrors().get(0).getError().getClass()); + pmdRunnable.run(); + reportBuilder.close(); + Report report = reportBuilder.getResult(); + Assert.assertEquals(1, report.getProcessingErrors().size()); + Assert.assertSame(AssertionError.class, report.getProcessingErrors().get(0).getError().getClass()); } @Test public void withoutErrorRecoveryModeProcessingShouldBeAbortedByParser() { Assert.assertNull(System.getProperty(SystemProps.PMD_ERROR_RECOVERY)); - ctx.setLanguageVersion(dummyThrows); + configuration.setDefaultLanguageVersion(dummyThrows); - Assert.assertThrows(AssertionError.class, () -> { - processor.processSourceCode(sourceCode, new RuleSets(rulesets), ctx); - }); + Assert.assertThrows(AssertionError.class, pmdRunnable::run); } @Test public void withoutErrorRecoveryModeProcessingShouldBeAbortedByRule() { Assert.assertNull(System.getProperty(SystemProps.PMD_ERROR_RECOVERY)); - ctx.setLanguageVersion(dummyDefault); + configuration.setDefaultLanguageVersion(dummyDefault); - Assert.assertThrows(AssertionError.class, () -> { - processor.processSourceCode(sourceCode, new RuleSets(rulesets), ctx); - }); + Assert.assertThrows(AssertionError.class, pmdRunnable::run); } private static class RuleThatThrows extends AbstractRule { diff --git a/pmd-core/src/test/java/net/sourceforge/pmd/renderers/AbstractRendererTest.java b/pmd-core/src/test/java/net/sourceforge/pmd/renderers/AbstractRendererTest.java index a50d7a96d6..746f494678 100644 --- a/pmd-core/src/test/java/net/sourceforge/pmd/renderers/AbstractRendererTest.java +++ b/pmd-core/src/test/java/net/sourceforge/pmd/renderers/AbstractRendererTest.java @@ -16,6 +16,7 @@ import net.sourceforge.pmd.ReportTest; import net.sourceforge.pmd.RuleViolation; import net.sourceforge.pmd.RuleWithProperties; import net.sourceforge.pmd.lang.ast.DummyNode; +import net.sourceforge.pmd.lang.ast.DummyRoot; import net.sourceforge.pmd.lang.ast.Node; import net.sourceforge.pmd.lang.rule.ParametricRuleViolation; @@ -77,7 +78,7 @@ public abstract class AbstractRendererTest { } protected DummyNode createNode(int endColumn) { - DummyNode node = new DummyNode().withFileName(getSourceCodeFilename()); + DummyNode node = new DummyRoot().withFileName(getSourceCodeFilename()); node.setCoords(1, 1, 1, endColumn); return node; } diff --git a/pmd-core/src/test/java/net/sourceforge/pmd/renderers/XMLRendererTest.java b/pmd-core/src/test/java/net/sourceforge/pmd/renderers/XMLRendererTest.java index c88f8c4ffe..8fc39d6cdf 100644 --- a/pmd-core/src/test/java/net/sourceforge/pmd/renderers/XMLRendererTest.java +++ b/pmd-core/src/test/java/net/sourceforge/pmd/renderers/XMLRendererTest.java @@ -30,6 +30,7 @@ import net.sourceforge.pmd.Report.ConfigurationError; import net.sourceforge.pmd.Report.ProcessingError; import net.sourceforge.pmd.RuleViolation; import net.sourceforge.pmd.lang.ast.DummyNode; +import net.sourceforge.pmd.lang.ast.DummyRoot; import net.sourceforge.pmd.lang.ast.Node; import net.sourceforge.pmd.lang.rule.ParametricRuleViolation; @@ -90,7 +91,7 @@ public class XMLRendererTest extends AbstractRendererTest { } private RuleViolation createRuleViolation(String description) { - DummyNode node = new DummyNode().withFileName(getSourceCodeFilename()); + DummyNode node = new DummyRoot().withFileName(getSourceCodeFilename()); node.setCoords(1, 1, 1, 1); return new ParametricRuleViolation(new FooRule(), node, description); } diff --git a/pmd-core/src/test/java/net/sourceforge/pmd/renderers/XSLTRendererTest.java b/pmd-core/src/test/java/net/sourceforge/pmd/renderers/XSLTRendererTest.java index 5c1c5bbcdc..1a81677fac 100644 --- a/pmd-core/src/test/java/net/sourceforge/pmd/renderers/XSLTRendererTest.java +++ b/pmd-core/src/test/java/net/sourceforge/pmd/renderers/XSLTRendererTest.java @@ -12,6 +12,7 @@ import net.sourceforge.pmd.Report; import net.sourceforge.pmd.ReportTest; import net.sourceforge.pmd.RuleViolation; import net.sourceforge.pmd.lang.ast.DummyNode; +import net.sourceforge.pmd.lang.ast.DummyRoot; import net.sourceforge.pmd.lang.ast.Node; import net.sourceforge.pmd.lang.rule.ParametricRuleViolation; @@ -21,7 +22,7 @@ public class XSLTRendererTest { public void testDefaultStylesheet() throws Exception { XSLTRenderer renderer = new XSLTRenderer(); Report report = new Report(); - DummyNode node = new DummyNode().withFileName("file"); + DummyNode node = new DummyRoot().withFileName("file"); node.setCoords(1, 1, 1, 2); RuleViolation rv = new ParametricRuleViolation(new FooRule(), node, "violation message"); report.addRuleViolation(rv); diff --git a/pmd-doc/src/main/java/net/sourceforge/pmd/docs/GenerateRuleDocsCmd.java b/pmd-doc/src/main/java/net/sourceforge/pmd/docs/GenerateRuleDocsCmd.java index 8e43a548f2..e65bb8d4ff 100644 --- a/pmd-doc/src/main/java/net/sourceforge/pmd/docs/GenerateRuleDocsCmd.java +++ b/pmd-doc/src/main/java/net/sourceforge/pmd/docs/GenerateRuleDocsCmd.java @@ -23,8 +23,8 @@ import java.util.regex.Pattern; import org.apache.commons.io.FilenameUtils; import net.sourceforge.pmd.RuleSet; -import net.sourceforge.pmd.RuleSetNotFoundException; import net.sourceforge.pmd.RuleSetLoader; +import net.sourceforge.pmd.RuleSetNotFoundException; import net.sourceforge.pmd.lang.Language; import net.sourceforge.pmd.lang.LanguageRegistry; diff --git a/pmd-test/src/main/java/net/sourceforge/pmd/AbstractRuleSetFactoryTest.java b/pmd-test/src/main/java/net/sourceforge/pmd/AbstractRuleSetFactoryTest.java index e2cf85ca7d..234b15da1f 100644 --- a/pmd-test/src/main/java/net/sourceforge/pmd/AbstractRuleSetFactoryTest.java +++ b/pmd-test/src/main/java/net/sourceforge/pmd/AbstractRuleSetFactoryTest.java @@ -388,7 +388,7 @@ public abstract class AbstractRuleSetFactoryTest { // System.out.println("xml2: " + xml2); // Read RuleSet from XML, first time - RuleSet ruleSet2 = new RuleSetLoader().loadFromResource((String) createRuleSetReferenceId(xml2)); + RuleSet ruleSet2 = new RuleSetLoader().loadFromResource(createRuleSetReferenceId(xml2)); // Do write/read a 2nd time, just to be sure @@ -401,7 +401,7 @@ public abstract class AbstractRuleSetFactoryTest { // System.out.println("xml3: " + xml3); // Read RuleSet from XML, second time - RuleSet ruleSet3 = new RuleSetLoader().loadFromResource((String) createRuleSetReferenceId(xml3)); + RuleSet ruleSet3 = new RuleSetLoader().loadFromResource(createRuleSetReferenceId(xml3)); // The 2 written XMLs should all be valid w.r.t Schema/DTD assertTrue("1st roundtrip RuleSet XML is not valid against Schema (filename: " + fileName + ")", From fd439ac5ff04220585344e9c9d8b177e717cba37 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Fournier?= Date: Sun, 15 Nov 2020 21:06:03 +0100 Subject: [PATCH 2/3] Cleanup swift --- .../net/sourceforge/pmd/lang/swift/ast/SwiftRootNode.java | 4 ---- 1 file changed, 4 deletions(-) diff --git a/pmd-swift/src/main/java/net/sourceforge/pmd/lang/swift/ast/SwiftRootNode.java b/pmd-swift/src/main/java/net/sourceforge/pmd/lang/swift/ast/SwiftRootNode.java index ad0115d65b..88a77634c4 100644 --- a/pmd-swift/src/main/java/net/sourceforge/pmd/lang/swift/ast/SwiftRootNode.java +++ b/pmd-swift/src/main/java/net/sourceforge/pmd/lang/swift/ast/SwiftRootNode.java @@ -16,10 +16,6 @@ abstract class SwiftRootNode extends SwiftInnerNode implements RootNode { private AstInfo astInfo; - SwiftRootNode() { - super(); - } - SwiftRootNode(ParserRuleContext parent, int invokingStateNumber) { super(parent, invokingStateNumber); } From 5c940eb5a382e6a9691206b6f691ff392be51337 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Fournier?= Date: Sun, 15 Nov 2020 21:06:32 +0100 Subject: [PATCH 3/3] Fix swift --- .../net/sourceforge/pmd/lang/swift/ast/PmdSwiftParser.java | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/pmd-swift/src/main/java/net/sourceforge/pmd/lang/swift/ast/PmdSwiftParser.java b/pmd-swift/src/main/java/net/sourceforge/pmd/lang/swift/ast/PmdSwiftParser.java index 1ebab38b14..2c6abae5db 100644 --- a/pmd-swift/src/main/java/net/sourceforge/pmd/lang/swift/ast/PmdSwiftParser.java +++ b/pmd-swift/src/main/java/net/sourceforge/pmd/lang/swift/ast/PmdSwiftParser.java @@ -19,9 +19,7 @@ public final class PmdSwiftParser extends AntlrBaseParser @Override protected SwTopLevel parse(final Lexer lexer, ParserTask task) { SwiftParser parser = new SwiftParser(new CommonTokenStream(lexer)); - SwTopLevel swTopLevel = parser.topLevel().makeAstInfo(task); - swTopLevel.addTaskInfo(task); - return swTopLevel; + return parser.topLevel().makeAstInfo(task); } @Override