aboutsummaryrefslogtreecommitdiff
path: root/src/ast_render.cpp
diff options
context:
space:
mode:
authorAndrew Kelley <superjoe30@gmail.com>2016-02-01 02:00:25 -0700
committerAndrew Kelley <superjoe30@gmail.com>2016-02-01 02:00:25 -0700
commitb3459f64e795118c4c12890ed0fec75638b74a2c (patch)
treed5730790d1b61f71a606e30023d68cc36071cce4 /src/ast_render.cpp
parent6b2e29c6ac58d5f4370828bfa0f54b83d1931a97 (diff)
downloadzig-b3459f64e795118c4c12890ed0fec75638b74a2c.tar.gz
zig-b3459f64e795118c4c12890ed0fec75638b74a2c.zip
parseh understands macros which alias global fn ptr vars
Diffstat (limited to 'src/ast_render.cpp')
-rw-r--r--src/ast_render.cpp60
1 files changed, 53 insertions, 7 deletions
diff --git a/src/ast_render.cpp b/src/ast_render.cpp
index cebacaa0f7..a09b4c52be 100644
--- a/src/ast_render.cpp
+++ b/src/ast_render.cpp
@@ -582,15 +582,34 @@ static void render_node(AstRender *ar, AstNode *node) {
break;
}
case NodeTypeFnDef:
- zig_panic("TODO");
+ for (int i = 0; i < node->data.fn_def.fn_proto->data.fn_proto.directives->length; i += 1) {
+ render_node(ar, node->data.fn_def.fn_proto->data.fn_proto.directives->at(i));
+ }
+ render_node(ar, node->data.fn_def.fn_proto);
+ fprintf(ar->f, " ");
+ render_node(ar, node->data.fn_def.body);
+ break;
case NodeTypeFnDecl:
zig_panic("TODO");
case NodeTypeParamDecl:
zig_panic("TODO");
case NodeTypeBlock:
- zig_panic("TODO");
+ fprintf(ar->f, "{\n");
+ ar->indent += ar->indent_size;
+ for (int i = 0; i < node->data.block.statements.length; i += 1) {
+ AstNode *statement = node->data.block.statements.at(i);
+ print_indent(ar);
+ render_node(ar, statement);
+ }
+ ar->indent -= ar->indent_size;
+ fprintf(ar->f, "\n");
+ print_indent(ar);
+ fprintf(ar->f, "}");
+ break;
case NodeTypeDirective:
- zig_panic("TODO");
+ fprintf(ar->f, "#%s(\"%s\")\n", buf_ptr(&node->data.directive.name),
+ buf_ptr(&node->data.directive.param));
+ break;
case NodeTypeReturnExpr:
zig_panic("TODO");
case NodeTypeVariableDeclaration:
@@ -621,7 +640,12 @@ static void render_node(AstRender *ar, AstNode *node) {
case NodeTypeErrorValueDecl:
zig_panic("TODO");
case NodeTypeBinOpExpr:
- zig_panic("TODO");
+ fprintf(ar->f, "(");
+ render_node(ar, node->data.bin_op_expr.op1);
+ fprintf(ar->f, " %s ", bin_op_str(node->data.bin_op_expr.bin_op));
+ render_node(ar, node->data.bin_op_expr.op2);
+ fprintf(ar->f, ")");
+ break;
case NodeTypeUnwrapErrorExpr:
zig_panic("TODO");
case NodeTypeNumberLiteral:
@@ -635,7 +659,11 @@ static void render_node(AstRender *ar, AstNode *node) {
}
break;
case NodeTypeStringLiteral:
- zig_panic("TODO");
+ if (node->data.string_literal.c) {
+ fprintf(ar->f, "c");
+ }
+ fprintf(ar->f, "\"%s\"", buf_ptr(&node->data.string_literal.buf));
+ break;
case NodeTypeCharLiteral:
{
uint8_t c = node->data.char_literal.value;
@@ -665,7 +693,20 @@ static void render_node(AstRender *ar, AstNode *node) {
break;
}
case NodeTypeFnCallExpr:
- zig_panic("TODO");
+ if (node->data.fn_call_expr.is_builtin) {
+ fprintf(ar->f, "@");
+ }
+ render_node(ar, node->data.fn_call_expr.fn_ref_expr);
+ fprintf(ar->f, "(");
+ for (int i = 0; i < node->data.fn_call_expr.params.length; i += 1) {
+ AstNode *param = node->data.fn_call_expr.params.at(i);
+ if (i != 0) {
+ fprintf(ar->f, ", ");
+ }
+ render_node(ar, param);
+ }
+ fprintf(ar->f, ")");
+ break;
case NodeTypeArrayAccessExpr:
zig_panic("TODO");
case NodeTypeSliceExpr:
@@ -739,7 +780,12 @@ static void render_node(AstRender *ar, AstNode *node) {
case NodeTypeStructField:
zig_panic("TODO");
case NodeTypeContainerInitExpr:
- zig_panic("TODO");
+ fprintf(ar->f, "(");
+ render_node(ar, node->data.container_init_expr.type);
+ fprintf(ar->f, "){");
+ assert(node->data.container_init_expr.entries.length == 0);
+ fprintf(ar->f, "}");
+ break;
case NodeTypeStructValueField:
zig_panic("TODO");
case NodeTypeArrayType: