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