| ... | ... | @@ -130,7 +130,13 @@ fn parseContainerMembers(arena: *Allocator, it: *TokenIterator, tree: *Tree) All |
| 130 | 130 | |
| 131 | 131 | const visib_token = eatToken(it, .Keyword_pub); |
| 132 | 132 | |
| 133 | | if (try parseTopLevelDecl(arena, it, tree)) |node| { |
| 133 | if (parseTopLevelDecl(arena, it, tree) catch |err| switch (err) { |
| 134 | error.OutOfMemory => return error.OutOfMemory, |
| 135 | error.ParseError => { |
| 136 | // try again |
| 137 | continue; |
| 138 | }, |
| 139 | }) |node| { |
| 134 | 140 | if (field_state == .seen) { |
| 135 | 141 | field_state = .{ .end = visib_token orelse node.firstToken() }; |
| 136 | 142 | } |
| ... | ... | @@ -315,7 +321,7 @@ fn parseTopLevelComptime(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?* |
| 315 | 321 | /// <- (KEYWORD_export / KEYWORD_extern STRINGLITERALSINGLE? / (KEYWORD_inline / KEYWORD_noinline))? FnProto (SEMICOLON / Block) |
| 316 | 322 | /// / (KEYWORD_export / KEYWORD_extern STRINGLITERALSINGLE?)? KEYWORD_threadlocal? VarDecl |
| 317 | 323 | /// / KEYWORD_usingnamespace Expr SEMICOLON |
| 318 | | fn parseTopLevelDecl(arena: *Allocator, it: *TokenIterator, tree: *Tree) Allocator.Error!?*Node { |
| 324 | fn parseTopLevelDecl(arena: *Allocator, it: *TokenIterator, tree: *Tree) Error!?*Node { |
| 319 | 325 | var lib_name: ?*Node = null; |
| 320 | 326 | const extern_export_inline_token = blk: { |
| 321 | 327 | if (eatToken(it, .Keyword_export)) |token| break :blk token; |
| ... | ... | @@ -334,7 +340,7 @@ fn parseTopLevelDecl(arena: *Allocator, it: *TokenIterator, tree: *Tree) Allocat |
| 334 | 340 | // this fn will likely have a body so we |
| 335 | 341 | // use findEndOfBlock instead of findToken. |
| 336 | 342 | findEndOfBlock(it); |
| 337 | | return null; |
| 343 | return error.ParseError; |
| 338 | 344 | }, |
| 339 | 345 | }) |node| { |
| 340 | 346 | const fn_node = node.cast(Node.FnProto).?; |
| ... | ... | @@ -373,7 +379,7 @@ fn parseTopLevelDecl(arena: *Allocator, it: *TokenIterator, tree: *Tree) Allocat |
| 373 | 379 | error.ParseError => { |
| 374 | 380 | // try to skip to next decl |
| 375 | 381 | findToken(it, .Semicolon); |
| 376 | | return null; |
| 382 | return error.ParseError; |
| 377 | 383 | }, |
| 378 | 384 | }) |node| { |
| 379 | 385 | var var_decl = node.cast(Node.VarDecl).?; |
| ... | ... | @@ -388,8 +394,8 @@ fn parseTopLevelDecl(arena: *Allocator, it: *TokenIterator, tree: *Tree) Allocat |
| 388 | 394 | try tree.errors.push(.{ |
| 389 | 395 | .ExpectedVarDecl = .{ .token = it.index }, |
| 390 | 396 | }); |
| 391 | | // ignore this, try to find next decl by skipping the next block |
| 392 | | findEndOfBlock(it); |
| 397 | // ignore this and try again; |
| 398 | return error.ParseError; |
| 393 | 399 | } |
| 394 | 400 | |
| 395 | 401 | if (extern_export_inline_token) |token| { |
| ... | ... | @@ -404,7 +410,7 @@ fn parseTopLevelDecl(arena: *Allocator, it: *TokenIterator, tree: *Tree) Allocat |
| 404 | 410 | error.ParseError => { |
| 405 | 411 | // try to skip to next decl |
| 406 | 412 | findToken(it, .Semicolon); |
| 407 | | return null; |
| 413 | return error.ParseError; |
| 408 | 414 | }, |
| 409 | 415 | }; |
| 410 | 416 | } |