mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-13 21:55:01 +07:00
skip parenthesized expressions during type inference (IDEA-70591)
This commit is contained in:
@@ -406,7 +406,7 @@ public class PsiResolveHelperImpl implements PsiResolveHelper {
|
||||
Pair<PsiType, ConstraintType> substitution = null;
|
||||
if (owner instanceof PsiMethod && parent instanceof PsiCallExpression) {
|
||||
PsiCallExpression methodCall = (PsiCallExpression)parent;
|
||||
substitution = inferMethodTypeParameterFromParent(methodCall.getParent(), methodCall, typeParameter, substitutor, forCompletion);
|
||||
substitution = inferMethodTypeParameterFromParent(skipParenthesizedExprUp(methodCall.getParent()), methodCall, typeParameter, substitutor, forCompletion);
|
||||
}
|
||||
return substitution;
|
||||
}
|
||||
@@ -612,11 +612,15 @@ public class PsiResolveHelperImpl implements PsiResolveHelper {
|
||||
Pair<PsiType, ConstraintType> constraint = null;
|
||||
PsiType expectedType = null;
|
||||
|
||||
if (parent instanceof PsiVariable && methodCall.equals(((PsiVariable)parent).getInitializer())) {
|
||||
expectedType = ((PsiVariable)parent).getType();
|
||||
if (parent instanceof PsiVariable) {
|
||||
if (methodCall.equals(skipParenthesizedExprDown(((PsiVariable)parent).getInitializer()))) {
|
||||
expectedType = ((PsiVariable)parent).getType();
|
||||
}
|
||||
}
|
||||
else if (parent instanceof PsiAssignmentExpression && methodCall.equals(((PsiAssignmentExpression)parent).getRExpression())) {
|
||||
expectedType = ((PsiAssignmentExpression)parent).getLExpression().getType();
|
||||
else if (parent instanceof PsiAssignmentExpression) {
|
||||
if (methodCall.equals(skipParenthesizedExprDown(((PsiAssignmentExpression)parent).getRExpression()))) {
|
||||
expectedType = ((PsiAssignmentExpression)parent).getLExpression().getType();
|
||||
}
|
||||
}
|
||||
else if (parent instanceof PsiReturnStatement) {
|
||||
PsiMethod method = PsiTreeUtil.getParentOfType(parent, PsiMethod.class);
|
||||
@@ -702,6 +706,21 @@ public class PsiResolveHelperImpl implements PsiResolveHelper {
|
||||
return result;
|
||||
}
|
||||
|
||||
@Nullable
|
||||
private static PsiExpression skipParenthesizedExprDown(PsiExpression initializer) {
|
||||
while (initializer instanceof PsiParenthesizedExpression) {
|
||||
initializer = ((PsiParenthesizedExpression)initializer).getExpression();
|
||||
}
|
||||
return initializer;
|
||||
}
|
||||
|
||||
private static PsiElement skipParenthesizedExprUp(PsiElement parent) {
|
||||
while (parent instanceof PsiParenthesizedExpression) {
|
||||
parent = parent.getParent();
|
||||
}
|
||||
return parent;
|
||||
}
|
||||
|
||||
@Nullable
|
||||
private static Pair<PsiType, ConstraintType> inferTypeForCompletionFromCallContext(final PsiCallExpression innerMethodCall,
|
||||
final PsiExpressionList expressionList,
|
||||
|
||||
+18
@@ -135,3 +135,21 @@ class TestLocal<X> {
|
||||
class QualifiedTest {
|
||||
java.util.Map<String, String> s = new java.util.HashMap<>();
|
||||
}
|
||||
|
||||
|
||||
class TZ {
|
||||
|
||||
}
|
||||
|
||||
class ParenthTest<T extends TZ> {
|
||||
public ParenthTest(T x) {
|
||||
|
||||
}
|
||||
|
||||
public T z = null;
|
||||
|
||||
public int a() {
|
||||
ParenthTest<T> x = (new ParenthTest<>(null)); //red code is here
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user