From 2a2b8a930e12bf6df518c78f21b4d0146550123d Mon Sep 17 00:00:00 2001 From: anna Date: Mon, 30 Sep 2013 18:52:06 +0200 Subject: [PATCH] new inference: avoid resolve when possible --- .../graphInference/InferenceSession.java | 2 +- .../graphInference/PsiPolyExpressionUtil.java | 30 ++++++++++--------- 2 files changed, 17 insertions(+), 15 deletions(-) diff --git a/java/java-psi-impl/src/com/intellij/psi/impl/source/resolve/graphInference/InferenceSession.java b/java/java-psi-impl/src/com/intellij/psi/impl/source/resolve/graphInference/InferenceSession.java index 71d6d7d28fcf..5bedf781659c 100644 --- a/java/java-psi-impl/src/com/intellij/psi/impl/source/resolve/graphInference/InferenceSession.java +++ b/java/java-psi-impl/src/com/intellij/psi/impl/source/resolve/graphInference/InferenceSession.java @@ -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) { diff --git a/java/java-psi-impl/src/com/intellij/psi/impl/source/resolve/graphInference/PsiPolyExpressionUtil.java b/java/java-psi-impl/src/com/intellij/psi/impl/source/resolve/graphInference/PsiPolyExpressionUtil.java index d6a1d46ad336..4cee26f3f378 100644 --- a/java/java-psi-impl/src/com/intellij/psi/impl/source/resolve/graphInference/PsiPolyExpressionUtil.java +++ b/java/java-psi-impl/src/com/intellij/psi/impl/source/resolve/graphInference/PsiPolyExpressionUtil.java @@ -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 typeParameters = new HashSet(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 typeParameters = new HashSet(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 typeParameters) { if (returnType == null) return false; return returnType.accept(new PsiTypeVisitor() {