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); }
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)); }
public virtual void VisitIfExpression(BoundIfExpression node) => this.DefaultVisit(node);