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