@kernlang/core 3.3.8 → 3.4.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/dist/capability-matrix.d.ts +15 -0
- package/dist/capability-matrix.js +245 -0
- package/dist/capability-matrix.js.map +1 -0
- package/dist/codegen/data-layer.d.ts +1 -1
- package/dist/codegen/data-layer.js +59 -23
- package/dist/codegen/data-layer.js.map +1 -1
- package/dist/codegen/emitters.d.ts +8 -0
- package/dist/codegen/emitters.js +10 -0
- package/dist/codegen/emitters.js.map +1 -1
- package/dist/codegen/events.js +1 -1
- package/dist/codegen/events.js.map +1 -1
- package/dist/codegen/functions.js +29 -5
- package/dist/codegen/functions.js.map +1 -1
- package/dist/codegen/ground-layer.d.ts +1 -0
- package/dist/codegen/ground-layer.js +88 -10
- package/dist/codegen/ground-layer.js.map +1 -1
- package/dist/codegen/helpers.d.ts +3 -1
- package/dist/codegen/helpers.js +5 -1
- package/dist/codegen/helpers.js.map +1 -1
- package/dist/codegen/machines.js +4 -3
- package/dist/codegen/machines.js.map +1 -1
- package/dist/codegen/modules.d.ts +1 -0
- package/dist/codegen/modules.js +52 -1
- package/dist/codegen/modules.js.map +1 -1
- package/dist/codegen/screens.js +77 -13
- package/dist/codegen/screens.js.map +1 -1
- package/dist/codegen/stdlib-preamble.d.ts +39 -0
- package/dist/codegen/stdlib-preamble.js +213 -0
- package/dist/codegen/stdlib-preamble.js.map +1 -0
- package/dist/codegen/type-system.d.ts +113 -1
- package/dist/codegen/type-system.js +389 -30
- package/dist/codegen/type-system.js.map +1 -1
- package/dist/codegen-core.d.ts +3 -3
- package/dist/codegen-core.js +79 -16
- package/dist/codegen-core.js.map +1 -1
- package/dist/codegen-expression.d.ts +3 -0
- package/dist/codegen-expression.js +93 -0
- package/dist/codegen-expression.js.map +1 -0
- package/dist/concepts.d.ts +96 -0
- package/dist/concepts.js.map +1 -1
- package/dist/config.d.ts +19 -0
- package/dist/config.js +15 -0
- package/dist/config.js.map +1 -1
- package/dist/decompiler.js +356 -4
- package/dist/decompiler.js.map +1 -1
- package/dist/importer.d.ts +1 -0
- package/dist/importer.js +574 -34
- package/dist/importer.js.map +1 -1
- package/dist/index.d.ts +6 -3
- package/dist/index.js +9 -3
- package/dist/index.js.map +1 -1
- package/dist/node-props.d.ts +188 -1
- package/dist/node-props.js.map +1 -1
- package/dist/parser-core.js +30 -5
- package/dist/parser-core.js.map +1 -1
- package/dist/parser-diagnostics.js +5 -0
- package/dist/parser-diagnostics.js.map +1 -1
- package/dist/parser-expression.d.ts +17 -0
- package/dist/parser-expression.js +498 -0
- package/dist/parser-expression.js.map +1 -0
- package/dist/parser-tokenizer.d.ts +5 -3
- package/dist/parser-tokenizer.js +97 -16
- package/dist/parser-tokenizer.js.map +1 -1
- package/dist/parser-validate-effects.d.ts +21 -0
- package/dist/parser-validate-effects.js +188 -0
- package/dist/parser-validate-effects.js.map +1 -0
- package/dist/parser-validate-expressions.d.ts +6 -0
- package/dist/parser-validate-expressions.js +41 -0
- package/dist/parser-validate-expressions.js.map +1 -0
- package/dist/parser-validate-union-kind.d.ts +24 -0
- package/dist/parser-validate-union-kind.js +97 -0
- package/dist/parser-validate-union-kind.js.map +1 -0
- package/dist/scanner.js +12 -9
- package/dist/scanner.js.map +1 -1
- package/dist/schema.d.ts +1 -1
- package/dist/schema.js +403 -37
- package/dist/schema.js.map +1 -1
- package/dist/semantic-validator.js +73 -8
- package/dist/semantic-validator.js.map +1 -1
- package/dist/spec.d.ts +5 -2
- package/dist/spec.js +27 -2
- package/dist/spec.js.map +1 -1
- package/dist/types.d.ts +7 -1
- package/dist/types.js +7 -1
- package/dist/types.js.map +1 -1
- package/dist/value-ir.d.ts +69 -0
- package/dist/value-ir.js +20 -0
- package/dist/value-ir.js.map +1 -0
- package/package.json +13 -1
package/dist/parser-tokenizer.js
CHANGED
|
@@ -9,8 +9,87 @@ function isIdentChar(ch) {
|
|
|
9
9
|
function isDigit(ch) {
|
|
10
10
|
return ch >= '0' && ch <= '9';
|
|
11
11
|
}
|
|
12
|
-
|
|
13
|
-
|
|
12
|
+
function isHexDigit(ch) {
|
|
13
|
+
return isDigit(ch) || (ch >= 'a' && ch <= 'f') || (ch >= 'A' && ch <= 'F');
|
|
14
|
+
}
|
|
15
|
+
function isBinDigit(ch) {
|
|
16
|
+
return ch === '0' || ch === '1';
|
|
17
|
+
}
|
|
18
|
+
function isOctDigit(ch) {
|
|
19
|
+
return ch >= '0' && ch <= '7';
|
|
20
|
+
}
|
|
21
|
+
/** Consume digits with optional underscore separators. Underscores cannot lead, trail, or repeat. */
|
|
22
|
+
function consumeDigitsWithSep(line, start, isValid) {
|
|
23
|
+
let i = start;
|
|
24
|
+
let started = false;
|
|
25
|
+
let lastWasUnderscore = false;
|
|
26
|
+
while (i < line.length) {
|
|
27
|
+
const c = line[i];
|
|
28
|
+
if (isValid(c)) {
|
|
29
|
+
lastWasUnderscore = false;
|
|
30
|
+
started = true;
|
|
31
|
+
i++;
|
|
32
|
+
}
|
|
33
|
+
else if (c === '_' && started && !lastWasUnderscore && i + 1 < line.length && isValid(line[i + 1])) {
|
|
34
|
+
lastWasUnderscore = true;
|
|
35
|
+
i++;
|
|
36
|
+
}
|
|
37
|
+
else {
|
|
38
|
+
break;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
return i;
|
|
42
|
+
}
|
|
43
|
+
/** Try to consume a numeric literal. Returns end position, or null if not a number. */
|
|
44
|
+
function tryConsumeNumber(line, start, state) {
|
|
45
|
+
let i = start;
|
|
46
|
+
const ch = line[i];
|
|
47
|
+
if (ch === '0' && i + 1 < line.length) {
|
|
48
|
+
const next = line[i + 1];
|
|
49
|
+
let validator = null;
|
|
50
|
+
if (next === 'x' || next === 'X')
|
|
51
|
+
validator = isHexDigit;
|
|
52
|
+
else if (next === 'b' || next === 'B')
|
|
53
|
+
validator = isBinDigit;
|
|
54
|
+
else if (next === 'o' || next === 'O')
|
|
55
|
+
validator = isOctDigit;
|
|
56
|
+
if (validator) {
|
|
57
|
+
const after = consumeDigitsWithSep(line, i + 2, validator);
|
|
58
|
+
if (after === i + 2)
|
|
59
|
+
return null;
|
|
60
|
+
i = after;
|
|
61
|
+
if (i < line.length && line[i] === 'n')
|
|
62
|
+
i++;
|
|
63
|
+
return i;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
const hasIntPart = isDigit(ch);
|
|
67
|
+
let j = hasIntPart ? consumeDigitsWithSep(line, i, isDigit) : i;
|
|
68
|
+
let hasFracPart = false;
|
|
69
|
+
if (j < line.length && line[j] === '.' && j + 1 < line.length && isDigit(line[j + 1])) {
|
|
70
|
+
j++;
|
|
71
|
+
j = consumeDigitsWithSep(line, j, isDigit);
|
|
72
|
+
hasFracPart = true;
|
|
73
|
+
}
|
|
74
|
+
if (!hasIntPart && !hasFracPart)
|
|
75
|
+
return null;
|
|
76
|
+
if (!hasFracPart && j < line.length && line[j] === 'n') {
|
|
77
|
+
j++;
|
|
78
|
+
}
|
|
79
|
+
else if (hasFracPart && j < line.length && line[j] === 'n') {
|
|
80
|
+
if (state) {
|
|
81
|
+
emitDiagnostic(state, 'INVALID_BIGINT', 'error', 'BigInt literal cannot have a fractional part', 0, start + 1);
|
|
82
|
+
}
|
|
83
|
+
j++;
|
|
84
|
+
}
|
|
85
|
+
return j > start ? j : null;
|
|
86
|
+
}
|
|
87
|
+
/** @internal Character-by-character tokenizer for a single KERN line (after indent stripped).
|
|
88
|
+
* `mode` selects the lex contract; only 'line' is implemented today. */
|
|
89
|
+
export function tokenizeLineInternal(line, state, mode = 'line') {
|
|
90
|
+
if (mode !== 'line') {
|
|
91
|
+
throw new Error(`Lex mode '${mode}' not yet implemented`);
|
|
92
|
+
}
|
|
14
93
|
const tokens = [];
|
|
15
94
|
let i = 0;
|
|
16
95
|
while (i < line.length) {
|
|
@@ -84,16 +163,17 @@ export function tokenizeLineInternal(line, state) {
|
|
|
84
163
|
i = j;
|
|
85
164
|
continue;
|
|
86
165
|
}
|
|
87
|
-
// Quoted string "..." with \" escape support
|
|
88
|
-
if (ch === '"') {
|
|
166
|
+
// Quoted string "..." or '...' with \" / \' / \\ escape support
|
|
167
|
+
if (ch === '"' || ch === "'") {
|
|
168
|
+
const quote = ch;
|
|
89
169
|
const start = i;
|
|
90
170
|
i++;
|
|
91
171
|
let inner = '';
|
|
92
|
-
while (i < line.length && line[i] !==
|
|
172
|
+
while (i < line.length && line[i] !== quote) {
|
|
93
173
|
if (line[i] === '\\' && i + 1 < line.length) {
|
|
94
174
|
const next = line[i + 1];
|
|
95
|
-
if (next ===
|
|
96
|
-
inner +=
|
|
175
|
+
if (next === quote) {
|
|
176
|
+
inner += quote;
|
|
97
177
|
i += 2;
|
|
98
178
|
}
|
|
99
179
|
else if (next === '\\') {
|
|
@@ -150,13 +230,14 @@ export function tokenizeLineInternal(line, state) {
|
|
|
150
230
|
tokens.push({ kind: 'slash', value: line.slice(start, i), pos: start });
|
|
151
231
|
continue;
|
|
152
232
|
}
|
|
153
|
-
// Number (
|
|
154
|
-
if (isDigit(ch)) {
|
|
155
|
-
const
|
|
156
|
-
|
|
157
|
-
i
|
|
158
|
-
|
|
159
|
-
|
|
233
|
+
// Number — int, float, hex (0x), binary (0b), octal (0o), with optional _ separators and bigint suffix (n)
|
|
234
|
+
if (isDigit(ch) || (ch === '.' && i + 1 < line.length && isDigit(line[i + 1]))) {
|
|
235
|
+
const end = tryConsumeNumber(line, i, state);
|
|
236
|
+
if (end !== null) {
|
|
237
|
+
tokens.push({ kind: 'number', value: line.slice(i, end), pos: i });
|
|
238
|
+
i = end;
|
|
239
|
+
continue;
|
|
240
|
+
}
|
|
160
241
|
}
|
|
161
242
|
// Identifier: [A-Za-z_][A-Za-z0-9_-]*
|
|
162
243
|
// Handles evolved: prefix (evolved:keyword → strips prefix, returns keyword)
|
|
@@ -182,7 +263,7 @@ export function tokenizeLineInternal(line, state) {
|
|
|
182
263
|
}
|
|
183
264
|
return tokens;
|
|
184
265
|
}
|
|
185
|
-
export function tokenizeLine(line) {
|
|
186
|
-
return tokenizeLineInternal(line);
|
|
266
|
+
export function tokenizeLine(line, mode = 'line') {
|
|
267
|
+
return tokenizeLineInternal(line, undefined, mode);
|
|
187
268
|
}
|
|
188
269
|
//# sourceMappingURL=parser-tokenizer.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"parser-tokenizer.js","sourceRoot":"","sources":["../src/parser-tokenizer.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAuBzD,4EAA4E;AAE5E,SAAS,YAAY,CAAC,EAAU;IAC9B,OAAO,CAAC,EAAE,IAAI,GAAG,IAAI,EAAE,IAAI,GAAG,CAAC,IAAI,CAAC,EAAE,IAAI,GAAG,IAAI,EAAE,IAAI,GAAG,CAAC,IAAI,EAAE,KAAK,GAAG,CAAC;AAC5E,CAAC;AAED,SAAS,WAAW,CAAC,EAAU;IAC7B,OAAO,YAAY,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,IAAI,GAAG,IAAI,EAAE,IAAI,GAAG,CAAC,IAAI,EAAE,KAAK,GAAG,CAAC;AACpE,CAAC;AAED,SAAS,OAAO,CAAC,EAAU;IACzB,OAAO,EAAE,IAAI,GAAG,IAAI,EAAE,IAAI,GAAG,CAAC;AAChC,CAAC;AAED,iGAAiG;AACjG,MAAM,UAAU,oBAAoB,CAAC,IAAY,EAAE,KAAkB;IACnE,MAAM,MAAM,GAAY,EAAE,CAAC;IAC3B,IAAI,CAAC,GAAG,CAAC,CAAC;IAEV,OAAO,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;QACvB,MAAM,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QAEnB,aAAa;QACb,IAAI,EAAE,KAAK,GAAG,IAAI,EAAE,KAAK,IAAI,EAAE,CAAC;YAC9B,MAAM,KAAK,GAAG,CAAC,CAAC;YAChB,OAAO,CAAC,GAAG,IAAI,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,GAAG,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC;gBAAE,CAAC,EAAE,CAAC;YACrE,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC,CAAC;YAC7E,SAAS;QACX,CAAC;QAED,6BAA6B;QAC7B,IAAI,EAAE,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,GAAG,EAAE,CAAC;YAC7D,MAAM,KAAK,GAAG,CAAC,CAAC;YAChB,CAAC,IAAI,CAAC,CAAC;YACP,IAAI,KAAK,GAAG,CAAC,CAAC;YACd,OAAO,CAAC,GAAG,IAAI,CAAC,MAAM,GAAG,CAAC,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;gBACxC,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,GAAG,IAAI,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,GAAG,EAAE,CAAC;oBAC3C,KAAK,EAAE,CAAC;oBACR,CAAC,IAAI,CAAC,CAAC;gBACT,CAAC;qBAAM,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,GAAG,IAAI,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,GAAG,EAAE,CAAC;oBAClD,KAAK,EAAE,CAAC;oBACR,IAAI,KAAK,KAAK,CAAC;wBAAE,MAAM;oBACvB,CAAC,IAAI,CAAC,CAAC;gBACT,CAAC;;oBAAM,CAAC,EAAE,CAAC;YACb,CAAC;YACD,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;gBACd,IAAI,KAAK,EAAE,CAAC;oBACV,cAAc,CACZ,KAAK,EACL,eAAe,EACf,OAAO,EACP,4CAA4C,KAAK,GAAG,CAAC,EAAE,EACvD,CAAC,EACD,KAAK,GAAG,CAAC,EACT,EAAE,MAAM,EAAE,KAAK,GAAG,CAAC,EAAE,CACtB,CAAC;gBACJ,CAAC;YACH,CAAC;YACD,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;YAC9C,IAAI,CAAC,GAAG,IAAI,CAAC,MAAM,GAAG,CAAC;gBAAE,CAAC,IAAI,CAAC,CAAC;;gBAC3B,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC;YACrB,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC,CAAC;YACxD,SAAS;QACX,CAAC;QAED,0DAA0D;QAC1D,IAAI,EAAE,KAAK,GAAG,EAAE,CAAC;YACf,MAAM,KAAK,GAAG,CAAC,CAAC;YAChB,IAAI,OAAO,GAAG,KAAK,CAAC;YACpB,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YACd,IAAI,MAAM,GAAG,KAAK,CAAC;YACnB,OAAO,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;gBACvB,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,IAAI,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;oBAC5C,CAAC,IAAI,CAAC,CAAC;oBACP,SAAS;gBACX,CAAC;gBACD,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,GAAG;oBAAE,OAAO,GAAG,CAAC,OAAO,CAAC;gBACxC,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,GAAG,EAAE,CAAC;oBAChC,CAAC,EAAE,CAAC;oBACJ,MAAM,GAAG,IAAI,CAAC;oBACd,MAAM;gBACR,CAAC;gBACD,CAAC,EAAE,CAAC;YACN,CAAC;YACD,IAAI,CAAC,MAAM,EAAE,CAAC;gBACZ,IAAI,KAAK,EAAE,CAAC;oBACV,cAAc,CACZ,KAAK,EACL,gBAAgB,EAChB,OAAO,EACP,sCAAsC,KAAK,GAAG,CAAC,EAAE,EACjD,CAAC,EACD,KAAK,GAAG,CAAC,EACT,EAAE,MAAM,EAAE,KAAK,GAAG,CAAC,EAAE,CACtB,CAAC;gBACJ,CAAC;YACH,CAAC;YACD,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC,CAAC;YAC7F,CAAC,GAAG,CAAC,CAAC;YACN,SAAS;QACX,CAAC;QAED,6CAA6C;QAC7C,IAAI,EAAE,KAAK,GAAG,EAAE,CAAC;YACf,MAAM,KAAK,GAAG,CAAC,CAAC;YAChB,CAAC,EAAE,CAAC;YACJ,IAAI,KAAK,GAAG,EAAE,CAAC;YACf,OAAO,CAAC,GAAG,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,GAAG,EAAE,CAAC;gBAC1C,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,IAAI,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;oBAC5C,MAAM,IAAI,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;oBACzB,IAAI,IAAI,KAAK,GAAG,EAAE,CAAC;wBACjB,KAAK,IAAI,GAAG,CAAC;wBACb,CAAC,IAAI,CAAC,CAAC;oBACT,CAAC;yBAAM,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;wBACzB,KAAK,IAAI,IAAI,CAAC;wBACd,CAAC,IAAI,CAAC,CAAC;oBACT,CAAC;yBAAM,CAAC;wBACN,KAAK,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC;wBACjB,CAAC,EAAE,CAAC;oBACN,CAAC;gBACH,CAAC;qBAAM,CAAC;oBACN,KAAK,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC;oBACjB,CAAC,EAAE,CAAC;gBACN,CAAC;YACH,CAAC;YACD,IAAI,CAAC,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;gBACrB,IAAI,KAAK,EAAE,CAAC;oBACV,cAAc,CACZ,KAAK,EACL,iBAAiB,EACjB,OAAO,EACP,oCAAoC,KAAK,GAAG,CAAC,EAAE,EAC/C,CAAC,EACD,KAAK,GAAG,CAAC,EACT,EAAE,MAAM,EAAE,KAAK,GAAG,CAAC,EAAE,CACtB,CAAC;gBACJ,CAAC;YACH,CAAC;iBAAM,CAAC;gBACN,CAAC,EAAE,CAAC,CAAC,qBAAqB;YAC5B,CAAC;YACD,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC,CAAC;YAC1D,SAAS;QACX,CAAC;QAED,kBAAkB;QAClB,IAAI,EAAE,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,MAAM,IAAI,YAAY,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;YACnE,MAAM,KAAK,GAAG,CAAC,CAAC;YAChB,CAAC,EAAE,CAAC;YACJ,OAAO,CAAC,GAAG,IAAI,CAAC,MAAM,IAAI,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;gBAAE,CAAC,EAAE,CAAC;YACpD,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC,CAAC;YAC/E,SAAS;QACX,CAAC;QAED,SAAS;QACT,IAAI,EAAE,KAAK,GAAG,EAAE,CAAC;YACf,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC;YACpD,CAAC,EAAE,CAAC;YACJ,SAAS;QACX,CAAC;QAED,QAAQ;QACR,IAAI,EAAE,KAAK,GAAG,EAAE,CAAC;YACf,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC;YACnD,CAAC,EAAE,CAAC;YACJ,SAAS;QACX,CAAC;QAED,kCAAkC;QAClC,IAAI,EAAE,KAAK,GAAG,EAAE,CAAC;YACf,MAAM,KAAK,GAAG,CAAC,CAAC;YAChB,OAAO,CAAC,GAAG,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,GAAG,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,IAAI,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,GAAG,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,GAAG;gBAAE,CAAC,EAAE,CAAC;YACzG,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC,CAAC;YACxE,SAAS;QACX,CAAC;QAED,uBAAuB;QACvB,IAAI,OAAO,CAAC,EAAE,CAAC,EAAE,CAAC;YAChB,MAAM,KAAK,GAAG,CAAC,CAAC;YAChB,OAAO,CAAC,GAAG,IAAI,CAAC,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;gBAAE,CAAC,EAAE,CAAC;YAChD,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC,CAAC;YACzE,SAAS;QACX,CAAC;QAED,sCAAsC;QACtC,6EAA6E;QAC7E,IAAI,YAAY,CAAC,EAAE,CAAC,EAAE,CAAC;YACrB,MAAM,KAAK,GAAG,CAAC,CAAC;YAChB,OAAO,CAAC,GAAG,IAAI,CAAC,MAAM,IAAI,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;gBAAE,CAAC,EAAE,CAAC;YACpD,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC,KAAK,SAAS,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,MAAM,IAAI,YAAY,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC9G,CAAC,EAAE,CAAC;gBACJ,MAAM,SAAS,GAAG,CAAC,CAAC;gBACpB,OAAO,CAAC,GAAG,IAAI,CAAC,MAAM,IAAI,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;oBAAE,CAAC,EAAE,CAAC;gBACpD,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC,CAAC;YACnF,CAAC;iBAAM,CAAC;gBACN,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC,CAAC;YAC/E,CAAC;YACD,SAAS;QACX,CAAC;QAED,oBAAoB;QACpB,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,EAAE,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC;QACpD,CAAC,EAAE,CAAC;IACN,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,IAAY;IACvC,OAAO,oBAAoB,CAAC,IAAI,CAAC,CAAC;AACpC,CAAC"}
|
|
1
|
+
{"version":3,"file":"parser-tokenizer.js","sourceRoot":"","sources":["../src/parser-tokenizer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/** Slice 6 — `effects=pure` validator.
|
|
2
|
+
*
|
|
3
|
+
* Spec: docs/language/effects-pure-spec.md
|
|
4
|
+
*
|
|
5
|
+
* Walks every `fn` / `derive` / `memo` node with `effects=pure` and rejects:
|
|
6
|
+
* 1. `effects=...` on any other node type (allowed list is `fn|derive|memo`)
|
|
7
|
+
* 2. `effects=<not-pure>` (slice 6 only accepts the literal `pure`) —
|
|
8
|
+
* includes empty string and ExprObject `effects={{ ... }}` per spec.
|
|
9
|
+
* 3. `async=true` / `stream=true` combined with `effects=pure` (incompatible)
|
|
10
|
+
* 4. handler / cleanup / expr body containing any of the FORBIDDEN_PATTERNS,
|
|
11
|
+
* checked AFTER stripping comments and string literals to avoid false
|
|
12
|
+
* positives on commented-out code or string content.
|
|
13
|
+
*
|
|
14
|
+
* This is a static walker — same shape as the `batch=true` rejection in
|
|
15
|
+
* packages/terminal/src/transpiler-ink.ts. Limitations are documented in
|
|
16
|
+
* the spec doc and are intentional.
|
|
17
|
+
*
|
|
18
|
+
* Does NOT change codegen — bodies that pass the walker emit unchanged. */
|
|
19
|
+
import type { ParseState } from './parser-diagnostics.js';
|
|
20
|
+
import { type IRNode } from './types.js';
|
|
21
|
+
export declare function validateEffects(state: ParseState, root: IRNode): void;
|
|
@@ -0,0 +1,188 @@
|
|
|
1
|
+
/** Slice 6 — `effects=pure` validator.
|
|
2
|
+
*
|
|
3
|
+
* Spec: docs/language/effects-pure-spec.md
|
|
4
|
+
*
|
|
5
|
+
* Walks every `fn` / `derive` / `memo` node with `effects=pure` and rejects:
|
|
6
|
+
* 1. `effects=...` on any other node type (allowed list is `fn|derive|memo`)
|
|
7
|
+
* 2. `effects=<not-pure>` (slice 6 only accepts the literal `pure`) —
|
|
8
|
+
* includes empty string and ExprObject `effects={{ ... }}` per spec.
|
|
9
|
+
* 3. `async=true` / `stream=true` combined with `effects=pure` (incompatible)
|
|
10
|
+
* 4. handler / cleanup / expr body containing any of the FORBIDDEN_PATTERNS,
|
|
11
|
+
* checked AFTER stripping comments and string literals to avoid false
|
|
12
|
+
* positives on commented-out code or string content.
|
|
13
|
+
*
|
|
14
|
+
* This is a static walker — same shape as the `batch=true` rejection in
|
|
15
|
+
* packages/terminal/src/transpiler-ink.ts. Limitations are documented in
|
|
16
|
+
* the spec doc and are intentional.
|
|
17
|
+
*
|
|
18
|
+
* Does NOT change codegen — bodies that pass the walker emit unchanged. */
|
|
19
|
+
import { emitDiagnostic } from './parser-diagnostics.js';
|
|
20
|
+
import { isExprObject } from './types.js';
|
|
21
|
+
const ALLOWED_NODE_TYPES = new Set(['fn', 'derive', 'memo']);
|
|
22
|
+
/** Patterns rejected inside an `effects=pure` body.
|
|
23
|
+
*
|
|
24
|
+
* Each entry is a regex anchored on word boundaries / member-access
|
|
25
|
+
* punctuation. The walker reports the first match per pattern by name. */
|
|
26
|
+
const FORBIDDEN_PATTERNS = [
|
|
27
|
+
// ── I/O — Web ─────────────────────────────────────────────────────
|
|
28
|
+
{ name: 'fetch(', pattern: /\bfetch\s*\(/ },
|
|
29
|
+
{ name: 'XMLHttpRequest', pattern: /\bXMLHttpRequest\b/ },
|
|
30
|
+
{ name: 'console.', pattern: /\bconsole\s*\./ },
|
|
31
|
+
{ name: 'process.', pattern: /\bprocess\s*\./ },
|
|
32
|
+
// ── I/O — Filesystem ──────────────────────────────────────────────
|
|
33
|
+
{ name: 'readFileSync', pattern: /\breadFileSync\b/ },
|
|
34
|
+
{ name: 'writeFileSync', pattern: /\bwriteFileSync\b/ },
|
|
35
|
+
{ name: 'readFile(', pattern: /\breadFile\s*\(/ },
|
|
36
|
+
{ name: 'writeFile(', pattern: /\bwriteFile\s*\(/ },
|
|
37
|
+
{ name: 'fs.', pattern: /\bfs\s*\./ },
|
|
38
|
+
// ── I/O — Browser storage ────────────────────────────────────────
|
|
39
|
+
{ name: 'localStorage', pattern: /\blocalStorage\b/ },
|
|
40
|
+
{ name: 'sessionStorage', pattern: /\bsessionStorage\b/ },
|
|
41
|
+
{ name: 'indexedDB', pattern: /\bindexedDB\b/ },
|
|
42
|
+
{ name: 'document.', pattern: /\bdocument\s*\./ },
|
|
43
|
+
{ name: 'window.', pattern: /\bwindow\s*\./ },
|
|
44
|
+
// ── I/O — Named HTTP clients (Codex review fix) ──────────────────
|
|
45
|
+
// Spec lists axios/got/ky/undici explicitly — without these patterns
|
|
46
|
+
// the validator silently accepted `axios.get(...)` etc. as pure.
|
|
47
|
+
{ name: 'axios.', pattern: /\baxios\s*[.(]/ },
|
|
48
|
+
{ name: 'got(', pattern: /\bgot\s*\(/ },
|
|
49
|
+
{ name: 'ky.', pattern: /\bky\s*[.(]/ },
|
|
50
|
+
{ name: 'undici.', pattern: /\bundici\s*\./ },
|
|
51
|
+
{ name: 'http.', pattern: /\bhttps?\s*\./ },
|
|
52
|
+
// ── Time / randomness ───────────────────────────────────────────────
|
|
53
|
+
{ name: 'Math.random', pattern: /\bMath\.random\b/ },
|
|
54
|
+
{ name: 'Date.now', pattern: /\bDate\.now\b/ },
|
|
55
|
+
{ name: 'new Date()', pattern: /\bnew\s+Date\s*\(\s*\)/ },
|
|
56
|
+
{ name: 'crypto.randomUUID', pattern: /\bcrypto\.randomUUID\b/ },
|
|
57
|
+
{ name: 'crypto.getRandomValues', pattern: /\bcrypto\.getRandomValues\b/ },
|
|
58
|
+
{ name: 'performance.now', pattern: /\bperformance\.now\b/ },
|
|
59
|
+
// ── Async / scheduling ──────────────────────────────────────────────
|
|
60
|
+
{ name: 'await', pattern: /\bawait\b/ },
|
|
61
|
+
{ name: '.then(', pattern: /\.then\s*\(/ },
|
|
62
|
+
{ name: '.catch(', pattern: /\.catch\s*\(/ },
|
|
63
|
+
{ name: '.finally(', pattern: /\.finally\s*\(/ },
|
|
64
|
+
{ name: 'setTimeout(', pattern: /\bsetTimeout\s*\(/ },
|
|
65
|
+
{ name: 'setInterval(', pattern: /\bsetInterval\s*\(/ },
|
|
66
|
+
{ name: 'setImmediate(', pattern: /\bsetImmediate\s*\(/ },
|
|
67
|
+
{ name: 'queueMicrotask(', pattern: /\bqueueMicrotask\s*\(/ },
|
|
68
|
+
{ name: 'requestAnimationFrame(', pattern: /\brequestAnimationFrame\s*\(/ },
|
|
69
|
+
{ name: 'requestIdleCallback(', pattern: /\brequestIdleCallback\s*\(/ },
|
|
70
|
+
];
|
|
71
|
+
/** Strip JS comments and string literals before pattern matching.
|
|
72
|
+
*
|
|
73
|
+
* Gemini review fix: without this, a comment like `// don't call fetch()` or
|
|
74
|
+
* a string literal like `"console.log is forbidden"` would falsely match the
|
|
75
|
+
* forbidden patterns. We replace contents with empty quotes / spaces so
|
|
76
|
+
* positional source-map info would still survive (we don't emit that here,
|
|
77
|
+
* but the offset-preserving substitution is the careful default).
|
|
78
|
+
*
|
|
79
|
+
* Limitations: template literal interpolations (`${...}`) are stripped along
|
|
80
|
+
* with the rest of the template — a `fetch(...)` inside `${}` will not be
|
|
81
|
+
* detected. Pure code shouldn't be embedding effectful calls inside template
|
|
82
|
+
* literals; if it does, declare it impure. */
|
|
83
|
+
function stripCommentsAndStrings(code) {
|
|
84
|
+
return code
|
|
85
|
+
.replace(/\/\*[\s\S]*?\*\//g, (m) => ' '.repeat(m.length))
|
|
86
|
+
.replace(/\/\/[^\n]*/g, (m) => ' '.repeat(m.length))
|
|
87
|
+
.replace(/"(?:[^"\\\n]|\\.)*"/g, (m) => `"${' '.repeat(Math.max(0, m.length - 2))}"`)
|
|
88
|
+
.replace(/'(?:[^'\\\n]|\\.)*'/g, (m) => `'${' '.repeat(Math.max(0, m.length - 2))}'`)
|
|
89
|
+
.replace(/`(?:[^`\\]|\\.)*`/g, (m) => `\`${' '.repeat(Math.max(0, m.length - 2))}\``);
|
|
90
|
+
}
|
|
91
|
+
/** Extract the body code to scan for a node carrying `effects=pure`.
|
|
92
|
+
*
|
|
93
|
+
* - `fn` / `memo`: handler child's `code` prop, plus cleanup blocks (Codex
|
|
94
|
+
* review fix — cleanup emits into the function's `finally` and would
|
|
95
|
+
* otherwise let `cleanup <<< console.log(...) >>>` bypass the walker).
|
|
96
|
+
* - `derive`: `expr` prop value.
|
|
97
|
+
* - Compact `expr={{ ... }}` form on `fn` is also scanned. */
|
|
98
|
+
function extractExpr(value) {
|
|
99
|
+
if (typeof value === 'string')
|
|
100
|
+
return value;
|
|
101
|
+
if (isExprObject(value))
|
|
102
|
+
return value.code;
|
|
103
|
+
return null;
|
|
104
|
+
}
|
|
105
|
+
function extractBody(node) {
|
|
106
|
+
const props = node.props || {};
|
|
107
|
+
const parts = [];
|
|
108
|
+
if (node.type === 'derive' || node.type === 'fn') {
|
|
109
|
+
const expr = extractExpr(props.expr);
|
|
110
|
+
if (expr)
|
|
111
|
+
parts.push(expr);
|
|
112
|
+
}
|
|
113
|
+
// Code-bearing children: handler (always emitted into the body) and
|
|
114
|
+
// cleanup (emitted into the function's finally block on `fn`).
|
|
115
|
+
for (const child of node.children || []) {
|
|
116
|
+
if (child.type !== 'handler' && child.type !== 'cleanup')
|
|
117
|
+
continue;
|
|
118
|
+
const code = child.props?.code;
|
|
119
|
+
if (typeof code === 'string')
|
|
120
|
+
parts.push(code);
|
|
121
|
+
}
|
|
122
|
+
return parts.join('\n');
|
|
123
|
+
}
|
|
124
|
+
function describeEffectsValue(raw) {
|
|
125
|
+
if (typeof raw === 'string')
|
|
126
|
+
return raw === '' ? '<empty>' : raw;
|
|
127
|
+
if (isExprObject(raw))
|
|
128
|
+
return '<expression>';
|
|
129
|
+
return String(raw);
|
|
130
|
+
}
|
|
131
|
+
function validateNode(state, node) {
|
|
132
|
+
const props = node.props || {};
|
|
133
|
+
// Codex review fix: `effects` is "present" if the prop key exists at all,
|
|
134
|
+
// including empty string and ExprObject values. The earlier guard
|
|
135
|
+
// (`effects !== '' && typeof === 'string'`) silently dropped both, which
|
|
136
|
+
// contradicts the spec rule "anything other than `pure` errors".
|
|
137
|
+
const effectsRaw = props.effects;
|
|
138
|
+
const effectsPresent = effectsRaw !== undefined &&
|
|
139
|
+
(typeof effectsRaw === 'string' || isExprObject(effectsRaw) || typeof effectsRaw === 'boolean');
|
|
140
|
+
if (effectsPresent) {
|
|
141
|
+
// 1. Reject on disallowed node types — checked before value validity so
|
|
142
|
+
// that `effects=junk` on a `transition` still surfaces the right diagnostic.
|
|
143
|
+
if (!ALLOWED_NODE_TYPES.has(node.type)) {
|
|
144
|
+
emitDiagnostic(state, 'INVALID_EFFECTS', 'error', `\`effects=\` is only allowed on \`fn\`, \`derive\`, or \`memo\` (got \`${node.type}\`). See docs/language/effects-pure-spec.md.`, node.loc?.line ?? 0, node.loc?.col ?? 0);
|
|
145
|
+
}
|
|
146
|
+
else if (effectsRaw !== 'pure') {
|
|
147
|
+
// 2. Slice 6 only accepts the literal `pure`. Empty string and
|
|
148
|
+
// ExprObject both land here per Codex review.
|
|
149
|
+
emitDiagnostic(state, 'INVALID_EFFECTS', 'error', `\`effects=${describeEffectsValue(effectsRaw)}\` is not yet supported — slice 6 only accepts the literal \`pure\`. See docs/language/effects-pure-spec.md for future extensions.`, node.loc?.line ?? 0, node.loc?.col ?? 0);
|
|
150
|
+
}
|
|
151
|
+
else {
|
|
152
|
+
// effects === 'pure' on an allowed node — apply the contract checks.
|
|
153
|
+
// 3. Reject incompatible prop combinations.
|
|
154
|
+
const incompatible = [];
|
|
155
|
+
if (props.async === 'true' || props.async === true)
|
|
156
|
+
incompatible.push('async=true');
|
|
157
|
+
if (props.stream === 'true' || props.stream === true)
|
|
158
|
+
incompatible.push('stream=true');
|
|
159
|
+
if (incompatible.length > 0) {
|
|
160
|
+
emitDiagnostic(state, 'INVALID_EFFECTS', 'error', `\`effects=pure\` is incompatible with ${incompatible.join(' and ')} — drop one.`, node.loc?.line ?? 0, node.loc?.col ?? 0);
|
|
161
|
+
}
|
|
162
|
+
else {
|
|
163
|
+
// 4. Body walker — reject any forbidden pattern. Strip comments and
|
|
164
|
+
// string literals first to avoid false positives (Gemini review fix).
|
|
165
|
+
const body = stripCommentsAndStrings(extractBody(node));
|
|
166
|
+
if (body) {
|
|
167
|
+
for (const { name, pattern } of FORBIDDEN_PATTERNS) {
|
|
168
|
+
if (pattern.test(body)) {
|
|
169
|
+
const nameProp = typeof props.name === 'string' ? props.name : node.type;
|
|
170
|
+
emitDiagnostic(state, 'INVALID_EFFECTS', 'error', `\`${node.type} name=${nameProp}\` is marked \`effects=pure\` but its body uses \`${name}\` which is not allowed in a pure function. See docs/language/effects-pure-spec.md for the full forbidden list.`, node.loc?.line ?? 0, node.loc?.col ?? 0);
|
|
171
|
+
// Report the first match only — a single body usually has one
|
|
172
|
+
// root cause; flooding with every match adds noise.
|
|
173
|
+
break;
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
if (node.children) {
|
|
181
|
+
for (const child of node.children)
|
|
182
|
+
validateNode(state, child);
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
export function validateEffects(state, root) {
|
|
186
|
+
validateNode(state, root);
|
|
187
|
+
}
|
|
188
|
+
//# sourceMappingURL=parser-validate-effects.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parser-validate-effects.js","sourceRoot":"","sources":["../src/parser-validate-effects.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
/** Post-parse validator: runs parseExpression on bare-string props whose
|
|
2
|
+
* schema kind is 'expression'. Failures become INVALID_EXPRESSION diagnostics.
|
|
3
|
+
* Does NOT change codegen — strings flow through unchanged on success. */
|
|
4
|
+
import type { ParseState } from './parser-diagnostics.js';
|
|
5
|
+
import { type IRNode } from './types.js';
|
|
6
|
+
export declare function validateExpressions(state: ParseState, root: IRNode): void;
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/** Post-parse validator: runs parseExpression on bare-string props whose
|
|
2
|
+
* schema kind is 'expression'. Failures become INVALID_EXPRESSION diagnostics.
|
|
3
|
+
* Does NOT change codegen — strings flow through unchanged on success. */
|
|
4
|
+
import { emitDiagnostic } from './parser-diagnostics.js';
|
|
5
|
+
import { parseExpression } from './parser-expression.js';
|
|
6
|
+
import { NODE_SCHEMAS } from './schema.js';
|
|
7
|
+
import { isExprObject } from './types.js';
|
|
8
|
+
function validateNode(state, node) {
|
|
9
|
+
const schema = NODE_SCHEMAS[node.type];
|
|
10
|
+
if (schema?.props && node.props) {
|
|
11
|
+
const quoted = node.__quotedProps;
|
|
12
|
+
for (const [propName, propSchema] of Object.entries(schema.props)) {
|
|
13
|
+
if (propSchema.kind !== 'expression')
|
|
14
|
+
continue;
|
|
15
|
+
const val = node.props[propName];
|
|
16
|
+
if (typeof val !== 'string' || val === '')
|
|
17
|
+
continue;
|
|
18
|
+
if (isExprObject(val))
|
|
19
|
+
continue;
|
|
20
|
+
// Skip props whose value originated from a quoted token — those are
|
|
21
|
+
// string literals, not expressions, even though the schema says expression.
|
|
22
|
+
if (quoted?.includes(propName))
|
|
23
|
+
continue;
|
|
24
|
+
try {
|
|
25
|
+
parseExpression(val);
|
|
26
|
+
}
|
|
27
|
+
catch (err) {
|
|
28
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
29
|
+
emitDiagnostic(state, 'INVALID_EXPRESSION', 'error', `Invalid expression in '${propName}': ${msg}`, node.loc?.line ?? 0, node.loc?.col ?? 0, { endCol: (node.loc?.col ?? 0) + propName.length });
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
if (node.children) {
|
|
34
|
+
for (const child of node.children)
|
|
35
|
+
validateNode(state, child);
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
export function validateExpressions(state, root) {
|
|
39
|
+
validateNode(state, root);
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=parser-validate-expressions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parser-validate-expressions.js","sourceRoot":"","sources":["../src/parser-validate-expressions.ts"],"names":[],"mappings":"AAAA;;2EAE2E;AAG3E,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AACzD,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAe,YAAY,EAAE,MAAM,YAAY,CAAC;AAEvD,SAAS,YAAY,CAAC,KAAiB,EAAE,IAAY;IACnD,MAAM,MAAM,GAAG,YAAY,CAAC,IAAI,CAAC,IAAc,CAAC,CAAC;IACjD,IAAI,MAAM,EAAE,KAAK,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;QAChC,MAAM,MAAM,GAAG,IAAI,CAAC,aAAa,CAAC;QAClC,KAAK,MAAM,CAAC,QAAQ,EAAE,UAAU,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;YAClE,IAAI,UAAU,CAAC,IAAI,KAAK,YAAY;gBAAE,SAAS;YAC/C,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;YACjC,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,EAAE;gBAAE,SAAS;YACpD,IAAI,YAAY,CAAC,GAAG,CAAC;gBAAE,SAAS;YAChC,oEAAoE;YACpE,4EAA4E;YAC5E,IAAI,MAAM,EAAE,QAAQ,CAAC,QAAQ,CAAC;gBAAE,SAAS;YACzC,IAAI,CAAC;gBACH,eAAe,CAAC,GAAG,CAAC,CAAC;YACvB,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,MAAM,GAAG,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;gBAC7D,cAAc,CACZ,KAAK,EACL,oBAAoB,EACpB,OAAO,EACP,0BAA0B,QAAQ,MAAM,GAAG,EAAE,EAC7C,IAAI,CAAC,GAAG,EAAE,IAAI,IAAI,CAAC,EACnB,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,EAClB,EAAE,MAAM,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CACnD,CAAC;YACJ,CAAC;QACH,CAAC;IACH,CAAC;IACD,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;QAClB,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,QAAQ;YAAE,YAAY,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;IAChE,CAAC;AACH,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,KAAiB,EAAE,IAAY;IACjE,YAAY,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;AAC5B,CAAC"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/** Slice 4 — `union kind=result|option` validator.
|
|
2
|
+
*
|
|
3
|
+
* Spec: docs/language/result-option-spec.md
|
|
4
|
+
*
|
|
5
|
+
* Walks every `union` node and rejects:
|
|
6
|
+
* 1. `kind=<other>` — only `result` and `option` are recognised in slice 4.
|
|
7
|
+
* Empty string and ExprObject `kind={{ ... }}` also error per the
|
|
8
|
+
* slice 6 effects pattern (the prop is a literal-only string).
|
|
9
|
+
* 2. `kind=result` shape — the union must declare exactly two variants
|
|
10
|
+
* named `ok` and `err` (either order). Any other variant set is a
|
|
11
|
+
* `KIND_SHAPE_VIOLATION`.
|
|
12
|
+
* 3. `kind=option` shape — exactly two variants named `some` and `none`.
|
|
13
|
+
* 4. `discriminant != 'kind'` on `kind=result|option` — the spec mandates
|
|
14
|
+
* `discriminant=kind` so slice 7's `?` / `!` propagation operators can
|
|
15
|
+
* check `r.kind === 'err'` uniformly across targets.
|
|
16
|
+
*
|
|
17
|
+
* These rules are what make the slice 4 stdlib helpers safe — `map`,
|
|
18
|
+
* `unwrapOr`, etc. assume `x.kind === 'ok'` / `x.value` / `x.error`. The
|
|
19
|
+
* schema enforces the shape so the helpers don't need defensive checks.
|
|
20
|
+
*
|
|
21
|
+
* Does NOT change codegen — unions that pass the walker emit unchanged. */
|
|
22
|
+
import type { ParseState } from './parser-diagnostics.js';
|
|
23
|
+
import { type IRNode } from './types.js';
|
|
24
|
+
export declare function validateUnionKind(state: ParseState, root: IRNode): void;
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
/** Slice 4 — `union kind=result|option` validator.
|
|
2
|
+
*
|
|
3
|
+
* Spec: docs/language/result-option-spec.md
|
|
4
|
+
*
|
|
5
|
+
* Walks every `union` node and rejects:
|
|
6
|
+
* 1. `kind=<other>` — only `result` and `option` are recognised in slice 4.
|
|
7
|
+
* Empty string and ExprObject `kind={{ ... }}` also error per the
|
|
8
|
+
* slice 6 effects pattern (the prop is a literal-only string).
|
|
9
|
+
* 2. `kind=result` shape — the union must declare exactly two variants
|
|
10
|
+
* named `ok` and `err` (either order). Any other variant set is a
|
|
11
|
+
* `KIND_SHAPE_VIOLATION`.
|
|
12
|
+
* 3. `kind=option` shape — exactly two variants named `some` and `none`.
|
|
13
|
+
* 4. `discriminant != 'kind'` on `kind=result|option` — the spec mandates
|
|
14
|
+
* `discriminant=kind` so slice 7's `?` / `!` propagation operators can
|
|
15
|
+
* check `r.kind === 'err'` uniformly across targets.
|
|
16
|
+
*
|
|
17
|
+
* These rules are what make the slice 4 stdlib helpers safe — `map`,
|
|
18
|
+
* `unwrapOr`, etc. assume `x.kind === 'ok'` / `x.value` / `x.error`. The
|
|
19
|
+
* schema enforces the shape so the helpers don't need defensive checks.
|
|
20
|
+
*
|
|
21
|
+
* Does NOT change codegen — unions that pass the walker emit unchanged. */
|
|
22
|
+
import { emitDiagnostic } from './parser-diagnostics.js';
|
|
23
|
+
import { isExprObject } from './types.js';
|
|
24
|
+
const VALID_KINDS = new Set(['result', 'option']);
|
|
25
|
+
const REQUIRED_VARIANTS = {
|
|
26
|
+
result: new Set(['ok', 'err']),
|
|
27
|
+
option: new Set(['some', 'none']),
|
|
28
|
+
};
|
|
29
|
+
function describeKindValue(raw) {
|
|
30
|
+
if (typeof raw === 'string')
|
|
31
|
+
return raw === '' ? '<empty>' : raw;
|
|
32
|
+
if (isExprObject(raw))
|
|
33
|
+
return '<expression>';
|
|
34
|
+
return String(raw);
|
|
35
|
+
}
|
|
36
|
+
function variantNames(node) {
|
|
37
|
+
const names = [];
|
|
38
|
+
for (const child of node.children || []) {
|
|
39
|
+
if (child.type !== 'variant')
|
|
40
|
+
continue;
|
|
41
|
+
const name = child.props?.name;
|
|
42
|
+
if (typeof name === 'string')
|
|
43
|
+
names.push(name);
|
|
44
|
+
}
|
|
45
|
+
return names;
|
|
46
|
+
}
|
|
47
|
+
function validateNode(state, node) {
|
|
48
|
+
if (node.type === 'union') {
|
|
49
|
+
const props = node.props || {};
|
|
50
|
+
const kindRaw = props.kind;
|
|
51
|
+
const kindPresent = kindRaw !== undefined && (typeof kindRaw === 'string' || isExprObject(kindRaw) || typeof kindRaw === 'boolean');
|
|
52
|
+
if (kindPresent) {
|
|
53
|
+
// 1. Reject any kind value other than the two recognised literals.
|
|
54
|
+
if (typeof kindRaw !== 'string' || !VALID_KINDS.has(kindRaw)) {
|
|
55
|
+
emitDiagnostic(state, 'INVALID_UNION_KIND', 'error', `\`kind=${describeKindValue(kindRaw)}\` is not a recognised union kind — slice 4 accepts \`result\` or \`option\`. See docs/language/result-option-spec.md.`, node.loc?.line ?? 0, node.loc?.col ?? 0);
|
|
56
|
+
}
|
|
57
|
+
else {
|
|
58
|
+
const nameProp = typeof props.name === 'string' ? props.name : '<anonymous>';
|
|
59
|
+
// 4. discriminant must be `kind` — load-bearing for slice 7 propagation
|
|
60
|
+
// operators (they desugar to `r.kind === 'err'`). The schema does NOT
|
|
61
|
+
// default discriminant, and `generateUnion` falls back to `'type'` if
|
|
62
|
+
// missing, so a `union kind=result` without `discriminant=kind` would
|
|
63
|
+
// silently emit `{ type: 'ok' …}` and break the contract. Codex/Gemini
|
|
64
|
+
// review fix: enforce presence (not just "if present, must equal").
|
|
65
|
+
if (props.discriminant !== 'kind') {
|
|
66
|
+
const got = props.discriminant === undefined ? '<missing>' : String(props.discriminant);
|
|
67
|
+
emitDiagnostic(state, 'KIND_SHAPE_VIOLATION', 'error', `\`union name=${nameProp} kind=${kindRaw}\` must use \`discriminant=kind\` (got \`discriminant=${got}\`). The slice 7 \`?\` / \`!\` operators rely on this. See docs/language/result-option-spec.md.`, node.loc?.line ?? 0, node.loc?.col ?? 0);
|
|
68
|
+
}
|
|
69
|
+
else {
|
|
70
|
+
// 2/3. Variant-shape check for the two recognised kinds.
|
|
71
|
+
// Gemini review fix: compare the SET of variant names so duplicates
|
|
72
|
+
// like `[ok, ok]` for kind=result are rejected (the prior `every`
|
|
73
|
+
// form let `length === 2 && all in required` slip through).
|
|
74
|
+
const required = REQUIRED_VARIANTS[kindRaw];
|
|
75
|
+
const found = variantNames(node);
|
|
76
|
+
const foundSet = new Set(found);
|
|
77
|
+
const sameSet = found.length === required.size &&
|
|
78
|
+
foundSet.size === required.size &&
|
|
79
|
+
[...required].every((n) => foundSet.has(n));
|
|
80
|
+
if (!sameSet) {
|
|
81
|
+
const expected = [...required].join(' / ');
|
|
82
|
+
const got = found.length === 0 ? '<none>' : found.join(', ');
|
|
83
|
+
emitDiagnostic(state, 'KIND_SHAPE_VIOLATION', 'error', `\`union name=${nameProp} kind=${kindRaw}\` must declare exactly the variants \`${expected}\` (got: ${got}). See docs/language/result-option-spec.md.`, node.loc?.line ?? 0, node.loc?.col ?? 0);
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
if (node.children) {
|
|
90
|
+
for (const child of node.children)
|
|
91
|
+
validateNode(state, child);
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
export function validateUnionKind(state, root) {
|
|
95
|
+
validateNode(state, root);
|
|
96
|
+
}
|
|
97
|
+
//# sourceMappingURL=parser-validate-union-kind.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parser-validate-union-kind.js","sourceRoot":"","sources":["../src/parser-validate-union-kind.ts"],"names":[],"mappings":"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"}
|