From 9d5b2a5e7cfd2eca187d08cd9a0280ee9313abe8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Fournier?= Date: Thu, 24 Aug 2017 22:23:17 +0200 Subject: [PATCH 1/2] Add AbstractMetric to topple the class hierarchy of metrics --- .../lang/apex/metrics/AbstractApexMetric.java | 6 +++- .../metrics/impl/AbstractApexClassMetric.java | 3 +- .../impl/AbstractApexOperationMetric.java | 2 +- .../pmd/lang/metrics/AbstractMetric.java | 35 +++++++++++++++++++ .../lang/java/metrics/AbstractJavaMetric.java | 16 ++------- 5 files changed, 45 insertions(+), 17 deletions(-) create mode 100644 pmd-core/src/main/java/net/sourceforge/pmd/lang/metrics/AbstractMetric.java diff --git a/pmd-apex/src/main/java/net/sourceforge/pmd/lang/apex/metrics/AbstractApexMetric.java b/pmd-apex/src/main/java/net/sourceforge/pmd/lang/apex/metrics/AbstractApexMetric.java index f093f0b5ba..3c5bc12572 100644 --- a/pmd-apex/src/main/java/net/sourceforge/pmd/lang/apex/metrics/AbstractApexMetric.java +++ b/pmd-apex/src/main/java/net/sourceforge/pmd/lang/apex/metrics/AbstractApexMetric.java @@ -4,12 +4,16 @@ package net.sourceforge.pmd.lang.apex.metrics; +import net.sourceforge.pmd.lang.ast.Node; +import net.sourceforge.pmd.lang.metrics.AbstractMetric; + /** * Base class for all Apex metrics. * * @author Clément Fournier */ -public class AbstractApexMetric { +public abstract class AbstractApexMetric extends AbstractMetric { + protected ApexSignatureMatcher getSignatureMatcher() { return ApexMetrics.getFacade().getProjectMirror(); diff --git a/pmd-apex/src/main/java/net/sourceforge/pmd/lang/apex/metrics/impl/AbstractApexClassMetric.java b/pmd-apex/src/main/java/net/sourceforge/pmd/lang/apex/metrics/impl/AbstractApexClassMetric.java index 02d6588a5e..ca0dbc5980 100644 --- a/pmd-apex/src/main/java/net/sourceforge/pmd/lang/apex/metrics/impl/AbstractApexClassMetric.java +++ b/pmd-apex/src/main/java/net/sourceforge/pmd/lang/apex/metrics/impl/AbstractApexClassMetric.java @@ -14,7 +14,8 @@ import net.sourceforge.pmd.lang.apex.metrics.api.ApexClassMetric; * * @author Clément Fournier */ -public abstract class AbstractApexClassMetric extends AbstractApexMetric implements ApexClassMetric { +public abstract class AbstractApexClassMetric extends AbstractApexMetric> + implements ApexClassMetric { @Override public boolean supports(ASTUserClassOrInterface node) { diff --git a/pmd-apex/src/main/java/net/sourceforge/pmd/lang/apex/metrics/impl/AbstractApexOperationMetric.java b/pmd-apex/src/main/java/net/sourceforge/pmd/lang/apex/metrics/impl/AbstractApexOperationMetric.java index ad8a1e54d2..d717f9b207 100644 --- a/pmd-apex/src/main/java/net/sourceforge/pmd/lang/apex/metrics/impl/AbstractApexOperationMetric.java +++ b/pmd-apex/src/main/java/net/sourceforge/pmd/lang/apex/metrics/impl/AbstractApexOperationMetric.java @@ -14,7 +14,7 @@ import net.sourceforge.pmd.lang.apex.metrics.api.ApexOperationMetric; * * @author Clément Fournier */ -public abstract class AbstractApexOperationMetric extends AbstractApexMetric implements ApexOperationMetric { +public abstract class AbstractApexOperationMetric extends AbstractApexMetric implements ApexOperationMetric { /** * Checks if the metric can be computed on the node. For now, we filter out {@literal , and clone}, diff --git a/pmd-core/src/main/java/net/sourceforge/pmd/lang/metrics/AbstractMetric.java b/pmd-core/src/main/java/net/sourceforge/pmd/lang/metrics/AbstractMetric.java new file mode 100644 index 0000000000..68cc055f09 --- /dev/null +++ b/pmd-core/src/main/java/net/sourceforge/pmd/lang/metrics/AbstractMetric.java @@ -0,0 +1,35 @@ +/** + * BSD-style license; for more info see http://pmd.sourceforge.net/license.html + */ + +package net.sourceforge.pmd.lang.metrics; + +import net.sourceforge.pmd.lang.ast.Node; + +/** + * Abstract class for all metrics. + * + * @param Type of nodes the metric can be computed on + * + * @author Clément Fournier + * @since 6.0.0 + */ +public abstract class AbstractMetric implements Metric { + + /** + * Metrics should be stateless, thus any instance of the same metric class should be equal. + * + * {@inheritDoc} + */ + @Override + public final boolean equals(Object o) { + return o != null && o.getClass() == this.getClass(); + } + + + @Override + public final int hashCode() { + return getClass().hashCode(); + } + +} diff --git a/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/metrics/AbstractJavaMetric.java b/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/metrics/AbstractJavaMetric.java index e59007d938..9c6809bbcd 100644 --- a/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/metrics/AbstractJavaMetric.java +++ b/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/metrics/AbstractJavaMetric.java @@ -10,7 +10,7 @@ import java.util.List; import net.sourceforge.pmd.lang.ast.Node; import net.sourceforge.pmd.lang.java.ast.ASTMethodOrConstructorDeclaration; import net.sourceforge.pmd.lang.java.ast.JavaQualifiedName; -import net.sourceforge.pmd.lang.metrics.Metric; +import net.sourceforge.pmd.lang.metrics.AbstractMetric; /** @@ -21,7 +21,7 @@ import net.sourceforge.pmd.lang.metrics.Metric; * * @author Clément Fournier */ -public abstract class AbstractJavaMetric implements Metric { +public abstract class AbstractJavaMetric extends AbstractMetric { protected List findAllCalls(ASTMethodOrConstructorDeclaration node) { @@ -33,18 +33,6 @@ public abstract class AbstractJavaMetric implements Metric { } - @Override - public final boolean equals(Object o) { - return o != null && o.getClass() == this.getClass(); - } - - - @Override - public final int hashCode() { - return getClass().hashCode(); - } - - /** * Gives access to a signature matcher to metrics. They can use it to perform signature matching. * From fcdc2bde4daa05573632332bcf055fc3706aa356 Mon Sep 17 00:00:00 2001 From: Andreas Dangel Date: Sat, 26 Aug 2017 11:05:41 +0200 Subject: [PATCH 2/2] Update relase notes, refs #580 --- docs/pages/release_notes.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/pages/release_notes.md b/docs/pages/release_notes.md index dd02667725..da7190bfdb 100644 --- a/docs/pages/release_notes.md +++ b/docs/pages/release_notes.md @@ -235,4 +235,4 @@ All existing rules have been updated to reflect these changes. If you have custo * [#570](https://github.com/pmd/pmd/pull/570): \[java] Model lower, upper and intersection types - [Bendegúz Nagy](https://github.com/WinterGrascph) * [#573](https://github.com/pmd/pmd/pull/573): \[java] Data class rule - [Clément Fournier](https://github.com/oowekyala) * [#576](https://github.com/pmd/pmd/pull/576): \[doc][java] Add hint for Guava users in InefficientEmptyStringCheck - [mmoehring](https://github.com/mmoehring) - +* [#580](https://github.com/pmd/pmd/pull/580): \[core] Add AbstractMetric to topple the class hierarchy of metrics - [Clément Fournier](https://github.com/oowekyala)