From 491305ff34b7f9f708b73d6b9ded9b8ca9073dd4 Mon Sep 17 00:00:00 2001 From: Svetlana Isakova Date: Tue, 29 Oct 2013 16:06:43 +0400 Subject: [PATCH] todo test improved analysis of unary expressions added explicit 'isUnaryExpressionDependentOnExpectedType' check --- .../jet/lang/resolve/calls/CandidateResolver.java | 5 +++++ .../expressions/BasicExpressionTypingVisitor.java | 13 ++++++++----- .../types/expressions/ExpressionTypingUtils.java | 5 +++++ 3 files changed, 18 insertions(+), 5 deletions(-) diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/CandidateResolver.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/CandidateResolver.java index b21564ea3e8..b41c784b812 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/CandidateResolver.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/CandidateResolver.java @@ -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)); diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/types/expressions/BasicExpressionTypingVisitor.java b/compiler/frontend/src/org/jetbrains/jet/lang/types/expressions/BasicExpressionTypingVisitor.java index 39e7679de3d..fce534db341 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/types/expressions/BasicExpressionTypingVisitor.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/types/expressions/BasicExpressionTypingVisitor.java @@ -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) { diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/types/expressions/ExpressionTypingUtils.java b/compiler/frontend/src/org/jetbrains/jet/lang/types/expressions/ExpressionTypingUtils.java index 16ccee8380d..e89d8a34cfc 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/types/expressions/ExpressionTypingUtils.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/types/expressions/ExpressionTypingUtils.java @@ -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; + } }