Zig 0.17.0-dev (Split by item)

This is an example of documentation generated by ZigDoc, an alternative to Zig's built-in Auto Doc feature. See also examples in other modes/formats. The project being documented here (as the example) is the Zig library itself.

transMemberAccess

Translator.transMemberAccess
fn transMemberAccess(
    t: *Translator,
    scope: *Scope,
    kind: enum

File

lib/compiler/translate-c/Translator.zig:3199

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,
    });

    // Flexible array members are translated as member functions.
    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;
}