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.List; 15 import java.util.Set; 16 17 public class UnnecessaryCast extends AbstractRule { 18 19 private static Set<String> implClassNames = new HashSet<String>(); 20 21 static { 22 implClassNames.add("List"); 23 implClassNames.add("Set"); 24 implClassNames.add("Map"); 25 implClassNames.add("java.util.List"); 26 implClassNames.add("java.util.Set"); 27 implClassNames.add("java.util.Map"); 28 implClassNames.add("ArrayList"); 29 implClassNames.add("HashSet"); 30 implClassNames.add("HashMap"); 31 implClassNames.add("LinkedHashMap"); 32 implClassNames.add("LinkedHashSet"); 33 implClassNames.add("TreeSet"); 34 implClassNames.add("TreeMap"); 35 implClassNames.add("Vector"); 36 implClassNames.add("java.util.ArrayList"); 37 implClassNames.add("java.util.HashSet"); 38 implClassNames.add("java.util.HashMap"); 39 implClassNames.add("java.util.LinkedHashMap"); 40 implClassNames.add("java.util.LinkedHashSet"); 41 implClassNames.add("java.util.TreeSet"); 42 implClassNames.add("java.util.TreeMap"); 43 implClassNames.add("java.util.Vector"); 44 } 45 46 public Object visit(ASTLocalVariableDeclaration node, Object data) { 47 return process(node, data); 48 } 49 50 public Object visit(ASTFieldDeclaration node, Object data) { 51 return process(node, data); 52 } 53 54 private Object process(SimpleNode node, Object data) { 55 ASTClassOrInterfaceType cit = node.getFirstChildOfType(ASTClassOrInterfaceType.class); 56 if (cit == null || !implClassNames.contains(cit.getImage())) { 57 return data; 58 } 59 cit = cit.getFirstChildOfType(ASTClassOrInterfaceType.class); 60 if (cit == null) { 61 return data; 62 } 63 ASTVariableDeclaratorId decl = node.getFirstChildOfType(ASTVariableDeclaratorId.class); 64 List<NameOccurrence> usages = decl.getUsages(); 65 for (NameOccurrence no: usages) { 66 ASTName name = (ASTName) no.getLocation(); 67 SimpleNode n = (SimpleNode) name.jjtGetParent().jjtGetParent().jjtGetParent(); 68 if (ASTCastExpression.class.equals(n.getClass())) { 69 addViolation(data, n); 70 } 71 } 72 return null; 73 } 74 }