@scriptc/compiler 0.0.0 → 0.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (206) hide show
  1. package/LICENSE +202 -0
  2. package/ambient/package.json +3 -0
  3. package/ambient/scriptc-node-fallback.d.ts +3001 -0
  4. package/ambient/scriptc-overrides.d.ts +95 -0
  5. package/ambient/scriptc.d.ts +74 -0
  6. package/dist/backend/cc.d.ts +169 -0
  7. package/dist/backend/cc.js +897 -0
  8. package/dist/backend/cc.js.map +1 -0
  9. package/dist/backend/emission/emit-async.d.ts +145 -0
  10. package/dist/backend/emission/emit-async.js +996 -0
  11. package/dist/backend/emission/emit-async.js.map +1 -0
  12. package/dist/backend/emission/emit-exprs.d.ts +3 -0
  13. package/dist/backend/emission/emit-exprs.js +5949 -0
  14. package/dist/backend/emission/emit-exprs.js.map +1 -0
  15. package/dist/backend/emission/emit-island.d.ts +45 -0
  16. package/dist/backend/emission/emit-island.js +271 -0
  17. package/dist/backend/emission/emit-island.js.map +1 -0
  18. package/dist/backend/emission/emit-shapes.d.ts +142 -0
  19. package/dist/backend/emission/emit-shapes.js +575 -0
  20. package/dist/backend/emission/emit-shapes.js.map +1 -0
  21. package/dist/backend/emission/emit-stmts.d.ts +78 -0
  22. package/dist/backend/emission/emit-stmts.js +960 -0
  23. package/dist/backend/emission/emit-stmts.js.map +1 -0
  24. package/dist/backend/emission/emit-types.d.ts +65 -0
  25. package/dist/backend/emission/emit-types.js +652 -0
  26. package/dist/backend/emission/emit-types.js.map +1 -0
  27. package/dist/backend/emission/emit-walkers.d.ts +154 -0
  28. package/dist/backend/emission/emit-walkers.js +1587 -0
  29. package/dist/backend/emission/emit-walkers.js.map +1 -0
  30. package/dist/backend/emission/emitter.d.ts +452 -0
  31. package/dist/backend/emission/emitter.js +1249 -0
  32. package/dist/backend/emission/emitter.js.map +1 -0
  33. package/dist/backend/emission/may-throw.d.ts +15 -0
  34. package/dist/backend/emission/may-throw.js +250 -0
  35. package/dist/backend/emission/may-throw.js.map +1 -0
  36. package/dist/backend/llvm/blocks.d.ts +21 -0
  37. package/dist/backend/llvm/blocks.js +68 -0
  38. package/dist/backend/llvm/blocks.js.map +1 -0
  39. package/dist/backend/llvm/classes.d.ts +84 -0
  40. package/dist/backend/llvm/classes.js +438 -0
  41. package/dist/backend/llvm/classes.js.map +1 -0
  42. package/dist/backend/llvm/dyn.d.ts +123 -0
  43. package/dist/backend/llvm/dyn.js +2624 -0
  44. package/dist/backend/llvm/dyn.js.map +1 -0
  45. package/dist/backend/llvm/emitter.d.ts +3 -0
  46. package/dist/backend/llvm/emitter.js +10102 -0
  47. package/dist/backend/llvm/emitter.js.map +1 -0
  48. package/dist/backend/llvm/shapes.d.ts +78 -0
  49. package/dist/backend/llvm/shapes.js +754 -0
  50. package/dist/backend/llvm/shapes.js.map +1 -0
  51. package/dist/backend/llvm/unsupported.d.ts +6 -0
  52. package/dist/backend/llvm/unsupported.js +12 -0
  53. package/dist/backend/llvm/unsupported.js.map +1 -0
  54. package/dist/backend/llvm/walkers.d.ts +58 -0
  55. package/dist/backend/llvm/walkers.js +793 -0
  56. package/dist/backend/llvm/walkers.js.map +1 -0
  57. package/dist/backend/mangle.d.ts +124 -0
  58. package/dist/backend/mangle.js +232 -0
  59. package/dist/backend/mangle.js.map +1 -0
  60. package/dist/coverage/report.d.ts +65 -0
  61. package/dist/coverage/report.js +238 -0
  62. package/dist/coverage/report.js.map +1 -0
  63. package/dist/diagnostics/diagnostic.d.ts +140 -0
  64. package/dist/diagnostics/diagnostic.js +458 -0
  65. package/dist/diagnostics/diagnostic.js.map +1 -0
  66. package/dist/diagnostics/render.d.ts +11 -0
  67. package/dist/diagnostics/render.js +58 -0
  68. package/dist/diagnostics/render.js.map +1 -0
  69. package/dist/frontend/cjs-lexer.d.ts +20 -0
  70. package/dist/frontend/cjs-lexer.js +813 -0
  71. package/dist/frontend/cjs-lexer.js.map +1 -0
  72. package/dist/frontend/lowering/http2-constants.d.ts +1 -0
  73. package/dist/frontend/lowering/http2-constants.js +251 -0
  74. package/dist/frontend/lowering/http2-constants.js.map +1 -0
  75. package/dist/frontend/lowering/lib-boundary.d.ts +6 -0
  76. package/dist/frontend/lowering/lib-boundary.js +143 -0
  77. package/dist/frontend/lowering/lib-boundary.js.map +1 -0
  78. package/dist/frontend/lowering/lower-assert.d.ts +18 -0
  79. package/dist/frontend/lowering/lower-assert.js +1269 -0
  80. package/dist/frontend/lowering/lower-assert.js.map +1 -0
  81. package/dist/frontend/lowering/lower-builtins.d.ts +511 -0
  82. package/dist/frontend/lowering/lower-builtins.js +5249 -0
  83. package/dist/frontend/lowering/lower-builtins.js.map +1 -0
  84. package/dist/frontend/lowering/lower-calls.d.ts +581 -0
  85. package/dist/frontend/lowering/lower-calls.js +6286 -0
  86. package/dist/frontend/lowering/lower-calls.js.map +1 -0
  87. package/dist/frontend/lowering/lower-classes.d.ts +727 -0
  88. package/dist/frontend/lowering/lower-classes.js +4701 -0
  89. package/dist/frontend/lowering/lower-classes.js.map +1 -0
  90. package/dist/frontend/lowering/lower-comptime.d.ts +53 -0
  91. package/dist/frontend/lowering/lower-comptime.js +244 -0
  92. package/dist/frontend/lowering/lower-comptime.js.map +1 -0
  93. package/dist/frontend/lowering/lower-containers.d.ts +486 -0
  94. package/dist/frontend/lowering/lower-containers.js +6345 -0
  95. package/dist/frontend/lowering/lower-containers.js.map +1 -0
  96. package/dist/frontend/lowering/lower-dgram.d.ts +20 -0
  97. package/dist/frontend/lowering/lower-dgram.js +319 -0
  98. package/dist/frontend/lowering/lower-dgram.js.map +1 -0
  99. package/dist/frontend/lowering/lower-emitter.d.ts +10 -0
  100. package/dist/frontend/lowering/lower-emitter.js +688 -0
  101. package/dist/frontend/lowering/lower-emitter.js.map +1 -0
  102. package/dist/frontend/lowering/lower-enums.d.ts +22 -0
  103. package/dist/frontend/lowering/lower-enums.js +235 -0
  104. package/dist/frontend/lowering/lower-enums.js.map +1 -0
  105. package/dist/frontend/lowering/lower-expando.d.ts +35 -0
  106. package/dist/frontend/lowering/lower-expando.js +276 -0
  107. package/dist/frontend/lowering/lower-expando.js.map +1 -0
  108. package/dist/frontend/lowering/lower-exprs.d.ts +524 -0
  109. package/dist/frontend/lowering/lower-exprs.js +8111 -0
  110. package/dist/frontend/lowering/lower-exprs.js.map +1 -0
  111. package/dist/frontend/lowering/lower-generators.d.ts +50 -0
  112. package/dist/frontend/lowering/lower-generators.js +421 -0
  113. package/dist/frontend/lowering/lower-generators.js.map +1 -0
  114. package/dist/frontend/lowering/lower-inspect.d.ts +20 -0
  115. package/dist/frontend/lowering/lower-inspect.js +1074 -0
  116. package/dist/frontend/lowering/lower-inspect.js.map +1 -0
  117. package/dist/frontend/lowering/lower-island.d.ts +108 -0
  118. package/dist/frontend/lowering/lower-island.js +650 -0
  119. package/dist/frontend/lowering/lower-island.js.map +1 -0
  120. package/dist/frontend/lowering/lower-mixins.d.ts +96 -0
  121. package/dist/frontend/lowering/lower-mixins.js +534 -0
  122. package/dist/frontend/lowering/lower-mixins.js.map +1 -0
  123. package/dist/frontend/lowering/lower-modules.d.ts +135 -0
  124. package/dist/frontend/lowering/lower-modules.js +1613 -0
  125. package/dist/frontend/lowering/lower-modules.js.map +1 -0
  126. package/dist/frontend/lowering/lower-namespaces.d.ts +168 -0
  127. package/dist/frontend/lowering/lower-namespaces.js +706 -0
  128. package/dist/frontend/lowering/lower-namespaces.js.map +1 -0
  129. package/dist/frontend/lowering/lower-server.d.ts +90 -0
  130. package/dist/frontend/lowering/lower-server.js +3471 -0
  131. package/dist/frontend/lowering/lower-server.js.map +1 -0
  132. package/dist/frontend/lowering/lower-stmts.d.ts +361 -0
  133. package/dist/frontend/lowering/lower-stmts.js +5341 -0
  134. package/dist/frontend/lowering/lower-stmts.js.map +1 -0
  135. package/dist/frontend/lowering/lower-stream.d.ts +88 -0
  136. package/dist/frontend/lowering/lower-stream.js +1533 -0
  137. package/dist/frontend/lowering/lower-stream.js.map +1 -0
  138. package/dist/frontend/lowering/lower-test.d.ts +27 -0
  139. package/dist/frontend/lowering/lower-test.js +353 -0
  140. package/dist/frontend/lowering/lower-test.js.map +1 -0
  141. package/dist/frontend/lowering/lowerer.d.ts +1748 -0
  142. package/dist/frontend/lowering/lowerer.js +6257 -0
  143. package/dist/frontend/lowering/lowerer.js.map +1 -0
  144. package/dist/frontend/lowering/surfaces.d.ts +272 -0
  145. package/dist/frontend/lowering/surfaces.js +1096 -0
  146. package/dist/frontend/lowering/surfaces.js.map +1 -0
  147. package/dist/frontend/npm-static.d.ts +55 -0
  148. package/dist/frontend/npm-static.js +300 -0
  149. package/dist/frontend/npm-static.js.map +1 -0
  150. package/dist/frontend/npm.d.ts +330 -0
  151. package/dist/frontend/npm.js +1259 -0
  152. package/dist/frontend/npm.js.map +1 -0
  153. package/dist/frontend/program.d.ts +186 -0
  154. package/dist/frontend/program.js +2255 -0
  155. package/dist/frontend/program.js.map +1 -0
  156. package/dist/frontend/provenance-registry.d.ts +48 -0
  157. package/dist/frontend/provenance-registry.js +87 -0
  158. package/dist/frontend/provenance-registry.js.map +1 -0
  159. package/dist/frontend/provenance.d.ts +6 -0
  160. package/dist/frontend/provenance.js +459 -0
  161. package/dist/frontend/provenance.js.map +1 -0
  162. package/dist/frontend/resolve.d.ts +56 -0
  163. package/dist/frontend/resolve.js +682 -0
  164. package/dist/frontend/resolve.js.map +1 -0
  165. package/dist/frontend/shared.d.ts +67 -0
  166. package/dist/frontend/shared.js +241 -0
  167. package/dist/frontend/shared.js.map +1 -0
  168. package/dist/frontend/ts7/adapter.d.ts +7 -0
  169. package/dist/frontend/ts7/adapter.js +54 -0
  170. package/dist/frontend/ts7/adapter.js.map +1 -0
  171. package/dist/frontend/ts7/ast.d.ts +50 -0
  172. package/dist/frontend/ts7/ast.js +211 -0
  173. package/dist/frontend/ts7/ast.js.map +1 -0
  174. package/dist/frontend/ts7/census-check.d.ts +1 -0
  175. package/dist/frontend/ts7/census-check.js +12 -0
  176. package/dist/frontend/ts7/census-check.js.map +1 -0
  177. package/dist/frontend/ts7/checker.d.ts +140 -0
  178. package/dist/frontend/ts7/checker.js +544 -0
  179. package/dist/frontend/ts7/checker.js.map +1 -0
  180. package/dist/frontend/ts7/enums.d.ts +18 -0
  181. package/dist/frontend/ts7/enums.js +43 -0
  182. package/dist/frontend/ts7/enums.js.map +1 -0
  183. package/dist/frontend/ts7/program.d.ts +99 -0
  184. package/dist/frontend/ts7/program.js +278 -0
  185. package/dist/frontend/ts7/program.js.map +1 -0
  186. package/dist/frontend/ts7/world-check.d.ts +3 -0
  187. package/dist/frontend/ts7/world-check.js +34 -0
  188. package/dist/frontend/ts7/world-check.js.map +1 -0
  189. package/dist/frontend/types.d.ts +205 -0
  190. package/dist/frontend/types.js +2485 -0
  191. package/dist/frontend/types.js.map +1 -0
  192. package/dist/index.d.ts +85 -0
  193. package/dist/index.js +429 -0
  194. package/dist/index.js.map +1 -0
  195. package/dist/ir/nodes.d.ts +4334 -0
  196. package/dist/ir/nodes.js +1906 -0
  197. package/dist/ir/nodes.js.map +1 -0
  198. package/dist/ir/serialize.d.ts +4 -0
  199. package/dist/ir/serialize.js +34 -0
  200. package/dist/ir/serialize.js.map +1 -0
  201. package/dist/ir/validate.d.ts +36 -0
  202. package/dist/ir/validate.js +4885 -0
  203. package/dist/ir/validate.js.map +1 -0
  204. package/package.json +30 -6
  205. package/README.md +0 -3
  206. package/index.js +0 -2
