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  }