new inference: is poly expression strictly after spec

(cherry picked from commit a66cfe3806da068d012952170e22000a47bbfda1)
This commit is contained in:
anna
2013-11-25 16:47:23 +01:00
parent adc1ea2afd
commit ba7784cf5c
@@ -16,7 +16,6 @@
package com.intellij.psi.impl.source.resolve.graphInference;
import com.intellij.psi.*;
import com.intellij.psi.util.PsiTreeUtil;
import com.intellij.psi.util.PsiUtil;
import com.intellij.psi.util.TypeConversionUtil;
import org.jetbrains.annotations.Nullable;
@@ -59,7 +58,7 @@ public class PsiPolyExpressionUtil {
}
}
} else if (expression instanceof PsiMethodCallExpression) {
return isMethodCallPolyExpression(expression, dependsOnLambdaParams(expression) ? null : ((PsiMethodCallExpression)expression).resolveMethod());
return isMethodCallPolyExpression(expression, ((PsiMethodCallExpression)expression).resolveMethod());
}
else if (expression instanceof PsiConditionalExpression) {
final ConditionalKind conditionalKind = isBooleanOrNumeric(expression);
@@ -70,34 +69,7 @@ public class PsiPolyExpressionUtil {
return false;
}
private static boolean dependsOnLambdaParams(PsiExpression expression) {
final PsiLambdaExpression lambdaExpression = PsiTreeUtil.getParentOfType(expression, PsiLambdaExpression.class);
boolean isLambdaReturnStmt = lambdaExpression != null && LambdaUtil.getReturnExpressions(lambdaExpression).contains(expression);
if (isLambdaReturnStmt) {
final boolean [] dependsOnParams = new boolean[] {false};
expression.accept(new JavaRecursiveElementWalkingVisitor() {
@Override
public void visitElement(PsiElement element) {
if (dependsOnParams[0]) return;
super.visitElement(element);
}
@Override
public void visitReferenceExpression(PsiReferenceExpression expression) {
if (dependsOnParams[0]) return;
super.visitReferenceExpression(expression);
final PsiElement resolve = expression.resolve();
if (resolve instanceof PsiParameter && ((PsiParameter)resolve).getDeclarationScope() == lambdaExpression) {
dependsOnParams[0] = true;
}
}
});
isLambdaReturnStmt = dependsOnParams[0];
}
return isLambdaReturnStmt;
}
public static boolean isMethodCallPolyExpression(PsiExpression expression, final PsiMethod method) {
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()));