From 8f5fa79b52d7783c9ec6bb4586da270315a8d3a0 Mon Sep 17 00:00:00 2001 From: "Anna.Kozlova" Date: Wed, 21 Mar 2018 20:19:46 +0100 Subject: [PATCH] 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 --- .../impl/source/codeStyle/ImportHelper.java | 8 +++- .../ConflictingOnDemandImports.java | 40 +++++++++++++++++++ .../ConflictingOnDemandImports_after.java | 38 ++++++++++++++++++ .../java/psi/OptimizeImportsTest.java | 4 ++ 4 files changed, 89 insertions(+), 1 deletion(-) create mode 100644 java/java-tests/testData/psi/optimizeImports/ConflictingOnDemandImports.java create mode 100644 java/java-tests/testData/psi/optimizeImports/ConflictingOnDemandImports_after.java diff --git a/java/java-impl/src/com/intellij/psi/impl/source/codeStyle/ImportHelper.java b/java/java-impl/src/com/intellij/psi/impl/source/codeStyle/ImportHelper.java index b5a651a153cd..2d65ce57adad 100644 --- a/java/java-impl/src/com/intellij/psi/impl/source/codeStyle/ImportHelper.java +++ b/java/java-impl/src/com/intellij/psi/impl/source/codeStyle/ImportHelper.java @@ -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); + } } } }); diff --git a/java/java-tests/testData/psi/optimizeImports/ConflictingOnDemandImports.java b/java/java-tests/testData/psi/optimizeImports/ConflictingOnDemandImports.java new file mode 100644 index 000000000000..25b70ca6694a --- /dev/null +++ b/java/java-tests/testData/psi/optimizeImports/ConflictingOnDemandImports.java @@ -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; +} \ No newline at end of file diff --git a/java/java-tests/testData/psi/optimizeImports/ConflictingOnDemandImports_after.java b/java/java-tests/testData/psi/optimizeImports/ConflictingOnDemandImports_after.java new file mode 100644 index 000000000000..a5bb81104061 --- /dev/null +++ b/java/java-tests/testData/psi/optimizeImports/ConflictingOnDemandImports_after.java @@ -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; +} \ No newline at end of file diff --git a/java/java-tests/testSrc/com/intellij/java/psi/OptimizeImportsTest.java b/java/java-tests/testSrc/com/intellij/java/psi/OptimizeImportsTest.java index 2ecbd4a71e7b..2fdd2464237e 100644 --- a/java/java-tests/testSrc/com/intellij/java/psi/OptimizeImportsTest.java +++ b/java/java-tests/testSrc/com/intellij/java/psi/OptimizeImportsTest.java @@ -53,6 +53,10 @@ public class OptimizeImportsTest extends OptimizeImportsTestCase { doTest(); } + public void testConflictingOnDemandImports() { + doTest(); + } + public void testExcludeNonStaticElementsFromStaticConflictingMembers() { doTest(); }