From 90535283ba0f352811dbd51f52bce602ca1dde4e Mon Sep 17 00:00:00 2001 From: Svetlana Isakova Date: Mon, 9 Dec 2013 17:20:40 +0400 Subject: [PATCH] refactoring: extracted 'recordCastOrError' method --- .../calls/autocasts/AutoCastUtils.java | 32 ++++++++++++------- .../lang/types/expressions/DataFlowUtils.java | 9 ++---- 2 files changed, 22 insertions(+), 19 deletions(-) diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/autocasts/AutoCastUtils.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/autocasts/AutoCastUtils.java index 64e4e6d7269..876c11df923 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/autocasts/AutoCastUtils.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/autocasts/AutoCastUtils.java @@ -105,14 +105,8 @@ public class AutoCastUtils { AutoCastReceiver autoCastReceiver = (AutoCastReceiver) receiver; ReceiverValue original = autoCastReceiver.getOriginal(); if (original instanceof ExpressionReceiver) { - ExpressionReceiver expressionReceiver = (ExpressionReceiver) original; - if (autoCastReceiver.canCast()) { - trace.record(AUTOCAST, expressionReceiver.getExpression(), autoCastReceiver.getType()); - trace.record(EXPRESSION_TYPE, expressionReceiver.getExpression(), autoCastReceiver.getType()); - } - else { - trace.report(AUTOCAST_IMPOSSIBLE.on(expressionReceiver.getExpression(), autoCastReceiver.getType(), expressionReceiver.getExpression().getText())); - } + JetExpression expression = ((ExpressionReceiver) original).getExpression(); + recordCastOrError(expression, autoCastReceiver.getType(), trace, autoCastReceiver.canCast(), true); } else { assert autoCastReceiver.canCast() : "A non-expression receiver must always be autocastabe: " + original; @@ -129,12 +123,26 @@ public class AutoCastUtils { DataFlowValue dataFlowValue = DataFlowValueFactory.createDataFlowValue(receiver, trace.getBindingContext()); JetExpression expression = ((ExpressionReceiver) receiver).getExpression(); - if (dataFlowValue.isStableIdentifier()) { - trace.record(AUTOCAST, expression, notNullableType); - trace.record(EXPRESSION_TYPE, expression, notNullableType); + recordCastOrError(expression, notNullableType, trace, dataFlowValue.isStableIdentifier(), true); + } + + public static void recordCastOrError( + @NotNull JetExpression expression, + @NotNull JetType type, + @NotNull BindingTrace trace, + boolean canBeCasted, + boolean recordExpressionType + ) { + if (canBeCasted) { + trace.record(AUTOCAST, expression, type); + if (recordExpressionType) { + //TODO + //Why the expression type is rewritten for receivers and is not rewritten for arguments? Is it necessary? + trace.record(EXPRESSION_TYPE, expression, type); + } } else { - trace.report(AUTOCAST_IMPOSSIBLE.on(expression, notNullableType, expression.getText())); + trace.report(AUTOCAST_IMPOSSIBLE.on(expression, type, expression.getText())); } } diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/types/expressions/DataFlowUtils.java b/compiler/frontend/src/org/jetbrains/jet/lang/types/expressions/DataFlowUtils.java index e4170bb4e88..d02bcc0f6d6 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/types/expressions/DataFlowUtils.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/types/expressions/DataFlowUtils.java @@ -25,6 +25,7 @@ import org.jetbrains.jet.lang.evaluate.EvaluatePackage; import org.jetbrains.jet.lang.psi.*; import org.jetbrains.jet.lang.resolve.BindingContext; import org.jetbrains.jet.lang.resolve.BindingTrace; +import org.jetbrains.jet.lang.resolve.calls.autocasts.AutoCastUtils; import org.jetbrains.jet.lang.resolve.calls.autocasts.DataFlowInfo; import org.jetbrains.jet.lang.resolve.calls.autocasts.DataFlowValue; import org.jetbrains.jet.lang.resolve.calls.autocasts.DataFlowValueFactory; @@ -40,7 +41,6 @@ import org.jetbrains.jet.lang.types.lang.KotlinBuiltIns; import org.jetbrains.jet.lexer.JetTokens; import static org.jetbrains.jet.lang.diagnostics.Errors.*; -import static org.jetbrains.jet.lang.resolve.BindingContext.AUTOCAST; import static org.jetbrains.jet.lang.resolve.calls.context.ContextDependency.INDEPENDENT; import static org.jetbrains.jet.lang.types.TypeUtils.*; @@ -180,12 +180,7 @@ public class DataFlowUtils { DataFlowValue dataFlowValue = DataFlowValueFactory.createDataFlowValue(expression, expressionType, trace.getBindingContext()); for (JetType possibleType : dataFlowInfo.getPossibleTypes(dataFlowValue)) { if (JetTypeChecker.INSTANCE.isSubtypeOf(possibleType, expectedType)) { - if (dataFlowValue.isStableIdentifier()) { - trace.record(AUTOCAST, expression, possibleType); - } - else { - trace.report(AUTOCAST_IMPOSSIBLE.on(expression, possibleType, expression.getText())); - } + AutoCastUtils.recordCastOrError(expression, possibleType, trace, dataFlowValue.isStableIdentifier(), false); return possibleType; } }