1 4 package net.sourceforge.pmd.rules.optimization; 5 6 import net.sourceforge.pmd.ast.ASTAllocationExpression; 7 import net.sourceforge.pmd.ast.ASTDoStatement; 8 import net.sourceforge.pmd.ast.ASTForStatement; 9 import net.sourceforge.pmd.ast.ASTReturnStatement; 10 import net.sourceforge.pmd.ast.ASTThrowStatement; 11 import net.sourceforge.pmd.ast.ASTWhileStatement; 12 13 public class AvoidInstantiatingObjectsInLoops extends AbstractOptimizationRule { 14 15 public Object visit(ASTAllocationExpression node, Object data) { 16 if (insideLoop(node) && fourthParentNotThrow(node) && fourthParentNotReturn(node)) { 17 addViolation(data, node); 18 } 19 return data; 20 } 21 22 private boolean fourthParentNotThrow(ASTAllocationExpression node) { 23 return !(node.jjtGetParent().jjtGetParent().jjtGetParent().jjtGetParent() instanceof ASTThrowStatement); 24 } 25 26 private boolean fourthParentNotReturn(ASTAllocationExpression node) { 27 return !(node.jjtGetParent().jjtGetParent().jjtGetParent().jjtGetParent() instanceof ASTReturnStatement); 28 } 29 30 private boolean insideLoop(ASTAllocationExpression node) { 31 if (node.getFirstParentOfType(ASTDoStatement.class) != null) { 32 return true; 33 } 34 if (node.getFirstParentOfType(ASTWhileStatement.class) != null) { 35 return true; 36 } 37 if (node.getFirstParentOfType(ASTForStatement.class) != null) { 38 return true; 39 } 40 return false; 41 } 42 } 43 | Popular Tags |