public JsStatement VisitGotoStateStatement(JsGotoStateStatement statement, object data) { var result = new List <JsStatement>(); State targetState; if (statement.TargetState == null) { if (!_labelStates.TryGetValue(statement.TargetLabel, out targetState)) { throw new InvalidOperationException("The label " + statement.TargetLabel + " does not exist."); } } else { targetState = statement.TargetState.Value; } var remaining = statement.CurrentState.FinallyStack; JsStatement finallyExecutionStatement = null; for (int i = 0, n = remaining.Count() - targetState.FinallyStack.Count(); i < n; i++) { var current = remaining.Peek(); remaining = remaining.Pop(); var block = JsStatement.BlockMerged( JsExpression.Assign(JsExpression.Identifier(_stateVariableName), JsExpression.Number(remaining.IsEmpty ? -1 : remaining.Peek().Item1)), JsExpression.Invocation(JsExpression.Member(JsExpression.Identifier(current.Item2), "call"), JsExpression.This) ); if (finallyExecutionStatement == null) { finallyExecutionStatement = block; } else { finallyExecutionStatement = JsStatement.Try(finallyExecutionStatement, null, block); } } if (finallyExecutionStatement != null) { result.Add(finallyExecutionStatement); } result.Add(MakeSetNextStateStatement(targetState.StateValue)); result.Add(targetState.StateValue == -1 ? (JsStatement)JsStatement.Break(targetState.LoopLabelName) : JsStatement.Continue(targetState.LoopLabelName)); return(JsStatement.BlockMerged(result)); }
public void ContinueStatementIsCorrectlyOutput() { AssertCorrect(JsStatement.Continue(), "continue;\n"); AssertCorrect(JsStatement.Continue("someLabel"), "continue someLabel;\n"); }