PsiMethodReferenceUtil: do not pass JavaResolveResult if can be calculated in-place

This commit is contained in:
Tagir Valeev
2017-09-05 15:05:04 +07:00
parent 0267c69157
commit 07a45d1e55
4 changed files with 10 additions and 15 deletions
@@ -1432,7 +1432,7 @@ public class HighlightVisitorImpl extends JavaElementVisitor implements Highligh
} }
if (!myHolder.hasErrorResults()) { if (!myHolder.hasErrorResults()) {
final String badReturnTypeMessage = PsiMethodReferenceUtil.checkReturnType(expression, result, functionalInterfaceType); final String badReturnTypeMessage = PsiMethodReferenceUtil.checkReturnType(expression, functionalInterfaceType);
if (badReturnTypeMessage != null) { if (badReturnTypeMessage != null) {
HighlightInfo info = HighlightInfo info =
HighlightInfo.newHighlightInfo(HighlightInfoType.ERROR).range(expression).descriptionAndTooltip(badReturnTypeMessage).create(); HighlightInfo.newHighlightInfo(HighlightInfoType.ERROR).range(expression).descriptionAndTooltip(badReturnTypeMessage).create();
@@ -114,7 +114,7 @@ public class AdjustFunctionContextFix extends LocalQuickFixAndIntentionActionOnP
PsiType actualReturnType; PsiType actualReturnType;
if(expression instanceof PsiMethodReferenceExpression) { if(expression instanceof PsiMethodReferenceExpression) {
PsiMethodReferenceExpression methodRef = (PsiMethodReferenceExpression)expression; PsiMethodReferenceExpression methodRef = (PsiMethodReferenceExpression)expression;
actualReturnType = PsiMethodReferenceUtil.getMethodReferenceReturnType(methodRef, methodRef.advancedResolve(true)); actualReturnType = PsiMethodReferenceUtil.getMethodReferenceReturnType(methodRef);
} else { } else {
actualReturnType = PsiResolveHelper.ourGraphGuard.doPreventingRecursion(expression, true, () -> expression.getType()); actualReturnType = PsiResolveHelper.ourGraphGuard.doPreventingRecursion(expression, true, () -> expression.getType());
} }
@@ -16,14 +16,12 @@
package com.intellij.psi; package com.intellij.psi;
import com.intellij.codeInsight.PsiEquivalenceUtil; import com.intellij.codeInsight.PsiEquivalenceUtil;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.util.Ref; import com.intellij.openapi.util.Ref;
import com.intellij.psi.util.*; import com.intellij.psi.util.*;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
public class PsiMethodReferenceUtil { public class PsiMethodReferenceUtil {
private static final Logger LOG = Logger.getInstance(PsiMethodReferenceUtil.class);
public static boolean isSecondSearchPossible(PsiType[] parameterTypes, public static boolean isSecondSearchPossible(PsiType[] parameterTypes,
QualifierResolveResult qualifierResolveResult, QualifierResolveResult qualifierResolveResult,
@@ -71,20 +69,18 @@ public class PsiMethodReferenceUtil {
} }
} }
public static boolean isReturnTypeCompatible(PsiMethodReferenceExpression expression, public static boolean isReturnTypeCompatible(PsiMethodReferenceExpression expression, PsiType functionalInterfaceType) {
JavaResolveResult result, return isReturnTypeCompatible(expression, functionalInterfaceType, null);
PsiType functionalInterfaceType) {
return isReturnTypeCompatible(expression, result, functionalInterfaceType, null);
} }
/** /**
* Returns actual return type of method reference (not the expected one) * Returns actual return type of method reference (not the expected one)
* *
* @param expression a method reference to get the return type of * @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 * @return an actual method reference return type
*/ */
public static PsiType getMethodReferenceReturnType(PsiMethodReferenceExpression expression, JavaResolveResult result) { public static PsiType getMethodReferenceReturnType(PsiMethodReferenceExpression expression) {
JavaResolveResult result = expression.advancedResolve(false);
PsiSubstitutor subst = result.getSubstitutor(); PsiSubstitutor subst = result.getSubstitutor();
PsiType methodReturnType = null; PsiType methodReturnType = null;
@@ -127,7 +123,6 @@ public class PsiMethodReferenceUtil {
} }
private static boolean isReturnTypeCompatible(PsiMethodReferenceExpression expression, private static boolean isReturnTypeCompatible(PsiMethodReferenceExpression expression,
JavaResolveResult result,
PsiType functionalInterfaceType, PsiType functionalInterfaceType,
Ref<String> errorMessage) { Ref<String> errorMessage) {
final PsiClassType.ClassResolveResult resolveResult = PsiUtil.resolveGenericsClassInType(functionalInterfaceType); final PsiClassType.ClassResolveResult resolveResult = PsiUtil.resolveGenericsClassInType(functionalInterfaceType);
@@ -139,7 +134,7 @@ public class PsiMethodReferenceUtil {
return true; return true;
} }
PsiType methodReturnType = getMethodReferenceReturnType(expression, result); PsiType methodReturnType = getMethodReferenceReturnType(expression);
if (methodReturnType == null || PsiType.VOID.equals(methodReturnType)) { if (methodReturnType == null || PsiType.VOID.equals(methodReturnType)) {
return false; return false;
} }
@@ -362,9 +357,9 @@ public class PsiMethodReferenceUtil {
return null; return null;
} }
public static String checkReturnType(PsiMethodReferenceExpression expression, JavaResolveResult result, PsiType functionalInterfaceType) { public static String checkReturnType(PsiMethodReferenceExpression expression, PsiType functionalInterfaceType) {
final Ref<String> errorMessage = Ref.create(); final Ref<String> errorMessage = Ref.create();
if (!isReturnTypeCompatible(expression, result, functionalInterfaceType, errorMessage)) { if (!isReturnTypeCompatible(expression, functionalInterfaceType, errorMessage)) {
return errorMessage.get(); return errorMessage.get();
} }
return null; return null;
@@ -430,7 +430,7 @@ public class PsiMethodReferenceExpressionImpl extends JavaStubPsiElement<Functio
return false; return false;
} }
return PsiMethodReferenceUtil.isReturnTypeCompatible(this, result, left); return PsiMethodReferenceUtil.isReturnTypeCompatible(this, left);
} }
@Nullable @Nullable