mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-18 09:34:34 +07:00
IDEA-78175 Smart Completion: unexpected order of variants
This commit is contained in:
+32
-14
@@ -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));
|
||||
|
||||
+27
-23
@@ -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,
|
||||
|
||||
Reference in New Issue
Block a user