From 35db883b8a94fa900474ebc44b967b9e6e6e88cc Mon Sep 17 00:00:00 2001 From: peter Date: Thu, 27 Jun 2013 15:59:52 +0200 Subject: [PATCH] faster item sorting in goto popups --- .../DefaultChooseByNameItemProvider.java | 22 ++++++++++++++----- 1 file changed, 16 insertions(+), 6 deletions(-) diff --git a/platform/lang-impl/src/com/intellij/ide/util/gotoByName/DefaultChooseByNameItemProvider.java b/platform/lang-impl/src/com/intellij/ide/util/gotoByName/DefaultChooseByNameItemProvider.java index 9968f6c16760..ccf369182f94 100644 --- a/platform/lang-impl/src/com/intellij/ide/util/gotoByName/DefaultChooseByNameItemProvider.java +++ b/platform/lang-impl/src/com/intellij/ide/util/gotoByName/DefaultChooseByNameItemProvider.java @@ -33,6 +33,7 @@ import com.intellij.util.SmartList; import com.intellij.util.containers.ContainerUtil; import com.intellij.util.text.Matcher; import gnu.trove.THashSet; +import gnu.trove.TObjectIntHashMap; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -125,18 +126,27 @@ public class DefaultChooseByNameItemProvider implements ChooseByNameItemProvider protected void sortNamesList(@NotNull String namePattern, @NotNull List namesList) { final MinusculeMatcher matcher = buildPatternMatcher(namePattern, NameUtil.MatchingCaseSensitivity.NONE); + final Set startMatches = ContainerUtil.newHashSet(); + final TObjectIntHashMap matchingDegrees = new TObjectIntHashMap(); + for (String name : namesList) { + if (matcher.isStartMatch(name)) { + startMatches.add(name); + } + matchingDegrees.put(name, matcher.matchingDegree(name)); + } + // Here we sort using namePattern to have similar logic with empty qualified patten case Collections.sort(namesList, new Comparator() { @Override public int compare(String o1, String o2) { - boolean start1 = matcher.isStartMatch(o1); - boolean start2 = matcher.isStartMatch(o2); + boolean start1 = startMatches.contains(o1); + boolean start2 = startMatches.contains(o2); if (start1 != start2) return start1 ? -1 : 1; - int degree1 = matcher.matchingDegree(o2); - int degree2 = matcher.matchingDegree(o1); - if (degree1 < degree2) return -1; - if (degree1 > degree2) return 1; + int degree1 = matchingDegrees.get(o1); + int degree2 = matchingDegrees.get(o2); + if (degree2 < degree1) return -1; + if (degree2 > degree1) return 1; return o1.compareToIgnoreCase(o2); }