union Node [src]

Fields

trueA literal true value.
falseA literal false value.
nullA literal null value.
pos_infA literal inf value.
neg_infA literal -inf value.
nanA literal nan value.
int_literal: union(enum) { small: i32, big: std.math.big.int.Const, }An integer literal.
float_literal: f128A floating-point literal.
char_literal: u21A Unicode codepoint literal.
enum_literal: NullTerminatedStringAn enum literal. The string is the literal, i.e. foo for .foo.
string_literal: []const u8A string literal.
empty_literalAn empty struct/array literal, i.e. .{}.
array_literal: Node.Index.RangeAn array literal. The Range gives the elements of the array literal.
struct_literal: struct { names: []const NullTerminatedString, vals: Node.Index.Range, }A struct literal. names.len is always equal to vals.len.

Members

Source

pub const Node = union(enum) { /// A literal `true` value. true, /// A literal `false` value. false, /// A literal `null` value. null, /// A literal `inf` value. pos_inf, /// A literal `-inf` value. neg_inf, /// A literal `nan` value. nan, /// An integer literal. int_literal: union(enum) { small: i32, big: std.math.big.int.Const, }, /// A floating-point literal. float_literal: f128, /// A Unicode codepoint literal. char_literal: u21, /// An enum literal. The string is the literal, i.e. `foo` for `.foo`. enum_literal: NullTerminatedString, /// A string literal. string_literal: []const u8, /// An empty struct/array literal, i.e. `.{}`. empty_literal, /// An array literal. The `Range` gives the elements of the array literal. array_literal: Node.Index.Range, /// A struct literal. `names.len` is always equal to `vals.len`. struct_literal: struct { names: []const NullTerminatedString, vals: Node.Index.Range, }, 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); } }; }; pub const Repr = struct { tag: Tag, data: u32, ast_node: std.zig.Ast.Node.Index, pub const Tag = enum(u8) { /// `data` is ignored. true, /// `data` is ignored. false, /// `data` is ignored. null, /// `data` is ignored. pos_inf, /// `data` is ignored. neg_inf, /// `data` is ignored. nan, /// `data` is the `i32` value. int_literal_small, /// `data` is index into `extra` of: /// * `limb_count: u32` /// * `limbs_idx: u32` int_literal_pos, /// Identical to `int_literal_pos`, except the value is negative. int_literal_neg, /// `data` is the `f32` value. float_literal_small, /// `data` is index into `extra` of 4 elements which are a bitcast `f128`. float_literal, /// `data` is the `u32` value. char_literal, /// `data` is a `NullTerminatedString`. enum_literal, /// `data` is index into `extra` of: /// * `start: u32` /// * `len: u32` string_literal, /// Null-terminated string literal, /// `data` is a `NullTerminatedString`. string_literal_null, /// An empty struct/array literal, `.{}`. /// `data` is ignored. empty_literal, /// `data` is index into `extra` of: /// * `elem_count: u32` /// * `first_elem: Node.Index` /// The nodes `first_elem .. first_elem + elem_count` are the children. array_literal, /// `data` is index into `extra` of: /// * `elem_count: u32` /// * `first_elem: Node.Index` /// * `field_name: NullTerminatedString` for each `elem_count` /// The nodes `first_elem .. first_elem + elem_count` are the children. struct_literal, }; }; }