feature. See also
. The project being documented here (as the example) is the Zig library itself.
Translator.transMemberAccess
fn transMemberAccess(
t: *Translator,
scope: *Scope,
kind: enum
File
Code
fn transMemberAccess(
t: *Translator,
scope: *Scope,
kind: enum { normal, ptr },
member_access: Node.MemberAccess,
opt_base: ?ZigNode,
flex_array_mode: enum { accessor, backing },
) TransError!ZigNode {
const base_info = switch (kind) {
.normal => member_access.base.qt(t.tree),
.ptr => member_access.base.qt(t.tree).childType(t.comp),
};
if (t.typeWasDemotedToOpaque(base_info)) {
return t.fail(error.UnsupportedTranslation, member_access.access_tok, "member access of demoted record", .{});
}
const record = base_info.getRecord(t.comp).?;
const field = record.fields[member_access.member_index];
const field_name = if (field.name_tok == 0) t.anonymous_record_field_names.get(.{
.parent = base_info.base(t.comp).qt,
.field = field.qt,
}).? else field.name.lookup(t.comp);
const base_node = opt_base orelse try t.transExpr(scope, member_access.base, .used);
const lhs = switch (kind) {
.normal => base_node,
.ptr => try ZigTag.deref.create(t.arena, base_node),
};
const field_access = try ZigTag.field_access.create(t.arena, .{
.lhs = lhs,
.field_name = field_name,
});
if (member_access.member_index == record.fields.len - 1 or base_info.base(t.comp).type == .@"union") {
if (field.qt.get(t.comp, .array)) |array_ty| {
if (t.isFlexibleArrayLen(array_ty.len)) {
switch (flex_array_mode) {
.accessor => return ZigTag.call.create(t.arena, .{ .lhs = field_access, .args = &.{} }),
.backing => {
const backing_name = try std.fmt.allocPrint(t.arena, "_{s}", .{field_name});
return ZigTag.field_access.create(t.arena, .{ .lhs = lhs, .field_name = backing_name });
},
}
}
}
}
return field_access;
}