@kernlang/core 3.5.9-canary.220.1.c398cd95 → 4.0.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.
Files changed (104) hide show
  1. package/dist/capability-matrix.js +8 -6
  2. package/dist/capability-matrix.js.map +1 -1
  3. package/dist/closure-eligibility.d.ts +104 -0
  4. package/dist/closure-eligibility.js +443 -0
  5. package/dist/closure-eligibility.js.map +1 -0
  6. package/dist/closure-python-lowering.d.ts +26 -0
  7. package/dist/closure-python-lowering.js +132 -22
  8. package/dist/closure-python-lowering.js.map +1 -1
  9. package/dist/codegen/body-ts.js +13 -0
  10. package/dist/codegen/body-ts.js.map +1 -1
  11. package/dist/codegen/type-system.js +50 -3
  12. package/dist/codegen/type-system.js.map +1 -1
  13. package/dist/codegen-core.js +29 -0
  14. package/dist/codegen-core.js.map +1 -1
  15. package/dist/codegen-expression.js +7 -0
  16. package/dist/codegen-expression.js.map +1 -1
  17. package/dist/constructor-super.d.ts +34 -0
  18. package/dist/constructor-super.js +122 -0
  19. package/dist/constructor-super.js.map +1 -0
  20. package/dist/core-contracts/boolean.d.ts +147 -0
  21. package/dist/core-contracts/boolean.js +110 -0
  22. package/dist/core-contracts/boolean.js.map +1 -0
  23. package/dist/core-contracts/function.d.ts +6 -0
  24. package/dist/core-contracts/function.js +7 -0
  25. package/dist/core-contracts/function.js.map +1 -0
  26. package/dist/core-contracts/index.d.ts +1032 -0
  27. package/dist/core-contracts/index.js +30 -0
  28. package/dist/core-contracts/index.js.map +1 -0
  29. package/dist/core-contracts/list.d.ts +87 -0
  30. package/dist/core-contracts/list.js +54 -0
  31. package/dist/core-contracts/list.js.map +1 -0
  32. package/dist/core-contracts/nullish.d.ts +12 -0
  33. package/dist/core-contracts/nullish.js +13 -0
  34. package/dist/core-contracts/nullish.js.map +1 -0
  35. package/dist/core-contracts/number.d.ts +291 -0
  36. package/dist/core-contracts/number.js +214 -0
  37. package/dist/core-contracts/number.js.map +1 -0
  38. package/dist/core-contracts/record.d.ts +60 -0
  39. package/dist/core-contracts/record.js +32 -0
  40. package/dist/core-contracts/record.js.map +1 -0
  41. package/dist/core-contracts/schema.d.ts +71 -0
  42. package/dist/core-contracts/schema.js +98 -0
  43. package/dist/core-contracts/schema.js.map +1 -0
  44. package/dist/core-contracts/semantics.d.ts +7 -0
  45. package/dist/core-contracts/semantics.js +221 -0
  46. package/dist/core-contracts/semantics.js.map +1 -0
  47. package/dist/core-contracts/string.d.ts +414 -0
  48. package/dist/core-contracts/string.js +335 -0
  49. package/dist/core-contracts/string.js.map +1 -0
  50. package/dist/core-runtime/contract-adapter.d.ts +8 -0
  51. package/dist/core-runtime/contract-adapter.js +73 -0
  52. package/dist/core-runtime/contract-adapter.js.map +1 -0
  53. package/dist/core-runtime/index.d.ts +109 -0
  54. package/dist/core-runtime/index.js +1946 -0
  55. package/dist/core-runtime/index.js.map +1 -0
  56. package/dist/core-runtime/shape-validator.d.ts +61 -0
  57. package/dist/core-runtime/shape-validator.js +564 -0
  58. package/dist/core-runtime/shape-validator.js.map +1 -0
  59. package/dist/core-runtime/value-brand.d.ts +2 -0
  60. package/dist/core-runtime/value-brand.js +6 -0
  61. package/dist/core-runtime/value-brand.js.map +1 -0
  62. package/dist/decompiler.js +46 -0
  63. package/dist/decompiler.js.map +1 -1
  64. package/dist/eligibility-taxonomy.d.ts +58 -0
  65. package/dist/eligibility-taxonomy.generated.d.ts +472 -0
  66. package/dist/eligibility-taxonomy.generated.js +566 -0
  67. package/dist/eligibility-taxonomy.generated.js.map +1 -0
  68. package/dist/eligibility-taxonomy.js +55 -0
  69. package/dist/eligibility-taxonomy.js.map +1 -0
  70. package/dist/index.d.ts +19 -2
  71. package/dist/index.js +17 -1
  72. package/dist/index.js.map +1 -1
  73. package/dist/instanceof-rhs.d.ts +53 -0
  74. package/dist/instanceof-rhs.js +74 -0
  75. package/dist/instanceof-rhs.js.map +1 -0
  76. package/dist/ir/semantics/lambda.js +9 -1
  77. package/dist/ir/semantics/lambda.js.map +1 -1
  78. package/dist/native-eligibility-ast.d.ts +5 -0
  79. package/dist/native-eligibility-ast.js +242 -63
  80. package/dist/native-eligibility-ast.js.map +1 -1
  81. package/dist/parser-expression.d.ts +1 -1
  82. package/dist/parser-expression.js +90 -1
  83. package/dist/parser-expression.js.map +1 -1
  84. package/dist/rag-assertions.d.ts +3 -0
  85. package/dist/rag-assertions.js +15 -0
  86. package/dist/rag-assertions.js.map +1 -0
  87. package/dist/rag-runtime.d.ts +169 -0
  88. package/dist/rag-runtime.js +823 -0
  89. package/dist/rag-runtime.js.map +1 -0
  90. package/dist/schema.d.ts +1 -0
  91. package/dist/schema.js +197 -2
  92. package/dist/schema.js.map +1 -1
  93. package/dist/semantic-substrate.d.ts +108 -0
  94. package/dist/semantic-substrate.js +263 -0
  95. package/dist/semantic-substrate.js.map +1 -0
  96. package/dist/semantic-validator.d.ts +332 -0
  97. package/dist/semantic-validator.js +3387 -0
  98. package/dist/semantic-validator.js.map +1 -1
  99. package/dist/spec.d.ts +2 -2
  100. package/dist/spec.js +15 -1
  101. package/dist/spec.js.map +1 -1
  102. package/dist/value-ir.d.ts +11 -1
  103. package/dist/value-ir.js.map +1 -1
  104. package/package.json +5 -1
