From 717c0315985d43de2697db79bf96d88e2e2bd4af Mon Sep 17 00:00:00 2001 From: Konstantin Bulenkov Date: Mon, 23 Jan 2012 21:50:12 +0100 Subject: [PATCH] fix leading "_" problem in speed search --- .../intellij/ide/util/FileStructurePopup.java | 8 ++++++- .../intellij/ui/SpeedSearchComparator.java | 10 +++++++-- .../com/intellij/psi/codeStyle/NameUtil.java | 22 +++++++++++++++---- 3 files changed, 33 insertions(+), 7 deletions(-) diff --git a/platform/lang-impl/src/com/intellij/ide/util/FileStructurePopup.java b/platform/lang-impl/src/com/intellij/ide/util/FileStructurePopup.java index e2598b005e9d..bef11b401b43 100644 --- a/platform/lang-impl/src/com/intellij/ide/util/FileStructurePopup.java +++ b/platform/lang-impl/src/com/intellij/ide/util/FileStructurePopup.java @@ -52,6 +52,7 @@ import com.intellij.ui.treeStructure.filtered.FilteringTreeBuilder; import com.intellij.ui.treeStructure.filtered.FilteringTreeStructure; import com.intellij.util.Alarm; import com.intellij.util.ArrayUtil; +import com.intellij.util.Function; import com.intellij.util.containers.ContainerUtil; import com.intellij.util.containers.HashSet; import com.intellij.util.ui.UIUtil; @@ -241,7 +242,12 @@ public class FileStructurePopup implements Disposable { this.node = element; final String text = getElementText(element); if (text != null) { - final Iterable ranges = comparator.matchingFragments(pattern, text); + final Iterable ranges = comparator.matchingFragments(pattern, text, new Function() { + @Override + public Boolean fun(Character character) { + return Character.isWhitespace(character.charValue()); + } + }); if (ranges != null) { for (TextRange range : ranges) { weights.add(range); diff --git a/platform/platform-impl/src/com/intellij/ui/SpeedSearchComparator.java b/platform/platform-impl/src/com/intellij/ui/SpeedSearchComparator.java index 0ce4b25bc2b4..1bb75d4bc52a 100644 --- a/platform/platform-impl/src/com/intellij/ui/SpeedSearchComparator.java +++ b/platform/platform-impl/src/com/intellij/ui/SpeedSearchComparator.java @@ -18,6 +18,8 @@ package com.intellij.ui; import com.intellij.openapi.util.TextRange; import com.intellij.openapi.util.text.StringUtil; import com.intellij.psi.codeStyle.NameUtil; +import com.intellij.util.Function; +import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; /** @@ -43,7 +45,7 @@ public class SpeedSearchComparator { } @Nullable - public Iterable matchingFragments(String pattern, String text) { + public Iterable matchingFragments(String pattern, String text, @NotNull Function separators) { if (myRecentSearchText == null || !myRecentSearchText.equals(pattern)) { myRecentSearchText = pattern; if (myShouldMatchCamelCase) { @@ -52,11 +54,15 @@ public class SpeedSearchComparator { if (!myShouldMatchFromTheBeginning && !pattern.startsWith("*")) { pattern = "*" + pattern; } - myMinusculeMatcher = new NameUtil.MinusculeMatcher(pattern, NameUtil.MatchingCaseSensitivity.NONE); + myMinusculeMatcher = new NameUtil.MinusculeMatcher(pattern, NameUtil.MatchingCaseSensitivity.NONE, separators); } return myMinusculeMatcher.matchingFragments(text); } + @Nullable + public Iterable matchingFragments(String pattern, String text) { + return matchingFragments(pattern, text, NameUtil.MinusculeMatcher.BASE_SEPARATOR_FUNCTION); + } public String getRecentSearchText() { return myRecentSearchText; diff --git a/platform/util/src/com/intellij/psi/codeStyle/NameUtil.java b/platform/util/src/com/intellij/psi/codeStyle/NameUtil.java index d3556b40fc75..c20e0b586745 100644 --- a/platform/util/src/com/intellij/psi/codeStyle/NameUtil.java +++ b/platform/util/src/com/intellij/psi/codeStyle/NameUtil.java @@ -378,12 +378,26 @@ public class NameUtil { } public static class MinusculeMatcher implements com.intellij.util.text.Matcher { + public static final Function BASE_SEPARATOR_FUNCTION = new Function() { + @Override + public Boolean fun(Character character) { + final char c = character.charValue(); + return Character.isWhitespace(c) || c == '_' || c == '-'; + } + }; + private final char[] myPattern; private final MatchingCaseSensitivity myOptions; + private final Function mySeparatorFunction; public MinusculeMatcher(String pattern, MatchingCaseSensitivity options) { + this(pattern, options, BASE_SEPARATOR_FUNCTION); + } + + public MinusculeMatcher(String pattern, MatchingCaseSensitivity options, Function separatorFunction) { myOptions = options; myPattern = StringUtil.trimEnd(pattern, "* ").replaceAll(":", "\\*:").toCharArray(); + mySeparatorFunction = separatorFunction; } @Nullable @@ -483,6 +497,10 @@ public class NameUtil { return null; } + private boolean isWordSeparator(char c) { + return mySeparatorFunction.fun(c); + } + @Nullable private FList skipSeparators(String name, int patternIndex, int nameIndex) { int nextStart = NameUtil.nextWord(name, nameIndex); @@ -551,10 +569,6 @@ public class NameUtil { return -fragmentCount - Math.max(0, patternCaps - matchingCaps) * 10; } - private static boolean isWordSeparator(char c) { - return Character.isWhitespace(c) || c == '_' || c == '-'; - } - @Override public boolean matches(String name) { return matchingFragments(name) != null;