enumstd.zig.Zoir.Node.Index[src]

Fields

root = 0
_

Functions

Functionget[src]

pub fn get(idx: Index, zoir: Zoir) Node

Parameters

idx: Index
zoir: Zoir

Source Code

Source code
pub fn get(idx: Index, zoir: Zoir) Node {
    const repr = zoir.nodes.get(@intFromEnum(idx));
    return switch (repr.tag) {
        .true => .true,
        .false => .false,
        .null => .null,
        .pos_inf => .pos_inf,
        .neg_inf => .neg_inf,
        .nan => .nan,
        .int_literal_small => .{ .int_literal = .{ .small = @bitCast(repr.data) } },
        .int_literal_pos, .int_literal_neg => .{ .int_literal = .{ .big = .{
            .limbs = l: {
                const limb_count, const limbs_idx = zoir.extra[repr.data..][0..2].*;
                break :l zoir.limbs[limbs_idx..][0..limb_count];
            },
            .positive = switch (repr.tag) {
                .int_literal_pos => true,
                .int_literal_neg => false,
                else => unreachable,
            },
        } } },
        .float_literal_small => .{ .float_literal = @as(f32, @bitCast(repr.data)) },
        .float_literal => .{ .float_literal = @bitCast(zoir.extra[repr.data..][0..4].*) },
        .char_literal => .{ .char_literal = @intCast(repr.data) },
        .enum_literal => .{ .enum_literal = @enumFromInt(repr.data) },
        .string_literal => .{ .string_literal = s: {
            const start, const len = zoir.extra[repr.data..][0..2].*;
            break :s zoir.string_bytes[start..][0..len];
        } },
        .string_literal_null => .{ .string_literal = NullTerminatedString.get(@enumFromInt(repr.data), zoir) },
        .empty_literal => .empty_literal,
        .array_literal => .{ .array_literal = a: {
            const elem_count, const first_elem = zoir.extra[repr.data..][0..2].*;
            break :a .{ .start = @enumFromInt(first_elem), .len = elem_count };
        } },
        .struct_literal => .{ .struct_literal = s: {
            const elem_count, const first_elem = zoir.extra[repr.data..][0..2].*;
            const field_names = zoir.extra[repr.data + 2 ..][0..elem_count];
            break :s .{
                .names = @ptrCast(field_names),
                .vals = .{ .start = @enumFromInt(first_elem), .len = elem_count },
            };
        } },
    };
}

FunctiongetAstNode[src]

pub fn getAstNode(idx: Index, zoir: Zoir) std.zig.Ast.Node.Index

Parameters

idx: Index
zoir: Zoir

Source Code

Source code
pub fn getAstNode(idx: Index, zoir: Zoir) std.zig.Ast.Node.Index {
    return zoir.nodes.items(.ast_node)[@intFromEnum(idx)];
}

Source Code

Source code
pub const Index = enum(u32) {
    root = 0,
    _,

    pub fn get(idx: Index, zoir: Zoir) Node {
        const repr = zoir.nodes.get(@intFromEnum(idx));
        return switch (repr.tag) {
            .true => .true,
            .false => .false,
            .null => .null,
            .pos_inf => .pos_inf,
            .neg_inf => .neg_inf,
            .nan => .nan,
            .int_literal_small => .{ .int_literal = .{ .small = @bitCast(repr.data) } },
            .int_literal_pos, .int_literal_neg => .{ .int_literal = .{ .big = .{
                .limbs = l: {
                    const limb_count, const limbs_idx = zoir.extra[repr.data..][0..2].*;
                    break :l zoir.limbs[limbs_idx..][0..limb_count];
                },
                .positive = switch (repr.tag) {
                    .int_literal_pos => true,
                    .int_literal_neg => false,
                    else => unreachable,
                },
            } } },
            .float_literal_small => .{ .float_literal = @as(f32, @bitCast(repr.data)) },
            .float_literal => .{ .float_literal = @bitCast(zoir.extra[repr.data..][0..4].*) },
            .char_literal => .{ .char_literal = @intCast(repr.data) },
            .enum_literal => .{ .enum_literal = @enumFromInt(repr.data) },
            .string_literal => .{ .string_literal = s: {
                const start, const len = zoir.extra[repr.data..][0..2].*;
                break :s zoir.string_bytes[start..][0..len];
            } },
            .string_literal_null => .{ .string_literal = NullTerminatedString.get(@enumFromInt(repr.data), zoir) },
            .empty_literal => .empty_literal,
            .array_literal => .{ .array_literal = a: {
                const elem_count, const first_elem = zoir.extra[repr.data..][0..2].*;
                break :a .{ .start = @enumFromInt(first_elem), .len = elem_count };
            } },
            .struct_literal => .{ .struct_literal = s: {
                const elem_count, const first_elem = zoir.extra[repr.data..][0..2].*;
                const field_names = zoir.extra[repr.data + 2 ..][0..elem_count];
                break :s .{
                    .names = @ptrCast(field_names),
                    .vals = .{ .start = @enumFromInt(first_elem), .len = elem_count },
                };
            } },
        };
    }

    pub fn getAstNode(idx: Index, zoir: Zoir) std.zig.Ast.Node.Index {
        return zoir.nodes.items(.ast_node)[@intFromEnum(idx)];
    }

    pub const Range = struct {
        start: Index,
        len: u32,

        pub fn at(r: Range, i: u32) Index {
            assert(i < r.len);
            return @enumFromInt(@intFromEnum(r.start) + i);
        }
    };
}