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 }
|