示例#1
0
        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));
        }
示例#2
0
        public void BlockNodesCanBeVisited()
        {
            object got         = null;
            var    testVisitor = new TestASTVisitor();

            testVisitor.VisitBlockHandler = node => got = node;

            subject.Accept(testVisitor);

            Assert.AreEqual(got, subject);
        }
示例#3
0
 public override Expression VisitBlock(BlockNode node)
 {
     return(node.Accept(new BlockVisitor(this)));
 }