diff --git a/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightVisitorImpl.java b/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightVisitorImpl.java index dbb5964d50fd..4ee5a678b85e 100644 --- a/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightVisitorImpl.java +++ b/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightVisitorImpl.java @@ -1432,7 +1432,7 @@ public class HighlightVisitorImpl extends JavaElementVisitor implements Highligh } if (!myHolder.hasErrorResults()) { - final String badReturnTypeMessage = PsiMethodReferenceUtil.checkReturnType(expression, functionalInterfaceType); + final String badReturnTypeMessage = PsiMethodReferenceUtil.checkReturnType(expression, result, functionalInterfaceType); if (badReturnTypeMessage != null) { HighlightInfo info = HighlightInfo.newHighlightInfo(HighlightInfoType.ERROR).range(expression).descriptionAndTooltip(badReturnTypeMessage).create(); 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 ef35ebec7cd9..70c045e273d9 100644 --- a/java/java-psi-api/src/com/intellij/psi/PsiMethodReferenceUtil.java +++ b/java/java-psi-api/src/com/intellij/psi/PsiMethodReferenceUtil.java @@ -16,12 +16,14 @@ package com.intellij.psi; import com.intellij.codeInsight.PsiEquivalenceUtil; +import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.util.Ref; import com.intellij.psi.util.*; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; public class PsiMethodReferenceUtil { + private static final Logger LOG = Logger.getInstance(PsiMethodReferenceUtil.class); public static boolean isSecondSearchPossible(PsiType[] parameterTypes, QualifierResolveResult qualifierResolveResult, @@ -69,8 +71,10 @@ public class PsiMethodReferenceUtil { } } - public static boolean isReturnTypeCompatible(PsiMethodReferenceExpression expression, PsiType functionalInterfaceType) { - return isReturnTypeCompatible(expression, functionalInterfaceType, null); + public static boolean isReturnTypeCompatible(PsiMethodReferenceExpression expression, + JavaResolveResult result, + PsiType functionalInterfaceType) { + return isReturnTypeCompatible(expression, result, functionalInterfaceType, null); } /** @@ -80,7 +84,17 @@ public class PsiMethodReferenceUtil { * @return an actual method reference return type */ public static PsiType getMethodReferenceReturnType(PsiMethodReferenceExpression expression) { - JavaResolveResult result = expression.advancedResolve(false); + return getMethodReferenceReturnType(expression, expression.advancedResolve(false)); + } + + /** + * Returns actual return type of method reference (not the expected one) + * + * @param expression a method reference to get the return type of + * @param result the result of method reference resolution + * @return an actual method reference return type + */ + private static PsiType getMethodReferenceReturnType(PsiMethodReferenceExpression expression, JavaResolveResult result) { PsiSubstitutor subst = result.getSubstitutor(); PsiType methodReturnType = null; @@ -123,6 +137,7 @@ public class PsiMethodReferenceUtil { } private static boolean isReturnTypeCompatible(PsiMethodReferenceExpression expression, + JavaResolveResult result, PsiType functionalInterfaceType, Ref errorMessage) { final PsiClassType.ClassResolveResult resolveResult = PsiUtil.resolveGenericsClassInType(functionalInterfaceType); @@ -134,7 +149,7 @@ public class PsiMethodReferenceUtil { return true; } - PsiType methodReturnType = getMethodReferenceReturnType(expression); + PsiType methodReturnType = getMethodReferenceReturnType(expression, result); if (methodReturnType == null || PsiType.VOID.equals(methodReturnType)) { return false; } @@ -357,9 +372,9 @@ public class PsiMethodReferenceUtil { return null; } - public static String checkReturnType(PsiMethodReferenceExpression expression, PsiType functionalInterfaceType) { + public static String checkReturnType(PsiMethodReferenceExpression expression, JavaResolveResult result, PsiType functionalInterfaceType) { final Ref errorMessage = Ref.create(); - if (!isReturnTypeCompatible(expression, functionalInterfaceType, errorMessage)) { + if (!isReturnTypeCompatible(expression, result, functionalInterfaceType, errorMessage)) { return errorMessage.get(); } return null; diff --git a/java/java-psi-impl/src/com/intellij/psi/impl/source/tree/java/PsiMethodReferenceExpressionImpl.java b/java/java-psi-impl/src/com/intellij/psi/impl/source/tree/java/PsiMethodReferenceExpressionImpl.java index 30280883427d..1af0b34d9b41 100644 --- a/java/java-psi-impl/src/com/intellij/psi/impl/source/tree/java/PsiMethodReferenceExpressionImpl.java +++ b/java/java-psi-impl/src/com/intellij/psi/impl/source/tree/java/PsiMethodReferenceExpressionImpl.java @@ -430,7 +430,7 @@ public class PsiMethodReferenceExpressionImpl extends JavaStubPsiElement