From 06133feca80745d7a8cdcd06d89cb0dd2ad55c3e Mon Sep 17 00:00:00 2001 From: Sergey Evdokimov Date: Wed, 9 Mar 2011 14:12:17 +0300 Subject: [PATCH] Fix: IDEA-66363 (Plugin Dialog: speed search works incorrect if search key contains '-') --- .../ide/ui/search/PorterStemmerUtil.java | 12 ++++---- .../intellij/ide/ui/search/SearchUtil.java | 2 +- .../SearchableOptionsRegistrarImpl.java | 28 ++++++++----------- 3 files changed, 19 insertions(+), 23 deletions(-) diff --git a/platform/platform-impl/src/com/intellij/ide/ui/search/PorterStemmerUtil.java b/platform/platform-impl/src/com/intellij/ide/ui/search/PorterStemmerUtil.java index c1dc0df8495d..7bf8e2ee5fa7 100644 --- a/platform/platform-impl/src/com/intellij/ide/ui/search/PorterStemmerUtil.java +++ b/platform/platform-impl/src/com/intellij/ide/ui/search/PorterStemmerUtil.java @@ -28,19 +28,19 @@ public class PorterStemmerUtil { // check for zero length final int strLen = str.length(); if (strLen > 0) { - int lastDigit = -1; + int lastNonLetter = -1; for (int i = 0; i < strLen; ++i) { char c = str.charAt(i); - if (Character.isDigit(c)) { - lastDigit = i; + if (Character.isDigit(c) || c == '-' || c == '_') { + lastNonLetter = i; } else if (!Character.isLetter(c)) { return null; } } - ++lastDigit; - if (lastDigit > 0 && lastDigit < strLen) { - return str.substring(0, lastDigit) + stemString(str.substring(lastDigit)); + ++lastNonLetter; + if (lastNonLetter > 0 && lastNonLetter < strLen) { + return str.substring(0, lastNonLetter) + stemString(str.substring(lastNonLetter)); } return stemString(str); } diff --git a/platform/platform-impl/src/com/intellij/ide/ui/search/SearchUtil.java b/platform/platform-impl/src/com/intellij/ide/ui/search/SearchUtil.java index 4bcb43406275..e69d72a19c8c 100644 --- a/platform/platform-impl/src/com/intellij/ide/ui/search/SearchUtil.java +++ b/platform/platform-impl/src/com/intellij/ide/ui/search/SearchUtil.java @@ -447,7 +447,7 @@ public class SearchUtil { final String filter) { if (pos < end) { final Set filters = SearchableOptionsRegistrar.getInstance().getProcessedWords(filter); - final String[] words = text.substring(pos, end).split("[\\W&&[^_-]]"); + final String[] words = text.substring(pos, end).split("[\\W&&[^-]]+"); for (String word : words) { if (filters.contains(PorterStemmerUtil.stem(word.toLowerCase()))) { selectedWords.add(word); diff --git a/platform/platform-impl/src/com/intellij/ide/ui/search/SearchableOptionsRegistrarImpl.java b/platform/platform-impl/src/com/intellij/ide/ui/search/SearchableOptionsRegistrarImpl.java index 5f2b23b5132b..8e069a96fdf9 100644 --- a/platform/platform-impl/src/com/intellij/ide/ui/search/SearchableOptionsRegistrarImpl.java +++ b/platform/platform-impl/src/com/intellij/ide/ui/search/SearchableOptionsRegistrarImpl.java @@ -67,7 +67,7 @@ public class SearchableOptionsRegistrarImpl extends SearchableOptionsRegistrar { private static final Logger LOG = Logger.getInstance("#com.intellij.ide.ui.search.SearchableOptionsRegistrarImpl"); public static final int LOAD_FACTOR = 20; @NonNls - private static final Pattern REG_EXP = Pattern.compile("[\\W&&[^_-]]"); + private static final Pattern REG_EXP = Pattern.compile("[\\W&&[^-]]+"); @SuppressWarnings({"HardCodedStringLiteral"}) public SearchableOptionsRegistrarImpl() { @@ -360,14 +360,12 @@ public class SearchableOptionsRegistrarImpl extends SearchableOptionsRegistrar { Set result = new HashSet(); @NonNls final String toLowerCase = text.toLowerCase(); final String[] options = REG_EXP.split(toLowerCase); - if (options != null) { - for (String opt : options) { - if (opt == null) continue; - if (isStopWord(opt)) continue; - final String processed = PorterStemmerUtil.stem(opt); - if (isStopWord(processed)) continue; - result.add(opt); - } + for (String opt : options) { + if (isStopWord(opt)) continue; + final String processed = PorterStemmerUtil.stem(opt); + assert processed != null; + if (isStopWord(processed)) continue; + result.add(opt); } return result; } @@ -376,13 +374,11 @@ public class SearchableOptionsRegistrarImpl extends SearchableOptionsRegistrar { Set result = new HashSet(); @NonNls final String toLowerCase = text.toLowerCase(); final String[] options = REG_EXP.split(toLowerCase); - if (options != null) { - for (String opt : options) { - if (isStopWord(opt)) continue; - opt = PorterStemmerUtil.stem(opt); - if (opt == null) continue; - result.add(opt); - } + for (String opt : options) { + if (isStopWord(opt)) continue; + opt = PorterStemmerUtil.stem(opt); + assert opt != null; + result.add(opt); } return result; }