@@ -0,0 +1,244 @@
1
+ /* comptime(fn) lowering: run the closed callback under node:vm at compile
2
+ * time (with a timeout), then bake the produced VALUE into the IR as
3
+ * literals — records/arrays/unions included, subject to comptimeBakeable. */
4
+ import vm from "node:vm";
5
+ import ts5 from "typescript5";
6
+ import * as ts from "../ts7/adapter.js";
7
+ import { comptimeFailedDiag } from "../../diagnostics/diagnostic.js";
8
+ import { locOf } from "../program.js";
9
+ import { PoisonError } from "./lowerer.js";
10
+ /** Wall-clock budget for one comptime callback. Evaluation happens inside
11
+ * the compiler (node:vm), so a runaway loop would hang the BUILD — the vm
12
+ * timeout turns it into a diagnostic instead. */
13
+ export const COMPTIME_TIMEOUT_MS = 2000;
14
+ /** Names a compile-time-computed JS value in a comptime result diagnostic
15
+ * ("expected 'number' at $.t[2], got undefined"). */
16
+ export function describeComptimeValue(v) {
17
+ if (v === undefined)
18
+ return "undefined";
19
+ if (v === null)
20
+ return "null";
21
+ if (Array.isArray(v))
22
+ return "an array";
23
+ const t = typeof v;
24
+ return t === "object" ? "an object" : `a ${t}`;
25
+ }
26
+ /** `comptime(() => ...)`: the callback is extracted SOURCE-TEXTUALLY,
27
+ * executed at compile time in an isolated node:vm context (real JavaScript
28
+ * semantics — the compiler's own Node process), and the returned value is
29
+ * lowered as if it were a literal written at the call site. No IR nodes,
30
+ * no backend or runtime involvement — a pure frontend desugar to
31
+ * numLit/strLit/boolLit/arrayLit/recordLit.
32
+ *
33
+ * The pipeline, each step with its own rejection:
34
+ * 1. the argument must be an INLINE arrow/function-expression literal
35
+ * (not a reference — there is no closure to extract from a value);
36
+ * 2. not async/generator;
37
+ * 3. no references to outer bindings (the callback must be self-contained
38
+ * — it runs in a fresh context where module state doesn't exist) and no
39
+ * nested comptime calls; the ambient surface (JSON, ...) is permitted
40
+ * by the checker, though members with no vm counterpart (console,
41
+ * process, fs) fail at evaluation;
42
+ * 4. the call's checker type T must bake as a literal (number/string/
43
+ * boolean/arrays/records, nested);
44
+ * 5. evaluation runs under a wall-clock budget; a throw or timeout is a
45
+ * SC1110 diagnostic quoting the message;
46
+ * 6. the returned VALUE is checked against T, path-annotated
47
+ * (dynCheck-style) — NaN/Infinity, undefined/null/functions, and shape
48
+ * mismatches are rejected, never miscompiled. */
49
+ export function lowerComptime(L, expr) {
50
+ // 1. Inline function literal only (tsc guarantees the arity/type; the
51
+ // literal-ness is our requirement — source extraction needs the source).
52
+ let cb = expr.arguments[0];
53
+ while (cb && ts.isParenthesizedExpression(cb))
54
+ cb = cb.expression;
55
+ if (!cb || !(ts.isArrowFunction(cb) || ts.isFunctionExpression(cb))) {
56
+ L.unsupported("SC1090", expr.arguments[0] ?? expr, "comptime arguments other than inline function literals " +
57
+ "(write the callback directly in the call: comptime(() => ...))");
58
+ }
59
+ // 2. Async/generator callbacks have no bakeable result.
60
+ if (ts.isFunctionExpression(cb) && cb.asteriskToken ||
61
+ cb.modifiers?.some((m) => m.kind === ts.SyntaxKind.AsyncKeyword)) {
62
+ L.unsupported("SC1090", cb, "async or generator comptime callbacks");
63
+ }
64
+ // 3. Self-containment.
65
+ L.rejectComptimeCaptures(cb);
66
+ // 4. The checker's type for the call is the bake target.
67
+ const target = L.irTypeOf(expr);
68
+ if (!L.comptimeBakeable(target)) {
69
+ L.unsupported("SC1090", expr, `baking comptime results of type '${L.fmt(target)}' into the binary ` +
70
+ `(only number, string, boolean, arrays, and records lower to literals)`);
71
+ }
72
+ // 5. Evaluate. Types are stripped first (the extracted text is
73
+ // TypeScript; vm runs JavaScript), then the IIFE runs in a FRESH vm
74
+ // context: JS intrinsics (JSON, Object, ...) exist, the compiler's own
75
+ // globals and the shipped declarations' Node-isms (console, process,
76
+ // fs, setTimeout) do not — so a comptime island cannot leak side effects
77
+ // into the build, and the vm timeout bounds runaway loops.
78
+ // The TRANSPILE ISLAND: typescript@7.0.2 ships no client-side
79
+ // transpiler, so this one call keeps 5.9.3 (adapter.ts's two-world
80
+ // rules — only TEXT crosses this boundary, never AST/checker objects).
81
+ const js = ts5.transpileModule(`(${cb.getText()})()`, {
82
+ compilerOptions: { target: ts5.ScriptTarget.ESNext },
83
+ }).outputText;
84
+ let result;
85
+ try {
86
+ // `console: undefined` shadows V8's built-in per-context console (a
87
+ // silent inspector hook) so no code path can log into the void — the
88
+ // capture walk already rejects direct uses with a better message.
89
+ result = vm.runInNewContext(js, { console: undefined }, { timeout: COMPTIME_TIMEOUT_MS });
90
+ }
91
+ catch (e) {
92
+ // Errors born inside the vm context (and the timeout error itself) are
93
+ // CROSS-REALM objects — `instanceof Error` is false — so the code and
94
+ // message are read structurally.
95
+ const err = typeof e === "object" && e !== null ? e : null;
96
+ const detail = err?.code === "ERR_SCRIPT_EXECUTION_TIMEOUT"
97
+ ? `evaluation exceeded the ${COMPTIME_TIMEOUT_MS}ms compile-time budget`
98
+ : `the callback threw: ${err && typeof err.message === "string" ? err.message : String(e)}`;
99
+ L.pushDiag(comptimeFailedDiag(detail, locOf(cb)));
100
+ throw new PoisonError();
101
+ }
102
+ // 6. Result → literal IR, checked against T.
103
+ return L.comptimeValueToIr(result, target, "$", cb);
104
+ }
105
+ /** True when a comptime result of this type can be written as a literal
106
+ * expression: number/string/boolean, arrays and record shapes of those,
107
+ * nested. Closures, class instances, unions, promises, dyn, and void
108
+ * cannot be baked. */
109
+ export function comptimeBakeable(L, t) {
110
+ switch (t.kind) {
111
+ case "f64":
112
+ case "string":
113
+ case "bool":
114
+ return true;
115
+ case "array":
116
+ return L.comptimeBakeable(t.elem);
117
+ case "record": {
118
+ const shape = L.shapes.get(t.shapeId);
119
+ return !!shape && shape.fields.every((f) => L.comptimeBakeable(f.type));
120
+ }
121
+ default:
122
+ return false;
123
+ }
124
+ }
125
+ /** The self-containment fence: every identifier inside the callback must
126
+ * resolve to a declaration INSIDE the callback (its own locals/functions)
127
+ * or to the standard library (whose JS intrinsics exist in the vm; what
128
+ * doesn't — process, setTimeout — fails loudly at evaluation).
129
+ * Anything else — module locals, imports, top-level functions — would be a
130
+ * capture, and the evaluation context has no module state to capture from.
131
+ * Type-position references (annotations, `as` targets) are exempt: they
132
+ * are erased before evaluation. Nested comptime calls are rejected up
133
+ * front with their own message (the vm context has no `comptime`). */
134
+ export function rejectComptimeCaptures(L, cb) {
135
+ const sf = cb.getSourceFile();
136
+ const inTypePosition = (node) => {
137
+ for (let p = node.parent; p && p !== cb; p = p.parent) {
138
+ if (ts.isTypeNode(p))
139
+ return true;
140
+ }
141
+ return false;
142
+ };
143
+ const visit = (node) => {
144
+ if (ts.isIdentifier(node)) {
145
+ const parent = node.parent;
146
+ // Property NAMES never reference outer value bindings: members of
147
+ // ambient interfaces (arr.push) or of shapes declared in the
148
+ // callback. Value capture happens through the receiver identifier.
149
+ const isPropertyName = (ts.isPropertyAccessExpression(parent) && parent.name === node) ||
150
+ (ts.isPropertyAssignment(parent) && parent.name === node);
151
+ if (!isPropertyName && !inTypePosition(node)) {
152
+ const symbol = ts.isShorthandPropertyAssignment(parent)
153
+ ? L.checker.getShorthandAssignmentValueSymbol(parent)
154
+ : L.checker.getSymbolAtLocation(node);
155
+ const decls = symbol ? L.checker.declarationsOf(symbol) : undefined;
156
+ if (symbol && decls && decls.length > 0) {
157
+ const ownLocal = decls.every((d) => d.getSourceFile() === sf && d.pos >= cb.pos && d.end <= cb.end);
158
+ if (!ownLocal) {
159
+ if (node.text === "comptime" && L.isStdlibSymbol(symbol)) {
160
+ L.unsupported("SC1090", node, "comptime calls inside comptime callbacks " +
161
+ "(the callback already runs at compile time — compute the value directly)");
162
+ }
163
+ // console is the one ambient global V8 installs on every vm
164
+ // context (a silent inspector hook) — a log inside the island
165
+ // would no-op at compile time instead of printing at runtime.
166
+ // Rejected so side effects can't silently vanish; the other
167
+ // Node-isms (process, setTimeout) don't exist in the vm and
168
+ // fail loudly at evaluation.
169
+ if (node.text === "console" && L.isStdlibSymbol(symbol)) {
170
+ L.unsupported("SC1090", node, "console calls inside comptime callbacks " +
171
+ "(the callback computes a value at compile time — return it and log at runtime)");
172
+ }
173
+ if (!L.isStdlibSymbol(symbol)) {
174
+ L.unsupported("SC1090", node, `comptime callbacks referencing outer bindings ` +
175
+ `('${node.text}' — the callback runs at compile time in an isolated ` +
176
+ `context and must be self-contained)`);
177
+ }
178
+ }
179
+ }
180
+ }
181
+ }
182
+ ts.forEachChild(node, visit);
183
+ };
184
+ visit(cb);
185
+ }
186
+ /** A JS value computed at compile time → literal IR of the expected type,
187
+ * recursively. Mismatches are SC1110 with the offending path
188
+ * (dynCheck-style: `$.items[2].price`) and both sides rendered. */
189
+ export function comptimeValueToIr(L, value, expected, path, blame) {
190
+ const loc = locOf(blame);
191
+ const fail = (got) => {
192
+ L.pushDiag(comptimeFailedDiag(`expected '${L.fmt(expected)}' at ${path}, got ${got}`, loc));
193
+ throw new PoisonError();
194
+ };
195
+ switch (expected.kind) {
196
+ case "f64": {
197
+ if (typeof value !== "number")
198
+ return fail(describeComptimeValue(value));
199
+ if (!Number.isFinite(value)) {
200
+ return fail(`${String(value)} (only finite numbers can be written as literals)`);
201
+ }
202
+ return { kind: "numLit", value, type: expected, loc };
203
+ }
204
+ case "string": {
205
+ if (typeof value !== "string")
206
+ return fail(describeComptimeValue(value));
207
+ return { kind: "strLit", value, type: expected, loc };
208
+ }
209
+ case "bool": {
210
+ if (typeof value !== "boolean")
211
+ return fail(describeComptimeValue(value));
212
+ return { kind: "boolLit", value, type: expected, loc };
213
+ }
214
+ case "array": {
215
+ if (!Array.isArray(value))
216
+ return fail(describeComptimeValue(value));
217
+ const elems = value.map((el, i) => L.comptimeValueToIr(el, expected.elem, `${path}[${i}]`, blame));
218
+ return { kind: "arrayLit", elems, type: expected, loc };
219
+ }
220
+ case "record": {
221
+ if (typeof value !== "object" || value === null || Array.isArray(value)) {
222
+ return fail(describeComptimeValue(value));
223
+ }
224
+ const shape = L.shapes.get(expected.shapeId); // bakeable-checked
225
+ const obj = value;
226
+ const declared = new Set(shape.fields.map((f) => f.name));
227
+ for (const key of Object.keys(obj)) {
228
+ // Exact shapes, like everywhere else: comptime results get no
229
+ // width tolerance (nothing was declared for the extra field).
230
+ if (!declared.has(key))
231
+ fail(`an object with an unexpected field '${key}'`);
232
+ }
233
+ const fields = shape.fields.map((f) => ({
234
+ name: f.name,
235
+ value: L.comptimeValueToIr(obj[f.name], f.type, `${path}.${f.name}`, blame),
236
+ }));
237
+ return { kind: "recordLit", fields, type: expected, loc };
238
+ }
239
+ default:
240
+ // comptimeBakeable already fenced these off.
241
+ throw new Error(`lowerer bug: unbakeable comptime target '${expected.kind}'`);
242
+ }
243
+ }
244
+ //# sourceMappingURL=lower-comptime.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lower-comptime.js","sourceRoot":"","sources":["../../../src/frontend/lowering/lower-comptime.ts"],"names":[],"mappings":"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"}