DoxigAlpha

declIterator

Function parameters

Parameters

#
decl_inst:Zir.Inst.Index

The data stored at byte offset 0 when ZIR is stored in a file.

Types

#
Header
The data stored at byte offset 0 when ZIR is stored in a file.
Inst
These are untyped instructions generated from an Abstract Syntax Tree.
DeclContents
`DeclContents` contains all "interesting" instructions found within a declaration by `findTrackable`.

Returns the requested data, as well as the new index which is at the start of the

Functions

#
extraData
Returns the requested data, as well as the new index which is at the start of the
nullTerminatedString
Given an index into `string_bytes` returns the null-terminated string found there.
findTrackable
Find all tracked ZIR instructions, recursively, within a `declaration` instruction.
findTrackableRoot
Like `findTrackable`, but only considers the `main_struct_inst` instruction.
assertTrackable
Asserts that a ZIR instruction is tracked across incremental updates, and

When the ZIR update tracking logic must be modified to consider new instructions,

Values

#
inst_tracking_version
When the ZIR update tracking logic must be modified to consider new instructions,

Source

Implementation

#
pub fn declIterator(zir: Zir, decl_inst: Zir.Inst.Index) DeclIterator {
    const inst = zir.instructions.get(@intFromEnum(decl_inst));
    assert(inst.tag == .extended);
    const extended = inst.data.extended;
    switch (extended.opcode) {
        .struct_decl => {
            const small: Inst.StructDecl.Small = @bitCast(extended.small);
            var extra_index: u32 = @intCast(extended.operand + @typeInfo(Inst.StructDecl).@"struct".fields.len);
            const captures_len = if (small.has_captures_len) captures_len: {
                const captures_len = zir.extra[extra_index];
                extra_index += 1;
                break :captures_len captures_len;
            } else 0;
            extra_index += @intFromBool(small.has_fields_len);
            const decls_len = if (small.has_decls_len) decls_len: {
                const decls_len = zir.extra[extra_index];
                extra_index += 1;
                break :decls_len decls_len;
            } else 0;

            extra_index += captures_len * 2;

            if (small.has_backing_int) {
                const backing_int_body_len = zir.extra[extra_index];
                extra_index += 1; // backing_int_body_len
                if (backing_int_body_len == 0) {
                    extra_index += 1; // backing_int_ref
                } else {
                    extra_index += backing_int_body_len; // backing_int_body_inst
                }
            }

            return .{
                .extra_index = extra_index,
                .decls_remaining = decls_len,
                .zir = zir,
            };
        },
        .enum_decl => {
            const small: Inst.EnumDecl.Small = @bitCast(extended.small);
            var extra_index: u32 = @intCast(extended.operand + @typeInfo(Inst.EnumDecl).@"struct".fields.len);
            extra_index += @intFromBool(small.has_tag_type);
            const captures_len = if (small.has_captures_len) captures_len: {
                const captures_len = zir.extra[extra_index];
                extra_index += 1;
                break :captures_len captures_len;
            } else 0;
            extra_index += @intFromBool(small.has_body_len);
            extra_index += @intFromBool(small.has_fields_len);
            const decls_len = if (small.has_decls_len) decls_len: {
                const decls_len = zir.extra[extra_index];
                extra_index += 1;
                break :decls_len decls_len;
            } else 0;

            extra_index += captures_len * 2;

            return .{
                .extra_index = extra_index,
                .decls_remaining = decls_len,
                .zir = zir,
            };
        },
        .union_decl => {
            const small: Inst.UnionDecl.Small = @bitCast(extended.small);
            var extra_index: u32 = @intCast(extended.operand + @typeInfo(Inst.UnionDecl).@"struct".fields.len);
            extra_index += @intFromBool(small.has_tag_type);
            const captures_len = if (small.has_captures_len) captures_len: {
                const captures_len = zir.extra[extra_index];
                extra_index += 1;
                break :captures_len captures_len;
            } else 0;
            extra_index += @intFromBool(small.has_body_len);
            extra_index += @intFromBool(small.has_fields_len);
            const decls_len = if (small.has_decls_len) decls_len: {
                const decls_len = zir.extra[extra_index];
                extra_index += 1;
                break :decls_len decls_len;
            } else 0;

            extra_index += captures_len * 2;

            return .{
                .extra_index = extra_index,
                .decls_remaining = decls_len,
                .zir = zir,
            };
        },
        .opaque_decl => {
            const small: Inst.OpaqueDecl.Small = @bitCast(extended.small);
            var extra_index: u32 = @intCast(extended.operand + @typeInfo(Inst.OpaqueDecl).@"struct".fields.len);
            const decls_len = if (small.has_decls_len) decls_len: {
                const decls_len = zir.extra[extra_index];
                extra_index += 1;
                break :decls_len decls_len;
            } else 0;
            const captures_len = if (small.has_captures_len) captures_len: {
                const captures_len = zir.extra[extra_index];
                extra_index += 1;
                break :captures_len captures_len;
            } else 0;

            extra_index += captures_len * 2;

            return .{
                .extra_index = extra_index,
                .decls_remaining = decls_len,
                .zir = zir,
            };
        },
        else => unreachable,
    }
}