IDEA-78175 Smart Completion: unexpected order of variants

This commit is contained in:
peter
2011-12-07 15:54:38 +01:00
parent 830dc897b3
commit acee6c62a0
2 changed files with 59 additions and 37 deletions
@@ -197,9 +197,13 @@ public class JavaSmartCompletionContributor extends CompletionContributor {
};
THashSet<ExpectedTypeInfo> mergedInfos = new THashSet<ExpectedTypeInfo>(_infos, EXPECTED_TYPE_INFO_STRATEGY);
List<Runnable> chainedEtc = new ArrayList<Runnable>();
for (final ExpectedTypeInfo info : mergedInfos) {
ReferenceExpressionCompletionContributor.fillCompletionVariants(new JavaSmartCompletionParameters(params, info), noTypeCheck);
Runnable slowContinuation =
ReferenceExpressionCompletionContributor.fillCompletionVariants(new JavaSmartCompletionParameters(params, info), noTypeCheck);
ContainerUtil.addIfNotNull(chainedEtc, slowContinuation);
}
addExpectedTypeMembers(params, mergedInfos, true, noTypeCheck);
for (final ExpectedTypeInfo info : mergedInfos) {
BasicExpressionCompletionContributor.fillCompletionVariants(new JavaSmartCompletionParameters(params, info), new Consumer<LookupElement>() {
@@ -216,19 +220,15 @@ public class JavaSmartCompletionContributor extends CompletionContributor {
}, result.getPrefixMatcher());
}
PsiElement position = params.getPosition();
final PsiElement parent = position.getParent();
if (!BasicExpressionCompletionContributor.AFTER_DOT.accepts(position) &&
parent != null &&
!(parent.getParent() instanceof PsiSwitchLabelStatement)) {
for (ExpectedTypeInfo info : mergedInfos) {
final boolean searchInheritors = params.getInvocationCount() > 1;
new JavaMembersGetter(info.getType(), position).addMembers(position, searchInheritors, noTypeCheck);
if (!info.getDefaultType().equals(info.getType())) {
new JavaMembersGetter(info.getDefaultType(), position).addMembers(position, searchInheritors, noTypeCheck);
}
}
for (Runnable runnable : chainedEtc) {
runnable.run();
}
final boolean searchInheritors = params.getInvocationCount() > 1;
if (searchInheritors) {
addExpectedTypeMembers(params, mergedInfos, false, noTypeCheck);
}
}
});
@@ -349,6 +349,24 @@ public class JavaSmartCompletionContributor extends CompletionContributor {
extend(CompletionType.SMART, AFTER_NEW, new JavaInheritorsGetter(ConstructorInsertHandler.SMART_INSTANCE));
}
private static void addExpectedTypeMembers(CompletionParameters params,
THashSet<ExpectedTypeInfo> mergedInfos,
boolean quick,
Consumer<LookupElement> consumer) {
PsiElement position = params.getPosition();
final PsiElement parent = position.getParent();
if (!BasicExpressionCompletionContributor.AFTER_DOT.accepts(position) &&
parent != null &&
!(parent.getParent() instanceof PsiSwitchLabelStatement)) {
for (ExpectedTypeInfo info : mergedInfos) {
new JavaMembersGetter(info.getType(), position).addMembers(position, !quick, consumer);
if (!info.getDefaultType().equals(info.getType())) {
new JavaMembersGetter(info.getDefaultType(), position).addMembers(position, !quick, consumer);
}
}
}
}
@Override
public void fillCompletionVariants(CompletionParameters parameters, CompletionResultSet result) {
super.fillCompletionVariants(parameters, JavaCompletionSorting.addJavaSorting(parameters, result));
@@ -104,32 +104,35 @@ public class ReferenceExpressionCompletionContributor {
return TrueFilter.INSTANCE;
}
public static void fillCompletionVariants(final JavaSmartCompletionParameters parameters, final Consumer<LookupElement> result) {
ApplicationManager.getApplication().runReadAction(new Runnable() {
public void run() {
final PsiElement element = parameters.getPosition();
if (JavaSmartCompletionContributor.INSIDE_TYPECAST_EXPRESSION.accepts(element)) return;
if (JavaCompletionData.isAfterPrimitiveOrArrayType(element)) return;
@Nullable
public static Runnable fillCompletionVariants(final JavaSmartCompletionParameters parameters, final Consumer<LookupElement> result) {
final PsiElement element = parameters.getPosition();
if (JavaSmartCompletionContributor.INSIDE_TYPECAST_EXPRESSION.accepts(element)) return null;
if (JavaCompletionData.isAfterPrimitiveOrArrayType(element)) return null;
final int offset = parameters.getParameters().getOffset();
final PsiReference reference = element.getContainingFile().findReferenceAt(offset);
if (reference != null) {
final ElementFilter filter = getReferenceFilter(element, false);
for (final LookupElement item : completeFinalReference(element, reference, filter, parameters)) {
result.consume(item);
}
final int offset = parameters.getParameters().getOffset();
final PsiReference reference = element.getContainingFile().findReferenceAt(offset);
if (reference != null) {
final ElementFilter filter = getReferenceFilter(element, false);
for (final LookupElement item : completeFinalReference(element, reference, filter, parameters)) {
result.consume(item);
}
final boolean secondTime = parameters.getParameters().getInvocationCount() >= 2;
final boolean secondTime = parameters.getParameters().getInvocationCount() >= 2;
for (final LookupElement item : JavaSmartCompletionContributor.completeReference(element, reference, filter, false, parameters.getParameters())) {
addSingleArrayElementAccess(element, item, parameters, result);
if (secondTime) {
final Set<LookupElement> base =
JavaSmartCompletionContributor.completeReference(element, reference, filter, false, parameters.getParameters());
for (final LookupElement item : base) {
addSingleArrayElementAccess(element, item, parameters, result);
}
if (secondTime) {
return new Runnable() {
@Override
public void run() {
for (final LookupElement item : base) {
addSecondCompletionVariants(element, reference, item, parameters, result);
}
}
if (secondTime) {
if (!psiElement().afterLeaf(".").accepts(element)) {
BasicExpressionCompletionContributor.processDataflowExpressionTypes(element, null, TRUE_MATCHER, new Consumer<LookupElement>() {
public void consume(LookupElement baseItem) {
@@ -138,9 +141,10 @@ public class ReferenceExpressionCompletionContributor {
});
}
}
}
};
}
});
}
return null;
}
private static Set<LookupElement> completeFinalReference(final PsiElement element, PsiReference reference, ElementFilter filter,