behavior-contracts 0.1.3 → 0.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +8 -2
- package/dist/authoring.d.ts +202 -0
- package/dist/authoring.d.ts.map +1 -0
- package/dist/authoring.js +787 -0
- package/dist/authoring.js.map +1 -0
- package/dist/behavior.d.ts +248 -0
- package/dist/behavior.d.ts.map +1 -0
- package/dist/behavior.js +373 -0
- package/dist/behavior.js.map +1 -0
- package/dist/builder.d.ts +154 -0
- package/dist/builder.d.ts.map +1 -0
- package/dist/builder.js +574 -0
- package/dist/builder.js.map +1 -0
- package/dist/generator/core.d.ts +89 -0
- package/dist/generator/core.d.ts.map +1 -0
- package/dist/generator/core.js +124 -0
- package/dist/generator/core.js.map +1 -0
- package/dist/generator/emit-go.d.ts +19 -0
- package/dist/generator/emit-go.d.ts.map +1 -0
- package/dist/generator/emit-go.js +79 -0
- package/dist/generator/emit-go.js.map +1 -0
- package/dist/generator/emit-php.d.ts +20 -0
- package/dist/generator/emit-php.d.ts.map +1 -0
- package/dist/generator/emit-php.js +76 -0
- package/dist/generator/emit-php.js.map +1 -0
- package/dist/generator/emit-python.d.ts +10 -0
- package/dist/generator/emit-python.d.ts.map +1 -0
- package/dist/generator/emit-python.js +75 -0
- package/dist/generator/emit-python.js.map +1 -0
- package/dist/generator/emit-rust.d.ts +25 -0
- package/dist/generator/emit-rust.d.ts.map +1 -0
- package/dist/generator/emit-rust.js +125 -0
- package/dist/generator/emit-rust.js.map +1 -0
- package/dist/generator/emit-straightline-go.d.ts +77 -0
- package/dist/generator/emit-straightline-go.d.ts.map +1 -0
- package/dist/generator/emit-straightline-go.js +592 -0
- package/dist/generator/emit-straightline-go.js.map +1 -0
- package/dist/generator/emit-straightline-php.d.ts +46 -0
- package/dist/generator/emit-straightline-php.d.ts.map +1 -0
- package/dist/generator/emit-straightline-php.js +501 -0
- package/dist/generator/emit-straightline-php.js.map +1 -0
- package/dist/generator/emit-straightline-python.d.ts +36 -0
- package/dist/generator/emit-straightline-python.d.ts.map +1 -0
- package/dist/generator/emit-straightline-python.js +441 -0
- package/dist/generator/emit-straightline-python.js.map +1 -0
- package/dist/generator/emit-straightline-rust.d.ts +78 -0
- package/dist/generator/emit-straightline-rust.d.ts.map +1 -0
- package/dist/generator/emit-straightline-rust.js +615 -0
- package/dist/generator/emit-straightline-rust.js.map +1 -0
- package/dist/generator/emit-straightline-typed-go.d.ts +39 -0
- package/dist/generator/emit-straightline-typed-go.d.ts.map +1 -0
- package/dist/generator/emit-straightline-typed-go.js +828 -0
- package/dist/generator/emit-straightline-typed-go.js.map +1 -0
- package/dist/generator/emit-straightline-typed-rust.d.ts +48 -0
- package/dist/generator/emit-straightline-typed-rust.d.ts.map +1 -0
- package/dist/generator/emit-straightline-typed-rust.js +823 -0
- package/dist/generator/emit-straightline-typed-rust.js.map +1 -0
- package/dist/generator/emit-straightline-typed-typescript.d.ts +49 -0
- package/dist/generator/emit-straightline-typed-typescript.d.ts.map +1 -0
- package/dist/generator/emit-straightline-typed-typescript.js +314 -0
- package/dist/generator/emit-straightline-typed-typescript.js.map +1 -0
- package/dist/generator/emit-straightline-typescript.d.ts +36 -0
- package/dist/generator/emit-straightline-typescript.d.ts.map +1 -0
- package/dist/generator/emit-straightline-typescript.js +397 -0
- package/dist/generator/emit-straightline-typescript.js.map +1 -0
- package/dist/generator/emit-typescript.d.ts +11 -0
- package/dist/generator/emit-typescript.d.ts.map +1 -0
- package/dist/generator/emit-typescript.js +68 -0
- package/dist/generator/emit-typescript.js.map +1 -0
- package/dist/generator/fingerprint.d.ts +14 -0
- package/dist/generator/fingerprint.d.ts.map +1 -0
- package/dist/generator/fingerprint.js +74 -0
- package/dist/generator/fingerprint.js.map +1 -0
- package/dist/generator/index.d.ts +22 -0
- package/dist/generator/index.d.ts.map +1 -0
- package/dist/generator/index.js +64 -0
- package/dist/generator/index.js.map +1 -0
- package/dist/generator/literal.d.ts +15 -0
- package/dist/generator/literal.d.ts.map +1 -0
- package/dist/generator/literal.js +232 -0
- package/dist/generator/literal.js.map +1 -0
- package/dist/generator/straightline.d.ts +147 -0
- package/dist/generator/straightline.d.ts.map +1 -0
- package/dist/generator/straightline.js +122 -0
- package/dist/generator/straightline.js.map +1 -0
- package/dist/generator/typed.d.ts +156 -0
- package/dist/generator/typed.d.ts.map +1 -0
- package/dist/generator/typed.js +108 -0
- package/dist/generator/typed.js.map +1 -0
- package/dist/guard.d.ts +36 -0
- package/dist/guard.d.ts.map +1 -1
- package/dist/guard.js +186 -0
- package/dist/guard.js.map +1 -1
- package/dist/index.d.ts +17 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +23 -2
- package/dist/index.js.map +1 -1
- package/dist/plan.d.ts +36 -0
- package/dist/plan.d.ts.map +1 -1
- package/dist/plan.js +152 -14
- package/dist/plan.js.map +1 -1
- package/dist/primitives.d.ts +112 -0
- package/dist/primitives.d.ts.map +1 -0
- package/dist/primitives.js +206 -0
- package/dist/primitives.js.map +1 -0
- package/package.json +4 -1
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* generator/index.ts — 共通 Generator の公開面(bc#13 SP1 + SP2)。
|
|
3
|
+
*
|
|
4
|
+
* 組み込み emitter(typescript / python / go / rust / php)を登録して公開する。
|
|
5
|
+
* 追加言語は emitter plugin を登録するだけでよい(core は言語中立)。
|
|
6
|
+
*/
|
|
7
|
+
import { registerEmitter } from "./core.js";
|
|
8
|
+
import { typescriptEmitter } from "./emit-typescript.js";
|
|
9
|
+
import { pythonEmitter } from "./emit-python.js";
|
|
10
|
+
import { goEmitter } from "./emit-go.js";
|
|
11
|
+
import { rustEmitter } from "./emit-rust.js";
|
|
12
|
+
import { phpEmitter } from "./emit-php.js";
|
|
13
|
+
import { typescriptStraightlineEmitter } from "./emit-straightline-typescript.js";
|
|
14
|
+
import { rustStraightlineEmitter } from "./emit-straightline-rust.js";
|
|
15
|
+
import { phpStraightlineEmitter } from "./emit-straightline-php.js";
|
|
16
|
+
import { goStraightlineEmitter } from "./emit-straightline-go.js";
|
|
17
|
+
import { pythonStraightlineEmitter } from "./emit-straightline-python.js";
|
|
18
|
+
import { typescriptTypedEmitter } from "./emit-straightline-typed-typescript.js";
|
|
19
|
+
import { goTypedEmitter } from "./emit-straightline-typed-go.js";
|
|
20
|
+
import { rustTypedEmitter } from "./emit-straightline-typed-rust.js";
|
|
21
|
+
registerEmitter(typescriptEmitter);
|
|
22
|
+
registerEmitter(pythonEmitter);
|
|
23
|
+
registerEmitter(goEmitter);
|
|
24
|
+
registerEmitter(rustEmitter);
|
|
25
|
+
registerEmitter(phpEmitter);
|
|
26
|
+
// bc#37 A1: 直線 emit の TS emitter(golden oracle)。既存のリテラル焼き込みと併存する additive
|
|
27
|
+
// な第2モード(go/rust/python/php は A2 で同じ StraightlineDialect 枠に乗る)。
|
|
28
|
+
registerEmitter(typescriptStraightlineEmitter);
|
|
29
|
+
// bc#39 A2-rust: 直線 emit の rust emitter(単純式ネイティブ化 = Phase B 脱解釈)。
|
|
30
|
+
registerEmitter(rustStraightlineEmitter);
|
|
31
|
+
// bc#41 A2-php: 直線 emit の PHP emitter(単純式 native 化 = 脱解釈)。既存の php と併存。
|
|
32
|
+
registerEmitter(phpStraightlineEmitter);
|
|
33
|
+
// bc#38 A2: 直線 emit の Go emitter(de-interpretation: 単純 port を native 化)。
|
|
34
|
+
registerEmitter(goStraightlineEmitter);
|
|
35
|
+
// bc#40 A2: 直線 emit の python emitter(単純式を native 化する脱解釈経路)。
|
|
36
|
+
registerEmitter(pythonStraightlineEmitter);
|
|
37
|
+
// bc#46 B2-ts: typed 直線 emitter(outType → TS interface/型注釈, tsc 検証 oracle)。
|
|
38
|
+
// straight-line と併存する additive な第3モード。go/rust は #47/#48 で同じ typed seam に乗る。
|
|
39
|
+
registerEmitter(typescriptTypedEmitter);
|
|
40
|
+
// bc#47 B2-go: typed 直線 emitter(outType → 具体 Go struct・実 de-box)。最初のコンパイル言語の
|
|
41
|
+
// typed emitter として TypedMaterializer seam を runtime-materialization 対応へ拡張(rust #48 が乗る)。
|
|
42
|
+
registerEmitter(goTypedEmitter);
|
|
43
|
+
// bc#48 B2-rust: typed 直線 emitter(outType → 具体 Rust struct・実 de-box)。#47 で拡張された
|
|
44
|
+
// TypedMaterializer seam に同型で乗る(rust の materialization/型描画のみ足す・de-box 利得は最大)。
|
|
45
|
+
registerEmitter(rustTypedEmitter);
|
|
46
|
+
export { generateModule, registerEmitter, registeredLanguages, GeneratorFailure, } from "./core.js";
|
|
47
|
+
export { fingerprintComponentGraph, FingerprintFailure } from "./fingerprint.js";
|
|
48
|
+
export { typescriptEmitter } from "./emit-typescript.js";
|
|
49
|
+
export { pythonEmitter } from "./emit-python.js";
|
|
50
|
+
export { goEmitter } from "./emit-go.js";
|
|
51
|
+
export { rustEmitter } from "./emit-rust.js";
|
|
52
|
+
export { phpEmitter } from "./emit-php.js";
|
|
53
|
+
export { typescriptStraightlineEmitter } from "./emit-straightline-typescript.js";
|
|
54
|
+
export { rustStraightlineEmitter } from "./emit-straightline-rust.js";
|
|
55
|
+
export { phpStraightlineEmitter } from "./emit-straightline-php.js";
|
|
56
|
+
export { goStraightlineEmitter } from "./emit-straightline-go.js";
|
|
57
|
+
export { pythonStraightlineEmitter } from "./emit-straightline-python.js";
|
|
58
|
+
export { typescriptTypedEmitter, tsTypedMaterializer } from "./emit-straightline-typed-typescript.js";
|
|
59
|
+
export { goTypedEmitter, goTypedMaterializer } from "./emit-straightline-typed-go.js";
|
|
60
|
+
export { rustTypedEmitter, rustTypedMaterializer } from "./emit-straightline-typed-rust.js";
|
|
61
|
+
export { rustStraightlineInternals } from "./emit-straightline-rust.js";
|
|
62
|
+
export { assertStraightlineSupported, isStraightlineNode, buildComponentPlan, emitStraightlineModule, } from "./straightline.js";
|
|
63
|
+
export { buildTypePlan, deriveTypeRef, findDecl } from "./typed.js";
|
|
64
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/generator/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
export type LiteralStyle = "ts" | "py" | "go" | "rust" | "php";
|
|
2
|
+
/**
|
|
3
|
+
* emitDocLiteral — ドキュメントを言語ネイティブのリテラル式として emit する。
|
|
4
|
+
* インデント 1 段 = dialect の indentUnit(ts/py 2 space・go tab・rust/php 4 space)・
|
|
5
|
+
* 複数行(JSON.stringify(v, null, indent) と同じレイアウト規則)。
|
|
6
|
+
*/
|
|
7
|
+
export declare function emitDocLiteral(doc: unknown, style: LiteralStyle, indent?: number, path?: string): string;
|
|
8
|
+
/**
|
|
9
|
+
* emitDocLiteralCompact — {@link emitDocLiteral} の**単一行**版(改行・インデントなし)。
|
|
10
|
+
* 直線 emit(bc#37)が primitive 呼びの被演算子として渡す IR リテラルに使う(生成コードの
|
|
11
|
+
* 可読性と mutation の追跡性のため。決定性・スカラ規律・キー順保存は emitDocLiteral と同一)。
|
|
12
|
+
* additive: emitDocLiteral 本体は不変。
|
|
13
|
+
*/
|
|
14
|
+
export declare function emitDocLiteralCompact(doc: unknown, style: LiteralStyle, path?: string): string;
|
|
15
|
+
//# sourceMappingURL=literal.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"literal.d.ts","sourceRoot":"","sources":["../../src/generator/literal.ts"],"names":[],"mappings":"AA6BA,MAAM,MAAM,YAAY,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,MAAM,GAAG,KAAK,CAAC;AA4J/D;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,OAAO,EAAE,KAAK,EAAE,YAAY,EAAE,MAAM,SAAI,EAAE,IAAI,SAAM,GAAG,MAAM,CA0BhG;AAED;;;;;GAKG;AACH,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,OAAO,EAAE,KAAK,EAAE,YAAY,EAAE,IAAI,SAAM,GAAG,MAAM,CA2B3F"}
|
|
@@ -0,0 +1,232 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* literal.ts — 可搬 IR ドキュメントの決定的ネイティブリテラル emit(共通 Generator 内部)。
|
|
3
|
+
*
|
|
4
|
+
* 決定性の規律: 入力ドキュメントの**キー順を保存**したまま(ソートしない — port 式の
|
|
5
|
+
* 評価順序は宣言順が規範で、並べ替えは §7.3 の経路等価を壊し得る)、同一入力から
|
|
6
|
+
* byte-identical なリテラル文字列を出す。JSON.parse 済みドキュメントが入力なので、
|
|
7
|
+
* キー順は JSON テキストの順(JS の integer-like キー正規化を含む)で既に決定的。
|
|
8
|
+
* キーソートは fingerprint 側だけで行う(SP1 audit の SP2 指針 (a))。
|
|
9
|
+
*
|
|
10
|
+
* スカラ規律(クロス言語):
|
|
11
|
+
* - 文字列: 言語別エスケープ(ts/py/go は JSON エスケープで合法。rust は \u{...} 形、
|
|
12
|
+
* php は double-quote + $ エスケープ)。
|
|
13
|
+
* - 整数値 number: 整数リテラル(Python は int / Go は json.Number("…") — dynamic 経路の
|
|
14
|
+
* パーサ出力と一致)。|n| >= 2^53 は fail-closed(fingerprint.ts と同じ規律)。
|
|
15
|
+
* - 非整数 number: shortest round-trip 10進(`String(n)` — 全対象言語で合法なリテラル)。
|
|
16
|
+
* - -0.0: `-0.0` と emit(JSON.parse は -0 を保存する — 落とすと canonical 出力が発散)。
|
|
17
|
+
* - true/false/null: 言語別トークン。
|
|
18
|
+
* - undefined / 関数等: fail-closed(JSON.stringify の「黙って落とす」を許さない)。
|
|
19
|
+
*
|
|
20
|
+
* 言語別の複合リテラル形(各 emitter の実行 IF に合わせる):
|
|
21
|
+
* - ts: `{...}` / `[...]`(ComponentGraphIR 型付き const)
|
|
22
|
+
* - py: dict / list
|
|
23
|
+
* - go: `dslcontracts.JObjOf("k", v, …)` / `[]dslcontracts.JNode{…}` / `json.Number("…")`
|
|
24
|
+
* (RunBehavior の消費する JNode ドメイン。インデントは gofmt 規範の tab)
|
|
25
|
+
* - rust: serde_json `json!({...})` の中身(JSON 形。トークンは Rust 字句で合法)
|
|
26
|
+
* - php: `(object) [...]` / `[...]`(Behavior::runBehavior の stdClass/array ドメイン)
|
|
27
|
+
*/
|
|
28
|
+
import { FingerprintFailure } from "./fingerprint.js";
|
|
29
|
+
// ── 言語別文字列エスケープ ─────────────────────────────────────────────────────
|
|
30
|
+
/** Rust 文字列リテラル(\b/\f/\uXXXX は Rust に無いので \u{…} を使う。非 ASCII は素通し)。 */
|
|
31
|
+
function rustStr(s) {
|
|
32
|
+
let out = '"';
|
|
33
|
+
for (const ch of s) {
|
|
34
|
+
const cp = ch.codePointAt(0);
|
|
35
|
+
if (ch === '"')
|
|
36
|
+
out += '\\"';
|
|
37
|
+
else if (ch === "\\")
|
|
38
|
+
out += "\\\\";
|
|
39
|
+
else if (ch === "\n")
|
|
40
|
+
out += "\\n";
|
|
41
|
+
else if (ch === "\r")
|
|
42
|
+
out += "\\r";
|
|
43
|
+
else if (ch === "\t")
|
|
44
|
+
out += "\\t";
|
|
45
|
+
else if (cp < 0x20)
|
|
46
|
+
out += `\\u{${cp.toString(16)}}`;
|
|
47
|
+
else
|
|
48
|
+
out += ch;
|
|
49
|
+
}
|
|
50
|
+
return out + '"';
|
|
51
|
+
}
|
|
52
|
+
/** PHP double-quote 文字列リテラル($ は補間を防ぐためエスケープ。制御は \u{…})。 */
|
|
53
|
+
function phpStr(s) {
|
|
54
|
+
let out = '"';
|
|
55
|
+
for (const ch of s) {
|
|
56
|
+
const cp = ch.codePointAt(0);
|
|
57
|
+
if (ch === '"')
|
|
58
|
+
out += '\\"';
|
|
59
|
+
else if (ch === "\\")
|
|
60
|
+
out += "\\\\";
|
|
61
|
+
else if (ch === "$")
|
|
62
|
+
out += "\\$";
|
|
63
|
+
else if (ch === "\n")
|
|
64
|
+
out += "\\n";
|
|
65
|
+
else if (ch === "\r")
|
|
66
|
+
out += "\\r";
|
|
67
|
+
else if (ch === "\t")
|
|
68
|
+
out += "\\t";
|
|
69
|
+
else if (cp < 0x20)
|
|
70
|
+
out += `\\u{${cp.toString(16)}}`;
|
|
71
|
+
else
|
|
72
|
+
out += ch;
|
|
73
|
+
}
|
|
74
|
+
return out + '"';
|
|
75
|
+
}
|
|
76
|
+
const jsonishArr = (open, close) => (items, pad, padIn) => `${open}\n${items.map((v) => padIn + v).join(",\n")}\n${pad}${close}`;
|
|
77
|
+
const DIALECTS = {
|
|
78
|
+
ts: {
|
|
79
|
+
indentUnit: " ",
|
|
80
|
+
null: "null",
|
|
81
|
+
true: "true",
|
|
82
|
+
false: "false",
|
|
83
|
+
str: (s) => JSON.stringify(s),
|
|
84
|
+
int: (t) => t,
|
|
85
|
+
float: (t) => t,
|
|
86
|
+
emptyArr: "[]",
|
|
87
|
+
emptyObj: "{}",
|
|
88
|
+
arr: jsonishArr("[", "]"),
|
|
89
|
+
obj: (entries, pad, padIn) => `{\n${entries.map(([k, v]) => `${padIn}${JSON.stringify(k)}: ${v}`).join(",\n")}\n${pad}}`,
|
|
90
|
+
},
|
|
91
|
+
py: {
|
|
92
|
+
indentUnit: " ",
|
|
93
|
+
null: "None",
|
|
94
|
+
true: "True",
|
|
95
|
+
false: "False",
|
|
96
|
+
str: (s) => JSON.stringify(s),
|
|
97
|
+
int: (t) => t,
|
|
98
|
+
float: (t) => t,
|
|
99
|
+
emptyArr: "[]",
|
|
100
|
+
emptyObj: "{}",
|
|
101
|
+
arr: jsonishArr("[", "]"),
|
|
102
|
+
obj: (entries, pad, padIn) => `{\n${entries.map(([k, v]) => `${padIn}${JSON.stringify(k)}: ${v}`).join(",\n")}\n${pad}}`,
|
|
103
|
+
},
|
|
104
|
+
go: {
|
|
105
|
+
indentUnit: "\t",
|
|
106
|
+
null: "nil",
|
|
107
|
+
true: "true",
|
|
108
|
+
false: "false",
|
|
109
|
+
str: (s) => JSON.stringify(s), // JSON エスケープは Go 文字列リテラルとして合法
|
|
110
|
+
int: (t) => `json.Number("${t}")`,
|
|
111
|
+
float: (t) => `json.Number("${t}")`,
|
|
112
|
+
emptyArr: "[]dslcontracts.JNode{}",
|
|
113
|
+
emptyObj: "dslcontracts.JObjOf()",
|
|
114
|
+
arr: (items, pad, padIn) => `[]dslcontracts.JNode{\n${items.map((v) => `${padIn}${v},`).join("\n")}\n${pad}}`,
|
|
115
|
+
obj: (entries, pad, padIn) => `dslcontracts.JObjOf(\n${entries.map(([k, v]) => `${padIn}${JSON.stringify(k)}, ${v},`).join("\n")}\n${pad})`,
|
|
116
|
+
},
|
|
117
|
+
rust: {
|
|
118
|
+
indentUnit: " ",
|
|
119
|
+
null: "null", // json! マクロ内の JSON トークン
|
|
120
|
+
true: "true",
|
|
121
|
+
false: "false",
|
|
122
|
+
str: rustStr,
|
|
123
|
+
int: (t) => t,
|
|
124
|
+
float: (t) => t,
|
|
125
|
+
emptyArr: "[]",
|
|
126
|
+
emptyObj: "{}",
|
|
127
|
+
arr: jsonishArr("[", "]"),
|
|
128
|
+
obj: (entries, pad, padIn) => `{\n${entries.map(([k, v]) => `${padIn}${rustStr(k)}: ${v}`).join(",\n")}\n${pad}}`,
|
|
129
|
+
},
|
|
130
|
+
php: {
|
|
131
|
+
indentUnit: " ",
|
|
132
|
+
null: "null",
|
|
133
|
+
true: "true",
|
|
134
|
+
false: "false",
|
|
135
|
+
str: phpStr,
|
|
136
|
+
int: (t) => t,
|
|
137
|
+
float: (t) => t,
|
|
138
|
+
emptyArr: "[]",
|
|
139
|
+
emptyObj: "(object) []",
|
|
140
|
+
arr: (items, pad, padIn) => `[\n${items.map((v) => `${padIn}${v},`).join("\n")}\n${pad}]`,
|
|
141
|
+
obj: (entries, pad, padIn) => `(object) [\n${entries.map(([k, v]) => `${padIn}${phpStr(k)} => ${v},`).join("\n")}\n${pad}]`,
|
|
142
|
+
// 単一行 object(compact): PHP は `(object) ["k" => v, …]`({ } は PHP object リテラルでない)。
|
|
143
|
+
objCompact: (entries) => `(object) [${entries.map(([k, v]) => `${phpStr(k)} => ${v}`).join(", ")}]`,
|
|
144
|
+
},
|
|
145
|
+
};
|
|
146
|
+
function scalarNumber(n, path, d) {
|
|
147
|
+
if (!Number.isFinite(n))
|
|
148
|
+
throw new FingerprintFailure("INVALID_VALUE", `non-finite number at ${path} cannot be emitted (fail-closed)`);
|
|
149
|
+
if (Object.is(n, -0))
|
|
150
|
+
return d.float("-0.0");
|
|
151
|
+
if (Number.isInteger(n)) {
|
|
152
|
+
if (Math.abs(n) >= 2 ** 53)
|
|
153
|
+
throw new FingerprintFailure("UNSAFE_NUMBER", `integral number ${n} at ${path} exceeds float64-exact range; portable IR must use {int:"..."} (fail-closed)`);
|
|
154
|
+
return d.int(String(n));
|
|
155
|
+
}
|
|
156
|
+
return d.float(String(n)); // shortest round-trip("0.1" / "1e-7" — 全対象言語で合法)
|
|
157
|
+
}
|
|
158
|
+
/**
|
|
159
|
+
* emitDocLiteral — ドキュメントを言語ネイティブのリテラル式として emit する。
|
|
160
|
+
* インデント 1 段 = dialect の indentUnit(ts/py 2 space・go tab・rust/php 4 space)・
|
|
161
|
+
* 複数行(JSON.stringify(v, null, indent) と同じレイアウト規則)。
|
|
162
|
+
*/
|
|
163
|
+
export function emitDocLiteral(doc, style, indent = 0, path = "$") {
|
|
164
|
+
const d = DIALECTS[style];
|
|
165
|
+
const pad = d.indentUnit.repeat(indent);
|
|
166
|
+
const padIn = d.indentUnit.repeat(indent + 1);
|
|
167
|
+
if (doc === null)
|
|
168
|
+
return d.null;
|
|
169
|
+
if (typeof doc === "boolean")
|
|
170
|
+
return doc ? d.true : d.false;
|
|
171
|
+
if (typeof doc === "string")
|
|
172
|
+
return d.str(doc);
|
|
173
|
+
if (typeof doc === "number")
|
|
174
|
+
return scalarNumber(doc, path, d);
|
|
175
|
+
if (Array.isArray(doc)) {
|
|
176
|
+
if (doc.length === 0)
|
|
177
|
+
return d.emptyArr;
|
|
178
|
+
const items = doc.map((v, i) => emitDocLiteral(v, style, indent + 1, `${path}[${i}]`));
|
|
179
|
+
return d.arr(items, pad, padIn);
|
|
180
|
+
}
|
|
181
|
+
if (typeof doc === "object") {
|
|
182
|
+
const entries = Object.entries(doc);
|
|
183
|
+
if (entries.length === 0)
|
|
184
|
+
return d.emptyObj;
|
|
185
|
+
const emitted = entries.map(([k, v]) => [
|
|
186
|
+
k,
|
|
187
|
+
emitDocLiteral(v, style, indent + 1, `${path}.${k}`),
|
|
188
|
+
]);
|
|
189
|
+
return d.obj(emitted, pad, padIn);
|
|
190
|
+
}
|
|
191
|
+
throw new FingerprintFailure("INVALID_VALUE", `value of type ${typeof doc} at ${path} cannot be emitted as a portable IR literal (fail-closed)`);
|
|
192
|
+
}
|
|
193
|
+
/**
|
|
194
|
+
* emitDocLiteralCompact — {@link emitDocLiteral} の**単一行**版(改行・インデントなし)。
|
|
195
|
+
* 直線 emit(bc#37)が primitive 呼びの被演算子として渡す IR リテラルに使う(生成コードの
|
|
196
|
+
* 可読性と mutation の追跡性のため。決定性・スカラ規律・キー順保存は emitDocLiteral と同一)。
|
|
197
|
+
* additive: emitDocLiteral 本体は不変。
|
|
198
|
+
*/
|
|
199
|
+
export function emitDocLiteralCompact(doc, style, path = "$") {
|
|
200
|
+
const d = DIALECTS[style];
|
|
201
|
+
if (doc === null)
|
|
202
|
+
return d.null;
|
|
203
|
+
if (typeof doc === "boolean")
|
|
204
|
+
return doc ? d.true : d.false;
|
|
205
|
+
if (typeof doc === "string")
|
|
206
|
+
return d.str(doc);
|
|
207
|
+
if (typeof doc === "number")
|
|
208
|
+
return scalarNumber(doc, path, d);
|
|
209
|
+
if (Array.isArray(doc)) {
|
|
210
|
+
if (doc.length === 0)
|
|
211
|
+
return d.emptyArr;
|
|
212
|
+
const items = doc.map((v, i) => emitDocLiteralCompact(v, style, `${path}[${i}]`));
|
|
213
|
+
// Go は複合リテラルが JObjOf(...) / []dslcontracts.JNode{...} 形(JSON 字句は非合法)なので
|
|
214
|
+
// dialect の綴じ方を単一行で使う。他言語は JSON 風の `[...]` / `{...}` でよい(TS 現行)。
|
|
215
|
+
if (style === "go")
|
|
216
|
+
return `[]dslcontracts.JNode{${items.join(", ")}}`;
|
|
217
|
+
return "[" + items.join(", ") + "]";
|
|
218
|
+
}
|
|
219
|
+
if (typeof doc === "object") {
|
|
220
|
+
const entries = Object.entries(doc);
|
|
221
|
+
if (entries.length === 0)
|
|
222
|
+
return d.emptyObj;
|
|
223
|
+
const emitted = entries.map(([k, v]) => [k, emitDocLiteralCompact(v, style, `${path}.${k}`)]);
|
|
224
|
+
if (d.objCompact)
|
|
225
|
+
return d.objCompact(emitted);
|
|
226
|
+
if (style === "go")
|
|
227
|
+
return `dslcontracts.JObjOf(${emitted.map(([k, v]) => `${d.str(k)}, ${v}`).join(", ")})`;
|
|
228
|
+
return "{ " + emitted.map(([k, v]) => `${d.str(k)}: ${v}`).join(", ") + " }";
|
|
229
|
+
}
|
|
230
|
+
throw new FingerprintFailure("INVALID_VALUE", `value of type ${typeof doc} at ${path} cannot be emitted as a portable IR literal (fail-closed)`);
|
|
231
|
+
}
|
|
232
|
+
//# sourceMappingURL=literal.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"literal.js","sourceRoot":"","sources":["../../src/generator/literal.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* straightline.ts — 共通 Generator の「直線 emit」枠(bc#37 / Layer A1)。
|
|
3
|
+
*
|
|
4
|
+
* typed-codegen.md §4.1(主経路・脱解釈・型なし)の language-neutral な骨組み。
|
|
5
|
+
* 既存のリテラル焼き込み emit(emit-typescript.ts の `bind` — endpoint 3-literal)と
|
|
6
|
+
* **併存**する additive な第2モード。component ごとに「plan を直呼び・各ノードの port 評価と
|
|
7
|
+
* handler 呼びを直線展開した」ネイティブ関数を emit する枠を提供する。
|
|
8
|
+
*
|
|
9
|
+
* この枠が消すもの(AC1): **`runBehavior` の tree-walk**——
|
|
10
|
+
* - `nodeKind` ディスパッチ(body ノード種の実行時分岐)
|
|
11
|
+
* - `evalPorts` の汎用ループ(未知 ports を毎回 `evaluateExpression` で歩く)
|
|
12
|
+
* - 汎用 `exec` closure + 汎用 output 評価
|
|
13
|
+
* これらを **IR から静的に展開した per-node の直線コード**に置き換える。プランのステージ
|
|
14
|
+
* 実行・Skip 伝播・Policy Kind は runtime primitive `runPlan` として維持する(意味論の
|
|
15
|
+
* SSoT を一本に保つ — typed-codegen.md §4.1 の「plan は primitive 維持」)。式演算子の
|
|
16
|
+
* 意味論も再実装せず、A0(#36)の式演算子 primitive(`ref`/`concat`/… を評価する SSoT
|
|
17
|
+
* ラッパ)を直呼びする。よって生成コードは:
|
|
18
|
+
* 1. `nodeKind` で分岐しない(各ノードの exec 分岐は生成時に確定・ハードコード)。
|
|
19
|
+
* 2. `evalPorts` で未知 ports を歩かない(各 port を名前付き primitive 呼びに展開)。
|
|
20
|
+
* 3. `runBehavior` を内部で呼ばない(=薄い束ねではない)。
|
|
21
|
+
*
|
|
22
|
+
* スコープ(A1 = read hot path): `componentRef` + `cond` + 単純 Expression Port のみ。
|
|
23
|
+
* `map`/`batched`/`concurrency`(A3)・hydration/relation stitching(A4)は **fail-closed**
|
|
24
|
+
* ({@link assertStraightlineSupported} が `GeneratorFailure(UNSUPPORTED_NODE_STRAIGHTLINE)`)。
|
|
25
|
+
* 黙って誤コード生成・部分生成をしない(スコープ境界を fail-closed に — AC5)。
|
|
26
|
+
*
|
|
27
|
+
* 言語 plugin IF(A2 で go/rust/python/php が同じ枠に乗る): {@link StraightlineDialect} が
|
|
28
|
+
* 「式ノード → その言語の primitive 呼び文字列」と「per-node/handler/output/module の綴じ方」を
|
|
29
|
+
* 供給する。language-neutral な走査(body 検査・op literal・scope 合成・fail-closed 判定)は
|
|
30
|
+
* ここで一度だけ実装する。
|
|
31
|
+
*/
|
|
32
|
+
import type { ComponentGraphIR, Component, BodyNode } from "../behavior.js";
|
|
33
|
+
import type { EmitContext } from "./core.js";
|
|
34
|
+
/** 直線 emit が扱える body ノードか(componentRef + cond + map — A3 以降)。 */
|
|
35
|
+
export declare function isStraightlineNode(n: BodyNode): boolean;
|
|
36
|
+
/**
|
|
37
|
+
* assertStraightlineSupported — IR 全体が直線 emit のスコープに収まるか検査し、外れるノード種を
|
|
38
|
+
* 含むなら LOUD reject する(AC)。部分生成はしない。A3 時点で componentRef/cond/map は全て
|
|
39
|
+
* covered。将来の hydration/relation stitching(A4 #43)を静的展開する固有ノードが導入された
|
|
40
|
+
* 場合は、ここに fail-closed 判定を足す(現行 IR schema には無いため、未知ノード=
|
|
41
|
+
* componentRef/cond/map のいずれでもない形のみを拒否する)。
|
|
42
|
+
*/
|
|
43
|
+
export declare function assertStraightlineSupported(ir: ComponentGraphIR): void;
|
|
44
|
+
/** 直線化された1ノードの実行分岐(言語中立の記述。dialect が本体を綴じる)。 */
|
|
45
|
+
export type StraightlineOp = {
|
|
46
|
+
kind: "componentRef";
|
|
47
|
+
/** body 内 index(ops リテラルの index と一致)。 */
|
|
48
|
+
index: number;
|
|
49
|
+
id: string;
|
|
50
|
+
/** catalog 名(handler 解決キー)。 */
|
|
51
|
+
component: string;
|
|
52
|
+
/** port 名 → 評価式(dialect が生成した primitive 呼び文字列)。宣言順保存。 */
|
|
53
|
+
ports: {
|
|
54
|
+
name: string;
|
|
55
|
+
expr: string;
|
|
56
|
+
}[];
|
|
57
|
+
} | {
|
|
58
|
+
kind: "cond";
|
|
59
|
+
index: number;
|
|
60
|
+
id: string;
|
|
61
|
+
/** `{cond:[if,then,else]}` を1式として評価する式(dialect 生成)。 */
|
|
62
|
+
expr: string;
|
|
63
|
+
} | {
|
|
64
|
+
kind: "map";
|
|
65
|
+
index: number;
|
|
66
|
+
id: string;
|
|
67
|
+
/** 各要素で呼ぶ catalog 名(handler 解決キー)。 */
|
|
68
|
+
component: string;
|
|
69
|
+
/** 要素束縛名(`map.as`。生成コードは per-element scope に `as`→要素値 を足す)。 */
|
|
70
|
+
as: string;
|
|
71
|
+
/**
|
|
72
|
+
* `over` 配列を評価する式(component scope で。dialect 生成)。要素反復の前に1回評価する。
|
|
73
|
+
* scope は component の scopeVar(要素束縛前)で解決される。
|
|
74
|
+
*/
|
|
75
|
+
over: string;
|
|
76
|
+
/**
|
|
77
|
+
* per-element guard を `{cond:[when,true,false]}` へ lower した式(dialect 生成、要素 scope で
|
|
78
|
+
* 評価)。`when` 未指定なら undefined(全要素採用)。strict-bool 意味論は cond primitive/native。
|
|
79
|
+
*/
|
|
80
|
+
guard?: string;
|
|
81
|
+
/** 各 port を要素 scope で評価する式(dialect 生成)。宣言順保存。batched でも同じ。 */
|
|
82
|
+
ports: {
|
|
83
|
+
name: string;
|
|
84
|
+
expr: string;
|
|
85
|
+
}[];
|
|
86
|
+
/** zip-attach キー(`map.into`)。未指定なら結果は collected リスト。 */
|
|
87
|
+
into?: string;
|
|
88
|
+
/** バッチ fan-out(`map.batched`)。true なら guard 通過全要素の ports を1回の handler 呼びへ。 */
|
|
89
|
+
batched: boolean;
|
|
90
|
+
};
|
|
91
|
+
/**
|
|
92
|
+
* 直線 emit の言語 dialect。language-neutral な走査({@link buildComponentPlan})が呼ぶ
|
|
93
|
+
* seam。式ノード → primitive 呼び文字列({@link emitExprCalls} を各言語の primitive 命名で
|
|
94
|
+
* 具体化)と、per-node/handler/output/module の綴じ方を供給する。
|
|
95
|
+
*/
|
|
96
|
+
export interface StraightlineDialect {
|
|
97
|
+
/**
|
|
98
|
+
* Expression IR ノードを、この言語で「scope を受けて Value を返す」primitive 呼び式に
|
|
99
|
+
* emit する。leaf/演算子ノードを A0 primitive(`ref`/`concat`/…)へ落とす。
|
|
100
|
+
* `scopeVar` は生成コード内の scope 変数名。
|
|
101
|
+
*/
|
|
102
|
+
emitExpr(node: unknown, scopeVar: string): string;
|
|
103
|
+
/**
|
|
104
|
+
* map ノード本体(over/guard/ports)の Expression IR を評価するときの scope 変数名。
|
|
105
|
+
* 各 dialect の map 展開が per-element scope をこの名前でローカルに組む(例 TS `mscope()`)。
|
|
106
|
+
* 要素束縛(`map.as`)を含んだ scope をこの名前で読める前提で {@link buildComponentPlan} が
|
|
107
|
+
* ports/guard の式を emit する。over は component の scopeVar(要素束縛前)で評価する。
|
|
108
|
+
*/
|
|
109
|
+
mapScopeVar: string;
|
|
110
|
+
/**
|
|
111
|
+
* component 1つぶんの直線関数(ops リテラル・per-node exec 分岐・output 評価・runPlan 呼び)を
|
|
112
|
+
* 綴じる。{@link emitModule} が各 component ぶん呼ぶ。
|
|
113
|
+
*/
|
|
114
|
+
emitComponent(plan: ComponentPlan, ctx: EmitContext): string;
|
|
115
|
+
/** モジュール全体(ヘッダ・import・定数・load-time 検査・各 component)を綴じる。 */
|
|
116
|
+
emitModule(plans: ComponentPlan[], ctx: EmitContext): string;
|
|
117
|
+
}
|
|
118
|
+
/** 1 component ぶんの直線化計画(language-neutral)。 */
|
|
119
|
+
export interface ComponentPlan {
|
|
120
|
+
name: string;
|
|
121
|
+
component: Component;
|
|
122
|
+
/** body ノード → OpSpec リテラル(parent は index に解決済み)。 */
|
|
123
|
+
opsLiteral: OpLiteral[];
|
|
124
|
+
/** 各ノードの直線 exec 分岐。 */
|
|
125
|
+
ops: StraightlineOp[];
|
|
126
|
+
}
|
|
127
|
+
/** OpSpec のリテラル形(runPlan に渡す ops 配列の1要素。behavior.ts buildOps と同規律)。 */
|
|
128
|
+
export interface OpLiteral {
|
|
129
|
+
id: string;
|
|
130
|
+
parent: number | null;
|
|
131
|
+
bindField?: string;
|
|
132
|
+
relationKind?: "single" | "connection";
|
|
133
|
+
policy?: "fail" | "retry" | "continue";
|
|
134
|
+
}
|
|
135
|
+
/**
|
|
136
|
+
* buildComponentPlan — 1 component を language-neutral な {@link ComponentPlan} に落とす。
|
|
137
|
+
* behavior.ts の `buildOps`(parent の id→index 解決)を鏡映しつつ、各ノードの exec 分岐を
|
|
138
|
+
* dialect の `emitExpr` で直線コード片へ展開する。ここが「nodeKind ディスパッチ」を
|
|
139
|
+
* **生成時に一度だけ**行い、生成コードには分岐を残さない核。
|
|
140
|
+
*/
|
|
141
|
+
export declare function buildComponentPlan(comp: Component, dialect: StraightlineDialect, scopeVar: string): ComponentPlan;
|
|
142
|
+
/**
|
|
143
|
+
* emitStraightlineModule — dialect を使って IR 全体の直線モジュールを綴じる(公開 entry)。
|
|
144
|
+
* A1 スコープ検査(fail-closed)を先に走らせる。
|
|
145
|
+
*/
|
|
146
|
+
export declare function emitStraightlineModule(ctx: EmitContext, dialect: StraightlineDialect, scopeVar: string): string;
|
|
147
|
+
//# sourceMappingURL=straightline.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"straightline.d.ts","sourceRoot":"","sources":["../../src/generator/straightline.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
import { GeneratorFailure } from "./core.js";
|
|
2
|
+
// ── 直線 emit スコープ判定(fail-closed。hydration/relation stitching は A4)─────
|
|
3
|
+
// A3(#42)で map/batched/concurrency が covered になった。hydration(A4 #43)だけが
|
|
4
|
+
// 依然 out-of-scope。map ノードは自身の body 内 tree-walk(要素反復・guard・into・batched)を
|
|
5
|
+
// 各 dialect が直線展開し、plan.concurrency は plan primitive(bounded 並行)が保存する。
|
|
6
|
+
/** 直線 emit が扱える body ノードか(componentRef + cond + map — A3 以降)。 */
|
|
7
|
+
export function isStraightlineNode(n) {
|
|
8
|
+
if ("map" in n)
|
|
9
|
+
return true; // A3(#42): map/batched/concurrency covered
|
|
10
|
+
if ("cond" in n)
|
|
11
|
+
return true;
|
|
12
|
+
return "component" in n; // componentRef
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* assertStraightlineSupported — IR 全体が直線 emit のスコープに収まるか検査し、外れるノード種を
|
|
16
|
+
* 含むなら LOUD reject する(AC)。部分生成はしない。A3 時点で componentRef/cond/map は全て
|
|
17
|
+
* covered。将来の hydration/relation stitching(A4 #43)を静的展開する固有ノードが導入された
|
|
18
|
+
* 場合は、ここに fail-closed 判定を足す(現行 IR schema には無いため、未知ノード=
|
|
19
|
+
* componentRef/cond/map のいずれでもない形のみを拒否する)。
|
|
20
|
+
*/
|
|
21
|
+
export function assertStraightlineSupported(ir) {
|
|
22
|
+
for (const comp of ir.components) {
|
|
23
|
+
for (const n of comp.body) {
|
|
24
|
+
if (!isStraightlineNode(n)) {
|
|
25
|
+
throw new GeneratorFailure("UNSUPPORTED_NODE_STRAIGHTLINE", `component '${comp.name}': node '${n.id ?? "?"}' is not a componentRef/cond/map — straight-line emit cannot cover it (fail-closed). Regenerate with the literal-emit path or extend the straight-line dialect.`);
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
// ── language-neutral な走査(buildOps と鏡映。ただし直線 exec を生成用に展開)──────────
|
|
31
|
+
function nodeKindOf(n) {
|
|
32
|
+
if ("map" in n)
|
|
33
|
+
return "map";
|
|
34
|
+
if ("cond" in n)
|
|
35
|
+
return "cond";
|
|
36
|
+
return "componentRef";
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* buildComponentPlan — 1 component を language-neutral な {@link ComponentPlan} に落とす。
|
|
40
|
+
* behavior.ts の `buildOps`(parent の id→index 解決)を鏡映しつつ、各ノードの exec 分岐を
|
|
41
|
+
* dialect の `emitExpr` で直線コード片へ展開する。ここが「nodeKind ディスパッチ」を
|
|
42
|
+
* **生成時に一度だけ**行い、生成コードには分岐を残さない核。
|
|
43
|
+
*/
|
|
44
|
+
export function buildComponentPlan(comp, dialect, scopeVar) {
|
|
45
|
+
const idToIndex = new Map();
|
|
46
|
+
comp.body.forEach((n, i) => idToIndex.set(n.id, i));
|
|
47
|
+
const opsLiteral = comp.body.map((n) => {
|
|
48
|
+
const pid = nodeParentOf(n);
|
|
49
|
+
const parent = pid !== undefined ? idToIndex.get(pid) ?? null : null;
|
|
50
|
+
const lit = { id: n.id, parent };
|
|
51
|
+
if ("map" in n) {
|
|
52
|
+
// map/cond は bindField を持たない。map は relationKind/policy を map spec から取る。
|
|
53
|
+
const m = n.map;
|
|
54
|
+
if (m.relationKind !== undefined)
|
|
55
|
+
lit.relationKind = m.relationKind;
|
|
56
|
+
if (m.policy !== undefined)
|
|
57
|
+
lit.policy = m.policy;
|
|
58
|
+
}
|
|
59
|
+
else if (!("cond" in n)) {
|
|
60
|
+
const cr = n;
|
|
61
|
+
if (cr.bindField !== undefined)
|
|
62
|
+
lit.bindField = cr.bindField;
|
|
63
|
+
if (cr.relationKind !== undefined)
|
|
64
|
+
lit.relationKind = cr.relationKind;
|
|
65
|
+
if (cr.policy !== undefined)
|
|
66
|
+
lit.policy = cr.policy;
|
|
67
|
+
}
|
|
68
|
+
return lit;
|
|
69
|
+
});
|
|
70
|
+
const ops = comp.body.map((n, i) => {
|
|
71
|
+
const kind = nodeKindOf(n);
|
|
72
|
+
if (kind === "cond") {
|
|
73
|
+
const c = n.cond;
|
|
74
|
+
// Conditional は純 Expression。behavior.ts と同じく `{cond:[if,then,else]}` へ lower して
|
|
75
|
+
// cond primitive(短絡・strict bool は evaluate SSoT)で1式評価する。
|
|
76
|
+
return { kind: "cond", index: i, id: n.id, expr: dialect.emitExpr({ cond: [c.if, c.then, c.else] }, scopeVar) };
|
|
77
|
+
}
|
|
78
|
+
if (kind === "map") {
|
|
79
|
+
// map: over は component scope(要素束縛前)で、guard/ports は要素 scope(dialect.mapScopeVar)で
|
|
80
|
+
// emit する。要素束縛(as→要素値)を含んだ scope を生成コードが mapScopeVar 名で組む前提。
|
|
81
|
+
// guard は behavior.ts と同じく `{cond:[when,true,false]}` へ lower(strict-bool、fail-closed)。
|
|
82
|
+
const m = n.map;
|
|
83
|
+
const ms = dialect.mapScopeVar;
|
|
84
|
+
const ports = Object.keys(m.ports).map((name) => ({ name, expr: dialect.emitExpr(m.ports[name], ms) }));
|
|
85
|
+
const guard = m.when === undefined ? undefined : dialect.emitExpr({ cond: [m.when, true, false] }, ms);
|
|
86
|
+
return {
|
|
87
|
+
kind: "map",
|
|
88
|
+
index: i,
|
|
89
|
+
id: n.id,
|
|
90
|
+
component: m.component,
|
|
91
|
+
as: m.as,
|
|
92
|
+
over: dialect.emitExpr(m.over, scopeVar),
|
|
93
|
+
guard,
|
|
94
|
+
ports,
|
|
95
|
+
into: m.into,
|
|
96
|
+
batched: m.batched === true,
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
const cr = n;
|
|
100
|
+
// 各 port を名前付き primitive 呼びへ展開(evalPorts の汎用ループを消す)。宣言順保存。
|
|
101
|
+
const ports = Object.keys(cr.ports).map((name) => ({ name, expr: dialect.emitExpr(cr.ports[name], scopeVar) }));
|
|
102
|
+
return { kind: "componentRef", index: i, id: n.id, component: cr.component, ports };
|
|
103
|
+
});
|
|
104
|
+
return { name: comp.name, component: comp, opsLiteral, ops };
|
|
105
|
+
}
|
|
106
|
+
function nodeParentOf(n) {
|
|
107
|
+
if ("map" in n)
|
|
108
|
+
return n.map.parent;
|
|
109
|
+
if ("cond" in n)
|
|
110
|
+
return n.cond.parent;
|
|
111
|
+
return n.parent;
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* emitStraightlineModule — dialect を使って IR 全体の直線モジュールを綴じる(公開 entry)。
|
|
115
|
+
* A1 スコープ検査(fail-closed)を先に走らせる。
|
|
116
|
+
*/
|
|
117
|
+
export function emitStraightlineModule(ctx, dialect, scopeVar) {
|
|
118
|
+
assertStraightlineSupported(ctx.ir);
|
|
119
|
+
const plans = ctx.ir.components.map((c) => buildComponentPlan(c, dialect, scopeVar));
|
|
120
|
+
return dialect.emitModule(plans, ctx);
|
|
121
|
+
}
|
|
122
|
+
//# sourceMappingURL=straightline.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"straightline.js","sourceRoot":"","sources":["../../src/generator/straightline.ts"],"names":[],"mappings":"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"}
|