@@ -126,15 +126,17 @@ const PY_CORE_CAPABILITIES = [
126
126
  support: 'unsupported',
127
127
  note: 'mapTsTypeToPython has no tuple branch; alias passthrough emits raw TS form',
128
128
  },
129
- // Slice 2b Python has Enum class via `from enum import Enum`, but the
130
- // FastAPI generator does not yet emit class-based enums for the `enum` node.
131
- // Mark unsupported until that path lands; flipping to `lowered` requires a
132
- // dedicated Python generator (would emit `class Status(str, Enum): ...`).
129
+ // Slice 2b / enum-python-parity the `enum` node now lowers to a PLAIN
130
+ // Python namespace class (`class Status:` with bare int/str members), NOT
131
+ // enum.Enum / IntEnum / a metaclass and with NO runtime import (tribunal
132
+ // run-1781176354539). Bare members give equality/arithmetic/JSON/fmt parity
133
+ // with the TS enum by construction. See generatePythonEnum in
134
+ // packages/python/src/generators/data.ts.
133
135
  {
134
136
  feature: 'enum-type',
135
137
  position: 'top-level',
136
- support: 'unsupported',
137
- note: 'FastAPI codegen does not yet handle the enum node; would produce no output',
138
+ support: 'lowered',
139
+ note: 'lowers to a plain namespace class with bare int/str members (no enum.Enum, no runtime import)',
138
140
  },
139
141
  // Slice 2c — Python has dict[K, V] / TypedDict but the FastAPI generator
140
142
  // does not yet emit either form from an `indexer` child. Mark unsupported.
