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