fix leading "_" problem in speed search

This commit is contained in:
Konstantin Bulenkov
2012-01-23 21:55:21 +01:00
parent ddf0247e0f
commit 717c031598
3 changed files with 33 additions and 7 deletions
@@ -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<TextRange> ranges = comparator.matchingFragments(pattern, text);
final Iterable<TextRange> ranges = comparator.matchingFragments(pattern, text, new Function<Character, Boolean>() {
@Override
public Boolean fun(Character character) {
return Character.isWhitespace(character.charValue());
}
});
if (ranges != null) {
for (TextRange range : ranges) {
weights.add(range);
@@ -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<TextRange> matchingFragments(String pattern, String text) {
public Iterable<TextRange> matchingFragments(String pattern, String text, @NotNull Function<Character, Boolean> 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<TextRange> matchingFragments(String pattern, String text) {
return matchingFragments(pattern, text, NameUtil.MinusculeMatcher.BASE_SEPARATOR_FUNCTION);
}
public String getRecentSearchText() {
return myRecentSearchText;
@@ -378,12 +378,26 @@ public class NameUtil {
}
public static class MinusculeMatcher implements com.intellij.util.text.Matcher {
public static final Function<Character,Boolean> BASE_SEPARATOR_FUNCTION = new Function<Character, Boolean>() {
@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<Character, Boolean> mySeparatorFunction;
public MinusculeMatcher(String pattern, MatchingCaseSensitivity options) {
this(pattern, options, BASE_SEPARATOR_FUNCTION);
}
public MinusculeMatcher(String pattern, MatchingCaseSensitivity options, Function<Character, Boolean> 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<TextRange> 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;