public List <BasicBlock> Build(BoundBlockStatement block) { foreach (var statement in block.Statements) { switch (statement.Kind) { case BoundNodeKind.LabelStatement: this.StartBlock(); this.Statements.Add(statement); break; case BoundNodeKind.GotoStatement: case BoundNodeKind.ConditionalGotoStatement: case BoundNodeKind.ReturnStatement: this.Statements.Add(statement); this.StartBlock(); break; case BoundNodeKind.DeferStatement: case BoundNodeKind.ExpressionStatement: case BoundNodeKind.SequencePointStatement: case BoundNodeKind.VariableDeclaration: this.Statements.Add(statement); break; default: throw new Exception($"Unexpected statement: {statement.Kind}"); } } this.EndBlock(); return(this.Blocks.ToList()); }
private static void WriteBlockStatement(BoundBlockStatement node, IndentedTextWriter writer) { writer.WritePunctuation(SyntaxKind.OpenBraceToken); writer.WriteLine(); writer.Indent++; foreach (var s in node.Statements) { s.WriteTo(writer); } writer.Indent--; writer.WritePunctuation(SyntaxKind.CloseBraceToken); writer.WriteLine(); }
protected virtual BoundStatement RewriteBlockStatement(BoundBlockStatement node) { var builder = ImmutableArray.CreateBuilder <BoundStatement>(node.Statements.Length); var deferStmts = new List <BoundDeferStatement>(); foreach (var stmt in node.Statements) { var statement = this.RewriteStatement(stmt); if (statement.Kind == BoundNodeKind.DeferStatement) { deferStmts.Add((BoundDeferStatement)statement); } else { builder.Add(statement); } } builder.AddRange(deferStmts.AsEnumerable().Reverse()); return(new BoundBlockStatement(node.Syntax, builder.MoveToImmutable())); }