1 /**
2 * BSD-style license; for more info see http://pmd.sourceforge.net/license.html
3 */
4 package net.sourceforge.pmd.rules.imports;
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.SimpleJavaNode;
12 import net.sourceforge.pmd.ast.SimpleNode;
13 import net.sourceforge.pmd.rules.ImportWrapper;
14
15 import java.util.HashSet;
16 import java.util.Set;
17
18 public class UnusedImportsRule extends AbstractRule {
19
20 protected Set<ImportWrapper> imports = new HashSet<ImportWrapper>();
21
22 public Object visit(ASTCompilationUnit node, Object data) {
23 imports.clear();
24 super.visit(node, data);
25 for (ImportWrapper wrapper : imports) {
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 (isQualifiedName(importedType)) {
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 protected void check(SimpleNode node) {
58 if (imports.isEmpty()) {
59 return;
60 }
61 ImportWrapper candidate = getImportWrapper(node);
62 if (imports.contains(candidate)) {
63 imports.remove(candidate);
64 }
65 }
66
67 protected ImportWrapper getImportWrapper(SimpleNode node) {
68 String name;
69 if (!isQualifiedName(node)) {
70 name = node.getImage();
71 } else {
72 name = node.getImage().substring(0, node.getImage().indexOf('.'));
73 }
74 ImportWrapper candidate = new ImportWrapper(node.getImage(), name, new SimpleJavaNode(-1));
75 return candidate;
76 }
77 }