| ... | ... | @@ -281,7 +281,6 @@ static AstNode *ast_parse_param_decl(ParseContext *pc, size_t *token_index) { |
| 281 | 281 | |
| 282 | 282 | node->data.param_decl.type = ast_parse_type_expr(pc, token_index, true); |
| 283 | 283 | |
| 284 | | normalize_parent_ptrs(node); |
| 285 | 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 | 395 | |
| 397 | 396 | node->data.array_type.child_type = ast_parse_type_expr(pc, token_index, true); |
| 398 | 397 | |
| 399 | | normalize_parent_ptrs(node); |
| 400 | 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 | 578 | |
| 581 | 579 | ast_eat_token(pc, token_index, TokenIdRParen); |
| 582 | 580 | |
| 583 | | normalize_parent_ptrs(node); |
| 584 | 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 | 664 | ast_parse_fn_call_param_list(pc, token_index, &node->data.fn_call_expr.params); |
| 668 | 665 | node->data.fn_call_expr.is_builtin = true; |
| 669 | 666 | |
| 670 | | normalize_parent_ptrs(node); |
| 671 | 667 | return node; |
| 672 | 668 | } else if (token->id == TokenIdSymbol) { |
| 673 | 669 | *token_index += 1; |
| ... | ... | @@ -750,7 +746,6 @@ static AstNode *ast_parse_curly_suffix_expr(ParseContext *pc, size_t *token_inde |
| 750 | 746 | field_node->data.struct_val_field.name = token_buf(field_name_tok); |
| 751 | 747 | field_node->data.struct_val_field.expr = ast_parse_expression(pc, token_index, true); |
| 752 | 748 | |
| 753 | | normalize_parent_ptrs(field_node); |
| 754 | 749 | node->data.container_init_expr.entries.append(field_node); |
| 755 | 750 | |
| 756 | 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 | 792 | } |
| 798 | 793 | } |
| 799 | 794 | |
| 800 | | normalize_parent_ptrs(node); |
| 801 | 795 | prefix_op_expr = node; |
| 802 | 796 | } else { |
| 803 | 797 | return prefix_op_expr; |
| ... | ... | @@ -828,7 +822,6 @@ static AstNode *ast_parse_suffix_op_expr(ParseContext *pc, size_t *token_index, |
| 828 | 822 | node->data.fn_call_expr.fn_ref_expr = primary_expr; |
| 829 | 823 | ast_parse_fn_call_param_list(pc, token_index, &node->data.fn_call_expr.params); |
| 830 | 824 | |
| 831 | | normalize_parent_ptrs(node); |
| 832 | 825 | primary_expr = node; |
| 833 | 826 | } else if (first_token->id == TokenIdLBracket) { |
| 834 | 827 | *token_index += 1; |
| ... | ... | @@ -853,7 +846,6 @@ static AstNode *ast_parse_suffix_op_expr(ParseContext *pc, size_t *token_index, |
| 853 | 846 | node->data.slice_expr.is_const = true; |
| 854 | 847 | } |
| 855 | 848 | |
| 856 | | normalize_parent_ptrs(node); |
| 857 | 849 | primary_expr = node; |
| 858 | 850 | } else if (ellipsis_or_r_bracket->id == TokenIdRBracket) { |
| 859 | 851 | *token_index += 1; |
| ... | ... | @@ -862,7 +854,6 @@ static AstNode *ast_parse_suffix_op_expr(ParseContext *pc, size_t *token_index, |
| 862 | 854 | node->data.array_access_expr.array_ref_expr = primary_expr; |
| 863 | 855 | node->data.array_access_expr.subscript = expr_node; |
| 864 | 856 | |
| 865 | | normalize_parent_ptrs(node); |
| 866 | 857 | primary_expr = node; |
| 867 | 858 | } else { |
| 868 | 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 | 867 | node->data.field_access_expr.struct_expr = primary_expr; |
| 877 | 868 | node->data.field_access_expr.field_name = token_buf(name_token); |
| 878 | 869 | |
| 879 | | normalize_parent_ptrs(node); |
| 880 | 870 | primary_expr = node; |
| 881 | 871 | } else { |
| 882 | 872 | return primary_expr; |
| ... | ... | @@ -955,8 +945,6 @@ static AstNode *ast_parse_prefix_op_expr(ParseContext *pc, size_t *token_index, |
| 955 | 945 | node->data.prefix_op_expr.primary_expr = prefix_op_expr; |
| 956 | 946 | node->data.prefix_op_expr.prefix_op = prefix_op; |
| 957 | 947 | |
| 958 | | normalize_parent_ptrs(node); |
| 959 | | normalize_parent_ptrs(parent_node); |
| 960 | 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 | 998 | node->data.bin_op_expr.bin_op = mult_op; |
| 1011 | 999 | node->data.bin_op_expr.op2 = operand_2; |
| 1012 | 1000 | |
| 1013 | | normalize_parent_ptrs(node); |
| 1014 | 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 | 1051 | node->data.bin_op_expr.bin_op = add_op; |
| 1065 | 1052 | node->data.bin_op_expr.op2 = operand_2; |
| 1066 | 1053 | |
| 1067 | | normalize_parent_ptrs(node); |
| 1068 | 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 | 1102 | node->data.bin_op_expr.bin_op = bit_shift_op; |
| 1117 | 1103 | node->data.bin_op_expr.op2 = operand_2; |
| 1118 | 1104 | |
| 1119 | | normalize_parent_ptrs(node); |
| 1120 | 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 | 1128 | node->data.bin_op_expr.bin_op = BinOpTypeBinAnd; |
| 1144 | 1129 | node->data.bin_op_expr.op2 = operand_2; |
| 1145 | 1130 | |
| 1146 | | normalize_parent_ptrs(node); |
| 1147 | 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 | 1153 | node->data.bin_op_expr.bin_op = BinOpTypeBinXor; |
| 1170 | 1154 | node->data.bin_op_expr.op2 = operand_2; |
| 1171 | 1155 | |
| 1172 | | normalize_parent_ptrs(node); |
| 1173 | 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 | 1178 | node->data.bin_op_expr.bin_op = BinOpTypeBinOr; |
| 1196 | 1179 | node->data.bin_op_expr.op2 = operand_2; |
| 1197 | 1180 | |
| 1198 | | normalize_parent_ptrs(node); |
| 1199 | 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 | 1228 | node->data.bin_op_expr.bin_op = cmp_op; |
| 1247 | 1229 | node->data.bin_op_expr.op2 = operand_2; |
| 1248 | 1230 | |
| 1249 | | normalize_parent_ptrs(node); |
| 1250 | 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 | 1252 | node->data.bin_op_expr.bin_op = BinOpTypeBoolAnd; |
| 1272 | 1253 | node->data.bin_op_expr.op2 = operand_2; |
| 1273 | 1254 | |
| 1274 | | normalize_parent_ptrs(node); |
| 1275 | 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 | 1329 | node->data.if_var_expr.then_block = ast_parse_expression(pc, token_index, true); |
| 1350 | 1330 | node->data.if_var_expr.else_node = ast_parse_else(pc, token_index, false); |
| 1351 | 1331 | |
| 1352 | | normalize_parent_ptrs(node); |
| 1353 | 1332 | return node; |
| 1354 | 1333 | } else { |
| 1355 | 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 | 1337 | node->data.if_bool_expr.then_block = ast_parse_expression(pc, token_index, true); |
| 1359 | 1338 | node->data.if_bool_expr.else_node = ast_parse_else(pc, token_index, false); |
| 1360 | 1339 | |
| 1361 | | normalize_parent_ptrs(node); |
| 1362 | 1340 | return node; |
| 1363 | 1341 | } |
| 1364 | 1342 | } |
| ... | ... | @@ -1402,7 +1380,6 @@ static AstNode *ast_parse_return_expr(ParseContext *pc, size_t *token_index) { |
| 1402 | 1380 | node->data.return_expr.kind = kind; |
| 1403 | 1381 | node->data.return_expr.expr = ast_parse_expression(pc, token_index, false); |
| 1404 | 1382 | |
| 1405 | | normalize_parent_ptrs(node); |
| 1406 | 1383 | return node; |
| 1407 | 1384 | } |
| 1408 | 1385 | |
| ... | ... | @@ -1445,7 +1422,6 @@ static AstNode *ast_parse_defer_expr(ParseContext *pc, size_t *token_index) { |
| 1445 | 1422 | node->data.defer.kind = kind; |
| 1446 | 1423 | node->data.defer.expr = ast_parse_expression(pc, token_index, false); |
| 1447 | 1424 | |
| 1448 | | normalize_parent_ptrs(node); |
| 1449 | 1425 | return node; |
| 1450 | 1426 | } |
| 1451 | 1427 | |
| ... | ... | @@ -1505,7 +1481,6 @@ static AstNode *ast_parse_variable_declaration_expr(ParseContext *pc, size_t *to |
| 1505 | 1481 | if (eq_or_colon->id == TokenIdEq) { |
| 1506 | 1482 | node->data.variable_declaration.expr = ast_parse_expression(pc, token_index, true); |
| 1507 | 1483 | |
| 1508 | | normalize_parent_ptrs(node); |
| 1509 | 1484 | return node; |
| 1510 | 1485 | } else if (eq_or_colon->id == TokenIdColon) { |
| 1511 | 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 | 1491 | node->data.variable_declaration.expr = ast_parse_expression(pc, token_index, true); |
| 1517 | 1492 | } |
| 1518 | 1493 | |
| 1519 | | normalize_parent_ptrs(node); |
| 1520 | 1494 | return node; |
| 1521 | 1495 | } else { |
| 1522 | 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 | 1518 | node->data.bin_op_expr.bin_op = BinOpTypeBoolOr; |
| 1545 | 1519 | node->data.bin_op_expr.op2 = operand_2; |
| 1546 | 1520 | |
| 1547 | | normalize_parent_ptrs(node); |
| 1548 | 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 | 1569 | } |
| 1597 | 1570 | |
| 1598 | 1571 | |
| 1599 | | normalize_parent_ptrs(node); |
| 1600 | 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 | 1638 | |
| 1667 | 1639 | node->data.for_expr.body = ast_parse_expression(pc, token_index, true); |
| 1668 | 1640 | |
| 1669 | | normalize_parent_ptrs(node); |
| 1670 | 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 | 1671 | if (token->id == TokenIdRBrace) { |
| 1701 | 1672 | *token_index += 1; |
| 1702 | 1673 | |
| 1703 | | normalize_parent_ptrs(node); |
| 1704 | 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 | 1691 | range_node->data.switch_range.start = expr1; |
| 1722 | 1692 | range_node->data.switch_range.end = ast_parse_expression(pc, token_index, true); |
| 1723 | 1693 | |
| 1724 | | normalize_parent_ptrs(range_node); |
| 1725 | 1694 | } else { |
| 1726 | 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 | 1714 | prong_node->data.switch_prong.expr = ast_parse_expression(pc, token_index, true); |
| 1746 | 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 | 1811 | node->data.bin_op_expr.bin_op = BinOpTypeUnwrapMaybe; |
| 1844 | 1812 | node->data.bin_op_expr.op2 = rhs; |
| 1845 | 1813 | |
| 1846 | | normalize_parent_ptrs(node); |
| 1847 | 1814 | return node; |
| 1848 | 1815 | } else if (token->id == TokenIdPercentPercent) { |
| 1849 | 1816 | *token_index += 1; |
| ... | ... | @@ -1859,7 +1826,6 @@ static AstNode *ast_parse_unwrap_expr(ParseContext *pc, size_t *token_index, boo |
| 1859 | 1826 | } |
| 1860 | 1827 | node->data.unwrap_err_expr.op2 = ast_parse_expression(pc, token_index, true); |
| 1861 | 1828 | |
| 1862 | | normalize_parent_ptrs(node); |
| 1863 | 1829 | return node; |
| 1864 | 1830 | } else { |
| 1865 | 1831 | return lhs; |
| ... | ... | @@ -1886,7 +1852,6 @@ static AstNode *ast_parse_ass_expr(ParseContext *pc, size_t *token_index, bool m |
| 1886 | 1852 | node->data.bin_op_expr.bin_op = ass_op; |
| 1887 | 1853 | node->data.bin_op_expr.op2 = rhs; |
| 1888 | 1854 | |
| 1889 | | normalize_parent_ptrs(node); |
| 1890 | 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 | 1926 | |
| 1962 | 1927 | static AstNode *ast_create_void_expr(ParseContext *pc, Token *token) { |
| 1963 | 1928 | AstNode *node = ast_create_node(pc, NodeTypeBlock, token); |
| 1964 | | normalize_parent_ptrs(node); |
| 1965 | 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 | 1981 | if (last_token->id == TokenIdRBrace) { |
| 2018 | 1982 | *token_index += 1; |
| 2019 | 1983 | |
| 2020 | | normalize_parent_ptrs(node); |
| 2021 | 1984 | return node; |
| 2022 | 1985 | } else if (!semicolon_expected) { |
| 2023 | 1986 | continue; |
| ... | ... | @@ -2079,7 +2042,6 @@ static AstNode *ast_parse_fn_proto(ParseContext *pc, size_t *token_index, bool m |
| 2079 | 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 | 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 | 2079 | Token *semi_token = &pc->tokens->at(*token_index); |
| 2118 | 2080 | if (semi_token->id == TokenIdSemicolon) { |
| 2119 | 2081 | *token_index += 1; |
| 2120 | | normalize_parent_ptrs(fn_proto); |
| 2121 | 2082 | return fn_proto; |
| 2122 | 2083 | } |
| 2123 | 2084 | |
| 2124 | 2085 | AstNode *node = ast_create_node(pc, NodeTypeFnDef, first_token); |
| 2125 | 2086 | node->data.fn_def.fn_proto = fn_proto; |
| 2126 | 2087 | node->data.fn_def.body = ast_parse_block(pc, token_index, true); |
| 2127 | | normalize_parent_ptrs(node); |
| 2128 | 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 | 2108 | |
| 2149 | 2109 | fn_proto_node->data.fn_proto.is_extern = true; |
| 2150 | 2110 | |
| 2151 | | normalize_parent_ptrs(fn_proto_node); |
| 2152 | 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 | 2117 | |
| 2159 | 2118 | var_decl_node->data.variable_declaration.is_extern = true; |
| 2160 | 2119 | |
| 2161 | | normalize_parent_ptrs(var_decl_node); |
| 2162 | 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 | 2139 | |
| 2182 | 2140 | ast_eat_token(pc, token_index, TokenIdSemicolon); |
| 2183 | 2141 | |
| 2184 | | normalize_parent_ptrs(node); |
| 2185 | 2142 | return node; |
| 2186 | 2143 | } |
| 2187 | 2144 | |
| ... | ... | @@ -2279,13 +2236,11 @@ static AstNode *ast_parse_container_decl(ParseContext *pc, size_t *token_index, |
| 2279 | 2236 | } |
| 2280 | 2237 | |
| 2281 | 2238 | node->data.struct_decl.fields.append(field_node); |
| 2282 | | normalize_parent_ptrs(field_node); |
| 2283 | 2239 | } else { |
| 2284 | 2240 | ast_invalid_token_error(pc, token); |
| 2285 | 2241 | } |
| 2286 | 2242 | } |
| 2287 | 2243 | |
| 2288 | | normalize_parent_ptrs(node); |
| 2289 | 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 | 2262 | node->data.error_value_decl.top_level_decl.visib_mod = visib_mod; |
| 2308 | 2263 | node->data.error_value_decl.name = token_buf(name_tok); |
| 2309 | 2264 | |
| 2310 | | normalize_parent_ptrs(node); |
| 2311 | 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 | 2287 | |
| 2334 | 2288 | node->data.type_decl.top_level_decl.visib_mod = visib_mod; |
| 2335 | 2289 | |
| 2336 | | normalize_parent_ptrs(node); |
| 2337 | 2290 | return node; |
| 2338 | 2291 | } |
| 2339 | 2292 | |
| ... | ... | @@ -2415,7 +2368,6 @@ static AstNode *ast_parse_root(ParseContext *pc, size_t *token_index) { |
| 2415 | 2368 | ast_invalid_token_error(pc, &pc->tokens->at(*token_index)); |
| 2416 | 2369 | } |
| 2417 | 2370 | |
| 2418 | | normalize_parent_ptrs(node); |
| 2419 | 2371 | return node; |
| 2420 | 2372 | } |
| 2421 | 2373 | |
| ... | ... | @@ -2630,264 +2582,3 @@ void ast_visit_node_children(AstNode *node, void (*visit)(AstNode **, void *cont |
| 2630 | 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 | | } |