fix missing compile error on while/for missing block

This commit is contained in:
Vexu 2020-05-20 11:34:31 +03:00
parent 69ff89fd12
commit e07b467c7c
No known key found for this signature in database
GPG Key ID: 59AEB8936E16A6AC
3 changed files with 52 additions and 43 deletions

View File

@ -13,7 +13,6 @@ pub const Tree = struct {
token_ids: []const Token.Id,
token_locs: []const Token.Loc,
errors: []const Error,
/// undefined on parse error (when errors field is not empty)
root_node: *Node.Root,
arena: std.heap.ArenaAllocator.State,

View File

@ -878,8 +878,9 @@ const Parser = struct {
return node;
}
if (try p.parseAssignExpr()) |assign_expr| {
for_prefix.body = assign_expr;
for_prefix.body = try p.expectNode(parseAssignExpr, .{
.ExpectedBlockOrAssignment = .{ .token = p.tok_i },
});
if (p.eatToken(.Semicolon) != null) return node;
@ -905,9 +906,6 @@ const Parser = struct {
return node;
}
return null;
}
/// WhileStatement
/// <- WhilePrefix BlockExpr ( KEYWORD_else Payload? Statement )?
/// / WhilePrefix AssignExpr ( SEMICOLON / KEYWORD_else Payload? Statement )
@ -939,8 +937,10 @@ const Parser = struct {
return node;
}
if (try p.parseAssignExpr()) |assign_expr_node| {
while_prefix.body = assign_expr_node;
while_prefix.body = try p.expectNode(parseAssignExpr, .{
.ExpectedBlockOrAssignment = .{ .token = p.tok_i },
});
if (p.eatToken(.Semicolon) != null) return node;
@ -968,9 +968,6 @@ const Parser = struct {
return node;
}
return null;
}
/// BlockExprStatement
/// <- BlockExpr
/// / AssignExpr SEMICOLON

View File

@ -210,6 +210,19 @@ test "recovery: invalid comptime" {
});
}
test "recovery: missing block after for/while loops" {
try testError(
\\test "" { while (foo) }
, &[_]Error{
.ExpectedBlockOrAssignment,
});
try testError(
\\test "" { for (foo) |bar| }
, &[_]Error{
.ExpectedBlockOrAssignment,
});
}
test "zig fmt: if statment" {
try testCanonical(
\\test "" {