diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/types/expressions/ExpressionTypingVisitorForStatements.java b/compiler/frontend/src/org/jetbrains/jet/lang/types/expressions/ExpressionTypingVisitorForStatements.java index 451a33414b8..8863af6785e 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/types/expressions/ExpressionTypingVisitorForStatements.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/types/expressions/ExpressionTypingVisitorForStatements.java @@ -169,6 +169,9 @@ public class ExpressionTypingVisitorForStatements extends ExpressionTypingVisito } protected JetType visitAssignmentOperation(JetBinaryExpression expression, ExpressionTypingContext contextWithExpectedType) { + JetExpression right = expression.getRight(); + if (right == null) return null; + //There is a temporary binding trace for an opportunity to resolve set method for array if needed (the initial trace should be used there) TemporaryBindingTrace temporaryBindingTrace = TemporaryBindingTrace.create(contextWithExpectedType.trace); ExpressionTypingContext context = contextWithExpectedType.replaceExpectedType(TypeUtils.NO_EXPECTED_TYPE).replaceExpectedReturnType(TypeUtils.NO_EXPECTED_TYPE).replaceBindingTrace(temporaryBindingTrace); @@ -180,7 +183,7 @@ public class ExpressionTypingVisitorForStatements extends ExpressionTypingVisito JetType leftType = facade.getType(left, context); if (leftType == null) { - facade.getType(expression.getRight(), context); + facade.getType(right, context); context.trace.report(UNRESOLVED_REFERENCE.on(operationSign)); temporaryBindingTrace.commit(); return null; @@ -208,7 +211,7 @@ public class ExpressionTypingVisitorForStatements extends ExpressionTypingVisito for (ResolvedCall call : ambiguityResolutionResults.getResultingCalls()) { descriptors.add(call.getResultingDescriptor()); } - facade.getType(expression.getRight(), context); + facade.getType(right, context); context.trace.record(AMBIGUOUS_REFERENCE_TARGET, operationSign, descriptors); } else if (assignmentOperationType != null) { @@ -222,7 +225,7 @@ public class ExpressionTypingVisitorForStatements extends ExpressionTypingVisito context.trace.record(VARIABLE_REASSIGNMENT, expression); if (left instanceof JetArrayAccessExpression) { ExpressionTypingContext contextForResolve = context.replaceScope(scope).replaceBindingTrace(TemporaryBindingTrace.create(contextWithExpectedType.trace)); - basic.resolveArrayAccessSetMethod((JetArrayAccessExpression) left, expression.getRight(), contextForResolve, context.trace); + basic.resolveArrayAccessSetMethod((JetArrayAccessExpression) left, right, contextForResolve, context.trace); } } basic.checkLValue(context.trace, expression.getLeft()); diff --git a/compiler/testData/diagnostics/tests/incompleteCode/incompleteAssignment.jet b/compiler/testData/diagnostics/tests/incompleteCode/incompleteAssignment.jet new file mode 100644 index 00000000000..df22e37e58c --- /dev/null +++ b/compiler/testData/diagnostics/tests/incompleteCode/incompleteAssignment.jet @@ -0,0 +1,30 @@ +package sum + +import java.util.* +fun sum(a : IntArray) : Int { + // Write your solution here + res = 0 + for (e in a) + res += +} +fun main(args : Array) { + test(0) + test(1, 1) + test(-1, -1, 0) + test(6, 1, 2, 3) + test(6, 1, 1, 1, 1, 1, 1) +} +// HELPER FUNCTIONS +fun test(expectedSum : Int, vararg data : Int) { + val actualSum = sum(data) + assertEquals(actualSum, expectedSum, "\ndata = ${Arrays.toString(data)}\n" + + "sum(data) = ${actualSum}, but must be $expectedSum ") +} +fun assertEquals(actual : T?, expected : T?, message : Any? = null) { + if (actual != expected) { + if (message == null) + throw AssertionError() + else + throw AssertionError(message) + } +}