parseh recognizes C enums

This commit is contained in:
Andrew Kelley
2016-01-28 11:03:44 -07:00
parent 137bb51e20
commit 474340a003
5 changed files with 218 additions and 63 deletions

View File

@@ -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");
}