mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
fix leading "_" problem in speed search
This commit is contained in:
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user