authorgravatar for git@vexu.euVeikka Tuominen <git@vexu.eu> 2020-03-15 01:07:01+02:00
committergravatar for git@vexu.euVeikka Tuominen <git@vexu.eu> 2020-03-15 01:11:58+02:00
log57f9f0755814ab4170b6f770510fe3fb8db2c1e3
tree82b762397aedf871b9b6f2c3a176847586da8764
parent5e5dee829dd0098e00821d2717841950957ebb96
signature Commit is signed but in an unrecognized format.

use anon literals in ast.zig and parse.zig


2 files changed, 402 insertions(+), 441 deletions(-)

lib/std/zig/ast.zig+66-90
...@@ -740,11 +740,11 @@ pub const Node = struct {...@@ -740,11 +740,11 @@ pub const Node = struct {
740 var i = index;740 var i = index;
741741
742 switch (self.init_arg_expr) {742 switch (self.init_arg_expr) {
743 InitArg.Type => |t| {743 .Type => |t| {
744 if (i < 1) return t;744 if (i < 1) return t;
745 i -= 1;745 i -= 1;
746 },746 },
747 InitArg.None, InitArg.Enum => {},747 .None, .Enum => {},
748 }748 }
749749
750 if (i < self.fields_and_decls.len) return self.fields_and_decls.at(i).*;750 if (i < self.fields_and_decls.len) return self.fields_and_decls.at(i).*;
...@@ -904,12 +904,7 @@ pub const Node = struct {...@@ -904,12 +904,7 @@ pub const Node = struct {
904 }904 }
905905
906 switch (self.return_type) {906 switch (self.return_type) {
907 // TODO allow this and next prong to share bodies since the types are the same907 .Explicit, .InferErrorSet => |node| {
908 ReturnType.Explicit => |node| {
909 if (i < 1) return node;
910 i -= 1;
911 },
912 ReturnType.InferErrorSet => |node| {
913 if (i < 1) return node;908 if (i < 1) return node;
914 i -= 1;909 i -= 1;
915 },910 },
...@@ -934,9 +929,7 @@ pub const Node = struct {...@@ -934,9 +929,7 @@ pub const Node = struct {
934 pub fn lastToken(self: *const FnProto) TokenIndex {929 pub fn lastToken(self: *const FnProto) TokenIndex {
935 if (self.body_node) |body_node| return body_node.lastToken();930 if (self.body_node) |body_node| return body_node.lastToken();
936 switch (self.return_type) {931 switch (self.return_type) {
937 // TODO allow this and next prong to share bodies since the types are the same932 .Explicit, .InferErrorSet => |node| return node.lastToken(),
938 ReturnType.Explicit => |node| return node.lastToken(),
939 ReturnType.InferErrorSet => |node| return node.lastToken(),
940 }933 }
941 }934 }
942 };935 };
...@@ -1512,55 +1505,55 @@ pub const Node = struct {...@@ -1512,55 +1505,55 @@ pub const Node = struct {
1512 i -= 1;1505 i -= 1;
15131506
1514 switch (self.op) {1507 switch (self.op) {
1515 Op.Catch => |maybe_payload| {1508 .Catch => |maybe_payload| {
1516 if (maybe_payload) |payload| {1509 if (maybe_payload) |payload| {
1517 if (i < 1) return payload;1510 if (i < 1) return payload;
1518 i -= 1;1511 i -= 1;
1519 }1512 }
1520 },1513 },
15211514
1522 Op.Add,1515 .Add,
1523 Op.AddWrap,1516 .AddWrap,
1524 Op.ArrayCat,1517 .ArrayCat,
1525 Op.ArrayMult,1518 .ArrayMult,
1526 Op.Assign,1519 .Assign,
1527 Op.AssignBitAnd,1520 .AssignBitAnd,
1528 Op.AssignBitOr,1521 .AssignBitOr,
1529 Op.AssignBitShiftLeft,1522 .AssignBitShiftLeft,
1530 Op.AssignBitShiftRight,1523 .AssignBitShiftRight,
1531 Op.AssignBitXor,1524 .AssignBitXor,
1532 Op.AssignDiv,1525 .AssignDiv,
1533 Op.AssignSub,1526 .AssignSub,
1534 Op.AssignSubWrap,1527 .AssignSubWrap,
1535 Op.AssignMod,1528 .AssignMod,
1536 Op.AssignAdd,1529 .AssignAdd,
1537 Op.AssignAddWrap,1530 .AssignAddWrap,
1538 Op.AssignMul,1531 .AssignMul,
1539 Op.AssignMulWrap,1532 .AssignMulWrap,
1540 Op.BangEqual,1533 .BangEqual,
1541 Op.BitAnd,1534 .BitAnd,
1542 Op.BitOr,1535 .BitOr,
1543 Op.BitShiftLeft,1536 .BitShiftLeft,
1544 Op.BitShiftRight,1537 .BitShiftRight,
1545 Op.BitXor,1538 .BitXor,
1546 Op.BoolAnd,1539 .BoolAnd,
1547 Op.BoolOr,1540 .BoolOr,
1548 Op.Div,1541 .Div,
1549 Op.EqualEqual,1542 .EqualEqual,
1550 Op.ErrorUnion,1543 .ErrorUnion,
1551 Op.GreaterOrEqual,1544 .GreaterOrEqual,
1552 Op.GreaterThan,1545 .GreaterThan,
1553 Op.LessOrEqual,1546 .LessOrEqual,
1554 Op.LessThan,1547 .LessThan,
1555 Op.MergeErrorSets,1548 .MergeErrorSets,
1556 Op.Mod,1549 .Mod,
1557 Op.Mul,1550 .Mul,
1558 Op.MulWrap,1551 .MulWrap,
1559 Op.Period,1552 .Period,
1560 Op.Range,1553 .Range,
1561 Op.Sub,1554 .Sub,
1562 Op.SubWrap,1555 .SubWrap,
1563 Op.UnwrapOptional,1556 .UnwrapOptional,
1564 => {},1557 => {},
1565 }1558 }
15661559
...@@ -1627,8 +1620,7 @@ pub const Node = struct {...@@ -1627,8 +1620,7 @@ pub const Node = struct {
1627 var i = index;1620 var i = index;
16281621
1629 switch (self.op) {1622 switch (self.op) {
1630 // TODO https://github.com/ziglang/zig/issues/11071623 .PtrType, .SliceType => |addr_of_info| {
1631 Op.SliceType => |addr_of_info| {
1632 if (addr_of_info.sentinel) |sentinel| {1624 if (addr_of_info.sentinel) |sentinel| {
1633 if (i < 1) return sentinel;1625 if (i < 1) return sentinel;
1634 i -= 1;1626 i -= 1;
...@@ -1640,14 +1632,7 @@ pub const Node = struct {...@@ -1640,14 +1632,7 @@ pub const Node = struct {
1640 }1632 }
1641 },1633 },
16421634
1643 Op.PtrType => |addr_of_info| {1635 .ArrayType => |array_info| {
1644 if (addr_of_info.align_info) |align_info| {
1645 if (i < 1) return align_info.node;
1646 i -= 1;
1647 }
1648 },
1649
1650 Op.ArrayType => |array_info| {
1651 if (i < 1) return array_info.len_expr;1636 if (i < 1) return array_info.len_expr;
1652 i -= 1;1637 i -= 1;
1653 if (array_info.sentinel) |sentinel| {1638 if (array_info.sentinel) |sentinel| {
...@@ -1656,15 +1641,15 @@ pub const Node = struct {...@@ -1656,15 +1641,15 @@ pub const Node = struct {
1656 }1641 }
1657 },1642 },
16581643
1659 Op.AddressOf,1644 .AddressOf,
1660 Op.Await,1645 .Await,
1661 Op.BitNot,1646 .BitNot,
1662 Op.BoolNot,1647 .BoolNot,
1663 Op.OptionalType,1648 .OptionalType,
1664 Op.Negation,1649 .Negation,
1665 Op.NegationWrap,1650 .NegationWrap,
1666 Op.Try,1651 .Try,
1667 Op.Resume,1652 .Resume,
1668 => {},1653 => {},
1669 }1654 }
16701655
...@@ -1848,19 +1833,14 @@ pub const Node = struct {...@@ -1848,19 +1833,14 @@ pub const Node = struct {
1848 var i = index;1833 var i = index;
18491834
1850 switch (self.kind) {1835 switch (self.kind) {
1851 Kind.Break => |maybe_label| {1836 .Break,
1837 .Continue => |maybe_label| {
1852 if (maybe_label) |label| {1838 if (maybe_label) |label| {
1853 if (i < 1) return label;1839 if (i < 1) return label;
1854 i -= 1;1840 i -= 1;
1855 }1841 }
1856 },1842 },
1857 Kind.Continue => |maybe_label| {1843 .Return => {},
1858 if (maybe_label) |label| {
1859 if (i < 1) return label;
1860 i -= 1;
1861 }
1862 },
1863 Kind.Return => {},
1864 }1844 }
18651845
1866 if (self.rhs) |rhs| {1846 if (self.rhs) |rhs| {
...@@ -1881,17 +1861,13 @@ pub const Node = struct {...@@ -1881,17 +1861,13 @@ pub const Node = struct {
1881 }1861 }
18821862
1883 switch (self.kind) {1863 switch (self.kind) {
1884 Kind.Break => |maybe_label| {1864 .Break,
1885 if (maybe_label) |label| {1865 .Continue => |maybe_label| {
1886 return label.lastToken();
1887 }
1888 },
1889 Kind.Continue => |maybe_label| {
1890 if (maybe_label) |label| {1866 if (maybe_label) |label| {
1891 return label.lastToken();1867 return label.lastToken();
1892 }1868 }
1893 },1869 },
1894 Kind.Return => return self.ltoken,1870 .Return => return self.ltoken,
1895 }1871 }
18961872
1897 return self.ltoken;1873 return self.ltoken;
...@@ -2132,11 +2108,11 @@ pub const Node = struct {...@@ -2132,11 +2108,11 @@ pub const Node = struct {
2132 i -= 1;2108 i -= 1;
21332109
2134 switch (self.kind) {2110 switch (self.kind) {
2135 Kind.Variable => |variable_name| {2111 .Variable => |variable_name| {
2136 if (i < 1) return &variable_name.base;2112 if (i < 1) return &variable_name.base;
2137 i -= 1;2113 i -= 1;
2138 },2114 },
2139 Kind.Return => |return_type| {2115 .Return => |return_type| {
2140 if (i < 1) return return_type;2116 if (i < 1) return return_type;
2141 i -= 1;2117 i -= 1;
2142 },2118 },
lib/std/zig/parse.zig+336-351
...@@ -23,7 +23,7 @@ pub fn parse(allocator: *Allocator, source: []const u8) Allocator.Error!*Tree {...@@ -23,7 +23,7 @@ pub fn parse(allocator: *Allocator, source: []const u8) Allocator.Error!*Tree {
23 var arena = std.heap.ArenaAllocator.init(allocator);23 var arena = std.heap.ArenaAllocator.init(allocator);
24 errdefer arena.deinit();24 errdefer arena.deinit();
25 const tree = try arena.allocator.create(ast.Tree);25 const tree = try arena.allocator.create(ast.Tree);
26 tree.* = ast.Tree{26 tree.* = .{
27 .source = source,27 .source = source,
28 .root_node = undefined,28 .root_node = undefined,
29 .arena_allocator = arena,29 .arena_allocator = arena,
...@@ -66,10 +66,10 @@ pub fn parse(allocator: *Allocator, source: []const u8) Allocator.Error!*Tree {...@@ -66,10 +66,10 @@ pub fn parse(allocator: *Allocator, source: []const u8) Allocator.Error!*Tree {
66/// Root <- skip ContainerMembers eof66/// Root <- skip ContainerMembers eof
67fn parseRoot(arena: *Allocator, it: *TokenIterator, tree: *Tree) Error!*Node.Root {67fn parseRoot(arena: *Allocator, it: *TokenIterator, tree: *Tree) Error!*Node.Root {
68 const node = try arena.create(Node.Root);68 const node = try arena.create(Node.Root);
69 node.* = Node.Root{69 node.* = .{
70 .decls = try parseContainerMembers(arena, it, tree),70 .decls = try parseContainerMembers(arena, it, tree),
71 .eof_token = eatToken(it, .Eof) orelse {71 .eof_token = eatToken(it, .Eof) orelse {
72 try tree.errors.push(AstError{72 try tree.errors.push(.{
73 .ExpectedContainerMembers = .{ .token = it.index },73 .ExpectedContainerMembers = .{ .token = it.index },
74 });74 });
75 return error.ParseError;75 return error.ParseError;
...@@ -139,8 +139,8 @@ fn parseContainerMembers(arena: *Allocator, it: *TokenIterator, tree: *Tree) !No...@@ -139,8 +139,8 @@ fn parseContainerMembers(arena: *Allocator, it: *TokenIterator, tree: *Tree) !No
139 }139 }
140140
141 if (visib_token != null) {141 if (visib_token != null) {
142 try tree.errors.push(AstError{142 try tree.errors.push(.{
143 .ExpectedPubItem = AstError.ExpectedPubItem{ .token = it.index },143 .ExpectedPubItem = .{ .token = it.index },
144 });144 });
145 return error.ParseError;145 return error.ParseError;
146 }146 }
...@@ -157,8 +157,8 @@ fn parseContainerMembers(arena: *Allocator, it: *TokenIterator, tree: *Tree) !No...@@ -157,8 +157,8 @@ fn parseContainerMembers(arena: *Allocator, it: *TokenIterator, tree: *Tree) !No
157157
158 // Dangling doc comment158 // Dangling doc comment
159 if (doc_comments != null) {159 if (doc_comments != null) {
160 try tree.errors.push(AstError{160 try tree.errors.push(.{
161 .UnattachedDocComment = AstError.UnattachedDocComment{ .token = doc_comments.?.firstToken() },161 .UnattachedDocComment = .{ .token = doc_comments.?.firstToken() },
162 });162 });
163 }163 }
164 break;164 break;
...@@ -177,7 +177,7 @@ fn parseContainerDocComments(arena: *Allocator, it: *TokenIterator, tree: *Tree)...@@ -177,7 +177,7 @@ fn parseContainerDocComments(arena: *Allocator, it: *TokenIterator, tree: *Tree)
177 if (lines.len == 0) return null;177 if (lines.len == 0) return null;
178178
179 const node = try arena.create(Node.DocComment);179 const node = try arena.create(Node.DocComment);
180 node.* = Node.DocComment{180 node.* = .{
181 .lines = lines,181 .lines = lines,
182 };182 };
183 return &node.base;183 return &node.base;
...@@ -186,15 +186,15 @@ fn parseContainerDocComments(arena: *Allocator, it: *TokenIterator, tree: *Tree)...@@ -186,15 +186,15 @@ fn parseContainerDocComments(arena: *Allocator, it: *TokenIterator, tree: *Tree)
186/// TestDecl <- KEYWORD_test STRINGLITERALSINGLE Block186/// TestDecl <- KEYWORD_test STRINGLITERALSINGLE Block
187fn parseTestDecl(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*Node {187fn parseTestDecl(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*Node {
188 const test_token = eatToken(it, .Keyword_test) orelse return null;188 const test_token = eatToken(it, .Keyword_test) orelse return null;
189 const name_node = try expectNode(arena, it, tree, parseStringLiteralSingle, AstError{189 const name_node = try expectNode(arena, it, tree, parseStringLiteralSingle, .{
190 .ExpectedStringLiteral = AstError.ExpectedStringLiteral{ .token = it.index },190 .ExpectedStringLiteral = .{ .token = it.index },
191 });191 });
192 const block_node = try expectNode(arena, it, tree, parseBlock, AstError{192 const block_node = try expectNode(arena, it, tree, parseBlock, .{
193 .ExpectedLBrace = AstError.ExpectedLBrace{ .token = it.index },193 .ExpectedLBrace = .{ .token = it.index },
194 });194 });
195195
196 const test_node = try arena.create(Node.TestDecl);196 const test_node = try arena.create(Node.TestDecl);
197 test_node.* = Node.TestDecl{197 test_node.* = .{
198 .doc_comments = null,198 .doc_comments = null,
199 .test_token = test_token,199 .test_token = test_token,
200 .name = name_node,200 .name = name_node,
...@@ -211,12 +211,12 @@ fn parseTopLevelComptime(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*...@@ -211,12 +211,12 @@ fn parseTopLevelComptime(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*
211 return null;211 return null;
212 };212 };
213 putBackToken(it, lbrace);213 putBackToken(it, lbrace);
214 const block_node = try expectNode(arena, it, tree, parseBlockExpr, AstError{214 const block_node = try expectNode(arena, it, tree, parseBlockExpr, .{
215 .ExpectedLabelOrLBrace = AstError.ExpectedLabelOrLBrace{ .token = it.index },215 .ExpectedLabelOrLBrace = .{ .token = it.index },
216 });216 });
217217
218 const comptime_node = try arena.create(Node.Comptime);218 const comptime_node = try arena.create(Node.Comptime);
219 comptime_node.* = Node.Comptime{219 comptime_node.* = .{
220 .doc_comments = null,220 .doc_comments = null,
221 .comptime_token = tok,221 .comptime_token = tok,
222 .expr = block_node,222 .expr = block_node,
...@@ -250,8 +250,8 @@ fn parseTopLevelDecl(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*Node...@@ -250,8 +250,8 @@ fn parseTopLevelDecl(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*Node
250 fn_node.body_node = body_node;250 fn_node.body_node = body_node;
251 return node;251 return node;
252 }252 }
253 try tree.errors.push(AstError{253 try tree.errors.push(.{
254 .ExpectedSemiOrLBrace = AstError.ExpectedSemiOrLBrace{ .token = it.index },254 .ExpectedSemiOrLBrace = .{ .token = it.index },
255 });255 });
256 return null;256 return null;
257 }257 }
...@@ -277,8 +277,8 @@ fn parseTopLevelDecl(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*Node...@@ -277,8 +277,8 @@ fn parseTopLevelDecl(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*Node
277 }277 }
278278
279 if (thread_local_token != null) {279 if (thread_local_token != null) {
280 try tree.errors.push(AstError{280 try tree.errors.push(.{
281 .ExpectedVarDecl = AstError.ExpectedVarDecl{ .token = it.index },281 .ExpectedVarDecl = .{ .token = it.index },
282 });282 });
283 return error.ParseError;283 return error.ParseError;
284 }284 }
...@@ -291,8 +291,8 @@ fn parseTopLevelDecl(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*Node...@@ -291,8 +291,8 @@ fn parseTopLevelDecl(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*Node
291 }291 }
292292
293 const use_node = (try parseUse(arena, it, tree)) orelse return null;293 const use_node = (try parseUse(arena, it, tree)) orelse return null;
294 const expr_node = try expectNode(arena, it, tree, parseExpr, AstError{294 const expr_node = try expectNode(arena, it, tree, parseExpr, .{
295 .ExpectedExpr = AstError.ExpectedExpr{ .token = it.index },295 .ExpectedExpr = .{ .token = it.index },
296 });296 });
297 const semicolon_token = try expectToken(it, tree, .Semicolon);297 const semicolon_token = try expectToken(it, tree, .Semicolon);
298 const use_node_raw = use_node.cast(Node.Use).?;298 const use_node_raw = use_node.cast(Node.Use).?;
...@@ -310,7 +310,7 @@ fn parseFnProto(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*Node {...@@ -310,7 +310,7 @@ fn parseFnProto(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*Node {
310 if (fnCC == .Extern) {310 if (fnCC == .Extern) {
311 putBackToken(it, fnCC.Extern); // 'extern' is also used in ContainerDecl311 putBackToken(it, fnCC.Extern); // 'extern' is also used in ContainerDecl
312 } else {312 } else {
313 try tree.errors.push(AstError{313 try tree.errors.push(.{
314 .ExpectedToken = .{ .token = it.index, .expected_id = .Keyword_fn },314 .ExpectedToken = .{ .token = it.index, .expected_id = .Keyword_fn },
315 });315 });
316 return error.ParseError;316 return error.ParseError;
...@@ -328,16 +328,16 @@ fn parseFnProto(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*Node {...@@ -328,16 +328,16 @@ fn parseFnProto(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*Node {
328 const exclamation_token = eatToken(it, .Bang);328 const exclamation_token = eatToken(it, .Bang);
329329
330 const return_type_expr = (try parseVarType(arena, it, tree)) orelse330 const return_type_expr = (try parseVarType(arena, it, tree)) orelse
331 try expectNode(arena, it, tree, parseTypeExpr, AstError{331 try expectNode(arena, it, tree, parseTypeExpr, .{
332 .ExpectedReturnType = AstError.ExpectedReturnType{ .token = it.index },332 .ExpectedReturnType = .{ .token = it.index },
333 });333 });
334334
335 const return_type = if (exclamation_token != null)335 const return_type: Node.FnProto.ReturnType = if (exclamation_token != null)
336 Node.FnProto.ReturnType{336 .{
337 .InferErrorSet = return_type_expr,337 .InferErrorSet = return_type_expr,
338 }338 }
339 else339 else
340 Node.FnProto.ReturnType{340 .{
341 .Explicit = return_type_expr,341 .Explicit = return_type_expr,
342 };342 };
343343
...@@ -347,7 +347,7 @@ fn parseFnProto(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*Node {...@@ -347,7 +347,7 @@ fn parseFnProto(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*Node {
347 null;347 null;
348348
349 const fn_proto_node = try arena.create(Node.FnProto);349 const fn_proto_node = try arena.create(Node.FnProto);
350 fn_proto_node.* = Node.FnProto{350 fn_proto_node.* = .{
351 .doc_comments = null,351 .doc_comments = null,
352 .visib_token = null,352 .visib_token = null,
353 .fn_token = fn_token,353 .fn_token = fn_token,
...@@ -382,8 +382,8 @@ fn parseVarDecl(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*Node {...@@ -382,8 +382,8 @@ fn parseVarDecl(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*Node {
382382
383 const name_token = try expectToken(it, tree, .Identifier);383 const name_token = try expectToken(it, tree, .Identifier);
384 const type_node = if (eatToken(it, .Colon) != null)384 const type_node = if (eatToken(it, .Colon) != null)
385 try expectNode(arena, it, tree, parseTypeExpr, AstError{385 try expectNode(arena, it, tree, parseTypeExpr, .{
386 .ExpectedTypeExpr = AstError.ExpectedTypeExpr{ .token = it.index },386 .ExpectedTypeExpr = .{ .token = it.index },
387 })387 })
388 else388 else
389 null;389 null;
...@@ -391,14 +391,14 @@ fn parseVarDecl(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*Node {...@@ -391,14 +391,14 @@ fn parseVarDecl(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*Node {
391 const section_node = try parseLinkSection(arena, it, tree);391 const section_node = try parseLinkSection(arena, it, tree);
392 const eq_token = eatToken(it, .Equal);392 const eq_token = eatToken(it, .Equal);
393 const init_node = if (eq_token != null) blk: {393 const init_node = if (eq_token != null) blk: {
394 break :blk try expectNode(arena, it, tree, parseExpr, AstError{394 break :blk try expectNode(arena, it, tree, parseExpr, .{
395 .ExpectedExpr = AstError.ExpectedExpr{ .token = it.index },395 .ExpectedExpr = .{ .token = it.index },
396 });396 });
397 } else null;397 } else null;
398 const semicolon_token = try expectToken(it, tree, .Semicolon);398 const semicolon_token = try expectToken(it, tree, .Semicolon);
399399
400 const node = try arena.create(Node.VarDecl);400 const node = try arena.create(Node.VarDecl);
401 node.* = Node.VarDecl{401 node.* = .{
402 .doc_comments = null,402 .doc_comments = null,
403 .visib_token = null,403 .visib_token = null,
404 .thread_local_token = null,404 .thread_local_token = null,
...@@ -433,22 +433,22 @@ fn parseContainerField(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*No...@@ -433,22 +433,22 @@ fn parseContainerField(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*No
433 node.* = .{ .token = var_tok };433 node.* = .{ .token = var_tok };
434 type_expr = &node.base;434 type_expr = &node.base;
435 } else {435 } else {
436 type_expr = try expectNode(arena, it, tree, parseTypeExpr, AstError{436 type_expr = try expectNode(arena, it, tree, parseTypeExpr, .{
437 .ExpectedTypeExpr = AstError.ExpectedTypeExpr{ .token = it.index },437 .ExpectedTypeExpr = .{ .token = it.index },
438 });438 });
439 align_expr = try parseByteAlign(arena, it, tree);439 align_expr = try parseByteAlign(arena, it, tree);
440 }440 }
441 }441 }
442442
443 const value_expr = if (eatToken(it, .Equal)) |_|443 const value_expr = if (eatToken(it, .Equal)) |_|
444 try expectNode(arena, it, tree, parseExpr, AstError{444 try expectNode(arena, it, tree, parseExpr, .{
445 .ExpectedExpr = AstError.ExpectedExpr{ .token = it.index },445 .ExpectedExpr = .{ .token = it.index },
446 })446 })
447 else447 else
448 null;448 null;
449449
450 const node = try arena.create(Node.ContainerField);450 const node = try arena.create(Node.ContainerField);
451 node.* = Node.ContainerField{451 node.* = .{
452 .doc_comments = null,452 .doc_comments = null,
453 .comptime_token = comptime_token,453 .comptime_token = comptime_token,
454 .name_token = name_token,454 .name_token = name_token,
...@@ -481,12 +481,12 @@ fn parseStatement(arena: *Allocator, it: *TokenIterator, tree: *Tree) Error!?*No...@@ -481,12 +481,12 @@ fn parseStatement(arena: *Allocator, it: *TokenIterator, tree: *Tree) Error!?*No
481 }481 }
482482
483 if (comptime_token) |token| {483 if (comptime_token) |token| {
484 const block_expr = try expectNode(arena, it, tree, parseBlockExprStatement, AstError{484 const block_expr = try expectNode(arena, it, tree, parseBlockExprStatement, .{
485 .ExpectedBlockOrAssignment = AstError.ExpectedBlockOrAssignment{ .token = it.index },485 .ExpectedBlockOrAssignment = .{ .token = it.index },
486 });486 });
487487
488 const node = try arena.create(Node.Comptime);488 const node = try arena.create(Node.Comptime);
489 node.* = Node.Comptime{489 node.* = .{
490 .doc_comments = null,490 .doc_comments = null,
491 .comptime_token = token,491 .comptime_token = token,
492 .expr = block_expr,492 .expr = block_expr,
...@@ -511,13 +511,13 @@ fn parseStatement(arena: *Allocator, it: *TokenIterator, tree: *Tree) Error!?*No...@@ -511,13 +511,13 @@ fn parseStatement(arena: *Allocator, it: *TokenIterator, tree: *Tree) Error!?*No
511 const semicolon = eatToken(it, .Semicolon);511 const semicolon = eatToken(it, .Semicolon);
512512
513 const body_node = if (semicolon == null) blk: {513 const body_node = if (semicolon == null) blk: {
514 break :blk try expectNode(arena, it, tree, parseBlockExprStatement, AstError{514 break :blk try expectNode(arena, it, tree, parseBlockExprStatement, .{
515 .ExpectedBlockOrExpression = AstError.ExpectedBlockOrExpression{ .token = it.index },515 .ExpectedBlockOrExpression = .{ .token = it.index },
516 });516 });
517 } else null;517 } else null;
518518
519 const node = try arena.create(Node.Suspend);519 const node = try arena.create(Node.Suspend);
520 node.* = Node.Suspend{520 node.* = .{
521 .suspend_token = suspend_token,521 .suspend_token = suspend_token,
522 .body = body_node,522 .body = body_node,
523 };523 };
...@@ -526,11 +526,11 @@ fn parseStatement(arena: *Allocator, it: *TokenIterator, tree: *Tree) Error!?*No...@@ -526,11 +526,11 @@ fn parseStatement(arena: *Allocator, it: *TokenIterator, tree: *Tree) Error!?*No
526526
527 const defer_token = eatToken(it, .Keyword_defer) orelse eatToken(it, .Keyword_errdefer);527 const defer_token = eatToken(it, .Keyword_defer) orelse eatToken(it, .Keyword_errdefer);
528 if (defer_token) |token| {528 if (defer_token) |token| {
529 const expr_node = try expectNode(arena, it, tree, parseBlockExprStatement, AstError{529 const expr_node = try expectNode(arena, it, tree, parseBlockExprStatement, .{
530 .ExpectedBlockOrExpression = AstError.ExpectedBlockOrExpression{ .token = it.index },530 .ExpectedBlockOrExpression = .{ .token = it.index },
531 });531 });
532 const node = try arena.create(Node.Defer);532 const node = try arena.create(Node.Defer);
533 node.* = Node.Defer{533 node.* = .{
534 .defer_token = token,534 .defer_token = token,
535 .expr = expr_node,535 .expr = expr_node,
536 };536 };
...@@ -561,8 +561,8 @@ fn parseIfStatement(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*Node...@@ -561,8 +561,8 @@ fn parseIfStatement(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*Node
561 } else null;561 } else null;
562562
563 if (block_expr == null and assign_expr == null) {563 if (block_expr == null and assign_expr == null) {
564 try tree.errors.push(AstError{564 try tree.errors.push(.{
565 .ExpectedBlockOrAssignment = AstError.ExpectedBlockOrAssignment{ .token = it.index },565 .ExpectedBlockOrAssignment = .{ .token = it.index },
566 });566 });
567 return error.ParseError;567 return error.ParseError;
568 }568 }
...@@ -572,12 +572,12 @@ fn parseIfStatement(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*Node...@@ -572,12 +572,12 @@ fn parseIfStatement(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*Node
572 const else_node = if (semicolon == null) blk: {572 const else_node = if (semicolon == null) blk: {
573 const else_token = eatToken(it, .Keyword_else) orelse break :blk null;573 const else_token = eatToken(it, .Keyword_else) orelse break :blk null;
574 const payload = try parsePayload(arena, it, tree);574 const payload = try parsePayload(arena, it, tree);
575 const else_body = try expectNode(arena, it, tree, parseStatement, AstError{575 const else_body = try expectNode(arena, it, tree, parseStatement, .{
576 .InvalidToken = AstError.InvalidToken{ .token = it.index },576 .InvalidToken = .{ .token = it.index },
577 });577 });
578578
579 const node = try arena.create(Node.Else);579 const node = try arena.create(Node.Else);
580 node.* = Node.Else{580 node.* = .{
581 .else_token = else_token,581 .else_token = else_token,
582 .payload = payload,582 .payload = payload,
583 .body = else_body,583 .body = else_body,
...@@ -599,8 +599,8 @@ fn parseIfStatement(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*Node...@@ -599,8 +599,8 @@ fn parseIfStatement(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*Node
599 if_prefix.@"else" = else_node;599 if_prefix.@"else" = else_node;
600 return if_node;600 return if_node;
601 }601 }
602 try tree.errors.push(AstError{602 try tree.errors.push(.{
603 .ExpectedSemiOrElse = AstError.ExpectedSemiOrElse{ .token = it.index },603 .ExpectedSemiOrElse = .{ .token = it.index },
604 });604 });
605 return error.ParseError;605 return error.ParseError;
606 }606 }
...@@ -628,8 +628,8 @@ fn parseLabeledStatement(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*...@@ -628,8 +628,8 @@ fn parseLabeledStatement(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*
628 }628 }
629629
630 if (label_token != null) {630 if (label_token != null) {
631 try tree.errors.push(AstError{631 try tree.errors.push(.{
632 .ExpectedLabelable = AstError.ExpectedLabelable{ .token = it.index },632 .ExpectedLabelable = .{ .token = it.index },
633 });633 });
634 return error.ParseError;634 return error.ParseError;
635 }635 }
...@@ -665,12 +665,12 @@ fn parseForStatement(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*Node...@@ -665,12 +665,12 @@ fn parseForStatement(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*Node
665 for_prefix.body = block_expr_node;665 for_prefix.body = block_expr_node;
666666
667 if (eatToken(it, .Keyword_else)) |else_token| {667 if (eatToken(it, .Keyword_else)) |else_token| {
668 const statement_node = try expectNode(arena, it, tree, parseStatement, AstError{668 const statement_node = try expectNode(arena, it, tree, parseStatement, .{
669 .InvalidToken = AstError.InvalidToken{ .token = it.index },669 .InvalidToken = .{ .token = it.index },
670 });670 });
671671
672 const else_node = try arena.create(Node.Else);672 const else_node = try arena.create(Node.Else);
673 else_node.* = Node.Else{673 else_node.* = .{
674 .else_token = else_token,674 .else_token = else_token,
675 .payload = null,675 .payload = null,
676 .body = statement_node,676 .body = statement_node,
...@@ -689,12 +689,12 @@ fn parseForStatement(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*Node...@@ -689,12 +689,12 @@ fn parseForStatement(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*Node
689 if (eatToken(it, .Semicolon) != null) return node;689 if (eatToken(it, .Semicolon) != null) return node;
690690
691 if (eatToken(it, .Keyword_else)) |else_token| {691 if (eatToken(it, .Keyword_else)) |else_token| {
692 const statement_node = try expectNode(arena, it, tree, parseStatement, AstError{692 const statement_node = try expectNode(arena, it, tree, parseStatement, .{
693 .ExpectedStatement = AstError.ExpectedStatement{ .token = it.index },693 .ExpectedStatement = .{ .token = it.index },
694 });694 });
695695
696 const else_node = try arena.create(Node.Else);696 const else_node = try arena.create(Node.Else);
697 else_node.* = Node.Else{697 else_node.* = .{
698 .else_token = else_token,698 .else_token = else_token,
699 .payload = null,699 .payload = null,
700 .body = statement_node,700 .body = statement_node,
...@@ -703,8 +703,8 @@ fn parseForStatement(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*Node...@@ -703,8 +703,8 @@ fn parseForStatement(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*Node
703 return node;703 return node;
704 }704 }
705705
706 try tree.errors.push(AstError{706 try tree.errors.push(.{
707 .ExpectedSemiOrElse = AstError.ExpectedSemiOrElse{ .token = it.index },707 .ExpectedSemiOrElse = .{ .token = it.index },
708 });708 });
709 return null;709 return null;
710 }710 }
...@@ -725,12 +725,12 @@ fn parseWhileStatement(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*No...@@ -725,12 +725,12 @@ fn parseWhileStatement(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*No
725 if (eatToken(it, .Keyword_else)) |else_token| {725 if (eatToken(it, .Keyword_else)) |else_token| {
726 const payload = try parsePayload(arena, it, tree);726 const payload = try parsePayload(arena, it, tree);
727727
728 const statement_node = try expectNode(arena, it, tree, parseStatement, AstError{728 const statement_node = try expectNode(arena, it, tree, parseStatement, .{
729 .InvalidToken = AstError.InvalidToken{ .token = it.index },729 .InvalidToken = .{ .token = it.index },
730 });730 });
731731
732 const else_node = try arena.create(Node.Else);732 const else_node = try arena.create(Node.Else);
733 else_node.* = Node.Else{733 else_node.* = .{
734 .else_token = else_token,734 .else_token = else_token,
735 .payload = payload,735 .payload = payload,
736 .body = statement_node,736 .body = statement_node,
...@@ -751,12 +751,12 @@ fn parseWhileStatement(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*No...@@ -751,12 +751,12 @@ fn parseWhileStatement(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*No
751 if (eatToken(it, .Keyword_else)) |else_token| {751 if (eatToken(it, .Keyword_else)) |else_token| {
752 const payload = try parsePayload(arena, it, tree);752 const payload = try parsePayload(arena, it, tree);
753753
754 const statement_node = try expectNode(arena, it, tree, parseStatement, AstError{754 const statement_node = try expectNode(arena, it, tree, parseStatement, .{
755 .ExpectedStatement = AstError.ExpectedStatement{ .token = it.index },755 .ExpectedStatement = .{ .token = it.index },
756 });756 });
757757
758 const else_node = try arena.create(Node.Else);758 const else_node = try arena.create(Node.Else);
759 else_node.* = Node.Else{759 else_node.* = .{
760 .else_token = else_token,760 .else_token = else_token,
761 .payload = payload,761 .payload = payload,
762 .body = statement_node,762 .body = statement_node,
...@@ -765,8 +765,8 @@ fn parseWhileStatement(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*No...@@ -765,8 +765,8 @@ fn parseWhileStatement(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*No
765 return node;765 return node;
766 }766 }
767767
768 try tree.errors.push(AstError{768 try tree.errors.push(.{
769 .ExpectedSemiOrElse = AstError.ExpectedSemiOrElse{ .token = it.index },769 .ExpectedSemiOrElse = .{ .token = it.index },
770 });770 });
771 return null;771 return null;
772 }772 }
...@@ -894,8 +894,8 @@ fn parsePrimaryExpr(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*Node...@@ -894,8 +894,8 @@ fn parsePrimaryExpr(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*Node
894 }894 }
895895
896 if (eatToken(it, .Keyword_comptime)) |token| {896 if (eatToken(it, .Keyword_comptime)) |token| {
897 const expr_node = try expectNode(arena, it, tree, parseExpr, AstError{897 const expr_node = try expectNode(arena, it, tree, parseExpr, .{
898 .ExpectedExpr = AstError.ExpectedExpr{ .token = it.index },898 .ExpectedExpr = .{ .token = it.index },
899 });899 });
900 const node = try arena.create(Node.Comptime);900 const node = try arena.create(Node.Comptime);
901 node.* = .{901 node.* = .{
...@@ -907,8 +907,8 @@ fn parsePrimaryExpr(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*Node...@@ -907,8 +907,8 @@ fn parsePrimaryExpr(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*Node
907 }907 }
908908
909 if (eatToken(it, .Keyword_noasync)) |token| {909 if (eatToken(it, .Keyword_noasync)) |token| {
910 const expr_node = try expectNode(arena, it, tree, parseExpr, AstError{910 const expr_node = try expectNode(arena, it, tree, parseExpr, .{
911 .ExpectedExpr = AstError.ExpectedExpr{ .token = it.index },911 .ExpectedExpr = .{ .token = it.index },
912 });912 });
913 const node = try arena.create(Node.Noasync);913 const node = try arena.create(Node.Noasync);
914 node.* = .{914 node.* = .{
...@@ -930,13 +930,13 @@ fn parsePrimaryExpr(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*Node...@@ -930,13 +930,13 @@ fn parsePrimaryExpr(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*Node
930 }930 }
931931
932 if (eatToken(it, .Keyword_resume)) |token| {932 if (eatToken(it, .Keyword_resume)) |token| {
933 const expr_node = try expectNode(arena, it, tree, parseExpr, AstError{933 const expr_node = try expectNode(arena, it, tree, parseExpr, .{
934 .ExpectedExpr = AstError.ExpectedExpr{ .token = it.index },934 .ExpectedExpr = .{ .token = it.index },
935 });935 });
936 const node = try arena.create(Node.PrefixOp);936 const node = try arena.create(Node.PrefixOp);
937 node.* = .{937 node.* = .{
938 .op_token = token,938 .op_token = token,
939 .op = Node.PrefixOp.Op.Resume,939 .op = .Resume,
940 .rhs = expr_node,940 .rhs = expr_node,
941 };941 };
942 return &node.base;942 return &node.base;
...@@ -992,7 +992,7 @@ fn parseBlock(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*Node {...@@ -992,7 +992,7 @@ fn parseBlock(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*Node {
992 const rbrace = try expectToken(it, tree, .RBrace);992 const rbrace = try expectToken(it, tree, .RBrace);
993993
994 const block_node = try arena.create(Node.Block);994 const block_node = try arena.create(Node.Block);
995 block_node.* = Node.Block{995 block_node.* = .{
996 .label = null,996 .label = null,
997 .lbrace = lbrace,997 .lbrace = lbrace,
998 .statements = statements,998 .statements = statements,
...@@ -1019,8 +1019,8 @@ fn parseLoopExpr(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*Node {...@@ -1019,8 +1019,8 @@ fn parseLoopExpr(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*Node {
1019 if (inline_token == null) return null;1019 if (inline_token == null) return null;
10201020
1021 // If we've seen "inline", there should have been a "for" or "while"1021 // If we've seen "inline", there should have been a "for" or "while"
1022 try tree.errors.push(AstError{1022 try tree.errors.push(.{
1023 .ExpectedInlinable = AstError.ExpectedInlinable{ .token = it.index },1023 .ExpectedInlinable = .{ .token = it.index },
1024 });1024 });
1025 return error.ParseError;1025 return error.ParseError;
1026}1026}
...@@ -1030,18 +1030,18 @@ fn parseForExpr(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*Node {...@@ -1030,18 +1030,18 @@ fn parseForExpr(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*Node {
1030 const node = (try parseForPrefix(arena, it, tree)) orelse return null;1030 const node = (try parseForPrefix(arena, it, tree)) orelse return null;
1031 const for_prefix = node.cast(Node.For).?;1031 const for_prefix = node.cast(Node.For).?;
10321032
1033 const body_node = try expectNode(arena, it, tree, parseExpr, AstError{1033 const body_node = try expectNode(arena, it, tree, parseExpr, .{
1034 .ExpectedExpr = AstError.ExpectedExpr{ .token = it.index },1034 .ExpectedExpr = .{ .token = it.index },
1035 });1035 });
1036 for_prefix.body = body_node;1036 for_prefix.body = body_node;
10371037
1038 if (eatToken(it, .Keyword_else)) |else_token| {1038 if (eatToken(it, .Keyword_else)) |else_token| {
1039 const body = try expectNode(arena, it, tree, parseExpr, AstError{1039 const body = try expectNode(arena, it, tree, parseExpr, .{
1040 .ExpectedExpr = AstError.ExpectedExpr{ .token = it.index },1040 .ExpectedExpr = .{ .token = it.index },
1041 });1041 });
10421042
1043 const else_node = try arena.create(Node.Else);1043 const else_node = try arena.create(Node.Else);
1044 else_node.* = Node.Else{1044 else_node.* = .{
1045 .else_token = else_token,1045 .else_token = else_token,
1046 .payload = null,1046 .payload = null,
1047 .body = body,1047 .body = body,
...@@ -1058,19 +1058,19 @@ fn parseWhileExpr(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*Node {...@@ -1058,19 +1058,19 @@ fn parseWhileExpr(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*Node {
1058 const node = (try parseWhilePrefix(arena, it, tree)) orelse return null;1058 const node = (try parseWhilePrefix(arena, it, tree)) orelse return null;
1059 const while_prefix = node.cast(Node.While).?;1059 const while_prefix = node.cast(Node.While).?;
10601060
1061 const body_node = try expectNode(arena, it, tree, parseExpr, AstError{1061 const body_node = try expectNode(arena, it, tree, parseExpr, .{
1062 .ExpectedExpr = AstError.ExpectedExpr{ .token = it.index },1062 .ExpectedExpr = .{ .token = it.index },
1063 });1063 });
1064 while_prefix.body = body_node;1064 while_prefix.body = body_node;
10651065
1066 if (eatToken(it, .Keyword_else)) |else_token| {1066 if (eatToken(it, .Keyword_else)) |else_token| {
1067 const payload = try parsePayload(arena, it, tree);1067 const payload = try parsePayload(arena, it, tree);
1068 const body = try expectNode(arena, it, tree, parseExpr, AstError{1068 const body = try expectNode(arena, it, tree, parseExpr, .{
1069 .ExpectedExpr = AstError.ExpectedExpr{ .token = it.index },1069 .ExpectedExpr = .{ .token = it.index },
1070 });1070 });
10711071
1072 const else_node = try arena.create(Node.Else);1072 const else_node = try arena.create(Node.Else);
1073 else_node.* = Node.Else{1073 else_node.* = .{
1074 .else_token = else_token,1074 .else_token = else_token,
1075 .payload = payload,1075 .payload = payload,
1076 .body = body,1076 .body = body,
...@@ -1098,14 +1098,14 @@ fn parseInitList(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*Node.Suf...@@ -1098,14 +1098,14 @@ fn parseInitList(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*Node.Suf
1098 const lbrace = eatToken(it, .LBrace) orelse return null;1098 const lbrace = eatToken(it, .LBrace) orelse return null;
1099 var init_list = Node.SuffixOp.Op.InitList.init(arena);1099 var init_list = Node.SuffixOp.Op.InitList.init(arena);
11001100
1101 const op = blk: {1101 const op: Node.SuffixOp.Op = blk: {
1102 if (try parseFieldInit(arena, it, tree)) |field_init| {1102 if (try parseFieldInit(arena, it, tree)) |field_init| {
1103 try init_list.push(field_init);1103 try init_list.push(field_init);
1104 while (eatToken(it, .Comma)) |_| {1104 while (eatToken(it, .Comma)) |_| {
1105 const next = (try parseFieldInit(arena, it, tree)) orelse break;1105 const next = (try parseFieldInit(arena, it, tree)) orelse break;
1106 try init_list.push(next);1106 try init_list.push(next);
1107 }1107 }
1108 break :blk Node.SuffixOp.Op{ .StructInitializer = init_list };1108 break :blk .{ .StructInitializer = init_list };
1109 }1109 }
11101110
1111 if (try parseExpr(arena, it, tree)) |expr| {1111 if (try parseExpr(arena, it, tree)) |expr| {
...@@ -1114,14 +1114,14 @@ fn parseInitList(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*Node.Suf...@@ -1114,14 +1114,14 @@ fn parseInitList(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*Node.Suf
1114 const next = (try parseExpr(arena, it, tree)) orelse break;1114 const next = (try parseExpr(arena, it, tree)) orelse break;
1115 try init_list.push(next);1115 try init_list.push(next);
1116 }1116 }
1117 break :blk Node.SuffixOp.Op{ .ArrayInitializer = init_list };1117 break :blk .{ .ArrayInitializer = init_list };
1118 }1118 }
11191119
1120 break :blk Node.SuffixOp.Op{ .StructInitializer = init_list };1120 break :blk .{ .StructInitializer = init_list };
1121 };1121 };
11221122
1123 const node = try arena.create(Node.SuffixOp);1123 const node = try arena.create(Node.SuffixOp);
1124 node.* = Node.SuffixOp{1124 node.* = .{
1125 .lhs = .{ .node = undefined }, // set by caller1125 .lhs = .{ .node = undefined }, // set by caller
1126 .op = op,1126 .op = op,
1127 .rtoken = try expectToken(it, tree, .RBrace),1127 .rtoken = try expectToken(it, tree, .RBrace),
...@@ -1140,8 +1140,8 @@ fn parseErrorUnionExpr(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*No...@@ -1140,8 +1140,8 @@ fn parseErrorUnionExpr(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*No
11401140
1141 if (try SimpleBinOpParseFn(.Bang, Node.InfixOp.Op.ErrorUnion)(arena, it, tree)) |node| {1141 if (try SimpleBinOpParseFn(.Bang, Node.InfixOp.Op.ErrorUnion)(arena, it, tree)) |node| {
1142 const error_union = node.cast(Node.InfixOp).?;1142 const error_union = node.cast(Node.InfixOp).?;
1143 const type_expr = try expectNode(arena, it, tree, parseTypeExpr, AstError{1143 const type_expr = try expectNode(arena, it, tree, parseTypeExpr, .{
1144 .ExpectedTypeExpr = AstError.ExpectedTypeExpr{ .token = it.index },1144 .ExpectedTypeExpr = .{ .token = it.index },
1145 });1145 });
1146 error_union.lhs = suffix_expr;1146 error_union.lhs = suffix_expr;
1147 error_union.rhs = type_expr;1147 error_union.rhs = type_expr;
...@@ -1168,8 +1168,8 @@ fn parseSuffixExpr(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*Node {...@@ -1168,8 +1168,8 @@ fn parseSuffixExpr(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*Node {
1168 return parsePrimaryTypeExpr(arena, it, tree);1168 return parsePrimaryTypeExpr(arena, it, tree);
1169 }1169 }
1170 // TODO: Implement hack for parsing `async fn ...` in ast_parse_suffix_expr1170 // TODO: Implement hack for parsing `async fn ...` in ast_parse_suffix_expr
1171 var res = try expectNode(arena, it, tree, parsePrimaryTypeExpr, AstError{1171 var res = try expectNode(arena, it, tree, parsePrimaryTypeExpr, .{
1172 .ExpectedPrimaryTypeExpr = AstError.ExpectedPrimaryTypeExpr{ .token = it.index },1172 .ExpectedPrimaryTypeExpr = .{ .token = it.index },
1173 });1173 });
11741174
1175 while (try parseSuffixOp(arena, it, tree)) |node| {1175 while (try parseSuffixOp(arena, it, tree)) |node| {
...@@ -1182,16 +1182,16 @@ fn parseSuffixExpr(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*Node {...@@ -1182,16 +1182,16 @@ fn parseSuffixExpr(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*Node {
1182 }1182 }
11831183
1184 const params = (try parseFnCallArguments(arena, it, tree)) orelse {1184 const params = (try parseFnCallArguments(arena, it, tree)) orelse {
1185 try tree.errors.push(AstError{1185 try tree.errors.push(.{
1186 .ExpectedParamList = AstError.ExpectedParamList{ .token = it.index },1186 .ExpectedParamList = .{ .token = it.index },
1187 });1187 });
1188 return null;1188 return null;
1189 };1189 };
1190 const node = try arena.create(Node.SuffixOp);1190 const node = try arena.create(Node.SuffixOp);
1191 node.* = Node.SuffixOp{1191 node.* = .{
1192 .lhs = .{ .node = res },1192 .lhs = .{ .node = res },
1193 .op = Node.SuffixOp.Op{1193 .op = .{
1194 .Call = Node.SuffixOp.Op.Call{1194 .Call = .{
1195 .params = params.list,1195 .params = params.list,
1196 .async_token = async_token,1196 .async_token = async_token,
1197 },1197 },
...@@ -1215,10 +1215,10 @@ fn parseSuffixExpr(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*Node {...@@ -1215,10 +1215,10 @@ fn parseSuffixExpr(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*Node {
1215 }1215 }
1216 if (try parseFnCallArguments(arena, it, tree)) |params| {1216 if (try parseFnCallArguments(arena, it, tree)) |params| {
1217 const call = try arena.create(Node.SuffixOp);1217 const call = try arena.create(Node.SuffixOp);
1218 call.* = Node.SuffixOp{1218 call.* = .{
1219 .lhs = .{ .node = res },1219 .lhs = .{ .node = res },
1220 .op = Node.SuffixOp.Op{1220 .op = .{
1221 .Call = Node.SuffixOp.Op.Call{1221 .Call = .{
1222 .params = params.list,1222 .params = params.list,
1223 .async_token = null,1223 .async_token = null,
1224 },1224 },
...@@ -1264,7 +1264,7 @@ fn parsePrimaryTypeExpr(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*N...@@ -1264,7 +1264,7 @@ fn parsePrimaryTypeExpr(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*N
1264 if (try parseBuiltinCall(arena, it, tree)) |node| return node;1264 if (try parseBuiltinCall(arena, it, tree)) |node| return node;
1265 if (eatToken(it, .CharLiteral)) |token| {1265 if (eatToken(it, .CharLiteral)) |token| {
1266 const node = try arena.create(Node.CharLiteral);1266 const node = try arena.create(Node.CharLiteral);
1267 node.* = Node.CharLiteral{1267 node.* = .{
1268 .token = token,1268 .token = token,
1269 };1269 };
1270 return &node.base;1270 return &node.base;
...@@ -1300,15 +1300,15 @@ fn parsePrimaryTypeExpr(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*N...@@ -1300,15 +1300,15 @@ fn parsePrimaryTypeExpr(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*N
1300 }1300 }
1301 if (eatToken(it, .Keyword_error)) |token| {1301 if (eatToken(it, .Keyword_error)) |token| {
1302 const period = try expectToken(it, tree, .Period);1302 const period = try expectToken(it, tree, .Period);
1303 const identifier = try expectNode(arena, it, tree, parseIdentifier, AstError{1303 const identifier = try expectNode(arena, it, tree, parseIdentifier, .{
1304 .ExpectedIdentifier = AstError.ExpectedIdentifier{ .token = it.index },1304 .ExpectedIdentifier = .{ .token = it.index },
1305 });1305 });
1306 const global_error_set = try createLiteral(arena, Node.ErrorType, token);1306 const global_error_set = try createLiteral(arena, Node.ErrorType, token);
1307 const node = try arena.create(Node.InfixOp);1307 const node = try arena.create(Node.InfixOp);
1308 node.* = .{1308 node.* = .{
1309 .op_token = period,1309 .op_token = period,
1310 .lhs = global_error_set,1310 .lhs = global_error_set,
1311 .op = Node.InfixOp.Op.Period,1311 .op = .Period,
1312 .rhs = identifier,1312 .rhs = identifier,
1313 };1313 };
1314 return &node.base;1314 return &node.base;
...@@ -1358,7 +1358,7 @@ fn parseErrorSetDecl(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*Node...@@ -1358,7 +1358,7 @@ fn parseErrorSetDecl(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*Node
1358 const rbrace = try expectToken(it, tree, .RBrace);1358 const rbrace = try expectToken(it, tree, .RBrace);
13591359
1360 const node = try arena.create(Node.ErrorSetDecl);1360 const node = try arena.create(Node.ErrorSetDecl);
1361 node.* = Node.ErrorSetDecl{1361 node.* = .{
1362 .error_token = error_token,1362 .error_token = error_token,
1363 .decls = decls,1363 .decls = decls,
1364 .rbrace_token = rbrace,1364 .rbrace_token = rbrace,
...@@ -1369,13 +1369,13 @@ fn parseErrorSetDecl(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*Node...@@ -1369,13 +1369,13 @@ fn parseErrorSetDecl(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*Node
1369/// GroupedExpr <- LPAREN Expr RPAREN1369/// GroupedExpr <- LPAREN Expr RPAREN
1370fn parseGroupedExpr(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*Node {1370fn parseGroupedExpr(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*Node {
1371 const lparen = eatToken(it, .LParen) orelse return null;1371 const lparen = eatToken(it, .LParen) orelse return null;
1372 const expr = try expectNode(arena, it, tree, parseExpr, AstError{1372 const expr = try expectNode(arena, it, tree, parseExpr, .{
1373 .ExpectedExpr = AstError.ExpectedExpr{ .token = it.index },1373 .ExpectedExpr = .{ .token = it.index },
1374 });1374 });
1375 const rparen = try expectToken(it, tree, .RParen);1375 const rparen = try expectToken(it, tree, .RParen);
13761376
1377 const node = try arena.create(Node.GroupedExpression);1377 const node = try arena.create(Node.GroupedExpression);
1378 node.* = Node.GroupedExpression{1378 node.* = .{
1379 .lparen = lparen,1379 .lparen = lparen,
1380 .expr = expr,1380 .expr = expr,
1381 .rparen = rparen,1381 .rparen = rparen,
...@@ -1435,8 +1435,8 @@ fn parseLoopTypeExpr(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*Node...@@ -1435,8 +1435,8 @@ fn parseLoopTypeExpr(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*Node
1435 if (inline_token == null) return null;1435 if (inline_token == null) return null;
14361436
1437 // If we've seen "inline", there should have been a "for" or "while"1437 // If we've seen "inline", there should have been a "for" or "while"
1438 try tree.errors.push(AstError{1438 try tree.errors.push(.{
1439 .ExpectedInlinable = AstError.ExpectedInlinable{ .token = it.index },1439 .ExpectedInlinable = .{ .token = it.index },
1440 });1440 });
1441 return error.ParseError;1441 return error.ParseError;
1442}1442}
...@@ -1446,18 +1446,18 @@ fn parseForTypeExpr(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*Node...@@ -1446,18 +1446,18 @@ fn parseForTypeExpr(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*Node
1446 const node = (try parseForPrefix(arena, it, tree)) orelse return null;1446 const node = (try parseForPrefix(arena, it, tree)) orelse return null;
1447 const for_prefix = node.cast(Node.For).?;1447 const for_prefix = node.cast(Node.For).?;
14481448
1449 const type_expr = try expectNode(arena, it, tree, parseTypeExpr, AstError{1449 const type_expr = try expectNode(arena, it, tree, parseTypeExpr, .{
1450 .ExpectedTypeExpr = AstError.ExpectedTypeExpr{ .token = it.index },1450 .ExpectedTypeExpr = .{ .token = it.index },
1451 });1451 });
1452 for_prefix.body = type_expr;1452 for_prefix.body = type_expr;
14531453
1454 if (eatToken(it, .Keyword_else)) |else_token| {1454 if (eatToken(it, .Keyword_else)) |else_token| {
1455 const else_expr = try expectNode(arena, it, tree, parseTypeExpr, AstError{1455 const else_expr = try expectNode(arena, it, tree, parseTypeExpr, .{
1456 .ExpectedTypeExpr = AstError.ExpectedTypeExpr{ .token = it.index },1456 .ExpectedTypeExpr = .{ .token = it.index },
1457 });1457 });
14581458
1459 const else_node = try arena.create(Node.Else);1459 const else_node = try arena.create(Node.Else);
1460 else_node.* = Node.Else{1460 else_node.* = .{
1461 .else_token = else_token,1461 .else_token = else_token,
1462 .payload = null,1462 .payload = null,
1463 .body = else_expr,1463 .body = else_expr,
...@@ -1474,20 +1474,20 @@ fn parseWhileTypeExpr(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*Nod...@@ -1474,20 +1474,20 @@ fn parseWhileTypeExpr(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*Nod
1474 const node = (try parseWhilePrefix(arena, it, tree)) orelse return null;1474 const node = (try parseWhilePrefix(arena, it, tree)) orelse return null;
1475 const while_prefix = node.cast(Node.While).?;1475 const while_prefix = node.cast(Node.While).?;
14761476
1477 const type_expr = try expectNode(arena, it, tree, parseTypeExpr, AstError{1477 const type_expr = try expectNode(arena, it, tree, parseTypeExpr, .{
1478 .ExpectedTypeExpr = AstError.ExpectedTypeExpr{ .token = it.index },1478 .ExpectedTypeExpr = .{ .token = it.index },
1479 });1479 });
1480 while_prefix.body = type_expr;1480 while_prefix.body = type_expr;
14811481
1482 if (eatToken(it, .Keyword_else)) |else_token| {1482 if (eatToken(it, .Keyword_else)) |else_token| {
1483 const payload = try parsePayload(arena, it, tree);1483 const payload = try parsePayload(arena, it, tree);
14841484
1485 const else_expr = try expectNode(arena, it, tree, parseTypeExpr, AstError{1485 const else_expr = try expectNode(arena, it, tree, parseTypeExpr, .{
1486 .ExpectedTypeExpr = AstError.ExpectedTypeExpr{ .token = it.index },1486 .ExpectedTypeExpr = .{ .token = it.index },
1487 });1487 });
14881488
1489 const else_node = try arena.create(Node.Else);1489 const else_node = try arena.create(Node.Else);
1490 else_node.* = Node.Else{1490 else_node.* = .{
1491 .else_token = else_token,1491 .else_token = else_token,
1492 .payload = null,1492 .payload = null,
1493 .body = else_expr,1493 .body = else_expr,
...@@ -1503,8 +1503,8 @@ fn parseWhileTypeExpr(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*Nod...@@ -1503,8 +1503,8 @@ fn parseWhileTypeExpr(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*Nod
1503fn parseSwitchExpr(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*Node {1503fn parseSwitchExpr(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*Node {
1504 const switch_token = eatToken(it, .Keyword_switch) orelse return null;1504 const switch_token = eatToken(it, .Keyword_switch) orelse return null;
1505 _ = try expectToken(it, tree, .LParen);1505 _ = try expectToken(it, tree, .LParen);
1506 const expr_node = try expectNode(arena, it, tree, parseExpr, AstError{1506 const expr_node = try expectNode(arena, it, tree, parseExpr, .{
1507 .ExpectedExpr = AstError.ExpectedExpr{ .token = it.index },1507 .ExpectedExpr = .{ .token = it.index },
1508 });1508 });
1509 _ = try expectToken(it, tree, .RParen);1509 _ = try expectToken(it, tree, .RParen);
1510 _ = try expectToken(it, tree, .LBrace);1510 _ = try expectToken(it, tree, .LBrace);
...@@ -1512,7 +1512,7 @@ fn parseSwitchExpr(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*Node {...@@ -1512,7 +1512,7 @@ fn parseSwitchExpr(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*Node {
1512 const rbrace = try expectToken(it, tree, .RBrace);1512 const rbrace = try expectToken(it, tree, .RBrace);
15131513
1514 const node = try arena.create(Node.Switch);1514 const node = try arena.create(Node.Switch);
1515 node.* = Node.Switch{1515 node.* = .{
1516 .switch_token = switch_token,1516 .switch_token = switch_token,
1517 .expr = expr_node,1517 .expr = expr_node,
1518 .cases = cases,1518 .cases = cases,
...@@ -1526,12 +1526,12 @@ fn parseAsmExpr(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*Node {...@@ -1526,12 +1526,12 @@ fn parseAsmExpr(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*Node {
1526 const asm_token = eatToken(it, .Keyword_asm) orelse return null;1526 const asm_token = eatToken(it, .Keyword_asm) orelse return null;
1527 const volatile_token = eatToken(it, .Keyword_volatile);1527 const volatile_token = eatToken(it, .Keyword_volatile);
1528 _ = try expectToken(it, tree, .LParen);1528 _ = try expectToken(it, tree, .LParen);
1529 const template = try expectNode(arena, it, tree, parseExpr, AstError{1529 const template = try expectNode(arena, it, tree, parseExpr, .{
1530 .ExpectedExpr = AstError.ExpectedExpr{ .token = it.index },1530 .ExpectedExpr = .{ .token = it.index },
1531 });1531 });
15321532
1533 const node = try arena.create(Node.Asm);1533 const node = try arena.create(Node.Asm);
1534 node.* = Node.Asm{1534 node.* = .{
1535 .asm_token = asm_token,1535 .asm_token = asm_token,
1536 .volatile_token = volatile_token,1536 .volatile_token = volatile_token,
1537 .template = template,1537 .template = template,
...@@ -1553,7 +1553,7 @@ fn parseAnonLiteral(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*Node...@@ -1553,7 +1553,7 @@ fn parseAnonLiteral(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*Node
1553 // anon enum literal1553 // anon enum literal
1554 if (eatToken(it, .Identifier)) |name| {1554 if (eatToken(it, .Identifier)) |name| {
1555 const node = try arena.create(Node.EnumLiteral);1555 const node = try arena.create(Node.EnumLiteral);
1556 node.* = Node.EnumLiteral{1556 node.* = .{
1557 .dot = dot,1557 .dot = dot,
1558 .name = name,1558 .name = name,
1559 };1559 };
...@@ -1580,32 +1580,32 @@ fn parseAsmOutput(arena: *Allocator, it: *TokenIterator, tree: *Tree, asm_node:...@@ -1580,32 +1580,32 @@ fn parseAsmOutput(arena: *Allocator, it: *TokenIterator, tree: *Tree, asm_node:
1580/// AsmOutputItem <- LBRACKET IDENTIFIER RBRACKET STRINGLITERAL LPAREN (MINUSRARROW TypeExpr / IDENTIFIER) RPAREN1580/// AsmOutputItem <- LBRACKET IDENTIFIER RBRACKET STRINGLITERAL LPAREN (MINUSRARROW TypeExpr / IDENTIFIER) RPAREN
1581fn parseAsmOutputItem(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*Node.AsmOutput {1581fn parseAsmOutputItem(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*Node.AsmOutput {
1582 const lbracket = eatToken(it, .LBracket) orelse return null;1582 const lbracket = eatToken(it, .LBracket) orelse return null;
1583 const name = try expectNode(arena, it, tree, parseIdentifier, AstError{1583 const name = try expectNode(arena, it, tree, parseIdentifier, .{
1584 .ExpectedIdentifier = AstError.ExpectedIdentifier{ .token = it.index },1584 .ExpectedIdentifier = .{ .token = it.index },
1585 });1585 });
1586 _ = try expectToken(it, tree, .RBracket);1586 _ = try expectToken(it, tree, .RBracket);
15871587
1588 const constraint = try expectNode(arena, it, tree, parseStringLiteral, AstError{1588 const constraint = try expectNode(arena, it, tree, parseStringLiteral, .{
1589 .ExpectedStringLiteral = AstError.ExpectedStringLiteral{ .token = it.index },1589 .ExpectedStringLiteral = .{ .token = it.index },
1590 });1590 });
15911591
1592 _ = try expectToken(it, tree, .LParen);1592 _ = try expectToken(it, tree, .LParen);
1593 const kind = blk: {1593 const kind: Node.AsmOutput.Kind = blk: {
1594 if (eatToken(it, .Arrow) != null) {1594 if (eatToken(it, .Arrow) != null) {
1595 const return_ident = try expectNode(arena, it, tree, parseTypeExpr, AstError{1595 const return_ident = try expectNode(arena, it, tree, parseTypeExpr, .{
1596 .ExpectedTypeExpr = AstError.ExpectedTypeExpr{ .token = it.index },1596 .ExpectedTypeExpr = .{ .token = it.index },
1597 });1597 });
1598 break :blk Node.AsmOutput.Kind{ .Return = return_ident };1598 break :blk .{ .Return = return_ident };
1599 }1599 }
1600 const variable = try expectNode(arena, it, tree, parseIdentifier, AstError{1600 const variable = try expectNode(arena, it, tree, parseIdentifier, .{
1601 .ExpectedIdentifier = AstError.ExpectedIdentifier{ .token = it.index },1601 .ExpectedIdentifier = .{ .token = it.index },
1602 });1602 });
1603 break :blk Node.AsmOutput.Kind{ .Variable = variable.cast(Node.Identifier).? };1603 break :blk .{ .Variable = variable.cast(Node.Identifier).? };
1604 };1604 };
1605 const rparen = try expectToken(it, tree, .RParen);1605 const rparen = try expectToken(it, tree, .RParen);
16061606
1607 const node = try arena.create(Node.AsmOutput);1607 const node = try arena.create(Node.AsmOutput);
1608 node.* = Node.AsmOutput{1608 node.* = .{
1609 .lbracket = lbracket,1609 .lbracket = lbracket,
1610 .symbolic_name = name,1610 .symbolic_name = name,
1611 .constraint = constraint,1611 .constraint = constraint,
...@@ -1625,23 +1625,23 @@ fn parseAsmInput(arena: *Allocator, it: *TokenIterator, tree: *Tree, asm_node: *...@@ -1625,23 +1625,23 @@ fn parseAsmInput(arena: *Allocator, it: *TokenIterator, tree: *Tree, asm_node: *
1625/// AsmInputItem <- LBRACKET IDENTIFIER RBRACKET STRINGLITERAL LPAREN Expr RPAREN1625/// AsmInputItem <- LBRACKET IDENTIFIER RBRACKET STRINGLITERAL LPAREN Expr RPAREN
1626fn parseAsmInputItem(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*Node.AsmInput {1626fn parseAsmInputItem(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*Node.AsmInput {
1627 const lbracket = eatToken(it, .LBracket) orelse return null;1627 const lbracket = eatToken(it, .LBracket) orelse return null;
1628 const name = try expectNode(arena, it, tree, parseIdentifier, AstError{1628 const name = try expectNode(arena, it, tree, parseIdentifier, .{
1629 .ExpectedIdentifier = AstError.ExpectedIdentifier{ .token = it.index },1629 .ExpectedIdentifier = .{ .token = it.index },
1630 });1630 });
1631 _ = try expectToken(it, tree, .RBracket);1631 _ = try expectToken(it, tree, .RBracket);
16321632
1633 const constraint = try expectNode(arena, it, tree, parseStringLiteral, AstError{1633 const constraint = try expectNode(arena, it, tree, parseStringLiteral, .{
1634 .ExpectedStringLiteral = AstError.ExpectedStringLiteral{ .token = it.index },1634 .ExpectedStringLiteral = .{ .token = it.index },
1635 });1635 });
16361636
1637 _ = try expectToken(it, tree, .LParen);1637 _ = try expectToken(it, tree, .LParen);
1638 const expr = try expectNode(arena, it, tree, parseExpr, AstError{1638 const expr = try expectNode(arena, it, tree, parseExpr, .{
1639 .ExpectedExpr = AstError.ExpectedExpr{ .token = it.index },1639 .ExpectedExpr = .{ .token = it.index },
1640 });1640 });
1641 const rparen = try expectToken(it, tree, .RParen);1641 const rparen = try expectToken(it, tree, .RParen);
16421642
1643 const node = try arena.create(Node.AsmInput);1643 const node = try arena.create(Node.AsmInput);
1644 node.* = Node.AsmInput{1644 node.* = .{
1645 .lbracket = lbracket,1645 .lbracket = lbracket,
1646 .symbolic_name = name,1646 .symbolic_name = name,
1647 .constraint = constraint,1647 .constraint = constraint,
...@@ -1664,8 +1664,8 @@ fn parseAsmClobbers(arena: *Allocator, it: *TokenIterator, tree: *Tree, asm_node...@@ -1664,8 +1664,8 @@ fn parseAsmClobbers(arena: *Allocator, it: *TokenIterator, tree: *Tree, asm_node
1664/// BreakLabel <- COLON IDENTIFIER1664/// BreakLabel <- COLON IDENTIFIER
1665fn parseBreakLabel(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*Node {1665fn parseBreakLabel(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*Node {
1666 _ = eatToken(it, .Colon) orelse return null;1666 _ = eatToken(it, .Colon) orelse return null;
1667 return try expectNode(arena, it, tree, parseIdentifier, AstError{1667 return try expectNode(arena, it, tree, parseIdentifier, .{
1668 .ExpectedIdentifier = AstError.ExpectedIdentifier{ .token = it.index },1668 .ExpectedIdentifier = .{ .token = it.index },
1669 });1669 });
1670}1670}
16711671
...@@ -1694,12 +1694,12 @@ fn parseFieldInit(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*Node {...@@ -1694,12 +1694,12 @@ fn parseFieldInit(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*Node {
1694 putBackToken(it, period_token);1694 putBackToken(it, period_token);
1695 return null;1695 return null;
1696 };1696 };
1697 const expr_node = try expectNode(arena, it, tree, parseExpr, AstError{1697 const expr_node = try expectNode(arena, it, tree, parseExpr, .{
1698 .ExpectedExpr = AstError.ExpectedExpr{ .token = it.index },1698 .ExpectedExpr = .{ .token = it.index },
1699 });1699 });
17001700
1701 const node = try arena.create(Node.FieldInitializer);1701 const node = try arena.create(Node.FieldInitializer);
1702 node.* = Node.FieldInitializer{1702 node.* = .{
1703 .period_token = period_token,1703 .period_token = period_token,
1704 .name_token = name_token,1704 .name_token = name_token,
1705 .expr = expr_node,1705 .expr = expr_node,
...@@ -1711,8 +1711,8 @@ fn parseFieldInit(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*Node {...@@ -1711,8 +1711,8 @@ fn parseFieldInit(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*Node {
1711fn parseWhileContinueExpr(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*Node {1711fn parseWhileContinueExpr(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*Node {
1712 _ = eatToken(it, .Colon) orelse return null;1712 _ = eatToken(it, .Colon) orelse return null;
1713 _ = try expectToken(it, tree, .LParen);1713 _ = try expectToken(it, tree, .LParen);
1714 const node = try expectNode(arena, it, tree, parseAssignExpr, AstError{1714 const node = try expectNode(arena, it, tree, parseAssignExpr, .{
1715 .ExpectedExprOrAssignment = AstError.ExpectedExprOrAssignment{ .token = it.index },1715 .ExpectedExprOrAssignment = .{ .token = it.index },
1716 });1716 });
1717 _ = try expectToken(it, tree, .RParen);1717 _ = try expectToken(it, tree, .RParen);
1718 return node;1718 return node;
...@@ -1722,8 +1722,8 @@ fn parseWhileContinueExpr(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?...@@ -1722,8 +1722,8 @@ fn parseWhileContinueExpr(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?
1722fn parseLinkSection(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*Node {1722fn parseLinkSection(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*Node {
1723 _ = eatToken(it, .Keyword_linksection) orelse return null;1723 _ = eatToken(it, .Keyword_linksection) orelse return null;
1724 _ = try expectToken(it, tree, .LParen);1724 _ = try expectToken(it, tree, .LParen);
1725 const expr_node = try expectNode(arena, it, tree, parseExpr, AstError{1725 const expr_node = try expectNode(arena, it, tree, parseExpr, .{
1726 .ExpectedExpr = AstError.ExpectedExpr{ .token = it.index },1726 .ExpectedExpr = .{ .token = it.index },
1727 });1727 });
1728 _ = try expectToken(it, tree, .RParen);1728 _ = try expectToken(it, tree, .RParen);
1729 return expr_node;1729 return expr_node;
...@@ -1733,8 +1733,8 @@ fn parseLinkSection(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*Node...@@ -1733,8 +1733,8 @@ fn parseLinkSection(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*Node
1733fn parseCallconv(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*Node {1733fn parseCallconv(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*Node {
1734 _ = eatToken(it, .Keyword_callconv) orelse return null;1734 _ = eatToken(it, .Keyword_callconv) orelse return null;
1735 _ = try expectToken(it, tree, .LParen);1735 _ = try expectToken(it, tree, .LParen);
1736 const expr_node = try expectNode(arena, it, tree, parseExpr, AstError{1736 const expr_node = try expectNode(arena, it, tree, parseExpr, .{
1737 .ExpectedExpr = AstError.ExpectedExpr{ .token = it.index },1737 .ExpectedExpr = .{ .token = it.index },
1738 });1738 });
1739 _ = try expectToken(it, tree, .RParen);1739 _ = try expectToken(it, tree, .RParen);
1740 return expr_node;1740 return expr_node;
...@@ -1775,14 +1775,14 @@ fn parseParamDecl(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*Node {...@@ -1775,14 +1775,14 @@ fn parseParamDecl(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*Node {
1775 comptime_token == null and1775 comptime_token == null and
1776 name_token == null and1776 name_token == null and
1777 doc_comments == null) return null;1777 doc_comments == null) return null;
1778 try tree.errors.push(AstError{1778 try tree.errors.push(.{
1779 .ExpectedParamType = AstError.ExpectedParamType{ .token = it.index },1779 .ExpectedParamType = .{ .token = it.index },
1780 });1780 });
1781 return error.ParseError;1781 return error.ParseError;
1782 };1782 };
17831783
1784 const param_decl = try arena.create(Node.ParamDecl);1784 const param_decl = try arena.create(Node.ParamDecl);
1785 param_decl.* = Node.ParamDecl{1785 param_decl.* = .{
1786 .doc_comments = doc_comments,1786 .doc_comments = doc_comments,
1787 .comptime_token = comptime_token,1787 .comptime_token = comptime_token,
1788 .noalias_token = noalias_token,1788 .noalias_token = noalias_token,
...@@ -1821,14 +1821,14 @@ const ParamType = union(enum) {...@@ -1821,14 +1821,14 @@ const ParamType = union(enum) {
1821fn parseIfPrefix(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*Node {1821fn parseIfPrefix(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*Node {
1822 const if_token = eatToken(it, .Keyword_if) orelse return null;1822 const if_token = eatToken(it, .Keyword_if) orelse return null;
1823 _ = try expectToken(it, tree, .LParen);1823 _ = try expectToken(it, tree, .LParen);
1824 const condition = try expectNode(arena, it, tree, parseExpr, AstError{1824 const condition = try expectNode(arena, it, tree, parseExpr, .{
1825 .ExpectedExpr = AstError.ExpectedExpr{ .token = it.index },1825 .ExpectedExpr = .{ .token = it.index },
1826 });1826 });
1827 _ = try expectToken(it, tree, .RParen);1827 _ = try expectToken(it, tree, .RParen);
1828 const payload = try parsePtrPayload(arena, it, tree);1828 const payload = try parsePtrPayload(arena, it, tree);
18291829
1830 const node = try arena.create(Node.If);1830 const node = try arena.create(Node.If);
1831 node.* = Node.If{1831 node.* = .{
1832 .if_token = if_token,1832 .if_token = if_token,
1833 .condition = condition,1833 .condition = condition,
1834 .payload = payload,1834 .payload = payload,
...@@ -1843,8 +1843,8 @@ fn parseWhilePrefix(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*Node...@@ -1843,8 +1843,8 @@ fn parseWhilePrefix(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*Node
1843 const while_token = eatToken(it, .Keyword_while) orelse return null;1843 const while_token = eatToken(it, .Keyword_while) orelse return null;
18441844
1845 _ = try expectToken(it, tree, .LParen);1845 _ = try expectToken(it, tree, .LParen);
1846 const condition = try expectNode(arena, it, tree, parseExpr, AstError{1846 const condition = try expectNode(arena, it, tree, parseExpr, .{
1847 .ExpectedExpr = AstError.ExpectedExpr{ .token = it.index },1847 .ExpectedExpr = .{ .token = it.index },
1848 });1848 });
1849 _ = try expectToken(it, tree, .RParen);1849 _ = try expectToken(it, tree, .RParen);
18501850
...@@ -1852,7 +1852,7 @@ fn parseWhilePrefix(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*Node...@@ -1852,7 +1852,7 @@ fn parseWhilePrefix(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*Node
1852 const continue_expr = try parseWhileContinueExpr(arena, it, tree);1852 const continue_expr = try parseWhileContinueExpr(arena, it, tree);
18531853
1854 const node = try arena.create(Node.While);1854 const node = try arena.create(Node.While);
1855 node.* = Node.While{1855 node.* = .{
1856 .label = null,1856 .label = null,
1857 .inline_token = null,1857 .inline_token = null,
1858 .while_token = while_token,1858 .while_token = while_token,
...@@ -1870,17 +1870,17 @@ fn parseForPrefix(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*Node {...@@ -1870,17 +1870,17 @@ fn parseForPrefix(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*Node {
1870 const for_token = eatToken(it, .Keyword_for) orelse return null;1870 const for_token = eatToken(it, .Keyword_for) orelse return null;
18711871
1872 _ = try expectToken(it, tree, .LParen);1872 _ = try expectToken(it, tree, .LParen);
1873 const array_expr = try expectNode(arena, it, tree, parseExpr, AstError{1873 const array_expr = try expectNode(arena, it, tree, parseExpr, .{
1874 .ExpectedExpr = AstError.ExpectedExpr{ .token = it.index },1874 .ExpectedExpr = .{ .token = it.index },
1875 });1875 });
1876 _ = try expectToken(it, tree, .RParen);1876 _ = try expectToken(it, tree, .RParen);
18771877
1878 const payload = try expectNode(arena, it, tree, parsePtrIndexPayload, AstError{1878 const payload = try expectNode(arena, it, tree, parsePtrIndexPayload, .{
1879 .ExpectedPayload = AstError.ExpectedPayload{ .token = it.index },1879 .ExpectedPayload = .{ .token = it.index },
1880 });1880 });
18811881
1882 const node = try arena.create(Node.For);1882 const node = try arena.create(Node.For);
1883 node.* = Node.For{1883 node.* = .{
1884 .label = null,1884 .label = null,
1885 .inline_token = null,1885 .inline_token = null,
1886 .for_token = for_token,1886 .for_token = for_token,
...@@ -1895,13 +1895,13 @@ fn parseForPrefix(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*Node {...@@ -1895,13 +1895,13 @@ fn parseForPrefix(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*Node {
1895/// Payload <- PIPE IDENTIFIER PIPE1895/// Payload <- PIPE IDENTIFIER PIPE
1896fn parsePayload(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*Node {1896fn parsePayload(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*Node {
1897 const lpipe = eatToken(it, .Pipe) orelse return null;1897 const lpipe = eatToken(it, .Pipe) orelse return null;
1898 const identifier = try expectNode(arena, it, tree, parseIdentifier, AstError{1898 const identifier = try expectNode(arena, it, tree, parseIdentifier, .{
1899 .ExpectedIdentifier = AstError.ExpectedIdentifier{ .token = it.index },1899 .ExpectedIdentifier = .{ .token = it.index },
1900 });1900 });
1901 const rpipe = try expectToken(it, tree, .Pipe);1901 const rpipe = try expectToken(it, tree, .Pipe);
19021902
1903 const node = try arena.create(Node.Payload);1903 const node = try arena.create(Node.Payload);
1904 node.* = Node.Payload{1904 node.* = .{
1905 .lpipe = lpipe,1905 .lpipe = lpipe,
1906 .error_symbol = identifier,1906 .error_symbol = identifier,
1907 .rpipe = rpipe,1907 .rpipe = rpipe,
...@@ -1913,13 +1913,13 @@ fn parsePayload(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*Node {...@@ -1913,13 +1913,13 @@ fn parsePayload(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*Node {
1913fn parsePtrPayload(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*Node {1913fn parsePtrPayload(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*Node {
1914 const lpipe = eatToken(it, .Pipe) orelse return null;1914 const lpipe = eatToken(it, .Pipe) orelse return null;
1915 const asterisk = eatToken(it, .Asterisk);1915 const asterisk = eatToken(it, .Asterisk);
1916 const identifier = try expectNode(arena, it, tree, parseIdentifier, AstError{1916 const identifier = try expectNode(arena, it, tree, parseIdentifier, .{
1917 .ExpectedIdentifier = AstError.ExpectedIdentifier{ .token = it.index },1917 .ExpectedIdentifier = .{ .token = it.index },
1918 });1918 });
1919 const rpipe = try expectToken(it, tree, .Pipe);1919 const rpipe = try expectToken(it, tree, .Pipe);
19201920
1921 const node = try arena.create(Node.PointerPayload);1921 const node = try arena.create(Node.PointerPayload);
1922 node.* = Node.PointerPayload{1922 node.* = .{
1923 .lpipe = lpipe,1923 .lpipe = lpipe,
1924 .ptr_token = asterisk,1924 .ptr_token = asterisk,
1925 .value_symbol = identifier,1925 .value_symbol = identifier,
...@@ -1932,21 +1932,21 @@ fn parsePtrPayload(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*Node {...@@ -1932,21 +1932,21 @@ fn parsePtrPayload(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*Node {
1932fn parsePtrIndexPayload(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*Node {1932fn parsePtrIndexPayload(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*Node {
1933 const lpipe = eatToken(it, .Pipe) orelse return null;1933 const lpipe = eatToken(it, .Pipe) orelse return null;
1934 const asterisk = eatToken(it, .Asterisk);1934 const asterisk = eatToken(it, .Asterisk);
1935 const identifier = try expectNode(arena, it, tree, parseIdentifier, AstError{1935 const identifier = try expectNode(arena, it, tree, parseIdentifier, .{
1936 .ExpectedIdentifier = AstError.ExpectedIdentifier{ .token = it.index },1936 .ExpectedIdentifier = .{ .token = it.index },
1937 });1937 });
19381938
1939 const index = if (eatToken(it, .Comma) == null)1939 const index = if (eatToken(it, .Comma) == null)
1940 null1940 null
1941 else1941 else
1942 try expectNode(arena, it, tree, parseIdentifier, AstError{1942 try expectNode(arena, it, tree, parseIdentifier, .{
1943 .ExpectedIdentifier = AstError.ExpectedIdentifier{ .token = it.index },1943 .ExpectedIdentifier = .{ .token = it.index },
1944 });1944 });
19451945
1946 const rpipe = try expectToken(it, tree, .Pipe);1946 const rpipe = try expectToken(it, tree, .Pipe);
19471947
1948 const node = try arena.create(Node.PointerIndexPayload);1948 const node = try arena.create(Node.PointerIndexPayload);
1949 node.* = Node.PointerIndexPayload{1949 node.* = .{
1950 .lpipe = lpipe,1950 .lpipe = lpipe,
1951 .ptr_token = asterisk,1951 .ptr_token = asterisk,
1952 .value_symbol = identifier,1952 .value_symbol = identifier,
...@@ -1961,8 +1961,8 @@ fn parseSwitchProng(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*Node...@@ -1961,8 +1961,8 @@ fn parseSwitchProng(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*Node
1961 const node = (try parseSwitchCase(arena, it, tree)) orelse return null;1961 const node = (try parseSwitchCase(arena, it, tree)) orelse return null;
1962 const arrow = try expectToken(it, tree, .EqualAngleBracketRight);1962 const arrow = try expectToken(it, tree, .EqualAngleBracketRight);
1963 const payload = try parsePtrPayload(arena, it, tree);1963 const payload = try parsePtrPayload(arena, it, tree);
1964 const expr = try expectNode(arena, it, tree, parseAssignExpr, AstError{1964 const expr = try expectNode(arena, it, tree, parseAssignExpr, .{
1965 .ExpectedExprOrAssignment = AstError.ExpectedExprOrAssignment{ .token = it.index },1965 .ExpectedExprOrAssignment = .{ .token = it.index },
1966 });1966 });
19671967
1968 const switch_case = node.cast(Node.SwitchCase).?;1968 const switch_case = node.cast(Node.SwitchCase).?;
...@@ -1987,14 +1987,14 @@ fn parseSwitchCase(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*Node {...@@ -1987,14 +1987,14 @@ fn parseSwitchCase(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*Node {
1987 }1987 }
1988 } else if (eatToken(it, .Keyword_else)) |else_token| {1988 } else if (eatToken(it, .Keyword_else)) |else_token| {
1989 const else_node = try arena.create(Node.SwitchElse);1989 const else_node = try arena.create(Node.SwitchElse);
1990 else_node.* = Node.SwitchElse{1990 else_node.* = .{
1991 .token = else_token,1991 .token = else_token,
1992 };1992 };
1993 try list.push(&else_node.base);1993 try list.push(&else_node.base);
1994 } else return null;1994 } else return null;
19951995
1996 const node = try arena.create(Node.SwitchCase);1996 const node = try arena.create(Node.SwitchCase);
1997 node.* = Node.SwitchCase{1997 node.* = .{
1998 .items = list,1998 .items = list,
1999 .arrow_token = undefined, // set by caller1999 .arrow_token = undefined, // set by caller
2000 .payload = null,2000 .payload = null,
...@@ -2007,15 +2007,15 @@ fn parseSwitchCase(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*Node {...@@ -2007,15 +2007,15 @@ fn parseSwitchCase(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*Node {
2007fn parseSwitchItem(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*Node {2007fn parseSwitchItem(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*Node {
2008 const expr = (try parseExpr(arena, it, tree)) orelse return null;2008 const expr = (try parseExpr(arena, it, tree)) orelse return null;
2009 if (eatToken(it, .Ellipsis3)) |token| {2009 if (eatToken(it, .Ellipsis3)) |token| {
2010 const range_end = try expectNode(arena, it, tree, parseExpr, AstError{2010 const range_end = try expectNode(arena, it, tree, parseExpr, .{
2011 .ExpectedExpr = AstError.ExpectedExpr{ .token = it.index },2011 .ExpectedExpr = .{ .token = it.index },
2012 });2012 });
20132013
2014 const node = try arena.create(Node.InfixOp);2014 const node = try arena.create(Node.InfixOp);
2015 node.* = Node.InfixOp{2015 node.* = .{
2016 .op_token = token,2016 .op_token = token,
2017 .lhs = expr,2017 .lhs = expr,
2018 .op = Node.InfixOp.Op{ .Range = {} },2018 .op = .Range,
2019 .rhs = range_end,2019 .rhs = range_end,
2020 };2020 };
2021 return &node.base;2021 return &node.base;
...@@ -2039,24 +2039,22 @@ fn parseSwitchItem(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*Node {...@@ -2039,24 +2039,22 @@ fn parseSwitchItem(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*Node {
2039/// / MINUSPERCENTEQUAL2039/// / MINUSPERCENTEQUAL
2040/// / EQUAL2040/// / EQUAL
2041fn parseAssignOp(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*Node {2041fn parseAssignOp(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*Node {
2042 const Op = Node.InfixOp.Op;
2043
2044 const token = nextToken(it);2042 const token = nextToken(it);
2045 const op = switch (token.ptr.id) {2043 const op: Node.InfixOp.Op = switch (token.ptr.id) {
2046 .AsteriskEqual => Op{ .AssignMul = {} },2044 .AsteriskEqual => .AssignMul,
2047 .SlashEqual => Op{ .AssignDiv = {} },2045 .SlashEqual => .AssignDiv,
2048 .PercentEqual => Op{ .AssignMod = {} },2046 .PercentEqual => .AssignMod,
2049 .PlusEqual => Op{ .AssignAdd = {} },2047 .PlusEqual => .AssignAdd,
2050 .MinusEqual => Op{ .AssignSub = {} },2048 .MinusEqual => .AssignSub,
2051 .AngleBracketAngleBracketLeftEqual => Op{ .AssignBitShiftLeft = {} },2049 .AngleBracketAngleBracketLeftEqual => .AssignBitShiftLeft,
2052 .AngleBracketAngleBracketRightEqual => Op{ .AssignBitShiftRight = {} },2050 .AngleBracketAngleBracketRightEqual => .AssignBitShiftRight,
2053 .AmpersandEqual => Op{ .AssignBitAnd = {} },2051 .AmpersandEqual => .AssignBitAnd,
2054 .CaretEqual => Op{ .AssignBitXor = {} },2052 .CaretEqual => .AssignBitXor,
2055 .PipeEqual => Op{ .AssignBitOr = {} },2053 .PipeEqual => .AssignBitOr,
2056 .AsteriskPercentEqual => Op{ .AssignMulWrap = {} },2054 .AsteriskPercentEqual => .AssignMulWrap,
2057 .PlusPercentEqual => Op{ .AssignAddWrap = {} },2055 .PlusPercentEqual => .AssignAddWrap,
2058 .MinusPercentEqual => Op{ .AssignSubWrap = {} },2056 .MinusPercentEqual => .AssignSubWrap,
2059 .Equal => Op{ .Assign = {} },2057 .Equal => .Assign,
2060 else => {2058 else => {
2061 putBackToken(it, token.index);2059 putBackToken(it, token.index);
2062 return null;2060 return null;
...@@ -2064,7 +2062,7 @@ fn parseAssignOp(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*Node {...@@ -2064,7 +2062,7 @@ fn parseAssignOp(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*Node {
2064 };2062 };
20652063
2066 const node = try arena.create(Node.InfixOp);2064 const node = try arena.create(Node.InfixOp);
2067 node.* = Node.InfixOp{2065 node.* = .{
2068 .op_token = token.index,2066 .op_token = token.index,
2069 .lhs = undefined, // set by caller2067 .lhs = undefined, // set by caller
2070 .op = op,2068 .op = op,
...@@ -2081,16 +2079,14 @@ fn parseAssignOp(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*Node {...@@ -2081,16 +2079,14 @@ fn parseAssignOp(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*Node {
2081/// / LARROWEQUAL2079/// / LARROWEQUAL
2082/// / RARROWEQUAL2080/// / RARROWEQUAL
2083fn parseCompareOp(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*Node {2081fn parseCompareOp(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*Node {
2084 const ops = Node.InfixOp.Op;
2085
2086 const token = nextToken(it);2082 const token = nextToken(it);
2087 const op = switch (token.ptr.id) {2083 const op: Node.InfixOp.Op = switch (token.ptr.id) {
2088 .EqualEqual => ops{ .EqualEqual = {} },2084 .EqualEqual => .EqualEqual,
2089 .BangEqual => ops{ .BangEqual = {} },2085 .BangEqual => .BangEqual,
2090 .AngleBracketLeft => ops{ .LessThan = {} },2086 .AngleBracketLeft => .LessThan,
2091 .AngleBracketRight => ops{ .GreaterThan = {} },2087 .AngleBracketRight => .GreaterThan,
2092 .AngleBracketLeftEqual => ops{ .LessOrEqual = {} },2088 .AngleBracketLeftEqual => .LessOrEqual,
2093 .AngleBracketRightEqual => ops{ .GreaterOrEqual = {} },2089 .AngleBracketRightEqual => .GreaterOrEqual,
2094 else => {2090 else => {
2095 putBackToken(it, token.index);2091 putBackToken(it, token.index);
2096 return null;2092 return null;
...@@ -2107,15 +2103,13 @@ fn parseCompareOp(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*Node {...@@ -2107,15 +2103,13 @@ fn parseCompareOp(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*Node {
2107/// / KEYWORD_orelse2103/// / KEYWORD_orelse
2108/// / KEYWORD_catch Payload?2104/// / KEYWORD_catch Payload?
2109fn parseBitwiseOp(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*Node {2105fn parseBitwiseOp(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*Node {
2110 const ops = Node.InfixOp.Op;
2111
2112 const token = nextToken(it);2106 const token = nextToken(it);
2113 const op = switch (token.ptr.id) {2107 const op: Node.InfixOp.Op = switch (token.ptr.id) {
2114 .Ampersand => ops{ .BitAnd = {} },2108 .Ampersand => .BitAnd,
2115 .Caret => ops{ .BitXor = {} },2109 .Caret => .BitXor,
2116 .Pipe => ops{ .BitOr = {} },2110 .Pipe => .BitOr,
2117 .Keyword_orelse => ops{ .UnwrapOptional = {} },2111 .Keyword_orelse => .UnwrapOptional,
2118 .Keyword_catch => ops{ .Catch = try parsePayload(arena, it, tree) },2112 .Keyword_catch => .{ .Catch = try parsePayload(arena, it, tree) },
2119 else => {2113 else => {
2120 putBackToken(it, token.index);2114 putBackToken(it, token.index);
2121 return null;2115 return null;
...@@ -2129,12 +2123,10 @@ fn parseBitwiseOp(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*Node {...@@ -2129,12 +2123,10 @@ fn parseBitwiseOp(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*Node {
2129/// <- LARROW22123/// <- LARROW2
2130/// / RARROW22124/// / RARROW2
2131fn parseBitShiftOp(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*Node {2125fn parseBitShiftOp(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*Node {
2132 const ops = Node.InfixOp.Op;
2133
2134 const token = nextToken(it);2126 const token = nextToken(it);
2135 const op = switch (token.ptr.id) {2127 const op: Node.InfixOp.Op = switch (token.ptr.id) {
2136 .AngleBracketAngleBracketLeft => ops{ .BitShiftLeft = {} },2128 .AngleBracketAngleBracketLeft => .BitShiftLeft,
2137 .AngleBracketAngleBracketRight => ops{ .BitShiftRight = {} },2129 .AngleBracketAngleBracketRight => .BitShiftRight,
2138 else => {2130 else => {
2139 putBackToken(it, token.index);2131 putBackToken(it, token.index);
2140 return null;2132 return null;
...@@ -2151,15 +2143,13 @@ fn parseBitShiftOp(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*Node {...@@ -2151,15 +2143,13 @@ fn parseBitShiftOp(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*Node {
2151/// / PLUSPERCENT2143/// / PLUSPERCENT
2152/// / MINUSPERCENT2144/// / MINUSPERCENT
2153fn parseAdditionOp(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*Node {2145fn parseAdditionOp(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*Node {
2154 const ops = Node.InfixOp.Op;
2155
2156 const token = nextToken(it);2146 const token = nextToken(it);
2157 const op = switch (token.ptr.id) {2147 const op: Node.InfixOp.Op = switch (token.ptr.id) {
2158 .Plus => ops{ .Add = {} },2148 .Plus => .Add,
2159 .Minus => ops{ .Sub = {} },2149 .Minus => .Sub,
2160 .PlusPlus => ops{ .ArrayCat = {} },2150 .PlusPlus => .ArrayCat,
2161 .PlusPercent => ops{ .AddWrap = {} },2151 .PlusPercent => .AddWrap,
2162 .MinusPercent => ops{ .SubWrap = {} },2152 .MinusPercent => .SubWrap,
2163 else => {2153 else => {
2164 putBackToken(it, token.index);2154 putBackToken(it, token.index);
2165 return null;2155 return null;
...@@ -2177,16 +2167,14 @@ fn parseAdditionOp(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*Node {...@@ -2177,16 +2167,14 @@ fn parseAdditionOp(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*Node {
2177/// / ASTERISK22167/// / ASTERISK2
2178/// / ASTERISKPERCENT2168/// / ASTERISKPERCENT
2179fn parseMultiplyOp(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*Node {2169fn parseMultiplyOp(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*Node {
2180 const ops = Node.InfixOp.Op;
2181
2182 const token = nextToken(it);2170 const token = nextToken(it);
2183 const op = switch (token.ptr.id) {2171 const op: Node.InfixOp.Op = switch (token.ptr.id) {
2184 .PipePipe => ops{ .MergeErrorSets = {} },2172 .PipePipe => .MergeErrorSets,
2185 .Asterisk => ops{ .Mul = {} },2173 .Asterisk => .Mul,
2186 .Slash => ops{ .Div = {} },2174 .Slash => .Div,
2187 .Percent => ops{ .Mod = {} },2175 .Percent => .Mod,
2188 .AsteriskAsterisk => ops{ .ArrayMult = {} },2176 .AsteriskAsterisk => .ArrayMult,
2189 .AsteriskPercent => ops{ .MulWrap = {} },2177 .AsteriskPercent => .MulWrap,
2190 else => {2178 else => {
2191 putBackToken(it, token.index);2179 putBackToken(it, token.index);
2192 return null;2180 return null;
...@@ -2205,17 +2193,15 @@ fn parseMultiplyOp(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*Node {...@@ -2205,17 +2193,15 @@ fn parseMultiplyOp(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*Node {
2205/// / KEYWORD_try2193/// / KEYWORD_try
2206/// / KEYWORD_await2194/// / KEYWORD_await
2207fn parsePrefixOp(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*Node {2195fn parsePrefixOp(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*Node {
2208 const ops = Node.PrefixOp.Op;
2209
2210 const token = nextToken(it);2196 const token = nextToken(it);
2211 const op = switch (token.ptr.id) {2197 const op: Node.PrefixOp.Op = switch (token.ptr.id) {
2212 .Bang => ops{ .BoolNot = {} },2198 .Bang => .BoolNot,
2213 .Minus => ops{ .Negation = {} },2199 .Minus => .Negation,
2214 .Tilde => ops{ .BitNot = {} },2200 .Tilde => .BitNot,
2215 .MinusPercent => ops{ .NegationWrap = {} },2201 .MinusPercent => .NegationWrap,
2216 .Ampersand => ops{ .AddressOf = {} },2202 .Ampersand => .AddressOf,
2217 .Keyword_try => ops{ .Try = {} },2203 .Keyword_try => .Try,
2218 .Keyword_await => ops{ .Await = .{} },2204 .Keyword_await => .Await,
2219 else => {2205 else => {
2220 putBackToken(it, token.index);2206 putBackToken(it, token.index);
2221 return null;2207 return null;
...@@ -2223,7 +2209,7 @@ fn parsePrefixOp(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*Node {...@@ -2223,7 +2209,7 @@ fn parsePrefixOp(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*Node {
2223 };2209 };
22242210
2225 const node = try arena.create(Node.PrefixOp);2211 const node = try arena.create(Node.PrefixOp);
2226 node.* = Node.PrefixOp{2212 node.* = .{
2227 .op_token = token.index,2213 .op_token = token.index,
2228 .op = op,2214 .op = op,
2229 .rhs = undefined, // set by caller2215 .rhs = undefined, // set by caller
...@@ -2246,9 +2232,9 @@ fn parsePrefixOp(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*Node {...@@ -2246,9 +2232,9 @@ fn parsePrefixOp(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*Node {
2246fn parsePrefixTypeOp(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*Node {2232fn parsePrefixTypeOp(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*Node {
2247 if (eatToken(it, .QuestionMark)) |token| {2233 if (eatToken(it, .QuestionMark)) |token| {
2248 const node = try arena.create(Node.PrefixOp);2234 const node = try arena.create(Node.PrefixOp);
2249 node.* = Node.PrefixOp{2235 node.* = .{
2250 .op_token = token,2236 .op_token = token,
2251 .op = Node.PrefixOp.Op.OptionalType,2237 .op = .OptionalType,
2252 .rhs = undefined, // set by caller2238 .rhs = undefined, // set by caller
2253 };2239 };
2254 return &node.base;2240 return &node.base;
...@@ -2264,7 +2250,7 @@ fn parsePrefixTypeOp(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*Node...@@ -2264,7 +2250,7 @@ fn parsePrefixTypeOp(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*Node
2264 return null;2250 return null;
2265 };2251 };
2266 const node = try arena.create(Node.AnyFrameType);2252 const node = try arena.create(Node.AnyFrameType);
2267 node.* = Node.AnyFrameType{2253 node.* = .{
2268 .anyframe_token = token,2254 .anyframe_token = token,
2269 .result = Node.AnyFrameType.Result{2255 .result = Node.AnyFrameType.Result{
2270 .arrow_token = arrow,2256 .arrow_token = arrow,
...@@ -2286,18 +2272,18 @@ fn parsePrefixTypeOp(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*Node...@@ -2286,18 +2272,18 @@ fn parsePrefixTypeOp(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*Node
2286 while (true) {2272 while (true) {
2287 if (eatToken(it, .Keyword_align)) |align_token| {2273 if (eatToken(it, .Keyword_align)) |align_token| {
2288 const lparen = try expectToken(it, tree, .LParen);2274 const lparen = try expectToken(it, tree, .LParen);
2289 const expr_node = try expectNode(arena, it, tree, parseExpr, AstError{2275 const expr_node = try expectNode(arena, it, tree, parseExpr, .{
2290 .ExpectedExpr = AstError.ExpectedExpr{ .token = it.index },2276 .ExpectedExpr = .{ .token = it.index },
2291 });2277 });
22922278
2293 // Optional bit range2279 // Optional bit range
2294 const bit_range = if (eatToken(it, .Colon)) |_| bit_range_value: {2280 const bit_range = if (eatToken(it, .Colon)) |_| bit_range_value: {
2295 const range_start = try expectNode(arena, it, tree, parseIntegerLiteral, AstError{2281 const range_start = try expectNode(arena, it, tree, parseIntegerLiteral, .{
2296 .ExpectedIntegerLiteral = AstError.ExpectedIntegerLiteral{ .token = it.index },2282 .ExpectedIntegerLiteral = .{ .token = it.index },
2297 });2283 });
2298 _ = try expectToken(it, tree, .Colon);2284 _ = try expectToken(it, tree, .Colon);
2299 const range_end = try expectNode(arena, it, tree, parseIntegerLiteral, AstError{2285 const range_end = try expectNode(arena, it, tree, parseIntegerLiteral, .{
2300 .ExpectedIntegerLiteral = AstError.ExpectedIntegerLiteral{ .token = it.index },2286 .ExpectedIntegerLiteral = .{ .token = it.index },
2301 });2287 });
23022288
2303 break :bit_range_value Node.PrefixOp.PtrInfo.Align.BitRange{2289 break :bit_range_value Node.PrefixOp.PtrInfo.Align.BitRange{
...@@ -2340,8 +2326,8 @@ fn parsePrefixTypeOp(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*Node...@@ -2340,8 +2326,8 @@ fn parsePrefixTypeOp(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*Node
2340 while (true) {2326 while (true) {
2341 if (try parseByteAlign(arena, it, tree)) |align_expr| {2327 if (try parseByteAlign(arena, it, tree)) |align_expr| {
2342 if (slice_type.align_info != null) {2328 if (slice_type.align_info != null) {
2343 try tree.errors.push(AstError{2329 try tree.errors.push(.{
2344 .ExtraAlignQualifier = AstError.ExtraAlignQualifier{ .token = it.index },2330 .ExtraAlignQualifier = .{ .token = it.index },
2345 });2331 });
2346 return error.ParseError;2332 return error.ParseError;
2347 }2333 }
...@@ -2353,8 +2339,8 @@ fn parsePrefixTypeOp(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*Node...@@ -2353,8 +2339,8 @@ fn parsePrefixTypeOp(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*Node
2353 }2339 }
2354 if (eatToken(it, .Keyword_const)) |const_token| {2340 if (eatToken(it, .Keyword_const)) |const_token| {
2355 if (slice_type.const_token != null) {2341 if (slice_type.const_token != null) {
2356 try tree.errors.push(AstError{2342 try tree.errors.push(.{
2357 .ExtraConstQualifier = AstError.ExtraConstQualifier{ .token = it.index },2343 .ExtraConstQualifier = .{ .token = it.index },
2358 });2344 });
2359 return error.ParseError;2345 return error.ParseError;
2360 }2346 }
...@@ -2363,8 +2349,8 @@ fn parsePrefixTypeOp(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*Node...@@ -2363,8 +2349,8 @@ fn parsePrefixTypeOp(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*Node
2363 }2349 }
2364 if (eatToken(it, .Keyword_volatile)) |volatile_token| {2350 if (eatToken(it, .Keyword_volatile)) |volatile_token| {
2365 if (slice_type.volatile_token != null) {2351 if (slice_type.volatile_token != null) {
2366 try tree.errors.push(AstError{2352 try tree.errors.push(.{
2367 .ExtraVolatileQualifier = AstError.ExtraVolatileQualifier{ .token = it.index },2353 .ExtraVolatileQualifier = .{ .token = it.index },
2368 });2354 });
2369 return error.ParseError;2355 return error.ParseError;
2370 }2356 }
...@@ -2373,8 +2359,8 @@ fn parsePrefixTypeOp(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*Node...@@ -2373,8 +2359,8 @@ fn parsePrefixTypeOp(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*Node
2373 }2359 }
2374 if (eatToken(it, .Keyword_allowzero)) |allowzero_token| {2360 if (eatToken(it, .Keyword_allowzero)) |allowzero_token| {
2375 if (slice_type.allowzero_token != null) {2361 if (slice_type.allowzero_token != null) {
2376 try tree.errors.push(AstError{2362 try tree.errors.push(.{
2377 .ExtraAllowZeroQualifier = AstError.ExtraAllowZeroQualifier{ .token = it.index },2363 .ExtraAllowZeroQualifier = .{ .token = it.index },
2378 });2364 });
2379 return error.ParseError;2365 return error.ParseError;
2380 }2366 }
...@@ -2398,15 +2384,14 @@ fn parsePrefixTypeOp(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*Node...@@ -2398,15 +2384,14 @@ fn parsePrefixTypeOp(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*Node
2398/// / DOTASTERISK2384/// / DOTASTERISK
2399/// / DOTQUESTIONMARK2385/// / DOTQUESTIONMARK
2400fn parseSuffixOp(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*Node {2386fn parseSuffixOp(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*Node {
2401 const Op = Node.SuffixOp.Op;
2402 const OpAndToken = struct {2387 const OpAndToken = struct {
2403 op: Node.SuffixOp.Op,2388 op: Node.SuffixOp.Op,
2404 token: TokenIndex,2389 token: TokenIndex,
2405 };2390 };
2406 const op_and_token = blk: {2391 const op_and_token: OpAndToken = blk: {
2407 if (eatToken(it, .LBracket)) |_| {2392 if (eatToken(it, .LBracket)) |_| {
2408 const index_expr = try expectNode(arena, it, tree, parseExpr, AstError{2393 const index_expr = try expectNode(arena, it, tree, parseExpr, .{
2409 .ExpectedExpr = AstError.ExpectedExpr{ .token = it.index },2394 .ExpectedExpr = .{ .token = it.index },
2410 });2395 });
24112396
2412 if (eatToken(it, .Ellipsis2) != null) {2397 if (eatToken(it, .Ellipsis2) != null) {
...@@ -2415,9 +2400,9 @@ fn parseSuffixOp(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*Node {...@@ -2415,9 +2400,9 @@ fn parseSuffixOp(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*Node {
2415 try parseExpr(arena, it, tree)2400 try parseExpr(arena, it, tree)
2416 else2401 else
2417 null;2402 null;
2418 break :blk OpAndToken{2403 break :blk .{
2419 .op = Op{2404 .op = .{
2420 .Slice = Op.Slice{2405 .Slice = .{
2421 .start = index_expr,2406 .start = index_expr,
2422 .end = end_expr,2407 .end = end_expr,
2423 .sentinel = sentinel,2408 .sentinel = sentinel,
...@@ -2427,14 +2412,14 @@ fn parseSuffixOp(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*Node {...@@ -2427,14 +2412,14 @@ fn parseSuffixOp(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*Node {
2427 };2412 };
2428 }2413 }
24292414
2430 break :blk OpAndToken{2415 break :blk .{
2431 .op = Op{ .ArrayAccess = index_expr },2416 .op = .{ .ArrayAccess = index_expr },
2432 .token = try expectToken(it, tree, .RBracket),2417 .token = try expectToken(it, tree, .RBracket),
2433 };2418 };
2434 }2419 }
24352420
2436 if (eatToken(it, .PeriodAsterisk)) |period_asterisk| {2421 if (eatToken(it, .PeriodAsterisk)) |period_asterisk| {
2437 break :blk OpAndToken{ .op = Op{ .Deref = {} }, .token = period_asterisk };2422 break :blk .{ .op = .Deref, .token = period_asterisk };
2438 }2423 }
24392424
2440 if (eatToken(it, .Period)) |period| {2425 if (eatToken(it, .Period)) |period| {
...@@ -2443,19 +2428,19 @@ fn parseSuffixOp(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*Node {...@@ -2443,19 +2428,19 @@ fn parseSuffixOp(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*Node {
2443 // Should there be an ast.Node.SuffixOp.FieldAccess variant? Or should2428 // Should there be an ast.Node.SuffixOp.FieldAccess variant? Or should
2444 // this grammar rule be altered?2429 // this grammar rule be altered?
2445 const node = try arena.create(Node.InfixOp);2430 const node = try arena.create(Node.InfixOp);
2446 node.* = Node.InfixOp{2431 node.* = .{
2447 .op_token = period,2432 .op_token = period,
2448 .lhs = undefined, // set by caller2433 .lhs = undefined, // set by caller
2449 .op = Node.InfixOp.Op.Period,2434 .op = .Period,
2450 .rhs = identifier,2435 .rhs = identifier,
2451 };2436 };
2452 return &node.base;2437 return &node.base;
2453 }2438 }
2454 if (eatToken(it, .QuestionMark)) |question_mark| {2439 if (eatToken(it, .QuestionMark)) |question_mark| {
2455 break :blk OpAndToken{ .op = Op{ .UnwrapOptional = {} }, .token = question_mark };2440 break :blk .{ .op = .UnwrapOptional, .token = question_mark };
2456 }2441 }
2457 try tree.errors.push(AstError{2442 try tree.errors.push(.{
2458 .ExpectedSuffixOp = AstError.ExpectedSuffixOp{ .token = it.index },2443 .ExpectedSuffixOp = .{ .token = it.index },
2459 });2444 });
2460 return null;2445 return null;
2461 }2446 }
...@@ -2464,7 +2449,7 @@ fn parseSuffixOp(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*Node {...@@ -2464,7 +2449,7 @@ fn parseSuffixOp(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*Node {
2464 };2449 };
24652450
2466 const node = try arena.create(Node.SuffixOp);2451 const node = try arena.create(Node.SuffixOp);
2467 node.* = Node.SuffixOp{2452 node.* = .{
2468 .lhs = undefined, // set by caller2453 .lhs = undefined, // set by caller
2469 .op = op_and_token.op,2454 .op = op_and_token.op,
2470 .rtoken = op_and_token.token,2455 .rtoken = op_and_token.token,
...@@ -2491,22 +2476,22 @@ fn parseArrayTypeStart(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*No...@@ -2491,22 +2476,22 @@ fn parseArrayTypeStart(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*No
2491 const lbracket = eatToken(it, .LBracket) orelse return null;2476 const lbracket = eatToken(it, .LBracket) orelse return null;
2492 const expr = try parseExpr(arena, it, tree);2477 const expr = try parseExpr(arena, it, tree);
2493 const sentinel = if (eatToken(it, .Colon)) |_|2478 const sentinel = if (eatToken(it, .Colon)) |_|
2494 try expectNode(arena, it, tree, parseExpr, AstError{2479 try expectNode(arena, it, tree, parseExpr, .{
2495 .ExpectedExpr = .{ .token = it.index },2480 .ExpectedExpr = .{ .token = it.index },
2496 })2481 })
2497 else2482 else
2498 null;2483 null;
2499 const rbracket = try expectToken(it, tree, .RBracket);2484 const rbracket = try expectToken(it, tree, .RBracket);
25002485
2501 const op = if (expr) |len_expr|2486 const op: Node.PrefixOp.Op = if (expr) |len_expr|
2502 Node.PrefixOp.Op{2487 .{
2503 .ArrayType = .{2488 .ArrayType = .{
2504 .len_expr = len_expr,2489 .len_expr = len_expr,
2505 .sentinel = sentinel,2490 .sentinel = sentinel,
2506 },2491 },
2507 }2492 }
2508 else2493 else
2509 Node.PrefixOp.Op{2494 .{
2510 .SliceType = Node.PrefixOp.PtrInfo{2495 .SliceType = Node.PrefixOp.PtrInfo{
2511 .allowzero_token = null,2496 .allowzero_token = null,
2512 .align_info = null,2497 .align_info = null,
...@@ -2517,7 +2502,7 @@ fn parseArrayTypeStart(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*No...@@ -2517,7 +2502,7 @@ fn parseArrayTypeStart(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*No
2517 };2502 };
25182503
2519 const node = try arena.create(Node.PrefixOp);2504 const node = try arena.create(Node.PrefixOp);
2520 node.* = Node.PrefixOp{2505 node.* = .{
2521 .op_token = lbracket,2506 .op_token = lbracket,
2522 .op = op,2507 .op = op,
2523 .rhs = undefined, // set by caller2508 .rhs = undefined, // set by caller
...@@ -2533,7 +2518,7 @@ fn parseArrayTypeStart(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*No...@@ -2533,7 +2518,7 @@ fn parseArrayTypeStart(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*No
2533fn parsePtrTypeStart(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*Node {2518fn parsePtrTypeStart(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*Node {
2534 if (eatToken(it, .Asterisk)) |asterisk| {2519 if (eatToken(it, .Asterisk)) |asterisk| {
2535 const sentinel = if (eatToken(it, .Colon)) |_|2520 const sentinel = if (eatToken(it, .Colon)) |_|
2536 try expectNode(arena, it, tree, parseExpr, AstError{2521 try expectNode(arena, it, tree, parseExpr, .{
2537 .ExpectedExpr = .{ .token = it.index },2522 .ExpectedExpr = .{ .token = it.index },
2538 })2523 })
2539 else2524 else
...@@ -2549,17 +2534,17 @@ fn parsePtrTypeStart(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*Node...@@ -2549,17 +2534,17 @@ fn parsePtrTypeStart(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*Node
25492534
2550 if (eatToken(it, .AsteriskAsterisk)) |double_asterisk| {2535 if (eatToken(it, .AsteriskAsterisk)) |double_asterisk| {
2551 const node = try arena.create(Node.PrefixOp);2536 const node = try arena.create(Node.PrefixOp);
2552 node.* = Node.PrefixOp{2537 node.* = .{
2553 .op_token = double_asterisk,2538 .op_token = double_asterisk,
2554 .op = Node.PrefixOp.Op{ .PtrType = .{} },2539 .op = .{ .PtrType = .{} },
2555 .rhs = undefined, // set by caller2540 .rhs = undefined, // set by caller
2556 };2541 };
25572542
2558 // Special case for **, which is its own token2543 // Special case for **, which is its own token
2559 const child = try arena.create(Node.PrefixOp);2544 const child = try arena.create(Node.PrefixOp);
2560 child.* = Node.PrefixOp{2545 child.* = .{
2561 .op_token = double_asterisk,2546 .op_token = double_asterisk,
2562 .op = Node.PrefixOp.Op{ .PtrType = .{} },2547 .op = .{ .PtrType = .{} },
2563 .rhs = undefined, // set by caller2548 .rhs = undefined, // set by caller
2564 };2549 };
2565 node.rhs = &child.base;2550 node.rhs = &child.base;
...@@ -2586,7 +2571,7 @@ fn parsePtrTypeStart(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*Node...@@ -2586,7 +2571,7 @@ fn parsePtrTypeStart(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*Node
2586 }2571 }
2587 }2572 }
2588 const sentinel = if (eatToken(it, .Colon)) |_|2573 const sentinel = if (eatToken(it, .Colon)) |_|
2589 try expectNode(arena, it, tree, parseExpr, AstError{2574 try expectNode(arena, it, tree, parseExpr, .{
2590 .ExpectedExpr = .{ .token = it.index },2575 .ExpectedExpr = .{ .token = it.index },
2591 })2576 })
2592 else2577 else
...@@ -2629,8 +2614,8 @@ fn parseContainerDeclType(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?...@@ -2629,8 +2614,8 @@ fn parseContainerDeclType(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?
2629 .Keyword_struct => Node.ContainerDecl.InitArg{ .None = {} },2614 .Keyword_struct => Node.ContainerDecl.InitArg{ .None = {} },
2630 .Keyword_enum => blk: {2615 .Keyword_enum => blk: {
2631 if (eatToken(it, .LParen) != null) {2616 if (eatToken(it, .LParen) != null) {
2632 const expr = try expectNode(arena, it, tree, parseExpr, AstError{2617 const expr = try expectNode(arena, it, tree, parseExpr, .{
2633 .ExpectedExpr = AstError.ExpectedExpr{ .token = it.index },2618 .ExpectedExpr = .{ .token = it.index },
2634 });2619 });
2635 _ = try expectToken(it, tree, .RParen);2620 _ = try expectToken(it, tree, .RParen);
2636 break :blk Node.ContainerDecl.InitArg{ .Type = expr };2621 break :blk Node.ContainerDecl.InitArg{ .Type = expr };
...@@ -2641,8 +2626,8 @@ fn parseContainerDeclType(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?...@@ -2641,8 +2626,8 @@ fn parseContainerDeclType(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?
2641 if (eatToken(it, .LParen) != null) {2626 if (eatToken(it, .LParen) != null) {
2642 if (eatToken(it, .Keyword_enum) != null) {2627 if (eatToken(it, .Keyword_enum) != null) {
2643 if (eatToken(it, .LParen) != null) {2628 if (eatToken(it, .LParen) != null) {
2644 const expr = try expectNode(arena, it, tree, parseExpr, AstError{2629 const expr = try expectNode(arena, it, tree, parseExpr, .{
2645 .ExpectedExpr = AstError.ExpectedExpr{ .token = it.index },2630 .ExpectedExpr = .{ .token = it.index },
2646 });2631 });
2647 _ = try expectToken(it, tree, .RParen);2632 _ = try expectToken(it, tree, .RParen);
2648 _ = try expectToken(it, tree, .RParen);2633 _ = try expectToken(it, tree, .RParen);
...@@ -2651,8 +2636,8 @@ fn parseContainerDeclType(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?...@@ -2651,8 +2636,8 @@ fn parseContainerDeclType(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?
2651 _ = try expectToken(it, tree, .RParen);2636 _ = try expectToken(it, tree, .RParen);
2652 break :blk Node.ContainerDecl.InitArg{ .Enum = null };2637 break :blk Node.ContainerDecl.InitArg{ .Enum = null };
2653 }2638 }
2654 const expr = try expectNode(arena, it, tree, parseExpr, AstError{2639 const expr = try expectNode(arena, it, tree, parseExpr, .{
2655 .ExpectedExpr = AstError.ExpectedExpr{ .token = it.index },2640 .ExpectedExpr = .{ .token = it.index },
2656 });2641 });
2657 _ = try expectToken(it, tree, .RParen);2642 _ = try expectToken(it, tree, .RParen);
2658 break :blk Node.ContainerDecl.InitArg{ .Type = expr };2643 break :blk Node.ContainerDecl.InitArg{ .Type = expr };
...@@ -2666,7 +2651,7 @@ fn parseContainerDeclType(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?...@@ -2666,7 +2651,7 @@ fn parseContainerDeclType(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?
2666 };2651 };
26672652
2668 const node = try arena.create(Node.ContainerDecl);2653 const node = try arena.create(Node.ContainerDecl);
2669 node.* = Node.ContainerDecl{2654 node.* = .{
2670 .layout_token = null,2655 .layout_token = null,
2671 .kind_token = kind_token.index,2656 .kind_token = kind_token.index,
2672 .init_arg_expr = init_arg_expr,2657 .init_arg_expr = init_arg_expr,
...@@ -2681,8 +2666,8 @@ fn parseContainerDeclType(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?...@@ -2681,8 +2666,8 @@ fn parseContainerDeclType(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?
2681fn parseByteAlign(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*Node {2666fn parseByteAlign(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*Node {
2682 _ = eatToken(it, .Keyword_align) orelse return null;2667 _ = eatToken(it, .Keyword_align) orelse return null;
2683 _ = try expectToken(it, tree, .LParen);2668 _ = try expectToken(it, tree, .LParen);
2684 const expr = try expectNode(arena, it, tree, parseExpr, AstError{2669 const expr = try expectNode(arena, it, tree, parseExpr, .{
2685 .ExpectedExpr = AstError.ExpectedExpr{ .token = it.index },2670 .ExpectedExpr = .{ .token = it.index },
2686 });2671 });
2687 _ = try expectToken(it, tree, .RParen);2672 _ = try expectToken(it, tree, .RParen);
2688 return expr;2673 return expr;
...@@ -2738,7 +2723,7 @@ fn SimpleBinOpParseFn(comptime token: Token.Id, comptime op: Node.InfixOp.Op) No...@@ -2738,7 +2723,7 @@ fn SimpleBinOpParseFn(comptime token: Token.Id, comptime op: Node.InfixOp.Op) No
2738 pub fn parse(arena: *Allocator, it: *TokenIterator, tree: *Tree) Error!?*Node {2723 pub fn parse(arena: *Allocator, it: *TokenIterator, tree: *Tree) Error!?*Node {
2739 const op_token = eatToken(it, token) orelse return null;2724 const op_token = eatToken(it, token) orelse return null;
2740 const node = try arena.create(Node.InfixOp);2725 const node = try arena.create(Node.InfixOp);
2741 node.* = Node.InfixOp{2726 node.* = .{
2742 .op_token = op_token,2727 .op_token = op_token,
2743 .lhs = undefined, // set by caller2728 .lhs = undefined, // set by caller
2744 .op = op,2729 .op = op,
...@@ -2754,13 +2739,13 @@ fn SimpleBinOpParseFn(comptime token: Token.Id, comptime op: Node.InfixOp.Op) No...@@ -2754,13 +2739,13 @@ fn SimpleBinOpParseFn(comptime token: Token.Id, comptime op: Node.InfixOp.Op) No
2754fn parseBuiltinCall(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*Node {2739fn parseBuiltinCall(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*Node {
2755 const token = eatToken(it, .Builtin) orelse return null;2740 const token = eatToken(it, .Builtin) orelse return null;
2756 const params = (try parseFnCallArguments(arena, it, tree)) orelse {2741 const params = (try parseFnCallArguments(arena, it, tree)) orelse {
2757 try tree.errors.push(AstError{2742 try tree.errors.push(.{
2758 .ExpectedParamList = AstError.ExpectedParamList{ .token = it.index },2743 .ExpectedParamList = .{ .token = it.index },
2759 });2744 });
2760 return error.ParseError;2745 return error.ParseError;
2761 };2746 };
2762 const node = try arena.create(Node.BuiltinCall);2747 const node = try arena.create(Node.BuiltinCall);
2763 node.* = Node.BuiltinCall{2748 node.* = .{
2764 .builtin_token = token,2749 .builtin_token = token,
2765 .params = params.list,2750 .params = params.list,
2766 .rparen_token = params.rparen,2751 .rparen_token = params.rparen,
...@@ -2773,7 +2758,7 @@ fn parseErrorTag(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*Node {...@@ -2773,7 +2758,7 @@ fn parseErrorTag(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*Node {
2773 const token = eatToken(it, .Identifier) orelse return null;2758 const token = eatToken(it, .Identifier) orelse return null;
27742759
2775 const node = try arena.create(Node.ErrorTag);2760 const node = try arena.create(Node.ErrorTag);
2776 node.* = Node.ErrorTag{2761 node.* = .{
2777 .doc_comments = doc_comments,2762 .doc_comments = doc_comments,
2778 .name_token = token,2763 .name_token = token,
2779 };2764 };
...@@ -2783,7 +2768,7 @@ fn parseErrorTag(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*Node {...@@ -2783,7 +2768,7 @@ fn parseErrorTag(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*Node {
2783fn parseIdentifier(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*Node {2768fn parseIdentifier(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*Node {
2784 const token = eatToken(it, .Identifier) orelse return null;2769 const token = eatToken(it, .Identifier) orelse return null;
2785 const node = try arena.create(Node.Identifier);2770 const node = try arena.create(Node.Identifier);
2786 node.* = Node.Identifier{2771 node.* = .{
2787 .token = token,2772 .token = token,
2788 };2773 };
2789 return &node.base;2774 return &node.base;
...@@ -2792,7 +2777,7 @@ fn parseIdentifier(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*Node {...@@ -2792,7 +2777,7 @@ fn parseIdentifier(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*Node {
2792fn parseVarType(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*Node {2777fn parseVarType(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*Node {
2793 const token = eatToken(it, .Keyword_var) orelse return null;2778 const token = eatToken(it, .Keyword_var) orelse return null;
2794 const node = try arena.create(Node.VarType);2779 const node = try arena.create(Node.VarType);
2795 node.* = Node.VarType{2780 node.* = .{
2796 .token = token,2781 .token = token,
2797 };2782 };
2798 return &node.base;2783 return &node.base;
...@@ -2810,7 +2795,7 @@ fn createLiteral(arena: *Allocator, comptime T: type, token: TokenIndex) !*Node...@@ -2810,7 +2795,7 @@ fn createLiteral(arena: *Allocator, comptime T: type, token: TokenIndex) !*Node
2810fn parseStringLiteralSingle(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*Node {2795fn parseStringLiteralSingle(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*Node {
2811 if (eatToken(it, .StringLiteral)) |token| {2796 if (eatToken(it, .StringLiteral)) |token| {
2812 const node = try arena.create(Node.StringLiteral);2797 const node = try arena.create(Node.StringLiteral);
2813 node.* = Node.StringLiteral{2798 node.* = .{
2814 .token = token,2799 .token = token,
2815 };2800 };
2816 return &node.base;2801 return &node.base;
...@@ -2824,7 +2809,7 @@ fn parseStringLiteral(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*Nod...@@ -2824,7 +2809,7 @@ fn parseStringLiteral(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*Nod
28242809
2825 if (eatToken(it, .MultilineStringLiteralLine)) |first_line| {2810 if (eatToken(it, .MultilineStringLiteralLine)) |first_line| {
2826 const node = try arena.create(Node.MultilineStringLiteral);2811 const node = try arena.create(Node.MultilineStringLiteral);
2827 node.* = Node.MultilineStringLiteral{2812 node.* = .{
2828 .lines = Node.MultilineStringLiteral.LineList.init(arena),2813 .lines = Node.MultilineStringLiteral.LineList.init(arena),
2829 };2814 };
2830 try node.lines.push(first_line);2815 try node.lines.push(first_line);
...@@ -2840,7 +2825,7 @@ fn parseStringLiteral(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*Nod...@@ -2840,7 +2825,7 @@ fn parseStringLiteral(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*Nod
2840fn parseIntegerLiteral(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*Node {2825fn parseIntegerLiteral(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*Node {
2841 const token = eatToken(it, .IntegerLiteral) orelse return null;2826 const token = eatToken(it, .IntegerLiteral) orelse return null;
2842 const node = try arena.create(Node.IntegerLiteral);2827 const node = try arena.create(Node.IntegerLiteral);
2843 node.* = Node.IntegerLiteral{2828 node.* = .{
2844 .token = token,2829 .token = token,
2845 };2830 };
2846 return &node.base;2831 return &node.base;
...@@ -2849,7 +2834,7 @@ fn parseIntegerLiteral(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*No...@@ -2849,7 +2834,7 @@ fn parseIntegerLiteral(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*No
2849fn parseFloatLiteral(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*Node {2834fn parseFloatLiteral(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*Node {
2850 const token = eatToken(it, .FloatLiteral) orelse return null;2835 const token = eatToken(it, .FloatLiteral) orelse return null;
2851 const node = try arena.create(Node.FloatLiteral);2836 const node = try arena.create(Node.FloatLiteral);
2852 node.* = Node.FloatLiteral{2837 node.* = .{
2853 .token = token,2838 .token = token,
2854 };2839 };
2855 return &node.base;2840 return &node.base;
...@@ -2858,9 +2843,9 @@ fn parseFloatLiteral(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*Node...@@ -2858,9 +2843,9 @@ fn parseFloatLiteral(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*Node
2858fn parseTry(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*Node {2843fn parseTry(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*Node {
2859 const token = eatToken(it, .Keyword_try) orelse return null;2844 const token = eatToken(it, .Keyword_try) orelse return null;
2860 const node = try arena.create(Node.PrefixOp);2845 const node = try arena.create(Node.PrefixOp);
2861 node.* = Node.PrefixOp{2846 node.* = .{
2862 .op_token = token,2847 .op_token = token,
2863 .op = Node.PrefixOp.Op.Try,2848 .op = .Try,
2864 .rhs = undefined, // set by caller2849 .rhs = undefined, // set by caller
2865 };2850 };
2866 return &node.base;2851 return &node.base;
...@@ -2869,7 +2854,7 @@ fn parseTry(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*Node {...@@ -2869,7 +2854,7 @@ fn parseTry(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*Node {
2869fn parseUse(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*Node {2854fn parseUse(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*Node {
2870 const token = eatToken(it, .Keyword_usingnamespace) orelse return null;2855 const token = eatToken(it, .Keyword_usingnamespace) orelse return null;
2871 const node = try arena.create(Node.Use);2856 const node = try arena.create(Node.Use);
2872 node.* = Node.Use{2857 node.* = .{
2873 .doc_comments = null,2858 .doc_comments = null,
2874 .visib_token = null,2859 .visib_token = null,
2875 .use_token = token,2860 .use_token = token,
...@@ -2884,17 +2869,17 @@ fn parseIf(arena: *Allocator, it: *TokenIterator, tree: *Tree, bodyParseFn: Node...@@ -2884,17 +2869,17 @@ fn parseIf(arena: *Allocator, it: *TokenIterator, tree: *Tree, bodyParseFn: Node
2884 const node = (try parseIfPrefix(arena, it, tree)) orelse return null;2869 const node = (try parseIfPrefix(arena, it, tree)) orelse return null;
2885 const if_prefix = node.cast(Node.If).?;2870 const if_prefix = node.cast(Node.If).?;
28862871
2887 if_prefix.body = try expectNode(arena, it, tree, bodyParseFn, AstError{2872 if_prefix.body = try expectNode(arena, it, tree, bodyParseFn, .{
2888 .InvalidToken = AstError.InvalidToken{ .token = it.index },2873 .InvalidToken = .{ .token = it.index },
2889 });2874 });
28902875
2891 const else_token = eatToken(it, .Keyword_else) orelse return node;2876 const else_token = eatToken(it, .Keyword_else) orelse return node;
2892 const payload = try parsePayload(arena, it, tree);2877 const payload = try parsePayload(arena, it, tree);
2893 const else_expr = try expectNode(arena, it, tree, bodyParseFn, AstError{2878 const else_expr = try expectNode(arena, it, tree, bodyParseFn, .{
2894 .InvalidToken = AstError.InvalidToken{ .token = it.index },2879 .InvalidToken = .{ .token = it.index },
2895 });2880 });
2896 const else_node = try arena.create(Node.Else);2881 const else_node = try arena.create(Node.Else);
2897 else_node.* = Node.Else{2882 else_node.* = .{
2898 .else_token = else_token,2883 .else_token = else_token,
2899 .payload = payload,2884 .payload = payload,
2900 .body = else_expr,2885 .body = else_expr,
...@@ -2914,7 +2899,7 @@ fn parseDocComment(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*Node.D...@@ -2914,7 +2899,7 @@ fn parseDocComment(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*Node.D
2914 if (lines.len == 0) return null;2899 if (lines.len == 0) return null;
29152900
2916 const node = try arena.create(Node.DocComment);2901 const node = try arena.create(Node.DocComment);
2917 node.* = Node.DocComment{2902 node.* = .{
2918 .lines = lines,2903 .lines = lines,
2919 };2904 };
2920 return node;2905 return node;
...@@ -2925,7 +2910,7 @@ fn parseAppendedDocComment(arena: *Allocator, it: *TokenIterator, tree: *Tree, a...@@ -2925,7 +2910,7 @@ fn parseAppendedDocComment(arena: *Allocator, it: *TokenIterator, tree: *Tree, a
2925 const comment_token = eatToken(it, .DocComment) orelse return null;2910 const comment_token = eatToken(it, .DocComment) orelse return null;
2926 if (tree.tokensOnSameLine(after_token, comment_token)) {2911 if (tree.tokensOnSameLine(after_token, comment_token)) {
2927 const node = try arena.create(Node.DocComment);2912 const node = try arena.create(Node.DocComment);
2928 node.* = Node.DocComment{2913 node.* = .{
2929 .lines = Node.DocComment.LineList.init(arena),2914 .lines = Node.DocComment.LineList.init(arena),
2930 };2915 };
2931 try node.lines.push(comment_token);2916 try node.lines.push(comment_token);
...@@ -2974,14 +2959,14 @@ fn parsePrefixOpExpr(...@@ -2974,14 +2959,14 @@ fn parsePrefixOpExpr(
2974 switch (rightmost_op.id) {2959 switch (rightmost_op.id) {
2975 .PrefixOp => {2960 .PrefixOp => {
2976 const prefix_op = rightmost_op.cast(Node.PrefixOp).?;2961 const prefix_op = rightmost_op.cast(Node.PrefixOp).?;
2977 prefix_op.rhs = try expectNode(arena, it, tree, childParseFn, AstError{2962 prefix_op.rhs = try expectNode(arena, it, tree, childParseFn, .{
2978 .InvalidToken = AstError.InvalidToken{ .token = it.index },2963 .InvalidToken = .{ .token = it.index },
2979 });2964 });
2980 },2965 },
2981 .AnyFrameType => {2966 .AnyFrameType => {
2982 const prom = rightmost_op.cast(Node.AnyFrameType).?;2967 const prom = rightmost_op.cast(Node.AnyFrameType).?;
2983 prom.result.?.return_type = try expectNode(arena, it, tree, childParseFn, AstError{2968 prom.result.?.return_type = try expectNode(arena, it, tree, childParseFn, .{
2984 .InvalidToken = AstError.InvalidToken{ .token = it.index },2969 .InvalidToken = .{ .token = it.index },
2985 });2970 });
2986 },2971 },
2987 else => unreachable,2972 else => unreachable,
...@@ -3010,8 +2995,8 @@ fn parseBinOpExpr(...@@ -3010,8 +2995,8 @@ fn parseBinOpExpr(
3010 var res = (try childParseFn(arena, it, tree)) orelse return null;2995 var res = (try childParseFn(arena, it, tree)) orelse return null;
30112996
3012 while (try opParseFn(arena, it, tree)) |node| {2997 while (try opParseFn(arena, it, tree)) |node| {
3013 const right = try expectNode(arena, it, tree, childParseFn, AstError{2998 const right = try expectNode(arena, it, tree, childParseFn, .{
3014 .InvalidToken = AstError.InvalidToken{ .token = it.index },2999 .InvalidToken = .{ .token = it.index },
3015 });3000 });
3016 const left = res;3001 const left = res;
3017 res = node;3002 res = node;
...@@ -3031,7 +3016,7 @@ fn parseBinOpExpr(...@@ -3031,7 +3016,7 @@ fn parseBinOpExpr(
30313016
3032fn createInfixOp(arena: *Allocator, index: TokenIndex, op: Node.InfixOp.Op) !*Node {3017fn createInfixOp(arena: *Allocator, index: TokenIndex, op: Node.InfixOp.Op) !*Node {
3033 const node = try arena.create(Node.InfixOp);3018 const node = try arena.create(Node.InfixOp);
3034 node.* = Node.InfixOp{3019 node.* = .{
3035 .op_token = index,3020 .op_token = index,
3036 .lhs = undefined, // set by caller3021 .lhs = undefined, // set by caller
3037 .op = op,3022 .op = op,
...@@ -3051,8 +3036,8 @@ fn eatAnnotatedToken(it: *TokenIterator, id: Token.Id) ?AnnotatedToken {...@@ -3051,8 +3036,8 @@ fn eatAnnotatedToken(it: *TokenIterator, id: Token.Id) ?AnnotatedToken {
3051fn expectToken(it: *TokenIterator, tree: *Tree, id: Token.Id) Error!TokenIndex {3036fn expectToken(it: *TokenIterator, tree: *Tree, id: Token.Id) Error!TokenIndex {
3052 const token = nextToken(it);3037 const token = nextToken(it);
3053 if (token.ptr.id != id) {3038 if (token.ptr.id != id) {
3054 try tree.errors.push(AstError{3039 try tree.errors.push(.{
3055 .ExpectedToken = AstError.ExpectedToken{ .token = token.index, .expected_id = id },3040 .ExpectedToken = .{ .token = token.index, .expected_id = id },
3056 });3041 });
3057 return error.ParseError;3042 return error.ParseError;
3058 }3043 }