mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-18 09:34:34 +07:00
IDEA-89211 Slow reaction on completion (~2 sec)
This commit is contained in:
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user