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.RuleContext;
8   import net.sourceforge.pmd.ast.ASTClassOrInterfaceType;
9   import net.sourceforge.pmd.ast.ASTCompilationUnit;
10  import net.sourceforge.pmd.ast.ASTImportDeclaration;
11  import net.sourceforge.pmd.ast.ASTName;
12  import net.sourceforge.pmd.ast.SimpleNode;
13  
14  import java.text.MessageFormat;
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  
26          super.visit(node, data);
27  
28          RuleContext ctx = (RuleContext) data;
29          for (Iterator i = imports.iterator(); i.hasNext();) {
30              ImportWrapper wrapper = (ImportWrapper) i.next();
31              String msg = MessageFormat.format(getMessage(), new Object[]{wrapper.getFullName()});
32              ctx.getReport().addRuleViolation(createRuleViolation(ctx, wrapper.getPositionProvider(), msg));
33          }
34          return data;
35      }
36  
37      public Object visit(ASTImportDeclaration node, Object data) {
38          if (!node.isImportOnDemand()) {
39              ASTName importedType = (ASTName) node.jjtGetChild(0);
40              String className;
41              if (importedType.getImage().indexOf('.') != -1) {
42                  int lastDot = importedType.getImage().lastIndexOf('.') + 1;
43                  className = importedType.getImage().substring(lastDot);
44              } else {
45                  className = importedType.getImage();
46              }
47              ImportWrapper wrapper = new ImportWrapper(importedType.getImage(), className, node);
48              imports.add(wrapper);
49          }
50  
51          return data;
52      }
53  
54      public Object visit(ASTClassOrInterfaceType node, Object data) {
55          check(node);
56          return super.visit(node, data);
57      }
58  
59      public Object visit(ASTName node, Object data) {
60          check(node);
61          return data;
62      }
63  
64      private void check(SimpleNode node) {
65          String name;
66          if (node.getImage().indexOf('.') == -1) {
67              name = node.getImage();
68          } else {
69              name = node.getImage().substring(0, node.getImage().indexOf('.'));
70          }
71          ImportWrapper candidate = new ImportWrapper(node.getImage(), name, new SimpleNode(-1));
72          if (imports.contains(candidate)) {
73              imports.remove(candidate);
74          }
75      }
76  }