View Javadoc

    1   /***
    2    * BSD-style license; for more info see http://pmd.sourceforge.net/license.html
    3    */
    4   package net.sourceforge.pmd.rules;
    5
    6   import net.sourceforge.pmd.AbstractRule;
    7   import net.sourceforge.pmd.ast.ASTClassOrInterfaceDeclaration;
    8   import net.sourceforge.pmd.ast.ASTConstructorDeclaration;
    9   import net.sourceforge.pmd.ast.ASTMethodDeclaration;
    10  import net.sourceforge.pmd.ast.Node;
    11  import net.sourceforge.pmd.ast.SimpleNode;
    12  import net.sourceforge.pmd.symboltable.NameOccurrence;
    13  import net.sourceforge.pmd.symboltable.VariableNameDeclaration;
    14
    15  import java.util.Iterator;
    16  import java.util.List;
    17  import java.util.Map;
    18
    19  public class UnusedFormalParameterRule extends AbstractRule {
    20
    21      public Object visit(ASTConstructorDeclaration node, Object data) {
    22          check(node, data);
    23          return data;
    24      }
    25
    26      public Object visit(ASTMethodDeclaration node, Object data) {
    27          if (!node.isPrivate() && !hasProperty("checkall")) {
    28              return data;
    29          }
    30          if (!node.isNative()) {
    31              check(node, data);
    32          }
    33          return data;
    34      }
    35
    36      private void check(SimpleNode node, Object data) {
    37          Node parent = node.jjtGetParent().jjtGetParent().jjtGetParent();
    38          if (parent instanceof ASTClassOrInterfaceDeclaration && !((ASTClassOrInterfaceDeclaration) parent).isInterface()) {
    39              Map vars = node.getScope().getVariableDeclarations();
    40              for (Iterator i = vars.entrySet().iterator(); i.hasNext();) {
    41                  Map.Entry entry = (Map.Entry) i.next();
    42                  VariableNameDeclaration nameDecl = (VariableNameDeclaration) entry.getKey();
    43                  if (actuallyUsed(nameDecl, (List) entry.getValue())) {
    44                      continue;
    45                  }
    46                  addViolation(data, node, new Object[]{node instanceof ASTMethodDeclaration ? "method" : "constructor", nameDecl.getImage()});
    47              }
    48          }
    49      }
    50
    51      private boolean actuallyUsed(VariableNameDeclaration nameDecl, List usages) {
    52          for (Iterator j = usages.iterator(); j.hasNext();) {
    53              NameOccurrence occ = (NameOccurrence) j.next();
    54              if (occ.isOnLeftHandSide()) {
    55                  if (nameDecl.isArray() && occ.getLocation().jjtGetParent().jjtGetParent().jjtGetNumChildren() > 1) {
    56                      // array element access
    57                      return true;
    58                  }
    59                  continue;
    60              } else {
    61                  return true;
    62              }
    63          }
    64          return false;
    65      }
    66
    67
    68  }