diff --git a/docs/pages/release_notes.md b/docs/pages/release_notes.md index aec2aa33df..6321fd82bc 100644 --- a/docs/pages/release_notes.md +++ b/docs/pages/release_notes.md @@ -242,4 +242,5 @@ All existing rules have been updated to reflect these changes. If you have custo * [#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) * [#578](https://github.com/pmd/pmd/pull/578): \[java] Refactored god class rule - [Clément Fournier](https://github.com/oowekyala) +* [#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) * [#581](https://github.com/pmd/pmd/pull/581): \[java] Relax AbstractClassWithoutAnyMethod when class is annotated by @AutoValue - [Niklas Baudy](https://github.com/vanniktech) 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. *