| ... | @@ -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) { |
| 281 | | 281 | |
| 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); |
| 283 | | 283 | |
| 284 | normalize_parent_ptrs(node); | | |
| 285 | return node; | 284 | return node; |
| 286 | } | 285 | } |
| 287 | | 286 | |
| ... | @@ -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, |
| 396 | | 395 | |
| 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); |
| 398 | | 397 | |
| 399 | normalize_parent_ptrs(node); | | |
| 400 | return node; | 398 | return node; |
| 401 | } | 399 | } |
| 402 | | 400 | |
| ... | @@ -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 |
| 580 | | 578 | |
| 581 | ast_eat_token(pc, token_index, TokenIdRParen); | 579 | ast_eat_token(pc, token_index, TokenIdRParen); |
| 582 | | 580 | |
| 583 | normalize_parent_ptrs(node); | | |
| 584 | return node; | 581 | return node; |
| 585 | } | 582 | } |
| 586 | | 583 | |
| ... | @@ -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; |
| 669 | | 666 | |
| 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); |
| 752 | | 748 | |
| 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); |
| 755 | | 750 | |
| 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 | } |
| 799 | | 794 | |
| 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); |
| 830 | | 824 | |
| 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 | } |
| 855 | | 848 | |
| 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; |
| 864 | | 856 | |
| 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); |
| 878 | | 869 | |
| 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; |
| 957 | | 947 | |
| 958 | normalize_parent_ptrs(node); | | |
| 959 | normalize_parent_ptrs(parent_node); | | |
| 960 | return parent_node; | 948 | return parent_node; |
| 961 | } | 949 | } |
| 962 | | 950 | |
| ... | @@ -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; |
| 1012 | | 1000 | |
| 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; |
| 1066 | | 1053 | |
| 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; |
| 1118 | | 1104 | |
| 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; |
| 1145 | | 1130 | |
| 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; |
| 1171 | | 1155 | |
| 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; |
| 1197 | | 1180 | |
| 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; |
| 1248 | | 1230 | |
| 1249 | normalize_parent_ptrs(node); | | |
| 1250 | return node; | 1231 | return node; |
| 1251 | } | 1232 | } |
| 1252 | | 1233 | |
| ... | @@ -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; |
| 1273 | | 1254 | |
| 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); |
| 1351 | | 1331 | |
| 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); |
| 1360 | | 1339 | |
| 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); |
| 1404 | | 1382 | |
| 1405 | normalize_parent_ptrs(node); | | |
| 1406 | return node; | 1383 | return node; |
| 1407 | } | 1384 | } |
| 1408 | | 1385 | |
| ... | @@ -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); |
| 1447 | | 1424 | |
| 1448 | normalize_parent_ptrs(node); | | |
| 1449 | return node; | 1425 | return node; |
| 1450 | } | 1426 | } |
| 1451 | | 1427 | |
| ... | @@ -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); |
| 1507 | | 1483 | |
| 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 | } |
| 1518 | | 1493 | |
| 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; |
| 1546 | | 1520 | |
| 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 | } |
| 1597 | | 1570 | |
| 1598 | | 1571 | |
| 1599 | normalize_parent_ptrs(node); | | |
| 1600 | return node; | 1572 | return node; |
| 1601 | } | 1573 | } |
| 1602 | | 1574 | |
| ... | @@ -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 |
| 1666 | | 1638 | |
| 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); |
| 1668 | | 1640 | |
| 1669 | normalize_parent_ptrs(node); | | |
| 1670 | return node; | 1641 | return node; |
| 1671 | } | 1642 | } |
| 1672 | | 1643 | |
| ... | @@ -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; |
| 1702 | | 1673 | |
| 1703 | normalize_parent_ptrs(node); | | |
| 1704 | return node; | 1674 | return node; |
| 1705 | } | 1675 | } |
| 1706 | | 1676 | |
| ... | @@ -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); |
| 1723 | | 1693 | |
| 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); |
| 1747 | | 1716 | |
| 1748 | normalize_parent_ptrs(prong_node); | | |
| 1749 | } | 1717 | } |
| 1750 | } | 1718 | } |
| 1751 | | 1719 | |
| ... | @@ -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; |
| 1845 | | 1813 | |
| 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); |
| 1861 | | 1828 | |
| 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; |
| 1888 | | 1854 | |
| 1889 | normalize_parent_ptrs(node); | | |
| 1890 | return node; | 1855 | return node; |
| 1891 | } | 1856 | } |
| 1892 | | 1857 | |
| ... | @@ -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 |
| 1961 | | 1926 | |
| 1962 | static AstNode *ast_create_void_expr(ParseContext *pc, Token *token) { | 1927 | static 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 | } |
| 1967 | | 1931 | |
| ... | @@ -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; |
| 2019 | | 1983 | |
| 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 | } |
| 2081 | | 2044 | |
| 2082 | normalize_parent_ptrs(node); | | |
| 2083 | return node; | 2045 | return node; |
| 2084 | } | 2046 | } |
| 2085 | | 2047 | |
| ... | @@ -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 | } |
| 2123 | | 2084 | |
| 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 | } |
| 2130 | | 2090 | |
| ... | @@ -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 |
| 2148 | | 2108 | |
| 2149 | fn_proto_node->data.fn_proto.is_extern = true; | 2109 | fn_proto_node->data.fn_proto.is_extern = true; |
| 2150 | | 2110 | |
| 2151 | normalize_parent_ptrs(fn_proto_node); | | |
| 2152 | return fn_proto_node; | 2111 | return fn_proto_node; |
| 2153 | } | 2112 | } |
| 2154 | | 2113 | |
| ... | @@ -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 |
| 2158 | | 2117 | |
| 2159 | var_decl_node->data.variable_declaration.is_extern = true; | 2118 | var_decl_node->data.variable_declaration.is_extern = true; |
| 2160 | | 2119 | |
| 2161 | normalize_parent_ptrs(var_decl_node); | | |
| 2162 | return var_decl_node; | 2120 | return var_decl_node; |
| 2163 | } | 2121 | } |
| 2164 | | 2122 | |
| ... | @@ -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 |
| 2181 | | 2139 | |
| 2182 | ast_eat_token(pc, token_index, TokenIdSemicolon); | 2140 | ast_eat_token(pc, token_index, TokenIdSemicolon); |
| 2183 | | 2141 | |
| 2184 | normalize_parent_ptrs(node); | | |
| 2185 | return node; | 2142 | return node; |
| 2186 | } | 2143 | } |
| 2187 | | 2144 | |
| ... | @@ -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 | } |
| 2280 | | 2237 | |
| 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 | } |
| 2287 | | 2243 | |
| 2288 | normalize_parent_ptrs(node); | | |
| 2289 | return node; | 2244 | return node; |
| 2290 | } | 2245 | } |
| 2291 | | 2246 | |
| ... | @@ -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); |
| 2309 | | 2264 | |
| 2310 | normalize_parent_ptrs(node); | | |
| 2311 | return node; | 2265 | return node; |
| 2312 | } | 2266 | } |
| 2313 | | 2267 | |
| ... | @@ -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 |
| 2333 | | 2287 | |
| 2334 | node->data.type_decl.top_level_decl.visib_mod = visib_mod; | 2288 | node->data.type_decl.top_level_decl.visib_mod = visib_mod; |
| 2335 | | 2289 | |
| 2336 | normalize_parent_ptrs(node); | | |
| 2337 | return node; | 2290 | return node; |
| 2338 | } | 2291 | } |
| 2339 | | 2292 | |
| ... | @@ -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 | } |
| 2417 | | 2370 | |
| 2418 | normalize_parent_ptrs(node); | | |
| 2419 | return node; | 2371 | return node; |
| 2420 | } | 2372 | } |
| 2421 | | 2373 | |
| ... | @@ -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 | | | |
| 2634 | static void normalize_parent_ptrs_visit(AstNode **node, void *context) { | | |
| 2635 | (*node)->parent_field = node; | | |
| 2636 | } | | |
| 2637 | | | |
| 2638 | void normalize_parent_ptrs(AstNode *node) { | | |
| 2639 | ast_visit_node_children(node, normalize_parent_ptrs_visit, nullptr); | | |
| 2640 | } | | |
| 2641 | | | |
| 2642 | static 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 | | | |
| 2651 | static 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 | | | |
| 2667 | static 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 | | | |
| 2678 | static 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 | | | |
| 2682 | AstNode *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 | | | |
| 2891 | AstNode *ast_clone_subtree(AstNode *old_node, uint32_t *next_node_index) { | | |
| 2892 | return ast_clone_subtree_special(old_node, next_node_index, AstCloneSpecialNone); | | |
| 2893 | } | | |