skip parenthesized expressions during type inference (IDEA-70591)

This commit is contained in:
anna
2011-06-03 17:59:04 +04:00
parent 48e81bb6c1
commit 2280dade76
2 changed files with 42 additions and 5 deletions
@@ -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,
@@ -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;
}
}