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.
Files changed (106) hide show
  1. package/README.md +8 -2
  2. package/dist/authoring.d.ts +202 -0
  3. package/dist/authoring.d.ts.map +1 -0
  4. package/dist/authoring.js +787 -0
  5. package/dist/authoring.js.map +1 -0
  6. package/dist/behavior.d.ts +248 -0
  7. package/dist/behavior.d.ts.map +1 -0
  8. package/dist/behavior.js +373 -0
  9. package/dist/behavior.js.map +1 -0
  10. package/dist/builder.d.ts +154 -0
  11. package/dist/builder.d.ts.map +1 -0
  12. package/dist/builder.js +574 -0
  13. package/dist/builder.js.map +1 -0
  14. package/dist/generator/core.d.ts +89 -0
  15. package/dist/generator/core.d.ts.map +1 -0
  16. package/dist/generator/core.js +124 -0
  17. package/dist/generator/core.js.map +1 -0
  18. package/dist/generator/emit-go.d.ts +19 -0
  19. package/dist/generator/emit-go.d.ts.map +1 -0
  20. package/dist/generator/emit-go.js +79 -0
  21. package/dist/generator/emit-go.js.map +1 -0
  22. package/dist/generator/emit-php.d.ts +20 -0
  23. package/dist/generator/emit-php.d.ts.map +1 -0
  24. package/dist/generator/emit-php.js +76 -0
  25. package/dist/generator/emit-php.js.map +1 -0
  26. package/dist/generator/emit-python.d.ts +10 -0
  27. package/dist/generator/emit-python.d.ts.map +1 -0
  28. package/dist/generator/emit-python.js +75 -0
  29. package/dist/generator/emit-python.js.map +1 -0
  30. package/dist/generator/emit-rust.d.ts +25 -0
  31. package/dist/generator/emit-rust.d.ts.map +1 -0
  32. package/dist/generator/emit-rust.js +125 -0
  33. package/dist/generator/emit-rust.js.map +1 -0
  34. package/dist/generator/emit-straightline-go.d.ts +77 -0
  35. package/dist/generator/emit-straightline-go.d.ts.map +1 -0
  36. package/dist/generator/emit-straightline-go.js +592 -0
  37. package/dist/generator/emit-straightline-go.js.map +1 -0
  38. package/dist/generator/emit-straightline-php.d.ts +46 -0
  39. package/dist/generator/emit-straightline-php.d.ts.map +1 -0
  40. package/dist/generator/emit-straightline-php.js +501 -0
  41. package/dist/generator/emit-straightline-php.js.map +1 -0
  42. package/dist/generator/emit-straightline-python.d.ts +36 -0
  43. package/dist/generator/emit-straightline-python.d.ts.map +1 -0
  44. package/dist/generator/emit-straightline-python.js +441 -0
  45. package/dist/generator/emit-straightline-python.js.map +1 -0
  46. package/dist/generator/emit-straightline-rust.d.ts +78 -0
  47. package/dist/generator/emit-straightline-rust.d.ts.map +1 -0
  48. package/dist/generator/emit-straightline-rust.js +615 -0
  49. package/dist/generator/emit-straightline-rust.js.map +1 -0
  50. package/dist/generator/emit-straightline-typed-go.d.ts +39 -0
  51. package/dist/generator/emit-straightline-typed-go.d.ts.map +1 -0
  52. package/dist/generator/emit-straightline-typed-go.js +828 -0
  53. package/dist/generator/emit-straightline-typed-go.js.map +1 -0
  54. package/dist/generator/emit-straightline-typed-rust.d.ts +48 -0
  55. package/dist/generator/emit-straightline-typed-rust.d.ts.map +1 -0
  56. package/dist/generator/emit-straightline-typed-rust.js +823 -0
  57. package/dist/generator/emit-straightline-typed-rust.js.map +1 -0
  58. package/dist/generator/emit-straightline-typed-typescript.d.ts +49 -0
  59. package/dist/generator/emit-straightline-typed-typescript.d.ts.map +1 -0
  60. package/dist/generator/emit-straightline-typed-typescript.js +314 -0
  61. package/dist/generator/emit-straightline-typed-typescript.js.map +1 -0
  62. package/dist/generator/emit-straightline-typescript.d.ts +36 -0
  63. package/dist/generator/emit-straightline-typescript.d.ts.map +1 -0
  64. package/dist/generator/emit-straightline-typescript.js +397 -0
  65. package/dist/generator/emit-straightline-typescript.js.map +1 -0
  66. package/dist/generator/emit-typescript.d.ts +11 -0
  67. package/dist/generator/emit-typescript.d.ts.map +1 -0
  68. package/dist/generator/emit-typescript.js +68 -0
  69. package/dist/generator/emit-typescript.js.map +1 -0
  70. package/dist/generator/fingerprint.d.ts +14 -0
  71. package/dist/generator/fingerprint.d.ts.map +1 -0
  72. package/dist/generator/fingerprint.js +74 -0
  73. package/dist/generator/fingerprint.js.map +1 -0
  74. package/dist/generator/index.d.ts +22 -0
  75. package/dist/generator/index.d.ts.map +1 -0
  76. package/dist/generator/index.js +64 -0
  77. package/dist/generator/index.js.map +1 -0
  78. package/dist/generator/literal.d.ts +15 -0
  79. package/dist/generator/literal.d.ts.map +1 -0
  80. package/dist/generator/literal.js +232 -0
  81. package/dist/generator/literal.js.map +1 -0
  82. package/dist/generator/straightline.d.ts +147 -0
  83. package/dist/generator/straightline.d.ts.map +1 -0
  84. package/dist/generator/straightline.js +122 -0
  85. package/dist/generator/straightline.js.map +1 -0
  86. package/dist/generator/typed.d.ts +156 -0
  87. package/dist/generator/typed.d.ts.map +1 -0
  88. package/dist/generator/typed.js +108 -0
  89. package/dist/generator/typed.js.map +1 -0
  90. package/dist/guard.d.ts +36 -0
  91. package/dist/guard.d.ts.map +1 -1
  92. package/dist/guard.js +186 -0
  93. package/dist/guard.js.map +1 -1
  94. package/dist/index.d.ts +17 -3
  95. package/dist/index.d.ts.map +1 -1
  96. package/dist/index.js +23 -2
  97. package/dist/index.js.map +1 -1
  98. package/dist/plan.d.ts +36 -0
  99. package/dist/plan.d.ts.map +1 -1
  100. package/dist/plan.js +152 -14
  101. package/dist/plan.js.map +1 -1
  102. package/dist/primitives.d.ts +112 -0
  103. package/dist/primitives.d.ts.map +1 -0
  104. package/dist/primitives.js +206 -0
  105. package/dist/primitives.js.map +1 -0
  106. package/package.json +4 -1
