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 › parseSwitchProng
parseSwitchProng
Parse.parseSwitchProng
fn parseSwitchProng (p : *Parse ) !?Node .Index
File
Code
fn parseSwitchProng (p : *Parse ) !?Node .Index {
const scratch_top = p .scratch .items .len ;
defer p .scratch .shrinkRetainingCapacity (scratch_top );
const is_inline = p .eatToken (.keyword_inline ) != null ;
if (p .eatToken (.keyword_else ) == null ) {
while (true ) {
const item = try p .parseSwitchItem () orelse break ;
try p .scratch .append (p .gpa , item );
if (p .eatToken (.comma ) == null ) break ;
}
if (scratch_top == p .scratch .items .len ) {
if (is_inline ) p .tok_i -= 1 ;
return null ;
}
}
const arrow_token = try p .expectToken (.equal_angle_bracket_right );
_ = try p .parsePtrIndexPayload ();
const items = p .scratch .items [scratch_top ..];
if (items .len <= 1 ) {
return try p .addNode (.{
.tag = if (is_inline ) .switch_case_inline_one else .switch_case_one ,
.main_token = arrow_token ,
.data = .{ .opt_node_and_node = .{
if (items .len >= 1 ) items [0 ].toOptional () else .none ,
try p .expectSingleAssignExpr (),
} },
});
} else {
return try p .addNode (.{
.tag = if (is_inline ) .switch_case_inline else .switch_case ,
.main_token = arrow_token ,
.data = .{ .extra_and_node = .{
try p .addExtra (try p .listToSpan (items )),
try p .expectSingleAssignExpr (),
} },
});
}
}