mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
new inference: avoid resolve when possible
This commit is contained in:
+1
-1
@@ -237,7 +237,7 @@ public class InferenceSession {
|
||||
}
|
||||
|
||||
private void initReturnTypeConstraint(PsiMethod method, PsiCallExpression context) {
|
||||
if (PsiPolyExpressionUtil.isPolyExpression(context) ||
|
||||
if (PsiPolyExpressionUtil.isMethodCallPolyExpression(context, method) ||
|
||||
context instanceof PsiNewExpression && PsiDiamondType.ourDiamondGuard.currentStack().contains(context)) {
|
||||
final PsiType returnType = method.getReturnType();
|
||||
if (!PsiType.VOID.equals(returnType) && returnType != null) {
|
||||
|
||||
+16
-14
@@ -16,10 +16,8 @@
|
||||
package com.intellij.psi.impl.source.resolve.graphInference;
|
||||
|
||||
import com.intellij.psi.*;
|
||||
import com.intellij.psi.util.PsiTypesUtil;
|
||||
import com.intellij.psi.util.PsiUtil;
|
||||
import com.intellij.psi.util.TypeConversionUtil;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
|
||||
import java.util.Arrays;
|
||||
@@ -60,18 +58,7 @@ public class PsiPolyExpressionUtil {
|
||||
}
|
||||
}
|
||||
} else if (expression instanceof PsiMethodCallExpression) {
|
||||
if (isInAssignmentOrInvocationContext(expression) && ((PsiMethodCallExpression)expression).getTypeArguments().length == 0) {
|
||||
final PsiMethod method = ((PsiMethodCallExpression)expression).resolveMethod();
|
||||
if (method != null) {
|
||||
final Set<PsiTypeParameter> typeParameters = new HashSet<PsiTypeParameter>(Arrays.asList(method.getTypeParameters()));
|
||||
if (typeParameters.size() > 0) {
|
||||
final PsiType returnType = method.getReturnType();
|
||||
if (returnType != null) {
|
||||
return mentionsTypeParameters(returnType, typeParameters);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return isMethodCallPolyExpression(expression, ((PsiMethodCallExpression)expression).resolveMethod());
|
||||
}
|
||||
else if (expression instanceof PsiConditionalExpression) {
|
||||
final ConditionalKind conditionalKind = isBooleanOrNumeric(expression);
|
||||
@@ -82,6 +69,21 @@ public class PsiPolyExpressionUtil {
|
||||
return false;
|
||||
}
|
||||
|
||||
public static boolean isMethodCallPolyExpression(PsiExpression expression, final PsiMethod method) {
|
||||
if (isInAssignmentOrInvocationContext(expression) && ((PsiCallExpression)expression).getTypeArguments().length == 0) {
|
||||
if (method != null) {
|
||||
final Set<PsiTypeParameter> typeParameters = new HashSet<PsiTypeParameter>(Arrays.asList(method.getTypeParameters()));
|
||||
if (typeParameters.size() > 0) {
|
||||
final PsiType returnType = method.getReturnType();
|
||||
if (returnType != null) {
|
||||
return mentionsTypeParameters(returnType, typeParameters);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
public static Boolean mentionsTypeParameters(@Nullable PsiType returnType, final Set<PsiTypeParameter> typeParameters) {
|
||||
if (returnType == null) return false;
|
||||
return returnType.accept(new PsiTypeVisitor<Boolean>() {
|
||||
|
||||
Reference in New Issue
Block a user