new inference: avoid resolve when possible

This commit is contained in:
anna
2013-09-30 19:45:44 +02:00
parent fe71df67fc
commit 2a2b8a930e
2 changed files with 17 additions and 15 deletions
@@ -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,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>() {