1 /*** 2 * BSD-style license; for more info see http://pmd.sourceforge.net/license.html 3 */ 4 package net.sourceforge.pmd.rules; 5 6 import net.sourceforge.pmd.AbstractRule; 7 import net.sourceforge.pmd.ast.ASTClassOrInterfaceType; 8 import net.sourceforge.pmd.ast.ASTCompilationUnit; 9 import net.sourceforge.pmd.ast.ASTImportDeclaration; 10 import net.sourceforge.pmd.ast.ASTName; 11 import net.sourceforge.pmd.ast.SimpleNode; 12 13 import java.util.HashSet; 14 import java.util.Iterator; 15 import java.util.Set; 16 17 public class UnusedImportsRule extends AbstractRule { 18 19 private Set imports = new HashSet(); 20 21 public Object visit(ASTCompilationUnit node, Object data) { 22 imports.clear(); 23 super.visit(node, data); 24 for (Iterator i = imports.iterator(); i.hasNext();) { 25 ImportWrapper wrapper = (ImportWrapper) i.next(); 26 addViolation(data, wrapper.getNode(), wrapper.getFullName()); 27 } 28 return data; 29 } 30 31 public Object visit(ASTImportDeclaration node, Object data) { 32 if (!node.isImportOnDemand()) { 33 ASTName importedType = (ASTName) node.jjtGetChild(0); 34 String className; 35 if (importedType.getImage().indexOf('.') != -1) { 36 int lastDot = importedType.getImage().lastIndexOf('.') + 1; 37 className = importedType.getImage().substring(lastDot); 38 } else { 39 className = importedType.getImage(); 40 } 41 imports.add(new ImportWrapper(importedType.getImage(), className, node)); 42 } 43 44 return data; 45 } 46 47 public Object visit(ASTClassOrInterfaceType node, Object data) { 48 check(node); 49 return super.visit(node, data); 50 } 51 52 public Object visit(ASTName node, Object data) { 53 check(node); 54 return data; 55 } 56 57 private void check(SimpleNode node) { 58 String name; 59 if (node.getImage().indexOf('.') == -1) { 60 name = node.getImage(); 61 } else { 62 name = node.getImage().substring(0, node.getImage().indexOf('.')); 63 } 64 ImportWrapper candidate = new ImportWrapper(node.getImage(), name, new SimpleNode(-1)); 65 if (imports.contains(candidate)) { 66 imports.remove(candidate); 67 } 68 } 69 }