diff --git a/java/java-impl/src/com/intellij/codeInsight/CodeInsightUtil.java b/java/java-impl/src/com/intellij/codeInsight/CodeInsightUtil.java index 6b3c3829e221..0941aab9d74c 100644 --- a/java/java-impl/src/com/intellij/codeInsight/CodeInsightUtil.java +++ b/java/java-impl/src/com/intellij/codeInsight/CodeInsightUtil.java @@ -217,20 +217,22 @@ public class CodeInsightUtil { } public static Comparator createSortIdenticalNamedMembersComparator(PsiElement place) { - final PsiProximityComparator proximityComparator = new PsiProximityComparator(place); - return (o1, o2) -> { - boolean deprecated1 = JavaCompletionUtil.isEffectivelyDeprecated(o1); - boolean deprecated2 = JavaCompletionUtil.isEffectivelyDeprecated(o2); - if (deprecated1 && !deprecated2) return 1; - if (!deprecated1 && deprecated2) return -1; - int compare = proximityComparator.compare(o1, o2); - if (compare != 0) return compare; + return Comparator + .comparing(JavaCompletionUtil::isEffectivelyDeprecated) + .thenComparing(CodeInsightUtil::isInnerClass) + .thenComparing(new PsiProximityComparator(place)) + .thenComparing(CodeInsightUtil::compareQualifiedNames); + } - String qname1 = o1 instanceof PsiClass ? ((PsiClass)o1).getQualifiedName() : null; - String qname2 = o2 instanceof PsiClass ? ((PsiClass)o2).getQualifiedName() : null; - if (qname1 == null || qname2 == null) return 0; - return qname1.compareToIgnoreCase(qname2); - }; + private static boolean isInnerClass(PsiMember o) { + return o instanceof PsiClass && o.getContainingClass() != null; + } + + private static int compareQualifiedNames(PsiMember o1, PsiMember o2) { + String qname1 = o1 instanceof PsiClass ? ((PsiClass)o1).getQualifiedName() : null; + String qname2 = o2 instanceof PsiClass ? ((PsiClass)o2).getQualifiedName() : null; + if (qname1 == null || qname2 == null) return 0; + return qname1.compareToIgnoreCase(qname2); } @NotNull diff --git a/java/java-tests/testSrc/com/intellij/java/codeInsight/intention/AddImportActionTest.groovy b/java/java-tests/testSrc/com/intellij/java/codeInsight/intention/AddImportActionTest.groovy index a63d3bb0a7f9..5e0a079aea6f 100644 --- a/java/java-tests/testSrc/com/intellij/java/codeInsight/intention/AddImportActionTest.groovy +++ b/java/java-tests/testSrc/com/intellij/java/codeInsight/intention/AddImportActionTest.groovy @@ -18,6 +18,8 @@ package com.intellij.java.codeInsight.intention import com.intellij.codeInsight.daemon.impl.quickfix.ImportClassFix import com.intellij.lang.java.JavaLanguage import com.intellij.pom.java.LanguageLevel +import com.intellij.psi.CommonClassNames +import com.intellij.psi.PsiClass import com.intellij.psi.codeStyle.CodeStyleSettingsManager import com.intellij.psi.codeStyle.CommonCodeStyleSettings import com.intellij.psi.codeStyle.JavaCodeStyleSettings @@ -689,4 +691,16 @@ class Bar { ''' assert !myFixture.filterAvailableIntentions("Import class").empty } + + void "test prefer top-level List"() { + myFixture.addClass("package foo; public interface Restore { interface List {}}") + def juList = myFixture.findClass(CommonClassNames.JAVA_UTIL_LIST) + + myFixture.configureByText 'a.java', 'class F implements List {}' + importClass() + myFixture.checkResult '''\ +import java.util.List; + +class F implements List {}''' + } }