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 › expectTopLevelDecl
expectTopLevelDecl
Parse.expectTopLevelDecl
fn expectTopLevelDecl (p : *Parse ) !?Node .Index
File
Code
fn expectTopLevelDecl (p : *Parse ) !?Node .Index {
const extern_export_inline_token = p .nextToken ();
var is_extern : bool = false ;
var expect_fn : bool = false ;
var expect_var_or_fn : bool = false ;
switch (p .tokenTag (extern_export_inline_token )) {
.keyword_extern => {
_ = p .eatToken (.string_literal );
is_extern = true ;
expect_var_or_fn = true ;
},
.keyword_export => expect_var_or_fn = true ,
.keyword_inline , .keyword_noinline => expect_fn = true ,
else => p .tok_i -= 1 ,
}
const opt_fn_proto = try p .parseFnProto ();
if (opt_fn_proto ) |fn_proto | {
switch (p .tokenTag (p .tok_i )) {
.semicolon => {
p .tok_i += 1 ;
return fn_proto ;
},
.l_brace => {
if (is_extern ) {
try p .warnMsg (.{ .tag = .extern_fn_body , .token = extern_export_inline_token });
return null ;
}
const fn_decl_index = try p .reserveNode (.fn_decl );
errdefer p .unreserveNode (fn_decl_index );
const body_block = try p .parseBlock ();
return p .setNode (fn_decl_index , .{
.tag = .fn_decl ,
.main_token = p .nodeMainToken (fn_proto ),
.data = .{ .node_and_node = .{
fn_proto ,
body_block .?,
} },
});
},
else => {
// a missing '}' we can assume this function was
// supposed to end here.
try p .warn (.expected_semi_or_lbrace );
return null ;
},
}
}
if (expect_fn ) {
try p .warn (.expected_fn );
return error .ParseError ;
}
const thread_local_token = p .eatToken (.keyword_threadlocal );
if (try p .parseGlobalVarDecl ()) |var_decl | return var_decl ;
if (thread_local_token != null ) {
return p .fail (.expected_var_decl );
}
if (expect_var_or_fn ) {
return p .fail (.expected_var_decl_or_fn );
}
return p .fail (.expected_pub_item );
}