01 /**
02 * BSD-style license; for more info see http://pmd.sourceforge.net/license.html
03 */
04 package net.sourceforge.pmd.lang.java.rule.design;
05
06 import net.sourceforge.pmd.lang.java.ast.ASTCompilationUnit;
07 import net.sourceforge.pmd.lang.java.ast.ASTIfStatement;
08 import net.sourceforge.pmd.lang.java.rule.AbstractJavaRule;
09 import net.sourceforge.pmd.lang.rule.properties.IntegerProperty;
10
11 public class AvoidDeeplyNestedIfStmtsRule extends AbstractJavaRule {
12
13 private int depth;
14 private int depthLimit;
15
16 private static final IntegerProperty PROBLEM_DEPTH_DESCRIPTOR = new IntegerProperty(
17 "problemDepth",
18 "The if statement depth reporting threshold",
19 1, 25,
20 3,
21 1.0f
22 );
23
24 public AvoidDeeplyNestedIfStmtsRule() {
25 definePropertyDescriptor(PROBLEM_DEPTH_DESCRIPTOR);
26 }
27
28 public Object visit(ASTCompilationUnit node, Object data) {
29 depth = 0;
30 depthLimit = getProperty(PROBLEM_DEPTH_DESCRIPTOR);
31 return super.visit(node, data);
32 }
33
34 public Object visit(ASTIfStatement node, Object data) {
35 if (!node.hasElse()) {
36 depth++;
37 }
38 super.visit(node, data);
39 if (depth == depthLimit) {
40 addViolation(data, node);
41 }
42 depth--;
43 return data;
44 }
45 }
|