tiny.chant.parse.state.object
Defined in parse.state.
API (6)
Actions
Public operations.
Source
Source: lib/chant/src/parse/state/object.zig
zig
const std = @import("std");const ast = @import("../../ast/root.zig");const chant = @import("../../root.zig");const types = @import("types.zig");const Error = @import("../root.zig").Error;const Token = chant.token.Token;const Parser = types.Parser;pub fn push(parser: *Parser) Error!void { try parser.object_scopes.append(parser.arena, parser.objects.items.len);}pub fn pop(parser: *Parser) void { const mark = parser.object_scopes.pop().?; parser.objects.shrinkRetainingCapacity(mark);}pub fn register(parser: *Parser, name: []const u8, resolved: *const ast.Type) Error!void { try parser.objects.append(parser.arena, .{ .name = name, .type = resolved });}pub fn registerConstant(parser: *Parser, name: []const u8, resolved: *const ast.Type, value: i128) Error!void { try parser.objects.append(parser.arena, .{ .name = name, .type = resolved, .value = value });}pub fn lookup(parser: *const Parser, name: []const u8) ?*const ast.Type { const binding = lookupBinding(parser, name) orelse return null; return binding.type;}pub fn constantValue(parser: *const Parser, name: []const u8) ?i128 { const binding = lookupBinding(parser, name) orelse return null; return binding.value;}fn lookupBinding(parser: *const Parser, name: []const u8) ?types.ObjectBinding { var index = parser.objects.items.len; while (index > 0) { index -= 1; const binding = parser.objects.items[index]; if (std.mem.eql(u8, binding.name, name)) return binding; } return null;}test "objects resolve through nested scopes" { var arena_state = std.heap.ArenaAllocator.init(std.testing.allocator); defer arena_state.deinit(); const arena = arena_state.allocator(); const tokens = [_]Token{ .{ .kind = .eof, .text = "", .file = "test.c", .line = 1, .column = 1 }, }; var parser = try @import("test.zig").initParser(arena, &tokens); try push(&parser); try register(&parser, "x", &ast.types.int_type); try registerConstant(&parser, "C", &ast.types.int_type, 42); try std.testing.expectEqual(ast.types.Kind.int_type, lookup(&parser, "x").?.kind); try std.testing.expectEqual(@as(i128, 42), constantValue(&parser, "C").?); try push(&parser); try register(&parser, "x", &ast.types.double_type); try std.testing.expectEqual(ast.types.Kind.double_type, lookup(&parser, "x").?.kind); pop(&parser); try std.testing.expectEqual(ast.types.Kind.int_type, lookup(&parser, "x").?.kind); pop(&parser); try std.testing.expect(lookup(&parser, "x") == null);}Source: lib/chant/src/parse/state/root.zig:7
zig
pub const object = @import("object.zig");Audit
| Definitions | 7 |
|---|---|
| Public names | 7 |
| Members | 0 |
| Version | 26.7.0 |
| Revision | daab053ee433 |