public void VisitLeave(EachBlock astNode) { state.SetCursor(astNode); if (astNode.Type == EachBlock.LoopType.RunTime) { if (astNode.Flags.HasFlag(EachBlock.ForLoopFlags.Index) || astNode.Flags.HasFlag(EachBlock.ForLoopFlags.Last)) { state.IncrementIndexVariable(); } if (astNode.Flags.HasFlag(EachBlock.ForLoopFlags.First)) { state.SetFirstVariable(); } //Leave loop context state.ContextStack.Pop(); state.LoopLevel--; var prepareLoopStatements = SyntaxHelper.PrepareForLoop(astNode.Flags, state.LoopLevel + 1); Context context; if (astNode.Member.TryEvaluate(state, out context)) { prepareLoopStatements.Add(SyntaxHelper.ForLoop(astNode.Member.EvaluateLoop(state).FullPath, context.FullPath, state.PopBlock())); } state.DoTruthyCheck( prepareLoopStatements ); } else if (astNode.Type == EachBlock.LoopType.CompileTime) { //Check if loop is completed var ctLoopContext = state.ContextStack.Peek() as CompileTimeLoopContext; if (ctLoopContext.MoveNext()) {//Next Iteration astNode.Accept(this); } else {//Pop ctLoopContext state.ContextStack.Pop(); state.DoTruthyCheck(state.PopBlock()); } } }
public void VisitLeave(EachBlock astNode) { state.SetCursor(astNode); if (astNode.Type==EachBlock.LoopType.RunTime) { if (astNode.Flags.HasFlag(EachBlock.ForLoopFlags.Index) || astNode.Flags.HasFlag(EachBlock.ForLoopFlags.Last)) state.IncrementIndexVariable(); if (astNode.Flags.HasFlag(EachBlock.ForLoopFlags.First)) state.SetFirstVariable(); //Leave loop context state.ContextStack.Pop(); state.LoopLevel--; var prepareLoopStatements = SyntaxHelper.PrepareForLoop(astNode.Flags, state.LoopLevel + 1); Context context; if (astNode.Member.TryEvaluate(state, out context)) { prepareLoopStatements.Add(SyntaxHelper.ForLoop(astNode.Member.EvaluateLoop(state).FullPath, context.FullPath, state.PopBlock())); } state.DoTruthyCheck( prepareLoopStatements ); } else if (astNode.Type==EachBlock.LoopType.CompileTime) { //Check if loop is completed var ctLoopContext = state.ContextStack.Peek() as CompileTimeLoopContext; if (ctLoopContext.MoveNext()) {//Next Iteration astNode.Accept(this); } else {//Pop ctLoopContext state.ContextStack.Pop(); state.DoTruthyCheck(state.PopBlock()); } } }