| ... | ... | @@ -78,7 +78,7 @@ fn parseRoot(arena: *Allocator, it: *TokenIterator, tree: *Tree) Allocator.Error |
| 78 | 78 | /// / KEYWORD_pub? ContainerField COMMA ContainerMembers |
| 79 | 79 | /// / KEYWORD_pub? ContainerField |
| 80 | 80 | /// / |
| 81 | | fn parseContainerMembers(arena: *Allocator, it: *TokenIterator, tree: *Tree) Allocator.Error!Node.Root.DeclList { |
| 81 | fn parseContainerMembers(arena: *Allocator, it: *TokenIterator, tree: *Tree) !Node.Root.DeclList { |
| 82 | 82 | var list = Node.Root.DeclList.init(arena); |
| 83 | 83 | |
| 84 | 84 | var field_state: union(enum) { |
| ... | ... | @@ -136,7 +136,7 @@ fn parseContainerMembers(arena: *Allocator, it: *TokenIterator, tree: *Tree) All |
| 136 | 136 | if (parseTopLevelDecl(arena, it, tree) catch |err| switch (err) { |
| 137 | 137 | error.OutOfMemory => return error.OutOfMemory, |
| 138 | 138 | error.ParseError => { |
| 139 | | // try again |
| 139 | findNextContainerMember(it); |
| 140 | 140 | continue; |
| 141 | 141 | }, |
| 142 | 142 | }) |node| { |
| ... | ... | @@ -324,7 +324,7 @@ fn findNextStmt(it: *TokenIterator) void { |
| 324 | 324 | } |
| 325 | 325 | |
| 326 | 326 | /// Eat a multiline container doc comment |
| 327 | | fn parseContainerDocComments(arena: *Allocator, it: *TokenIterator, tree: *Tree) Allocator.Error!?*Node { |
| 327 | fn parseContainerDocComments(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*Node { |
| 328 | 328 | var lines = Node.DocComment.LineList.init(arena); |
| 329 | 329 | while (eatToken(it, .ContainerDocComment)) |line| { |
| 330 | 330 | try lines.push(line); |
| ... | ... | @@ -384,7 +384,7 @@ fn parseTopLevelComptime(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?* |
| 384 | 384 | /// <- (KEYWORD_export / KEYWORD_extern STRINGLITERALSINGLE? / (KEYWORD_inline / KEYWORD_noinline))? FnProto (SEMICOLON / Block) |
| 385 | 385 | /// / (KEYWORD_export / KEYWORD_extern STRINGLITERALSINGLE?)? KEYWORD_threadlocal? VarDecl |
| 386 | 386 | /// / KEYWORD_usingnamespace Expr SEMICOLON |
| 387 | | fn parseTopLevelDecl(arena: *Allocator, it: *TokenIterator, tree: *Tree) Error!?*Node { |
| 387 | fn parseTopLevelDecl(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*Node { |
| 388 | 388 | var lib_name: ?*Node = null; |
| 389 | 389 | const extern_export_inline_token = blk: { |
| 390 | 390 | if (eatToken(it, .Keyword_export)) |token| break :blk token; |
| ... | ... | @@ -397,13 +397,7 @@ fn parseTopLevelDecl(arena: *Allocator, it: *TokenIterator, tree: *Tree) Error!? |
| 397 | 397 | break :blk null; |
| 398 | 398 | }; |
| 399 | 399 | |
| 400 | | if (parseFnProto(arena, it, tree) catch |err| switch (err) { |
| 401 | | error.OutOfMemory => return error.OutOfMemory, |
| 402 | | error.ParseError => { |
| 403 | | findNextContainerMember(it); |
| 404 | | return error.ParseError; |
| 405 | | }, |
| 406 | | }) |node| { |
| 400 | if (try parseFnProto(arena, it, tree)) |node| { |
| 407 | 401 | const fn_node = node.cast(Node.FnProto).?; |
| 408 | 402 | fn_node.*.extern_export_inline_token = extern_export_inline_token; |
| 409 | 403 | fn_node.*.lib_name = lib_name; |
| ... | ... | @@ -413,7 +407,7 @@ fn parseTopLevelDecl(arena: *Allocator, it: *TokenIterator, tree: *Tree) Error!? |
| 413 | 407 | // since parseBlock only return error.ParseError on |
| 414 | 408 | // a missing '}' we can assume this function was |
| 415 | 409 | // supposed to end here. |
| 416 | | error.ParseError => null, |
| 410 | error.ParseError => return node, |
| 417 | 411 | }) |body_node| { |
| 418 | 412 | fn_node.body_node = body_node; |
| 419 | 413 | return node; |
| ... | ... | @@ -437,14 +431,7 @@ fn parseTopLevelDecl(arena: *Allocator, it: *TokenIterator, tree: *Tree) Error!? |
| 437 | 431 | |
| 438 | 432 | const thread_local_token = eatToken(it, .Keyword_threadlocal); |
| 439 | 433 | |
| 440 | | if (parseVarDecl(arena, it, tree) catch |err| switch (err) { |
| 441 | | error.OutOfMemory => return error.OutOfMemory, |
| 442 | | error.ParseError => { |
| 443 | | // try to skip to next decl |
| 444 | | findNextContainerMember(it); |
| 445 | | return error.ParseError; |
| 446 | | }, |
| 447 | | }) |node| { |
| 434 | if (try parseVarDecl(arena, it, tree)) |node| { |
| 448 | 435 | var var_decl = node.cast(Node.VarDecl).?; |
| 449 | 436 | var_decl.*.thread_local_token = thread_local_token; |
| 450 | 437 | var_decl.*.comptime_token = null; |
| ... | ... | @@ -469,14 +456,7 @@ fn parseTopLevelDecl(arena: *Allocator, it: *TokenIterator, tree: *Tree) Error!? |
| 469 | 456 | return error.ParseError; |
| 470 | 457 | } |
| 471 | 458 | |
| 472 | | return parseUse(arena, it, tree) catch |err| switch (err) { |
| 473 | | error.OutOfMemory => return error.OutOfMemory, |
| 474 | | error.ParseError => { |
| 475 | | // try to skip to next decl |
| 476 | | findNextContainerMember(it); |
| 477 | | return error.ParseError; |
| 478 | | }, |
| 479 | | }; |
| 459 | return try parseUse(arena, it, tree); |
| 480 | 460 | } |
| 481 | 461 | |
| 482 | 462 | /// FnProto <- KEYWORD_fn IDENTIFIER? LPAREN ParamDeclList RPAREN ByteAlign? LinkSection? EXCLAMATIONMARK? (KEYWORD_var / TypeExpr) |
| ... | ... | @@ -2926,7 +2906,7 @@ fn ListParseFn(comptime L: type, comptime nodeParseFn: var) ParseFn(L) { |
| 2926 | 2906 | // this is likely just a missing comma, |
| 2927 | 2907 | // continue parsing this list and give an error |
| 2928 | 2908 | try tree.errors.push(.{ |
| 2929 | | .MissingComma = .{ .token = it.index }, |
| 2909 | .ExpectedToken = .{ .token = it.index, .expected_id = .Comma }, |
| 2930 | 2910 | }); |
| 2931 | 2911 | }, |
| 2932 | 2912 | } |