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 } 78 | Popular Tags |