refactoring: extracted 'recordCastOrError' method

This commit is contained in:
Svetlana Isakova
2013-12-09 17:20:40 +04:00
parent 4b89c22ba7
commit 90535283ba
2 changed files with 22 additions and 19 deletions
@@ -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()));
}
}
@@ -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;
}
}