IDEA-89211 Slow reaction on completion (~2 sec)

This commit is contained in:
peter
2012-07-25 18:19:20 +02:00
parent a5e0528002
commit 7bb504d9a1
6 changed files with 44 additions and 29 deletions
@@ -15,7 +15,9 @@
*/
package com.intellij.codeInsight;
import com.intellij.codeInsight.completion.AllClassesGetter;
import com.intellij.codeInsight.completion.JavaCompletionUtil;
import com.intellij.codeInsight.completion.PrefixMatcher;
import com.intellij.lang.Language;
import com.intellij.lang.StdLanguages;
import com.intellij.openapi.application.ApplicationManager;
@@ -257,13 +259,18 @@ public class CodeInsightUtil {
public static void processSubTypes(PsiType psiType,
final PsiElement context,
boolean getRawSubtypes,
@NotNull Condition<String> shortNameCondition,
@NotNull final PrefixMatcher matcher,
Consumer<PsiType> consumer) {
int arrayDim = psiType.getArrayDimensions();
psiType = psiType.getDeepComponentType();
if (!(psiType instanceof PsiClassType)) return;
final Condition<String> shortNameCondition = new Condition<String>() {
public boolean value(String s) {
return matcher.prefixMatches(s);
}
};
final PsiClassType baseType = (PsiClassType)psiType;
final PsiClassType.ClassResolveResult baseResult =
@@ -281,15 +288,30 @@ public class CodeInsightUtil {
return context.getResolveScope();
}
});
final Query<PsiClass> baseQuery = ClassInheritorsSearch.search(
new ClassInheritorsSearch.SearchParameters(baseClass, scope, true, false, false, shortNameCondition));
final Query<PsiClass> query = new FilteredQuery<PsiClass>(baseQuery, new Condition<PsiClass>() {
public boolean value(final PsiClass psiClass) {
return !(psiClass instanceof PsiTypeParameter);
}
});
query.forEach(createInheritorsProcessor(context, baseType, arrayDim, getRawSubtypes, consumer, baseClass, baseSubstitutor));
final Processor<PsiClass> inheritorsProcessor =
createInheritorsProcessor(context, baseType, arrayDim, getRawSubtypes, consumer, baseClass, baseSubstitutor);
if (matcher.getPrefix().length() > 2) {
AllClassesGetter.processJavaClasses(matcher, context.getProject(), scope, new Processor<PsiClass>() {
@Override
public boolean process(PsiClass psiClass) {
if (psiClass.isInheritor(baseClass, true)) {
return inheritorsProcessor.process(psiClass);
}
return true;
}
});
} else {
final Query<PsiClass> baseQuery = ClassInheritorsSearch.search(
new ClassInheritorsSearch.SearchParameters(baseClass, scope, true, false, false, shortNameCondition));
final Query<PsiClass> query = new FilteredQuery<PsiClass>(baseQuery, new Condition<PsiClass>() {
public boolean value(final PsiClass psiClass) {
return !(psiClass instanceof PsiTypeParameter);
}
});
query.forEach(inheritorsProcessor);
}
}
public static Processor<PsiClass> createInheritorsProcessor(final PsiElement context, final PsiClassType baseType,
@@ -162,6 +162,13 @@ public class AllClassesGetter {
return true;
}
};
processJavaClasses(prefixMatcher, project, scope, processor);
}
public static void processJavaClasses(final PrefixMatcher prefixMatcher,
Project project,
GlobalSearchScope scope,
Processor<PsiClass> processor) {
AllClassesSearch.search(scope, project, new Condition<String>() {
public boolean value(String s) {
return prefixMatcher.isStartMatch(s);
@@ -20,7 +20,6 @@ import com.intellij.codeInsight.ExpectedTypeInfo;
import com.intellij.codeInsight.daemon.impl.analysis.HighlightClassUtil;
import com.intellij.codeInsight.lookup.*;
import com.intellij.openapi.util.Comparing;
import com.intellij.openapi.util.Condition;
import com.intellij.pom.java.LanguageLevel;
import com.intellij.psi.*;
import com.intellij.psi.filters.getters.ExpectedTypesGetter;
@@ -181,15 +180,10 @@ public class JavaInheritorsGetter extends CompletionProvider<CompletionParameter
if (!processMostProbableInheritors(parameters, expectedClassTypes, consumer)) return;
//long
final Condition<String> shortNameCondition = new Condition<String>() {
public boolean value(String s) {
return matcher.prefixMatches(s);
}
};
for (final PsiClassType type : expectedClassTypes) {
final PsiClass psiClass = type.resolve();
if (psiClass != null && !psiClass.hasModifierProperty(PsiModifier.FINAL)) {
CodeInsightUtil.processSubTypes(type, parameters.getPosition(), false, shortNameCondition, consumer);
CodeInsightUtil.processSubTypes(type, parameters.getPosition(), false, matcher, consumer);
}
}
}
@@ -16,10 +16,10 @@
package com.intellij.codeInsight.template.macro;
import com.intellij.codeInsight.CodeInsightUtil;
import com.intellij.codeInsight.completion.PrefixMatcher;
import com.intellij.codeInsight.lookup.LookupElement;
import com.intellij.codeInsight.template.*;
import com.intellij.codeInsight.template.impl.JavaTemplateUtil;
import com.intellij.openapi.util.Condition;
import com.intellij.psi.PsiDocumentManager;
import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiFile;
@@ -63,7 +63,7 @@ public class SubtypesMacro extends Macro {
final Set<LookupElement> set = new LinkedHashSet<LookupElement>();
JavaTemplateUtil.addTypeLookupItem(set, type);
CodeInsightUtil.processSubTypes(type, element, false, Condition.TRUE, new Consumer<PsiType>() {
CodeInsightUtil.processSubTypes(type, element, false, PrefixMatcher.ALWAYS_TRUE, new Consumer<PsiType>() {
@Override
public void consume(PsiType psiType) {
JavaTemplateUtil.addTypeLookupItem(set, psiType);
@@ -20,12 +20,10 @@ import com.intellij.codeInsight.completion.JavaSmartCompletionParameters;
import com.intellij.codeInsight.completion.PrefixMatcher;
import com.intellij.codeInsight.lookup.AutoCompletionPolicy;
import com.intellij.codeInsight.lookup.LookupElement;
import com.intellij.openapi.util.Condition;
import com.intellij.openapi.util.text.StringUtil;
import com.intellij.psi.*;
import com.intellij.psi.util.InheritanceUtil;
import com.intellij.psi.util.PsiUtil;
import com.intellij.psi.util.TypeConversionUtil;
import com.intellij.util.Consumer;
import com.intellij.util.IncorrectOperationException;
import org.jetbrains.annotations.NotNull;
@@ -56,18 +54,12 @@ public class ClassLiteralGetter {
PsiFile file = position.getContainingFile();
addClassLiteralLookupElement(classParameter, result, file);
if (addInheritors) {
addInheritorClassLiterals(file, new Condition<String>() {
@Override
public boolean value(String s) {
return matcher.prefixMatches(s);
}
}, classParameter, result, matcher);
addInheritorClassLiterals(file, classParameter, result, matcher);
}
}
}
private static void addInheritorClassLiterals(final PsiFile context,
Condition<String> shortNameCondition,
final PsiType classParameter,
final Consumer<LookupElement> result, PrefixMatcher matcher) {
final String canonicalText = classParameter.getCanonicalText();
@@ -75,7 +67,7 @@ public class ClassLiteralGetter {
return;
}
CodeInsightUtil.processSubTypes(classParameter, context, true, shortNameCondition, new Consumer<PsiType>() {
CodeInsightUtil.processSubTypes(classParameter, context, true, matcher, new Consumer<PsiType>() {
@Override
public void consume(PsiType type) {
addClassLiteralLookupElement(type, result, context);
@@ -106,7 +106,7 @@ public abstract class MembersGetter {
};
consumer.consume(baseType);
if (searchInheritors && !CommonClassNames.JAVA_LANG_OBJECT.equals(where.getQualifiedName())) {
CodeInsightUtil.processSubTypes(baseType, context, true, Condition.TRUE, consumer);
CodeInsightUtil.processSubTypes(baseType, context, true, PrefixMatcher.ALWAYS_TRUE, consumer);
}
}