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 = (ASTName) no.getLocation();
70 Node n = name.jjtGetParent().jjtGetParent().jjtGetParent();
71 if (n instanceof ASTCastExpression) {
72 addViolation(data, n);
73 }
74 }
75 return null;
76 }
77 }
|