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 }