AvoidDeeplyNestedIfStmtsRule.java
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         125,
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 }