From 196bd1b867bb90a511bfd33898da0c4c4951eea2 Mon Sep 17 00:00:00 2001 From: peter Date: Thu, 25 Aug 2016 15:11:17 +0200 Subject: [PATCH] fix item preselection in goto popups --- .../com/intellij/navigation/ChooseByNameTest.groovy | 10 ++++++++++ .../intellij/ide/util/gotoByName/ChooseByNameBase.java | 5 +++-- 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/java/java-tests/testSrc/com/intellij/navigation/ChooseByNameTest.groovy b/java/java-tests/testSrc/com/intellij/navigation/ChooseByNameTest.groovy index 47f6735d88ae..d4249d990089 100644 --- a/java/java-tests/testSrc/com/intellij/navigation/ChooseByNameTest.groovy +++ b/java/java-tests/testSrc/com/intellij/navigation/ChooseByNameTest.groovy @@ -329,6 +329,16 @@ class Intf { assert popup.calcSelectedIndex(popupElements.toArray(), 'xfile') == 0 } + public void "test prefer prefix match"() { + def wanted = myFixture.addClass('class PsiClassImpl {}') + def smth = myFixture.addClass('class DroolsPsiClassImpl {}') + def popup = createPopup(new GotoClassModel2(project)) + def popupElements = calcPopupElements(popup, 'PsiCl', false) + + assert popupElements == [wanted, ChooseByNameBase.NON_PREFIX_SEPARATOR, smth] + assert popup.calcSelectedIndex(popupElements.toArray(), 'PsiCl') == 0 + } + private List getPopupElements(ChooseByNameModel model, String text, boolean checkboxState = false) { return calcPopupElements(createPopup(model), text, checkboxState) } diff --git a/platform/lang-impl/src/com/intellij/ide/util/gotoByName/ChooseByNameBase.java b/platform/lang-impl/src/com/intellij/ide/util/gotoByName/ChooseByNameBase.java index 6f4ed4f711ff..81205730c4a6 100644 --- a/platform/lang-impl/src/com/intellij/ide/util/gotoByName/ChooseByNameBase.java +++ b/platform/lang-impl/src/com/intellij/ide/util/gotoByName/ChooseByNameBase.java @@ -1082,9 +1082,10 @@ public abstract class ChooseByNameBase { Matcher matcher = buildPatternMatcher(transformPattern(trimmedText)); final String statContext = statisticsContext(); Comparator itemComparator = Comparator. - comparing(e -> !trimmedText.equalsIgnoreCase(myModel.getElementName(e))). + comparing(e -> trimmedText.equalsIgnoreCase(myModel.getElementName(e))). thenComparing(e -> matchingDegree(matcher, e)). - thenComparing(e -> getUseCount(statContext, e)); + thenComparing(e -> getUseCount(statContext, e)). + reversed(); int bestPosition = 0; for (int i = 1; i < modelElements.length; i++) {