View Javadoc

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.Iterator;
17  import java.util.Set;
18  
19  public class UnusedImportsRule extends AbstractRule {
20  
21      private Set imports = new HashSet();
22  
23      public Object visit(ASTCompilationUnit node, Object data) {
24          imports.clear();
25          super.visit(node, data);
26          for (Iterator i = imports.iterator(); i.hasNext();) {
27              ImportWrapper wrapper = (ImportWrapper) i.next();
28              addViolation(data, wrapper.getNode(), wrapper.getFullName());
29          }
30          return data;
31      }
32  
33      public Object visit(ASTImportDeclaration node, Object data) {
34          if (!node.isImportOnDemand()) {
35              ASTName importedType = (ASTName) node.jjtGetChild(0);
36              String className;
37              if (importedType.getImage().indexOf('.') != -1) {
38                  int lastDot = importedType.getImage().lastIndexOf('.') + 1;
39                  className = importedType.getImage().substring(lastDot);
40              } else {
41                  className = importedType.getImage();
42              }
43              imports.add(new ImportWrapper(importedType.getImage(), className, node));
44          }
45  
46          return data;
47      }
48  
49      public Object visit(ASTClassOrInterfaceType node, Object data) {
50          check(node);
51          return super.visit(node, data);
52      }
53  
54      public Object visit(ASTName node, Object data) {
55          check(node);
56          return data;
57      }
58  
59      private void check(SimpleNode node) {
60          String name;
61          if (node.getImage().indexOf('.') == -1) {
62              name = node.getImage();
63          } else {
64              name = node.getImage().substring(0, node.getImage().indexOf('.'));
65          }
66          ImportWrapper candidate = new ImportWrapper(node.getImage(), name, new SimpleJavaNode(-1));
67          if (imports.contains(candidate)) {
68              imports.remove(candidate);
69          }
70      }
71  }