/** * type-gate.ts — 全ノード型確定ゲート(`UNTYPED_NODE` — SA5・scp-only-authoring-contract §4.4, #125)。 * * `compileBehaviors` の終端で、**全 body ノードの出力型**と **`output`(Φ 合成)の全フィールド型**が * 一意に確定していることを網羅検査する(未確定が一つでもあれば fail-closed で `UNTYPED_NODE`)。 * これが typed-native(go/rust)codegen が端まで型付きフラット(boxed `Value` へ落ちない)である * ことを保証する構造条件(consumer-interface.md §2.3 / bc#77 `isFullyTyped` と同一基準)。 * * ## 「確定(determined)」の定義(BC は推論しない — consumer-interface.md C3) * * ゲートは型を **導出(infer)しない**。既に consumer が確定させた型が **PRESENT かつ resolvable** で * あることを検査する(proposal §4.4「BC が強制するのは『確定していること』であって『型を導出すること』 * ではない」): * * - **body ノード**: 各ノード(componentRef / map / cond / fanout)が resolvable な `outType` を持つ。 * base 型は leaf の catalog `elemType`(A1 の `defineLeaf` 由来。`recordComponentCall` が `.as` 未指定時に * ノードへ焼く)から、projection/合成点は `.as()`(A1)で上書き確定させる。どちらも無い(`outType` * 欠落)ノードは `UNTYPED_NODE`。 * - **`output`(Φ 合成)**: object 合成の**全フィールド**が確定型へ resolvable であること。フィールドの * 多くは body ノード結果参照(`{ref:[nodeId, …path]}`)で、確定済み `outType` を path で辿って解決する * (=既に確定した型の構造的伝播であって推論ではない)。解決できないフィールドは `UNTYPED_NODE`。 * * ## `outputType` の合成(構造伝播 + 宣言 operator シグネチャの適用・非推論) * * ゲートは検査と同時に、確定済みノード型から `output` 式を辿って component の `outputType` を組み立てる * (compile 産 IR を「全ノード + component が型付き」= `isFullyTyped` にし、native codegen の入力に * できる状態にする)。これは新しい型を推論するのではなく、consumer が確定させた型(`.as`/catalog)と、 * **operator 語彙レベルで明示宣言された型シグネチャ**(`expr-operator-types.ts` の SSoT)を `output` の * 配線どおりに合成するだけ。operator の結果型を `resolveExprType` に ad-hoc な per-operator 分岐で * 埋め込むのではなく、`operatorSignature` / `resolveOperatorResult` で **宣言テーブルを読む**——これが * consumer-interface.md §2.1 C3「BC は明示注記を読むだけ・推論しない」との整合(operator シグネチャが * 語彙レベルの明示注記であり、結果型はその決定的な適用)。owner 決定(#125/A3)で規範確定。 * * gate は `compileBehaviors` の終端と **codegen 入口**(`generator/core.ts` の `generateModule` — 全 * emitter が通る 1 点)に置く。`loadCompiledIR`(境界 loader・A2)が受ける生 JSON は * **既に compile 済みの artifact** で `compileBehaviors` を通らないため、このゲートは適用しない * (conformance vector の再ペイントを避ける — #128/A6 スコープ)。 */ import { type Component, type PortableType, type PortSchema } from "./behavior.js"; /** * UntypedNodeError — 型未確定ノード/フィールドを検出したときの fail-closed 失敗(SA5・0.8.0 end-state)。 * offending なノード id / メソッド / フィールドを message で名指す。 */ export declare class UntypedNodeError extends Error { code: "UNTYPED_NODE"; constructor(message: string); } /** * ExprTypeError — 式が「型は解決できるが、その operator/位置が要求する型ではない」ときの * fail-closed 失敗(`UNTYPED_NODE`=未確定 とは別物)。expression-ir.md §3 の operand 制約: * - 条件(`?:` / `&&` の cond・gate・`map.when`)は **bool のみ**(truthiness 禁止 — L120/L128)。 * - `len` の被演算子は **配列のみ**(L124)。`and`/`or`/`not` の被演算子は **bool のみ**。 * これは両 reader(AST / recorder)が同じ IR を出すため byte-equal では検出できない — 型解決の * SSoT である本ゲートが唯一の reader 非依存の検査点(record 時は port 型が未確定で assert できない)。 */ export declare class ExprTypeError extends Error { code: "BAD_OPERAND_TYPE"; constructor(message: string); } /** * NodeTypeError — ノードの**宣言 `outType` が、そのノードが産み得る値を表現できない**ときの * fail-closed 失敗(`UNTYPED_NODE`=未確定 とも `BAD_OPERAND_TYPE`=式の被演算子違反 とも別物)。 * * 宣言が契約なので、契約が実行時に必ず破れる形(未生成が起きたら落ちるとしか読めない型)は、 * 実行してから気付くのではなく generate 時に落とす(#220 の前倒しと同じ規律 — #232)。 */ export declare class NodeTypeError extends Error { code: "NODE_TYPE_MISMATCH"; constructor(message: string); } /** * resolveExprType — `output`(Φ 合成)に現れる Expression IR ノードの確定型を、確定済みノード型 * (`nodeTypes`)と input port 型から**構造的に解決**する。BC は推論しない — ここで解決するのは * すべて「consumer が既に確定させた型」の配線どおりの伝播(ref 参照先の `outType` を path で辿る、 * object 合成を field ごとに組む、等)である。解決できない位置は `undefined` を返し、呼び側が * `UNTYPED_NODE` にする。 */ export declare function resolveExprType(node: unknown, nodeTypes: Map, inputPorts: Record, narrowed?: ReadonlySet): PortableType | undefined; /** * canonicalizeType — 導出 PortableType の obj field キーを code-point 順に再構築する * (builder.ts の canonicalizeDeep と同じ規律。golden/fingerprint の決定性のため component の * 他フィールドと同じ正準形に揃える)。 */ export declare function canonicalizeType(t: PortableType): PortableType; /** * assertAllNodeTypesDetermined — component の全ノード型確定を網羅検査し(未確定は `UNTYPED_NODE`)、 * 確定済みノード型から `output`(Φ 合成)を辿って `outputType` を導出して返す(構造伝播・非推論)。 * * @param comp canonical 化済み `Component`(body ノードは `outType` 注記を持ち得る)。 * @param method 名指し用のメソッド名(= component 名)。 * @returns 導出した `outputType`(PortableType)。全フィールドが確定したときのみ返る。 * @throws {UntypedNodeError} 型未確定のノード/フィールドがあるとき(offending を名指す)。 */ export declare function assertAllNodeTypesDetermined(comp: Component): PortableType; //# sourceMappingURL=type-gate.d.ts.map