From c34f142c6895b66e88ff4f6d55982fe6a9400f29 Mon Sep 17 00:00:00 2001 From: Roman Chernyatchik Date: Wed, 23 Dec 2009 21:57:34 +0300 Subject: [PATCH] support for regexp in qualified pattern (same support as for name pattern) --- .../ide/util/gotoByName/ChooseByNameBase.java | 70 +++++++++++++++------- 1 file changed, 49 insertions(+), 21 deletions(-) diff --git a/platform/lang-impl/src/com/intellij/ide/util/gotoByName/ChooseByNameBase.java b/platform/lang-impl/src/com/intellij/ide/util/gotoByName/ChooseByNameBase.java index 99ded366c5..4f47b008c0 100644 --- a/platform/lang-impl/src/com/intellij/ide/util/gotoByName/ChooseByNameBase.java +++ b/platform/lang-impl/src/com/intellij/ide/util/gotoByName/ChooseByNameBase.java @@ -48,7 +48,9 @@ import com.intellij.ui.ListScrollingUtil; import com.intellij.ui.popup.PopupOwner; import com.intellij.ui.popup.PopupUpdateProcessor; import com.intellij.util.Alarm; +import com.intellij.util.Function; import com.intellij.util.SmartList; +import com.intellij.util.containers.ContainerUtil; import com.intellij.util.diff.Diff; import com.intellij.util.ui.UIUtil; import org.jetbrains.annotations.NonNls; @@ -1190,23 +1192,37 @@ public abstract class ChooseByNameBase{ if (name == null) return false; final List suspects = split(name); - final List patterns = split(qualifierPattern); + final List> patternsAndMatchers = ContainerUtil.map2List(split(qualifierPattern), new Function>() { + public Pair fun(String s) { + final String pattern = getNamePattern(s); + final NameUtil.Matcher matcher = buildPatternMatcher(pattern); + + return new Pair(pattern, matcher); + } + }); int matchPosition = 0; -patterns: - for (String pattern : patterns) { - if (pattern.length() > 0) { - for (int j = matchPosition; j < suspects.size() - 1; j++) { - String suspect = suspects.get(j); - if (StringUtil.startsWithIgnoreCase(suspect, pattern)) { - matchPosition = j + 1; - continue patterns; + try { + patterns: + for (Pair patternAndMatcher : patternsAndMatchers) { + final String pattern = patternAndMatcher.first; + final NameUtil.Matcher matcher = patternAndMatcher.second; + if (pattern.length() > 0) { + for (int j = matchPosition; j < suspects.size() - 1; j++) { + String suspect = suspects.get(j); + if (matches(pattern, matcher, suspect)) { + matchPosition = j + 1; + continue patterns; + } } - } - return false; + return false; + } } + } catch (Exception e) { + // Do nothing. No matches appears valid result for "bad" pattern + return false; } return true; @@ -1225,22 +1241,15 @@ patterns: } final String[] names = checkboxState ? myNames[1] : myNames[0]; - final NameUtil.Matcher matcher = NameUtil.buildMatcher(pattern, 0, true, true, pattern.toLowerCase().equals(pattern)); + final NameUtil.Matcher matcher = buildPatternMatcher(pattern); try { for (String name : names) { if (calcElementsThread != null && calcElementsThread.myCancelled) { break; } - if (name != null) { - if (myModel instanceof CustomMatcherModel) { - if (((CustomMatcherModel)myModel).matches(name, pattern)) { - list.add(name); - } - } - else if (pattern.length() == 0 || matcher.matches(name)) { - list.add(name); - } + if (matches(pattern, matcher, name)) { + list.add(name); } } } @@ -1249,6 +1258,25 @@ patterns: } } + private boolean matches(String pattern, NameUtil.Matcher matcher, String name) { + boolean matches = false; + if (name != null) { + if (myModel instanceof CustomMatcherModel) { + if (((CustomMatcherModel)myModel).matches(name, pattern)) { + matches = true; + } + } + else if (pattern.length() == 0 || matcher.matches(name)) { + matches = true; + } + } + return matches; + } + + private NameUtil.Matcher buildPatternMatcher(String pattern) { + return NameUtil.buildMatcher(pattern, 0, true, true, pattern.toLowerCase().equals(pattern)); + } + private interface CalcElementsCallback { void run(Set elements); } -- 2.11.4.GIT