From d597d29f2a29a42a165c9b394e16d704263aa28d Mon Sep 17 00:00:00 2001 From: svtk Date: Tue, 23 Aug 2011 13:08:11 +0400 Subject: [PATCH] addition to bug with automatically casting mutable variables fix --- .../jetbrains/jet/lang/types/JetTypeInferrer.java | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/idea/src/org/jetbrains/jet/lang/types/JetTypeInferrer.java b/idea/src/org/jetbrains/jet/lang/types/JetTypeInferrer.java index a03f9500ca3..7a040d42388 100644 --- a/idea/src/org/jetbrains/jet/lang/types/JetTypeInferrer.java +++ b/idea/src/org/jetbrains/jet/lang/types/JetTypeInferrer.java @@ -853,10 +853,18 @@ public class JetTypeInferrer { if (!semanticServices.getTypeChecker().isSubtypeOf(enrichedType, context.expectedType)) { context.trace.getErrorHandler().typeMismatch(expression, context.expectedType, expressionType); } else { - context.trace.record(BindingContext.AUTOCAST, expression, context.expectedType); + checkAutoCast(expression, context.expectedType, variableDescriptor, context.trace); } return enrichedType; } + + private void checkAutoCast(JetExpression expression, JetType type, VariableDescriptor variableDescriptor, BindingTrace trace) { + if (variableDescriptor.isVar()) { + trace.getErrorHandler().genericError(expression.getNode(), "Automatic cast to " + type + " is impossible, because variable " + variableDescriptor.getName() + " is mutable"); + } else { + trace.record(BindingContext.AUTOCAST, expression, type); + } + } @NotNull private List checkArgumentTypes(@NotNull List argumentTypes, @NotNull List arguments, @NotNull List expectedArgumentTypes, @NotNull TypeInferenceContext context) { @@ -2202,7 +2210,7 @@ public class JetTypeInferrer { for (JetType possibleType : possibleTypes) { selectorReturnType = getSelectorReturnType(possibleType, selectorExpression, autocastResolutionContext); if (selectorReturnType != null) { - autocastResolutionTrace.record(BindingContext.AUTOCAST, receiverExpression, possibleType); + context.services.checkAutoCast(receiverExpression, possibleType, variableDescriptor, autocastResolutionTrace); autocastResolutionTrace.addAllMyDataTo(context.trace); somethingFound = true; break;