AvoidReassigningParametersRule.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.design;
05 
06 import java.util.List;
07 import java.util.Map;
08 
09 import net.sourceforge.pmd.lang.java.ast.ASTConstructorDeclaration;
10 import net.sourceforge.pmd.lang.java.ast.ASTMethodDeclarator;
11 import net.sourceforge.pmd.lang.java.rule.AbstractJavaRule;
12 import net.sourceforge.pmd.lang.java.symboltable.NameOccurrence;
13 import net.sourceforge.pmd.lang.java.symboltable.VariableNameDeclaration;
14 
15 public class AvoidReassigningParametersRule extends AbstractJavaRule {
16 
17   @Override
18     public Object visit(ASTMethodDeclarator node, Object data) {
19         Map<VariableNameDeclaration, List<NameOccurrence>> params = node.getScope().getVariableDeclarations();
20         this.lookForViolation(params, data);
21         return super.visit(node, data);
22     }
23 
24   private void lookForViolation(Map<VariableNameDeclaration,List<NameOccurrence>> params,Object data) {
25         for (Map.Entry<VariableNameDeclaration, List<NameOccurrence>> entry: params.entrySet()) {
26             VariableNameDeclaration decl = entry.getKey();
27             List<NameOccurrence> usages = entry.getValue();
28             for (NameOccurrence occ: usages) {
29                 if ((occ.isOnLeftHandSide() || occ.isSelfAssignment()) &&
30                     occ.getNameForWhichThisIsAQualifier() == null &&
31                     (! occ.useThisOrSuper()) &&
32                     (!decl.isArray() || occ.getLocation().jjtGetParent().jjtGetParent().jjtGetNumChildren() == 1))
33                 {
34                     // not an array or no primary suffix to access the array values
35                     addViolation(data, decl.getNode(), decl.getImage());
36                 }
37             }
38         }
39   }
40 
41     @Override
42     public Object visit(ASTConstructorDeclaration node,Object data) {
43       Map<VariableNameDeclaration,List<NameOccurrence>> params = node.getScope().getVariableDeclarations();
44       this.lookForViolation(params, data);
45       return super.visit(node,data);
46     }
47 }