From d056cd6e955d79f94f3af45759092b044e8da2b7 Mon Sep 17 00:00:00 2001 From: Anna Kozlova Date: Thu, 3 Dec 2015 16:56:12 +0100 Subject: [PATCH] new inference: missed capture conversions for method references --- .../intellij/psi/PsiMethodReferenceUtil.java | 2 +- ...MethodReferenceCompatibilityConstraint.java | 18 +++++++++--------- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/java/java-psi-api/src/com/intellij/psi/PsiMethodReferenceUtil.java b/java/java-psi-api/src/com/intellij/psi/PsiMethodReferenceUtil.java index 7b73a8839259..1b5b53ffa06b 100644 --- a/java/java-psi-api/src/com/intellij/psi/PsiMethodReferenceUtil.java +++ b/java/java-psi-api/src/com/intellij/psi/PsiMethodReferenceUtil.java @@ -325,7 +325,7 @@ public class PsiMethodReferenceUtil { if (methodReturnType == null) { methodReturnType = JavaPsiFacade.getElementFactory(expression.getProject()).createType(containingClass, subst); } - if (!TypeConversionUtil.isAssignable(interfaceReturnType, methodReturnType)) { + if (!TypeConversionUtil.isAssignable(interfaceReturnType, PsiUtil.captureToplevelWildcards(methodReturnType, expression))) { return "Bad return type in method reference: cannot convert " + methodReturnType.getCanonicalText() + " to " + interfaceReturnType.getCanonicalText(); } } 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 16de8543b100..67db3f89007f 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 @@ -114,16 +114,16 @@ public class PsiMethodReferenceCompatibilityConstraint implements ConstraintForm return false; } - if (applicableMethodReturnType != null) { - constraints.add(new TypeCompatibilityConstraint(returnType, - session.substituteWithInferenceVariables(psiSubstitutor.substitute(applicableMethodReturnType)))); - } - else if (applicableMember instanceof PsiClass || applicableMember instanceof PsiMethod && ((PsiMethod)applicableMember).isConstructor()) { - final PsiElementFactory elementFactory = JavaPsiFacade.getElementFactory(applicableMember.getProject()); + if (applicableMethodReturnType == null && + (applicableMember instanceof PsiClass || applicableMember instanceof PsiMethod && ((PsiMethod)applicableMember).isConstructor())) { if (containingClass != null) { - final PsiType classType = session.substituteWithInferenceVariables(elementFactory.createType(containingClass, psiSubstitutor)); - constraints.add(new TypeCompatibilityConstraint(returnType, classType)); - } + applicableMethodReturnType = JavaPsiFacade.getElementFactory(applicableMember.getProject()).createType(containingClass, PsiSubstitutor.EMPTY); + } + } + + if (applicableMethodReturnType != null) { + final PsiType capturedReturnType = PsiUtil.captureToplevelWildcards(psiSubstitutor.substitute(applicableMethodReturnType), myExpression); + constraints.add(new TypeCompatibilityConstraint(returnType, session.substituteWithInferenceVariables(capturedReturnType))); } } return true;