From 9a3f46076c894bdc2d84e93a85f08869cc7efe15 Mon Sep 17 00:00:00 2001 From: "Anna.Kozlova" Date: Thu, 16 Mar 2017 15:01:11 +0100 Subject: [PATCH] ensure redundant on demund imports are not created when shorten class refs would find a conflict with class in same package/implicitly imported package (IDEA-169190) --- .../psi/impl/source/codeStyle/ImportHelper.java | 17 +++++++++++++---- .../collision/after/pack2/Usage2.java | 3 +-- .../tree/java/ShortenClassReferencesTest.java | 12 ++++++++++++ 3 files changed, 26 insertions(+), 6 deletions(-) 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 4f9bade44f71..af96f721dd57 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 @@ -445,8 +445,8 @@ public class ImportHelper{ !mySettings.PACKAGES_TO_USE_IMPORT_ON_DEMAND.contains(packageName)) { useOnDemand = false; } - // name of class we try to import is the same as of the class defined in this file - if (containsInCurrentFile(file, curRefClass)) { + // name of class we try to import is the same as of the class defined in this package + if (containsInCurrentPackage(file, curRefClass)) { useOnDemand = true; } // check conflicts @@ -464,10 +464,19 @@ public class ImportHelper{ if (useOnDemand && refClass.getContainingClass() != null && mySettings.INSERT_INNER_CLASS_IMPORTS && - containsInCurrentFile(file, curRefClass)) { + containsInCurrentPackage(file, curRefClass)) { return false; } + if (curRefClass != null) { + if (!classesToReimport.isEmpty()) { + return false; + } + else { + useOnDemand = false; + } + } + try { PsiImportList importList = file.getImportList(); assert importList != null : file; @@ -499,7 +508,7 @@ public class ImportHelper{ return true; } - private static boolean containsInCurrentFile(@NotNull PsiJavaFile file, PsiClass curRefClass) { + private static boolean containsInCurrentPackage(@NotNull PsiJavaFile file, PsiClass curRefClass) { if (curRefClass != null) { final String curRefClassQualifiedName = curRefClass.getQualifiedName(); if (curRefClassQualifiedName != null && diff --git a/java/java-tests/testData/refactoring/renameClass/collision/after/pack2/Usage2.java b/java/java-tests/testData/refactoring/renameClass/collision/after/pack2/Usage2.java index 8f5774500907..5e8108ad3ee5 100644 --- a/java/java-tests/testData/refactoring/renameClass/collision/after/pack2/Usage2.java +++ b/java/java-tests/testData/refactoring/renameClass/collision/after/pack2/Usage2.java @@ -1,6 +1,5 @@ package pack2; - -import java.util.List; +import java.util.*; public class Usage2 { int method() { diff --git a/java/java-tests/testSrc/com/intellij/psi/impl/source/tree/java/ShortenClassReferencesTest.java b/java/java-tests/testSrc/com/intellij/psi/impl/source/tree/java/ShortenClassReferencesTest.java index df9b57d43c2e..10e0d758208b 100644 --- a/java/java-tests/testSrc/com/intellij/psi/impl/source/tree/java/ShortenClassReferencesTest.java +++ b/java/java-tests/testSrc/com/intellij/psi/impl/source/tree/java/ShortenClassReferencesTest.java @@ -81,6 +81,18 @@ public class ShortenClassReferencesTest extends LightCodeInsightFixtureTestCase "class Outer1 {class Inner {} {boolean b = new Inner() instanceof Inner;}}"); } + public void testConflictingClassInSamePackage() throws Exception { + myFixture.addClass("package p1; public class Outer{}"); + myFixture.addClass("package p2; public class Outer{}"); + myFixture.configureByText("a.java", "package p2; class Outer1 extends p1.Outer {}"); + doShortenRefs(); + myFixture.checkResult("package p2;\n" + + "\n" + + "import p1.Outer;\n" + + "\n" + + "class Outer1 extends Outer {}"); + } + public void testWhiteSpaceForMovedTypeAnnotations() throws Exception { myFixture.configureByFile(getTestName(false) + ".java"); PsiElement elementAtCaret = myFixture.getElementAtCaret();