private Expression EncodeInlineWhile(BlockNode conditionBlock, BlockNode valueBlock, bool whileFalse) { NameBinding nilBinding = this.Context.GetBinding(SemanticConstants.Nil); Expression conditionExpression = Expression.Convert(conditionBlock.Accept(new InlineBlockVisitor(this)), typeof(bool)); // No, it's not an error ... if the <conditionExpression> evaluates to true, we terminate if (whileFalse) { conditionExpression = Expression.IsTrue(conditionExpression); } else { conditionExpression = Expression.IsFalse(conditionExpression); } LabelTarget exitLabel = Expression.Label(typeof(object)); GotoExpression exitLoop = Expression.Break(exitLabel, nilBinding.GenerateReadExpression(this)); Expression loop; if (valueBlock == null) { loop = Expression.IfThen(conditionExpression, exitLoop); } else { loop = Expression.IfThenElse(conditionExpression, exitLoop, valueBlock.Accept(new InlineBlockVisitor(this))); } return(Expression.Loop(loop, exitLabel)); }
public void BlockNodesCanBeVisited() { object got = null; var testVisitor = new TestASTVisitor(); testVisitor.VisitBlockHandler = node => got = node; subject.Accept(testVisitor); Assert.AreEqual(got, subject); }
public override Expression VisitBlock(BlockNode node) { return(node.Accept(new BlockVisitor(this))); }