Beispiel #1
0
 public override void VisitIfExpression(BoundIfExpression node)
 {
     _writer.WriteKeyword("if ");
     _writer.WritePunctuation("(");
     node.Condition.Accept(this);
     _writer.WritePunctuation(") ");
     _writer.WriteLine();
     WriteNestedExpression(node.Then);
     _writer.WriteKeyword(" else ");
     _writer.WriteLine();
     WriteNestedExpression(node.Else);
 }
Beispiel #2
0
    protected override BoundExpression RewriteIfExpression(BoundIfExpression node)
    {
        /*
         * if (<condition>)
         *     <thenBody>
         * else
         *     <elseBody>
         *
         *
         * to
         *
         * gotoIfFalse <condition> <elseLabel>
         *    <thenBody>
         *    goto <endLabel>
         * <elseLabel>
         *     <elseBody>
         * <endLabel>
         *
         */

        var token     = GenerateLabelToken();
        var elseLabel = GenerateLabel("IfElse", token);
        var endLabel  = GenerateLabel("IfEnd", token);
        var variable  = GenerateVariable(node.Type);

        var condition = RewriteExpression(node.Condition);

        if (condition is BoundLiteralExpression literal)
        {
            return(RewriteExpression((bool)literal.Value ? node.Then : node.Else));
        }

        var then  = RewriteExpression(node.Then);
        var @else = RewriteExpression(node.Else);
        var variableExpression = new BoundVariableExpression(node.Syntax, variable);
        var block = new BoundBlockExpression(
            node.Syntax,
            ImmutableArray.Create <BoundStatement>(
                new BoundVariableDeclarationStatement(node.Syntax, variable, null),
                new BoundConditionalGotoStatement(node.Syntax, elseLabel, condition),
                new BoundAssignmentStatement(node.Syntax, variableExpression, then),
                new BoundGotoStatement(node.Syntax, endLabel),
                new BoundLabelStatement(node.Syntax, elseLabel),
                new BoundAssignmentStatement(node.Syntax, variableExpression, @else),
                new BoundLabelStatement(node.Syntax, endLabel)
                ),
            variableExpression
            );

        return(RewriteExpression(block));
    }
Beispiel #3
0
 public virtual void VisitIfExpression(BoundIfExpression node) =>
 this.DefaultVisit(node);