behavior-contracts 0.4.0 → 0.6.0
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 +78 -29
- package/dist/behavior.d.ts +7 -0
- package/dist/behavior.d.ts.map +1 -1
- package/dist/behavior.js.map +1 -1
- package/dist/builder.d.ts.map +1 -1
- package/dist/builder.js +10 -3
- package/dist/builder.js.map +1 -1
- package/dist/generator/async-plan.d.ts +78 -0
- package/dist/generator/async-plan.d.ts.map +1 -0
- package/dist/generator/async-plan.js +116 -0
- package/dist/generator/async-plan.js.map +1 -0
- package/dist/generator/core.d.ts +35 -0
- package/dist/generator/core.d.ts.map +1 -1
- package/dist/generator/core.js +1 -0
- package/dist/generator/core.js.map +1 -1
- package/dist/generator/{emit-straightline-typed-go.d.ts → emit-shared-go-typed.d.ts} +28 -17
- package/dist/generator/emit-shared-go-typed.d.ts.map +1 -0
- package/dist/generator/emit-shared-go-typed.js +572 -0
- package/dist/generator/emit-shared-go-typed.js.map +1 -0
- package/dist/generator/emit-shared-go.d.ts +29 -0
- package/dist/generator/emit-shared-go.d.ts.map +1 -0
- package/dist/generator/{emit-straightline-go.js → emit-shared-go.js} +17 -31
- package/dist/generator/emit-shared-go.js.map +1 -0
- package/dist/generator/{emit-straightline-typed-rust.d.ts → emit-shared-rust-typed.d.ts} +27 -17
- package/dist/generator/emit-shared-rust-typed.d.ts.map +1 -0
- package/dist/generator/emit-shared-rust-typed.js +576 -0
- package/dist/generator/emit-shared-rust-typed.js.map +1 -0
- package/dist/generator/{emit-straightline-rust.d.ts → emit-shared-rust.d.ts} +1 -36
- package/dist/generator/emit-shared-rust.d.ts.map +1 -0
- package/dist/generator/{emit-straightline-rust.js → emit-shared-rust.js} +7 -28
- package/dist/generator/emit-shared-rust.js.map +1 -0
- package/dist/generator/emit-shared-typescript.d.ts +12 -0
- package/dist/generator/emit-shared-typescript.d.ts.map +1 -0
- package/dist/generator/{emit-straightline-typescript.js → emit-shared-typescript.js} +9 -30
- package/dist/generator/emit-shared-typescript.js.map +1 -0
- package/dist/generator/emit-straightline-typed-typescript.d.ts +1 -1
- package/dist/generator/emit-straightline-typed-typescript.d.ts.map +1 -1
- package/dist/generator/emit-straightline-typed-typescript.js +1 -1
- package/dist/generator/emit-straightline-typed-typescript.js.map +1 -1
- package/dist/generator/emit-typed-native-go.d.ts +63 -0
- package/dist/generator/emit-typed-native-go.d.ts.map +1 -0
- package/dist/generator/emit-typed-native-go.js +2260 -0
- package/dist/generator/emit-typed-native-go.js.map +1 -0
- package/dist/generator/emit-typed-native-rust.d.ts +53 -0
- package/dist/generator/emit-typed-native-rust.d.ts.map +1 -0
- package/dist/generator/emit-typed-native-rust.js +2123 -0
- package/dist/generator/emit-typed-native-rust.js.map +1 -0
- package/dist/generator/index.d.ts +4 -12
- package/dist/generator/index.d.ts.map +1 -1
- package/dist/generator/index.js +16 -52
- package/dist/generator/index.js.map +1 -1
- package/dist/generator/native-expr.d.ts +120 -0
- package/dist/generator/native-expr.d.ts.map +1 -0
- package/dist/generator/native-expr.js +456 -0
- package/dist/generator/native-expr.js.map +1 -0
- package/dist/generator/straightline.d.ts +46 -0
- package/dist/generator/straightline.d.ts.map +1 -1
- package/dist/generator/straightline.js +65 -0
- package/dist/generator/straightline.js.map +1 -1
- package/dist/generator/typed.d.ts.map +1 -1
- package/dist/generator/typed.js +8 -0
- package/dist/generator/typed.js.map +1 -1
- package/dist/guard.js +14 -0
- package/dist/guard.js.map +1 -1
- package/dist/index.d.ts +2 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/plan.d.ts +6 -2
- package/dist/plan.d.ts.map +1 -1
- package/dist/plan.js +4 -0
- package/dist/plan.js.map +1 -1
- package/package.json +1 -1
- package/dist/generator/emit-go.d.ts +0 -19
- package/dist/generator/emit-go.d.ts.map +0 -1
- package/dist/generator/emit-go.js +0 -79
- package/dist/generator/emit-go.js.map +0 -1
- package/dist/generator/emit-raw-abi-go.d.ts +0 -45
- package/dist/generator/emit-raw-abi-go.d.ts.map +0 -1
- package/dist/generator/emit-raw-abi-go.js +0 -345
- package/dist/generator/emit-raw-abi-go.js.map +0 -1
- package/dist/generator/emit-raw-abi-rust.d.ts +0 -45
- package/dist/generator/emit-raw-abi-rust.d.ts.map +0 -1
- package/dist/generator/emit-raw-abi-rust.js +0 -380
- package/dist/generator/emit-raw-abi-rust.js.map +0 -1
- package/dist/generator/emit-rust.d.ts +0 -25
- package/dist/generator/emit-rust.d.ts.map +0 -1
- package/dist/generator/emit-rust.js +0 -125
- package/dist/generator/emit-rust.js.map +0 -1
- package/dist/generator/emit-straightline-go.d.ts +0 -58
- package/dist/generator/emit-straightline-go.d.ts.map +0 -1
- package/dist/generator/emit-straightline-go.js.map +0 -1
- package/dist/generator/emit-straightline-php.d.ts +0 -46
- package/dist/generator/emit-straightline-php.d.ts.map +0 -1
- package/dist/generator/emit-straightline-php.js +0 -941
- package/dist/generator/emit-straightline-php.js.map +0 -1
- package/dist/generator/emit-straightline-python.d.ts +0 -36
- package/dist/generator/emit-straightline-python.d.ts.map +0 -1
- package/dist/generator/emit-straightline-python.js +0 -855
- package/dist/generator/emit-straightline-python.js.map +0 -1
- package/dist/generator/emit-straightline-rust.d.ts.map +0 -1
- package/dist/generator/emit-straightline-rust.js.map +0 -1
- package/dist/generator/emit-straightline-typed-go.d.ts.map +0 -1
- package/dist/generator/emit-straightline-typed-go.js +0 -1111
- package/dist/generator/emit-straightline-typed-go.js.map +0 -1
- package/dist/generator/emit-straightline-typed-rust.d.ts.map +0 -1
- package/dist/generator/emit-straightline-typed-rust.js +0 -1153
- package/dist/generator/emit-straightline-typed-rust.js.map +0 -1
- package/dist/generator/emit-straightline-typescript.d.ts +0 -47
- package/dist/generator/emit-straightline-typescript.d.ts.map +0 -1
- package/dist/generator/emit-straightline-typescript.js.map +0 -1
|
@@ -0,0 +1,576 @@
|
|
|
1
|
+
import { GeneratorFailure } from "./core.js";
|
|
2
|
+
import { deriveTypeRef, findDecl, } from "./typed.js";
|
|
3
|
+
import { rustStraightlineInternals, setRustForceRunPlanImports } from "./emit-shared-rust.js";
|
|
4
|
+
/** struct-native exec の port scope 式(input params のみ — node-result Value scope は組まない)。 */
|
|
5
|
+
const PORT_SCOPE = "port_scope()";
|
|
6
|
+
// ── Rust typed materializer(TypedMaterializer seam の Rust 具体化 — 拡張 hook 実装)────
|
|
7
|
+
/** 可搬スカラ → Rust の具体型名(de-box 後の struct field 型)。int=i64 / float=f64 で区別。 */
|
|
8
|
+
function rustScalar(scalar) {
|
|
9
|
+
switch (scalar) {
|
|
10
|
+
case "string":
|
|
11
|
+
return "String";
|
|
12
|
+
case "int":
|
|
13
|
+
return "i64";
|
|
14
|
+
case "float":
|
|
15
|
+
return "f64";
|
|
16
|
+
case "bool":
|
|
17
|
+
return "bool";
|
|
18
|
+
case "null":
|
|
19
|
+
// null 単独型は Rust に無いので Value(Null のみ格納)。opt でラップされて現れるのが通常。
|
|
20
|
+
return "Value";
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
/** TypeRef を Rust の具体型名へ(named→struct 名、arr→Vec、opt→Option、scalar→具体型)。 */
|
|
24
|
+
function renderTypeRef(ref) {
|
|
25
|
+
switch (ref.kind) {
|
|
26
|
+
case "scalar":
|
|
27
|
+
return rustScalar(ref.scalar);
|
|
28
|
+
case "opt":
|
|
29
|
+
// nullable は Rust の Option で表す(None = null)。
|
|
30
|
+
return `Option<${renderTypeRef(ref.inner)}>`;
|
|
31
|
+
case "arr":
|
|
32
|
+
return `Vec<${renderTypeRef(ref.elem)}>`;
|
|
33
|
+
case "named":
|
|
34
|
+
return ref.name;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
/** wire field 名 → Rust の struct field 名(決定的・安全化)。元名は struct コメント/marshaller で保持。 */
|
|
38
|
+
function rustFieldName(wire) {
|
|
39
|
+
// 非識別子文字は `_`。先頭が数字なら `f_` を前置。予約語衝突は `r#` で回避(raw identifier)。
|
|
40
|
+
let safe = wire.replace(/[^A-Za-z0-9_]/g, "_");
|
|
41
|
+
if (/^[0-9]/.test(safe))
|
|
42
|
+
safe = `f_${safe}`;
|
|
43
|
+
if (safe.length === 0)
|
|
44
|
+
safe = "f_";
|
|
45
|
+
if (RUST_KEYWORDS.has(safe))
|
|
46
|
+
return `r#${safe}`;
|
|
47
|
+
return safe;
|
|
48
|
+
}
|
|
49
|
+
/** field 名衝突を避けるための Rust 予約語(raw identifier 化する)。 */
|
|
50
|
+
const RUST_KEYWORDS = new Set([
|
|
51
|
+
"as", "break", "const", "continue", "crate", "dyn", "else", "enum", "extern", "false", "fn",
|
|
52
|
+
"for", "if", "impl", "in", "let", "loop", "match", "mod", "move", "mut", "pub", "ref", "return",
|
|
53
|
+
"self", "Self", "static", "struct", "super", "trait", "true", "type", "unsafe", "use", "where",
|
|
54
|
+
"while", "async", "await", "abstract", "become", "box", "do", "final", "macro", "override",
|
|
55
|
+
"priv", "typeof", "unsized", "virtual", "yield", "try", "union",
|
|
56
|
+
]);
|
|
57
|
+
/** string を Rust 文字列リテラルへ。 */
|
|
58
|
+
function rustStrLit(s) {
|
|
59
|
+
return JSON.stringify(s);
|
|
60
|
+
}
|
|
61
|
+
/** 単一 char を Rust の char リテラルへ(`'x'`)。特殊文字はエスケープ。 */
|
|
62
|
+
function rustCharLit(ch) {
|
|
63
|
+
if (ch === "'")
|
|
64
|
+
return "'\\''";
|
|
65
|
+
if (ch === "\\")
|
|
66
|
+
return "'\\\\'";
|
|
67
|
+
if (ch === "\n")
|
|
68
|
+
return "'\\n'";
|
|
69
|
+
if (ch === "\r")
|
|
70
|
+
return "'\\r'";
|
|
71
|
+
if (ch === "\t")
|
|
72
|
+
return "'\\t'";
|
|
73
|
+
// 制御文字/非 ASCII 印字外は \u{..} エスケープ、その他はそのまま(Rust の char リテラルは Unicode スカラ値)。
|
|
74
|
+
const cp = ch.codePointAt(0);
|
|
75
|
+
if (cp < 0x20 || cp === 0x7f)
|
|
76
|
+
return `'\\u{${cp.toString(16)}}'`;
|
|
77
|
+
return `'${ch}'`;
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* TypeRef が Rust の `Default` を導出可能か(null 単独型は `Value` に落ち Default 非実装 → false)。
|
|
81
|
+
* scalar(non-null)/opt/arr は常に Default 導出可、named は各 field が導出可なら導出可、arr/opt はラップ先に依存。
|
|
82
|
+
*/
|
|
83
|
+
function isDefaultable(ref, plan) {
|
|
84
|
+
switch (ref.kind) {
|
|
85
|
+
case "scalar":
|
|
86
|
+
return ref.scalar !== "null"; // null → Value(Default 非実装)
|
|
87
|
+
case "opt":
|
|
88
|
+
return true; // Option<T> は常に None default
|
|
89
|
+
case "arr":
|
|
90
|
+
return true; // Vec<T> は常に空 default
|
|
91
|
+
case "named": {
|
|
92
|
+
const decl = findDecl(plan, ref.name);
|
|
93
|
+
return decl ? decl.fields.every((f) => isDefaultable(f.type, plan)) : false;
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
/** 型プランの named obj を Rust struct 宣言へ(decls 順=決定的)。field は宣言順。 */
|
|
98
|
+
function emitTypeDecls(plan) {
|
|
99
|
+
if (plan.decls.length === 0)
|
|
100
|
+
return "";
|
|
101
|
+
return plan.decls
|
|
102
|
+
.map((d) => {
|
|
103
|
+
const fields = d.fields
|
|
104
|
+
.map((f) => ` ${rustFieldName(f.name)}: ${renderTypeRef(f.type)}, // ${JSON.stringify(f.name)}`)
|
|
105
|
+
.join("\n");
|
|
106
|
+
// Clone: struct field 直参照で output に clone するため。Default: cell の初期値(RefCell::new)用。
|
|
107
|
+
// 全 field が Default 導出可能なら `#[derive(Default)]`(clippy::derivable_impls 対応)。null 単独型
|
|
108
|
+
// (Value・Default 非実装)を持つ struct だけは手書き Default を emitDefaults() で綴じる(そこでは
|
|
109
|
+
// 導出不能なので derivable_impls は発火しない)。生成 struct は output で全 field が読まれるとは限らない → dead_code 許容。
|
|
110
|
+
const derives = isDefaultable({ kind: "named", name: d.name }, plan) ? "Clone, Default" : "Clone";
|
|
111
|
+
return `#[derive(${derives})]\n#[allow(dead_code)]\nstruct ${d.name} {\n${fields}\n}`;
|
|
112
|
+
})
|
|
113
|
+
.join("\n\n");
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* emitMarshallers — 各 named struct の raw→typed marshaller(§4.4)。動的 `&Value`(`Value::Obj` 期待)を
|
|
117
|
+
* 受け、各 field を typed に読み出して具体 struct を組む。generic Value 走査を exec 経路から除去する de-box の実体。
|
|
118
|
+
* field 型ごとに再帰: named→marshal_T*、arr→要素ループ、opt→null 分岐、scalar→型 match。
|
|
119
|
+
*/
|
|
120
|
+
function emitMarshallers(plan) {
|
|
121
|
+
if (plan.decls.length === 0)
|
|
122
|
+
return "";
|
|
123
|
+
return plan.decls.map((d) => emitOneMarshaller(d, plan)).join("\n\n");
|
|
124
|
+
}
|
|
125
|
+
function emitOneMarshaller(d, plan) {
|
|
126
|
+
const lines = [];
|
|
127
|
+
// 型プランは全 struct に marshaller を emit するが、named struct が exec で 1 度も handler 結果として
|
|
128
|
+
// 現れない vector(例: outputType 専用の合成 struct)では未使用になり得る → dead_code 許容(生成ツールキット)。
|
|
129
|
+
lines.push(`#[allow(dead_code)]`);
|
|
130
|
+
lines.push(`fn marshal_${d.name}(raw: &Value) -> Result<${d.name}, BehaviorError> {`);
|
|
131
|
+
lines.push(` let pairs = match raw {`);
|
|
132
|
+
lines.push(` Value::Obj(p) => p,`);
|
|
133
|
+
lines.push(` other => return Err(marshal_type_error(${rustStrLit(`typed marshal ${d.name}: expected obj, got `)}, other.type_name())),`);
|
|
134
|
+
lines.push(` };`);
|
|
135
|
+
const fieldInits = [];
|
|
136
|
+
for (const f of d.fields) {
|
|
137
|
+
const fieldVar = `field_${rustFieldName(f.name).replace(/^r#/, "")}`;
|
|
138
|
+
const keyLit = rustStrLit(f.name);
|
|
139
|
+
lines.push(` let ${fieldVar} = {`);
|
|
140
|
+
lines.push(` let fv = match pairs.iter().find(|(k, _)| k == ${keyLit}) {`);
|
|
141
|
+
lines.push(` Some((_, v)) => v,`);
|
|
142
|
+
lines.push(` None => return Err(marshal_missing_prop(${rustStrLit(`typed marshal ${d.name}: missing property .`)}, ${keyLit})),`);
|
|
143
|
+
lines.push(` };`);
|
|
144
|
+
lines.push(indentBlock(emitFieldMaterialize("fv", f.type, plan), 2));
|
|
145
|
+
lines.push(` };`);
|
|
146
|
+
fieldInits.push(` ${rustFieldName(f.name)}: ${fieldVar},`);
|
|
147
|
+
}
|
|
148
|
+
lines.push(` Ok(${d.name} {`);
|
|
149
|
+
lines.push(...fieldInits);
|
|
150
|
+
lines.push(` })`);
|
|
151
|
+
lines.push(`}`);
|
|
152
|
+
return lines.join("\n");
|
|
153
|
+
}
|
|
154
|
+
/** テキストブロックを indent 段(4 space/段)だけ字下げする。 */
|
|
155
|
+
function indentBlock(block, levels) {
|
|
156
|
+
const pad = " ".repeat(levels);
|
|
157
|
+
return block
|
|
158
|
+
.split("\n")
|
|
159
|
+
.map((l) => (l.length === 0 ? l : pad + l))
|
|
160
|
+
.join("\n");
|
|
161
|
+
}
|
|
162
|
+
/**
|
|
163
|
+
* emitFieldMaterialize — `src` (`&Value` 式) を型 `ref` の具体 typed 値へ materialize する Rust **式**を返す
|
|
164
|
+
* (末尾式・値を返す block)。scalar は型 match、named は marshal_T* 呼び(`?`)、arr は要素ループ、
|
|
165
|
+
* opt は null 分岐(Option)。すべて具体 Rust 型で組む(de-box)。fail は marshaller helper(BehaviorError)。
|
|
166
|
+
*/
|
|
167
|
+
function emitFieldMaterialize(src, ref, plan) {
|
|
168
|
+
switch (ref.kind) {
|
|
169
|
+
case "scalar": {
|
|
170
|
+
if (ref.scalar === "null") {
|
|
171
|
+
// null 単独型は Value のまま保持(clone)。
|
|
172
|
+
return `${src}.clone()`;
|
|
173
|
+
}
|
|
174
|
+
const variant = ref.scalar === "int" ? "Int" : ref.scalar === "float" ? "Float" : ref.scalar === "bool" ? "Bool" : "Str";
|
|
175
|
+
// Str は clone(所有 String)、その他は Copy。
|
|
176
|
+
const bind = ref.scalar === "string" ? "s.clone()" : "*s";
|
|
177
|
+
return [
|
|
178
|
+
`match ${src} {`,
|
|
179
|
+
` Value::${variant}(s) => ${bind},`,
|
|
180
|
+
` other => return Err(marshal_type_error(${rustStrLit(`typed marshal: expected ${ref.scalar}, got `)}, other.type_name())),`,
|
|
181
|
+
`}`,
|
|
182
|
+
].join("\n");
|
|
183
|
+
}
|
|
184
|
+
case "named": {
|
|
185
|
+
return `marshal_${ref.name}(${src})?`;
|
|
186
|
+
}
|
|
187
|
+
case "arr": {
|
|
188
|
+
const elemTy = renderTypeRef(ref.elem);
|
|
189
|
+
const inner = emitFieldMaterialize("elem_raw", ref.elem, plan);
|
|
190
|
+
return [
|
|
191
|
+
`match ${src} {`,
|
|
192
|
+
` Value::Arr(items) => {`,
|
|
193
|
+
` let mut out: Vec<${elemTy}> = Vec::with_capacity(items.len());`,
|
|
194
|
+
` for elem_raw in items.iter() {`,
|
|
195
|
+
` let elem_out = ${indentBlock(inner, 3).trimStart()};`,
|
|
196
|
+
` out.push(elem_out);`,
|
|
197
|
+
` }`,
|
|
198
|
+
` out`,
|
|
199
|
+
` }`,
|
|
200
|
+
` other => return Err(marshal_type_error(${rustStrLit("typed marshal: expected arr, got ")}, other.type_name())),`,
|
|
201
|
+
`}`,
|
|
202
|
+
].join("\n");
|
|
203
|
+
}
|
|
204
|
+
case "opt": {
|
|
205
|
+
const inner = emitFieldMaterialize("inner_raw", ref.inner, plan);
|
|
206
|
+
return [
|
|
207
|
+
`match ${src} {`,
|
|
208
|
+
` Value::Null => None,`,
|
|
209
|
+
` inner_raw => {`,
|
|
210
|
+
` let inner_out = ${indentBlock(inner, 2).trimStart()};`,
|
|
211
|
+
` Some(inner_out)`,
|
|
212
|
+
` }`,
|
|
213
|
+
`}`,
|
|
214
|
+
].join("\n");
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
/**
|
|
219
|
+
* materializeExpr — raw な `&Value` 式 `rawExpr` を型 `ref` の具体 typed 値へ変換する **単一式**(exec 経路の
|
|
220
|
+
* de-box)。named→`marshal_T*(...)?`、scalar/arr/opt→インライン材化 block。呼び側が typed ローカルへ束ねる。
|
|
221
|
+
* これが seam の runtime-materialization hook の Rust 実装本体(go の同型 hook)。
|
|
222
|
+
*/
|
|
223
|
+
function materializeExpr(rawExpr, ref, plan) {
|
|
224
|
+
// 参照式(`&x`)を受ける前提に統一するため、marshaller/材化 block はいずれも `&Value` を読む。
|
|
225
|
+
if (ref.kind === "named")
|
|
226
|
+
return `marshal_${ref.name}(${rawExpr})?`;
|
|
227
|
+
// scalar/arr/opt は emitFieldMaterialize の block を使う(式として評価される)。
|
|
228
|
+
return `{ let __src = ${rawExpr}; ${emitFieldMaterialize("__src", ref, plan).replace(/\n/g, " ")} }`;
|
|
229
|
+
}
|
|
230
|
+
/**
|
|
231
|
+
* typedFieldAccess — typed base 式 `baseExpr`(型 `baseRef`)に field path を **struct field 直参照**で辿る。
|
|
232
|
+
* map/obj_get lookup ではなく `.field` 連結(=de-box されている証拠)。辿り着いた TypeRef も返す。
|
|
233
|
+
*/
|
|
234
|
+
function typedFieldAccess(baseExpr, baseRef, fields, plan) {
|
|
235
|
+
let expr = baseExpr;
|
|
236
|
+
let ref = baseRef;
|
|
237
|
+
for (const f of fields) {
|
|
238
|
+
if (ref.kind !== "named") {
|
|
239
|
+
throw new Error(`typed rust: field access '.${f}' on non-struct TypeRef ${JSON.stringify(ref)}`);
|
|
240
|
+
}
|
|
241
|
+
const decl = findDecl(plan, ref.name);
|
|
242
|
+
const fld = decl?.fields.find((x) => x.name === f);
|
|
243
|
+
if (!fld)
|
|
244
|
+
throw new Error(`typed rust: field '${f}' not found on struct ${ref.name}`);
|
|
245
|
+
expr = `${expr}.${rustFieldName(f)}`; // struct field 直参照(map lookup でない)
|
|
246
|
+
ref = fld.type;
|
|
247
|
+
}
|
|
248
|
+
return { expr, ref };
|
|
249
|
+
}
|
|
250
|
+
/**
|
|
251
|
+
* serializeTyped — 具体 typed 値式を canonical 直列化用の動的 Value へ戻す式(観測等価 pin)。exec は
|
|
252
|
+
* typed のまま進み、component 境界でだけ Value 化して golden と突き合わせる。named→ser_T*、scalar→Value::variant、
|
|
253
|
+
* arr→要素 ser の map collect、opt→None/Some 分岐。式一発で返す。`typedExpr` は所有値(by-value)想定。
|
|
254
|
+
*/
|
|
255
|
+
function serializeTyped(typedExpr, ref, plan) {
|
|
256
|
+
switch (ref.kind) {
|
|
257
|
+
case "named":
|
|
258
|
+
return `ser_${ref.name}(${typedExpr})`;
|
|
259
|
+
case "scalar": {
|
|
260
|
+
switch (ref.scalar) {
|
|
261
|
+
case "string":
|
|
262
|
+
return `Value::Str(${typedExpr})`;
|
|
263
|
+
case "int":
|
|
264
|
+
return `Value::Int(${typedExpr})`;
|
|
265
|
+
case "float":
|
|
266
|
+
return `Value::Float(${typedExpr})`;
|
|
267
|
+
case "bool":
|
|
268
|
+
return `Value::Bool(${typedExpr})`;
|
|
269
|
+
case "null":
|
|
270
|
+
// null 単独型は Value をそのまま(clone 済みで保持)。
|
|
271
|
+
return `${typedExpr}`;
|
|
272
|
+
}
|
|
273
|
+
break;
|
|
274
|
+
}
|
|
275
|
+
case "arr": {
|
|
276
|
+
const elemTy = renderTypeRef(ref.elem);
|
|
277
|
+
return `Value::Arr(${typedExpr}.into_iter().map(|e: ${elemTy}| ${serializeTyped("e", ref.elem, plan)}).collect())`;
|
|
278
|
+
}
|
|
279
|
+
case "opt":
|
|
280
|
+
return `match ${typedExpr} { Some(inner) => ${serializeTyped("inner", ref.inner, plan)}, None => Value::Null }`;
|
|
281
|
+
}
|
|
282
|
+
throw new Error(`typed rust: serializeTyped fell through for ${JSON.stringify(ref)}`);
|
|
283
|
+
}
|
|
284
|
+
// ── serializer helper(named struct → Value)を型プランから emit ────────────────────
|
|
285
|
+
/** 各 named struct を canonical Value(Obj, field は宣言順)へ戻す `ser_T*` を emit(by-value consume)。 */
|
|
286
|
+
function emitSerializers(plan) {
|
|
287
|
+
return plan.decls
|
|
288
|
+
.map((d) => {
|
|
289
|
+
const sets = d.fields
|
|
290
|
+
.map((f) => ` (${rustStrLit(f.name)}.to_string(), ${serializeTyped(`v.${rustFieldName(f.name)}`, f.type, plan)}),`)
|
|
291
|
+
.join("\n");
|
|
292
|
+
// 型プランは全 struct に serializer を emit するが、output が named struct を丸ごと返さない vector では
|
|
293
|
+
// 未使用になり得る(scalar output 等) → dead_code 許容(生成ツールキット)。
|
|
294
|
+
return `#[allow(dead_code)]\nfn ser_${d.name}(v: ${d.name}) -> Value {\n Value::Obj(vec![\n${sets}\n ])\n}`;
|
|
295
|
+
})
|
|
296
|
+
.join("\n\n");
|
|
297
|
+
}
|
|
298
|
+
// ── struct-native runner(実 exec 経路 — 実 de-box)─────────────────────────────────
|
|
299
|
+
/** 生成コード内の typed ローカル cell 名(materialize 済み struct を RefCell で保持)。 */
|
|
300
|
+
function typedCell(nodeId) {
|
|
301
|
+
return `cell_${nodeId.replace(/[^A-Za-z0-9_]/g, "_")}`;
|
|
302
|
+
}
|
|
303
|
+
/** `ref` の path 配列(Expression IR)を取り出す。単純 ref ノードでなければ undefined。 */
|
|
304
|
+
function refPathOf(node) {
|
|
305
|
+
if (node === null || typeof node !== "object" || Array.isArray(node))
|
|
306
|
+
return undefined;
|
|
307
|
+
const keys = Object.keys(node);
|
|
308
|
+
if (keys.length !== 1 || keys[0] !== "ref")
|
|
309
|
+
return undefined;
|
|
310
|
+
const path = node.ref;
|
|
311
|
+
if (!Array.isArray(path) || !path.every((p) => typeof p === "string"))
|
|
312
|
+
return undefined;
|
|
313
|
+
return path;
|
|
314
|
+
}
|
|
315
|
+
/**
|
|
316
|
+
* emitTypedValue — output(Φ 合流式)IR を、期待型 `expected` の **具体 Rust typed 値**式へ再帰 lower し、
|
|
317
|
+
* `{ expr, ref }` を返す。これが AC の「exec が具体 struct を保持」の実体(go と同型):
|
|
318
|
+
* - `{ref:[typedNode, …fields]}` → typed struct field 直参照(typedFieldAccess — map lookup でない。struct は clone)。
|
|
319
|
+
* - `{ref:[input/非 typed node]}` → 型付け不能な生 Value。expected があれば materialize(de-box)。
|
|
320
|
+
* - `{obj:{…}}` → 具体 struct literal(expected が named のとき各 field を期待型で lower)。
|
|
321
|
+
* - `{arr:[…]}` → 具体 Vec literal(要素は要素型で lower)。
|
|
322
|
+
* - scalar literal → 具体 Rust 値。
|
|
323
|
+
* - concat → de-box された typed 値で native String 連結(意味論保存)。他演算子は LOUD fail-closed。
|
|
324
|
+
*/
|
|
325
|
+
function emitTypedValue(node, expected, typedNodes, plan) {
|
|
326
|
+
const path = refPathOf(node);
|
|
327
|
+
if (path && path.length >= 1) {
|
|
328
|
+
const head = path[0];
|
|
329
|
+
if (typedNodes.has(head)) {
|
|
330
|
+
// typed node への参照: cell から struct を借りて field 直参照で辿る(de-box された struct access)。
|
|
331
|
+
const baseRef = typedNodes.get(head);
|
|
332
|
+
// struct を所有値として取り出す(cell.borrow().clone())。field access は clone 済みの struct に対して行う。
|
|
333
|
+
// bare な Copy スカラ node(int/float/bool、以降の field path 無し)は `.clone()` が clippy::clone_on_copy
|
|
334
|
+
// を踏むので deref-copy(`*cell.borrow()`)で取り出す(意味論同値、clippy-clean — bc#49 B3)。
|
|
335
|
+
const isBareCopyScalar = path.length === 1 &&
|
|
336
|
+
baseRef.kind === "scalar" &&
|
|
337
|
+
(baseRef.scalar === "int" || baseRef.scalar === "float" || baseRef.scalar === "bool");
|
|
338
|
+
const base = isBareCopyScalar
|
|
339
|
+
? `*${typedCell(head)}.borrow()`
|
|
340
|
+
: `${typedCell(head)}.borrow().clone()`;
|
|
341
|
+
const { expr, ref } = typedFieldAccess(base, baseRef, path.slice(1), plan);
|
|
342
|
+
return { expr, ref };
|
|
343
|
+
}
|
|
344
|
+
// input param 参照(非 typed node): input Value を局所的に読み、expected へ materialize(de-box)。
|
|
345
|
+
// 動的 Value tree の再構築ではなく input 境界値の 1 leaf 読み(許容される局所変換)。
|
|
346
|
+
if (expected)
|
|
347
|
+
return { expr: materializeExpr(`&${inputRead(path)}`, expected, plan), ref: expected };
|
|
348
|
+
return { expr: inputRead(path), ref: undefined };
|
|
349
|
+
}
|
|
350
|
+
if (node !== null && typeof node === "object" && !Array.isArray(node)) {
|
|
351
|
+
const keys = Object.keys(node);
|
|
352
|
+
if (keys.length === 1 && keys[0] === "obj" && expected && expected.kind === "named") {
|
|
353
|
+
// 具体 struct literal を組む(de-box した output assembly)。
|
|
354
|
+
const decl = findDecl(plan, expected.name);
|
|
355
|
+
const fields = node.obj;
|
|
356
|
+
const inits = decl.fields.map((f) => {
|
|
357
|
+
const sub = emitTypedValue(fields[f.name], f.type, typedNodes, plan);
|
|
358
|
+
return `${rustFieldName(f.name)}: ${sub.expr}`;
|
|
359
|
+
});
|
|
360
|
+
return { expr: `${expected.name} { ${inits.join(", ")} }`, ref: expected };
|
|
361
|
+
}
|
|
362
|
+
if (keys.length === 1 && keys[0] === "arr" && expected && expected.kind === "arr") {
|
|
363
|
+
const elems = node.arr;
|
|
364
|
+
const elemTy = renderTypeRef(expected.elem);
|
|
365
|
+
const items = elems.map((e) => emitTypedValue(e, expected.elem, typedNodes, plan).expr);
|
|
366
|
+
return { expr: `{ let v: Vec<${elemTy}> = vec![${items.join(", ")}]; v }`, ref: expected };
|
|
367
|
+
}
|
|
368
|
+
// concat 演算子: operand を **de-box された typed 値**(typed field access なら concrete String)で
|
|
369
|
+
// 読み、native String 連結する(rust-straightline の concat_native と同じ native 化パターン — 意味論保存)。
|
|
370
|
+
if (keys.length === 1 && keys[0] === "concat" && expected && expected.kind === "scalar" && expected.scalar === "string") {
|
|
371
|
+
const parts = node.concat;
|
|
372
|
+
// 各 part を push_str へ渡す `&str` 式に落とす。bare 文字列リテラルは `"..."`(str slice)を直接渡し
|
|
373
|
+
// (clippy::unnecessary_to_owned 回避 — `&("x".to_string())` にしない)、それ以外(field access で得た
|
|
374
|
+
// concrete String など)は `&(expr)` で借用する。いずれも native String 連結(意味論保存)。
|
|
375
|
+
const pushes = parts.map((p) => {
|
|
376
|
+
if (typeof p === "string") {
|
|
377
|
+
// 1 文字リテラルは push(char)(clippy::single_char_add_str 回避)、それ以外は push_str(str slice)。
|
|
378
|
+
const chars = [...p];
|
|
379
|
+
if (chars.length === 1)
|
|
380
|
+
return `__s.push(${rustCharLit(chars[0])});`;
|
|
381
|
+
return `__s.push_str(${rustStrLit(p)});`;
|
|
382
|
+
}
|
|
383
|
+
const sub = emitTypedValue(p, { kind: "scalar", scalar: "string" }, typedNodes, plan);
|
|
384
|
+
return `__s.push_str(&(${sub.expr}));`;
|
|
385
|
+
});
|
|
386
|
+
return {
|
|
387
|
+
expr: `{ let mut __s = String::new(); ${pushes.join(" ")} __s }`,
|
|
388
|
+
ref: expected,
|
|
389
|
+
};
|
|
390
|
+
}
|
|
391
|
+
// その他単一キー = 別演算子(add/eq/…): struct-native exec では動的 Value output tree を組まない方針
|
|
392
|
+
// ゆえ LOUD fail-closed(bc typed corpus には output 位置の非 concat 演算子が無い。go と一致)。
|
|
393
|
+
if (keys.length === 1) {
|
|
394
|
+
throw new GeneratorFailure("UNSUPPORTED_NODE_STRAIGHTLINE", `rust-typed struct-native output: operator '${keys[0]}' at the output position is not supported in the struct-native de-box path yet (typed corpus covers only ref / obj / arr / concat outputs). Do not fall back to building the dynamic Value output tree.`);
|
|
395
|
+
}
|
|
396
|
+
}
|
|
397
|
+
// scalar literal(typed operand として現れる bare リテラル): 具体 Rust スカラ。
|
|
398
|
+
if (expected && expected.kind === "scalar") {
|
|
399
|
+
return { expr: litScalar(node, expected.scalar), ref: expected };
|
|
400
|
+
}
|
|
401
|
+
return { expr: litScalarUnknown(node), ref: undefined };
|
|
402
|
+
}
|
|
403
|
+
/** input/非 typed node の scope 読み(動的 Value 式)。input params のみを持つ port_scope() から 1 leaf。 */
|
|
404
|
+
function inputRead(path) {
|
|
405
|
+
return `input_ref(&[${path.map(rustStrLit).join(", ")}], &${PORT_SCOPE})`;
|
|
406
|
+
}
|
|
407
|
+
/** 期待スカラの Rust リテラル(string/int/float/bool/null)。 */
|
|
408
|
+
function litScalar(node, scalar) {
|
|
409
|
+
if (scalar === "string" && typeof node === "string")
|
|
410
|
+
return `${rustStrLit(node)}.to_string()`;
|
|
411
|
+
if (scalar === "bool" && typeof node === "boolean")
|
|
412
|
+
return node ? "true" : "false";
|
|
413
|
+
if (scalar === "int") {
|
|
414
|
+
if (node !== null && typeof node === "object" && typeof node.int === "string")
|
|
415
|
+
return `${node.int}i64`;
|
|
416
|
+
if (typeof node === "number")
|
|
417
|
+
return `${node}i64`;
|
|
418
|
+
}
|
|
419
|
+
if (scalar === "float") {
|
|
420
|
+
if (node !== null && typeof node === "object" && typeof node.float === "number")
|
|
421
|
+
return `${node.float}f64`;
|
|
422
|
+
if (typeof node === "number")
|
|
423
|
+
return `${node}f64`;
|
|
424
|
+
}
|
|
425
|
+
if (scalar === "null")
|
|
426
|
+
return "Value::Null";
|
|
427
|
+
throw new Error(`typed rust: scalar literal ${JSON.stringify(node)} does not match expected ${scalar}`);
|
|
428
|
+
}
|
|
429
|
+
function litScalarUnknown(node) {
|
|
430
|
+
if (node === null)
|
|
431
|
+
return "Value::Null";
|
|
432
|
+
if (typeof node === "boolean")
|
|
433
|
+
return node ? "Value::Bool(true)" : "Value::Bool(false)";
|
|
434
|
+
if (typeof node === "string")
|
|
435
|
+
return `Value::Str(${rustStrLit(node)}.to_string())`;
|
|
436
|
+
return "Value::Null";
|
|
437
|
+
}
|
|
438
|
+
/**
|
|
439
|
+
* collectTypedNodes — component の body ノードで outType を持つもの(componentRef / map / cond)を
|
|
440
|
+
* id → 結果 TypeRef に index 化する(#66: map/cond も struct 空間で結果を保持)。
|
|
441
|
+
*/
|
|
442
|
+
function collectTypedNodes(comp, plan) {
|
|
443
|
+
const typedNodes = new Map();
|
|
444
|
+
for (const n of comp.body) {
|
|
445
|
+
const ot = n.outType;
|
|
446
|
+
if (ot !== undefined)
|
|
447
|
+
typedNodes.set(n.id, deriveTypeRef(ot, plan));
|
|
448
|
+
}
|
|
449
|
+
return typedNodes;
|
|
450
|
+
}
|
|
451
|
+
// ── module 綴じ(straight-line 本体を流用 + typed 層)──────────────────────────────
|
|
452
|
+
function hasAnyTypeAnnotation(ctx) {
|
|
453
|
+
for (const comp of ctx.ir.components) {
|
|
454
|
+
if (comp.outputType !== undefined)
|
|
455
|
+
return true;
|
|
456
|
+
for (const n of comp.body)
|
|
457
|
+
if (n.outType !== undefined)
|
|
458
|
+
return true;
|
|
459
|
+
}
|
|
460
|
+
return false;
|
|
461
|
+
}
|
|
462
|
+
/** typed component(run_typed_* 経路で駆動するもの)か。 */
|
|
463
|
+
function isTypedComponent(comp) {
|
|
464
|
+
if (comp.outputType !== undefined)
|
|
465
|
+
return true;
|
|
466
|
+
return comp.body.some((n) => n.outType !== undefined);
|
|
467
|
+
}
|
|
468
|
+
/** marshaller helper(BehaviorError 生成)。生成モジュールに 1 度だけ emit。 */
|
|
469
|
+
function emitMarshalHelpers() {
|
|
470
|
+
return `// marshaller helpers — de-box failures map to BehaviorError (fail-closed, TYPE_MISMATCH / MISSING_PROP).
|
|
471
|
+
// (Some are unused in modules whose typed corpus never hits that failure shape — generated toolkit.)
|
|
472
|
+
#[allow(dead_code)]
|
|
473
|
+
fn marshal_type_error(prefix: &str, got: &str) -> BehaviorError {
|
|
474
|
+
BehaviorError::new("TYPE_MISMATCH", format!("{prefix}{got}"))
|
|
475
|
+
}
|
|
476
|
+
|
|
477
|
+
#[allow(dead_code)]
|
|
478
|
+
fn marshal_missing_prop(prefix: &str, key: &str) -> BehaviorError {
|
|
479
|
+
BehaviorError::new("MISSING_PROP", format!("{prefix}{key}"))
|
|
480
|
+
}
|
|
481
|
+
|
|
482
|
+
// input_ref — reads a single leaf from the input params Value (a genuine boundary read, NOT a
|
|
483
|
+
// reconstruction of a dynamic Value node-result tree). Used only when an output directly references
|
|
484
|
+
// an input param (rare in the bc typed corpus). Best-effort: the type plan guarantees the shape.
|
|
485
|
+
#[allow(dead_code)]
|
|
486
|
+
fn input_ref(path: &[&str], scope: &[(String, Value)]) -> Value {
|
|
487
|
+
if path.is_empty() {
|
|
488
|
+
return Value::Null;
|
|
489
|
+
}
|
|
490
|
+
let mut cur = match scope.iter().find(|(k, _)| k == path[0]) {
|
|
491
|
+
Some((_, v)) => v.clone(),
|
|
492
|
+
None => return Value::Null,
|
|
493
|
+
};
|
|
494
|
+
for seg in &path[1..] {
|
|
495
|
+
match cur.obj_get(seg) {
|
|
496
|
+
Some(v) => cur = v.clone(),
|
|
497
|
+
None => return Value::Null,
|
|
498
|
+
}
|
|
499
|
+
}
|
|
500
|
+
cur
|
|
501
|
+
}
|
|
502
|
+
|
|
503
|
+
fn no_typed_exec_arm(id: &str) -> BehaviorError {
|
|
504
|
+
BehaviorError::new("UNKNOWN_NODE_KIND", format!("op '{id}' has no generated typed exec arm (fail-closed)"))
|
|
505
|
+
}`;
|
|
506
|
+
}
|
|
507
|
+
/** Default 導出不能な named struct(null 単独型 Value field を持つもの)だけ手書き Default を emit。 */
|
|
508
|
+
function emitDefaults(plan) {
|
|
509
|
+
return plan.decls
|
|
510
|
+
.filter((d) => !isDefaultable({ kind: "named", name: d.name }, plan))
|
|
511
|
+
.map((d) => {
|
|
512
|
+
const fields = d.fields
|
|
513
|
+
.map((f) => ` ${rustFieldName(f.name)}: ${defaultExpr(f.type)},`)
|
|
514
|
+
.join("\n");
|
|
515
|
+
return `impl Default for ${d.name} {\n fn default() -> Self {\n ${d.name} {\n${fields}\n }\n }\n}`;
|
|
516
|
+
})
|
|
517
|
+
.join("\n\n");
|
|
518
|
+
}
|
|
519
|
+
/** TypeRef の Rust default 値式(Default::default() を持たない Value 型に対応するため明示)。 */
|
|
520
|
+
function defaultExpr(ref) {
|
|
521
|
+
switch (ref.kind) {
|
|
522
|
+
case "scalar":
|
|
523
|
+
switch (ref.scalar) {
|
|
524
|
+
case "string":
|
|
525
|
+
return "String::new()";
|
|
526
|
+
case "int":
|
|
527
|
+
return "0i64";
|
|
528
|
+
case "float":
|
|
529
|
+
return "0f64";
|
|
530
|
+
case "bool":
|
|
531
|
+
return "false";
|
|
532
|
+
case "null":
|
|
533
|
+
return "Value::Null";
|
|
534
|
+
}
|
|
535
|
+
break;
|
|
536
|
+
case "opt":
|
|
537
|
+
return "None";
|
|
538
|
+
case "arr":
|
|
539
|
+
return "Vec::new()";
|
|
540
|
+
case "named":
|
|
541
|
+
return `${ref.name}::default()`;
|
|
542
|
+
}
|
|
543
|
+
throw new Error(`typed rust: defaultExpr fell through for ${JSON.stringify(ref)}`);
|
|
544
|
+
}
|
|
545
|
+
/**
|
|
546
|
+
* rustTypedInternals — shared Rust typed-emit helpers the native emitter (emit-typed-native-rust.ts)
|
|
547
|
+
* reuses so the native de-box path shares one implementation of the type-plan/naming/serializer/
|
|
548
|
+
* marshaller discipline. This module carries NO emitter plugin (#90/#99): the rust-typed and
|
|
549
|
+
* rust-straightline emitter surfaces were removed — rust converges to the native target only.
|
|
550
|
+
*/
|
|
551
|
+
export const rustTypedInternals = {
|
|
552
|
+
sanitize: rustStraightlineInternals.sanitize,
|
|
553
|
+
rustFieldName,
|
|
554
|
+
rustStrLit,
|
|
555
|
+
renderTypeRef,
|
|
556
|
+
rustScalar,
|
|
557
|
+
typedCell,
|
|
558
|
+
typedFieldAccess,
|
|
559
|
+
isTypedComponent,
|
|
560
|
+
hasAnyTypeAnnotation,
|
|
561
|
+
collectTypedNodes,
|
|
562
|
+
emitTypeDecls,
|
|
563
|
+
emitDefaults,
|
|
564
|
+
emitSerializers,
|
|
565
|
+
emitMarshallers,
|
|
566
|
+
emitMarshalHelpers,
|
|
567
|
+
materializeExpr,
|
|
568
|
+
serializeTyped,
|
|
569
|
+
emitTypedValue,
|
|
570
|
+
indentBlock,
|
|
571
|
+
emitOpsLiteral: rustStraightlineInternals.emitOpsLiteral,
|
|
572
|
+
emitPlanLiteral: rustStraightlineInternals.emitPlanLiteral,
|
|
573
|
+
rustStraightlineInternals,
|
|
574
|
+
setRustForceRunPlanImports,
|
|
575
|
+
};
|
|
576
|
+
//# sourceMappingURL=emit-shared-rust-typed.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"emit-shared-rust-typed.js","sourceRoot":"","sources":["../../src/generator/emit-shared-rust-typed.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,33 +1,3 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* emit-straightline-rust.ts — Rust 直線 emitter(bc#39 / Layer A2, 脱解釈が目的)。
|
|
3
|
-
*
|
|
4
|
-
* typed-codegen.md §4.1 の rust 具体化。language-neutral な {@link StraightlineDialect} を実装し、
|
|
5
|
-
* component ごとに「plan を `run_plan` primitive で直呼び・各ノードの port 評価と handler 呼びを
|
|
6
|
-
* 直線展開した」ネイティブ rust 関数を emit する。生成コードは A0(#36)の rust primitive 面
|
|
7
|
-
* +`run_plan`+`unproduced_value` を直呼びし、**`run_behavior` の tree-walk(node_kind
|
|
8
|
-
* ディスパッチ / eval_ports / 汎用 exec)を経由しない**。
|
|
9
|
-
*
|
|
10
|
-
* ★ この emitter の主眼(TS oracle との違い — AC#2): **単純式のネイティブ化。**
|
|
11
|
-
* rust は Phase B の脱解釈利得が最大の言語なので、単純 Port は式ツリー解釈(`evaluate`)を
|
|
12
|
-
* 消してネイティブコードに落とす:
|
|
13
|
-
* - `concat` → `primitives::concat_native(&[<part0>?, <part1>?, …])`。各 part は再帰的に
|
|
14
|
-
* native emit した `Value`(`?` 展開)。`concat_native` は `String::push_str` で
|
|
15
|
-
* 連結し `evaluate` を呼ばない(純 concat の式ツリー解釈が消える)。
|
|
16
|
-
* - `ref` / `refOpt`(**静的 string path** のとき)→ `primitives::ref_native(&["a","b"], scope)` /
|
|
17
|
-
* `ref_opt_native`。scope→field を native に歩き `evaluate`/`json!` を呼ばない。
|
|
18
|
-
* これらの native helper は意味論を [`evaluate`] の該当アームから写し取っており(同じ
|
|
19
|
-
* ExprFailureCode)、tests/primitives.rs で差分 pin 済み(別実装ではなく写像)。
|
|
20
|
-
*
|
|
21
|
-
* ★ ネイティブ化しない演算子(fail-closed 意味論の SSoT を一本化): overflow/短絡系
|
|
22
|
-
* (`add`/`sub`/`mul`/`div`/`mod`/`neg`/`and`/`or`/`not`/`cond`/`coalesce`/比較/`obj`/`arr`/
|
|
23
|
-
* リテラル)は A0 の evaluate 委譲 primitive(`primitives::add` 等)を直呼びする。短絡の
|
|
24
|
-
* 被演算子は A0 契約どおり**未評価 IR リテラル**(`json!`)で渡す(primitive 内 `evaluate` が
|
|
25
|
-
* 短絡を保存する)。単純式まで evaluate 委譲 primitive に丸投げしない(=A1 との差 — AC#2)。
|
|
26
|
-
*
|
|
27
|
-
* go/rust/python/php は A2 で同じ枠(StraightlineDialect)に乗る。conformance で
|
|
28
|
-
* 「直線生成 ≡ run_behavior ≡ golden」を実 rust toolchain で pin する(bc#39 AC#3)。
|
|
29
|
-
*/
|
|
30
|
-
import type { EmitterPlugin } from "./core.js";
|
|
31
1
|
import { type ComponentPlan, type StraightlineDialect } from "./straightline.js";
|
|
32
2
|
export declare function setRustForceRunPlanImports(req: {
|
|
33
3
|
runPlan: boolean;
|
|
@@ -74,10 +44,5 @@ export declare const rustStraightlineInternals: {
|
|
|
74
44
|
sanitize: typeof sanitize;
|
|
75
45
|
dialect: StraightlineDialect;
|
|
76
46
|
};
|
|
77
|
-
/**
|
|
78
|
-
* rustStraightlineEmitter — 言語識別子 `"rust-straightline"` の emitter plugin。既存の `rust`
|
|
79
|
-
* (リテラル焼き込み・endpoint 3・run_behavior 丸投げ)と併存する additive な第2モード。
|
|
80
|
-
*/
|
|
81
|
-
export declare const rustStraightlineEmitter: EmitterPlugin;
|
|
82
47
|
export {};
|
|
83
|
-
//# sourceMappingURL=emit-
|
|
48
|
+
//# sourceMappingURL=emit-shared-rust.d.ts.map
|