/**
* BSD-style license; for more info see http://pmd.sourceforge.net/license.html
*/
package net.sourceforge.pmd.lang.java.rule.design;
import java.util.List;
import java.util.Map;
import net.sourceforge.pmd.lang.java.ast.ASTConstructorDeclaration;
import net.sourceforge.pmd.lang.java.ast.ASTMethodDeclarator;
import net.sourceforge.pmd.lang.java.rule.AbstractJavaRule;
import net.sourceforge.pmd.lang.java.symboltable.JavaNameOccurrence;
import net.sourceforge.pmd.lang.java.symboltable.VariableNameDeclaration;
import net.sourceforge.pmd.lang.symboltable.NameOccurrence;
public class AvoidReassigningParametersRule extends AbstractJavaRule {
@Override
public Object visit(ASTMethodDeclarator node, Object data) {
Map<VariableNameDeclaration, List<NameOccurrence>> params = node.getScope()
.getDeclarations(VariableNameDeclaration.class);
this.lookForViolation(params, data);
return super.visit(node, data);
}
private void lookForViolation(Map<VariableNameDeclaration, List<NameOccurrence>> params, Object data) {
for (Map.Entry<VariableNameDeclaration, List<NameOccurrence>> entry : params.entrySet()) {
VariableNameDeclaration decl = entry.getKey();
List<NameOccurrence> usages = entry.getValue();
for (NameOccurrence occ : usages) {
JavaNameOccurrence jocc = (JavaNameOccurrence) occ;
if ((jocc.isOnLeftHandSide() || jocc.isSelfAssignment())
&& jocc.getNameForWhichThisIsAQualifier() == null && !jocc.useThisOrSuper() && !decl.isVarargs()
&& (!decl.isArray()
|| jocc.getLocation().jjtGetParent().jjtGetParent().jjtGetNumChildren() == 1)) {
// not an array or no primary suffix to access the array
// values
addViolation(data, decl.getNode(), decl.getImage());
}
}
}
}
@Override
public Object visit(ASTConstructorDeclaration node, Object data) {
Map<VariableNameDeclaration, List<NameOccurrence>> params = node.getScope()
.getDeclarations(VariableNameDeclaration.class);
this.lookForViolation(params, data);
return super.visit(node, data);
}
}