diff options
| author | Andrew Kelley <superjoe30@gmail.com> | 2016-12-05 18:43:16 -0500 |
|---|---|---|
| committer | Andrew Kelley <superjoe30@gmail.com> | 2016-12-05 18:43:16 -0500 |
| commit | 24048b2af62f1b36678aa08a20d0754cb712e485 (patch) | |
| tree | 09519ba8509ba40a3c1d9c85eee7d35f181ca37b /src/ast_render.cpp | |
| parent | 0541532ed6cf5a32b57a4a3f74e6d3a1699223a7 (diff) | |
| download | zig-24048b2af62f1b36678aa08a20d0754cb712e485.tar.gz zig-24048b2af62f1b36678aa08a20d0754cb712e485.zip | |
IR: implement break and continue
Diffstat (limited to 'src/ast_render.cpp')
| -rw-r--r-- | src/ast_render.cpp | 65 |
1 files changed, 58 insertions, 7 deletions
diff --git a/src/ast_render.cpp b/src/ast_render.cpp index 236213bf91..9d3f6fc4e5 100644 --- a/src/ast_render.cpp +++ b/src/ast_render.cpp @@ -364,6 +364,7 @@ static void render_node_extra(AstRender *ar, AstNode *node, bool grouped) { case NodeTypeSwitchProng: case NodeTypeSwitchRange: case NodeTypeLabel: + case NodeTypeStructValueField: zig_unreachable(); case NodeTypeRoot: for (size_t i = 0; i < node->data.root.top_level_decls.length; i += 1) { @@ -602,9 +603,30 @@ static void render_node_extra(AstRender *ar, AstNode *node, bool grouped) { } case NodeTypeContainerInitExpr: render_node_ungrouped(ar, node->data.container_init_expr.type); - fprintf(ar->f, "{"); - assert(node->data.container_init_expr.entries.length == 0); + if (node->data.container_init_expr.kind == ContainerInitKindStruct) { + fprintf(ar->f, "{\n"); + ar->indent += ar->indent_size; + } else { + fprintf(ar->f, "{"); + } + for (size_t i = 0; i < node->data.container_init_expr.entries.length; i += 1) { + AstNode *entry = node->data.container_init_expr.entries.at(i); + if (entry->type == NodeTypeStructValueField) { + Buf *name = entry->data.struct_val_field.name; + AstNode *expr = entry->data.struct_val_field.expr; + fprintf(ar->f, ".%s = ", buf_ptr(name)); + render_node_grouped(ar, expr); + fprintf(ar->f, ",\n"); + } else { + if (i != 0) + fprintf(ar->f, ", "); + render_node_grouped(ar, entry); + } + } fprintf(ar->f, "}"); + if (node->data.container_init_expr.kind == ContainerInitKindStruct) { + ar->indent -= ar->indent_size; + } break; case NodeTypeArrayType: { @@ -788,7 +810,40 @@ static void render_node_extra(AstRender *ar, AstNode *node, bool grouped) { } case NodeTypeGoto: { - fprintf(ar->f, "goto %s", buf_ptr(node->data.goto_expr.name)); + const char *inline_str = node->data.goto_expr.is_inline ? "inline " : ""; + fprintf(ar->f, "%sgoto %s", inline_str, buf_ptr(node->data.goto_expr.name)); + break; + } + case NodeTypeForExpr: + { + const char *inline_str = node->data.for_expr.is_inline ? "inline " : ""; + fprintf(ar->f, "%sfor (", inline_str); + render_node_grouped(ar, node->data.for_expr.array_expr); + fprintf(ar->f, ") "); + if (node->data.for_expr.elem_node) { + fprintf(ar->f, "|"); + if (node->data.for_expr.elem_is_ptr) + fprintf(ar->f, "*"); + render_node_grouped(ar, node->data.for_expr.elem_node); + if (node->data.for_expr.index_node) { + fprintf(ar->f, ", "); + render_node_grouped(ar, node->data.for_expr.index_node); + } + fprintf(ar->f, "| "); + } + render_node_grouped(ar, node->data.for_expr.body); + break; + } + case NodeTypeBreak: + { + const char *inline_str = node->data.break_expr.is_inline ? "inline " : ""; + fprintf(ar->f, "%sbreak", inline_str); + break; + } + case NodeTypeContinue: + { + const char *inline_str = node->data.continue_expr.is_inline ? "inline " : ""; + fprintf(ar->f, "%scontinue", inline_str); break; } case NodeTypeFnDecl: @@ -797,12 +852,8 @@ static void render_node_extra(AstRender *ar, AstNode *node, bool grouped) { case NodeTypeUnwrapErrorExpr: case NodeTypeSliceExpr: case NodeTypeStructField: - case NodeTypeStructValueField: case NodeTypeUse: case NodeTypeZeroesLiteral: - case NodeTypeForExpr: - case NodeTypeBreak: - case NodeTypeContinue: zig_panic("TODO more ast rendering"); } } |
