feature. See also
. The project being documented here (as the example) is the Zig library itself.
Translator.transMemberDesignator
fn transMemberDesignator(t: *Translator, scope: *Scope, arg: Node.Index) TransError!ZigNode
File
Code
fn transMemberDesignator(t: *Translator, scope: *Scope, arg: Node.Index) TransError!ZigNode {
switch (arg.get(t.tree)) {
.default_init_expr => |default| {
const elem_node = try t.transType(scope, default.qt, default.last_tok);
const ptr_ty = try ZigTag.single_pointer.create(t.arena, .{
.elem_type = elem_node,
.is_allowzero = true,
.is_const = false,
.is_volatile = false,
});
const zero = try ZigTag.ptr_from_int.create(t.arena, ZigTag.zero_literal.init());
return ZigTag.as.create(t.arena, .{ .lhs = ptr_ty, .rhs = zero });
},
.array_access_expr => |access| {
const base = try t.transMemberDesignator(scope, access.base);
return t.transArrayAccess(scope, access, base);
},
.member_access_expr => |access| {
const base = try t.transMemberDesignator(scope, access.base);
// the backing field (`_name`) rather than the accessor function,
// because you can't take the address of a function call result.
return t.transMemberAccess(scope, .normal, access, base, .backing);
},
.cast => |cast| {
assert(cast.kind == .array_to_pointer);
return t.transMemberDesignator(scope, cast.operand);
},
else => unreachable,
}
}