diff --git a/java/java-psi-api/src/com/intellij/psi/LambdaUtil.java b/java/java-psi-api/src/com/intellij/psi/LambdaUtil.java index 3c1e5912dc38..58e43dbee73c 100644 --- a/java/java-psi-api/src/com/intellij/psi/LambdaUtil.java +++ b/java/java-psi-api/src/com/intellij/psi/LambdaUtil.java @@ -460,9 +460,32 @@ public class LambdaUtil { gParent = gParent.getParent(); } + JavaResolveResult[] results = null; if (gParent instanceof PsiMethodCallExpression) { + results = ((PsiMethodCallExpression)gParent).getMethodExpression().multiResolve(true); + } + else if (gParent instanceof PsiConstructorCall){ + final JavaPsiFacade facade = JavaPsiFacade.getInstance(gParent.getProject()); + PsiExpressionList argumentList = ((PsiCall)gParent).getArgumentList(); + if (argumentList != null) { + PsiClassType classType = null; + if (gParent instanceof PsiNewExpression) { + PsiJavaCodeReferenceElement ref = ((PsiNewExpression)gParent).getClassReference(); + classType = ref != null ? facade.getElementFactory().createType(ref) : null; + } + else if (gParent instanceof PsiEnumConstant) { + PsiClass containingClass = ((PsiEnumConstant)gParent).getContainingClass(); + classType = containingClass != null ? facade.getElementFactory().createType(containingClass) : null; + } + + if (classType != null) { + results = facade.getResolveHelper().multiResolveConstructor(classType, argumentList, gParent); + } + } + } + + if (results != null) { final Set types = new HashSet<>(); - final JavaResolveResult[] results = ((PsiMethodCallExpression)gParent).getMethodExpression().multiResolve(true); for (JavaResolveResult result : results) { final PsiType functionalExpressionType = getSubstitutedType(functionalExpression, true, lambdaIdx, result); if (functionalExpressionType != null && types.add(functionalExpressionType)) { diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/completion/normal/LambdaInAmbiguousConstructorCall.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/completion/normal/LambdaInAmbiguousConstructorCall.java new file mode 100644 index 000000000000..15331446c338 --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/completion/normal/LambdaInAmbiguousConstructorCall.java @@ -0,0 +1,10 @@ +import java.util.function.Function; +class TestMain { + public static void main(String[] args) { + new TestMain("abc", url -> url.); + } + + TestMain(String str, Function a, Function b) {} + + TestMain(int i) {} +} diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/completion/normal/LambdaInAmbiguousConstructorCall_after.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/completion/normal/LambdaInAmbiguousConstructorCall_after.java new file mode 100644 index 000000000000..fe69f01e38c7 --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/completion/normal/LambdaInAmbiguousConstructorCall_after.java @@ -0,0 +1,10 @@ +import java.util.function.Function; +class TestMain { + public static void main(String[] args) { + new TestMain("abc", url -> url.isEmpty()); + } + + TestMain(String str, Function a, Function b) {} + + TestMain(int i) {} +} diff --git a/java/java-tests/testSrc/com/intellij/java/codeInsight/completion/Normal8CompletionTest.groovy b/java/java-tests/testSrc/com/intellij/java/codeInsight/completion/Normal8CompletionTest.groovy index 13c590d9e96f..ae3b6f9fb614 100644 --- a/java/java-tests/testSrc/com/intellij/java/codeInsight/completion/Normal8CompletionTest.groovy +++ b/java/java-tests/testSrc/com/intellij/java/codeInsight/completion/Normal8CompletionTest.groovy @@ -283,6 +283,12 @@ class Test88 { myFixture.assertPreferredCompletionItems(0, 'toString', 'wait') } + void testLambdaInAmbiguousConstructorCall() { + configureByTestName() + selectItem(myItems.find { it.lookupString.contains('Empty') }) + checkResultByFileName() + } + void testLambdaWithSuperWildcardInAmbiguousCall() { configureByTestName() myFixture.assertPreferredCompletionItems(0, 'substring', 'substring', 'subSequence')