don't duplicate expected type argument variant when showing non-imported classes

This commit is contained in:
peter
2013-08-31 13:01:24 +02:00
parent 4135d127e6
commit 3d0bb87be8
2 changed files with 30 additions and 14 deletions
@@ -27,6 +27,7 @@ import com.intellij.psi.filters.ElementFilter;
import com.intellij.psi.search.PsiShortNamesCache;
import com.intellij.util.CollectConsumer;
import com.intellij.util.Consumer;
import org.jetbrains.annotations.Nullable;
import java.util.Collections;
import java.util.LinkedHashSet;
@@ -58,7 +59,14 @@ public class JavaNoVariantsDelegator extends CompletionContributor {
JavaCompletionContributor.isClassNamePossible(parameters) &&
!JavaSmartCompletionContributor.AFTER_NEW.accepts(parameters.getPosition())) {
result = result.withPrefixMatcher(new BetterPrefixMatcher(result.getPrefixMatcher(), BetterPrefixMatcher.getBestMatchingDegree(plainResults)));
suggestNonImportedClasses(parameters, result);
InheritorsHolder holder = new InheritorsHolder(parameters.getPosition(), result);
for (CompletionResult plainResult : plainResults) {
LookupElement element = plainResult.getLookupElement();
if (element instanceof TypeArgumentCompletionProvider.TypeArgsLookupElement) {
((TypeArgumentCompletionProvider.TypeArgsLookupElement)element).registerSingleClass(holder);
}
}
suggestNonImportedClasses(parameters, JavaCompletionSorting.addJavaSorting(parameters, result), holder);
}
}
}
@@ -86,7 +94,7 @@ public class JavaNoVariantsDelegator extends CompletionContributor {
if (parameters.getInvocationCount() <= 1 &&
JavaCompletionContributor.mayStartClassName(result) &&
JavaCompletionContributor.isClassNamePossible(parameters)) {
suggestNonImportedClasses(parameters, result);
suggestNonImportedClasses(parameters, result, null);
return;
}
@@ -169,12 +177,14 @@ public class JavaNoVariantsDelegator extends CompletionContributor {
return allClasses;
}
private static void suggestNonImportedClasses(CompletionParameters parameters, final CompletionResultSet _result) {
final CompletionResultSet result = JavaCompletionSorting.addJavaSorting(parameters, _result);
private static void suggestNonImportedClasses(CompletionParameters parameters, final CompletionResultSet result, @Nullable final InheritorsHolder inheritorsHolder) {
JavaClassNameCompletionContributor.addAllClasses(parameters,
true, result.getPrefixMatcher(), new Consumer<LookupElement>() {
@Override
public void consume(LookupElement element) {
if (inheritorsHolder != null && inheritorsHolder.alreadyProcessed(element)) {
return;
}
JavaPsiClassReferenceElement classElement = element.as(JavaPsiClassReferenceElement.CLASS_CONDITION_KEY);
if (classElement != null) {
classElement.setAutoCompletionPolicy(AutoCompletionPolicy.NEVER_AUTOCOMPLETE);
@@ -108,15 +108,10 @@ class TypeArgumentCompletionProvider extends CompletionProvider<CompletionParame
typeItems.add(PsiTypeLookupItem.createLookupItem(arg, context));
}
if (typeItems.size() == 1 && myInheritors != null) {
PsiClass aClass = PsiUtil.resolveClassInClassTypeOnly(typeItems.get(0).getPsiType());
if (aClass != null) {
JavaCompletionUtil.setShowFQN(typeItems.get(0));
myInheritors.registerClass(aClass);
}
}
resultSet.addElement(new TypeArgsLookupElement(typeItems, globalTail, ConstructorInsertHandler.hasConstructorParameters(actualClass, context)));
boolean hasParameters = ConstructorInsertHandler.hasConstructorParameters(actualClass, context);
TypeArgsLookupElement element = new TypeArgsLookupElement(typeItems, globalTail, hasParameters);
element.registerSingleClass(myInheritors);
resultSet.addElement(element);
}
@Nullable
@@ -193,7 +188,7 @@ class TypeArgumentCompletionProvider extends CompletionProvider<CompletionParame
return Pair.create(referencedClass, parameterIndex);
}
private static class TypeArgsLookupElement extends LookupElement {
public static class TypeArgsLookupElement extends LookupElement {
private String myLookupString;
private final List<PsiTypeLookupItem> myTypeItems;
private final TailType myGlobalTail;
@@ -217,6 +212,17 @@ class TypeArgumentCompletionProvider extends CompletionProvider<CompletionParame
return myTypeItems.get(0).getObject();
}
public void registerSingleClass(@Nullable InheritorsHolder inheritors) {
if (inheritors != null && myTypeItems.size() == 1) {
PsiType type = myTypeItems.get(0).getPsiType();
PsiClass aClass = PsiUtil.resolveClassInClassTypeOnly(type);
if (aClass != null && !aClass.hasTypeParameters()) {
JavaCompletionUtil.setShowFQN(myTypeItems.get(0));
inheritors.registerClass(aClass);
}
}
}
@NotNull
@Override
public String getLookupString() {