feature. See also
. The project being documented here (as the example) is the Zig library itself.
Translator.transArrayInit
fn transArrayInit(
t: *Translator,
scope: *Scope,
array_init: Node.ContainerInit,
used: ResultUsed,
) TransError!ZigNode
File
Code
fn transArrayInit(
t: *Translator,
scope: *Scope,
array_init: Node.ContainerInit,
used: ResultUsed,
) TransError!ZigNode {
assert(used == .used);
const array_item_qt = array_init.container_qt.childType(t.comp);
const array_item_type = try t.transType(scope, array_item_qt, array_init.l_brace_tok);
var maybe_lhs: ?ZigNode = null;
var val_list: std.ArrayList(ZigNode) = .empty;
defer val_list.deinit(t.gpa);
var i: usize = 0;
while (i < array_init.items.len) {
const rhs = switch (array_init.items[i].get(t.tree)) {
.array_filler_expr => |array_filler| blk: {
const node = try ZigTag.array_filler.create(t.arena, .{
.type = array_item_type,
.filler = try t.createZeroValueNode(array_item_qt, array_item_type, .no_as),
.count = @intCast(array_filler.count),
});
i += 1;
break :blk node;
},
else => blk: {
defer val_list.clearRetainingCapacity();
while (i < array_init.items.len) : (i += 1) {
if (array_init.items[i].get(t.tree) == .array_filler_expr) break;
const expr = try t.transExprCoercing(scope, array_init.items[i], .used);
try val_list.append(t.gpa, try t.toNonBool(expr, array_item_qt));
}
const array_type = try ZigTag.array_type.create(t.arena, .{
.elem_type = array_item_type,
.len = val_list.items.len,
});
const array_init_node = try ZigTag.array_init.create(t.arena, .{
.cond = array_type,
.cases = try t.arena.dupe(ZigNode, val_list.items),
});
break :blk array_init_node;
},
};
maybe_lhs = if (maybe_lhs) |lhs| blk: {
const cat = try ZigTag.array_cat.create(t.arena, .{
.lhs = lhs,
.rhs = rhs,
});
break :blk cat;
} else rhs;
}
return maybe_lhs orelse try ZigTag.container_init_dot.create(t.arena, &.{});
}