feature. See also
. The project being documented here (as the example) is the Zig library itself.
Parse.expectStatement
fn expectStatement(p: *Parse, is_block_level: bool) Error!Node.Index
File
Code
fn expectStatement(p: *Parse, is_block_level: bool) Error!Node.Index {
if (p.eatToken(.keyword_comptime)) |comptime_token| {
const opt_block_expr = try p.parseBlockExpr();
if (opt_block_expr) |block_expr| {
return p.addNode(.{
.tag = .@"comptime",
.main_token = comptime_token,
.data = .{ .node = block_expr },
});
}
if (is_block_level) {
return p.expectVarAssignStatement(comptime_token);
} else {
const assign = try p.expectAssignExpr();
try p.expectSemicolon(.expected_semi_after_stmt, true);
if (p.nodeTag(assign) != .assign_destructure) {
return p.addNode(.{
.tag = .@"comptime",
.main_token = comptime_token,
.data = .{ .node = assign },
});
} else {
return assign;
}
}
}
switch (p.tokenTag(p.tok_i)) {
.keyword_nosuspend => {
return p.addNode(.{
.tag = .@"nosuspend",
.main_token = p.nextToken(),
.data = .{ .node = try p.expectBlockExprStatement() },
});
},
.keyword_suspend => {
const token = p.nextToken();
const block_expr = try p.expectBlockExprStatement();
return p.addNode(.{
.tag = .@"suspend",
.main_token = token,
.data = .{ .node = block_expr },
});
},
.keyword_defer => if (is_block_level) return p.addNode(.{
.tag = .@"defer",
.main_token = p.nextToken(),
.data = .{ .node = try p.expectBlockExprStatement() },
}),
.keyword_errdefer => if (is_block_level) return p.addNode(.{
.tag = .@"errdefer",
.main_token = p.nextToken(),
.data = .{ .node = try p.expectBlockExprStatement() },
}),
.keyword_if => return p.expectIfStatement(),
.keyword_enum, .keyword_struct, .keyword_union => {
const identifier = p.tok_i + 1;
if (try p.parseCStyleContainer()) {
return p.addNode(.{
.tag = .identifier,
.main_token = identifier,
.data = undefined,
});
}
},
else => {},
}
if (try p.parseLabeledStatement()) |labeled_statement| return labeled_statement;
if (is_block_level) {
return p.expectVarAssignStatement(null);
} else {
const assign = try p.expectAssignExpr();
try p.expectSemicolon(.expected_semi_after_stmt, true);
return assign;
}
}