diff --git a/idea/src/org/jetbrains/jet/lang/resolve/BindingContext.java b/idea/src/org/jetbrains/jet/lang/resolve/BindingContext.java index 0a77c8d3ecd..422766542db 100644 --- a/idea/src/org/jetbrains/jet/lang/resolve/BindingContext.java +++ b/idea/src/org/jetbrains/jet/lang/resolve/BindingContext.java @@ -41,6 +41,8 @@ public interface BindingContext { boolean isStatement(JetExpression expression); boolean hasBackingField(PropertyDescriptor propertyDescriptor); + boolean isVariableReassignment(JetBinaryExpression expression); + ConstructorDescriptor resolveSuperConstructor(JetDelegatorToSuperCall superCall); @Nullable diff --git a/idea/src/org/jetbrains/jet/lang/resolve/BindingTrace.java b/idea/src/org/jetbrains/jet/lang/resolve/BindingTrace.java index 13daaf37c58..b88c66bfdf5 100644 --- a/idea/src/org/jetbrains/jet/lang/resolve/BindingTrace.java +++ b/idea/src/org/jetbrains/jet/lang/resolve/BindingTrace.java @@ -29,6 +29,8 @@ public interface BindingTrace { void recordStatement(@NotNull JetElement statement); + void recordVariableReassignment(@NotNull JetBinaryExpression expression); + void recordResolutionScope(@NotNull JetExpression expression, @NotNull JetScope scope); void removeStatementRecord(@NotNull JetElement statement); diff --git a/idea/src/org/jetbrains/jet/lang/resolve/BindingTraceAdapter.java b/idea/src/org/jetbrains/jet/lang/resolve/BindingTraceAdapter.java index 57357d72412..a57438f4775 100644 --- a/idea/src/org/jetbrains/jet/lang/resolve/BindingTraceAdapter.java +++ b/idea/src/org/jetbrains/jet/lang/resolve/BindingTraceAdapter.java @@ -57,6 +57,11 @@ public class BindingTraceAdapter implements BindingTrace { originalTrace.recordStatement(statement); } + @Override + public void recordVariableReassignment(@NotNull JetBinaryExpression expression) { + originalTrace.recordVariableReassignment(expression); + } + @Override public void requireBackingField(@NotNull PropertyDescriptor propertyDescriptor) { originalTrace.requireBackingField(propertyDescriptor); diff --git a/idea/src/org/jetbrains/jet/lang/resolve/BindingTraceContext.java b/idea/src/org/jetbrains/jet/lang/resolve/BindingTraceContext.java index 51da91851ee..4534a9faf2a 100644 --- a/idea/src/org/jetbrains/jet/lang/resolve/BindingTraceContext.java +++ b/idea/src/org/jetbrains/jet/lang/resolve/BindingTraceContext.java @@ -31,6 +31,8 @@ public class BindingTraceContext implements BindingContext, BindingTrace { private final Map autoCasts = Maps.newHashMap(); private final Map resolutionScopes = Maps.newHashMap(); + private final Set variableReassignments = Sets.newHashSet(); + private final Set blocks = new HashSet(); private final Set statements = new HashSet(); private final Set backingFieldRequired = new HashSet(); @@ -61,6 +63,8 @@ public class BindingTraceContext implements BindingContext, BindingTrace { backingFieldRequired.addAll(other.backingFieldRequired); processed.addAll(other.processed); + variableReassignments.addAll(other.variableReassignments); + diagnostics.addAll(other.diagnostics); } @@ -158,6 +162,11 @@ public class BindingTraceContext implements BindingContext, BindingTrace { statements.add(statement); } + @Override + public void recordVariableReassignment(@NotNull JetBinaryExpression expression) { + variableReassignments.add(expression); + } + @Override public void recordResolutionScope(@NotNull JetExpression expression, @NotNull JetScope scope) { safePut(resolutionScopes, expression, scope); @@ -298,6 +307,11 @@ public class BindingTraceContext implements BindingContext, BindingTrace { return backingFieldRequired.contains(propertyDescriptor); } + @Override + public boolean isVariableReassignment(JetBinaryExpression expression) { + return variableReassignments.contains(expression); + } + public ConstructorDescriptor resolveSuperConstructor(JetDelegatorToSuperCall superCall) { JetTypeReference typeReference = superCall.getTypeReference(); if (typeReference == null) return null; diff --git a/idea/src/org/jetbrains/jet/lang/types/JetTypeInferrer.java b/idea/src/org/jetbrains/jet/lang/types/JetTypeInferrer.java index afe32649cc5..ceca8318ead 100644 --- a/idea/src/org/jetbrains/jet/lang/types/JetTypeInferrer.java +++ b/idea/src/org/jetbrains/jet/lang/types/JetTypeInferrer.java @@ -2587,7 +2587,10 @@ public class JetTypeInferrer { if (assignmentOperationType == null) { String counterpartName = binaryOperationNames.get(assignmentOperationCounterparts.get(operationType)); - getTypeForBinaryCall(expression, counterpartName, scope, true); + JetType typeForBinaryCall = getTypeForBinaryCall(expression, counterpartName, scope, true); + if (typeForBinaryCall != null) { + context.trace.recordVariableReassignment(expression); + } } result = null; // not an expression } diff --git a/idea/tests/org/jetbrains/jet/JetTestUtils.java b/idea/tests/org/jetbrains/jet/JetTestUtils.java index d5285d1f87a..b6270e3bc80 100644 --- a/idea/tests/org/jetbrains/jet/JetTestUtils.java +++ b/idea/tests/org/jetbrains/jet/JetTestUtils.java @@ -53,6 +53,11 @@ public class JetTestUtils { public void recordStatement(@NotNull JetElement statement) { } + @Override + public void recordVariableReassignment(@NotNull JetBinaryExpression expression) { + + } + @Override public void recordResolutionScope(@NotNull JetExpression expression, @NotNull JetScope scope) { } @@ -185,6 +190,11 @@ public class JetTestUtils { throw new UnsupportedOperationException(); // TODO } + @Override + public boolean isVariableReassignment(JetBinaryExpression expression) { + throw new UnsupportedOperationException(); // TODO + } + @Override public ConstructorDescriptor resolveSuperConstructor(JetDelegatorToSuperCall superCall) { throw new UnsupportedOperationException(); // TODO