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 01a83612b329..84099b1ece8f 100644 --- a/java/java-psi-api/src/com/intellij/psi/LambdaUtil.java +++ b/java/java-psi-api/src/com/intellij/psi/LambdaUtil.java @@ -468,12 +468,12 @@ public class LambdaUtil { final int finalLambdaIdx = adjustLambdaIdx(lambdaIdx, (PsiMethod)resolve, parameters); if (finalLambdaIdx < parameters.length) { if (!tryToSubstitute) return getNormalizedType(parameters[finalLambdaIdx]); - if (cachedType != null && paramIdx > -1) { + if (cachedType != null) { final PsiMethod interfaceMethod = getFunctionalInterfaceMethod(cachedType); if (interfaceMethod != null) { final PsiClassType.ClassResolveResult cachedResult = PsiUtil.resolveGenericsClassInType(cachedType); - final PsiType interfaceMethodParameterType = interfaceMethod.getParameterList().getParameters()[paramIdx].getType(); - if (!dependsOnTypeParams(cachedResult.getSubstitutor().substitute(interfaceMethodParameterType), cachedType, expression)){ + if (!dependsOnTypeParams(paramIdx == -1 ? cachedType : + cachedResult.getSubstitutor().substitute(interfaceMethod.getParameterList().getParameters()[paramIdx].getType()), cachedType, expression)){ return cachedType; } } diff --git a/java/java-psi-impl/src/com/intellij/psi/impl/source/resolve/graphInference/InferenceSession.java b/java/java-psi-impl/src/com/intellij/psi/impl/source/resolve/graphInference/InferenceSession.java index 91aec7c01821..2be1c0221881 100644 --- a/java/java-psi-impl/src/com/intellij/psi/impl/source/resolve/graphInference/InferenceSession.java +++ b/java/java-psi-impl/src/com/intellij/psi/impl/source/resolve/graphInference/InferenceSession.java @@ -696,7 +696,13 @@ public class InferenceSession { additionalConstraints.removeAll(subset); - PsiSubstitutor substitutor = resolveBounds(varsToResolve, mySiteSubstitutor, false); + PsiSubstitutor substitutor = resolveBounds(varsToResolve, mySiteSubstitutor, true); + + if (myContext instanceof PsiCallExpression) { + PsiExpressionList argumentList = ((PsiCallExpression)myContext).getArgumentList(); + LOG.assertTrue(argumentList != null); + MethodCandidateInfo.updateSubstitutor(argumentList, substitutor); + } for (ConstraintFormula additionalConstraint : subset) { additionalConstraint.apply(substitutor); diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/newLambda/AdditionalConstraintSubstitution.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/newLambda/AdditionalConstraintSubstitution.java new file mode 100644 index 000000000000..74240f1191cc --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/newLambda/AdditionalConstraintSubstitution.java @@ -0,0 +1,19 @@ +import java.util.Map; +import java.util.function.BinaryOperator; +import java.util.function.Function; +import java.util.stream.Collector; +import java.util.stream.Stream; + +public class Bug +{ + + void foo(Stream words){ + words.collect(toMap(w -> 1, (a, b) -> a + b)); + } + + public static + Collector> toMap(Function valueMapper, + BinaryOperator mergeFunction) { + return null; + } +} diff --git a/java/java-tests/testSrc/com/intellij/codeInsight/daemon/lambda/LambdaHighlightingTest.java b/java/java-tests/testSrc/com/intellij/codeInsight/daemon/lambda/LambdaHighlightingTest.java index 15fa6de18698..8e43934432aa 100644 --- a/java/java-tests/testSrc/com/intellij/codeInsight/daemon/lambda/LambdaHighlightingTest.java +++ b/java/java-tests/testSrc/com/intellij/codeInsight/daemon/lambda/LambdaHighlightingTest.java @@ -83,7 +83,7 @@ public class LambdaHighlightingTest extends LightDaemonAnalyzerTestCase { public void testAmbiguityReturnValueResolution3() { doTest(); } public void testLambdaOnVarargsPlace1() { doTest(); } public void testInferenceFromSecondLambda() { doTest(); } - public void _testAcceptRawSubstForLambda() { doTest(); } + public void testAcceptRawSubstForLambda() { doTest(); } public void testCheckFunctionalInterfaceAccess() { doTest(); } public void testVoidCompatibility() { doTest(); } public void testConditionalInferenceFromOppositePart() { doTest(); } diff --git a/java/java-tests/testSrc/com/intellij/codeInsight/daemon/lambda/NewLambdaHighlightingTest.java b/java/java-tests/testSrc/com/intellij/codeInsight/daemon/lambda/NewLambdaHighlightingTest.java index 9a20f027b405..bfac8d363f52 100644 --- a/java/java-tests/testSrc/com/intellij/codeInsight/daemon/lambda/NewLambdaHighlightingTest.java +++ b/java/java-tests/testSrc/com/intellij/codeInsight/daemon/lambda/NewLambdaHighlightingTest.java @@ -107,6 +107,10 @@ public class NewLambdaHighlightingTest extends LightDaemonAnalyzerTestCase { doTest(); } + public void testAdditionalConstraintSubstitution() throws Exception { + doTest(); + } + private void doTest() { doTest(false); }