View Javadoc

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  }