Add old property back and log warning + correct the property range

This commit is contained in:
Clément Fournier
2017-11-09 15:02:59 +01:00
parent f8bea7f580
commit 695defcc61
2 changed files with 52 additions and 6 deletions

View File

@ -4,14 +4,18 @@
package net.sourceforge.pmd.lang.java.rule.design;
import java.util.logging.Logger;
import net.sourceforge.pmd.lang.java.ast.ASTCompilationUnit;
import net.sourceforge.pmd.lang.java.ast.ASTMethodDeclaration;
import net.sourceforge.pmd.lang.java.ast.ASTMethodOrConstructorDeclaration;
import net.sourceforge.pmd.lang.java.metrics.JavaMetrics;
import net.sourceforge.pmd.lang.java.metrics.api.JavaOperationMetricKey;
import net.sourceforge.pmd.lang.java.rule.AbstractJavaMetricsRule;
import net.sourceforge.pmd.properties.DoubleProperty;
import net.sourceforge.pmd.properties.IntegerProperty;
/**
* Simple n-path complexity rule.
*
@ -20,33 +24,53 @@ import net.sourceforge.pmd.properties.IntegerProperty;
*/
public class NPathComplexityRule extends AbstractJavaMetricsRule {
private static final IntegerProperty REPORT_LEVEL_DESCRIPTOR = new IntegerProperty(
"reportLevel", "N-Path Complexity reporting threshold", 1, 30, 200, 1.0f);
private static final Logger LOG = Logger.getLogger(NPathComplexityRule.class.getName());
private static final DoubleProperty MINIMUM_DESCRIPTOR
= DoubleProperty.named("minimum").desc("Deprecated! Minimum reporting threshold")
.range(0d, 2000d).defaultValue(200d).uiOrder(2.0f).build();
private static int reportLevel = 200;
private static final IntegerProperty REPORT_LEVEL_DESCRIPTOR
= IntegerProperty.named("reportLevel").desc("N-Path Complexity reporting threshold")
.range(1, 2000).defaultValue(200).uiOrder(1.0f).build();
private int reportLevel = 200;
public NPathComplexityRule() {
definePropertyDescriptor(REPORT_LEVEL_DESCRIPTOR);
definePropertyDescriptor(MINIMUM_DESCRIPTOR);
}
@Override
public Object visit(ASTCompilationUnit node, Object data) {
reportLevel = getProperty(REPORT_LEVEL_DESCRIPTOR);
reportLevel = getReportLevel();
super.visit(node, data);
return data;
}
private int getReportLevel() {
double oldProp = getProperty(MINIMUM_DESCRIPTOR);
if (oldProp != 200.0) {
LOG.warning("Rule NPathComplexity uses deprecated property 'minimum'. Future versions of PMD will remove support for this property. Please use 'reportLevel' instead!");
return (int) oldProp;
}
return getProperty(REPORT_LEVEL_DESCRIPTOR);
}
@Override
public final Object visit(ASTMethodOrConstructorDeclaration node, Object data) {
int npath = (int) JavaMetrics.get(JavaOperationMetricKey.NPATH, node);
if (npath >= reportLevel) {
addViolation(data, node, new String[] {node instanceof ASTMethodDeclaration ? "method" : "constructor",
node.getQualifiedName().getOperation(), "" + npath, });
addViolation(data, node, new String[]{node instanceof ASTMethodDeclaration ? "method" : "constructor",
node.getQualifiedName().getOperation(), "" + npath, });
}
return data;

View File

@ -196,4 +196,26 @@ class Bar {
}
]]></code>
</test-code>
<test-code>
<description>Backwards compatibility with minimum property</description>
<rule-property name="minimum">300</rule-property>
<expected-problems>0</expected-problems>
<code><![CDATA[
class Foo {
Foo() {
boolean a, b;
int j = 23;
switch(j) {
case 1:
case 2: break;
case 3: j = 5; break;
case 4: if (b && a) { bar(); } break;
default: break;
}
}
}
]]></code>
</test-code>
</test-data>