From 3acc740925c0b0a3dfd0f6ac89a91aeb40f3adc0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Fournier?= Date: Fri, 15 Apr 2022 21:09:09 +0200 Subject: [PATCH] Add ctor for ruleset reference id --- .../net/sourceforge/pmd/RuleSetFactory.java | 13 +++++------ .../sourceforge/pmd/RuleSetReferenceId.java | 23 +++++++++++++++++++ 2 files changed, 29 insertions(+), 7 deletions(-) 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 4bf429f14d..b4409b0793 100644 --- a/pmd-core/src/main/java/net/sourceforge/pmd/RuleSetFactory.java +++ b/pmd-core/src/main/java/net/sourceforge/pmd/RuleSetFactory.java @@ -129,15 +129,14 @@ final class RuleSetFactory { * @return A new Rule. */ private Rule createRule(RuleSetReferenceId ruleSetReferenceId, boolean withDeprecatedRuleReferences) { - if (ruleSetReferenceId.isAllRules()) { + RuleSetReferenceId parentRuleset = ruleSetReferenceId.getParentRulesetIfThisIsARule(); + if (parentRuleset == null) { throw new IllegalArgumentException( "Cannot parse a single Rule from an all Rule RuleSet reference: <" + ruleSetReferenceId + ">."); } - RuleSet ruleSet; - // java8: computeIfAbsent - if (parsedRulesets.containsKey(ruleSetReferenceId)) { - ruleSet = parsedRulesets.get(ruleSetReferenceId); - } else { + // can't use computeIfAbsent as creating a ruleset may add more entries to the map. + RuleSet ruleSet = parsedRulesets.get(parentRuleset); + if (ruleSet == null) { ruleSet = createRuleSet(ruleSetReferenceId, withDeprecatedRuleReferences); parsedRulesets.put(ruleSetReferenceId, ruleSet); } @@ -500,7 +499,7 @@ final class RuleSetFactory { RuleSetFactory ruleSetFactory = toLoader().filterAbovePriority(RulePriority.LOW).warnDeprecated(false).toFactory(); boolean isSameRuleSet = false; - RuleSetReferenceId otherRuleSetReferenceId = RuleSetReferenceId.parse(ref).get(0); + RuleSetReferenceId otherRuleSetReferenceId = RuleSetReferenceId.parse(ref).get(0); // fixme what is this get(0) doing here if (!otherRuleSetReferenceId.isExternal() && containsRule(ruleSetReferenceId, otherRuleSetReferenceId.getRuleName())) { otherRuleSetReferenceId = new RuleSetReferenceId(ref, ruleSetReferenceId); diff --git a/pmd-core/src/main/java/net/sourceforge/pmd/RuleSetReferenceId.java b/pmd-core/src/main/java/net/sourceforge/pmd/RuleSetReferenceId.java index 32387d4e3e..04b20c3533 100644 --- a/pmd-core/src/main/java/net/sourceforge/pmd/RuleSetReferenceId.java +++ b/pmd-core/src/main/java/net/sourceforge/pmd/RuleSetReferenceId.java @@ -14,6 +14,7 @@ import java.util.ArrayList; import java.util.List; import org.apache.commons.lang3.StringUtils; +import org.checkerframework.checker.nullness.qual.Nullable; import net.sourceforge.pmd.annotation.InternalApi; import net.sourceforge.pmd.util.ResourceLoader; @@ -105,6 +106,14 @@ public class RuleSetReferenceId { this(id, null); } + private RuleSetReferenceId(final String ruleSetFileName, boolean allRules, boolean external, String ruleName, RuleSetReferenceId externalRuleSetReferenceId) { + this.ruleSetFileName = ruleSetFileName; + this.allRules = allRules; + this.external = external; + this.ruleName = ruleName; + this.externalRuleSetReferenceId = externalRuleSetReferenceId; + } + /** * Construct a RuleSetReferenceId for the given single ID string. If an * external RuleSetReferenceId is given, the ID must refer to a non-external @@ -221,6 +230,20 @@ public class RuleSetReferenceId { this.externalRuleSetReferenceId = externalRuleSetReferenceId; } + @Nullable RuleSetReferenceId getParentRulesetIfThisIsARule() { + if (ruleName == null) { + return null; + } + return new RuleSetReferenceId( + ruleSetFileName, + true, + external, + null, + + null + ); + } + /** * Tries to load the given ruleset. *