less read actions

This commit is contained in:
peter.gromov
2010-11-17 18:55:28 +03:00
parent 72c0882f33
commit 96512588ef
8 changed files with 21 additions and 66 deletions
@@ -15,13 +15,11 @@
*/
package com.intellij.codeInsight.completion;
import com.google.common.collect.Sets;
import com.intellij.codeInsight.ExpectedTypeInfo;
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiLiteralExpression;
import com.intellij.util.ProcessingContext;
import com.intellij.util.containers.ContainerUtil;
import gnu.trove.THashSet;
import org.jetbrains.annotations.NotNull;
import java.util.Collection;
@@ -31,21 +29,11 @@ import java.util.Collection;
*/
public abstract class ExpectedTypeBasedCompletionProvider extends CompletionProvider<CompletionParameters> {
public ExpectedTypeBasedCompletionProvider() {
super(false);
}
public void addCompletions(@NotNull final CompletionParameters params, final ProcessingContext matchingContext, @NotNull final CompletionResultSet result) {
final PsiElement position = params.getPosition();
if (position.getParent() instanceof PsiLiteralExpression) return;
final THashSet<ExpectedTypeInfo> infos = new THashSet<ExpectedTypeInfo>();
ApplicationManager.getApplication().runReadAction(new Runnable() {
public void run() {
ContainerUtil.addAll(infos, JavaSmartCompletionContributor.getExpectedTypes(params));
}
});
addCompletions(params, result, infos);
addCompletions(params, result, Sets.newHashSet(JavaSmartCompletionContributor.getExpectedTypes(params)));
}
protected abstract void addCompletions(CompletionParameters params, CompletionResultSet result, Collection<ExpectedTypeInfo> infos);
@@ -97,7 +97,7 @@ public class JavaClassNameCompletionContributor extends CompletionContributor {
};
public JavaClassNameCompletionContributor() {
extend(CompletionType.CLASS_NAME, psiElement(), new CompletionProvider<CompletionParameters>(false) {
extend(CompletionType.CLASS_NAME, psiElement(), new CompletionProvider<CompletionParameters>() {
public void addCompletions(@NotNull final CompletionParameters parameters, final ProcessingContext matchingContext, @NotNull final CompletionResultSet result) {
if (shouldShowSecondSmartCompletionHint(parameters) &&
CompletionUtil.shouldShowFeature(parameters, CodeCompletionFeatures.SECOND_CLASS_NAME_COMPLETION)) {
@@ -66,8 +66,7 @@ public class JavaDocCompletionContributor extends CompletionContributor {
public JavaDocCompletionContributor() {
extend(CompletionType.BASIC, PsiJavaPatterns.psiElement(PsiDocToken.DOC_TAG_NAME), new TagChooser());
extend(CompletionType.BASIC, PsiJavaPatterns.psiElement().inside(PsiDocTagValue.class), new CompletionProvider<CompletionParameters>(
true) {
extend(CompletionType.BASIC, PsiJavaPatterns.psiElement().inside(PsiDocTagValue.class), new CompletionProvider<CompletionParameters>() {
protected void addCompletions(@NotNull final CompletionParameters parameters, final ProcessingContext context, @NotNull final CompletionResultSet result) {
final PsiElement position = parameters.getPosition();
boolean isArg = PsiJavaPatterns.psiElement().afterLeaf("(").accepts(position);
@@ -120,7 +120,7 @@ public class JavaSmartCompletionContributor extends CompletionContributor {
psiElement(PsiReferenceExpression.class).withParent(
psiElement(PsiExpressionList.class).withParent(PsiMethodCallExpression.class))), new SameSignatureCallParametersProvider());
extend(CompletionType.SMART, psiElement().afterLeaf(PsiKeyword.INSTANCEOF), new CompletionProvider<CompletionParameters>(false) {
extend(CompletionType.SMART, psiElement().afterLeaf(PsiKeyword.INSTANCEOF), new CompletionProvider<CompletionParameters>() {
protected void addCompletions(@NotNull final CompletionParameters parameters, final ProcessingContext context, @NotNull final CompletionResultSet result) {
final PsiElement position = parameters.getPosition();
final PsiType[] leftTypes = InstanceOfLeftPartTypeGetter.getLeftTypes(position);
@@ -21,9 +21,7 @@ import com.intellij.codeInsight.completion.CompletionResultSet;
import com.intellij.codeInsight.completion.JavaSmartCompletionParameters;
import com.intellij.codeInsight.completion.PrefixMatcher;
import com.intellij.codeInsight.lookup.AutoCompletionPolicy;
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.util.Computable;
import com.intellij.openapi.util.Condition;
import com.intellij.openapi.util.text.StringUtil;
import com.intellij.psi.*;
@@ -36,10 +34,6 @@ import org.jetbrains.annotations.Nullable;
public class ClassLiteralGetter extends CompletionProvider<JavaSmartCompletionParameters> {
private static final Logger LOG = Logger.getInstance("com.intellij.psi.filters.getters.ClassLiteralGetter");
public ClassLiteralGetter() {
super(false);
}
@Override
protected void addCompletions(@NotNull final JavaSmartCompletionParameters parameters,
ProcessingContext context,
@@ -52,12 +46,7 @@ public class ClassLiteralGetter extends CompletionProvider<JavaSmartCompletionPa
}
};
PsiType classParameter = ApplicationManager.getApplication().runReadAction(new Computable<PsiType>() {
@Nullable
public PsiType compute() {
return PsiUtil.substituteTypeParameter(parameters.getExpectedType(), CommonClassNames.JAVA_LANG_CLASS, 0, false);
}
});
PsiType classParameter = PsiUtil.substituteTypeParameter(parameters.getExpectedType(), CommonClassNames.JAVA_LANG_CLASS, 0, false);
boolean addInheritors = false;
if (classParameter instanceof PsiWildcardType) {
@@ -80,11 +69,7 @@ public class ClassLiteralGetter extends CompletionProvider<JavaSmartCompletionPa
Condition<String> shortNameCondition,
final PsiType classParameter,
CompletionResultSet result) {
final String canonicalText = ApplicationManager.getApplication().runReadAction(new Computable<String>() {
public String compute() {
return classParameter.getCanonicalText();
}
});
final String canonicalText = classParameter.getCanonicalText();
if (CommonClassNames.JAVA_LANG_OBJECT.equals(canonicalText) && StringUtil.isEmpty(result.getPrefixMatcher().getPrefix())) {
return;
}
@@ -95,22 +80,16 @@ public class ClassLiteralGetter extends CompletionProvider<JavaSmartCompletionPa
}
private static void addClassLiteralLookupElement(@Nullable final PsiType type, final CompletionResultSet resultSet, final PsiElement context) {
ApplicationManager.getApplication().runReadAction(new Runnable() {
public void run() {
if (type instanceof PsiClassType &&
type.isValid() &&
PsiUtil.resolveClassInType(type) != null &&
!((PsiClassType)type).hasParameters() &&
!(((PsiClassType)type).resolve() instanceof PsiTypeParameter)) {
try {
resultSet.addElement(AutoCompletionPolicy.NEVER_AUTOCOMPLETE.applyPolicy(new ClassLiteralLookupElement((PsiClassType)type, context)));
}
catch (IncorrectOperationException e) {
LOG.error(e);
}
}
if (type instanceof PsiClassType &&
PsiUtil.resolveClassInType(type) != null &&
!((PsiClassType)type).hasParameters() &&
!(((PsiClassType)type).resolve() instanceof PsiTypeParameter)) {
try {
resultSet.addElement(AutoCompletionPolicy.NEVER_AUTOCOMPLETE.applyPolicy(new ClassLiteralLookupElement((PsiClassType)type, context)));
}
});
catch (IncorrectOperationException e) {
LOG.error(e);
}
}
}
}
@@ -16,34 +16,23 @@
package com.intellij.codeInsight.completion;
import com.intellij.util.ProcessingContext;
import com.intellij.openapi.application.ApplicationManager;
import org.jetbrains.annotations.NotNull;
/**
* @author peter
*/
public abstract class CompletionProvider<V extends CompletionParameters> {
private final boolean myStartInReadAction;
protected CompletionProvider() {
this(true);
}
@Deprecated
protected CompletionProvider(final boolean startInReadAction) {
myStartInReadAction = startInReadAction;
}
protected abstract void addCompletions(@NotNull V parameters, final ProcessingContext context, @NotNull CompletionResultSet result);
public final void addCompletionVariants(@NotNull final V parameters, final ProcessingContext context, @NotNull final CompletionResultSet result) {
if (myStartInReadAction) {
ApplicationManager.getApplication().runReadAction(new Runnable() {
public void run() {
addCompletions(parameters, context, result);
}
});
} else {
addCompletions(parameters, context, result);
}
addCompletions(parameters, context, result);
}
}
@@ -77,7 +77,7 @@ public class FilePathCompletionContributor extends CompletionContributor {
}
});
extend(CompletionType.CLASS_NAME, psiElement(), new CompletionProvider<CompletionParameters>(false) {
extend(CompletionType.CLASS_NAME, psiElement(), new CompletionProvider<CompletionParameters>() {
@Override
protected void addCompletions(@NotNull final CompletionParameters parameters,
ProcessingContext context,
@@ -83,7 +83,7 @@ public class XmlCompletionContributor extends CompletionContributor {
public XmlCompletionContributor() {
extend(CompletionType.BASIC,
XmlPatterns.psiElement().inside(XmlPatterns.xmlAttributeValue()),
new CompletionProvider<CompletionParameters>(false) {
new CompletionProvider<CompletionParameters>() {
@Override
protected void addCompletions(@NotNull CompletionParameters parameters,
ProcessingContext context,