UnnecessaryCastRule.java
01 package net.sourceforge.pmd.lang.java.rule.migrating;
02 
03 import java.util.HashSet;
04 import java.util.List;
05 import java.util.Set;
06 
07 import net.sourceforge.pmd.lang.ast.Node;
08 import net.sourceforge.pmd.lang.java.ast.ASTCastExpression;
09 import net.sourceforge.pmd.lang.java.ast.ASTClassOrInterfaceType;
10 import net.sourceforge.pmd.lang.java.ast.ASTFieldDeclaration;
11 import net.sourceforge.pmd.lang.java.ast.ASTLocalVariableDeclaration;
12 import net.sourceforge.pmd.lang.java.ast.ASTName;
13 import net.sourceforge.pmd.lang.java.ast.ASTVariableDeclaratorId;
14 import net.sourceforge.pmd.lang.java.rule.AbstractJavaRule;
15 import net.sourceforge.pmd.lang.java.symboltable.NameOccurrence;
16 
17 //FUTURE This is not referenced by any RuleSet?
18 public class UnnecessaryCastRule extends AbstractJavaRule {
19 
20     private static Set<String> implClassNames = new HashSet<String>();
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     @Override
48     public Object visit(ASTLocalVariableDeclaration node, Object data) {
49         return process(node, data);
50     }
51 
52     @Override
53     public Object visit(ASTFieldDeclaration node, Object data) {
54         return process(node, data);
55     }
56 
57     private Object process(Node node, Object data) {
58         ASTClassOrInterfaceType cit = node.getFirstDescendantOfType(ASTClassOrInterfaceType.class);
59         if (cit == null || !implClassNames.contains(cit.getImage())) {
60             return data;
61         }
62         cit = cit.getFirstDescendantOfType(ASTClassOrInterfaceType.class);
63         if (cit == null) {
64             return data;
65         }
66         ASTVariableDeclaratorId decl = node.getFirstDescendantOfType(ASTVariableDeclaratorId.class);
67         List<NameOccurrence> usages = decl.getUsages();
68         for (NameOccurrence no: usages) {
69             ASTName name = (ASTNameno.getLocation();
70             Node n = name.jjtGetParent().jjtGetParent().jjtGetParent();
71             if (instanceof ASTCastExpression) {
72                 addViolation(data, n);
73             }
74         }
75         return null;
76     }
77 }