1 package net.sourceforge.pmd.rules.design;
2
3 import net.sourceforge.pmd.AbstractRule;
4 import net.sourceforge.pmd.ast.ASTCatchStatement;
5 import net.sourceforge.pmd.ast.ASTClassOrInterfaceType;
6 import net.sourceforge.pmd.ast.ASTFormalParameter;
7 import net.sourceforge.pmd.ast.ASTThrowStatement;
8 import net.sourceforge.pmd.ast.ASTTryStatement;
9 import net.sourceforge.pmd.ast.ASTType;
10
11 import java.util.List;
12
13 /**
14 * Catches the use of exception statements as a flow control device.
15 *
16 * @author Will Sargent
17 */
18 public class ExceptionAsFlowControl extends AbstractRule {
19
20 public Object visit(ASTThrowStatement node, Object data) {
21 ASTTryStatement parent = node.getFirstParentOfType(ASTTryStatement.class);
22 if (parent == null) {
23 return data;
24 }
25 for (parent = parent.getFirstParentOfType(ASTTryStatement.class)
26 ; parent != null
27 ; parent = parent.getFirstParentOfType(ASTTryStatement.class)) {
28
29 List<ASTCatchStatement> list = parent.findChildrenOfType(ASTCatchStatement.class);
30 for (ASTCatchStatement catchStmt: list) {
31 ASTFormalParameter fp = (ASTFormalParameter) catchStmt.jjtGetChild(0);
32 ASTType type = fp.findChildrenOfType(ASTType.class).get(0);
33 ASTClassOrInterfaceType name = type.findChildrenOfType(ASTClassOrInterfaceType.class).get(0);
34 if (node.getFirstClassOrInterfaceTypeImage() != null && node.getFirstClassOrInterfaceTypeImage().equals(name.getImage())) {
35 addViolation(data, name);
36 }
37 }
38 }
39 return data;
40 }
41
42 }