コード例 #1
0
        public void ShouldUnindentGotoTargetLabels()
        {
            var labelTargetOne = Expression.Label(typeof(void), "One");
            var labelOne       = Expression.Label(labelTargetOne);
            var gotoOne        = Expression.Goto(labelTargetOne);

            var labelTargetTwo = Expression.Label(typeof(void), "Two");
            var labelTwo       = Expression.Label(labelTargetTwo);
            var gotoTwo        = Expression.Goto(labelTargetTwo);

            var gotoBlock = Expression.Block(labelOne, gotoTwo, labelTwo, gotoOne);

            var ifTrueGoto = Expression.IfThen(Expression.Constant(true), gotoBlock);

            var translated = ToReadableString(ifTrueGoto);

            const string EXPECTED = @"
if (true)
{
One:
    goto Two;

Two:
    goto One;
}";

            translated.ShouldBe(EXPECTED.TrimStart());
        }
コード例 #2
0
        public void ShouldTranslateAGotoReturnStatement()
        {
            var returnTarget = Expression.Label(typeof(int), "Return");

            var numberParameter = Expression.Parameter(typeof(string), "i");
            var numberEqualsOne = Expression.Equal(numberParameter, Expression.Constant("One"));
            var returnOne       = Expression.Goto(returnTarget, Expression.Constant(1));
            var ifOneReturnOne  = Expression.IfThen(numberEqualsOne, returnOne);

            var returnLabel = Expression.Label(returnTarget, Expression.Constant(0));
            var gotoBlock   = Expression.Block(ifOneReturnOne, returnLabel);

            var gotoLambda = Expression.Lambda <Func <string, int> >(gotoBlock, numberParameter);

            gotoLambda.Compile();

            var translated = ToReadableString(gotoLambda);

            const string EXPECTED = @"
i =>
{
    if (i == ""One"")
    {
        return 1;
    }

    return 0;
}";

            translated.ShouldBe(EXPECTED.TrimStart());
        }
コード例 #3
0
        public void ShouldTranslateGotoStatements()
        {
            var labelTargetOne = Expression.Label(typeof(void), "One");
            var labelOne       = Expression.Label(labelTargetOne);
            var writeOne       = CreateLambda(() => Console.Write("One"));
            var gotoOne        = Expression.Goto(labelTargetOne);

            var labelTargetTwo = Expression.Label(typeof(void), "Two");
            var labelTwo       = Expression.Label(labelTargetTwo);
            var writeTwo       = CreateLambda(() => Console.Write("Two"));
            var gotoTwo        = Expression.Goto(labelTargetTwo);

            var intVariable  = Expression.Variable(typeof(int), "i");
            var intEqualsOne = Expression.Equal(intVariable, Expression.Constant(1));
            var intEqualsTwo = Expression.Equal(intVariable, Expression.Constant(2));

            var ifTwoGotoTwo = Expression.IfThen(intEqualsTwo, gotoTwo);
            var gotoOneOrTwo = Expression.IfThenElse(intEqualsOne, gotoOne, ifTwoGotoTwo);

            var writeNeither    = CreateLambda(() => Console.Write("Neither"));
            var returnFromBlock = Expression.Return(Expression.Label());

            var block = Expression.Block(
                gotoOneOrTwo,
                writeNeither.Body,
                returnFromBlock,
                labelOne,
                writeOne.Body,
                labelTwo,
                writeTwo.Body);

            var translated = ToReadableString(block);

            const string EXPECTED = @"
if (i == 1)
{
    goto One;
}
else if (i == 2)
{
    goto Two;
}

Console.Write(""Neither"");
return;

One:
Console.Write(""One"");

Two:
Console.Write(""Two"");
";

            translated.ShouldBe(EXPECTED.Trim());
        }