1 package net.sourceforge.pmd.lang.java.rule.strictexception;
2
3 import java.util.List;
4
5 import net.sourceforge.pmd.lang.java.ast.ASTCatchStatement;
6 import net.sourceforge.pmd.lang.java.ast.ASTClassOrInterfaceType;
7 import net.sourceforge.pmd.lang.java.ast.ASTFormalParameter;
8 import net.sourceforge.pmd.lang.java.ast.ASTThrowStatement;
9 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
15
16
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 = (ASTFormalParameter) catchStmt.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 }