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 2d866de3697e..fba793f14451 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 @@ -430,6 +430,7 @@ public class ImportHelper{ String packageName = getPackageOrClassName(className); String shortName = PsiNameHelper.getShortClassName(className); + findUnusedSingleImport(file, shortName).ifPresent(PsiElement::delete); PsiClass conflictSingleRef = findSingleImportByShortName(file, shortName); if (conflictSingleRef != null && !forceReimport){ return className.equals(conflictSingleRef.getQualifiedName()); @@ -522,6 +523,25 @@ public class ImportHelper{ return true; } + private static Optional findUnusedSingleImport(PsiJavaFile file, String name) { + PsiImportList importList = file.getImportList(); + if (importList != null) { + for (PsiImportStatement statement : importList.getImportStatements()) { + PsiJavaCodeReferenceElement ref = statement.getImportReference(); + if (!statement.isOnDemand() && ref != null && name.equals(ref.getReferenceName())) { + PsiElement target = statement.resolve(); + if (target instanceof PsiClass) { + Collection all = ReferencesSearch.search(target, new LocalSearchScope(file)).findAll(); + if (all.size() == 1 && PsiTreeUtil.isAncestor(statement, all.iterator().next().getElement(), true)) { + return Optional.of(statement); + } + } + } + } + } + return Optional.empty(); + } + private static boolean containsInCurrentPackage(@NotNull PsiJavaFile file, PsiClass curRefClass) { if (curRefClass != null) { final String curRefClassQualifiedName = curRefClass.getQualifiedName(); diff --git a/java/java-tests/testData/codeInsight/completion/normal/RemoveUnusedImportOfSameName.java b/java/java-tests/testData/codeInsight/completion/normal/RemoveUnusedImportOfSameName.java new file mode 100644 index 000000000000..ecee89f16d5f --- /dev/null +++ b/java/java-tests/testData/codeInsight/completion/normal/RemoveUnusedImportOfSameName.java @@ -0,0 +1,5 @@ +import foo.List; + +class Scratch { + Lis +} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/completion/normal/RemoveUnusedImportOfSameName_after.java b/java/java-tests/testData/codeInsight/completion/normal/RemoveUnusedImportOfSameName_after.java new file mode 100644 index 000000000000..bdc4cf8646b3 --- /dev/null +++ b/java/java-tests/testData/codeInsight/completion/normal/RemoveUnusedImportOfSameName_after.java @@ -0,0 +1,5 @@ +import java.util.List; + +class Scratch { + List +} \ No newline at end of file diff --git a/java/java-tests/testSrc/com/intellij/java/codeInsight/completion/NormalCompletionTest.groovy b/java/java-tests/testSrc/com/intellij/java/codeInsight/completion/NormalCompletionTest.groovy index b129a2cead65..656667b23842 100644 --- a/java/java-tests/testSrc/com/intellij/java/codeInsight/completion/NormalCompletionTest.groovy +++ b/java/java-tests/testSrc/com/intellij/java/codeInsight/completion/NormalCompletionTest.groovy @@ -1859,4 +1859,12 @@ class Bar {{ checkResult() } + void testRemoveUnusedImportOfSameName() { + myFixture.addClass("package foo; public class List {}") + configureByTestName() + lookup.currentItem = myFixture.lookupElements.find { it.object instanceof PsiClass && ((PsiClass)it.object).qualifiedName == 'java.util.List' } + myFixture.type('\n') + checkResult() + } + }