aboutsummaryrefslogtreecommitdiffstats
path: root/plugins/sonar-squid-java-plugin
diff options
context:
space:
mode:
authorGodin <mandrikov@gmail.com>2010-11-14 02:51:28 +0000
committerGodin <mandrikov@gmail.com>2010-11-14 02:51:28 +0000
commite410437db4ad779e779619ac3bea979c079b4e00 (patch)
treedd325f124a77eaa9515994f64075d04308fd015b /plugins/sonar-squid-java-plugin
parent9a3d8a9e30a835d9ff37b45f15b2e818d17d0b75 (diff)
downloadsonarqube-e410437db4ad779e779619ac3bea979c079b4e00.tar.gz
sonarqube-e410437db4ad779e779619ac3bea979c079b4e00.zip
SONAR-1845: Create a new Sonar rule to check method complexity
Diffstat (limited to 'plugins/sonar-squid-java-plugin')
-rw-r--r--plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/ast/check/ClassComplexityCheck.java (renamed from plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/ast/check/ComplexityCheck.java)7
-rw-r--r--plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/ast/check/MethodComplexityCheck.java44
-rw-r--r--plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/ast/visitor/MethodVisitor.java2
-rw-r--r--plugins/sonar-squid-java-plugin/src/main/java/org/sonar/plugins/squid/SquidRuleRepository.java5
-rw-r--r--plugins/sonar-squid-java-plugin/src/main/java/org/sonar/plugins/squid/bridges/ChecksBridge.java7
-rw-r--r--plugins/sonar-squid-java-plugin/src/test/java/org/sonar/java/ast/check/ClassComplexityCheckTest.java (renamed from plugins/sonar-squid-java-plugin/src/test/java/org/sonar/java/ast/check/ComplexityCheckTest.java)4
-rw-r--r--plugins/sonar-squid-java-plugin/src/test/java/org/sonar/java/ast/check/MethodComplexityCheckTest.java35
7 files changed, 93 insertions, 11 deletions
diff --git a/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/ast/check/ComplexityCheck.java b/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/ast/check/ClassComplexityCheck.java
index e2936cf0102..4025278c654 100644
--- a/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/ast/check/ComplexityCheck.java
+++ b/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/ast/check/ClassComplexityCheck.java
@@ -33,8 +33,8 @@ import org.sonar.squid.measures.Metric;
import com.puppycrawl.tools.checkstyle.api.DetailAST;
-@Rule(key = "ComplexityCheck", isoCategory = IsoCategory.Maintainability)
-public class ComplexityCheck extends JavaAstCheck {
+@Rule(key = "ClassComplexityCheck", isoCategory = IsoCategory.Maintainability)
+public class ClassComplexityCheck extends JavaAstCheck {
@RuleProperty
private Integer threshold;
@@ -49,8 +49,9 @@ public class ComplexityCheck extends JavaAstCheck {
SourceCode currentResource = peekSourceCode();
int complexity = calculateComplexity(currentResource);
if (complexity > threshold) {
- CheckMessage message = new CheckMessage(this, "Complexity exceeds " + threshold + ".");
+ CheckMessage message = new CheckMessage(this, "Class complexity exceeds " + threshold + ".");
message.setLine(ast.getLineNo());
+ message.setCost(complexity - threshold);
SourceFile sourceFile = currentResource.getParent(SourceFile.class);
sourceFile.log(message);
}
diff --git a/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/ast/check/MethodComplexityCheck.java b/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/ast/check/MethodComplexityCheck.java
new file mode 100644
index 00000000000..072d19baf6d
--- /dev/null
+++ b/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/ast/check/MethodComplexityCheck.java
@@ -0,0 +1,44 @@
+package org.sonar.java.ast.check;
+
+import java.util.List;
+
+import org.sonar.check.IsoCategory;
+import org.sonar.check.Rule;
+import org.sonar.check.RuleProperty;
+import org.sonar.java.ast.visitor.MethodVisitor;
+import org.sonar.squid.api.CheckMessage;
+import org.sonar.squid.api.SourceCode;
+import org.sonar.squid.api.SourceFile;
+import org.sonar.squid.measures.Metric;
+
+import com.puppycrawl.tools.checkstyle.api.DetailAST;
+
+@Rule(key = "MethodComplexityCheck", isoCategory = IsoCategory.Maintainability)
+public class MethodComplexityCheck extends JavaAstCheck {
+
+ @RuleProperty
+ private Integer threshold;
+
+ @Override
+ public List<Integer> getWantedTokens() {
+ return MethodVisitor.wantedTokens;
+ }
+
+ @Override
+ public void leaveToken(DetailAST ast) {
+ SourceCode currentResource = peekSourceCode();
+ int complexity = currentResource.getInt(Metric.COMPLEXITY) + currentResource.getInt(Metric.BRANCHES) + 1;
+ if (complexity > threshold) {
+ CheckMessage message = new CheckMessage(this, "Method complexity exceeds " + threshold + ".");
+ message.setLine(ast.getLineNo());
+ message.setCost(complexity - threshold);
+ SourceFile sourceFile = currentResource.getParent(SourceFile.class);
+ sourceFile.log(message);
+ }
+ }
+
+ public void setThreshold(int threshold) {
+ this.threshold = threshold;
+ }
+
+}
diff --git a/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/ast/visitor/MethodVisitor.java b/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/ast/visitor/MethodVisitor.java
index 480c346bf66..afe8e9d366c 100644
--- a/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/ast/visitor/MethodVisitor.java
+++ b/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/ast/visitor/MethodVisitor.java
@@ -41,7 +41,7 @@ public class MethodVisitor extends JavaAstVisitor {
private static final String CONSTRUCTOR = "<init>";
- private static final List<Integer> wantedTokens = Arrays.asList(TokenTypes.CTOR_DEF, TokenTypes.METHOD_DEF);
+ public static final List<Integer> wantedTokens = Arrays.asList(TokenTypes.CTOR_DEF, TokenTypes.METHOD_DEF);
private static final Map<Integer, JvmJavaType> tokenJavaTypeMapping = new HashMap<Integer, JvmJavaType>();
static {
diff --git a/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/plugins/squid/SquidRuleRepository.java b/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/plugins/squid/SquidRuleRepository.java
index b9c1473b86a..9c4ae500f29 100644
--- a/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/plugins/squid/SquidRuleRepository.java
+++ b/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/plugins/squid/SquidRuleRepository.java
@@ -28,8 +28,9 @@ import org.sonar.api.rules.AnnotationRuleParser;
import org.sonar.api.rules.Rule;
import org.sonar.api.rules.RuleRepository;
import org.sonar.java.ast.check.BreakCheck;
-import org.sonar.java.ast.check.ComplexityCheck;
+import org.sonar.java.ast.check.ClassComplexityCheck;
import org.sonar.java.ast.check.ContinueCheck;
+import org.sonar.java.ast.check.MethodComplexityCheck;
import org.sonar.java.ast.check.UndocumentedApiCheck;
import org.sonar.java.bytecode.check.ArchitectureCheck;
import org.sonar.java.bytecode.check.CallToDeprecatedMethodCheck;
@@ -57,6 +58,6 @@ public final class SquidRuleRepository extends RuleRepository {
(Class) CallToDeprecatedMethodCheck.class, UnusedPrivateMethodCheck.class, UnusedProtectedMethodCheck.class,
ArchitectureCheck.class, DITCheck.class,
// AST checks
- UndocumentedApiCheck.class, ContinueCheck.class, BreakCheck.class, ComplexityCheck.class);
+ UndocumentedApiCheck.class, ContinueCheck.class, BreakCheck.class, ClassComplexityCheck.class, MethodComplexityCheck.class);
}
}
diff --git a/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/plugins/squid/bridges/ChecksBridge.java b/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/plugins/squid/bridges/ChecksBridge.java
index 0d083d2a77f..60530fc5fd9 100644
--- a/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/plugins/squid/bridges/ChecksBridge.java
+++ b/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/plugins/squid/bridges/ChecksBridge.java
@@ -19,15 +19,15 @@
*/
package org.sonar.plugins.squid.bridges;
+import java.util.Locale;
+import java.util.Set;
+
import org.sonar.api.resources.Resource;
import org.sonar.api.rules.ActiveRule;
import org.sonar.api.rules.Violation;
import org.sonar.squid.api.CheckMessage;
import org.sonar.squid.api.SourceFile;
-import java.util.Locale;
-import java.util.Set;
-
public class ChecksBridge extends Bridge {
protected ChecksBridge() {
@@ -43,6 +43,7 @@ public class ChecksBridge extends Bridge {
Violation violation = Violation.create(rule, sonarFile);
violation.setLineId(checkMessage.getLine());
violation.setMessage(checkMessage.getText(Locale.ENGLISH));
+ violation.setCost(checkMessage.getCost());
context.saveViolation(violation);
}
}
diff --git a/plugins/sonar-squid-java-plugin/src/test/java/org/sonar/java/ast/check/ComplexityCheckTest.java b/plugins/sonar-squid-java-plugin/src/test/java/org/sonar/java/ast/check/ClassComplexityCheckTest.java
index 0c4c8a04d7d..39692969332 100644
--- a/plugins/sonar-squid-java-plugin/src/test/java/org/sonar/java/ast/check/ComplexityCheckTest.java
+++ b/plugins/sonar-squid-java-plugin/src/test/java/org/sonar/java/ast/check/ClassComplexityCheckTest.java
@@ -32,14 +32,14 @@ import org.sonar.squid.Squid;
import org.sonar.squid.api.CheckMessage;
import org.sonar.squid.api.SourceFile;
-public class ComplexityCheckTest {
+public class ClassComplexityCheckTest {
private Squid squid;
@Before
public void setUp() {
squid = new Squid(new JavaSquidConfiguration());
- ComplexityCheck check = new ComplexityCheck();
+ ClassComplexityCheck check = new ClassComplexityCheck();
check.setThreshold(5);
squid.registerVisitor(check);
JavaAstScanner scanner = squid.register(JavaAstScanner.class);
diff --git a/plugins/sonar-squid-java-plugin/src/test/java/org/sonar/java/ast/check/MethodComplexityCheckTest.java b/plugins/sonar-squid-java-plugin/src/test/java/org/sonar/java/ast/check/MethodComplexityCheckTest.java
new file mode 100644
index 00000000000..5f8a73396bd
--- /dev/null
+++ b/plugins/sonar-squid-java-plugin/src/test/java/org/sonar/java/ast/check/MethodComplexityCheckTest.java
@@ -0,0 +1,35 @@
+package org.sonar.java.ast.check;
+
+import static org.hamcrest.Matchers.is;
+import static org.junit.Assert.assertThat;
+import static org.sonar.java.ast.SquidTestUtils.getFile;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.sonar.java.ast.JavaAstScanner;
+import org.sonar.java.squid.JavaSquidConfiguration;
+import org.sonar.squid.Squid;
+import org.sonar.squid.api.CheckMessage;
+import org.sonar.squid.api.SourceFile;
+
+public class MethodComplexityCheckTest {
+ private Squid squid;
+
+ @Before
+ public void setUp() {
+ squid = new Squid(new JavaSquidConfiguration());
+ MethodComplexityCheck check = new MethodComplexityCheck();
+ check.setThreshold(5);
+ squid.registerVisitor(check);
+ JavaAstScanner scanner = squid.register(JavaAstScanner.class);
+ scanner.scanFile(getFile("/metrics/branches/ComplexBranches.java"));
+ }
+
+ @Test
+ public void testMethodComplexityExceedsThreshold() {
+ SourceFile file = (SourceFile) squid.search("ComplexBranches.java");
+ assertThat(file.getCheckMessages().size(), is(1));
+ CheckMessage message = file.getCheckMessages().iterator().next();
+ assertThat(message.getLine(), is(10));
+ }
+}