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.Iterator;
12 import java.util.List;
13
14 /***
15 * Catches the use of exception statements as a flow control device.
16 *
17 * @author Will Sargent
18 */
19 public class ExceptionAsFlowControl extends AbstractRule {
20
21 public Object visit(ASTThrowStatement node, Object data) {
22 ASTTryStatement parent = (ASTTryStatement) node.getFirstParentOfType(ASTTryStatement.class);
23 if (parent == null) {
24 return data;
25 }
26 for (parent = (ASTTryStatement) parent.getFirstParentOfType(ASTTryStatement.class)
27 ; parent != null
28 ; parent = (ASTTryStatement) parent.getFirstParentOfType(ASTTryStatement.class)) {
29
30 List list = parent.findChildrenOfType(ASTCatchStatement.class);
31 for (Iterator iter = list.iterator(); iter.hasNext();) {
32 ASTCatchStatement catchStmt = (ASTCatchStatement) iter.next();
33 ASTFormalParameter fp = (ASTFormalParameter) catchStmt.jjtGetChild(0);
34 ASTType type = (ASTType) fp.findChildrenOfType(ASTType.class).get(0);
35 ASTClassOrInterfaceType name = (ASTClassOrInterfaceType) type.findChildrenOfType(ASTClassOrInterfaceType.class).get(0);
36 if (node.getFirstClassOrInterfaceTypeImage() != null && node.getFirstClassOrInterfaceTypeImage().equals(name.getImage())) {
37 addViolation(data, name);
38 }
39 }
40 }
41 return data;
42 }
43
44 }