From 2db32f8ea626a45055cc5c6b66eaef26e815ed53 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Fournier?= Date: Mon, 27 Jan 2020 10:33:30 +0100 Subject: [PATCH] Simplify comparable behavior of processing stages Instead of overriding compareTo we can just use an external comparator --- .../RulesetStageDependencyHelper.java | 2 +- .../pmd/lang/ast/AstProcessingStage.java | 24 +++++++++++++++++-- .../pmd/lang/ast/DummyAstStages.java | 6 ----- .../java/internal/JavaProcessingStage.java | 6 ----- .../internal/ModelicaProcessingStage.java | 5 ---- .../pmd/lang/plsql/PlsqlProcessingStage.java | 6 ----- 6 files changed, 23 insertions(+), 26 deletions(-) diff --git a/pmd-core/src/main/java/net/sourceforge/pmd/internal/RulesetStageDependencyHelper.java b/pmd-core/src/main/java/net/sourceforge/pmd/internal/RulesetStageDependencyHelper.java index 851050c507..5eccfd32b2 100644 --- a/pmd-core/src/main/java/net/sourceforge/pmd/internal/RulesetStageDependencyHelper.java +++ b/pmd-core/src/main/java/net/sourceforge/pmd/internal/RulesetStageDependencyHelper.java @@ -72,7 +72,7 @@ public class RulesetStageDependencyHelper { /** Builds a sorted list of the dependencies of the given ruleset. */ private List> buildDependencyList(RuleSets ruleSets, LanguageVersion languageVersion) { List> stages = new ArrayList<>(languageVersion.getLanguageVersionHandler().getProcessingStages()); - SortedSet> result = new TreeSet<>(); + SortedSet> result = new TreeSet<>(AstProcessingStage.COMPARATOR); // this loops runs until either all stages have already been // picked or there are no rules left, whichever comes first diff --git a/pmd-core/src/main/java/net/sourceforge/pmd/lang/ast/AstProcessingStage.java b/pmd-core/src/main/java/net/sourceforge/pmd/lang/ast/AstProcessingStage.java index 171037e81d..ecc8f301c7 100644 --- a/pmd-core/src/main/java/net/sourceforge/pmd/lang/ast/AstProcessingStage.java +++ b/pmd-core/src/main/java/net/sourceforge/pmd/lang/ast/AstProcessingStage.java @@ -6,6 +6,7 @@ package net.sourceforge.pmd.lang.ast; import static java.util.Collections.emptyList; +import java.util.Comparator; import java.util.List; import net.sourceforge.pmd.RuleSets; @@ -58,6 +59,11 @@ import net.sourceforge.pmd.lang.LanguageVersionHandler; @Experimental public interface AstProcessingStage> extends Comparable { + /** + * Compares processing stages of possibly different kinds. + */ + Comparator> COMPARATOR = AstProcessingStage::compare; + /** * Returns the language this processing stage applies to. @@ -96,6 +102,20 @@ public interface AstProcessingStage> extends Com void processAST(RootNode rootNode, AstAnalysisContext configuration); - @Override - int compareTo(AstProcessingStage o); + /** + * Same contract as {@link Comparable#compareTo(Object)}, but we can't extend + * Comparable with that type argument if we implement processing stages within + * an enum. + * + * @param t the object to compare + * + * @return a negative integer, zero, or a positive integer as this object + * is less than, equal to, or greater than the specified object. + */ + @SuppressWarnings("unchecked") + default int compare(AstProcessingStage t) { + return this.compareTo((T) t); + } + + } diff --git a/pmd-core/src/test/java/net/sourceforge/pmd/lang/ast/DummyAstStages.java b/pmd-core/src/test/java/net/sourceforge/pmd/lang/ast/DummyAstStages.java index 28435eb9bc..1644db9433 100644 --- a/pmd-core/src/test/java/net/sourceforge/pmd/lang/ast/DummyAstStages.java +++ b/pmd-core/src/test/java/net/sourceforge/pmd/lang/ast/DummyAstStages.java @@ -43,12 +43,6 @@ public enum DummyAstStages implements AstProcessingStage { return name(); } - @Override - public int compareTo(AstProcessingStage o) { - return o instanceof DummyAstStages ? compareTo((DummyAstStages) o) - : 0; - } - @Override public void processAST(RootNode rootNode, AstAnalysisContext configuration) { ((DummyNode) rootNode).getUserData().put(name() + "_STAGE", "done"); diff --git a/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/internal/JavaProcessingStage.java b/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/internal/JavaProcessingStage.java index d892ba323e..549ce911ee 100644 --- a/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/internal/JavaProcessingStage.java +++ b/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/internal/JavaProcessingStage.java @@ -89,12 +89,6 @@ public enum JavaProcessingStage implements AstProcessingStage getDependencies() { return dependencies; 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 index ad34b40683..30f6266a59 100644 --- 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 @@ -30,11 +30,6 @@ public enum ModelicaProcessingStage implements AstProcessingStage