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 standard library.
std › zig › AstGen › assignDestructure Private Function assignDestructure Doc Source Private Function std.zig.AstGen.assignDestructure
fn assignDestructure (gz : *GenZir , scope : *Scope , node : Ast .Node .Index ) InnerError !void Params Errors File zig/AstGen.zig: 3367
3367
3368
3369
3370
3371
3372
3373
3374
3375
3376
3377
3378
3379
3380
3381
3382
3383
3384
3385
3386
3387
3388
3389
3390
3391
3392
3393
3394
3395
3396
3397
3398
3399
3400
3401
3402
3403
3404
3405
3406
3407
3408
3409
3410
3411
3412
3413
3414
3415 fn assignDestructure (gz : *GenZir , scope : *Scope , node : Ast .Node .Index ) InnerError !void {
try emitDbgNode (gz , node );
const astgen = gz .astgen ;
const tree = astgen .tree ;
const full = tree .assignDestructure (node );
if (full .comptime_token != null and gz .is_comptime ) {
return astgen .appendErrorTok (full .comptime_token .?, "redundant comptime keyword in already comptime scope" , .{});
}
// If this expression is marked comptime, we must wrap the whole thing in a comptime block.
var gz_buf : GenZir = undefined ;
const inner_gz = if (full .comptime_token ) |_ | bs : {
gz_buf = gz .makeSubBlock (scope );
gz_buf .is_comptime = true ;
break :bs &gz_buf ;
} else gz ;
defer if (full .comptime_token ) |_ | inner_gz .unstack ();
const rl_components = try astgen .arena .alloc (ResultInfo .Loc .DestructureComponent , full .ast .variables .len );
for (rl_components , full .ast .variables ) |*variable_rl , variable_node | {
if (tree .nodeTag (variable_node ) == .identifier ) {
// This intentionally does not support `@"_"` syntax.
const ident_name = tree .tokenSlice (tree .nodeMainToken (variable_node ));
if (mem .eql (u8 , ident_name , "_" )) {
variable_rl .* = .discard ;
continue ;
}
}
variable_rl .* = .{ .typed_ptr = .{
.inst = try lvalExpr (inner_gz , scope , variable_node ),
.src_node = variable_node ,
} };
}
const ri : ResultInfo = .{ .rl = .{ .destructure = .{
.src_node = node ,
.components = rl_components ,
} } };
_ = try expr (inner_gz , scope , ri , full .ast .value_expr );
if (full .comptime_token ) |_ | {
const comptime_block_inst = try gz .makeBlockInst (.block_comptime , node );
_ = try inner_gz .addBreak (.break_inline , comptime_block_inst , .void_value );
try inner_gz .setBlockComptimeBody (comptime_block_inst , .comptime_keyword );
try gz .instructions .append (gz .astgen .gpa , comptime_block_inst );
}
}
Handles destructure assignments where no LHS is a
constorvardecl.