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();
        }
Exemple #3
0
        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()));
        }