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 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 } 45 | Popular Tags |