Zig 0.17.0-dev (Split by item)
This is an example of documentation generated by
ZigDoc , an alternative to Zig's built-in
Auto Doc feature. See also
examples in other modes/formats . The project being documented here (as the example) is the Zig library itself.
Zig › std/ › zig/ › Parse.zig › parseForStatement
parseForStatement
Parse.parseForStatement
fn parseForStatement (p : *Parse ) !?Node .Index
File
Code
fn parseForStatement (p : *Parse ) !?Node .Index {
const for_token = p .eatToken (.keyword_for ) orelse return null ;
const scratch_top = p .scratch .items .len ;
defer p .scratch .shrinkRetainingCapacity (scratch_top );
const inputs = try p .forPrefix ();
var else_required = false ;
var seen_semicolon = false ;
const then_expr = blk : {
const block_expr = try p .parseBlockExpr ();
if (block_expr ) |block | break :blk block ;
const assign_expr = try p .parseAssignExpr () orelse {
return p .fail (.expected_block_or_assignment );
};
if (p .eatToken (.semicolon )) |_ | {
seen_semicolon = true ;
break :blk assign_expr ;
}
else_required = true ;
break :blk assign_expr ;
};
var has_else = false ;
if (!seen_semicolon and p .eatToken (.keyword_else ) != null ) {
try p .scratch .append (p .gpa , then_expr );
const else_stmt = try p .expectStatement (false );
try p .scratch .append (p .gpa , else_stmt );
has_else = true ;
} else if (inputs == 1 ) {
if (else_required ) try p .warn (.expected_semi_or_else );
return try p .addNode (.{
.tag = .for_simple ,
.main_token = for_token ,
.data = .{ .node_and_node = .{
p .scratch .items [scratch_top ],
then_expr ,
} },
});
} else {
if (else_required ) try p .warn (.expected_semi_or_else );
try p .scratch .append (p .gpa , then_expr );
}
return try p .addNode (.{
.tag = .@"for" ,
.main_token = for_token ,
.data = .{ .@"for" = .{
(try p .listToSpan (p .scratch .items [scratch_top ..])).start ,
.{ .inputs = @intCast (inputs ), .has_else = has_else },
} },
});
}