View Javadoc

    1   /**
    2    * BSD-style license; for more info see http://pmd.sourceforge.net/license.html
    3    */
    4   package net.sourceforge.pmd.lang.java.rule.design;
    5
    6   import java.util.List;
    7   import java.util.Map;
    8
    9   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  }