From 474340a0031c9b3c8ce0d97c2cc36d5327c4e304 Mon Sep 17 00:00:00 2001 From: Andrew Kelley Date: Thu, 28 Jan 2016 11:03:44 -0700 Subject: parseh recognizes C enums --- src/ast_render.cpp | 35 +++++++++++++++++++++++++++-------- 1 file changed, 27 insertions(+), 8 deletions(-) (limited to 'src/ast_render.cpp') diff --git a/src/ast_render.cpp b/src/ast_render.cpp index 084191bdc8..a1043377c8 100644 --- a/src/ast_render.cpp +++ b/src/ast_render.cpp @@ -73,13 +73,20 @@ static const char *visib_mod_string(VisibMod mod) { } static const char *extern_string(bool is_extern) { - return is_extern ? "export " : ""; + return is_extern ? "extern " : ""; } static const char *const_or_var_string(bool is_const) { return is_const ? "const" : "var"; } +static const char *container_string(ContainerKind kind) { + switch (kind) { + case ContainerKindEnum: return "enum"; + case ContainerKindStruct: return "struct"; + } +} + static const char *node_type_str(NodeType node_type) { switch (node_type) { case NodeTypeRoot: @@ -486,6 +493,10 @@ static void print_indent(AstRender *ar) { } } +static bool is_node_void(AstNode *node) { + return node->type == NodeTypeSymbol && buf_eql_str(&node->data.symbol_expr.symbol, "void"); +} + static void render_node(AstRender *ar, AstNode *node) { assert(node->type == NodeTypeRoot || *node->parent_field == node); @@ -533,9 +544,7 @@ static void render_node(AstRender *ar, AstNode *node) { fprintf(ar->f, ")"); AstNode *return_type_node = node->data.fn_proto.return_type; - bool is_void = return_type_node->type != NodeTypeSymbol && - buf_eql_str(&return_type_node->data.symbol_expr.symbol, "void"); - if (!is_void) { + if (!is_node_void(return_type_node)) { fprintf(ar->f, " -> "); render_node(ar, return_type_node); } @@ -601,7 +610,13 @@ static void render_node(AstRender *ar, AstNode *node) { case NodeTypeSliceExpr: zig_panic("TODO"); case NodeTypeFieldAccessExpr: - zig_panic("TODO"); + { + AstNode *lhs = node->data.field_access_expr.struct_expr; + Buf *rhs = &node->data.field_access_expr.field_name; + render_node(ar, lhs); + fprintf(ar->f, ".%s", buf_ptr(rhs)); + break; + } case NodeTypeImport: zig_panic("TODO"); case NodeTypeCImport: @@ -640,15 +655,19 @@ static void render_node(AstRender *ar, AstNode *node) { { const char *struct_name = buf_ptr(&node->data.struct_decl.name); const char *pub_str = visib_mod_string(node->data.struct_decl.visib_mod); - fprintf(ar->f, "%sstruct %s {\n", pub_str, struct_name); + const char *container_str = container_string(node->data.struct_decl.kind); + fprintf(ar->f, "%s%s %s {\n", pub_str, container_str, struct_name); ar->indent += ar->indent_size; for (int field_i = 0; field_i < node->data.struct_decl.fields.length; field_i += 1) { AstNode *field_node = node->data.struct_decl.fields.at(field_i); assert(field_node->type == NodeTypeStructField); const char *field_name = buf_ptr(&field_node->data.struct_field.name); print_indent(ar); - fprintf(ar->f, "%s: ", field_name); - render_node(ar, field_node->data.struct_field.type); + fprintf(ar->f, "%s", field_name); + if (!is_node_void(field_node->data.struct_field.type)) { + fprintf(ar->f, ": "); + render_node(ar, field_node->data.struct_field.type); + } fprintf(ar->f, ",\n"); } -- cgit v1.2.3