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 95f235def78d..2b9031d2637e 100644 --- a/java/java-impl/src/com/intellij/codeInsight/completion/TypeArgumentCompletionProvider.java +++ b/java/java-impl/src/com/intellij/codeInsight/completion/TypeArgumentCompletionProvider.java @@ -17,6 +17,7 @@ package com.intellij.codeInsight.completion; import com.intellij.codeInsight.CharTailType; import com.intellij.codeInsight.ExpectedTypeInfo; +import com.intellij.codeInsight.ExpectedTypesProvider; import com.intellij.codeInsight.TailType; import com.intellij.codeInsight.completion.util.ParenthesesInsertHandler; import com.intellij.codeInsight.lookup.LookupElement; @@ -60,15 +61,21 @@ class TypeArgumentCompletionProvider extends CompletionProvider pair = getTypeParameterInfo(context); if (pair == null) return; - ExpectedTypeInfo[] types = JavaSmartCompletionContributor.getExpectedTypes(parameters, false); - if (types.length > 0) { - for (ExpectedTypeInfo info : types) { - PsiType type = info.getType(); - if (type instanceof PsiClassType) { - fillExpectedTypeArgs(resultSet, context, pair.first, pair.second, ((PsiClassType)type).resolveGenerics(), mySmart ? info.getTailType() : TailType.NONE); + PsiExpression expression = PsiTreeUtil.getContextOfType(context, PsiExpression.class, true); + if (expression != null) { + ExpectedTypeInfo[] types = ExpectedTypesProvider.getExpectedTypes(expression, true, false, false); + if (types.length > 0) { + for (ExpectedTypeInfo info : types) { + PsiType type = info.getType(); + if (type instanceof PsiClassType && !type.equals(expression.getType())) { + fillExpectedTypeArgs(resultSet, context, pair.first, pair.second, ((PsiClassType)type).resolveGenerics(), mySmart ? info.getTailType() : TailType.NONE); + } } + return; } - } else if (mySmart) { + } + + if (mySmart) { addInheritors(parameters, resultSet, pair.first, pair.second); } } diff --git a/java/java-tests/testData/codeInsight/completion/normal/AnonymousTypeParameter.java b/java/java-tests/testData/codeInsight/completion/normal/AnonymousTypeParameter.java new file mode 100644 index 000000000000..5f3df45e6481 --- /dev/null +++ b/java/java-tests/testData/codeInsight/completion/normal/AnonymousTypeParameter.java @@ -0,0 +1,13 @@ +public class Util { + + public static List map(@NotNull Function mapping) { } + + public Object[] getVariants() { + return map(new Function>() { } + } + + +} +interface Function { + Result fun(Param param); +} diff --git a/java/java-tests/testData/codeInsight/completion/normal/AnonymousTypeParameter_after.java b/java/java-tests/testData/codeInsight/completion/normal/AnonymousTypeParameter_after.java new file mode 100644 index 000000000000..a1f002b876fe --- /dev/null +++ b/java/java-tests/testData/codeInsight/completion/normal/AnonymousTypeParameter_after.java @@ -0,0 +1,13 @@ +public class Util { + + public static List map(@NotNull Function mapping) { } + + public Object[] getVariants() { + return map(new Function>() { } + } + + +} +interface Function { + Result fun(Param param); +} 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 e4ad22d60932..ebd317969196 100644 --- a/java/java-tests/testSrc/com/intellij/codeInsight/completion/NormalCompletionTest.groovy +++ b/java/java-tests/testSrc/com/intellij/codeInsight/completion/NormalCompletionTest.groovy @@ -402,6 +402,8 @@ public class NormalCompletionTest extends LightFixtureCompletionTestCase { doTest(); } + public void testAnonymousTypeParameter() throws Throwable { doTest(); } + public void testClassLiteralInAnnoParam() throws Throwable { doTest(); }