2 * Copyright 2003-2009 Dave Griffith, Bas Leijdekkers
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
16 package com
.siyeh
.ig
.imports
;
18 import com
.intellij
.psi
.*;
19 import com
.intellij
.psi
.util
.PsiUtil
;
20 import com
.siyeh
.InspectionGadgetsBundle
;
21 import com
.siyeh
.ig
.BaseInspection
;
22 import com
.siyeh
.ig
.BaseInspectionVisitor
;
23 import com
.siyeh
.ig
.InspectionGadgetsFix
;
24 import com
.siyeh
.ig
.fixes
.DeleteImportFix
;
25 import com
.siyeh
.ig
.psiutils
.ImportUtils
;
26 import org
.jetbrains
.annotations
.NotNull
;
28 import java
.util
.HashSet
;
31 public class RedundantImportInspection
extends BaseInspection
{
35 public String
getDisplayName() {
36 return InspectionGadgetsBundle
.message(
37 "redundant.import.display.name");
42 public String
buildErrorString(Object
... infos
) {
43 return InspectionGadgetsBundle
.message(
44 "redundant.import.problem.descriptor");
48 public InspectionGadgetsFix
buildFix(Object
... infos
) {
49 return new DeleteImportFix();
53 public BaseInspectionVisitor
buildVisitor() {
54 return new RedundantImportVisitor();
57 private static class RedundantImportVisitor
extends BaseInspectionVisitor
{
59 @Override public void visitFile(PsiFile file
) {
60 super.visitFile(file
);
61 if (!(file
instanceof PsiJavaFile
)) {
64 final PsiJavaFile javaFile
= (PsiJavaFile
)file
;
65 if (PsiUtil
.isInJspFile(file
)) {
68 final PsiImportList importList
= javaFile
.getImportList();
69 if (importList
== null) {
72 checkNonStaticImports(importList
, javaFile
);
73 checkStaticImports(importList
, javaFile
);
76 private void checkStaticImports(PsiImportList importList
,
77 PsiJavaFile javaFile
) {
78 final PsiImportStaticStatement
[] importStaticStatements
=
79 importList
.getImportStaticStatements();
80 final Set
<String
> staticImports
=
81 new HashSet
<String
>(importStaticStatements
.length
);
82 for (PsiImportStaticStatement importStaticStatement
:
83 importStaticStatements
) {
84 final String referenceName
=
85 importStaticStatement
.getReferenceName();
86 final PsiClass targetClass
=
87 importStaticStatement
.resolveTargetClass();
88 if (targetClass
== null) {
91 final String qualifiedName
= targetClass
.getQualifiedName();
92 if (referenceName
== null) {
93 if (staticImports
.contains(qualifiedName
)) {
94 registerError(importStaticStatement
);
97 staticImports
.add(qualifiedName
);
99 final String qualifiedReferenceName
=
100 qualifiedName
+ '.' + referenceName
;
101 if (staticImports
.contains(qualifiedReferenceName
)) {
102 registerError(importStaticStatement
);
105 if (staticImports
.contains(qualifiedName
)) {
106 if (!ImportUtils
.hasOnDemandImportConflict(
107 qualifiedReferenceName
, javaFile
)) {
108 registerError(importStaticStatement
);
111 staticImports
.add(qualifiedReferenceName
);
116 private void checkNonStaticImports(PsiImportList importList
,
117 PsiJavaFile javaFile
) {
118 final PsiImportStatement
[] importStatements
=
119 importList
.getImportStatements();
120 final Set
<String
> onDemandImports
= new HashSet();
121 final Set
<String
> singleClassImports
= new HashSet();
122 for(final PsiImportStatement importStatement
: importStatements
) {
123 final String qualifiedName
= importStatement
.getQualifiedName();
124 if(qualifiedName
== null) {
127 if (importStatement
.isOnDemand()) {
128 if (onDemandImports
.contains(qualifiedName
)) {
129 registerError(importStatement
);
131 onDemandImports
.add(qualifiedName
);
133 if (singleClassImports
.contains(qualifiedName
)) {
134 registerError(importStatement
);
137 final PsiElement element
= importStatement
.resolve();
138 if (!(element
instanceof PsiClass
)) {
141 final PsiElement context
= element
.getContext();
142 if (context
== null) {
145 final String contextName
;
146 if (context
instanceof PsiJavaFile
) {
147 final PsiJavaFile file
= (PsiJavaFile
)context
;
148 contextName
= file
.getPackageName();
149 } else if (context
instanceof PsiClass
) {
150 final PsiClass aClass
= (PsiClass
)context
;
151 contextName
= aClass
.getQualifiedName();
155 if (onDemandImports
.contains(contextName
) &&
156 !ImportUtils
.hasOnDemandImportConflict(qualifiedName
,
158 !ImportUtils
.hasDefaultImportConflict(qualifiedName
,
160 registerError(importStatement
);
162 singleClassImports
.add(qualifiedName
);