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.RuleContext;
7 import net.sourceforge.pmd.ast.ASTClassOrInterfaceDeclaration;
8 import net.sourceforge.pmd.ast.ASTLocalVariableDeclaration;
9 import net.sourceforge.pmd.ast.ASTMethodDeclaration;
10
11 public class LocalVariableCouldBeFinal extends AbstractOptimizationRule {
12
13 public Object visit(ASTClassOrInterfaceDeclaration node, Object data) {
14 if (node.isInterface()) {
15 return data;
16 }
17 return super.visit(node, data);
18 }
19
20 /***
21 * Find if this variable is ever written.
22 *
23 * @see net.sourceforge.pmd.ast.JavaParserVisitor#visit(net.sourceforge.pmd.ast.ASTLocalVariableDeclaration, java.lang.Object)
24 */
25 public Object visit(ASTLocalVariableDeclaration node, Object data) {
26
27 if (node.isFinal()) {
28 return data;
29 }
30 final String varName = getVarName(node);
31
32 ASTMethodDeclaration md = (ASTMethodDeclaration) node.getFirstParentOfType(ASTMethodDeclaration.class);
33 if (md!=null) {
34 if (!isVarWritterInMethod(varName, md) ) {
35 addViolation((RuleContext)data, node);
36 }
37 }
38 return data;
39 }
40
41 }