From 82500931ce7aceb13529c2697942f30772a1e43f Mon Sep 17 00:00:00 2001 From: agra Date: Wed, 10 Jun 2026 16:09:24 +0300 Subject: [PATCH] cleanup(B-review): fix stale section banners, merge alias block, prune imports Review follow-up to the ARCH-B split (comment/import hygiene only, no code changes): - Section banners that travelled to the wrong file with the B1-B8 cuts are reworded to describe the section that actually follows (e.g. stmt.zig's trailing "Expression lowering", expr.zig's "Control flow" before lowerChainedComparison) or deleted where nothing follows (4 trailing-at-EOF banners). ffi.zig's facade note no longer claims the IMP builders "stay here" (they live in lower/objc_class.zig); protocol.zig's namespace-lookup banner now points at pack.zig:resolvePackProjection for the orchestrator. - lower.zig's two lower/expr.zig alias blocks (B8.1 + B8.2 appends) merged into one. - 448 unused header decls pruned from the 15 lower/*.zig files (each had inherited lower.zig's full import block; pruned to fixpoint so cascading type-extraction consts went too). Gate: zig build OK; zig build test 426/426; run_examples 541/0; zero expected/ snapshot churn. --- src/ir/lower.zig | 6 ++---- src/ir/lower/call.zig | 29 +------------------------- src/ir/lower/closure.zig | 33 ----------------------------- src/ir/lower/coerce.zig | 34 ------------------------------ src/ir/lower/comptime.zig | 30 +-------------------------- src/ir/lower/control_flow.zig | 39 +---------------------------------- src/ir/lower/decl.zig | 19 +---------------- src/ir/lower/error.zig | 29 -------------------------- src/ir/lower/expr.zig | 33 ++--------------------------- src/ir/lower/ffi.zig | 35 ++++--------------------------- src/ir/lower/generic.zig | 33 +---------------------------- src/ir/lower/nominal.zig | 31 ---------------------------- src/ir/lower/objc_class.zig | 33 ----------------------------- src/ir/lower/pack.zig | 37 +-------------------------------- src/ir/lower/protocol.zig | 36 +++----------------------------- src/ir/lower/stmt.zig | 37 +-------------------------------- 16 files changed, 18 insertions(+), 476 deletions(-) diff --git a/src/ir/lower.zig b/src/ir/lower.zig index d87c88a..6590ce4 100644 --- a/src/ir/lower.zig +++ b/src/ir/lower.zig @@ -500,7 +500,7 @@ pub const Lowering = struct { }; } - // ── Public entry point ────────────────────────────────────────── + // ── Layout delegators ─────────────────────────────────────────── /// Byte size of an IR type matching LLVM's type layout. pub fn typeSizeBytes(self: *Lowering, ty: TypeId) usize { @@ -516,7 +516,7 @@ pub const Lowering = struct { return .void; } - // ── Chained comparison ────────────────────────────────────────── + // ── Type-resolution delegators ────────────────────────────────── pub fn resolveReturnType(self: *Lowering, fd: *const ast.FnDecl) TypeId { if (fd.return_type) |rt| { @@ -1645,8 +1645,6 @@ pub const Lowering = struct { pub const lowerForceUnwrap = lower_expr.lowerForceUnwrap; pub const lowerNullCoalesce = lower_expr.lowerNullCoalesce; pub const resolveOptionalInner = lower_expr.resolveOptionalInner; - - // --- moved to lower/expr.zig (lower_expr) --- pub const lowerExpr = lower_expr.lowerExpr; pub const refCapturePointee = lower_expr.refCapturePointee; pub const lowerBinaryOp = lower_expr.lowerBinaryOp; diff --git a/src/ir/lower/call.zig b/src/ir/lower/call.zig index 052e6d5..5b510d0 100644 --- a/src/ir/lower/call.zig +++ b/src/ir/lower/call.zig @@ -4,48 +4,21 @@ const ast = @import("../../ast.zig"); const Node = ast.Node; const types = @import("../types.zig"); const inst_mod = @import("../inst.zig"); -const mod_mod = @import("../module.zig"); const type_bridge = @import("../type_bridge.zig"); const unescape = @import("../../unescape.zig"); -const parser_mod = @import("../../parser.zig"); -const interp_mod = @import("../interp.zig"); const errors = @import("../../errors.zig"); -const jni_descriptor = @import("../jni_descriptor.zig"); const program_index_mod = @import("../program_index.zig"); -const resolver_mod = @import("../resolver.zig"); -const imports_mod = @import("../../imports.zig"); -const ProgramIndex = program_index_mod.ProgramIndex; -const GlobalInfo = program_index_mod.GlobalInfo; -const StructTemplate = program_index_mod.StructTemplate; -const TemplateParam = program_index_mod.TemplateParam; -const ProtocolDeclInfo = program_index_mod.ProtocolDeclInfo; const ProtocolMethodInfo = program_index_mod.ProtocolMethodInfo; -const ModuleConstInfo = program_index_mod.ModuleConstInfo; -const TypeResolver = @import("../type_resolver.zig").TypeResolver; -const ResolveEnv = @import("../type_resolver.zig").ResolveEnv; -const PackResolver = @import("../packs.zig").PackResolver; -const ExprTyper = @import("../expr_typer.zig").ExprTyper; const CallResolver = @import("../calls.zig").CallResolver; -const GenericResolver = @import("../generics.zig").GenericResolver; -const ProtocolResolver = @import("../protocols.zig").ProtocolResolver; -const CoercionResolver = @import("../conversions.zig").CoercionResolver; -const ErrorAnalysis = @import("../error_analysis.zig").ErrorAnalysis; -const ErrorFlow = @import("../error_flow.zig").ErrorFlow; -const ObjcLowering = @import("../ffi_objc.zig").ObjcLowering; -const semantic_diagnostics = @import("../semantic_diagnostics.zig"); const TypeId = types.TypeId; -const StringId = types.StringId; const Ref = inst_mod.Ref; const BlockId = inst_mod.BlockId; const FuncId = inst_mod.FuncId; const Function = inst_mod.Function; -const Module = mod_mod.Module; -const Builder = mod_mod.Builder; const lower = @import("../lower.zig"); const Lowering = lower.Lowering; -const Scope = lower.Scope; const SelectedFunc = Lowering.SelectedFunc; const isTypeParamDecl = Lowering.isTypeParamDecl; const isPackFn = Lowering.isPackFn; @@ -1203,7 +1176,7 @@ pub fn resolveBuiltin(name: []const u8) ?inst_mod.BuiltinId { return null; } -// ── Lambda/closure ──────────────────────────────────────────── +// ── Generic calls ───────────────────────────────────────────── /// Build `tp.name -> TypeId` bindings for a generic call. /// `args_ast` must be parallel to `fd.params`; for dot-calls the caller diff --git a/src/ir/lower/closure.zig b/src/ir/lower/closure.zig index 8bc40ed..a407dfc 100644 --- a/src/ir/lower/closure.zig +++ b/src/ir/lower/closure.zig @@ -1,47 +1,14 @@ const std = @import("std"); -const Allocator = std.mem.Allocator; const ast = @import("../../ast.zig"); const Node = ast.Node; const types = @import("../types.zig"); const inst_mod = @import("../inst.zig"); -const mod_mod = @import("../module.zig"); const type_bridge = @import("../type_bridge.zig"); -const unescape = @import("../../unescape.zig"); -const parser_mod = @import("../../parser.zig"); -const interp_mod = @import("../interp.zig"); -const errors = @import("../../errors.zig"); -const jni_descriptor = @import("../jni_descriptor.zig"); -const program_index_mod = @import("../program_index.zig"); -const resolver_mod = @import("../resolver.zig"); -const imports_mod = @import("../../imports.zig"); -const ProgramIndex = program_index_mod.ProgramIndex; -const GlobalInfo = program_index_mod.GlobalInfo; -const StructTemplate = program_index_mod.StructTemplate; -const TemplateParam = program_index_mod.TemplateParam; -const ProtocolDeclInfo = program_index_mod.ProtocolDeclInfo; -const ProtocolMethodInfo = program_index_mod.ProtocolMethodInfo; -const ModuleConstInfo = program_index_mod.ModuleConstInfo; -const TypeResolver = @import("../type_resolver.zig").TypeResolver; -const ResolveEnv = @import("../type_resolver.zig").ResolveEnv; -const PackResolver = @import("../packs.zig").PackResolver; -const ExprTyper = @import("../expr_typer.zig").ExprTyper; -const CallResolver = @import("../calls.zig").CallResolver; -const GenericResolver = @import("../generics.zig").GenericResolver; -const ProtocolResolver = @import("../protocols.zig").ProtocolResolver; -const CoercionResolver = @import("../conversions.zig").CoercionResolver; -const ErrorAnalysis = @import("../error_analysis.zig").ErrorAnalysis; -const ErrorFlow = @import("../error_flow.zig").ErrorFlow; -const ObjcLowering = @import("../ffi_objc.zig").ObjcLowering; -const semantic_diagnostics = @import("../semantic_diagnostics.zig"); const TypeId = types.TypeId; -const StringId = types.StringId; const Ref = inst_mod.Ref; -const BlockId = inst_mod.BlockId; const FuncId = inst_mod.FuncId; const Function = inst_mod.Function; -const Module = mod_mod.Module; -const Builder = mod_mod.Builder; const lower = @import("../lower.zig"); const Lowering = lower.Lowering; diff --git a/src/ir/lower/coerce.zig b/src/ir/lower/coerce.zig index 84fc822..1caf7c6 100644 --- a/src/ir/lower/coerce.zig +++ b/src/ir/lower/coerce.zig @@ -1,52 +1,18 @@ const std = @import("std"); -const Allocator = std.mem.Allocator; const ast = @import("../../ast.zig"); const Node = ast.Node; const types = @import("../types.zig"); const inst_mod = @import("../inst.zig"); -const mod_mod = @import("../module.zig"); -const type_bridge = @import("../type_bridge.zig"); -const unescape = @import("../../unescape.zig"); -const parser_mod = @import("../../parser.zig"); -const interp_mod = @import("../interp.zig"); const errors = @import("../../errors.zig"); -const jni_descriptor = @import("../jni_descriptor.zig"); const program_index_mod = @import("../program_index.zig"); -const resolver_mod = @import("../resolver.zig"); -const imports_mod = @import("../../imports.zig"); -const ProgramIndex = program_index_mod.ProgramIndex; -const GlobalInfo = program_index_mod.GlobalInfo; -const StructTemplate = program_index_mod.StructTemplate; -const TemplateParam = program_index_mod.TemplateParam; -const ProtocolDeclInfo = program_index_mod.ProtocolDeclInfo; -const ProtocolMethodInfo = program_index_mod.ProtocolMethodInfo; -const ModuleConstInfo = program_index_mod.ModuleConstInfo; -const TypeResolver = @import("../type_resolver.zig").TypeResolver; -const ResolveEnv = @import("../type_resolver.zig").ResolveEnv; -const PackResolver = @import("../packs.zig").PackResolver; -const ExprTyper = @import("../expr_typer.zig").ExprTyper; -const CallResolver = @import("../calls.zig").CallResolver; -const GenericResolver = @import("../generics.zig").GenericResolver; -const ProtocolResolver = @import("../protocols.zig").ProtocolResolver; -const CoercionResolver = @import("../conversions.zig").CoercionResolver; -const ErrorAnalysis = @import("../error_analysis.zig").ErrorAnalysis; -const ErrorFlow = @import("../error_flow.zig").ErrorFlow; -const ObjcLowering = @import("../ffi_objc.zig").ObjcLowering; -const semantic_diagnostics = @import("../semantic_diagnostics.zig"); const TypeId = types.TypeId; -const StringId = types.StringId; const Ref = inst_mod.Ref; -const BlockId = inst_mod.BlockId; -const FuncId = inst_mod.FuncId; const Function = inst_mod.Function; -const Module = mod_mod.Module; -const Builder = mod_mod.Builder; const lower = @import("../lower.zig"); const Lowering = lower.Lowering; -const Scope = lower.Scope; const ParamImplEntry = Lowering.ParamImplEntry; /// Lower the `xx` operator (type coercion). diff --git a/src/ir/lower/comptime.zig b/src/ir/lower/comptime.zig index daf0635..18952d3 100644 --- a/src/ir/lower/comptime.zig +++ b/src/ir/lower/comptime.zig @@ -4,44 +4,16 @@ const ast = @import("../../ast.zig"); const Node = ast.Node; const types = @import("../types.zig"); const inst_mod = @import("../inst.zig"); -const mod_mod = @import("../module.zig"); -const type_bridge = @import("../type_bridge.zig"); const unescape = @import("../../unescape.zig"); const parser_mod = @import("../../parser.zig"); const interp_mod = @import("../interp.zig"); -const errors = @import("../../errors.zig"); -const jni_descriptor = @import("../jni_descriptor.zig"); const program_index_mod = @import("../program_index.zig"); -const resolver_mod = @import("../resolver.zig"); -const imports_mod = @import("../../imports.zig"); -const ProgramIndex = program_index_mod.ProgramIndex; -const GlobalInfo = program_index_mod.GlobalInfo; -const StructTemplate = program_index_mod.StructTemplate; -const TemplateParam = program_index_mod.TemplateParam; -const ProtocolDeclInfo = program_index_mod.ProtocolDeclInfo; -const ProtocolMethodInfo = program_index_mod.ProtocolMethodInfo; const ModuleConstInfo = program_index_mod.ModuleConstInfo; -const TypeResolver = @import("../type_resolver.zig").TypeResolver; -const ResolveEnv = @import("../type_resolver.zig").ResolveEnv; -const PackResolver = @import("../packs.zig").PackResolver; -const ExprTyper = @import("../expr_typer.zig").ExprTyper; -const CallResolver = @import("../calls.zig").CallResolver; -const GenericResolver = @import("../generics.zig").GenericResolver; -const ProtocolResolver = @import("../protocols.zig").ProtocolResolver; -const CoercionResolver = @import("../conversions.zig").CoercionResolver; -const ErrorAnalysis = @import("../error_analysis.zig").ErrorAnalysis; -const ErrorFlow = @import("../error_flow.zig").ErrorFlow; -const ObjcLowering = @import("../ffi_objc.zig").ObjcLowering; -const semantic_diagnostics = @import("../semantic_diagnostics.zig"); const TypeId = types.TypeId; -const StringId = types.StringId; const Ref = inst_mod.Ref; -const BlockId = inst_mod.BlockId; const FuncId = inst_mod.FuncId; const Function = inst_mod.Function; -const Module = mod_mod.Module; -const Builder = mod_mod.Builder; const lower = @import("../lower.zig"); const Lowering = lower.Lowering; @@ -778,7 +750,7 @@ pub fn createComptimeFunction(self: *Lowering, prefix: []const u8, expr: *const return func_id; } -// ── Block helpers ─────────────────────────────────────────────── +// ── Source-const folding ──────────────────────────────────────── /// Resolve a name to a compile-time integer across the three const tables. /// A comptime binding (generic value param / inline-for cursor) or a diff --git a/src/ir/lower/control_flow.zig b/src/ir/lower/control_flow.zig index 822353f..c4eeeef 100644 --- a/src/ir/lower/control_flow.zig +++ b/src/ir/lower/control_flow.zig @@ -1,47 +1,13 @@ const std = @import("std"); -const Allocator = std.mem.Allocator; const ast = @import("../../ast.zig"); const Node = ast.Node; const types = @import("../types.zig"); const inst_mod = @import("../inst.zig"); -const mod_mod = @import("../module.zig"); -const type_bridge = @import("../type_bridge.zig"); -const unescape = @import("../../unescape.zig"); -const parser_mod = @import("../../parser.zig"); -const interp_mod = @import("../interp.zig"); const errors = @import("../../errors.zig"); -const jni_descriptor = @import("../jni_descriptor.zig"); -const program_index_mod = @import("../program_index.zig"); -const resolver_mod = @import("../resolver.zig"); -const imports_mod = @import("../../imports.zig"); -const ProgramIndex = program_index_mod.ProgramIndex; -const GlobalInfo = program_index_mod.GlobalInfo; -const StructTemplate = program_index_mod.StructTemplate; -const TemplateParam = program_index_mod.TemplateParam; -const ProtocolDeclInfo = program_index_mod.ProtocolDeclInfo; -const ProtocolMethodInfo = program_index_mod.ProtocolMethodInfo; -const ModuleConstInfo = program_index_mod.ModuleConstInfo; -const TypeResolver = @import("../type_resolver.zig").TypeResolver; -const ResolveEnv = @import("../type_resolver.zig").ResolveEnv; -const PackResolver = @import("../packs.zig").PackResolver; -const ExprTyper = @import("../expr_typer.zig").ExprTyper; -const CallResolver = @import("../calls.zig").CallResolver; -const GenericResolver = @import("../generics.zig").GenericResolver; -const ProtocolResolver = @import("../protocols.zig").ProtocolResolver; -const CoercionResolver = @import("../conversions.zig").CoercionResolver; -const ErrorAnalysis = @import("../error_analysis.zig").ErrorAnalysis; -const ErrorFlow = @import("../error_flow.zig").ErrorFlow; -const ObjcLowering = @import("../ffi_objc.zig").ObjcLowering; -const semantic_diagnostics = @import("../semantic_diagnostics.zig"); const TypeId = types.TypeId; -const StringId = types.StringId; const Ref = inst_mod.Ref; const BlockId = inst_mod.BlockId; -const FuncId = inst_mod.FuncId; -const Function = inst_mod.Function; -const Module = mod_mod.Module; -const Builder = mod_mod.Builder; const lower = @import("../lower.zig"); const Lowering = lower.Lowering; @@ -909,7 +875,7 @@ pub fn lowerContinue(self: *Lowering) Ref { return Ref.none; } -// ── Struct/enum/union ops ─────────────────────────────────────── +// ── Block plumbing ────────────────────────────────────────────── pub fn freshBlock(self: *Lowering, prefix: []const u8) BlockId { return self.freshBlockWithParams(prefix, &.{}); @@ -937,9 +903,6 @@ pub fn currentBlockHasTerminator(self: *Lowering) bool { return false; } -// ── Type resolution ───────────────────────────────────────────── -// Delegates to type_bridge for full AST type node resolution. - pub fn ensureTerminator(self: *Lowering, ret_ty: TypeId) void { if (self.currentBlockHasTerminator()) return; if (ret_ty == .noreturn) { diff --git a/src/ir/lower/decl.zig b/src/ir/lower/decl.zig index c965fba..75b52e3 100644 --- a/src/ir/lower/decl.zig +++ b/src/ir/lower/decl.zig @@ -7,41 +7,24 @@ const inst_mod = @import("../inst.zig"); const mod_mod = @import("../module.zig"); const type_bridge = @import("../type_bridge.zig"); const unescape = @import("../../unescape.zig"); -const parser_mod = @import("../../parser.zig"); -const interp_mod = @import("../interp.zig"); const errors = @import("../../errors.zig"); -const jni_descriptor = @import("../jni_descriptor.zig"); const program_index_mod = @import("../program_index.zig"); const resolver_mod = @import("../resolver.zig"); -const imports_mod = @import("../../imports.zig"); const ProgramIndex = program_index_mod.ProgramIndex; const GlobalInfo = program_index_mod.GlobalInfo; -const StructTemplate = program_index_mod.StructTemplate; -const TemplateParam = program_index_mod.TemplateParam; -const ProtocolDeclInfo = program_index_mod.ProtocolDeclInfo; -const ProtocolMethodInfo = program_index_mod.ProtocolMethodInfo; const ModuleConstInfo = program_index_mod.ModuleConstInfo; const TypeResolver = @import("../type_resolver.zig").TypeResolver; -const ResolveEnv = @import("../type_resolver.zig").ResolveEnv; -const PackResolver = @import("../packs.zig").PackResolver; -const ExprTyper = @import("../expr_typer.zig").ExprTyper; const CallResolver = @import("../calls.zig").CallResolver; -const GenericResolver = @import("../generics.zig").GenericResolver; const ProtocolResolver = @import("../protocols.zig").ProtocolResolver; -const CoercionResolver = @import("../conversions.zig").CoercionResolver; -const ErrorAnalysis = @import("../error_analysis.zig").ErrorAnalysis; const ErrorFlow = @import("../error_flow.zig").ErrorFlow; -const ObjcLowering = @import("../ffi_objc.zig").ObjcLowering; const semantic_diagnostics = @import("../semantic_diagnostics.zig"); const TypeId = types.TypeId; const StringId = types.StringId; const Ref = inst_mod.Ref; -const BlockId = inst_mod.BlockId; const FuncId = inst_mod.FuncId; const Function = inst_mod.Function; const Module = mod_mod.Module; -const Builder = mod_mod.Builder; const lower = @import("../lower.zig"); const Lowering = lower.Lowering; @@ -2317,7 +2300,7 @@ pub fn lowerFunction(self: *Lowering, fd: *const ast.FnDecl, name: []const u8, i self.builder.finalize(); } -// ── Statement lowering ────────────────────────────────────────── +// ── Module-const emission ─────────────────────────────────────── pub fn emitModuleConst(self: *Lowering, ci: ModuleConstInfo, author_source: ?[]const u8) Ref { // F1: a const read from another module folds/lowers its RHS in the diff --git a/src/ir/lower/error.zig b/src/ir/lower/error.zig index bde7cb7..2e52a44 100644 --- a/src/ir/lower/error.zig +++ b/src/ir/lower/error.zig @@ -1,46 +1,17 @@ const std = @import("std"); -const Allocator = std.mem.Allocator; const ast = @import("../../ast.zig"); const Node = ast.Node; const types = @import("../types.zig"); const inst_mod = @import("../inst.zig"); const mod_mod = @import("../module.zig"); -const type_bridge = @import("../type_bridge.zig"); -const unescape = @import("../../unescape.zig"); -const parser_mod = @import("../../parser.zig"); -const interp_mod = @import("../interp.zig"); const errors = @import("../../errors.zig"); -const jni_descriptor = @import("../jni_descriptor.zig"); -const program_index_mod = @import("../program_index.zig"); -const resolver_mod = @import("../resolver.zig"); -const imports_mod = @import("../../imports.zig"); -const ProgramIndex = program_index_mod.ProgramIndex; -const GlobalInfo = program_index_mod.GlobalInfo; -const StructTemplate = program_index_mod.StructTemplate; -const TemplateParam = program_index_mod.TemplateParam; -const ProtocolDeclInfo = program_index_mod.ProtocolDeclInfo; -const ProtocolMethodInfo = program_index_mod.ProtocolMethodInfo; -const ModuleConstInfo = program_index_mod.ModuleConstInfo; -const TypeResolver = @import("../type_resolver.zig").TypeResolver; -const ResolveEnv = @import("../type_resolver.zig").ResolveEnv; -const PackResolver = @import("../packs.zig").PackResolver; -const ExprTyper = @import("../expr_typer.zig").ExprTyper; -const CallResolver = @import("../calls.zig").CallResolver; -const GenericResolver = @import("../generics.zig").GenericResolver; -const ProtocolResolver = @import("../protocols.zig").ProtocolResolver; -const CoercionResolver = @import("../conversions.zig").CoercionResolver; const ErrorAnalysis = @import("../error_analysis.zig").ErrorAnalysis; -const ErrorFlow = @import("../error_flow.zig").ErrorFlow; -const ObjcLowering = @import("../ffi_objc.zig").ObjcLowering; -const semantic_diagnostics = @import("../semantic_diagnostics.zig"); const TypeId = types.TypeId; -const StringId = types.StringId; const Ref = inst_mod.Ref; const BlockId = inst_mod.BlockId; const FuncId = inst_mod.FuncId; const Function = inst_mod.Function; -const Module = mod_mod.Module; const Builder = mod_mod.Builder; const lower = @import("../lower.zig"); diff --git a/src/ir/lower/expr.zig b/src/ir/lower/expr.zig index 5fd11db..7433686 100644 --- a/src/ir/lower/expr.zig +++ b/src/ir/lower/expr.zig @@ -1,5 +1,4 @@ const std = @import("std"); -const Allocator = std.mem.Allocator; const ast = @import("../../ast.zig"); const Node = ast.Node; const types = @import("../types.zig"); @@ -7,41 +6,15 @@ const inst_mod = @import("../inst.zig"); const mod_mod = @import("../module.zig"); const type_bridge = @import("../type_bridge.zig"); const unescape = @import("../../unescape.zig"); -const parser_mod = @import("../../parser.zig"); -const interp_mod = @import("../interp.zig"); const errors = @import("../../errors.zig"); -const jni_descriptor = @import("../jni_descriptor.zig"); -const program_index_mod = @import("../program_index.zig"); -const resolver_mod = @import("../resolver.zig"); -const imports_mod = @import("../../imports.zig"); -const ProgramIndex = program_index_mod.ProgramIndex; -const GlobalInfo = program_index_mod.GlobalInfo; -const StructTemplate = program_index_mod.StructTemplate; -const TemplateParam = program_index_mod.TemplateParam; -const ProtocolDeclInfo = program_index_mod.ProtocolDeclInfo; -const ProtocolMethodInfo = program_index_mod.ProtocolMethodInfo; -const ModuleConstInfo = program_index_mod.ModuleConstInfo; const TypeResolver = @import("../type_resolver.zig").TypeResolver; -const ResolveEnv = @import("../type_resolver.zig").ResolveEnv; -const PackResolver = @import("../packs.zig").PackResolver; -const ExprTyper = @import("../expr_typer.zig").ExprTyper; -const CallResolver = @import("../calls.zig").CallResolver; -const GenericResolver = @import("../generics.zig").GenericResolver; -const ProtocolResolver = @import("../protocols.zig").ProtocolResolver; -const CoercionResolver = @import("../conversions.zig").CoercionResolver; -const ErrorAnalysis = @import("../error_analysis.zig").ErrorAnalysis; -const ErrorFlow = @import("../error_flow.zig").ErrorFlow; -const ObjcLowering = @import("../ffi_objc.zig").ObjcLowering; -const semantic_diagnostics = @import("../semantic_diagnostics.zig"); const TypeId = types.TypeId; const StringId = types.StringId; const Ref = inst_mod.Ref; -const BlockId = inst_mod.BlockId; const FuncId = inst_mod.FuncId; const Function = inst_mod.Function; const Module = mod_mod.Module; -const Builder = mod_mod.Builder; const lower = @import("../lower.zig"); @@ -1424,7 +1397,7 @@ pub fn resolveOptionalInner(self: *Lowering, ty: TypeId) TypeId { return .unresolved; } -// ── FFI intrinsics (#objc_call / #jni_call / #jni_static_call) ─ +// ── Core expression dispatch ─────────────────────────────────── pub fn lowerExpr(self: *Lowering, node: *const Node) Ref { // Stamp this node's source span onto the instructions it emits (ERR @@ -2344,7 +2317,7 @@ pub fn lowerTupleMembership(self: *Lowering, value: Ref, tuple: Ref, tuple_info: return result; } -// ── Control flow ──────────────────────────────────────────────── +// ── Chained comparison ────────────────────────────────────────── pub fn lowerChainedComparison(self: *Lowering, cc: *const ast.ChainedComparison) Ref { // a < b < c → (a < b) and (b < c) @@ -2381,5 +2354,3 @@ pub fn emitCmp(self: *Lowering, lhs: Ref, rhs: Ref, op: ast.BinaryOp.Op) Ref { else => self.builder.constBool(false), }; } - -// ── Defer/Push/MultiAssign ────────────────────────────────────── diff --git a/src/ir/lower/ffi.zig b/src/ir/lower/ffi.zig index 03a8e1d..c344910 100644 --- a/src/ir/lower/ffi.zig +++ b/src/ir/lower/ffi.zig @@ -6,42 +6,14 @@ const types = @import("../types.zig"); const inst_mod = @import("../inst.zig"); const mod_mod = @import("../module.zig"); const type_bridge = @import("../type_bridge.zig"); -const unescape = @import("../../unescape.zig"); -const parser_mod = @import("../../parser.zig"); -const interp_mod = @import("../interp.zig"); -const errors = @import("../../errors.zig"); const jni_descriptor = @import("../jni_descriptor.zig"); -const program_index_mod = @import("../program_index.zig"); -const resolver_mod = @import("../resolver.zig"); -const imports_mod = @import("../../imports.zig"); -const ProgramIndex = program_index_mod.ProgramIndex; -const GlobalInfo = program_index_mod.GlobalInfo; -const StructTemplate = program_index_mod.StructTemplate; -const TemplateParam = program_index_mod.TemplateParam; -const ProtocolDeclInfo = program_index_mod.ProtocolDeclInfo; -const ProtocolMethodInfo = program_index_mod.ProtocolMethodInfo; -const ModuleConstInfo = program_index_mod.ModuleConstInfo; -const TypeResolver = @import("../type_resolver.zig").TypeResolver; -const ResolveEnv = @import("../type_resolver.zig").ResolveEnv; -const PackResolver = @import("../packs.zig").PackResolver; -const ExprTyper = @import("../expr_typer.zig").ExprTyper; -const CallResolver = @import("../calls.zig").CallResolver; -const GenericResolver = @import("../generics.zig").GenericResolver; -const ProtocolResolver = @import("../protocols.zig").ProtocolResolver; -const CoercionResolver = @import("../conversions.zig").CoercionResolver; -const ErrorAnalysis = @import("../error_analysis.zig").ErrorAnalysis; -const ErrorFlow = @import("../error_flow.zig").ErrorFlow; const ObjcLowering = @import("../ffi_objc.zig").ObjcLowering; -const semantic_diagnostics = @import("../semantic_diagnostics.zig"); const TypeId = types.TypeId; -const StringId = types.StringId; const Ref = inst_mod.Ref; -const BlockId = inst_mod.BlockId; const FuncId = inst_mod.FuncId; const Function = inst_mod.Function; const Module = mod_mod.Module; -const Builder = mod_mod.Builder; const lower = @import("../lower.zig"); @@ -378,7 +350,8 @@ pub fn lowerForeignMethodCall( // Pure Obj-C decision helpers (selector derivation, type-encoding, ARC // property-kind, class-pointer recognition, state-struct planning) live in // `ffi_objc.zig` (`ObjcLowering`, a `*Lowering` facade). Reached via -// `self.objc()`. Emission-heavy IMP builders + `lowerObjc*Call` stay here. +// `self.objc()`. Emission-heavy IMP builders live in lower/objc_class.zig; +// the `lowerObjc*Call` lowering paths are below. /// Resolve a foreign-class member type, substituting `Self` (and `*Self`) /// with the foreign class's own struct type. Without this substitution @@ -805,7 +778,7 @@ pub fn lowerSuperCall( } }, ret_ty); } -// ── Calls ─────────────────────────────────────────────────────── +// ── Foreign-class registration ────────────────────────────────── /// Register a foreign-class declaration. The alias goes into /// `foreign_class_map` for method-dispatch lookup. The underlying @@ -1054,7 +1027,7 @@ pub fn registerNamespacedForeignClasses(self: *Lowering, ns: ast.NamespaceDecl) } -// ── Protocol dispatch ────────────────────────────────────────── +// ── JNI main stubs ───────────────────────────────────────────── pub fn synthesizeJniMainStubs(self: *Lowering) void { var seen = std.StringHashMap(void).init(self.alloc); diff --git a/src/ir/lower/generic.zig b/src/ir/lower/generic.zig index 03b7e73..e3fb5c8 100644 --- a/src/ir/lower/generic.zig +++ b/src/ir/lower/generic.zig @@ -4,44 +4,15 @@ const ast = @import("../../ast.zig"); const Node = ast.Node; const types = @import("../types.zig"); const inst_mod = @import("../inst.zig"); -const mod_mod = @import("../module.zig"); const type_bridge = @import("../type_bridge.zig"); -const unescape = @import("../../unescape.zig"); -const parser_mod = @import("../../parser.zig"); -const interp_mod = @import("../interp.zig"); -const errors = @import("../../errors.zig"); -const jni_descriptor = @import("../jni_descriptor.zig"); const program_index_mod = @import("../program_index.zig"); -const resolver_mod = @import("../resolver.zig"); -const imports_mod = @import("../../imports.zig"); -const ProgramIndex = program_index_mod.ProgramIndex; -const GlobalInfo = program_index_mod.GlobalInfo; const StructTemplate = program_index_mod.StructTemplate; -const TemplateParam = program_index_mod.TemplateParam; -const ProtocolDeclInfo = program_index_mod.ProtocolDeclInfo; -const ProtocolMethodInfo = program_index_mod.ProtocolMethodInfo; -const ModuleConstInfo = program_index_mod.ModuleConstInfo; -const TypeResolver = @import("../type_resolver.zig").TypeResolver; -const ResolveEnv = @import("../type_resolver.zig").ResolveEnv; -const PackResolver = @import("../packs.zig").PackResolver; -const ExprTyper = @import("../expr_typer.zig").ExprTyper; -const CallResolver = @import("../calls.zig").CallResolver; const GenericResolver = @import("../generics.zig").GenericResolver; -const ProtocolResolver = @import("../protocols.zig").ProtocolResolver; -const CoercionResolver = @import("../conversions.zig").CoercionResolver; -const ErrorAnalysis = @import("../error_analysis.zig").ErrorAnalysis; -const ErrorFlow = @import("../error_flow.zig").ErrorFlow; -const ObjcLowering = @import("../ffi_objc.zig").ObjcLowering; -const semantic_diagnostics = @import("../semantic_diagnostics.zig"); const TypeId = types.TypeId; -const StringId = types.StringId; const Ref = inst_mod.Ref; -const BlockId = inst_mod.BlockId; const FuncId = inst_mod.FuncId; const Function = inst_mod.Function; -const Module = mod_mod.Module; -const Builder = mod_mod.Builder; const lower = @import("../lower.zig"); @@ -211,7 +182,7 @@ pub fn monomorphizeFunction(self: *Lowering, fd: *const ast.FnDecl, mangled_name self.builder.inst_counter = saved_counter; } -// ── Reflection builtins ──────────────────────────────────────── +// ── Type-arg resolution & matching ───────────────────────────── /// Resolve a type argument from a call expression. Handles: /// - Type param bindings ($T → concrete type via type_bindings) @@ -1806,5 +1777,3 @@ pub fn findUnionInBody(body: *const Node) ?ast.EnumDecl { } return null; } - -// ── Type registration ─────────────────────────────────────────── diff --git a/src/ir/lower/nominal.zig b/src/ir/lower/nominal.zig index d587f15..b26ec0f 100644 --- a/src/ir/lower/nominal.zig +++ b/src/ir/lower/nominal.zig @@ -1,52 +1,21 @@ const std = @import("std"); -const Allocator = std.mem.Allocator; const ast = @import("../../ast.zig"); const Node = ast.Node; const types = @import("../types.zig"); -const inst_mod = @import("../inst.zig"); const mod_mod = @import("../module.zig"); const type_bridge = @import("../type_bridge.zig"); -const unescape = @import("../../unescape.zig"); -const parser_mod = @import("../../parser.zig"); -const interp_mod = @import("../interp.zig"); -const errors = @import("../../errors.zig"); -const jni_descriptor = @import("../jni_descriptor.zig"); const program_index_mod = @import("../program_index.zig"); const resolver_mod = @import("../resolver.zig"); -const imports_mod = @import("../../imports.zig"); -const ProgramIndex = program_index_mod.ProgramIndex; -const GlobalInfo = program_index_mod.GlobalInfo; const StructTemplate = program_index_mod.StructTemplate; const TemplateParam = program_index_mod.TemplateParam; -const ProtocolDeclInfo = program_index_mod.ProtocolDeclInfo; -const ProtocolMethodInfo = program_index_mod.ProtocolMethodInfo; -const ModuleConstInfo = program_index_mod.ModuleConstInfo; -const TypeResolver = @import("../type_resolver.zig").TypeResolver; -const ResolveEnv = @import("../type_resolver.zig").ResolveEnv; -const PackResolver = @import("../packs.zig").PackResolver; -const ExprTyper = @import("../expr_typer.zig").ExprTyper; -const CallResolver = @import("../calls.zig").CallResolver; -const GenericResolver = @import("../generics.zig").GenericResolver; -const ProtocolResolver = @import("../protocols.zig").ProtocolResolver; -const CoercionResolver = @import("../conversions.zig").CoercionResolver; -const ErrorAnalysis = @import("../error_analysis.zig").ErrorAnalysis; -const ErrorFlow = @import("../error_flow.zig").ErrorFlow; -const ObjcLowering = @import("../ffi_objc.zig").ObjcLowering; -const semantic_diagnostics = @import("../semantic_diagnostics.zig"); const TypeId = types.TypeId; const StringId = types.StringId; -const Ref = inst_mod.Ref; -const BlockId = inst_mod.BlockId; -const FuncId = inst_mod.FuncId; -const Function = inst_mod.Function; const Module = mod_mod.Module; -const Builder = mod_mod.Builder; const lower = @import("../lower.zig"); const Lowering = lower.Lowering; -const Scope = lower.Scope; const VisibleStructAuthor = Lowering.VisibleStructAuthor; const structDeclOfRaw = Lowering.structDeclOfRaw; diff --git a/src/ir/lower/objc_class.zig b/src/ir/lower/objc_class.zig index 016aec1..105fdf4 100644 --- a/src/ir/lower/objc_class.zig +++ b/src/ir/lower/objc_class.zig @@ -1,52 +1,19 @@ const std = @import("std"); -const Allocator = std.mem.Allocator; const ast = @import("../../ast.zig"); const Node = ast.Node; const types = @import("../types.zig"); const inst_mod = @import("../inst.zig"); const mod_mod = @import("../module.zig"); -const type_bridge = @import("../type_bridge.zig"); -const unescape = @import("../../unescape.zig"); -const parser_mod = @import("../../parser.zig"); -const interp_mod = @import("../interp.zig"); -const errors = @import("../../errors.zig"); -const jni_descriptor = @import("../jni_descriptor.zig"); -const program_index_mod = @import("../program_index.zig"); -const resolver_mod = @import("../resolver.zig"); -const imports_mod = @import("../../imports.zig"); -const ProgramIndex = program_index_mod.ProgramIndex; -const GlobalInfo = program_index_mod.GlobalInfo; -const StructTemplate = program_index_mod.StructTemplate; -const TemplateParam = program_index_mod.TemplateParam; -const ProtocolDeclInfo = program_index_mod.ProtocolDeclInfo; -const ProtocolMethodInfo = program_index_mod.ProtocolMethodInfo; -const ModuleConstInfo = program_index_mod.ModuleConstInfo; -const TypeResolver = @import("../type_resolver.zig").TypeResolver; -const ResolveEnv = @import("../type_resolver.zig").ResolveEnv; -const PackResolver = @import("../packs.zig").PackResolver; -const ExprTyper = @import("../expr_typer.zig").ExprTyper; -const CallResolver = @import("../calls.zig").CallResolver; -const GenericResolver = @import("../generics.zig").GenericResolver; -const ProtocolResolver = @import("../protocols.zig").ProtocolResolver; -const CoercionResolver = @import("../conversions.zig").CoercionResolver; -const ErrorAnalysis = @import("../error_analysis.zig").ErrorAnalysis; -const ErrorFlow = @import("../error_flow.zig").ErrorFlow; -const ObjcLowering = @import("../ffi_objc.zig").ObjcLowering; -const semantic_diagnostics = @import("../semantic_diagnostics.zig"); const TypeId = types.TypeId; -const StringId = types.StringId; const Ref = inst_mod.Ref; -const BlockId = inst_mod.BlockId; const FuncId = inst_mod.FuncId; const Function = inst_mod.Function; const Module = mod_mod.Module; -const Builder = mod_mod.Builder; const lower = @import("../lower.zig"); const Lowering = lower.Lowering; -const Scope = lower.Scope; /// Emit a C-ABI exported function for every bodied method on a /// `#jni_main #jni_class("...")` declaration. The symbol name follows diff --git a/src/ir/lower/pack.zig b/src/ir/lower/pack.zig index 70e4262..d124910 100644 --- a/src/ir/lower/pack.zig +++ b/src/ir/lower/pack.zig @@ -1,47 +1,12 @@ const std = @import("std"); -const Allocator = std.mem.Allocator; const ast = @import("../../ast.zig"); const Node = ast.Node; const types = @import("../types.zig"); const inst_mod = @import("../inst.zig"); -const mod_mod = @import("../module.zig"); -const type_bridge = @import("../type_bridge.zig"); -const unescape = @import("../../unescape.zig"); -const parser_mod = @import("../../parser.zig"); -const interp_mod = @import("../interp.zig"); -const errors = @import("../../errors.zig"); -const jni_descriptor = @import("../jni_descriptor.zig"); -const program_index_mod = @import("../program_index.zig"); -const resolver_mod = @import("../resolver.zig"); -const imports_mod = @import("../../imports.zig"); -const ProgramIndex = program_index_mod.ProgramIndex; -const GlobalInfo = program_index_mod.GlobalInfo; -const StructTemplate = program_index_mod.StructTemplate; -const TemplateParam = program_index_mod.TemplateParam; -const ProtocolDeclInfo = program_index_mod.ProtocolDeclInfo; -const ProtocolMethodInfo = program_index_mod.ProtocolMethodInfo; -const ModuleConstInfo = program_index_mod.ModuleConstInfo; -const TypeResolver = @import("../type_resolver.zig").TypeResolver; -const ResolveEnv = @import("../type_resolver.zig").ResolveEnv; -const PackResolver = @import("../packs.zig").PackResolver; -const ExprTyper = @import("../expr_typer.zig").ExprTyper; -const CallResolver = @import("../calls.zig").CallResolver; -const GenericResolver = @import("../generics.zig").GenericResolver; -const ProtocolResolver = @import("../protocols.zig").ProtocolResolver; -const CoercionResolver = @import("../conversions.zig").CoercionResolver; -const ErrorAnalysis = @import("../error_analysis.zig").ErrorAnalysis; -const ErrorFlow = @import("../error_flow.zig").ErrorFlow; -const ObjcLowering = @import("../ffi_objc.zig").ObjcLowering; -const semantic_diagnostics = @import("../semantic_diagnostics.zig"); const TypeId = types.TypeId; -const StringId = types.StringId; const Ref = inst_mod.Ref; -const BlockId = inst_mod.BlockId; -const FuncId = inst_mod.FuncId; const Function = inst_mod.Function; -const Module = mod_mod.Module; -const Builder = mod_mod.Builder; const lower = @import("../lower.zig"); @@ -488,7 +453,7 @@ pub fn packVariadicCallArgs(self: *Lowering, fd: *const ast.FnDecl, c: *const as args.append(self.alloc, slice_val) catch unreachable; } -// ── Generic monomorphization ────────────────────────────────── +// ── Pack-fn calls & monomorphization ────────────────────────── /// Build an `[]Any` slice value from the mono's pack params and /// bind it to the pack name in scope. Each pack-param slot is diff --git a/src/ir/lower/protocol.zig b/src/ir/lower/protocol.zig index 6f16db5..2f7f0e1 100644 --- a/src/ir/lower/protocol.zig +++ b/src/ir/lower/protocol.zig @@ -4,48 +4,18 @@ const ast = @import("../../ast.zig"); const Node = ast.Node; const types = @import("../types.zig"); const inst_mod = @import("../inst.zig"); -const mod_mod = @import("../module.zig"); -const type_bridge = @import("../type_bridge.zig"); -const unescape = @import("../../unescape.zig"); -const parser_mod = @import("../../parser.zig"); -const interp_mod = @import("../interp.zig"); -const errors = @import("../../errors.zig"); -const jni_descriptor = @import("../jni_descriptor.zig"); const program_index_mod = @import("../program_index.zig"); -const resolver_mod = @import("../resolver.zig"); -const imports_mod = @import("../../imports.zig"); -const ProgramIndex = program_index_mod.ProgramIndex; -const GlobalInfo = program_index_mod.GlobalInfo; -const StructTemplate = program_index_mod.StructTemplate; -const TemplateParam = program_index_mod.TemplateParam; const ProtocolDeclInfo = program_index_mod.ProtocolDeclInfo; const ProtocolMethodInfo = program_index_mod.ProtocolMethodInfo; -const ModuleConstInfo = program_index_mod.ModuleConstInfo; -const TypeResolver = @import("../type_resolver.zig").TypeResolver; -const ResolveEnv = @import("../type_resolver.zig").ResolveEnv; -const PackResolver = @import("../packs.zig").PackResolver; -const ExprTyper = @import("../expr_typer.zig").ExprTyper; -const CallResolver = @import("../calls.zig").CallResolver; -const GenericResolver = @import("../generics.zig").GenericResolver; const ProtocolResolver = @import("../protocols.zig").ProtocolResolver; -const CoercionResolver = @import("../conversions.zig").CoercionResolver; -const ErrorAnalysis = @import("../error_analysis.zig").ErrorAnalysis; -const ErrorFlow = @import("../error_flow.zig").ErrorFlow; -const ObjcLowering = @import("../ffi_objc.zig").ObjcLowering; -const semantic_diagnostics = @import("../semantic_diagnostics.zig"); const TypeId = types.TypeId; -const StringId = types.StringId; const Ref = inst_mod.Ref; -const BlockId = inst_mod.BlockId; const FuncId = inst_mod.FuncId; const Function = inst_mod.Function; -const Module = mod_mod.Module; -const Builder = mod_mod.Builder; const lower = @import("../lower.zig"); const Lowering = lower.Lowering; -const Scope = lower.Scope; /// Shared implementation for the `has_impl(P, T)` builtin and its /// `tryConstBoolCondition` arm. The protocol expression is either: @@ -193,7 +163,9 @@ pub fn instantiateParamProtocol(self: *Lowering, pd: *const ast.ProtocolDecl, ar return id; } -// ── Pack projection name resolution (Feature 1, Decision 4) ────────── +// ── Protocol namespace lookups (pack projection, Feature 1, Decision 4) ── +// (The position-driven orchestrator `resolvePackProjection` lives in +// lower/pack.zig; these two lookups are its per-namespace halves.) // // A `..pack.` projection can target two protocol namespaces: // - type-arg namespace: the `protocol($T, ...)` params. @@ -634,5 +606,3 @@ pub fn resolveConcreteTypeName(self: *Lowering, ty: TypeId) ?[]const u8 { if (info == .@"struct") return self.module.types.getString(info.@"struct".name); return null; } - -// ── Helpers ───────────────────────────────────────────────────── diff --git a/src/ir/lower/stmt.zig b/src/ir/lower/stmt.zig index 4b427f8..afa992f 100644 --- a/src/ir/lower/stmt.zig +++ b/src/ir/lower/stmt.zig @@ -1,47 +1,14 @@ const std = @import("std"); -const Allocator = std.mem.Allocator; const ast = @import("../../ast.zig"); const Node = ast.Node; const types = @import("../types.zig"); const inst_mod = @import("../inst.zig"); const mod_mod = @import("../module.zig"); -const type_bridge = @import("../type_bridge.zig"); -const unescape = @import("../../unescape.zig"); -const parser_mod = @import("../../parser.zig"); -const interp_mod = @import("../interp.zig"); const errors = @import("../../errors.zig"); -const jni_descriptor = @import("../jni_descriptor.zig"); -const program_index_mod = @import("../program_index.zig"); -const resolver_mod = @import("../resolver.zig"); -const imports_mod = @import("../../imports.zig"); -const ProgramIndex = program_index_mod.ProgramIndex; -const GlobalInfo = program_index_mod.GlobalInfo; -const StructTemplate = program_index_mod.StructTemplate; -const TemplateParam = program_index_mod.TemplateParam; -const ProtocolDeclInfo = program_index_mod.ProtocolDeclInfo; -const ProtocolMethodInfo = program_index_mod.ProtocolMethodInfo; -const ModuleConstInfo = program_index_mod.ModuleConstInfo; -const TypeResolver = @import("../type_resolver.zig").TypeResolver; -const ResolveEnv = @import("../type_resolver.zig").ResolveEnv; -const PackResolver = @import("../packs.zig").PackResolver; -const ExprTyper = @import("../expr_typer.zig").ExprTyper; -const CallResolver = @import("../calls.zig").CallResolver; -const GenericResolver = @import("../generics.zig").GenericResolver; -const ProtocolResolver = @import("../protocols.zig").ProtocolResolver; -const CoercionResolver = @import("../conversions.zig").CoercionResolver; -const ErrorAnalysis = @import("../error_analysis.zig").ErrorAnalysis; -const ErrorFlow = @import("../error_flow.zig").ErrorFlow; -const ObjcLowering = @import("../ffi_objc.zig").ObjcLowering; -const semantic_diagnostics = @import("../semantic_diagnostics.zig"); const TypeId = types.TypeId; -const StringId = types.StringId; const Ref = inst_mod.Ref; -const BlockId = inst_mod.BlockId; -const FuncId = inst_mod.FuncId; -const Function = inst_mod.Function; const Module = mod_mod.Module; -const Builder = mod_mod.Builder; const lower = @import("../lower.zig"); const Lowering = lower.Lowering; @@ -1009,7 +976,7 @@ pub fn emitCompoundOp(self: *Lowering, lhs: Ref, rhs: Ref, op: ast.Assignment.Op }; } -// ── Expression lowering ───────────────────────────────────────── +// ── Defer / cleanup ───────────────────────────────────────────── pub fn lowerDefer(self: *Lowering, ds: *const ast.DeferStmt) void { // Push deferred expression onto the stack — emitted at every block exit, LIFO. @@ -1272,5 +1239,3 @@ pub fn lowerDestructureDecl(self: *Lowering, dd: *const ast.DestructureDecl) voi // (ERR E3.2). A plain (non-failable) tuple destructure clears nothing. if (self.errorChannelOf(ty) != null) self.emitTraceClear(); } - -// ── Comptime lowering ────────────────────────────────────────────