Class UnusedImportsCheck
- java.lang.Object
-
- com.puppycrawl.tools.checkstyle.AbstractAutomaticBean
-
- com.puppycrawl.tools.checkstyle.api.AbstractViolationReporter
-
- com.puppycrawl.tools.checkstyle.api.AbstractCheck
-
- com.puppycrawl.tools.checkstyle.checks.imports.UnusedImportsCheck
-
- All Implemented Interfaces:
Configurable
,Contextualizable
public class UnusedImportsCheck extends AbstractCheck
Checks for unused import statements. Checkstyle uses a simple but very reliable algorithm to report on unused import statements. An import statement is considered unused if:
-
It is not referenced in the file. The algorithm does not support wild-card
imports like
import java.io.*;
. Most IDE's provide very sophisticated checks for imports that handle wild-card imports. - It is a duplicate of another import. This is when a class is imported more than once.
-
The class imported is from the
java.lang
package. For example importingjava.lang.String
. - The class imported is from the same package.
-
Optionally: it is referenced in Javadoc comments. This check is on by
default, but it is considered bad practice to introduce a compile-time
dependency for documentation purposes only. As an example, the import
java.util.List
would be considered referenced with the Javadoc comment{@link List}
. The alternative to avoid introducing a compile-time dependency would be to write the Javadoc comment as{@link java.util.List}
.
The main limitation of this check is handling the cases where:
- An imported type has the same name as a declaration, such as a member variable.
- There are two or more imports with the same name.
For example, in the following case all imports will not be flagged as unused:
import java.awt.Component; import static AstTreeStringPrinter.printFileAst; import static DetailNodeTreeStringPrinter.printFileAst; class FooBar { private Object Component; // a bad practice in my opinion void method() { printFileAst(file); // two imports with the same name } }
-
Property
processJavadoc
- Control whether to process Javadoc comments. Type isboolean
. Default value istrue
.
To configure the check:
<module name="UnusedImports"/>
Parent is
com.puppycrawl.tools.checkstyle.TreeWalker
Violation Message Keys:
-
import.unused
- Since:
- 3.0
-
-
Nested Class Summary
Nested Classes Modifier and Type Class Description private static class
UnusedImportsCheck.Frame
Holds the names of referenced types and names of declared inner types.-
Nested classes/interfaces inherited from class com.puppycrawl.tools.checkstyle.AbstractAutomaticBean
AbstractAutomaticBean.OutputStreamOptions
-
-
Field Summary
Fields Modifier and Type Field Description private static java.util.regex.Pattern
ARGUMENT_NAME
Regex to match argument names.private static java.util.regex.Pattern
CLASS_NAME
Regex to match class names.private boolean
collect
Flag to indicate when time to start collecting references.private UnusedImportsCheck.Frame
currentFrame
The scope is being processed.private static java.util.regex.Pattern
FIRST_CLASS_NAME
Regex to match the first class name.private java.util.Set<FullIdent>
imports
Set of the imports.private static java.util.regex.Pattern
JAVA_LANG_PACKAGE_PATTERN
Regexp pattern to match java.lang package.static java.lang.String
MSG_KEY
A key is pointing to the warning message text in "messages.properties" file.private boolean
processJavadoc
Control whether to process Javadoc comments.private static java.lang.String
STAR_IMPORT_SUFFIX
Suffix for the star import.
-
Constructor Summary
Constructors Constructor Description UnusedImportsCheck()
-
Method Summary
All Methods Static Methods Instance Methods Concrete Methods Modifier and Type Method Description void
beginTree(DetailAST rootAST)
Called before the starting to process a tree.private void
collectReferencesFromJavadoc(DetailAST ast)
Collects references made in Javadoc comments.private static java.util.Set<java.lang.String>
collectReferencesFromJavadoc(TextBlock textBlock)
Process a javadocTextBlock
and return the set of classes referenced within.void
finishTree(DetailAST rootAST)
Called after finished processing a tree.int[]
getAcceptableTokens()
The configurable token set.int[]
getDefaultTokens()
Returns the default token a check is interested in.int[]
getRequiredTokens()
The tokens that this check must be registered for.private static java.util.List<JavadocTag>
getValidTags(TextBlock cmt, JavadocUtil.JavadocTagType tagType)
Returns the list of valid tags found in a javadocTextBlock
.private boolean
isUnusedImport(java.lang.String imprt)
Checks whether an import is unused.void
leaveToken(DetailAST ast)
Called after all the child nodes have been process.private static java.util.Set<java.lang.String>
matchPattern(java.lang.String identifier, java.util.regex.Pattern pattern)
Extracts a set of texts matching aPattern
from aString
.private void
processIdent(DetailAST ast)
Collects references made by IDENT.private void
processImport(DetailAST ast)
Collects the details of imports.private static java.util.Set<java.lang.String>
processJavadocTag(JavadocTag tag)
Returns a list of references that found in a javadocJavadocTag
.private void
processStaticImport(DetailAST ast)
Collects the details of static imports.void
setProcessJavadoc(boolean value)
Setter to control whether to process Javadoc comments.private static java.lang.String
topLevelType(java.lang.String type)
If the given type string contains "." (e.g.void
visitToken(DetailAST ast)
Called to process a token.-
Methods inherited from class com.puppycrawl.tools.checkstyle.api.AbstractCheck
clearViolations, destroy, getFileContents, getFilePath, getLine, getLineCodePoints, getLines, getTabWidth, getTokenNames, getViolations, init, isCommentNodesRequired, log, log, log, setFileContents, setTabWidth, setTokens
-
Methods inherited from class com.puppycrawl.tools.checkstyle.api.AbstractViolationReporter
finishLocalSetup, getCustomMessages, getId, getMessageBundle, getSeverity, getSeverityLevel, setId, setSeverity
-
Methods inherited from class com.puppycrawl.tools.checkstyle.AbstractAutomaticBean
configure, contextualize, getConfiguration, setupChild
-
-
-
-
Field Detail
-
MSG_KEY
public static final java.lang.String MSG_KEY
A key is pointing to the warning message text in "messages.properties" file.- See Also:
- Constant Field Values
-
CLASS_NAME
private static final java.util.regex.Pattern CLASS_NAME
Regex to match class names.
-
FIRST_CLASS_NAME
private static final java.util.regex.Pattern FIRST_CLASS_NAME
Regex to match the first class name.
-
ARGUMENT_NAME
private static final java.util.regex.Pattern ARGUMENT_NAME
Regex to match argument names.
-
JAVA_LANG_PACKAGE_PATTERN
private static final java.util.regex.Pattern JAVA_LANG_PACKAGE_PATTERN
Regexp pattern to match java.lang package.
-
STAR_IMPORT_SUFFIX
private static final java.lang.String STAR_IMPORT_SUFFIX
Suffix for the star import.- See Also:
- Constant Field Values
-
collect
private boolean collect
Flag to indicate when time to start collecting references.
-
processJavadoc
private boolean processJavadoc
Control whether to process Javadoc comments.
-
currentFrame
private UnusedImportsCheck.Frame currentFrame
The scope is being processed. Types declared in a scope can shadow imported types.
-
-
Constructor Detail
-
UnusedImportsCheck
public UnusedImportsCheck()
-
-
Method Detail
-
setProcessJavadoc
public void setProcessJavadoc(boolean value)
Setter to control whether to process Javadoc comments.- Parameters:
value
- Flag for processing Javadoc comments.
-
beginTree
public void beginTree(DetailAST rootAST)
Description copied from class:AbstractCheck
Called before the starting to process a tree. Ideal place to initialize information that is to be collected whilst processing a tree.- Overrides:
beginTree
in classAbstractCheck
- Parameters:
rootAST
- the root of the tree
-
finishTree
public void finishTree(DetailAST rootAST)
Description copied from class:AbstractCheck
Called after finished processing a tree. Ideal place to report on information collected whilst processing a tree.- Overrides:
finishTree
in classAbstractCheck
- Parameters:
rootAST
- the root of the tree
-
getDefaultTokens
public int[] getDefaultTokens()
Description copied from class:AbstractCheck
Returns the default token a check is interested in. Only used if the configuration for a check does not define the tokens.- Specified by:
getDefaultTokens
in classAbstractCheck
- Returns:
- the default tokens
- See Also:
TokenTypes
-
getRequiredTokens
public int[] getRequiredTokens()
Description copied from class:AbstractCheck
The tokens that this check must be registered for.- Specified by:
getRequiredTokens
in classAbstractCheck
- Returns:
- the token set this must be registered for.
- See Also:
TokenTypes
-
getAcceptableTokens
public int[] getAcceptableTokens()
Description copied from class:AbstractCheck
The configurable token set. Used to protect Checks against malicious users who specify an unacceptable token set in the configuration file. The default implementation returns the check's default tokens.- Specified by:
getAcceptableTokens
in classAbstractCheck
- Returns:
- the token set this check is designed for.
- See Also:
TokenTypes
-
visitToken
public void visitToken(DetailAST ast)
Description copied from class:AbstractCheck
Called to process a token.- Overrides:
visitToken
in classAbstractCheck
- Parameters:
ast
- the token to process
-
leaveToken
public void leaveToken(DetailAST ast)
Description copied from class:AbstractCheck
Called after all the child nodes have been process.- Overrides:
leaveToken
in classAbstractCheck
- Parameters:
ast
- the token leaving
-
isUnusedImport
private boolean isUnusedImport(java.lang.String imprt)
Checks whether an import is unused.- Parameters:
imprt
- an import.- Returns:
- true if an import is unused.
-
processIdent
private void processIdent(DetailAST ast)
Collects references made by IDENT.- Parameters:
ast
- the IDENT node to process
-
processImport
private void processImport(DetailAST ast)
Collects the details of imports.- Parameters:
ast
- node containing the import details
-
processStaticImport
private void processStaticImport(DetailAST ast)
Collects the details of static imports.- Parameters:
ast
- node containing the static import details
-
collectReferencesFromJavadoc
private void collectReferencesFromJavadoc(DetailAST ast)
Collects references made in Javadoc comments.- Parameters:
ast
- node to inspect for Javadoc
-
collectReferencesFromJavadoc
private static java.util.Set<java.lang.String> collectReferencesFromJavadoc(TextBlock textBlock)
Process a javadocTextBlock
and return the set of classes referenced within.- Parameters:
textBlock
- The javadoc block to parse- Returns:
- a set of classes referenced in the javadoc block
-
getValidTags
private static java.util.List<JavadocTag> getValidTags(TextBlock cmt, JavadocUtil.JavadocTagType tagType)
Returns the list of valid tags found in a javadocTextBlock
.- Parameters:
cmt
- The javadoc block to parsetagType
- The type of tags we're interested in- Returns:
- the list of tags
-
processJavadocTag
private static java.util.Set<java.lang.String> processJavadocTag(JavadocTag tag)
Returns a list of references that found in a javadocJavadocTag
.- Parameters:
tag
- The javadoc tag to parse- Returns:
- A list of references that found in this tag
-
matchPattern
private static java.util.Set<java.lang.String> matchPattern(java.lang.String identifier, java.util.regex.Pattern pattern)
Extracts a set of texts matching aPattern
from aString
.- Parameters:
identifier
- The String to match the pattern againstpattern
- The Pattern used to extract the texts- Returns:
- A set of texts which matched the pattern
-
topLevelType
private static java.lang.String topLevelType(java.lang.String type)
If the given type string contains "." (e.g. "Map.Entry"), returns the top level type (e.g. "Map"), as that is what must be imported for the type to resolve. Otherwise, returns the type as-is.- Parameters:
type
- A possibly qualified type name- Returns:
- The simple name of the top level type
-
-