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  }