LocalVariableCouldBeFinalRule.java
01 /**
02  * BSD-style license; for more info see http://pmd.sourceforge.net/license.html
03  */
04 package net.sourceforge.pmd.lang.java.rule.optimizations;
05 
06 import java.util.List;
07 import java.util.Map;
08 
09 import net.sourceforge.pmd.lang.ast.Node;
10 import net.sourceforge.pmd.lang.java.ast.ASTLocalVariableDeclaration;
11 import net.sourceforge.pmd.lang.java.symboltable.NameOccurrence;
12 import net.sourceforge.pmd.lang.java.symboltable.Scope;
13 import net.sourceforge.pmd.lang.java.symboltable.VariableNameDeclaration;
14 
15 public class LocalVariableCouldBeFinalRule extends AbstractOptimizationRule {
16 
17     public Object visit(ASTLocalVariableDeclaration node, Object data) {
18         if (node.isFinal()) {
19             return data;
20         }
21         Scope s = node.getScope();
22         Map<VariableNameDeclaration, List<NameOccurrence>> decls = s.getVariableDeclarations();
23         for (Map.Entry<VariableNameDeclaration, List<NameOccurrence>> entry: decls.entrySet()) {
24             VariableNameDeclaration var = entry.getKey();
25             if (var.getAccessNodeParent() != node) {
26                 continue;
27             }
28             if (!assigned(entry.getValue())) {
29                 addViolation(data, (Node)var.getAccessNodeParent(), var.getImage());
30             }
31         }
32         return data;
33     }
34 
35 }