todo test improved analysis of unary expressions

added explicit 'isUnaryExpressionDependentOnExpectedType' check
This commit is contained in:
Svetlana Isakova
2013-10-29 16:06:43 +04:00
committed by svtk
parent c0890ccc37
commit 491305ff34
3 changed files with 18 additions and 5 deletions
@@ -400,6 +400,11 @@ public class CandidateResolver {
return visitInnerExpression(expression.getExpression());
}
@Override
public JetExpression visitUnaryExpression(@NotNull JetUnaryExpression expression, Void data) {
return ExpressionTypingUtils.isUnaryExpressionDependentOnExpectedType(expression) ? expression : null;
}
@Override
public JetExpression visitPrefixExpression(@NotNull JetPrefixExpression expression, Void data) {
return visitInnerExpression(JetPsiUtil.getBaseExpressionIfLabeledExpression(expression));
@@ -604,7 +604,11 @@ public class BasicExpressionTypingVisitor extends ExpressionTypingVisitor {
return visitUnaryExpression(expression, context, false);
}
public JetTypeInfo visitUnaryExpression(JetUnaryExpression expression, ExpressionTypingContext context, boolean isStatement) {
public JetTypeInfo visitUnaryExpression(JetUnaryExpression expression, ExpressionTypingContext contextWithExpectedType, boolean isStatement) {
ExpressionTypingContext context = isUnaryExpressionDependentOnExpectedType(expression)
? contextWithExpectedType
: contextWithExpectedType.replaceContextDependency(INDEPENDENT).replaceExpectedType(NO_EXPECTED_TYPE);
JetExpression baseExpression = expression.getBaseExpression();
if (baseExpression == null) return JetTypeInfo.create(null, context.dataFlowInfo);
@@ -622,8 +626,7 @@ public class BasicExpressionTypingVisitor extends ExpressionTypingVisitor {
}
// Type check the base expression
JetTypeInfo typeInfo = facade.getTypeInfo(
baseExpression, context.replaceExpectedType(NO_EXPECTED_TYPE).replaceContextDependency(INDEPENDENT));
JetTypeInfo typeInfo = facade.getTypeInfo(baseExpression, context);
JetType type = typeInfo.getType();
if (type == null) {
return typeInfo;
@@ -642,7 +645,7 @@ public class BasicExpressionTypingVisitor extends ExpressionTypingVisitor {
JetExpression stubExpression = ExpressionTypingUtils.createFakeExpressionOfType(baseExpression.getProject(), context.trace, "$e", type);
resolveArrayAccessSetMethod((JetArrayAccessExpression) baseExpression,
stubExpression,
context.replaceExpectedType(NO_EXPECTED_TYPE).replaceBindingTrace(
context.replaceBindingTrace(
TemporaryBindingTrace.create(context.trace, "trace to resolve array access set method for unary expression", expression)),
context.trace);
}
@@ -685,7 +688,7 @@ public class BasicExpressionTypingVisitor extends ExpressionTypingVisitor {
else {
result = returnType;
}
return DataFlowUtils.checkType(result, expression, context, dataFlowInfo);
return DataFlowUtils.checkType(result, expression, contextWithExpectedType, dataFlowInfo);
}
private JetTypeInfo visitExclExclExpression(@NotNull JetUnaryExpression expression, @NotNull ExpressionTypingContext context) {
@@ -493,4 +493,9 @@ public class ExpressionTypingUtils {
return (operationType == JetTokens.IDENTIFIER || OperatorConventions.BINARY_OPERATION_NAMES.containsKey(operationType)
|| operationType == JetTokens.ELVIS);
}
public static boolean isUnaryExpressionDependentOnExpectedType(@NotNull JetUnaryExpression expression) {
IElementType operationType = expression.getOperationReference().getReferencedNameElementType();
return JetTokens.LABELS.contains(operationType) || operationType == JetTokens.EXCLEXCL;
}
}