authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2016-11-17 21:17:58-05:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2016-11-17 21:17:58-05:00
logc3b603fdf9f1edcfe8a0e45413a1c30a563e87d4
treefd9e34fcc48ce162cc2b63ca3ac19bd9555b3bcc
parent7a2a0672b4370d0dfe7a64541c4fb90a89132113

remove AST cloning code and add AST render for while loops


5 files changed, 13 insertions(+), 337 deletions(-)

src/all_types.hpp-1
...@@ -793,7 +793,6 @@ struct AstNode {...@@ -793,7 +793,6 @@ struct AstNode {
793 size_t column;793 size_t column;
794 uint32_t create_index; // for determinism purposes794 uint32_t create_index; // for determinism purposes
795 ImportTableEntry *owner;795 ImportTableEntry *owner;
796 AstNode **parent_field; // for AST rewriting
797 // the context in which this expression/node is evaluated.796 // the context in which this expression/node is evaluated.
798 // for blocks, this points to the containing scope, not the block's own scope for its children.797 // for blocks, this points to the containing scope, not the block's own scope for its children.
799 BlockContext *block_context;798 BlockContext *block_context;
src/ast_render.cpp+13-3
...@@ -343,8 +343,6 @@ static void print_symbol(AstRender *ar, Buf *symbol) {...@@ -343,8 +343,6 @@ static void print_symbol(AstRender *ar, Buf *symbol) {
343}343}
344344
345static void render_node(AstRender *ar, AstNode *node) {345static void render_node(AstRender *ar, AstNode *node) {
346 assert(node->type == NodeTypeRoot || *node->parent_field == node);
347
348 switch (node->type) {346 switch (node->type) {
349 case NodeTypeRoot:347 case NodeTypeRoot:
350 for (size_t i = 0; i < node->data.root.top_level_decls.length; i += 1) {348 for (size_t i = 0; i < node->data.root.top_level_decls.length; i += 1) {
...@@ -658,6 +656,19 @@ static void render_node(AstRender *ar, AstNode *node) {...@@ -658,6 +656,19 @@ static void render_node(AstRender *ar, AstNode *node) {
658 fprintf(ar->f, ")");656 fprintf(ar->f, ")");
659 break;657 break;
660 }658 }
659 case NodeTypeWhileExpr:
660 {
661 const char *inline_str = node->data.while_expr.is_inline ? "inline " : "";
662 fprintf(ar->f, "%swhile (", inline_str);
663 render_node(ar, node->data.while_expr.condition);
664 if (node->data.while_expr.continue_expr) {
665 fprintf(ar->f, "; ");
666 render_node(ar, node->data.while_expr.continue_expr);
667 }
668 fprintf(ar->f, ") ");
669 render_node(ar, node->data.while_expr.body);
670 break;
671 }
661 case NodeTypeFnDecl:672 case NodeTypeFnDecl:
662 case NodeTypeParamDecl:673 case NodeTypeParamDecl:
663 case NodeTypeErrorValueDecl:674 case NodeTypeErrorValueDecl:
...@@ -672,7 +683,6 @@ static void render_node(AstRender *ar, AstNode *node) {...@@ -672,7 +683,6 @@ static void render_node(AstRender *ar, AstNode *node) {
672 case NodeTypeThisLiteral:683 case NodeTypeThisLiteral:
673 case NodeTypeIfBoolExpr:684 case NodeTypeIfBoolExpr:
674 case NodeTypeIfVarExpr:685 case NodeTypeIfVarExpr:
675 case NodeTypeWhileExpr:
676 case NodeTypeForExpr:686 case NodeTypeForExpr:
677 case NodeTypeSwitchExpr:687 case NodeTypeSwitchExpr:
678 case NodeTypeSwitchProng:688 case NodeTypeSwitchProng:
src/parseh.cpp-14
...@@ -112,7 +112,6 @@ static AstNode *create_field_access_node(Context *c, const char *lhs, const char...@@ -112,7 +112,6 @@ static AstNode *create_field_access_node(Context *c, const char *lhs, const char
112 AstNode *node = create_node(c, NodeTypeFieldAccessExpr);112 AstNode *node = create_node(c, NodeTypeFieldAccessExpr);
113 node->data.field_access_expr.struct_expr = create_symbol_node(c, lhs);113 node->data.field_access_expr.struct_expr = create_symbol_node(c, lhs);
114 node->data.field_access_expr.field_name = buf_create_from_str(rhs);114 node->data.field_access_expr.field_name = buf_create_from_str(rhs);
115 normalize_parent_ptrs(node);
116 return node;115 return node;
117}116}
118117
...@@ -125,7 +124,6 @@ static AstNode *create_typed_var_decl_node(Context *c, bool is_const, const char...@@ -125,7 +124,6 @@ static AstNode *create_typed_var_decl_node(Context *c, bool is_const, const char
125 node->data.variable_declaration.top_level_decl.visib_mod = c->visib_mod;124 node->data.variable_declaration.top_level_decl.visib_mod = c->visib_mod;
126 node->data.variable_declaration.expr = init_node;125 node->data.variable_declaration.expr = init_node;
127 node->data.variable_declaration.type = type_node;126 node->data.variable_declaration.type = type_node;
128 normalize_parent_ptrs(node);
129 return node;127 return node;
130}128}
131129
...@@ -138,7 +136,6 @@ static AstNode *create_prefix_node(Context *c, PrefixOp op, AstNode *child_node)...@@ -138,7 +136,6 @@ static AstNode *create_prefix_node(Context *c, PrefixOp op, AstNode *child_node)
138 AstNode *node = create_node(c, NodeTypePrefixOpExpr);136 AstNode *node = create_node(c, NodeTypePrefixOpExpr);
139 node->data.prefix_op_expr.prefix_op = op;137 node->data.prefix_op_expr.prefix_op = op;
140 node->data.prefix_op_expr.primary_expr = child_node;138 node->data.prefix_op_expr.primary_expr = child_node;
141 normalize_parent_ptrs(node);
142 return node;139 return node;
143}140}
144141
...@@ -149,7 +146,6 @@ static AstNode *create_struct_field_node(Context *c, const char *name, AstNode *...@@ -149,7 +146,6 @@ static AstNode *create_struct_field_node(Context *c, const char *name, AstNode *
149 node->data.struct_field.top_level_decl.visib_mod = VisibModPub;146 node->data.struct_field.top_level_decl.visib_mod = VisibModPub;
150 node->data.struct_field.type = type_node;147 node->data.struct_field.type = type_node;
151148
152 normalize_parent_ptrs(node);
153 return node;149 return node;
154}150}
155151
...@@ -160,7 +156,6 @@ static AstNode *create_param_decl_node(Context *c, const char *name, AstNode *ty...@@ -160,7 +156,6 @@ static AstNode *create_param_decl_node(Context *c, const char *name, AstNode *ty
160 node->data.param_decl.type = type_node;156 node->data.param_decl.type = type_node;
161 node->data.param_decl.is_noalias = is_noalias;157 node->data.param_decl.is_noalias = is_noalias;
162158
163 normalize_parent_ptrs(node);
164 return node;159 return node;
165}160}
166161
...@@ -225,7 +220,6 @@ static AstNode *create_type_decl_node(Context *c, const char *name, AstNode *chi...@@ -225,7 +220,6 @@ static AstNode *create_type_decl_node(Context *c, const char *name, AstNode *chi
225 node->data.type_decl.top_level_decl.visib_mod = c->visib_mod;220 node->data.type_decl.top_level_decl.visib_mod = c->visib_mod;
226 node->data.type_decl.child_type = child_type_node;221 node->data.type_decl.child_type = child_type_node;
227222
228 normalize_parent_ptrs(node);
229 return node;223 return node;
230}224}
231225
...@@ -249,7 +243,6 @@ static AstNode *create_fn_proto_node(Context *c, Buf *name, TypeTableEntry *fn_t...@@ -249,7 +243,6 @@ static AstNode *create_fn_proto_node(Context *c, Buf *name, TypeTableEntry *fn_t
249 make_type_node(c, info->type), info->is_noalias));243 make_type_node(c, info->type), info->is_noalias));
250 }244 }
251245
252 normalize_parent_ptrs(node);
253 return node;246 return node;
254}247}
255248
...@@ -257,7 +250,6 @@ static AstNode *create_one_statement_block(Context *c, AstNode *statement) {...@@ -257,7 +250,6 @@ static AstNode *create_one_statement_block(Context *c, AstNode *statement) {
257 AstNode *node = create_node(c, NodeTypeBlock);250 AstNode *node = create_node(c, NodeTypeBlock);
258 node->data.block.statements.append(statement);251 node->data.block.statements.append(statement);
259252
260 normalize_parent_ptrs(node);
261 return node;253 return node;
262}254}
263255
...@@ -275,11 +267,9 @@ static AstNode *create_inline_fn_node(Context *c, Buf *fn_name, Buf *var_name, T...@@ -275,11 +267,9 @@ static AstNode *create_inline_fn_node(Context *c, Buf *fn_name, Buf *var_name, T
275 fn_call_node->data.fn_call_expr.params.append(create_symbol_node(c, buf_ptr(param_name)));267 fn_call_node->data.fn_call_expr.params.append(create_symbol_node(c, buf_ptr(param_name)));
276 }268 }
277269
278 normalize_parent_ptrs(fn_call_node);
279270
280 node->data.fn_def.body = create_one_statement_block(c, fn_call_node);271 node->data.fn_def.body = create_one_statement_block(c, fn_call_node);
281272
282 normalize_parent_ptrs(node);
283 return node;273 return node;
284}274}
285275
...@@ -761,7 +751,6 @@ static void visit_fn_decl(Context *c, const FunctionDecl *fn_decl) {...@@ -761,7 +751,6 @@ static void visit_fn_decl(Context *c, const FunctionDecl *fn_decl) {
761 node->data.fn_proto.params.append(create_param_decl_node(c, name, type_node, param_info->is_noalias));751 node->data.fn_proto.params.append(create_param_decl_node(c, name, type_node, param_info->is_noalias));
762 }752 }
763753
764 normalize_parent_ptrs(node);
765754
766 c->fn_table.put(buf_create_from_buf(fn_name), true);755 c->fn_table.put(buf_create_from_buf(fn_name), true);
767 c->root->data.root.top_level_decls.append(node);756 c->root->data.root.top_level_decls.append(node);
...@@ -981,7 +970,6 @@ static void visit_enum_decl(Context *c, const EnumDecl *enum_decl) {...@@ -981,7 +970,6 @@ static void visit_enum_decl(Context *c, const EnumDecl *enum_decl) {
981 enum_node->data.struct_decl.fields.append(field_node);970 enum_node->data.struct_decl.fields.append(field_node);
982 }971 }
983972
984 normalize_parent_ptrs(enum_node);
985 c->root->data.root.top_level_decls.append(enum_node);973 c->root->data.root.top_level_decls.append(enum_node);
986 } else {974 } else {
987 TypeTableEntry *typedecl_type = get_typedecl_type(c->codegen, buf_ptr(&enum_type->name),975 TypeTableEntry *typedecl_type = get_typedecl_type(c->codegen, buf_ptr(&enum_type->name),
...@@ -1158,7 +1146,6 @@ static void visit_record_decl(Context *c, const RecordDecl *record_decl) {...@@ -1158,7 +1146,6 @@ static void visit_record_decl(Context *c, const RecordDecl *record_decl) {
1158 struct_node->data.struct_decl.fields.append(field_node);1146 struct_node->data.struct_decl.fields.append(field_node);
1159 }1147 }
11601148
1161 normalize_parent_ptrs(struct_node);
1162 c->root->data.root.top_level_decls.append(struct_node);1149 c->root->data.root.top_level_decls.append(struct_node);
1163 } else {1150 } else {
1164 TypeTableEntry *typedecl_type = get_typedecl_type(c->codegen, buf_ptr(&struct_type->name),1151 TypeTableEntry *typedecl_type = get_typedecl_type(c->codegen, buf_ptr(&struct_type->name),
...@@ -1622,7 +1609,6 @@ int parse_h_file(ImportTableEntry *import, ZigList<ErrorMsg *> *errors, const ch...@@ -1622,7 +1609,6 @@ int parse_h_file(ImportTableEntry *import, ZigList<ErrorMsg *> *errors, const ch
1622 render_macros(c);1609 render_macros(c);
1623 render_aliases(c);1610 render_aliases(c);
16241611
1625 normalize_parent_ptrs(c->root);
1626 import->root = c->root;1612 import->root = c->root;
16271613
1628 return 0;1614 return 0;
src/parser.cpp-309
...@@ -281,7 +281,6 @@ static AstNode *ast_parse_param_decl(ParseContext *pc, size_t *token_index) {...@@ -281,7 +281,6 @@ static AstNode *ast_parse_param_decl(ParseContext *pc, size_t *token_index) {
281281
282 node->data.param_decl.type = ast_parse_type_expr(pc, token_index, true);282 node->data.param_decl.type = ast_parse_type_expr(pc, token_index, true);
283283
284 normalize_parent_ptrs(node);
285 return node;284 return node;
286}285}
287286
...@@ -396,7 +395,6 @@ static AstNode *ast_parse_array_type_expr(ParseContext *pc, size_t *token_index,...@@ -396,7 +395,6 @@ static AstNode *ast_parse_array_type_expr(ParseContext *pc, size_t *token_index,
396395
397 node->data.array_type.child_type = ast_parse_type_expr(pc, token_index, true);396 node->data.array_type.child_type = ast_parse_type_expr(pc, token_index, true);
398397
399 normalize_parent_ptrs(node);
400 return node;398 return node;
401}399}
402400
...@@ -580,7 +578,6 @@ static AstNode *ast_parse_asm_expr(ParseContext *pc, size_t *token_index, bool m...@@ -580,7 +578,6 @@ static AstNode *ast_parse_asm_expr(ParseContext *pc, size_t *token_index, bool m
580578
581 ast_eat_token(pc, token_index, TokenIdRParen);579 ast_eat_token(pc, token_index, TokenIdRParen);
582580
583 normalize_parent_ptrs(node);
584 return node;581 return node;
585}582}
586583
...@@ -667,7 +664,6 @@ static AstNode *ast_parse_primary_expr(ParseContext *pc, size_t *token_index, bo...@@ -667,7 +664,6 @@ static AstNode *ast_parse_primary_expr(ParseContext *pc, size_t *token_index, bo
667 ast_parse_fn_call_param_list(pc, token_index, &node->data.fn_call_expr.params);664 ast_parse_fn_call_param_list(pc, token_index, &node->data.fn_call_expr.params);
668 node->data.fn_call_expr.is_builtin = true;665 node->data.fn_call_expr.is_builtin = true;
669666
670 normalize_parent_ptrs(node);
671 return node;667 return node;
672 } else if (token->id == TokenIdSymbol) {668 } else if (token->id == TokenIdSymbol) {
673 *token_index += 1;669 *token_index += 1;
...@@ -750,7 +746,6 @@ static AstNode *ast_parse_curly_suffix_expr(ParseContext *pc, size_t *token_inde...@@ -750,7 +746,6 @@ static AstNode *ast_parse_curly_suffix_expr(ParseContext *pc, size_t *token_inde
750 field_node->data.struct_val_field.name = token_buf(field_name_tok);746 field_node->data.struct_val_field.name = token_buf(field_name_tok);
751 field_node->data.struct_val_field.expr = ast_parse_expression(pc, token_index, true);747 field_node->data.struct_val_field.expr = ast_parse_expression(pc, token_index, true);
752748
753 normalize_parent_ptrs(field_node);
754 node->data.container_init_expr.entries.append(field_node);749 node->data.container_init_expr.entries.append(field_node);
755750
756 Token *comma_tok = &pc->tokens->at(*token_index);751 Token *comma_tok = &pc->tokens->at(*token_index);
...@@ -797,7 +792,6 @@ static AstNode *ast_parse_curly_suffix_expr(ParseContext *pc, size_t *token_inde...@@ -797,7 +792,6 @@ static AstNode *ast_parse_curly_suffix_expr(ParseContext *pc, size_t *token_inde
797 }792 }
798 }793 }
799794
800 normalize_parent_ptrs(node);
801 prefix_op_expr = node;795 prefix_op_expr = node;
802 } else {796 } else {
803 return prefix_op_expr;797 return prefix_op_expr;
...@@ -828,7 +822,6 @@ static AstNode *ast_parse_suffix_op_expr(ParseContext *pc, size_t *token_index,...@@ -828,7 +822,6 @@ static AstNode *ast_parse_suffix_op_expr(ParseContext *pc, size_t *token_index,
828 node->data.fn_call_expr.fn_ref_expr = primary_expr;822 node->data.fn_call_expr.fn_ref_expr = primary_expr;
829 ast_parse_fn_call_param_list(pc, token_index, &node->data.fn_call_expr.params);823 ast_parse_fn_call_param_list(pc, token_index, &node->data.fn_call_expr.params);
830824
831 normalize_parent_ptrs(node);
832 primary_expr = node;825 primary_expr = node;
833 } else if (first_token->id == TokenIdLBracket) {826 } else if (first_token->id == TokenIdLBracket) {
834 *token_index += 1;827 *token_index += 1;
...@@ -853,7 +846,6 @@ static AstNode *ast_parse_suffix_op_expr(ParseContext *pc, size_t *token_index,...@@ -853,7 +846,6 @@ static AstNode *ast_parse_suffix_op_expr(ParseContext *pc, size_t *token_index,
853 node->data.slice_expr.is_const = true;846 node->data.slice_expr.is_const = true;
854 }847 }
855848
856 normalize_parent_ptrs(node);
857 primary_expr = node;849 primary_expr = node;
858 } else if (ellipsis_or_r_bracket->id == TokenIdRBracket) {850 } else if (ellipsis_or_r_bracket->id == TokenIdRBracket) {
859 *token_index += 1;851 *token_index += 1;
...@@ -862,7 +854,6 @@ static AstNode *ast_parse_suffix_op_expr(ParseContext *pc, size_t *token_index,...@@ -862,7 +854,6 @@ static AstNode *ast_parse_suffix_op_expr(ParseContext *pc, size_t *token_index,
862 node->data.array_access_expr.array_ref_expr = primary_expr;854 node->data.array_access_expr.array_ref_expr = primary_expr;
863 node->data.array_access_expr.subscript = expr_node;855 node->data.array_access_expr.subscript = expr_node;
864856
865 normalize_parent_ptrs(node);
866 primary_expr = node;857 primary_expr = node;
867 } else {858 } else {
868 ast_invalid_token_error(pc, first_token);859 ast_invalid_token_error(pc, first_token);
...@@ -876,7 +867,6 @@ static AstNode *ast_parse_suffix_op_expr(ParseContext *pc, size_t *token_index,...@@ -876,7 +867,6 @@ static AstNode *ast_parse_suffix_op_expr(ParseContext *pc, size_t *token_index,
876 node->data.field_access_expr.struct_expr = primary_expr;867 node->data.field_access_expr.struct_expr = primary_expr;
877 node->data.field_access_expr.field_name = token_buf(name_token);868 node->data.field_access_expr.field_name = token_buf(name_token);
878869
879 normalize_parent_ptrs(node);
880 primary_expr = node;870 primary_expr = node;
881 } else {871 } else {
882 return primary_expr;872 return primary_expr;
...@@ -955,8 +945,6 @@ static AstNode *ast_parse_prefix_op_expr(ParseContext *pc, size_t *token_index,...@@ -955,8 +945,6 @@ static AstNode *ast_parse_prefix_op_expr(ParseContext *pc, size_t *token_index,
955 node->data.prefix_op_expr.primary_expr = prefix_op_expr;945 node->data.prefix_op_expr.primary_expr = prefix_op_expr;
956 node->data.prefix_op_expr.prefix_op = prefix_op;946 node->data.prefix_op_expr.prefix_op = prefix_op;
957947
958 normalize_parent_ptrs(node);
959 normalize_parent_ptrs(parent_node);
960 return parent_node;948 return parent_node;
961}949}
962950
...@@ -1010,7 +998,6 @@ static AstNode *ast_parse_mult_expr(ParseContext *pc, size_t *token_index, bool...@@ -1010,7 +998,6 @@ static AstNode *ast_parse_mult_expr(ParseContext *pc, size_t *token_index, bool
1010 node->data.bin_op_expr.bin_op = mult_op;998 node->data.bin_op_expr.bin_op = mult_op;
1011 node->data.bin_op_expr.op2 = operand_2;999 node->data.bin_op_expr.op2 = operand_2;
10121000
1013 normalize_parent_ptrs(node);
1014 operand_1 = node;1001 operand_1 = node;
1015 }1002 }
1016}1003}
...@@ -1064,7 +1051,6 @@ static AstNode *ast_parse_add_expr(ParseContext *pc, size_t *token_index, bool m...@@ -1064,7 +1051,6 @@ static AstNode *ast_parse_add_expr(ParseContext *pc, size_t *token_index, bool m
1064 node->data.bin_op_expr.bin_op = add_op;1051 node->data.bin_op_expr.bin_op = add_op;
1065 node->data.bin_op_expr.op2 = operand_2;1052 node->data.bin_op_expr.op2 = operand_2;
10661053
1067 normalize_parent_ptrs(node);
1068 operand_1 = node;1054 operand_1 = node;
1069 }1055 }
1070}1056}
...@@ -1116,7 +1102,6 @@ static AstNode *ast_parse_bit_shift_expr(ParseContext *pc, size_t *token_index,...@@ -1116,7 +1102,6 @@ static AstNode *ast_parse_bit_shift_expr(ParseContext *pc, size_t *token_index,
1116 node->data.bin_op_expr.bin_op = bit_shift_op;1102 node->data.bin_op_expr.bin_op = bit_shift_op;
1117 node->data.bin_op_expr.op2 = operand_2;1103 node->data.bin_op_expr.op2 = operand_2;
11181104
1119 normalize_parent_ptrs(node);
1120 operand_1 = node;1105 operand_1 = node;
1121 }1106 }
1122}1107}
...@@ -1143,7 +1128,6 @@ static AstNode *ast_parse_bin_and_expr(ParseContext *pc, size_t *token_index, bo...@@ -1143,7 +1128,6 @@ static AstNode *ast_parse_bin_and_expr(ParseContext *pc, size_t *token_index, bo
1143 node->data.bin_op_expr.bin_op = BinOpTypeBinAnd;1128 node->data.bin_op_expr.bin_op = BinOpTypeBinAnd;
1144 node->data.bin_op_expr.op2 = operand_2;1129 node->data.bin_op_expr.op2 = operand_2;
11451130
1146 normalize_parent_ptrs(node);
1147 operand_1 = node;1131 operand_1 = node;
1148 }1132 }
1149}1133}
...@@ -1169,7 +1153,6 @@ static AstNode *ast_parse_bin_xor_expr(ParseContext *pc, size_t *token_index, bo...@@ -1169,7 +1153,6 @@ static AstNode *ast_parse_bin_xor_expr(ParseContext *pc, size_t *token_index, bo
1169 node->data.bin_op_expr.bin_op = BinOpTypeBinXor;1153 node->data.bin_op_expr.bin_op = BinOpTypeBinXor;
1170 node->data.bin_op_expr.op2 = operand_2;1154 node->data.bin_op_expr.op2 = operand_2;
11711155
1172 normalize_parent_ptrs(node);
1173 operand_1 = node;1156 operand_1 = node;
1174 }1157 }
1175}1158}
...@@ -1195,7 +1178,6 @@ static AstNode *ast_parse_bin_or_expr(ParseContext *pc, size_t *token_index, boo...@@ -1195,7 +1178,6 @@ static AstNode *ast_parse_bin_or_expr(ParseContext *pc, size_t *token_index, boo
1195 node->data.bin_op_expr.bin_op = BinOpTypeBinOr;1178 node->data.bin_op_expr.bin_op = BinOpTypeBinOr;
1196 node->data.bin_op_expr.op2 = operand_2;1179 node->data.bin_op_expr.op2 = operand_2;
11971180
1198 normalize_parent_ptrs(node);
1199 operand_1 = node;1181 operand_1 = node;
1200 }1182 }
1201}1183}
...@@ -1246,7 +1228,6 @@ static AstNode *ast_parse_comparison_expr(ParseContext *pc, size_t *token_index,...@@ -1246,7 +1228,6 @@ static AstNode *ast_parse_comparison_expr(ParseContext *pc, size_t *token_index,
1246 node->data.bin_op_expr.bin_op = cmp_op;1228 node->data.bin_op_expr.bin_op = cmp_op;
1247 node->data.bin_op_expr.op2 = operand_2;1229 node->data.bin_op_expr.op2 = operand_2;
12481230
1249 normalize_parent_ptrs(node);
1250 return node;1231 return node;
1251}1232}
12521233
...@@ -1271,7 +1252,6 @@ static AstNode *ast_parse_bool_and_expr(ParseContext *pc, size_t *token_index, b...@@ -1271,7 +1252,6 @@ static AstNode *ast_parse_bool_and_expr(ParseContext *pc, size_t *token_index, b
1271 node->data.bin_op_expr.bin_op = BinOpTypeBoolAnd;1252 node->data.bin_op_expr.bin_op = BinOpTypeBoolAnd;
1272 node->data.bin_op_expr.op2 = operand_2;1253 node->data.bin_op_expr.op2 = operand_2;
12731254
1274 normalize_parent_ptrs(node);
1275 operand_1 = node;1255 operand_1 = node;
1276 }1256 }
1277}1257}
...@@ -1349,7 +1329,6 @@ static AstNode *ast_parse_if_expr(ParseContext *pc, size_t *token_index, bool ma...@@ -1349,7 +1329,6 @@ static AstNode *ast_parse_if_expr(ParseContext *pc, size_t *token_index, bool ma
1349 node->data.if_var_expr.then_block = ast_parse_expression(pc, token_index, true);1329 node->data.if_var_expr.then_block = ast_parse_expression(pc, token_index, true);
1350 node->data.if_var_expr.else_node = ast_parse_else(pc, token_index, false);1330 node->data.if_var_expr.else_node = ast_parse_else(pc, token_index, false);
13511331
1352 normalize_parent_ptrs(node);
1353 return node;1332 return node;
1354 } else {1333 } else {
1355 AstNode *node = ast_create_node(pc, NodeTypeIfBoolExpr, if_tok);1334 AstNode *node = ast_create_node(pc, NodeTypeIfBoolExpr, if_tok);
...@@ -1358,7 +1337,6 @@ static AstNode *ast_parse_if_expr(ParseContext *pc, size_t *token_index, bool ma...@@ -1358,7 +1337,6 @@ static AstNode *ast_parse_if_expr(ParseContext *pc, size_t *token_index, bool ma
1358 node->data.if_bool_expr.then_block = ast_parse_expression(pc, token_index, true);1337 node->data.if_bool_expr.then_block = ast_parse_expression(pc, token_index, true);
1359 node->data.if_bool_expr.else_node = ast_parse_else(pc, token_index, false);1338 node->data.if_bool_expr.else_node = ast_parse_else(pc, token_index, false);
13601339
1361 normalize_parent_ptrs(node);
1362 return node;1340 return node;
1363 }1341 }
1364}1342}
...@@ -1402,7 +1380,6 @@ static AstNode *ast_parse_return_expr(ParseContext *pc, size_t *token_index) {...@@ -1402,7 +1380,6 @@ static AstNode *ast_parse_return_expr(ParseContext *pc, size_t *token_index) {
1402 node->data.return_expr.kind = kind;1380 node->data.return_expr.kind = kind;
1403 node->data.return_expr.expr = ast_parse_expression(pc, token_index, false);1381 node->data.return_expr.expr = ast_parse_expression(pc, token_index, false);
14041382
1405 normalize_parent_ptrs(node);
1406 return node;1383 return node;
1407}1384}
14081385
...@@ -1445,7 +1422,6 @@ static AstNode *ast_parse_defer_expr(ParseContext *pc, size_t *token_index) {...@@ -1445,7 +1422,6 @@ static AstNode *ast_parse_defer_expr(ParseContext *pc, size_t *token_index) {
1445 node->data.defer.kind = kind;1422 node->data.defer.kind = kind;
1446 node->data.defer.expr = ast_parse_expression(pc, token_index, false);1423 node->data.defer.expr = ast_parse_expression(pc, token_index, false);
14471424
1448 normalize_parent_ptrs(node);
1449 return node;1425 return node;
1450}1426}
14511427
...@@ -1505,7 +1481,6 @@ static AstNode *ast_parse_variable_declaration_expr(ParseContext *pc, size_t *to...@@ -1505,7 +1481,6 @@ static AstNode *ast_parse_variable_declaration_expr(ParseContext *pc, size_t *to
1505 if (eq_or_colon->id == TokenIdEq) {1481 if (eq_or_colon->id == TokenIdEq) {
1506 node->data.variable_declaration.expr = ast_parse_expression(pc, token_index, true);1482 node->data.variable_declaration.expr = ast_parse_expression(pc, token_index, true);
15071483
1508 normalize_parent_ptrs(node);
1509 return node;1484 return node;
1510 } else if (eq_or_colon->id == TokenIdColon) {1485 } else if (eq_or_colon->id == TokenIdColon) {
1511 node->data.variable_declaration.type = ast_parse_type_expr(pc, token_index, true);1486 node->data.variable_declaration.type = ast_parse_type_expr(pc, token_index, true);
...@@ -1516,7 +1491,6 @@ static AstNode *ast_parse_variable_declaration_expr(ParseContext *pc, size_t *to...@@ -1516,7 +1491,6 @@ static AstNode *ast_parse_variable_declaration_expr(ParseContext *pc, size_t *to
1516 node->data.variable_declaration.expr = ast_parse_expression(pc, token_index, true);1491 node->data.variable_declaration.expr = ast_parse_expression(pc, token_index, true);
1517 }1492 }
15181493
1519 normalize_parent_ptrs(node);
1520 return node;1494 return node;
1521 } else {1495 } else {
1522 ast_invalid_token_error(pc, eq_or_colon);1496 ast_invalid_token_error(pc, eq_or_colon);
...@@ -1544,7 +1518,6 @@ static AstNode *ast_parse_bool_or_expr(ParseContext *pc, size_t *token_index, bo...@@ -1544,7 +1518,6 @@ static AstNode *ast_parse_bool_or_expr(ParseContext *pc, size_t *token_index, bo
1544 node->data.bin_op_expr.bin_op = BinOpTypeBoolOr;1518 node->data.bin_op_expr.bin_op = BinOpTypeBoolOr;
1545 node->data.bin_op_expr.op2 = operand_2;1519 node->data.bin_op_expr.op2 = operand_2;
15461520
1547 normalize_parent_ptrs(node);
1548 operand_1 = node;1521 operand_1 = node;
1549 }1522 }
1550}1523}
...@@ -1596,7 +1569,6 @@ static AstNode *ast_parse_while_expr(ParseContext *pc, size_t *token_index, bool...@@ -1596,7 +1569,6 @@ static AstNode *ast_parse_while_expr(ParseContext *pc, size_t *token_index, bool
1596 }1569 }
15971570
15981571
1599 normalize_parent_ptrs(node);
1600 return node;1572 return node;
1601}1573}
16021574
...@@ -1666,7 +1638,6 @@ static AstNode *ast_parse_for_expr(ParseContext *pc, size_t *token_index, bool m...@@ -1666,7 +1638,6 @@ static AstNode *ast_parse_for_expr(ParseContext *pc, size_t *token_index, bool m
16661638
1667 node->data.for_expr.body = ast_parse_expression(pc, token_index, true);1639 node->data.for_expr.body = ast_parse_expression(pc, token_index, true);
16681640
1669 normalize_parent_ptrs(node);
1670 return node;1641 return node;
1671}1642}
16721643
...@@ -1700,7 +1671,6 @@ static AstNode *ast_parse_switch_expr(ParseContext *pc, size_t *token_index, boo...@@ -1700,7 +1671,6 @@ static AstNode *ast_parse_switch_expr(ParseContext *pc, size_t *token_index, boo
1700 if (token->id == TokenIdRBrace) {1671 if (token->id == TokenIdRBrace) {
1701 *token_index += 1;1672 *token_index += 1;
17021673
1703 normalize_parent_ptrs(node);
1704 return node;1674 return node;
1705 }1675 }
17061676
...@@ -1721,7 +1691,6 @@ static AstNode *ast_parse_switch_expr(ParseContext *pc, size_t *token_index, boo...@@ -1721,7 +1691,6 @@ static AstNode *ast_parse_switch_expr(ParseContext *pc, size_t *token_index, boo
1721 range_node->data.switch_range.start = expr1;1691 range_node->data.switch_range.start = expr1;
1722 range_node->data.switch_range.end = ast_parse_expression(pc, token_index, true);1692 range_node->data.switch_range.end = ast_parse_expression(pc, token_index, true);
17231693
1724 normalize_parent_ptrs(range_node);
1725 } else {1694 } else {
1726 prong_node->data.switch_prong.items.append(expr1);1695 prong_node->data.switch_prong.items.append(expr1);
1727 }1696 }
...@@ -1745,7 +1714,6 @@ static AstNode *ast_parse_switch_expr(ParseContext *pc, size_t *token_index, boo...@@ -1745,7 +1714,6 @@ static AstNode *ast_parse_switch_expr(ParseContext *pc, size_t *token_index, boo
1745 prong_node->data.switch_prong.expr = ast_parse_expression(pc, token_index, true);1714 prong_node->data.switch_prong.expr = ast_parse_expression(pc, token_index, true);
1746 ast_eat_token(pc, token_index, TokenIdComma);1715 ast_eat_token(pc, token_index, TokenIdComma);
17471716
1748 normalize_parent_ptrs(prong_node);
1749 }1717 }
1750}1718}
17511719
...@@ -1843,7 +1811,6 @@ static AstNode *ast_parse_unwrap_expr(ParseContext *pc, size_t *token_index, boo...@@ -1843,7 +1811,6 @@ static AstNode *ast_parse_unwrap_expr(ParseContext *pc, size_t *token_index, boo
1843 node->data.bin_op_expr.bin_op = BinOpTypeUnwrapMaybe;1811 node->data.bin_op_expr.bin_op = BinOpTypeUnwrapMaybe;
1844 node->data.bin_op_expr.op2 = rhs;1812 node->data.bin_op_expr.op2 = rhs;
18451813
1846 normalize_parent_ptrs(node);
1847 return node;1814 return node;
1848 } else if (token->id == TokenIdPercentPercent) {1815 } else if (token->id == TokenIdPercentPercent) {
1849 *token_index += 1;1816 *token_index += 1;
...@@ -1859,7 +1826,6 @@ static AstNode *ast_parse_unwrap_expr(ParseContext *pc, size_t *token_index, boo...@@ -1859,7 +1826,6 @@ static AstNode *ast_parse_unwrap_expr(ParseContext *pc, size_t *token_index, boo
1859 }1826 }
1860 node->data.unwrap_err_expr.op2 = ast_parse_expression(pc, token_index, true);1827 node->data.unwrap_err_expr.op2 = ast_parse_expression(pc, token_index, true);
18611828
1862 normalize_parent_ptrs(node);
1863 return node;1829 return node;
1864 } else {1830 } else {
1865 return lhs;1831 return lhs;
...@@ -1886,7 +1852,6 @@ static AstNode *ast_parse_ass_expr(ParseContext *pc, size_t *token_index, bool m...@@ -1886,7 +1852,6 @@ static AstNode *ast_parse_ass_expr(ParseContext *pc, size_t *token_index, bool m
1886 node->data.bin_op_expr.bin_op = ass_op;1852 node->data.bin_op_expr.bin_op = ass_op;
1887 node->data.bin_op_expr.op2 = rhs;1853 node->data.bin_op_expr.op2 = rhs;
18881854
1889 normalize_parent_ptrs(node);
1890 return node;1855 return node;
1891}1856}
18921857
...@@ -1961,7 +1926,6 @@ static AstNode *ast_parse_label(ParseContext *pc, size_t *token_index, bool mand...@@ -1961,7 +1926,6 @@ static AstNode *ast_parse_label(ParseContext *pc, size_t *token_index, bool mand
19611926
1962static AstNode *ast_create_void_expr(ParseContext *pc, Token *token) {1927static AstNode *ast_create_void_expr(ParseContext *pc, Token *token) {
1963 AstNode *node = ast_create_node(pc, NodeTypeBlock, token);1928 AstNode *node = ast_create_node(pc, NodeTypeBlock, token);
1964 normalize_parent_ptrs(node);
1965 return node;1929 return node;
1966}1930}
19671931
...@@ -2017,7 +1981,6 @@ static AstNode *ast_parse_block(ParseContext *pc, size_t *token_index, bool mand...@@ -2017,7 +1981,6 @@ static AstNode *ast_parse_block(ParseContext *pc, size_t *token_index, bool mand
2017 if (last_token->id == TokenIdRBrace) {1981 if (last_token->id == TokenIdRBrace) {
2018 *token_index += 1;1982 *token_index += 1;
20191983
2020 normalize_parent_ptrs(node);
2021 return node;1984 return node;
2022 } else if (!semicolon_expected) {1985 } else if (!semicolon_expected) {
2023 continue;1986 continue;
...@@ -2079,7 +2042,6 @@ static AstNode *ast_parse_fn_proto(ParseContext *pc, size_t *token_index, bool m...@@ -2079,7 +2042,6 @@ static AstNode *ast_parse_fn_proto(ParseContext *pc, size_t *token_index, bool m
2079 node->data.fn_proto.return_type = ast_create_void_type_node(pc, next_token);2042 node->data.fn_proto.return_type = ast_create_void_type_node(pc, next_token);
2080 }2043 }
20812044
2082 normalize_parent_ptrs(node);
2083 return node;2045 return node;
2084}2046}
20852047
...@@ -2117,14 +2079,12 @@ static AstNode *ast_parse_fn_def(ParseContext *pc, size_t *token_index, bool man...@@ -2117,14 +2079,12 @@ static AstNode *ast_parse_fn_def(ParseContext *pc, size_t *token_index, bool man
2117 Token *semi_token = &pc->tokens->at(*token_index);2079 Token *semi_token = &pc->tokens->at(*token_index);
2118 if (semi_token->id == TokenIdSemicolon) {2080 if (semi_token->id == TokenIdSemicolon) {
2119 *token_index += 1;2081 *token_index += 1;
2120 normalize_parent_ptrs(fn_proto);
2121 return fn_proto;2082 return fn_proto;
2122 }2083 }
21232084
2124 AstNode *node = ast_create_node(pc, NodeTypeFnDef, first_token);2085 AstNode *node = ast_create_node(pc, NodeTypeFnDef, first_token);
2125 node->data.fn_def.fn_proto = fn_proto;2086 node->data.fn_def.fn_proto = fn_proto;
2126 node->data.fn_def.body = ast_parse_block(pc, token_index, true);2087 node->data.fn_def.body = ast_parse_block(pc, token_index, true);
2127 normalize_parent_ptrs(node);
2128 return node;2088 return node;
2129}2089}
21302090
...@@ -2148,7 +2108,6 @@ static AstNode *ast_parse_extern_decl(ParseContext *pc, size_t *token_index, boo...@@ -2148,7 +2108,6 @@ static AstNode *ast_parse_extern_decl(ParseContext *pc, size_t *token_index, boo
21482108
2149 fn_proto_node->data.fn_proto.is_extern = true;2109 fn_proto_node->data.fn_proto.is_extern = true;
21502110
2151 normalize_parent_ptrs(fn_proto_node);
2152 return fn_proto_node;2111 return fn_proto_node;
2153 }2112 }
21542113
...@@ -2158,7 +2117,6 @@ static AstNode *ast_parse_extern_decl(ParseContext *pc, size_t *token_index, boo...@@ -2158,7 +2117,6 @@ static AstNode *ast_parse_extern_decl(ParseContext *pc, size_t *token_index, boo
21582117
2159 var_decl_node->data.variable_declaration.is_extern = true;2118 var_decl_node->data.variable_declaration.is_extern = true;
21602119
2161 normalize_parent_ptrs(var_decl_node);
2162 return var_decl_node;2120 return var_decl_node;
2163 }2121 }
21642122
...@@ -2181,7 +2139,6 @@ static AstNode *ast_parse_use(ParseContext *pc, size_t *token_index, VisibMod vi...@@ -2181,7 +2139,6 @@ static AstNode *ast_parse_use(ParseContext *pc, size_t *token_index, VisibMod vi
21812139
2182 ast_eat_token(pc, token_index, TokenIdSemicolon);2140 ast_eat_token(pc, token_index, TokenIdSemicolon);
21832141
2184 normalize_parent_ptrs(node);
2185 return node;2142 return node;
2186}2143}
21872144
...@@ -2279,13 +2236,11 @@ static AstNode *ast_parse_container_decl(ParseContext *pc, size_t *token_index,...@@ -2279,13 +2236,11 @@ static AstNode *ast_parse_container_decl(ParseContext *pc, size_t *token_index,
2279 }2236 }
22802237
2281 node->data.struct_decl.fields.append(field_node);2238 node->data.struct_decl.fields.append(field_node);
2282 normalize_parent_ptrs(field_node);
2283 } else {2239 } else {
2284 ast_invalid_token_error(pc, token);2240 ast_invalid_token_error(pc, token);
2285 }2241 }
2286 }2242 }
22872243
2288 normalize_parent_ptrs(node);
2289 return node;2244 return node;
2290}2245}
22912246
...@@ -2307,7 +2262,6 @@ static AstNode *ast_parse_error_value_decl(ParseContext *pc, size_t *token_index...@@ -2307,7 +2262,6 @@ static AstNode *ast_parse_error_value_decl(ParseContext *pc, size_t *token_index
2307 node->data.error_value_decl.top_level_decl.visib_mod = visib_mod;2262 node->data.error_value_decl.top_level_decl.visib_mod = visib_mod;
2308 node->data.error_value_decl.name = token_buf(name_tok);2263 node->data.error_value_decl.name = token_buf(name_tok);
23092264
2310 normalize_parent_ptrs(node);
2311 return node;2265 return node;
2312}2266}
23132267
...@@ -2333,7 +2287,6 @@ static AstNode *ast_parse_type_decl(ParseContext *pc, size_t *token_index, Visib...@@ -2333,7 +2287,6 @@ static AstNode *ast_parse_type_decl(ParseContext *pc, size_t *token_index, Visib
23332287
2334 node->data.type_decl.top_level_decl.visib_mod = visib_mod;2288 node->data.type_decl.top_level_decl.visib_mod = visib_mod;
23352289
2336 normalize_parent_ptrs(node);
2337 return node;2290 return node;
2338}2291}
23392292
...@@ -2415,7 +2368,6 @@ static AstNode *ast_parse_root(ParseContext *pc, size_t *token_index) {...@@ -2415,7 +2368,6 @@ static AstNode *ast_parse_root(ParseContext *pc, size_t *token_index) {
2415 ast_invalid_token_error(pc, &pc->tokens->at(*token_index));2368 ast_invalid_token_error(pc, &pc->tokens->at(*token_index));
2416 }2369 }
24172370
2418 normalize_parent_ptrs(node);
2419 return node;2371 return node;
2420}2372}
24212373
...@@ -2630,264 +2582,3 @@ void ast_visit_node_children(AstNode *node, void (*visit)(AstNode **, void *cont...@@ -2630,264 +2582,3 @@ void ast_visit_node_children(AstNode *node, void (*visit)(AstNode **, void *cont
2630 break;2582 break;
2631 }2583 }
2632}2584}
2633
2634static void normalize_parent_ptrs_visit(AstNode **node, void *context) {
2635 (*node)->parent_field = node;
2636}
2637
2638void normalize_parent_ptrs(AstNode *node) {
2639 ast_visit_node_children(node, normalize_parent_ptrs_visit, nullptr);
2640}
2641
2642static void clone_subtree_list(ZigList<AstNode *> *dest, ZigList<AstNode *> *src, uint32_t *next_node_index) {
2643 memset(dest, 0, sizeof(ZigList<AstNode *>));
2644 dest->resize(src->length);
2645 for (size_t i = 0; i < src->length; i += 1) {
2646 dest->at(i) = ast_clone_subtree(src->at(i), next_node_index);
2647 dest->at(i)->parent_field = &dest->at(i);
2648 }
2649}
2650
2651static void clone_subtree_list_omit_inline_params(ZigList<AstNode *> *dest, ZigList<AstNode *> *src,
2652 uint32_t *next_node_index)
2653{
2654 memset(dest, 0, sizeof(ZigList<AstNode *>));
2655 dest->ensure_capacity(src->length);
2656 for (size_t i = 0; i < src->length; i += 1) {
2657 AstNode *src_node = src->at(i);
2658 assert(src_node->type == NodeTypeParamDecl);
2659 if (src_node->data.param_decl.is_inline) {
2660 continue;
2661 }
2662 dest->append(ast_clone_subtree(src_node, next_node_index));
2663 dest->last()->parent_field = &dest->last();
2664 }
2665}
2666
2667static void clone_subtree_field_special(AstNode **dest, AstNode *src, uint32_t *next_node_index,
2668 enum AstCloneSpecial special)
2669{
2670 if (src) {
2671 *dest = ast_clone_subtree_special(src, next_node_index, special);
2672 (*dest)->parent_field = dest;
2673 } else {
2674 *dest = nullptr;
2675 }
2676}
2677
2678static void clone_subtree_field(AstNode **dest, AstNode *src, uint32_t *next_node_index) {
2679 return clone_subtree_field_special(dest, src, next_node_index, AstCloneSpecialNone);
2680}
2681
2682AstNode *ast_clone_subtree_special(AstNode *old_node, uint32_t *next_node_index, enum AstCloneSpecial special) {
2683 AstNode *new_node = allocate_nonzero<AstNode>(1);
2684 safe_memcpy(new_node, old_node, 1);
2685 new_node->create_index = *next_node_index;
2686 *next_node_index += 1;
2687 new_node->parent_field = nullptr;
2688
2689 switch (new_node->type) {
2690 case NodeTypeRoot:
2691 clone_subtree_list(&new_node->data.root.top_level_decls,
2692 &old_node->data.root.top_level_decls, next_node_index);
2693 break;
2694 case NodeTypeFnProto:
2695 clone_subtree_field(&new_node->data.fn_proto.return_type, old_node->data.fn_proto.return_type,
2696 next_node_index);
2697
2698 if (special == AstCloneSpecialOmitInlineParams) {
2699 clone_subtree_list_omit_inline_params(&new_node->data.fn_proto.params, &old_node->data.fn_proto.params,
2700 next_node_index);
2701 } else {
2702 clone_subtree_list(&new_node->data.fn_proto.params, &old_node->data.fn_proto.params,
2703 next_node_index);
2704 }
2705
2706 break;
2707 case NodeTypeFnDef:
2708 clone_subtree_field_special(&new_node->data.fn_def.fn_proto, old_node->data.fn_def.fn_proto,
2709 next_node_index, special);
2710 new_node->data.fn_def.fn_proto->data.fn_proto.fn_def_node = new_node;
2711 clone_subtree_field(&new_node->data.fn_def.body, old_node->data.fn_def.body, next_node_index);
2712 break;
2713 case NodeTypeFnDecl:
2714 clone_subtree_field(&new_node->data.fn_decl.fn_proto, old_node->data.fn_decl.fn_proto,
2715 next_node_index);
2716 break;
2717 case NodeTypeParamDecl:
2718 clone_subtree_field(&new_node->data.param_decl.type, old_node->data.param_decl.type, next_node_index);
2719 break;
2720 case NodeTypeBlock:
2721 clone_subtree_list(&new_node->data.block.statements, &old_node->data.block.statements,
2722 next_node_index);
2723 break;
2724 case NodeTypeReturnExpr:
2725 clone_subtree_field(&new_node->data.return_expr.expr, old_node->data.return_expr.expr, next_node_index);
2726 break;
2727 case NodeTypeDefer:
2728 clone_subtree_field(&new_node->data.defer.expr, old_node->data.defer.expr, next_node_index);
2729 break;
2730 case NodeTypeVariableDeclaration:
2731 clone_subtree_field(&new_node->data.variable_declaration.type, old_node->data.variable_declaration.type, next_node_index);
2732 clone_subtree_field(&new_node->data.variable_declaration.expr, old_node->data.variable_declaration.expr, next_node_index);
2733 break;
2734 case NodeTypeTypeDecl:
2735 clone_subtree_field(&new_node->data.type_decl.child_type, old_node->data.type_decl.child_type, next_node_index);
2736 break;
2737 case NodeTypeErrorValueDecl:
2738 // none
2739 break;
2740 case NodeTypeBinOpExpr:
2741 clone_subtree_field(&new_node->data.bin_op_expr.op1, old_node->data.bin_op_expr.op1, next_node_index);
2742 clone_subtree_field(&new_node->data.bin_op_expr.op2, old_node->data.bin_op_expr.op2, next_node_index);
2743 break;
2744 case NodeTypeUnwrapErrorExpr:
2745 clone_subtree_field(&new_node->data.unwrap_err_expr.op1, old_node->data.unwrap_err_expr.op1, next_node_index);
2746 clone_subtree_field(&new_node->data.unwrap_err_expr.symbol, old_node->data.unwrap_err_expr.symbol, next_node_index);
2747 clone_subtree_field(&new_node->data.unwrap_err_expr.op2, old_node->data.unwrap_err_expr.op2, next_node_index);
2748 break;
2749 case NodeTypeNumberLiteral:
2750 // none
2751 break;
2752 case NodeTypeStringLiteral:
2753 // none
2754 break;
2755 case NodeTypeCharLiteral:
2756 // none
2757 break;
2758 case NodeTypeSymbol:
2759 // none
2760 break;
2761 case NodeTypePrefixOpExpr:
2762 clone_subtree_field(&new_node->data.prefix_op_expr.primary_expr,
2763 old_node->data.prefix_op_expr.primary_expr, next_node_index);
2764 break;
2765 case NodeTypeFnCallExpr:
2766 clone_subtree_field(&new_node->data.fn_call_expr.fn_ref_expr,
2767 old_node->data.fn_call_expr.fn_ref_expr, next_node_index);
2768 clone_subtree_list(&new_node->data.fn_call_expr.params,
2769 &old_node->data.fn_call_expr.params, next_node_index);
2770 break;
2771 case NodeTypeArrayAccessExpr:
2772 clone_subtree_field(&new_node->data.array_access_expr.array_ref_expr,
2773 old_node->data.array_access_expr.array_ref_expr, next_node_index);
2774 clone_subtree_field(&new_node->data.array_access_expr.subscript,
2775 old_node->data.array_access_expr.subscript, next_node_index);
2776 break;
2777 case NodeTypeSliceExpr:
2778 clone_subtree_field(&new_node->data.slice_expr.array_ref_expr, old_node->data.slice_expr.array_ref_expr, next_node_index);
2779 clone_subtree_field(&new_node->data.slice_expr.start, old_node->data.slice_expr.start, next_node_index);
2780 clone_subtree_field(&new_node->data.slice_expr.end, old_node->data.slice_expr.end, next_node_index);
2781 break;
2782 case NodeTypeFieldAccessExpr:
2783 clone_subtree_field(&new_node->data.field_access_expr.struct_expr, old_node->data.field_access_expr.struct_expr, next_node_index);
2784 break;
2785 case NodeTypeUse:
2786 clone_subtree_field(&new_node->data.use.expr, old_node->data.use.expr, next_node_index);
2787 break;
2788 case NodeTypeBoolLiteral:
2789 // none
2790 break;
2791 case NodeTypeNullLiteral:
2792 // none
2793 break;
2794 case NodeTypeUndefinedLiteral:
2795 // none
2796 break;
2797 case NodeTypeZeroesLiteral:
2798 // none
2799 break;
2800 case NodeTypeThisLiteral:
2801 // none
2802 break;
2803 case NodeTypeIfBoolExpr:
2804 clone_subtree_field(&new_node->data.if_bool_expr.condition, old_node->data.if_bool_expr.condition, next_node_index);
2805 clone_subtree_field(&new_node->data.if_bool_expr.then_block, old_node->data.if_bool_expr.then_block, next_node_index);
2806 clone_subtree_field(&new_node->data.if_bool_expr.else_node, old_node->data.if_bool_expr.else_node, next_node_index);
2807 break;
2808 case NodeTypeIfVarExpr:
2809 clone_subtree_field(&new_node->data.if_var_expr.var_decl.type, old_node->data.if_var_expr.var_decl.type, next_node_index);
2810 clone_subtree_field(&new_node->data.if_var_expr.var_decl.expr, old_node->data.if_var_expr.var_decl.expr, next_node_index);
2811 clone_subtree_field(&new_node->data.if_var_expr.then_block, old_node->data.if_var_expr.then_block, next_node_index);
2812 clone_subtree_field(&new_node->data.if_var_expr.else_node, old_node->data.if_var_expr.else_node, next_node_index);
2813 break;
2814 case NodeTypeWhileExpr:
2815 clone_subtree_field(&new_node->data.while_expr.condition, old_node->data.while_expr.condition, next_node_index);
2816 clone_subtree_field(&new_node->data.while_expr.body, old_node->data.while_expr.body, next_node_index);
2817 clone_subtree_field(&new_node->data.while_expr.continue_expr,
2818 old_node->data.while_expr.continue_expr, next_node_index);
2819 break;
2820 case NodeTypeForExpr:
2821 clone_subtree_field(&new_node->data.for_expr.elem_node, old_node->data.for_expr.elem_node, next_node_index);
2822 clone_subtree_field(&new_node->data.for_expr.array_expr, old_node->data.for_expr.array_expr, next_node_index);
2823 clone_subtree_field(&new_node->data.for_expr.index_node, old_node->data.for_expr.index_node, next_node_index);
2824 clone_subtree_field(&new_node->data.for_expr.body, old_node->data.for_expr.body, next_node_index);
2825 break;
2826 case NodeTypeSwitchExpr:
2827 clone_subtree_field(&new_node->data.switch_expr.expr, old_node->data.switch_expr.expr, next_node_index);
2828 clone_subtree_list(&new_node->data.switch_expr.prongs, &old_node->data.switch_expr.prongs,
2829 next_node_index);
2830 break;
2831 case NodeTypeSwitchProng:
2832 clone_subtree_list(&new_node->data.switch_prong.items, &old_node->data.switch_prong.items,
2833 next_node_index);
2834 clone_subtree_field(&new_node->data.switch_prong.var_symbol, old_node->data.switch_prong.var_symbol, next_node_index);
2835 clone_subtree_field(&new_node->data.switch_prong.expr, old_node->data.switch_prong.expr, next_node_index);
2836 break;
2837 case NodeTypeSwitchRange:
2838 clone_subtree_field(&new_node->data.switch_range.start, old_node->data.switch_range.start, next_node_index);
2839 clone_subtree_field(&new_node->data.switch_range.end, old_node->data.switch_range.end, next_node_index);
2840 break;
2841 case NodeTypeLabel:
2842 // none
2843 break;
2844 case NodeTypeGoto:
2845 // none
2846 break;
2847 case NodeTypeBreak:
2848 // none
2849 break;
2850 case NodeTypeContinue:
2851 // none
2852 break;
2853 case NodeTypeAsmExpr:
2854 zig_panic("TODO");
2855 break;
2856 case NodeTypeContainerDecl:
2857 clone_subtree_list(&new_node->data.struct_decl.fields, &old_node->data.struct_decl.fields,
2858 next_node_index);
2859 clone_subtree_list(&new_node->data.struct_decl.decls, &old_node->data.struct_decl.decls,
2860 next_node_index);
2861 break;
2862 case NodeTypeStructField:
2863 clone_subtree_field(&new_node->data.struct_field.type, old_node->data.struct_field.type, next_node_index);
2864 break;
2865 case NodeTypeContainerInitExpr:
2866 clone_subtree_field(&new_node->data.container_init_expr.type, old_node->data.container_init_expr.type, next_node_index);
2867 clone_subtree_list(&new_node->data.container_init_expr.entries,
2868 &old_node->data.container_init_expr.entries, next_node_index);
2869 break;
2870 case NodeTypeStructValueField:
2871 clone_subtree_field(&new_node->data.struct_val_field.expr, old_node->data.struct_val_field.expr, next_node_index);
2872 break;
2873 case NodeTypeArrayType:
2874 clone_subtree_field(&new_node->data.array_type.size, old_node->data.array_type.size, next_node_index);
2875 clone_subtree_field(&new_node->data.array_type.child_type, old_node->data.array_type.child_type, next_node_index);
2876 break;
2877 case NodeTypeErrorType:
2878 // none
2879 break;
2880 case NodeTypeTypeLiteral:
2881 // none
2882 break;
2883 case NodeTypeVarLiteral:
2884 // none
2885 break;
2886 }
2887
2888 return new_node;
2889}
2890
2891AstNode *ast_clone_subtree(AstNode *old_node, uint32_t *next_node_index) {
2892 return ast_clone_subtree_special(old_node, next_node_index, AstCloneSpecialNone);
2893}
src/parser.hpp-10
...@@ -22,16 +22,6 @@ AstNode * ast_parse(Buf *buf, ZigList<Token> *tokens, ImportTableEntry *owner, E...@@ -22,16 +22,6 @@ AstNode * ast_parse(Buf *buf, ZigList<Token> *tokens, ImportTableEntry *owner, E
2222
23void ast_print(AstNode *node, int indent);23void ast_print(AstNode *node, int indent);
2424
25void normalize_parent_ptrs(AstNode *node);
26
27AstNode *ast_clone_subtree(AstNode *node, uint32_t *next_node_index);
28
29enum AstCloneSpecial {
30 AstCloneSpecialNone,
31 AstCloneSpecialOmitInlineParams,
32};
33AstNode *ast_clone_subtree_special(AstNode *node, uint32_t *next_node_index, enum AstCloneSpecial special);
34
35void ast_visit_node_children(AstNode *node, void (*visit)(AstNode **, void *context), void *context);25void ast_visit_node_children(AstNode *node, void (*visit)(AstNode **, void *context), void *context);
3626
37#endif27#endif