| ... | ... | @@ -170,12 +170,12 @@ static void print_indent(ParseHPrint *p) { |
| 170 | 170 | } |
| 171 | 171 | } |
| 172 | 172 | |
| 173 | | static Buf *type_node_to_name(AstNode *type_node) { |
| 174 | | if (type_node->type == NodeTypeSymbol) { |
| 175 | | return &type_node->data.symbol_expr.symbol; |
| 176 | | } else if (type_node->type == NodeTypePrefixOpExpr) { |
| 177 | | PrefixOp op = type_node->data.prefix_op_expr.prefix_op; |
| 178 | | const char *child_type_str = buf_ptr(type_node_to_name(type_node->data.prefix_op_expr.primary_expr)); |
| 173 | static Buf *node_to_buf(AstNode *node) { |
| 174 | if (node->type == NodeTypeSymbol) { |
| 175 | return &node->data.symbol_expr.symbol; |
| 176 | } else if (node->type == NodeTypePrefixOpExpr) { |
| 177 | PrefixOp op = node->data.prefix_op_expr.prefix_op; |
| 178 | const char *child_type_str = buf_ptr(node_to_buf(node->data.prefix_op_expr.primary_expr)); |
| 179 | 179 | if (op == PrefixOpAddressOf) { |
| 180 | 180 | return buf_sprintf("&%s", child_type_str); |
| 181 | 181 | } else if (op == PrefixOpConstAddressOf) { |
| ... | ... | @@ -242,6 +242,24 @@ static int parseh(const char *arg0, int argc, char **argv) { |
| 242 | 242 | return EXIT_FAILURE; |
| 243 | 243 | } |
| 244 | 244 | |
| 245 | for (int var_i = 0; var_i < p->parse_h.var_list.length; var_i += 1) { |
| 246 | AstNode *var_decl = p->parse_h.var_list.at(var_i); |
| 247 | assert(var_decl->type == NodeTypeVariableDeclaration); |
| 248 | const char *pub_str = (var_decl->data.variable_declaration.visib_mod == VisibModPub) ? "pub " : ""; |
| 249 | const char *extern_str = var_decl->data.variable_declaration.is_extern ? "extern " : ""; |
| 250 | const char *var_name = buf_ptr(&var_decl->data.variable_declaration.symbol); |
| 251 | const char *const_or_var = var_decl->data.variable_declaration.is_const ? "const" : "var"; |
| 252 | print_indent(p); |
| 253 | fprintf(p->f, "%s%s%s %s", pub_str, extern_str, const_or_var, var_name); |
| 254 | if (var_decl->data.variable_declaration.type) { |
| 255 | fprintf(p->f, ": %s", buf_ptr(node_to_buf(var_decl->data.variable_declaration.type))); |
| 256 | } |
| 257 | if (var_decl->data.variable_declaration.expr) { |
| 258 | fprintf(p->f, " = %s", buf_ptr(node_to_buf(var_decl->data.variable_declaration.expr))); |
| 259 | } |
| 260 | fprintf(p->f, ";\n"); |
| 261 | } |
| 262 | |
| 245 | 263 | for (int struct_i = 0; struct_i < p->parse_h.struct_list.length; struct_i += 1) { |
| 246 | 264 | AstNode *struct_decl = p->parse_h.struct_list.at(struct_i); |
| 247 | 265 | assert(struct_decl->type == NodeTypeStructDecl); |
| ... | ... | @@ -253,7 +271,7 @@ static int parseh(const char *arg0, int argc, char **argv) { |
| 253 | 271 | AstNode *field_node = struct_decl->data.struct_decl.fields.at(field_i); |
| 254 | 272 | assert(field_node->type == NodeTypeStructField); |
| 255 | 273 | const char *field_name = buf_ptr(&field_node->data.struct_field.name); |
| 256 | | Buf *type_name = type_node_to_name(field_node->data.struct_field.type); |
| 274 | Buf *type_name = node_to_buf(field_node->data.struct_field.type); |
| 257 | 275 | print_indent(p); |
| 258 | 276 | fprintf(p->f, "%s: %s,\n", field_name, buf_ptr(type_name)); |
| 259 | 277 | } |
| ... | ... | @@ -268,14 +286,15 @@ static int parseh(const char *arg0, int argc, char **argv) { |
| 268 | 286 | print_indent(p); |
| 269 | 287 | const char *fn_name = buf_ptr(&fn_proto->data.fn_proto.name); |
| 270 | 288 | const char *pub_str = (fn_proto->data.fn_proto.visib_mod == VisibModPub) ? "pub " : ""; |
| 271 | | fprintf(p->f, "%sextern fn %s(", pub_str, fn_name); |
| 289 | const char *extern_str = fn_proto->data.fn_proto.is_extern ? "extern " : ""; |
| 290 | fprintf(p->f, "%s%sfn %s(", pub_str, extern_str, fn_name); |
| 272 | 291 | int arg_count = fn_proto->data.fn_proto.params.length; |
| 273 | 292 | bool is_var_args = fn_proto->data.fn_proto.is_var_args; |
| 274 | 293 | for (int arg_i = 0; arg_i < arg_count; arg_i += 1) { |
| 275 | 294 | AstNode *param_decl = fn_proto->data.fn_proto.params.at(arg_i); |
| 276 | 295 | assert(param_decl->type == NodeTypeParamDecl); |
| 277 | 296 | const char *arg_name = buf_ptr(&param_decl->data.param_decl.name); |
| 278 | | Buf *arg_type = type_node_to_name(param_decl->data.param_decl.type); |
| 297 | Buf *arg_type = node_to_buf(param_decl->data.param_decl.type); |
| 279 | 298 | const char *noalias_str = param_decl->data.param_decl.is_noalias ? "noalias " : ""; |
| 280 | 299 | fprintf(p->f, "%s%s: %s", noalias_str, arg_name, buf_ptr(arg_type)); |
| 281 | 300 | if (arg_i + 1 < arg_count || is_var_args) { |
| ... | ... | @@ -286,7 +305,7 @@ static int parseh(const char *arg0, int argc, char **argv) { |
| 286 | 305 | fprintf(p->f, "..."); |
| 287 | 306 | } |
| 288 | 307 | fprintf(p->f, ")"); |
| 289 | | Buf *return_type_name = type_node_to_name(fn_proto->data.fn_proto.return_type); |
| 308 | Buf *return_type_name = node_to_buf(fn_proto->data.fn_proto.return_type); |
| 290 | 309 | if (!buf_eql_str(return_type_name, "void")) { |
| 291 | 310 | fprintf(p->f, " -> %s", buf_ptr(return_type_name)); |
| 292 | 311 | } |