optimize imports with on-demand conflicts (IDEA-164133)

explicit import for a class in the same package/file is redundant as it's implicitly imported is preferred to on-demand imported classes
This commit is contained in:
Anna.Kozlova
2018-03-22 10:41:42 +01:00
parent 3ae37a2925
commit 8f5fa79b52
4 changed files with 89 additions and 1 deletions
@@ -40,6 +40,7 @@ import com.intellij.psi.search.LocalSearchScope;
import com.intellij.psi.search.searches.ReferencesSearch;
import com.intellij.psi.tree.IElementType;
import com.intellij.psi.util.ClassUtil;
import com.intellij.psi.util.PsiTreeUtil;
import com.intellij.util.ArrayUtil;
import com.intellij.util.IncorrectOperationException;
import com.intellij.util.ObjectUtils;
@@ -339,6 +340,7 @@ public class ImportHelper{
}
}
if (!conflicts.isEmpty() && !(file instanceof PsiCompiledElement)) {
String packageName = file.getPackageName();
file.accept(new JavaRecursiveElementVisitor() {
@Override
public void visitReferenceElement(PsiJavaCodeReferenceElement reference) {
@@ -346,7 +348,11 @@ public class ImportHelper{
PsiElement element = reference.resolve();
if (element instanceof PsiClass && conflicts.contains(((PsiClass)element).getName())) {
String fqn = ((PsiClass)element).getQualifiedName();
outNamesToUseSingle.add(fqn);
if (fqn != null &&
!PsiTreeUtil.isAncestor(file, element, true) &&
!packageName.equals(StringUtil.getPackageName(fqn))) {
outNamesToUseSingle.add(fqn);
}
}
}
});
@@ -0,0 +1,40 @@
package foo;
import static foo.C.*;
import static foo.D.*;
import foo.B.A;
class C {
public static class A {}
public static class C1 {}
public static class C2 {}
public static class C3 {}
public static class C4 {}
public static class C5 {}
}
class D {
public static class A {}
public static class D1 {}
public static class D2 {}
public static class D3 {}
public static class D4 {}
public static class D5 {}
}
class B {
public static class A { }
A aField;
C1 c;
C2 c1;
C3 c2;
C4 c3;
C5 c4;
D1 d;
D2 d1;
D3 d2;
D4 d3;
D5 d4;
}
@@ -0,0 +1,38 @@
package foo;
import static foo.C.*;
import static foo.D.*;
class C {
public static class A {}
public static class C1 {}
public static class C2 {}
public static class C3 {}
public static class C4 {}
public static class C5 {}
}
class D {
public static class A {}
public static class D1 {}
public static class D2 {}
public static class D3 {}
public static class D4 {}
public static class D5 {}
}
class B {
public static class A { }
A aField;
C1 c;
C2 c1;
C3 c2;
C4 c3;
C5 c4;
D1 d;
D2 d1;
D3 d2;
D4 d3;
D5 d4;
}
@@ -53,6 +53,10 @@ public class OptimizeImportsTest extends OptimizeImportsTestCase {
doTest();
}
public void testConflictingOnDemandImports() {
doTest();
}
public void testExcludeNonStaticElementsFromStaticConflictingMembers() {
doTest();
}