From 021d6b94447ebda6214b0f761036b893bac0b32f Mon Sep 17 00:00:00 2001 From: Peter Gromov Date: Tue, 21 Jan 2020 19:38:55 +0100 Subject: [PATCH] IDEA-230899 Wrong lambda-completion type inference GitOrigin-RevId: 185f1a9f35895a5c891ac0586e4c46959f98f342 --- .../codeInsight/generation/GenerateMembersUtil.java | 9 +-------- java/java-psi-api/src/com/intellij/psi/GenericsUtil.java | 6 ++++-- .../completion/smartType/InCollectionForEach-out.java | 5 +++++ .../completion/smartType/InCollectionForEach.java | 5 +++++ .../completion/SmartType18CompletionTest.java | 2 ++ 5 files changed, 17 insertions(+), 10 deletions(-) create mode 100644 java/java-tests/testData/codeInsight/completion/smartType/InCollectionForEach-out.java create mode 100644 java/java-tests/testData/codeInsight/completion/smartType/InCollectionForEach.java diff --git a/java/java-impl/src/com/intellij/codeInsight/generation/GenerateMembersUtil.java b/java/java-impl/src/com/intellij/codeInsight/generation/GenerateMembersUtil.java index 311e9f9974d7..12dad50838ed 100644 --- a/java/java-impl/src/com/intellij/codeInsight/generation/GenerateMembersUtil.java +++ b/java/java-impl/src/com/intellij/codeInsight/generation/GenerateMembersUtil.java @@ -516,14 +516,7 @@ public class GenerateMembersUtil { if (PsiUtil.isRawSubstitutor(owner, substitutor)) { return TypeConversionUtil.erasure(type); } - final PsiType psiType = substitutor.substitute(type); - if (psiType != null) { - final PsiType deepComponentType = psiType.getDeepComponentType(); - if (!(deepComponentType instanceof PsiCapturedWildcardType || deepComponentType instanceof PsiWildcardType)){ - return psiType; - } - } - return TypeConversionUtil.erasure(type); + return GenericsUtil.eliminateWildcards(substitutor.substitute(type), false, true); } public static boolean isChildInRange(PsiElement child, PsiElement first, PsiElement last) { diff --git a/java/java-psi-api/src/com/intellij/psi/GenericsUtil.java b/java/java-psi-api/src/com/intellij/psi/GenericsUtil.java index d25d3f826c90..3b512436c8ba 100644 --- a/java/java-psi-api/src/com/intellij/psi/GenericsUtil.java +++ b/java/java-psi-api/src/com/intellij/psi/GenericsUtil.java @@ -460,11 +460,13 @@ public class GenericsUtil { PsiElementFactory factory = JavaPsiFacade.getElementFactory(manager.getProject()); PsiSubstitutor substitutor = factory.createSubstitutor(map); - type = factory.createType(aClass, substitutor); + type = factory.createType(aClass, substitutor).annotate(classType.getAnnotationProvider()); } } else if (type instanceof PsiArrayType) { - return eliminateWildcards(((PsiArrayType)type).getComponentType(), false).createArrayType(); + PsiType component = eliminateWildcards(((PsiArrayType)type).getComponentType(), false); + PsiType newArray = type instanceof PsiEllipsisType ? new PsiEllipsisType(component) : new PsiArrayType(component); + return newArray.annotate(type.getAnnotationProvider()); } else if (type instanceof PsiWildcardType) { final PsiType bound = ((PsiWildcardType)type).getBound(); diff --git a/java/java-tests/testData/codeInsight/completion/smartType/InCollectionForEach-out.java b/java/java-tests/testData/codeInsight/completion/smartType/InCollectionForEach-out.java new file mode 100644 index 000000000000..889c7b49d407 --- /dev/null +++ b/java/java-tests/testData/codeInsight/completion/smartType/InCollectionForEach-out.java @@ -0,0 +1,5 @@ +class Test88 { + void foo(java.util.Collection foo) { + foo.forEach(s -> ); + } +} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/completion/smartType/InCollectionForEach.java b/java/java-tests/testData/codeInsight/completion/smartType/InCollectionForEach.java new file mode 100644 index 000000000000..4ab21b34316f --- /dev/null +++ b/java/java-tests/testData/codeInsight/completion/smartType/InCollectionForEach.java @@ -0,0 +1,5 @@ +class Test88 { + void foo(java.util.Collection foo) { + foo.forEach(s); + } +} \ No newline at end of file diff --git a/java/java-tests/testSrc/com/intellij/java/codeInsight/completion/SmartType18CompletionTest.java b/java/java-tests/testSrc/com/intellij/java/codeInsight/completion/SmartType18CompletionTest.java index 5032d91e5a1e..72c50950eed5 100644 --- a/java/java-tests/testSrc/com/intellij/java/codeInsight/completion/SmartType18CompletionTest.java +++ b/java/java-tests/testSrc/com/intellij/java/codeInsight/completion/SmartType18CompletionTest.java @@ -83,6 +83,8 @@ public class SmartType18CompletionTest extends LightFixtureCompletionTestCase { doTest(); } + public void testInCollectionForEach() { doTest();} + public void testConstructorRef() { doTest(false); }