@@ -1 +1 @@
1
- {"version":3,"file":"capability-matrix.js","sourceRoot":"","sources":["../src/capability-matrix.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"capability-matrix.js","sourceRoot":"","sources":["../src/capability-matrix.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,104 @@
1
+ /** v1 closure gate — fail-closed eligibility predicate AND emission
2
+ * precondition for block-bodied arrow functions in native KERN bodies.
3
+ *
4
+ * Architecture (council + tribunal decided, Option B′ "TS-AST-grounded raw
5
+ * body"): the lambda IR carries the raw block text (`bodyBlock.raw`) for
6
+ * verbatim TS re-emit ONLY. Every analyzer/consumer reads the TS AST obtained
7
+ * through `parseClosureBlockAst` here — never scans the string. The IR does
8
+ * NOT store the `ts.Block` (serialization safety); this helper recomputes it
9
+ * (cheap; memoized via a module-level `Map`).
10
+ *
11
+ * The gate is the SINGLE owner of "is this block body supported" — used by:
12
+ * - the parser (parse-time validation, fail-closed)
13
+ * - the migrator eligibility classifier (`native-eligibility-ast.ts`)
14
+ * - the Python lowerer precondition (`codegen-body-python.ts`)
15
+ * so nothing eligible can fail to lower.
16
+ *
17
+ * ── Mutation v1 (the closure-mutation slice) ───────────────────────────────
18
+ * The gate now ACCEPTS in statement position:
19
+ * (a) assignments to bare identifiers — block-LOCAL or FREE alike. The gate
20
+ * is a SHAPE classifier: it sees only the block (params live on the arrow
21
+ * and are stripped before the block is parsed), so it CANNOT tell a free
22
+ * capture from a closure param. Both are accepted here; the Python
23
+ * EMITTER (`emitBlockClosurePy`) decides pinned-vs-`nonlocal` using the
24
+ * enclosing loop context it alone can see, and the LOWERER excludes
25
+ * params from the written-free set (so a param write stays a plain local
26
+ * assignment, never `nonlocal`). The compound forms `+=,-=,*=,/=,%=` are
27
+ * accepted; statement-position `++`/`--` lower to `+= 1`/`-= 1`.
28
+ * (b) member/index writes on any non-`this` base (`acc.total = 1`,
29
+ * `acc[i] = v`, compound forms) — by-reference parity, no `nonlocal`.
30
+ * It KEEPS REJECTING, with precise reasons:
31
+ * - `this`-rooted targets → `closure-this` (unchanged).
32
+ * - destructuring / parenthesized targets → `closure-unsupported-assign-target`.
33
+ * - assignment operators outside {=,+=,-=,*=,/=,%=} (e.g. `&=`, `|=`, `<<=`)
34
+ * → `closure-unsupported-operator`.
35
+ * - value-position `++`/`--` (operand of a larger expression, e.g.
36
+ * `arr.push(x++)`) → `closure-incdec-value-position`.
37
+ * The eligibility≢lowerability gap for PINNED captures (a free write to a
38
+ * per-iteration loop binding) is intentional and surfaces as a LOUD compile
39
+ * error at emission (`closure-pinned-write`), not here: the single-statement
40
+ * gate cannot see the enclosing loop header.
41
+ *
42
+ * v1 is deliberately NARROWER than the lowering machinery
43
+ * (`lowerJsClosureBodyToPython` supports try/for-of; the gate rejects them).
44
+ * Widening the gate is a future slice. */
45
+ import ts from 'typescript';
46
+ /** Parse a raw closure block (`{ ... }`, braces included) into a `ts.Block`,
47
+ * or `null` if it does not parse cleanly as a single function body block.
48
+ *
49
+ * Generalized from the former `parseClosureBlock` in
50
+ * closure-python-lowering.ts (which now imports this). Route behavior is
51
+ * unchanged: the lowerer still validates the same way. */
52
+ export declare function parseClosureBlockAst(raw: string): ts.Block | null;
53
+ /** Collect the set of free identifier NAMES referenced in a closure block —
54
+ * identifiers used in the block that are NOT declared inside the block and
55
+ * NOT in `paramNames` (the closure's own parameters). These are exactly the
56
+ * names the closure CAPTURES from its enclosing scope.
57
+ *
58
+ * Slice-2 loop-variable pinning consumes this: a captured name whose binding
59
+ * resolves at-or-inside the enclosing loop body must be pinned via a Python
60
+ * default arg, so each closure sees its own iteration's value (JS per-iteration
61
+ * capture) instead of late-binding to the last value.
62
+ *
63
+ * Uses the TS AST (via `parseClosureBlockAst`) — never string scanning.
64
+ * Excludes, per the spec:
65
+ * - the `.name` side of a member access (`a.b` references only `a`),
66
+ * - object-literal property keys (`{ a: 1 }` — `a` is a key, not a ref),
67
+ * - declaration names themselves (`const x = …` — `x` is the bound name),
68
+ * - shorthand-property assignment names are NOT excluded: `{ a }` reads `a`,
69
+ * so the shorthand identifier IS a real reference and stays in the set.
70
+ *
71
+ * A name both declared-inside and referenced (a block-local, or a shadowing
72
+ * re-declaration) is NOT free — `collectLocalDeclaredNames` removes it. The
73
+ * block is parsed once (memoized); a parse failure yields an empty set (the
74
+ * gate already rejected such bodies, so this is defensive). */
75
+ export declare function collectFreeIdentifierNames(raw: string, paramNames: string[]): Set<string>;
76
+ /** The assignment operators the mutation-v1 gate accepts (mirrored by the
77
+ * Python lowerer, which emits the same compound operator directly). Anything
78
+ * else (`&=`, `|=`, `^=`, `<<=`, `>>=`, `>>>=`, `**=`, `&&=`, `||=`, `??=`)
79
+ * rejects with `closure-unsupported-operator`. The lowerer SHARES this set so
80
+ * the gate and the emitter never drift. */
81
+ export declare const CLOSURE_ASSIGN_OPERATORS: ReadonlySet<ts.SyntaxKind>;
82
+ /** Classify a closure block body. Returns `null` if the body is supported by
83
+ * the v1 gate, or a distinct reject-reason string otherwise.
84
+ *
85
+ * ACCEPT set: `let`/`const` (identifier names + initializers, no
86
+ * destructuring), `return` (with or without expression), expression
87
+ * statements, `if`/`else` (block or single-statement branches, nesting fine).
88
+ * Statement-position MUTATIONS are now accepted: assignments to a bare
89
+ * identifier (local OR free) and to a non-`this` member/index target, with the
90
+ * operators {=,+=,-=,*=,/=,%=}, plus statement-position `++`/`--`.
91
+ *
92
+ * REJECT (whole-block walk): `this` (incl. a `this`-rooted assign target →
93
+ * `closure-this`), nested arrow/function/class, `yield`, `await`, any loop,
94
+ * `throw`, `try`, `switch`, `break`/`continue`, `var`, parameter default
95
+ * values, spread, labeled statements, `with`; a destructuring/parenthesized
96
+ * assign target (`closure-unsupported-assign-target`); an assignment operator
97
+ * outside the accepted set (`closure-unsupported-operator`); and a
98
+ * value-position `++`/`--` (`closure-incdec-value-position`). Member/index
99
+ * mutation and method calls on a captured object (`acc.push(x)`) are allowed.
100
+ * Any statement outside the accept set rejects. NOTE: a free write to a
101
+ * PINNED per-iteration loop capture passes the gate but is rejected LOUDLY at
102
+ * Python emission (`closure-pinned-write`) — the single-statement gate cannot
103
+ * see the enclosing loop header (eligibility≢lowerability, by design). */
104
+ export declare function classifyClosureBlock(raw: string): null | string;
@@ -0,0 +1,443 @@
1
+ /** v1 closure gate — fail-closed eligibility predicate AND emission
2
+ * precondition for block-bodied arrow functions in native KERN bodies.
3
+ *
4
+ * Architecture (council + tribunal decided, Option B′ "TS-AST-grounded raw
5
+ * body"): the lambda IR carries the raw block text (`bodyBlock.raw`) for
6
+ * verbatim TS re-emit ONLY. Every analyzer/consumer reads the TS AST obtained
7
+ * through `parseClosureBlockAst` here — never scans the string. The IR does
8
+ * NOT store the `ts.Block` (serialization safety); this helper recomputes it
9
+ * (cheap; memoized via a module-level `Map`).
10
+ *
11
+ * The gate is the SINGLE owner of "is this block body supported" — used by:
12
+ * - the parser (parse-time validation, fail-closed)
13
+ * - the migrator eligibility classifier (`native-eligibility-ast.ts`)
14
+ * - the Python lowerer precondition (`codegen-body-python.ts`)
15
+ * so nothing eligible can fail to lower.
16
+ *
17
+ * ── Mutation v1 (the closure-mutation slice) ───────────────────────────────
18
+ * The gate now ACCEPTS in statement position:
19
+ * (a) assignments to bare identifiers — block-LOCAL or FREE alike. The gate
20
+ * is a SHAPE classifier: it sees only the block (params live on the arrow
21
+ * and are stripped before the block is parsed), so it CANNOT tell a free
22
+ * capture from a closure param. Both are accepted here; the Python
23
+ * EMITTER (`emitBlockClosurePy`) decides pinned-vs-`nonlocal` using the
24
+ * enclosing loop context it alone can see, and the LOWERER excludes
25
+ * params from the written-free set (so a param write stays a plain local
26
+ * assignment, never `nonlocal`). The compound forms `+=,-=,*=,/=,%=` are
27
+ * accepted; statement-position `++`/`--` lower to `+= 1`/`-= 1`.
28
+ * (b) member/index writes on any non-`this` base (`acc.total = 1`,
29
+ * `acc[i] = v`, compound forms) — by-reference parity, no `nonlocal`.
30
+ * It KEEPS REJECTING, with precise reasons:
31
+ * - `this`-rooted targets → `closure-this` (unchanged).
32
+ * - destructuring / parenthesized targets → `closure-unsupported-assign-target`.
33
+ * - assignment operators outside {=,+=,-=,*=,/=,%=} (e.g. `&=`, `|=`, `<<=`)
34
+ * → `closure-unsupported-operator`.
35
+ * - value-position `++`/`--` (operand of a larger expression, e.g.
36
+ * `arr.push(x++)`) → `closure-incdec-value-position`.
37
+ * The eligibility≢lowerability gap for PINNED captures (a free write to a
38
+ * per-iteration loop binding) is intentional and surfaces as a LOUD compile
39
+ * error at emission (`closure-pinned-write`), not here: the single-statement
40
+ * gate cannot see the enclosing loop header.
41
+ *
42
+ * v1 is deliberately NARROWER than the lowering machinery
43
+ * (`lowerJsClosureBodyToPython` supports try/for-of; the gate rejects them).
44
+ * Widening the gate is a future slice. */
45
+ import ts from 'typescript';
46
+ /** Memoize parsed blocks. Keyed by the raw (trimmed) source. A `null` value is
47
+ * a cached "does not parse / not a single block" verdict. */
48
+ const blockCache = new Map();
49
+ /** Parse a raw closure block (`{ ... }`, braces included) into a `ts.Block`,
50
+ * or `null` if it does not parse cleanly as a single function body block.
51
+ *
52
+ * Generalized from the former `parseClosureBlock` in
53
+ * closure-python-lowering.ts (which now imports this). Route behavior is
54
+ * unchanged: the lowerer still validates the same way. */
55
+ export function parseClosureBlockAst(raw) {
56
+ const trimmed = raw.trim();
57
+ if (blockCache.has(trimmed))
58
+ return blockCache.get(trimmed) ?? null;
59
+ const result = parseClosureBlockUncached(trimmed);
60
+ blockCache.set(trimmed, result);
61
+ return result;
62
+ }
63
+ function parseClosureBlockUncached(trimmed) {
64
+ if (trimmed.length < 2 || trimmed[0] !== '{' || trimmed[trimmed.length - 1] !== '}')
65
+ return null;
66
+ const source = `function __kern_closure__() ${trimmed}`;
67
+ const sf = ts.createSourceFile('__kern_closure__.ts', source, ts.ScriptTarget.Latest, true, ts.ScriptKind.TS);
68
+ const diags = sf.parseDiagnostics;
69
+ if (diags && diags.length > 0)
70
+ return null;
71
+ const fn = sf.statements[0];
72
+ if (!fn || !ts.isFunctionDeclaration(fn) || !fn.body)
73
+ return null;
74
+ return fn.body;
75
+ }
76
+ /** Collect identifier names bound by `let`/`const` declarations directly inside
77
+ * the closure block (including inside nested if/else branches the gate
78
+ * accepts). Used to distinguish a free-variable write (rejected) from an
79
+ * assignment to a closure-local (allowed). v1 only admits identifier-named
80
+ * declarations, so destructured names never enter this set. */
81
+ function collectLocalDeclaredNames(block) {
82
+ const names = new Set();
83
+ const visit = (node) => {
84
+ if (ts.isVariableDeclaration(node) && ts.isIdentifier(node.name)) {
85
+ names.add(node.name.text);
86
+ }
87
+ ts.forEachChild(node, visit);
88
+ };
89
+ ts.forEachChild(block, visit);
90
+ return names;
91
+ }
92
+ /** Collect the set of free identifier NAMES referenced in a closure block —
93
+ * identifiers used in the block that are NOT declared inside the block and
94
+ * NOT in `paramNames` (the closure's own parameters). These are exactly the
95
+ * names the closure CAPTURES from its enclosing scope.
96
+ *
97
+ * Slice-2 loop-variable pinning consumes this: a captured name whose binding
98
+ * resolves at-or-inside the enclosing loop body must be pinned via a Python
99
+ * default arg, so each closure sees its own iteration's value (JS per-iteration
100
+ * capture) instead of late-binding to the last value.
101
+ *
102
+ * Uses the TS AST (via `parseClosureBlockAst`) — never string scanning.
103
+ * Excludes, per the spec:
104
+ * - the `.name` side of a member access (`a.b` references only `a`),
105
+ * - object-literal property keys (`{ a: 1 }` — `a` is a key, not a ref),
106
+ * - declaration names themselves (`const x = …` — `x` is the bound name),
107
+ * - shorthand-property assignment names are NOT excluded: `{ a }` reads `a`,
108
+ * so the shorthand identifier IS a real reference and stays in the set.
109
+ *
110
+ * A name both declared-inside and referenced (a block-local, or a shadowing
111
+ * re-declaration) is NOT free — `collectLocalDeclaredNames` removes it. The
112
+ * block is parsed once (memoized); a parse failure yields an empty set (the
113
+ * gate already rejected such bodies, so this is defensive). */
114
+ export function collectFreeIdentifierNames(raw, paramNames) {
115
+ const block = parseClosureBlockAst(raw);
116
+ if (block === null)
117
+ return new Set();
118
+ const declared = collectLocalDeclaredNames(block);
119
+ const params = new Set(paramNames);
120
+ const free = new Set();
121
+ const visit = (node) => {
122
+ if (ts.isIdentifier(node)) {
123
+ const parent = node.parent;
124
+ // `a.b` — only `a` is a reference; skip the `.b` name side.
125
+ if (parent && ts.isPropertyAccessExpression(parent) && parent.name === node)
126
+ return;
127
+ // `a?.b` qualified-name / similar — defensive (PropertyAccess covers the
128
+ // common case; QualifiedName appears only in type positions, which the
129
+ // gate rejects, but skip the right-hand name there too for safety).
130
+ if (parent && ts.isQualifiedName(parent) && parent.right === node)
131
+ return;
132
+ // Object-literal property KEY (`{ a: 1 }`) — `a` is a key, not a ref.
133
+ // Shorthand (`{ a }`) is a ShorthandPropertyAssignment whose `.name` IS
134
+ // a real read of `a`, so it is NOT excluded here.
135
+ if (parent && ts.isPropertyAssignment(parent) && parent.name === node)
136
+ return;
137
+ // Declaration name (`const x = …`, `let x`, a binding-element name).
138
+ if (parent && ts.isVariableDeclaration(parent) && parent.name === node)
139
+ return;
140
+ if (parent && ts.isBindingElement(parent) && parent.name === node)
141
+ return;
142
+ // A binding element's property name (`const { p: local } = o` — `p`).
143
+ if (parent && ts.isBindingElement(parent) && parent.propertyName === node)
144
+ return;
145
+ const name = node.text;
146
+ if (declared.has(name) || params.has(name))
147
+ return;
148
+ free.add(name);
149
+ return;
150
+ }
151
+ ts.forEachChild(node, visit);
152
+ };
153
+ ts.forEachChild(block, visit);
154
+ return free;
155
+ }
156
+ /** True when `target` is itself a bare identifier (not a member/index). A bare
157
+ * identifier write rebinds the variable; a member/index write mutates an
158
+ * object the closure captured. Both are accepted under mutation-v1. */
159
+ function isBareIdentifierTarget(target) {
160
+ return ts.isIdentifier(target);
161
+ }
162
+ /** The assignment operators the mutation-v1 gate accepts (mirrored by the
163
+ * Python lowerer, which emits the same compound operator directly). Anything
164
+ * else (`&=`, `|=`, `^=`, `<<=`, `>>=`, `>>>=`, `**=`, `&&=`, `||=`, `??=`)
165
+ * rejects with `closure-unsupported-operator`. The lowerer SHARES this set so
166
+ * the gate and the emitter never drift. */
167
+ export const CLOSURE_ASSIGN_OPERATORS = new Set([
168
+ ts.SyntaxKind.EqualsToken,
169
+ ts.SyntaxKind.PlusEqualsToken,
170
+ ts.SyntaxKind.MinusEqualsToken,
171
+ ts.SyntaxKind.AsteriskEqualsToken,
172
+ ts.SyntaxKind.SlashEqualsToken,
173
+ ts.SyntaxKind.PercentEqualsToken,
174
+ ]);
175
+ /** Classify an assignment/update TARGET inside a closure block. Returns `null`
176
+ * when the target SHAPE is accepted (bare identifier — local or free; or a
177
+ * non-`this` member/index write), or a precise reject reason otherwise.
178
+ *
179
+ * The gate is a shape classifier and cannot distinguish a free capture from a
180
+ * closure param (params are stripped before the block is parsed). Both bare
181
+ * cases accept here; `nonlocal`-vs-pinned-vs-local is the Python emitter's
182
+ * decision (see the header doc + `emitBlockClosurePy`). */
183
+ function classifyAssignTarget(target) {
184
+ if (isBareIdentifierTarget(target)) {
185
+ // Bare identifier — local OR free, both accepted. The lowerer/emitter
186
+ // decide whether a `nonlocal` declaration is needed.
187
+ return null;
188
+ }
189
+ if (ts.isPropertyAccessExpression(target) || ts.isElementAccessExpression(target)) {
190
+ // A `this`-rooted target (`this.x = …`) is first and foremost a `this`
191
+ // usage — surface the more precise reason the rest of the gate uses.
192
+ let current = target;
193
+ while (ts.isPropertyAccessExpression(current) || ts.isElementAccessExpression(current)) {
194
+ current = current.expression;
195
+ }
196
+ if (current.kind === ts.SyntaxKind.ThisKeyword)
197
+ return 'closure-this';
198
+ // Member/index write on a non-`this` base — by-reference mutation, accepted.
199
+ return null;
200
+ }
201
+ // Destructuring (`({a} = x)`, `[a] = x`) or parenthesized (`(a) = x`) target —
202
+ // could smuggle a free write past the bare-identifier check. Fail closed.
203
+ return 'closure-unsupported-assign-target';
204
+ }
205
+ /** Walk the whole block rejecting any v1-unsupported construct. Returns a
206
+ * distinct reject reason string, or `null` if no unsupported construct is
207
+ * found. Statement-level shape (only let/const/return/expr/if accepted) is
208
+ * checked separately by `classifyStatementShape`. */
209
+ function findUnsupportedConstruct(block) {
210
+ let reason = null;
211
+ const visit = (node) => {
212
+ if (reason !== null)
213
+ return;
214
+ // Nested functions of any kind — closures cannot nest in v1.
215
+ if (ts.isArrowFunction(node) || ts.isFunctionExpression(node) || ts.isFunctionDeclaration(node)) {
216
+ reason = 'closure-nested-function';
217
+ return;
218
+ }
219
+ if (ts.isClassDeclaration(node) || ts.isClassExpression(node)) {
220
+ reason = 'closure-class';
221
+ return;
222
+ }
223
+ if (node.kind === ts.SyntaxKind.ThisKeyword) {
224
+ reason = 'closure-this';
225
+ return;
226
+ }
227
+ if (ts.isYieldExpression(node)) {
228
+ reason = 'closure-yield';
229
+ return;
230
+ }
231
+ if (ts.isAwaitExpression(node)) {
232
+ reason = 'closure-await';
233
+ return;
234
+ }
235
+ if (ts.isSpreadElement(node) || ts.isSpreadAssignment(node)) {
236
+ reason = 'closure-spread';
237
+ return;
238
+ }
239
+ // Any loop.
240
+ if (ts.isForStatement(node) ||
241
+ ts.isForOfStatement(node) ||
242
+ ts.isForInStatement(node) ||
243
+ ts.isWhileStatement(node) ||
244
+ ts.isDoStatement(node)) {
245
+ reason = 'closure-loop';
246
+ return;
247
+ }
248
+ if (ts.isThrowStatement(node)) {
249
+ reason = 'closure-throw';
250
+ return;
251
+ }
252
+ if (ts.isTryStatement(node)) {
253
+ reason = 'closure-try';
254
+ return;
255
+ }
256
+ if (ts.isSwitchStatement(node)) {
257
+ reason = 'closure-switch';
258
+ return;
259
+ }
260
+ if (ts.isBreakStatement(node) || ts.isContinueStatement(node)) {
261
+ reason = 'closure-break-continue';
262
+ return;
263
+ }
264
+ if (ts.isLabeledStatement(node)) {
265
+ reason = 'closure-labeled';
266
+ return;
267
+ }
268
+ if (ts.isWithStatement(node)) {
269
+ reason = 'closure-with';
270
+ return;
271
+ }
272
+ // `var` declarations.
273
+ if (ts.isVariableStatement(node)) {
274
+ const flags = node.declarationList.flags;
275
+ if ((flags & ts.NodeFlags.Let) === 0 && (flags & ts.NodeFlags.Const) === 0) {
276
+ reason = 'closure-var';
277
+ return;
278
+ }
279
+ for (const decl of node.declarationList.declarations) {
280
+ if (!ts.isIdentifier(decl.name)) {
281
+ reason = 'closure-destructure';
282
+ return;
283
+ }
284
+ if (!decl.initializer) {
285
+ reason = 'closure-uninitialized-decl';
286
+ return;
287
+ }
288
+ }
289
+ }
290
+ // Parameter default values (params live on the closure itself, but the
291
+ // gate is also called on nested constructs defensively; closures with
292
+ // their own params are the only legal owner and have no defaults in v1).
293
+ if (ts.isParameter(node) && node.initializer) {
294
+ reason = 'closure-param-default';
295
+ return;
296
+ }
297
+ // ASSIGNMENT EXPRESSIONS — mutation v1 lowers them structurally (the
298
+ // Python lowerer emits assignment STATEMENTS from this AST; the TS target
299
+ // re-emits the raw block verbatim). The gate validates only the TARGET
300
+ // SHAPE and the OPERATOR:
301
+ // - bare identifier (local or free): accepted (the emitter decides
302
+ // pinned-vs-`nonlocal`-vs-local). `acc.push(x)` is a CALL on a captured
303
+ // object — also accepted, the original v1 mutation story.
304
+ // - member/index target on a non-`this` base (`acc.x = 1`, `acc[i] = v`):
305
+ // accepted — by-reference mutation, no `nonlocal`.
306
+ // - `this`-rooted target (`this.x = …`): 'closure-this'.
307
+ // - destructuring (`({a} = obj)`) / parenthesized (`(x) = 1`) target:
308
+ // 'closure-unsupported-assign-target' (could smuggle a free write past
309
+ // the bare-identifier check — fail closed).
310
+ // - assignment operator outside {=,+=,-=,*=,/=,%=}: 'closure-unsupported-
311
+ // operator'.
312
+ if (ts.isBinaryExpression(node)) {
313
+ const op = node.operatorToken.kind;
314
+ if (op >= ts.SyntaxKind.FirstAssignment && op <= ts.SyntaxKind.LastAssignment) {
315
+ // STATEMENT position only — mirror the ++/-- guard (agon review,
316
+ // claude 0.85): a value-position assignment (`arr.push(x = 5)`,
317
+ // `const y = (x = 5)`, `return (x = 5)`, chained `x = (y = 2)`)
318
+ // passes shape checks but the lowerer can only emit an assignment
319
+ // that is the direct expression of an ExpressionStatement — anything
320
+ // else routes through the expression callback, which has no
321
+ // assignment grammar. Reject here so eligible ≡ lowerable holds.
322
+ // Paren-wrapped statement assignments (`({ a } = x);` — JS REQUIRES
323
+ // the parens there) count as statement position: walk up through
324
+ // parens so the precise TARGET reason (e.g. destructuring) survives.
325
+ let posParent = node.parent;
326
+ while (posParent && ts.isParenthesizedExpression(posParent))
327
+ posParent = posParent.parent;
328
+ if (!posParent || !ts.isExpressionStatement(posParent)) {
329
+ reason = 'closure-assign-value-position';
330
+ return;
331
+ }
332
+ if (!CLOSURE_ASSIGN_OPERATORS.has(op)) {
333
+ reason = 'closure-unsupported-operator';
334
+ return;
335
+ }
336
+ const targetReason = classifyAssignTarget(node.left);
337
+ if (targetReason !== null) {
338
+ reason = targetReason;
339
+ return;
340
+ }
341
+ // Accepted assignment — keep walking its subexpressions (the RHS may
342
+ // contain an unsupported construct, e.g. a nested arrow or `this`).
343
+ ts.forEachChild(node, visit);
344
+ return;
345
+ }
346
+ }
347
+ if (ts.isPostfixUnaryExpression(node) || ts.isPrefixUnaryExpression(node)) {
348
+ const op = node.operator;
349
+ if (op === ts.SyntaxKind.PlusPlusToken || op === ts.SyntaxKind.MinusMinusToken) {
350
+ // `++`/`--` is only a statement-position mutation when its IMMEDIATE
351
+ // parent is an ExpressionStatement (`x++;`). In any other position
352
+ // (`arr.push(x++)`, `f(--x)`, `a = x++`) it is a value-producing
353
+ // sub-expression v1 does not lower — reject with the actionable reason.
354
+ if (!node.parent || !ts.isExpressionStatement(node.parent)) {
355
+ reason = 'closure-incdec-value-position';
356
+ return;
357
+ }
358
+ const targetReason = classifyAssignTarget(node.operand);
359
+ if (targetReason !== null) {
360
+ reason = targetReason;
361
+ return;
362
+ }
363
+ ts.forEachChild(node, visit);
364
+ return;
365
+ }
366
+ }
367
+ ts.forEachChild(node, visit);
368
+ };
369
+ ts.forEachChild(block, visit);
370
+ return reason;
371
+ }
372
+ /** True when `stmt` is one of the v1-accepted statement shapes (let/const with
373
+ * identifier names + initializers, return, expression statement, if/else).
374
+ * Branch bodies may be blocks or single statements; this recurses into them. */
375
+ function isAcceptedStatementShape(stmt) {
376
+ if (ts.isVariableStatement(stmt)) {
377
+ const flags = stmt.declarationList.flags;
378
+ if ((flags & ts.NodeFlags.Let) === 0 && (flags & ts.NodeFlags.Const) === 0)
379
+ return false;
380
+ for (const decl of stmt.declarationList.declarations) {
381
+ if (!ts.isIdentifier(decl.name) || !decl.initializer)
382
+ return false;
383
+ }
384
+ return true;
385
+ }
386
+ if (ts.isReturnStatement(stmt))
387
+ return true;
388
+ if (ts.isExpressionStatement(stmt))
389
+ return true;
390
+ if (ts.isIfStatement(stmt)) {
391
+ if (!isAcceptedBranch(stmt.thenStatement))
392
+ return false;
393
+ if (stmt.elseStatement && !isAcceptedBranch(stmt.elseStatement))
394
+ return false;
395
+ return true;
396
+ }
397
+ return false;
398
+ }
399
+ function isAcceptedBranch(node) {
400
+ if (ts.isBlock(node))
401
+ return node.statements.every(isAcceptedStatementShape);
402
+ return isAcceptedStatementShape(node);
403
+ }
404
+ /** Classify a closure block body. Returns `null` if the body is supported by
405
+ * the v1 gate, or a distinct reject-reason string otherwise.
406
+ *
407
+ * ACCEPT set: `let`/`const` (identifier names + initializers, no
408
+ * destructuring), `return` (with or without expression), expression
409
+ * statements, `if`/`else` (block or single-statement branches, nesting fine).
410
+ * Statement-position MUTATIONS are now accepted: assignments to a bare
411
+ * identifier (local OR free) and to a non-`this` member/index target, with the
412
+ * operators {=,+=,-=,*=,/=,%=}, plus statement-position `++`/`--`.
413
+ *
414
+ * REJECT (whole-block walk): `this` (incl. a `this`-rooted assign target →
415
+ * `closure-this`), nested arrow/function/class, `yield`, `await`, any loop,
416
+ * `throw`, `try`, `switch`, `break`/`continue`, `var`, parameter default
417
+ * values, spread, labeled statements, `with`; a destructuring/parenthesized
418
+ * assign target (`closure-unsupported-assign-target`); an assignment operator
419
+ * outside the accepted set (`closure-unsupported-operator`); and a
420
+ * value-position `++`/`--` (`closure-incdec-value-position`). Member/index
421
+ * mutation and method calls on a captured object (`acc.push(x)`) are allowed.
422
+ * Any statement outside the accept set rejects. NOTE: a free write to a
423
+ * PINNED per-iteration loop capture passes the gate but is rejected LOUDLY at
424
+ * Python emission (`closure-pinned-write`) — the single-statement gate cannot
425
+ * see the enclosing loop header (eligibility≢lowerability, by design). */
426
+ export function classifyClosureBlock(raw) {
427
+ const block = parseClosureBlockAst(raw);
428
+ if (block === null)
429
+ return 'closure-parse-error';
430
+ // Whole-block walk for unsupported constructs (this/await/loops/…).
431
+ const constructReason = findUnsupportedConstruct(block);
432
+ if (constructReason !== null)
433
+ return constructReason;
434
+ // Statement-level shape: every top-level (and nested if/else branch)
435
+ // statement must be in the accept set.
436
+ for (const stmt of block.statements) {
437
+ if (!isAcceptedStatementShape(stmt)) {
438
+ return `closure-unsupported-stmt-${ts.SyntaxKind[stmt.kind]}`;
439
+ }
440
+ }
441
+ return null;
442
+ }
443
+ //# sourceMappingURL=closure-eligibility.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"closure-eligibility.js","sourceRoot":"","sources":["../src/closure-eligibility.ts"],"names":[],"mappings":"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"}