diff --git a/java/java-psi-impl/src/com/intellij/psi/impl/source/tree/java/PsiMethodCallExpressionImpl.java b/java/java-psi-impl/src/com/intellij/psi/impl/source/tree/java/PsiMethodCallExpressionImpl.java index 4e522d0d33f8..d4ef612d3817 100644 --- a/java/java-psi-impl/src/com/intellij/psi/impl/source/tree/java/PsiMethodCallExpressionImpl.java +++ b/java/java-psi-impl/src/com/intellij/psi/impl/source/tree/java/PsiMethodCallExpressionImpl.java @@ -164,7 +164,8 @@ public class PsiMethodCallExpressionImpl extends ExpressionPsiElement implements theOnly = type; } else if (!theOnly.equals(type)) { - return null; + theOnly = GenericsUtil.getLeastUpperBound(type, theOnly, file.getManager()); + if (theOnly == null) return null; } } diff --git a/java/java-tests/testData/codeInsight/completion/normal/AmbiguousCallLeastUpperBound.java b/java/java-tests/testData/codeInsight/completion/normal/AmbiguousCallLeastUpperBound.java new file mode 100644 index 000000000000..35f8759234b5 --- /dev/null +++ b/java/java-tests/testData/codeInsight/completion/normal/AmbiguousCallLeastUpperBound.java @@ -0,0 +1,8 @@ +class Main { + String foo(int x) { return "1";} + StringBuilder foo(String x) { return new StringBuilder();} + + void test() { + foo(1.25).le + } +} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/completion/normal/AmbiguousCallLeastUpperBound_after.java b/java/java-tests/testData/codeInsight/completion/normal/AmbiguousCallLeastUpperBound_after.java new file mode 100644 index 000000000000..c2f5e24059d2 --- /dev/null +++ b/java/java-tests/testData/codeInsight/completion/normal/AmbiguousCallLeastUpperBound_after.java @@ -0,0 +1,8 @@ +class Main { + String foo(int x) { return "1";} + StringBuilder foo(String x) { return new StringBuilder();} + + void test() { + foo(1.25).length() + } +} \ No newline at end of file diff --git a/java/java-tests/testSrc/com/intellij/java/codeInsight/completion/NormalCompletionTest.java b/java/java-tests/testSrc/com/intellij/java/codeInsight/completion/NormalCompletionTest.java index 870b829b419c..3f9a70365bf6 100644 --- a/java/java-tests/testSrc/com/intellij/java/codeInsight/completion/NormalCompletionTest.java +++ b/java/java-tests/testSrc/com/intellij/java/codeInsight/completion/NormalCompletionTest.java @@ -3251,4 +3251,11 @@ public class NormalCompletionTest extends NormalCompletionTestCase { myFixture.completeBasic(); assertTrue(myFixture.getLookupElementStrings().contains("A")); } + + @NeedsIndex.ForStandardLibrary + public void testAmbiguousCallLeastUpperBound() { + configureByTestName(); + myFixture.completeBasic(); + myFixture.checkResultByFile(getTestName(false) + "_after.java"); + } } diff --git a/java/java-tests/testSrc/com/intellij/java/codeInsight/daemon/lambda/Java8ExpressionsCheckTest.java b/java/java-tests/testSrc/com/intellij/java/codeInsight/daemon/lambda/Java8ExpressionsCheckTest.java index 56ca8431bfc8..46777ca84a19 100644 --- a/java/java-tests/testSrc/com/intellij/java/codeInsight/daemon/lambda/Java8ExpressionsCheckTest.java +++ b/java/java-tests/testSrc/com/intellij/java/codeInsight/daemon/lambda/Java8ExpressionsCheckTest.java @@ -345,19 +345,24 @@ public class Java8ExpressionsCheckTest extends LightDaemonAnalyzerTestCase { PsiMethodCallExpression outerCall = (PsiMethodCallExpression) innerCall.getParent().getParent(); - assertAmbiguous(outerCall); - assertAmbiguous(innerCall); + assertAmbiguous(outerCall, "java.util.Collection"); + assertAmbiguous(innerCall, "java.util.Collection"); dropCaches(); - assertAmbiguous(innerCall); - assertAmbiguous(outerCall); + assertAmbiguous(innerCall, "java.util.Collection"); + assertAmbiguous(outerCall, "java.util.Collection"); } - private static void assertAmbiguous(PsiMethodCallExpression call) { + private static void assertAmbiguous(PsiMethodCallExpression call, @Nullable String expectedType) { assertNull(call.getText(), call.resolveMethod()); assertSize(2, call.multiResolve(false)); - assertNull(call.getText(), call.getType()); + PsiType type = call.getType(); + if (expectedType == null) { + assertNull(call.getText(), type); + } else { + assertEquals(call.getText(), expectedType, type.getCanonicalText()); + } } public void testAdditionalConstraintsBasedOnLambdaResolution() {