diff --git a/java/java-impl/src/com/intellij/codeInsight/completion/InheritorsHolder.java b/java/java-impl/src/com/intellij/codeInsight/completion/InheritorsHolder.java index a6e4dda462d7..63d7105dda62 100644 --- a/java/java-impl/src/com/intellij/codeInsight/completion/InheritorsHolder.java +++ b/java/java-impl/src/com/intellij/codeInsight/completion/InheritorsHolder.java @@ -46,12 +46,15 @@ public class InheritorsHolder implements Consumer { if (object instanceof PsiClass) { final PsiClass psiClass = (PsiClass)object; if (JavaCompletionUtil.hasAccessibleInnerClass(psiClass, myPosition)) return; - - ContainerUtil.addIfNotNull(myAddedClasses, getClassName(psiClass)); + registerClass(psiClass); } myResult.addElement(AutoCompletionPolicy.NEVER_AUTOCOMPLETE.applyPolicy(lookupElement)); } + public void registerClass(PsiClass psiClass) { + ContainerUtil.addIfNotNull(myAddedClasses, getClassName(psiClass)); + } + @Nullable private static String getClassName(PsiClass psiClass) { String name = psiClass.getQualifiedName(); diff --git a/java/java-impl/src/com/intellij/codeInsight/completion/JavaCompletionContributor.java b/java/java-impl/src/com/intellij/codeInsight/completion/JavaCompletionContributor.java index a1e9fb3ce9f6..d360d548569a 100644 --- a/java/java-impl/src/com/intellij/codeInsight/completion/JavaCompletionContributor.java +++ b/java/java-impl/src/com/intellij/codeInsight/completion/JavaCompletionContributor.java @@ -225,11 +225,11 @@ public class JavaCompletionContributor extends CompletionContributor { return; } + final InheritorsHolder inheritors = new InheritorsHolder(position, result); if (JavaSmartCompletionContributor.IN_TYPE_ARGS.accepts(position)) { - new TypeArgumentCompletionProvider(false).addCompletions(parameters, new ProcessingContext(), result); + new TypeArgumentCompletionProvider(false, inheritors).addCompletions(parameters, new ProcessingContext(), result); } - final InheritorsHolder inheritors = new InheritorsHolder(position, result); if (JavaSmartCompletionContributor.AFTER_NEW.accepts(position)) { new JavaInheritorsGetter(ConstructorInsertHandler.BASIC_INSTANCE).generateVariants(parameters, result.getPrefixMatcher(), inheritors); } diff --git a/java/java-impl/src/com/intellij/codeInsight/completion/JavaSmartCompletionContributor.java b/java/java-impl/src/com/intellij/codeInsight/completion/JavaSmartCompletionContributor.java index 7af1b6edf7c5..ec24f053c783 100644 --- a/java/java-impl/src/com/intellij/codeInsight/completion/JavaSmartCompletionContributor.java +++ b/java/java-impl/src/com/intellij/codeInsight/completion/JavaSmartCompletionContributor.java @@ -286,7 +286,7 @@ public class JavaSmartCompletionContributor extends CompletionContributor { } }); - extend(CompletionType.SMART, IN_TYPE_ARGS, new TypeArgumentCompletionProvider(true)); + extend(CompletionType.SMART, IN_TYPE_ARGS, new TypeArgumentCompletionProvider(true, null)); extend(CompletionType.SMART, AFTER_NEW, new JavaInheritorsGetter(ConstructorInsertHandler.SMART_INSTANCE)); diff --git a/java/java-impl/src/com/intellij/codeInsight/completion/TypeArgumentCompletionProvider.java b/java/java-impl/src/com/intellij/codeInsight/completion/TypeArgumentCompletionProvider.java index ec1b392d96ff..95f235def78d 100644 --- a/java/java-impl/src/com/intellij/codeInsight/completion/TypeArgumentCompletionProvider.java +++ b/java/java-impl/src/com/intellij/codeInsight/completion/TypeArgumentCompletionProvider.java @@ -47,9 +47,11 @@ import static com.intellij.patterns.PsiJavaPatterns.psiElement; */ class TypeArgumentCompletionProvider extends CompletionProvider { private final boolean mySmart; + @Nullable private final InheritorsHolder myInheritors; - TypeArgumentCompletionProvider(boolean smart) { + TypeArgumentCompletionProvider(boolean smart, @Nullable InheritorsHolder inheritors) { mySmart = smart; + myInheritors = inheritors; } protected void addCompletions(@NotNull final CompletionParameters parameters, final ProcessingContext processingContext, @NotNull final CompletionResultSet resultSet) { @@ -71,7 +73,7 @@ class TypeArgumentCompletionProvider extends CompletionProvider 1) { + presentation.setTailText(null); + presentation.setTypeText(null); + } } @Override diff --git a/java/java-tests/testData/codeInsight/completion/normal/DuplicateExpectedTypeInTypeArgumentList.java b/java/java-tests/testData/codeInsight/completion/normal/DuplicateExpectedTypeInTypeArgumentList.java new file mode 100644 index 000000000000..4cf2f4c89bd1 --- /dev/null +++ b/java/java-tests/testData/codeInsight/completion/normal/DuplicateExpectedTypeInTypeArgumentList.java @@ -0,0 +1,8 @@ +import java.util.*; +import java.util.List; + +class Zoo { + { + List l = new ArrayList> + } +} diff --git a/java/java-tests/testSrc/com/intellij/codeInsight/completion/NormalCompletionTest.groovy b/java/java-tests/testSrc/com/intellij/codeInsight/completion/NormalCompletionTest.groovy index a36ed6e1c861..e4ad22d60932 100644 --- a/java/java-tests/testSrc/com/intellij/codeInsight/completion/NormalCompletionTest.groovy +++ b/java/java-tests/testSrc/com/intellij/codeInsight/completion/NormalCompletionTest.groovy @@ -1294,6 +1294,13 @@ public class ListUtils { assert !('return' in myFixture.lookupElementStrings) } + public void testDuplicateExpectedTypeInTypeArgumentList() { + configure() + def items = myFixture.lookupElements.findAll { it.lookupString == 'String' } + assert items.size() == 1 + assert LookupElementPresentation.renderElement(items[0]).tailText?.contains('java.lang') + } + public void testSameSignature() { configure() lookup.setCurrentItem(myItems[1])