diff --git a/pmd-apex/src/main/java/net/sourceforge/pmd/lang/apex/metrics/ApexMetricsComputer.java b/pmd-apex/src/main/java/net/sourceforge/pmd/lang/apex/metrics/ApexMetricsComputer.java index 74ca07e3ff..d0d82c3d63 100644 --- a/pmd-apex/src/main/java/net/sourceforge/pmd/lang/apex/metrics/ApexMetricsComputer.java +++ b/pmd-apex/src/main/java/net/sourceforge/pmd/lang/apex/metrics/ApexMetricsComputer.java @@ -4,6 +4,7 @@ package net.sourceforge.pmd.lang.apex.metrics; +import java.util.ArrayList; import java.util.List; import net.sourceforge.pmd.lang.apex.ast.ASTMethod; @@ -12,14 +13,23 @@ import net.sourceforge.pmd.lang.metrics.AbstractMetricsComputer; /** * Computes metrics for the Apex framework. + * * @author Clément Fournier */ public class ApexMetricsComputer extends AbstractMetricsComputer, ASTMethod> { - public static final ApexMetricsComputer INSTANCE = new ApexMetricsComputer(); + static final ApexMetricsComputer INSTANCE = new ApexMetricsComputer(); + @Override protected List findOperations(ASTUserClassOrInterface node) { - return node.findChildrenOfType(ASTMethod.class); + List candidates = node.findChildrenOfType(ASTMethod.class); + List result = new ArrayList<>(candidates); + for (ASTMethod method : candidates) { + if (method.getImage().matches("(||clone)")) { + result.remove(method); + } + } + return result; } } 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 876a65585a..02d6588a5e 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 @@ -10,6 +10,8 @@ import net.sourceforge.pmd.lang.apex.metrics.AbstractApexMetric; import net.sourceforge.pmd.lang.apex.metrics.api.ApexClassMetric; /** + * Base class for Apex metrics. + * * @author Clément Fournier */ public abstract class AbstractApexClassMetric extends AbstractApexMetric implements ApexClassMetric { 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 cdbc31b46c..ad8a1e54d2 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 @@ -10,10 +10,20 @@ import net.sourceforge.pmd.lang.apex.metrics.AbstractApexMetric; import net.sourceforge.pmd.lang.apex.metrics.api.ApexOperationMetric; /** + * Base class for Apex operation metrics. + * * @author Clément Fournier */ 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}, + * which are present in all apex class nodes even if they're not implemented, which may yield unexpected results. + * + * @param node The node to check + * + * @return True if the metric can be computed + */ @Override public boolean supports(ASTMethod node) { return !node.getImage().matches("(||clone)") diff --git a/pmd-apex/src/main/java/net/sourceforge/pmd/lang/apex/metrics/impl/CycloMetric.java b/pmd-apex/src/main/java/net/sourceforge/pmd/lang/apex/metrics/impl/CycloMetric.java index 680680846b..737aad1b34 100644 --- a/pmd-apex/src/main/java/net/sourceforge/pmd/lang/apex/metrics/impl/CycloMetric.java +++ b/pmd-apex/src/main/java/net/sourceforge/pmd/lang/apex/metrics/impl/CycloMetric.java @@ -29,8 +29,16 @@ public class CycloMetric extends AbstractApexOperationMetric { public double computeFor(ASTMethod node, MetricVersion version) { return ((MutableInt) node.jjtAccept(new StandardCycloVisitor(), new MutableInt(1))).doubleValue(); } + - + /** + * Computes the number of control flow paths through that expression, which is the number of {@code ||} and {@code + * &&} operators. Used both by Npath and Cyclo. + * + * @param expression Boolean expression + * + * @return The complexity of the expression + */ public static int booleanExpressionComplexity(ASTStandardCondition expression) { Set subs = new HashSet<>(expression.findDescendantsOfType(ASTBooleanExpression.class)); int complexity = 0; diff --git a/pmd-apex/src/main/java/net/sourceforge/pmd/lang/apex/metrics/impl/WmcMetric.java b/pmd-apex/src/main/java/net/sourceforge/pmd/lang/apex/metrics/impl/WmcMetric.java index 7f6b8c4333..136dad1d50 100644 --- a/pmd-apex/src/main/java/net/sourceforge/pmd/lang/apex/metrics/impl/WmcMetric.java +++ b/pmd-apex/src/main/java/net/sourceforge/pmd/lang/apex/metrics/impl/WmcMetric.java @@ -11,6 +11,8 @@ import net.sourceforge.pmd.lang.metrics.MetricVersion; import net.sourceforge.pmd.lang.metrics.ResultOption; /** + * See the doc for the Java metric. + * * @author Clément Fournier */ public class WmcMetric extends AbstractApexClassMetric { diff --git a/pmd-apex/src/test/java/net/sourceforge/pmd/lang/apex/metrics/ApexProjectMirrorTest.java b/pmd-apex/src/test/java/net/sourceforge/pmd/lang/apex/metrics/ApexProjectMirrorTest.java index 2ba6875626..6a12068c48 100644 --- a/pmd-apex/src/test/java/net/sourceforge/pmd/lang/apex/metrics/ApexProjectMirrorTest.java +++ b/pmd-apex/src/test/java/net/sourceforge/pmd/lang/apex/metrics/ApexProjectMirrorTest.java @@ -14,7 +14,6 @@ import java.util.Random; import org.junit.Test; -import net.sourceforge.pmd.lang.MetricKeyUtil; import net.sourceforge.pmd.lang.apex.ast.ASTMethod; import net.sourceforge.pmd.lang.apex.ast.ASTUserClass; import net.sourceforge.pmd.lang.apex.ast.ASTUserClassOrInterface; @@ -24,6 +23,7 @@ import net.sourceforge.pmd.lang.apex.metrics.impl.AbstractApexClassMetric; import net.sourceforge.pmd.lang.apex.metrics.impl.AbstractApexOperationMetric; import net.sourceforge.pmd.lang.metrics.Metric.Version; import net.sourceforge.pmd.lang.metrics.MetricKey; +import net.sourceforge.pmd.lang.metrics.MetricKeyUtil; import net.sourceforge.pmd.lang.metrics.MetricMemoizer; import net.sourceforge.pmd.lang.metrics.MetricVersion; diff --git a/pmd-core/src/main/java/net/sourceforge/pmd/lang/MetricKeyUtil.java b/pmd-core/src/main/java/net/sourceforge/pmd/lang/metrics/MetricKeyUtil.java similarity index 92% rename from pmd-core/src/main/java/net/sourceforge/pmd/lang/MetricKeyUtil.java rename to pmd-core/src/main/java/net/sourceforge/pmd/lang/metrics/MetricKeyUtil.java index 79a2ed8971..6ede93208a 100644 --- a/pmd-core/src/main/java/net/sourceforge/pmd/lang/MetricKeyUtil.java +++ b/pmd-core/src/main/java/net/sourceforge/pmd/lang/metrics/MetricKeyUtil.java @@ -2,13 +2,11 @@ * BSD-style license; for more info see http://pmd.sourceforge.net/license.html */ -package net.sourceforge.pmd.lang; +package net.sourceforge.pmd.lang.metrics; import java.util.Objects; import net.sourceforge.pmd.lang.ast.Node; -import net.sourceforge.pmd.lang.metrics.Metric; -import net.sourceforge.pmd.lang.metrics.MetricKey; /** * Holds the key creation method until we move it to the MetricKey interface. diff --git a/pmd-java/src/test/java/net/sourceforge/pmd/lang/java/metrics/ParameterizedMetricKeyTest.java b/pmd-java/src/test/java/net/sourceforge/pmd/lang/java/metrics/ParameterizedMetricKeyTest.java index e433861d14..23a8ab7f03 100644 --- a/pmd-java/src/test/java/net/sourceforge/pmd/lang/java/metrics/ParameterizedMetricKeyTest.java +++ b/pmd-java/src/test/java/net/sourceforge/pmd/lang/java/metrics/ParameterizedMetricKeyTest.java @@ -12,11 +12,11 @@ import static org.junit.Assert.assertTrue; import org.junit.Test; -import net.sourceforge.pmd.lang.MetricKeyUtil; import net.sourceforge.pmd.lang.java.ast.ASTAnyTypeDeclaration; import net.sourceforge.pmd.lang.java.metrics.api.JavaClassMetricKey; import net.sourceforge.pmd.lang.java.metrics.api.JavaOperationMetricKey; import net.sourceforge.pmd.lang.metrics.MetricKey; +import net.sourceforge.pmd.lang.metrics.MetricKeyUtil; import net.sourceforge.pmd.lang.metrics.MetricVersion; import net.sourceforge.pmd.lang.metrics.ParameterizedMetricKey; diff --git a/pmd-java/src/test/java/net/sourceforge/pmd/lang/java/metrics/ProjectMemoizerTest.java b/pmd-java/src/test/java/net/sourceforge/pmd/lang/java/metrics/ProjectMemoizerTest.java index f5ea7c30eb..35e8f320ba 100644 --- a/pmd-java/src/test/java/net/sourceforge/pmd/lang/java/metrics/ProjectMemoizerTest.java +++ b/pmd-java/src/test/java/net/sourceforge/pmd/lang/java/metrics/ProjectMemoizerTest.java @@ -14,7 +14,6 @@ import java.util.Random; import org.junit.Test; -import net.sourceforge.pmd.lang.MetricKeyUtil; import net.sourceforge.pmd.lang.java.ast.ASTAnyTypeDeclaration; import net.sourceforge.pmd.lang.java.ast.ASTCompilationUnit; import net.sourceforge.pmd.lang.java.ast.ASTMethodOrConstructorDeclaration; @@ -24,6 +23,7 @@ import net.sourceforge.pmd.lang.java.metrics.impl.AbstractJavaOperationMetric; import net.sourceforge.pmd.lang.java.metrics.testdata.MetricsVisitorTestData; import net.sourceforge.pmd.lang.metrics.Metric.Version; import net.sourceforge.pmd.lang.metrics.MetricKey; +import net.sourceforge.pmd.lang.metrics.MetricKeyUtil; import net.sourceforge.pmd.lang.metrics.MetricMemoizer; import net.sourceforge.pmd.lang.metrics.MetricVersion; diff --git a/src/site/markdown/overview/changelog.md b/src/site/markdown/overview/changelog.md index 2c02b85ceb..26d98f53d7 100644 --- a/src/site/markdown/overview/changelog.md +++ b/src/site/markdown/overview/changelog.md @@ -132,4 +132,5 @@ and include them to such reports. * [#530](https://github.com/pmd/pmd/pull/530): \[java] Fix issue #527: Lombok getter annotation on enum is not recognized correctly - [Clément Fournier](https://github.com/oowekyala) * [#535](https://github.com/pmd/pmd/pull/535): \[apex] Fix broken Apex visitor adapter - [Clément Fournier](https://github.com/oowekyala) * [#529](https://github.com/pmd/pmd/pull/529): \[java] Abstracted the Java metrics framework - [Clément Fournier](https://github.com/oowekyala) +* [#542](https://github.com/pmd/pmd/pull/542): \[java] Metrics abstraction - [Clément Fournier](https://github.com/oowekyala)