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.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  }