authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2025-05-18 12:47:16-07:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2025-05-18 12:47:16-07:00
log1884ad0ea37fcb01f763987a930715ba6ab737c7
tree9107e949916a914016777822c73dca67d95c7346
parent8e72a25285b5e782ee44828b6d1904d91fb16a29

wip


12 files changed, 803 insertions(+), 802 deletions(-)

lib/std/zig/Ast.zig+364-364
......@@ -83,18 +83,6 @@ pub fn tokenStart(tree: *const Ast, token_index: TokenIndex) ByteOffset {
8383 return tree.tokens.items(.start)[token_index];
8484}
8585
86pub fn nodeTag(tree: *const Ast, node: Node.Index) Node.Tag {
87 return tree.nodes.items(.tag)[@intFromEnum(node)];
88}
89
90pub fn nodeMainToken(tree: *const Ast, node: Node.Index) TokenIndex {
91 return tree.nodes.items(.main_token)[@intFromEnum(node)];
92}
93
94pub fn nodeData(tree: *const Ast, node: Node.Index) Node.Data {
95 return tree.nodes.items(.data)[@intFromEnum(node)];
96}
97
9886pub fn isTokenPrecededByTags(
9987 tree: *const Ast,
10088 ti: TokenIndex,
......@@ -199,7 +187,7 @@ pub fn parse(gpa: Allocator, source: [:0]const u8, mode: Mode) Allocator.Error!A
199187
200188/// `gpa` is used for allocating the resulting formatted source code.
201189/// Caller owns the returned slice of bytes, allocated with `gpa`.
202pub fn render(tree: Ast, gpa: Allocator) RenderError![]u8 {
190pub fn render(tree: *const Ast, gpa: Allocator) RenderError![]u8 {
203191 var buffer = std.ArrayList(u8).init(gpa);
204192 defer buffer.deinit();
205193
......@@ -209,20 +197,20 @@ pub fn render(tree: Ast, gpa: Allocator) RenderError![]u8 {
209197
210198pub const Fixups = private_render.Fixups;
211199
212pub fn renderToArrayList(tree: Ast, buffer: *std.ArrayList(u8), fixups: Fixups) RenderError!void {
200pub fn renderToArrayList(tree: *const Ast, buffer: *std.ArrayList(u8), fixups: Fixups) RenderError!void {
213201 return @import("./render.zig").renderTree(buffer, tree, fixups);
214202}
215203
216204/// Returns an extra offset for column and byte offset of errors that
217205/// should point after the token in the error message.
218pub fn errorOffset(tree: Ast, parse_error: Error) u32 {
206pub fn errorOffset(tree: *const Ast, parse_error: Error) u32 {
219207 return if (parse_error.token_is_prev)
220208 @as(u32, @intCast(tree.tokenSlice(parse_error.token).len))
221209 else
222210 0;
223211}
224212
225pub fn tokenLocation(self: Ast, start_offset: ByteOffset, token_index: TokenIndex) Location {
213pub fn tokenLocation(self: *const Ast, start_offset: ByteOffset, token_index: TokenIndex) Location {
226214 var loc = Location{
227215 .line = 0,
228216 .column = 0,
......@@ -260,7 +248,7 @@ pub fn tokenLocation(self: Ast, start_offset: ByteOffset, token_index: TokenInde
260248 return loc;
261249}
262250
263pub fn tokenSlice(tree: Ast, token_index: TokenIndex) []const u8 {
251pub fn tokenSlice(tree: *const Ast, token_index: TokenIndex) []const u8 {
264252 const token_tag = tree.tokenTag(token_index);
265253
266254 // Many tokens can be determined entirely by their tag.
......@@ -278,15 +266,15 @@ pub fn tokenSlice(tree: Ast, token_index: TokenIndex) []const u8 {
278266 return tree.source[token.loc.start..token.loc.end];
279267}
280268
281pub fn extraDataSlice(tree: Ast, range: Node.SubRange, comptime T: type) []const T {
269pub fn extraDataSlice(tree: *const Ast, range: Node.SubRange, comptime T: type) []const T {
282270 return @ptrCast(tree.extra_data[@intFromEnum(range.start)..@intFromEnum(range.end)]);
283271}
284272
285pub fn extraDataSliceWithLen(tree: Ast, start: ExtraIndex, len: u32, comptime T: type) []const T {
273pub fn extraDataSliceWithLen(tree: *const Ast, start: ExtraIndex, len: u32, comptime T: type) []const T {
286274 return @ptrCast(tree.extra_data[@intFromEnum(start)..][0..len]);
287275}
288276
289pub fn extraData(tree: Ast, index: ExtraIndex, comptime T: type) T {
277pub fn extraData(tree: *const Ast, index: ExtraIndex, comptime T: type) T {
290278 const fields = std.meta.fields(T);
291279 var result: T = undefined;
292280 inline for (fields, 0..) |field, i| {
......@@ -310,15 +298,15 @@ fn loadOptionalNodesIntoBuffer(comptime size: usize, buffer: *[size]Node.Index,
310298 return buffer[0..];
311299}
312300
313pub fn rootDecls(tree: Ast) []const Node.Index {
301pub fn rootDecls(tree: *const Ast) []const Node.Index {
314302 switch (tree.mode) {
315 .zig => return tree.extraDataSlice(tree.nodeData(.root).extra_range, Node.Index),
303 .zig => return tree.extraDataSlice(Node.Index.root.data(tree).extra_range, Node.Index),
316304 // Ensure that the returned slice points into the existing memory of the Ast
317305 .zon => return (&tree.nodes.items(.data)[@intFromEnum(Node.Index.root)].node)[0..1],
318306 }
319307}
320308
321pub fn renderError(tree: Ast, parse_error: Error, stream: anytype) !void {
309pub fn renderError(tree: *const Ast, parse_error: Error, stream: anytype) !void {
322310 switch (parse_error.tag) {
323311 .asterisk_after_ptr_deref => {
324312 // Note that the token will point at the `.*` but ideally the source
......@@ -591,10 +579,10 @@ pub fn renderError(tree: Ast, parse_error: Error, stream: anytype) !void {
591579 }
592580}
593581
594pub fn firstToken(tree: Ast, node: Node.Index) TokenIndex {
582pub fn firstToken(tree: *const Ast, node: Node.Index) TokenIndex {
595583 var end_offset: u32 = 0;
596584 var n = node;
597 while (true) switch (tree.nodeTag(n)) {
585 while (true) switch (n.tag(tree)) {
598586 .root => return 0,
599587
600588 .test_decl,
......@@ -638,7 +626,7 @@ pub fn firstToken(tree: Ast, node: Node.Index) TokenIndex {
638626 .array_type,
639627 .array_type_sentinel,
640628 .error_value,
641 => return tree.nodeMainToken(n) - end_offset,
629 => return n.mainToken(tree) - end_offset,
642630
643631 .array_init_dot,
644632 .array_init_dot_comma,
......@@ -649,7 +637,7 @@ pub fn firstToken(tree: Ast, node: Node.Index) TokenIndex {
649637 .struct_init_dot_two,
650638 .struct_init_dot_two_comma,
651639 .enum_literal,
652 => return tree.nodeMainToken(n) - 1 - end_offset,
640 => return n.mainToken(tree) - 1 - end_offset,
653641
654642 .@"catch",
655643 .equal_equal,
......@@ -705,18 +693,18 @@ pub fn firstToken(tree: Ast, node: Node.Index) TokenIndex {
705693 .array_init_one_comma,
706694 .switch_range,
707695 .error_union,
708 => n = tree.nodeData(n).node_and_node[0],
696 => n = n.data(tree).node_and_node[0],
709697
710698 .for_range,
711699 .call_one,
712700 .call_one_comma,
713701 .struct_init_one,
714702 .struct_init_one_comma,
715 => n = tree.nodeData(n).node_and_opt_node[0],
703 => n = n.data(tree).node_and_opt_node[0],
716704
717705 .field_access,
718706 .unwrap_optional,
719 => n = tree.nodeData(n).node_and_token[0],
707 => n = n.data(tree).node_and_token[0],
720708
721709 .slice,
722710 .slice_sentinel,
......@@ -726,9 +714,9 @@ pub fn firstToken(tree: Ast, node: Node.Index) TokenIndex {
726714 .struct_init_comma,
727715 .call,
728716 .call_comma,
729 => n = tree.nodeData(n).node_and_extra[0],
717 => n = n.data(tree).node_and_extra[0],
730718
731 .deref => n = tree.nodeData(n).node,
719 .deref => n = n.data(tree).node,
732720
733721 .assign_destructure => n = tree.assignDestructure(n).ast.variables[0],
734722
......@@ -738,7 +726,7 @@ pub fn firstToken(tree: Ast, node: Node.Index) TokenIndex {
738726 .fn_proto_one,
739727 .fn_proto,
740728 => {
741 var i = tree.nodeMainToken(n); // fn token
729 var i = n.mainToken(tree); // fn token
742730 while (i > 0) {
743731 i -= 1;
744732 switch (tree.tokenTag(i)) {
......@@ -757,7 +745,7 @@ pub fn firstToken(tree: Ast, node: Node.Index) TokenIndex {
757745 },
758746
759747 .@"usingnamespace" => {
760 const main_token: TokenIndex = tree.nodeMainToken(n);
748 const main_token: TokenIndex = n.mainToken(tree);
761749 const has_visib_token = tree.isTokenPrecededByTags(main_token, &.{.keyword_pub});
762750 end_offset += @intFromBool(has_visib_token);
763751 return main_token - end_offset;
......@@ -767,21 +755,21 @@ pub fn firstToken(tree: Ast, node: Node.Index) TokenIndex {
767755 .async_call_one_comma,
768756 => {
769757 end_offset += 1; // async token
770 n = tree.nodeData(n).node_and_opt_node[0];
758 n = n.data(tree).node_and_opt_node[0];
771759 },
772760
773761 .async_call,
774762 .async_call_comma,
775763 => {
776764 end_offset += 1; // async token
777 n = tree.nodeData(n).node_and_extra[0];
765 n = n.data(tree).node_and_extra[0];
778766 },
779767
780768 .container_field_init,
781769 .container_field_align,
782770 .container_field,
783771 => {
784 const name_token = tree.nodeMainToken(n);
772 const name_token = n.mainToken(tree);
785773 const has_comptime_token = tree.isTokenPrecededByTags(name_token, &.{.keyword_comptime});
786774 end_offset += @intFromBool(has_comptime_token);
787775 return name_token - end_offset;
......@@ -792,7 +780,7 @@ pub fn firstToken(tree: Ast, node: Node.Index) TokenIndex {
792780 .simple_var_decl,
793781 .aligned_var_decl,
794782 => {
795 var i = tree.nodeMainToken(n); // mut token
783 var i = n.mainToken(tree); // mut token
796784 while (i > 0) {
797785 i -= 1;
798786 switch (tree.tokenTag(i)) {
......@@ -816,7 +804,7 @@ pub fn firstToken(tree: Ast, node: Node.Index) TokenIndex {
816804 .block_two_semicolon,
817805 => {
818806 // Look for a label.
819 const lbrace = tree.nodeMainToken(n);
807 const lbrace = n.mainToken(tree);
820808 if (tree.isTokenPrecededByTags(lbrace, &.{ .identifier, .colon })) {
821809 end_offset += 2;
822810 }
......@@ -836,7 +824,7 @@ pub fn firstToken(tree: Ast, node: Node.Index) TokenIndex {
836824 .tagged_union_enum_tag,
837825 .tagged_union_enum_tag_trailing,
838826 => {
839 const main_token = tree.nodeMainToken(n);
827 const main_token = n.mainToken(tree);
840828 switch (tree.tokenTag(main_token -| 1)) {
841829 .keyword_packed, .keyword_extern => end_offset += 1,
842830 else => {},
......@@ -848,7 +836,7 @@ pub fn firstToken(tree: Ast, node: Node.Index) TokenIndex {
848836 .ptr_type_sentinel,
849837 .ptr_type,
850838 .ptr_type_bit_range,
851 => return tree.nodeMainToken(n) - end_offset,
839 => return n.mainToken(tree) - end_offset,
852840
853841 .switch_case_one,
854842 .switch_case_inline_one,
......@@ -866,8 +854,8 @@ pub fn firstToken(tree: Ast, node: Node.Index) TokenIndex {
866854 },
867855
868856 .asm_output, .asm_input => {
869 assert(tree.tokenTag(tree.nodeMainToken(n) - 1) == .l_bracket);
870 return tree.nodeMainToken(n) - 1 - end_offset;
857 assert(tree.tokenTag(n.mainToken(tree) - 1) == .l_bracket);
858 return n.mainToken(tree) - 1 - end_offset;
871859 },
872860
873861 .while_simple,
......@@ -877,7 +865,7 @@ pub fn firstToken(tree: Ast, node: Node.Index) TokenIndex {
877865 .@"for",
878866 => {
879867 // Look for a label and inline.
880 const main_token = tree.nodeMainToken(n);
868 const main_token = n.mainToken(tree);
881869 var result = main_token;
882870 if (tree.isTokenPrecededByTags(result, &.{.keyword_inline})) {
883871 result = result - 1;
......@@ -890,10 +878,10 @@ pub fn firstToken(tree: Ast, node: Node.Index) TokenIndex {
890878 };
891879}
892880
893pub fn lastToken(tree: Ast, node: Node.Index) TokenIndex {
881pub fn lastToken(tree: *const Ast, node: Node.Index) TokenIndex {
894882 var n = node;
895883 var end_offset: u32 = 0;
896 while (true) switch (tree.nodeTag(n)) {
884 while (true) switch (n.tag(tree)) {
897885 .root => return @intCast(tree.tokens.len - 1),
898886
899887 .@"usingnamespace",
......@@ -909,7 +897,7 @@ pub fn lastToken(tree: Ast, node: Node.Index) TokenIndex {
909897 .@"resume",
910898 .@"nosuspend",
911899 .@"comptime",
912 => n = tree.nodeData(n).node,
900 => n = n.data(tree).node,
913901
914902 .@"catch",
915903 .equal_equal,
......@@ -966,45 +954,45 @@ pub fn lastToken(tree: Ast, node: Node.Index) TokenIndex {
966954 .fn_decl,
967955 .array_type,
968956 .switch_range,
969 => n = tree.nodeData(n).node_and_node[1],
957 => n = n.data(tree).node_and_node[1],
970958
971 .test_decl, .@"errdefer" => n = tree.nodeData(n).opt_token_and_node[1],
972 .@"defer" => n = tree.nodeData(n).node,
973 .anyframe_type => n = tree.nodeData(n).token_and_node[1],
959 .test_decl, .@"errdefer" => n = n.data(tree).opt_token_and_node[1],
960 .@"defer" => n = n.data(tree).node,
961 .anyframe_type => n = n.data(tree).token_and_node[1],
974962
975963 .switch_case_one,
976964 .switch_case_inline_one,
977965 .ptr_type_aligned,
978966 .ptr_type_sentinel,
979 => n = tree.nodeData(n).opt_node_and_node[1],
967 => n = n.data(tree).opt_node_and_node[1],
980968
981969 .assign_destructure,
982970 .ptr_type,
983971 .ptr_type_bit_range,
984972 .switch_case,
985973 .switch_case_inline,
986 => n = tree.nodeData(n).extra_and_node[1],
974 => n = n.data(tree).extra_and_node[1],
987975
988 .fn_proto_simple => n = tree.nodeData(n).opt_node_and_opt_node[1].unwrap().?,
976 .fn_proto_simple => n = n.data(tree).opt_node_and_opt_node[1].unwrap().?,
989977 .fn_proto_multi,
990978 .fn_proto_one,
991979 .fn_proto,
992 => n = tree.nodeData(n).extra_and_opt_node[1].unwrap().?,
980 => n = n.data(tree).extra_and_opt_node[1].unwrap().?,
993981
994982 .for_range => {
995 n = tree.nodeData(n).node_and_opt_node[1].unwrap() orelse {
996 return tree.nodeMainToken(n) + end_offset;
983 n = n.data(tree).node_and_opt_node[1].unwrap() orelse {
984 return n.mainToken(tree) + end_offset;
997985 };
998986 },
999987
1000988 .field_access,
1001989 .unwrap_optional,
1002990 .asm_simple,
1003 => return tree.nodeData(n).node_and_token[1] + end_offset,
1004 .grouped_expression, .asm_input => return tree.nodeData(n).node_and_token[1] + end_offset,
1005 .multiline_string_literal, .error_set_decl => return tree.nodeData(n).token_and_token[1] + end_offset,
1006 .asm_output => return tree.nodeData(n).opt_node_and_token[1] + end_offset,
1007 .error_value => return tree.nodeMainToken(n) + 2 + end_offset,
991 => return n.data(tree).node_and_token[1] + end_offset,
992 .grouped_expression, .asm_input => return n.data(tree).node_and_token[1] + end_offset,
993 .multiline_string_literal, .error_set_decl => return n.data(tree).token_and_token[1] + end_offset,
994 .asm_output => return n.data(tree).opt_node_and_token[1] + end_offset,
995 .error_value => return n.mainToken(tree) + 2 + end_offset,
1008996
1009997 .anyframe_literal,
1010998 .char_literal,
......@@ -1014,23 +1002,23 @@ pub fn lastToken(tree: Ast, node: Node.Index) TokenIndex {
10141002 .deref,
10151003 .enum_literal,
10161004 .string_literal,
1017 => return tree.nodeMainToken(n) + end_offset,
1005 => return n.mainToken(tree) + end_offset,
10181006
10191007 .@"return" => {
1020 n = tree.nodeData(n).opt_node.unwrap() orelse {
1021 return tree.nodeMainToken(n) + end_offset;
1008 n = n.data(tree).opt_node.unwrap() orelse {
1009 return n.mainToken(tree) + end_offset;
10221010 };
10231011 },
10241012
10251013 .call, .async_call => {
1026 _, const extra_index = tree.nodeData(n).node_and_extra;
1014 _, const extra_index = n.data(tree).node_and_extra;
10271015 const params = tree.extraData(extra_index, Node.SubRange);
10281016 assert(params.start != params.end);
10291017 end_offset += 1; // for the rparen
10301018 n = @enumFromInt(tree.extra_data[@intFromEnum(params.end) - 1]); // last parameter
10311019 },
10321020 .tagged_union_enum_tag => {
1033 const arg, const extra_index = tree.nodeData(n).node_and_extra;
1021 const arg, const extra_index = n.data(tree).node_and_extra;
10341022 const members = tree.extraData(extra_index, Node.SubRange);
10351023 if (members.start == members.end) {
10361024 end_offset += 4; // for the rparen + rparen + lbrace + rbrace
......@@ -1044,14 +1032,14 @@ pub fn lastToken(tree: Ast, node: Node.Index) TokenIndex {
10441032 .async_call_comma,
10451033 .tagged_union_enum_tag_trailing,
10461034 => {
1047 _, const extra_index = tree.nodeData(n).node_and_extra;
1035 _, const extra_index = n.data(tree).node_and_extra;
10481036 const params = tree.extraData(extra_index, Node.SubRange);
10491037 assert(params.start != params.end);
10501038 end_offset += 2; // for the comma/semicolon + rparen/rbrace
10511039 n = @enumFromInt(tree.extra_data[@intFromEnum(params.end) - 1]); // last parameter
10521040 },
10531041 .@"switch" => {
1054 const condition, const extra_index = tree.nodeData(n).node_and_extra;
1042 const condition, const extra_index = n.data(tree).node_and_extra;
10551043 const cases = tree.extraData(extra_index, Node.SubRange);
10561044 if (cases.start == cases.end) {
10571045 end_offset += 3; // rparen, lbrace, rbrace
......@@ -1062,7 +1050,7 @@ pub fn lastToken(tree: Ast, node: Node.Index) TokenIndex {
10621050 }
10631051 },
10641052 .container_decl_arg => {
1065 const arg, const extra_index = tree.nodeData(n).node_and_extra;
1053 const arg, const extra_index = n.data(tree).node_and_extra;
10661054 const members = tree.extraData(extra_index, Node.SubRange);
10671055 if (members.end == members.start) {
10681056 end_offset += 3; // for the rparen + lbrace + rbrace
......@@ -1073,14 +1061,14 @@ pub fn lastToken(tree: Ast, node: Node.Index) TokenIndex {
10731061 }
10741062 },
10751063 .@"asm" => {
1076 _, const extra_index = tree.nodeData(n).node_and_extra;
1064 _, const extra_index = n.data(tree).node_and_extra;
10771065 const extra = tree.extraData(extra_index, Node.Asm);
10781066 return extra.rparen + end_offset;
10791067 },
10801068 .array_init,
10811069 .struct_init,
10821070 => {
1083 _, const extra_index = tree.nodeData(n).node_and_extra;
1071 _, const extra_index = n.data(tree).node_and_extra;
10841072 const elements = tree.extraData(extra_index, Node.SubRange);
10851073 assert(elements.start != elements.end);
10861074 end_offset += 1; // for the rbrace
......@@ -1091,7 +1079,7 @@ pub fn lastToken(tree: Ast, node: Node.Index) TokenIndex {
10911079 .container_decl_arg_trailing,
10921080 .switch_comma,
10931081 => {
1094 _, const extra_index = tree.nodeData(n).node_and_extra;
1082 _, const extra_index = n.data(tree).node_and_extra;
10951083 const members = tree.extraData(extra_index, Node.SubRange);
10961084 assert(members.start != members.end);
10971085 end_offset += 2; // for the comma + rbrace
......@@ -1104,7 +1092,7 @@ pub fn lastToken(tree: Ast, node: Node.Index) TokenIndex {
11041092 .tagged_union,
11051093 .builtin_call,
11061094 => {
1107 const range = tree.nodeData(n).extra_range;
1095 const range = n.data(tree).extra_range;
11081096 assert(range.start != range.end);
11091097 end_offset += 1; // for the rbrace
11101098 n = @enumFromInt(tree.extra_data[@intFromEnum(range.end) - 1]); // last statement
......@@ -1116,7 +1104,7 @@ pub fn lastToken(tree: Ast, node: Node.Index) TokenIndex {
11161104 .tagged_union_trailing,
11171105 .builtin_call_comma,
11181106 => {
1119 const range = tree.nodeData(n).extra_range;
1107 const range = n.data(tree).extra_range;
11201108 assert(range.start != range.end);
11211109 end_offset += 2; // for the comma/semicolon + rbrace/rparen
11221110 n = @enumFromInt(tree.extra_data[@intFromEnum(range.end) - 1]); // last member
......@@ -1124,10 +1112,10 @@ pub fn lastToken(tree: Ast, node: Node.Index) TokenIndex {
11241112 .call_one,
11251113 .async_call_one,
11261114 => {
1127 _, const first_param = tree.nodeData(n).node_and_opt_node;
1115 _, const first_param = n.data(tree).node_and_opt_node;
11281116 end_offset += 1; // for the rparen
11291117 n = first_param.unwrap() orelse {
1130 return tree.nodeMainToken(n) + end_offset;
1118 return n.mainToken(tree) + end_offset;
11311119 };
11321120 },
11331121
......@@ -1138,7 +1126,7 @@ pub fn lastToken(tree: Ast, node: Node.Index) TokenIndex {
11381126 .container_decl_two,
11391127 .tagged_union_two,
11401128 => {
1141 const opt_lhs, const opt_rhs = tree.nodeData(n).opt_node_and_opt_node;
1129 const opt_lhs, const opt_rhs = n.data(tree).opt_node_and_opt_node;
11421130 if (opt_rhs.unwrap()) |rhs| {
11431131 end_offset += 1; // for the rparen/rbrace
11441132 n = rhs;
......@@ -1146,7 +1134,7 @@ pub fn lastToken(tree: Ast, node: Node.Index) TokenIndex {
11461134 end_offset += 1; // for the rparen/rbrace
11471135 n = lhs;
11481136 } else {
1149 switch (tree.nodeTag(n)) {
1137 switch (n.tag(tree)) {
11501138 .array_init_dot_two,
11511139 .block_two,
11521140 .struct_init_dot_two,
......@@ -1154,17 +1142,17 @@ pub fn lastToken(tree: Ast, node: Node.Index) TokenIndex {
11541142 .builtin_call_two => end_offset += 2, // lparen/lbrace + rparen/rbrace
11551143 .container_decl_two => {
11561144 var i: u32 = 2; // lbrace + rbrace
1157 while (tree.tokenTag(tree.nodeMainToken(n) + i) == .container_doc_comment) i += 1;
1145 while (tree.tokenTag(n.mainToken(tree) + i) == .container_doc_comment) i += 1;
11581146 end_offset += i;
11591147 },
11601148 .tagged_union_two => {
11611149 var i: u32 = 5; // (enum) {}
1162 while (tree.tokenTag(tree.nodeMainToken(n) + i) == .container_doc_comment) i += 1;
1150 while (tree.tokenTag(n.mainToken(tree) + i) == .container_doc_comment) i += 1;
11631151 end_offset += i;
11641152 },
11651153 else => unreachable,
11661154 }
1167 return tree.nodeMainToken(n) + end_offset;
1155 return n.mainToken(tree) + end_offset;
11681156 }
11691157 },
11701158 .array_init_dot_two_comma,
......@@ -1174,7 +1162,7 @@ pub fn lastToken(tree: Ast, node: Node.Index) TokenIndex {
11741162 .container_decl_two_trailing,
11751163 .tagged_union_two_trailing,
11761164 => {
1177 const opt_lhs, const opt_rhs = tree.nodeData(n).opt_node_and_opt_node;
1165 const opt_lhs, const opt_rhs = n.data(tree).opt_node_and_opt_node;
11781166 end_offset += 2; // for the comma/semicolon + rbrace/rparen
11791167 if (opt_rhs.unwrap()) |rhs| {
11801168 n = rhs;
......@@ -1185,18 +1173,18 @@ pub fn lastToken(tree: Ast, node: Node.Index) TokenIndex {
11851173 }
11861174 },
11871175 .simple_var_decl => {
1188 const type_node, const init_node = tree.nodeData(n).opt_node_and_opt_node;
1176 const type_node, const init_node = n.data(tree).opt_node_and_opt_node;
11891177 if (init_node.unwrap()) |rhs| {
11901178 n = rhs;
11911179 } else if (type_node.unwrap()) |lhs| {
11921180 n = lhs;
11931181 } else {
11941182 end_offset += 1; // from mut token to name
1195 return tree.nodeMainToken(n) + end_offset;
1183 return n.mainToken(tree) + end_offset;
11961184 }
11971185 },
11981186 .aligned_var_decl => {
1199 const align_node, const init_node = tree.nodeData(n).node_and_opt_node;
1187 const align_node, const init_node = n.data(tree).node_and_opt_node;
12001188 if (init_node.unwrap()) |rhs| {
12011189 n = rhs;
12021190 } else {
......@@ -1205,7 +1193,7 @@ pub fn lastToken(tree: Ast, node: Node.Index) TokenIndex {
12051193 }
12061194 },
12071195 .global_var_decl => {
1208 const extra_index, const init_node = tree.nodeData(n).extra_and_opt_node;
1196 const extra_index, const init_node = n.data(tree).extra_and_opt_node;
12091197 if (init_node.unwrap()) |rhs| {
12101198 n = rhs;
12111199 } else {
......@@ -1220,12 +1208,12 @@ pub fn lastToken(tree: Ast, node: Node.Index) TokenIndex {
12201208 n = type_node;
12211209 } else {
12221210 end_offset += 1; // from mut token to name
1223 return tree.nodeMainToken(n) + end_offset;
1211 return n.mainToken(tree) + end_offset;
12241212 }
12251213 }
12261214 },
12271215 .local_var_decl => {
1228 const extra_index, const init_node = tree.nodeData(n).extra_and_opt_node;
1216 const extra_index, const init_node = n.data(tree).extra_and_opt_node;
12291217 if (init_node.unwrap()) |rhs| {
12301218 n = rhs;
12311219 } else {
......@@ -1235,7 +1223,7 @@ pub fn lastToken(tree: Ast, node: Node.Index) TokenIndex {
12351223 }
12361224 },
12371225 .container_field_init => {
1238 const type_expr, const value_expr = tree.nodeData(n).node_and_opt_node;
1226 const type_expr, const value_expr = n.data(tree).node_and_opt_node;
12391227 n = value_expr.unwrap() orelse type_expr;
12401228 },
12411229
......@@ -1243,30 +1231,30 @@ pub fn lastToken(tree: Ast, node: Node.Index) TokenIndex {
12431231 .array_init_one,
12441232 .container_field_align,
12451233 => {
1246 _, const rhs = tree.nodeData(n).node_and_node;
1234 _, const rhs = n.data(tree).node_and_node;
12471235 end_offset += 1; // for the rbracket/rbrace/rparen
12481236 n = rhs;
12491237 },
12501238 .container_field => {
1251 _, const extra_index = tree.nodeData(n).node_and_extra;
1239 _, const extra_index = n.data(tree).node_and_extra;
12521240 const extra = tree.extraData(extra_index, Node.ContainerField);
12531241 n = extra.value_expr;
12541242 },
12551243
12561244 .struct_init_one => {
1257 _, const first_field = tree.nodeData(n).node_and_opt_node;
1245 _, const first_field = n.data(tree).node_and_opt_node;
12581246 end_offset += 1; // rbrace
12591247 n = first_field.unwrap() orelse {
1260 return tree.nodeMainToken(n) + end_offset;
1248 return n.mainToken(tree) + end_offset;
12611249 };
12621250 },
12631251 .slice_open => {
1264 _, const start_node = tree.nodeData(n).node_and_node;
1252 _, const start_node = n.data(tree).node_and_node;
12651253 end_offset += 2; // ellipsis2 + rbracket, or comma + rparen
12661254 n = start_node;
12671255 },
12681256 .array_init_one_comma => {
1269 _, const first_element = tree.nodeData(n).node_and_node;
1257 _, const first_element = n.data(tree).node_and_node;
12701258 end_offset += 2; // comma + rbrace
12711259 n = first_element;
12721260 },
......@@ -1274,67 +1262,67 @@ pub fn lastToken(tree: Ast, node: Node.Index) TokenIndex {
12741262 .async_call_one_comma,
12751263 .struct_init_one_comma,
12761264 => {
1277 _, const first_field = tree.nodeData(n).node_and_opt_node;
1265 _, const first_field = n.data(tree).node_and_opt_node;
12781266 end_offset += 2; // ellipsis2 + rbracket, or comma + rparen
12791267 n = first_field.unwrap().?;
12801268 },
12811269 .slice => {
1282 _, const extra_index = tree.nodeData(n).node_and_extra;
1270 _, const extra_index = n.data(tree).node_and_extra;
12831271 const extra = tree.extraData(extra_index, Node.Slice);
12841272 end_offset += 1; // rbracket
12851273 n = extra.end;
12861274 },
12871275 .slice_sentinel => {
1288 _, const extra_index = tree.nodeData(n).node_and_extra;
1276 _, const extra_index = n.data(tree).node_and_extra;
12891277 const extra = tree.extraData(extra_index, Node.SliceSentinel);
12901278 end_offset += 1; // rbracket
12911279 n = extra.sentinel;
12921280 },
12931281
12941282 .@"continue", .@"break" => {
1295 const opt_label, const opt_rhs = tree.nodeData(n).opt_token_and_opt_node;
1283 const opt_label, const opt_rhs = n.data(tree).opt_token_and_opt_node;
12961284 if (opt_rhs.unwrap()) |rhs| {
12971285 n = rhs;
12981286 } else if (opt_label.unwrap()) |lhs| {
12991287 return lhs + end_offset;
13001288 } else {
1301 return tree.nodeMainToken(n) + end_offset;
1289 return n.mainToken(tree) + end_offset;
13021290 }
13031291 },
13041292 .while_cont => {
1305 _, const extra_index = tree.nodeData(n).node_and_extra;
1293 _, const extra_index = n.data(tree).node_and_extra;
13061294 const extra = tree.extraData(extra_index, Node.WhileCont);
13071295 n = extra.then_expr;
13081296 },
13091297 .@"while" => {
1310 _, const extra_index = tree.nodeData(n).node_and_extra;
1298 _, const extra_index = n.data(tree).node_and_extra;
13111299 const extra = tree.extraData(extra_index, Node.While);
13121300 n = extra.else_expr;
13131301 },
13141302 .@"if" => {
1315 _, const extra_index = tree.nodeData(n).node_and_extra;
1303 _, const extra_index = n.data(tree).node_and_extra;
13161304 const extra = tree.extraData(extra_index, Node.If);
13171305 n = extra.else_expr;
13181306 },
13191307 .@"for" => {
1320 const extra_index, const extra = tree.nodeData(n).@"for";
1308 const extra_index, const extra = n.data(tree).@"for";
13211309 const index = @intFromEnum(extra_index) + extra.inputs + @intFromBool(extra.has_else);
13221310 n = @enumFromInt(tree.extra_data[index]);
13231311 },
13241312 .array_type_sentinel => {
1325 _, const extra_index = tree.nodeData(n).node_and_extra;
1313 _, const extra_index = n.data(tree).node_and_extra;
13261314 const extra = tree.extraData(extra_index, Node.ArrayTypeSentinel);
13271315 n = extra.elem_type;
13281316 },
13291317 };
13301318}
13311319
1332pub fn tokensOnSameLine(tree: Ast, token1: TokenIndex, token2: TokenIndex) bool {
1320pub fn tokensOnSameLine(tree: *const Ast, token1: TokenIndex, token2: TokenIndex) bool {
13331321 const source = tree.source[tree.tokenStart(token1)..tree.tokenStart(token2)];
13341322 return mem.indexOfScalar(u8, source, '\n') == null;
13351323}
13361324
1337pub fn getNodeSource(tree: Ast, node: Node.Index) []const u8 {
1325pub fn getNodeSource(tree: *const Ast, node: Node.Index) []const u8 {
13381326 const first_token = tree.firstToken(node);
13391327 const last_token = tree.lastToken(node);
13401328 const start = tree.tokenStart(first_token);
......@@ -1342,9 +1330,9 @@ pub fn getNodeSource(tree: Ast, node: Node.Index) []const u8 {
13421330 return tree.source[start..end];
13431331}
13441332
1345pub fn globalVarDecl(tree: Ast, node: Node.Index) full.VarDecl {
1346 assert(tree.nodeTag(node) == .global_var_decl);
1347 const extra_index, const init_node = tree.nodeData(node).extra_and_opt_node;
1333pub fn globalVarDecl(tree: *const Ast, node: Node.Index) full.VarDecl {
1334 assert(node.tag(tree) == .global_var_decl);
1335 const extra_index, const init_node = node.data(tree).extra_and_opt_node;
13481336 const extra = tree.extraData(extra_index, Node.GlobalVarDecl);
13491337 return tree.fullVarDeclComponents(.{
13501338 .type_node = extra.type_node,
......@@ -1352,13 +1340,13 @@ pub fn globalVarDecl(tree: Ast, node: Node.Index) full.VarDecl {
13521340 .addrspace_node = extra.addrspace_node,
13531341 .section_node = extra.section_node,
13541342 .init_node = init_node,
1355 .mut_token = tree.nodeMainToken(node),
1343 .mut_token = node.mainToken(tree),
13561344 });
13571345}
13581346
1359pub fn localVarDecl(tree: Ast, node: Node.Index) full.VarDecl {
1360 assert(tree.nodeTag(node) == .local_var_decl);
1361 const extra_index, const init_node = tree.nodeData(node).extra_and_opt_node;
1347pub fn localVarDecl(tree: *const Ast, node: Node.Index) full.VarDecl {
1348 assert(node.tag(tree) == .local_var_decl);
1349 const extra_index, const init_node = node.data(tree).extra_and_opt_node;
13621350 const extra = tree.extraData(extra_index, Node.LocalVarDecl);
13631351 return tree.fullVarDeclComponents(.{
13641352 .type_node = extra.type_node.toOptional(),
......@@ -1366,74 +1354,74 @@ pub fn localVarDecl(tree: Ast, node: Node.Index) full.VarDecl {
13661354 .addrspace_node = .none,
13671355 .section_node = .none,
13681356 .init_node = init_node,
1369 .mut_token = tree.nodeMainToken(node),
1357 .mut_token = node.mainToken(tree),
13701358 });
13711359}
13721360
1373pub fn simpleVarDecl(tree: Ast, node: Node.Index) full.VarDecl {
1374 assert(tree.nodeTag(node) == .simple_var_decl);
1375 const type_node, const init_node = tree.nodeData(node).opt_node_and_opt_node;
1361pub fn simpleVarDecl(tree: *const Ast, node: Node.Index) full.VarDecl {
1362 assert(node.tag(tree) == .simple_var_decl);
1363 const type_node, const init_node = node.data(tree).opt_node_and_opt_node;
13761364 return tree.fullVarDeclComponents(.{
13771365 .type_node = type_node,
13781366 .align_node = .none,
13791367 .addrspace_node = .none,
13801368 .section_node = .none,
13811369 .init_node = init_node,
1382 .mut_token = tree.nodeMainToken(node),
1370 .mut_token = node.mainToken(tree),
13831371 });
13841372}
13851373
1386pub fn alignedVarDecl(tree: Ast, node: Node.Index) full.VarDecl {
1387 assert(tree.nodeTag(node) == .aligned_var_decl);
1388 const align_node, const init_node = tree.nodeData(node).node_and_opt_node;
1374pub fn alignedVarDecl(tree: *const Ast, node: Node.Index) full.VarDecl {
1375 assert(node.tag(tree) == .aligned_var_decl);
1376 const align_node, const init_node = node.data(tree).node_and_opt_node;
13891377 return tree.fullVarDeclComponents(.{
13901378 .type_node = .none,
13911379 .align_node = align_node.toOptional(),
13921380 .addrspace_node = .none,
13931381 .section_node = .none,
13941382 .init_node = init_node,
1395 .mut_token = tree.nodeMainToken(node),
1383 .mut_token = node.mainToken(tree),
13961384 });
13971385}
13981386
1399pub fn assignDestructure(tree: Ast, node: Node.Index) full.AssignDestructure {
1400 const extra_index, const value_expr = tree.nodeData(node).extra_and_node;
1387pub fn assignDestructure(tree: *const Ast, node: Node.Index) full.AssignDestructure {
1388 const extra_index, const value_expr = node.data(tree).extra_and_node;
14011389 const variable_count = tree.extra_data[@intFromEnum(extra_index)];
14021390 return tree.fullAssignDestructureComponents(.{
14031391 .variables = tree.extraDataSliceWithLen(@enumFromInt(@intFromEnum(extra_index) + 1), variable_count, Node.Index),
1404 .equal_token = tree.nodeMainToken(node),
1392 .equal_token = node.mainToken(tree),
14051393 .value_expr = value_expr,
14061394 });
14071395}
14081396
1409pub fn ifSimple(tree: Ast, node: Node.Index) full.If {
1410 assert(tree.nodeTag(node) == .if_simple);
1411 const cond_expr, const then_expr = tree.nodeData(node).node_and_node;
1397pub fn ifSimple(tree: *const Ast, node: Node.Index) full.If {
1398 assert(node.tag(tree) == .if_simple);
1399 const cond_expr, const then_expr = node.data(tree).node_and_node;
14121400 return tree.fullIfComponents(.{
14131401 .cond_expr = cond_expr,
14141402 .then_expr = then_expr,
14151403 .else_expr = .none,
1416 .if_token = tree.nodeMainToken(node),
1404 .if_token = node.mainToken(tree),
14171405 });
14181406}
14191407
1420pub fn ifFull(tree: Ast, node: Node.Index) full.If {
1421 assert(tree.nodeTag(node) == .@"if");
1422 const cond_expr, const extra_index = tree.nodeData(node).node_and_extra;
1408pub fn ifFull(tree: *const Ast, node: Node.Index) full.If {
1409 assert(node.tag(tree) == .@"if");
1410 const cond_expr, const extra_index = node.data(tree).node_and_extra;
14231411 const extra = tree.extraData(extra_index, Node.If);
14241412 return tree.fullIfComponents(.{
14251413 .cond_expr = cond_expr,
14261414 .then_expr = extra.then_expr,
14271415 .else_expr = extra.else_expr.toOptional(),
1428 .if_token = tree.nodeMainToken(node),
1416 .if_token = node.mainToken(tree),
14291417 });
14301418}
14311419
1432pub fn containerField(tree: Ast, node: Node.Index) full.ContainerField {
1433 assert(tree.nodeTag(node) == .container_field);
1434 const type_expr, const extra_index = tree.nodeData(node).node_and_extra;
1420pub fn containerField(tree: *const Ast, node: Node.Index) full.ContainerField {
1421 assert(node.tag(tree) == .container_field);
1422 const type_expr, const extra_index = node.data(tree).node_and_extra;
14351423 const extra = tree.extraData(extra_index, Node.ContainerField);
1436 const main_token = tree.nodeMainToken(node);
1424 const main_token = node.mainToken(tree);
14371425 return tree.fullContainerFieldComponents(.{
14381426 .main_token = main_token,
14391427 .type_expr = type_expr.toOptional(),
......@@ -1444,10 +1432,10 @@ pub fn containerField(tree: Ast, node: Node.Index) full.ContainerField {
14441432 });
14451433}
14461434
1447pub fn containerFieldInit(tree: Ast, node: Node.Index) full.ContainerField {
1448 assert(tree.nodeTag(node) == .container_field_init);
1449 const type_expr, const value_expr = tree.nodeData(node).node_and_opt_node;
1450 const main_token = tree.nodeMainToken(node);
1435pub fn containerFieldInit(tree: *const Ast, node: Node.Index) full.ContainerField {
1436 assert(node.tag(tree) == .container_field_init);
1437 const type_expr, const value_expr = node.data(tree).node_and_opt_node;
1438 const main_token = node.mainToken(tree);
14511439 return tree.fullContainerFieldComponents(.{
14521440 .main_token = main_token,
14531441 .type_expr = type_expr.toOptional(),
......@@ -1458,10 +1446,10 @@ pub fn containerFieldInit(tree: Ast, node: Node.Index) full.ContainerField {
14581446 });
14591447}
14601448
1461pub fn containerFieldAlign(tree: Ast, node: Node.Index) full.ContainerField {
1462 assert(tree.nodeTag(node) == .container_field_align);
1463 const type_expr, const align_expr = tree.nodeData(node).node_and_node;
1464 const main_token = tree.nodeMainToken(node);
1449pub fn containerFieldAlign(tree: *const Ast, node: Node.Index) full.ContainerField {
1450 assert(node.tag(tree) == .container_field_align);
1451 const type_expr, const align_expr = node.data(tree).node_and_node;
1452 const main_token = node.mainToken(tree);
14651453 return tree.fullContainerFieldComponents(.{
14661454 .main_token = main_token,
14671455 .type_expr = type_expr.toOptional(),
......@@ -1472,13 +1460,13 @@ pub fn containerFieldAlign(tree: Ast, node: Node.Index) full.ContainerField {
14721460 });
14731461}
14741462
1475pub fn fnProtoSimple(tree: Ast, buffer: *[1]Node.Index, node: Node.Index) full.FnProto {
1476 assert(tree.nodeTag(node) == .fn_proto_simple);
1477 const first_param, const return_type = tree.nodeData(node).opt_node_and_opt_node;
1463pub fn fnProtoSimple(tree: *const Ast, buffer: *[1]Node.Index, node: Node.Index) full.FnProto {
1464 assert(node.tag(tree) == .fn_proto_simple);
1465 const first_param, const return_type = node.data(tree).opt_node_and_opt_node;
14781466 const params = loadOptionalNodesIntoBuffer(1, buffer, .{first_param});
14791467 return tree.fullFnProtoComponents(.{
14801468 .proto_node = node,
1481 .fn_token = tree.nodeMainToken(node),
1469 .fn_token = node.mainToken(tree),
14821470 .return_type = return_type,
14831471 .params = params,
14841472 .align_expr = .none,
......@@ -1488,13 +1476,13 @@ pub fn fnProtoSimple(tree: Ast, buffer: *[1]Node.Index, node: Node.Index) full.F
14881476 });
14891477}
14901478
1491pub fn fnProtoMulti(tree: Ast, node: Node.Index) full.FnProto {
1492 assert(tree.nodeTag(node) == .fn_proto_multi);
1493 const extra_index, const return_type = tree.nodeData(node).extra_and_opt_node;
1479pub fn fnProtoMulti(tree: *const Ast, node: Node.Index) full.FnProto {
1480 assert(node.tag(tree) == .fn_proto_multi);
1481 const extra_index, const return_type = node.data(tree).extra_and_opt_node;
14941482 const params = tree.extraDataSlice(tree.extraData(extra_index, Node.SubRange), Node.Index);
14951483 return tree.fullFnProtoComponents(.{
14961484 .proto_node = node,
1497 .fn_token = tree.nodeMainToken(node),
1485 .fn_token = node.mainToken(tree),
14981486 .return_type = return_type,
14991487 .params = params,
15001488 .align_expr = .none,
......@@ -1504,14 +1492,14 @@ pub fn fnProtoMulti(tree: Ast, node: Node.Index) full.FnProto {
15041492 });
15051493}
15061494
1507pub fn fnProtoOne(tree: Ast, buffer: *[1]Node.Index, node: Node.Index) full.FnProto {
1508 assert(tree.nodeTag(node) == .fn_proto_one);
1509 const extra_index, const return_type = tree.nodeData(node).extra_and_opt_node;
1495pub fn fnProtoOne(tree: *const Ast, buffer: *[1]Node.Index, node: Node.Index) full.FnProto {
1496 assert(node.tag(tree) == .fn_proto_one);
1497 const extra_index, const return_type = node.data(tree).extra_and_opt_node;
15101498 const extra = tree.extraData(extra_index, Node.FnProtoOne);
15111499 const params = loadOptionalNodesIntoBuffer(1, buffer, .{extra.param});
15121500 return tree.fullFnProtoComponents(.{
15131501 .proto_node = node,
1514 .fn_token = tree.nodeMainToken(node),
1502 .fn_token = node.mainToken(tree),
15151503 .return_type = return_type,
15161504 .params = params,
15171505 .align_expr = extra.align_expr,
......@@ -1521,14 +1509,14 @@ pub fn fnProtoOne(tree: Ast, buffer: *[1]Node.Index, node: Node.Index) full.FnPr
15211509 });
15221510}
15231511
1524pub fn fnProto(tree: Ast, node: Node.Index) full.FnProto {
1525 assert(tree.nodeTag(node) == .fn_proto);
1526 const extra_index, const return_type = tree.nodeData(node).extra_and_opt_node;
1512pub fn fnProto(tree: *const Ast, node: Node.Index) full.FnProto {
1513 assert(node.tag(tree) == .fn_proto);
1514 const extra_index, const return_type = node.data(tree).extra_and_opt_node;
15271515 const extra = tree.extraData(extra_index, Node.FnProto);
15281516 const params = tree.extraDataSlice(.{ .start = extra.params_start, .end = extra.params_end }, Node.Index);
15291517 return tree.fullFnProtoComponents(.{
15301518 .proto_node = node,
1531 .fn_token = tree.nodeMainToken(node),
1519 .fn_token = node.mainToken(tree),
15321520 .return_type = return_type,
15331521 .params = params,
15341522 .align_expr = extra.align_expr,
......@@ -1538,119 +1526,119 @@ pub fn fnProto(tree: Ast, node: Node.Index) full.FnProto {
15381526 });
15391527}
15401528
1541pub fn structInitOne(tree: Ast, buffer: *[1]Node.Index, node: Node.Index) full.StructInit {
1542 assert(tree.nodeTag(node) == .struct_init_one or
1543 tree.nodeTag(node) == .struct_init_one_comma);
1544 const type_expr, const first_field = tree.nodeData(node).node_and_opt_node;
1529pub fn structInitOne(tree: *const Ast, buffer: *[1]Node.Index, node: Node.Index) full.StructInit {
1530 assert(node.tag(tree) == .struct_init_one or
1531 node.tag(tree) == .struct_init_one_comma);
1532 const type_expr, const first_field = node.data(tree).node_and_opt_node;
15451533 const fields = loadOptionalNodesIntoBuffer(1, buffer, .{first_field});
15461534 return .{
15471535 .ast = .{
1548 .lbrace = tree.nodeMainToken(node),
1536 .lbrace = node.mainToken(tree),
15491537 .fields = fields,
15501538 .type_expr = type_expr.toOptional(),
15511539 },
15521540 };
15531541}
15541542
1555pub fn structInitDotTwo(tree: Ast, buffer: *[2]Node.Index, node: Node.Index) full.StructInit {
1556 assert(tree.nodeTag(node) == .struct_init_dot_two or
1557 tree.nodeTag(node) == .struct_init_dot_two_comma);
1558 const fields = loadOptionalNodesIntoBuffer(2, buffer, tree.nodeData(node).opt_node_and_opt_node);
1543pub fn structInitDotTwo(tree: *const Ast, buffer: *[2]Node.Index, node: Node.Index) full.StructInit {
1544 assert(node.tag(tree) == .struct_init_dot_two or
1545 node.tag(tree) == .struct_init_dot_two_comma);
1546 const fields = loadOptionalNodesIntoBuffer(2, buffer, node.data(tree).opt_node_and_opt_node);
15591547 return .{
15601548 .ast = .{
1561 .lbrace = tree.nodeMainToken(node),
1549 .lbrace = node.mainToken(tree),
15621550 .fields = fields,
15631551 .type_expr = .none,
15641552 },
15651553 };
15661554}
15671555
1568pub fn structInitDot(tree: Ast, node: Node.Index) full.StructInit {
1569 assert(tree.nodeTag(node) == .struct_init_dot or
1570 tree.nodeTag(node) == .struct_init_dot_comma);
1571 const fields = tree.extraDataSlice(tree.nodeData(node).extra_range, Node.Index);
1556pub fn structInitDot(tree: *const Ast, node: Node.Index) full.StructInit {
1557 assert(node.tag(tree) == .struct_init_dot or
1558 node.tag(tree) == .struct_init_dot_comma);
1559 const fields = tree.extraDataSlice(node.data(tree).extra_range, Node.Index);
15721560 return .{
15731561 .ast = .{
1574 .lbrace = tree.nodeMainToken(node),
1562 .lbrace = node.mainToken(tree),
15751563 .fields = fields,
15761564 .type_expr = .none,
15771565 },
15781566 };
15791567}
15801568
1581pub fn structInit(tree: Ast, node: Node.Index) full.StructInit {
1582 assert(tree.nodeTag(node) == .struct_init or
1583 tree.nodeTag(node) == .struct_init_comma);
1584 const type_expr, const extra_index = tree.nodeData(node).node_and_extra;
1569pub fn structInit(tree: *const Ast, node: Node.Index) full.StructInit {
1570 assert(node.tag(tree) == .struct_init or
1571 node.tag(tree) == .struct_init_comma);
1572 const type_expr, const extra_index = node.data(tree).node_and_extra;
15851573 const fields = tree.extraDataSlice(tree.extraData(extra_index, Node.SubRange), Node.Index);
15861574 return .{
15871575 .ast = .{
1588 .lbrace = tree.nodeMainToken(node),
1576 .lbrace = node.mainToken(tree),
15891577 .fields = fields,
15901578 .type_expr = type_expr.toOptional(),
15911579 },
15921580 };
15931581}
15941582
1595pub fn arrayInitOne(tree: Ast, buffer: *[1]Node.Index, node: Node.Index) full.ArrayInit {
1596 assert(tree.nodeTag(node) == .array_init_one or
1597 tree.nodeTag(node) == .array_init_one_comma);
1598 const type_expr, buffer[0] = tree.nodeData(node).node_and_node;
1583pub fn arrayInitOne(tree: *const Ast, buffer: *[1]Node.Index, node: Node.Index) full.ArrayInit {
1584 assert(node.tag(tree) == .array_init_one or
1585 node.tag(tree) == .array_init_one_comma);
1586 const type_expr, buffer[0] = node.data(tree).node_and_node;
15991587 return .{
16001588 .ast = .{
1601 .lbrace = tree.nodeMainToken(node),
1589 .lbrace = node.mainToken(tree),
16021590 .elements = buffer[0..1],
16031591 .type_expr = type_expr.toOptional(),
16041592 },
16051593 };
16061594}
16071595
1608pub fn arrayInitDotTwo(tree: Ast, buffer: *[2]Node.Index, node: Node.Index) full.ArrayInit {
1609 assert(tree.nodeTag(node) == .array_init_dot_two or
1610 tree.nodeTag(node) == .array_init_dot_two_comma);
1611 const elements = loadOptionalNodesIntoBuffer(2, buffer, tree.nodeData(node).opt_node_and_opt_node);
1596pub fn arrayInitDotTwo(tree: *const Ast, buffer: *[2]Node.Index, node: Node.Index) full.ArrayInit {
1597 assert(node.tag(tree) == .array_init_dot_two or
1598 node.tag(tree) == .array_init_dot_two_comma);
1599 const elements = loadOptionalNodesIntoBuffer(2, buffer, node.data(tree).opt_node_and_opt_node);
16121600 return .{
16131601 .ast = .{
1614 .lbrace = tree.nodeMainToken(node),
1602 .lbrace = node.mainToken(tree),
16151603 .elements = elements,
16161604 .type_expr = .none,
16171605 },
16181606 };
16191607}
16201608
1621pub fn arrayInitDot(tree: Ast, node: Node.Index) full.ArrayInit {
1622 assert(tree.nodeTag(node) == .array_init_dot or
1623 tree.nodeTag(node) == .array_init_dot_comma);
1624 const elements = tree.extraDataSlice(tree.nodeData(node).extra_range, Node.Index);
1609pub fn arrayInitDot(tree: *const Ast, node: Node.Index) full.ArrayInit {
1610 assert(node.tag(tree) == .array_init_dot or
1611 node.tag(tree) == .array_init_dot_comma);
1612 const elements = tree.extraDataSlice(node.data(tree).extra_range, Node.Index);
16251613 return .{
16261614 .ast = .{
1627 .lbrace = tree.nodeMainToken(node),
1615 .lbrace = node.mainToken(tree),
16281616 .elements = elements,
16291617 .type_expr = .none,
16301618 },
16311619 };
16321620}
16331621
1634pub fn arrayInit(tree: Ast, node: Node.Index) full.ArrayInit {
1635 assert(tree.nodeTag(node) == .array_init or
1636 tree.nodeTag(node) == .array_init_comma);
1637 const type_expr, const extra_index = tree.nodeData(node).node_and_extra;
1622pub fn arrayInit(tree: *const Ast, node: Node.Index) full.ArrayInit {
1623 assert(node.tag(tree) == .array_init or
1624 node.tag(tree) == .array_init_comma);
1625 const type_expr, const extra_index = node.data(tree).node_and_extra;
16381626 const elements = tree.extraDataSlice(tree.extraData(extra_index, Node.SubRange), Node.Index);
16391627 return .{
16401628 .ast = .{
1641 .lbrace = tree.nodeMainToken(node),
1629 .lbrace = node.mainToken(tree),
16421630 .elements = elements,
16431631 .type_expr = type_expr.toOptional(),
16441632 },
16451633 };
16461634}
16471635
1648pub fn arrayType(tree: Ast, node: Node.Index) full.ArrayType {
1649 assert(tree.nodeTag(node) == .array_type);
1650 const elem_count, const elem_type = tree.nodeData(node).node_and_node;
1636pub fn arrayType(tree: *const Ast, node: Node.Index) full.ArrayType {
1637 assert(node.tag(tree) == .array_type);
1638 const elem_count, const elem_type = node.data(tree).node_and_node;
16511639 return .{
16521640 .ast = .{
1653 .lbracket = tree.nodeMainToken(node),
1641 .lbracket = node.mainToken(tree),
16541642 .elem_count = elem_count,
16551643 .sentinel = .none,
16561644 .elem_type = elem_type,
......@@ -1658,13 +1646,13 @@ pub fn arrayType(tree: Ast, node: Node.Index) full.ArrayType {
16581646 };
16591647}
16601648
1661pub fn arrayTypeSentinel(tree: Ast, node: Node.Index) full.ArrayType {
1662 assert(tree.nodeTag(node) == .array_type_sentinel);
1663 const elem_count, const extra_index = tree.nodeData(node).node_and_extra;
1649pub fn arrayTypeSentinel(tree: *const Ast, node: Node.Index) full.ArrayType {
1650 assert(node.tag(tree) == .array_type_sentinel);
1651 const elem_count, const extra_index = node.data(tree).node_and_extra;
16641652 const extra = tree.extraData(extra_index, Node.ArrayTypeSentinel);
16651653 return .{
16661654 .ast = .{
1667 .lbracket = tree.nodeMainToken(node),
1655 .lbracket = node.mainToken(tree),
16681656 .elem_count = elem_count,
16691657 .sentinel = extra.sentinel.toOptional(),
16701658 .elem_type = extra.elem_type,
......@@ -1672,11 +1660,11 @@ pub fn arrayTypeSentinel(tree: Ast, node: Node.Index) full.ArrayType {
16721660 };
16731661}
16741662
1675pub fn ptrTypeAligned(tree: Ast, node: Node.Index) full.PtrType {
1676 assert(tree.nodeTag(node) == .ptr_type_aligned);
1677 const align_node, const child_type = tree.nodeData(node).opt_node_and_node;
1663pub fn ptrTypeAligned(tree: *const Ast, node: Node.Index) full.PtrType {
1664 assert(node.tag(tree) == .ptr_type_aligned);
1665 const align_node, const child_type = node.data(tree).opt_node_and_node;
16781666 return tree.fullPtrTypeComponents(.{
1679 .main_token = tree.nodeMainToken(node),
1667 .main_token = node.mainToken(tree),
16801668 .align_node = align_node,
16811669 .addrspace_node = .none,
16821670 .sentinel = .none,
......@@ -1686,11 +1674,11 @@ pub fn ptrTypeAligned(tree: Ast, node: Node.Index) full.PtrType {
16861674 });
16871675}
16881676
1689pub fn ptrTypeSentinel(tree: Ast, node: Node.Index) full.PtrType {
1690 assert(tree.nodeTag(node) == .ptr_type_sentinel);
1691 const sentinel, const child_type = tree.nodeData(node).opt_node_and_node;
1677pub fn ptrTypeSentinel(tree: *const Ast, node: Node.Index) full.PtrType {
1678 assert(node.tag(tree) == .ptr_type_sentinel);
1679 const sentinel, const child_type = node.data(tree).opt_node_and_node;
16921680 return tree.fullPtrTypeComponents(.{
1693 .main_token = tree.nodeMainToken(node),
1681 .main_token = node.mainToken(tree),
16941682 .align_node = .none,
16951683 .addrspace_node = .none,
16961684 .sentinel = sentinel,
......@@ -1700,12 +1688,12 @@ pub fn ptrTypeSentinel(tree: Ast, node: Node.Index) full.PtrType {
17001688 });
17011689}
17021690
1703pub fn ptrType(tree: Ast, node: Node.Index) full.PtrType {
1704 assert(tree.nodeTag(node) == .ptr_type);
1705 const extra_index, const child_type = tree.nodeData(node).extra_and_node;
1691pub fn ptrType(tree: *const Ast, node: Node.Index) full.PtrType {
1692 assert(node.tag(tree) == .ptr_type);
1693 const extra_index, const child_type = node.data(tree).extra_and_node;
17061694 const extra = tree.extraData(extra_index, Node.PtrType);
17071695 return tree.fullPtrTypeComponents(.{
1708 .main_token = tree.nodeMainToken(node),
1696 .main_token = node.mainToken(tree),
17091697 .align_node = extra.align_node,
17101698 .addrspace_node = extra.addrspace_node,
17111699 .sentinel = extra.sentinel,
......@@ -1715,12 +1703,12 @@ pub fn ptrType(tree: Ast, node: Node.Index) full.PtrType {
17151703 });
17161704}
17171705
1718pub fn ptrTypeBitRange(tree: Ast, node: Node.Index) full.PtrType {
1719 assert(tree.nodeTag(node) == .ptr_type_bit_range);
1720 const extra_index, const child_type = tree.nodeData(node).extra_and_node;
1706pub fn ptrTypeBitRange(tree: *const Ast, node: Node.Index) full.PtrType {
1707 assert(node.tag(tree) == .ptr_type_bit_range);
1708 const extra_index, const child_type = node.data(tree).extra_and_node;
17211709 const extra = tree.extraData(extra_index, Node.PtrTypeBitRange);
17221710 return tree.fullPtrTypeComponents(.{
1723 .main_token = tree.nodeMainToken(node),
1711 .main_token = node.mainToken(tree),
17241712 .align_node = extra.align_node.toOptional(),
17251713 .addrspace_node = extra.addrspace_node,
17261714 .sentinel = extra.sentinel,
......@@ -1730,13 +1718,13 @@ pub fn ptrTypeBitRange(tree: Ast, node: Node.Index) full.PtrType {
17301718 });
17311719}
17321720
1733pub fn sliceOpen(tree: Ast, node: Node.Index) full.Slice {
1734 assert(tree.nodeTag(node) == .slice_open);
1735 const sliced, const start = tree.nodeData(node).node_and_node;
1721pub fn sliceOpen(tree: *const Ast, node: Node.Index) full.Slice {
1722 assert(node.tag(tree) == .slice_open);
1723 const sliced, const start = node.data(tree).node_and_node;
17361724 return .{
17371725 .ast = .{
17381726 .sliced = sliced,
1739 .lbracket = tree.nodeMainToken(node),
1727 .lbracket = node.mainToken(tree),
17401728 .start = start,
17411729 .end = .none,
17421730 .sentinel = .none,
......@@ -1744,14 +1732,14 @@ pub fn sliceOpen(tree: Ast, node: Node.Index) full.Slice {
17441732 };
17451733}
17461734
1747pub fn slice(tree: Ast, node: Node.Index) full.Slice {
1748 assert(tree.nodeTag(node) == .slice);
1749 const sliced, const extra_index = tree.nodeData(node).node_and_extra;
1735pub fn slice(tree: *const Ast, node: Node.Index) full.Slice {
1736 assert(node.tag(tree) == .slice);
1737 const sliced, const extra_index = node.data(tree).node_and_extra;
17501738 const extra = tree.extraData(extra_index, Node.Slice);
17511739 return .{
17521740 .ast = .{
17531741 .sliced = sliced,
1754 .lbracket = tree.nodeMainToken(node),
1742 .lbracket = node.mainToken(tree),
17551743 .start = extra.start,
17561744 .end = extra.end.toOptional(),
17571745 .sentinel = .none,
......@@ -1759,14 +1747,14 @@ pub fn slice(tree: Ast, node: Node.Index) full.Slice {
17591747 };
17601748}
17611749
1762pub fn sliceSentinel(tree: Ast, node: Node.Index) full.Slice {
1763 assert(tree.nodeTag(node) == .slice_sentinel);
1764 const sliced, const extra_index = tree.nodeData(node).node_and_extra;
1750pub fn sliceSentinel(tree: *const Ast, node: Node.Index) full.Slice {
1751 assert(node.tag(tree) == .slice_sentinel);
1752 const sliced, const extra_index = node.data(tree).node_and_extra;
17651753 const extra = tree.extraData(extra_index, Node.SliceSentinel);
17661754 return .{
17671755 .ast = .{
17681756 .sliced = sliced,
1769 .lbracket = tree.nodeMainToken(node),
1757 .lbracket = node.mainToken(tree),
17701758 .start = extra.start,
17711759 .end = extra.end,
17721760 .sentinel = extra.sentinel.toOptional(),
......@@ -1774,44 +1762,44 @@ pub fn sliceSentinel(tree: Ast, node: Node.Index) full.Slice {
17741762 };
17751763}
17761764
1777pub fn containerDeclTwo(tree: Ast, buffer: *[2]Node.Index, node: Node.Index) full.ContainerDecl {
1778 assert(tree.nodeTag(node) == .container_decl_two or
1779 tree.nodeTag(node) == .container_decl_two_trailing);
1780 const members = loadOptionalNodesIntoBuffer(2, buffer, tree.nodeData(node).opt_node_and_opt_node);
1765pub fn containerDeclTwo(tree: *const Ast, buffer: *[2]Node.Index, node: Node.Index) full.ContainerDecl {
1766 assert(node.tag(tree) == .container_decl_two or
1767 node.tag(tree) == .container_decl_two_trailing);
1768 const members = loadOptionalNodesIntoBuffer(2, buffer, node.data(tree).opt_node_and_opt_node);
17811769 return tree.fullContainerDeclComponents(.{
1782 .main_token = tree.nodeMainToken(node),
1770 .main_token = node.mainToken(tree),
17831771 .enum_token = null,
17841772 .members = members,
17851773 .arg = .none,
17861774 });
17871775}
17881776
1789pub fn containerDecl(tree: Ast, node: Node.Index) full.ContainerDecl {
1790 assert(tree.nodeTag(node) == .container_decl or
1791 tree.nodeTag(node) == .container_decl_trailing);
1792 const members = tree.extraDataSlice(tree.nodeData(node).extra_range, Node.Index);
1777pub fn containerDecl(tree: *const Ast, node: Node.Index) full.ContainerDecl {
1778 assert(node.tag(tree) == .container_decl or
1779 node.tag(tree) == .container_decl_trailing);
1780 const members = tree.extraDataSlice(node.data(tree).extra_range, Node.Index);
17931781 return tree.fullContainerDeclComponents(.{
1794 .main_token = tree.nodeMainToken(node),
1782 .main_token = node.mainToken(tree),
17951783 .enum_token = null,
17961784 .members = members,
17971785 .arg = .none,
17981786 });
17991787}
18001788
1801pub fn containerDeclArg(tree: Ast, node: Node.Index) full.ContainerDecl {
1802 assert(tree.nodeTag(node) == .container_decl_arg or
1803 tree.nodeTag(node) == .container_decl_arg_trailing);
1804 const arg, const extra_index = tree.nodeData(node).node_and_extra;
1789pub fn containerDeclArg(tree: *const Ast, node: Node.Index) full.ContainerDecl {
1790 assert(node.tag(tree) == .container_decl_arg or
1791 node.tag(tree) == .container_decl_arg_trailing);
1792 const arg, const extra_index = node.data(tree).node_and_extra;
18051793 const members = tree.extraDataSlice(tree.extraData(extra_index, Node.SubRange), Node.Index);
18061794 return tree.fullContainerDeclComponents(.{
1807 .main_token = tree.nodeMainToken(node),
1795 .main_token = node.mainToken(tree),
18081796 .enum_token = null,
18091797 .members = members,
18101798 .arg = arg.toOptional(),
18111799 });
18121800}
18131801
1814pub fn containerDeclRoot(tree: Ast) full.ContainerDecl {
1802pub fn containerDeclRoot(tree: *const Ast) full.ContainerDecl {
18151803 return .{
18161804 .layout_token = null,
18171805 .ast = .{
......@@ -1823,11 +1811,11 @@ pub fn containerDeclRoot(tree: Ast) full.ContainerDecl {
18231811 };
18241812}
18251813
1826pub fn taggedUnionTwo(tree: Ast, buffer: *[2]Node.Index, node: Node.Index) full.ContainerDecl {
1827 assert(tree.nodeTag(node) == .tagged_union_two or
1828 tree.nodeTag(node) == .tagged_union_two_trailing);
1829 const members = loadOptionalNodesIntoBuffer(2, buffer, tree.nodeData(node).opt_node_and_opt_node);
1830 const main_token = tree.nodeMainToken(node);
1814pub fn taggedUnionTwo(tree: *const Ast, buffer: *[2]Node.Index, node: Node.Index) full.ContainerDecl {
1815 assert(node.tag(tree) == .tagged_union_two or
1816 node.tag(tree) == .tagged_union_two_trailing);
1817 const members = loadOptionalNodesIntoBuffer(2, buffer, node.data(tree).opt_node_and_opt_node);
1818 const main_token = node.mainToken(tree);
18311819 return tree.fullContainerDeclComponents(.{
18321820 .main_token = main_token,
18331821 .enum_token = main_token + 2, // union lparen enum
......@@ -1836,11 +1824,11 @@ pub fn taggedUnionTwo(tree: Ast, buffer: *[2]Node.Index, node: Node.Index) full.
18361824 });
18371825}
18381826
1839pub fn taggedUnion(tree: Ast, node: Node.Index) full.ContainerDecl {
1840 assert(tree.nodeTag(node) == .tagged_union or
1841 tree.nodeTag(node) == .tagged_union_trailing);
1842 const members = tree.extraDataSlice(tree.nodeData(node).extra_range, Node.Index);
1843 const main_token = tree.nodeMainToken(node);
1827pub fn taggedUnion(tree: *const Ast, node: Node.Index) full.ContainerDecl {
1828 assert(node.tag(tree) == .tagged_union or
1829 node.tag(tree) == .tagged_union_trailing);
1830 const members = tree.extraDataSlice(node.data(tree).extra_range, Node.Index);
1831 const main_token = node.mainToken(tree);
18441832 return tree.fullContainerDeclComponents(.{
18451833 .main_token = main_token,
18461834 .enum_token = main_token + 2, // union lparen enum
......@@ -1849,12 +1837,12 @@ pub fn taggedUnion(tree: Ast, node: Node.Index) full.ContainerDecl {
18491837 });
18501838}
18511839
1852pub fn taggedUnionEnumTag(tree: Ast, node: Node.Index) full.ContainerDecl {
1853 assert(tree.nodeTag(node) == .tagged_union_enum_tag or
1854 tree.nodeTag(node) == .tagged_union_enum_tag_trailing);
1855 const arg, const extra_index = tree.nodeData(node).node_and_extra;
1840pub fn taggedUnionEnumTag(tree: *const Ast, node: Node.Index) full.ContainerDecl {
1841 assert(node.tag(tree) == .tagged_union_enum_tag or
1842 node.tag(tree) == .tagged_union_enum_tag_trailing);
1843 const arg, const extra_index = node.data(tree).node_and_extra;
18561844 const members = tree.extraDataSlice(tree.extraData(extra_index, Node.SubRange), Node.Index);
1857 const main_token = tree.nodeMainToken(node);
1845 const main_token = node.mainToken(tree);
18581846 return tree.fullContainerDeclComponents(.{
18591847 .main_token = main_token,
18601848 .enum_token = main_token + 2, // union lparen enum
......@@ -1863,14 +1851,14 @@ pub fn taggedUnionEnumTag(tree: Ast, node: Node.Index) full.ContainerDecl {
18631851 });
18641852}
18651853
1866pub fn switchFull(tree: Ast, node: Node.Index) full.Switch {
1867 const main_token = tree.nodeMainToken(node);
1854pub fn switchFull(tree: *const Ast, node: Node.Index) full.Switch {
1855 const main_token = node.mainToken(tree);
18681856 const switch_token: TokenIndex, const label_token: ?TokenIndex = switch (tree.tokenTag(main_token)) {
18691857 .identifier => .{ main_token + 2, main_token },
18701858 .keyword_switch => .{ main_token, null },
18711859 else => unreachable,
18721860 };
1873 const condition, const extra_index = tree.nodeData(node).node_and_extra;
1861 const condition, const extra_index = node.data(tree).node_and_extra;
18741862 const cases = tree.extraDataSlice(tree.extraData(extra_index, Ast.Node.SubRange), Node.Index);
18751863 return .{
18761864 .ast = .{
......@@ -1882,55 +1870,55 @@ pub fn switchFull(tree: Ast, node: Node.Index) full.Switch {
18821870 };
18831871}
18841872
1885pub fn switchCaseOne(tree: Ast, node: Node.Index) full.SwitchCase {
1886 const first_value, const target_expr = tree.nodeData(node).opt_node_and_node;
1873pub fn switchCaseOne(tree: *const Ast, node: Node.Index) full.SwitchCase {
1874 const first_value, const target_expr = node.data(tree).opt_node_and_node;
18871875 return tree.fullSwitchCaseComponents(.{
18881876 .values = if (first_value == .none)
18891877 &.{}
18901878 else
18911879 // Ensure that the returned slice points into the existing memory of the Ast
18921880 (@as(*const Node.Index, @ptrCast(&tree.nodes.items(.data)[@intFromEnum(node)].opt_node_and_node[0])))[0..1],
1893 .arrow_token = tree.nodeMainToken(node),
1881 .arrow_token = node.mainToken(tree),
18941882 .target_expr = target_expr,
18951883 }, node);
18961884}
18971885
1898pub fn switchCase(tree: Ast, node: Node.Index) full.SwitchCase {
1899 const extra_index, const target_expr = tree.nodeData(node).extra_and_node;
1886pub fn switchCase(tree: *const Ast, node: Node.Index) full.SwitchCase {
1887 const extra_index, const target_expr = node.data(tree).extra_and_node;
19001888 const values = tree.extraDataSlice(tree.extraData(extra_index, Node.SubRange), Node.Index);
19011889 return tree.fullSwitchCaseComponents(.{
19021890 .values = values,
1903 .arrow_token = tree.nodeMainToken(node),
1891 .arrow_token = node.mainToken(tree),
19041892 .target_expr = target_expr,
19051893 }, node);
19061894}
19071895
1908pub fn asmSimple(tree: Ast, node: Node.Index) full.Asm {
1909 const template, const rparen = tree.nodeData(node).node_and_token;
1896pub fn asmSimple(tree: *const Ast, node: Node.Index) full.Asm {
1897 const template, const rparen = node.data(tree).node_and_token;
19101898 return tree.fullAsmComponents(.{
1911 .asm_token = tree.nodeMainToken(node),
1899 .asm_token = node.mainToken(tree),
19121900 .template = template,
19131901 .items = &.{},
19141902 .rparen = rparen,
19151903 });
19161904}
19171905
1918pub fn asmFull(tree: Ast, node: Node.Index) full.Asm {
1919 const template, const extra_index = tree.nodeData(node).node_and_extra;
1906pub fn asmFull(tree: *const Ast, node: Node.Index) full.Asm {
1907 const template, const extra_index = node.data(tree).node_and_extra;
19201908 const extra = tree.extraData(extra_index, Node.Asm);
19211909 const items = tree.extraDataSlice(.{ .start = extra.items_start, .end = extra.items_end }, Node.Index);
19221910 return tree.fullAsmComponents(.{
1923 .asm_token = tree.nodeMainToken(node),
1911 .asm_token = node.mainToken(tree),
19241912 .template = template,
19251913 .items = items,
19261914 .rparen = extra.rparen,
19271915 });
19281916}
19291917
1930pub fn whileSimple(tree: Ast, node: Node.Index) full.While {
1931 const cond_expr, const then_expr = tree.nodeData(node).node_and_node;
1918pub fn whileSimple(tree: *const Ast, node: Node.Index) full.While {
1919 const cond_expr, const then_expr = node.data(tree).node_and_node;
19321920 return tree.fullWhileComponents(.{
1933 .while_token = tree.nodeMainToken(node),
1921 .while_token = node.mainToken(tree),
19341922 .cond_expr = cond_expr,
19351923 .cont_expr = .none,
19361924 .then_expr = then_expr,
......@@ -1938,11 +1926,11 @@ pub fn whileSimple(tree: Ast, node: Node.Index) full.While {
19381926 });
19391927}
19401928
1941pub fn whileCont(tree: Ast, node: Node.Index) full.While {
1942 const cond_expr, const extra_index = tree.nodeData(node).node_and_extra;
1929pub fn whileCont(tree: *const Ast, node: Node.Index) full.While {
1930 const cond_expr, const extra_index = node.data(tree).node_and_extra;
19431931 const extra = tree.extraData(extra_index, Node.WhileCont);
19441932 return tree.fullWhileComponents(.{
1945 .while_token = tree.nodeMainToken(node),
1933 .while_token = node.mainToken(tree),
19461934 .cond_expr = cond_expr,
19471935 .cont_expr = extra.cont_expr.toOptional(),
19481936 .then_expr = extra.then_expr,
......@@ -1950,11 +1938,11 @@ pub fn whileCont(tree: Ast, node: Node.Index) full.While {
19501938 });
19511939}
19521940
1953pub fn whileFull(tree: Ast, node: Node.Index) full.While {
1954 const cond_expr, const extra_index = tree.nodeData(node).node_and_extra;
1941pub fn whileFull(tree: *const Ast, node: Node.Index) full.While {
1942 const cond_expr, const extra_index = node.data(tree).node_and_extra;
19551943 const extra = tree.extraData(extra_index, Node.While);
19561944 return tree.fullWhileComponents(.{
1957 .while_token = tree.nodeMainToken(node),
1945 .while_token = node.mainToken(tree),
19581946 .cond_expr = cond_expr,
19591947 .cont_expr = extra.cont_expr,
19601948 .then_expr = extra.then_expr,
......@@ -1962,50 +1950,50 @@ pub fn whileFull(tree: Ast, node: Node.Index) full.While {
19621950 });
19631951}
19641952
1965pub fn forSimple(tree: Ast, node: Node.Index) full.For {
1953pub fn forSimple(tree: *const Ast, node: Node.Index) full.For {
19661954 const data = &tree.nodes.items(.data)[@intFromEnum(node)].node_and_node;
19671955 return tree.fullForComponents(.{
1968 .for_token = tree.nodeMainToken(node),
1956 .for_token = node.mainToken(tree),
19691957 .inputs = (&data[0])[0..1],
19701958 .then_expr = data[1],
19711959 .else_expr = .none,
19721960 });
19731961}
19741962
1975pub fn forFull(tree: Ast, node: Node.Index) full.For {
1976 const extra_index, const extra = tree.nodeData(node).@"for";
1963pub fn forFull(tree: *const Ast, node: Node.Index) full.For {
1964 const extra_index, const extra = node.data(tree).@"for";
19771965 const inputs = tree.extraDataSliceWithLen(extra_index, extra.inputs, Node.Index);
19781966 const then_expr: Node.Index = @enumFromInt(tree.extra_data[@intFromEnum(extra_index) + extra.inputs]);
19791967 const else_expr: Node.OptionalIndex = if (extra.has_else) @enumFromInt(tree.extra_data[@intFromEnum(extra_index) + extra.inputs + 1]) else .none;
19801968 return tree.fullForComponents(.{
1981 .for_token = tree.nodeMainToken(node),
1969 .for_token = node.mainToken(tree),
19821970 .inputs = inputs,
19831971 .then_expr = then_expr,
19841972 .else_expr = else_expr,
19851973 });
19861974}
19871975
1988pub fn callOne(tree: Ast, buffer: *[1]Node.Index, node: Node.Index) full.Call {
1989 const fn_expr, const first_param = tree.nodeData(node).node_and_opt_node;
1976pub fn callOne(tree: *const Ast, buffer: *[1]Node.Index, node: Node.Index) full.Call {
1977 const fn_expr, const first_param = node.data(tree).node_and_opt_node;
19901978 const params = loadOptionalNodesIntoBuffer(1, buffer, .{first_param});
19911979 return tree.fullCallComponents(.{
1992 .lparen = tree.nodeMainToken(node),
1980 .lparen = node.mainToken(tree),
19931981 .fn_expr = fn_expr,
19941982 .params = params,
19951983 });
19961984}
19971985
1998pub fn callFull(tree: Ast, node: Node.Index) full.Call {
1999 const fn_expr, const extra_index = tree.nodeData(node).node_and_extra;
1986pub fn callFull(tree: *const Ast, node: Node.Index) full.Call {
1987 const fn_expr, const extra_index = node.data(tree).node_and_extra;
20001988 const params = tree.extraDataSlice(tree.extraData(extra_index, Node.SubRange), Node.Index);
20011989 return tree.fullCallComponents(.{
2002 .lparen = tree.nodeMainToken(node),
1990 .lparen = node.mainToken(tree),
20031991 .fn_expr = fn_expr,
20041992 .params = params,
20051993 });
20061994}
20071995
2008fn fullVarDeclComponents(tree: Ast, info: full.VarDecl.Components) full.VarDecl {
1996fn fullVarDeclComponents(tree: *const Ast, info: full.VarDecl.Components) full.VarDecl {
20091997 var result: full.VarDecl = .{
20101998 .ast = info,
20111999 .visib_token = null,
......@@ -2029,13 +2017,13 @@ fn fullVarDeclComponents(tree: Ast, info: full.VarDecl.Components) full.VarDecl
20292017 return result;
20302018}
20312019
2032fn fullAssignDestructureComponents(tree: Ast, info: full.AssignDestructure.Components) full.AssignDestructure {
2020fn fullAssignDestructureComponents(tree: *const Ast, info: full.AssignDestructure.Components) full.AssignDestructure {
20332021 var result: full.AssignDestructure = .{
20342022 .comptime_token = null,
20352023 .ast = info,
20362024 };
20372025 const first_variable_token = tree.firstToken(info.variables[0]);
2038 const maybe_comptime_token = switch (tree.nodeTag(info.variables[0])) {
2026 const maybe_comptime_token = switch (info.variables[0].tag(tree)) {
20392027 .global_var_decl,
20402028 .local_var_decl,
20412029 .aligned_var_decl,
......@@ -2049,7 +2037,7 @@ fn fullAssignDestructureComponents(tree: Ast, info: full.AssignDestructure.Compo
20492037 return result;
20502038}
20512039
2052fn fullIfComponents(tree: Ast, info: full.If.Components) full.If {
2040fn fullIfComponents(tree: *const Ast, info: full.If.Components) full.If {
20532041 var result: full.If = .{
20542042 .ast = info,
20552043 .payload_token = null,
......@@ -2073,7 +2061,7 @@ fn fullIfComponents(tree: Ast, info: full.If.Components) full.If {
20732061 return result;
20742062}
20752063
2076fn fullContainerFieldComponents(tree: Ast, info: full.ContainerField.Components) full.ContainerField {
2064fn fullContainerFieldComponents(tree: *const Ast, info: full.ContainerField.Components) full.ContainerField {
20772065 var result: full.ContainerField = .{
20782066 .ast = info,
20792067 .comptime_token = null,
......@@ -2088,7 +2076,7 @@ fn fullContainerFieldComponents(tree: Ast, info: full.ContainerField.Components)
20882076 return result;
20892077}
20902078
2091fn fullFnProtoComponents(tree: Ast, info: full.FnProto.Components) full.FnProto {
2079fn fullFnProtoComponents(tree: *const Ast, info: full.FnProto.Components) full.FnProto {
20922080 var result: full.FnProto = .{
20932081 .ast = info,
20942082 .visib_token = null,
......@@ -2123,7 +2111,7 @@ fn fullFnProtoComponents(tree: Ast, info: full.FnProto.Components) full.FnProto
21232111 return result;
21242112}
21252113
2126fn fullPtrTypeComponents(tree: Ast, info: full.PtrType.Components) full.PtrType {
2114fn fullPtrTypeComponents(tree: *const Ast, info: full.PtrType.Components) full.PtrType {
21272115 const size: std.builtin.Type.Pointer.Size = switch (tree.tokenTag(info.main_token)) {
21282116 .asterisk,
21292117 .asterisk_asterisk,
......@@ -2170,7 +2158,7 @@ fn fullPtrTypeComponents(tree: Ast, info: full.PtrType.Components) full.PtrType
21702158 return result;
21712159}
21722160
2173fn fullContainerDeclComponents(tree: Ast, info: full.ContainerDecl.Components) full.ContainerDecl {
2161fn fullContainerDeclComponents(tree: *const Ast, info: full.ContainerDecl.Components) full.ContainerDecl {
21742162 var result: full.ContainerDecl = .{
21752163 .ast = info,
21762164 .layout_token = null,
......@@ -2186,7 +2174,7 @@ fn fullContainerDeclComponents(tree: Ast, info: full.ContainerDecl.Components) f
21862174 return result;
21872175}
21882176
2189fn fullSwitchComponents(tree: Ast, info: full.Switch.Components) full.Switch {
2177fn fullSwitchComponents(tree: *const Ast, info: full.Switch.Components) full.Switch {
21902178 const tok_i = info.switch_token -| 1;
21912179 var result: full.Switch = .{
21922180 .ast = info,
......@@ -2200,7 +2188,7 @@ fn fullSwitchComponents(tree: Ast, info: full.Switch.Components) full.Switch {
22002188 return result;
22012189}
22022190
2203fn fullSwitchCaseComponents(tree: Ast, info: full.SwitchCase.Components, node: Node.Index) full.SwitchCase {
2191fn fullSwitchCaseComponents(tree: *const Ast, info: full.SwitchCase.Components, node: Node.Index) full.SwitchCase {
22042192 var result: full.SwitchCase = .{
22052193 .ast = info,
22062194 .payload_token = null,
......@@ -2209,7 +2197,7 @@ fn fullSwitchCaseComponents(tree: Ast, info: full.SwitchCase.Components, node: N
22092197 if (tree.tokenTag(info.arrow_token + 1) == .pipe) {
22102198 result.payload_token = info.arrow_token + 2;
22112199 }
2212 result.inline_token = switch (tree.nodeTag(node)) {
2200 result.inline_token = switch (node.tag(tree)) {
22132201 .switch_case_inline, .switch_case_inline_one => if (result.ast.values.len == 0)
22142202 info.arrow_token - 2
22152203 else
......@@ -2219,7 +2207,7 @@ fn fullSwitchCaseComponents(tree: Ast, info: full.SwitchCase.Components, node: N
22192207 return result;
22202208}
22212209
2222fn fullAsmComponents(tree: Ast, info: full.Asm.Components) full.Asm {
2210fn fullAsmComponents(tree: *const Ast, info: full.Asm.Components) full.Asm {
22232211 var result: full.Asm = .{
22242212 .ast = info,
22252213 .volatile_token = null,
......@@ -2231,7 +2219,7 @@ fn fullAsmComponents(tree: Ast, info: full.Asm.Components) full.Asm {
22312219 result.volatile_token = info.asm_token + 1;
22322220 }
22332221 const outputs_end: usize = for (info.items, 0..) |item, i| {
2234 switch (tree.nodeTag(item)) {
2222 switch (item.tag(tree)) {
22352223 .asm_output => continue,
22362224 else => break i,
22372225 }
......@@ -2280,7 +2268,7 @@ fn fullAsmComponents(tree: Ast, info: full.Asm.Components) full.Asm {
22802268 return result;
22812269}
22822270
2283fn fullWhileComponents(tree: Ast, info: full.While.Components) full.While {
2271fn fullWhileComponents(tree: *const Ast, info: full.While.Components) full.While {
22842272 var result: full.While = .{
22852273 .ast = info,
22862274 .inline_token = null,
......@@ -2312,7 +2300,7 @@ fn fullWhileComponents(tree: Ast, info: full.While.Components) full.While {
23122300 return result;
23132301}
23142302
2315fn fullForComponents(tree: Ast, info: full.For.Components) full.For {
2303fn fullForComponents(tree: *const Ast, info: full.For.Components) full.For {
23162304 var result: full.For = .{
23172305 .ast = info,
23182306 .inline_token = null,
......@@ -2336,7 +2324,7 @@ fn fullForComponents(tree: Ast, info: full.For.Components) full.For {
23362324 return result;
23372325}
23382326
2339fn fullCallComponents(tree: Ast, info: full.Call.Components) full.Call {
2327fn fullCallComponents(tree: *const Ast, info: full.Call.Components) full.Call {
23402328 var result: full.Call = .{
23412329 .ast = info,
23422330 .async_token = null,
......@@ -2348,8 +2336,8 @@ fn fullCallComponents(tree: Ast, info: full.Call.Components) full.Call {
23482336 return result;
23492337}
23502338
2351pub fn fullVarDecl(tree: Ast, node: Node.Index) ?full.VarDecl {
2352 return switch (tree.nodeTag(node)) {
2339pub fn fullVarDecl(tree: *const Ast, node: Node.Index) ?full.VarDecl {
2340 return switch (node.tag(tree)) {
23532341 .global_var_decl => tree.globalVarDecl(node),
23542342 .local_var_decl => tree.localVarDecl(node),
23552343 .aligned_var_decl => tree.alignedVarDecl(node),
......@@ -2358,16 +2346,16 @@ pub fn fullVarDecl(tree: Ast, node: Node.Index) ?full.VarDecl {
23582346 };
23592347}
23602348
2361pub fn fullIf(tree: Ast, node: Node.Index) ?full.If {
2362 return switch (tree.nodeTag(node)) {
2349pub fn fullIf(tree: *const Ast, node: Node.Index) ?full.If {
2350 return switch (node.tag(tree)) {
23632351 .if_simple => tree.ifSimple(node),
23642352 .@"if" => tree.ifFull(node),
23652353 else => null,
23662354 };
23672355}
23682356
2369pub fn fullWhile(tree: Ast, node: Node.Index) ?full.While {
2370 return switch (tree.nodeTag(node)) {
2357pub fn fullWhile(tree: *const Ast, node: Node.Index) ?full.While {
2358 return switch (node.tag(tree)) {
23712359 .while_simple => tree.whileSimple(node),
23722360 .while_cont => tree.whileCont(node),
23732361 .@"while" => tree.whileFull(node),
......@@ -2375,16 +2363,16 @@ pub fn fullWhile(tree: Ast, node: Node.Index) ?full.While {
23752363 };
23762364}
23772365
2378pub fn fullFor(tree: Ast, node: Node.Index) ?full.For {
2379 return switch (tree.nodeTag(node)) {
2366pub fn fullFor(tree: *const Ast, node: Node.Index) ?full.For {
2367 return switch (node.tag(tree)) {
23802368 .for_simple => tree.forSimple(node),
23812369 .@"for" => tree.forFull(node),
23822370 else => null,
23832371 };
23842372}
23852373
2386pub fn fullContainerField(tree: Ast, node: Node.Index) ?full.ContainerField {
2387 return switch (tree.nodeTag(node)) {
2374pub fn fullContainerField(tree: *const Ast, node: Node.Index) ?full.ContainerField {
2375 return switch (node.tag(tree)) {
23882376 .container_field_init => tree.containerFieldInit(node),
23892377 .container_field_align => tree.containerFieldAlign(node),
23902378 .container_field => tree.containerField(node),
......@@ -2392,19 +2380,19 @@ pub fn fullContainerField(tree: Ast, node: Node.Index) ?full.ContainerField {
23922380 };
23932381}
23942382
2395pub fn fullFnProto(tree: Ast, buffer: *[1]Ast.Node.Index, node: Node.Index) ?full.FnProto {
2396 return switch (tree.nodeTag(node)) {
2383pub fn fullFnProto(tree: *const Ast, buffer: *[1]Ast.Node.Index, node: Node.Index) ?full.FnProto {
2384 return switch (node.tag(tree)) {
23972385 .fn_proto => tree.fnProto(node),
23982386 .fn_proto_multi => tree.fnProtoMulti(node),
23992387 .fn_proto_one => tree.fnProtoOne(buffer, node),
24002388 .fn_proto_simple => tree.fnProtoSimple(buffer, node),
2401 .fn_decl => tree.fullFnProto(buffer, tree.nodeData(node).node_and_node[0]),
2389 .fn_decl => tree.fullFnProto(buffer, node.data(tree).node_and_node[0]),
24022390 else => null,
24032391 };
24042392}
24052393
2406pub fn fullStructInit(tree: Ast, buffer: *[2]Ast.Node.Index, node: Node.Index) ?full.StructInit {
2407 return switch (tree.nodeTag(node)) {
2394pub fn fullStructInit(tree: *const Ast, buffer: *[2]Ast.Node.Index, node: Node.Index) ?full.StructInit {
2395 return switch (node.tag(tree)) {
24082396 .struct_init_one, .struct_init_one_comma => tree.structInitOne(buffer[0..1], node),
24092397 .struct_init_dot_two, .struct_init_dot_two_comma => tree.structInitDotTwo(buffer, node),
24102398 .struct_init_dot, .struct_init_dot_comma => tree.structInitDot(node),
......@@ -2413,8 +2401,8 @@ pub fn fullStructInit(tree: Ast, buffer: *[2]Ast.Node.Index, node: Node.Index) ?
24132401 };
24142402}
24152403
2416pub fn fullArrayInit(tree: Ast, buffer: *[2]Node.Index, node: Node.Index) ?full.ArrayInit {
2417 return switch (tree.nodeTag(node)) {
2404pub fn fullArrayInit(tree: *const Ast, buffer: *[2]Node.Index, node: Node.Index) ?full.ArrayInit {
2405 return switch (node.tag(tree)) {
24182406 .array_init_one, .array_init_one_comma => tree.arrayInitOne(buffer[0..1], node),
24192407 .array_init_dot_two, .array_init_dot_two_comma => tree.arrayInitDotTwo(buffer, node),
24202408 .array_init_dot, .array_init_dot_comma => tree.arrayInitDot(node),
......@@ -2423,16 +2411,16 @@ pub fn fullArrayInit(tree: Ast, buffer: *[2]Node.Index, node: Node.Index) ?full.
24232411 };
24242412}
24252413
2426pub fn fullArrayType(tree: Ast, node: Node.Index) ?full.ArrayType {
2427 return switch (tree.nodeTag(node)) {
2414pub fn fullArrayType(tree: *const Ast, node: Node.Index) ?full.ArrayType {
2415 return switch (node.tag(tree)) {
24282416 .array_type => tree.arrayType(node),
24292417 .array_type_sentinel => tree.arrayTypeSentinel(node),
24302418 else => null,
24312419 };
24322420}
24332421
2434pub fn fullPtrType(tree: Ast, node: Node.Index) ?full.PtrType {
2435 return switch (tree.nodeTag(node)) {
2422pub fn fullPtrType(tree: *const Ast, node: Node.Index) ?full.PtrType {
2423 return switch (node.tag(tree)) {
24362424 .ptr_type_aligned => tree.ptrTypeAligned(node),
24372425 .ptr_type_sentinel => tree.ptrTypeSentinel(node),
24382426 .ptr_type => tree.ptrType(node),
......@@ -2441,8 +2429,8 @@ pub fn fullPtrType(tree: Ast, node: Node.Index) ?full.PtrType {
24412429 };
24422430}
24432431
2444pub fn fullSlice(tree: Ast, node: Node.Index) ?full.Slice {
2445 return switch (tree.nodeTag(node)) {
2432pub fn fullSlice(tree: *const Ast, node: Node.Index) ?full.Slice {
2433 return switch (node.tag(tree)) {
24462434 .slice_open => tree.sliceOpen(node),
24472435 .slice => tree.slice(node),
24482436 .slice_sentinel => tree.sliceSentinel(node),
......@@ -2450,8 +2438,8 @@ pub fn fullSlice(tree: Ast, node: Node.Index) ?full.Slice {
24502438 };
24512439}
24522440
2453pub fn fullContainerDecl(tree: Ast, buffer: *[2]Ast.Node.Index, node: Node.Index) ?full.ContainerDecl {
2454 return switch (tree.nodeTag(node)) {
2441pub fn fullContainerDecl(tree: *const Ast, buffer: *[2]Ast.Node.Index, node: Node.Index) ?full.ContainerDecl {
2442 return switch (node.tag(tree)) {
24552443 .root => tree.containerDeclRoot(),
24562444 .container_decl, .container_decl_trailing => tree.containerDecl(node),
24572445 .container_decl_arg, .container_decl_arg_trailing => tree.containerDeclArg(node),
......@@ -2463,49 +2451,49 @@ pub fn fullContainerDecl(tree: Ast, buffer: *[2]Ast.Node.Index, node: Node.Index
24632451 };
24642452}
24652453
2466pub fn fullSwitch(tree: Ast, node: Node.Index) ?full.Switch {
2467 return switch (tree.nodeTag(node)) {
2454pub fn fullSwitch(tree: *const Ast, node: Node.Index) ?full.Switch {
2455 return switch (node.tag(tree)) {
24682456 .@"switch", .switch_comma => tree.switchFull(node),
24692457 else => null,
24702458 };
24712459}
24722460
2473pub fn fullSwitchCase(tree: Ast, node: Node.Index) ?full.SwitchCase {
2474 return switch (tree.nodeTag(node)) {
2461pub fn fullSwitchCase(tree: *const Ast, node: Node.Index) ?full.SwitchCase {
2462 return switch (node.tag(tree)) {
24752463 .switch_case_one, .switch_case_inline_one => tree.switchCaseOne(node),
24762464 .switch_case, .switch_case_inline => tree.switchCase(node),
24772465 else => null,
24782466 };
24792467}
24802468
2481pub fn fullAsm(tree: Ast, node: Node.Index) ?full.Asm {
2482 return switch (tree.nodeTag(node)) {
2469pub fn fullAsm(tree: *const Ast, node: Node.Index) ?full.Asm {
2470 return switch (node.tag(tree)) {
24832471 .asm_simple => tree.asmSimple(node),
24842472 .@"asm" => tree.asmFull(node),
24852473 else => null,
24862474 };
24872475}
24882476
2489pub fn fullCall(tree: Ast, buffer: *[1]Ast.Node.Index, node: Node.Index) ?full.Call {
2490 return switch (tree.nodeTag(node)) {
2477pub fn fullCall(tree: *const Ast, buffer: *[1]Ast.Node.Index, node: Node.Index) ?full.Call {
2478 return switch (node.tag(tree)) {
24912479 .call, .call_comma, .async_call, .async_call_comma => tree.callFull(node),
24922480 .call_one, .call_one_comma, .async_call_one, .async_call_one_comma => tree.callOne(buffer, node),
24932481 else => null,
24942482 };
24952483}
24962484
2497pub fn builtinCallParams(tree: Ast, buffer: *[2]Ast.Node.Index, node: Ast.Node.Index) ?[]const Node.Index {
2498 return switch (tree.nodeTag(node)) {
2499 .builtin_call_two, .builtin_call_two_comma => loadOptionalNodesIntoBuffer(2, buffer, tree.nodeData(node).opt_node_and_opt_node),
2500 .builtin_call, .builtin_call_comma => tree.extraDataSlice(tree.nodeData(node).extra_range, Node.Index),
2485pub fn builtinCallParams(tree: *const Ast, buffer: *[2]Ast.Node.Index, node: Ast.Node.Index) ?[]const Node.Index {
2486 return switch (node.tag(tree)) {
2487 .builtin_call_two, .builtin_call_two_comma => loadOptionalNodesIntoBuffer(2, buffer, node.data(tree).opt_node_and_opt_node),
2488 .builtin_call, .builtin_call_comma => tree.extraDataSlice(node.data(tree).extra_range, Node.Index),
25012489 else => null,
25022490 };
25032491}
25042492
2505pub fn blockStatements(tree: Ast, buffer: *[2]Ast.Node.Index, node: Ast.Node.Index) ?[]const Node.Index {
2506 return switch (tree.nodeTag(node)) {
2507 .block_two, .block_two_semicolon => loadOptionalNodesIntoBuffer(2, buffer, tree.nodeData(node).opt_node_and_opt_node),
2508 .block, .block_semicolon => tree.extraDataSlice(tree.nodeData(node).extra_range, Node.Index),
2493pub fn blockStatements(tree: *const Ast, buffer: *[2]Ast.Node.Index, node: Ast.Node.Index) ?[]const Node.Index {
2494 return switch (node.tag(tree)) {
2495 .block_two, .block_two_semicolon => loadOptionalNodesIntoBuffer(2, buffer, node.data(tree).opt_node_and_opt_node),
2496 .block, .block_semicolon => tree.extraDataSlice(node.data(tree).extra_range, Node.Index),
25092497 else => null,
25102498 };
25112499}
......@@ -2620,7 +2608,7 @@ pub const full = struct {
26202608
26212609 pub fn convertToNonTupleLike(cf: *ContainerField, tree: *const Ast) void {
26222610 if (!cf.ast.tuple_like) return;
2623 if (tree.nodeTag(cf.ast.type_expr.unwrap().?) != .identifier) return;
2611 if (cf.ast.type_expr.unwrap().?.tag(tree) != .identifier) return;
26242612
26252613 cf.ast.type_expr = .none;
26262614 cf.ast.tuple_like = false;
......@@ -3004,6 +2992,18 @@ pub const Node = struct {
30042992 const destination_i64: i64 = @intFromEnum(destination);
30052993 return @enumFromInt(destination_i64 - base_i64);
30062994 }
2995
2996 pub fn tag(i: Node.Index, tree: *const Ast) Tag {
2997 return tree.nodes.items(.tag)[@intFromEnum(i)];
2998 }
2999
3000 pub fn mainToken(i: Index, ast: *const Ast) TokenIndex {
3001 return ast.nodes.items(.main_token)[@intFromEnum(i)];
3002 }
3003
3004 pub fn data(i: Index, ast: *const Ast) Data {
3005 return ast.nodes.items(.data)[@intFromEnum(i)];
3006 }
30073007 };
30083008
30093009 /// Index into `nodes`, or null.
......@@ -4098,7 +4098,7 @@ pub fn nodeToSpan(tree: *const Ast, node: Ast.Node.Index) Span {
40984098 tree,
40994099 tree.firstToken(node),
41004100 tree.lastToken(node),
4101 tree.nodeMainToken(node),
4101 node.mainToken(tree),
41024102 );
41034103}
41044104
lib/std/zig/AstGen.zig+177-176
......@@ -141,7 +141,7 @@ fn appendRefsAssumeCapacity(astgen: *AstGen, refs: []const Zir.Inst.Ref) void {
141141 astgen.extra.appendSliceAssumeCapacity(@ptrCast(refs));
142142}
143143
144pub fn generate(gpa: Allocator, tree: Ast) Allocator.Error!Zir {
144pub fn generate(gpa: Allocator, tree: *const Ast) Allocator.Error!Zir {
145145 assert(tree.mode == .zig);
146146
147147 var arena = std.heap.ArenaAllocator.init(gpa);
......@@ -153,7 +153,7 @@ pub fn generate(gpa: Allocator, tree: Ast) Allocator.Error!Zir {
153153 var astgen: AstGen = .{
154154 .gpa = gpa,
155155 .arena = arena.allocator(),
156 .tree = &tree,
156 .tree = tree,
157157 .nodes_need_rl = &nodes_need_rl,
158158 .src_hasher = undefined, // `structDeclInner` for the root struct will set this
159159 };
......@@ -440,7 +440,7 @@ fn reachableExprComptime(
440440fn lvalExpr(gz: *GenZir, scope: *Scope, node: Ast.Node.Index) InnerError!Zir.Inst.Ref {
441441 const astgen = gz.astgen;
442442 const tree = astgen.tree;
443 switch (tree.nodeTag(node)) {
443 switch (node.tag(tree)) {
444444 .root => unreachable,
445445 .@"usingnamespace" => unreachable,
446446 .test_decl => unreachable,
......@@ -608,7 +608,7 @@ fn lvalExpr(gz: *GenZir, scope: *Scope, node: Ast.Node.Index) InnerError!Zir.Ins
608608 .builtin_call_two,
609609 .builtin_call_two_comma,
610610 => {
611 const builtin_token = tree.nodeMainToken(node);
611 const builtin_token = node.mainToken(tree);
612612 const builtin_name = tree.tokenSlice(builtin_token);
613613 // If the builtin is an invalid name, we don't cause an error here; instead
614614 // let it pass, and the error will be "invalid builtin function" later.
......@@ -646,7 +646,7 @@ fn expr(gz: *GenZir, scope: *Scope, ri: ResultInfo, node: Ast.Node.Index) InnerE
646646 gz.anon_name_strategy = .anon;
647647 }
648648
649 switch (tree.nodeTag(node)) {
649 switch (node.tag(tree)) {
650650 .root => unreachable, // Top-level declaration.
651651 .@"usingnamespace" => unreachable, // Top-level declaration.
652652 .test_decl => unreachable, // Top-level declaration.
......@@ -756,8 +756,8 @@ fn expr(gz: *GenZir, scope: *Scope, ri: ResultInfo, node: Ast.Node.Index) InnerE
756756 },
757757
758758 // zig fmt: off
759 .shl => return shiftOp(gz, scope, ri, node, tree.nodeData(node).node_and_node[0], tree.nodeData(node).node_and_node[1], .shl),
760 .shr => return shiftOp(gz, scope, ri, node, tree.nodeData(node).node_and_node[0], tree.nodeData(node).node_and_node[1], .shr),
759 .shl => return shiftOp(gz, scope, ri, node, node.data(tree).node_and_node[0], node.data(tree).node_and_node[1], .shl),
760 .shr => return shiftOp(gz, scope, ri, node, node.data(tree).node_and_node[0], node.data(tree).node_and_node[1], .shr),
761761
762762 .add => return simpleBinOp(gz, scope, ri, node, .add),
763763 .add_wrap => return simpleBinOp(gz, scope, ri, node, .addwrap),
......@@ -787,7 +787,7 @@ fn expr(gz: *GenZir, scope: *Scope, ri: ResultInfo, node: Ast.Node.Index) InnerE
787787 // This syntax form does not currently use the result type in the language specification.
788788 // However, the result type can be used to emit more optimal code for large multiplications by
789789 // having Sema perform a coercion before the multiplication operation.
790 const lhs_node, const rhs_node = tree.nodeData(node).node_and_node;
790 const lhs_node, const rhs_node = node.data(tree).node_and_node;
791791 const result = try gz.addPlNode(.array_mul, node, Zir.Inst.ArrayMul{
792792 .res_ty = if (try ri.rl.resultType(gz, node)) |t| t else .none,
793793 .lhs = try expr(gz, scope, .{ .rl = .none }, lhs_node),
......@@ -802,7 +802,7 @@ fn expr(gz: *GenZir, scope: *Scope, ri: ResultInfo, node: Ast.Node.Index) InnerE
802802 .merge_error_sets => .merge_error_sets,
803803 else => unreachable,
804804 };
805 const lhs_node, const rhs_node = tree.nodeData(node).node_and_node;
805 const lhs_node, const rhs_node = node.data(tree).node_and_node;
806806 const lhs = try reachableTypeExpr(gz, scope, lhs_node, node);
807807 const rhs = try reachableTypeExpr(gz, scope, rhs_node, node);
808808 const result = try gz.addPlNode(inst_tag, node, Zir.Inst.Bin{ .lhs = lhs, .rhs = rhs });
......@@ -812,11 +812,11 @@ fn expr(gz: *GenZir, scope: *Scope, ri: ResultInfo, node: Ast.Node.Index) InnerE
812812 .bool_and => return boolBinOp(gz, scope, ri, node, .bool_br_and),
813813 .bool_or => return boolBinOp(gz, scope, ri, node, .bool_br_or),
814814
815 .bool_not => return simpleUnOp(gz, scope, ri, node, coerced_bool_ri, tree.nodeData(node).node, .bool_not),
816 .bit_not => return simpleUnOp(gz, scope, ri, node, .{ .rl = .none }, tree.nodeData(node).node, .bit_not),
815 .bool_not => return simpleUnOp(gz, scope, ri, node, coerced_bool_ri, node.data(tree).node, .bool_not),
816 .bit_not => return simpleUnOp(gz, scope, ri, node, .{ .rl = .none }, node.data(tree).node, .bit_not),
817817
818818 .negation => return negation(gz, scope, ri, node),
819 .negation_wrap => return simpleUnOp(gz, scope, ri, node, .{ .rl = .none }, tree.nodeData(node).node, .negate_wrap),
819 .negation_wrap => return simpleUnOp(gz, scope, ri, node, .{ .rl = .none }, node.data(tree).node, .negate_wrap),
820820
821821 .identifier => return identifier(gz, scope, ri, node, null),
822822
......@@ -875,8 +875,8 @@ fn expr(gz: *GenZir, scope: *Scope, ri: ResultInfo, node: Ast.Node.Index) InnerE
875875 const else_node = if_full.ast.else_expr.unwrap() orelse break :no_switch_on_err;
876876 const full_switch = tree.fullSwitch(else_node) orelse break :no_switch_on_err;
877877 if (full_switch.label_token != null) break :no_switch_on_err;
878 if (tree.nodeTag(full_switch.ast.condition) != .identifier) break :no_switch_on_err;
879 if (!mem.eql(u8, tree.tokenSlice(error_token), tree.tokenSlice(tree.nodeMainToken(full_switch.ast.condition)))) break :no_switch_on_err;
878 if (full_switch.ast.condition.tag(tree) != .identifier) break :no_switch_on_err;
879 if (!mem.eql(u8, tree.tokenSlice(error_token), tree.tokenSlice(full_switch.ast.condition.mainToken(tree)))) break :no_switch_on_err;
880880 return switchExprErrUnion(gz, scope, ri.br(), node, .@"if");
881881 }
882882 return ifExpr(gz, scope, ri.br(), node, if_full);
......@@ -895,7 +895,7 @@ fn expr(gz: *GenZir, scope: *Scope, ri: ResultInfo, node: Ast.Node.Index) InnerE
895895 => {
896896 const full = tree.fullSlice(node).?;
897897 if (full.ast.end != .none and
898 tree.nodeTag(full.ast.sliced) == .slice_open and
898 full.ast.sliced.tag(tree) == .slice_open and
899899 nodeIsTriviallyZero(tree, full.ast.start))
900900 {
901901 const lhs_extra = tree.sliceOpen(full.ast.sliced).ast;
......@@ -950,7 +950,7 @@ fn expr(gz: *GenZir, scope: *Scope, ri: ResultInfo, node: Ast.Node.Index) InnerE
950950 },
951951
952952 .deref => {
953 const lhs = try expr(gz, scope, .{ .rl = .none }, tree.nodeData(node).node);
953 const lhs = try expr(gz, scope, .{ .rl = .none }, node.data(tree).node);
954954 _ = try gz.addUnNode(.validate_deref, lhs, node);
955955 switch (ri.rl) {
956956 .ref, .ref_coerced_ty => return lhs,
......@@ -965,17 +965,17 @@ fn expr(gz: *GenZir, scope: *Scope, ri: ResultInfo, node: Ast.Node.Index) InnerE
965965 _ = try gz.addUnTok(.validate_ref_ty, res_ty_inst, tree.firstToken(node));
966966 break :rl .{ .ref_coerced_ty = res_ty_inst };
967967 } else .ref;
968 const result = try expr(gz, scope, .{ .rl = operand_rl }, tree.nodeData(node).node);
968 const result = try expr(gz, scope, .{ .rl = operand_rl }, node.data(tree).node);
969969 return rvalue(gz, ri, result, node);
970970 },
971971 .optional_type => {
972 const operand = try typeExpr(gz, scope, tree.nodeData(node).node);
972 const operand = try typeExpr(gz, scope, node.data(tree).node);
973973 const result = try gz.addUnNode(.optional_type, operand, node);
974974 return rvalue(gz, ri, result, node);
975975 },
976976 .unwrap_optional => switch (ri.rl) {
977977 .ref, .ref_coerced_ty => {
978 const lhs = try expr(gz, scope, .{ .rl = .ref }, tree.nodeData(node).node_and_token[0]);
978 const lhs = try expr(gz, scope, .{ .rl = .ref }, node.data(tree).node_and_token[0]);
979979
980980 const cursor = maybeAdvanceSourceCursorToMainToken(gz, node);
981981 try emitDbgStmt(gz, cursor);
......@@ -983,7 +983,7 @@ fn expr(gz: *GenZir, scope: *Scope, ri: ResultInfo, node: Ast.Node.Index) InnerE
983983 return gz.addUnNode(.optional_payload_safe_ptr, lhs, node);
984984 },
985985 else => {
986 const lhs = try expr(gz, scope, .{ .rl = .none }, tree.nodeData(node).node_and_token[0]);
986 const lhs = try expr(gz, scope, .{ .rl = .none }, node.data(tree).node_and_token[0]);
987987
988988 const cursor = maybeAdvanceSourceCursorToMainToken(gz, node);
989989 try emitDbgStmt(gz, cursor);
......@@ -1001,7 +1001,7 @@ fn expr(gz: *GenZir, scope: *Scope, ri: ResultInfo, node: Ast.Node.Index) InnerE
10011001 return blockExpr(gz, scope, ri, node, statements, .normal);
10021002 },
10031003 .enum_literal => if (try ri.rl.resultType(gz, node)) |res_ty| {
1004 const str_index = try astgen.identAsString(tree.nodeMainToken(node));
1004 const str_index = try astgen.identAsString(node.mainToken(tree));
10051005 const res = try gz.addPlNode(.decl_literal, node, Zir.Inst.Field{
10061006 .lhs = res_ty,
10071007 .field_name_start = str_index,
......@@ -1011,8 +1011,8 @@ fn expr(gz: *GenZir, scope: *Scope, ri: ResultInfo, node: Ast.Node.Index) InnerE
10111011 .ty, .coerced_ty => return res, // `decl_literal` does the coercion for us
10121012 .ref_coerced_ty, .ptr, .inferred_ptr, .destructure => return rvalue(gz, ri, res, node),
10131013 }
1014 } else return simpleStrTok(gz, ri, tree.nodeMainToken(node), node, .enum_literal),
1015 .error_value => return simpleStrTok(gz, ri, tree.nodeMainToken(node) + 2, node, .error_value),
1014 } else return simpleStrTok(gz, ri, node.mainToken(tree), node, .enum_literal),
1015 .error_value => return simpleStrTok(gz, ri, node.mainToken(tree) + 2, node, .error_value),
10161016 // TODO restore this when implementing https://github.com/ziglang/zig/issues/6025
10171017 // .anyframe_literal => return rvalue(gz, ri, .anyframe_type, node),
10181018 .anyframe_literal => {
......@@ -1020,22 +1020,22 @@ fn expr(gz: *GenZir, scope: *Scope, ri: ResultInfo, node: Ast.Node.Index) InnerE
10201020 return rvalue(gz, ri, result, node);
10211021 },
10221022 .anyframe_type => {
1023 const return_type = try typeExpr(gz, scope, tree.nodeData(node).token_and_node[1]);
1023 const return_type = try typeExpr(gz, scope, node.data(tree).token_and_node[1]);
10241024 const result = try gz.addUnNode(.anyframe_type, return_type, node);
10251025 return rvalue(gz, ri, result, node);
10261026 },
10271027 .@"catch" => {
1028 const catch_token = tree.nodeMainToken(node);
1028 const catch_token = node.mainToken(tree);
10291029 const payload_token: ?Ast.TokenIndex = if (tree.tokenTag(catch_token + 1) == .pipe)
10301030 catch_token + 2
10311031 else
10321032 null;
10331033 no_switch_on_err: {
10341034 const capture_token = payload_token orelse break :no_switch_on_err;
1035 const full_switch = tree.fullSwitch(tree.nodeData(node).node_and_node[1]) orelse break :no_switch_on_err;
1035 const full_switch = tree.fullSwitch(node.data(tree).node_and_node[1]) orelse break :no_switch_on_err;
10361036 if (full_switch.label_token != null) break :no_switch_on_err;
1037 if (tree.nodeTag(full_switch.ast.condition) != .identifier) break :no_switch_on_err;
1038 if (!mem.eql(u8, tree.tokenSlice(capture_token), tree.tokenSlice(tree.nodeMainToken(full_switch.ast.condition)))) break :no_switch_on_err;
1037 if (full_switch.ast.condition.tag(tree) != .identifier) break :no_switch_on_err;
1038 if (!mem.eql(u8, tree.tokenSlice(capture_token), tree.tokenSlice(full_switch.ast.condition.mainToken(tree)))) break :no_switch_on_err;
10391039 return switchExprErrUnion(gz, scope, ri.br(), node, .@"catch");
10401040 }
10411041 switch (ri.rl) {
......@@ -1109,7 +1109,7 @@ fn expr(gz: *GenZir, scope: *Scope, ri: ResultInfo, node: Ast.Node.Index) InnerE
11091109
11101110 .@"break" => return breakExpr(gz, scope, node),
11111111 .@"continue" => return continueExpr(gz, scope, node),
1112 .grouped_expression => return expr(gz, scope, ri, tree.nodeData(node).node_and_token[0]),
1112 .grouped_expression => return expr(gz, scope, ri, node.data(tree).node_and_token[0]),
11131113 .array_type => return arrayType(gz, scope, ri, node),
11141114 .array_type_sentinel => return arrayTypeSentinel(gz, scope, ri, node),
11151115 .char_literal => return charLiteral(gz, ri, node),
......@@ -1123,7 +1123,7 @@ fn expr(gz: *GenZir, scope: *Scope, ri: ResultInfo, node: Ast.Node.Index) InnerE
11231123 .@"await" => return awaitExpr(gz, scope, ri, node),
11241124 .@"resume" => return resumeExpr(gz, scope, ri, node),
11251125
1126 .@"try" => return tryExpr(gz, scope, ri, node, tree.nodeData(node).node),
1126 .@"try" => return tryExpr(gz, scope, ri, node, node.data(tree).node),
11271127
11281128 .array_init_one,
11291129 .array_init_one_comma,
......@@ -1170,7 +1170,7 @@ fn nosuspendExpr(
11701170) InnerError!Zir.Inst.Ref {
11711171 const astgen = gz.astgen;
11721172 const tree = astgen.tree;
1173 const body_node = tree.nodeData(node).node;
1173 const body_node = node.data(tree).node;
11741174 if (gz.nosuspend_node.unwrap()) |nosuspend_node| {
11751175 try astgen.appendErrorNodeNotes(node, "redundant nosuspend block", .{}, &[_]u32{
11761176 try astgen.errNoteNode(nosuspend_node, "other nosuspend block here", .{}),
......@@ -1189,7 +1189,7 @@ fn suspendExpr(
11891189 const astgen = gz.astgen;
11901190 const gpa = astgen.gpa;
11911191 const tree = astgen.tree;
1192 const body_node = tree.nodeData(node).node;
1192 const body_node = node.data(tree).node;
11931193
11941194 if (gz.nosuspend_node.unwrap()) |nosuspend_node| {
11951195 return astgen.failNodeNotes(node, "suspend inside nosuspend block", .{}, &[_]u32{
......@@ -1226,7 +1226,7 @@ fn awaitExpr(
12261226) InnerError!Zir.Inst.Ref {
12271227 const astgen = gz.astgen;
12281228 const tree = astgen.tree;
1229 const rhs_node = tree.nodeData(node).node;
1229 const rhs_node = node.data(tree).node;
12301230
12311231 if (gz.suspend_node.unwrap()) |suspend_node| {
12321232 return astgen.failNodeNotes(node, "cannot await inside suspend block", .{}, &[_]u32{
......@@ -1253,7 +1253,7 @@ fn resumeExpr(
12531253) InnerError!Zir.Inst.Ref {
12541254 const astgen = gz.astgen;
12551255 const tree = astgen.tree;
1256 const rhs_node = tree.nodeData(node).node;
1256 const rhs_node = node.data(tree).node;
12571257 const operand = try expr(gz, scope, .{ .rl = .ref }, rhs_node);
12581258 const result = try gz.addUnNode(.@"resume", operand, node);
12591259 return rvalue(gz, ri, result, node);
......@@ -1363,7 +1363,7 @@ fn fnProtoExprInner(
13631363 const param_type = try fullBodyExpr(&param_gz, scope, coerced_type_ri, param_type_node, .normal);
13641364 const param_inst_expected: Zir.Inst.Index = @enumFromInt(astgen.instructions.len + 1);
13651365 _ = try param_gz.addBreakWithSrcNode(.break_inline, param_inst_expected, param_type, param_type_node);
1366 const name_token = param.name_token orelse tree.nodeMainToken(param_type_node);
1366 const name_token = param.name_token orelse param_type_node.mainToken(tree);
13671367 const tag: Zir.Inst.Tag = if (is_comptime) .param_comptime else .param;
13681368 // We pass `prev_param_insts` as `&.{}` here because a function prototype can't refer to previous
13691369 // arguments (we haven't set up scopes here).
......@@ -1437,8 +1437,8 @@ fn arrayInitExpr(
14371437 infer: {
14381438 const array_type: Ast.full.ArrayType = tree.fullArrayType(type_expr) orelse break :infer;
14391439 // This intentionally does not support `@"_"` syntax.
1440 if (tree.nodeTag(array_type.ast.elem_count) == .identifier and
1441 mem.eql(u8, tree.tokenSlice(tree.nodeMainToken(array_type.ast.elem_count)), "_"))
1440 if (array_type.ast.elem_count.tag(tree) == .identifier and
1441 mem.eql(u8, tree.tokenSlice(array_type.ast.elem_count.mainToken(tree)), "_"))
14421442 {
14431443 const len_inst = try gz.addInt(array_init.ast.elements.len);
14441444 const elem_type = try typeExpr(gz, scope, array_type.ast.elem_type);
......@@ -1705,9 +1705,9 @@ fn structInitExpr(
17051705 }
17061706 break :array;
17071707 };
1708 const is_inferred_array_len = tree.nodeTag(array_type.ast.elem_count) == .identifier and
1708 const is_inferred_array_len = array_type.ast.elem_count.tag(tree) == .identifier and
17091709 // This intentionally does not support `@"_"` syntax.
1710 mem.eql(u8, tree.tokenSlice(tree.nodeMainToken(array_type.ast.elem_count)), "_");
1710 mem.eql(u8, tree.tokenSlice(array_type.ast.elem_count.mainToken(tree)), "_");
17111711 if (struct_init.ast.fields.len == 0) {
17121712 if (is_inferred_array_len) {
17131713 const elem_type = try typeExpr(gz, scope, array_type.ast.elem_type);
......@@ -1987,7 +1987,7 @@ fn comptimeExpr2(
19871987 // no need to wrap it in a block. This is hard to determine in general, but we can identify a
19881988 // common subset of trivially comptime expressions to take down the size of the ZIR a bit.
19891989 const tree = gz.astgen.tree;
1990 switch (tree.nodeTag(node)) {
1990 switch (node.tag(tree)) {
19911991 .identifier => {
19921992 // Many identifiers can be handled without a `block_comptime`, so `AstGen.identifier` has
19931993 // special handling for this case.
......@@ -2040,7 +2040,7 @@ fn comptimeExpr2(
20402040 // comptime block, because that would be silly! Note that we don't bother doing this for
20412041 // unlabelled blocks, since they don't generate blocks at comptime anyway (see `blockExpr`).
20422042 .block_two, .block_two_semicolon, .block, .block_semicolon => {
2043 const lbrace = tree.nodeMainToken(node);
2043 const lbrace = node.mainToken(tree);
20442044 // Careful! We can't pass in the real result location here, since it may
20452045 // refer to runtime memory. A runtime-to-comptime boundary has to remove
20462046 // result location information, compute the result, and copy it to the true
......@@ -2103,7 +2103,7 @@ fn comptimeExprAst(
21032103 try astgen.appendErrorNode(node, "redundant comptime keyword in already comptime scope", .{});
21042104 }
21052105 const tree = astgen.tree;
2106 const body_node = tree.nodeData(node).node;
2106 const body_node = node.data(tree).node;
21072107 return comptimeExpr2(gz, scope, ri, body_node, node, .comptime_keyword);
21082108}
21092109
......@@ -2141,7 +2141,7 @@ fn restoreErrRetIndex(
21412141fn breakExpr(parent_gz: *GenZir, parent_scope: *Scope, node: Ast.Node.Index) InnerError!Zir.Inst.Ref {
21422142 const astgen = parent_gz.astgen;
21432143 const tree = astgen.tree;
2144 const opt_break_label, const opt_rhs = tree.nodeData(node).opt_token_and_opt_node;
2144 const opt_break_label, const opt_rhs = node.data(tree).opt_token_and_opt_node;
21452145
21462146 // Look for the label in the scope.
21472147 var scope = parent_scope;
......@@ -2237,7 +2237,7 @@ fn breakExpr(parent_gz: *GenZir, parent_scope: *Scope, node: Ast.Node.Index) Inn
22372237fn continueExpr(parent_gz: *GenZir, parent_scope: *Scope, node: Ast.Node.Index) InnerError!Zir.Inst.Ref {
22382238 const astgen = parent_gz.astgen;
22392239 const tree = astgen.tree;
2240 const opt_break_label, const opt_rhs = tree.nodeData(node).opt_token_and_opt_node;
2240 const opt_break_label, const opt_rhs = node.data(tree).opt_token_and_opt_node;
22412241
22422242 if (opt_break_label == .none and opt_rhs != .none) {
22432243 return astgen.failNode(node, "cannot continue with operand without label", .{});
......@@ -2359,7 +2359,7 @@ fn fullBodyExpr(
23592359 const statements = tree.blockStatements(&stmt_buf, node) orelse
23602360 return expr(gz, scope, ri, node);
23612361
2362 const lbrace = tree.nodeMainToken(node);
2362 const lbrace = node.mainToken(tree);
23632363
23642364 if (tree.isTokenPrecededByTags(lbrace, &.{ .identifier, .colon })) {
23652365 // Labeled blocks are tricky - forwarding result location information properly is non-trivial,
......@@ -2387,7 +2387,7 @@ fn blockExpr(
23872387 const astgen = gz.astgen;
23882388 const tree = astgen.tree;
23892389
2390 const lbrace = tree.nodeMainToken(block_node);
2390 const lbrace = block_node.mainToken(tree);
23912391 if (tree.isTokenPrecededByTags(lbrace, &.{ .identifier, .colon })) {
23922392 return labeledBlockExpr(gz, scope, ri, block_node, statements, false, kind);
23932393 }
......@@ -2466,7 +2466,7 @@ fn labeledBlockExpr(
24662466 const astgen = gz.astgen;
24672467 const tree = astgen.tree;
24682468
2469 const lbrace = tree.nodeMainToken(block_node);
2469 const lbrace = block_node.mainToken(tree);
24702470 const label_token = lbrace - 2;
24712471 assert(tree.tokenTag(label_token) == .identifier);
24722472
......@@ -2559,7 +2559,7 @@ fn blockExprStmts(gz: *GenZir, parent_scope: *Scope, statements: []const Ast.Nod
25592559 };
25602560 var inner_node = statement;
25612561 while (true) {
2562 switch (tree.nodeTag(inner_node)) {
2562 switch (inner_node.tag(tree)) {
25632563 // zig fmt: off
25642564 .global_var_decl,
25652565 .local_var_decl,
......@@ -2589,7 +2589,7 @@ fn blockExprStmts(gz: *GenZir, parent_scope: *Scope, statements: []const Ast.Nod
25892589 .assign_mul_wrap => try assignOp(gz, scope, statement, .mulwrap),
25902590
25912591 .grouped_expression => {
2592 inner_node = tree.nodeData(statement).node_and_token[0];
2592 inner_node = statement.data(tree).node_and_token[0];
25932593 continue;
25942594 },
25952595
......@@ -3122,7 +3122,7 @@ fn deferStmt(
31223122 var local_val_scope: Scope.LocalVal = undefined;
31233123 var opt_remapped_err_code: Zir.Inst.OptionalIndex = .none;
31243124 const sub_scope = if (scope_tag != .defer_error) &defer_gen.base else blk: {
3125 const payload_token = tree.nodeData(node).opt_token_and_node[0].unwrap() orelse break :blk &defer_gen.base;
3125 const payload_token = node.data(tree).opt_token_and_node[0].unwrap() orelse break :blk &defer_gen.base;
31263126 const ident_name = try gz.astgen.identAsString(payload_token);
31273127 if (std.mem.eql(u8, tree.tokenSlice(payload_token), "_")) {
31283128 try gz.astgen.appendErrorTok(payload_token, "discard of error capture; omit it instead", .{});
......@@ -3151,8 +3151,8 @@ fn deferStmt(
31513151 break :blk &local_val_scope.base;
31523152 };
31533153 const expr_node = switch (scope_tag) {
3154 .defer_normal => tree.nodeData(node).node,
3155 .defer_error => tree.nodeData(node).opt_token_and_node[1],
3154 .defer_normal => node.data(tree).node,
3155 .defer_error => node.data(tree).opt_token_and_node[1],
31563156 else => unreachable,
31573157 };
31583158 _ = try unusedResultExpr(&defer_gen, sub_scope, expr_node);
......@@ -3210,11 +3210,11 @@ fn varDecl(
32103210 };
32113211
32123212 if (var_decl.ast.addrspace_node.unwrap()) |addrspace_node| {
3213 return astgen.failTok(tree.nodeMainToken(addrspace_node), "cannot set address space of local variable '{s}'", .{ident_name_raw});
3213 return astgen.failTok(addrspace_node.mainToken(tree), "cannot set address space of local variable '{s}'", .{ident_name_raw});
32143214 }
32153215
32163216 if (var_decl.ast.section_node.unwrap()) |section_node| {
3217 return astgen.failTok(tree.nodeMainToken(section_node), "cannot set section of local variable '{s}'", .{ident_name_raw});
3217 return astgen.failTok(section_node.mainToken(tree), "cannot set section of local variable '{s}'", .{ident_name_raw});
32183218 }
32193219
32203220 const align_inst: Zir.Inst.Ref = if (var_decl.ast.align_node.unwrap()) |align_node|
......@@ -3267,7 +3267,7 @@ fn varDecl(
32673267 }
32683268
32693269 const is_comptime = gz.is_comptime or
3270 tree.nodeTag(init_node) == .@"comptime";
3270 init_node.tag(tree) == .@"comptime";
32713271
32723272 const init_rl: ResultInfo.Loc = if (var_decl.ast.type_node.unwrap()) |type_node| init_rl: {
32733273 const type_inst = try typeExpr(gz, scope, type_node);
......@@ -3430,10 +3430,10 @@ fn assign(gz: *GenZir, scope: *Scope, infix_node: Ast.Node.Index) InnerError!voi
34303430 const astgen = gz.astgen;
34313431 const tree = astgen.tree;
34323432
3433 const lhs, const rhs = tree.nodeData(infix_node).node_and_node;
3434 if (tree.nodeTag(lhs) == .identifier) {
3433 const lhs, const rhs = infix_node.data(tree).node_and_node;
3434 if (lhs.tag(tree) == .identifier) {
34353435 // This intentionally does not support `@"_"` syntax.
3436 const ident_name = tree.tokenSlice(tree.nodeMainToken(lhs));
3436 const ident_name = tree.tokenSlice(lhs.mainToken(tree));
34373437 if (mem.eql(u8, ident_name, "_")) {
34383438 _ = try expr(gz, scope, .{ .rl = .discard, .ctx = .assignment }, rhs);
34393439 return;
......@@ -3468,9 +3468,9 @@ fn assignDestructure(gz: *GenZir, scope: *Scope, node: Ast.Node.Index) InnerErro
34683468
34693469 const rl_components = try astgen.arena.alloc(ResultInfo.Loc.DestructureComponent, full.ast.variables.len);
34703470 for (rl_components, full.ast.variables) |*variable_rl, variable_node| {
3471 if (tree.nodeTag(variable_node) == .identifier) {
3471 if (variable_node.tag(tree) == .identifier) {
34723472 // This intentionally does not support `@"_"` syntax.
3473 const ident_name = tree.tokenSlice(tree.nodeMainToken(variable_node));
3473 const ident_name = tree.tokenSlice(variable_node.mainToken(tree));
34743474 if (mem.eql(u8, ident_name, "_")) {
34753475 variable_rl.* = .discard;
34763476 continue;
......@@ -3514,7 +3514,7 @@ fn assignDestructureMaybeDecls(
35143514 }
35153515
35163516 const is_comptime = full.comptime_token != null or gz.is_comptime;
3517 const value_is_comptime = tree.nodeTag(full.ast.value_expr) == .@"comptime";
3517 const value_is_comptime = full.ast.value_expr.tag(tree) == .@"comptime";
35183518
35193519 // When declaring consts via a destructure, we always use a result pointer.
35203520 // This avoids the need to create tuple types, and is also likely easier to
......@@ -3527,10 +3527,10 @@ fn assignDestructureMaybeDecls(
35273527 var any_non_const_variables = false;
35283528 var any_lvalue_expr = false;
35293529 for (rl_components, full.ast.variables) |*variable_rl, variable_node| {
3530 switch (tree.nodeTag(variable_node)) {
3530 switch (variable_node.tag(tree)) {
35313531 .identifier => {
35323532 // This intentionally does not support `@"_"` syntax.
3533 const ident_name = tree.tokenSlice(tree.nodeMainToken(variable_node));
3533 const ident_name = tree.tokenSlice(variable_node.mainToken(tree));
35343534 if (mem.eql(u8, ident_name, "_")) {
35353535 any_non_const_variables = true;
35363536 variable_rl.* = .discard;
......@@ -3549,10 +3549,10 @@ fn assignDestructureMaybeDecls(
35493549 // We detect shadowing in the second pass over these, while we're creating scopes.
35503550
35513551 if (full_var_decl.ast.addrspace_node.unwrap()) |addrspace_node| {
3552 return astgen.failTok(tree.nodeMainToken(addrspace_node), "cannot set address space of local variable '{s}'", .{ident_name_raw});
3552 return astgen.failTok(addrspace_node.mainToken(tree), "cannot set address space of local variable '{s}'", .{ident_name_raw});
35533553 }
35543554 if (full_var_decl.ast.section_node.unwrap()) |section_node| {
3555 return astgen.failTok(tree.nodeMainToken(section_node), "cannot set section of local variable '{s}'", .{ident_name_raw});
3555 return astgen.failTok(section_node.mainToken(tree), "cannot set section of local variable '{s}'", .{ident_name_raw});
35563556 }
35573557
35583558 const is_const = switch (tree.tokenTag(full_var_decl.ast.mut_token)) {
......@@ -3641,7 +3641,7 @@ fn assignDestructureMaybeDecls(
36413641 // evaluate the lvalues from within the possible block_comptime.
36423642 for (rl_components, full.ast.variables) |*variable_rl, variable_node| {
36433643 if (variable_rl.* != .typed_ptr) continue;
3644 switch (tree.nodeTag(variable_node)) {
3644 switch (variable_node.tag(tree)) {
36453645 .global_var_decl, .local_var_decl, .simple_var_decl, .aligned_var_decl => continue,
36463646 else => {},
36473647 }
......@@ -3670,7 +3670,7 @@ fn assignDestructureMaybeDecls(
36703670 // If there were any `const` decls, make the pointer constant.
36713671 var cur_scope = scope;
36723672 for (rl_components, full.ast.variables) |variable_rl, variable_node| {
3673 switch (tree.nodeTag(variable_node)) {
3673 switch (variable_node.tag(tree)) {
36743674 .local_var_decl, .simple_var_decl, .aligned_var_decl => {},
36753675 else => continue, // We were mutating an existing lvalue - nothing to do
36763676 }
......@@ -3732,7 +3732,7 @@ fn assignOp(
37323732 const astgen = gz.astgen;
37333733 const tree = astgen.tree;
37343734
3735 const lhs_node, const rhs_node = tree.nodeData(infix_node).node_and_node;
3735 const lhs_node, const rhs_node = infix_node.data(tree).node_and_node;
37363736 const lhs_ptr = try lvalExpr(gz, scope, lhs_node);
37373737
37383738 const cursor = switch (op_inst_tag) {
......@@ -3787,7 +3787,7 @@ fn assignShift(
37873787 const astgen = gz.astgen;
37883788 const tree = astgen.tree;
37893789
3790 const lhs_node, const rhs_node = tree.nodeData(infix_node).node_and_node;
3790 const lhs_node, const rhs_node = infix_node.data(tree).node_and_node;
37913791 const lhs_ptr = try lvalExpr(gz, scope, lhs_node);
37923792 const lhs = try gz.addUnNode(.load, lhs_ptr, infix_node);
37933793 const rhs_type = try gz.addUnNode(.typeof_log2_int_type, lhs, infix_node);
......@@ -3808,7 +3808,7 @@ fn assignShiftSat(gz: *GenZir, scope: *Scope, infix_node: Ast.Node.Index) InnerE
38083808 const astgen = gz.astgen;
38093809 const tree = astgen.tree;
38103810
3811 const lhs_node, const rhs_node = tree.nodeData(infix_node).node_and_node;
3811 const lhs_node, const rhs_node = infix_node.data(tree).node_and_node;
38123812 const lhs_ptr = try lvalExpr(gz, scope, lhs_node);
38133813 const lhs = try gz.addUnNode(.load, lhs_ptr, infix_node);
38143814 // Saturating shift-left allows any integer type for both the LHS and RHS.
......@@ -3940,9 +3940,9 @@ fn arrayType(gz: *GenZir, scope: *Scope, ri: ResultInfo, node: Ast.Node.Index) !
39403940 const astgen = gz.astgen;
39413941 const tree = astgen.tree;
39423942
3943 const len_node, const elem_type_node = tree.nodeData(node).node_and_node;
3944 if (tree.nodeTag(len_node) == .identifier and
3945 mem.eql(u8, tree.tokenSlice(tree.nodeMainToken(len_node)), "_"))
3943 const len_node, const elem_type_node = node.data(tree).node_and_node;
3944 if (len_node.tag(tree) == .identifier and
3945 mem.eql(u8, tree.tokenSlice(len_node.mainToken(tree)), "_"))
39463946 {
39473947 return astgen.failNode(len_node, "unable to infer array size", .{});
39483948 }
......@@ -3960,11 +3960,11 @@ fn arrayTypeSentinel(gz: *GenZir, scope: *Scope, ri: ResultInfo, node: Ast.Node.
39603960 const astgen = gz.astgen;
39613961 const tree = astgen.tree;
39623962
3963 const len_node, const extra_index = tree.nodeData(node).node_and_extra;
3963 const len_node, const extra_index = node.data(tree).node_and_extra;
39643964 const extra = tree.extraData(extra_index, Ast.Node.ArrayTypeSentinel);
39653965
3966 if (tree.nodeTag(len_node) == .identifier and
3967 mem.eql(u8, tree.tokenSlice(tree.nodeMainToken(len_node)), "_"))
3966 if (len_node.tag(tree) == .identifier and
3967 mem.eql(u8, tree.tokenSlice(len_node.mainToken(tree)), "_"))
39683968 {
39693969 return astgen.failNode(len_node, "unable to infer array size", .{});
39703970 }
......@@ -4288,8 +4288,8 @@ fn fnDeclInner(
42884288 } else {
42894289 const type_expr = param.type_expr.?;
42904290 ambiguous: {
4291 if (tree.nodeTag(type_expr) != .identifier) break :ambiguous;
4292 const main_token = tree.nodeMainToken(type_expr);
4291 if (type_expr.tag(tree) != .identifier) break :ambiguous;
4292 const main_token = type_expr.mainToken(tree);
42934293 const identifier_str = tree.tokenSlice(main_token);
42944294 if (isPrimitive(identifier_str)) break :ambiguous;
42954295 return astgen.failNodeNotes(
......@@ -4331,7 +4331,7 @@ fn fnDeclInner(
43314331 _ = try param_gz.addBreakWithSrcNode(.break_inline, param_inst_expected, param_type, param_type_node);
43324332 const param_type_is_generic = any_param_used;
43334333
4334 const name_token = param.name_token orelse tree.nodeMainToken(param_type_node);
4334 const name_token = param.name_token orelse param_type_node.mainToken(tree);
43354335 const tag: Zir.Inst.Tag = if (is_comptime) .param_comptime else .param;
43364336 const param_inst = try decl_gz.addParam(&param_gz, param_insts.items, param_type_is_generic, tag, name_token, param_name);
43374337 assert(param_inst_expected == param_inst);
......@@ -4428,7 +4428,7 @@ fn fnDeclInner(
44284428 // Leave `astgen.src_hasher` unmodified; this will be used for hashing
44294429 // the *whole* function declaration, including its body.
44304430 var proto_hasher = astgen.src_hasher;
4431 const proto_node = tree.nodeData(decl_node).node_and_node[0];
4431 const proto_node = decl_node.data(tree).node_and_node[0];
44324432 proto_hasher.update(tree.getNodeSource(proto_node));
44334433 var proto_hash: std.zig.SrcHash = undefined;
44344434 proto_hasher.final(&proto_hash);
......@@ -4643,7 +4643,7 @@ fn comptimeDecl(
46434643 node: Ast.Node.Index,
46444644) InnerError!void {
46454645 const tree = astgen.tree;
4646 const body_node = tree.nodeData(node).node;
4646 const body_node = node.data(tree).node;
46474647
46484648 const old_hasher = astgen.src_hasher;
46494649 defer astgen.src_hasher = old_hasher;
......@@ -4713,8 +4713,8 @@ fn usingnamespaceDecl(
47134713 astgen.src_hasher.update(tree.getNodeSource(node));
47144714 astgen.src_hasher.update(std.mem.asBytes(&astgen.source_column));
47154715
4716 const type_expr = tree.nodeData(node).node;
4717 const is_pub = tree.isTokenPrecededByTags(tree.nodeMainToken(node), &.{.keyword_pub});
4716 const type_expr = node.data(tree).node;
4717 const is_pub = tree.isTokenPrecededByTags(node.mainToken(tree), &.{.keyword_pub});
47184718
47194719 // Up top so the ZIR instruction index marks the start range of this
47204720 // top-level declaration.
......@@ -4769,7 +4769,7 @@ fn testDecl(
47694769 node: Ast.Node.Index,
47704770) InnerError!void {
47714771 const tree = astgen.tree;
4772 _, const body_node = tree.nodeData(node).opt_token_and_node;
4772 _, const body_node = node.data(tree).opt_token_and_node;
47734773
47744774 const old_hasher = astgen.src_hasher;
47754775 defer astgen.src_hasher = old_hasher;
......@@ -4801,7 +4801,7 @@ fn testDecl(
48014801
48024802 const decl_column = astgen.source_column;
48034803
4804 const test_token = tree.nodeMainToken(node);
4804 const test_token = node.mainToken(tree);
48054805
48064806 const test_name_token = test_token + 1;
48074807 const test_name: Zir.NullTerminatedString = switch (tree.tokenTag(test_name_token)) {
......@@ -5275,7 +5275,7 @@ fn tupleDecl(
52755275
52765276 for (container_decl.ast.members) |member_node| {
52775277 const field = tree.fullContainerField(member_node) orelse {
5278 const tuple_member = for (container_decl.ast.members) |maybe_tuple| switch (tree.nodeTag(maybe_tuple)) {
5278 const tuple_member = for (container_decl.ast.members) |maybe_tuple| switch (maybe_tuple.tag(tree)) {
52795279 .container_field_init,
52805280 .container_field_align,
52815281 .container_field,
......@@ -5845,7 +5845,7 @@ fn containerMember(
58455845) InnerError!ContainerMemberResult {
58465846 const astgen = gz.astgen;
58475847 const tree = astgen.tree;
5848 switch (tree.nodeTag(member_node)) {
5848 switch (member_node.tag(tree)) {
58495849 .container_field_init,
58505850 .container_field_align,
58515851 .container_field,
......@@ -5860,8 +5860,8 @@ fn containerMember(
58605860 var buf: [1]Ast.Node.Index = undefined;
58615861 const full = tree.fullFnProto(&buf, member_node).?;
58625862
5863 const body: Ast.Node.OptionalIndex = if (tree.nodeTag(member_node) == .fn_decl)
5864 tree.nodeData(member_node).node_and_node[1].toOptional()
5863 const body: Ast.Node.OptionalIndex = if (member_node.tag(tree) == .fn_decl)
5864 member_node.data(tree).node_and_node[1].toOptional()
58655865 else
58665866 .none;
58675867
......@@ -5934,7 +5934,7 @@ fn containerMember(
59345934 .@"usingnamespace",
59355935 .empty,
59365936 member_node,
5937 tree.isTokenPrecededByTags(tree.nodeMainToken(member_node), &.{.keyword_pub}),
5937 tree.isTokenPrecededByTags(member_node.mainToken(tree), &.{.keyword_pub}),
59385938 );
59395939 },
59405940 };
......@@ -5975,7 +5975,7 @@ fn errorSetDecl(gz: *GenZir, ri: ResultInfo, node: Ast.Node.Index) InnerError!Zi
59755975 var idents: std.AutoHashMapUnmanaged(Zir.NullTerminatedString, Ast.TokenIndex) = .empty;
59765976 defer idents.deinit(gpa);
59775977
5978 const lbrace, const rbrace = tree.nodeData(node).token_and_token;
5978 const lbrace, const rbrace = node.data(tree).token_and_token;
59795979 for (lbrace + 1..rbrace) |i| {
59805980 const tok_i: Ast.TokenIndex = @intCast(i);
59815981 switch (tree.tokenTag(tok_i)) {
......@@ -6103,7 +6103,7 @@ fn orelseCatchExpr(
61036103 const astgen = parent_gz.astgen;
61046104 const tree = astgen.tree;
61056105
6106 const lhs, const rhs = tree.nodeData(node).node_and_node;
6106 const lhs, const rhs = node.data(tree).node_and_node;
61076107
61086108 const need_rl = astgen.nodes_need_rl.contains(node);
61096109 const block_ri: ResultInfo = if (need_rl) ri else .{
......@@ -6238,7 +6238,7 @@ fn addFieldAccess(
62386238 const astgen = gz.astgen;
62396239 const tree = astgen.tree;
62406240
6241 const object_node, const field_ident = tree.nodeData(node).node_and_token;
6241 const object_node, const field_ident = node.data(tree).node_and_token;
62426242 const str_index = try astgen.identAsString(field_ident);
62436243 const lhs = try expr(gz, scope, lhs_ri, object_node);
62446244
......@@ -6260,7 +6260,7 @@ fn arrayAccess(
62606260 const tree = gz.astgen.tree;
62616261 switch (ri.rl) {
62626262 .ref, .ref_coerced_ty => {
6263 const lhs_node, const rhs_node = tree.nodeData(node).node_and_node;
6263 const lhs_node, const rhs_node = node.data(tree).node_and_node;
62646264 const lhs = try expr(gz, scope, .{ .rl = .ref }, lhs_node);
62656265
62666266 const cursor = maybeAdvanceSourceCursorToMainToken(gz, node);
......@@ -6271,7 +6271,7 @@ fn arrayAccess(
62716271 return gz.addPlNode(.elem_ptr_node, node, Zir.Inst.Bin{ .lhs = lhs, .rhs = rhs });
62726272 },
62736273 else => {
6274 const lhs_node, const rhs_node = tree.nodeData(node).node_and_node;
6274 const lhs_node, const rhs_node = node.data(tree).node_and_node;
62756275 const lhs = try expr(gz, scope, .{ .rl = .none }, lhs_node);
62766276
62776277 const cursor = maybeAdvanceSourceCursorToMainToken(gz, node);
......@@ -6294,12 +6294,12 @@ fn simpleBinOp(
62946294 const astgen = gz.astgen;
62956295 const tree = astgen.tree;
62966296
6297 const lhs_node, const rhs_node = tree.nodeData(node).node_and_node;
6297 const lhs_node, const rhs_node = node.data(tree).node_and_node;
62986298
62996299 if (op_inst_tag == .cmp_neq or op_inst_tag == .cmp_eq) {
63006300 const str = if (op_inst_tag == .cmp_eq) "==" else "!=";
6301 if (tree.nodeTag(lhs_node) == .string_literal or
6302 tree.nodeTag(rhs_node) == .string_literal)
6301 if (lhs_node.tag(tree) == .string_literal or
6302 rhs_node.tag(tree) == .string_literal)
63036303 return astgen.failNode(node, "cannot compare strings with {s}", .{str});
63046304 }
63056305
......@@ -6343,7 +6343,7 @@ fn boolBinOp(
63436343 const astgen = gz.astgen;
63446344 const tree = astgen.tree;
63456345
6346 const lhs_node, const rhs_node = tree.nodeData(node).node_and_node;
6346 const lhs_node, const rhs_node = node.data(tree).node_and_node;
63476347 const lhs = try expr(gz, scope, coerced_bool_ri, lhs_node);
63486348 const bool_br = (try gz.addPlNodePayloadIndex(zir_tag, node, undefined)).toIndex().?;
63496349
......@@ -6951,11 +6951,11 @@ fn forExpr(
69516951 capture_token = ident_tok + 2;
69526952
69536953 try emitDbgNode(parent_gz, input);
6954 if (tree.nodeTag(input) == .for_range) {
6954 if (input.tag(tree) == .for_range) {
69556955 if (capture_is_ref) {
69566956 return astgen.failTok(ident_tok, "cannot capture reference to range", .{});
69576957 }
6958 const start_node, const end_node = tree.nodeData(input).node_and_opt_node;
6958 const start_node, const end_node = input.data(tree).node_and_opt_node;
69596959 const start_val = try expr(parent_gz, scope, .{ .rl = .{ .ty = .usize_type } }, start_node);
69606960
69616961 const end_val = if (end_node.unwrap()) |end|
......@@ -7064,7 +7064,7 @@ fn forExpr(
70647064 try astgen.detectLocalShadowing(capture_sub_scope, name_str_index, ident_tok, capture_name, .capture);
70657065
70667066 const capture_inst = inst: {
7067 const is_counter = tree.nodeTag(input) == .for_range;
7067 const is_counter = input.tag(tree) == .for_range;
70687068
70697069 if (indexable_ref == .none) {
70707070 // Special case: the main index can be used directly.
......@@ -7204,9 +7204,9 @@ fn switchExprErrUnion(
72047204
72057205 const switch_node, const operand_node, const error_payload = switch (node_ty) {
72067206 .@"catch" => .{
7207 tree.nodeData(catch_or_if_node).node_and_node[1],
7208 tree.nodeData(catch_or_if_node).node_and_node[0],
7209 tree.nodeMainToken(catch_or_if_node) + 2,
7207 catch_or_if_node.data(tree).node_and_node[1],
7208 catch_or_if_node.data(tree).node_and_node[0],
7209 catch_or_if_node.mainToken(tree) + 2,
72107210 },
72117211 .@"if" => .{
72127212 if_full.ast.else_expr.unwrap().?,
......@@ -7266,8 +7266,8 @@ fn switchExprErrUnion(
72667266 else_src = case_src;
72677267 continue;
72687268 } else if (case.ast.values.len == 1 and
7269 tree.nodeTag(case.ast.values[0]) == .identifier and
7270 mem.eql(u8, tree.tokenSlice(tree.nodeMainToken(case.ast.values[0])), "_"))
7269 case.ast.values[0].tag(tree) == .identifier and
7270 mem.eql(u8, tree.tokenSlice(case.ast.values[0].mainToken(tree)), "_"))
72717271 {
72727272 const case_src = case.ast.arrow_token - 1;
72737273 return astgen.failTokNotes(
......@@ -7285,11 +7285,11 @@ fn switchExprErrUnion(
72857285 }
72867286
72877287 for (case.ast.values) |val| {
7288 if (tree.nodeTag(val) == .string_literal)
7288 if (val.tag(tree) == .string_literal)
72897289 return astgen.failNode(val, "cannot switch on strings", .{});
72907290 }
72917291
7292 if (case.ast.values.len == 1 and tree.nodeTag(case.ast.values[0]) != .switch_range) {
7292 if (case.ast.values.len == 1 and case.ast.values[0].tag(tree) != .switch_range) {
72937293 scalar_cases_len += 1;
72947294 } else {
72957295 multi_cases_len += 1;
......@@ -7486,7 +7486,7 @@ fn switchExprErrUnion(
74867486 const case = tree.fullSwitchCase(case_node).?;
74877487
74887488 const is_multi_case = case.ast.values.len > 1 or
7489 (case.ast.values.len == 1 and tree.nodeTag(case.ast.values[0]) == .switch_range);
7489 (case.ast.values.len == 1 and case.ast.values[0].tag(tree) == .switch_range);
74907490
74917491 var dbg_var_name: Zir.NullTerminatedString = .empty;
74927492 var dbg_var_inst: Zir.Inst.Ref = undefined;
......@@ -7540,7 +7540,7 @@ fn switchExprErrUnion(
75407540 // items
75417541 var items_len: u32 = 0;
75427542 for (case.ast.values) |item_node| {
7543 if (tree.nodeTag(item_node) == .switch_range) continue;
7543 if (item_node.tag(tree) == .switch_range) continue;
75447544 items_len += 1;
75457545
75467546 const item_inst = try comptimeExpr(parent_gz, scope, item_ri, item_node, .switch_item);
......@@ -7550,10 +7550,10 @@ fn switchExprErrUnion(
75507550 // ranges
75517551 var ranges_len: u32 = 0;
75527552 for (case.ast.values) |range| {
7553 if (tree.nodeTag(range) != .switch_range) continue;
7553 if (range.tag(tree) != .switch_range) continue;
75547554 ranges_len += 1;
75557555
7556 const first_node, const last_node = tree.nodeData(range).node_and_node;
7556 const first_node, const last_node = range.data(tree).node_and_node;
75577557 const first = try comptimeExpr(parent_gz, scope, item_ri, first_node, .switch_item);
75587558 const last = try comptimeExpr(parent_gz, scope, item_ri, last_node, .switch_item);
75597559 try payloads.appendSlice(gpa, &[_]u32{
......@@ -7788,8 +7788,8 @@ fn switchExpr(
77887788 else_src = case_src;
77897789 continue;
77907790 } else if (case.ast.values.len == 1 and
7791 tree.nodeTag(case.ast.values[0]) == .identifier and
7792 mem.eql(u8, tree.tokenSlice(tree.nodeMainToken(case.ast.values[0])), "_"))
7791 case.ast.values[0].tag(tree) == .identifier and
7792 mem.eql(u8, tree.tokenSlice(case.ast.values[0].mainToken(tree)), "_"))
77937793 {
77947794 const case_src = case.ast.arrow_token - 1;
77957795 if (underscore_src) |src| {
......@@ -7834,11 +7834,11 @@ fn switchExpr(
78347834 }
78357835
78367836 for (case.ast.values) |val| {
7837 if (tree.nodeTag(val) == .string_literal)
7837 if (val.tag(tree) == .string_literal)
78387838 return astgen.failNode(val, "cannot switch on strings", .{});
78397839 }
78407840
7841 if (case.ast.values.len == 1 and tree.nodeTag(case.ast.values[0]) != .switch_range) {
7841 if (case.ast.values.len == 1 and case.ast.values[0].tag(tree) != .switch_range) {
78427842 scalar_cases_len += 1;
78437843 } else {
78447844 multi_cases_len += 1;
......@@ -7927,7 +7927,7 @@ fn switchExpr(
79277927 const case = tree.fullSwitchCase(case_node).?;
79287928
79297929 const is_multi_case = case.ast.values.len > 1 or
7930 (case.ast.values.len == 1 and tree.nodeTag(case.ast.values[0]) == .switch_range);
7930 (case.ast.values.len == 1 and case.ast.values[0].tag(tree) == .switch_range);
79317931
79327932 var dbg_var_name: Zir.NullTerminatedString = .empty;
79337933 var dbg_var_inst: Zir.Inst.Ref = undefined;
......@@ -8007,7 +8007,7 @@ fn switchExpr(
80078007 // items
80088008 var items_len: u32 = 0;
80098009 for (case.ast.values) |item_node| {
8010 if (tree.nodeTag(item_node) == .switch_range) continue;
8010 if (item_node.tag(tree) == .switch_range) continue;
80118011 items_len += 1;
80128012
80138013 const item_inst = try comptimeExpr(parent_gz, scope, item_ri, item_node, .switch_item);
......@@ -8017,10 +8017,10 @@ fn switchExpr(
80178017 // ranges
80188018 var ranges_len: u32 = 0;
80198019 for (case.ast.values) |range| {
8020 if (tree.nodeTag(range) != .switch_range) continue;
8020 if (range.tag(tree) != .switch_range) continue;
80218021 ranges_len += 1;
80228022
8023 const first_node, const last_node = tree.nodeData(range).node_and_node;
8023 const first_node, const last_node = range.data(tree).node_and_node;
80248024 const first = try comptimeExpr(parent_gz, scope, item_ri, first_node, .switch_item);
80258025 const last = try comptimeExpr(parent_gz, scope, item_ri, last_node, .switch_item);
80268026 try payloads.appendSlice(gpa, &[_]u32{
......@@ -8170,7 +8170,7 @@ fn ret(gz: *GenZir, scope: *Scope, node: Ast.Node.Index) InnerError!Zir.Inst.Ref
81708170
81718171 const defer_outer = &astgen.fn_block.?.base;
81728172
8173 const operand_node = tree.nodeData(node).opt_node.unwrap() orelse {
8173 const operand_node = node.data(tree).opt_node.unwrap() orelse {
81748174 // Returning a void value; skip error defers.
81758175 try genDefers(gz, defer_outer, scope, .normal_only);
81768176
......@@ -8181,10 +8181,10 @@ fn ret(gz: *GenZir, scope: *Scope, node: Ast.Node.Index) InnerError!Zir.Inst.Ref
81818181 return Zir.Inst.Ref.unreachable_value;
81828182 };
81838183
8184 if (tree.nodeTag(operand_node) == .error_value) {
8184 if (operand_node.tag(tree) == .error_value) {
81858185 // Hot path for `return error.Foo`. This bypasses result location logic as well as logic
81868186 // for detecting whether to add something to the function's inferred error set.
8187 const ident_token = tree.nodeMainToken(operand_node) + 2;
8187 const ident_token = operand_node.mainToken(tree) + 2;
81888188 const err_name_str_index = try astgen.identAsString(ident_token);
81898189 const defer_counts = countDefers(defer_outer, scope);
81908190 if (!defer_counts.need_err_code) {
......@@ -8316,7 +8316,7 @@ fn identifier(
83168316 const astgen = gz.astgen;
83178317 const tree = astgen.tree;
83188318
8319 const ident_token = tree.nodeMainToken(ident);
8319 const ident_token = ident.mainToken(tree);
83208320 const ident_name_raw = tree.tokenSlice(ident_token);
83218321 if (mem.eql(u8, ident_name_raw, "_")) {
83228322 return astgen.failNode(ident, "'_' used as an identifier without @\"_\" syntax", .{});
......@@ -8657,7 +8657,7 @@ fn stringLiteral(
86578657) InnerError!Zir.Inst.Ref {
86588658 const astgen = gz.astgen;
86598659 const tree = astgen.tree;
8660 const str_lit_token = tree.nodeMainToken(node);
8660 const str_lit_token = node.mainToken(tree);
86618661 const str = try astgen.strLitAsString(str_lit_token);
86628662 const result = try gz.add(.{
86638663 .tag = .str,
......@@ -8689,7 +8689,7 @@ fn multilineStringLiteral(
86898689fn charLiteral(gz: *GenZir, ri: ResultInfo, node: Ast.Node.Index) InnerError!Zir.Inst.Ref {
86908690 const astgen = gz.astgen;
86918691 const tree = astgen.tree;
8692 const main_token = tree.nodeMainToken(node);
8692 const main_token = node.mainToken(tree);
86938693 const slice = tree.tokenSlice(main_token);
86948694
86958695 switch (std.zig.parseCharLiteral(slice)) {
......@@ -8706,7 +8706,7 @@ const Sign = enum { negative, positive };
87068706fn numberLiteral(gz: *GenZir, ri: ResultInfo, node: Ast.Node.Index, source_node: Ast.Node.Index, sign: Sign) InnerError!Zir.Inst.Ref {
87078707 const astgen = gz.astgen;
87088708 const tree = astgen.tree;
8709 const num_token = tree.nodeMainToken(node);
8709 const num_token = node.mainToken(tree);
87108710 const bytes = tree.tokenSlice(num_token);
87118711
87128712 const result: Zir.Inst.Ref = switch (std.zig.parseNumberLiteral(bytes)) {
......@@ -8826,10 +8826,10 @@ fn asmExpr(
88268826 const tree = astgen.tree;
88278827
88288828 const TagAndTmpl = struct { tag: Zir.Inst.Extended, tmpl: Zir.NullTerminatedString };
8829 const tag_and_tmpl: TagAndTmpl = switch (tree.nodeTag(full.ast.template)) {
8829 const tag_and_tmpl: TagAndTmpl = switch (full.ast.template.tag(tree)) {
88308830 .string_literal => .{
88318831 .tag = .@"asm",
8832 .tmpl = (try astgen.strLitAsString(tree.nodeMainToken(full.ast.template))).index,
8832 .tmpl = (try astgen.strLitAsString(full.ast.template.mainToken(tree))).index,
88338833 },
88348834 .multiline_string_literal => .{
88358835 .tag = .@"asm",
......@@ -8864,7 +8864,7 @@ fn asmExpr(
88648864 var output_type_bits: u32 = 0;
88658865
88668866 for (full.outputs, 0..) |output_node, i| {
8867 const symbolic_name = tree.nodeMainToken(output_node);
8867 const symbolic_name = output_node.mainToken(tree);
88688868 const name = try astgen.identAsString(symbolic_name);
88698869 const constraint_token = symbolic_name + 2;
88708870 const constraint = (try astgen.strLitAsString(constraint_token)).index;
......@@ -8874,7 +8874,7 @@ fn asmExpr(
88748874 return astgen.failNode(output_node, "inline assembly allows up to one output value", .{});
88758875 }
88768876 output_type_bits |= @as(u32, 1) << @intCast(i);
8877 const out_type_node = tree.nodeData(output_node).opt_node_and_token[0].unwrap().?;
8877 const out_type_node = output_node.data(tree).opt_node_and_token[0].unwrap().?;
88788878 const out_type_inst = try typeExpr(gz, scope, out_type_node);
88798879 outputs[i] = .{
88808880 .name = name,
......@@ -8901,11 +8901,11 @@ fn asmExpr(
89018901 const inputs = inputs_buffer[0..full.inputs.len];
89028902
89038903 for (full.inputs, 0..) |input_node, i| {
8904 const symbolic_name = tree.nodeMainToken(input_node);
8904 const symbolic_name = input_node.mainToken(tree);
89058905 const name = try astgen.identAsString(symbolic_name);
89068906 const constraint_token = symbolic_name + 2;
89078907 const constraint = (try astgen.strLitAsString(constraint_token)).index;
8908 const operand = try expr(gz, scope, .{ .rl = .none }, tree.nodeData(input_node).node_and_token[0]);
8908 const operand = try expr(gz, scope, .{ .rl = .none }, input_node.data(tree).node_and_token[0]);
89098909 inputs[i] = .{
89108910 .name = name,
89118911 .constraint = constraint,
......@@ -9029,11 +9029,11 @@ fn ptrCast(
90299029 // to handle `builtin_call_two`.
90309030 var node = root_node;
90319031 while (true) {
9032 switch (tree.nodeTag(node)) {
9032 switch (node.tag(tree)) {
90339033 .builtin_call_two, .builtin_call_two_comma => {},
90349034 .grouped_expression => {
90359035 // Handle the chaining even with redundant parentheses
9036 node = tree.nodeData(node).node_and_token[0];
9036 node = node.data(tree).node_and_token[0];
90379037 continue;
90389038 },
90399039 else => break,
......@@ -9045,7 +9045,7 @@ fn ptrCast(
90459045
90469046 if (args.len == 0) break; // 0 args
90479047
9048 const builtin_token = tree.nodeMainToken(node);
9048 const builtin_token = node.mainToken(tree);
90499049 const builtin_name = tree.tokenSlice(builtin_token);
90509050 const info = BuiltinFn.list.get(builtin_name) orelse break;
90519051 if (args.len == 1) {
......@@ -9246,7 +9246,7 @@ fn builtinCall(
92469246 const astgen = gz.astgen;
92479247 const tree = astgen.tree;
92489248
9249 const builtin_token = tree.nodeMainToken(node);
9249 const builtin_token = node.mainToken(tree);
92509250 const builtin_name = tree.tokenSlice(builtin_token);
92519251
92529252 // We handle the different builtins manually because they have different semantics depending
......@@ -9289,11 +9289,11 @@ fn builtinCall(
92899289 .import => {
92909290 const operand_node = params[0];
92919291
9292 if (tree.nodeTag(operand_node) != .string_literal) {
9292 if (operand_node.tag(tree) != .string_literal) {
92939293 // Spec reference: https://github.com/ziglang/zig/issues/2206
92949294 return astgen.failNode(operand_node, "@import operand must be a string literal", .{});
92959295 }
9296 const str_lit_token = tree.nodeMainToken(operand_node);
9296 const str_lit_token = operand_node.mainToken(tree);
92979297 const str = try astgen.strLitAsString(str_lit_token);
92989298 const str_slice = astgen.string_bytes.items[@intFromEnum(str.index)..][0..str.len];
92999299 if (mem.indexOfScalar(u8, str_slice, 0) != null) {
......@@ -9919,8 +9919,8 @@ fn negation(
99199919
99209920 // Check for float literal as the sub-expression because we want to preserve
99219921 // its negativity rather than having it go through comptime subtraction.
9922 const operand_node = tree.nodeData(node).node;
9923 if (tree.nodeTag(operand_node) == .number_literal) {
9922 const operand_node = node.data(tree).node;
9923 if (operand_node.tag(tree) == .number_literal) {
99249924 return numberLiteral(gz, ri, operand_node, node, .negative);
99259925 }
99269926
......@@ -10034,9 +10034,10 @@ fn shiftOp(
1003410034 rhs_node: Ast.Node.Index,
1003510035 tag: Zir.Inst.Tag,
1003610036) InnerError!Zir.Inst.Ref {
10037 const tree = gz.astgen.tree;
1003710038 const lhs = try expr(gz, scope, .{ .rl = .none }, lhs_node);
1003810039
10039 const cursor = switch (gz.astgen.tree.nodeTag(node)) {
10040 const cursor = switch (node.tag(tree)) {
1004010041 .shl, .shr => maybeAdvanceSourceCursorToMainToken(gz, node),
1004110042 else => undefined,
1004210043 };
......@@ -10044,7 +10045,7 @@ fn shiftOp(
1004410045 const log2_int_type = try gz.addUnNode(.typeof_log2_int_type, lhs, lhs_node);
1004510046 const rhs = try expr(gz, scope, .{ .rl = .{ .ty = log2_int_type }, .ctx = .shift_op }, rhs_node);
1004610047
10047 switch (gz.astgen.tree.nodeTag(node)) {
10048 switch (node.tag(tree)) {
1004810049 .shl, .shr => try emitDbgStmt(gz, cursor),
1004910050 else => undefined,
1005010051 }
......@@ -10248,10 +10249,10 @@ fn calleeExpr(
1024810249 const astgen = gz.astgen;
1024910250 const tree = astgen.tree;
1025010251
10251 const tag = tree.nodeTag(node);
10252 const tag = node.tag(tree);
1025210253 switch (tag) {
1025310254 .field_access => {
10254 const object_node, const field_ident = tree.nodeData(node).node_and_token;
10255 const object_node, const field_ident = node.data(tree).node_and_token;
1025510256 const str_index = try astgen.identAsString(field_ident);
1025610257 // Capture the object by reference so we can promote it to an
1025710258 // address in Sema if needed.
......@@ -10276,7 +10277,7 @@ fn calleeExpr(
1027610277 // Decl literal call syntax, e.g.
1027710278 // `const foo: T = .init();`
1027810279 // Look up `init` in `T`, but don't try and coerce it.
10279 const str_index = try astgen.identAsString(tree.nodeMainToken(node));
10280 const str_index = try astgen.identAsString(node.mainToken(tree));
1028010281 const callee = try gz.addPlNode(.decl_literal_no_coerce, node, Zir.Inst.Field{
1028110282 .lhs = res_ty,
1028210283 .field_name_start = str_index,
......@@ -10348,9 +10349,9 @@ comptime {
1034810349}
1034910350
1035010351fn nodeIsTriviallyZero(tree: *const Ast, node: Ast.Node.Index) bool {
10351 switch (tree.nodeTag(node)) {
10352 switch (node.tag(tree)) {
1035210353 .number_literal => {
10353 const ident = tree.nodeMainToken(node);
10354 const ident = node.mainToken(tree);
1035410355 return switch (std.zig.parseNumberLiteral(tree.tokenSlice(ident))) {
1035510356 .int => |number| switch (number) {
1035610357 0 => true,
......@@ -10366,7 +10367,7 @@ fn nodeIsTriviallyZero(tree: *const Ast, node: Ast.Node.Index) bool {
1036610367fn nodeMayAppendToErrorTrace(tree: *const Ast, start_node: Ast.Node.Index) bool {
1036710368 var node = start_node;
1036810369 while (true) {
10369 switch (tree.nodeTag(node)) {
10370 switch (node.tag(tree)) {
1037010371 // These don't have the opportunity to call any runtime functions.
1037110372 .error_value,
1037210373 .identifier,
......@@ -10376,10 +10377,10 @@ fn nodeMayAppendToErrorTrace(tree: *const Ast, start_node: Ast.Node.Index) bool
1037610377 // Forward the question to the LHS sub-expression.
1037710378 .@"try",
1037810379 .@"nosuspend",
10379 => node = tree.nodeData(node).node,
10380 => node = node.data(tree).node,
1038010381 .grouped_expression,
1038110382 .unwrap_optional,
10382 => node = tree.nodeData(node).node_and_token[0],
10383 => node = node.data(tree).node_and_token[0],
1038310384
1038410385 // Anything that does not eval to an error is guaranteed to pop any
1038510386 // additions to the error trace, so it effectively does not append.
......@@ -10391,7 +10392,7 @@ fn nodeMayAppendToErrorTrace(tree: *const Ast, start_node: Ast.Node.Index) bool
1039110392fn nodeMayEvalToError(tree: *const Ast, start_node: Ast.Node.Index) BuiltinFn.EvalToError {
1039210393 var node = start_node;
1039310394 while (true) {
10394 switch (tree.nodeTag(node)) {
10395 switch (node.tag(tree)) {
1039510396 .root,
1039610397 .@"usingnamespace",
1039710398 .test_decl,
......@@ -10558,10 +10559,10 @@ fn nodeMayEvalToError(tree: *const Ast, start_node: Ast.Node.Index) BuiltinFn.Ev
1055810559 .@"await",
1055910560 .@"comptime",
1056010561 .@"nosuspend",
10561 => node = tree.nodeData(node).node,
10562 => node = node.data(tree).node,
1056210563 .grouped_expression,
1056310564 .unwrap_optional,
10564 => node = tree.nodeData(node).node_and_token[0],
10565 => node = node.data(tree).node_and_token[0],
1056510566
1056610567 // LHS sub-expression may still be an error under the outer optional or error union
1056710568 .@"catch",
......@@ -10573,7 +10574,7 @@ fn nodeMayEvalToError(tree: *const Ast, start_node: Ast.Node.Index) BuiltinFn.Ev
1057310574 .block,
1057410575 .block_semicolon,
1057510576 => {
10576 const lbrace = tree.nodeMainToken(node);
10577 const lbrace = node.mainToken(tree);
1057710578 if (tree.tokenTag(lbrace - 1) == .colon) {
1057810579 // Labeled blocks may need a memory location to forward
1057910580 // to their break statements.
......@@ -10588,7 +10589,7 @@ fn nodeMayEvalToError(tree: *const Ast, start_node: Ast.Node.Index) BuiltinFn.Ev
1058810589 .builtin_call_two,
1058910590 .builtin_call_two_comma,
1059010591 => {
10591 const builtin_token = tree.nodeMainToken(node);
10592 const builtin_token = node.mainToken(tree);
1059210593 const builtin_name = tree.tokenSlice(builtin_token);
1059310594 // If the builtin is an invalid name, we don't cause an error here; instead
1059410595 // let it pass, and the error will be "invalid builtin function" later.
......@@ -10604,7 +10605,7 @@ fn nodeMayEvalToError(tree: *const Ast, start_node: Ast.Node.Index) BuiltinFn.Ev
1060410605fn nodeImpliesMoreThanOnePossibleValue(tree: *const Ast, start_node: Ast.Node.Index) bool {
1060510606 var node = start_node;
1060610607 while (true) {
10607 switch (tree.nodeTag(node)) {
10608 switch (node.tag(tree)) {
1060810609 .root,
1060910610 .@"usingnamespace",
1061010611 .test_decl,
......@@ -10771,10 +10772,10 @@ fn nodeImpliesMoreThanOnePossibleValue(tree: *const Ast, start_node: Ast.Node.In
1077110772 .@"await",
1077210773 .@"comptime",
1077310774 .@"nosuspend",
10774 => node = tree.nodeData(node).node,
10775 => node = node.data(tree).node,
1077510776 .grouped_expression,
1077610777 .unwrap_optional,
10777 => node = tree.nodeData(node).node_and_token[0],
10778 => node = node.data(tree).node_and_token[0],
1077810779
1077910780 .ptr_type_aligned,
1078010781 .ptr_type_sentinel,
......@@ -10786,7 +10787,7 @@ fn nodeImpliesMoreThanOnePossibleValue(tree: *const Ast, start_node: Ast.Node.In
1078610787 => return true,
1078710788
1078810789 .identifier => {
10789 const ident_bytes = tree.tokenSlice(tree.nodeMainToken(node));
10790 const ident_bytes = tree.tokenSlice(node.mainToken(tree));
1079010791 if (primitive_instrs.get(ident_bytes)) |primitive| switch (primitive) {
1079110792 .anyerror_type,
1079210793 .anyframe_type,
......@@ -10848,7 +10849,7 @@ fn nodeImpliesMoreThanOnePossibleValue(tree: *const Ast, start_node: Ast.Node.In
1084810849fn nodeImpliesComptimeOnly(tree: *const Ast, start_node: Ast.Node.Index) bool {
1084910850 var node = start_node;
1085010851 while (true) {
10851 switch (tree.nodeTag(node)) {
10852 switch (node.tag(tree)) {
1085210853 .root,
1085310854 .@"usingnamespace",
1085410855 .test_decl,
......@@ -11024,13 +11025,13 @@ fn nodeImpliesComptimeOnly(tree: *const Ast, start_node: Ast.Node.Index) bool {
1102411025 .@"await",
1102511026 .@"comptime",
1102611027 .@"nosuspend",
11027 => node = tree.nodeData(node).node,
11028 => node = node.data(tree).node,
1102811029 .grouped_expression,
1102911030 .unwrap_optional,
11030 => node = tree.nodeData(node).node_and_token[0],
11031 => node = node.data(tree).node_and_token[0],
1103111032
1103211033 .identifier => {
11033 const ident_bytes = tree.tokenSlice(tree.nodeMainToken(node));
11034 const ident_bytes = tree.tokenSlice(node.mainToken(tree));
1103411035 if (primitive_instrs.get(ident_bytes)) |primitive| switch (primitive) {
1103511036 .anyerror_type,
1103611037 .anyframe_type,
......@@ -11089,7 +11090,7 @@ fn nodeImpliesComptimeOnly(tree: *const Ast, start_node: Ast.Node.Index) bool {
1108911090
1109011091/// Returns `true` if the node uses `gz.anon_name_strategy`.
1109111092fn nodeUsesAnonNameStrategy(tree: *const Ast, node: Ast.Node.Index) bool {
11092 switch (tree.nodeTag(node)) {
11093 switch (node.tag(tree)) {
1109311094 .container_decl,
1109411095 .container_decl_trailing,
1109511096 .container_decl_two,
......@@ -11104,7 +11105,7 @@ fn nodeUsesAnonNameStrategy(tree: *const Ast, node: Ast.Node.Index) bool {
1110411105 .tagged_union_enum_tag_trailing,
1110511106 => return true,
1110611107 .builtin_call_two, .builtin_call_two_comma, .builtin_call, .builtin_call_comma => {
11107 const builtin_token = tree.nodeMainToken(node);
11108 const builtin_token = node.mainToken(tree);
1110811109 const builtin_name = tree.tokenSlice(builtin_token);
1110911110 return std.mem.eql(u8, builtin_name, "@Type");
1111011111 },
......@@ -11660,7 +11661,7 @@ fn strLitAsString(astgen: *AstGen, str_lit_token: Ast.TokenIndex) !IndexSlice {
1166011661fn strLitNodeAsString(astgen: *AstGen, node: Ast.Node.Index) !IndexSlice {
1166111662 const tree = astgen.tree;
1166211663
11663 const start, const end = tree.nodeData(node).token_and_token;
11664 const start, const end = node.data(tree).token_and_token;
1166411665
1166511666 const gpa = astgen.gpa;
1166611667 const string_bytes = &astgen.string_bytes;
......@@ -12155,9 +12156,9 @@ const GenZir = struct {
1215512156 const src_locs_and_hash: []const u32 = if (args.body_gz != null) src_locs_and_hash: {
1215612157 const tree = astgen.tree;
1215712158 const fn_decl = args.src_node;
12158 const block = switch (tree.nodeTag(fn_decl)) {
12159 .fn_decl => tree.nodeData(fn_decl).node_and_node[1],
12160 .test_decl => tree.nodeData(fn_decl).opt_token_and_node[1],
12159 const block = switch (fn_decl.tag(tree)) {
12160 .fn_decl => fn_decl.data(tree).node_and_node[1],
12161 .test_decl => fn_decl.data(tree).opt_token_and_node[1],
1216112162 else => unreachable,
1216212163 };
1216312164 const rbrace_start = tree.tokenStart(tree.lastToken(block));
......@@ -13399,7 +13400,7 @@ fn maybeAdvanceSourceCursorToMainToken(gz: *GenZir, node: Ast.Node.Index) LineCo
1339913400 if (gz.is_comptime) return .{ gz.astgen.source_line - gz.decl_line, gz.astgen.source_column };
1340013401
1340113402 const tree = gz.astgen.tree;
13402 const node_start = tree.tokenStart(tree.nodeMainToken(node));
13403 const node_start = tree.tokenStart(node.mainToken(tree));
1340313404 gz.astgen.advanceSourceCursor(node_start);
1340413405
1340513406 return .{ gz.astgen.source_line - gz.decl_line, gz.astgen.source_column };
......@@ -13492,7 +13493,7 @@ fn scanContainer(
1349213493 var decl_count: u32 = 0;
1349313494 for (members) |member_node| {
1349413495 const Kind = enum { decl, field };
13495 const kind: Kind, const name_token = switch (tree.nodeTag(member_node)) {
13496 const kind: Kind, const name_token = switch (member_node.tag(tree)) {
1349613497 .container_field_init,
1349713498 .container_field_align,
1349813499 .container_field,
......@@ -13512,7 +13513,7 @@ fn scanContainer(
1351213513 .aligned_var_decl,
1351313514 => blk: {
1351413515 decl_count += 1;
13515 break :blk .{ .decl, tree.nodeMainToken(member_node) + 1 };
13516 break :blk .{ .decl, member_node.mainToken(tree) + 1 };
1351613517 },
1351713518
1351813519 .fn_proto_simple,
......@@ -13522,7 +13523,7 @@ fn scanContainer(
1352213523 .fn_decl,
1352313524 => blk: {
1352413525 decl_count += 1;
13525 const ident = tree.nodeMainToken(member_node) + 1;
13526 const ident = member_node.mainToken(tree) + 1;
1352613527 if (tree.tokenTag(ident) != .identifier) {
1352713528 try astgen.appendErrorNode(member_node, "missing function name", .{});
1352813529 any_invalid_declarations = true;
......@@ -13540,7 +13541,7 @@ fn scanContainer(
1354013541 decl_count += 1;
1354113542 // We don't want shadowing detection here, and test names work a bit differently, so
1354213543 // we must do the redeclaration detection ourselves.
13543 const test_name_token = tree.nodeMainToken(member_node) + 1;
13544 const test_name_token = member_node.mainToken(tree) + 1;
1354413545 const new_ent: NameEntry = .{
1354513546 .tok = test_name_token,
1354613547 .next = null,
lib/std/zig/AstRlAnnotate.zig+44-44
......@@ -61,11 +61,11 @@ const Block = struct {
6161 consumes_res_ptr: bool,
6262};
6363
64pub fn annotate(gpa: Allocator, arena: Allocator, tree: Ast) Allocator.Error!RlNeededSet {
64pub fn annotate(gpa: Allocator, arena: Allocator, tree: *const Ast) Allocator.Error!RlNeededSet {
6565 var astrl: AstRlAnnotate = .{
6666 .gpa = gpa,
6767 .arena = arena,
68 .tree = &tree,
68 .tree = tree,
6969 };
7070 defer astrl.deinit(gpa);
7171
......@@ -129,7 +129,7 @@ fn containerDecl(
129129/// Returns true if `rl` provides a result pointer and the expression consumes it.
130130fn expr(astrl: *AstRlAnnotate, node: Ast.Node.Index, block: ?*Block, ri: ResultInfo) Allocator.Error!bool {
131131 const tree = astrl.tree;
132 switch (tree.nodeTag(node)) {
132 switch (node.tag(tree)) {
133133 .root,
134134 .switch_case_one,
135135 .switch_case_inline_one,
......@@ -142,11 +142,11 @@ fn expr(astrl: *AstRlAnnotate, node: Ast.Node.Index, block: ?*Block, ri: ResultI
142142 => unreachable,
143143
144144 .@"errdefer" => {
145 _ = try astrl.expr(tree.nodeData(node).opt_token_and_node[1], block, ResultInfo.none);
145 _ = try astrl.expr(node.data(tree).opt_token_and_node[1], block, ResultInfo.none);
146146 return false;
147147 },
148148 .@"defer" => {
149 _ = try astrl.expr(tree.nodeData(node).node, block, ResultInfo.none);
149 _ = try astrl.expr(node.data(tree).node, block, ResultInfo.none);
150150 return false;
151151 },
152152
......@@ -166,11 +166,11 @@ fn expr(astrl: *AstRlAnnotate, node: Ast.Node.Index, block: ?*Block, ri: ResultI
166166 return false;
167167 },
168168 .@"usingnamespace" => {
169 _ = try astrl.expr(tree.nodeData(node).node, block, ResultInfo.type_only);
169 _ = try astrl.expr(node.data(tree).node, block, ResultInfo.type_only);
170170 return false;
171171 },
172172 .test_decl => {
173 _ = try astrl.expr(tree.nodeData(node).opt_token_and_node[1], block, ResultInfo.none);
173 _ = try astrl.expr(node.data(tree).opt_token_and_node[1], block, ResultInfo.none);
174174 return false;
175175 },
176176 .global_var_decl,
......@@ -214,7 +214,7 @@ fn expr(astrl: *AstRlAnnotate, node: Ast.Node.Index, block: ?*Block, ri: ResultI
214214 return false;
215215 },
216216 .assign => {
217 const lhs, const rhs = tree.nodeData(node).node_and_node;
217 const lhs, const rhs = node.data(tree).node_and_node;
218218 _ = try astrl.expr(lhs, block, ResultInfo.none);
219219 _ = try astrl.expr(rhs, block, ResultInfo.typed_ptr);
220220 return false;
......@@ -237,13 +237,13 @@ fn expr(astrl: *AstRlAnnotate, node: Ast.Node.Index, block: ?*Block, ri: ResultI
237237 .assign_mul_wrap,
238238 .assign_mul_sat,
239239 => {
240 const lhs, const rhs = tree.nodeData(node).node_and_node;
240 const lhs, const rhs = node.data(tree).node_and_node;
241241 _ = try astrl.expr(lhs, block, ResultInfo.none);
242242 _ = try astrl.expr(rhs, block, ResultInfo.none);
243243 return false;
244244 },
245245 .shl, .shr => {
246 const lhs, const rhs = tree.nodeData(node).node_and_node;
246 const lhs, const rhs = node.data(tree).node_and_node;
247247 _ = try astrl.expr(lhs, block, ResultInfo.none);
248248 _ = try astrl.expr(rhs, block, ResultInfo.type_only);
249249 return false;
......@@ -271,20 +271,20 @@ fn expr(astrl: *AstRlAnnotate, node: Ast.Node.Index, block: ?*Block, ri: ResultI
271271 .less_or_equal,
272272 .array_cat,
273273 => {
274 const lhs, const rhs = tree.nodeData(node).node_and_node;
274 const lhs, const rhs = node.data(tree).node_and_node;
275275 _ = try astrl.expr(lhs, block, ResultInfo.none);
276276 _ = try astrl.expr(rhs, block, ResultInfo.none);
277277 return false;
278278 },
279279
280280 .array_mult => {
281 const lhs, const rhs = tree.nodeData(node).node_and_node;
281 const lhs, const rhs = node.data(tree).node_and_node;
282282 _ = try astrl.expr(lhs, block, ResultInfo.none);
283283 _ = try astrl.expr(rhs, block, ResultInfo.type_only);
284284 return false;
285285 },
286286 .error_union, .merge_error_sets => {
287 const lhs, const rhs = tree.nodeData(node).node_and_node;
287 const lhs, const rhs = node.data(tree).node_and_node;
288288 _ = try astrl.expr(lhs, block, ResultInfo.none);
289289 _ = try astrl.expr(rhs, block, ResultInfo.none);
290290 return false;
......@@ -292,17 +292,17 @@ fn expr(astrl: *AstRlAnnotate, node: Ast.Node.Index, block: ?*Block, ri: ResultI
292292 .bool_and,
293293 .bool_or,
294294 => {
295 const lhs, const rhs = tree.nodeData(node).node_and_node;
295 const lhs, const rhs = node.data(tree).node_and_node;
296296 _ = try astrl.expr(lhs, block, ResultInfo.type_only);
297297 _ = try astrl.expr(rhs, block, ResultInfo.type_only);
298298 return false;
299299 },
300300 .bool_not => {
301 _ = try astrl.expr(tree.nodeData(node).node, block, ResultInfo.type_only);
301 _ = try astrl.expr(node.data(tree).node, block, ResultInfo.type_only);
302302 return false;
303303 },
304304 .bit_not, .negation, .negation_wrap => {
305 _ = try astrl.expr(tree.nodeData(node).node, block, ResultInfo.none);
305 _ = try astrl.expr(node.data(tree).node, block, ResultInfo.none);
306306 return false;
307307 },
308308
......@@ -347,7 +347,7 @@ fn expr(astrl: *AstRlAnnotate, node: Ast.Node.Index, block: ?*Block, ri: ResultI
347347 for (full.ast.params) |param_node| {
348348 _ = try astrl.expr(param_node, block, ResultInfo.type_only);
349349 }
350 return switch (tree.nodeTag(node)) {
350 return switch (node.tag(tree)) {
351351 .call_one,
352352 .call_one_comma,
353353 .call,
......@@ -363,7 +363,7 @@ fn expr(astrl: *AstRlAnnotate, node: Ast.Node.Index, block: ?*Block, ri: ResultI
363363 },
364364
365365 .@"return" => {
366 if (tree.nodeData(node).opt_node.unwrap()) |lhs| {
366 if (node.data(tree).opt_node.unwrap()) |lhs| {
367367 const ret_val_consumes_rl = try astrl.expr(lhs, block, ResultInfo.typed_ptr);
368368 if (ret_val_consumes_rl) {
369369 try astrl.nodes_need_rl.putNoClobber(astrl.gpa, node, {});
......@@ -373,7 +373,7 @@ fn expr(astrl: *AstRlAnnotate, node: Ast.Node.Index, block: ?*Block, ri: ResultI
373373 },
374374
375375 .field_access => {
376 const lhs, _ = tree.nodeData(node).node_and_token;
376 const lhs, _ = node.data(tree).node_and_token;
377377 _ = try astrl.expr(lhs, block, ResultInfo.none);
378378 return false;
379379 },
......@@ -436,8 +436,8 @@ fn expr(astrl: *AstRlAnnotate, node: Ast.Node.Index, block: ?*Block, ri: ResultI
436436 break :label try astrl.identString(label_token);
437437 } else null;
438438 for (full.ast.inputs) |input| {
439 if (tree.nodeTag(input) == .for_range) {
440 const lhs, const opt_rhs = tree.nodeData(input).node_and_opt_node;
439 if (input.tag(tree) == .for_range) {
440 const lhs, const opt_rhs = input.data(tree).node_and_opt_node;
441441 _ = try astrl.expr(lhs, block, ResultInfo.type_only);
442442 if (opt_rhs.unwrap()) |rhs| {
443443 _ = try astrl.expr(rhs, block, ResultInfo.type_only);
......@@ -466,13 +466,13 @@ fn expr(astrl: *AstRlAnnotate, node: Ast.Node.Index, block: ?*Block, ri: ResultI
466466 },
467467
468468 .slice_open => {
469 const sliced, const start = tree.nodeData(node).node_and_node;
469 const sliced, const start = node.data(tree).node_and_node;
470470 _ = try astrl.expr(sliced, block, ResultInfo.none);
471471 _ = try astrl.expr(start, block, ResultInfo.type_only);
472472 return false;
473473 },
474474 .slice => {
475 const sliced, const extra_index = tree.nodeData(node).node_and_extra;
475 const sliced, const extra_index = node.data(tree).node_and_extra;
476476 const extra = tree.extraData(extra_index, Ast.Node.Slice);
477477 _ = try astrl.expr(sliced, block, ResultInfo.none);
478478 _ = try astrl.expr(extra.start, block, ResultInfo.type_only);
......@@ -480,7 +480,7 @@ fn expr(astrl: *AstRlAnnotate, node: Ast.Node.Index, block: ?*Block, ri: ResultI
480480 return false;
481481 },
482482 .slice_sentinel => {
483 const sliced, const extra_index = tree.nodeData(node).node_and_extra;
483 const sliced, const extra_index = node.data(tree).node_and_extra;
484484 const extra = tree.extraData(extra_index, Ast.Node.SliceSentinel);
485485 _ = try astrl.expr(sliced, block, ResultInfo.none);
486486 _ = try astrl.expr(extra.start, block, ResultInfo.type_only);
......@@ -491,24 +491,24 @@ fn expr(astrl: *AstRlAnnotate, node: Ast.Node.Index, block: ?*Block, ri: ResultI
491491 return false;
492492 },
493493 .deref => {
494 _ = try astrl.expr(tree.nodeData(node).node, block, ResultInfo.none);
494 _ = try astrl.expr(node.data(tree).node, block, ResultInfo.none);
495495 return false;
496496 },
497497 .address_of => {
498 _ = try astrl.expr(tree.nodeData(node).node, block, ResultInfo.none);
498 _ = try astrl.expr(node.data(tree).node, block, ResultInfo.none);
499499 return false;
500500 },
501501 .optional_type => {
502 _ = try astrl.expr(tree.nodeData(node).node, block, ResultInfo.type_only);
502 _ = try astrl.expr(node.data(tree).node, block, ResultInfo.type_only);
503503 return false;
504504 },
505505 .@"try",
506506 .@"await",
507507 .@"nosuspend",
508 => return astrl.expr(tree.nodeData(node).node, block, ri),
508 => return astrl.expr(node.data(tree).node, block, ri),
509509 .grouped_expression,
510510 .unwrap_optional,
511 => return astrl.expr(tree.nodeData(node).node_and_token[0], block, ri),
511 => return astrl.expr(node.data(tree).node_and_token[0], block, ri),
512512
513513 .block_two,
514514 .block_two_semicolon,
......@@ -520,12 +520,12 @@ fn expr(astrl: *AstRlAnnotate, node: Ast.Node.Index, block: ?*Block, ri: ResultI
520520 return astrl.blockExpr(block, ri, node, statements);
521521 },
522522 .anyframe_type => {
523 _, const child_type = tree.nodeData(node).token_and_node;
523 _, const child_type = node.data(tree).token_and_node;
524524 _ = try astrl.expr(child_type, block, ResultInfo.type_only);
525525 return false;
526526 },
527527 .@"catch", .@"orelse" => {
528 const lhs, const rhs = tree.nodeData(node).node_and_node;
528 const lhs, const rhs = node.data(tree).node_and_node;
529529 _ = try astrl.expr(lhs, block, ResultInfo.none);
530530 const rhs_consumes_rl = try astrl.expr(rhs, block, ri);
531531 if (rhs_consumes_rl) {
......@@ -577,7 +577,7 @@ fn expr(astrl: *AstRlAnnotate, node: Ast.Node.Index, block: ?*Block, ri: ResultI
577577 },
578578
579579 .@"break" => {
580 const opt_label, const opt_rhs = tree.nodeData(node).opt_token_and_opt_node;
580 const opt_label, const opt_rhs = node.data(tree).opt_token_and_opt_node;
581581 const rhs = opt_rhs.unwrap() orelse {
582582 // Breaks with void are not interesting
583583 return false;
......@@ -609,13 +609,13 @@ fn expr(astrl: *AstRlAnnotate, node: Ast.Node.Index, block: ?*Block, ri: ResultI
609609 },
610610
611611 .array_type => {
612 const lhs, const rhs = tree.nodeData(node).node_and_node;
612 const lhs, const rhs = node.data(tree).node_and_node;
613613 _ = try astrl.expr(lhs, block, ResultInfo.type_only);
614614 _ = try astrl.expr(rhs, block, ResultInfo.type_only);
615615 return false;
616616 },
617617 .array_type_sentinel => {
618 const len_expr, const extra_index = tree.nodeData(node).node_and_extra;
618 const len_expr, const extra_index = node.data(tree).node_and_extra;
619619 const extra = tree.extraData(extra_index, Ast.Node.ArrayTypeSentinel);
620620 _ = try astrl.expr(len_expr, block, ResultInfo.type_only);
621621 _ = try astrl.expr(extra.elem_type, block, ResultInfo.type_only);
......@@ -623,7 +623,7 @@ fn expr(astrl: *AstRlAnnotate, node: Ast.Node.Index, block: ?*Block, ri: ResultI
623623 return false;
624624 },
625625 .array_access => {
626 const lhs, const rhs = tree.nodeData(node).node_and_node;
626 const lhs, const rhs = node.data(tree).node_and_node;
627627 _ = try astrl.expr(lhs, block, ResultInfo.none);
628628 _ = try astrl.expr(rhs, block, ResultInfo.type_only);
629629 return false;
......@@ -631,11 +631,11 @@ fn expr(astrl: *AstRlAnnotate, node: Ast.Node.Index, block: ?*Block, ri: ResultI
631631 .@"comptime" => {
632632 // AstGen will emit an error if the scope is already comptime, so we can assume it is
633633 // not. This means the result location is not forwarded.
634 _ = try astrl.expr(tree.nodeData(node).node, block, ResultInfo.none);
634 _ = try astrl.expr(node.data(tree).node, block, ResultInfo.none);
635635 return false;
636636 },
637637 .@"switch", .switch_comma => {
638 const operand_node, const extra_index = tree.nodeData(node).node_and_extra;
638 const operand_node, const extra_index = node.data(tree).node_and_extra;
639639 const case_nodes = tree.extraDataSlice(tree.extraData(extra_index, Ast.Node.SubRange), Ast.Node.Index);
640640
641641 _ = try astrl.expr(operand_node, block, ResultInfo.none);
......@@ -644,8 +644,8 @@ fn expr(astrl: *AstRlAnnotate, node: Ast.Node.Index, block: ?*Block, ri: ResultI
644644 for (case_nodes) |case_node| {
645645 const case = tree.fullSwitchCase(case_node).?;
646646 for (case.ast.values) |item_node| {
647 if (tree.nodeTag(item_node) == .switch_range) {
648 const lhs, const rhs = tree.nodeData(item_node).node_and_node;
647 if (item_node.tag(tree) == .switch_range) {
648 const lhs, const rhs = item_node.data(tree).node_and_node;
649649 _ = try astrl.expr(lhs, block, ResultInfo.none);
650650 _ = try astrl.expr(rhs, block, ResultInfo.none);
651651 } else {
......@@ -662,11 +662,11 @@ fn expr(astrl: *AstRlAnnotate, node: Ast.Node.Index, block: ?*Block, ri: ResultI
662662 return any_prong_consumed_rl;
663663 },
664664 .@"suspend" => {
665 _ = try astrl.expr(tree.nodeData(node).node, block, ResultInfo.none);
665 _ = try astrl.expr(node.data(tree).node, block, ResultInfo.none);
666666 return false;
667667 },
668668 .@"resume" => {
669 _ = try astrl.expr(tree.nodeData(node).node, block, ResultInfo.none);
669 _ = try astrl.expr(node.data(tree).node, block, ResultInfo.none);
670670 return false;
671671 },
672672
......@@ -752,7 +752,7 @@ fn expr(astrl: *AstRlAnnotate, node: Ast.Node.Index, block: ?*Block, ri: ResultI
752752 => |tag| {
753753 var buf: [1]Ast.Node.Index = undefined;
754754 const full = tree.fullFnProto(&buf, node).?;
755 const body_node = if (tag == .fn_decl) tree.nodeData(node).node_and_node[1].toOptional() else .none;
755 const body_node = if (tag == .fn_decl) node.data(tree).node_and_node[1].toOptional() else .none;
756756 {
757757 var it = full.iterate(tree);
758758 while (it.next()) |param| {
......@@ -800,7 +800,7 @@ fn identString(astrl: *AstRlAnnotate, token: Ast.TokenIndex) ![]const u8 {
800800fn blockExpr(astrl: *AstRlAnnotate, parent_block: ?*Block, ri: ResultInfo, node: Ast.Node.Index, statements: []const Ast.Node.Index) !bool {
801801 const tree = astrl.tree;
802802
803 const lbrace = tree.nodeMainToken(node);
803 const lbrace = node.mainToken(tree);
804804 if (tree.isTokenPrecededByTags(lbrace, &.{ .identifier, .colon })) {
805805 // Labeled block
806806 var new_block: Block = .{
......@@ -830,7 +830,7 @@ fn builtinCall(astrl: *AstRlAnnotate, block: ?*Block, ri: ResultInfo, node: Ast.
830830 _ = ri; // Currently, no builtin consumes its result location.
831831
832832 const tree = astrl.tree;
833 const builtin_token = tree.nodeMainToken(node);
833 const builtin_token = node.mainToken(tree);
834834 const builtin_name = tree.tokenSlice(builtin_token);
835835 const info = BuiltinFn.list.get(builtin_name) orelse return false;
836836 if (info.param_count) |expected| {
lib/std/zig/ZonGen.zig+28-28
......@@ -1,7 +1,7 @@
11//! Ingests an `Ast` and produces a `Zoir`.
22
33gpa: Allocator,
4tree: Ast,
4tree: *const Ast,
55
66options: Options,
77
......@@ -22,7 +22,7 @@ pub const Options = struct {
2222 parse_str_lits: bool = true,
2323};
2424
25pub fn generate(gpa: Allocator, tree: Ast, options: Options) Allocator.Error!Zoir {
25pub fn generate(gpa: Allocator, tree: *const Ast, options: Options) Allocator.Error!Zoir {
2626 assert(tree.mode == .zon);
2727
2828 var zg: ZonGen = .{
......@@ -98,7 +98,7 @@ fn expr(zg: *ZonGen, node: Ast.Node.Index, dest_node: Zoir.Node.Index) Allocator
9898 const gpa = zg.gpa;
9999 const tree = zg.tree;
100100
101 switch (tree.nodeTag(node)) {
101 switch (node.tag(tree)) {
102102 .root => unreachable,
103103 .@"usingnamespace" => unreachable,
104104 .test_decl => unreachable,
......@@ -170,7 +170,7 @@ fn expr(zg: *ZonGen, node: Ast.Node.Index, dest_node: Zoir.Node.Index) Allocator
170170 .bool_not,
171171 .bit_not,
172172 .negation_wrap,
173 => try zg.addErrorTok(tree.nodeMainToken(node), "operator '{s}' is not allowed in ZON", .{tree.tokenSlice(tree.nodeMainToken(node))}),
173 => try zg.addErrorTok(node.mainToken(tree), "operator '{s}' is not allowed in ZON", .{tree.tokenSlice(node.mainToken(tree))}),
174174
175175 .error_union,
176176 .merge_error_sets,
......@@ -248,8 +248,8 @@ fn expr(zg: *ZonGen, node: Ast.Node.Index, dest_node: Zoir.Node.Index) Allocator
248248 .slice_sentinel,
249249 => try zg.addErrorNode(node, "slice operator is not allowed in ZON", .{}),
250250
251 .deref, .address_of => try zg.addErrorTok(tree.nodeMainToken(node), "pointers are not available in ZON", .{}),
252 .unwrap_optional => try zg.addErrorTok(tree.nodeMainToken(node), "optionals are not available in ZON", .{}),
251 .deref, .address_of => try zg.addErrorTok(node.mainToken(tree), "pointers are not available in ZON", .{}),
252 .unwrap_optional => try zg.addErrorTok(node.mainToken(tree), "optionals are not available in ZON", .{}),
253253 .error_value => try zg.addErrorNode(node, "errors are not available in ZON", .{}),
254254
255255 .array_access => try zg.addErrorNode(node, "array indexing is not allowed in ZON", .{}),
......@@ -294,18 +294,18 @@ fn expr(zg: *ZonGen, node: Ast.Node.Index, dest_node: Zoir.Node.Index) Allocator
294294 },
295295
296296 .grouped_expression => {
297 try zg.addErrorTokNotes(tree.nodeMainToken(node), "expression grouping is not allowed in ZON", .{}, &.{
298 try zg.errNoteTok(tree.nodeMainToken(node), "these parentheses are always redundant", .{}),
297 try zg.addErrorTokNotes(node.mainToken(tree), "expression grouping is not allowed in ZON", .{}, &.{
298 try zg.errNoteTok(node.mainToken(tree), "these parentheses are always redundant", .{}),
299299 });
300 return zg.expr(tree.nodeData(node).node_and_token[0], dest_node);
300 return zg.expr(node.data(tree).node_and_token[0], dest_node);
301301 },
302302
303303 .negation => {
304 const child_node = tree.nodeData(node).node;
305 switch (tree.nodeTag(child_node)) {
304 const child_node = node.data(tree).node;
305 switch (child_node.tag(tree)) {
306306 .number_literal => return zg.numberLiteral(child_node, node, dest_node, .negative),
307307 .identifier => {
308 const child_ident = tree.tokenSlice(tree.nodeMainToken(child_node));
308 const child_ident = tree.tokenSlice(child_node.mainToken(tree));
309309 if (mem.eql(u8, child_ident, "inf")) {
310310 zg.setNode(dest_node, .{
311311 .tag = .neg_inf,
......@@ -317,7 +317,7 @@ fn expr(zg: *ZonGen, node: Ast.Node.Index, dest_node: Zoir.Node.Index) Allocator
317317 },
318318 else => {},
319319 }
320 try zg.addErrorTok(tree.nodeMainToken(node), "expected number or 'inf' after '-'", .{});
320 try zg.addErrorTok(node.mainToken(tree), "expected number or 'inf' after '-'", .{});
321321 },
322322 .number_literal => try zg.numberLiteral(node, node, dest_node, .positive),
323323 .char_literal => try zg.charLiteral(node, dest_node),
......@@ -325,7 +325,7 @@ fn expr(zg: *ZonGen, node: Ast.Node.Index, dest_node: Zoir.Node.Index) Allocator
325325 .identifier => try zg.identifier(node, dest_node),
326326
327327 .enum_literal => {
328 const str_index = zg.identAsString(tree.nodeMainToken(node)) catch |err| switch (err) {
328 const str_index = zg.identAsString(node.mainToken(tree)) catch |err| switch (err) {
329329 error.BadString => undefined, // doesn't matter, there's an error
330330 error.OutOfMemory => |e| return e,
331331 };
......@@ -486,17 +486,17 @@ fn appendIdentStr(zg: *ZonGen, ident_token: Ast.TokenIndex) !u32 {
486486}
487487
488488/// Estimates the size of a string node without parsing it.
489pub fn strLitSizeHint(tree: Ast, node: Ast.Node.Index) usize {
490 switch (tree.nodeTag(node)) {
489pub fn strLitSizeHint(tree: *const Ast, node: Ast.Node.Index) usize {
490 switch (node.tag(tree)) {
491491 // Parsed string literals are typically around the size of the raw strings.
492492 .string_literal => {
493 const token = tree.nodeMainToken(node);
493 const token = node.mainToken(tree);
494494 const raw_string = tree.tokenSlice(token);
495495 return raw_string.len;
496496 },
497497 // Multiline string literal lengths can be computed exactly.
498498 .multiline_string_literal => {
499 const first_tok, const last_tok = tree.nodeData(node).token_and_token;
499 const first_tok, const last_tok = node.data(tree).token_and_token;
500500
501501 var size = tree.tokenSlice(first_tok)[2..].len;
502502 for (first_tok + 1..last_tok + 1) |tok_idx| {
......@@ -511,18 +511,18 @@ pub fn strLitSizeHint(tree: Ast, node: Ast.Node.Index) usize {
511511
512512/// Parses the given node as a string literal.
513513pub fn parseStrLit(
514 tree: Ast,
514 tree: *const Ast,
515515 node: Ast.Node.Index,
516516 writer: anytype,
517517) error{OutOfMemory}!std.zig.string_literal.Result {
518 switch (tree.nodeTag(node)) {
518 switch (node.tag(tree)) {
519519 .string_literal => {
520 const token = tree.nodeMainToken(node);
520 const token = node.mainToken(tree);
521521 const raw_string = tree.tokenSlice(token);
522522 return std.zig.string_literal.parseWrite(writer, raw_string);
523523 },
524524 .multiline_string_literal => {
525 const first_tok, const last_tok = tree.nodeData(node).token_and_token;
525 const first_tok, const last_tok = node.data(tree).token_and_token;
526526
527527 // First line: do not append a newline.
528528 {
......@@ -560,7 +560,7 @@ fn strLitAsString(zg: *ZonGen, str_node: Ast.Node.Index) !StringLiteralResult {
560560 switch (try parseStrLit(zg.tree, str_node, zg.string_bytes.writer(zg.gpa))) {
561561 .success => {},
562562 .failure => |err| {
563 const token = zg.tree.nodeMainToken(str_node);
563 const token = str_node.mainToken(zg.tree);
564564 const raw_string = zg.tree.tokenSlice(token);
565565 try zg.lowerStrLitError(err, token, raw_string, 0);
566566 return error.BadString;
......@@ -608,7 +608,7 @@ fn identAsString(zg: *ZonGen, ident_token: Ast.TokenIndex) !Zoir.NullTerminatedS
608608
609609fn numberLiteral(zg: *ZonGen, num_node: Ast.Node.Index, src_node: Ast.Node.Index, dest_node: Zoir.Node.Index, sign: enum { negative, positive }) !void {
610610 const tree = zg.tree;
611 const num_token = tree.nodeMainToken(num_node);
611 const num_token = num_node.mainToken(tree);
612612 const num_bytes = tree.tokenSlice(num_token);
613613
614614 switch (std.zig.parseNumberLiteral(num_bytes)) {
......@@ -712,8 +712,8 @@ fn setBigIntLiteralNode(zg: *ZonGen, dest_node: Zoir.Node.Index, src_node: Ast.N
712712
713713fn charLiteral(zg: *ZonGen, node: Ast.Node.Index, dest_node: Zoir.Node.Index) !void {
714714 const tree = zg.tree;
715 assert(tree.nodeTag(node) == .char_literal);
716 const main_token = tree.nodeMainToken(node);
715 assert(node.tag(tree) == .char_literal);
716 const main_token = node.mainToken(tree);
717717 const slice = tree.tokenSlice(main_token);
718718 switch (std.zig.parseCharLiteral(slice)) {
719719 .success => |codepoint| zg.setNode(dest_node, .{
......@@ -727,8 +727,8 @@ fn charLiteral(zg: *ZonGen, node: Ast.Node.Index, dest_node: Zoir.Node.Index) !v
727727
728728fn identifier(zg: *ZonGen, node: Ast.Node.Index, dest_node: Zoir.Node.Index) !void {
729729 const tree = zg.tree;
730 assert(tree.nodeTag(node) == .identifier);
731 const main_token = tree.nodeMainToken(node);
730 assert(node.tag(tree) == .identifier);
731 const main_token = node.mainToken(tree);
732732 const ident = tree.tokenSlice(main_token);
733733
734734 const tag: Zoir.Node.Repr.Tag = t: {
lib/std/zig/render.zig+90-90
......@@ -75,11 +75,11 @@ pub const Fixups = struct {
7575const Render = struct {
7676 gpa: Allocator,
7777 ais: *Ais,
78 tree: Ast,
78 tree: *const Ast,
7979 fixups: Fixups,
8080};
8181
82pub fn renderTree(buffer: *std.ArrayList(u8), tree: Ast, fixups: Fixups) Error!void {
82pub fn renderTree(buffer: *std.ArrayList(u8), tree: *const Ast, fixups: Fixups) Error!void {
8383 assert(tree.errors.len == 0); // Cannot render an invalid tree.
8484 var auto_indenting_stream = Ais.init(buffer, indent_delta);
8585 defer auto_indenting_stream.deinit();
......@@ -144,13 +144,13 @@ fn renderMember(
144144 const ais = r.ais;
145145 if (r.fixups.omit_nodes.contains(decl)) return;
146146 try renderDocComments(r, tree.firstToken(decl));
147 switch (tree.nodeTag(decl)) {
147 switch (decl.tag(tree)) {
148148 .fn_decl => {
149149 // Some examples:
150150 // pub extern "foo" fn ...
151151 // export fn ...
152 const fn_proto, const body_node = tree.nodeData(decl).node_and_node;
153 const fn_token = tree.nodeMainToken(fn_proto);
152 const fn_proto, const body_node = decl.data(tree).node_and_node;
153 const fn_token = fn_proto.mainToken(tree);
154154 // Go back to the first token we should render here.
155155 var i = fn_token;
156156 while (i > 0) {
......@@ -174,18 +174,18 @@ fn renderMember(
174174 while (i < fn_token) : (i += 1) {
175175 try renderToken(r, i, .space);
176176 }
177 switch (tree.nodeTag(fn_proto)) {
177 switch (fn_proto.tag(tree)) {
178178 .fn_proto_one, .fn_proto => {
179179 var buf: [1]Ast.Node.Index = undefined;
180 const opt_callconv_expr = if (tree.nodeTag(fn_proto) == .fn_proto_one)
180 const opt_callconv_expr = if (fn_proto.tag(tree) == .fn_proto_one)
181181 tree.fnProtoOne(&buf, fn_proto).ast.callconv_expr
182182 else
183183 tree.fnProto(fn_proto).ast.callconv_expr;
184184
185185 // Keep in sync with logic in `renderFnProto`. Search this file for the marker PROMOTE_CALLCONV_INLINE
186186 if (opt_callconv_expr.unwrap()) |callconv_expr| {
187 if (tree.nodeTag(callconv_expr) == .enum_literal) {
188 if (mem.eql(u8, "@\"inline\"", tree.tokenSlice(tree.nodeMainToken(callconv_expr)))) {
187 if (callconv_expr.tag(tree) == .enum_literal) {
188 if (mem.eql(u8, "@\"inline\"", tree.tokenSlice(callconv_expr.mainToken(tree)))) {
189189 try ais.writer().writeAll("inline ");
190190 }
191191 }
......@@ -197,7 +197,7 @@ fn renderMember(
197197 try renderExpression(r, fn_proto, .space);
198198 if (r.fixups.gut_functions.contains(decl)) {
199199 try ais.pushIndent(.normal);
200 const lbrace = tree.nodeMainToken(body_node);
200 const lbrace = body_node.mainToken(tree);
201201 try renderToken(r, lbrace, .newline);
202202 try discardAllParams(r, fn_proto);
203203 try ais.writer().writeAll("@trap();");
......@@ -206,12 +206,12 @@ fn renderMember(
206206 try renderToken(r, tree.lastToken(body_node), space); // rbrace
207207 } else if (r.fixups.unused_var_decls.count() != 0) {
208208 try ais.pushIndent(.normal);
209 const lbrace = tree.nodeMainToken(body_node);
209 const lbrace = body_node.mainToken(tree);
210210 try renderToken(r, lbrace, .newline);
211211
212212 var fn_proto_buf: [1]Ast.Node.Index = undefined;
213213 const full_fn_proto = tree.fullFnProto(&fn_proto_buf, fn_proto).?;
214 var it = full_fn_proto.iterate(&tree);
214 var it = full_fn_proto.iterate(tree);
215215 while (it.next()) |param| {
216216 const name_ident = param.name_token.?;
217217 assert(tree.tokenTag(name_ident) == .identifier);
......@@ -236,7 +236,7 @@ fn renderMember(
236236 => {
237237 // Extern function prototypes are parsed as these tags.
238238 // Go back to the first token we should render here.
239 const fn_token = tree.nodeMainToken(decl);
239 const fn_token = decl.mainToken(tree);
240240 var i = fn_token;
241241 while (i > 0) {
242242 i -= 1;
......@@ -263,8 +263,8 @@ fn renderMember(
263263 },
264264
265265 .@"usingnamespace" => {
266 const main_token = tree.nodeMainToken(decl);
267 const expr = tree.nodeData(decl).node;
266 const main_token = decl.mainToken(tree);
267 const expr = decl.data(tree).node;
268268 if (tree.isTokenPrecededByTags(main_token, &.{.keyword_pub})) {
269269 try renderToken(r, main_token - 1, .space); // pub
270270 }
......@@ -284,8 +284,8 @@ fn renderMember(
284284 },
285285
286286 .test_decl => {
287 const test_token = tree.nodeMainToken(decl);
288 const opt_name_token, const block_node = tree.nodeData(decl).opt_token_and_node;
287 const test_token = decl.mainToken(tree);
288 const opt_name_token, const block_node = decl.data(tree).opt_token_and_node;
289289 try renderToken(r, test_token, .space);
290290 if (opt_name_token.unwrap()) |name_token| {
291291 switch (tree.tokenTag(name_token)) {
......@@ -329,9 +329,9 @@ fn renderExpression(r: *Render, node: Ast.Node.Index, space: Space) Error!void {
329329 } else if (r.fixups.replace_nodes_with_node.get(node)) |replacement| {
330330 return renderExpression(r, replacement, space);
331331 }
332 switch (tree.nodeTag(node)) {
332 switch (node.tag(tree)) {
333333 .identifier => {
334 const token_index = tree.nodeMainToken(node);
334 const token_index = node.mainToken(tree);
335335 return renderIdentifier(r, token_index, space, .preserve_when_shadowing);
336336 },
337337
......@@ -340,12 +340,12 @@ fn renderExpression(r: *Render, node: Ast.Node.Index, space: Space) Error!void {
340340 .unreachable_literal,
341341 .anyframe_literal,
342342 .string_literal,
343 => return renderToken(r, tree.nodeMainToken(node), space),
343 => return renderToken(r, node.mainToken(tree), space),
344344
345345 .multiline_string_literal => {
346346 try ais.maybeInsertNewline();
347347
348 const first_tok, const last_tok = tree.nodeData(node).token_and_token;
348 const first_tok, const last_tok = node.data(tree).token_and_token;
349349 for (first_tok..last_tok + 1) |i| {
350350 try renderToken(r, @intCast(i), .newline);
351351 }
......@@ -372,7 +372,7 @@ fn renderExpression(r: *Render, node: Ast.Node.Index, space: Space) Error!void {
372372 },
373373
374374 .error_value => {
375 const main_token = tree.nodeMainToken(node);
375 const main_token = node.mainToken(tree);
376376 try renderToken(r, main_token, .none);
377377 try renderToken(r, main_token + 1, .none);
378378 return renderIdentifier(r, main_token + 2, space, .eagerly_unquote);
......@@ -389,8 +389,8 @@ fn renderExpression(r: *Render, node: Ast.Node.Index, space: Space) Error!void {
389389 },
390390
391391 .@"errdefer" => {
392 const defer_token = tree.nodeMainToken(node);
393 const maybe_payload_token, const expr = tree.nodeData(node).opt_token_and_node;
392 const defer_token = node.mainToken(tree);
393 const maybe_payload_token, const expr = node.data(tree).opt_token_and_node;
394394
395395 try renderToken(r, defer_token, .space);
396396 if (maybe_payload_token.unwrap()) |payload_token| {
......@@ -406,15 +406,15 @@ fn renderExpression(r: *Render, node: Ast.Node.Index, space: Space) Error!void {
406406 .@"nosuspend",
407407 .@"suspend",
408408 => {
409 const main_token = tree.nodeMainToken(node);
410 const item = tree.nodeData(node).node;
409 const main_token = node.mainToken(tree);
410 const item = node.data(tree).node;
411411 try renderToken(r, main_token, .space);
412412 return renderExpression(r, item, space);
413413 },
414414
415415 .@"catch" => {
416 const main_token = tree.nodeMainToken(node);
417 const lhs, const rhs = tree.nodeData(node).node_and_node;
416 const main_token = node.mainToken(tree);
417 const lhs, const rhs = node.data(tree).node_and_node;
418418 const fallback_first = tree.firstToken(rhs);
419419
420420 const same_line = tree.tokensOnSameLine(main_token, fallback_first);
......@@ -437,7 +437,7 @@ fn renderExpression(r: *Render, node: Ast.Node.Index, space: Space) Error!void {
437437 },
438438
439439 .field_access => {
440 const lhs, const name_token = tree.nodeData(node).node_and_token;
440 const lhs, const name_token = node.data(tree).node_and_token;
441441 const dot_token = name_token - 1;
442442
443443 try ais.pushIndent(.field_access);
......@@ -458,19 +458,19 @@ fn renderExpression(r: *Render, node: Ast.Node.Index, space: Space) Error!void {
458458 .error_union,
459459 .switch_range,
460460 => {
461 const lhs, const rhs = tree.nodeData(node).node_and_node;
461 const lhs, const rhs = node.data(tree).node_and_node;
462462 try renderExpression(r, lhs, .none);
463 try renderToken(r, tree.nodeMainToken(node), .none);
463 try renderToken(r, node.mainToken(tree), .none);
464464 return renderExpression(r, rhs, space);
465465 },
466466 .for_range => {
467 const start, const opt_end = tree.nodeData(node).node_and_opt_node;
467 const start, const opt_end = node.data(tree).node_and_opt_node;
468468 try renderExpression(r, start, .none);
469469 if (opt_end.unwrap()) |end| {
470 try renderToken(r, tree.nodeMainToken(node), .none);
470 try renderToken(r, node.mainToken(tree), .none);
471471 return renderExpression(r, end, space);
472472 } else {
473 return renderToken(r, tree.nodeMainToken(node), space);
473 return renderToken(r, node.mainToken(tree), space);
474474 }
475475 },
476476
......@@ -493,9 +493,9 @@ fn renderExpression(r: *Render, node: Ast.Node.Index, space: Space) Error!void {
493493 .assign_mul_wrap,
494494 .assign_mul_sat,
495495 => {
496 const lhs, const rhs = tree.nodeData(node).node_and_node;
496 const lhs, const rhs = node.data(tree).node_and_node;
497497 try renderExpression(r, lhs, .space);
498 const op_token = tree.nodeMainToken(node);
498 const op_token = node.mainToken(tree);
499499 try ais.pushIndent(.after_equals);
500500 if (tree.tokensOnSameLine(op_token, op_token + 1)) {
501501 try renderToken(r, op_token, .space);
......@@ -536,9 +536,9 @@ fn renderExpression(r: *Render, node: Ast.Node.Index, space: Space) Error!void {
536536 .sub_sat,
537537 .@"orelse",
538538 => {
539 const lhs, const rhs = tree.nodeData(node).node_and_node;
539 const lhs, const rhs = node.data(tree).node_and_node;
540540 try renderExpression(r, lhs, .space);
541 const op_token = tree.nodeMainToken(node);
541 const op_token = node.mainToken(tree);
542542 try ais.pushIndent(.binop);
543543 if (tree.tokensOnSameLine(op_token, op_token + 1)) {
544544 try renderToken(r, op_token, .space);
......@@ -557,7 +557,7 @@ fn renderExpression(r: *Render, node: Ast.Node.Index, space: Space) Error!void {
557557
558558 for (full.ast.variables, 0..) |variable_node, i| {
559559 const variable_space: Space = if (i == full.ast.variables.len - 1) .space else .comma_space;
560 switch (tree.nodeTag(variable_node)) {
560 switch (variable_node.tag(tree)) {
561561 .global_var_decl,
562562 .local_var_decl,
563563 .simple_var_decl,
......@@ -585,16 +585,16 @@ fn renderExpression(r: *Render, node: Ast.Node.Index, space: Space) Error!void {
585585 .optional_type,
586586 .address_of,
587587 => {
588 try renderToken(r, tree.nodeMainToken(node), .none);
589 return renderExpression(r, tree.nodeData(node).node, space);
588 try renderToken(r, node.mainToken(tree), .none);
589 return renderExpression(r, node.data(tree).node, space);
590590 },
591591
592592 .@"try",
593593 .@"resume",
594594 .@"await",
595595 => {
596 try renderToken(r, tree.nodeMainToken(node), .space);
597 return renderExpression(r, tree.nodeData(node).node, space);
596 try renderToken(r, node.mainToken(tree), .space);
597 return renderExpression(r, node.data(tree).node, space);
598598 },
599599
600600 .array_type,
......@@ -647,7 +647,7 @@ fn renderExpression(r: *Render, node: Ast.Node.Index, space: Space) Error!void {
647647 },
648648
649649 .array_access => {
650 const lhs, const rhs = tree.nodeData(node).node_and_node;
650 const lhs, const rhs = node.data(tree).node_and_node;
651651 const lbracket = tree.firstToken(rhs) - 1;
652652 const rbracket = tree.lastToken(rhs) + 1;
653653 const one_line = tree.tokensOnSameLine(lbracket, rbracket);
......@@ -666,12 +666,12 @@ fn renderExpression(r: *Render, node: Ast.Node.Index, space: Space) Error!void {
666666 => return renderSlice(r, node, tree.fullSlice(node).?, space),
667667
668668 .deref => {
669 try renderExpression(r, tree.nodeData(node).node, .none);
670 return renderToken(r, tree.nodeMainToken(node), space);
669 try renderExpression(r, node.data(tree).node, .none);
670 return renderToken(r, node.mainToken(tree), space);
671671 },
672672
673673 .unwrap_optional => {
674 const lhs, const question_mark = tree.nodeData(node).node_and_token;
674 const lhs, const question_mark = node.data(tree).node_and_token;
675675 const dot_token = question_mark - 1;
676676 try renderExpression(r, lhs, .none);
677677 try renderToken(r, dot_token, .none);
......@@ -679,8 +679,8 @@ fn renderExpression(r: *Render, node: Ast.Node.Index, space: Space) Error!void {
679679 },
680680
681681 .@"break", .@"continue" => {
682 const main_token = tree.nodeMainToken(node);
683 const opt_label_token, const opt_target = tree.nodeData(node).opt_token_and_opt_node;
682 const main_token = node.mainToken(tree);
683 const opt_label_token, const opt_target = node.data(tree).opt_token_and_opt_node;
684684 if (opt_label_token == .none and opt_target == .none) {
685685 try renderToken(r, main_token, space); // break/continue
686686 } else if (opt_label_token == .none and opt_target != .none) {
......@@ -703,18 +703,18 @@ fn renderExpression(r: *Render, node: Ast.Node.Index, space: Space) Error!void {
703703 },
704704
705705 .@"return" => {
706 if (tree.nodeData(node).opt_node.unwrap()) |expr| {
707 try renderToken(r, tree.nodeMainToken(node), .space);
706 if (node.data(tree).opt_node.unwrap()) |expr| {
707 try renderToken(r, node.mainToken(tree), .space);
708708 try renderExpression(r, expr, space);
709709 } else {
710 try renderToken(r, tree.nodeMainToken(node), space);
710 try renderToken(r, node.mainToken(tree), space);
711711 }
712712 },
713713
714714 .grouped_expression => {
715 const expr, const rparen = tree.nodeData(node).node_and_token;
715 const expr, const rparen = node.data(tree).node_and_token;
716716 try ais.pushIndent(.normal);
717 try renderToken(r, tree.nodeMainToken(node), .none); // lparen
717 try renderToken(r, node.mainToken(tree), .none); // lparen
718718 try renderExpression(r, expr, .none);
719719 ais.popIndent();
720720 return renderToken(r, rparen, space);
......@@ -738,8 +738,8 @@ fn renderExpression(r: *Render, node: Ast.Node.Index, space: Space) Error!void {
738738 },
739739
740740 .error_set_decl => {
741 const error_token = tree.nodeMainToken(node);
742 const lbrace, const rbrace = tree.nodeData(node).token_and_token;
741 const error_token = node.mainToken(tree);
742 const lbrace, const rbrace = node.data(tree).token_and_token;
743743
744744 try renderToken(r, error_token, .none);
745745
......@@ -796,7 +796,7 @@ fn renderExpression(r: *Render, node: Ast.Node.Index, space: Space) Error!void {
796796 => {
797797 var buf: [2]Ast.Node.Index = undefined;
798798 const params = tree.builtinCallParams(&buf, node).?;
799 return renderBuiltinCall(r, tree.nodeMainToken(node), params, space);
799 return renderBuiltinCall(r, node.mainToken(tree), params, space);
800800 },
801801
802802 .fn_proto_simple,
......@@ -809,10 +809,10 @@ fn renderExpression(r: *Render, node: Ast.Node.Index, space: Space) Error!void {
809809 },
810810
811811 .anyframe_type => {
812 const main_token = tree.nodeMainToken(node);
812 const main_token = node.mainToken(tree);
813813 try renderToken(r, main_token, .none); // anyframe
814814 try renderToken(r, main_token + 1, .none); // ->
815 return renderExpression(r, tree.nodeData(node).token_and_node[1], space);
815 return renderExpression(r, node.data(tree).token_and_node[1], space);
816816 },
817817
818818 .@"switch",
......@@ -869,8 +869,8 @@ fn renderExpression(r: *Render, node: Ast.Node.Index, space: Space) Error!void {
869869 => return renderAsm(r, tree.fullAsm(node).?, space),
870870
871871 .enum_literal => {
872 try renderToken(r, tree.nodeMainToken(node) - 1, .none); // .
873 return renderIdentifier(r, tree.nodeMainToken(node), space, .eagerly_unquote); // name
872 try renderToken(r, node.mainToken(tree) - 1, .none); // .
873 return renderIdentifier(r, node.mainToken(tree), space, .eagerly_unquote); // name
874874 },
875875
876876 .fn_decl => unreachable,
......@@ -932,7 +932,7 @@ fn renderPtrType(r: *Render, ptr_type: Ast.full.PtrType, space: Space) Error!voi
932932 // this pointer type and rely on the child to render our asterisk
933933 // as well when it renders the ** token.
934934 if (tree.tokenTag(main_token) == .asterisk_asterisk and
935 main_token == tree.nodeMainToken(ptr_type.ast.child_type))
935 main_token == ptr_type.ast.child_type.mainToken(tree))
936936 {
937937 return renderExpression(r, ptr_type.ast.child_type, space);
938938 }
......@@ -1017,8 +1017,8 @@ fn renderSlice(
10171017 space: Space,
10181018) Error!void {
10191019 const tree = r.tree;
1020 const after_start_space_bool = nodeCausesSliceOpSpace(tree.nodeTag(slice.ast.start)) or
1021 if (slice.ast.end.unwrap()) |end| nodeCausesSliceOpSpace(tree.nodeTag(end)) else false;
1020 const after_start_space_bool = nodeCausesSliceOpSpace(slice.ast.start.tag(tree)) or
1021 if (slice.ast.end.unwrap()) |end| nodeCausesSliceOpSpace(end.tag(tree)) else false;
10221022 const after_start_space = if (after_start_space_bool) Space.space else Space.none;
10231023 const after_dots_space = if (slice.ast.end != .none)
10241024 after_start_space
......@@ -1050,8 +1050,8 @@ fn renderAsmOutput(
10501050 space: Space,
10511051) Error!void {
10521052 const tree = r.tree;
1053 assert(tree.nodeTag(asm_output) == .asm_output);
1054 const symbolic_name = tree.nodeMainToken(asm_output);
1053 assert(asm_output.tag(tree) == .asm_output);
1054 const symbolic_name = asm_output.mainToken(tree);
10551055
10561056 try renderToken(r, symbolic_name - 1, .none); // lbracket
10571057 try renderIdentifier(r, symbolic_name, .none, .eagerly_unquote); // ident
......@@ -1060,7 +1060,7 @@ fn renderAsmOutput(
10601060 try renderToken(r, symbolic_name + 3, .none); // lparen
10611061
10621062 if (tree.tokenTag(symbolic_name + 4) == .arrow) {
1063 const type_expr, const rparen = tree.nodeData(asm_output).opt_node_and_token;
1063 const type_expr, const rparen = asm_output.data(tree).opt_node_and_token;
10641064 try renderToken(r, symbolic_name + 4, .space); // ->
10651065 try renderExpression(r, type_expr.unwrap().?, Space.none);
10661066 return renderToken(r, rparen, space);
......@@ -1076,9 +1076,9 @@ fn renderAsmInput(
10761076 space: Space,
10771077) Error!void {
10781078 const tree = r.tree;
1079 assert(tree.nodeTag(asm_input) == .asm_input);
1080 const symbolic_name = tree.nodeMainToken(asm_input);
1081 const expr, const rparen = tree.nodeData(asm_input).node_and_token;
1079 assert(asm_input.tag(tree) == .asm_input);
1080 const symbolic_name = asm_input.mainToken(tree);
1081 const expr, const rparen = asm_input.data(tree).node_and_token;
10821082
10831083 try renderToken(r, symbolic_name - 1, .none); // lbracket
10841084 try renderIdentifier(r, symbolic_name, .none, .eagerly_unquote); // ident
......@@ -1318,7 +1318,7 @@ fn renderThenElse(
13181318) Error!void {
13191319 const tree = r.tree;
13201320 const ais = r.ais;
1321 const then_expr_is_block = nodeIsBlock(tree.nodeTag(then_expr));
1321 const then_expr_is_block = nodeIsBlock(then_expr.tag(tree));
13221322 const indent_then_expr = !then_expr_is_block and
13231323 !tree.tokensOnSameLine(last_prefix_token, tree.firstToken(then_expr));
13241324
......@@ -1353,8 +1353,8 @@ fn renderThenElse(
13531353 }
13541354
13551355 const indent_else_expr = indent_then_expr and
1356 !nodeIsBlock(tree.nodeTag(else_expr)) and
1357 !nodeIsIfForWhileSwitch(tree.nodeTag(else_expr));
1356 !nodeIsBlock(else_expr.tag(tree)) and
1357 !nodeIsIfForWhileSwitch(else_expr.tag(tree));
13581358 if (indent_else_expr) {
13591359 try ais.pushIndent(.normal);
13601360 try renderToken(r, last_else_token, .newline);
......@@ -1449,7 +1449,7 @@ fn renderContainerField(
14491449 const tree = r.tree;
14501450 const ais = r.ais;
14511451 var field = field_param;
1452 if (container != .tuple) field.convertToNonTupleLike(&tree);
1452 if (container != .tuple) field.convertToNonTupleLike(tree);
14531453 const quote: QuoteBehavior = switch (container) {
14541454 .@"enum" => .eagerly_unquote_except_underscore,
14551455 .tuple, .other => .eagerly_unquote,
......@@ -1569,7 +1569,7 @@ fn renderBuiltinCall(
15691569 const slice = tree.tokenSlice(builtin_token);
15701570 if (mem.eql(u8, slice, "@import")) f: {
15711571 const param = params[0];
1572 const str_lit_token = tree.nodeMainToken(param);
1572 const str_lit_token = param.mainToken(tree);
15731573 assert(tree.tokenTag(str_lit_token) == .string_literal);
15741574 const token_bytes = tree.tokenSlice(str_lit_token);
15751575 const imported_string = std.zig.string_literal.parseAlloc(r.gpa, token_bytes) catch |err| switch (err) {
......@@ -1829,7 +1829,7 @@ fn renderFnProto(r: *Render, fn_proto: Ast.full.FnProto, space: Space) Error!voi
18291829
18301830 if (fn_proto.ast.callconv_expr.unwrap()) |callconv_expr| {
18311831 // Keep in sync with logic in `renderMember`. Search this file for the marker PROMOTE_CALLCONV_INLINE
1832 const is_callconv_inline = mem.eql(u8, "@\"inline\"", tree.tokenSlice(tree.nodeMainToken(callconv_expr)));
1832 const is_callconv_inline = mem.eql(u8, "@\"inline\"", tree.tokenSlice(callconv_expr.mainToken(tree)));
18331833 const is_declaration = fn_proto.name_token != null;
18341834 if (!(is_declaration and is_callconv_inline)) {
18351835 const callconv_lparen = tree.firstToken(callconv_expr) - 1;
......@@ -1882,7 +1882,7 @@ fn renderSwitchCase(
18821882 }
18831883
18841884 // Render the arrow and everything after it
1885 const pre_target_space = if (tree.nodeTag(switch_case.ast.target_expr) == .multiline_string_literal)
1885 const pre_target_space = if (switch_case.ast.target_expr.tag(tree) == .multiline_string_literal)
18861886 // Newline gets inserted when rendering the target expr.
18871887 Space.none
18881888 else
......@@ -1917,7 +1917,7 @@ fn renderBlock(
19171917) Error!void {
19181918 const tree = r.tree;
19191919 const ais = r.ais;
1920 const lbrace = tree.nodeMainToken(block_node);
1920 const lbrace = block_node.mainToken(tree);
19211921
19221922 if (tree.isTokenPrecededByTags(lbrace, &.{ .identifier, .colon })) {
19231923 try renderIdentifier(r, lbrace - 2, .none, .eagerly_unquote); // identifier
......@@ -1946,7 +1946,7 @@ fn finishRenderBlock(
19461946 if (i != 0) try renderExtraNewline(r, stmt);
19471947 if (r.fixups.omit_nodes.contains(stmt)) continue;
19481948 try ais.pushSpace(.semicolon);
1949 switch (tree.nodeTag(stmt)) {
1949 switch (stmt.tag(tree)) {
19501950 .global_var_decl,
19511951 .local_var_decl,
19521952 .simple_var_decl,
......@@ -1996,7 +1996,7 @@ fn renderStructInit(
19961996 // Don't output a space after the = if expression is a multiline string,
19971997 // since then it will start on the next line.
19981998 const field_node = struct_init.ast.fields[0];
1999 const expr = tree.nodeTag(field_node);
1999 const expr = field_node.tag(tree);
20002000 var space_after_equal: Space = if (expr == .multiline_string_literal) .none else .space;
20012001 try renderToken(r, struct_init.ast.lbrace + 3, space_after_equal); // =
20022002
......@@ -2009,7 +2009,7 @@ fn renderStructInit(
20092009 try renderExtraNewlineToken(r, init_token - 3);
20102010 try renderToken(r, init_token - 3, .none); // .
20112011 try renderIdentifier(r, init_token - 2, .space, .eagerly_unquote); // name
2012 space_after_equal = if (tree.nodeTag(field_init) == .multiline_string_literal) .none else .space;
2012 space_after_equal = if (field_init.tag(tree) == .multiline_string_literal) .none else .space;
20132013 try renderToken(r, init_token - 1, space_after_equal); // =
20142014
20152015 try ais.pushSpace(.comma);
......@@ -2361,7 +2361,7 @@ fn renderContainerDecl(
23612361 }
23622362 for (container_decl.ast.members, 0..) |member, i| {
23632363 if (i != 0) try renderExtraNewline(r, member);
2364 switch (tree.nodeTag(member)) {
2364 switch (member.tag(tree)) {
23652365 // For container fields, ensure a trailing comma is added if necessary.
23662366 .container_field_init,
23672367 .container_field_align,
......@@ -2919,7 +2919,7 @@ fn renderIdentifierContents(writer: anytype, bytes: []const u8) !void {
29192919/// `start_token` to `end_token`. This is used to determine if e.g. a
29202920/// fn_proto should be wrapped and have a trailing comma inserted even if
29212921/// there is none in the source.
2922fn hasComment(tree: Ast, start_token: Ast.TokenIndex, end_token: Ast.TokenIndex) bool {
2922fn hasComment(tree: *const Ast, start_token: Ast.TokenIndex, end_token: Ast.TokenIndex) bool {
29232923 for (start_token..end_token) |i| {
29242924 const token: Ast.TokenIndex = @intCast(i);
29252925 const start = tree.tokenStart(token) + tree.tokenSlice(token).len;
......@@ -2932,7 +2932,7 @@ fn hasComment(tree: Ast, start_token: Ast.TokenIndex, end_token: Ast.TokenIndex)
29322932
29332933/// Returns true if there exists a multiline string literal between the start
29342934/// of token `start_token` and the start of token `end_token`.
2935fn hasMultilineString(tree: Ast, start_token: Ast.TokenIndex, end_token: Ast.TokenIndex) bool {
2935fn hasMultilineString(tree: *const Ast, start_token: Ast.TokenIndex, end_token: Ast.TokenIndex) bool {
29362936 return std.mem.indexOfScalar(
29372937 Token.Tag,
29382938 tree.tokens.items(.tag)[start_token..end_token],
......@@ -3084,7 +3084,7 @@ fn renderContainerDocComments(r: *Render, start_token: Ast.TokenIndex) Error!voi
30843084}
30853085
30863086fn discardAllParams(r: *Render, fn_proto_node: Ast.Node.Index) Error!void {
3087 const tree = &r.tree;
3087 const tree = r.tree;
30883088 const ais = r.ais;
30893089 var buf: [1]Ast.Node.Index = undefined;
30903090 const fn_proto = tree.fullFnProto(&buf, fn_proto_node).?;
......@@ -3094,12 +3094,12 @@ fn discardAllParams(r: *Render, fn_proto_node: Ast.Node.Index) Error!void {
30943094 assert(tree.tokenTag(name_ident) == .identifier);
30953095 const w = ais.writer();
30963096 try w.writeAll("_ = ");
3097 try w.writeAll(tokenSliceForRender(r.tree, name_ident));
3097 try w.writeAll(tokenSliceForRender(tree, name_ident));
30983098 try w.writeAll(";\n");
30993099 }
31003100}
31013101
3102fn tokenSliceForRender(tree: Ast, token_index: Ast.TokenIndex) []const u8 {
3102fn tokenSliceForRender(tree: *const Ast, token_index: Ast.TokenIndex) []const u8 {
31033103 var ret = tree.tokenSlice(token_index);
31043104 switch (tree.tokenTag(token_index)) {
31053105 .container_doc_comment, .doc_comment => {
......@@ -3110,7 +3110,7 @@ fn tokenSliceForRender(tree: Ast, token_index: Ast.TokenIndex) []const u8 {
31103110 return ret;
31113111}
31123112
3113fn hasSameLineComment(tree: Ast, token_index: Ast.TokenIndex) bool {
3113fn hasSameLineComment(tree: *const Ast, token_index: Ast.TokenIndex) bool {
31143114 const between_source = tree.source[tree.tokenStart(token_index)..tree.tokenStart(token_index + 1)];
31153115 for (between_source) |byte| switch (byte) {
31163116 '\n' => return false,
......@@ -3122,7 +3122,7 @@ fn hasSameLineComment(tree: Ast, token_index: Ast.TokenIndex) bool {
31223122
31233123/// Returns `true` if and only if there are any tokens or line comments between
31243124/// start_token and end_token.
3125fn anythingBetween(tree: Ast, start_token: Ast.TokenIndex, end_token: Ast.TokenIndex) bool {
3125fn anythingBetween(tree: *const Ast, start_token: Ast.TokenIndex, end_token: Ast.TokenIndex) bool {
31263126 if (start_token + 1 != end_token) return true;
31273127 const between_source = tree.source[tree.tokenStart(start_token)..tree.tokenStart(start_token + 1)];
31283128 for (between_source) |byte| switch (byte) {
......@@ -3217,7 +3217,7 @@ fn nodeCausesSliceOpSpace(tag: Ast.Node.Tag) bool {
32173217}
32183218
32193219// Returns the number of nodes in `exprs` that are on the same line as `rtoken`.
3220fn rowSize(tree: Ast, exprs: []const Ast.Node.Index, rtoken: Ast.TokenIndex) usize {
3220fn rowSize(tree: *const Ast, exprs: []const Ast.Node.Index, rtoken: Ast.TokenIndex) usize {
32213221 const first_token = tree.firstToken(exprs[0]);
32223222 if (tree.tokensOnSameLine(first_token, rtoken)) {
32233223 const maybe_comma = rtoken - 1;
lib/std/zon/parse.zig+5-5
......@@ -198,7 +198,7 @@ pub const Error = union(enum) {
198198 return location;
199199 } else {
200200 const ast_node: Ast.Node.Index = @enumFromInt(node_or_offset);
201 const token = ast.nodeMainToken(ast_node);
201 const token = ast_node.mainToken(ast);
202202 return ast.tokenLocation(0, token);
203203 }
204204 }
......@@ -644,7 +644,7 @@ const Parser = struct {
644644 switch (try ZonGen.parseStrLit(self.ast, ast_node, buf.writer(self.gpa))) {
645645 .success => {},
646646 .failure => |err| {
647 const token = self.ast.nodeMainToken(ast_node);
647 const token = ast_node.mainToken(self.ast);
648648 const raw_string = self.ast.tokenSlice(token);
649649 return self.failTokenFmt(token, @intCast(err.offset()), "{s}", .{err.fmt(raw_string)});
650650 },
......@@ -1017,7 +1017,7 @@ const Parser = struct {
10171017 args: anytype,
10181018 ) error{ OutOfMemory, ParseZon } {
10191019 @branchHint(.cold);
1020 const token = self.ast.nodeMainToken(node.getAstNode(self.zoir));
1020 const token = node.getAstNode(self.zoir).mainToken(self.ast);
10211021 return self.failTokenFmt(token, 0, fmt, args);
10221022 }
10231023
......@@ -1036,7 +1036,7 @@ const Parser = struct {
10361036 message: []const u8,
10371037 ) error{ParseZon} {
10381038 @branchHint(.cold);
1039 const token = self.ast.nodeMainToken(node.getAstNode(self.zoir));
1039 const token = node.getAstNode(self.zoir).mainToken(self.ast);
10401040 return self.failToken(.{
10411041 .token = token,
10421042 .offset = 0,
......@@ -1069,7 +1069,7 @@ const Parser = struct {
10691069 const struct_init = self.ast.fullStructInit(&buf, node.getAstNode(self.zoir)).?;
10701070 const field_node = struct_init.ast.fields[f];
10711071 break :b self.ast.firstToken(field_node) - 2;
1072 } else self.ast.nodeMainToken(node.getAstNode(self.zoir));
1072 } else node.getAstNode(self.zoir).mainToken(self.ast);
10731073 switch (@typeInfo(T)) {
10741074 inline .@"struct", .@"union", .@"enum" => |info| {
10751075 const note: Error.TypeCheckFailure.Note = if (info.fields.len == 0) b: {
src/Package/Manifest.zig+36-36
......@@ -58,7 +58,7 @@ pub const ParseOptions = struct {
5858pub const Error = Allocator.Error;
5959
6060pub fn parse(gpa: Allocator, ast: Ast, options: ParseOptions) Error!Manifest {
61 const main_node_index = ast.nodeData(.root).node;
61 const main_node_index = Ast.Node.Index.root.data(&ast).node;
6262
6363 var arena_instance = std.heap.ArenaAllocator.init(gpa);
6464 errdefer arena_instance.deinit();
......@@ -158,8 +158,8 @@ const Parse = struct {
158158 const InnerError = error{ ParseFailure, OutOfMemory };
159159
160160 fn parseRoot(p: *Parse, node: Ast.Node.Index) !void {
161 const ast = p.ast;
162 const main_token = ast.nodeMainToken(node);
161 const ast = &p.ast;
162 const main_token = node.mainToken(ast);
163163
164164 var buf: [2]Ast.Node.Index = undefined;
165165 const struct_init = ast.fullStructInit(&buf, node) orelse {
......@@ -192,17 +192,17 @@ const Parse = struct {
192192 p.version_node = field_init;
193193 const version_text = try parseString(p, field_init);
194194 if (version_text.len > max_version_len) {
195 try appendError(p, ast.nodeMainToken(field_init), "version string length {d} exceeds maximum of {d}", .{ version_text.len, max_version_len });
195 try appendError(p, field_init.mainToken(ast), "version string length {d} exceeds maximum of {d}", .{ version_text.len, max_version_len });
196196 }
197197 p.version = std.SemanticVersion.parse(version_text) catch |err| v: {
198 try appendError(p, ast.nodeMainToken(field_init), "unable to parse semantic version: {s}", .{@errorName(err)});
198 try appendError(p, field_init.mainToken(ast), "unable to parse semantic version: {s}", .{@errorName(err)});
199199 break :v undefined;
200200 };
201201 have_version = true;
202202 } else if (mem.eql(u8, field_name, "minimum_zig_version")) {
203203 const version_text = try parseString(p, field_init);
204204 p.minimum_zig_version = std.SemanticVersion.parse(version_text) catch |err| v: {
205 try appendError(p, ast.nodeMainToken(field_init), "unable to parse semantic version: {s}", .{@errorName(err)});
205 try appendError(p, field_init.mainToken(ast), "unable to parse semantic version: {s}", .{@errorName(err)});
206206 break :v null;
207207 };
208208 } else {
......@@ -244,11 +244,11 @@ const Parse = struct {
244244 }
245245
246246 fn parseDependencies(p: *Parse, node: Ast.Node.Index) !void {
247 const ast = p.ast;
247 const ast = &p.ast;
248248
249249 var buf: [2]Ast.Node.Index = undefined;
250250 const struct_init = ast.fullStructInit(&buf, node) orelse {
251 const tok = ast.nodeMainToken(node);
251 const tok = node.mainToken(ast);
252252 return fail(p, tok, "expected dependencies expression to be a struct", .{});
253253 };
254254
......@@ -261,11 +261,11 @@ const Parse = struct {
261261 }
262262
263263 fn parseDependency(p: *Parse, node: Ast.Node.Index) !Dependency {
264 const ast = p.ast;
264 const ast = &p.ast;
265265
266266 var buf: [2]Ast.Node.Index = undefined;
267267 const struct_init = ast.fullStructInit(&buf, node) orelse {
268 const tok = ast.nodeMainToken(node);
268 const tok = node.mainToken(ast);
269269 return fail(p, tok, "expected dependency expression to be a struct", .{});
270270 };
271271
......@@ -291,7 +291,7 @@ const Parse = struct {
291291 // that is desirable on a per-field basis.
292292 if (mem.eql(u8, field_name, "url")) {
293293 if (has_location) {
294 return fail(p, ast.nodeMainToken(field_init), "dependency should specify only one of 'url' and 'path' fields.", .{});
294 return fail(p, field_init.mainToken(ast), "dependency should specify only one of 'url' and 'path' fields.", .{});
295295 }
296296 dep.location = .{
297297 .url = parseString(p, field_init) catch |err| switch (err) {
......@@ -300,11 +300,11 @@ const Parse = struct {
300300 },
301301 };
302302 has_location = true;
303 dep.location_tok = ast.nodeMainToken(field_init);
303 dep.location_tok = field_init.mainToken(ast);
304304 dep.location_node = field_init;
305305 } else if (mem.eql(u8, field_name, "path")) {
306306 if (has_location) {
307 return fail(p, ast.nodeMainToken(field_init), "dependency should specify only one of 'url' and 'path' fields.", .{});
307 return fail(p, field_init.mainToken(ast), "dependency should specify only one of 'url' and 'path' fields.", .{});
308308 }
309309 dep.location = .{
310310 .path = parseString(p, field_init) catch |err| switch (err) {
......@@ -313,14 +313,14 @@ const Parse = struct {
313313 },
314314 };
315315 has_location = true;
316 dep.location_tok = ast.nodeMainToken(field_init);
316 dep.location_tok = field_init.mainToken(ast);
317317 dep.location_node = field_init;
318318 } else if (mem.eql(u8, field_name, "hash")) {
319319 dep.hash = parseHash(p, field_init) catch |err| switch (err) {
320320 error.ParseFailure => continue,
321321 else => |e| return e,
322322 };
323 dep.hash_tok = .fromToken(ast.nodeMainToken(field_init));
323 dep.hash_tok = .fromToken(field_init.mainToken(ast));
324324 dep.hash_node = field_init.toOptional();
325325 } else if (mem.eql(u8, field_name, "lazy")) {
326326 dep.lazy = parseBool(p, field_init) catch |err| switch (err) {
......@@ -334,18 +334,18 @@ const Parse = struct {
334334 }
335335
336336 if (!has_location) {
337 try appendError(p, ast.nodeMainToken(node), "dependency requires location field, one of 'url' or 'path'.", .{});
337 try appendError(p, node.mainToken(ast), "dependency requires location field, one of 'url' or 'path'.", .{});
338338 }
339339
340340 return dep;
341341 }
342342
343343 fn parseIncludedPaths(p: *Parse, node: Ast.Node.Index) !void {
344 const ast = p.ast;
344 const ast = &p.ast;
345345
346346 var buf: [2]Ast.Node.Index = undefined;
347347 const array_init = ast.fullArrayInit(&buf, node) orelse {
348 const tok = ast.nodeMainToken(node);
348 const tok = node.mainToken(ast);
349349 return fail(p, tok, "expected paths expression to be a list of strings", .{});
350350 };
351351
......@@ -359,11 +359,11 @@ const Parse = struct {
359359 }
360360
361361 fn parseBool(p: *Parse, node: Ast.Node.Index) !bool {
362 const ast = p.ast;
363 if (ast.nodeTag(node) != .identifier) {
364 return fail(p, ast.nodeMainToken(node), "expected identifier", .{});
362 const ast = &p.ast;
363 if (node.tag(ast) != .identifier) {
364 return fail(p, node.mainToken(ast), "expected identifier", .{});
365365 }
366 const ident_token = ast.nodeMainToken(node);
366 const ident_token = node.mainToken(ast);
367367 const token_bytes = ast.tokenSlice(ident_token);
368368 if (mem.eql(u8, token_bytes, "true")) {
369369 return true;
......@@ -375,9 +375,9 @@ const Parse = struct {
375375 }
376376
377377 fn parseFingerprint(p: *Parse, node: Ast.Node.Index) !Package.Fingerprint {
378 const ast = p.ast;
379 const main_token = ast.nodeMainToken(node);
380 if (ast.nodeTag(node) != .number_literal) {
378 const ast = &p.ast;
379 const main_token = node.mainToken(ast);
380 if (node.tag(ast) != .number_literal) {
381381 return fail(p, main_token, "expected integer literal", .{});
382382 }
383383 const token_bytes = ast.tokenSlice(main_token);
......@@ -392,10 +392,10 @@ const Parse = struct {
392392 }
393393
394394 fn parseName(p: *Parse, node: Ast.Node.Index) ![]const u8 {
395 const ast = p.ast;
396 const main_token = ast.nodeMainToken(node);
395 const ast = &p.ast;
396 const main_token = node.mainToken(ast);
397397
398 if (p.allow_name_string and ast.nodeTag(node) == .string_literal) {
398 if (p.allow_name_string and node.tag(ast) == .string_literal) {
399399 const name = try parseString(p, node);
400400 if (!std.zig.isValidId(name))
401401 return fail(p, main_token, "name must be a valid bare zig identifier (hint: switch from string to enum literal)", .{});
......@@ -408,7 +408,7 @@ const Parse = struct {
408408 return name;
409409 }
410410
411 if (ast.nodeTag(node) != .enum_literal)
411 if (node.tag(ast) != .enum_literal)
412412 return fail(p, main_token, "expected enum literal", .{});
413413
414414 const ident_name = ast.tokenSlice(main_token);
......@@ -424,11 +424,11 @@ const Parse = struct {
424424 }
425425
426426 fn parseString(p: *Parse, node: Ast.Node.Index) ![]const u8 {
427 const ast = p.ast;
428 if (ast.nodeTag(node) != .string_literal) {
429 return fail(p, ast.nodeMainToken(node), "expected string literal", .{});
427 const ast = &p.ast;
428 if (node.tag(ast) != .string_literal) {
429 return fail(p, node.mainToken(ast), "expected string literal", .{});
430430 }
431 const str_lit_token = ast.nodeMainToken(node);
431 const str_lit_token = node.mainToken(ast);
432432 const token_bytes = ast.tokenSlice(str_lit_token);
433433 p.buf.clearRetainingCapacity();
434434 try parseStrLit(p, str_lit_token, &p.buf, token_bytes, 0);
......@@ -437,8 +437,8 @@ const Parse = struct {
437437 }
438438
439439 fn parseHash(p: *Parse, node: Ast.Node.Index) ![]const u8 {
440 const ast = p.ast;
441 const tok = ast.nodeMainToken(node);
440 const ast = &p.ast;
441 const tok = node.mainToken(ast);
442442 const h = try parseString(p, node);
443443
444444 if (h.len > Package.Hash.max_len) {
......@@ -450,7 +450,7 @@ const Parse = struct {
450450
451451 /// TODO: try to DRY this with AstGen.identifierTokenString
452452 fn identifierTokenString(p: *Parse, token: Ast.TokenIndex) InnerError![]const u8 {
453 const ast = p.ast;
453 const ast = &p.ast;
454454 assert(ast.tokenTag(token) == .identifier);
455455 const ident_name = ast.tokenSlice(token);
456456 if (!mem.startsWith(u8, ident_name, "@")) {
src/Sema.zig+2-2
......@@ -17298,7 +17298,7 @@ fn zirClosureGet(sema: *Sema, block: *Block, extended: Zir.Inst.Extended.InstDat
1729817298 break :name null;
1729917299 };
1730017300 const node = src_node.toAbsolute(src_base_node);
17301 const token = tree.nodeMainToken(node);
17301 const token = node.mainToken(tree);
1730217302 break :name tree.tokenSlice(token);
1730317303 };
1730417304
......@@ -17326,7 +17326,7 @@ fn zirClosureGet(sema: *Sema, block: *Block, extended: Zir.Inst.Extended.InstDat
1732617326 break :name null;
1732717327 };
1732817328 const node = src_node.toAbsolute(src_base_node);
17329 const token = tree.nodeMainToken(node);
17329 const token = node.mainToken(tree);
1733017330 break :name tree.tokenSlice(token);
1733117331 };
1733217332
src/Zcu.zig+51-51
......@@ -1143,7 +1143,7 @@ pub const SrcLoc = struct {
11431143 .node_offset_main_token => |node_off| {
11441144 const tree = try src_loc.file_scope.getTree(gpa);
11451145 const node = node_off.toAbsolute(src_loc.base_node);
1146 const main_token = tree.nodeMainToken(node);
1146 const main_token = node.mainToken(tree);
11471147 return tree.tokensToSpan(main_token, main_token, main_token);
11481148 },
11491149 .node_offset_bin_op => |node_off| {
......@@ -1157,20 +1157,20 @@ pub const SrcLoc = struct {
11571157 return tree.tokensToSpan(
11581158 tree.firstToken(node) - 3,
11591159 tree.lastToken(node),
1160 tree.nodeMainToken(node) - 2,
1160 node.mainToken(tree) - 2,
11611161 );
11621162 },
11631163 .node_offset_var_decl_ty => |node_off| {
11641164 const tree = try src_loc.file_scope.getTree(gpa);
11651165 const node = node_off.toAbsolute(src_loc.base_node);
1166 const full = switch (tree.nodeTag(node)) {
1166 const full = switch (node.tag(tree)) {
11671167 .global_var_decl,
11681168 .local_var_decl,
11691169 .simple_var_decl,
11701170 .aligned_var_decl,
11711171 => tree.fullVarDecl(node).?,
11721172 .@"usingnamespace" => {
1173 return tree.nodeToSpan(tree.nodeData(node).node);
1173 return tree.nodeToSpan(node.data(tree).node);
11741174 },
11751175 else => unreachable,
11761176 };
......@@ -1221,7 +1221,7 @@ pub const SrcLoc = struct {
12211221 .node_offset_var_decl_init => |node_off| {
12221222 const tree = try src_loc.file_scope.getTree(gpa);
12231223 const node = node_off.toAbsolute(src_loc.base_node);
1224 const init_node = switch (tree.nodeTag(node)) {
1224 const init_node = switch (node.tag(tree)) {
12251225 .global_var_decl,
12261226 .local_var_decl,
12271227 .aligned_var_decl,
......@@ -1244,16 +1244,16 @@ pub const SrcLoc = struct {
12441244
12451245 var node = node_off.toAbsolute(src_loc.base_node);
12461246 while (true) {
1247 switch (tree.nodeTag(node)) {
1247 switch (node.tag(tree)) {
12481248 .builtin_call_two, .builtin_call_two_comma => {},
12491249 else => break,
12501250 }
12511251
1252 const first_arg, const second_arg = tree.nodeData(node).opt_node_and_opt_node;
1252 const first_arg, const second_arg = node.data(tree).opt_node_and_opt_node;
12531253 if (first_arg == .none) break; // 0 args
12541254 if (second_arg != .none) break; // 2 args
12551255
1256 const builtin_token = tree.nodeMainToken(node);
1256 const builtin_token = node.mainToken(tree);
12571257 const builtin_name = tree.tokenSlice(builtin_token);
12581258 const info = BuiltinFn.list.get(builtin_name) orelse break;
12591259
......@@ -1275,7 +1275,7 @@ pub const SrcLoc = struct {
12751275 .node_offset_array_access_index => |node_off| {
12761276 const tree = try src_loc.file_scope.getTree(gpa);
12771277 const node = node_off.toAbsolute(src_loc.base_node);
1278 return tree.nodeToSpan(tree.nodeData(node).node_and_node[1]);
1278 return tree.nodeToSpan(node.data(tree).node_and_node[1]);
12791279 },
12801280 .node_offset_slice_ptr,
12811281 .node_offset_slice_start,
......@@ -1305,8 +1305,8 @@ pub const SrcLoc = struct {
13051305 const tree = try src_loc.file_scope.getTree(gpa);
13061306 const node = node_off.toAbsolute(src_loc.base_node);
13071307 var buf: [1]Ast.Node.Index = undefined;
1308 const tok_index = switch (tree.nodeTag(node)) {
1309 .field_access => tree.nodeData(node).node_and_token[1],
1308 const tok_index = switch (node.tag(tree)) {
1309 .field_access => node.data(tree).node_and_token[1],
13101310 .call_one,
13111311 .call_one_comma,
13121312 .async_call_one,
......@@ -1349,13 +1349,13 @@ pub const SrcLoc = struct {
13491349 const node = node_off.toAbsolute(src_loc.base_node);
13501350 const full = tree.fullAsm(node).?;
13511351 const asm_output = full.outputs[0];
1352 return tree.nodeToSpan(tree.nodeData(asm_output).opt_node_and_token[0].unwrap().?);
1352 return tree.nodeToSpan(asm_output.data(tree).opt_node_and_token[0].unwrap().?);
13531353 },
13541354
13551355 .node_offset_if_cond => |node_off| {
13561356 const tree = try src_loc.file_scope.getTree(gpa);
13571357 const node = node_off.toAbsolute(src_loc.base_node);
1358 const src_node = switch (tree.nodeTag(node)) {
1358 const src_node = switch (node.tag(tree)) {
13591359 .if_simple,
13601360 .@"if",
13611361 => tree.fullIf(node).?.ast.cond_expr,
......@@ -1433,9 +1433,9 @@ pub const SrcLoc = struct {
14331433 const node = call_arg.call_node_offset.toAbsolute(src_loc.base_node);
14341434 var buf: [2]Ast.Node.Index = undefined;
14351435 const call_full = tree.fullCall(buf[0..1], node) orelse {
1436 assert(tree.nodeTag(node) == .builtin_call);
1437 const call_args_node: Ast.Node.Index = @enumFromInt(tree.extra_data[@intFromEnum(tree.nodeData(node).extra_range.end) - 1]);
1438 switch (tree.nodeTag(call_args_node)) {
1436 assert(node.tag(tree) == .builtin_call);
1437 const call_args_node: Ast.Node.Index = @enumFromInt(tree.extra_data[@intFromEnum(node.data(tree).extra_range.end) - 1]);
1438 switch (call_args_node.tag(tree)) {
14391439 .array_init_one,
14401440 .array_init_one_comma,
14411441 .array_init_dot_two,
......@@ -1496,23 +1496,23 @@ pub const SrcLoc = struct {
14961496 .node_offset_bin_lhs => |node_off| {
14971497 const tree = try src_loc.file_scope.getTree(gpa);
14981498 const node = node_off.toAbsolute(src_loc.base_node);
1499 return tree.nodeToSpan(tree.nodeData(node).node_and_node[0]);
1499 return tree.nodeToSpan(node.data(tree).node_and_node[0]);
15001500 },
15011501 .node_offset_bin_rhs => |node_off| {
15021502 const tree = try src_loc.file_scope.getTree(gpa);
15031503 const node = node_off.toAbsolute(src_loc.base_node);
1504 return tree.nodeToSpan(tree.nodeData(node).node_and_node[1]);
1504 return tree.nodeToSpan(node.data(tree).node_and_node[1]);
15051505 },
15061506 .array_cat_lhs, .array_cat_rhs => |cat| {
15071507 const tree = try src_loc.file_scope.getTree(gpa);
15081508 const node = cat.array_cat_offset.toAbsolute(src_loc.base_node);
15091509 const arr_node = if (src_loc.lazy == .array_cat_lhs)
1510 tree.nodeData(node).node_and_node[0]
1510 node.data(tree).node_and_node[0]
15111511 else
1512 tree.nodeData(node).node_and_node[1];
1512 node.data(tree).node_and_node[1];
15131513
15141514 var buf: [2]Ast.Node.Index = undefined;
1515 switch (tree.nodeTag(arr_node)) {
1515 switch (arr_node.tag(tree)) {
15161516 .array_init_one,
15171517 .array_init_one_comma,
15181518 .array_init_dot_two,
......@@ -1532,27 +1532,27 @@ pub const SrcLoc = struct {
15321532 .node_offset_try_operand => |node_off| {
15331533 const tree = try src_loc.file_scope.getTree(gpa);
15341534 const node = node_off.toAbsolute(src_loc.base_node);
1535 return tree.nodeToSpan(tree.nodeData(node).node);
1535 return tree.nodeToSpan(node.data(tree).node);
15361536 },
15371537
15381538 .node_offset_switch_operand => |node_off| {
15391539 const tree = try src_loc.file_scope.getTree(gpa);
15401540 const node = node_off.toAbsolute(src_loc.base_node);
1541 const condition, _ = tree.nodeData(node).node_and_extra;
1541 const condition, _ = node.data(tree).node_and_extra;
15421542 return tree.nodeToSpan(condition);
15431543 },
15441544
15451545 .node_offset_switch_special_prong => |node_off| {
15461546 const tree = try src_loc.file_scope.getTree(gpa);
15471547 const switch_node = node_off.toAbsolute(src_loc.base_node);
1548 _, const extra_index = tree.nodeData(switch_node).node_and_extra;
1548 _, const extra_index = switch_node.data(tree).node_and_extra;
15491549 const case_nodes = tree.extraDataSlice(tree.extraData(extra_index, Ast.Node.SubRange), Ast.Node.Index);
15501550 for (case_nodes) |case_node| {
15511551 const case = tree.fullSwitchCase(case_node).?;
15521552 const is_special = (case.ast.values.len == 0) or
15531553 (case.ast.values.len == 1 and
1554 tree.nodeTag(case.ast.values[0]) == .identifier and
1555 mem.eql(u8, tree.tokenSlice(tree.nodeMainToken(case.ast.values[0])), "_"));
1554 case.ast.values[0].tag(tree) == .identifier and
1555 mem.eql(u8, tree.tokenSlice(case.ast.values[0].mainToken(tree)), "_"));
15561556 if (!is_special) continue;
15571557
15581558 return tree.nodeToSpan(case_node);
......@@ -1562,18 +1562,18 @@ pub const SrcLoc = struct {
15621562 .node_offset_switch_range => |node_off| {
15631563 const tree = try src_loc.file_scope.getTree(gpa);
15641564 const switch_node = node_off.toAbsolute(src_loc.base_node);
1565 _, const extra_index = tree.nodeData(switch_node).node_and_extra;
1565 _, const extra_index = switch_node.data(tree).node_and_extra;
15661566 const case_nodes = tree.extraDataSlice(tree.extraData(extra_index, Ast.Node.SubRange), Ast.Node.Index);
15671567 for (case_nodes) |case_node| {
15681568 const case = tree.fullSwitchCase(case_node).?;
15691569 const is_special = (case.ast.values.len == 0) or
15701570 (case.ast.values.len == 1 and
1571 tree.nodeTag(case.ast.values[0]) == .identifier and
1572 mem.eql(u8, tree.tokenSlice(tree.nodeMainToken(case.ast.values[0])), "_"));
1571 case.ast.values[0].tag(tree) == .identifier and
1572 mem.eql(u8, tree.tokenSlice(case.ast.values[0].mainToken(tree)), "_"));
15731573 if (is_special) continue;
15741574
15751575 for (case.ast.values) |item_node| {
1576 if (tree.nodeTag(item_node) == .switch_range) {
1576 if (item_node.tag(tree) == .switch_range) {
15771577 return tree.nodeToSpan(item_node);
15781578 }
15791579 }
......@@ -1632,7 +1632,7 @@ pub const SrcLoc = struct {
16321632 },
16331633 .token_offset_param => |token_off| {
16341634 const tree = try src_loc.file_scope.getTree(gpa);
1635 const main_token = tree.nodeMainToken(src_loc.base_node);
1635 const main_token = src_loc.base_node.mainToken(tree);
16361636 const tok_index = token_off.toAbsolute(main_token);
16371637
16381638 var first_tok = tok_index;
......@@ -1650,7 +1650,7 @@ pub const SrcLoc = struct {
16501650 .node_offset_anyframe_type => |node_off| {
16511651 const tree = try src_loc.file_scope.getTree(gpa);
16521652 const parent_node = node_off.toAbsolute(src_loc.base_node);
1653 _, const child_type = tree.nodeData(parent_node).token_and_node;
1653 _, const child_type = parent_node.data(tree).token_and_node;
16541654 return tree.nodeToSpan(child_type);
16551655 },
16561656
......@@ -1689,7 +1689,7 @@ pub const SrcLoc = struct {
16891689 .node_offset_un_op => |node_off| {
16901690 const tree = try src_loc.file_scope.getTree(gpa);
16911691 const node = node_off.toAbsolute(src_loc.base_node);
1692 return tree.nodeToSpan(tree.nodeData(node).node);
1692 return tree.nodeToSpan(node.data(tree).node);
16931693 },
16941694 .node_offset_ptr_elem => |node_off| {
16951695 const tree = try src_loc.file_scope.getTree(gpa);
......@@ -1737,7 +1737,7 @@ pub const SrcLoc = struct {
17371737 const tree = try src_loc.file_scope.getTree(gpa);
17381738 const parent_node = node_off.toAbsolute(src_loc.base_node);
17391739
1740 switch (tree.nodeTag(parent_node)) {
1740 switch (parent_node.tag(tree)) {
17411741 .container_decl_arg, .container_decl_arg_trailing => {
17421742 const full = tree.containerDeclArg(parent_node);
17431743 const arg_node = full.ast.arg.unwrap().?;
......@@ -1750,7 +1750,7 @@ pub const SrcLoc = struct {
17501750 return tree.tokensToSpan(
17511751 tree.firstToken(arg_node) - 2,
17521752 tree.lastToken(arg_node) + 1,
1753 tree.nodeMainToken(arg_node),
1753 arg_node.mainToken(tree),
17541754 );
17551755 },
17561756 else => unreachable,
......@@ -1760,7 +1760,7 @@ pub const SrcLoc = struct {
17601760 const tree = try src_loc.file_scope.getTree(gpa);
17611761 const parent_node = node_off.toAbsolute(src_loc.base_node);
17621762
1763 const full: Ast.full.ContainerField = switch (tree.nodeTag(parent_node)) {
1763 const full: Ast.full.ContainerField = switch (parent_node.tag(tree)) {
17641764 .container_field => tree.containerField(parent_node),
17651765 .container_field_init => tree.containerFieldInit(parent_node),
17661766 else => unreachable,
......@@ -1782,7 +1782,7 @@ pub const SrcLoc = struct {
17821782 const tree = try src_loc.file_scope.getTree(gpa);
17831783 const node = node_off.toAbsolute(src_loc.base_node);
17841784
1785 switch (tree.nodeTag(node)) {
1785 switch (node.tag(tree)) {
17861786 .assign,
17871787 .assign_mul,
17881788 .assign_div,
......@@ -1801,7 +1801,7 @@ pub const SrcLoc = struct {
18011801 .assign_mul_sat,
18021802 .assign_add_sat,
18031803 .assign_sub_sat,
1804 => return tree.nodeToSpan(tree.nodeData(node).node_and_node[0]),
1804 => return tree.nodeToSpan(node.data(tree).node_and_node[0]),
18051805 else => return tree.nodeToSpan(node),
18061806 }
18071807 },
......@@ -1809,7 +1809,7 @@ pub const SrcLoc = struct {
18091809 const tree = try src_loc.file_scope.getTree(gpa);
18101810 const node = node_off.toAbsolute(src_loc.base_node);
18111811
1812 switch (tree.nodeTag(node)) {
1812 switch (node.tag(tree)) {
18131813 .assign,
18141814 .assign_mul,
18151815 .assign_div,
......@@ -1828,15 +1828,15 @@ pub const SrcLoc = struct {
18281828 .assign_mul_sat,
18291829 .assign_add_sat,
18301830 .assign_sub_sat,
1831 => return tree.nodeToSpan(tree.nodeData(node).node_and_node[1]),
1831 => return tree.nodeToSpan(node.data(tree).node_and_node[1]),
18321832 else => return tree.nodeToSpan(node),
18331833 }
18341834 },
18351835 .node_offset_return_operand => |node_off| {
18361836 const tree = try src_loc.file_scope.getTree(gpa);
18371837 const node = node_off.toAbsolute(src_loc.base_node);
1838 if (tree.nodeTag(node) == .@"return") {
1839 if (tree.nodeData(node).opt_node.unwrap()) |lhs| {
1838 if (node.tag(tree) == .@"return") {
1839 if (node.data(tree).opt_node.unwrap()) |lhs| {
18401840 return tree.nodeToSpan(lhs);
18411841 }
18421842 }
......@@ -1900,7 +1900,7 @@ pub const SrcLoc = struct {
19001900 return tree.tokensToSpan(
19011901 tree.firstToken(field_node) - 3,
19021902 tree.lastToken(field_node),
1903 tree.nodeMainToken(field_node) - 2,
1903 field_node.mainToken(tree) - 2,
19041904 );
19051905 } else unreachable;
19061906 },
......@@ -1944,7 +1944,7 @@ pub const SrcLoc = struct {
19441944 return tree.tokensToSpan(
19451945 name_token - 1,
19461946 tree.lastToken(field_node),
1947 tree.nodeMainToken(field_node) - 2,
1947 field_node.mainToken(tree) - 2,
19481948 );
19491949 }
19501950 }
......@@ -1969,7 +1969,7 @@ pub const SrcLoc = struct {
19691969
19701970 const tree = try src_loc.file_scope.getTree(gpa);
19711971 const switch_node = switch_node_offset.toAbsolute(src_loc.base_node);
1972 _, const extra_index = tree.nodeData(switch_node).node_and_extra;
1972 _, const extra_index = switch_node.data(tree).node_and_extra;
19731973 const case_nodes = tree.extraDataSlice(tree.extraData(extra_index, Ast.Node.SubRange), Ast.Node.Index);
19741974
19751975 var multi_i: u32 = 0;
......@@ -1978,8 +1978,8 @@ pub const SrcLoc = struct {
19781978 const case = tree.fullSwitchCase(case_node).?;
19791979 const is_special = special: {
19801980 if (case.ast.values.len == 0) break :special true;
1981 if (case.ast.values.len == 1 and tree.nodeTag(case.ast.values[0]) == .identifier) {
1982 break :special mem.eql(u8, tree.tokenSlice(tree.nodeMainToken(case.ast.values[0])), "_");
1981 if (case.ast.values.len == 1 and case.ast.values[0].tag(tree) == .identifier) {
1982 break :special mem.eql(u8, tree.tokenSlice(case.ast.values[0].mainToken(tree)), "_");
19831983 }
19841984 break :special false;
19851985 };
......@@ -1991,7 +1991,7 @@ pub const SrcLoc = struct {
19911991 }
19921992
19931993 const is_multi = case.ast.values.len != 1 or
1994 tree.nodeTag(case.ast.values[0]) == .switch_range;
1994 case.ast.values[0].tag(tree) == .switch_range;
19951995
19961996 switch (want_case_idx.kind) {
19971997 .scalar => if (!is_multi and want_case_idx.index == scalar_i) break case,
......@@ -2034,7 +2034,7 @@ pub const SrcLoc = struct {
20342034 .single => {
20352035 var item_i: u32 = 0;
20362036 for (case.ast.values) |item_node| {
2037 if (tree.nodeTag(item_node) == .switch_range) continue;
2037 if (item_node.tag(tree) == .switch_range) continue;
20382038 if (item_i != want_item.index) {
20392039 item_i += 1;
20402040 continue;
......@@ -2045,12 +2045,12 @@ pub const SrcLoc = struct {
20452045 .range => {
20462046 var range_i: u32 = 0;
20472047 for (case.ast.values) |item_node| {
2048 if (tree.nodeTag(item_node) != .switch_range) continue;
2048 if (item_node.tag(tree) != .switch_range) continue;
20492049 if (range_i != want_item.index) {
20502050 range_i += 1;
20512051 continue;
20522052 }
2053 const first, const last = tree.nodeData(item_node).node_and_node;
2053 const first, const last = item_node.data(tree).node_and_node;
20542054 return switch (src_loc.lazy) {
20552055 .switch_case_item => tree.nodeToSpan(item_node),
20562056 .switch_case_item_range_first => tree.nodeToSpan(first),
src/Zcu/PerThread.zig+1-1
......@@ -261,7 +261,7 @@ pub fn updateFile(
261261 };
262262 },
263263 .zon => {
264 file.zoir = try ZonGen.generate(gpa, file.tree.?, .{});
264 file.zoir = try ZonGen.generate(gpa, &file.tree.?, .{});
265265 Zcu.saveZoirCache(cache_file, stat, file.zoir.?) catch |err| {
266266 log.warn("unable to write cached ZOIR code for {}{s} to {}{s}: {s}", .{
267267 file.mod.root, file.sub_file_path, cache_directory, &hex_digest, @errorName(err),
src/fmt.zig+4-4
......@@ -106,28 +106,28 @@ pub fn run(
106106
107107 if (check_ast_flag) {
108108 if (!force_zon) {
109 var zir = try std.zig.AstGen.generate(gpa, tree);
109 var zir = try std.zig.AstGen.generate(gpa, &tree);
110110 defer zir.deinit(gpa);
111111
112112 if (zir.hasCompileErrors()) {
113113 var wip_errors: std.zig.ErrorBundle.Wip = undefined;
114114 try wip_errors.init(gpa);
115115 defer wip_errors.deinit();
116 try wip_errors.addZirErrorMessages(zir, tree, source_code, "<stdin>");
116 try wip_errors.addZirErrorMessages(zir, &tree, source_code, "<stdin>");
117117 var error_bundle = try wip_errors.toOwnedBundle("");
118118 defer error_bundle.deinit(gpa);
119119 error_bundle.renderToStdErr(color.renderOptions());
120120 process.exit(2);
121121 }
122122 } else {
123 const zoir = try std.zig.ZonGen.generate(gpa, tree, .{});
123 const zoir = try std.zig.ZonGen.generate(gpa, &tree, .{});
124124 defer zoir.deinit(gpa);
125125
126126 if (zoir.hasCompileErrors()) {
127127 var wip_errors: std.zig.ErrorBundle.Wip = undefined;
128128 try wip_errors.init(gpa);
129129 defer wip_errors.deinit();
130 try wip_errors.addZoirErrorMessages(zoir, tree, source_code, "<stdin>");
130 try wip_errors.addZoirErrorMessages(zoir, &tree, source_code, "<stdin>");
131131 var error_bundle = try wip_errors.toOwnedBundle("");
132132 defer error_bundle.deinit(gpa);
133133 error_bundle.renderToStdErr(color.renderOptions());
src/main.zig+1-1
......@@ -6454,7 +6454,7 @@ fn cmdAstCheck(
64546454 }
64556455 },
64566456 .zon => {
6457 const zoir = try ZonGen.generate(gpa, file.tree.?, .{});
6457 const zoir = try ZonGen.generate(gpa, &file.tree.?, .{});
64586458 defer zoir.deinit(gpa);
64596459
64606460 if (zoir.hasCompileErrors()) {