@@ -0,0 +1,592 @@
1
+ import { emitDocLiteral, emitDocLiteralCompact } from "./literal.js";
2
+ import { emitStraightlineModule, } from "./straightline.js";
3
+ /** runtime package alias(生成コード内)。emit-go.ts と同じ `dslcontracts`。 */
4
+ const PKG = "dslcontracts";
5
+ /**
6
+ * scope 式(生成コード内)。scope は「input + それまでの ok 結果」のその時点のスナップ。
7
+ * baseScope() 関数呼びで呼び時点の results を読む(決定的)。
8
+ */
9
+ const SCOPE = "baseScope()";
10
+ /**
11
+ * map 本体(over/guard/ports)の要素 scope 式(生成コード内)。RunBehavior の map と同じく
12
+ * baseScope に `as`→要素値 を足したスナップ。生成コードは map arm 内で per-element に
13
+ * `mscope()`(*Obj を返すクロージャ)をローカル定義し、port/guard 式はそれを呼ぶ。
14
+ */
15
+ const MAP_SCOPE = "mscope()";
16
+ /** IR リテラルを単一行 Go 式として emit(primitive 被演算子用)。 */
17
+ function lit(node) {
18
+ return emitDocLiteralCompact(node, "go");
19
+ }
20
+ /** args 配列(binary/unary primitive の被演算子)を個別 IR リテラルへ落として `, ` 連結。 */
21
+ function argList(arg) {
22
+ return arg.map((a) => lit(a)).join(", ");
23
+ }
24
+ /**
25
+ * OP_PRIM — overflow/短絡/型判定を持つ演算子 → A0 primitive 直呼びの綴じ方。
26
+ * 命名は go/primitives.go の `Prim*`。被演算子は expr.go の Expr 契約どおり**未評価 IR リテラル**
27
+ * (`and`/`or`/`cond`/`coalesce` の短絡を primitive 内 evaluate が保存する)。
28
+ * NB: ここに `ref`/`refOpt`/`concat` は無い(native 化するため — AC#2)。
29
+ */
30
+ const OP_PRIM = {
31
+ int: (a, s) => `${PKG}.PrimIntLit(${lit(a)}, ${s})`,
32
+ float: (a, s) => `${PKG}.PrimFloatLit(${lit(a)}, ${s})`,
33
+ obj: (a, s) => `${PKG}.PrimObj(${lit(a)}, ${s})`,
34
+ arr: (a, s) => `${PKG}.PrimArr(${lit(a)}, ${s})`,
35
+ add: (a, s) => `${PKG}.PrimAdd(${argList(a)}, ${s})`,
36
+ sub: (a, s) => `${PKG}.PrimSub(${argList(a)}, ${s})`,
37
+ mul: (a, s) => `${PKG}.PrimMul(${argList(a)}, ${s})`,
38
+ neg: (a, s) => `${PKG}.PrimNeg(${argList(a)}, ${s})`,
39
+ div: (a, s) => `${PKG}.PrimDiv(${argList(a)}, ${s})`,
40
+ mod: (a, s) => `${PKG}.PrimMod(${argList(a)}, ${s})`,
41
+ eq: (a, s) => `${PKG}.PrimEq(${argList(a)}, ${s})`,
42
+ ne: (a, s) => `${PKG}.PrimNe(${argList(a)}, ${s})`,
43
+ lt: (a, s) => `${PKG}.PrimLt(${argList(a)}, ${s})`,
44
+ le: (a, s) => `${PKG}.PrimLe(${argList(a)}, ${s})`,
45
+ gt: (a, s) => `${PKG}.PrimGt(${argList(a)}, ${s})`,
46
+ ge: (a, s) => `${PKG}.PrimGe(${argList(a)}, ${s})`,
47
+ and: (a, s) => `${PKG}.PrimAnd(${argList(a)}, ${s})`,
48
+ or: (a, s) => `${PKG}.PrimOr(${argList(a)}, ${s})`,
49
+ not: (a, s) => `${PKG}.PrimNot(${argList(a)}, ${s})`,
50
+ coalesce: (a, s) => `${PKG}.PrimCoalesce(${argList(a)}, ${s})`,
51
+ cond: (a, s) => `${PKG}.PrimCond(${argList(a)}, ${s})`,
52
+ len: (a, s) => `${PKG}.PrimLen(${argList(a)}, ${s})`,
53
+ };
54
+ /**
55
+ * emitExpr — Expression IR ノードを「scope を受けて (Value, error) を返す」Go 式に落とす。
56
+ *
57
+ * 単純式は **native Go helper** へ(脱解釈 — AC#2)、overflow/短絡系は A0 primitive SSoT へ、
58
+ * むき出しスカラは EvalExpr(同一 SSoT)へ落とす。生成される Go 式はどれも `(Value, error)` を
59
+ * 返すので、直線関数側は `must(<expr>)` で 1 行に畳んで scope へ束ねる。
60
+ * - `{ref:[...]}` → `${PKG}.slRef(<path>, scope)` (native scope/field walk)
61
+ * - `{refOpt:[...]}` → `${PKG}? no — slRefOpt` (native, null 伝播)
62
+ * - `{concat:[...]}` → `slConcat([]slPart{...}, scope)` (native strings.Builder)
63
+ * - overflow/短絡 → `${PKG}.PrimAdd(...)` 等 (SSoT 直呼び)
64
+ * - bare scalar → `${PKG}.EvalExpr(<lit>, scope)` (SSoT)
65
+ * slRef/slRefOpt/slConcat は **生成モジュール内の native helper**(`EvaluateExpression`/`Prim*`
66
+ * を呼ばない)で、pure ref/concat の生成コードには evaluate/primitive 呼びが一切現れない
67
+ * (AC#2 の構造的 grep 証明)。
68
+ */
69
+ function emitExpr(node, scopeVar) {
70
+ // ── bare スカラ literal: 型判定の無い string/bool/null は native 化(脱解釈)──────
71
+ // これらは expr.go でも素通し(INVALID_LITERAL/range 判定を持たない)ので、native Go 値を
72
+ // そのまま (Value, error) へ包む。number は checked-range/型区別(int vs float)の意味論を
73
+ // 持つため native 化せず EvalExpr(SSoT) に委譲する(下の fall-through)。
74
+ if (node === null)
75
+ return `slVal(nil)`;
76
+ if (typeof node === "boolean")
77
+ return `slVal(${node ? "true" : "false"})`;
78
+ if (typeof node === "string")
79
+ return `slVal(${JSON.stringify(node)})`;
80
+ if (node !== null && typeof node === "object" && !Array.isArray(node)) {
81
+ const keys = Object.keys(node);
82
+ if (keys.length === 1) {
83
+ const op = keys[0];
84
+ const arg = node[op];
85
+ // ── 単純式: native 化(脱解釈) ─────────────────────────────────────────
86
+ if (op === "ref" || op === "refOpt") {
87
+ // path は string リテラル配列。native helper へ Go の []string を直接渡す。
88
+ return `slRef${op === "refOpt" ? "Opt" : ""}(${emitStringPath(arg)}, ${scopeVar})`;
89
+ }
90
+ if (op === "concat") {
91
+ // parts は Expression IR 配列。各 part を再帰 native emit した slPart のスライスへ。
92
+ return `slConcat([]slPart{${emitConcatParts(arg, scopeVar)}}, ${scopeVar})`;
93
+ }
94
+ // ── overflow/短絡/型判定: A0 primitive SSoT(再実装しない) ──────────────
95
+ const prim = OP_PRIM[op];
96
+ if (prim)
97
+ return prim(arg, scopeVar);
98
+ }
99
+ }
100
+ // むき出しスカラ(string/number/bool/null)等 — evaluate SSoT に委譲(同一意味論)。
101
+ return `${PKG}.EvalExpr(${lit(node)}, ${scopeVar})`;
102
+ }
103
+ /** ref/refOpt の path(string リテラル配列)を Go の `[]string{...}` へ。非 string は不正 IR。 */
104
+ function emitStringPath(arg) {
105
+ if (!Array.isArray(arg))
106
+ throw new Error("straight-line go: ref/refOpt path must be an array literal");
107
+ const segs = arg.map((s) => {
108
+ if (typeof s !== "string")
109
+ throw new Error("straight-line go: ref/refOpt path segments must be string literals (portable IR)");
110
+ return JSON.stringify(s);
111
+ });
112
+ return `[]string{${segs.join(", ")}}`;
113
+ }
114
+ /**
115
+ * concat の各 part を native `slPart` へ。slPart は「self-eval なクロージャ」= func(scope) (Value, error)。
116
+ * part 自身が式なので `func(s *${PKG}.Obj) (${PKG}.Value, error) { return <emitExpr(part)>; }` で
117
+ * 再帰 native emit する(part が別の concat/ref なら native、overflow なら primitive のまま)。
118
+ */
119
+ function emitConcatParts(arg, scopeVar) {
120
+ if (!Array.isArray(arg))
121
+ throw new Error("straight-line go: concat args must be an array literal");
122
+ // part の scope 変数は helper 引数 `s`(呼び時点の scope を受ける)。scopeVar は無視される。
123
+ void scopeVar;
124
+ return arg.map((p) => `func(s *${PKG}.Obj) (${PKG}.Value, error) { return ${emitExpr(p, "s")} }`).join(", ");
125
+ }
126
+ // ── per-node exec 分岐 / component 関数 / module の綴じ方 ──────────────────────
127
+ /** ops リテラル(RunPlan に渡す []OpSpec の Go リテラル)を綴じる。 */
128
+ function emitOpsLiteral(plan) {
129
+ const rows = plan.opsLiteral.map((o) => {
130
+ const parts = [`ID: ${JSON.stringify(o.id)}`, `Parent: ${o.parent === null ? "-1" : String(o.parent)}`];
131
+ if (o.bindField !== undefined)
132
+ parts.push(`BindField: ${JSON.stringify(o.bindField)}, HasBindField: true`);
133
+ if (o.relationKind !== undefined)
134
+ parts.push(`RelationKind: ${JSON.stringify(o.relationKind)}`);
135
+ if (o.policy !== undefined)
136
+ parts.push(`Policy: ${JSON.stringify(o.policy)}, HasPolicy: true`);
137
+ return `\t\t{${parts.join(", ")}},`;
138
+ });
139
+ return `[]${PKG}.OpSpec{\n${rows.join("\n")}\n\t}`;
140
+ }
141
+ /** 1ノードの exec 分岐本体(index で分岐 — nodeKind ディスパッチではない)。 */
142
+ function emitExecArm(op) {
143
+ if (op.kind === "map")
144
+ return emitMapArm(op);
145
+ if (op.kind === "cond") {
146
+ // cond は純 Expression。scope を渡して 1 式評価(handler は呼ばない)。式は (Value,error)。
147
+ return `\t\tif i == ${op.index} {
148
+ \t\t\tv, err := ${op.expr}
149
+ \t\t\tif err != nil {
150
+ \t\t\t\treturn abort(idx, err)
151
+ \t\t\t}
152
+ \t\t\treturn ${PKG}.OkOutcome(v)
153
+ \t\t}`;
154
+ }
155
+ // componentRef: 各 port を名前付き native/primitive 呼びで評価 → handler 注入呼び。
156
+ const portEvals = op.ports
157
+ .map((p) => `\t\t\t${goPortVar(p.name)}, err := ${p.expr}
158
+ \t\t\tif err != nil {
159
+ \t\t\t\treturn abort(idx, err)
160
+ \t\t\t}
161
+ \t\t\tports.Set(${JSON.stringify(p.name)}, ${goPortVar(p.name)})`)
162
+ .join("\n");
163
+ const body = op.ports.length === 0 ? "" : `\n${portEvals}`;
164
+ return `\t\tif i == ${op.index} {
165
+ \t\t\tports := ${PKG}.NewObj()${body}
166
+ \t\t\toutcome, resolved := ${PKG}.ExecHandler(handlers, ${JSON.stringify(op.id)}, ${JSON.stringify(op.component)}, ports, nil)
167
+ \t\t\tif !resolved {
168
+ \t\t\t\treturn abort(idx, ${PKG}.NewBehaviorFailure("UNKNOWN_COMPONENT", "component '${op.component}' has no handler (fail-closed)"))
169
+ \t\t\t}
170
+ \t\t\treturn outcome
171
+ \t\t}`;
172
+ }
173
+ /** port ローカル変数名(Go 識別子として安全・一意)。宣言順に p0,p1,… を index で衝突回避。 */
174
+ function goPortVar(name) {
175
+ return `pv_${name.replace(/[^A-Za-z0-9_]/g, "_")}`;
176
+ }
177
+ /** map arm の要素 ports 構築(要素 scope `mscope()` で各 port を native/primitive 評価)。 */
178
+ function emitMapPortEvals(op) {
179
+ if (op.ports.length === 0)
180
+ return `\t\t\t\tports := ${PKG}.NewObj()`;
181
+ const lines = op.ports
182
+ .map((p) => `\t\t\t\t${goPortVar(p.name)}, err := ${p.expr}
183
+ \t\t\t\tif err != nil {
184
+ \t\t\t\t\treturn abort(idx, err)
185
+ \t\t\t\t}
186
+ \t\t\t\tports.Set(${JSON.stringify(p.name)}, ${goPortVar(p.name)})`)
187
+ .join("\n");
188
+ return `\t\t\t\tports := ${PKG}.NewObj()\n${lines}`;
189
+ }
190
+ /**
191
+ * emitMapArm — map ノードの直線展開(要素反復・guard skip・per-element/batched handler・into
192
+ * zip-attach)。RunBehavior の map 分岐(behavior.go)を生成 Go へ直線展開する。op-log 等価のため
193
+ * ExecHandler は RunBehavior と同じ ctx(非 batched は bound=要素値、batched は nil)・同じ ports で
194
+ * 呼ぶ。guard は PrimCond(strict-bool SSoT)、into は inline zip-attach(MAP_INTO_ELEMENT_NOT_OBJECT
195
+ * fail-closed で Failure code 一致)。要素反復は宣言どおり逐次。
196
+ */
197
+ function emitMapArm(op) {
198
+ const comp = JSON.stringify(op.component);
199
+ const nodeId = JSON.stringify(op.id);
200
+ const asKey = JSON.stringify(op.as);
201
+ const guardBlock = op.guard === undefined
202
+ ? ""
203
+ : `\n\t\t\t\tgkeep, gerr := ${op.guard}
204
+ \t\t\t\tif gerr != nil {
205
+ \t\t\t\t\treturn abort(idx, gerr)
206
+ \t\t\t\t}
207
+ \t\t\t\tif gkeep != true {
208
+ \t\t\t\t\tcontinue
209
+ \t\t\t\t}`;
210
+ const mscopeDef = `\t\t\t\tmel := el
211
+ \t\t\t\tmscope := func() *${PKG}.Obj {
212
+ \t\t\t\t\ts := ${SCOPE}
213
+ \t\t\t\t\ts.Set(${asKey}, mel)
214
+ \t\t\t\t\treturn s
215
+ \t\t\t\t}
216
+ \t\t\t\t_ = mscope`;
217
+ const intoTail = op.into === undefined
218
+ ? `\t\t\treturn ${PKG}.OkOutcome(collected)`
219
+ : `\t\t\taugmented := make([]${PKG}.Value, 0, len(overArr))
220
+ \t\t\tmk := 0
221
+ \t\t\tfor mj, oel := range overArr {
222
+ \t\t\t\tif mk < len(keptIdx) && keptIdx[mk] == mj {
223
+ \t\t\t\t\toelObj, isObj := oel.(*${PKG}.Obj)
224
+ \t\t\t\t\tif !isObj {
225
+ \t\t\t\t\t\treturn abort(idx, ${PKG}.NewBehaviorFailure("MAP_INTO_ELEMENT_NOT_OBJECT", fmt.Sprintf("map '${op.id}': 'into' requires object elements (element %d is not an object)", mj)))
226
+ \t\t\t\t\t}
227
+ \t\t\t\t\tcp := ${PKG}.NewObj()
228
+ \t\t\t\t\tfor _, fk := range oelObj.Keys {
229
+ \t\t\t\t\t\tcp.Set(fk, oelObj.Vals[fk])
230
+ \t\t\t\t\t}
231
+ \t\t\t\t\tcp.Set(${JSON.stringify(op.into)}, collected[mk])
232
+ \t\t\t\t\taugmented = append(augmented, cp)
233
+ \t\t\t\t\tmk++
234
+ \t\t\t\t} else {
235
+ \t\t\t\t\taugmented = append(augmented, oel)
236
+ \t\t\t\t}
237
+ \t\t\t}
238
+ \t\t\treturn ${PKG}.OkOutcome(augmented)`;
239
+ const body = op.batched
240
+ ? `\t\t\titems := make([]${PKG}.Value, 0, len(overArr))
241
+ \t\t\tfor mi, el := range overArr {
242
+ ${mscopeDef}${guardBlock}
243
+ ${emitMapPortEvals(op)}
244
+ \t\t\t\titems = append(items, ports)
245
+ \t\t\t\tkeptIdx = append(keptIdx, mi)
246
+ \t\t\t}
247
+ \t\t\tvar collected []${PKG}.Value
248
+ \t\t\tif len(items) == 0 {
249
+ \t\t\t\tcollected = []${PKG}.Value{}
250
+ \t\t\t} else {
251
+ \t\t\t\tbatchPorts := ${PKG}.NewObj()
252
+ \t\t\t\tbatchPorts.Set("items", items)
253
+ \t\t\t\toutcome, resolved := ${PKG}.ExecHandler(handlers, ${nodeId}, ${comp}, batchPorts, nil)
254
+ \t\t\t\tif !resolved {
255
+ \t\t\t\t\treturn abort(idx, ${PKG}.NewBehaviorFailure("UNKNOWN_COMPONENT", "component '${op.component}' has no handler (fail-closed)"))
256
+ \t\t\t\t}
257
+ \t\t\t\tif outcome.IsError {
258
+ \t\t\t\t\treturn outcome
259
+ \t\t\t\t}
260
+ \t\t\t\tr, isArr := outcome.Ok.([]${PKG}.Value)
261
+ \t\t\t\tif !isArr || len(r) != len(items) {
262
+ \t\t\t\t\treturn abort(idx, ${PKG}.NewBehaviorFailure("MAP_BATCH_RESULT_MISMATCH", fmt.Sprintf("map '${op.id}': batched handler must return a list aligned to items (want %d)", len(items))))
263
+ \t\t\t\t}
264
+ \t\t\t\tcollected = r
265
+ \t\t\t}
266
+ ${intoTail}`
267
+ : `\t\t\tcollected := make([]${PKG}.Value, 0, len(overArr))
268
+ \t\t\tfor mi, el := range overArr {
269
+ ${mscopeDef}${guardBlock}
270
+ ${emitMapPortEvals(op)}
271
+ \t\t\t\toutcome, resolved := ${PKG}.ExecHandler(handlers, ${nodeId}, ${comp}, ports, mel)
272
+ \t\t\t\tif !resolved {
273
+ \t\t\t\t\treturn abort(idx, ${PKG}.NewBehaviorFailure("UNKNOWN_COMPONENT", "component '${op.component}' has no handler (fail-closed)"))
274
+ \t\t\t\t}
275
+ \t\t\t\tif outcome.IsError {
276
+ \t\t\t\t\treturn outcome
277
+ \t\t\t\t}
278
+ \t\t\t\tcollected = append(collected, outcome.Ok)
279
+ \t\t\t\tkeptIdx = append(keptIdx, mi)
280
+ \t\t\t}
281
+ ${intoTail}`;
282
+ return `\t\tif i == ${op.index} {
283
+ \t\t\toverVal, overErr := ${op.over}
284
+ \t\t\tif overErr != nil {
285
+ \t\t\t\treturn abort(idx, overErr)
286
+ \t\t\t}
287
+ \t\t\toverArr, isArr := overVal.([]${PKG}.Value)
288
+ \t\t\tif !isArr {
289
+ \t\t\t\treturn abort(idx, ${PKG}.NewBehaviorFailure("MAP_OVER_NOT_ARRAY", "map '${op.id}': 'over' did not evaluate to an array"))
290
+ \t\t\t}
291
+ \t\t\tkeptIdx := make([]int, 0, len(overArr))
292
+ ${body}
293
+ \t\t}`;
294
+ }
295
+ /**
296
+ * emitComponentFn — 1 component の直線 Go 関数を綴じる。RunBehavior の実行フロー(results 蓄積 +
297
+ * baseScope + RunPlan + skip→unproduced + output 評価)を **生成コードに直線展開**する
298
+ * (汎用 exec/nodeKind/evalPorts は無い。各 exec 分岐は index で確定・ハードコード)。
299
+ */
300
+ function emitComponentFn(plan) {
301
+ const arms = plan.ops.map(emitExecArm).join("\n");
302
+ const planLiteral = plan.component.plan
303
+ ? emitBehaviorPlanLiteral(plan.component.plan)
304
+ : `(*${PKG}.ExecutionPlanSpec)(nil)`;
305
+ const output = emitExpr(plan.component.output, SCOPE);
306
+ const relationKinds = plan.opsLiteral.map((o) => (o.relationKind === "connection" ? "connection" : "single"));
307
+ const rkLiteral = `[]string{${relationKinds.map((r) => JSON.stringify(r)).join(", ")}}`;
308
+ return `func run_${sanitize(plan.name)}(handlers ${PKG}.ComponentExec, input *${PKG}.Obj) (${PKG}.Value, error) {
309
+ \tops := ${emitOpsLiteral(plan)}
310
+ \tif input == nil {
311
+ \t\tinput = ${PKG}.NewObj()
312
+ \t}
313
+ \tresults := ${PKG}.NewObj()
314
+ \tvar resultsMu sync.Mutex
315
+ \t// baseScope = input params + accumulated ok results (snapshot at call time).
316
+ \tbaseScope := func() *${PKG}.Obj {
317
+ \t\ts := ${PKG}.NewObj()
318
+ \t\tfor _, k := range input.Keys {
319
+ \t\t\ts.Set(k, input.Vals[k])
320
+ \t\t}
321
+ \t\tresultsMu.Lock()
322
+ \t\tfor _, k := range results.Keys {
323
+ \t\t\ts.Set(k, results.Vals[k])
324
+ \t\t}
325
+ \t\tresultsMu.Unlock()
326
+ \t\treturn s
327
+ \t}
328
+ \trelationKinds := ${rkLiteral}
329
+ \t// exec-internal failures (BehaviorFailure/ExprFailure) cannot unwind through the
330
+ \t// RunPlan ExecOutcome seam, so each op records its own error and returns a synthetic
331
+ \t// aborted ErrOutcome; sequential precedence is restored after RunPlan (bc#23).
332
+ \texecErrs := make([]error, len(ops))
333
+ \tabort := func(idx int, err error) ${PKG}.ExecOutcome {
334
+ \t\texecErrs[idx] = err
335
+ \t\treturn ${PKG}.ErrOutcome("aborted")
336
+ \t}
337
+ \texec := func(op ${PKG}.OpSpec, _ ${PKG}.Value) ${PKG}.ExecOutcome {
338
+ \t\tidx := -1
339
+ \t\tfor k := range ops {
340
+ \t\t\tif ops[k].ID == op.ID {
341
+ \t\t\t\tidx = k
342
+ \t\t\t\tbreak
343
+ \t\t\t}
344
+ \t\t}
345
+ \t\ti := idx
346
+ ${arms}
347
+ \t\treturn abort(idx, ${PKG}.NewBehaviorFailure("UNKNOWN_NODE_KIND", "op '"+op.ID+"' has no generated exec arm (fail-closed)"))
348
+ \t}
349
+ \twrappedExec := func(op ${PKG}.OpSpec, bound ${PKG}.Value) ${PKG}.ExecOutcome {
350
+ \t\toutcome := exec(op, bound)
351
+ \t\tif !outcome.IsError {
352
+ \t\t\tresultsMu.Lock()
353
+ \t\t\tresults.Set(op.ID, outcome.Ok)
354
+ \t\t\tresultsMu.Unlock()
355
+ \t\t}
356
+ \t\treturn outcome
357
+ \t}
358
+ \tplan := ${planLiteral}
359
+ \trun, err := ${PKG}.RunPlan(plan, ops, wrappedExec)
360
+ \tif firstErr := ${PKG}.FirstExecErrInVisitOrder(execErrs, plan, len(ops), err); firstErr != nil {
361
+ \t\treturn nil, firstErr
362
+ \t}
363
+ \tif err != nil {
364
+ \t\treturn nil, err
365
+ \t}
366
+ \t// Skipped nodes contribute their unproduced representation to the scope.
367
+ \tfor _, id := range run.Skipped {
368
+ \t\tif _, present := results.Get(id); present {
369
+ \t\t\tcontinue
370
+ \t\t}
371
+ \t\tfor k := range ops {
372
+ \t\t\tif ops[k].ID == id {
373
+ \t\t\t\tresults.Set(id, ${PKG}.UnproducedValue(relationKinds[k]))
374
+ \t\t\t\tbreak
375
+ \t\t\t}
376
+ \t\t}
377
+ \t}
378
+ \treturn ${output}
379
+ }`;
380
+ }
381
+ /** behavior plan({groups, concurrency})を *ExecutionPlanSpec Go リテラルへ。 */
382
+ function emitBehaviorPlanLiteral(plan) {
383
+ const p = plan;
384
+ const groups = p.groups ?? [];
385
+ const groupsLit = `[][]int{${groups.map((g) => `{${g.join(", ")}}`).join(", ")}}`;
386
+ const conc = p.concurrency ?? 1;
387
+ return `&${PKG}.ExecutionPlanSpec{Groups: ${groupsLit}, Concurrency: ${conc}}`;
388
+ }
389
+ /** component 名を Go 関数名に使える形へ(決定的。名前一意は DUPLICATE_COMPONENT で保証)。 */
390
+ function sanitize(name) {
391
+ return name.replace(/[^A-Za-z0-9_]/g, "_");
392
+ }
393
+ function emitComponent(plan, _ctx) {
394
+ return emitComponentFn(plan);
395
+ }
396
+ function emitModule(plans, ctx) {
397
+ const { fingerprint, specVersions, componentNames, runtimeImport } = ctx;
398
+ const names = componentNames.map((n) => JSON.stringify(n)).join(", ");
399
+ const irLiteral = emitDocLiteral(ctx.ir, "go");
400
+ const fns = plans.map((p) => emitComponent(p, ctx)).join("\n\n");
401
+ const dispatchArms = plans
402
+ .map((p) => `\tif name == ${JSON.stringify(p.name)} {\n\t\treturn run_${sanitize(p.name)}(handlers, input)\n\t}`)
403
+ .join("\n");
404
+ return `// GENERATED by behavior-contracts common generator (bc#38, straight-line) — DO NOT EDIT.
405
+ // Input: portable component-graph IR only (scp-ir-architecture.md §5/§7.4).
406
+ // This is the STRAIGHT-LINE codegen endpoint (typed-codegen.md §4.1 / bc#38 A2): each
407
+ // component is emitted as a native Go function that drives the plan via the RunPlan
408
+ // primitive (#36) and injected handlers. Simple ports are NATIVE-IZED (Phase B
409
+ // de-interpretation): ref/refOpt -> native scope/field walk (slRef/slRefOpt), concat ->
410
+ // native string concatenation (slConcat) — NO EvaluateExpression / Prim* call for those.
411
+ // Only overflow/short-circuit-prone ops (add/sub/mul/div/mod/and/or/cond/coalesce/…) route
412
+ // through the A0 primitive SSoT to preserve fail-closed semantics. It does NOT go through
413
+ // RunBehavior's tree-walk (no nodeKind dispatch / no evalPorts loop / no generic exec).
414
+ // Handlers are ALWAYS injected at the boundary; they are never generated.
415
+ // irFingerprint: ${fingerprint}
416
+
417
+ package behaviors
418
+
419
+ import (
420
+ \t"encoding/json"
421
+ \t"fmt"
422
+ \t"strings"
423
+ \t"sync"
424
+
425
+ \t${PKG} ${JSON.stringify(runtimeImport)}
426
+ )
427
+
428
+ // ExpectedSpecVersions are the spec versions baked at generation time
429
+ // (fail-closed constant comparison at init).
430
+ var ExpectedSpecVersions = map[string]int64{"behavior": ${specVersions.behavior}, "expression": ${specVersions.expression}, "plan": ${specVersions.plan}}
431
+
432
+ // IRFingerprint is the FNV-1a 64 fingerprint of the source portable IR
433
+ // (CanonicalJSON discipline, #208).
434
+ const IRFingerprint = ${JSON.stringify(fingerprint)}
435
+
436
+ // ComponentNames are the components exposed by Bind(), in IR declaration order.
437
+ var ComponentNames = []string{${names}}
438
+
439
+ // IR is the portable component-graph IR, embedded for the init-time fingerprint
440
+ // self-check only (the straight-line functions do NOT interpret it at run time).
441
+ var IR ${PKG}.JNode = ${irLiteral}
442
+
443
+ // init — load-time fail-closed checks (#208 prepared-artifact discipline).
444
+ func init() {
445
+ \tfor k, want := range ExpectedSpecVersions {
446
+ \t\tif got := ${PKG}.SpecVersions[k]; got != want {
447
+ \t\t\tpanic(fmt.Sprintf("behavior-contracts generated module: spec-version skew for '%s' (generated=%d, runtime=%d) — regenerate against this runtime (fail-closed)", k, want, got))
448
+ \t\t}
449
+ \t}
450
+ \tgot, err := ${PKG}.FingerprintComponentGraph(IR)
451
+ \tif err != nil {
452
+ \t\tpanic(fmt.Sprintf("behavior-contracts generated module: fingerprint recompute failed: %v (fail-closed)", err))
453
+ \t}
454
+ \tif got != IRFingerprint {
455
+ \t\tpanic(fmt.Sprintf("behavior-contracts generated module: IR fingerprint mismatch (baked=%s, embedded literal=%s) — the generated code was modified or corrupted (fail-closed)", IRFingerprint, got))
456
+ \t}
457
+ }
458
+
459
+ // ── native simple-expression helpers (Phase B de-interpretation, bc#38) ────────
460
+ // These are NATIVE Go — they never call EvaluateExpression / Prim*. They reproduce
461
+ // expr.go's ref/refOpt/concat semantics (same Failure codes) so the straight-line
462
+ // path is observationally equivalent to RunBehavior for simple ports while removing
463
+ // the expression-tree interpretation.
464
+
465
+ // slPart is a self-evaluating concat part (recursively native / primitive).
466
+ type slPart = func(scope *${PKG}.Obj) (${PKG}.Value, error)
467
+
468
+ // slVal wraps a native Go literal (string/bool/null) as a (Value, error) result —
469
+ // bare scalars carry no INVALID_LITERAL/range semantics, so no evaluate is needed.
470
+ func slVal(v ${PKG}.Value) (${PKG}.Value, error) { return v, nil }
471
+
472
+ // slRef walks a non-empty string path over scope (native; expr.go ref semantics).
473
+ func slRef(path []string, scope *${PKG}.Obj) (${PKG}.Value, error) {
474
+ \treturn slRefWalk("ref", path, scope)
475
+ }
476
+
477
+ // slRefOpt is the null-safe variant: a null intermediate propagates null.
478
+ func slRefOpt(path []string, scope *${PKG}.Obj) (${PKG}.Value, error) {
479
+ \treturn slRefWalk("refOpt", path, scope)
480
+ }
481
+
482
+ func slRefWalk(op string, path []string, scope *${PKG}.Obj) (${PKG}.Value, error) {
483
+ \tif len(path) == 0 {
484
+ \t\treturn nil, ${PKG}.NewExprFailure("INVALID_NODE", op+" expects a non-empty string path")
485
+ \t}
486
+ \thead := path[0]
487
+ \tcur, ok := scope.Get(head)
488
+ \tif !ok {
489
+ \t\treturn nil, ${PKG}.NewExprFailure("UNKNOWN_BINDING", "unknown binding: "+head)
490
+ \t}
491
+ \tfor _, seg := range path[1:] {
492
+ \t\tif cur == nil {
493
+ \t\t\tif op == "refOpt" {
494
+ \t\t\t\treturn nil, nil
495
+ \t\t\t}
496
+ \t\t\treturn nil, ${PKG}.NewExprFailure("NULL_REF", "null intermediate at ."+seg+" (use ?.)")
497
+ \t\t}
498
+ \t\to, ok := cur.(*${PKG}.Obj)
499
+ \t\tif !ok {
500
+ \t\t\treturn nil, ${PKG}.NewExprFailure("TYPE_MISMATCH", "cannot access ."+seg+" on "+${PKG}.TypeName(cur))
501
+ \t\t}
502
+ \t\tnext, present := o.Get(seg)
503
+ \t\tif !present {
504
+ \t\t\treturn nil, ${PKG}.NewExprFailure("MISSING_PROP", "missing property ."+seg)
505
+ \t\t}
506
+ \t\tcur = next
507
+ \t}
508
+ \treturn cur, nil
509
+ }
510
+
511
+ // slConcat concatenates n>=2 string parts natively (expr.go concat semantics:
512
+ // strings only, no implicit toString; arity < 2 is invalid IR).
513
+ func slConcat(parts []slPart, scope *${PKG}.Obj) (${PKG}.Value, error) {
514
+ \tif len(parts) < 2 {
515
+ \t\treturn nil, ${PKG}.NewExprFailure("INVALID_NODE", fmt.Sprintf("concat expects >= 2 args, got %d", len(parts)))
516
+ \t}
517
+ \tvar b strings.Builder
518
+ \tfor _, part := range parts {
519
+ \t\tv, err := part(scope)
520
+ \t\tif err != nil {
521
+ \t\t\treturn nil, err
522
+ \t\t}
523
+ \t\ts, ok := v.(string)
524
+ \t\tif !ok {
525
+ \t\t\treturn nil, ${PKG}.NewExprFailure("TYPE_MISMATCH", "concat: strings only (got "+${PKG}.TypeName(v)+"; no implicit toString)")
526
+ \t\t}
527
+ \t\tb.WriteString(s)
528
+ \t}
529
+ \treturn b.String(), nil
530
+ }
531
+
532
+ // ── straight-line component functions (no RunBehavior tree-walk) ───────────────
533
+ ${fns}
534
+
535
+ // Bind — inject handlers (boundary injection; catalog name → implementation) and get
536
+ // one executor per component. Each executor runs the straight-line function for that
537
+ // component (plan via RunPlan primitive + per-node native/primitive port eval +
538
+ // injected handler) — NOT the RunBehavior tree-walk. Observationally equivalent to the
539
+ // RunBehavior path: same values, same emitted op sequence, same Failure code.
540
+ func Bind(handlers ${PKG}.ComponentExec) map[string]func(input *${PKG}.Obj) (${PKG}.Value, error) {
541
+ \tbound := make(map[string]func(input *${PKG}.Obj) (${PKG}.Value, error), len(ComponentNames))
542
+ \tfor _, name := range ComponentNames {
543
+ \t\tn := name
544
+ \t\tbound[n] = func(input *${PKG}.Obj) (${PKG}.Value, error) {
545
+ \t\t\treturn dispatch(n, handlers, input)
546
+ \t\t}
547
+ \t}
548
+ \treturn bound
549
+ }
550
+
551
+ func dispatch(name string, handlers ${PKG}.ComponentExec, input *${PKG}.Obj) (${PKG}.Value, error) {
552
+ ${dispatchArms}
553
+ \treturn nil, ${PKG}.NewBehaviorFailure("UNKNOWN_ENTRY", "component '"+name+"' not found in this module (fail-closed)")
554
+ }
555
+ `;
556
+ }
557
+ const dialect = {
558
+ emitExpr,
559
+ mapScopeVar: MAP_SCOPE,
560
+ emitComponent,
561
+ emitModule,
562
+ };
563
+ /**
564
+ * go-typed(bc#47)が struct-native exec を綴じるために再利用する内部 emit ヘルパ。straight-line の
565
+ * plan/handler-dispatch SSoT(RunPlan + ExecHandler + native/primitive port eval)をそのまま使い、
566
+ * 「結果を Value scope でなく struct scope に持つ」差分だけを typed 側で足すための seam。runtime 語彙
567
+ * (PKG)と ops/plan リテラル・式 emit を共有する(意味論の二重実装を避ける)。
568
+ */
569
+ export const goStraightlineInternals = {
570
+ PKG,
571
+ emitExpr,
572
+ emitOpsLiteral,
573
+ emitBehaviorPlanLiteral,
574
+ goPortVar,
575
+ sanitize,
576
+ dialect,
577
+ };
578
+ function emit(ctx) {
579
+ return emitStraightlineModule(ctx, dialect, SCOPE);
580
+ }
581
+ /**
582
+ * goStraightlineEmitter — 言語識別子 `"go-straightline"` の emitter plugin。
583
+ * 既存の `go`(リテラル焼き込み・endpoint 3-literal)と併存する additive な第2モード。
584
+ */
585
+ export const goStraightlineEmitter = {
586
+ language: "go-straightline",
587
+ fileExtension: ".go",
588
+ defaultRuntimeImport: "github.com/foo-ogawa/behavior-contracts/go",
589
+ filenameHint: "behaviors.straightline.generated.go",
590
+ emit,
591
+ };
592
+ //# sourceMappingURL=emit-straightline-go.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"emit-straightline-go.js","sourceRoot":"","sources":["../../src/generator/emit-straightline-go.ts"],"names":[],"mappings":"AA8BA,OAAO,EAAE,cAAc,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAC;AACrE,OAAO,EACL,sBAAsB,GAIvB,MAAM,mBAAmB,CAAC;AAE3B,mEAAmE;AACnE,MAAM,GAAG,GAAG,cAAc,CAAC;AAC3B;;;GAGG;AACH,MAAM,KAAK,GAAG,aAAa,CAAC;AAC5B;;;;GAIG;AACH,MAAM,SAAS,GAAG,UAAU,CAAC;AAE7B,iDAAiD;AACjD,SAAS,GAAG,CAAC,IAAa;IACxB,OAAO,qBAAqB,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;AAC3C,CAAC;AAED,qEAAqE;AACrE,SAAS,OAAO,CAAC,GAAY;IAC3B,OAAQ,GAAiB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1D,CAAC;AAED;;;;;GAKG;AACH,MAAM,OAAO,GAAwD;IACnE,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,eAAe,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG;IACnD,KAAK,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,iBAAiB,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG;IACvD,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,YAAY,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG;IAChD,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,YAAY,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG;IAChD,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,YAAY,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG;IACpD,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,YAAY,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG;IACpD,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,YAAY,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG;IACpD,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,YAAY,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG;IACpD,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,YAAY,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG;IACpD,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,YAAY,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG;IACpD,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,WAAW,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG;IAClD,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,WAAW,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG;IAClD,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,WAAW,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG;IAClD,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,WAAW,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG;IAClD,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,WAAW,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG;IAClD,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,WAAW,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG;IAClD,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,YAAY,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG;IACpD,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,WAAW,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG;IAClD,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,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"}
@@ -0,0 +1,46 @@
1
+ /**
2
+ * emit-straightline-php.ts — PHP 直線 emitter(bc#41 / Layer A2)。
3
+ *
4
+ * typed-codegen.md §4.1 の PHP 具体化。language-neutral な {@link StraightlineDialect} を実装し、
5
+ * component ごとに「plan を `Primitives::runPlan` で直呼び・各ノードの port 評価と handler 呼びを
6
+ * 直線展開した」ネイティブ PHP クロージャを emit する。生成コードは A0(#36)の PHP primitive 面
7
+ * (`BehaviorContracts\Primitives::*`)+`runPlan`+`unproducedValue`+注入 handler を直呼びし、
8
+ * **`Behavior::runBehavior` の tree-walk(nodeKind ディスパッチ / evalPorts / 汎用 output 評価)を
9
+ * 経由しない**(AC1)。
10
+ *
11
+ * A1 の TS oracle との決定的な違い(AC2 — PHP は脱解釈が目的):
12
+ * TS emitter は全式ノードを A0 primitive の直呼びへ落とす(primitive 内 `evaluate` が意味論の
13
+ * SSoT を持つ)。PHP はそれに加えて **単純式をネイティブ化**して式ツリーの `evaluate()` 解釈を
14
+ * 単純式で消す(Phase B の脱解釈利得の実体):
15
+ * - `ref`/`refOpt` → 生成モジュール内の native helper(`$__sl_ref`/`$__sl_ref_opt`)が
16
+ * PHP array/stdClass アクセスで直接解決する(`ExprEval::evaluate` を経由しない)。
17
+ * Failure code(UNKNOWN_BINDING/NULL_REF/MISSING_PROP/TYPE_MISMATCH/INVALID_NODE)は
18
+ * ExprEval::evalRef と完全一致(同一意味論を native 実装で再現)。
19
+ * - `concat` → native helper(`$__sl_concat`)が各 part を native 評価した値配列を php の `.` で
20
+ * 結合する。part の型検査(string のみ)・arity(min 2)・INVALID_NODE も ExprEval::concat と一致。
21
+ * - string/bool/null のむき出しリテラル → その PHP リテラルを直接 emit(`evaluate` は scalar を
22
+ * 素通しするだけなので値等価。範囲/有限性検査が要る bare number は evalExpr SSoT に委譲)。
23
+ * overflow/短絡系(`add`/`sub`/`mul`/`div`/`mod`/`neg`/`and`/`or`/`not`/`cond`/`coalesce`/
24
+ * `eq`/`ne`/`lt`/`le`/`gt`/`ge`/`len`/`int`/`float`/`obj`/`arr`)は fail-closed 意味論(INT_OVERFLOW /
25
+ * PRECISION_LOSS / MOD_ZERO / 短絡未評価 / code-point 順 等)のため A0 primitive SSoT を呼ぶ。
26
+ * 単純式を primitive(evaluate 経由) に丸投げしないのが本 issue の要件(native-emit を pin する)。
27
+ *
28
+ * ロード形(emit-php.ts と同じ idiom): PHP に「モジュール」概念は無いため、生成ファイルは
29
+ * **require の戻り値**として stdClass(EXPECTED_SPEC_VERSIONS / IR_FINGERPRINT / COMPONENT_NAMES /
30
+ * IR / bind)を返す。native helper・primitive クラス名・各 component クロージャは変数(`$__P` /
31
+ * `$__sl_*` / `$componentFns`)として綴じ、トップレベルシンボルを一切定義しない(同一プロセスで
32
+ * 複数の生成モジュールを衝突なく require できる)。primitive の静的呼びは PHP の可変クラス名
33
+ * (`$__P::add(...)`)で行うので、生成式は runtimeImport の namespace に依存しない(emitExpr は
34
+ * context-free で {@link buildComponentPlan} の seam から呼べる)。
35
+ *
36
+ * スコープ(A2 = A1 と同じ read hot path): `componentRef` + `cond` + 単純 Expression Port。
37
+ * `map`/`batched`/`concurrency`(A3)・hydration(A4)は {@link emitStraightlineModule} の
38
+ * {@link assertStraightlineSupported} が LOUD reject(fail-closed — AC4)。
39
+ */
40
+ import type { EmitterPlugin } from "./core.js";
41
+ /**
42
+ * phpStraightlineEmitter — 言語識別子 `"php-straightline"` の emitter plugin。
43
+ * 既存の `php`(リテラル焼き込み・runBehavior 委譲)と併存する additive な第2モード。
44
+ */
45
+ export declare const phpStraightlineEmitter: EmitterPlugin;
46
+ //# sourceMappingURL=emit-straightline-php.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"emit-straightline-php.d.ts","sourceRoot":"","sources":["../../src/generator/emit-straightline-php.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsCG;AACH,OAAO,KAAK,EAAe,aAAa,EAAE,MAAM,WAAW,CAAC;AAsgB5D;;;GAGG;AACH,eAAO,MAAM,sBAAsB,EAAE,aAMpC,CAAC"}