@scriptc/compiler 0.1.6 → 0.2.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 (1060) hide show
  1. package/ambient/scriptc-node-fallback.d.ts +73 -25
  2. package/ambient/scriptc-overrides.d.ts +10 -6
  3. package/ambient/scriptc.d.ts +28 -5
  4. package/dist/backend/build-cache.d.ts +1 -3
  5. package/dist/backend/build-cache.js +3 -22
  6. package/dist/backend/build-cache.js.map +1 -1
  7. package/dist/backend/cache-root.d.ts +3 -0
  8. package/dist/backend/cache-root.js +23 -0
  9. package/dist/backend/cache-root.js.map +1 -0
  10. package/dist/backend/cycle-analysis.d.ts +15 -0
  11. package/dist/backend/cycle-analysis.js +107 -0
  12. package/dist/backend/cycle-analysis.js.map +1 -0
  13. package/dist/backend/cycle-analysis.test.js +124 -0
  14. package/dist/backend/cycle-analysis.test.js.map +1 -0
  15. package/dist/backend/debug-symbols.d.ts +8 -0
  16. package/dist/backend/debug-symbols.js +52 -0
  17. package/dist/backend/debug-symbols.js.map +1 -0
  18. package/dist/backend/executable-features.d.ts +4 -0
  19. package/dist/backend/executable-features.js +42 -0
  20. package/dist/backend/executable-features.js.map +1 -0
  21. package/dist/backend/external-c.d.ts +5 -27
  22. package/dist/backend/external-c.js +5 -40
  23. package/dist/backend/external-c.js.map +1 -1
  24. package/dist/backend/ffi-callbacks.d.ts +2 -3
  25. package/dist/backend/ffi-callbacks.js +2 -3
  26. package/dist/backend/ffi-callbacks.js.map +1 -1
  27. package/dist/backend/library-identity-markers.d.ts +4 -9
  28. package/dist/backend/library-identity-markers.js +11 -49
  29. package/dist/backend/library-identity-markers.js.map +1 -1
  30. package/dist/backend/library-pack.d.ts +5 -0
  31. package/dist/backend/library-pack.js +123 -0
  32. package/dist/backend/library-pack.js.map +1 -0
  33. package/dist/backend/link-plan-core.d.ts +20 -0
  34. package/dist/backend/link-plan-core.js +18 -0
  35. package/dist/backend/link-plan-core.js.map +1 -0
  36. package/dist/backend/link-plan.d.ts +2 -1
  37. package/dist/backend/link-plan.js +18 -17
  38. package/dist/backend/link-plan.js.map +1 -1
  39. package/dist/backend/link-trace.d.ts +2 -0
  40. package/dist/backend/link-trace.js +24 -0
  41. package/dist/backend/link-trace.js.map +1 -0
  42. package/dist/backend/linker.js +9 -1
  43. package/dist/backend/linker.js.map +1 -1
  44. package/dist/backend/literals.d.ts +9 -0
  45. package/dist/backend/literals.js +35 -0
  46. package/dist/backend/literals.js.map +1 -0
  47. package/dist/backend/literals.test.d.ts +1 -0
  48. package/dist/backend/literals.test.js +53 -0
  49. package/dist/backend/literals.test.js.map +1 -0
  50. package/dist/backend/llvm/blocks.d.ts +4 -0
  51. package/dist/backend/llvm/blocks.js +25 -4
  52. package/dist/backend/llvm/blocks.js.map +1 -1
  53. package/dist/backend/llvm/blocks.test.d.ts +1 -0
  54. package/dist/backend/llvm/blocks.test.js +91 -0
  55. package/dist/backend/llvm/blocks.test.js.map +1 -0
  56. package/dist/backend/llvm/classes.d.ts +14 -8
  57. package/dist/backend/llvm/classes.js +70 -28
  58. package/dist/backend/llvm/classes.js.map +1 -1
  59. package/dist/backend/llvm/common.d.ts +5 -1
  60. package/dist/backend/llvm/common.js +45 -4
  61. package/dist/backend/llvm/common.js.map +1 -1
  62. package/dist/backend/llvm/debug-info.d.ts +32 -0
  63. package/dist/backend/llvm/debug-info.js +198 -0
  64. package/dist/backend/llvm/debug-info.js.map +1 -0
  65. package/dist/backend/llvm/debug-info.test.d.ts +1 -0
  66. package/dist/backend/llvm/debug-info.test.js +110 -0
  67. package/dist/backend/llvm/debug-info.test.js.map +1 -0
  68. package/dist/backend/llvm/dyn.d.ts +16 -2
  69. package/dist/backend/llvm/dyn.js +498 -175
  70. package/dist/backend/llvm/dyn.js.map +1 -1
  71. package/dist/backend/llvm/emitter.d.ts +598 -1
  72. package/dist/backend/llvm/emitter.js +739 -409
  73. package/dist/backend/llvm/emitter.js.map +1 -1
  74. package/dist/backend/llvm/emitter.test.d.ts +1 -0
  75. package/dist/backend/llvm/emitter.test.js +179 -0
  76. package/dist/backend/llvm/emitter.test.js.map +1 -0
  77. package/dist/backend/llvm/expr-async.js +23 -14
  78. package/dist/backend/llvm/expr-async.js.map +1 -1
  79. package/dist/backend/llvm/expr-bytes.d.ts +1 -1
  80. package/dist/backend/llvm/expr-bytes.js +32 -14
  81. package/dist/backend/llvm/expr-bytes.js.map +1 -1
  82. package/dist/backend/llvm/expr-callbacks.d.ts +1 -1
  83. package/dist/backend/llvm/expr-callbacks.js +25 -22
  84. package/dist/backend/llvm/expr-callbacks.js.map +1 -1
  85. package/dist/backend/llvm/expr-calls.js +136 -35
  86. package/dist/backend/llvm/expr-calls.js.map +1 -1
  87. package/dist/backend/llvm/expr-containers.d.ts +1 -1
  88. package/dist/backend/llvm/expr-containers.js +43 -14
  89. package/dist/backend/llvm/expr-containers.js.map +1 -1
  90. package/dist/backend/llvm/expr-context.d.ts +5 -260
  91. package/dist/backend/llvm/expr-control.js +9 -5
  92. package/dist/backend/llvm/expr-control.js.map +1 -1
  93. package/dist/backend/llvm/expr-dispatch.d.ts +1 -1
  94. package/dist/backend/llvm/expr-dispatch.js +2 -0
  95. package/dist/backend/llvm/expr-dispatch.js.map +1 -1
  96. package/dist/backend/llvm/expr-dynamic.js +72 -74
  97. package/dist/backend/llvm/expr-dynamic.js.map +1 -1
  98. package/dist/backend/llvm/expr-island.d.ts +1 -1
  99. package/dist/backend/llvm/expr-island.js +11 -7
  100. package/dist/backend/llvm/expr-island.js.map +1 -1
  101. package/dist/backend/llvm/expr-primitives.d.ts +1 -1
  102. package/dist/backend/llvm/expr-primitives.js +51 -30
  103. package/dist/backend/llvm/expr-primitives.js.map +1 -1
  104. package/dist/backend/llvm/expr-primitives.test.js +1 -1
  105. package/dist/backend/llvm/expr-records.d.ts +5 -1
  106. package/dist/backend/llvm/expr-records.js +43 -4
  107. package/dist/backend/llvm/expr-records.js.map +1 -1
  108. package/dist/backend/llvm/expr-stream-bridges.d.ts +4 -4
  109. package/dist/backend/llvm/expr-stream-bridges.js +102 -121
  110. package/dist/backend/llvm/expr-stream-bridges.js.map +1 -1
  111. package/dist/backend/llvm/expr-stream-bridges.test.d.ts +1 -0
  112. package/dist/backend/llvm/expr-stream-bridges.test.js +55 -0
  113. package/dist/backend/llvm/expr-stream-bridges.test.js.map +1 -0
  114. package/dist/backend/llvm/expr-stream-callbacks.d.ts +1 -1
  115. package/dist/backend/llvm/expr-stream-callbacks.js +12 -12
  116. package/dist/backend/llvm/expr-stream-callbacks.js.map +1 -1
  117. package/dist/backend/llvm/layouts.d.ts +19 -0
  118. package/dist/backend/llvm/layouts.js +12 -0
  119. package/dist/backend/llvm/layouts.js.map +1 -0
  120. package/dist/backend/llvm/lib-abi.d.ts +19 -0
  121. package/dist/backend/llvm/lib-abi.js +82 -0
  122. package/dist/backend/llvm/lib-abi.js.map +1 -0
  123. package/dist/backend/llvm/lib-connect.d.ts +2 -0
  124. package/dist/backend/llvm/lib-connect.js +51 -0
  125. package/dist/backend/llvm/lib-connect.js.map +1 -0
  126. package/dist/backend/llvm/lib-datagram.d.ts +2 -0
  127. package/dist/backend/llvm/lib-datagram.js +135 -0
  128. package/dist/backend/llvm/lib-datagram.js.map +1 -0
  129. package/dist/backend/llvm/lib-dispatch.js +50 -6
  130. package/dist/backend/llvm/lib-dispatch.js.map +1 -1
  131. package/dist/backend/llvm/lib-filesystem.js +59 -18
  132. package/dist/backend/llvm/lib-filesystem.js.map +1 -1
  133. package/dist/backend/llvm/lib-http2.d.ts +2 -0
  134. package/dist/backend/llvm/lib-http2.js +215 -0
  135. package/dist/backend/llvm/lib-http2.js.map +1 -0
  136. package/dist/backend/llvm/lib-lookup.d.ts +2 -0
  137. package/dist/backend/llvm/lib-lookup.js +39 -0
  138. package/dist/backend/llvm/lib-lookup.js.map +1 -0
  139. package/dist/backend/llvm/lib-network.js +25 -2
  140. package/dist/backend/llvm/lib-network.js.map +1 -1
  141. package/dist/backend/llvm/lib-process.js +21 -16
  142. package/dist/backend/llvm/lib-process.js.map +1 -1
  143. package/dist/backend/llvm/lib-shared.js +125 -1
  144. package/dist/backend/llvm/lib-shared.js.map +1 -1
  145. package/dist/backend/llvm/lib-stream.js +3 -2
  146. package/dist/backend/llvm/lib-stream.js.map +1 -1
  147. package/dist/backend/llvm/lib-test.d.ts +2 -0
  148. package/dist/backend/llvm/lib-test.js +34 -0
  149. package/dist/backend/llvm/lib-test.js.map +1 -0
  150. package/dist/backend/llvm/lib-tls.d.ts +2 -0
  151. package/dist/backend/llvm/lib-tls.js +82 -0
  152. package/dist/backend/llvm/lib-tls.js.map +1 -0
  153. package/dist/backend/llvm/shapes.d.ts +10 -9
  154. package/dist/backend/llvm/shapes.js +35 -130
  155. package/dist/backend/llvm/shapes.js.map +1 -1
  156. package/dist/backend/llvm/split.js +4 -1
  157. package/dist/backend/llvm/split.js.map +1 -1
  158. package/dist/backend/llvm/split.test.js +26 -1
  159. package/dist/backend/llvm/split.test.js.map +1 -1
  160. package/dist/backend/llvm/unsupported.d.ts +1 -0
  161. package/dist/backend/llvm/unsupported.js +1 -2
  162. package/dist/backend/llvm/unsupported.js.map +1 -1
  163. package/dist/backend/llvm/walkers.js +1 -7
  164. package/dist/backend/llvm/walkers.js.map +1 -1
  165. package/dist/backend/mangle.d.ts +2 -2
  166. package/dist/backend/mangle.js +16 -5
  167. package/dist/backend/mangle.js.map +1 -1
  168. package/dist/backend/{c/may-throw.d.ts → may-throw.d.ts} +1 -1
  169. package/dist/backend/{c/may-throw.js → may-throw.js} +51 -46
  170. package/dist/backend/may-throw.js.map +1 -0
  171. package/dist/backend/may-throw.test.d.ts +1 -0
  172. package/dist/backend/may-throw.test.js +58 -0
  173. package/dist/backend/may-throw.test.js.map +1 -0
  174. package/dist/backend/native-codegen-core.d.ts +22 -0
  175. package/dist/backend/native-codegen-core.js +44 -0
  176. package/dist/backend/native-codegen-core.js.map +1 -0
  177. package/dist/backend/native-codegen.d.ts +3 -19
  178. package/dist/backend/native-codegen.js +5 -44
  179. package/dist/backend/native-codegen.js.map +1 -1
  180. package/dist/backend/native-codegen.test.js +2 -2
  181. package/dist/backend/native-codegen.test.js.map +1 -1
  182. package/dist/backend/native-link-info-core.d.ts +94 -0
  183. package/dist/backend/native-link-info-core.js +62 -0
  184. package/dist/backend/native-link-info-core.js.map +1 -0
  185. package/dist/backend/native-link-info.d.ts +3 -88
  186. package/dist/backend/native-link-info.js +12 -243
  187. package/dist/backend/native-link-info.js.map +1 -1
  188. package/dist/backend/native-link-info.test.js +41 -146
  189. package/dist/backend/native-link-info.test.js.map +1 -1
  190. package/dist/backend/native-toolchain.d.ts +10 -25
  191. package/dist/backend/native-toolchain.js +89 -219
  192. package/dist/backend/native-toolchain.js.map +1 -1
  193. package/dist/backend/native-toolchain.test.js +15 -5
  194. package/dist/backend/native-toolchain.test.js.map +1 -1
  195. package/dist/backend/native-tools.d.ts +24 -0
  196. package/dist/backend/native-tools.js +33 -0
  197. package/dist/backend/native-tools.js.map +1 -0
  198. package/dist/backend/object-localize.js +19 -8
  199. package/dist/backend/object-localize.js.map +1 -1
  200. package/dist/backend/object-localize.test.js +22 -0
  201. package/dist/backend/object-localize.test.js.map +1 -1
  202. package/dist/backend/runtime-abi.d.ts +2 -2
  203. package/dist/backend/runtime-abi.js +2 -2
  204. package/dist/backend/runtime-pack-core.d.ts +101 -0
  205. package/dist/backend/runtime-pack-core.js +172 -0
  206. package/dist/backend/runtime-pack-core.js.map +1 -0
  207. package/dist/backend/runtime-pack-native.d.ts +21 -0
  208. package/dist/backend/runtime-pack-native.js +70 -0
  209. package/dist/backend/runtime-pack-native.js.map +1 -0
  210. package/dist/backend/runtime-pack-targets.test.js +1 -1
  211. package/dist/backend/runtime-pack.d.ts +3 -83
  212. package/dist/backend/runtime-pack.js +8 -151
  213. package/dist/backend/runtime-pack.js.map +1 -1
  214. package/dist/backend/runtime-pack.test.js +24 -1
  215. package/dist/backend/runtime-pack.test.js.map +1 -1
  216. package/dist/backend/source-locations.d.ts +12 -0
  217. package/dist/backend/source-locations.js +32 -0
  218. package/dist/backend/source-locations.js.map +1 -0
  219. package/dist/backend/source-locations.test.d.ts +1 -0
  220. package/dist/backend/source-locations.test.js +16 -0
  221. package/dist/backend/source-locations.test.js.map +1 -0
  222. package/dist/backend/target-diagnostics.d.ts +22 -0
  223. package/dist/backend/target-diagnostics.js +108 -0
  224. package/dist/backend/target-diagnostics.js.map +1 -0
  225. package/dist/backend/target-platform.d.ts +15 -0
  226. package/dist/backend/target-platform.js +72 -0
  227. package/dist/backend/target-platform.js.map +1 -0
  228. package/dist/backend/targets.d.ts +13 -4
  229. package/dist/backend/targets.js +95 -30
  230. package/dist/backend/targets.js.map +1 -1
  231. package/dist/backend/targets.test.js +65 -4
  232. package/dist/backend/targets.test.js.map +1 -1
  233. package/dist/backend/toolchain-environment.d.ts +6 -0
  234. package/dist/backend/toolchain-environment.js +99 -0
  235. package/dist/backend/toolchain-environment.js.map +1 -0
  236. package/dist/backend/vendor-archives.d.ts +1 -9
  237. package/dist/backend/vendor-archives.js +2 -9
  238. package/dist/backend/vendor-archives.js.map +1 -1
  239. package/dist/backend/vendor-inputs.d.ts +9 -0
  240. package/dist/backend/vendor-inputs.js +10 -0
  241. package/dist/backend/vendor-inputs.js.map +1 -0
  242. package/dist/backend/warm-cache.d.ts +3 -0
  243. package/dist/backend/warm-cache.js +41 -0
  244. package/dist/backend/warm-cache.js.map +1 -0
  245. package/dist/cli/command.d.ts +3 -0
  246. package/dist/cli/command.js +328 -0
  247. package/dist/cli/command.js.map +1 -0
  248. package/dist/cli/host.d.ts +24 -0
  249. package/dist/cli/host.js +2 -0
  250. package/dist/cli/host.js.map +1 -0
  251. package/dist/cli/output-options.d.ts +26 -0
  252. package/dist/cli/output-options.js +60 -0
  253. package/dist/cli/output-options.js.map +1 -0
  254. package/dist/cli/paths.d.ts +12 -0
  255. package/dist/cli/paths.js +42 -0
  256. package/dist/cli/paths.js.map +1 -0
  257. package/dist/cli/usage.d.ts +74 -0
  258. package/dist/cli/usage.js +86 -0
  259. package/dist/cli/usage.js.map +1 -0
  260. package/dist/cli/wasi-paths.d.ts +8 -0
  261. package/dist/cli/wasi-paths.js +41 -0
  262. package/dist/cli/wasi-paths.js.map +1 -0
  263. package/dist/cli/wasi-runner.d.ts +2 -0
  264. package/dist/cli/wasi-runner.js +28 -0
  265. package/dist/cli/wasi-runner.js.map +1 -0
  266. package/dist/compat/fetch-profile.js +3 -3
  267. package/dist/compat/fetch-profile.js.map +1 -1
  268. package/dist/compile-types.d.ts +162 -0
  269. package/dist/compile-types.js +2 -0
  270. package/dist/compile-types.js.map +1 -0
  271. package/dist/coverage/report.js +11 -5
  272. package/dist/coverage/report.js.map +1 -1
  273. package/dist/coverage/surface-manifest.js +5 -2
  274. package/dist/coverage/surface-manifest.js.map +1 -1
  275. package/dist/diagnostics/diagnostic.d.ts +4 -0
  276. package/dist/diagnostics/diagnostic.js +15 -3
  277. package/dist/diagnostics/diagnostic.js.map +1 -1
  278. package/dist/executable/executable-cache.d.ts +3 -4
  279. package/dist/executable/executable-cache.js +33 -10
  280. package/dist/executable/executable-cache.js.map +1 -1
  281. package/dist/executable/executable-cache.test.js +38 -16
  282. package/dist/executable/executable-cache.test.js.map +1 -1
  283. package/dist/executable/prepare.d.ts +14 -0
  284. package/dist/executable/prepare.js +66 -0
  285. package/dist/executable/prepare.js.map +1 -0
  286. package/dist/ffi/ffi-manifest.d.ts +11 -4
  287. package/dist/ffi/ffi-manifest.js +170 -58
  288. package/dist/ffi/ffi-manifest.js.map +1 -1
  289. package/dist/ffi/ffi-manifest.test.d.ts +1 -0
  290. package/dist/ffi/ffi-manifest.test.js +111 -0
  291. package/dist/ffi/ffi-manifest.test.js.map +1 -0
  292. package/dist/format-integer.d.ts +3 -0
  293. package/dist/format-integer.js +14 -0
  294. package/dist/format-integer.js.map +1 -0
  295. package/dist/frontend/analysis.d.ts +5 -0
  296. package/dist/frontend/analysis.js +88 -0
  297. package/dist/frontend/analysis.js.map +1 -0
  298. package/dist/frontend/arguments-usage.d.ts +4 -0
  299. package/dist/frontend/arguments-usage.js +40 -0
  300. package/dist/frontend/arguments-usage.js.map +1 -0
  301. package/dist/frontend/binding-source.d.ts +4 -0
  302. package/dist/frontend/binding-source.js +18 -0
  303. package/dist/frontend/binding-source.js.map +1 -0
  304. package/dist/frontend/builtin-modules.d.ts +1 -1
  305. package/dist/frontend/builtin-modules.js +1 -1
  306. package/dist/frontend/builtin-modules.js.map +1 -1
  307. package/dist/frontend/cjs-lexer.d.ts +4 -25
  308. package/dist/frontend/cjs-lexer.js +6 -806
  309. package/dist/frontend/cjs-lexer.js.map +1 -1
  310. package/dist/frontend/cjs-resolve.d.ts +5 -0
  311. package/dist/frontend/cjs-resolve.js +429 -0
  312. package/dist/frontend/cjs-resolve.js.map +1 -0
  313. package/dist/frontend/cjs-syntax.d.ts +26 -0
  314. package/dist/frontend/cjs-syntax.js +806 -0
  315. package/dist/frontend/cjs-syntax.js.map +1 -0
  316. package/dist/frontend/comptime-node.d.ts +4 -0
  317. package/dist/frontend/comptime-node.js +16 -0
  318. package/dist/frontend/comptime-node.js.map +1 -0
  319. package/dist/frontend/comptime-node.test.d.ts +1 -0
  320. package/dist/frontend/comptime-node.test.js +37 -0
  321. package/dist/frontend/comptime-node.test.js.map +1 -0
  322. package/dist/frontend/dts-paths.d.ts +3 -4
  323. package/dist/frontend/dts-paths.js +15 -8
  324. package/dist/frontend/dts-paths.js.map +1 -1
  325. package/dist/frontend/fork-target.js +2 -2
  326. package/dist/frontend/fork-target.js.map +1 -1
  327. package/dist/frontend/helper-tokens.d.ts +1 -0
  328. package/dist/frontend/helper-tokens.js +147 -0
  329. package/dist/frontend/helper-tokens.js.map +1 -0
  330. package/dist/frontend/helper-tokens.test.d.ts +1 -0
  331. package/dist/frontend/helper-tokens.test.js +35 -0
  332. package/dist/frontend/helper-tokens.test.js.map +1 -0
  333. package/dist/frontend/inferred-js-diagnostics.d.ts +5 -0
  334. package/dist/frontend/inferred-js-diagnostics.js +69 -0
  335. package/dist/frontend/inferred-js-diagnostics.js.map +1 -0
  336. package/dist/frontend/inferred-js-diagnostics.test.d.ts +1 -0
  337. package/dist/frontend/inferred-js-diagnostics.test.js +58 -0
  338. package/dist/frontend/inferred-js-diagnostics.test.js.map +1 -0
  339. package/dist/frontend/input-tracker.d.ts +5 -2
  340. package/dist/frontend/input-tracker.js +24 -3
  341. package/dist/frontend/input-tracker.js.map +1 -1
  342. package/dist/frontend/input-tracker.test.js +23 -0
  343. package/dist/frontend/input-tracker.test.js.map +1 -1
  344. package/dist/frontend/lib-contract.js +32 -24
  345. package/dist/frontend/lib-contract.js.map +1 -1
  346. package/dist/frontend/literal-values.d.ts +4 -0
  347. package/dist/frontend/literal-values.js +21 -0
  348. package/dist/frontend/literal-values.js.map +1 -0
  349. package/dist/frontend/literal-values.test.d.ts +1 -0
  350. package/dist/frontend/literal-values.test.js +91 -0
  351. package/dist/frontend/literal-values.test.js.map +1 -0
  352. package/dist/frontend/lowering/abstract-equality.d.ts +1 -1
  353. package/dist/frontend/lowering/abstract-equality.js +3 -0
  354. package/dist/frontend/lowering/abstract-equality.js.map +1 -1
  355. package/dist/frontend/lowering/array-indexed-mutation.js +11 -6
  356. package/dist/frontend/lowering/array-indexed-mutation.js.map +1 -1
  357. package/dist/frontend/lowering/array-values.d.ts +4 -1
  358. package/dist/frontend/lowering/array-values.js +43 -1
  359. package/dist/frontend/lowering/array-values.js.map +1 -1
  360. package/dist/frontend/lowering/callback-arg.js +1 -0
  361. package/dist/frontend/lowering/callback-arg.js.map +1 -1
  362. package/dist/frontend/lowering/class-callbacks.d.ts +12 -0
  363. package/dist/frontend/lowering/class-callbacks.js +63 -0
  364. package/dist/frontend/lowering/class-callbacks.js.map +1 -0
  365. package/dist/frontend/lowering/class-descriptors.d.ts +9 -0
  366. package/dist/frontend/lowering/class-descriptors.js +73 -0
  367. package/dist/frontend/lowering/class-descriptors.js.map +1 -0
  368. package/dist/frontend/lowering/class-dynamic-dispatch.d.ts +41 -0
  369. package/dist/frontend/lowering/class-dynamic-dispatch.js +803 -0
  370. package/dist/frontend/lowering/class-dynamic-dispatch.js.map +1 -0
  371. package/dist/frontend/lowering/class-dynamic-dispatch.test.d.ts +1 -0
  372. package/dist/frontend/lowering/class-dynamic-dispatch.test.js +92 -0
  373. package/dist/frontend/lowering/class-dynamic-dispatch.test.js.map +1 -0
  374. package/dist/frontend/lowering/class-instance-constructor.d.ts +7 -0
  375. package/dist/frontend/lowering/class-instance-constructor.js +64 -0
  376. package/dist/frontend/lowering/class-instance-constructor.js.map +1 -0
  377. package/dist/frontend/lowering/class-method-values.d.ts +10 -0
  378. package/dist/frontend/lowering/class-method-values.js +170 -0
  379. package/dist/frontend/lowering/class-method-values.js.map +1 -0
  380. package/dist/frontend/lowering/class-prototypes.d.ts +16 -0
  381. package/dist/frontend/lowering/class-prototypes.js +134 -0
  382. package/dist/frontend/lowering/class-prototypes.js.map +1 -0
  383. package/dist/frontend/lowering/class-static-data.d.ts +6 -0
  384. package/dist/frontend/lowering/class-static-data.js +56 -0
  385. package/dist/frontend/lowering/class-static-data.js.map +1 -0
  386. package/dist/frontend/lowering/containers/buffer-numeric-methods.d.ts +4 -0
  387. package/dist/frontend/lowering/containers/buffer-numeric-methods.js +26 -0
  388. package/dist/frontend/lowering/containers/buffer-numeric-methods.js.map +1 -0
  389. package/dist/frontend/lowering/containers/bytes.d.ts +11 -7
  390. package/dist/frontend/lowering/containers/bytes.js +164 -155
  391. package/dist/frontend/lowering/containers/bytes.js.map +1 -1
  392. package/dist/frontend/lowering/containers/string-and-regexp.d.ts +2 -2
  393. package/dist/frontend/lowering/containers/string-and-regexp.js +39 -16
  394. package/dist/frontend/lowering/containers/string-and-regexp.js.map +1 -1
  395. package/dist/frontend/lowering/containers/string-replacement.d.ts +7 -0
  396. package/dist/frontend/lowering/containers/string-replacement.js +217 -0
  397. package/dist/frontend/lowering/containers/string-replacement.js.map +1 -0
  398. package/dist/frontend/lowering/error-methods.d.ts +11 -0
  399. package/dist/frontend/lowering/error-methods.js +78 -0
  400. package/dist/frontend/lowering/error-methods.js.map +1 -0
  401. package/dist/frontend/lowering/expressions/global-symbols.d.ts +6 -0
  402. package/dist/frontend/lowering/expressions/global-symbols.js +11 -0
  403. package/dist/frontend/lowering/expressions/global-symbols.js.map +1 -0
  404. package/dist/frontend/lowering/expressions/native-proxy.d.ts +7 -0
  405. package/dist/frontend/lowering/expressions/native-proxy.js +49 -0
  406. package/dist/frontend/lowering/expressions/native-proxy.js.map +1 -0
  407. package/dist/frontend/lowering/expressions/nullish-assignment.d.ts +6 -0
  408. package/dist/frontend/lowering/expressions/nullish-assignment.js +124 -0
  409. package/dist/frontend/lowering/expressions/nullish-assignment.js.map +1 -0
  410. package/dist/frontend/lowering/expressions/object-literals.d.ts +8 -8
  411. package/dist/frontend/lowering/expressions/object-literals.js +485 -185
  412. package/dist/frontend/lowering/expressions/object-literals.js.map +1 -1
  413. package/dist/frontend/lowering/expressions/optional-chains.d.ts +5 -6
  414. package/dist/frontend/lowering/expressions/optional-chains.js +27 -14
  415. package/dist/frontend/lowering/expressions/optional-chains.js.map +1 -1
  416. package/dist/frontend/lowering/expressions/try-lower-expression.js +1 -0
  417. package/dist/frontend/lowering/expressions/try-lower-expression.js.map +1 -1
  418. package/dist/frontend/lowering/expressions/union-field-write.d.ts +8 -0
  419. package/dist/frontend/lowering/expressions/union-field-write.js +71 -0
  420. package/dist/frontend/lowering/expressions/union-field-write.js.map +1 -0
  421. package/dist/frontend/lowering/function-context.d.ts +93 -0
  422. package/dist/frontend/lowering/function-context.js +103 -0
  423. package/dist/frontend/lowering/function-context.js.map +1 -0
  424. package/dist/frontend/lowering/generator-delegation.d.ts +7 -0
  425. package/dist/frontend/lowering/generator-delegation.js +85 -0
  426. package/dist/frontend/lowering/generator-delegation.js.map +1 -0
  427. package/dist/frontend/lowering/generator-dynamic-dispatch.d.ts +10 -0
  428. package/dist/frontend/lowering/generator-dynamic-dispatch.js +105 -0
  429. package/dist/frontend/lowering/generator-dynamic-dispatch.js.map +1 -0
  430. package/dist/frontend/lowering/lib-boundary.d.ts +2 -1
  431. package/dist/frontend/lowering/lib-boundary.js +59 -20
  432. package/dist/frontend/lowering/lib-boundary.js.map +1 -1
  433. package/dist/frontend/lowering/lib-boundary.test.d.ts +1 -0
  434. package/dist/frontend/lowering/lib-boundary.test.js +45 -0
  435. package/dist/frontend/lowering/lib-boundary.test.js.map +1 -0
  436. package/dist/frontend/lowering/lower-array-sort.d.ts +1 -1
  437. package/dist/frontend/lowering/lower-assert.d.ts +1 -1
  438. package/dist/frontend/lowering/lower-assert.js.map +1 -1
  439. package/dist/frontend/lowering/lower-async-iteration.d.ts +1 -1
  440. package/dist/frontend/lowering/lower-async-iteration.js.map +1 -1
  441. package/dist/frontend/lowering/lower-builtin-values.d.ts +12 -0
  442. package/dist/frontend/lowering/lower-builtin-values.js +139 -0
  443. package/dist/frontend/lowering/lower-builtin-values.js.map +1 -0
  444. package/dist/frontend/lowering/lower-builtins.d.ts +27 -41
  445. package/dist/frontend/lowering/lower-builtins.js +553 -346
  446. package/dist/frontend/lowering/lower-builtins.js.map +1 -1
  447. package/dist/frontend/lowering/lower-calls.d.ts +22 -26
  448. package/dist/frontend/lowering/lower-calls.js +1373 -380
  449. package/dist/frontend/lowering/lower-calls.js.map +1 -1
  450. package/dist/frontend/lowering/lower-classes.d.ts +83 -45
  451. package/dist/frontend/lowering/lower-classes.js +952 -339
  452. package/dist/frontend/lowering/lower-classes.js.map +1 -1
  453. package/dist/frontend/lowering/lower-comptime.d.ts +1 -1
  454. package/dist/frontend/lowering/lower-comptime.js +23 -32
  455. package/dist/frontend/lowering/lower-comptime.js.map +1 -1
  456. package/dist/frontend/lowering/lower-containers.d.ts +27 -32
  457. package/dist/frontend/lowering/lower-containers.js +796 -151
  458. package/dist/frontend/lowering/lower-containers.js.map +1 -1
  459. package/dist/frontend/lowering/lower-dgram.d.ts +1 -1
  460. package/dist/frontend/lowering/lower-dgram.js.map +1 -1
  461. package/dist/frontend/lowering/lower-enums.d.ts +1 -1
  462. package/dist/frontend/lowering/lower-enums.js.map +1 -1
  463. package/dist/frontend/lowering/lower-event-emitter.d.ts +30 -1
  464. package/dist/frontend/lowering/lower-event-emitter.js +58 -26
  465. package/dist/frontend/lowering/lower-event-emitter.js.map +1 -1
  466. package/dist/frontend/lowering/lower-expando.d.ts +7 -1
  467. package/dist/frontend/lowering/lower-expando.js +14 -6
  468. package/dist/frontend/lowering/lower-expando.js.map +1 -1
  469. package/dist/frontend/lowering/lower-exprs.d.ts +35 -11
  470. package/dist/frontend/lowering/lower-exprs.js +1785 -790
  471. package/dist/frontend/lowering/lower-exprs.js.map +1 -1
  472. package/dist/frontend/lowering/lower-generators.d.ts +2 -5
  473. package/dist/frontend/lowering/lower-generators.js +77 -46
  474. package/dist/frontend/lowering/lower-generators.js.map +1 -1
  475. package/dist/frontend/lowering/lower-global-value.d.ts +7 -0
  476. package/dist/frontend/lowering/lower-global-value.js +17 -0
  477. package/dist/frontend/lowering/lower-global-value.js.map +1 -0
  478. package/dist/frontend/lowering/lower-inspect.d.ts +1 -1
  479. package/dist/frontend/lowering/lower-inspect.js +17 -8
  480. package/dist/frontend/lowering/lower-inspect.js.map +1 -1
  481. package/dist/frontend/lowering/lower-island.d.ts +5 -8
  482. package/dist/frontend/lowering/lower-island.js +34 -23
  483. package/dist/frontend/lowering/lower-island.js.map +1 -1
  484. package/dist/frontend/lowering/lower-mixins.d.ts +2 -2
  485. package/dist/frontend/lowering/lower-mixins.js +5 -3
  486. package/dist/frontend/lowering/lower-mixins.js.map +1 -1
  487. package/dist/frontend/lowering/lower-modules.d.ts +1 -1
  488. package/dist/frontend/lowering/lower-modules.js +252 -38
  489. package/dist/frontend/lowering/lower-modules.js.map +1 -1
  490. package/dist/frontend/lowering/lower-namespaces.d.ts +1 -1
  491. package/dist/frontend/lowering/lower-namespaces.js.map +1 -1
  492. package/dist/frontend/lowering/lower-node-module.d.ts +1 -1
  493. package/dist/frontend/lowering/lower-node-module.js +13 -10
  494. package/dist/frontend/lowering/lower-node-module.js.map +1 -1
  495. package/dist/frontend/lowering/lower-server.d.ts +1 -1
  496. package/dist/frontend/lowering/lower-server.js +6 -10
  497. package/dist/frontend/lowering/lower-server.js.map +1 -1
  498. package/dist/frontend/lowering/lower-stmts.d.ts +10 -14
  499. package/dist/frontend/lowering/lower-stmts.js +731 -532
  500. package/dist/frontend/lowering/lower-stmts.js.map +1 -1
  501. package/dist/frontend/lowering/lower-stream.d.ts +1 -1
  502. package/dist/frontend/lowering/lower-stream.js +19 -10
  503. package/dist/frontend/lowering/lower-stream.js.map +1 -1
  504. package/dist/frontend/lowering/lower-test.d.ts +1 -1
  505. package/dist/frontend/lowering/lower-test.js.map +1 -1
  506. package/dist/frontend/lowering/lower-url.d.ts +6 -0
  507. package/dist/frontend/lowering/lower-url.js +77 -0
  508. package/dist/frontend/lowering/lower-url.js.map +1 -0
  509. package/dist/frontend/lowering/lowerer.d.ts +113 -189
  510. package/dist/frontend/lowering/lowerer.js +1033 -663
  511. package/dist/frontend/lowering/lowerer.js.map +1 -1
  512. package/dist/frontend/lowering/lowerer.test.d.ts +1 -0
  513. package/dist/frontend/lowering/lowerer.test.js +26 -0
  514. package/dist/frontend/lowering/lowerer.test.js.map +1 -0
  515. package/dist/frontend/lowering/native-ffi.d.ts +5 -0
  516. package/dist/frontend/lowering/native-ffi.js +40 -0
  517. package/dist/frontend/lowering/native-ffi.js.map +1 -0
  518. package/dist/frontend/lowering/object-enumeration-receiver.d.ts +7 -0
  519. package/dist/frontend/lowering/object-enumeration-receiver.js +33 -0
  520. package/dist/frontend/lowering/object-enumeration-receiver.js.map +1 -0
  521. package/dist/frontend/lowering/object-factory-new.d.ts +8 -0
  522. package/dist/frontend/lowering/object-factory-new.js +68 -0
  523. package/dist/frontend/lowering/object-factory-new.js.map +1 -0
  524. package/dist/frontend/lowering/optional-arguments.js +6 -1
  525. package/dist/frontend/lowering/optional-arguments.js.map +1 -1
  526. package/dist/frontend/lowering/pairs-snapshot.js +2 -1
  527. package/dist/frontend/lowering/pairs-snapshot.js.map +1 -1
  528. package/dist/frontend/lowering/runtime-optional-locals.d.ts +14 -0
  529. package/dist/frontend/lowering/runtime-optional-locals.js +41 -0
  530. package/dist/frontend/lowering/runtime-optional-locals.js.map +1 -0
  531. package/dist/frontend/lowering/runtime-optional-locals.test.d.ts +1 -0
  532. package/dist/frontend/lowering/runtime-optional-locals.test.js +85 -0
  533. package/dist/frontend/lowering/runtime-optional-locals.test.js.map +1 -0
  534. package/dist/frontend/lowering/sanitize-class-types.d.ts +8 -0
  535. package/dist/frontend/lowering/sanitize-class-types.js +79 -0
  536. package/dist/frontend/lowering/sanitize-class-types.js.map +1 -0
  537. package/dist/frontend/lowering/sanitize-class-types.test.d.ts +1 -0
  538. package/dist/frontend/lowering/sanitize-class-types.test.js +60 -0
  539. package/dist/frontend/lowering/sanitize-class-types.test.js.map +1 -0
  540. package/dist/frontend/lowering/static-this.d.ts +5 -1
  541. package/dist/frontend/lowering/static-this.js +28 -2
  542. package/dist/frontend/lowering/static-this.js.map +1 -1
  543. package/dist/frontend/lowering/string-index.d.ts +7 -0
  544. package/dist/frontend/lowering/string-index.js +39 -0
  545. package/dist/frontend/lowering/string-index.js.map +1 -0
  546. package/dist/frontend/lowering/surfaces.d.ts +9 -4
  547. package/dist/frontend/lowering/surfaces.js +98 -35
  548. package/dist/frontend/lowering/surfaces.js.map +1 -1
  549. package/dist/frontend/lowering/symbol-fields.d.ts +22 -0
  550. package/dist/frontend/lowering/symbol-fields.js +183 -0
  551. package/dist/frontend/lowering/symbol-fields.js.map +1 -0
  552. package/dist/frontend/lowering/symbol-methods.d.ts +7 -0
  553. package/dist/frontend/lowering/symbol-methods.js +30 -0
  554. package/dist/frontend/lowering/symbol-methods.js.map +1 -0
  555. package/dist/frontend/lowering/text-decoder-encoding.d.ts +10 -0
  556. package/dist/frontend/lowering/text-decoder-encoding.js +77 -0
  557. package/dist/frontend/lowering/text-decoder-encoding.js.map +1 -0
  558. package/dist/frontend/lowering/text-decoder-encoding.test.d.ts +1 -0
  559. package/dist/frontend/lowering/text-decoder-encoding.test.js +38 -0
  560. package/dist/frontend/lowering/text-decoder-encoding.test.js.map +1 -0
  561. package/dist/frontend/lowering/union-narrow.d.ts +9 -0
  562. package/dist/frontend/lowering/union-narrow.js +59 -0
  563. package/dist/frontend/lowering/union-narrow.js.map +1 -0
  564. package/dist/frontend/lowering/union-narrow.test.d.ts +1 -0
  565. package/dist/frontend/lowering/union-narrow.test.js +72 -0
  566. package/dist/frontend/lowering/union-narrow.test.js.map +1 -0
  567. package/dist/frontend/lowering/union-retag.d.ts +43 -0
  568. package/dist/frontend/lowering/union-retag.js +259 -0
  569. package/dist/frontend/lowering/union-retag.js.map +1 -0
  570. package/dist/frontend/lowering/union-retag.test.d.ts +1 -0
  571. package/dist/frontend/lowering/union-retag.test.js +405 -0
  572. package/dist/frontend/lowering/union-retag.test.js.map +1 -0
  573. package/dist/frontend/lowering/unregistered-class-types.d.ts +14 -0
  574. package/dist/frontend/lowering/unregistered-class-types.js +94 -0
  575. package/dist/frontend/lowering/unregistered-class-types.js.map +1 -0
  576. package/dist/frontend/lowering/unregistered-class-types.test.d.ts +1 -0
  577. package/dist/frontend/lowering/unregistered-class-types.test.js +65 -0
  578. package/dist/frontend/lowering/unregistered-class-types.test.js.map +1 -0
  579. package/dist/frontend/lowering/width-lift.d.ts +40 -0
  580. package/dist/frontend/lowering/width-lift.js +2 -0
  581. package/dist/frontend/lowering/width-lift.js.map +1 -0
  582. package/dist/frontend/module-syntax.d.ts +58 -0
  583. package/dist/frontend/module-syntax.js +123 -0
  584. package/dist/frontend/module-syntax.js.map +1 -0
  585. package/dist/frontend/module-syntax.test.d.ts +1 -0
  586. package/dist/frontend/module-syntax.test.js +78 -0
  587. package/dist/frontend/module-syntax.test.js.map +1 -0
  588. package/dist/frontend/npm-fetch-analysis.d.ts +17 -0
  589. package/dist/frontend/npm-fetch-analysis.js +100 -0
  590. package/dist/frontend/npm-fetch-analysis.js.map +1 -0
  591. package/dist/frontend/npm-fetch-analysis.test.d.ts +1 -0
  592. package/dist/frontend/npm-fetch-analysis.test.js +107 -0
  593. package/dist/frontend/npm-fetch-analysis.test.js.map +1 -0
  594. package/dist/frontend/npm-fetch-node.d.ts +2 -0
  595. package/dist/frontend/npm-fetch-node.js +12 -0
  596. package/dist/frontend/npm-fetch-node.js.map +1 -0
  597. package/dist/frontend/npm-fetch-syntax.d.ts +6 -0
  598. package/dist/frontend/npm-fetch-syntax.js +207 -0
  599. package/dist/frontend/npm-fetch-syntax.js.map +1 -0
  600. package/dist/frontend/npm-node.d.ts +10 -0
  601. package/dist/frontend/npm-node.js +14 -0
  602. package/dist/frontend/npm-node.js.map +1 -0
  603. package/dist/frontend/npm-static-bundled-cjs.d.ts +8 -0
  604. package/dist/frontend/npm-static-bundled-cjs.js +236 -0
  605. package/dist/frontend/npm-static-bundled-cjs.js.map +1 -0
  606. package/dist/frontend/npm-static-bundled-cjs.test.d.ts +1 -0
  607. package/dist/frontend/npm-static-bundled-cjs.test.js +69 -0
  608. package/dist/frontend/npm-static-bundled-cjs.test.js.map +1 -0
  609. package/dist/frontend/npm-static-declaration-syntax.d.ts +57 -0
  610. package/dist/frontend/npm-static-declaration-syntax.js +944 -0
  611. package/dist/frontend/npm-static-declaration-syntax.js.map +1 -0
  612. package/dist/frontend/npm-static-declarations.d.ts +11 -39
  613. package/dist/frontend/npm-static-declarations.js +22 -561
  614. package/dist/frontend/npm-static-declarations.js.map +1 -1
  615. package/dist/frontend/npm-static-declarations.test.js +245 -6
  616. package/dist/frontend/npm-static-declarations.test.js.map +1 -1
  617. package/dist/frontend/npm-static-prune.d.ts +1 -1
  618. package/dist/frontend/npm-static-prune.js +5 -4
  619. package/dist/frontend/npm-static-prune.js.map +1 -1
  620. package/dist/frontend/npm-static-prune.test.js +1 -1
  621. package/dist/frontend/npm-static-prune.test.js.map +1 -1
  622. package/dist/frontend/npm-static-rewrite-host.d.ts +4 -0
  623. package/dist/frontend/npm-static-rewrite-host.js +179 -0
  624. package/dist/frontend/npm-static-rewrite-host.js.map +1 -0
  625. package/dist/frontend/npm-static-rewrite-syntax.d.ts +16 -0
  626. package/dist/frontend/npm-static-rewrite-syntax.js +905 -0
  627. package/dist/frontend/npm-static-rewrite-syntax.js.map +1 -0
  628. package/dist/frontend/npm-static-rewrite.d.ts +0 -5
  629. package/dist/frontend/npm-static-rewrite.js +2 -1079
  630. package/dist/frontend/npm-static-rewrite.js.map +1 -1
  631. package/dist/frontend/npm-static-subtyping.d.ts +5 -0
  632. package/dist/frontend/npm-static-subtyping.js +55 -0
  633. package/dist/frontend/npm-static-subtyping.js.map +1 -0
  634. package/dist/frontend/npm-static-subtyping.test.d.ts +1 -0
  635. package/dist/frontend/npm-static-subtyping.test.js +58 -0
  636. package/dist/frontend/npm-static-subtyping.test.js.map +1 -0
  637. package/dist/frontend/npm-static.d.ts +7 -15
  638. package/dist/frontend/npm-static.js +19 -28
  639. package/dist/frontend/npm-static.js.map +1 -1
  640. package/dist/frontend/npm.d.ts +8 -69
  641. package/dist/frontend/npm.js +21 -361
  642. package/dist/frontend/npm.js.map +1 -1
  643. package/dist/frontend/npm.test.js +2 -2
  644. package/dist/frontend/npm.test.js.map +1 -1
  645. package/dist/frontend/pipeline-native.d.ts +6 -0
  646. package/dist/frontend/pipeline-native.js +32 -0
  647. package/dist/frontend/pipeline-native.js.map +1 -0
  648. package/dist/frontend/pipeline.d.ts +54 -0
  649. package/dist/frontend/pipeline.js +382 -0
  650. package/dist/frontend/pipeline.js.map +1 -0
  651. package/dist/frontend/pipeline.test.d.ts +1 -0
  652. package/dist/frontend/pipeline.test.js +77 -0
  653. package/dist/frontend/pipeline.test.js.map +1 -0
  654. package/dist/frontend/program-analysis.d.ts +10 -0
  655. package/dist/frontend/program-analysis.js +14 -0
  656. package/dist/frontend/program-analysis.js.map +1 -0
  657. package/dist/frontend/program-node.d.ts +9 -0
  658. package/dist/frontend/program-node.js +48 -0
  659. package/dist/frontend/program-node.js.map +1 -0
  660. package/dist/frontend/program.d.ts +43 -19
  661. package/dist/frontend/program.js +556 -197
  662. package/dist/frontend/program.js.map +1 -1
  663. package/dist/frontend/program.test.d.ts +1 -0
  664. package/dist/frontend/program.test.js +202 -0
  665. package/dist/frontend/program.test.js.map +1 -0
  666. package/dist/frontend/provenance-core.d.ts +9 -0
  667. package/dist/frontend/provenance-core.js +435 -0
  668. package/dist/frontend/provenance-core.js.map +1 -0
  669. package/dist/frontend/provenance.d.ts +0 -4
  670. package/dist/frontend/provenance.js +4 -459
  671. package/dist/frontend/provenance.js.map +1 -1
  672. package/dist/frontend/resolve.d.ts +3 -1
  673. package/dist/frontend/resolve.js +6 -3
  674. package/dist/frontend/resolve.js.map +1 -1
  675. package/dist/frontend/runtime-resolve.d.ts +4 -3
  676. package/dist/frontend/runtime-resolve.js +22 -18
  677. package/dist/frontend/runtime-resolve.js.map +1 -1
  678. package/dist/frontend/runtime-resolve.test.js +53 -0
  679. package/dist/frontend/runtime-resolve.test.js.map +1 -1
  680. package/dist/frontend/services-node.d.ts +5 -0
  681. package/dist/frontend/services-node.js +19 -0
  682. package/dist/frontend/services-node.js.map +1 -0
  683. package/dist/frontend/services-node.test.d.ts +1 -0
  684. package/dist/frontend/services-node.test.js +70 -0
  685. package/dist/frontend/services-node.test.js.map +1 -0
  686. package/dist/frontend/services.d.ts +44 -0
  687. package/dist/frontend/services.js +90 -0
  688. package/dist/frontend/services.js.map +1 -0
  689. package/dist/frontend/services.test.d.ts +1 -0
  690. package/dist/frontend/services.test.js +174 -0
  691. package/dist/frontend/services.test.js.map +1 -0
  692. package/dist/frontend/ts7/adapter.d.ts +3 -3
  693. package/dist/frontend/ts7/adapter.js +14 -31
  694. package/dist/frontend/ts7/adapter.js.map +1 -1
  695. package/dist/frontend/ts7/api.d.ts +16 -0
  696. package/dist/frontend/ts7/api.js +24 -0
  697. package/dist/frontend/ts7/api.js.map +1 -0
  698. package/dist/frontend/ts7/ast-bytes.d.ts +31 -0
  699. package/dist/frontend/ts7/ast-bytes.js +137 -0
  700. package/dist/frontend/ts7/ast-bytes.js.map +1 -0
  701. package/dist/frontend/ts7/ast-bytes.test.d.ts +1 -0
  702. package/dist/frontend/ts7/ast-bytes.test.js +73 -0
  703. package/dist/frontend/ts7/ast-bytes.test.js.map +1 -0
  704. package/dist/frontend/ts7/ast-guards.generated.d.ts +353 -0
  705. package/dist/frontend/ts7/ast-guards.generated.js +1951 -0
  706. package/dist/frontend/ts7/ast-guards.generated.js.map +1 -0
  707. package/dist/frontend/ts7/ast-guards.test.d.ts +1 -0
  708. package/dist/frontend/ts7/ast-guards.test.js +43 -0
  709. package/dist/frontend/ts7/ast-guards.test.js.map +1 -0
  710. package/dist/frontend/ts7/ast-node.d.ts +194 -0
  711. package/dist/frontend/ts7/ast-node.js +448 -0
  712. package/dist/frontend/ts7/ast-node.js.map +1 -0
  713. package/dist/frontend/ts7/ast-node.test.d.ts +1 -0
  714. package/dist/frontend/ts7/ast-node.test.js +266 -0
  715. package/dist/frontend/ts7/ast-node.test.js.map +1 -0
  716. package/dist/frontend/ts7/ast-schema.generated.d.ts +503 -0
  717. package/dist/frontend/ts7/ast-schema.generated.js +1446 -0
  718. package/dist/frontend/ts7/ast-schema.generated.js.map +1 -0
  719. package/dist/frontend/ts7/ast-text.d.ts +6 -0
  720. package/dist/frontend/ts7/ast-text.js +124 -0
  721. package/dist/frontend/ts7/ast-text.js.map +1 -0
  722. package/dist/frontend/ts7/ast-text.test.d.ts +1 -0
  723. package/dist/frontend/ts7/ast-text.test.js +38 -0
  724. package/dist/frontend/ts7/ast-text.test.js.map +1 -0
  725. package/dist/frontend/ts7/ast-tokens.generated.d.ts +2 -0
  726. package/dist/frontend/ts7/ast-tokens.generated.js +155 -0
  727. package/dist/frontend/ts7/ast-tokens.generated.js.map +1 -0
  728. package/dist/frontend/ts7/ast-types.d.ts +42 -0
  729. package/dist/frontend/ts7/ast-types.generated.d.ts +1615 -0
  730. package/dist/frontend/ts7/ast-types.generated.js +5 -0
  731. package/dist/frontend/ts7/ast-types.generated.js.map +1 -0
  732. package/dist/frontend/ts7/ast-types.js +3 -0
  733. package/dist/frontend/ts7/ast-types.js.map +1 -0
  734. package/dist/frontend/ts7/ast-wire.d.ts +58 -0
  735. package/dist/frontend/ts7/ast-wire.js +267 -0
  736. package/dist/frontend/ts7/ast-wire.js.map +1 -0
  737. package/dist/frontend/ts7/ast-wire.test.d.ts +1 -0
  738. package/dist/frontend/ts7/ast-wire.test.js +151 -0
  739. package/dist/frontend/ts7/ast-wire.test.js.map +1 -0
  740. package/dist/frontend/ts7/ast.d.ts +14 -14
  741. package/dist/frontend/ts7/ast.js +21 -15
  742. package/dist/frontend/ts7/ast.js.map +1 -1
  743. package/dist/frontend/ts7/census-check.js +1 -0
  744. package/dist/frontend/ts7/census-check.js.map +1 -1
  745. package/dist/frontend/ts7/checker-cache.d.ts +48 -0
  746. package/dist/frontend/ts7/checker-cache.js +92 -0
  747. package/dist/frontend/ts7/checker-cache.js.map +1 -0
  748. package/dist/frontend/ts7/checker.d.ts +19 -46
  749. package/dist/frontend/ts7/checker.js +231 -161
  750. package/dist/frontend/ts7/checker.js.map +1 -1
  751. package/dist/frontend/ts7/checker.test.d.ts +1 -0
  752. package/dist/frontend/ts7/checker.test.js +335 -0
  753. package/dist/frontend/ts7/checker.test.js.map +1 -0
  754. package/dist/frontend/ts7/enums.d.ts +4 -27
  755. package/dist/frontend/ts7/enums.generated.d.ts +878 -0
  756. package/dist/frontend/ts7/enums.generated.js +1313 -0
  757. package/dist/frontend/ts7/enums.generated.js.map +1 -0
  758. package/dist/frontend/ts7/enums.js +4 -45
  759. package/dist/frontend/ts7/enums.js.map +1 -1
  760. package/dist/frontend/ts7/enums.test.d.ts +1 -0
  761. package/dist/frontend/ts7/enums.test.js +48 -0
  762. package/dist/frontend/ts7/enums.test.js.map +1 -0
  763. package/dist/frontend/ts7/native-api.d.ts +10 -0
  764. package/dist/frontend/ts7/native-api.js +10 -0
  765. package/dist/frontend/ts7/native-api.js.map +1 -0
  766. package/dist/frontend/ts7/native-host.d.ts +2 -0
  767. package/dist/frontend/ts7/native-host.js +11 -0
  768. package/dist/frontend/ts7/native-host.js.map +1 -0
  769. package/dist/frontend/ts7/native-process.d.ts +14 -0
  770. package/dist/frontend/ts7/native-process.js +62 -0
  771. package/dist/frontend/ts7/native-process.js.map +1 -0
  772. package/dist/frontend/ts7/program-adapter.d.ts +10 -98
  773. package/dist/frontend/ts7/program-adapter.js +16 -310
  774. package/dist/frontend/ts7/program-adapter.js.map +1 -1
  775. package/dist/frontend/ts7/program-host.d.ts +115 -0
  776. package/dist/frontend/ts7/program-host.js +347 -0
  777. package/dist/frontend/ts7/program-host.js.map +1 -0
  778. package/dist/frontend/ts7/program-host.test.d.ts +1 -0
  779. package/dist/frontend/ts7/program-host.test.js +207 -0
  780. package/dist/frontend/ts7/program-host.test.js.map +1 -0
  781. package/dist/frontend/ts7/rpc-api.d.ts +12 -0
  782. package/dist/frontend/ts7/rpc-api.js +23 -0
  783. package/dist/frontend/ts7/rpc-api.js.map +1 -0
  784. package/dist/frontend/ts7/rpc-client.d.ts +27 -0
  785. package/dist/frontend/ts7/rpc-client.js +102 -0
  786. package/dist/frontend/ts7/rpc-client.js.map +1 -0
  787. package/dist/frontend/ts7/rpc-client.test.d.ts +1 -0
  788. package/dist/frontend/ts7/rpc-client.test.js +133 -0
  789. package/dist/frontend/ts7/rpc-client.test.js.map +1 -0
  790. package/dist/frontend/ts7/rpc-filesystem.d.ts +16 -0
  791. package/dist/frontend/ts7/rpc-filesystem.js +42 -0
  792. package/dist/frontend/ts7/rpc-filesystem.js.map +1 -0
  793. package/dist/frontend/ts7/rpc-filesystem.test.d.ts +1 -0
  794. package/dist/frontend/ts7/rpc-filesystem.test.js +89 -0
  795. package/dist/frontend/ts7/rpc-filesystem.test.js.map +1 -0
  796. package/dist/frontend/ts7/rpc-process.d.ts +2 -0
  797. package/dist/frontend/ts7/rpc-process.js +148 -0
  798. package/dist/frontend/ts7/rpc-process.js.map +1 -0
  799. package/dist/frontend/ts7/rpc-process.test.d.ts +1 -0
  800. package/dist/frontend/ts7/rpc-process.test.js +29 -0
  801. package/dist/frontend/ts7/rpc-process.test.js.map +1 -0
  802. package/dist/frontend/ts7/rpc-wire.d.ts +46 -0
  803. package/dist/frontend/ts7/rpc-wire.js +195 -0
  804. package/dist/frontend/ts7/rpc-wire.js.map +1 -0
  805. package/dist/frontend/ts7/rpc-wire.test.d.ts +1 -0
  806. package/dist/frontend/ts7/rpc-wire.test.js +168 -0
  807. package/dist/frontend/ts7/rpc-wire.test.js.map +1 -0
  808. package/dist/frontend/ts7/semantic-checker.d.ts +137 -0
  809. package/dist/frontend/ts7/semantic-checker.js +221 -0
  810. package/dist/frontend/ts7/semantic-checker.js.map +1 -0
  811. package/dist/frontend/ts7/semantic-checker.test.d.ts +1 -0
  812. package/dist/frontend/ts7/semantic-checker.test.js +119 -0
  813. package/dist/frontend/ts7/semantic-checker.test.js.map +1 -0
  814. package/dist/frontend/ts7/semantic-json.d.ts +5 -0
  815. package/dist/frontend/ts7/semantic-json.js +52 -0
  816. package/dist/frontend/ts7/semantic-json.js.map +1 -0
  817. package/dist/frontend/ts7/semantic-json.test.d.ts +1 -0
  818. package/dist/frontend/ts7/semantic-json.test.js +42 -0
  819. package/dist/frontend/ts7/semantic-json.test.js.map +1 -0
  820. package/dist/frontend/ts7/semantic-model.d.ts +222 -0
  821. package/dist/frontend/ts7/semantic-model.js +423 -0
  822. package/dist/frontend/ts7/semantic-model.js.map +1 -0
  823. package/dist/frontend/ts7/semantic-model.test.d.ts +1 -0
  824. package/dist/frontend/ts7/semantic-model.test.js +322 -0
  825. package/dist/frontend/ts7/semantic-model.test.js.map +1 -0
  826. package/dist/frontend/ts7/semantic-schema.generated.d.ts +283 -0
  827. package/dist/frontend/ts7/semantic-schema.generated.js +222 -0
  828. package/dist/frontend/ts7/semantic-schema.generated.js.map +1 -0
  829. package/dist/frontend/ts7/semantic-types.d.ts +5 -0
  830. package/dist/frontend/ts7/semantic-types.js +2 -0
  831. package/dist/frontend/ts7/semantic-types.js.map +1 -0
  832. package/dist/frontend/ts7/session-cache.d.ts +17 -0
  833. package/dist/frontend/ts7/session-cache.js +97 -0
  834. package/dist/frontend/ts7/session-cache.js.map +1 -0
  835. package/dist/frontend/ts7/session-cache.test.d.ts +1 -0
  836. package/dist/frontend/ts7/session-cache.test.js +87 -0
  837. package/dist/frontend/ts7/session-cache.test.js.map +1 -0
  838. package/dist/frontend/ts7/session-path.d.ts +18 -0
  839. package/dist/frontend/ts7/session-path.js +203 -0
  840. package/dist/frontend/ts7/session-path.js.map +1 -0
  841. package/dist/frontend/ts7/session-path.test.d.ts +1 -0
  842. package/dist/frontend/ts7/session-path.test.js +34 -0
  843. package/dist/frontend/ts7/session-path.test.js.map +1 -0
  844. package/dist/frontend/ts7/session-schema.generated.d.ts +167 -0
  845. package/dist/frontend/ts7/session-schema.generated.js +5 -0
  846. package/dist/frontend/ts7/session-schema.generated.js.map +1 -0
  847. package/dist/frontend/ts7/session-timing.d.ts +50 -0
  848. package/dist/frontend/ts7/session-timing.js +61 -0
  849. package/dist/frontend/ts7/session-timing.js.map +1 -0
  850. package/dist/frontend/ts7/session-timing.test.d.ts +1 -0
  851. package/dist/frontend/ts7/session-timing.test.js +52 -0
  852. package/dist/frontend/ts7/session-timing.test.js.map +1 -0
  853. package/dist/frontend/ts7/session.d.ts +105 -0
  854. package/dist/frontend/ts7/session.js +233 -0
  855. package/dist/frontend/ts7/session.js.map +1 -0
  856. package/dist/frontend/ts7/session.test.d.ts +1 -0
  857. package/dist/frontend/ts7/session.test.js +215 -0
  858. package/dist/frontend/ts7/session.test.js.map +1 -0
  859. package/dist/frontend/ts7/source-parser-node.d.ts +6 -0
  860. package/dist/frontend/ts7/source-parser-node.js +15 -0
  861. package/dist/frontend/ts7/source-parser-node.js.map +1 -0
  862. package/dist/frontend/ts7/source-parser.d.ts +25 -0
  863. package/dist/frontend/ts7/source-parser.js +96 -0
  864. package/dist/frontend/ts7/source-parser.js.map +1 -0
  865. package/dist/frontend/ts7/source-parser.test.d.ts +1 -0
  866. package/dist/frontend/ts7/source-parser.test.js +151 -0
  867. package/dist/frontend/ts7/source-parser.test.js.map +1 -0
  868. package/dist/frontend/ts7/syntax.d.ts +3 -0
  869. package/dist/frontend/ts7/syntax.js +4 -0
  870. package/dist/frontend/ts7/syntax.js.map +1 -0
  871. package/dist/frontend/tsc-codes.js +3 -0
  872. package/dist/frontend/tsc-codes.js.map +1 -1
  873. package/dist/frontend/type-mapper.d.ts +29 -19
  874. package/dist/frontend/type-mapper.js +713 -306
  875. package/dist/frontend/type-mapper.js.map +1 -1
  876. package/dist/frontend/type-mapper.test.d.ts +1 -0
  877. package/dist/frontend/type-mapper.test.js +207 -0
  878. package/dist/frontend/type-mapper.test.js.map +1 -0
  879. package/dist/frontend/union-discriminants.d.ts +16 -0
  880. package/dist/frontend/union-discriminants.js +98 -0
  881. package/dist/frontend/union-discriminants.js.map +1 -0
  882. package/dist/frontend/union-discriminants.test.d.ts +1 -0
  883. package/dist/frontend/union-discriminants.test.js +182 -0
  884. package/dist/frontend/union-discriminants.test.js.map +1 -0
  885. package/dist/index.d.ts +7 -197
  886. package/dist/index.js +369 -1567
  887. package/dist/index.js.map +1 -1
  888. package/dist/ir/analysis.d.ts +16 -4
  889. package/dist/ir/analysis.js +25 -6
  890. package/dist/ir/analysis.js.map +1 -1
  891. package/dist/ir/analysis.test.js +15 -2
  892. package/dist/ir/analysis.test.js.map +1 -1
  893. package/dist/ir/constant-tables.js +67 -49
  894. package/dist/ir/constant-tables.js.map +1 -1
  895. package/dist/ir/constant-tables.test.js +1 -1
  896. package/dist/ir/control-flow.d.ts +6 -0
  897. package/dist/ir/control-flow.js +142 -0
  898. package/dist/ir/control-flow.js.map +1 -0
  899. package/dist/ir/control-flow.test.d.ts +1 -0
  900. package/dist/ir/control-flow.test.js +113 -0
  901. package/dist/ir/control-flow.test.js.map +1 -0
  902. package/dist/ir/integer-loops.js +7 -18
  903. package/dist/ir/integer-loops.js.map +1 -1
  904. package/dist/ir/integer-ranges.js +53 -27
  905. package/dist/ir/integer-ranges.js.map +1 -1
  906. package/dist/ir/ir.d.ts +309 -164
  907. package/dist/ir/ir.js +588 -879
  908. package/dist/ir/ir.js.map +1 -1
  909. package/dist/ir/ir.test.js +127 -1
  910. package/dist/ir/ir.test.js.map +1 -1
  911. package/dist/ir/scalar-records.js +165 -134
  912. package/dist/ir/scalar-records.js.map +1 -1
  913. package/dist/ir/scalar-records.test.js +1 -1
  914. package/dist/ir/serialize.d.ts +4 -2
  915. package/dist/ir/serialize.js +19 -12
  916. package/dist/ir/serialize.js.map +1 -1
  917. package/dist/ir/serialize.test.d.ts +1 -0
  918. package/dist/ir/serialize.test.js +53 -0
  919. package/dist/ir/serialize.test.js.map +1 -0
  920. package/dist/ir/traverse.d.ts +41 -0
  921. package/dist/ir/traverse.js +660 -0
  922. package/dist/ir/traverse.js.map +1 -0
  923. package/dist/ir/traverse.test.d.ts +1 -0
  924. package/dist/ir/traverse.test.js +242 -0
  925. package/dist/ir/traverse.test.js.map +1 -0
  926. package/dist/ir/validate.js +1956 -1496
  927. package/dist/ir/validate.js.map +1 -1
  928. package/dist/ir/validate.test.js +476 -2
  929. package/dist/ir/validate.test.js.map +1 -1
  930. package/dist/library/cache-primitives.d.ts +2 -3
  931. package/dist/library/cache-primitives.js +4 -6
  932. package/dist/library/cache-primitives.js.map +1 -1
  933. package/dist/library/compiler-self-identity.d.ts +1 -1
  934. package/dist/library/compiler-self-identity.js +31 -15
  935. package/dist/library/compiler-self-identity.js.map +1 -1
  936. package/dist/library/compiler-self-identity.test.d.ts +1 -0
  937. package/dist/library/compiler-self-identity.test.js +93 -0
  938. package/dist/library/compiler-self-identity.test.js.map +1 -0
  939. package/dist/library/fence-eval.js +2 -2
  940. package/dist/library/fence-eval.js.map +1 -1
  941. package/dist/library/int-infer.js +7 -6
  942. package/dist/library/int-infer.js.map +1 -1
  943. package/dist/library/int-infer.test.js +4 -4
  944. package/dist/library/library-cache.d.ts +3 -2
  945. package/dist/library/library-cache.js +5 -17
  946. package/dist/library/library-cache.js.map +1 -1
  947. package/dist/library/library-cache.test.js +54 -41
  948. package/dist/library/library-cache.test.js.map +1 -1
  949. package/dist/library/library-profile.d.ts +3 -1
  950. package/dist/library/library-profile.js +15 -6
  951. package/dist/library/library-profile.js.map +1 -1
  952. package/dist/library/prepare.d.ts +15 -0
  953. package/dist/library/prepare.js +584 -0
  954. package/dist/library/prepare.js.map +1 -0
  955. package/dist/library/semantic-source.d.ts +1 -1
  956. package/dist/library/semantic-source.js +8 -6
  957. package/dist/library/semantic-source.js.map +1 -1
  958. package/dist/library/sidecar-validate.js +4 -4
  959. package/dist/library/sidecar-validate.js.map +1 -1
  960. package/dist/library/sidecar.d.ts +2 -0
  961. package/dist/library/sidecar.js +10 -3
  962. package/dist/library/sidecar.js.map +1 -1
  963. package/dist/native/cache.d.ts +11 -0
  964. package/dist/native/cache.js +113 -0
  965. package/dist/native/cache.js.map +1 -0
  966. package/dist/native/cache.test.d.ts +1 -0
  967. package/dist/native/cache.test.js +66 -0
  968. package/dist/native/cache.test.js.map +1 -0
  969. package/dist/native/cli.d.ts +1 -0
  970. package/dist/native/cli.js +112 -0
  971. package/dist/native/cli.js.map +1 -0
  972. package/dist/native/compiler.d.ts +15 -0
  973. package/dist/native/compiler.js +336 -0
  974. package/dist/native/compiler.js.map +1 -0
  975. package/dist/native/compiler.test.d.ts +1 -0
  976. package/dist/native/compiler.test.js +174 -0
  977. package/dist/native/compiler.test.js.map +1 -0
  978. package/dist/native/comptime.d.ts +5 -0
  979. package/dist/native/comptime.js +73 -0
  980. package/dist/native/comptime.js.map +1 -0
  981. package/dist/native/comptime.test.d.ts +1 -0
  982. package/dist/native/comptime.test.js +65 -0
  983. package/dist/native/comptime.test.js.map +1 -0
  984. package/dist/native/executable-cache.d.ts +26 -0
  985. package/dist/native/executable-cache.js +228 -0
  986. package/dist/native/executable-cache.js.map +1 -0
  987. package/dist/native/executable-cache.test.d.ts +1 -0
  988. package/dist/native/executable-cache.test.js +151 -0
  989. package/dist/native/executable-cache.test.js.map +1 -0
  990. package/dist/native/file-identity.d.ts +4 -0
  991. package/dist/native/file-identity.js +14 -0
  992. package/dist/native/file-identity.js.map +1 -0
  993. package/dist/native/file-identity.test.d.ts +1 -0
  994. package/dist/native/file-identity.test.js +43 -0
  995. package/dist/native/file-identity.test.js.map +1 -0
  996. package/dist/native/library.d.ts +22 -0
  997. package/dist/native/library.js +83 -0
  998. package/dist/native/library.js.map +1 -0
  999. package/dist/native/prepare.d.ts +21 -0
  1000. package/dist/native/prepare.js +174 -0
  1001. package/dist/native/prepare.js.map +1 -0
  1002. package/dist/native/prepare.test.d.ts +1 -0
  1003. package/dist/native/prepare.test.js +70 -0
  1004. package/dist/native/prepare.test.js.map +1 -0
  1005. package/dist/native/sanitizer.d.ts +11 -0
  1006. package/dist/native/sanitizer.js +135 -0
  1007. package/dist/native/sanitizer.js.map +1 -0
  1008. package/dist/native/sanitizer.test.d.ts +1 -0
  1009. package/dist/native/sanitizer.test.js +58 -0
  1010. package/dist/native/sanitizer.test.js.map +1 -0
  1011. package/dist/native/task.d.ts +4 -0
  1012. package/dist/native/task.js +16 -0
  1013. package/dist/native/task.js.map +1 -0
  1014. package/dist/native/task.test.d.ts +1 -0
  1015. package/dist/native/task.test.js +17 -0
  1016. package/dist/native/task.test.js.map +1 -0
  1017. package/dist/native/toolchain.d.ts +45 -0
  1018. package/dist/native/toolchain.js +74 -0
  1019. package/dist/native/toolchain.js.map +1 -0
  1020. package/dist/native/toolchain.test.d.ts +1 -0
  1021. package/dist/native/toolchain.test.js +33 -0
  1022. package/dist/native/toolchain.test.js.map +1 -0
  1023. package/dist/startup-cache.d.ts +1 -1
  1024. package/dist/startup-cache.js +2 -5
  1025. package/dist/startup-cache.js.map +1 -1
  1026. package/dist/timing.d.ts +4 -0
  1027. package/dist/timing.js +19 -0
  1028. package/dist/timing.js.map +1 -0
  1029. package/dist/wasi-paths.js +10 -7
  1030. package/dist/wasi-paths.js.map +1 -1
  1031. package/package.json +28 -19
  1032. package/surface-manifest.json +171 -18
  1033. package/dist/backend/c/async.d.ts +0 -171
  1034. package/dist/backend/c/async.js +0 -1317
  1035. package/dist/backend/c/async.js.map +0 -1
  1036. package/dist/backend/c/c-emitter.d.ts +0 -531
  1037. package/dist/backend/c/c-emitter.js +0 -1917
  1038. package/dist/backend/c/c-emitter.js.map +0 -1
  1039. package/dist/backend/c/exprs.d.ts +0 -15
  1040. package/dist/backend/c/exprs.js +0 -8803
  1041. package/dist/backend/c/exprs.js.map +0 -1
  1042. package/dist/backend/c/island.d.ts +0 -45
  1043. package/dist/backend/c/island.js +0 -281
  1044. package/dist/backend/c/island.js.map +0 -1
  1045. package/dist/backend/c/may-throw.js.map +0 -1
  1046. package/dist/backend/c/shapes.d.ts +0 -142
  1047. package/dist/backend/c/shapes.js +0 -603
  1048. package/dist/backend/c/shapes.js.map +0 -1
  1049. package/dist/backend/c/stmts.d.ts +0 -76
  1050. package/dist/backend/c/stmts.js +0 -1084
  1051. package/dist/backend/c/stmts.js.map +0 -1
  1052. package/dist/backend/c/types.d.ts +0 -71
  1053. package/dist/backend/c/types.js +0 -459
  1054. package/dist/backend/c/types.js.map +0 -1
  1055. package/dist/backend/c/types.test.js +0 -32
  1056. package/dist/backend/c/types.test.js.map +0 -1
  1057. package/dist/backend/c/walkers.d.ts +0 -134
  1058. package/dist/backend/c/walkers.js +0 -1773
  1059. package/dist/backend/c/walkers.js.map +0 -1
  1060. /package/dist/backend/{c/types.test.d.ts → cycle-analysis.test.d.ts} +0 -0
