From 10549e12d7a5767dcf87460fab29d8f41e5a5766 Mon Sep 17 00:00:00 2001 From: peter Date: Tue, 31 Jul 2012 15:44:02 +0200 Subject: [PATCH] IDEA-89501 IDEA sometimes freeze after selecting item in a completion list --- .../completion/StaticMemberProcessor.java | 4 ++-- .../completion/CompletionUtil.java | 24 +++++++++++++------ 2 files changed, 19 insertions(+), 9 deletions(-) diff --git a/java/java-impl/src/com/intellij/codeInsight/completion/StaticMemberProcessor.java b/java/java-impl/src/com/intellij/codeInsight/completion/StaticMemberProcessor.java index 7ad421ce7ed4..826c9fdd98ac 100644 --- a/java/java-impl/src/com/intellij/codeInsight/completion/StaticMemberProcessor.java +++ b/java/java-impl/src/com/intellij/codeInsight/completion/StaticMemberProcessor.java @@ -50,7 +50,7 @@ public abstract class StaticMemberProcessor { final GlobalSearchScope scope = myPosition.getResolveScope(); final PsiShortNamesCache namesCache = PsiShortNamesCache.getInstance(myProject); String[] methodNames = namesCache.getAllMethodNames(); - for (final String methodName : CompletionUtil.sortForCompletion(matcher, Arrays.asList(methodNames))) { + for (final String methodName : CompletionUtil.sortMatching(matcher, Arrays.asList(methodNames))) { if (matcher.prefixMatches(methodName)) { Set classes = new THashSet(); for (final PsiMethod method : namesCache.getMethodsByName(methodName, scope)) { @@ -86,7 +86,7 @@ public abstract class StaticMemberProcessor { } } String[] fieldNames = namesCache.getAllFieldNames(); - for (final String fieldName : CompletionUtil.sortForCompletion(matcher, Arrays.asList(fieldNames))) { + for (final String fieldName : CompletionUtil.sortMatching(matcher, Arrays.asList(fieldNames))) { if (matcher.prefixMatches(fieldName)) { for (final PsiField field : namesCache.getFieldsByName(fieldName, scope)) { if (isStaticallyImportable(field)) { diff --git a/platform/lang-impl/src/com/intellij/codeInsight/completion/CompletionUtil.java b/platform/lang-impl/src/com/intellij/codeInsight/completion/CompletionUtil.java index 0b38bd0f3c95..409a1e353254 100644 --- a/platform/lang-impl/src/com/intellij/codeInsight/completion/CompletionUtil.java +++ b/platform/lang-impl/src/com/intellij/codeInsight/completion/CompletionUtil.java @@ -27,6 +27,7 @@ import com.intellij.openapi.editor.Document; import com.intellij.openapi.editor.Editor; import com.intellij.openapi.extensions.Extensions; import com.intellij.openapi.fileTypes.FileType; +import com.intellij.openapi.progress.ProgressManager; import com.intellij.openapi.util.Key; import com.intellij.openapi.util.NotNullLazyValue; import com.intellij.openapi.util.TextRange; @@ -266,20 +267,29 @@ public class CompletionUtil { return element == null ? psi : element; } - public static LinkedHashSet sortForCompletion(final PrefixMatcher matcher, List _names) { - List sorted = new ArrayList(_names); - Collections.sort(sorted, new Comparator() { - @Override - public int compare(String o1, String o2) { - return o1.compareToIgnoreCase(o2); + public static LinkedHashSet sortMatching(final PrefixMatcher matcher, Collection _names) { + ProgressManager.checkCanceled(); + + List sorted = new ArrayList(); + for (String name : _names) { + if (matcher.prefixMatches(name)) { + sorted.add(name); } - }); + } + + ProgressManager.checkCanceled(); + Collections.sort(sorted, String.CASE_INSENSITIVE_ORDER); + ProgressManager.checkCanceled(); + LinkedHashSet result = new LinkedHashSet(); for (String name : sorted) { if (matcher.isStartMatch(name)) { result.add(name); } } + + ProgressManager.checkCanceled(); + result.addAll(sorted); return result; }