View Javadoc

    1   package net.sourceforge.pmd.rules.migration;
    2
    3   import net.sourceforge.pmd.AbstractRule;
    4   import net.sourceforge.pmd.ast.ASTCastExpression;
    5   import net.sourceforge.pmd.ast.ASTClassOrInterfaceType;
    6   import net.sourceforge.pmd.ast.ASTFieldDeclaration;
    7   import net.sourceforge.pmd.ast.ASTLocalVariableDeclaration;
    8   import net.sourceforge.pmd.ast.ASTName;
    9   import net.sourceforge.pmd.ast.ASTVariableDeclaratorId;
    10  import net.sourceforge.pmd.ast.SimpleNode;
    11  import net.sourceforge.pmd.symboltable.NameOccurrence;
    12
    13  import java.util.HashSet;
    14  import java.util.Iterator;
    15  import java.util.List;
    16  import java.util.Set;
    17
    18  public class UnnecessaryCast extends AbstractRule {
    19
    20      private static Set implClassNames = new HashSet();
    21
    22      static {
    23          implClassNames.add("List");
    24          implClassNames.add("Set");
    25          implClassNames.add("Map");
    26          implClassNames.add("java.util.List");
    27          implClassNames.add("java.util.Set");
    28          implClassNames.add("java.util.Map");
    29          implClassNames.add("ArrayList");
    30          implClassNames.add("HashSet");
    31          implClassNames.add("HashMap");
    32          implClassNames.add("LinkedHashMap");
    33          implClassNames.add("LinkedHashSet");
    34          implClassNames.add("TreeSet");
    35          implClassNames.add("TreeMap");
    36          implClassNames.add("Vector");
    37          implClassNames.add("java.util.ArrayList");
    38          implClassNames.add("java.util.HashSet");
    39          implClassNames.add("java.util.HashMap");
    40          implClassNames.add("java.util.LinkedHashMap");
    41          implClassNames.add("java.util.LinkedHashSet");
    42          implClassNames.add("java.util.TreeSet");
    43          implClassNames.add("java.util.TreeMap");
    44          implClassNames.add("java.util.Vector");
    45      }
    46
    47      public Object visit(ASTLocalVariableDeclaration node, Object data) {
    48          return process(node, data);
    49      }
    50
    51      public Object visit(ASTFieldDeclaration node, Object data) {
    52          return process(node, data);
    53      }
    54
    55      private Object process(SimpleNode node, Object data) {
    56          ASTClassOrInterfaceType cit = (ASTClassOrInterfaceType) node.getFirstChildOfType(ASTClassOrInterfaceType.class);
    57          if (cit == null || !implClassNames.contains(cit.getImage())) {
    58              return data;
    59          }
    60          cit = (ASTClassOrInterfaceType) cit.getFirstChildOfType(ASTClassOrInterfaceType.class);
    61          if (cit == null) {
    62              return data;
    63          }
    64          ASTVariableDeclaratorId decl = (ASTVariableDeclaratorId) node
    65                  .getFirstChildOfType(ASTVariableDeclaratorId.class);
    66          List usages = decl.getUsages();
    67          for (Iterator iter = usages.iterator(); iter.hasNext();) {
    68              NameOccurrence no = (NameOccurrence) iter.next();
    69              ASTName name = (ASTName) no.getLocation();
    70              SimpleNode n = (SimpleNode) name.jjtGetParent().jjtGetParent().jjtGetParent();
    71              if (ASTCastExpression.class.equals(n.getClass())) {
    72                  addViolation(data, n);
    73              }
    74          }
    75          return null;
    76      }
    77  }