@@ -1,15 +1,17 @@
1
1
  import { InternalCompilerError } from "../../../errors.js";
2
2
  import * as ts from "../../ts7/adapter.js";
3
- import { BOOL, DYN, F64, STRING, UNDEFINED_T, VOID, arrayOf, canDynCheckTo, isUnitType, shapeHasAccessorSlots, typeEquals, } from "../../../ir/ir.js";
3
+ import { BOOL, DYN, F64, JSVAL, STRING, UNDEFINED_T, VOID, arrayOf, canDynCheckTo, isUnitType, shapeHasAccessorSlots, typeEquals, } from "../../../ir/ir.js";
4
4
  import { isCjsExportTableLiteral, isJsSourceFile, locOf } from "../../program.js";
5
5
  import { NARROW_FIRST } from "../surfaces.js";
6
6
  import { recordShapeMismatchDiag } from "../../../diagnostics/diagnostic.js";
7
7
  import { PoisonError, dynUndefinedExpr } from "../lowerer.js";
8
8
  import { lowerIndexMergeHelper } from "../lower-containers.js";
9
9
  import { isGenericCallableMemberType } from "../../type-mapper.js";
10
- import { numLit, varRef } from "../../../ir/build.js";
10
+ import { numLit, strLit, varRef } from "../../../ir/build.js";
11
11
  import { isSafeToRepeat } from "./evaluation-safety.js";
