1 /***
2 * BSD-style license; for more info see http://pmd.sourceforge.net/license.html
3 */
4 package net.sourceforge.pmd.rules.optimization;
5
6 import net.sourceforge.pmd.ast.ASTAllocationExpression;
7 import net.sourceforge.pmd.ast.ASTClassOrInterfaceDeclaration;
8 import net.sourceforge.pmd.ast.ASTDoStatement;
9 import net.sourceforge.pmd.ast.ASTForStatement;
10 import net.sourceforge.pmd.ast.ASTReturnStatement;
11 import net.sourceforge.pmd.ast.ASTThrowStatement;
12 import net.sourceforge.pmd.ast.ASTWhileStatement;
13
14 public class AvoidInstantiatingObjectsInLoops extends AbstractOptimizationRule {
15
16 public Object visit(ASTClassOrInterfaceDeclaration node, Object data) {
17 if (node.isInterface()) {
18 return data;
19 }
20 return super.visit(node, data);
21 }
22
23
24 public Object visit(ASTAllocationExpression node, Object data) {
25 if (insideLoop(node) && fourthParentNotThrow(node) && fourthParentNotReturn(node)) {
26 addViolation(data, node);
27 }
28 return data;
29 }
30
31 private boolean fourthParentNotThrow(ASTAllocationExpression node) {
32 return !(node.jjtGetParent().jjtGetParent().jjtGetParent().jjtGetParent() instanceof ASTThrowStatement);
33 }
34
35 private boolean fourthParentNotReturn(ASTAllocationExpression node) {
36 return !(node.jjtGetParent().jjtGetParent().jjtGetParent().jjtGetParent() instanceof ASTReturnStatement);
37 }
38
39 private boolean insideLoop(ASTAllocationExpression node) {
40 if (node.getFirstParentOfType(ASTDoStatement.class) != null) {
41 return true;
42 }
43 if (node.getFirstParentOfType(ASTWhileStatement.class) != null) {
44 return true;
45 }
46 if (node.getFirstParentOfType(ASTForStatement.class) != null) {
47 return true;
48 }
49 return false;
50 }
51 }