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 aec54d68d423..9e42f4b8c330 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 @@ -1308,6 +1308,10 @@ public class InferenceSession { psiSubstitutor = receiverSubstitutor; } } + else if (methodContainingClass != null) { + psiSubstitutor = TypeConversionUtil.getClassSubstitutor(methodContainingClass, containingClass, psiSubstitutor); + LOG.assertTrue(psiSubstitutor != null, "derived: " + containingClass + "; super: " + methodContainingClass); + } final PsiType qType = JavaPsiFacade.getElementFactory(method.getProject()).createType(containingClass, psiSubstitutor); @@ -1315,7 +1319,7 @@ public class InferenceSession { for (int i = 0; i < signature.getParameterTypes().length - 1; i++) { final PsiType interfaceParamType = signature.getParameterTypes()[i + 1]; - addConstraint(new TypeCompatibilityConstraint(substituteWithInferenceVariables(getParameterType(parameters, i, PsiSubstitutor.EMPTY, varargs)), + addConstraint(new TypeCompatibilityConstraint(substituteWithInferenceVariables(getParameterType(parameters, i, psiSubstitutor, varargs)), PsiImplUtil.normalizeWildcardTypeByPosition(interfaceParamType, reference))); } } diff --git a/java/java-psi-impl/src/com/intellij/psi/impl/source/resolve/graphInference/constraints/PsiMethodReferenceCompatibilityConstraint.java b/java/java-psi-impl/src/com/intellij/psi/impl/source/resolve/graphInference/constraints/PsiMethodReferenceCompatibilityConstraint.java index 83e7151d47e2..45af0e97b55e 100644 --- a/java/java-psi-impl/src/com/intellij/psi/impl/source/resolve/graphInference/constraints/PsiMethodReferenceCompatibilityConstraint.java +++ b/java/java-psi-impl/src/com/intellij/psi/impl/source/resolve/graphInference/constraints/PsiMethodReferenceCompatibilityConstraint.java @@ -88,7 +88,6 @@ public class PsiMethodReferenceCompatibilityConstraint implements ConstraintForm final PsiType qualifierType = PsiMethodReferenceUtil.getQualifierType(myExpression); final PsiClass qualifierClass = PsiUtil.resolveClassInType(qualifierType); if (qualifierClass != null) { - session.initBounds(myExpression, qualifierClass.getTypeParameters()); final PsiType pType = signature.getParameterTypes()[0]; constraints.add(new StrictSubtypingConstraint(session.substituteWithInferenceVariables(qualifierType), pType)); } diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/newMethodRef/ConstraintsFromNonRawReceiverType.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/newMethodRef/ConstraintsFromNonRawReceiverType.java new file mode 100644 index 000000000000..32df73cf9666 --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/newMethodRef/ConstraintsFromNonRawReceiverType.java @@ -0,0 +1,25 @@ +import java.util.*; +import java.util.function.BinaryOperator; +import java.util.function.Supplier; +import java.util.stream.Collector; + +class Test { + public static Collector, Set> foo(Supplier> setConstructor, + BinaryOperator> rBinaryOperator) { + + return Collector.of(setConstructor, Set:: add, rBinaryOperator); + } + + public static Collector, Set> foo() { + final Supplier> setConstructor = HashSet::new; + + return Collector.of( + setConstructor, + Set::add, + (Set s1, Set s2) -> { + s1.addAll(s2); + return s1; + } + ); + } +} \ No newline at end of file diff --git a/java/java-tests/testSrc/com/intellij/codeInsight/daemon/lambda/NewMethodRefHighlightingTest.java b/java/java-tests/testSrc/com/intellij/codeInsight/daemon/lambda/NewMethodRefHighlightingTest.java index f8d298225533..da2e8e16ed31 100644 --- a/java/java-tests/testSrc/com/intellij/codeInsight/daemon/lambda/NewMethodRefHighlightingTest.java +++ b/java/java-tests/testSrc/com/intellij/codeInsight/daemon/lambda/NewMethodRefHighlightingTest.java @@ -398,6 +398,10 @@ public class NewMethodRefHighlightingTest extends LightDaemonAnalyzerTestCase { doTest(); } + public void testConstraintsFromNonRawReceiverType() throws Exception { + doTest(); + } + private void doTest() { doTest(false); }