12
12
  import { tryLowerExpression } from "./try-lower-expression.js";
13
+ import { fenceSymbolFieldCopy } from "../symbol-fields.js";
14
+ import { planUnionRetag } from "../union-retag.js";
13
15
  /** `{ a: 1, b: "x" }` → recordLit. The record type comes from the
14
16
  * contextual type when tsc has one (annotated declarations, arguments,
15
17
  * nested literals) and from the literal's own type otherwise — both intern
@@ -31,10 +33,11 @@ function settledDropNames(lowerer, tsType) {
31
33
  !lowerer.checker.declarationsOf(sym).some((d) => ts.isInterfaceDeclaration(d) && lowerer.isStdlibFile(d.getSourceFile()))) {
32
34
  continue;
33
35
  }
34
- if (sym.name === "PromiseFulfilledResult")
35
- (names ??= new Set()).add("value");
36
- if (sym.name === "PromiseRejectedResult")
37
- (names ??= new Set()).add("reason");
36
+ if (sym.name === "PromiseFulfilledResult" || sym.name === "PromiseRejectedResult") {
37
+ if (names === null)
38
+ names = new Set();
39
+ names.add(sym.name === "PromiseFulfilledResult" ? "value" : "reason");
40
+ }
38
41
  }
39
42
  return names;
40
43
  }
@@ -179,15 +182,30 @@ function propNameText(lowerer, name) {
179
182
  * dyn's String() for dyn operands — `{ [field]: v }` where field is a
180
183
  * checked-dynamic param). Values convert through the usual dyn boundary
181
184
  * (dynFrom's domain, functions box); a value with no dyn representation
182
- * fences per property. Spreads copy through dyn.assign in source order;
183
- * accessors stay fenced. */
185
+ * fences per property. Spreads create own data properties in source order;
186
+ * accessors retain their captured getter and setter closures. */
184
187
  export function lowerDynObjectLiteral(lowerer, expr, boxValue) {
185
188
  const loc = locOf(expr);
186
189
  let fields = [];
187
190
  let acc = null;
191
+ let hasAccessors = false;
188
192
  const flushFields = () => {
189
193
  if (fields.length === 0)
190
194
  return;
195
+ if (hasAccessors) {
196
+ for (const field of fields) {
197
+ const descriptor = { kind: "dynObjLit", type: DYN, loc, fields: [
198
+ { key: { kind: "strLit", value: "value", type: STRING, loc }, value: field.value },
199
+ ...["writable", "enumerable", "configurable"].map(name => ({
200
+ key: strLit(name, loc),
201
+ value: { kind: "dynFrom", value: { kind: "boolLit", value: true, type: BOOL, loc }, type: DYN, loc },
202
+ })),
203
+ ] };
204
+ acc = { kind: "libCall", fn: "dyn.defineProperty", args: [acc, lowerer.coerceToExpected(field.key, DYN), descriptor], type: DYN, loc };
205
+ }
206
+ fields = [];
207
+ return;
208
+ }
191
209
  const chunk = { kind: "dynObjLit", fields, type: DYN, loc };
192
210
  acc = acc === null
193
211
  ? chunk
@@ -198,6 +216,7 @@ export function lowerDynObjectLiteral(lowerer, expr, boxValue) {
198
216
  if (ts.isSpreadAssignment(prop)) {
199
217
  flushFields();
200
218
  const raw = lowerer.lowerExpr(prop.expression);
219
+ fenceSymbolFieldCopy(lowerer, prop.expression, raw.type);
201
220
  const source = boxValue
202
221
  ? boxValue(prop.expression, raw)
203
222
  : lowerer.coerceToExpected(raw, DYN);
@@ -205,14 +224,9 @@ export function lowerDynObjectLiteral(lowerer, expr, boxValue) {
205
224
  lowerer.unsupported("SC1101", prop.expression, `spreading '${lowerer.fmt(source.type)}' into a checked-dynamic object literal`);
206
225
  }
207
226
  acc ??= { kind: "dynObjLit", fields: [], type: DYN, loc };
208
- acc = { kind: "libCall", fn: "dyn.assign", args: [acc, source], type: DYN, loc: locOf(prop) };
227
+ acc = { kind: "libCall", fn: "dyn.copyDataProperties", args: [acc, source], type: DYN, loc: locOf(prop) };
209
228
  continue;
210
229
  }
211
- if (!ts.isPropertyAssignment(prop) &&
212
- !ts.isShorthandPropertyAssignment(prop) &&
213
- !ts.isMethodDeclaration(prop)) {
214
- lowerer.unsupported("SC1090", prop, "accessors in a runtime-keyed (computed-key) object literal");
215
- }
216
230
  const name = prop.name;
217
231
  let key;
218
232
  if (ts.isComputedPropertyName(name)) {
@@ -222,10 +236,14 @@ export function lowerDynObjectLiteral(lowerer, expr, boxValue) {
222
236
  }
223
237
  else {
224
238
  let k = lowerer.lowerExpr(name.expression);
225
- if (k.type.kind === "f64" || k.type.kind === "bool" || k.type.kind === "dyn") {
239
+ if (k.type.kind === "symbol")
240
+ k = lowerer.coerceToExpected(k, DYN);
241
+ else if (k.type.kind === "dyn")
242
+ k = { kind: "libCall", fn: "dyn.propertyKey", args: [k], type: DYN, loc: locOf(name) };
243
+ else if (k.type.kind === "f64" || k.type.kind === "bool") {
226
244
  k = { kind: "toString", operand: k, type: STRING, loc: locOf(name) };
227
245
  }
228
- if (k.type.kind !== "string") {
246
+ if (k.type.kind !== "string" && k.type.kind !== "dyn") {
229
247
  lowerer.unsupported("SC1090", name, `'${lowerer.fmt(k.type)}'-typed computed property keys (string, number, boolean, and unknown keys stringify)`);
230
248
  }
231
249
  key = k;
@@ -240,6 +258,25 @@ export function lowerDynObjectLiteral(lowerer, expr, boxValue) {
240
258
  else {
241
259
  lowerer.unsupported("SC1090", prop, "non-identifier property names");
242
260
  }
261
+ if (ts.isGetAccessorDeclaration(prop) || ts.isSetAccessorDeclaration(prop)) {
262
+ flushFields();
263
+ hasAccessors = true;
264
+ acc ??= { kind: "dynObjLit", fields: [], type: DYN, loc };
265
+ if (!isJsSourceFile(expr.getSourceFile()))
266
+ lowerer.rejectThisInObjectMethod(prop.body ?? prop);
267
+ const fn = lowerer.lowerLambda(prop);
268
+ const descriptor = {
269
+ kind: "dynObjLit", type: DYN, loc: locOf(prop), fields: [
270
+ { key: { kind: "strLit", value: ts.isGetAccessorDeclaration(prop) ? "get" : "set", type: STRING, loc }, value: lowerer.coerceToExpected(fn, DYN) },
271
+ ...["enumerable", "configurable"].map(name => ({
272
+ key: strLit(name, loc),
273
+ value: { kind: "dynFrom", value: { kind: "boolLit", value: true, type: BOOL, loc }, type: DYN, loc },
274
+ })),
275
+ ],
276
+ };
277
+ acc = { kind: "libCall", fn: "dyn.defineProperty", args: [acc, lowerer.coerceToExpected(key, DYN), descriptor], type: DYN, loc };
278
+ continue;
279
+ }
243
280
  const valueExpr = ts.isMethodDeclaration(prop)
244
281
  ? prop
245
282
  : ts.isShorthandPropertyAssignment(prop)
@@ -252,8 +289,10 @@ export function lowerDynObjectLiteral(lowerer, expr, boxValue) {
252
289
  const propDiagsBefore = lowerer.diags.length;
253
290
  try {
254
291
  const lowerValue = () => ts.isMethodDeclaration(prop)
255
- ? (lowerer.rejectThisInObjectMethod(prop.body ?? prop), lowerer.lowerLambda(prop))
256
- : lowerer.lowerExpr(valueExpr);
292
+ ? (isJsSourceFile(expr.getSourceFile()) ? lowerer.lowerLambda(prop) : (lowerer.rejectThisInObjectMethod(prop.body ?? prop), lowerer.lowerLambda(prop)))
293
+ : !boxValue && ts.isObjectLiteralExpression(valueExpr)
294
+ ? lowerer.lowerExprExpecting(valueExpr, DYN)
295
+ : lowerer.lowerExpr(valueExpr);
257
296
  raw =
258
297
  fenceClosureProbe(lowerer, valueExpr, undefined, lowerValue) ??
259
298
  lowerValue();
@@ -279,6 +318,11 @@ export function lowerDynObjectLiteral(lowerer, expr, boxValue) {
279
318
  let v = boxValue
280
319
  ? boxValue(valueExpr, raw)
281
320
  : lowerer.coerceToExpected(raw, DYN);
321
+ // A JS object's array-valued properties retain the same source array.
322
+ // Repeated references must compare equal and mutations remain shared.
323
+ if (!boxValue && isJsSourceFile(prop.getSourceFile()) && v.kind === "dynFrom" && v.value.type.kind === "array") {
324
+ v = { ...v, liveRef: true };
325
+ }
282
326
  if (v.type.kind !== "dyn") {
283
327
  const convDiagsBefore = lowerer.diags.length;
284
328
  try {
@@ -307,7 +351,9 @@ export function lowerDynObjectLiteral(lowerer, expr, boxValue) {
307
351
  fields.push({ key, value: v });
308
352
  }
309
353
  flushFields();
310
- return acc ?? { kind: "dynObjLit", fields: [], type: DYN, loc };
354
+ if (acc !== null)
355
+ return acc;
356
+ return { kind: "dynObjLit", fields: [], type: DYN, loc };
311
357
  }
312
358
  /** Spreading a source whose shape carries accessor slots: Node's copy
313
359
  * invokes each getter exactly once in insertion order — even for keys a
@@ -319,6 +365,16 @@ function fenceAccessorSpreadSource(lowerer, prop, srcShape) {
319
365
  lowerer.unsupported("SC1090", prop, "object spread of sources carrying get/set accessor properties (Node invokes each getter once during the copy — the field-copy desugar cannot model the calls; bind the reads to consts first)");
320
366
  }
321
367
  }
368
+ /** Only definitely present later records replace earlier defaults. A
369
+ * callback binding may store undefined despite its checker annotation. */
370
+ function laterSpreadType(lowerer, expr) {
371
+ let source = expr;
372
+ while (ts.isParenthesizedExpression(source))
373
+ source = source.expression;
374
+ if (ts.isIdentifier(source))
375
+ return lowerer.lowerExpr(source).type;
376
+ return lowerer.mapTypeOf(lowerer.typeOf(source));
377
+ }
322
378
  /** The JS trap-closure fallback for FUNCTION-VALUED object properties: a
323
379
  * lambda whose body fails to lower inside a JS object literal becomes a
324
380
  * closure of the field's exact func type whose body is the runtime fence —
@@ -379,33 +435,48 @@ function fenceClosureProbe(lowerer, node, slotType, attempt) {
379
435
  * (excess-property freshness — tsc already enforced it), every arm field
380
436
  * missing from the literal must be optional-flavored (an undefined-armed
381
437
  * union, or a dyn slot — the absent-completion rule), and each present
382
- * field's LITERAL type must fit the member's field type — literal against
383
- * literal decides by VALUE (the discriminant), everything else by the
384
- * widened IR pair under the width-lift relation. Exactly ONE fitting arm
438
+ * field's TypeScript type must fit the member's field type — literal against
439
+ * literal decides by VALUE (the discriminant), everything else through the
440
+ * checker. The chosen arm then directs construction of nested literals;
441
+ * probing their inferred IR layout too early can reject the right arm and
442
+ * select a smaller unrelated record that drops fields. Exactly ONE fitting arm
385
443
  * answers it; zero or several answer null and the caller keeps its
386
- * fences. Plain property-assignment/shorthand literals only — spreads,
387
- * accessors, methods, and unfoldable computed keys keep their own paths. */
444
+ * fences. A spread uses the checker's resulting properties so overridden
445
+ * discriminants and narrowed recursive source arms keep their identity.
446
+ * Accessors, methods, and unfoldable computed keys keep their own paths. */
388
447
  function literalUnionArmOf(lowerer, expr, tsType, recordArms) {
389
448
  if (!tsType.isUnionType())
390
449
  return null;
391
450
  const props = [];
451
+ let hasSpread = false;
392
452
  for (const p of expr.properties) {
393
453
  if (ts.isPropertyAssignment(p) && !ts.isComputedPropertyName(p.name)) {
394
- props.push({ name: propNameText(lowerer, p.name), node: p.initializer });
454
+ props.push({ name: propNameText(lowerer, p.name), type: lowerer.typeOf(p.initializer) });
395
455
  }
396
456
  else if (ts.isShorthandPropertyAssignment(p) && ts.isIdentifier(p.name)) {
397
- props.push({ name: p.name.text, node: p.name });
457
+ props.push({ name: p.name.text, type: lowerer.typeOf(p.name) });
458
+ }
459
+ else if (ts.isSpreadAssignment(p)) {
460
+ hasSpread = true;
398
461
  }
399
462
  else {
400
463
  return null;
401
464
  }
402
465
  }
403
- /** litT fits ftT: unions per arm; literal-vs-literal by value; unit
404
- * types only into their own unit; otherwise the widened IR pair must be
405
- * equal or width-liftable. */
466
+ if (hasSpread) {
467
+ const own = lowerer.typeOf(expr);
468
+ // Conditional/union spreads need runtime selection, not one guessed arm.
469
+ if (own.isUnionType())
470
+ return null;
471
+ props.length = 0;
472
+ for (const property of lowerer.checker.getPropertiesOfType(own)) {
473
+ props.push({ name: property.name, type: lowerer.checker.getTypeOfSymbol(property) });
474
+ }
475
+ }
476
+ /** Cheap literal discriminants avoid checker traffic for unrelated arms.
477
+ * Compound types need the checker's semantic assignability, including
478
+ * recursive unions, never intersections, and contextual empty arrays. */
406
479
  const fits = (litT, ftT) => {
407
- if (ftT.isUnionType())
408
- return ts.constituentTypes(ftT).some((a) => fits(litT, a));
409
480
  if (ftT.isStringLiteralType())
410
481
  return litT.isStringLiteralType() && litT.value === ftT.value;
411
482
  if (ftT.isNumberLiteralType())
@@ -417,13 +488,7 @@ function literalUnionArmOf(lowerer, expr, tsType, recordArms) {
417
488
  return (litT.flags & ts.TypeFlags.Null) !== 0;
418
489
  if (ftT.flags & ts.TypeFlags.Undefined)
419
490
  return (litT.flags & ts.TypeFlags.Undefined) !== 0;
420
- if (litT.flags & (ts.TypeFlags.Null | ts.TypeFlags.Undefined))
421
- return false;
422
- const li = lowerer.mapTypeOf(lowerer.checker.getBaseTypeOfLiteralType(litT));
423
- const fi = lowerer.mapTypeOf(ftT);
424
- if (!li || !fi)
425
- return false;
426
- return typeEquals(li, fi) || lowerer.widthLiftPlan(li, fi) !== null;
491
+ return lowerer.checker.isTypeAssignableTo(litT, ftT);
427
492
  };
428
493
  const armShapeIds = new Set(recordArms.map((a) => a.shapeId));
429
494
  const candidates = new Set();
@@ -456,14 +521,14 @@ function literalUnionArmOf(lowerer, expr, tsType, recordArms) {
456
521
  const sym = lowerer.checker.getPropertyOfType(member, p.name);
457
522
  if (!sym)
458
523
  return false;
459
- return fits(lowerer.typeOf(p.node), lowerer.checker.getTypeOfSymbol(sym));
524
+ return fits(p.type, lowerer.checker.getTypeOfSymbol(sym));
460
525
  });
461
526
  if (fieldsFit)
462
527
  candidates.add(mMapped.shapeId);
463
528
  }
464
529
  if (candidates.size !== 1)
465
530
  return null;
466
- const [only] = candidates;
531
+ const [only] = [...candidates];
467
532
  return recordArms.find((a) => a.shapeId === only) ?? null;
468
533
  }
469
534
  /** Object spread treats nullish sources as empty. Preserve evaluation once,
@@ -499,8 +564,24 @@ function lowerOptionalIndexSpreadSource(lowerer, source, loc) {
499
564
  };
500
565
  return prefix.length === 0 ? selected : { kind: "seqExpr", stmts: prefix, result: selected, type: recordType, loc };
501
566
  }
502
- export function lowerObjectLiteral(lowerer, expr) {
567
+ export function lowerObjectLiteral(lowerer, expr, expected) {
503
568
  const loc = locOf(expr);
569
+ // Module collection already chose checked storage for this JavaScript
570
+ // binding. Construct in that representation: an intermediate record would
571
+ // check nested aliases back into inferred shapes and lose their identity.
572
+ if (isJsSourceFile(expr.getSourceFile()) && ts.isVariableDeclaration(expr.parent) &&
573
+ expr.parent.initializer === expr && ts.isIdentifier(expr.parent.name) &&
574
+ lowerer.globalOf(expr.parent.name)?.type.kind === "dyn") {
575
+ return lowerDynObjectLiteral(lowerer, expr);
576
+ }
577
+ // A checked spread carries runtime symbol keys and receiver-sensitive
578
+ // methods absent from its inferred record shape. Copy the real properties.
579
+ if (!expected && isJsSourceFile(expr.getSourceFile()) && expr.properties.some((property) => ts.isSpreadAssignment(property) && tryLowerExpression(lowerer, property.expression)?.type.kind === "dyn")) {
580
+ return lowerDynObjectLiteral(lowerer, expr);
581
+ }
582
+ const unionClone = lowerUnionRecordClone(lowerer, expr);
583
+ if (unionClone !== null)
584
+ return unionClone;
504
585
  // The RUNTIME-KEYED literal (JS): a computed key that doesn't fold to a
505
586
  // compile-time string means the literal's shape is not a compile-time
506
587
  // fact — no record shape can hold it. The whole literal builds as a dyn
@@ -578,6 +659,10 @@ export function lowerObjectLiteral(lowerer, expr) {
578
659
  lowerer.rejectThisInObjectMethod(prop.body ?? prop);
579
660
  }
580
661
  let tsType = lowerer.checker.getContextualType(expr) ?? lowerer.typeOf(expr);
662
+ // `as never` supplies no construction layout. Keep the literal's own
663
+ // fields so an exhaustiveness witness cannot erase a reachable value.
664
+ if (lowerer.checker.isNeverType(tsType))
665
+ tsType = lowerer.typeOf(expr);
581
666
  // `lit satisfies T` is TYPE-LEVEL only: the expression's checker type —
582
667
  // and therefore the shape every downstream consumer sees — is the
583
668
  // literal's OWN type (T still contextually types members, so inferred
@@ -609,6 +694,13 @@ export function lowerObjectLiteral(lowerer, expr) {
609
694
  tsType = lowerer.checker.getAwaitedType(tsType) ?? tsType;
610
695
  }
611
696
  let mapped = lowerer.mapTypeOf(tsType);
697
+ // A checked-dynamic source has runtime keys even when later explicit
698
+ // fields make the literal's inferred type look like a fixed record.
699
+ // Keep a checked-dynamic destination in that representation so copying
700
+ // preserves keys, evaluation order, and fields overwritten afterwards.
701
+ if (mapped?.kind === "dyn" && expr.properties.some((p) => ts.isSpreadAssignment(p) && lowerer.mapTypeOf(lowerer.typeOf(p.expression))?.kind === "dyn")) {
702
+ return lowerDynObjectLiteral(lowerer, expr);
703
+ }
612
704
  // A JavaScript call can contextually type an object literal as string even
613
705
  // though the literal itself is a record. Keep its own shape so a caller
614
706
  // performing ToString can convert it after the value is built.
@@ -675,7 +767,11 @@ export function lowerObjectLiteral(lowerer, expr) {
675
767
  // gate DECLINED it (a project-declared typedef that absorbed to the
676
768
  // island through checker-`any` field residue): the literal builds at
677
769
  // its own type like every unmappable context.
678
- if (mapped === null || mapped.kind === "union" || mapped.kind === "dyn" || mapped.kind === "object" || mapped.kind === "jsval") {
770
+ // An index-signature literal can inherit a callable contextual type for
771
+ // a prototype-named DATA property (notably `toString`). Object literals
772
+ // have no call signature; construct their own data shape and let the
773
+ // surrounding assignment/assertion enforce the destination contract.
774
+ if (mapped === null || mapped.kind === "union" || mapped.kind === "dyn" || mapped.kind === "object" || mapped.kind === "jsval" || mapped.kind === "func") {
679
775
  const ctxUnion = mapped?.kind === "union" ? mapped : null;
680
776
  mapped = lowerer.mapTypeOf(lowerer.typeOf(expr)) ?? mapped;
681
777
  // A literal whose own shape re-tags into NO arm of the contextual
@@ -697,7 +793,10 @@ export function lowerObjectLiteral(lowerer, expr) {
697
793
  if (recordArms.length === 1) {
698
794
  const armShape = lowerer.shapes.get(recordArms[0].shapeId);
699
795
  if ((mapped?.kind !== "record" || mapped.shapeId !== recordArms[0].shapeId) &&
700
- !armShape?.tuple) {
796
+ !armShape?.tuple &&
797
+ // `{} | undefined` supplies no layout for a populated options
798
+ // literal, just as a bare empty-record context supplies none.
799
+ (expr.properties.length === 0 || (armShape && (armShape.fields.length > 0 || armShape.indexValue)))) {
701
800
  mapped = recordArms[0];
702
801
  }
703
802
  }
@@ -715,7 +814,11 @@ export function lowerObjectLiteral(lowerer, expr) {
715
814
  // exactly ONE member fits, build AS that arm — its field types
716
815
  // drive every property's coercion, exactly the single-record-arm
717
816
  // rule above. Ambiguous literals keep the SC2003 fence.
718
- if (ownShapeId === null || !recordArms.some((a) => a.shapeId === ownShapeId)) {
817
+ // Recursive arms can have identical stored field layouts while
818
+ // retaining distinct nominal knots. An inferred spread shape can
819
+ // match the wrong knot, so consult discriminants even if that shape
820
+ // already appears in the union.
821
+ if (ownShapeId === null || !recordArms.some((a) => a.shapeId === ownShapeId) || expr.properties.some(ts.isSpreadAssignment)) {
719
822
  const arm = literalUnionArmOf(lowerer, expr, tsType, recordArms);
720
823
  if (arm)
721
824
  mapped = arm;
@@ -767,13 +870,35 @@ export function lowerObjectLiteral(lowerer, expr) {
767
870
  // descriptor records with `any` values) — builds as a dyn OBJECT:
768
871
  // each field converts through the usual dyn boundary, and dynamic
769
872
  // consumers ride the keyed-dyn paths. TypeScript keeps the fence.
770
- if ((!mapped || mapped.kind === "dyn") && isJsSourceFile(expr.getSourceFile())) {
873
+ if (mapped?.kind === "dyn" || (!mapped && isJsSourceFile(expr.getSourceFile()))) {
771
874
  return lowerDynObjectLiteral(lowerer, expr);
772
875
  }
773
876
  if (!mapped || mapped.kind !== "record")
774
877
  lowerer.badType(expr, tsType);
775
878
  let type = mapped;
879
+ // A fresh, plain literal can construct its fields directly for a known
880
+ // destination with the same field set. This matters for inferred
881
+ // conditional records: an empty array in one arm has no element layout
882
+ // until the join supplies it. Existing values still use width coercion;
883
+ // extra fields, spreads, accessors, and keyed shapes retain their paths.
884
+ if (expected && !isJsSourceFile(expr.getSourceFile()) &&
885
+ expr.properties.every((p) => ts.isPropertyAssignment(p) || ts.isShorthandPropertyAssignment(p))) {
886
+ const own = lowerer.shapes.get(type.shapeId);
887
+ const target = lowerer.shapes.get(expected.shapeId);
888
+ if (!own.tuple && !target.tuple && !own.indexValue && !target.indexValue &&
889
+ !shapeHasAccessorSlots(own) && !shapeHasAccessorSlots(target) &&
890
+ target.fields.every((field) => own.fields.some((candidate) => candidate.name === field.name) ||
891
+ field.type.kind === "union" && lowerer.armTag(field.type.unionId, UNDEFINED_T) >= 0) &&
892
+ own.fields.every((field) => target.fields.some((candidate) => candidate.name === field.name))) {
893
+ type = { kind: "record", shapeId: expected.shapeId };
894
+ }
895
+ }
776
896
  let shape = lowerer.shapes.get(type.shapeId);
897
+ // JavaScript Dates carry native object identity in checked storage. An
898
+ // inferred scalar Date field would erase that identity before boxing.
899
+ if (isJsSourceFile(expr.getSourceFile()) && shape.fields.some((field) => field.type.kind === "date")) {
900
+ return lowerDynObjectLiteral(lowerer, expr);
901
+ }
777
902
  // ACCESSOR properties, JS literals only (TS accessors fill the shape's
778
903
  // %get:/%set: closure slots below): no record storage exists for them,
779
904
  // so the literal's shape NARROWS to its plain fields (reads resolve
@@ -793,21 +918,20 @@ export function lowerObjectLiteral(lowerer, expr) {
793
918
  }
794
919
  const fieldTypes = new Map(shape.fields.map((f) => [f.name, f.type]));
795
920
  // File-scope JavaScript object bindings live in the checked-dynamic tree
796
- // to preserve open writes and identity. Build an optional-field literal
797
- // from its actually written keys so Object.hasOwn can distinguish an
798
- // omitted property from a present property whose value is undefined.
921
+ // to preserve open writes and identity. The checker can infer fields
922
+ // from later writes; those fields must remain absent when the literal
923
+ // is first evaluated.
799
924
  const topLevelJsDecl = ts.isVariableDeclaration(expr.parent) &&
800
925
  expr.parent.initializer === expr &&
801
- ts.isVariableStatement(expr.parent.parent.parent) &&
802
- ts.isSourceFile(expr.parent.parent.parent.parent);
926
+ ts.isVariableStatement(expr.parent?.parent?.parent) &&
927
+ ts.isSourceFile(expr.parent?.parent?.parent?.parent);
803
928
  const assignedProperties = expr.properties.filter((prop) => ts.isPropertyAssignment(prop) || ts.isShorthandPropertyAssignment(prop));
804
929
  if (topLevelJsDecl && isJsSourceFile(expr.getSourceFile()) &&
805
930
  assignedProperties.length === expr.properties.length) {
806
931
  const provided = new Set(assignedProperties.map((prop) => propNameText(lowerer, prop.name)));
807
- const omittedOptional = shape.fields.some((field) => !provided.has(field.name) && field.type.kind === "union" &&
808
- lowerer.armTag(field.type.unionId, UNDEFINED_T) >= 0);
809
- if (omittedOptional)
932
+ if (shape.fields.some((field) => !provided.has(field.name))) {
810
933
  return lowerDynObjectLiteral(lowerer, expr);
934
+ }
811
935
  }
812
936
  // The clone probe may lower the leading spread before declining (a
813
937
  // static `as` cast can make the checker-visible shape match while its
@@ -982,15 +1106,10 @@ export function lowerObjectLiteral(lowerer, expr) {
982
1106
  lowerer.unsupported("SC1090", prop.name, "computed property keys (compile-time-known keys fold — a pure expression whose checker type is one string or number literal: consts, enum members, quoted keys, templates of those — `{ [MARKER]: v }`; runtime string keys write through an index-signature target; symbol keys stay out)");
983
1107
  }
984
1108
  }
985
- // A DECLARED-fields target built ENTIRELY from index-signature spreads —
986
- // `{ ...Object.fromEntries(...), ...Object.fromEntries(...) }` typed
987
- // AppConfig (the defaults-merge idiom over runtime-keyed sources): the
988
- // field-by-field desugar cannot enumerate runtime keys, so the literal
989
- // lowers as ONE interned merge-helper call — sources evaluate once each
990
- // in source order (the call's argument order — computed sources
991
- // included, no re-read), contributors apply in order with per-key
992
- // dispatch onto the declared fields (JS last-write-wins). Divergence 68
993
- // has the runtime rules (validated collisions, extra keys dropped).
1109
+ // A declared destination combining fixed records and runtime-keyed
1110
+ // sources needs both layouts. Apply each source before evaluating the
1111
+ // next expression, with checked overflow collisions and optional-field
1112
+ // completion. Extra runtime keys follow the declared-shape width policy.
994
1113
  if (!shape.indexValue &&
995
1114
  !shape.tuple &&
996
1115
  shape.fields.length > 0 &&
@@ -998,7 +1117,7 @@ export function lowerObjectLiteral(lowerer, expr) {
998
1117
  expr.properties.every((p) => ts.isSpreadAssignment(p) && !conditionalSpreadOf(p.expression)) &&
999
1118
  expr.properties.some((p) => {
1000
1119
  const t = lowerer.mapTypeOf(lowerer.typeOf(p.expression));
1001
- return t?.kind === "record" && !!lowerer.shapes.get(t.shapeId)?.indexValue;
1120
+ return t?.kind === "dyn" || t?.kind === "record" && !!lowerer.shapes.get(t.shapeId)?.indexValue;
1002
1121
  })) {
1003
1122
  return lowerDeclaredSpreadMerge(lowerer, expr, type, shape, loc);
1004
1123
  }
@@ -1010,6 +1129,16 @@ export function lowerObjectLiteral(lowerer, expr) {
1010
1129
  throw new PoisonError();
1011
1130
  };
1012
1131
  const fields = [];
1132
+ const spreadStmts = [];
1133
+ const hasSpread = expr.properties.some(ts.isSpreadAssignment);
1134
+ const captured = new Set();
1135
+ const capture = (value) => {
1136
+ const local = lowerer.declareHiddenLocal("%spreadValue", value.type);
1137
+ spreadStmts.push({ kind: "varDecl", localId: local.id, init: value, loc: value.loc });
1138
+ const ref = varRef(local.id, value.type, value.loc);
1139
+ captured.add(ref);
1140
+ return ref;
1141
+ };
1013
1142
  // Field names introduced by conditional spreads: their ternary carries
1014
1143
  // the spread's whole evaluation (cond once, value lazily), so a LATER
1015
1144
  // contributor overriding one would silently drop that evaluation —
@@ -1019,6 +1148,21 @@ export function lowerObjectLiteral(lowerer, expr) {
1019
1148
  // member reads narrow away; see the catch in the property loop).
1020
1149
  const droppedNames = new Set();
1021
1150
  for (const prop of expr.properties) {
1151
+ // A later contributor can mutate an earlier source or overwrite a
1152
+ // value with effects. Snapshot pending fields at their source position,
1153
+ // before evaluating the next contributor, even if they are overwritten.
1154
+ if (hasSpread) {
1155
+ for (let i = 0; i < fields.length; i++) {
1156
+ const field = fields[i];
1157
+ if (field.drop) {
1158
+ spreadStmts.push({ kind: "exprStmt", expr: field.value, loc: field.value.loc });
1159
+ fields.splice(i--, 1);
1160
+ continue;
1161
+ }
1162
+ if (!captured.has(field.value))
1163
+ field.value = capture(field.value);
1164
+ }
1165
+ }
1022
1166
  if (ts.isSpreadAssignment(prop)) {
1023
1167
  const cs = conditionalSpreadOf(prop.expression);
1024
1168
  if (cs && cs !== "unsupported") {
@@ -1035,7 +1179,7 @@ export function lowerObjectLiteral(lowerer, expr) {
1035
1179
  if (shape.indexValue) {
1036
1180
  lowerer.unsupported("SC1090", prop, "conditional spreads into index-signature keys (overflow entries model presence — write the key in an if statement instead)");
1037
1181
  }
1038
- throw shapeMismatch(prop);
1182
+ shapeMismatch(prop);
1039
1183
  }
1040
1184
  const absent = lowerer.wrappedUndefined(fieldType, locOf(prop));
1041
1185
  if (!absent) {
@@ -1070,28 +1214,22 @@ export function lowerObjectLiteral(lowerer, expr) {
1070
1214
  // shape. Every source field must land on the target shape with an
1071
1215
  // equal type (a wider source would silently DROP fields JS keeps —
1072
1216
  // the width fence, same as literals). Later contributors override
1073
- // earlier ones (JS last-write-wins; the reads are side-effect-free,
1074
- // so dropping the earlier read is exact). Identifier sources
1075
- // re-read per field (historic path); any OTHER source must be a
1076
- // re-emittable pure read, sharing one lowered node per field.
1077
- // The desugar's one-entry-per-name list reads spread fields
1078
- // EAGERLY at the spread's position, so an explicit property
1079
- // BEFORE a spread would need JS's overwrite — order-fenced (the
1080
- // index-signature merge path above takes any order).
1081
- if (expr.properties
1082
- .slice(0, expr.properties.indexOf(prop))
1083
- .some((p) => !ts.isSpreadAssignment(p))) {
1084
- lowerer.unsupported("SC1090", prop, "object spread after explicit properties (spreads must come first — a later spread would overwrite them with JS semantics the desugar does not model)");
1085
- }
1217
+ // earlier ones (JS last-write-wins). Evaluate the source exactly
1218
+ // once, including empty sources and those whose fields are all
1219
+ // overridden. Field snapshots above preserve the copy order.
1086
1220
  let srcNode = prop.expression;
1087
1221
  while (ts.isParenthesizedExpression(srcNode))
1088
1222
  srcNode = srcNode.expression;
1089
- const srcLowered = prop === expr.properties[0] && leadingSpreadLowered !== null
1223
+ const srcLowered = capture(prop === expr.properties[0] && leadingSpreadLowered !== null
1090
1224
  ? leadingSpreadLowered
1091
- : ts.isIdentifier(srcNode)
1092
- ? null
1093
- : lowerer.lowerExpr(srcNode);
1094
- const srcType = srcLowered ? srcLowered.type : lowerer.mapTypeOf(lowerer.typeOf(srcNode));
1225
+ : lowerer.lowerExpr(srcNode));
1226
+ // Array callbacks can receive a record-or-undefined ABI even when
1227
+ // TypeScript describes a required record. Select the copy strategy
1228
+ // from that stored representation so absent sources copy nothing.
1229
+ // Checked-dynamic bindings still use the checker's field contract.
1230
+ const srcType = srcLowered.type.kind === "dyn"
1231
+ ? lowerer.mapTypeOf(lowerer.typeOf(srcNode))
1232
+ : srcLowered.type;
1095
1233
  // `...options.installConfig` — a spread of `Partial<X> | undefined`
1096
1234
  // (the optional-options merge idiom `{ ...DEFAULTS, ...overrides }`):
1097
1235
  // JS spreads nothing for the unit arm and copies present keys
@@ -1108,9 +1246,6 @@ export function lowerObjectLiteral(lowerer, expr) {
1108
1246
  !def.arms.every((a) => a.kind === "record" || isUnitType(a))) {
1109
1247
  lowerer.unsupported("SC1090", prop, `object spread of '${lowerer.fmt(srcType)}' sources (only known record shapes spread — ${NARROW_FIRST})`);
1110
1248
  }
1111
- if (srcLowered && !isSafeToRepeat(srcLowered)) {
1112
- lowerer.unsupported("SC1090", prop, "object spread of computed sources (the field copies re-read the source — bind it to a const first)");
1113
- }
1114
1249
  const recArm = recArms[0];
1115
1250
  const recTag = def.arms.indexOf(recArm);
1116
1251
  // A checked-dynamic VALUE under the union-mapped checker type
@@ -1133,7 +1268,7 @@ export function lowerObjectLiteral(lowerer, expr) {
1133
1268
  if (ts.isSpreadAssignment(later)) {
1134
1269
  if (conditionalSpreadOf(later.expression))
1135
1270
  continue;
1136
- const lt = lowerer.mapTypeOf(lowerer.typeOf(later.expression));
1271
+ const lt = laterSpreadType(lowerer, later.expression);
1137
1272
  if (lt?.kind === "record") {
1138
1273
  for (const lf of lowerer.shapes.get(lt.shapeId)?.fields ?? [])
1139
1274
  laterNames.add(lf.name);
@@ -1234,9 +1369,6 @@ export function lowerObjectLiteral(lowerer, expr) {
1234
1369
  if (srcType?.kind !== "record") {
1235
1370
  lowerer.unsupported("SC1090", prop, `object spread of '${srcType ? lowerer.fmt(srcType) : lowerer.checker.typeToString(lowerer.typeOf(srcNode))}' sources (only known record shapes spread — ${NARROW_FIRST})`);
1236
1371
  }
1237
- if (srcLowered && !isSafeToRepeat(srcLowered)) {
1238
- lowerer.unsupported("SC1090", prop, "object spread of computed sources (the field copies re-read the source — bind it to a const first)");
1239
- }
1240
1372
  const srcShape = lowerer.shapes.get(srcType.shapeId);
1241
1373
  if (!srcShape)
1242
1374
  throw new InternalCompilerError(`lowerer bug: spread of unknown shape ${srcType.shapeId}`);
@@ -1258,7 +1390,7 @@ export function lowerObjectLiteral(lowerer, expr) {
1258
1390
  if (ts.isSpreadAssignment(later)) {
1259
1391
  if (conditionalSpreadOf(later.expression))
1260
1392
  continue;
1261
- const lt = lowerer.mapTypeOf(lowerer.typeOf(later.expression));
1393
+ const lt = laterSpreadType(lowerer, later.expression);
1262
1394
  if (lt?.kind === "record") {
1263
1395
  for (const lf of lowerer.shapes.get(lt.shapeId)?.fields ?? [])
1264
1396
  laterNames.add(lf.name);
@@ -1372,7 +1504,7 @@ export function lowerObjectLiteral(lowerer, expr) {
1372
1504
  if (fieldTypes.has(name)) {
1373
1505
  lowerer.unsupported("SC1090", prop, `a get/set accessor satisfying the data property '${name}' of '${lowerer.fmt(type)}' (the record slot stores a plain value — Node would keep the accessor live through this type)`);
1374
1506
  }
1375
- throw shapeMismatch(prop);
1507
+ shapeMismatch(prop);
1376
1508
  }
1377
1509
  const closure = lowerer.coerceInto(prop, lowerer.lowerLambda(prop), slotT);
1378
1510
  if (!typeEquals(closure.type, slotT))
@@ -1396,7 +1528,7 @@ export function lowerObjectLiteral(lowerer, expr) {
1396
1528
  // side effects; calls resolve statically against this declaration);
1397
1529
  // a computed initializer would need its evaluation kept — fenced.
1398
1530
  if (!fieldType && !ts.isSpreadAssignment(prop)) {
1399
- const memberSym = prop.name && lowerer.checker.getSymbolAtLocation(prop.name);
1531
+ const memberSym = prop.name ? lowerer.checker.getSymbolAtLocation(prop.name) : undefined;
1400
1532
  const memberT = memberSym ? lowerer.checker.getTypeOfSymbol(memberSym) : undefined;
1401
1533
  if (memberT && isGenericCallableMemberType(memberT, lowerer.checker)) {
1402
1534
  const pureInit = (() => {
@@ -1436,7 +1568,7 @@ export function lowerObjectLiteral(lowerer, expr) {
1436
1568
  }
1437
1569
  continue;
1438
1570
  }
1439
- throw shapeMismatch(prop);
1571
+ shapeMismatch(prop);
1440
1572
  }
1441
1573
  let value;
1442
1574
  let valueNode = prop;
@@ -1444,17 +1576,15 @@ export function lowerObjectLiteral(lowerer, expr) {
1444
1576
  try {
1445
1577
  if (ts.isPropertyAssignment(prop)) {
1446
1578
  valueNode = prop.initializer;
1447
- // ARRAY-LITERAL initializers route through the expected-type
1448
- // lowering: a union field with one array-family arm builds the
1449
- // literal AS that arm (lowerExprExpecting's IR-directed rule —
1450
- // the option-table `default: [{ value: [] }]` shape), where the
1451
- // bare lowering would take the JS dyn fallback and fence.
1579
+ // Fresh construction gets the field's destination before lowering
1580
+ // nested arrays, records, or conditional branches. Existing values
1581
+ // retain their runtime representation until the field coercion.
1452
1582
  let init = prop.initializer;
1453
- while (ts.isParenthesizedExpression(init))
1583
+ while (ts.isParenthesizedExpression(init) || ts.isSatisfiesExpression(init))
1454
1584
  init = init.expression;
1455
1585
  value =
1456
1586
  fenceClosureProbe(lowerer, prop.initializer, fieldType, () => lowerer.lowerExpr(prop.initializer)) ??
1457
- (fieldType !== undefined && ts.isArrayLiteralExpression(init)
1587
+ (fieldType !== undefined && (ts.isArrayLiteralExpression(init) || ts.isObjectLiteralExpression(init) || ts.isConditionalExpression(init))
1458
1588
  ? lowerer.lowerExprExpecting(prop.initializer, fieldType)
1459
1589
  : lowerer.lowerExpr(prop.initializer));
1460
1590
  }
@@ -1466,7 +1596,7 @@ export function lowerObjectLiteral(lowerer, expr) {
1466
1596
  fenceClosureProbe(lowerer, prop, fieldType, () => lowerer.lowerLambda(prop)) ?? lowerer.lowerLambda(prop);
1467
1597
  }
1468
1598
  else {
1469
- lowerer.unsupported("SC1090", prop, `syntax '${ts.SyntaxKind[prop.kind]}'`);
1599
+ lowerer.unsupported("SC1090", prop, `syntax '${ts.syntaxKindName(prop.kind)}'`);
1470
1600
  }
1471
1601
  }
1472
1602
  catch (err) {
@@ -1525,11 +1655,10 @@ export function lowerObjectLiteral(lowerer, expr) {
1525
1655
  fields.splice(at, 1);
1526
1656
  fields.push({ name, value });
1527
1657
  }
1528
- // Optional fields (undefined-armed union slots) may be omitted: the
1529
- // absent field holds the interned undefined arm, exactly like writing
1530
- // `a: undefined` (without exactOptionalPropertyTypes tsc treats the two
1531
- // the same, and only optional fields may be omitted — tsc rejects
1532
- // omission of required fields before lowering, undefined-armed or not).
1658
+ // Optional fields may be omitted: the absent field holds an undefined
1659
+ // union arm or, for an island handle slot, the engine's undefined cell.
1660
+ // This matches writing `a: undefined` without exactOptionalPropertyTypes;
1661
+ // tsc rejects omission of required fields before lowering.
1533
1662
  // A REQUIRED missing field keeps the shape-mismatch rejection (possible
1534
1663
  // through `as`: the cast smuggles a narrower literal past freshness).
1535
1664
  if (droppedNames.size > 0) {
@@ -1547,13 +1676,137 @@ export function lowerObjectLiteral(lowerer, expr) {
1547
1676
  // property reads as undefined in Node, and a dyn slot holds
1548
1677
  // exactly that (the options-record call shape against
1549
1678
  // `{ plugins: unknown, ... }` — a JS caller the checker admits).
1550
- const absent = lowerer.wrappedUndefined(f.type, loc) ?? (f.type.kind === "dyn" ? dynUndefinedExpr(loc) : null);
1679
+ const optional = ((lowerer.checker.getPropertyOfType(tsType, f.name)?.flags ?? 0) & ts.SymbolFlags.Optional) !== 0;
1680
+ const absentHandle = f.type.kind === "jsval" && optional
1681
+ ? { kind: "jsOp", op: "undefLit", args: [], type: JSVAL, loc }
1682
+ : null;
1683
+ const absent = lowerer.wrappedUndefined(f.type, loc) ??
1684
+ (f.type.kind === "dyn" ? dynUndefinedExpr(loc) : null) ??
1685
+ absentHandle;
1551
1686
  if (!absent)
1552
- throw shapeMismatch(expr); // only optional (undefined-armed) and 'unknown' fields may be omitted
1687
+ shapeMismatch(expr); // only optional and 'unknown' fields may be omitted
1553
1688
  fields.push({ name: f.name, value: absent });
1554
1689
  }
1555
1690
  }
1556
- return { kind: "recordLit", fields, type, loc };
1691
+ const result = { kind: "recordLit", fields, type, loc };
1692
+ return spreadStmts.length === 0 ? result : { kind: "seqExpr", stmts: spreadStmts, result, type, loc };
1693
+ }
1694
+ /** A union of plain records can preserve its existing variant while
1695
+ * replacing shared fields. Dispatch before constructing the copy: only
1696
+ * the selected arm evaluates overrides, and recordClone snapshots fields
1697
+ * before an override can mutate the original. Nested references retain
1698
+ * their identity. Changing a discriminator or adding variant-specific
1699
+ * fields needs a different result layout and stays on the ordinary path. */
1700
+ function lowerUnionRecordClone(lowerer, expr) {
1701
+ if (isJsSourceFile(expr.getSourceFile()))
1702
+ return null;
1703
+ const spread = expr.properties[0];
1704
+ if (!spread || !ts.isSpreadAssignment(spread))
1705
+ return null;
1706
+ let sourceNode = spread.expression;
1707
+ while (ts.isParenthesizedExpression(sourceNode) || ts.isSatisfiesExpression(sourceNode))
1708
+ sourceNode = sourceNode.expression;
1709
+ // Conditional spreads construct optional keys, including the empty arm.
1710
+ // Their dedicated lowering owns that layout rather than a union clone.
1711
+ if (ts.isConditionalExpression(sourceNode))
1712
+ return null;
1713
+ const sourceType = lowerer.mapTypeOf(lowerer.typeOf(spread.expression));
1714
+ if (sourceType?.kind !== "union")
1715
+ return null;
1716
+ const def = lowerer.unions.get(sourceType.unionId);
1717
+ if (!def || def.arms.length < 2 || !def.arms.every((arm) => arm.kind === "record"))
1718
+ return null;
1719
+ const props = [];
1720
+ const names = [];
1721
+ for (const prop of expr.properties.slice(1)) {
1722
+ if ((!ts.isPropertyAssignment(prop) && !ts.isShorthandPropertyAssignment(prop)) ||
1723
+ (!ts.isIdentifier(prop.name) && !ts.isStringLiteral(prop.name)))
1724
+ return null;
1725
+ const name = prop.name.text;
1726
+ if (names.includes(name) || name === def.discriminant?.field || name === "__proto__")
1727
+ return null;
1728
+ props.push(prop);
1729
+ names.push(name);
1730
+ }
1731
+ for (const arm of def.arms) {
1732
+ if (arm.kind !== "record")
1733
+ return null;
1734
+ const shape = lowerer.shapes.get(arm.shapeId);
1735
+ if (!shape || shape.indexValue || shape.tuple || shapeHasAccessorSlots(shape) ||
1736
+ !names.every((name) => shape.fields.some((field) => field.name === name)))
1737
+ return null;
1738
+ for (let index = 0; index < props.length; index++) {
1739
+ const prop = props[index];
1740
+ const node = ts.isPropertyAssignment(prop) ? prop.initializer : prop.name;
1741
+ const valueType = lowerer.mapTypeOf(lowerer.typeOf(node));
1742
+ const fieldType = shape.fields.find((field) => field.name === names[index]).type;
1743
+ const lift = valueType ? lowerer.widthLiftPlan(valueType, fieldType) : null;
1744
+ // The inferred result must retain an override's own fields and
1745
+ // aliases. A structural copy into the source field's narrower shape
1746
+ // would silently reshape an unannotated spread expression.
1747
+ if (!lift)
1748
+ return null;
1749
+ if (lift.how === "retag" && valueType?.kind === "union" && fieldType.kind === "union") {
1750
+ const from = lowerer.unions.get(valueType.unionId);
1751
+ const to = lowerer.unions.get(fieldType.unionId);
1752
+ const plan = from && to ? planUnionRetag(from, to, (id) => lowerer.shapes.get(id), (source, target) => lowerer.widthLiftPlan(source, target)) : null;
1753
+ if (!plan || !plan.every((arm) => arm.kind === "direct"
1754
+ ? arm.route.lift.how === "copy" || arm.route.lift.how === "upcast"
1755
+ : arm.kind === "discriminant" && arm.routes.every((route) => route.lift.how === "copy" || route.lift.how === "upcast")))
1756
+ return null;
1757
+ }
1758
+ else if (lift.how !== "copy" && lift.how !== "wrap" && lift.how !== "upcast")
1759
+ return null;
1760
+ }
1761
+ }
1762
+ let source = lowerer.lowerExpr(spread.expression);
1763
+ // Hidden runtime absence must never be mistaken for a record payload.
1764
+ // An earlier guard can remove that arm; an unguarded optional spread
1765
+ // still needs a destination able to represent the empty copy.
1766
+ if (!typeEquals(source.type, sourceType) && source.type.kind === "union" && ts.isIdentifier(spread.expression)) {
1767
+ const local = lowerer.resolveLocal(spread.expression);
1768
+ const symbol = lowerer.resolveValueSymbol(spread.expression);
1769
+ const captured = local?.boxed === true || symbol && lowerer.ctx.captureBySymbol.has(symbol);
1770
+ if (local && !captured && !lowerer.runtimeOptionalLocals.has(lowerer.runtimeOptionalRootOf(local))) {
1771
+ const helper = lowerer.narrowedRetagHelper(spread.expression, source.type.unionId, sourceType.unionId, source.loc);
1772
+ if (helper)
1773
+ source = { kind: "call", callee: helper, args: [source], type: sourceType, loc: source.loc };
1774
+ }
1775
+ }
1776
+ if (!typeEquals(source.type, sourceType)) {
1777
+ lowerer.unsupported("SC1090", spread, "a union record clone whose stored source still includes absence");
1778
+ }
1779
+ const loc = locOf(expr);
1780
+ const saved = lowerer.declareHiddenLocal("%unionClone", sourceType);
1781
+ const ref = varRef(saved.id, sourceType, loc);
1782
+ let result = null;
1783
+ for (let tag = def.arms.length - 1; tag >= 0; tag--) {
1784
+ const arm = def.arms[tag];
1785
+ if (arm.kind !== "record")
1786
+ throw new InternalCompilerError("union clone arm is not a record");
1787
+ const shape = lowerer.shapes.get(arm.shapeId);
1788
+ const overrides = [];
1789
+ for (let index = 0; index < props.length; index++) {
1790
+ const prop = props[index];
1791
+ const name = names[index];
1792
+ const fieldType = shape.fields.find((field) => field.name === name).type;
1793
+ const value = ts.isPropertyAssignment(prop)
1794
+ ? lowerer.lowerExprExpecting(prop.initializer, fieldType)
1795
+ : lowerer.coerceInto(prop, lowerer.lowerShorthandValue(prop), fieldType);
1796
+ overrides.push({ name, value });
1797
+ }
1798
+ const clone = { kind: "recordClone",
1799
+ source: { kind: "unionNarrow", value: ref, unionId: sourceType.unionId, tag, type: arm, loc },
1800
+ overrides, type: arm, loc };
1801
+ const wrapped = { kind: "unionWrap", value: clone, unionId: sourceType.unionId, tag, type: sourceType, loc };
1802
+ result = result === null ? wrapped : {
1803
+ kind: "ternary", cond: { kind: "unionIsTag", value: ref, unionId: sourceType.unionId, tag, negated: false, type: BOOL, loc },
1804
+ then: wrapped, else_: result, type: sourceType, loc,
1805
+ };
1806
+ }
1807
+ if (result === null)
1808
+ throw new InternalCompilerError("union clone has no arms");
1809
+ return { kind: "seqExpr", stmts: [{ kind: "varDecl", localId: saved.id, init: source, loc }], result, type: sourceType, loc };
1557
1810
  }
1558
1811
  /** Parses the conditional-spread idiom `...(c ? { k: v, ... } : {})`
1559
1812
  * (either orientation). Returns the condition, the non-empty arm's
@@ -1612,17 +1865,22 @@ export function conditionalSpreadOf(expr) {
1612
1865
  * untyped copy would store the lie) — and a key naming NO declared field
1613
1866
  * is DROPPED (the shape cannot represent it; Node keeps it invisibly —
1614
1867
  * divergence 68). Later contributors overwrite earlier ones
1615
- * (last-write-wins). Sources must be PURE index-signature records. */
1868
+ * (last-write-wins). Fixed, hybrid, and pure index records may contribute. */
1616
1869
  function lowerDeclaredSpreadMerge(lowerer, expr, type, shape, loc) {
1617
1870
  const srcs = [];
1618
1871
  for (const prop of expr.properties) {
1619
1872
  const spread = prop; // caller-checked: all spreads
1620
1873
  const value = lowerer.lowerExpr(spread.expression);
1874
+ if (value.type.kind === "dyn") {
1875
+ srcs.push({ value, shapeId: "dyn" });
1876
+ continue;
1877
+ }
1621
1878
  const srcShape = value.type.kind === "record" ? lowerer.shapes.get(value.type.shapeId) : undefined;
1622
- if (value.type.kind !== "record" || !srcShape?.indexValue || srcShape.tuple || srcShape.fields.length > 0) {
1623
- lowerer.unsupported("SC1090", prop, `object spread of '${lowerer.fmt(value.type)}' into '${lowerer.fmt(type)}' (only PURE index-signature records — Object.fromEntries results, Record<string, T> values — spread into a declared shape)`);
1879
+ if (value.type.kind !== "record" || !srcShape || srcShape.tuple) {
1880
+ lowerer.unsupported("SC1090", prop, `object spread of '${lowerer.fmt(value.type)}' into '${lowerer.fmt(type)}' (only records spread into a declared shape)`);
1624
1881
  }
1625
- srcs.push({ value, shapeId: value.type.shapeId, iv: srcShape.indexValue });
1882
+ fenceAccessorSpreadSource(lowerer, prop, srcShape);
1883
+ srcs.push({ value, shapeId: value.type.shapeId, shape: srcShape });
1626
1884
  }
1627
1885
  // Every target field must be optional: absent keys leave the undefined
1628
1886
  // arm, exactly the unset-optional representation.
@@ -1685,75 +1943,109 @@ function lowerDeclaredSpreadMerge(lowerer, expr, type, shape, loc) {
1685
1943
  }
1686
1944
  lowerer.unsupported("SC1090", expr, `object spread into '${lowerer.fmt(type)}' where the source's '${lowerer.fmt(iv)}' values cannot reach the '${lowerer.fmt(f.type)}' field '${f.name}' (the value slot must be the field type, 'unknown', or a union covering the field's arms)`);
1687
1945
  };
1688
- const key = `declmerge:${type.shapeId}:${srcs.map((s) => s.shapeId).join(",")}`;
1689
- let helper = lowerer.widthHelpers.get(key);
1690
- if (!helper) {
1691
- helper = `%rec.declmerge.${lowerer.widthHelpers.size}`;
1692
- const outRef = varRef("out.0", type, loc);
1693
- const ksT = arrayOf(STRING);
1694
- const locals = [{ id: "out.0", name: "out", type, mutable: false }];
1695
- const params = srcs.map((s, j) => {
1696
- locals.push({ id: `s${j}.0`, name: `s${j}`, type: s.value.type, mutable: true });
1697
- return { localId: `s${j}.0`, name: `s${j}`, type: s.value.type };
1698
- });
1699
- const body = [
1700
- {
1701
- kind: "varDecl",
1702
- localId: "out.0",
1703
- init: {
1704
- kind: "recordLit",
1705
- fields: shape.fields.map((f) => ({ name: f.name, value: lowerer.wrappedUndefined(f.type, loc) })),
1706
- type,
1707
- loc,
1708
- },
1709
- loc,
1710
- },
1711
- ];
1712
- srcs.forEach((s, j) => {
1713
- const sRef = varRef(`s${j}.0`, s.value.type, loc);
1714
- const kRef = varRef(`k${j}.0`, STRING, loc);
1715
- const vRef = varRef(`v${j}.0`, s.iv, loc);
1716
- locals.push({ id: `ks${j}.0`, name: `ks${j}`, type: ksT, mutable: false }, { id: `i${j}.0`, name: `i${j}`, type: F64, mutable: true }, { id: `k${j}.0`, name: `k${j}`, type: STRING, mutable: false }, { id: `v${j}.0`, name: `v${j}`, type: s.iv, mutable: false });
1717
- // Per-key dispatch: if (k === "a") { write a } else if ... else drop.
1718
- const dispatch = shape.fields.reduceRight((rest, f) => {
1719
- const write = (value) => ({ kind: "recordSet", obj: outRef, shapeId: type.shapeId, field: f.name, value, loc });
1720
- const c = conv(s.iv, f, vRef);
1721
- const thenBody = "value" in c ? [write(c.value)] : c.stmts(write);
1722
- return [{
1723
- kind: "if",
1724
- cond: { kind: "strEq", negated: false, left: kRef, right: { kind: "strLit", value: f.name, type: STRING, loc }, type: BOOL, loc },
1725
- then: thenBody,
1726
- else_: rest.length > 0 ? rest : null,
1727
- loc,
1728
- }];
1729
- }, []);
1730
- body.push({ kind: "varDecl", localId: `ks${j}.0`, init: { kind: "recordOvfKeys", obj: sRef, shapeId: s.shapeId, type: ksT, loc }, loc }, {
1731
- kind: "for",
1732
- init: { kind: "varDecl", localId: `i${j}.0`, init: numLit(0, loc), loc },
1733
- cond: { kind: "bin", op: "<", left: varRef(`i${j}.0`, F64, loc), right: { kind: "arrIntrinsic", method: "length", receiver: varRef(`ks${j}.0`, ksT, loc), args: [], type: F64, loc }, type: BOOL, loc },
1734
- update: { kind: "assign", localId: `i${j}.0`, value: { kind: "bin", op: "+", left: varRef(`i${j}.0`, F64, loc), right: numLit(1, loc), type: F64, loc }, loc },
1735
- body: [
1736
- { kind: "varDecl", localId: `k${j}.0`, init: { kind: "arrayGet", arr: varRef(`ks${j}.0`, ksT, loc), index: varRef(`i${j}.0`, F64, loc), type: STRING, loc }, loc },
1737
- { kind: "varDecl", localId: `v${j}.0`, init: { kind: "recordKeyGet", obj: sRef, shapeId: s.shapeId, key: kRef, overflowOnly: true, type: s.iv, loc }, loc },
1738
- ...dispatch,
1739
- ],
1740
- loc,
1741
- });
1742
- });
1743
- body.push({ kind: "return", value: outRef, loc });
1744
- lowerer.liftedFns.push({
1745
- name: helper,
1746
- params,
1747
- returnType: type,
1748
- locals,
1749
- body,
1946
+ // Apply each source before evaluating the next expression. Passing all
1947
+ // sources as one helper's arguments would read an earlier record after a
1948
+ // later source factory mutated it, contrary to object spread evaluation.
1949
+ const out = lowerer.declareHiddenLocal("%declMerge", type);
1950
+ const outRef = varRef(out.id, type, loc);
1951
+ const stmts = [{
1952
+ kind: "varDecl", localId: out.id,
1953
+ init: { kind: "recordLit", fields: shape.fields.map((f) => ({ name: f.name, value: lowerer.wrappedUndefined(f.type, loc) })), type, loc },
1750
1954
  loc,
1751
- });
1752
- // Registered only after a fence-free build: a conv() fence mid-build
1753
- // must not leave a phantom helper behind for the next literal.
1754
- lowerer.widthHelpers.set(key, helper);
1955
+ }];
1956
+ for (const source of srcs) {
1957
+ const key = `declmerge-source:${type.shapeId}:${source.shapeId}`;
1958
+ let helper = lowerer.widthHelpers.get(key);
1959
+ if (!helper) {
1960
+ helper = `%rec.declmerge.${lowerer.widthHelpers.size}`;
1961
+ const sourceType = source.value.type;
1962
+ const destination = varRef("out.0", type, loc);
1963
+ const receiver = varRef("source.0", sourceType, loc);
1964
+ const locals = [
1965
+ { id: "out.0", name: "out", type, mutable: false },
1966
+ { id: "source.0", name: "source", type: sourceType, mutable: false },
1967
+ ];
1968
+ const body = [];
1969
+ if (!source.shape) {
1970
+ // CopyDataProperties skips nullish sources, even when an erased
1971
+ // record view supplies the checker's apparent object type.
1972
+ body.push({
1973
+ kind: "if", cond: { kind: "dynTest", test: "nullish", value: receiver, type: BOOL, loc },
1974
+ then: [{ kind: "return", value: destination, loc }], else_: null, loc,
1975
+ });
1976
+ }
1977
+ for (const field of source.shape?.fields ?? []) {
1978
+ const target = shape.fields.find((candidate) => candidate.name === field.name);
1979
+ if (!target)
1980
+ continue; // The declared destination drops extra keys.
1981
+ const raw = { kind: "recordGet", obj: receiver, shapeId: source.shapeId, field: field.name, type: field.type, loc };
1982
+ const lift = lowerer.widthLiftPlan(field.type, target.type);
1983
+ if (!lift) {
1984
+ lowerer.unsupported("SC1090", expr, `object spread of field '${field.name}' from '${lowerer.fmt(field.type)}' into '${lowerer.fmt(target.type)}'`);
1985
+ }
1986
+ const write = {
1987
+ kind: "recordSet", obj: destination, shapeId: type.shapeId, field: field.name,
1988
+ value: lowerer.applyWidthLift(lift, raw, target.type, loc), loc,
1989
+ };
1990
+ // Optional declared fields use the established unset convention.
1991
+ // A dyn field, including a present undefined, is a real property;
1992
+ // its checked conversion runs and can overwrite an earlier value.
1993
+ const absent = field.type.kind === "union" ? lowerer.armTag(field.type.unionId, UNDEFINED_T) : -1;
1994
+ if (absent >= 0 && field.type.kind === "union") {
1995
+ body.push({ kind: "if", cond: {
1996
+ kind: "unionIsTag", unionId: field.type.unionId, tag: absent, negated: true, value: raw, type: BOOL, loc,
1997
+ }, then: [write], else_: null, loc });
1998
+ }
1999
+ else
2000
+ body.push(write);
2001
+ }
2002
+ const iv = source.shape ? source.shape.indexValue : DYN;
2003
+ if (iv) {
2004
+ const keysType = arrayOf(STRING);
2005
+ const keys = varRef("keys.0", keysType, loc);
2006
+ const index = varRef("index.0", F64, loc);
2007
+ const name = varRef("key.0", STRING, loc);
2008
+ const value = varRef("value.0", iv, loc);
2009
+ locals.push({ id: "keys.0", name: "keys", type: keysType, mutable: false }, { id: "index.0", name: "index", type: F64, mutable: true }, { id: "key.0", name: "key", type: STRING, mutable: false }, { id: "value.0", name: "value", type: iv, mutable: false });
2010
+ const dispatch = shape.fields.reduceRight((rest, field) => {
2011
+ const write = (value) => ({ kind: "recordSet", obj: destination, shapeId: type.shapeId, field: field.name, value, loc });
2012
+ const converted = conv(iv, field, value);
2013
+ return [{
2014
+ kind: "if",
2015
+ cond: { kind: "strEq", negated: false, left: name, right: { kind: "strLit", value: field.name, type: STRING, loc }, type: BOOL, loc },
2016
+ then: "value" in converted ? [write(converted.value)] : converted.stmts(write),
2017
+ else_: rest.length > 0 ? rest : null, loc,
2018
+ }];
2019
+ }, []);
2020
+ body.push({ kind: "varDecl", localId: "keys.0", init: source.shape
2021
+ ? { kind: "recordOvfKeys", obj: receiver, shapeId: source.shapeId, type: keysType, loc }
2022
+ : { kind: "dynCheck", value: { kind: "libCall", fn: "dyn.objKeys", args: [receiver], type: DYN, loc }, type: keysType, loc }, loc }, {
2023
+ kind: "for",
2024
+ init: { kind: "varDecl", localId: "index.0", init: numLit(0, loc), loc },
2025
+ cond: { kind: "bin", op: "<", left: index, right: { kind: "arrIntrinsic", method: "length", receiver: keys, args: [], type: F64, loc }, type: BOOL, loc },
2026
+ update: { kind: "assign", localId: "index.0", value: { kind: "bin", op: "+", left: index, right: numLit(1, loc), type: F64, loc }, loc },
2027
+ body: [
2028
+ { kind: "varDecl", localId: "key.0", init: { kind: "arrayGet", arr: keys, index, type: STRING, loc }, loc },
2029
+ { kind: "varDecl", localId: "value.0", init: source.shape
2030
+ ? { kind: "recordKeyGet", obj: receiver, shapeId: source.shapeId, key: name, overflowOnly: true, type: iv, loc }
2031
+ : { kind: "dynKeyGet", value: receiver, key: name, type: DYN, loc }, loc },
2032
+ ...dispatch,
2033
+ ], loc,
2034
+ });
2035
+ }
2036
+ body.push({ kind: "return", value: destination, loc });
2037
+ lowerer.liftedFns.push({
2038
+ name: helper,
2039
+ params: [{ localId: "out.0", name: "out", type }, { localId: "source.0", name: "source", type: sourceType }],
2040
+ returnType: type, locals, body, loc,
2041
+ });
2042
+ // Publish only a fully checked helper: rejected conversions must not
2043
+ // leave an entry that a later literal could reuse without a body.
2044
+ lowerer.widthHelpers.set(key, helper);
2045
+ }
2046
+ stmts.push({ kind: "exprStmt", expr: { kind: "call", callee: helper, args: [outRef, source.value], type, loc }, loc });
1755
2047
  }
1756
- return { kind: "call", callee: helper, args: srcs.map((s) => s.value), type, loc };
2048
+ return { kind: "seqExpr", stmts, result: outRef, type, loc };
1757
2049
  }
1758
2050
  /** The value of a shorthand property (`{ x }`): the binding `x` refers to.
1759
2051
  * The property name's own symbol is the PROPERTY, so resolution goes
@@ -1764,6 +2056,14 @@ export function lowerShorthandValue(lowerer, prop) {
1764
2056
  const propName = prop.name;
1765
2057
  const loc = locOf(propName);
1766
2058
  const symbol = lowerer.checker.getShorthandAssignmentValueSymbol(prop);
2059
+ // Import identifiers in shorthand position carry the property's symbol,
2060
+ // so the ordinary identifier expression path cannot resolve them.
2061
+ const builtin = lowerer.builtinImportOf(propName);
2062
+ if (builtin) {
2063
+ const callable = lowerer.lowerBuiltinCallableValue(builtin, loc);
2064
+ if (callable)
2065
+ return callable;
2066
+ }
1767
2067
  if (symbol) {
1768
2068
  if (lowerer.ctx.selfSymbol === symbol) {
1769
2069
  return { kind: "selfRef", type: lowerer.ctx.selfType, loc };
@@ -1781,7 +2081,7 @@ export function lowerShorthandValue(lowerer, prop) {
1781
2081
  const sig = lowerer.fnSigsBySymbol.get(resolved);
1782
2082
  const decl = lowerer.checker.declarationsOf(resolved)[0];
1783
2083
  if (sig && decl && ts.isFunctionDeclaration(decl) &&
1784
- (ts.isSourceFile(decl.parent) || lowerer.nsBlocks.get(decl.parent) === "flattened")) {
2084
+ (ts.isSourceFile(decl.parent) || (decl.parent !== undefined && lowerer.nsBlocks.get(decl.parent) === "flattened"))) {
1785
2085
  lowerer.noteEdge(sig.name);
1786
2086
  const funcType = {
1787
2087
  kind: "func",
@@ -1798,11 +2098,11 @@ export function lowerShorthandValue(lowerer, prop) {
1798
2098
  }
1799
2099
  lowerer.rejectUnresolvedSymbol(symbol ? (symbol.flags & ts.SymbolFlags.Alias ? lowerer.checker.getAliasedSymbol(symbol) : symbol) : null, propName.text, prop, `the reference to '${propName.text}' (a binding form with no lowering)`);
1800
2100
  }
1801
- /** Rejects any `this` inside an object-literal method body — including in
1802
- * nested arrows, which inherit the method's `this` (nested function
1803
- * expressions reset it, but their bare `this` is already a tsc error
1804
- * under noImplicitThis, so over-rejecting them here changes nothing). */
2101
+ /** Rejects the method's own receiver, including lexical captures in
2102
+ * arrows. Nested ordinary functions bind their own ambient receiver. */
1805
2103
  export function rejectThisInObjectMethod(lowerer, node) {
2104
+ if (ts.isFunctionExpression(node) || ts.isFunctionDeclaration(node) || ts.isMethodDeclaration(node) || ts.isAccessor(node))
2105
+ return;
1806
2106
  if (node.kind === ts.SyntaxKind.ThisKeyword) {
1807
2107
  lowerer.unsupported("SC1090", node, "references to 'this' in object literal methods");
1808
2108
  }