From f170a9fa361a65d3e18daf3e7668bf5dead0d939 Mon Sep 17 00:00:00 2001 From: peter Date: Tue, 12 Sep 2017 18:37:06 +0200 Subject: [PATCH] speedup goto file name search a bit --- .../ide/actions/GotoFileItemProvider.java | 36 +++++++++---------- 1 file changed, 17 insertions(+), 19 deletions(-) diff --git a/platform/lang-impl/src/com/intellij/ide/actions/GotoFileItemProvider.java b/platform/lang-impl/src/com/intellij/ide/actions/GotoFileItemProvider.java index 8d7ef356d4a8..5348fd9e0a76 100644 --- a/platform/lang-impl/src/com/intellij/ide/actions/GotoFileItemProvider.java +++ b/platform/lang-impl/src/com/intellij/ide/actions/GotoFileItemProvider.java @@ -32,7 +32,7 @@ import com.intellij.psi.codeStyle.NameUtil; import com.intellij.util.Processor; import com.intellij.util.containers.ContainerUtil; import com.intellij.util.containers.FList; -import com.intellij.util.containers.HashSet; +import one.util.streamex.IntStreamEx; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -142,29 +142,27 @@ public class GotoFileItemProvider extends DefaultChooseByNameItemProvider { private List> getFileNameCandidates(@NotNull ChooseByNameBase base, boolean everywhere, String sanitized, boolean preferStartMatches) { - String[] names = myModel.getNames(everywhere); - int start = Math.max(sanitized.lastIndexOf('/'), sanitized.lastIndexOf('\\')) + 1; + List partialNames = IntStreamEx.range(start, sanitized.length()).mapToObj(i -> sanitized.substring(i)).toList(); + List matchers = ContainerUtil.map(partialNames, s -> NameUtil.buildMatcher(s, NameUtil.MatchingCaseSensitivity.NONE)); + List> matchingNames = ContainerUtil.map(partialNames, __ -> new ArrayList<>()); - Set checkedNames = new HashSet<>(); - List> groups = new ArrayList<>(); - for (int i = start; i < sanitized.length() - 1; i++) { - List nameMatches = new ArrayList<>(); - String namePattern = sanitized.substring(i); - MinusculeMatcher matcher = NameUtil.buildMatcher(namePattern, NameUtil.MatchingCaseSensitivity.NONE); - for (String name : names) { - if (!checkedNames.contains(name)) { - MatchResult result = matches(base, namePattern, matcher, name); - if (result != null) { - checkedNames.add(name); - nameMatches.add(result); - } + myModel.processNames(name -> { + for (int i = 0; i < partialNames.size(); i++) { + MatchResult result = matches(base, partialNames.get(i), matchers.get(i), name); + if (result != null) { + matchingNames.get(i).add(result); + break; } } - groups.addAll(groupByMatchingDegree(nameMatches, namePattern, preferStartMatches)); - } + return true; + }, everywhere); - return groups; + List> result = new ArrayList<>(); + for (int i = 0; i < partialNames.size(); i++) { + result.addAll(groupByMatchingDegree(matchingNames.get(i), partialNames.get(i), preferStartMatches)); + } + return result; } private static List> groupByMatchingDegree(List nameMatches,