feature. See also
. The project being documented here (as the example) is the Zig library itself.
Translator.transForStmt
fn transForStmt(t: *Translator, scope: *Scope, for_stmt: Node.ForStmt) TransError!ZigNode
File
Code
fn transForStmt(t: *Translator, scope: *Scope, for_stmt: Node.ForStmt) TransError!ZigNode {
var loop_scope: Scope = .{
.parent = scope,
.id = .loop,
};
var block_scope: ?Scope.Block = null;
defer if (block_scope) |*bs| bs.deinit();
switch (for_stmt.init) {
.decls => |decls| {
block_scope = try Scope.Block.init(t, scope, false);
loop_scope.parent = &block_scope.?.base;
for (decls) |decl| {
try t.transDecl(&block_scope.?.base, decl);
}
},
.expr => |maybe_init| if (maybe_init) |init| {
block_scope = try Scope.Block.init(t, scope, false);
loop_scope.parent = &block_scope.?.base;
const init_node = try t.transStmt(&block_scope.?.base, init);
try loop_scope.appendNode(init_node);
},
}
var cond_scope: Scope.Condition = .{
.base = .{
.parent = &loop_scope,
.id = .condition,
},
};
defer cond_scope.deinit();
const cond = if (for_stmt.cond) |cond|
try t.transBoolExpr(&cond_scope.base, cond)
else
ZigTag.true_literal.init();
const cont_expr = if (for_stmt.incr) |incr|
try t.transExpr(&cond_scope.base, incr, .unused)
else
null;
const body = try t.maybeBlockify(&loop_scope, for_stmt.body);
const while_node = try ZigTag.@"while".create(t.arena, .{ .cond = cond, .body = body, .cont_expr = cont_expr });
if (block_scope) |*bs| {
try bs.statements.append(t.gpa, while_node);
return try bs.complete();
} else {
return while_node;
}
}