behavior-contracts 0.2.0 → 0.2.2
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/dist/behavior.d.ts +47 -0
- package/dist/behavior.d.ts.map +1 -1
- package/dist/behavior.js.map +1 -1
- package/dist/generator/core.d.ts +1 -1
- package/dist/generator/core.d.ts.map +1 -1
- package/dist/generator/core.js.map +1 -1
- 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/index.d.ts +13 -0
- package/dist/generator/index.d.ts.map +1 -1
- package/dist/generator/index.js +39 -0
- package/dist/generator/index.js.map +1 -1
- package/dist/generator/literal.d.ts +7 -0
- package/dist/generator/literal.d.ts.map +1 -1
- package/dist/generator/literal.js +41 -0
- package/dist/generator/literal.js.map +1 -1
- 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 +18 -0
- package/dist/guard.d.ts.map +1 -1
- package/dist/guard.js +56 -0
- package/dist/guard.js.map +1 -1
- package/dist/index.d.ts +7 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +10 -2
- package/dist/index.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 +1 -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"}
|