/**
* BSD-style license; for more info see http://pmd.sourceforge.net/license.html
*/
package net.sourceforge.pmd.lang.vm.rule.basic;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import net.sourceforge.pmd.lang.vm.ast.ASTDirective;
import net.sourceforge.pmd.lang.vm.ast.ASTReference;
import net.sourceforge.pmd.lang.vm.ast.ASTSetDirective;
import net.sourceforge.pmd.lang.vm.rule.AbstractVmRule;
public class AvoidReassigningParametersRule extends AbstractVmRule {
@Override
public Object visit(final ASTDirective node, final Object data) {
if ("macro".equals(node.getDirectiveName())) {
final Set<String> paramNames = new HashSet<>();
final List<ASTReference> params = node.findChildrenOfType(ASTReference.class);
for (final ASTReference param : params) {
paramNames.add(param.getFirstToken().toString());
}
final List<ASTSetDirective> assignments = node.findDescendantsOfType(ASTSetDirective.class);
for (final ASTSetDirective assignment : assignments) {
final ASTReference ref = assignment.getFirstChildOfType(ASTReference.class);
if (ref != null && paramNames.contains(ref.getFirstToken().toString())) {
addViolation(data, node, ref.getFirstToken().toString());
}
}
}
return super.visit(node, data);
}
}