ExceptionAsFlowControlRule.java
01 package net.sourceforge.pmd.lang.java.rule.strictexception;
02 
03 import java.util.List;
04 
05 import net.sourceforge.pmd.lang.java.ast.ASTCatchStatement;
06 import net.sourceforge.pmd.lang.java.ast.ASTClassOrInterfaceType;
07 import net.sourceforge.pmd.lang.java.ast.ASTFormalParameter;
08 import net.sourceforge.pmd.lang.java.ast.ASTThrowStatement;
09 import net.sourceforge.pmd.lang.java.ast.ASTTryStatement;
10 import net.sourceforge.pmd.lang.java.ast.ASTType;
11 import net.sourceforge.pmd.lang.java.rule.AbstractJavaRule;
12 
13 /**
14  * Catches the use of exception statements as a flow control device.
15  *
16  @author Will Sargent
17  */
18 public class ExceptionAsFlowControlRule extends AbstractJavaRule {
19 
20     @Override
21     public Object visit(ASTThrowStatement node, Object data) {
22         ASTTryStatement parent = node.getFirstParentOfType(ASTTryStatement.class);
23         if (parent == null) {
24             return data;
25         }
26         for (parent = parent.getFirstParentOfType(ASTTryStatement.class)
27                 ; parent != null
28                 ; parent = parent.getFirstParentOfType(ASTTryStatement.class)) {
29 
30             List<ASTCatchStatement> list = parent.findDescendantsOfType(ASTCatchStatement.class);
31             for (ASTCatchStatement catchStmt: list) {
32                 ASTFormalParameter fp = (ASTFormalParametercatchStmt.jjtGetChild(0);
33                 ASTType type = fp.getFirstDescendantOfType(ASTType.class);
34                 ASTClassOrInterfaceType name = type.getFirstDescendantOfType(ASTClassOrInterfaceType.class);
35                 if (node.getFirstClassOrInterfaceTypeImage() != null && node.getFirstClassOrInterfaceTypeImage().equals(name.getImage())) {
36                     addViolation(data, name);
37                 }
38             }
39         }
40         return data;
41     }
42 
43 }