diff options
| author | Vexu <git@vexu.eu> | 2020-05-14 00:16:56 +0300 |
|---|---|---|
| committer | Vexu <git@vexu.eu> | 2020-05-14 00:16:56 +0300 |
| commit | c3b76d091337ba60d2ccb3632b525e5a42d1f2c5 (patch) | |
| tree | dd57941c68786237721c2422c1a4a20680c21a73 /lib | |
| parent | 1f81887a7863545d8b89bff6cc7d31941da0abf0 (diff) | |
| download | zig-c3b76d091337ba60d2ccb3632b525e5a42d1f2c5.tar.gz zig-c3b76d091337ba60d2ccb3632b525e5a42d1f2c5.zip | |
recover from invalid builtin/async call
Diffstat (limited to 'lib')
| -rw-r--r-- | lib/std/zig/ast.zig | 1 | ||||
| -rw-r--r-- | lib/std/zig/parse.zig | 18 | ||||
| -rw-r--r-- | lib/std/zig/parser_test.zig | 9 |
3 files changed, 20 insertions, 8 deletions
diff --git a/lib/std/zig/ast.zig b/lib/std/zig/ast.zig index 26bff31bbd..6fb1ce012b 100644 --- a/lib/std/zig/ast.zig +++ b/lib/std/zig/ast.zig @@ -926,6 +926,7 @@ pub const Node = struct { if (i < 1) return node; i -= 1; }, + .Invalid => unreachable, } if (self.body_node) |body_node| { diff --git a/lib/std/zig/parse.zig b/lib/std/zig/parse.zig index cbd5336ca2..6c664bbda2 100644 --- a/lib/std/zig/parse.zig +++ b/lib/std/zig/parse.zig @@ -172,6 +172,7 @@ fn parseContainerMembers(arena: *Allocator, it: *TokenIterator, tree: *Tree) All .ExpectedPubItem = .{ .token = it.index }, }); // ignore this pub + continue; } if (parseContainerField(arena, it, tree) catch |err| switch (err) { @@ -1017,7 +1018,7 @@ fn parsePrimaryExpr(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*Node const node = try arena.create(Node.ControlFlowExpression); node.* = .{ .ltoken = token, - .kind = Node.ControlFlowExpression.Kind{ .Break = label }, + .kind = .{ .Break = label }, .rhs = expr_node, }; return &node.base; @@ -1053,7 +1054,7 @@ fn parsePrimaryExpr(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*Node const node = try arena.create(Node.ControlFlowExpression); node.* = .{ .ltoken = token, - .kind = Node.ControlFlowExpression.Kind{ .Continue = label }, + .kind = .{ .Continue = label }, .rhs = null, }; return &node.base; @@ -1077,7 +1078,7 @@ fn parsePrimaryExpr(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*Node const node = try arena.create(Node.ControlFlowExpression); node.* = .{ .ltoken = token, - .kind = Node.ControlFlowExpression.Kind.Return, + .kind = .Return, .rhs = expr_node, }; return &node.base; @@ -1322,7 +1323,8 @@ fn parseSuffixExpr(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*Node { try tree.errors.push(.{ .ExpectedParamList = .{ .token = it.index }, }); - return null; + // ignore this, continue parsing + return res; }; const node = try arena.create(Node.SuffixOp); node.* = .{ @@ -2908,7 +2910,13 @@ fn parseBuiltinCall(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*Node try tree.errors.push(.{ .ExpectedParamList = .{ .token = it.index }, }); - return error.ParseError; + + // lets pretend this was an identifier so we can continue parsing + const node = try arena.create(Node.Identifier); + node.* = .{ + .token = token, + }; + return &node.base; }; const node = try arena.create(Node.BuiltinCall); node.* = .{ diff --git a/lib/std/zig/parser_test.zig b/lib/std/zig/parser_test.zig index d837769802..34c61b6bb4 100644 --- a/lib/std/zig/parser_test.zig +++ b/lib/std/zig/parser_test.zig @@ -67,19 +67,22 @@ test "recovery: continue after invalid decl" { \\fn foo { \\ inline; \\} - \\test "" { - \\ a && b; + \\pub test "" { + \\ async a && b; \\} , &[_]Error{ .ExpectedToken, + .ExpectedPubItem, + .ExpectedParamList, .InvalidAnd, }); try testError( \\threadlocal test "" { - \\ a && b; + \\ @a && b; \\} , &[_]Error{ .ExpectedVarDecl, + .ExpectedParamList, .InvalidAnd, }); } |
