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 d16425632b0e..ad92cfebb62d 100644 --- a/java/java-psi-api/src/com/intellij/psi/PsiMethodReferenceUtil.java +++ b/java/java-psi-api/src/com/intellij/psi/PsiMethodReferenceUtil.java @@ -203,20 +203,22 @@ public class PsiMethodReferenceUtil { subst = subst.putAll(result.getSubstitutor()); final MethodSignature signature2 = ((PsiMethod)resolve).getSignature(subst); - final PsiType interfaceReturnType = LambdaUtil.getFunctionalInterfaceReturnType(left); + if (methodReferenceExpression.isExact()) { + final PsiType interfaceReturnType = LambdaUtil.getFunctionalInterfaceReturnType(left); - PsiType returnType = PsiTypesUtil.patchMethodGetClassReturnType(methodReferenceExpression, methodReferenceExpression, - (PsiMethod)resolve, null, - PsiUtil.getLanguageLevel(methodReferenceExpression)); - if (returnType == null) { - returnType = ((PsiMethod)resolve).getReturnType(); - } - PsiType methodReturnType = subst.substitute(returnType); - if (interfaceReturnType != null && interfaceReturnType != PsiType.VOID) { - if (methodReturnType == null) { - methodReturnType = JavaPsiFacade.getElementFactory(methodReferenceExpression.getProject()).createType(((PsiMethod)resolve).getContainingClass(), subst); + PsiType returnType = PsiTypesUtil.patchMethodGetClassReturnType(methodReferenceExpression, methodReferenceExpression, + (PsiMethod)resolve, null, + PsiUtil.getLanguageLevel(methodReferenceExpression)); + if (returnType == null) { + returnType = ((PsiMethod)resolve).getReturnType(); + } + PsiType methodReturnType = subst.substitute(returnType); + if (interfaceReturnType != null && interfaceReturnType != PsiType.VOID) { + if (methodReturnType == null) { + methodReturnType = JavaPsiFacade.getElementFactory(methodReferenceExpression.getProject()).createType(((PsiMethod)resolve).getContainingClass(), subst); + } + if (!TypeConversionUtil.isAssignable(interfaceReturnType, methodReturnType, false)) return false; } - //if (!TypeConversionUtil.isAssignable(interfaceReturnType, methodReturnType, false)) return false; } if (areAcceptable(signature1, signature2, qualifierResolveResult.getContainingClass(), qualifierResolveResult.getSubstitutor(), ((PsiMethod)resolve).isVarArgs())) return true; } else if (resolve instanceof PsiClass) { diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/newMethodRef/CheckReturnTypeForExactRefs.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/newMethodRef/CheckReturnTypeForExactRefs.java new file mode 100644 index 000000000000..bc0486391e5a --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/newMethodRef/CheckReturnTypeForExactRefs.java @@ -0,0 +1,25 @@ +class Test { + + interface A { + X m(); + } + interface B extends A {} + interface C {} + + int integerRes() { return new Integer(42); } + + int intRes() { return 42; } + + void m(A a) {} + void m(B b) {} + void m(C b) {} + + void test(boolean flag) { + m(this::integerRes); + m(flag ? this::integerRes : this::integerRes); + + m(this::intRes); + m(flag ? this::intRes : this::intRes); + } + +} 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 8eef8ab842fb..3330b9d25a27 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 @@ -96,6 +96,10 @@ public class NewMethodRefHighlightingTest extends LightDaemonAnalyzerTestCase { doTest(); } + public void testCheckReturnTypeForExactRefs() throws Exception { + doTest(); + } + private void doTest() { doTest(false); }