diff --git a/java/java-tests/testData/codeInsight/completion/normalSorting/PreferClassOverItsStaticMembers.java b/java/java-tests/testData/codeInsight/completion/normalSorting/PreferClassStaticMembers.java similarity index 100% rename from java/java-tests/testData/codeInsight/completion/normalSorting/PreferClassOverItsStaticMembers.java rename to java/java-tests/testData/codeInsight/completion/normalSorting/PreferClassStaticMembers.java diff --git a/java/java-tests/testData/codeInsight/completion/normalSorting/PreferFinallyToFinal.java b/java/java-tests/testData/codeInsight/completion/normalSorting/PreferFinallyToFinal.java new file mode 100644 index 000000000000..b7e11a45313d --- /dev/null +++ b/java/java-tests/testData/codeInsight/completion/normalSorting/PreferFinallyToFinal.java @@ -0,0 +1,6 @@ +class A { + { + try {} + finx + } +} \ No newline at end of file diff --git a/java/java-tests/testSrc/com/intellij/codeInsight/completion/NormalCompletionOrderingTest.groovy b/java/java-tests/testSrc/com/intellij/codeInsight/completion/NormalCompletionOrderingTest.groovy index 974069e493a1..4148143c9fce 100644 --- a/java/java-tests/testSrc/com/intellij/codeInsight/completion/NormalCompletionOrderingTest.groovy +++ b/java/java-tests/testSrc/com/intellij/codeInsight/completion/NormalCompletionOrderingTest.groovy @@ -101,7 +101,7 @@ public class NormalCompletionOrderingTest extends CompletionSortingTestCase { public void testDispreferImpls() throws Throwable { myFixture.addClass("package foo; public class Xxx {}"); configureSecondCompletion(); - assertPreferredItems(0, "Xxx", "XxxEx", "XxxImpl", "Xxy"); + assertPreferredItems(1, "Xxx", "XxxEx", "XxxImpl", "Xxy"); } public void testPreferOwnInnerClasses() throws Throwable { @@ -128,7 +128,7 @@ public class NormalCompletionOrderingTest extends CompletionSortingTestCase { myFixture.addClass("package foo; public interface XaYa {}"); myFixture.addClass("package foo; public interface XyYa {}"); configureSecondCompletion(); - assertPreferredItems(0, "XaYa", "XaYaEx", "XaYaImpl", "XyYa", "XyYaXa"); + assertPreferredItems(1, "XaYa", "XaYaEx", "XaYaImpl", "XyYa", "XyYaXa"); } public void testPreferLessParameters() throws Throwable { @@ -218,8 +218,12 @@ public class NormalCompletionOrderingTest extends CompletionSortingTestCase { checkPreferredItems(0, "FooClass", "Foo_Intf"); } - public void testPreferClassOverItsStaticMembers() { - checkPreferredItems(0, "Zoo"); + public void testPreferClassStaticMembers() { + checkPreferredItems(1, "Zoo", "Zoo.A", "Zoo.B", "Zoo.C", "Zoo.D", "Zoo.E", "Zoo.F", "Zoo.G", "Zoo.H"); + } + + public void testPreferFinallyToFinal() { + checkPreferredItems(1, "final", "finally"); } public void testPreferReturn() { diff --git a/platform/lang-impl/src/com/intellij/codeInsight/completion/CompletionLookupArranger.java b/platform/lang-impl/src/com/intellij/codeInsight/completion/CompletionLookupArranger.java index 24349ac574f6..05c219d42fd7 100644 --- a/platform/lang-impl/src/com/intellij/codeInsight/completion/CompletionLookupArranger.java +++ b/platform/lang-impl/src/com/intellij/codeInsight/completion/CompletionLookupArranger.java @@ -49,6 +49,7 @@ public class CompletionLookupArranger extends LookupArranger { private static final Alarm ourStatsAlarm = new Alarm(ApplicationManager.getApplication()); private static final Key PRESENTATION_INVARIANT = Key.create("PRESENTATION_INVARIANT"); private static final int MAX_PREFERRED_COUNT = 5; + public static final Key PURE_RELEVANCE = Key.create("PURE_RELEVANCE"); private final List myFrozenItems = new ArrayList(); private static final String SELECTED = "selected"; static final String IGNORED = "ignored"; @@ -187,7 +188,7 @@ public class CompletionLookupArranger extends LookupArranger { } ArrayList listModel = new ArrayList(model); - return new Pair, Integer>(listModel, getItemToSelect(lookup, byRelevance, listModel)); + return new Pair, Integer>(listModel, getItemToSelect(lookup, listModel, inputBySorter)); } @@ -196,7 +197,7 @@ public class CompletionLookupArranger extends LookupArranger { return new CompletionLookupArranger(myParameters, myProcess); } - private int getItemToSelect(Lookup lookup, List byRelevance, List items) { + private int getItemToSelect(Lookup lookup, List items, MultiMap inputBySorter) { if (items.isEmpty() || !lookup.isFocused()) { return 0; } @@ -226,10 +227,13 @@ public class CompletionLookupArranger extends LookupArranger { } final CompletionPreselectSkipper[] skippers = CompletionPreselectSkipper.EP_NAME.getExtensions(); - - for (LookupElement element : byRelevance) { - if (!shouldSkip(skippers, element)) { - return items.indexOf(element); + for (CompletionSorterImpl sorter : myClassifiers.keySet()) { + ProcessingContext context = new ProcessingContext(); + context.put(PURE_RELEVANCE, Boolean.TRUE); + for (LookupElement element : myClassifiers.get(sorter).classify(inputBySorter.get(sorter), context)) { + if (!shouldSkip(skippers, element)) { + return items.indexOf(element); + } } } diff --git a/platform/lang-impl/src/com/intellij/codeInsight/completion/impl/LiftShorterItemsClassifier.java b/platform/lang-impl/src/com/intellij/codeInsight/completion/impl/LiftShorterItemsClassifier.java index c427e2aac308..4a05b7758acf 100644 --- a/platform/lang-impl/src/com/intellij/codeInsight/completion/impl/LiftShorterItemsClassifier.java +++ b/platform/lang-impl/src/com/intellij/codeInsight/completion/impl/LiftShorterItemsClassifier.java @@ -15,6 +15,7 @@ */ package com.intellij.codeInsight.completion.impl; +import com.intellij.codeInsight.completion.CompletionLookupArranger; import com.intellij.codeInsight.lookup.Classifier; import com.intellij.codeInsight.lookup.LookupElement; import com.intellij.util.ProcessingContext; @@ -75,6 +76,9 @@ class LiftShorterItemsClassifier extends Classifier { @Override public Iterable classify(Iterable source, ProcessingContext context) { + if (context.get(CompletionLookupArranger.PURE_RELEVANCE) == Boolean.TRUE) { + return myNext.classify(source, context); + } return liftShorterElements(source, new THashSet(TObjectHashingStrategy.IDENTITY), context); } @@ -116,8 +120,8 @@ class LiftShorterItemsClassifier extends Classifier { @Override public void describeItems(LinkedHashMap map, ProcessingContext context) { - final HashSet lifted = new HashSet(); - liftShorterElements(new ArrayList(map.keySet()), new THashSet(TObjectHashingStrategy.IDENTITY), new ProcessingContext()); + final THashSet lifted = new THashSet(TObjectHashingStrategy.IDENTITY); + liftShorterElements(new ArrayList(map.keySet()), lifted, new ProcessingContext()); if (!lifted.isEmpty()) { for (LookupElement element : map.keySet()) { final StringBuilder builder = map.get(element);