mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
new inference: is poly expression strictly after spec
(cherry picked from commit a66cfe3806da068d012952170e22000a47bbfda1)
This commit is contained in:
+2
-30
@@ -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()));
|
||||
|
||||
Reference in New Issue
Block a user