feature. See also
. The project being documented here (as the example) is the Zig library itself.
Translator.transUnionInit
fn transUnionInit(
t: *Translator,
scope: *Scope,
union_init: Node.UnionInit,
used: ResultUsed,
) TransError!ZigNode
File
Code
fn transUnionInit(
t: *Translator,
scope: *Scope,
union_init: Node.UnionInit,
used: ResultUsed,
) TransError!ZigNode {
assert(used == .used);
const init_expr = union_init.initializer orelse
return ZigTag.undefined_literal.init();
if (init_expr.get(t.tree) == .default_init_expr) {
return try t.transExpr(scope, init_expr, used);
}
const union_type = try t.transType(scope, union_init.union_qt, union_init.l_brace_tok);
const union_base = union_init.union_qt.base(t.comp);
const field = union_base.type.@"union".fields[union_init.field_index];
const field_name = if (field.name_tok == 0) t.anonymous_record_field_names.get(.{
.parent = union_base.qt,
.field = field.qt,
}).? else field.name.lookup(t.comp);
const field_init = try t.arena.create(ast.Payload.ContainerInit.Initializer);
field_init.* = .{
.name = field_name,
.value = try t.toNonBool(try t.transExprCoercing(scope, init_expr, .used), field.qt),
};
const container_init = try ZigTag.container_init.create(t.arena, .{
.lhs = union_type,
.inits = field_init[0..1],
});
return container_init;
}