@scriptc/compiler 0.2.4 → 0.2.6

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 (1201) hide show
  1. package/ambient/scriptc-node-fallback.d.ts +972 -245
  2. package/ambient/scriptc-overrides.d.ts +5 -1
  3. package/ambient/scriptc.d.ts +22 -2
  4. package/dist/backend/build-cache.d.ts +4 -0
  5. package/dist/backend/build-cache.js +16 -2
  6. package/dist/backend/build-cache.js.map +1 -1
  7. package/dist/backend/cycle-analysis.js +17 -5
  8. package/dist/backend/cycle-analysis.js.map +1 -1
  9. package/dist/backend/cycle-analysis.test.js +50 -11
  10. package/dist/backend/cycle-analysis.test.js.map +1 -1
  11. package/dist/backend/debug-symbols.js.map +1 -1
  12. package/dist/backend/executable-features.js +3 -1
  13. package/dist/backend/executable-features.js.map +1 -1
  14. package/dist/backend/external-c.d.ts +13 -6
  15. package/dist/backend/external-c.js +15 -3
  16. package/dist/backend/external-c.js.map +1 -1
  17. package/dist/backend/ffi-callbacks.js +6 -9
  18. package/dist/backend/ffi-callbacks.js.map +1 -1
  19. package/dist/backend/library-identity-markers.js.map +1 -1
  20. package/dist/backend/library-pack.d.ts +1 -1
  21. package/dist/backend/library-pack.js +81 -24
  22. package/dist/backend/library-pack.js.map +1 -1
  23. package/dist/backend/link-plan-core.d.ts +2 -0
  24. package/dist/backend/link-plan-core.js +10 -2
  25. package/dist/backend/link-plan-core.js.map +1 -1
  26. package/dist/backend/link-plan.d.ts +2 -1
  27. package/dist/backend/link-plan.js +7 -5
  28. package/dist/backend/link-plan.js.map +1 -1
  29. package/dist/backend/linker.d.ts +1 -1
  30. package/dist/backend/linker.js +42 -23
  31. package/dist/backend/linker.js.map +1 -1
  32. package/dist/backend/literals.js +5 -4
  33. package/dist/backend/literals.js.map +1 -1
  34. package/dist/backend/literals.test.js +30 -5
  35. package/dist/backend/literals.test.js.map +1 -1
  36. package/dist/backend/llvm/blocks.test.js +5 -2
  37. package/dist/backend/llvm/blocks.test.js.map +1 -1
  38. package/dist/backend/llvm/borrowed-inputs.js.map +1 -1
  39. package/dist/backend/llvm/borrowed-receivers.js +43 -19
  40. package/dist/backend/llvm/borrowed-receivers.js.map +1 -1
  41. package/dist/backend/llvm/byte-numbers.js +38 -5
  42. package/dist/backend/llvm/byte-numbers.js.map +1 -1
  43. package/dist/backend/llvm/byte-windows.d.ts +31 -0
  44. package/dist/backend/llvm/byte-windows.js +334 -0
  45. package/dist/backend/llvm/byte-windows.js.map +1 -0
  46. package/dist/backend/llvm/byte-windows.test.d.ts +1 -0
  47. package/dist/backend/llvm/byte-windows.test.js +244 -0
  48. package/dist/backend/llvm/byte-windows.test.js.map +1 -0
  49. package/dist/backend/llvm/bytes-bounds.js +73 -22
  50. package/dist/backend/llvm/bytes-bounds.js.map +1 -1
  51. package/dist/backend/llvm/call-lifetimes.d.ts +5 -2
  52. package/dist/backend/llvm/call-lifetimes.js +72 -19
  53. package/dist/backend/llvm/call-lifetimes.js.map +1 -1
  54. package/dist/backend/llvm/call-lifetimes.test.js +159 -28
  55. package/dist/backend/llvm/call-lifetimes.test.js.map +1 -1
  56. package/dist/backend/llvm/checked-value-lifetimes.d.ts +4 -0
  57. package/dist/backend/llvm/checked-value-lifetimes.js +14 -4
  58. package/dist/backend/llvm/checked-value-lifetimes.js.map +1 -1
  59. package/dist/backend/llvm/classes.d.ts +14 -1
  60. package/dist/backend/llvm/classes.js +94 -19
  61. package/dist/backend/llvm/classes.js.map +1 -1
  62. package/dist/backend/llvm/classes.test.d.ts +1 -0
  63. package/dist/backend/llvm/classes.test.js +99 -0
  64. package/dist/backend/llvm/classes.test.js.map +1 -0
  65. package/dist/backend/llvm/common.js +4 -1
  66. package/dist/backend/llvm/common.js.map +1 -1
  67. package/dist/backend/llvm/constant-callbacks.d.ts +11 -0
  68. package/dist/backend/llvm/constant-callbacks.js +213 -0
  69. package/dist/backend/llvm/constant-callbacks.js.map +1 -0
  70. package/dist/backend/llvm/constant-callbacks.test.d.ts +1 -0
  71. package/dist/backend/llvm/constant-callbacks.test.js +124 -0
  72. package/dist/backend/llvm/constant-callbacks.test.js.map +1 -0
  73. package/dist/backend/llvm/counted-loops.js +10 -3
  74. package/dist/backend/llvm/counted-loops.js.map +1 -1
  75. package/dist/backend/llvm/debug-info.js +33 -13
  76. package/dist/backend/llvm/debug-info.js.map +1 -1
  77. package/dist/backend/llvm/debug-info.test.js +28 -6
  78. package/dist/backend/llvm/debug-info.test.js.map +1 -1
  79. package/dist/backend/llvm/dyn.d.ts +1 -1
  80. package/dist/backend/llvm/dyn.js +75 -56
  81. package/dist/backend/llvm/dyn.js.map +1 -1
  82. package/dist/backend/llvm/emitter.d.ts +28 -3
  83. package/dist/backend/llvm/emitter.js +506 -145
  84. package/dist/backend/llvm/emitter.js.map +1 -1
  85. package/dist/backend/llvm/emitter.test.js +247 -50
  86. package/dist/backend/llvm/emitter.test.js.map +1 -1
  87. package/dist/backend/llvm/expr-async.js +25 -6
  88. package/dist/backend/llvm/expr-async.js.map +1 -1
  89. package/dist/backend/llvm/expr-bytes.js +24 -4
  90. package/dist/backend/llvm/expr-bytes.js.map +1 -1
  91. package/dist/backend/llvm/expr-callbacks.js +10 -4
  92. package/dist/backend/llvm/expr-callbacks.js.map +1 -1
  93. package/dist/backend/llvm/expr-calls.js +110 -31
  94. package/dist/backend/llvm/expr-calls.js.map +1 -1
  95. package/dist/backend/llvm/expr-containers.d.ts +2 -0
  96. package/dist/backend/llvm/expr-containers.js +112 -41
  97. package/dist/backend/llvm/expr-containers.js.map +1 -1
  98. package/dist/backend/llvm/expr-control.js +1 -3
  99. package/dist/backend/llvm/expr-control.js.map +1 -1
  100. package/dist/backend/llvm/expr-dispatch.js +3 -1
  101. package/dist/backend/llvm/expr-dispatch.js.map +1 -1
  102. package/dist/backend/llvm/expr-dynamic.js +55 -7
  103. package/dist/backend/llvm/expr-dynamic.js.map +1 -1
  104. package/dist/backend/llvm/expr-island.js +26 -6
  105. package/dist/backend/llvm/expr-island.js.map +1 -1
  106. package/dist/backend/llvm/expr-primitives.js +95 -19
  107. package/dist/backend/llvm/expr-primitives.js.map +1 -1
  108. package/dist/backend/llvm/expr-primitives.test.js +44 -2
  109. package/dist/backend/llvm/expr-primitives.test.js.map +1 -1
  110. package/dist/backend/llvm/expr-records.js +10 -9
  111. package/dist/backend/llvm/expr-records.js.map +1 -1
  112. package/dist/backend/llvm/expr-stream-bridges.js +44 -26
  113. package/dist/backend/llvm/expr-stream-bridges.js.map +1 -1
  114. package/dist/backend/llvm/expr-stream-bridges.test.js +51 -14
  115. package/dist/backend/llvm/expr-stream-bridges.test.js.map +1 -1
  116. package/dist/backend/llvm/expr-stream-callbacks.js +34 -14
  117. package/dist/backend/llvm/expr-stream-callbacks.js.map +1 -1
  118. package/dist/backend/llvm/integer-remainder.d.ts +7 -0
  119. package/dist/backend/llvm/integer-remainder.js +26 -0
  120. package/dist/backend/llvm/integer-remainder.js.map +1 -0
  121. package/dist/backend/llvm/integer-values.js +15 -4
  122. package/dist/backend/llvm/integer-values.js.map +1 -1
  123. package/dist/backend/llvm/integer-views.js +23 -7
  124. package/dist/backend/llvm/integer-views.js.map +1 -1
  125. package/dist/backend/llvm/integer-views.test.js +42 -7
  126. package/dist/backend/llvm/integer-views.test.js.map +1 -1
  127. package/dist/backend/llvm/layouts.js +1 -1
  128. package/dist/backend/llvm/layouts.js.map +1 -1
  129. package/dist/backend/llvm/lib-abi.js +20 -4
  130. package/dist/backend/llvm/lib-abi.js.map +1 -1
  131. package/dist/backend/llvm/lib-connect.js +7 -1
  132. package/dist/backend/llvm/lib-connect.js.map +1 -1
  133. package/dist/backend/llvm/lib-datagram.js +35 -10
  134. package/dist/backend/llvm/lib-datagram.js.map +1 -1
  135. package/dist/backend/llvm/lib-dispatch.js +42 -38
  136. package/dist/backend/llvm/lib-dispatch.js.map +1 -1
  137. package/dist/backend/llvm/lib-filesystem.js +33 -18
  138. package/dist/backend/llvm/lib-filesystem.js.map +1 -1
  139. package/dist/backend/llvm/lib-http2.js +60 -15
  140. package/dist/backend/llvm/lib-http2.js.map +1 -1
  141. package/dist/backend/llvm/lib-lookup.js +12 -5
  142. package/dist/backend/llvm/lib-lookup.js.map +1 -1
  143. package/dist/backend/llvm/lib-network.js +97 -31
  144. package/dist/backend/llvm/lib-network.js.map +1 -1
  145. package/dist/backend/llvm/lib-process.js +57 -14
  146. package/dist/backend/llvm/lib-process.js.map +1 -1
  147. package/dist/backend/llvm/lib-shared.js +122 -31
  148. package/dist/backend/llvm/lib-shared.js.map +1 -1
  149. package/dist/backend/llvm/lib-stream.js +33 -14
  150. package/dist/backend/llvm/lib-stream.js.map +1 -1
  151. package/dist/backend/llvm/lib-test.js +21 -7
  152. package/dist/backend/llvm/lib-test.js.map +1 -1
  153. package/dist/backend/llvm/lib-tls.js +69 -20
  154. package/dist/backend/llvm/lib-tls.js.map +1 -1
  155. package/dist/backend/llvm/local-array-reads.d.ts +9 -2
  156. package/dist/backend/llvm/local-array-reads.js +176 -89
  157. package/dist/backend/llvm/local-array-reads.js.map +1 -1
  158. package/dist/backend/llvm/local-array-reads.test.js +394 -62
  159. package/dist/backend/llvm/local-array-reads.test.js.map +1 -1
  160. package/dist/backend/llvm/local-union-storage.d.ts +25 -0
  161. package/dist/backend/llvm/local-union-storage.js +109 -0
  162. package/dist/backend/llvm/local-union-storage.js.map +1 -0
  163. package/dist/backend/llvm/local-union-storage.test.d.ts +1 -0
  164. package/dist/backend/llvm/local-union-storage.test.js +210 -0
  165. package/dist/backend/llvm/local-union-storage.test.js.map +1 -0
  166. package/dist/backend/llvm/loop-array-borrows.d.ts +11 -0
  167. package/dist/backend/llvm/loop-array-borrows.js +70 -0
  168. package/dist/backend/llvm/loop-array-borrows.js.map +1 -0
  169. package/dist/backend/llvm/loop-array-borrows.test.d.ts +1 -0
  170. package/dist/backend/llvm/loop-array-borrows.test.js +145 -0
  171. package/dist/backend/llvm/loop-array-borrows.test.js.map +1 -0
  172. package/dist/backend/llvm/map-read-lifetimes.d.ts +11 -2
  173. package/dist/backend/llvm/map-read-lifetimes.js +64 -19
  174. package/dist/backend/llvm/map-read-lifetimes.js.map +1 -1
  175. package/dist/backend/llvm/map-read-lifetimes.test.js +89 -17
  176. package/dist/backend/llvm/map-read-lifetimes.test.js.map +1 -1
  177. package/dist/backend/llvm/reference-effects.d.ts +5 -3
  178. package/dist/backend/llvm/reference-effects.js +74 -36
  179. package/dist/backend/llvm/reference-effects.js.map +1 -1
  180. package/dist/backend/llvm/reference-effects.test.js +92 -9
  181. package/dist/backend/llvm/reference-effects.test.js.map +1 -1
  182. package/dist/backend/llvm/shapes.d.ts +4 -1
  183. package/dist/backend/llvm/shapes.js +82 -24
  184. package/dist/backend/llvm/shapes.js.map +1 -1
  185. package/dist/backend/llvm/shapes.test.js +3 -1
  186. package/dist/backend/llvm/shapes.test.js.map +1 -1
  187. package/dist/backend/llvm/split-loops.d.ts +48 -0
  188. package/dist/backend/llvm/split-loops.js +183 -0
  189. package/dist/backend/llvm/split-loops.js.map +1 -0
  190. package/dist/backend/llvm/split.js +4 -11
  191. package/dist/backend/llvm/split.js.map +1 -1
  192. package/dist/backend/llvm/split.test.js +80 -8
  193. package/dist/backend/llvm/split.test.js.map +1 -1
  194. package/dist/backend/llvm/stack-callbacks.d.ts +14 -0
  195. package/dist/backend/llvm/stack-callbacks.js +73 -0
  196. package/dist/backend/llvm/stack-callbacks.js.map +1 -0
  197. package/dist/backend/llvm/stack-captures.d.ts +25 -0
  198. package/dist/backend/llvm/stack-captures.js +150 -0
  199. package/dist/backend/llvm/stack-captures.js.map +1 -0
  200. package/dist/backend/llvm/stack-unions.js +14 -5
  201. package/dist/backend/llvm/stack-unions.js.map +1 -1
  202. package/dist/backend/llvm/stack-unions.test.js +151 -32
  203. package/dist/backend/llvm/stack-unions.test.js.map +1 -1
  204. package/dist/backend/llvm/string-construction.js.map +1 -1
  205. package/dist/backend/llvm/string-construction.test.js +32 -7
  206. package/dist/backend/llvm/string-construction.test.js.map +1 -1
  207. package/dist/backend/llvm/string-lifetimes.js +14 -8
  208. package/dist/backend/llvm/string-lifetimes.js.map +1 -1
  209. package/dist/backend/llvm/string-lifetimes.test.js +119 -29
  210. package/dist/backend/llvm/string-lifetimes.test.js.map +1 -1
  211. package/dist/backend/llvm/string-slices.d.ts +20 -0
  212. package/dist/backend/llvm/string-slices.js +87 -0
  213. package/dist/backend/llvm/string-slices.js.map +1 -0
  214. package/dist/backend/llvm/string-slices.test.d.ts +1 -0
  215. package/dist/backend/llvm/string-slices.test.js +98 -0
  216. package/dist/backend/llvm/string-slices.test.js.map +1 -0
  217. package/dist/backend/llvm/switch-dispatch.d.ts +9 -0
  218. package/dist/backend/llvm/switch-dispatch.js +114 -0
  219. package/dist/backend/llvm/switch-dispatch.js.map +1 -0
  220. package/dist/backend/llvm/switch-dispatch.test.d.ts +1 -0
  221. package/dist/backend/llvm/switch-dispatch.test.js +83 -0
  222. package/dist/backend/llvm/switch-dispatch.test.js.map +1 -0
  223. package/dist/backend/llvm/unsupported.js.map +1 -1
  224. package/dist/backend/llvm/walkers.d.ts +4 -14
  225. package/dist/backend/llvm/walkers.js +58 -313
  226. package/dist/backend/llvm/walkers.js.map +1 -1
  227. package/dist/backend/mangle.js +9 -3
  228. package/dist/backend/mangle.js.map +1 -1
  229. package/dist/backend/may-throw.js +18 -8
  230. package/dist/backend/may-throw.js.map +1 -1
  231. package/dist/backend/may-throw.test.js +119 -23
  232. package/dist/backend/may-throw.test.js.map +1 -1
  233. package/dist/backend/native/artifact-stamps.d.ts +39 -0
  234. package/dist/backend/native/artifact-stamps.js +371 -0
  235. package/dist/backend/native/artifact-stamps.js.map +1 -0
  236. package/dist/backend/native/cache-warm.d.ts +24 -0
  237. package/dist/backend/native/cache-warm.js +80 -0
  238. package/dist/backend/native/cache-warm.js.map +1 -0
  239. package/dist/backend/native/compiler-fingerprint.d.ts +19 -0
  240. package/dist/backend/native/compiler-fingerprint.js +357 -0
  241. package/dist/backend/native/compiler-fingerprint.js.map +1 -0
  242. package/dist/backend/native/contracts.d.ts +316 -0
  243. package/dist/backend/native/contracts.js +2 -0
  244. package/dist/backend/native/contracts.js.map +1 -0
  245. package/dist/backend/native/dependency-files.d.ts +5 -0
  246. package/dist/backend/native/dependency-files.js +83 -0
  247. package/dist/backend/native/dependency-files.js.map +1 -0
  248. package/dist/backend/native/driver.d.ts +50 -0
  249. package/dist/backend/native/driver.js +294 -0
  250. package/dist/backend/native/driver.js.map +1 -0
  251. package/dist/backend/native/executable.d.ts +18 -0
  252. package/dist/backend/native/executable.js +1275 -0
  253. package/dist/backend/native/executable.js.map +1 -0
  254. package/dist/backend/native/library.d.ts +2 -0
  255. package/dist/backend/native/library.js +614 -0
  256. package/dist/backend/native/library.js.map +1 -0
  257. package/dist/backend/native/linker-fingerprint.d.ts +8 -0
  258. package/dist/backend/native/linker-fingerprint.js +174 -0
  259. package/dist/backend/native/linker-fingerprint.js.map +1 -0
  260. package/dist/backend/native/object-merge.d.ts +2 -0
  261. package/dist/backend/native/object-merge.js +154 -0
  262. package/dist/backend/native/object-merge.js.map +1 -0
  263. package/dist/backend/native/process.d.ts +17 -0
  264. package/dist/backend/native/process.js +42 -0
  265. package/dist/backend/native/process.js.map +1 -0
  266. package/dist/backend/native/program-shards.d.ts +21 -0
  267. package/dist/backend/native/program-shards.js +99 -0
  268. package/dist/backend/native/program-shards.js.map +1 -0
  269. package/dist/backend/native/runtime-inputs.d.ts +12 -0
  270. package/dist/backend/native/runtime-inputs.js +165 -0
  271. package/dist/backend/native/runtime-inputs.js.map +1 -0
  272. package/dist/backend/native/runtime-inputs.test.d.ts +1 -0
  273. package/dist/backend/native/runtime-inputs.test.js +64 -0
  274. package/dist/backend/native/runtime-inputs.test.js.map +1 -0
  275. package/dist/backend/native/runtime-objects.d.ts +16 -0
  276. package/dist/backend/native/runtime-objects.js +122 -0
  277. package/dist/backend/native/runtime-objects.js.map +1 -0
  278. package/dist/backend/native/session.d.ts +12 -0
  279. package/dist/backend/native/session.js +31 -0
  280. package/dist/backend/native/session.js.map +1 -0
  281. package/dist/backend/native/tool-identity.d.ts +37 -0
  282. package/dist/backend/native/tool-identity.js +310 -0
  283. package/dist/backend/native/tool-identity.js.map +1 -0
  284. package/dist/backend/native/trace-paths.d.ts +12 -0
  285. package/dist/backend/native/trace-paths.js +73 -0
  286. package/dist/backend/native/trace-paths.js.map +1 -0
  287. package/dist/backend/native/vendor.d.ts +1 -0
  288. package/dist/backend/native/vendor.js +12 -0
  289. package/dist/backend/native/vendor.js.map +1 -0
  290. package/dist/backend/native-codegen-core.d.ts +6 -0
  291. package/dist/backend/native-codegen-core.js +23 -1
  292. package/dist/backend/native-codegen-core.js.map +1 -1
  293. package/dist/backend/native-codegen.d.ts +5 -1
  294. package/dist/backend/native-codegen.js +52 -25
  295. package/dist/backend/native-codegen.js.map +1 -1
  296. package/dist/backend/native-codegen.test.js +59 -11
  297. package/dist/backend/native-codegen.test.js.map +1 -1
  298. package/dist/backend/native-link-info-core.d.ts +1 -0
  299. package/dist/backend/native-link-info-core.js +9 -5
  300. package/dist/backend/native-link-info-core.js.map +1 -1
  301. package/dist/backend/native-link-info.js +14 -5
  302. package/dist/backend/native-link-info.js.map +1 -1
  303. package/dist/backend/native-link-info.test.js +58 -13
  304. package/dist/backend/native-link-info.test.js.map +1 -1
  305. package/dist/backend/native-toolchain.d.ts +17 -450
  306. package/dist/backend/native-toolchain.js +17 -3971
  307. package/dist/backend/native-toolchain.js.map +1 -1
  308. package/dist/backend/native-toolchain.test.js +103 -72
  309. package/dist/backend/native-toolchain.test.js.map +1 -1
  310. package/dist/backend/native-tools.d.ts +3 -1
  311. package/dist/backend/native-tools.js +30 -9
  312. package/dist/backend/native-tools.js.map +1 -1
  313. package/dist/backend/object-localize.js +17 -14
  314. package/dist/backend/object-localize.js.map +1 -1
  315. package/dist/backend/object-localize.test.js +59 -12
  316. package/dist/backend/object-localize.test.js.map +1 -1
  317. package/dist/backend/runtime-abi.d.ts +2 -2
  318. package/dist/backend/runtime-abi.js +2 -2
  319. package/dist/backend/runtime-pack-core.d.ts +1 -0
  320. package/dist/backend/runtime-pack-core.js +104 -50
  321. package/dist/backend/runtime-pack-core.js.map +1 -1
  322. package/dist/backend/runtime-pack-native.js +5 -3
  323. package/dist/backend/runtime-pack-native.js.map +1 -1
  324. package/dist/backend/runtime-pack-targets.test.js +126 -17
  325. package/dist/backend/runtime-pack-targets.test.js.map +1 -1
  326. package/dist/backend/runtime-pack.d.ts +1 -1
  327. package/dist/backend/runtime-pack.js +11 -12
  328. package/dist/backend/runtime-pack.js.map +1 -1
  329. package/dist/backend/runtime-pack.test.js +51 -25
  330. package/dist/backend/runtime-pack.test.js.map +1 -1
  331. package/dist/backend/source-locations.js.map +1 -1
  332. package/dist/backend/source-locations.test.js +7 -2
  333. package/dist/backend/source-locations.test.js.map +1 -1
  334. package/dist/backend/target-diagnostics.js +44 -14
  335. package/dist/backend/target-diagnostics.js.map +1 -1
  336. package/dist/backend/target-diagnostics.test.js +93 -20
  337. package/dist/backend/target-diagnostics.test.js.map +1 -1
  338. package/dist/backend/targets.js +230 -86
  339. package/dist/backend/targets.js.map +1 -1
  340. package/dist/backend/targets.test.js +32 -18
  341. package/dist/backend/targets.test.js.map +1 -1
  342. package/dist/backend/toolchain-environment.js +5 -1
  343. package/dist/backend/toolchain-environment.js.map +1 -1
  344. package/dist/backend/vendor-archives.d.ts +2 -2
  345. package/dist/backend/vendor-archives.js +84 -35
  346. package/dist/backend/vendor-archives.js.map +1 -1
  347. package/dist/backend/vendor-inputs.js +13 -1
  348. package/dist/backend/vendor-inputs.js.map +1 -1
  349. package/dist/backend/warm-cache.d.ts +1 -1
  350. package/dist/backend/warm-cache.js +33 -9
  351. package/dist/backend/warm-cache.js.map +1 -1
  352. package/dist/cli/command.js +39 -9
  353. package/dist/cli/command.js.map +1 -1
  354. package/dist/cli/output-options.js +14 -4
  355. package/dist/cli/output-options.js.map +1 -1
  356. package/dist/cli/paths.js.map +1 -1
  357. package/dist/cli/wasi-runner.js.map +1 -1
  358. package/dist/compat/fetch-profile.js +36 -35
  359. package/dist/compat/fetch-profile.js.map +1 -1
  360. package/dist/coverage/report.js +16 -17
  361. package/dist/coverage/report.js.map +1 -1
  362. package/dist/coverage/surface-manifest.js +112 -26
  363. package/dist/coverage/surface-manifest.js.map +1 -1
  364. package/dist/diagnostics/diagnostic.js +55 -16
  365. package/dist/diagnostics/diagnostic.js.map +1 -1
  366. package/dist/executable/executable-cache.d.ts +2 -1
  367. package/dist/executable/executable-cache.js +79 -48
  368. package/dist/executable/executable-cache.js.map +1 -1
  369. package/dist/executable/executable-cache.test.js +90 -26
  370. package/dist/executable/executable-cache.test.js.map +1 -1
  371. package/dist/executable/prepare.js +2 -2
  372. package/dist/executable/prepare.js.map +1 -1
  373. package/dist/ffi/ffi-manifest.js +78 -20
  374. package/dist/ffi/ffi-manifest.js.map +1 -1
  375. package/dist/ffi/ffi-manifest.test.js +96 -16
  376. package/dist/ffi/ffi-manifest.test.js.map +1 -1
  377. package/dist/format-integer.js.map +1 -1
  378. package/dist/frontend/analysis.js +12 -2
  379. package/dist/frontend/analysis.js.map +1 -1
  380. package/dist/frontend/arguments-usage.js.map +1 -1
  381. package/dist/frontend/binding-source.js +9 -3
  382. package/dist/frontend/binding-source.js.map +1 -1
  383. package/dist/frontend/builtin-modules.js +46 -2
  384. package/dist/frontend/builtin-modules.js.map +1 -1
  385. package/dist/frontend/cjs-resolve.js +40 -17
  386. package/dist/frontend/cjs-resolve.js.map +1 -1
  387. package/dist/frontend/cjs-syntax.js +31 -10
  388. package/dist/frontend/cjs-syntax.js.map +1 -1
  389. package/dist/frontend/comptime-node.test.js +10 -11
  390. package/dist/frontend/comptime-node.test.js.map +1 -1
  391. package/dist/frontend/dts-paths.js +7 -3
  392. package/dist/frontend/dts-paths.js.map +1 -1
  393. package/dist/frontend/fork-target.d.ts +5 -0
  394. package/dist/frontend/fork-target.js +55 -18
  395. package/dist/frontend/fork-target.js.map +1 -1
  396. package/dist/frontend/fork-target.test.d.ts +1 -0
  397. package/dist/frontend/fork-target.test.js +59 -0
  398. package/dist/frontend/fork-target.test.js.map +1 -0
  399. package/dist/frontend/function-completion.js +11 -6
  400. package/dist/frontend/function-completion.js.map +1 -1
  401. package/dist/frontend/helper-tokens.js +53 -6
  402. package/dist/frontend/helper-tokens.js.map +1 -1
  403. package/dist/frontend/helper-tokens.test.js +18 -2
  404. package/dist/frontend/helper-tokens.test.js.map +1 -1
  405. package/dist/frontend/inferred-js-diagnostics.js +32 -12
  406. package/dist/frontend/inferred-js-diagnostics.js.map +1 -1
  407. package/dist/frontend/inferred-js-diagnostics.test.js +11 -15
  408. package/dist/frontend/inferred-js-diagnostics.test.js.map +1 -1
  409. package/dist/frontend/input-tracker.js +11 -11
  410. package/dist/frontend/input-tracker.js.map +1 -1
  411. package/dist/frontend/input-tracker.test.js +4 -1
  412. package/dist/frontend/input-tracker.test.js.map +1 -1
  413. package/dist/frontend/lib-contract.js +38 -9
  414. package/dist/frontend/lib-contract.js.map +1 -1
  415. package/dist/frontend/literal-values.js.map +1 -1
  416. package/dist/frontend/literal-values.test.js +28 -8
  417. package/dist/frontend/literal-values.test.js.map +1 -1
  418. package/dist/frontend/lowering/abstract-equality.js +53 -10
  419. package/dist/frontend/lowering/abstract-equality.js.map +1 -1
  420. package/dist/frontend/lowering/array-indexed-mutation.d.ts +1 -1
  421. package/dist/frontend/lowering/array-indexed-mutation.js +108 -106
  422. package/dist/frontend/lowering/array-indexed-mutation.js.map +1 -1
  423. package/dist/frontend/lowering/array-values.js +37 -14
  424. package/dist/frontend/lowering/array-values.js.map +1 -1
  425. package/dist/frontend/lowering/binding-analysis.d.ts +50 -0
  426. package/dist/frontend/lowering/binding-analysis.js +376 -0
  427. package/dist/frontend/lowering/binding-analysis.js.map +1 -0
  428. package/dist/frontend/lowering/builtin-calls.d.ts +9 -0
  429. package/dist/frontend/lowering/builtin-calls.js +60 -0
  430. package/dist/frontend/lowering/builtin-calls.js.map +1 -0
  431. package/dist/frontend/lowering/builtins/arguments.d.ts +43 -0
  432. package/dist/frontend/lowering/builtins/arguments.js +247 -0
  433. package/dist/frontend/lowering/builtins/arguments.js.map +1 -0
  434. package/dist/frontend/lowering/builtins/async-context.d.ts +52 -0
  435. package/dist/frontend/lowering/builtins/async-context.js +436 -0
  436. package/dist/frontend/lowering/builtins/async-context.js.map +1 -0
  437. package/dist/frontend/lowering/builtins/atomics.d.ts +6 -0
  438. package/dist/frontend/lowering/builtins/atomics.js +82 -0
  439. package/dist/frontend/lowering/builtins/atomics.js.map +1 -0
  440. package/dist/frontend/lowering/builtins/callable-aliases.d.ts +13 -0
  441. package/dist/frontend/lowering/builtins/callable-aliases.js +87 -0
  442. package/dist/frontend/lowering/builtins/callable-aliases.js.map +1 -0
  443. package/dist/frontend/lowering/builtins/child-process-async.d.ts +18 -0
  444. package/dist/frontend/lowering/builtins/child-process-async.js +245 -0
  445. package/dist/frontend/lowering/builtins/child-process-async.js.map +1 -0
  446. package/dist/frontend/lowering/builtins/child-process-methods.d.ts +21 -0
  447. package/dist/frontend/lowering/builtins/child-process-methods.js +362 -0
  448. package/dist/frontend/lowering/builtins/child-process-methods.js.map +1 -0
  449. package/dist/frontend/lowering/builtins/child-process-sync.d.ts +4 -0
  450. package/dist/frontend/lowering/builtins/child-process-sync.js +639 -0
  451. package/dist/frontend/lowering/builtins/child-process-sync.js.map +1 -0
  452. package/dist/frontend/lowering/builtins/child-process.d.ts +55 -0
  453. package/dist/frontend/lowering/builtins/child-process.js +669 -0
  454. package/dist/frontend/lowering/builtins/child-process.js.map +1 -0
  455. package/dist/frontend/lowering/builtins/compression.d.ts +7 -0
  456. package/dist/frontend/lowering/builtins/compression.js +115 -0
  457. package/dist/frontend/lowering/builtins/compression.js.map +1 -0
  458. package/dist/frontend/lowering/builtins/console.d.ts +10 -0
  459. package/dist/frontend/lowering/builtins/console.js +38 -0
  460. package/dist/frontend/lowering/builtins/console.js.map +1 -0
  461. package/dist/frontend/lowering/builtins/constants.d.ts +24 -0
  462. package/dist/frontend/lowering/builtins/constants.js +141 -0
  463. package/dist/frontend/lowering/builtins/constants.js.map +1 -0
  464. package/dist/frontend/lowering/builtins/crypto.d.ts +22 -0
  465. package/dist/frontend/lowering/builtins/crypto.js +517 -0
  466. package/dist/frontend/lowering/builtins/crypto.js.map +1 -0
  467. package/dist/frontend/lowering/builtins/dates.d.ts +7 -0
  468. package/dist/frontend/lowering/builtins/dates.js +101 -0
  469. package/dist/frontend/lowering/builtins/dates.js.map +1 -0
  470. package/dist/frontend/lowering/builtins/environment.d.ts +34 -0
  471. package/dist/frontend/lowering/builtins/environment.js +95 -0
  472. package/dist/frontend/lowering/builtins/environment.js.map +1 -0
  473. package/dist/frontend/lowering/builtins/errors.d.ts +14 -0
  474. package/dist/frontend/lowering/builtins/errors.js +83 -0
  475. package/dist/frontend/lowering/builtins/errors.js.map +1 -0
  476. package/dist/frontend/lowering/builtins/filesystem-calls.d.ts +35 -0
  477. package/dist/frontend/lowering/builtins/filesystem-calls.js +725 -0
  478. package/dist/frontend/lowering/builtins/filesystem-calls.js.map +1 -0
  479. package/dist/frontend/lowering/builtins/filesystem.d.ts +108 -0
  480. package/dist/frontend/lowering/builtins/filesystem.js +1061 -0
  481. package/dist/frontend/lowering/builtins/filesystem.js.map +1 -0
  482. package/dist/frontend/lowering/builtins/ipc.d.ts +8 -0
  483. package/dist/frontend/lowering/builtins/ipc.js +76 -0
  484. package/dist/frontend/lowering/builtins/ipc.js.map +1 -0
  485. package/dist/frontend/lowering/builtins/json.d.ts +12 -0
  486. package/dist/frontend/lowering/builtins/json.js +387 -0
  487. package/dist/frontend/lowering/builtins/json.js.map +1 -0
  488. package/dist/frontend/lowering/builtins/module-bindings.d.ts +85 -0
  489. package/dist/frontend/lowering/builtins/module-bindings.js +346 -0
  490. package/dist/frontend/lowering/builtins/module-bindings.js.map +1 -0
  491. package/dist/frontend/lowering/builtins/module-calls.d.ts +8 -0
  492. package/dist/frontend/lowering/builtins/module-calls.js +308 -0
  493. package/dist/frontend/lowering/builtins/module-calls.js.map +1 -0
  494. package/dist/frontend/lowering/builtins/module-resolution.d.ts +38 -0
  495. package/dist/frontend/lowering/builtins/module-resolution.js +344 -0
  496. package/dist/frontend/lowering/builtins/module-resolution.js.map +1 -0
  497. package/dist/frontend/lowering/builtins/numbers.d.ts +15 -0
  498. package/dist/frontend/lowering/builtins/numbers.js +124 -0
  499. package/dist/frontend/lowering/builtins/numbers.js.map +1 -0
  500. package/dist/frontend/lowering/builtins/operating-system.d.ts +13 -0
  501. package/dist/frontend/lowering/builtins/operating-system.js +148 -0
  502. package/dist/frontend/lowering/builtins/operating-system.js.map +1 -0
  503. package/dist/frontend/lowering/builtins/performance.d.ts +13 -0
  504. package/dist/frontend/lowering/builtins/performance.js +100 -0
  505. package/dist/frontend/lowering/builtins/performance.js.map +1 -0
  506. package/dist/frontend/lowering/builtins/process.d.ts +50 -0
  507. package/dist/frontend/lowering/builtins/process.js +1138 -0
  508. package/dist/frontend/lowering/builtins/process.js.map +1 -0
  509. package/dist/frontend/lowering/builtins/promises.d.ts +14 -0
  510. package/dist/frontend/lowering/builtins/promises.js +356 -0
  511. package/dist/frontend/lowering/builtins/promises.js.map +1 -0
  512. package/dist/frontend/lowering/builtins/properties.d.ts +11 -0
  513. package/dist/frontend/lowering/builtins/properties.js +186 -0
  514. package/dist/frontend/lowering/builtins/properties.js.map +1 -0
  515. package/dist/frontend/lowering/builtins/querystring.d.ts +19 -0
  516. package/dist/frontend/lowering/builtins/querystring.js +150 -0
  517. package/dist/frontend/lowering/builtins/querystring.js.map +1 -0
  518. package/dist/frontend/lowering/builtins/readline.d.ts +13 -0
  519. package/dist/frontend/lowering/builtins/readline.js +138 -0
  520. package/dist/frontend/lowering/builtins/readline.js.map +1 -0
  521. package/dist/frontend/lowering/builtins/receiver-types.d.ts +5 -0
  522. package/dist/frontend/lowering/builtins/receiver-types.js +15 -0
  523. package/dist/frontend/lowering/builtins/receiver-types.js.map +1 -0
  524. package/dist/frontend/lowering/builtins/reflection.d.ts +13 -0
  525. package/dist/frontend/lowering/builtins/reflection.js +95 -0
  526. package/dist/frontend/lowering/builtins/reflection.js.map +1 -0
  527. package/dist/frontend/lowering/builtins/strings.d.ts +14 -0
  528. package/dist/frontend/lowering/builtins/strings.js +121 -0
  529. package/dist/frontend/lowering/builtins/strings.js.map +1 -0
  530. package/dist/frontend/lowering/builtins/text-codecs.d.ts +29 -0
  531. package/dist/frontend/lowering/builtins/text-codecs.js +590 -0
  532. package/dist/frontend/lowering/builtins/text-codecs.js.map +1 -0
  533. package/dist/frontend/lowering/builtins/timers.d.ts +22 -0
  534. package/dist/frontend/lowering/builtins/timers.js +180 -0
  535. package/dist/frontend/lowering/builtins/timers.js.map +1 -0
  536. package/dist/frontend/lowering/builtins/url.d.ts +37 -0
  537. package/dist/frontend/lowering/builtins/url.js +596 -0
  538. package/dist/frontend/lowering/builtins/url.js.map +1 -0
  539. package/dist/frontend/lowering/builtins/util-types.d.ts +7 -0
  540. package/dist/frontend/lowering/builtins/util-types.js +31 -0
  541. package/dist/frontend/lowering/builtins/util-types.js.map +1 -0
  542. package/dist/frontend/lowering/builtins/workers.d.ts +5 -0
  543. package/dist/frontend/lowering/builtins/workers.js +65 -0
  544. package/dist/frontend/lowering/builtins/workers.js.map +1 -0
  545. package/dist/frontend/lowering/call-arguments.d.ts +72 -0
  546. package/dist/frontend/lowering/call-arguments.js +618 -0
  547. package/dist/frontend/lowering/call-arguments.js.map +1 -0
  548. package/dist/frontend/lowering/call-signatures.d.ts +115 -0
  549. package/dist/frontend/lowering/call-signatures.js +719 -0
  550. package/dist/frontend/lowering/call-signatures.js.map +1 -0
  551. package/dist/frontend/lowering/callback-arg.js.map +1 -1
  552. package/dist/frontend/lowering/checked-iterable-spread.js +53 -10
  553. package/dist/frontend/lowering/checked-iterable-spread.js.map +1 -1
  554. package/dist/frontend/lowering/checked-promise-all.js +41 -9
  555. package/dist/frontend/lowering/checked-promise-all.js.map +1 -1
  556. package/dist/frontend/lowering/class-assertions.d.ts +7 -0
  557. package/dist/frontend/lowering/class-assertions.js +96 -0
  558. package/dist/frontend/lowering/class-assertions.js.map +1 -0
  559. package/dist/frontend/lowering/class-callbacks.d.ts +1 -1
  560. package/dist/frontend/lowering/class-callbacks.js +130 -27
  561. package/dist/frontend/lowering/class-callbacks.js.map +1 -1
  562. package/dist/frontend/lowering/class-construction.d.ts +1 -1
  563. package/dist/frontend/lowering/class-construction.js +247 -50
  564. package/dist/frontend/lowering/class-construction.js.map +1 -1
  565. package/dist/frontend/lowering/class-descriptors.js +109 -29
  566. package/dist/frontend/lowering/class-descriptors.js.map +1 -1
  567. package/dist/frontend/lowering/class-dynamic-dispatch.d.ts +6 -1
  568. package/dist/frontend/lowering/class-dynamic-dispatch.js +2471 -465
  569. package/dist/frontend/lowering/class-dynamic-dispatch.js.map +1 -1
  570. package/dist/frontend/lowering/class-dynamic-dispatch.test.js +284 -44
  571. package/dist/frontend/lowering/class-dynamic-dispatch.test.js.map +1 -1
  572. package/dist/frontend/lowering/class-instance-constructor.js +17 -5
  573. package/dist/frontend/lowering/class-instance-constructor.js.map +1 -1
  574. package/dist/frontend/lowering/class-method-values.js +199 -51
  575. package/dist/frontend/lowering/class-method-values.js.map +1 -1
  576. package/dist/frontend/lowering/class-protocols.d.ts +17 -0
  577. package/dist/frontend/lowering/class-protocols.js +126 -0
  578. package/dist/frontend/lowering/class-protocols.js.map +1 -0
  579. package/dist/frontend/lowering/class-prototypes.js +345 -86
  580. package/dist/frontend/lowering/class-prototypes.js.map +1 -1
  581. package/dist/frontend/lowering/class-runtime-statics.d.ts +1 -1
  582. package/dist/frontend/lowering/class-runtime-statics.js +80 -17
  583. package/dist/frontend/lowering/class-runtime-statics.js.map +1 -1
  584. package/dist/frontend/lowering/class-static-data.js +76 -16
  585. package/dist/frontend/lowering/class-static-data.js.map +1 -1
  586. package/dist/frontend/lowering/coercions/builders.d.ts +13 -0
  587. package/dist/frontend/lowering/coercions/builders.js +77 -0
  588. package/dist/frontend/lowering/coercions/builders.js.map +1 -0
  589. package/dist/frontend/lowering/coercions/function-adapters.d.ts +58 -0
  590. package/dist/frontend/lowering/coercions/function-adapters.js +430 -0
  591. package/dist/frontend/lowering/coercions/function-adapters.js.map +1 -0
  592. package/dist/frontend/lowering/coercions/island.d.ts +37 -0
  593. package/dist/frontend/lowering/coercions/island.js +350 -0
  594. package/dist/frontend/lowering/coercions/island.js.map +1 -0
  595. package/dist/frontend/lowering/coercions/state.d.ts +14 -0
  596. package/dist/frontend/lowering/coercions/state.js +16 -0
  597. package/dist/frontend/lowering/coercions/state.js.map +1 -0
  598. package/dist/frontend/lowering/coercions/structural-plans.d.ts +40 -0
  599. package/dist/frontend/lowering/coercions/structural-plans.js +447 -0
  600. package/dist/frontend/lowering/coercions/structural-plans.js.map +1 -0
  601. package/dist/frontend/lowering/coercions/structural.d.ts +63 -0
  602. package/dist/frontend/lowering/coercions/structural.js +616 -0
  603. package/dist/frontend/lowering/coercions/structural.js.map +1 -0
  604. package/dist/frontend/lowering/coercions/unions.d.ts +65 -0
  605. package/dist/frontend/lowering/coercions/unions.js +318 -0
  606. package/dist/frontend/lowering/coercions/unions.js.map +1 -0
  607. package/dist/frontend/lowering/collection-ingestion.js +355 -72
  608. package/dist/frontend/lowering/collection-ingestion.js.map +1 -1
  609. package/dist/frontend/lowering/containers/array-callbacks.d.ts +88 -0
  610. package/dist/frontend/lowering/containers/array-callbacks.js +1611 -0
  611. package/dist/frontend/lowering/containers/array-callbacks.js.map +1 -0
  612. package/dist/frontend/lowering/containers/array-construction.d.ts +42 -0
  613. package/dist/frontend/lowering/containers/array-construction.js +1044 -0
  614. package/dist/frontend/lowering/containers/array-construction.js.map +1 -0
  615. package/dist/frontend/lowering/containers/array-iteration.d.ts +16 -0
  616. package/dist/frontend/lowering/containers/array-iteration.js +95 -0
  617. package/dist/frontend/lowering/containers/array-iteration.js.map +1 -0
  618. package/dist/frontend/lowering/containers/array-methods.d.ts +27 -0
  619. package/dist/frontend/lowering/containers/array-methods.js +1854 -0
  620. package/dist/frontend/lowering/containers/array-methods.js.map +1 -0
  621. package/dist/frontend/lowering/containers/bytes.d.ts +17 -17
  622. package/dist/frontend/lowering/containers/bytes.js +430 -138
  623. package/dist/frontend/lowering/containers/bytes.js.map +1 -1
  624. package/dist/frontend/lowering/containers/callback-arguments.d.ts +26 -0
  625. package/dist/frontend/lowering/containers/callback-arguments.js +179 -0
  626. package/dist/frontend/lowering/containers/callback-arguments.js.map +1 -0
  627. package/dist/frontend/lowering/containers/collection-grouping.d.ts +19 -0
  628. package/dist/frontend/lowering/containers/collection-grouping.js +297 -0
  629. package/dist/frontend/lowering/containers/collection-grouping.js.map +1 -0
  630. package/dist/frontend/lowering/containers/collection-methods.d.ts +57 -0
  631. package/dist/frontend/lowering/containers/collection-methods.js +1314 -0
  632. package/dist/frontend/lowering/containers/collection-methods.js.map +1 -0
  633. package/dist/frontend/lowering/containers/dynamic-receivers.d.ts +18 -0
  634. package/dist/frontend/lowering/containers/dynamic-receivers.js +114 -0
  635. package/dist/frontend/lowering/containers/dynamic-receivers.js.map +1 -0
  636. package/dist/frontend/lowering/containers/for-of.d.ts +60 -0
  637. package/dist/frontend/lowering/containers/for-of.js +643 -0
  638. package/dist/frontend/lowering/containers/for-of.js.map +1 -0
  639. package/dist/frontend/lowering/containers/indexed-objects.d.ts +132 -0
  640. package/dist/frontend/lowering/containers/indexed-objects.js +1743 -0
  641. package/dist/frontend/lowering/containers/indexed-objects.js.map +1 -0
  642. package/dist/frontend/lowering/containers/iterator-helpers.d.ts +20 -0
  643. package/dist/frontend/lowering/containers/iterator-helpers.js +809 -0
  644. package/dist/frontend/lowering/containers/iterator-helpers.js.map +1 -0
  645. package/dist/frontend/lowering/containers/string-and-regexp.js +601 -160
  646. package/dist/frontend/lowering/containers/string-and-regexp.js.map +1 -1
  647. package/dist/frontend/lowering/containers/string-replacement.js +213 -63
  648. package/dist/frontend/lowering/containers/string-replacement.js.map +1 -1
  649. package/dist/frontend/lowering/crypto-tables.js +263 -64
  650. package/dist/frontend/lowering/crypto-tables.js.map +1 -1
  651. package/dist/frontend/lowering/deferred-module-initializers.js +172 -68
  652. package/dist/frontend/lowering/deferred-module-initializers.js.map +1 -1
  653. package/dist/frontend/lowering/deferred-module-initializers.test.js +41 -8
  654. package/dist/frontend/lowering/deferred-module-initializers.test.js.map +1 -1
  655. package/dist/frontend/lowering/error-methods.js +339 -65
  656. package/dist/frontend/lowering/error-methods.js.map +1 -1
  657. package/dist/frontend/lowering/expressions/evaluation-safety.js +3 -2
  658. package/dist/frontend/lowering/expressions/evaluation-safety.js.map +1 -1
  659. package/dist/frontend/lowering/expressions/global-symbols.js +2 -1
  660. package/dist/frontend/lowering/expressions/global-symbols.js.map +1 -1
  661. package/dist/frontend/lowering/expressions/native-proxy.js +11 -5
  662. package/dist/frontend/lowering/expressions/native-proxy.js.map +1 -1
  663. package/dist/frontend/lowering/expressions/nullish-assignment.js +67 -13
  664. package/dist/frontend/lowering/expressions/nullish-assignment.js.map +1 -1
  665. package/dist/frontend/lowering/expressions/object-literals.js +588 -165
  666. package/dist/frontend/lowering/expressions/object-literals.js.map +1 -1
  667. package/dist/frontend/lowering/expressions/optional-chains.d.ts +1 -1
  668. package/dist/frontend/lowering/expressions/optional-chains.js +68 -17
  669. package/dist/frontend/lowering/expressions/optional-chains.js.map +1 -1
  670. package/dist/frontend/lowering/expressions/union-field-write.js +45 -18
  671. package/dist/frontend/lowering/expressions/union-field-write.js.map +1 -1
  672. package/dist/frontend/lowering/function-context.js +5 -1
  673. package/dist/frontend/lowering/function-context.js.map +1 -1
  674. package/dist/frontend/lowering/function-returns.d.ts +67 -0
  675. package/dist/frontend/lowering/function-returns.js +392 -0
  676. package/dist/frontend/lowering/function-returns.js.map +1 -0
  677. package/dist/frontend/lowering/generator-delegation.d.ts +1 -1
  678. package/dist/frontend/lowering/generator-delegation.js +171 -39
  679. package/dist/frontend/lowering/generator-delegation.js.map +1 -1
  680. package/dist/frontend/lowering/generator-dynamic-dispatch.d.ts +1 -1
  681. package/dist/frontend/lowering/generator-dynamic-dispatch.js +176 -36
  682. package/dist/frontend/lowering/generator-dynamic-dispatch.js.map +1 -1
  683. package/dist/frontend/lowering/generic-functions.d.ts +271 -0
  684. package/dist/frontend/lowering/generic-functions.js +1730 -0
  685. package/dist/frontend/lowering/generic-functions.js.map +1 -0
  686. package/dist/frontend/lowering/import-meta.d.ts +1 -1
  687. package/dist/frontend/lowering/import-meta.js +37 -14
  688. package/dist/frontend/lowering/import-meta.js.map +1 -1
  689. package/dist/frontend/lowering/indexed-comparison.js +6 -2
  690. package/dist/frontend/lowering/indexed-comparison.js.map +1 -1
  691. package/dist/frontend/lowering/instantiation-path.d.ts +8 -0
  692. package/dist/frontend/lowering/instantiation-path.js +10 -0
  693. package/dist/frontend/lowering/instantiation-path.js.map +1 -0
  694. package/dist/frontend/lowering/instantiation-path.test.d.ts +1 -0
  695. package/dist/frontend/lowering/instantiation-path.test.js +23 -0
  696. package/dist/frontend/lowering/instantiation-path.test.js.map +1 -0
  697. package/dist/frontend/lowering/iterator-consumption.d.ts +9 -0
  698. package/dist/frontend/lowering/iterator-consumption.js +91 -0
  699. package/dist/frontend/lowering/iterator-consumption.js.map +1 -0
  700. package/dist/frontend/lowering/lib-boundary.js +40 -17
  701. package/dist/frontend/lowering/lib-boundary.js.map +1 -1
  702. package/dist/frontend/lowering/lib-boundary.test.js +49 -11
  703. package/dist/frontend/lowering/lib-boundary.test.js.map +1 -1
  704. package/dist/frontend/lowering/lower-array-sort.d.ts +0 -19
  705. package/dist/frontend/lowering/lower-array-sort.js +331 -566
  706. package/dist/frontend/lowering/lower-array-sort.js.map +1 -1
  707. package/dist/frontend/lowering/lower-assert.js +248 -43
  708. package/dist/frontend/lowering/lower-assert.js.map +1 -1
  709. package/dist/frontend/lowering/lower-async-iteration.js +71 -16
  710. package/dist/frontend/lowering/lower-async-iteration.js.map +1 -1
  711. package/dist/frontend/lowering/lower-builtin-values.js +430 -77
  712. package/dist/frontend/lowering/lower-builtin-values.js.map +1 -1
  713. package/dist/frontend/lowering/lower-calls.d.ts +39 -558
  714. package/dist/frontend/lowering/lower-calls.js +2628 -5669
  715. package/dist/frontend/lowering/lower-calls.js.map +1 -1
  716. package/dist/frontend/lowering/lower-classes.d.ts +248 -242
  717. package/dist/frontend/lowering/lower-classes.js +1820 -775
  718. package/dist/frontend/lowering/lower-classes.js.map +1 -1
  719. package/dist/frontend/lowering/lower-comptime.d.ts +35 -35
  720. package/dist/frontend/lowering/lower-comptime.js +39 -37
  721. package/dist/frontend/lowering/lower-comptime.js.map +1 -1
  722. package/dist/frontend/lowering/lower-dgram.js +59 -31
  723. package/dist/frontend/lowering/lower-dgram.js.map +1 -1
  724. package/dist/frontend/lowering/lower-enums.js +5 -2
  725. package/dist/frontend/lowering/lower-enums.js.map +1 -1
  726. package/dist/frontend/lowering/lower-event-emitter.js +323 -86
  727. package/dist/frontend/lowering/lower-event-emitter.js.map +1 -1
  728. package/dist/frontend/lowering/lower-expando.js +19 -7
  729. package/dist/frontend/lowering/lower-expando.js.map +1 -1
  730. package/dist/frontend/lowering/lower-exprs.d.ts +194 -194
  731. package/dist/frontend/lowering/lower-exprs.js +3473 -1160
  732. package/dist/frontend/lowering/lower-exprs.js.map +1 -1
  733. package/dist/frontend/lowering/lower-functions.d.ts +23 -0
  734. package/dist/frontend/lowering/lower-functions.js +449 -0
  735. package/dist/frontend/lowering/lower-functions.js.map +1 -0
  736. package/dist/frontend/lowering/lower-generators.js +121 -32
  737. package/dist/frontend/lowering/lower-generators.js.map +1 -1
  738. package/dist/frontend/lowering/lower-global-value.js +15 -4
  739. package/dist/frontend/lowering/lower-global-value.js.map +1 -1
  740. package/dist/frontend/lowering/lower-inspect.js +479 -89
  741. package/dist/frontend/lowering/lower-inspect.js.map +1 -1
  742. package/dist/frontend/lowering/lower-island.d.ts +79 -79
  743. package/dist/frontend/lowering/lower-island.js +366 -274
  744. package/dist/frontend/lowering/lower-island.js.map +1 -1
  745. package/dist/frontend/lowering/lower-island.test.js +7 -2
  746. package/dist/frontend/lowering/lower-island.test.js.map +1 -1
  747. package/dist/frontend/lowering/lower-mixins.js +17 -8
  748. package/dist/frontend/lowering/lower-mixins.js.map +1 -1
  749. package/dist/frontend/lowering/lower-modules.d.ts +95 -94
  750. package/dist/frontend/lowering/lower-modules.js +655 -329
  751. package/dist/frontend/lowering/lower-modules.js.map +1 -1
  752. package/dist/frontend/lowering/lower-modules.test.js +91 -20
  753. package/dist/frontend/lowering/lower-modules.test.js.map +1 -1
  754. package/dist/frontend/lowering/lower-namespaces.js +25 -8
  755. package/dist/frontend/lowering/lower-namespaces.js.map +1 -1
  756. package/dist/frontend/lowering/lower-node-module.js +115 -34
  757. package/dist/frontend/lowering/lower-node-module.js.map +1 -1
  758. package/dist/frontend/lowering/lower-server.js +1210 -290
  759. package/dist/frontend/lowering/lower-server.js.map +1 -1
  760. package/dist/frontend/lowering/lower-stmts.d.ts +148 -148
  761. package/dist/frontend/lowering/lower-stmts.js +2324 -994
  762. package/dist/frontend/lowering/lower-stmts.js.map +1 -1
  763. package/dist/frontend/lowering/lower-stmts.test.js +13 -5
  764. package/dist/frontend/lowering/lower-stmts.test.js.map +1 -1
  765. package/dist/frontend/lowering/lower-stream.js +363 -91
  766. package/dist/frontend/lowering/lower-stream.js.map +1 -1
  767. package/dist/frontend/lowering/lower-system-errors.js +30 -8
  768. package/dist/frontend/lowering/lower-system-errors.js.map +1 -1
  769. package/dist/frontend/lowering/lower-test.js +40 -13
  770. package/dist/frontend/lowering/lower-test.js.map +1 -1
  771. package/dist/frontend/lowering/lower-timers.d.ts +31 -0
  772. package/dist/frontend/lowering/lower-timers.js +336 -0
  773. package/dist/frontend/lowering/lower-timers.js.map +1 -0
  774. package/dist/frontend/lowering/lower-url.d.ts +1 -1
  775. package/dist/frontend/lowering/lower-url.js +46 -13
  776. package/dist/frontend/lowering/lower-url.js.map +1 -1
  777. package/dist/frontend/lowering/lowerer.d.ts +34 -352
  778. package/dist/frontend/lowering/lowerer.js +1074 -2712
  779. package/dist/frontend/lowering/lowerer.js.map +1 -1
  780. package/dist/frontend/lowering/lowerer.test.js +85 -17
  781. package/dist/frontend/lowering/lowerer.test.js.map +1 -1
  782. package/dist/frontend/lowering/module-namespace-elements.js +43 -8
  783. package/dist/frontend/lowering/module-namespace-elements.js.map +1 -1
  784. package/dist/frontend/lowering/native-ffi.d.ts +21 -1
  785. package/dist/frontend/lowering/native-ffi.js +487 -18
  786. package/dist/frontend/lowering/native-ffi.js.map +1 -1
  787. package/dist/frontend/lowering/object-enumeration-receiver.js +55 -10
  788. package/dist/frontend/lowering/object-enumeration-receiver.js.map +1 -1
  789. package/dist/frontend/lowering/object-factory-new.d.ts +1 -1
  790. package/dist/frontend/lowering/object-factory-new.js +36 -11
  791. package/dist/frontend/lowering/object-factory-new.js.map +1 -1
  792. package/dist/frontend/lowering/optional-arguments.js +49 -20
  793. package/dist/frontend/lowering/optional-arguments.js.map +1 -1
  794. package/dist/frontend/lowering/pairs-snapshot.js +66 -14
  795. package/dist/frontend/lowering/pairs-snapshot.js.map +1 -1
  796. package/dist/frontend/lowering/runtime-optional-locals.js +3 -1
  797. package/dist/frontend/lowering/runtime-optional-locals.js.map +1 -1
  798. package/dist/frontend/lowering/runtime-optional-locals.test.js.map +1 -1
  799. package/dist/frontend/lowering/sanitize-class-types.js +4 -1
  800. package/dist/frontend/lowering/sanitize-class-types.js.map +1 -1
  801. package/dist/frontend/lowering/sanitize-class-types.test.js +86 -18
  802. package/dist/frontend/lowering/sanitize-class-types.test.js.map +1 -1
  803. package/dist/frontend/lowering/split-consumers.d.ts +7 -0
  804. package/dist/frontend/lowering/split-consumers.js +64 -0
  805. package/dist/frontend/lowering/split-consumers.js.map +1 -0
  806. package/dist/frontend/lowering/static-this.js +13 -6
  807. package/dist/frontend/lowering/static-this.js.map +1 -1
  808. package/dist/frontend/lowering/string-index.js +32 -10
  809. package/dist/frontend/lowering/string-index.js.map +1 -1
  810. package/dist/frontend/lowering/surfaces.d.ts +45 -46
  811. package/dist/frontend/lowering/surfaces.js +1129 -256
  812. package/dist/frontend/lowering/surfaces.js.map +1 -1
  813. package/dist/frontend/lowering/symbol-fields.js +40 -15
  814. package/dist/frontend/lowering/symbol-fields.js.map +1 -1
  815. package/dist/frontend/lowering/symbol-methods.js.map +1 -1
  816. package/dist/frontend/lowering/text-decoder-encoding.js +236 -24
  817. package/dist/frontend/lowering/text-decoder-encoding.js.map +1 -1
  818. package/dist/frontend/lowering/text-decoder-encoding.test.js +84 -12
  819. package/dist/frontend/lowering/text-decoder-encoding.test.js.map +1 -1
  820. package/dist/frontend/lowering/union-narrow.js +59 -16
  821. package/dist/frontend/lowering/union-narrow.js.map +1 -1
  822. package/dist/frontend/lowering/union-narrow.test.js +24 -7
  823. package/dist/frontend/lowering/union-narrow.test.js.map +1 -1
  824. package/dist/frontend/lowering/union-retag.js +155 -40
  825. package/dist/frontend/lowering/union-retag.js.map +1 -1
  826. package/dist/frontend/lowering/union-retag.test.js +131 -33
  827. package/dist/frontend/lowering/union-retag.test.js.map +1 -1
  828. package/dist/frontend/lowering/unregistered-class-types.js.map +1 -1
  829. package/dist/frontend/lowering/unregistered-class-types.test.js +34 -8
  830. package/dist/frontend/lowering/unregistered-class-types.test.js.map +1 -1
  831. package/dist/frontend/module-source-candidates.d.ts +10 -0
  832. package/dist/frontend/module-source-candidates.js +40 -0
  833. package/dist/frontend/module-source-candidates.js.map +1 -0
  834. package/dist/frontend/module-source-candidates.test.d.ts +1 -0
  835. package/dist/frontend/module-source-candidates.test.js +53 -0
  836. package/dist/frontend/module-source-candidates.test.js.map +1 -0
  837. package/dist/frontend/module-syntax.js +21 -8
  838. package/dist/frontend/module-syntax.js.map +1 -1
  839. package/dist/frontend/module-syntax.test.js +37 -13
  840. package/dist/frontend/module-syntax.test.js.map +1 -1
  841. package/dist/frontend/npm-fetch-analysis.js +13 -4
  842. package/dist/frontend/npm-fetch-analysis.js.map +1 -1
  843. package/dist/frontend/npm-fetch-analysis.test.js +33 -10
  844. package/dist/frontend/npm-fetch-analysis.test.js.map +1 -1
  845. package/dist/frontend/npm-fetch-node.js.map +1 -1
  846. package/dist/frontend/npm-fetch-syntax.js +4 -9
  847. package/dist/frontend/npm-fetch-syntax.js.map +1 -1
  848. package/dist/frontend/npm-node.js +3 -1
  849. package/dist/frontend/npm-node.js.map +1 -1
  850. package/dist/frontend/npm-static-bundled-cjs.js +88 -29
  851. package/dist/frontend/npm-static-bundled-cjs.js.map +1 -1
  852. package/dist/frontend/npm-static-bundled-cjs.test.js +29 -10
  853. package/dist/frontend/npm-static-bundled-cjs.test.js.map +1 -1
  854. package/dist/frontend/npm-static-declaration-syntax.js +148 -56
  855. package/dist/frontend/npm-static-declaration-syntax.js.map +1 -1
  856. package/dist/frontend/npm-static-declarations.d.ts +1 -1
  857. package/dist/frontend/npm-static-declarations.js.map +1 -1
  858. package/dist/frontend/npm-static-declarations.test.js +33 -7
  859. package/dist/frontend/npm-static-declarations.test.js.map +1 -1
  860. package/dist/frontend/npm-static-prune.js +26 -12
  861. package/dist/frontend/npm-static-prune.js.map +1 -1
  862. package/dist/frontend/npm-static-prune.test.js +17 -3
  863. package/dist/frontend/npm-static-prune.test.js.map +1 -1
  864. package/dist/frontend/npm-static-rewrite-host.js +2 -3
  865. package/dist/frontend/npm-static-rewrite-host.js.map +1 -1
  866. package/dist/frontend/npm-static-rewrite-syntax.js +64 -21
  867. package/dist/frontend/npm-static-rewrite-syntax.js.map +1 -1
  868. package/dist/frontend/npm-static-rewrite.js.map +1 -1
  869. package/dist/frontend/npm-static-subtyping.js +9 -4
  870. package/dist/frontend/npm-static-subtyping.js.map +1 -1
  871. package/dist/frontend/npm-static-subtyping.test.js +30 -6
  872. package/dist/frontend/npm-static-subtyping.test.js.map +1 -1
  873. package/dist/frontend/npm-static.js +15 -4
  874. package/dist/frontend/npm-static.js.map +1 -1
  875. package/dist/frontend/npm.js +122 -36
  876. package/dist/frontend/npm.js.map +1 -1
  877. package/dist/frontend/npm.test.js +30 -10
  878. package/dist/frontend/npm.test.js.map +1 -1
  879. package/dist/frontend/pipeline-native.js.map +1 -1
  880. package/dist/frontend/pipeline.js +25 -8
  881. package/dist/frontend/pipeline.js.map +1 -1
  882. package/dist/frontend/pipeline.test.js +21 -7
  883. package/dist/frontend/pipeline.test.js.map +1 -1
  884. package/dist/frontend/program-analysis.d.ts +2 -0
  885. package/dist/frontend/program-analysis.js +2 -0
  886. package/dist/frontend/program-analysis.js.map +1 -1
  887. package/dist/frontend/program-node.js +5 -3
  888. package/dist/frontend/program-node.js.map +1 -1
  889. package/dist/frontend/program.d.ts +2 -2
  890. package/dist/frontend/program.js +248 -127
  891. package/dist/frontend/program.js.map +1 -1
  892. package/dist/frontend/program.test.js +27 -27
  893. package/dist/frontend/program.test.js.map +1 -1
  894. package/dist/frontend/provenance-core.js +8 -4
  895. package/dist/frontend/provenance-core.js.map +1 -1
  896. package/dist/frontend/provenance-registry.js +1 -4
  897. package/dist/frontend/provenance-registry.js.map +1 -1
  898. package/dist/frontend/resolve.js +32 -20
  899. package/dist/frontend/resolve.js.map +1 -1
  900. package/dist/frontend/resolve.test.js +1 -1
  901. package/dist/frontend/resolve.test.js.map +1 -1
  902. package/dist/frontend/runtime-resolve.js +13 -4
  903. package/dist/frontend/runtime-resolve.js.map +1 -1
  904. package/dist/frontend/runtime-resolve.test.js +25 -9
  905. package/dist/frontend/runtime-resolve.test.js.map +1 -1
  906. package/dist/frontend/services-node.js +6 -2
  907. package/dist/frontend/services-node.js.map +1 -1
  908. package/dist/frontend/services-node.test.js +18 -6
  909. package/dist/frontend/services-node.test.js.map +1 -1
  910. package/dist/frontend/services.js +8 -4
  911. package/dist/frontend/services.js.map +1 -1
  912. package/dist/frontend/services.test.js +6 -2
  913. package/dist/frontend/services.test.js.map +1 -1
  914. package/dist/frontend/ts7/api.js +12 -4
  915. package/dist/frontend/ts7/api.js.map +1 -1
  916. package/dist/frontend/ts7/ast-bytes.js +10 -3
  917. package/dist/frontend/ts7/ast-bytes.js.map +1 -1
  918. package/dist/frontend/ts7/ast-bytes.test.js +23 -4
  919. package/dist/frontend/ts7/ast-bytes.test.js.map +1 -1
  920. package/dist/frontend/ts7/ast-guards.test.js +14 -5
  921. package/dist/frontend/ts7/ast-guards.test.js.map +1 -1
  922. package/dist/frontend/ts7/ast-node.d.ts +6 -1
  923. package/dist/frontend/ts7/ast-node.js +490 -172
  924. package/dist/frontend/ts7/ast-node.js.map +1 -1
  925. package/dist/frontend/ts7/ast-node.test.js +150 -36
  926. package/dist/frontend/ts7/ast-node.test.js.map +1 -1
  927. package/dist/frontend/ts7/ast-text.js +13 -3
  928. package/dist/frontend/ts7/ast-text.js.map +1 -1
  929. package/dist/frontend/ts7/ast-text.test.js.map +1 -1
  930. package/dist/frontend/ts7/ast-types.js.map +1 -1
  931. package/dist/frontend/ts7/ast-wire.d.ts +5 -1
  932. package/dist/frontend/ts7/ast-wire.js +83 -20
  933. package/dist/frontend/ts7/ast-wire.js.map +1 -1
  934. package/dist/frontend/ts7/ast-wire.test.js +53 -8
  935. package/dist/frontend/ts7/ast-wire.test.js.map +1 -1
  936. package/dist/frontend/ts7/ast.d.ts +2 -1
  937. package/dist/frontend/ts7/ast.js +53 -30
  938. package/dist/frontend/ts7/ast.js.map +1 -1
  939. package/dist/frontend/ts7/census-check.js +1 -1
  940. package/dist/frontend/ts7/census-check.js.map +1 -1
  941. package/dist/frontend/ts7/checker-cache.js.map +1 -1
  942. package/dist/frontend/ts7/checker.d.ts +8 -2
  943. package/dist/frontend/ts7/checker.js +46 -8
  944. package/dist/frontend/ts7/checker.js.map +1 -1
  945. package/dist/frontend/ts7/checker.test.js +96 -17
  946. package/dist/frontend/ts7/checker.test.js.map +1 -1
  947. package/dist/frontend/ts7/enums.test.js +9 -4
  948. package/dist/frontend/ts7/enums.test.js.map +1 -1
  949. package/dist/frontend/ts7/native-api.js.map +1 -1
  950. package/dist/frontend/ts7/native-host.js.map +1 -1
  951. package/dist/frontend/ts7/native-process.js +9 -3
  952. package/dist/frontend/ts7/native-process.js.map +1 -1
  953. package/dist/frontend/ts7/program-adapter.js +1 -1
  954. package/dist/frontend/ts7/program-adapter.js.map +1 -1
  955. package/dist/frontend/ts7/program-host.d.ts +7 -0
  956. package/dist/frontend/ts7/program-host.js +33 -6
  957. package/dist/frontend/ts7/program-host.js.map +1 -1
  958. package/dist/frontend/ts7/program-host.test.js +72 -11
  959. package/dist/frontend/ts7/program-host.test.js.map +1 -1
  960. package/dist/frontend/ts7/rpc-api.js +3 -1
  961. package/dist/frontend/ts7/rpc-api.js.map +1 -1
  962. package/dist/frontend/ts7/rpc-client.js +15 -5
  963. package/dist/frontend/ts7/rpc-client.js.map +1 -1
  964. package/dist/frontend/ts7/rpc-client.test.js +26 -8
  965. package/dist/frontend/ts7/rpc-client.test.js.map +1 -1
  966. package/dist/frontend/ts7/rpc-filesystem.js.map +1 -1
  967. package/dist/frontend/ts7/rpc-filesystem.test.js +43 -10
  968. package/dist/frontend/ts7/rpc-filesystem.test.js.map +1 -1
  969. package/dist/frontend/ts7/rpc-process.js +16 -6
  970. package/dist/frontend/ts7/rpc-process.js.map +1 -1
  971. package/dist/frontend/ts7/rpc-process.test.js.map +1 -1
  972. package/dist/frontend/ts7/rpc-wire.d.ts +1 -0
  973. package/dist/frontend/ts7/rpc-wire.js +41 -14
  974. package/dist/frontend/ts7/rpc-wire.js.map +1 -1
  975. package/dist/frontend/ts7/rpc-wire.test.js +36 -6
  976. package/dist/frontend/ts7/rpc-wire.test.js.map +1 -1
  977. package/dist/frontend/ts7/semantic-checker.js +209 -68
  978. package/dist/frontend/ts7/semantic-checker.js.map +1 -1
  979. package/dist/frontend/ts7/semantic-checker.test.js +29 -14
  980. package/dist/frontend/ts7/semantic-checker.test.js.map +1 -1
  981. package/dist/frontend/ts7/semantic-json.js +7 -1
  982. package/dist/frontend/ts7/semantic-json.js.map +1 -1
  983. package/dist/frontend/ts7/semantic-json.test.js +17 -3
  984. package/dist/frontend/ts7/semantic-json.test.js.map +1 -1
  985. package/dist/frontend/ts7/semantic-model.js +147 -51
  986. package/dist/frontend/ts7/semantic-model.js.map +1 -1
  987. package/dist/frontend/ts7/semantic-model.test.js +72 -19
  988. package/dist/frontend/ts7/semantic-model.test.js.map +1 -1
  989. package/dist/frontend/ts7/semantic-types.d.ts +2 -2
  990. package/dist/frontend/ts7/session-cache.js +10 -3
  991. package/dist/frontend/ts7/session-cache.js.map +1 -1
  992. package/dist/frontend/ts7/session-cache.test.js +13 -4
  993. package/dist/frontend/ts7/session-cache.test.js.map +1 -1
  994. package/dist/frontend/ts7/session-path.js +25 -10
  995. package/dist/frontend/ts7/session-path.js.map +1 -1
  996. package/dist/frontend/ts7/session-path.test.js +47 -4
  997. package/dist/frontend/ts7/session-path.test.js.map +1 -1
  998. package/dist/frontend/ts7/session-timing.js +22 -3
  999. package/dist/frontend/ts7/session-timing.js.map +1 -1
  1000. package/dist/frontend/ts7/session-timing.test.js +12 -3
  1001. package/dist/frontend/ts7/session-timing.test.js.map +1 -1
  1002. package/dist/frontend/ts7/session.d.ts +1 -0
  1003. package/dist/frontend/ts7/session.js +109 -35
  1004. package/dist/frontend/ts7/session.js.map +1 -1
  1005. package/dist/frontend/ts7/session.test.js +69 -15
  1006. package/dist/frontend/ts7/session.test.js.map +1 -1
  1007. package/dist/frontend/ts7/source-parser.js +17 -6
  1008. package/dist/frontend/ts7/source-parser.js.map +1 -1
  1009. package/dist/frontend/ts7/source-parser.test.js +32 -9
  1010. package/dist/frontend/ts7/source-parser.test.js.map +1 -1
  1011. package/dist/frontend/tsc-codes.js +56 -11
  1012. package/dist/frontend/tsc-codes.js.map +1 -1
  1013. package/dist/frontend/tsc-codes.test.d.ts +1 -0
  1014. package/dist/frontend/tsc-codes.test.js +16 -0
  1015. package/dist/frontend/tsc-codes.test.js.map +1 -0
  1016. package/dist/frontend/type-mapper.d.ts +3 -0
  1017. package/dist/frontend/type-mapper.js +589 -206
  1018. package/dist/frontend/type-mapper.js.map +1 -1
  1019. package/dist/frontend/type-mapper.test.js +108 -33
  1020. package/dist/frontend/type-mapper.test.js.map +1 -1
  1021. package/dist/frontend/union-discriminants.js +8 -2
  1022. package/dist/frontend/union-discriminants.js.map +1 -1
  1023. package/dist/frontend/union-discriminants.test.js +77 -20
  1024. package/dist/frontend/union-discriminants.test.js.map +1 -1
  1025. package/dist/frontend/worker-target.d.ts +6 -0
  1026. package/dist/frontend/worker-target.js +108 -0
  1027. package/dist/frontend/worker-target.js.map +1 -0
  1028. package/dist/frontend/worker-target.test.d.ts +1 -0
  1029. package/dist/frontend/worker-target.test.js +71 -0
  1030. package/dist/frontend/worker-target.test.js.map +1 -0
  1031. package/dist/index.d.ts +9 -8
  1032. package/dist/index.js +174 -88
  1033. package/dist/index.js.map +1 -1
  1034. package/dist/ir/analysis.js +95 -38
  1035. package/dist/ir/analysis.js.map +1 -1
  1036. package/dist/ir/analysis.test.js +91 -15
  1037. package/dist/ir/analysis.test.js.map +1 -1
  1038. package/dist/ir/api.d.ts +4 -0
  1039. package/dist/ir/api.js +6 -0
  1040. package/dist/ir/api.js.map +1 -0
  1041. package/dist/ir/build.d.ts +7 -0
  1042. package/dist/ir/build.js +27 -1
  1043. package/dist/ir/build.js.map +1 -1
  1044. package/dist/ir/builtin-effects.d.ts +9 -0
  1045. package/dist/ir/builtin-effects.js +643 -0
  1046. package/dist/ir/builtin-effects.js.map +1 -0
  1047. package/dist/ir/builtin-signatures.d.ts +15 -0
  1048. package/dist/ir/builtin-signatures.js +3397 -0
  1049. package/dist/ir/builtin-signatures.js.map +1 -0
  1050. package/dist/ir/byte-numbers.js +67 -16
  1051. package/dist/ir/byte-numbers.js.map +1 -1
  1052. package/dist/ir/byte-numbers.test.js +17 -4
  1053. package/dist/ir/byte-numbers.test.js.map +1 -1
  1054. package/dist/ir/constant-tables.js +13 -5
  1055. package/dist/ir/constant-tables.js.map +1 -1
  1056. package/dist/ir/constant-tables.test.js +47 -7
  1057. package/dist/ir/constant-tables.test.js.map +1 -1
  1058. package/dist/ir/control-flow.js +2 -1
  1059. package/dist/ir/control-flow.js.map +1 -1
  1060. package/dist/ir/control-flow.test.js +35 -11
  1061. package/dist/ir/control-flow.test.js.map +1 -1
  1062. package/dist/ir/initializer-bindings.d.ts +9 -0
  1063. package/dist/ir/initializer-bindings.js +115 -0
  1064. package/dist/ir/initializer-bindings.js.map +1 -0
  1065. package/dist/ir/initializer-bindings.test.d.ts +1 -0
  1066. package/dist/ir/initializer-bindings.test.js +118 -0
  1067. package/dist/ir/initializer-bindings.test.js.map +1 -0
  1068. package/dist/ir/integer-loop-facts.d.ts +12 -0
  1069. package/dist/ir/integer-loop-facts.js +137 -0
  1070. package/dist/ir/integer-loop-facts.js.map +1 -0
  1071. package/dist/ir/integer-loops.js +85 -30
  1072. package/dist/ir/integer-loops.js.map +1 -1
  1073. package/dist/ir/integer-loops.test.js +76 -13
  1074. package/dist/ir/integer-loops.test.js.map +1 -1
  1075. package/dist/ir/integer-ranges.js +93 -21
  1076. package/dist/ir/integer-ranges.js.map +1 -1
  1077. package/dist/ir/integer-ranges.test.js +199 -21
  1078. package/dist/ir/integer-ranges.test.js.map +1 -1
  1079. package/dist/ir/intrinsic-signatures.d.ts +20 -0
  1080. package/dist/ir/intrinsic-signatures.js +57 -0
  1081. package/dist/ir/intrinsic-signatures.js.map +1 -0
  1082. package/dist/ir/ir.d.ts +15 -2160
  1083. package/dist/ir/ir.js +160 -1396
  1084. package/dist/ir/ir.js.map +1 -1
  1085. package/dist/ir/ir.test.js +98 -77
  1086. package/dist/ir/ir.test.js.map +1 -1
  1087. package/dist/ir/numeric-call-specialization.d.ts +8 -0
  1088. package/dist/ir/numeric-call-specialization.js +198 -0
  1089. package/dist/ir/numeric-call-specialization.js.map +1 -0
  1090. package/dist/ir/runtime-features.d.ts +221 -0
  1091. package/dist/ir/runtime-features.js +552 -0
  1092. package/dist/ir/runtime-features.js.map +1 -0
  1093. package/dist/ir/runtime-features.test.d.ts +1 -0
  1094. package/dist/ir/runtime-features.test.js +98 -0
  1095. package/dist/ir/runtime-features.test.js.map +1 -0
  1096. package/dist/ir/scalar-records.js +130 -40
  1097. package/dist/ir/scalar-records.js.map +1 -1
  1098. package/dist/ir/scalar-records.test.js +146 -27
  1099. package/dist/ir/scalar-records.test.js.map +1 -1
  1100. package/dist/ir/serialize.d.ts +1 -1
  1101. package/dist/ir/serialize.js +7 -5
  1102. package/dist/ir/serialize.js.map +1 -1
  1103. package/dist/ir/serialize.test.js +44 -9
  1104. package/dist/ir/serialize.test.js.map +1 -1
  1105. package/dist/ir/traverse.js +156 -43
  1106. package/dist/ir/traverse.js.map +1 -1
  1107. package/dist/ir/traverse.test.js +99 -24
  1108. package/dist/ir/traverse.test.js.map +1 -1
  1109. package/dist/ir/validate.d.ts +1 -31
  1110. package/dist/ir/validate.js +869 -1910
  1111. package/dist/ir/validate.js.map +1 -1
  1112. package/dist/ir/validate.test.js +697 -114
  1113. package/dist/ir/validate.test.js.map +1 -1
  1114. package/dist/library/cache-primitives.js +9 -10
  1115. package/dist/library/cache-primitives.js.map +1 -1
  1116. package/dist/library/cache-reset.test.js +2 -1
  1117. package/dist/library/cache-reset.test.js.map +1 -1
  1118. package/dist/library/compiler-self-identity.js +11 -5
  1119. package/dist/library/compiler-self-identity.js.map +1 -1
  1120. package/dist/library/compiler-self-identity.test.js +10 -3
  1121. package/dist/library/compiler-self-identity.test.js.map +1 -1
  1122. package/dist/library/fence-eval.js +24 -7
  1123. package/dist/library/fence-eval.js.map +1 -1
  1124. package/dist/library/fence-eval.test.js +31 -7
  1125. package/dist/library/fence-eval.test.js.map +1 -1
  1126. package/dist/library/int-infer.js +199 -59
  1127. package/dist/library/int-infer.js.map +1 -1
  1128. package/dist/library/int-infer.test.js +137 -61
  1129. package/dist/library/int-infer.test.js.map +1 -1
  1130. package/dist/library/ir-policy.d.ts +27 -0
  1131. package/dist/library/ir-policy.js +234 -0
  1132. package/dist/library/ir-policy.js.map +1 -0
  1133. package/dist/library/library-cache.js +40 -17
  1134. package/dist/library/library-cache.js.map +1 -1
  1135. package/dist/library/library-cache.test.js +29 -18
  1136. package/dist/library/library-cache.test.js.map +1 -1
  1137. package/dist/library/library-profile.js +68 -13
  1138. package/dist/library/library-profile.js.map +1 -1
  1139. package/dist/library/prepare.js +48 -20
  1140. package/dist/library/prepare.js.map +1 -1
  1141. package/dist/library/semantic-source.js +16 -14
  1142. package/dist/library/semantic-source.js.map +1 -1
  1143. package/dist/library/semantic-source.test.js +9 -14
  1144. package/dist/library/semantic-source.test.js.map +1 -1
  1145. package/dist/library/sidecar-validate.js +53 -12
  1146. package/dist/library/sidecar-validate.js.map +1 -1
  1147. package/dist/library/sidecar.js +85 -24
  1148. package/dist/library/sidecar.js.map +1 -1
  1149. package/dist/library/trap-teaching.js +11 -2
  1150. package/dist/library/trap-teaching.js.map +1 -1
  1151. package/dist/native/cache.js +10 -4
  1152. package/dist/native/cache.js.map +1 -1
  1153. package/dist/native/cli.js +34 -9
  1154. package/dist/native/cli.js.map +1 -1
  1155. package/dist/native/compiler.js +191 -54
  1156. package/dist/native/compiler.js.map +1 -1
  1157. package/dist/native/compiler.test.js +134 -33
  1158. package/dist/native/compiler.test.js.map +1 -1
  1159. package/dist/native/comptime.js +23 -7
  1160. package/dist/native/comptime.js.map +1 -1
  1161. package/dist/native/comptime.test.js +26 -6
  1162. package/dist/native/comptime.test.js.map +1 -1
  1163. package/dist/native/executable-cache.js +77 -27
  1164. package/dist/native/executable-cache.js.map +1 -1
  1165. package/dist/native/executable-cache.test.js +41 -6
  1166. package/dist/native/executable-cache.test.js.map +1 -1
  1167. package/dist/native/file-identity.js +9 -2
  1168. package/dist/native/file-identity.js.map +1 -1
  1169. package/dist/native/file-identity.test.js.map +1 -1
  1170. package/dist/native/library.js +50 -12
  1171. package/dist/native/library.js.map +1 -1
  1172. package/dist/native/prepare.js +121 -34
  1173. package/dist/native/prepare.js.map +1 -1
  1174. package/dist/native/prepare.test.js +22 -6
  1175. package/dist/native/prepare.test.js.map +1 -1
  1176. package/dist/native/runtime-typescript.js +24 -11
  1177. package/dist/native/runtime-typescript.js.map +1 -1
  1178. package/dist/native/runtime-typescript.test.js.map +1 -1
  1179. package/dist/native/sanitizer.js +71 -18
  1180. package/dist/native/sanitizer.js.map +1 -1
  1181. package/dist/native/sanitizer.test.js +78 -20
  1182. package/dist/native/sanitizer.test.js.map +1 -1
  1183. package/dist/native/task.js.map +1 -1
  1184. package/dist/native/task.test.js +7 -2
  1185. package/dist/native/task.test.js.map +1 -1
  1186. package/dist/native/toolchain.js +68 -26
  1187. package/dist/native/toolchain.js.map +1 -1
  1188. package/dist/native/toolchain.test.js +59 -20
  1189. package/dist/native/toolchain.test.js.map +1 -1
  1190. package/dist/startup-cache.d.ts +1 -1
  1191. package/dist/startup-cache.js +1 -1
  1192. package/dist/startup-cache.js.map +1 -1
  1193. package/dist/timing.js.map +1 -1
  1194. package/package.json +20 -20
  1195. package/surface-manifest.json +30 -2
  1196. package/dist/frontend/lowering/lower-builtins.d.ts +0 -601
  1197. package/dist/frontend/lowering/lower-builtins.js +0 -8986
  1198. package/dist/frontend/lowering/lower-builtins.js.map +0 -1
  1199. package/dist/frontend/lowering/lower-containers.d.ts +0 -382
  1200. package/dist/frontend/lowering/lower-containers.js +0 -7344
  1201. package/dist/frontend/lowering/lower-containers.js.map +0 -1
@@ -0,0 +1,1611 @@
1
+ import { boolLit, countedFor, numLit, varRef } from "../../../ir/build.js";
2
+ import { InternalCompilerError } from "../../../errors.js";
3
+ import * as ts from "../../ts7/adapter.js";
4
+ import { BOOL, DYN, F64, STRING, UNDEFINED_T, VOID, arrayOf, funcOf, isUnitType, typeEquals, } from "../../../ir/ir.js";
5
+ import { isJsSourceFile, locOf } from "../../program.js";
6
+ import { buildArraySortFn } from "../lower-array-sort.js";
7
+ import { arrayIndexPresent, arrayValueRead, arrayValueStore, arrayValueType, currentArrayIndexPresent, } from "../array-values.js";
8
+ import { typeKey } from "../../type-mapper.js";
9
+ import { lowerArrayCallback, requireProducedArrayElement, callbackArrayElement, } from "./callback-arguments.js";
10
+ import { reverseArrayLoop, arrayLengthDeclaration, arrayCallbackParams, arrayCallbackLocals, callArrayCallback, } from "./array-iteration.js";
11
+ import { dynamicReceiverThrows } from "./dynamic-receivers.js";
12
+ import { defaultAfterUndefined, lowerStaticallyUndefinedArgument } from "../optional-arguments.js";
13
+ /** `a.map(fn)` / `a.filter(fn)` / `a.forEach(fn)` desugar to a direct
14
+ * call of a synthetic module function — one per method + element/result
15
+ * type + callback-arity combination, interned — whose body is a plain
16
+ * loop over EXISTING IR nodes (varDecl/for/arrayGet/callValue/push/
17
+ * return). No new IR kinds, no backend or runtime involvement. JS
18
+ * semantics: the length is read ONCE up front (Array.prototype.map/
19
+ * filter/forEach cache it — elements appended by the callback are not
20
+ * visited), elements are read fresh each iteration, callbacks run
21
+ * left-to-right and receive whatever prefix of (element, index, array)
22
+ * they declare. */
23
+ export function lowerArrayHofCall(lowerer, call, access, method, elem) {
24
+ const loc = locOf(call);
25
+ const receiver = lowerer.lowerExpr(access.expression);
26
+ const argNode = call.arguments[0];
27
+ if (!argNode)
28
+ lowerer.unsupported("SC1090", call, "this call form"); // tsc-guarded
29
+ const booleanFilter = method === "filter" &&
30
+ ts.isIdentifier(argNode) &&
31
+ argNode.text === "Boolean" &&
32
+ lowerer.isStdlibSymbol(lowerer.resolveValueSymbol(argNode) ?? undefined);
33
+ const valueT = arrayValueType(lowerer, elem);
34
+ if (booleanFilter) {
35
+ if (valueT.kind === "union")
36
+ lowerer.requireTruthyUnion(valueT.unionId, argNode);
37
+ if (valueT.kind === "dyn" ||
38
+ valueT.kind === "jsval" ||
39
+ valueT.kind === "void" ||
40
+ isUnitType(valueT)) {
41
+ lowerer.badType(argNode, lowerer.typeOf(argNode));
42
+ }
43
+ }
44
+ const callback = booleanFilter
45
+ ? { fnArg: truthyFilterCallback(lowerer, valueT, loc), arity: 1 }
46
+ : lowerArrayCallback(lowerer, argNode, [valueT], arrayOf(elem));
47
+ const { fnArg, arity } = callback;
48
+ const fnRet = fnArg.type.ret;
49
+ if (method === "map" && (fnRet.kind === "void" || fnRet.kind === "func")) {
50
+ // The result array U[] is unrepresentable here (no void elements;
51
+ // the map helper's closure-returning form has no fixture-backed
52
+ // story yet).
53
+ lowerer.badType(call, lowerer.typeOf(call));
54
+ }
55
+ if (method === "map")
56
+ requireProducedArrayElement(lowerer, call, "'.map()'", fnRet);
57
+ // JS applies ToBoolean to whatever the predicate answers, so a non-bool
58
+ // result is not an error — the filter loop wraps the call in the same
59
+ // toBool an `if` statement would apply. The island/dyn shapes, whose
60
+ // truthiness needs the engine, and void, whose real answer the ABI has
61
+ // already discarded, keep the fence. No separate
62
+ // requireTruthyUnion call belongs here: its check (no dyn/caught arm)
63
+ // IS filterPredicateOk's union branch, so it could never speak.
64
+ if (method === "filter" && !filterPredicateOk(lowerer, fnRet)) {
65
+ if (fnRet.kind === "void") {
66
+ lowerer.unsupported("SC1090", argNode, "'.filter()' with a void-returning predicate (the callback return value is erased before its truthiness can be tested)");
67
+ }
68
+ lowerer.badType(argNode, lowerer.typeOf(argNode));
69
+ }
70
+ const outElem = method === "filter"
71
+ ? filterResultElem(lowerer, call, argNode, elem, valueT, booleanFilter)
72
+ : callbackArrayElement(lowerer, call, fnRet);
73
+ const helper = arrayHofHelper(lowerer, method, elem, fnRet, arity, loc, outElem);
74
+ const resultType = method === "map" || method === "filter" ? arrayOf(outElem) : VOID;
75
+ return { kind: "call", callee: helper, args: [receiver, fnArg], type: resultType, loc };
76
+ }
77
+ /** The checker-selected element of a filter result, with the same trust
78
+ * boundary as the historical narrowing filter: an inferred inline type
79
+ * predicate may prove one source arm; a written predicate annotation may
80
+ * not. Boolean is safe when every discarded arm is a nullish unit. */
81
+ function filterResultElem(lowerer, call, argNode, elem, valueT, booleanFilter) {
82
+ const callT = lowerer.typeOf(call);
83
+ const result = lowerer.mapTypeOf(callT);
84
+ let outElem = result?.kind === "array" ? result.elem : elem;
85
+ const access = ts.isPropertyAccessExpression(call.expression) ? call.expression : null;
86
+ const checkerReceiver = access ? lowerer.mapTypeOf(lowerer.typeOf(access.expression)) : null;
87
+ // Equal checker elements mean the filter introduces no new refinement.
88
+ // Preserve the stored element layout even if an earlier predicate or
89
+ // evolving-any analysis changed the receiver's flow type.
90
+ if (result?.kind === "array" &&
91
+ checkerReceiver?.kind === "array" &&
92
+ typeEquals(result.elem, checkerReceiver.elem)) {
93
+ return elem;
94
+ }
95
+ if (!typeEquals(outElem, elem)) {
96
+ const contextual = lowerer.mapTypeOf(lowerer.checker.getContextualType(call) ?? callT);
97
+ if (contextual?.kind === "array" && typeEquals(contextual.elem, elem))
98
+ outElem = elem;
99
+ }
100
+ if (typeEquals(outElem, elem))
101
+ return elem;
102
+ const annotateEscape = "keep the receiver's element type instead — annotate the callback's return ': boolean' " +
103
+ "(the checker then skips the predicate) or annotate the result with the receiver's own " +
104
+ "element type — and narrow the elements after";
105
+ if (!booleanFilter) {
106
+ if (!ts.isArrowFunction(argNode) && !ts.isFunctionExpression(argNode)) {
107
+ lowerer.unsupported("SC1090", argNode, `narrowing '.filter' through a callback VALUE (only an inline callback whose predicate ` +
108
+ `the checker inferred can re-tag — ${annotateEscape})`);
109
+ }
110
+ if (argNode.type) {
111
+ lowerer.unsupported("SC1090", argNode, `narrowing '.filter' with a hand-written type predicate (a written 'x is T' is an ` +
112
+ `unchecked assertion nothing validates at runtime — ${annotateEscape})`);
113
+ }
114
+ }
115
+ if (valueT.kind !== "union" || lowerer.armTag(valueT.unionId, outElem) < 0) {
116
+ const multiArm = outElem.kind === "union";
117
+ lowerer.unsupported("SC1090", call, `'.filter' narrowing '${lowerer.fmt(elem)}' elements to ` +
118
+ `${multiArm ? `the multi-arm '${lowerer.fmt(outElem)}'` : `'${lowerer.fmt(outElem)}'`} ` +
119
+ `(${multiArm ? "only a SINGLE arm re-tags" : "only a single runtime arm re-tags"} — ${annotateEscape})`);
120
+ }
121
+ if (booleanFilter) {
122
+ const arms = lowerer.unions.get(valueT.unionId)?.arms ?? [];
123
+ if (arms.some((arm) => !typeEquals(arm, outElem) && !isUnitType(arm))) {
124
+ lowerer.unsupported("SC1090", call, `'.filter(Boolean)' narrowing '${lowerer.fmt(elem)}' to '${lowerer.fmt(outElem)}' ` +
125
+ "when another truthy arm could survive");
126
+ }
127
+ }
128
+ return outElem;
129
+ }
130
+ /** A native closure for the ambient Boolean callback. Reifying the
131
+ * JavaScript constructor itself is unnecessary; Array#filter only observes
132
+ * its one-argument ToBoolean result. */
133
+ function truthyFilterCallback(lowerer, valueT, loc) {
134
+ const fnT = { kind: "func", params: [valueT], ret: BOOL };
135
+ const key = `filterBoolean:${typeKey(valueT)}`;
136
+ let name = lowerer.arrHofHelpers.get(key);
137
+ if (!name) {
138
+ name = `%arr.filterBoolean.${lowerer.arrHofHelpers.size}`;
139
+ lowerer.arrHofHelpers.set(key, name);
140
+ const value = varRef("v.0", valueT, loc);
141
+ lowerer.liftedFns.push({
142
+ name,
143
+ params: [{ localId: "v.0", name: "v", type: valueT }],
144
+ returnType: BOOL,
145
+ locals: [{ id: "v.0", name: "v", type: valueT, mutable: false }],
146
+ body: [{ kind: "return", value: { kind: "toBool", operand: value, type: BOOL, loc }, loc }],
147
+ loc,
148
+ });
149
+ }
150
+ return { kind: "closure", fnName: name, captures: [], type: fnT, loc };
151
+ }
152
+ /** The predicate result kinds `.filter()` accepts. JS applies ToBoolean to
153
+ * whatever the callback answers, so a bool is not required: the scalars and
154
+ * the reference kinds have constant or by-value answers, checked-dynamic
155
+ * values ask their runtime kind, and a union is fine when every arm does.
156
+ * void/jsval/caught stay out — see below. */
157
+ function filterPredicateOk(lowerer, ret) {
158
+ if (ret.kind === "bool")
159
+ return true;
160
+ // VOID is a TYPE erasure, not a runtime value: TS lets a value-returning
161
+ // function sit in a void-returning slot (`const p: (n: number) => void =
162
+ // (n) => n`), so the predicate's real answer can be truthy while the
163
+ // compiled ABI has already discarded it. Treating void as constantly
164
+ // falsy would silently answer [] where Node answers [1]. Fenced until
165
+ // the returned value can be preserved through the void ABI.
166
+ // A checked-dynamic value retains its runtime kind, so scr_dyn_truthy can
167
+ // apply JavaScript ToBoolean exactly. Island and caught values stay out.
168
+ if (ret.kind === "void")
169
+ return false;
170
+ if (ret.kind === "dyn")
171
+ return true;
172
+ if (ret.kind === "jsval" || ret.kind === "caught")
173
+ return false;
174
+ if (ret.kind === "union") {
175
+ const def = lowerer.unions.get(ret.unionId);
176
+ return def !== undefined && def.arms.every((a) => a.kind !== "dyn" && a.kind !== "caught");
177
+ }
178
+ return true;
179
+ }
180
+ /** The filter loop's condition: the predicate's result put through JS
181
+ * ToBoolean. A bool answer is already the condition; everything else takes
182
+ * the same `toBool` wrapper an `if` statement would apply (a union answer
183
+ * routes through its interned per-arm truthy helper). */
184
+ function filterCond(call, fnRet, loc) {
185
+ if (fnRet.kind === "bool")
186
+ return call;
187
+ // No constant-false arm here: void is fenced at the call site, and a
188
+ // bare undefinedT/nullT return cannot arise (mapType sends `undefined`/
189
+ // `void` returns to void and a standalone `null` return to the unit-ONLY
190
+ // UNION, which routes through toBool below; ir/validate.ts rejects a
191
+ // bare unit return type outright). filterPredicateOk already rejected
192
+ // unsafe union arms (dyn/caught) at the call site, where a real node
193
+ // exists for the diagnostic. A bare dyn value is handled directly by
194
+ // the runtime's kind-aware ToBoolean.
195
+ return { kind: "toBool", operand: call, type: BOOL, loc };
196
+ }
197
+ /** Interned synthetic loop function for one (method, elem, fnRet, arity)
198
+ * combo. Named `%arr.<method>.<n>` ('%' keeps it out of the user
199
+ * namespace); rides `liftedFns` into the module like a lifted lambda (it
200
+ * is a plain function — no captures). */
201
+ function arrayHofHelper(lowerer, method, elem, fnRet, arity, loc, outElem = fnRet) {
202
+ const key = `${method}:${typeKey(elem)}:${typeKey(fnRet)}:${arity}:${typeKey(outElem)}`;
203
+ const existing = lowerer.arrHofHelpers.get(key);
204
+ if (existing)
205
+ return existing;
206
+ const name = `%arr.${method}.${lowerer.arrHofHelpers.size}`;
207
+ lowerer.arrHofHelpers.set(key, name);
208
+ lowerer.liftedFns.push(buildArrayHofFn(lowerer, name, method, elem, fnRet, arity, loc, outElem));
209
+ return name;
210
+ }
211
+ /** The TS 5.2+ callable-union array rule: a `T[] | U[]` receiver exposes
212
+ * common HOFs with a callback over `T | U`. The runtime value remains the
213
+ * original concrete array arm — never a copied `(T | U)[]` — and an
214
+ * arm-specific function adapter wraps the element and receiver arguments
215
+ * into the union-wide callback ABI. That preserves sparse-array reads,
216
+ * callback mutation, and the callback's third-argument identity. */
217
+ export function lowerArrayUnionHofCall(lowerer, call, access, receiverT) {
218
+ const method = access.name.text;
219
+ if (method !== "map" && method !== "forEach")
220
+ return null;
221
+ if (!lowerer.isStdlibMember(access))
222
+ return null;
223
+ const def = lowerer.unions.get(receiverT.unionId);
224
+ if (!def || def.arms.length < 2 || !def.arms.every((arm) => arm.kind === "array"))
225
+ return null;
226
+ if (call.arguments.length !== 1 || !call.arguments[0])
227
+ return null;
228
+ const arrays = def.arms;
229
+ const valueArms = [];
230
+ const addValueArm = (type) => {
231
+ if (type.kind === "dyn" ||
232
+ type.kind === "jsval" ||
233
+ type.kind === "caught" ||
234
+ type.kind === "void")
235
+ return false;
236
+ if (type.kind === "union") {
237
+ const inner = lowerer.unions.get(type.unionId);
238
+ if (!inner)
239
+ return false;
240
+ for (const arm of inner.arms) {
241
+ if (!valueArms.some((candidate) => typeEquals(candidate, arm)))
242
+ valueArms.push(arm);
243
+ }
244
+ return true;
245
+ }
246
+ if (!valueArms.some((candidate) => typeEquals(candidate, type)))
247
+ valueArms.push(type);
248
+ return true;
249
+ };
250
+ for (const array of arrays) {
251
+ if (!addValueArm(array.elem))
252
+ return null;
253
+ }
254
+ const valueT = valueArms.length === 1
255
+ ? valueArms[0]
256
+ : { kind: "union", unionId: lowerer.unions.intern(valueArms) };
257
+ const argNode = call.arguments[0];
258
+ const { fnArg, arity } = lowerArrayCallback(lowerer, argNode, [valueT], receiverT);
259
+ const fnRet = fnArg.type.ret;
260
+ if (method === "map" && (fnRet.kind === "void" || fnRet.kind === "func")) {
261
+ lowerer.badType(call, lowerer.typeOf(call));
262
+ }
263
+ if (method === "map")
264
+ requireProducedArrayElement(lowerer, call, "'.map()'", fnRet);
265
+ const outElem = method === "map" ? callbackArrayElement(lowerer, call, fnRet) : VOID;
266
+ const resultT = method === "map" ? arrayOf(outElem) : VOID;
267
+ for (const array of arrays) {
268
+ const armFnT = funcOf([arrayValueType(lowerer, array.elem), F64, array].slice(0, arity), fnRet);
269
+ if (!lowerer.cleanFuncAdaptable(fnArg.type, armFnT))
270
+ return null;
271
+ }
272
+ const helper = arrayUnionHofHelper(lowerer, method, receiverT, arrays, fnArg.type, arity, fnRet, outElem, locOf(call));
273
+ return {
274
+ kind: "call",
275
+ callee: helper,
276
+ args: [
277
+ lowerer.coerceInto(access.expression, lowerer.lowerExpr(access.expression), receiverT),
278
+ fnArg,
279
+ ],
280
+ type: resultT,
281
+ loc: locOf(call),
282
+ };
283
+ }
284
+ function arrayUnionHofHelper(lowerer, method, receiverT, arrays, callbackT, arity, fnRet, outElem, loc) {
285
+ const resultT = method === "map" ? arrayOf(outElem) : VOID;
286
+ const key = `union:${method}:${receiverT.unionId}:${typeKey(callbackT)}:${typeKey(resultT)}`;
287
+ const existing = lowerer.arrHofHelpers.get(key);
288
+ if (existing)
289
+ return existing;
290
+ const name = `%arr.union.${lowerer.arrHofHelpers.size}`;
291
+ lowerer.arrHofHelpers.set(key, name);
292
+ const receiver = varRef("a.0", receiverT, loc);
293
+ const callback = varRef("f.0", callbackT, loc);
294
+ const branch = (array) => {
295
+ const tag = lowerer.armTag(receiverT.unionId, array);
296
+ const concrete = {
297
+ kind: "unionNarrow",
298
+ unionId: receiverT.unionId,
299
+ tag,
300
+ value: receiver,
301
+ type: array,
302
+ loc,
303
+ };
304
+ const armFnT = funcOf([arrayValueType(lowerer, array.elem), F64, array].slice(0, arity), fnRet);
305
+ const adapted = lowerer.coerceToExpected(callback, armFnT);
306
+ if (!typeEquals(adapted.type, armFnT)) {
307
+ throw new InternalCompilerError("lowerer bug: union-array callback stopped adapting");
308
+ }
309
+ const callee = arrayHofHelper(lowerer, method, array.elem, fnRet, arity, loc, outElem);
310
+ const invoke = { kind: "call", callee, args: [concrete, adapted], type: resultT, loc };
311
+ return resultT.kind === "void"
312
+ ? [
313
+ { kind: "exprStmt", expr: invoke, loc },
314
+ { kind: "return", value: null, loc },
315
+ ]
316
+ : [{ kind: "return", value: invoke, loc }];
317
+ };
318
+ let body = branch(arrays[arrays.length - 1]);
319
+ for (let i = arrays.length - 2; i >= 0; i--) {
320
+ const array = arrays[i];
321
+ body = [
322
+ {
323
+ kind: "if",
324
+ cond: {
325
+ kind: "unionIsTag",
326
+ unionId: receiverT.unionId,
327
+ tag: lowerer.armTag(receiverT.unionId, array),
328
+ negated: false,
329
+ value: receiver,
330
+ type: BOOL,
331
+ loc,
332
+ },
333
+ then: branch(array),
334
+ else_: body,
335
+ loc,
336
+ },
337
+ ];
338
+ }
339
+ lowerer.liftedFns.push({
340
+ name,
341
+ params: [
342
+ { localId: "a.0", name: "a", type: receiverT },
343
+ { localId: "f.0", name: "f", type: callbackT },
344
+ ],
345
+ returnType: resultT,
346
+ locals: [
347
+ { id: "a.0", name: "a", type: receiverT, mutable: false },
348
+ { id: "f.0", name: "f", type: callbackT, mutable: false },
349
+ ],
350
+ body,
351
+ loc,
352
+ });
353
+ return name;
354
+ }
355
+ /** The loop body of one synthetic array HOF, from existing IR nodes:
356
+ *
357
+ * map: out = []; n = a.length; for (i = 0; i < n; i++) out.push(f(a[i])); return out;
358
+ * filter: out = []; n = a.length; for (...) { v = a[i]; if (f(v)) out.push(v); } return out;
359
+ * forEach: n = a.length; for (...) f(a[i]);
360
+ *
361
+ * `filter` reads the element once into `v` so the callback and the push
362
+ * see the same value even if the callback mutates `a[i]` (JS-exact).
363
+ * `arity` is the callback's declared parameter count (1–3): the loop
364
+ * passes the index and the receiver itself after the element when the
365
+ * callback names them, exactly the arguments JS supplies. */
366
+ function buildArrayHofFn(lowerer, name, method, elem, fnRet, arity, loc, outElem) {
367
+ const arrT = arrayOf(elem);
368
+ const valueT = arrayValueType(lowerer, elem);
369
+ const fnT = funcOf([arrayValueType(lowerer, elem), F64, arrT].slice(0, arity), fnRet);
370
+ const locals = arrayCallbackLocals(arrT, fnT);
371
+ const params = arrayCallbackParams(arrT, fnT);
372
+ const callF = (arg) => callArrayCallback(arrT, fnT, fnRet, arity, arg, loc);
373
+ const getElem = arrayValueRead(lowerer, varRef("a.0", arrT, loc), varRef("i.0", F64, loc), elem, loc);
374
+ const hasElem = {
375
+ kind: "arrayHas",
376
+ arr: varRef("a.0", arrT, loc),
377
+ index: varRef("i.0", F64, loc),
378
+ type: BOOL,
379
+ loc,
380
+ };
381
+ const readLen = arrayLengthDeclaration(arrT, loc);
382
+ const forLoop = (body) => countedFor(loc, varRef("n.0", F64, loc), () => body);
383
+ let returnType;
384
+ let body;
385
+ if (method === "map" || method === "flatMap") {
386
+ const outT = arrayOf(outElem);
387
+ locals.push({ id: "out.0", name: "out", type: outT, mutable: false }, { id: "mapped.0", name: "mapped", type: fnRet, mutable: false });
388
+ returnType = outT;
389
+ body = [
390
+ {
391
+ kind: "varDecl",
392
+ localId: "out.0",
393
+ init: { kind: "arrayLit", elems: [], type: outT, loc },
394
+ loc,
395
+ },
396
+ readLen,
397
+ ...(method === "map"
398
+ ? [
399
+ {
400
+ kind: "arraySetLength",
401
+ arr: varRef("out.0", outT, loc),
402
+ length: varRef("n.0", F64, loc),
403
+ loc,
404
+ },
405
+ ]
406
+ : []),
407
+ forLoop([
408
+ {
409
+ kind: "if",
410
+ cond: hasElem,
411
+ then: [
412
+ { kind: "varDecl", localId: "mapped.0", init: callF(getElem), loc },
413
+ arrayValueStore(lowerer, varRef("out.0", outT, loc), method === "map"
414
+ ? varRef("i.0", F64, loc)
415
+ : {
416
+ kind: "arrIntrinsic",
417
+ method: "length",
418
+ receiver: varRef("out.0", outT, loc),
419
+ args: [],
420
+ type: F64,
421
+ loc,
422
+ }, varRef("mapped.0", fnRet, loc), outElem, loc),
423
+ ],
424
+ else_: null,
425
+ loc,
426
+ },
427
+ ]),
428
+ { kind: "return", value: varRef("out.0", outT, loc), loc },
429
+ ];
430
+ }
431
+ else if (method === "filter") {
432
+ const outT = arrayOf(outElem);
433
+ locals.push({ id: "out.0", name: "out", type: outT, mutable: false }, { id: "v.0", name: "v", type: valueT, mutable: false });
434
+ returnType = outT;
435
+ const retained = typeEquals(outElem, elem)
436
+ ? varRef("v.0", valueT, loc)
437
+ : valueT.kind === "union"
438
+ ? {
439
+ kind: "unionNarrow",
440
+ unionId: valueT.unionId,
441
+ tag: lowerer.armTag(valueT.unionId, outElem),
442
+ value: varRef("v.0", valueT, loc),
443
+ type: outElem,
444
+ loc,
445
+ }
446
+ : varRef("v.0", valueT, loc);
447
+ body = [
448
+ {
449
+ kind: "varDecl",
450
+ localId: "out.0",
451
+ init: { kind: "arrayLit", elems: [], type: outT, loc },
452
+ loc,
453
+ },
454
+ readLen,
455
+ forLoop([
456
+ {
457
+ kind: "if",
458
+ cond: hasElem,
459
+ then: [
460
+ { kind: "varDecl", localId: "v.0", init: getElem, loc },
461
+ {
462
+ kind: "if",
463
+ // ToBoolean over the predicate's answer — inert when it already
464
+ // returned bool, the per-union helper when it returned a union.
465
+ cond: filterCond(callF(varRef("v.0", valueT, loc)), fnRet, loc),
466
+ then: [
467
+ arrayValueStore(lowerer, varRef("out.0", outT, loc), {
468
+ kind: "arrIntrinsic",
469
+ method: "length",
470
+ receiver: varRef("out.0", outT, loc),
471
+ args: [],
472
+ type: F64,
473
+ loc,
474
+ }, retained, outElem, loc),
475
+ ],
476
+ else_: null,
477
+ loc,
478
+ },
479
+ ],
480
+ else_: null,
481
+ loc,
482
+ },
483
+ ]),
484
+ { kind: "return", value: varRef("out.0", outT, loc), loc },
485
+ ];
486
+ }
487
+ else {
488
+ returnType = VOID;
489
+ body = [
490
+ readLen,
491
+ forLoop([
492
+ {
493
+ kind: "if",
494
+ cond: hasElem,
495
+ then: [{ kind: "exprStmt", expr: callF(getElem), loc }],
496
+ else_: null,
497
+ loc,
498
+ },
499
+ ]),
500
+ ];
501
+ }
502
+ return { name, params, returnType, locals, body, loc };
503
+ }
504
+ /** `a.find(f)` / `a.findIndex(f)` / `a.findLast(f)` / `a.findLastIndex(f)`
505
+ * / `a.some(f)` / `a.every(f)` — the early-return HOFs, same
506
+ * desugar-to-loop machinery. some/every return bool from a short-circuit
507
+ * loop; findIndex/findLastIndex return the first matching index or -1
508
+ * (plain f64 — no union). find/findLast return `T | undefined` — the
509
+ * checker's own result union —
510
+ * with the found element wrapped into its arm and the miss producing the
511
+ * undefined unit arm (for REF elements that arm is the unit instance, the
512
+ * standard union machinery). The Last pair is the SAME loop walked
513
+ * backwards (`i = n - 1; i >= 0; i--`), exactly the es2023 spec's
514
+ * descending index walk. Predicate results use JavaScript ToBoolean. */
515
+ export function lowerArrayFindLikeCall(lowerer, call, access, method, elem, bindUntyped = false) {
516
+ const loc = locOf(call);
517
+ const receiver = lowerer.lowerExpr(access.expression);
518
+ const arrT = arrayOf(elem);
519
+ const argNode = call.arguments[0];
520
+ if (!argNode)
521
+ lowerer.unsupported("SC1090", call, "this call form"); // tsc-guarded
522
+ const { fnArg, arity } = lowerArrayCallback(lowerer, argNode, [arrayValueType(lowerer, elem)], arrT, bindUntyped);
523
+ // JS takes the ToBoolean of the predicate's result — allowed wherever
524
+ // that ToBoolean has a static answer (bool passes through; f64/string
525
+ // by value; a truthy-answerable union by its arm — the
526
+ // `packages.some((p) => p.scripts[name])` idiom, whose callback
527
+ // returns the index read's `string | undefined`).
528
+ const fnRet = fnArg.type.ret;
529
+ const truthyRet = fnRet.kind === "bool" ||
530
+ fnRet.kind === "f64" ||
531
+ fnRet.kind === "string" ||
532
+ fnRet.kind === "dyn" ||
533
+ (fnRet.kind === "union" &&
534
+ (lowerer.unions.get(fnRet.unionId)?.arms ?? []).every((a) => a.kind !== "dyn" && a.kind !== "caught" && a.kind !== "jsval"));
535
+ if (!truthyRet)
536
+ lowerer.badType(argNode, lowerer.typeOf(argNode));
537
+ const last = method === "findLast" || method === "findLastIndex";
538
+ if (method === "some" ||
539
+ method === "every" ||
540
+ method === "findIndex" ||
541
+ method === "findLastIndex") {
542
+ const helper = method === "findIndex" || method === "findLastIndex"
543
+ ? findIndexHelper(lowerer, elem, fnRet, arity, last, loc)
544
+ : someEveryHelper(lowerer, method, elem, fnRet, arity, loc);
545
+ return {
546
+ kind: "call",
547
+ callee: helper,
548
+ args: [receiver, fnArg],
549
+ type: method === "findIndex" || method === "findLastIndex" ? F64 : BOOL,
550
+ loc,
551
+ };
552
+ }
553
+ // find visits holes as undefined and can infer a predicate that selects
554
+ // a subset of the element union. A result matching the receiver's flow
555
+ // element inherits that earlier refinement. Otherwise only an inline,
556
+ // inferred predicate proves a new narrowing; explicit assertions keep
557
+ // the same refusal boundary as filter.
558
+ const valueT = arrayValueType(lowerer, elem);
559
+ const checkerReceiver = lowerer.mapTypeOf(lowerer.typeOf(access.expression));
560
+ const checkerResult = lowerer.irTypeOf(call);
561
+ const unchangedElement = checkerReceiver?.kind === "array" &&
562
+ typeEquals(checkerResult, arrayValueType(lowerer, checkerReceiver.elem));
563
+ const resultT = bindUntyped ? valueT : checkerResult;
564
+ if (resultT.kind !== "union")
565
+ lowerer.badType(call, lowerer.typeOf(call)); // defensive: T | undefined always maps to a union
566
+ const undefTag = lowerer.armTag(resultT.unionId, UNDEFINED_T);
567
+ if (undefTag < 0)
568
+ lowerer.badType(call, lowerer.typeOf(call));
569
+ let retag = null;
570
+ if (!lowerer.coercibleValue(valueT, resultT)) {
571
+ const inline = ts.isArrowFunction(argNode) || ts.isFunctionExpression(argNode);
572
+ if (!unchangedElement && (!inline || argNode.type !== undefined)) {
573
+ lowerer.unsupported("SC1090", argNode, `narrowing '.${method}' requires an inline callback with an inferred predicate (annotate the return ': boolean' to keep the receiver's element type)`);
574
+ }
575
+ const signature = inline ? lowerer.checker.getSignatureFromDeclaration(argNode) : undefined;
576
+ const predicate = signature
577
+ ? lowerer.checker.getTypePredicateOfSignature(signature)
578
+ : undefined;
579
+ if ((!unchangedElement && (!predicate || predicate.parameterIndex !== 0)) ||
580
+ valueT.kind !== "union") {
581
+ lowerer.unsupported("SC1090", call, `'.${method}' result narrowing without a predicate over its element`);
582
+ }
583
+ retag = lowerer.narrowedRetagHelper(call, valueT.unionId, resultT.unionId, loc);
584
+ if (retag === null)
585
+ lowerer.unsupported("SC1090", call, `'.${method}' narrowing to an incompatible result layout`);
586
+ }
587
+ const helper = findHelper(lowerer, elem, resultT, undefTag, fnRet, arity, last, loc, retag);
588
+ return { kind: "call", callee: helper, args: [receiver, fnArg], type: resultT, loc };
589
+ }
590
+ /** ToBoolean of a predicate result inside a synthesized HOF helper — the
591
+ * ensureBool subset the find-like path admits (bool through; checked
592
+ * values via dynTest; f64/string/truthy-answerable unions via toBool). */
593
+ function predicateToBoolean(e) {
594
+ if (e.type.kind === "bool")
595
+ return e;
596
+ if (e.type.kind === "dyn")
597
+ return { kind: "dynTest", test: "truthy", value: e, type: BOOL, loc: e.loc };
598
+ return { kind: "toBool", operand: e, type: BOOL, loc: e.loc };
599
+ }
600
+ /** The find loop, from existing IR nodes:
601
+ *
602
+ * n = a.length;
603
+ * for (i = 0; i < n; i++) { v = a[i]; if (f(v)) return <v as result arm>; }
604
+ * return <undefined arm>;
605
+ */
606
+ function findHelper(lowerer, elem, resultT, undefTag, fnRet, arity, last, loc, retag) {
607
+ const method = last ? "findLast" : "find";
608
+ const key = `${method}:${typeKey(elem)}:${typeKey(resultT)}:${typeKey(fnRet)}:${arity}`;
609
+ const existing = lowerer.arrHofHelpers.get(key);
610
+ if (existing)
611
+ return existing;
612
+ const name = `%arr.${method}.${lowerer.arrHofHelpers.size}`;
613
+ lowerer.arrHofHelpers.set(key, name);
614
+ const arrT = arrayOf(elem);
615
+ const fnT = funcOf([arrayValueType(lowerer, elem), F64, arrT].slice(0, arity), fnRet);
616
+ const valueT = arrayValueType(lowerer, elem);
617
+ const v = varRef("v.0", valueT, loc);
618
+ const found = retag === null
619
+ ? lowerer.coerceToExpected(v, resultT)
620
+ : { kind: "call", callee: retag, args: [v], type: resultT, loc };
621
+ const miss = {
622
+ kind: "unionWrap",
623
+ unionId: resultT.unionId,
624
+ tag: undefTag,
625
+ value: { kind: "unitLit", unit: "undefined", type: UNDEFINED_T, loc },
626
+ type: resultT,
627
+ loc,
628
+ };
629
+ const visitBody = [
630
+ {
631
+ kind: "varDecl",
632
+ localId: "v.0",
633
+ init: arrayValueRead(lowerer, varRef("a.0", arrT, loc), varRef("i.0", F64, loc), elem, loc),
634
+ loc,
635
+ },
636
+ {
637
+ kind: "if",
638
+ cond: predicateToBoolean(callArrayCallback(arrT, fnT, fnRet, arity, v, loc)),
639
+ then: [{ kind: "return", value: found, loc }],
640
+ else_: null,
641
+ loc,
642
+ },
643
+ ];
644
+ const visit = visitBody;
645
+ const loop = last
646
+ ? reverseArrayLoop(loc, visit)
647
+ : countedFor(loc, varRef("n.0", F64, loc), () => visit);
648
+ const body = [
649
+ arrayLengthDeclaration(arrT, loc),
650
+ loop,
651
+ { kind: "return", value: miss, loc },
652
+ ];
653
+ lowerer.liftedFns.push({
654
+ name,
655
+ params: arrayCallbackParams(arrT, fnT),
656
+ returnType: resultT,
657
+ locals: [
658
+ ...arrayCallbackLocals(arrT, fnT),
659
+ { id: "v.0", name: "v", type: valueT, mutable: false },
660
+ ],
661
+ body,
662
+ loc,
663
+ });
664
+ return name;
665
+ }
666
+ /** The findIndex/findLastIndex loop — find's index-returning sibling, no
667
+ * union; findLastIndex is the identical loop walked backwards:
668
+ *
669
+ * n = a.length; for (...) if (f(a[i], i, a)) return i; return -1;
670
+ */
671
+ function findIndexHelper(lowerer, elem, fnRet, arity, last, loc) {
672
+ const method = last ? "findLastIndex" : "findIndex";
673
+ const key = `${method}:${typeKey(elem)}:${typeKey(fnRet)}:${arity}`;
674
+ const existing = lowerer.arrHofHelpers.get(key);
675
+ if (existing)
676
+ return existing;
677
+ const name = `%arr.${method}.${lowerer.arrHofHelpers.size}`;
678
+ lowerer.arrHofHelpers.set(key, name);
679
+ const arrT = arrayOf(elem);
680
+ const fnT = funcOf([arrayValueType(lowerer, elem), F64, arrT].slice(0, arity), fnRet);
681
+ const visit = [
682
+ {
683
+ kind: "if",
684
+ cond: predicateToBoolean(callArrayCallback(arrT, fnT, fnRet, arity, arrayValueRead(lowerer, varRef("a.0", arrT, loc), varRef("i.0", F64, loc), elem, loc), loc)),
685
+ then: [{ kind: "return", value: varRef("i.0", F64, loc), loc }],
686
+ else_: null,
687
+ loc,
688
+ },
689
+ ];
690
+ const loop = last
691
+ ? reverseArrayLoop(loc, visit)
692
+ : countedFor(loc, varRef("n.0", F64, loc), () => visit);
693
+ const body = [
694
+ arrayLengthDeclaration(arrT, loc),
695
+ loop,
696
+ { kind: "return", value: { kind: "numLit", value: -1, type: F64, loc }, loc },
697
+ ];
698
+ lowerer.liftedFns.push({
699
+ name,
700
+ params: arrayCallbackParams(arrT, fnT),
701
+ returnType: F64,
702
+ locals: [...arrayCallbackLocals(arrT, fnT)],
703
+ body,
704
+ loc,
705
+ });
706
+ return name;
707
+ }
708
+ /** The some/every loops — short-circuit early returns, JS-exact:
709
+ *
710
+ * some: n = a.length; for (...) if (f(a[i])) return true; return false;
711
+ * every: n = a.length; for (...) if (!f(a[i])) return false; return true;
712
+ */
713
+ function someEveryHelper(lowerer, method, elem, fnRet, arity, loc) {
714
+ const key = `${method}:${typeKey(elem)}:${typeKey(fnRet)}:${arity}`;
715
+ const existing = lowerer.arrHofHelpers.get(key);
716
+ if (existing)
717
+ return existing;
718
+ const name = `%arr.${method}.${lowerer.arrHofHelpers.size}`;
719
+ lowerer.arrHofHelpers.set(key, name);
720
+ const arrT = arrayOf(elem);
721
+ const fnT = funcOf([arrayValueType(lowerer, elem), F64, arrT].slice(0, arity), fnRet);
722
+ const callF = predicateToBoolean(callArrayCallback(arrT, fnT, fnRet, arity, arrayValueRead(lowerer, varRef("a.0", arrT, loc), varRef("i.0", F64, loc), elem, loc), loc));
723
+ const body = [
724
+ arrayLengthDeclaration(arrT, loc),
725
+ countedFor(loc, varRef("n.0", F64, loc), () => [
726
+ {
727
+ kind: "if",
728
+ cond: currentArrayIndexPresent(arrT, loc),
729
+ then: [
730
+ {
731
+ kind: "if",
732
+ cond: method === "some"
733
+ ? callF
734
+ : { kind: "unary", op: "!", operand: callF, type: BOOL, loc },
735
+ then: [{ kind: "return", value: boolLit(method === "some", loc), loc }],
736
+ else_: null,
737
+ loc,
738
+ },
739
+ ],
740
+ else_: null,
741
+ loc,
742
+ },
743
+ ]),
744
+ { kind: "return", value: boolLit(method !== "some", loc), loc },
745
+ ];
746
+ lowerer.liftedFns.push({
747
+ name,
748
+ params: arrayCallbackParams(arrT, fnT),
749
+ returnType: BOOL,
750
+ locals: [...arrayCallbackLocals(arrT, fnT)],
751
+ body,
752
+ loc,
753
+ });
754
+ return name;
755
+ }
756
+ /** `a.flatMap(f)` — map plus a one-level flatten. A callback returning
757
+ * `U[]` appends the returned array's elements per receiver element; a
758
+ * callback returning a non-array U doesn't flatten (JS pushes it as-is),
759
+ * which IS map — those calls share map's interned helper. A union return
760
+ * mixing array and non-array arms would need a per-value flatten decision
761
+ * — fenced. */
762
+ export function lowerArrayFlatMapCall(lowerer, call, access, elem) {
763
+ const loc = locOf(call);
764
+ const receiver = lowerer.lowerExpr(access.expression);
765
+ const arrT = arrayOf(elem);
766
+ const argNode = call.arguments[0];
767
+ if (!argNode)
768
+ lowerer.unsupported("SC1090", call, "this call form"); // tsc-guarded
769
+ const { fnArg, arity } = lowerArrayCallback(lowerer, argNode, [arrayValueType(lowerer, elem)], arrT);
770
+ const fnRet = fnArg.type.ret;
771
+ if (fnRet.kind === "dyn" ||
772
+ fnRet.kind === "jsval" ||
773
+ (fnRet.kind === "record" && lowerer.shapes.get(fnRet.shapeId)?.tuple)) {
774
+ return {
775
+ kind: "dynInvoke",
776
+ recv: { kind: "dynFrom", value: receiver, liveRef: true, type: DYN, loc },
777
+ method: "flatMap",
778
+ calleeName: access.getText(),
779
+ args: [{ kind: "dynFrom", value: fnArg, type: DYN, loc }],
780
+ type: DYN,
781
+ loc,
782
+ };
783
+ }
784
+ if (fnRet.kind === "union") {
785
+ const def = lowerer.unions.get(fnRet.unionId);
786
+ if (def?.arms.some((a) => a.kind === "array")) {
787
+ lowerer.unsupported("SC1090", argNode, "'.flatMap' callbacks returning a union with an array arm (whether one value flattens " +
788
+ "would be a per-element decision — return an array from every path instead)");
789
+ }
790
+ }
791
+ if (fnRet.kind !== "array") {
792
+ // Scalar results append densely; source holes do not produce output slots.
793
+ if (fnRet.kind === "void" || fnRet.kind === "func")
794
+ lowerer.badType(call, lowerer.typeOf(call));
795
+ requireProducedArrayElement(lowerer, call, "'.flatMap()'", fnRet);
796
+ const outElem = callbackArrayElement(lowerer, call, fnRet);
797
+ const helper = arrayHofHelper(lowerer, "flatMap", elem, fnRet, arity, loc, outElem);
798
+ return { kind: "call", callee: helper, args: [receiver, fnArg], type: arrayOf(outElem), loc };
799
+ }
800
+ const helper = flatMapHelper(lowerer, elem, fnRet, arity, loc);
801
+ return { kind: "call", callee: helper, args: [receiver, fnArg], type: fnRet, loc };
802
+ }
803
+ /** The flatMap loop (array-returning callback), from existing IR nodes:
804
+ *
805
+ * out = []; n = a.length;
806
+ * for (i = 0; i < n; i++) {
807
+ * r = f(a[i]); m = r.length;
808
+ * for (j = 0; j < m; j++) out.push(r[j]);
809
+ * }
810
+ * return out;
811
+ */
812
+ function flatMapHelper(lowerer, elem, fnRet, arity, loc) {
813
+ const key = `flatMap:${typeKey(elem)}:${typeKey(fnRet)}:${arity}`;
814
+ const existing = lowerer.arrHofHelpers.get(key);
815
+ if (existing)
816
+ return existing;
817
+ const name = `%arr.flatMap.${lowerer.arrHofHelpers.size}`;
818
+ lowerer.arrHofHelpers.set(key, name);
819
+ const arrT = arrayOf(elem);
820
+ const inner = fnRet.elem;
821
+ const fnT = funcOf([arrayValueType(lowerer, elem), F64, arrT].slice(0, arity), fnRet);
822
+ const innerLoop = {
823
+ kind: "for",
824
+ init: { kind: "varDecl", localId: "j.0", init: numLit(0, loc), loc },
825
+ cond: {
826
+ kind: "bin",
827
+ op: "<",
828
+ left: varRef("j.0", F64, loc),
829
+ right: varRef("m.0", F64, loc),
830
+ type: BOOL,
831
+ loc,
832
+ },
833
+ update: {
834
+ kind: "assign",
835
+ localId: "j.0",
836
+ value: {
837
+ kind: "bin",
838
+ op: "+",
839
+ left: varRef("j.0", F64, loc),
840
+ right: numLit(1, loc),
841
+ type: F64,
842
+ loc,
843
+ },
844
+ loc,
845
+ },
846
+ body: [
847
+ {
848
+ kind: "if",
849
+ cond: arrayIndexPresent(varRef("r.0", fnRet, loc), varRef("j.0", F64, loc), loc),
850
+ then: [
851
+ {
852
+ kind: "varDecl",
853
+ localId: "inner.0",
854
+ init: arrayValueRead(lowerer, varRef("r.0", fnRet, loc), varRef("j.0", F64, loc), inner, loc),
855
+ loc,
856
+ },
857
+ arrayValueStore(lowerer, varRef("out.0", fnRet, loc), {
858
+ kind: "arrIntrinsic",
859
+ method: "length",
860
+ receiver: varRef("out.0", fnRet, loc),
861
+ args: [],
862
+ type: F64,
863
+ loc,
864
+ }, varRef("inner.0", arrayValueType(lowerer, inner), loc), inner, loc),
865
+ ],
866
+ else_: null,
867
+ loc,
868
+ },
869
+ ],
870
+ loc,
871
+ };
872
+ const body = [
873
+ {
874
+ kind: "varDecl",
875
+ localId: "out.0",
876
+ init: { kind: "arrayLit", elems: [], type: fnRet, loc },
877
+ loc,
878
+ },
879
+ arrayLengthDeclaration(arrT, loc),
880
+ countedFor(loc, varRef("n.0", F64, loc), () => [
881
+ {
882
+ kind: "if",
883
+ cond: currentArrayIndexPresent(arrT, loc),
884
+ then: [
885
+ {
886
+ kind: "varDecl",
887
+ localId: "r.0",
888
+ init: callArrayCallback(arrT, fnT, fnRet, arity, arrayValueRead(lowerer, varRef("a.0", arrT, loc), varRef("i.0", F64, loc), elem, loc), loc),
889
+ loc,
890
+ },
891
+ {
892
+ kind: "varDecl",
893
+ localId: "m.0",
894
+ init: {
895
+ kind: "arrIntrinsic",
896
+ method: "length",
897
+ receiver: varRef("r.0", fnRet, loc),
898
+ args: [],
899
+ type: F64,
900
+ loc,
901
+ },
902
+ loc,
903
+ },
904
+ innerLoop,
905
+ ],
906
+ else_: null,
907
+ loc,
908
+ },
909
+ ]),
910
+ { kind: "return", value: varRef("out.0", fnRet, loc), loc },
911
+ ];
912
+ lowerer.liftedFns.push({
913
+ name,
914
+ params: arrayCallbackParams(arrT, fnT),
915
+ returnType: fnRet,
916
+ locals: [
917
+ ...arrayCallbackLocals(arrT, fnT),
918
+ { id: "out.0", name: "out", type: fnRet, mutable: false },
919
+ { id: "r.0", name: "r", type: fnRet, mutable: false },
920
+ { id: "m.0", name: "m", type: F64, mutable: false },
921
+ { id: "j.0", name: "j", type: F64, mutable: true },
922
+ { id: "inner.0", name: "inner", type: arrayValueType(lowerer, inner), mutable: false },
923
+ ],
924
+ body,
925
+ loc,
926
+ });
927
+ return name;
928
+ }
929
+ /** `a.reduce(f)` / `a.reduce(f, init)` and reduceRight — both declared
930
+ * forms. The accumulator type is the call's own checked result: U with an
931
+ * initial value, the element type without one. The callback may declare
932
+ * any prefix of (acc, element, index, array). Without an initial value an
933
+ * empty receiver throws Node's exact TypeError at runtime. */
934
+ export function lowerArrayReduceCall(lowerer, call, access, method, elem) {
935
+ const loc = locOf(call);
936
+ const receiver = lowerer.lowerExpr(access.expression);
937
+ const arrT = arrayOf(elem);
938
+ const argNode = call.arguments[0];
939
+ if (!argNode)
940
+ lowerer.unsupported("SC1090", call, "this call form"); // tsc-guarded
941
+ const hasInit = call.arguments.length === 2;
942
+ const accT = lowerer.runtimeOptionalReduceTypes.get(call) ??
943
+ (hasInit ? lowerer.irTypeOf(call) : arrayValueType(lowerer, elem));
944
+ if (accT.kind === "void" || accT.kind === "func")
945
+ lowerer.badType(call, lowerer.typeOf(call));
946
+ const { fnArg, arity } = lowerArrayCallback(lowerer, argNode, [accT, arrayValueType(lowerer, elem)], arrT, false, accT);
947
+ const helper = reduceHelper(lowerer, method, elem, accT, fnArg.type.ret, arity, hasInit, loc);
948
+ const args = [receiver, fnArg];
949
+ if (hasInit)
950
+ args.push(lowerer.lowerExprExpecting(call.arguments[1], accT));
951
+ return { kind: "call", callee: helper, args, type: accT, loc };
952
+ }
953
+ /** The reduce/reduceRight loops, from existing IR nodes:
954
+ *
955
+ * with init: acc = z; n = a.length; for (...) acc = f(acc, a[i]); return acc;
956
+ * without init: n = a.length;
957
+ * if (n === 0) throw new TypeError("Reduce of empty array with no initial value");
958
+ * acc = a[<first>]; for (<rest>) acc = f(acc, a[i]); return acc;
959
+ *
960
+ * reduce walks 0→n-1, reduceRight n-1→0; the seed without an initial
961
+ * value is a[0] / a[n-1] and the loop starts one past it. The empty-array
962
+ * TypeError message is Node's, byte for byte. */
963
+ function reduceHelper(lowerer, method, elem, accT, fnRet, arity, hasInit, loc) {
964
+ const key = `${method}:${typeKey(elem)}:${typeKey(accT)}:${typeKey(fnRet)}:${arity}:${hasInit ? "init" : "seed"}`;
965
+ const existing = lowerer.arrHofHelpers.get(key);
966
+ if (existing)
967
+ return existing;
968
+ const name = `%arr.${method}.${lowerer.arrHofHelpers.size}`;
969
+ lowerer.arrHofHelpers.set(key, name);
970
+ const arrT = arrayOf(elem);
971
+ const fnT = funcOf([accT, arrayValueType(lowerer, elem), F64, arrT].slice(0, arity), fnRet);
972
+ const n = varRef("n.0", F64, loc);
973
+ const i = varRef("i.0", F64, loc);
974
+ const right = method === "reduceRight";
975
+ const at = (index) => arrayValueRead(lowerer, varRef("a.0", arrT, loc), index, elem, loc);
976
+ const locals = [
977
+ { id: "a.0", name: "a", type: arrT, mutable: true },
978
+ { id: "f.0", name: "f", type: fnT, mutable: true },
979
+ ...(hasInit ? [{ id: "z.0", name: "z", type: accT, mutable: true }] : []),
980
+ { id: "acc.0", name: "acc", type: accT, mutable: true },
981
+ { id: "n.0", name: "n", type: F64, mutable: false },
982
+ { id: "i.0", name: "i", type: F64, mutable: true },
983
+ ];
984
+ const params = [
985
+ { localId: "a.0", name: "a", type: arrT },
986
+ { localId: "f.0", name: "f", type: fnT },
987
+ ...(hasInit ? [{ localId: "z.0", name: "z", type: accT }] : []),
988
+ ];
989
+ const start = right
990
+ ? { kind: "bin", op: "-", left: n, right: numLit(1, loc), type: F64, loc }
991
+ : numLit(0, loc);
992
+ const inRange = right
993
+ ? { kind: "bin", op: ">=", left: i, right: numLit(0, loc), type: BOOL, loc }
994
+ : { kind: "bin", op: "<", left: i, right: n, type: BOOL, loc };
995
+ const advance = {
996
+ kind: "assign",
997
+ localId: "i.0",
998
+ value: { kind: "bin", op: right ? "-" : "+", left: i, right: numLit(1, loc), type: F64, loc },
999
+ loc,
1000
+ };
1001
+ const seedStmts = [
1002
+ { kind: "varDecl", localId: "i.0", init: start, loc },
1003
+ ...(hasInit
1004
+ ? [
1005
+ {
1006
+ kind: "varDecl",
1007
+ localId: "acc.0",
1008
+ init: varRef("z.0", accT, loc),
1009
+ loc,
1010
+ },
1011
+ ]
1012
+ : [
1013
+ {
1014
+ kind: "while",
1015
+ cond: {
1016
+ kind: "ternary",
1017
+ cond: inRange,
1018
+ then: {
1019
+ kind: "unary",
1020
+ op: "!",
1021
+ operand: currentArrayIndexPresent(arrT, loc),
1022
+ type: BOOL,
1023
+ loc,
1024
+ },
1025
+ else_: boolLit(false, loc),
1026
+ type: BOOL,
1027
+ loc,
1028
+ },
1029
+ body: [advance],
1030
+ loc,
1031
+ },
1032
+ {
1033
+ kind: "if",
1034
+ cond: { kind: "unary", op: "!", operand: inRange, type: BOOL, loc },
1035
+ then: [
1036
+ {
1037
+ kind: "throw",
1038
+ value: {
1039
+ kind: "libCall",
1040
+ fn: "error.new",
1041
+ args: [
1042
+ {
1043
+ kind: "strLit",
1044
+ value: "Reduce of empty array with no initial value",
1045
+ type: STRING,
1046
+ loc,
1047
+ },
1048
+ ],
1049
+ type: { kind: "object", className: "%TypeError" },
1050
+ loc,
1051
+ },
1052
+ loc,
1053
+ },
1054
+ ],
1055
+ else_: null,
1056
+ loc,
1057
+ },
1058
+ { kind: "varDecl", localId: "acc.0", init: lowerer.coerceToExpected(at(i), accT), loc },
1059
+ advance,
1060
+ ]),
1061
+ ];
1062
+ const loop = {
1063
+ kind: "for",
1064
+ init: null,
1065
+ cond: right
1066
+ ? { kind: "bin", op: ">=", left: i, right: numLit(0, loc), type: BOOL, loc }
1067
+ : { kind: "bin", op: "<", left: i, right: n, type: BOOL, loc },
1068
+ update: {
1069
+ kind: "assign",
1070
+ localId: "i.0",
1071
+ value: { kind: "bin", op: right ? "-" : "+", left: i, right: numLit(1, loc), type: F64, loc },
1072
+ loc,
1073
+ },
1074
+ body: [
1075
+ {
1076
+ kind: "if",
1077
+ cond: currentArrayIndexPresent(arrT, loc),
1078
+ then: [
1079
+ {
1080
+ kind: "assign",
1081
+ localId: "acc.0",
1082
+ value: lowerer.coerceToExpected({
1083
+ kind: "callValue",
1084
+ callee: varRef("f.0", fnT, loc),
1085
+ args: [varRef("acc.0", accT, loc), at(i), i, varRef("a.0", arrT, loc)].slice(0, arity),
1086
+ type: fnRet,
1087
+ loc,
1088
+ }, accT),
1089
+ loc,
1090
+ },
1091
+ ],
1092
+ else_: null,
1093
+ loc,
1094
+ },
1095
+ ],
1096
+ loc,
1097
+ };
1098
+ const body = [
1099
+ arrayLengthDeclaration(arrT, loc),
1100
+ ...seedStmts,
1101
+ loop,
1102
+ { kind: "return", value: varRef("acc.0", accT, loc), loc },
1103
+ ];
1104
+ lowerer.liftedFns.push({ name, params, returnType: accT, locals, body, loc });
1105
+ return name;
1106
+ }
1107
+ /** `a.sort(cmp)` / `a.toSorted(cmp)`, desugared to an interned synthetic
1108
+ * function like the other array HOFs. sort mutates and returns the receiver;
1109
+ * toSorted takes its shallow snapshot INSIDE the helper, after the receiver
1110
+ * and comparator expressions have both been evaluated, then sorts and
1111
+ * returns that copy without touching the receiver. The helper merges stable
1112
+ * natural runs, reversing only strict descending runs and extending short
1113
+ * runs with insertion sort. Ordered boundaries skip merging. During a merge, an element
1114
+ * moves right only while cmp(left, right) > 0, so a NaN or 0 result keeps
1115
+ * the left element first. Undefined values sink without reaching the user
1116
+ * comparator. The callback sequence differs from V8's TimSort, so exact
1117
+ * order and count parity are not claimed; results agree for consistent
1118
+ * comparators. Without a comparator, string, number and boolean arrays use
1119
+ * native stable ordering: their String conversions cannot call user code.
1120
+ * Strings compare UTF-16 units; numbers compare their decimal spellings
1121
+ * ([10, 9, 1] → [1, 10, 9]). Other element types still need a comparator. */
1122
+ export function lowerArraySortCall(lowerer, call, access, elem, arrT) {
1123
+ const loc = locOf(call);
1124
+ const method = access.name.text === "toSorted" ? "toSorted" : "sort";
1125
+ const copyFirst = method === "toSorted";
1126
+ if (call.arguments.length === 0 &&
1127
+ (elem.kind === "string" || elem.kind === "f64" || elem.kind === "bool")) {
1128
+ return {
1129
+ kind: "arrIntrinsic",
1130
+ method: copyFirst ? "toSortedPrimitive" : "sortPrimitive",
1131
+ receiver: lowerer.lowerExpr(access.expression),
1132
+ args: [],
1133
+ type: arrT,
1134
+ loc,
1135
+ };
1136
+ }
1137
+ if (call.arguments.length !== 1) {
1138
+ lowerer.noLowering(`.${method} with ${call.arguments.length} arguments`, call, "default ordering supports string[], number[] and boolean[]; other element types need a comparator");
1139
+ }
1140
+ const receiver = lowerer.lowerExpr(access.expression);
1141
+ const argNode = call.arguments[0];
1142
+ const undefinedArg = lowerStaticallyUndefinedArgument(lowerer, argNode);
1143
+ let unwrappedArg = argNode;
1144
+ while (ts.isParenthesizedExpression(unwrappedArg) ||
1145
+ ts.isAsExpression(unwrappedArg) ||
1146
+ ts.isTypeAssertion(unwrappedArg) ||
1147
+ ts.isSatisfiesExpression(unwrappedArg))
1148
+ unwrappedArg = unwrappedArg.expression;
1149
+ if (undefinedArg?.type.kind === "void" && !ts.isVoidExpression(unwrappedArg)) {
1150
+ lowerer.noLowering(`.${method} with an erased comparator result`, argNode, "pass the comparator directly, or use void expression to explicitly select default ordering");
1151
+ }
1152
+ if (undefinedArg !== null &&
1153
+ (undefinedArg.type.kind === "undefinedT" || ts.isVoidExpression(unwrappedArg)) &&
1154
+ (elem.kind === "string" || elem.kind === "f64" || elem.kind === "bool")) {
1155
+ // A type assertion alone cannot turn a function value into undefined.
1156
+ // The explicit undefined expression can mutate or replace the receiver.
1157
+ // Keep its original value alive and run the argument before sorting.
1158
+ const saved = lowerer.declareHiddenLocal("%sortReceiver", arrT);
1159
+ return {
1160
+ kind: "seqExpr",
1161
+ stmts: [{ kind: "varDecl", localId: saved.id, init: receiver, loc }],
1162
+ result: defaultAfterUndefined(undefinedArg, {
1163
+ kind: "arrIntrinsic",
1164
+ method: copyFirst ? "toSortedPrimitive" : "sortPrimitive",
1165
+ receiver: varRef(saved.id, arrT, loc),
1166
+ args: [],
1167
+ type: arrT,
1168
+ loc,
1169
+ }),
1170
+ type: arrT,
1171
+ loc,
1172
+ };
1173
+ }
1174
+ let fnArg = undefinedArg ?? lowerer.lowerExpr(argNode);
1175
+ // Reusable JS comparators often accept checked values. Adapt the array's
1176
+ // element ABI just as other array callbacks do before sorting.
1177
+ if (fnArg.type.kind === "func" &&
1178
+ fnArg.type.params.length <= 2 &&
1179
+ fnArg.type.params.every((param) => lowerer.coercibleValue(elem, param))) {
1180
+ // Arithmetic on inferred JS values retains a checked result because
1181
+ // it can produce BigInt. The sort callback still requires a number.
1182
+ const result = fnArg.type.ret.kind === "dyn" && isJsSourceFile(argNode.getSourceFile())
1183
+ ? F64
1184
+ : fnArg.type.ret;
1185
+ const expected = funcOf(fnArg.type.params.map(() => elem), result);
1186
+ if (!typeEquals(fnArg.type, expected))
1187
+ fnArg = lowerer.coerceToExpected(fnArg, expected);
1188
+ }
1189
+ // The comparator receives exactly (a, b); declaring a prefix is
1190
+ // ordinary TS. Its result must be number (the spec coerces arbitrary
1191
+ // results — no lowering for that).
1192
+ if (fnArg.type.kind !== "func" ||
1193
+ fnArg.type.params.length > 2 ||
1194
+ !fnArg.type.params.every((p) => typeEquals(p, elem)) ||
1195
+ fnArg.type.ret.kind !== "f64") {
1196
+ lowerer.badType(argNode, lowerer.typeOf(argNode));
1197
+ }
1198
+ const arity = fnArg.type.params.length;
1199
+ const key = `${method}:${typeKey(elem)}:${arity}`;
1200
+ let helper = lowerer.arrHofHelpers.get(key);
1201
+ if (!helper) {
1202
+ helper = `%arr.${method}.${lowerer.arrHofHelpers.size}`;
1203
+ lowerer.arrHofHelpers.set(key, helper);
1204
+ const undefinedTag = elem.kind === "union" ? lowerer.armTag(elem.unionId, UNDEFINED_T) : -1;
1205
+ lowerer.liftedFns.push(buildArraySortFn(helper, elem, arity, copyFirst, undefinedTag >= 0 ? undefinedTag : null, loc));
1206
+ }
1207
+ return { kind: "call", callee: helper, args: [receiver, fnArg], type: arrT, loc };
1208
+ }
1209
+ /** `d.filter(pred)` on a dyn receiver: the receiver must BE a dyn array
1210
+ * (else the Node-shaped TypeError above); the predicate runs per element
1211
+ * over the dyn value, and each SURVIVOR is validated-extracted into the
1212
+ * result's element type T — the type the checker already committed the
1213
+ * call to (the contextual `RouteMapping[]`/`string[]` slot). Extraction is
1214
+ * the checked-cast machinery: a survivor that doesn't fit T throws the
1215
+ * catchable TypeError instead of misreading (a LYING predicate is the only
1216
+ * way there). The result is a fresh STATIC array of extracted copies —
1217
+ * the dyn boundary's marshal-copy stance (SEMANTICS.md). Null when the
1218
+ * call shape isn't claimable (the method-call fence stays). */
1219
+ export function lowerDynArrayFilterCall(lowerer, call, access, recv) {
1220
+ if (call.arguments.length !== 1)
1221
+ return null;
1222
+ const argNode = call.arguments[0];
1223
+ const loc = locOf(call);
1224
+ // The result element type, from what the call flows INTO: the
1225
+ // contextual array (or the single array arm of a contextual union —
1226
+ // the `string[] | null` return slot), falling back to a type-guard
1227
+ // predicate's target (`(r: unknown) => r is T`). Both are tsc's own
1228
+ // verdicts on the element; the runtime check makes them honest.
1229
+ let elemT = null;
1230
+ const ctx = lowerer.checker.getContextualType(call);
1231
+ const ctxIr = ctx ? lowerer.mapTypeOf(ctx) : null;
1232
+ if (ctxIr?.kind === "array")
1233
+ elemT = ctxIr.elem;
1234
+ if (!elemT && ctxIr?.kind === "union") {
1235
+ const def = lowerer.unions.get(ctxIr.unionId);
1236
+ const arrayArms = def ? def.arms.filter((a) => a.kind === "array") : [];
1237
+ if (arrayArms.length === 1 && arrayArms[0].kind === "array")
1238
+ elemT = arrayArms[0].elem;
1239
+ }
1240
+ if (!elemT) {
1241
+ const sigs = lowerer.checker.getCallSignatures(lowerer.typeOf(argNode));
1242
+ const pred = sigs.length === 1 ? lowerer.checker.getTypePredicateOfSignature(sigs[0]) : undefined;
1243
+ if (pred?.type)
1244
+ elemT = lowerer.mapTypeOf(pred.type);
1245
+ }
1246
+ if (!elemT || !lowerer.jsonSafe(elemT)) {
1247
+ // No JSON-representable destination (`const failed = checks.filter(
1248
+ // fn)` in untyped JS — test/common's runCallChecks): the result
1249
+ // STAYS in the checked-dynamic tree — the runtime prototype dispatch (scr_dyn_invoke)
1250
+ // runs the real filter over the dyn array and the survivors keep
1251
+ // their dyn selves, no extraction needed. The typed-destination path
1252
+ // above stays preferred: it hands back a real T[].
1253
+ return null;
1254
+ }
1255
+ const { fnArg, arity } = lowerArrayCallback(lowerer, argNode, [DYN], DYN);
1256
+ if (fnArg.type.ret.kind !== "bool")
1257
+ lowerer.badType(argNode, lowerer.typeOf(argNode));
1258
+ const helper = dynFilterHelper(lowerer, elemT, arity, loc);
1259
+ return {
1260
+ kind: "call",
1261
+ callee: helper,
1262
+ args: [
1263
+ recv,
1264
+ fnArg,
1265
+ { kind: "strLit", value: access.name.text, type: STRING, loc },
1266
+ { kind: "strLit", value: access.getText(), type: STRING, loc },
1267
+ ],
1268
+ type: arrayOf(elemT),
1269
+ loc,
1270
+ };
1271
+ }
1272
+ /** `.flatMap(f)` on a dyn ('unknown'/`any[]`-narrowed) receiver where the
1273
+ * callback returns a STATIC array (`parsed.flatMap((v) => typeof v ===
1274
+ * "string" ? parseTldList(v) : [])` — the tlds-file shape): the checked-dynamic tree
1275
+ * array walks element-by-element, the callback sees each element as the
1276
+ * dyn value `unknown` code sees, and its typed results concatenate —
1277
+ * depth-1 flatten by construction, no validation needed on the results
1278
+ * (they are already typed; only the RECEIVER is dynamic). Non-array
1279
+ * receivers throw the Node-shaped TypeError. Callbacks returning
1280
+ * NON-array values (JS would keep them as single elements) or dynamic
1281
+ * results keep the fence — nothing drives them yet. */
1282
+ export function lowerDynArrayFlatMapCall(lowerer, call, access, recv) {
1283
+ if (call.arguments.length !== 1)
1284
+ return null;
1285
+ const argNode = call.arguments[0];
1286
+ const loc = locOf(call);
1287
+ const { fnArg, arity } = lowerArrayCallback(lowerer, argNode, [DYN], DYN);
1288
+ const ret = fnArg.type.ret;
1289
+ if (ret.kind !== "array") {
1290
+ // A DYNAMIC-returning callback (`plugins.flatMap((plugin) =>
1291
+ // plugin.languages ?? [])` — the getSupportInfo shape, where the
1292
+ // callback's members ride the checked-dynamic tree): the call dispatches on the
1293
+ // RECEIVER's runtime kind (dynInvoke) with the callback boxed —
1294
+ // a wrapped ISLAND receiver runs the ENGINE's own JS-exact
1295
+ // Array.prototype.flatMap (the routed-ops lane), a native dyn
1296
+ // array runs the runtime's flatMap, and non-arrays throw Node's
1297
+ // TypeError. The result stays dyn, checked per use.
1298
+ if (ret.kind === "dyn" || ret.kind === "jsval") {
1299
+ const boxed = { kind: "dynFrom", value: fnArg, type: DYN, loc };
1300
+ return {
1301
+ kind: "dynInvoke",
1302
+ recv,
1303
+ method: "flatMap",
1304
+ calleeName: access.getText(),
1305
+ args: [boxed],
1306
+ type: DYN,
1307
+ loc,
1308
+ };
1309
+ }
1310
+ lowerer.unsupported("SC1090", call, `'.flatMap' on 'unknown' receivers whose callback returns '${lowerer.fmt(ret)}' ` +
1311
+ `(only callbacks returning a typed ARRAY compile — the results concatenate ` +
1312
+ `without validation; return one-element/empty arrays instead of bare values)`);
1313
+ }
1314
+ const helper = dynFlatMapHelper(lowerer, ret.elem, arity, loc);
1315
+ return {
1316
+ kind: "call",
1317
+ callee: helper,
1318
+ args: [
1319
+ recv,
1320
+ fnArg,
1321
+ { kind: "strLit", value: access.name.text, type: STRING, loc },
1322
+ { kind: "strLit", value: access.getText(), type: STRING, loc },
1323
+ ],
1324
+ type: arrayOf(ret.elem),
1325
+ loc,
1326
+ };
1327
+ }
1328
+ /** Interned `%dyn.flatmap.<n>` — one per (element type, callback arity). */
1329
+ function dynFlatMapHelper(lowerer, elemT, arity, loc) {
1330
+ const key = `dynflatmap:${typeKey(elemT)}:${arity}`;
1331
+ const existing = lowerer.arrHofHelpers.get(key);
1332
+ if (existing)
1333
+ return existing;
1334
+ const name = `%dyn.flatmap.${lowerer.arrHofHelpers.size}`;
1335
+ lowerer.arrHofHelpers.set(key, name);
1336
+ lowerer.liftedFns.push(buildDynFlatMapFn(name, elemT, arity, loc));
1337
+ return name;
1338
+ }
1339
+ /** out = []; n = d.length; for (i..n) { v = d[i]; r = f(v, i, d); for
1340
+ * (j..r.length) out.push(r[j]); } return out; — the receiver-kind gate up
1341
+ * front, the length read once, elements through the canonical-index keyed
1342
+ * read (buildDynFilterFn's discipline). */
1343
+ function buildDynFlatMapFn(name, elemT, arity, loc) {
1344
+ const outT = arrayOf(elemT);
1345
+ const retT = arrayOf(elemT);
1346
+ const fnT = funcOf([DYN, F64, DYN].slice(0, arity), retT);
1347
+ const d = varRef("d.0", DYN, loc);
1348
+ const body = [
1349
+ {
1350
+ kind: "if",
1351
+ cond: { kind: "dynTest", test: "array", negated: true, value: d, type: BOOL, loc },
1352
+ then: dynamicReceiverThrows(d, varRef("m.0", STRING, loc), varRef("full.0", STRING, loc), loc),
1353
+ else_: null,
1354
+ loc,
1355
+ },
1356
+ {
1357
+ kind: "varDecl",
1358
+ localId: "n.0",
1359
+ init: {
1360
+ kind: "dynCheck",
1361
+ value: {
1362
+ kind: "dynKeyGet",
1363
+ key: { kind: "strLit", value: "length", type: STRING, loc },
1364
+ value: d,
1365
+ type: DYN,
1366
+ loc,
1367
+ },
1368
+ type: F64,
1369
+ loc,
1370
+ },
1371
+ loc,
1372
+ },
1373
+ {
1374
+ kind: "varDecl",
1375
+ localId: "out.0",
1376
+ init: { kind: "arrayLit", elems: [], type: outT, loc },
1377
+ loc,
1378
+ },
1379
+ countedFor(loc, varRef("n.0", F64, loc), () => [
1380
+ {
1381
+ kind: "varDecl",
1382
+ localId: "v.0",
1383
+ init: {
1384
+ kind: "dynKeyGet",
1385
+ key: { kind: "toString", operand: varRef("i.0", F64, loc), type: STRING, loc },
1386
+ value: d,
1387
+ type: DYN,
1388
+ loc,
1389
+ },
1390
+ loc,
1391
+ },
1392
+ {
1393
+ kind: "varDecl",
1394
+ localId: "r.0",
1395
+ init: {
1396
+ kind: "callValue",
1397
+ callee: varRef("f.0", fnT, loc),
1398
+ args: [varRef("v.0", DYN, loc), varRef("i.0", F64, loc), d].slice(0, arity),
1399
+ type: retT,
1400
+ loc,
1401
+ },
1402
+ loc,
1403
+ },
1404
+ {
1405
+ kind: "varDecl",
1406
+ localId: "rn.0",
1407
+ init: {
1408
+ kind: "arrIntrinsic",
1409
+ method: "length",
1410
+ receiver: varRef("r.0", retT, loc),
1411
+ args: [],
1412
+ type: F64,
1413
+ loc,
1414
+ },
1415
+ loc,
1416
+ },
1417
+ {
1418
+ kind: "for",
1419
+ init: { kind: "varDecl", localId: "j.0", init: numLit(0, loc), loc },
1420
+ cond: {
1421
+ kind: "bin",
1422
+ op: "<",
1423
+ left: varRef("j.0", F64, loc),
1424
+ right: varRef("rn.0", F64, loc),
1425
+ type: BOOL,
1426
+ loc,
1427
+ },
1428
+ update: {
1429
+ kind: "assign",
1430
+ localId: "j.0",
1431
+ value: {
1432
+ kind: "bin",
1433
+ op: "+",
1434
+ left: varRef("j.0", F64, loc),
1435
+ right: numLit(1, loc),
1436
+ type: F64,
1437
+ loc,
1438
+ },
1439
+ loc,
1440
+ },
1441
+ body: [
1442
+ {
1443
+ kind: "exprStmt",
1444
+ expr: {
1445
+ kind: "arrIntrinsic",
1446
+ method: "push",
1447
+ receiver: varRef("out.0", outT, loc),
1448
+ args: [
1449
+ {
1450
+ kind: "arrayGet",
1451
+ arr: varRef("r.0", retT, loc),
1452
+ index: varRef("j.0", F64, loc),
1453
+ type: elemT,
1454
+ loc,
1455
+ },
1456
+ ],
1457
+ type: F64,
1458
+ loc,
1459
+ },
1460
+ loc,
1461
+ },
1462
+ ],
1463
+ loc,
1464
+ },
1465
+ ]),
1466
+ { kind: "return", value: varRef("out.0", outT, loc), loc },
1467
+ ];
1468
+ return {
1469
+ name,
1470
+ params: [
1471
+ { localId: "d.0", name: "d", type: DYN },
1472
+ { localId: "f.0", name: "f", type: fnT },
1473
+ { localId: "m.0", name: "m", type: STRING },
1474
+ { localId: "full.0", name: "full", type: STRING },
1475
+ ],
1476
+ returnType: outT,
1477
+ locals: [
1478
+ { id: "d.0", name: "d", type: DYN, mutable: false },
1479
+ { id: "f.0", name: "f", type: fnT, mutable: false },
1480
+ { id: "m.0", name: "m", type: STRING, mutable: false },
1481
+ { id: "full.0", name: "full", type: STRING, mutable: false },
1482
+ { id: "n.0", name: "n", type: F64, mutable: false },
1483
+ { id: "i.0", name: "i", type: F64, mutable: true },
1484
+ { id: "v.0", name: "v", type: DYN, mutable: false },
1485
+ { id: "r.0", name: "r", type: retT, mutable: false },
1486
+ { id: "rn.0", name: "rn", type: F64, mutable: false },
1487
+ { id: "j.0", name: "j", type: F64, mutable: true },
1488
+ { id: "out.0", name: "out", type: outT, mutable: false },
1489
+ ],
1490
+ body,
1491
+ loc,
1492
+ };
1493
+ }
1494
+ /** Interned `%dyn.filter.<n>` — one per (element type, callback arity). */
1495
+ function dynFilterHelper(lowerer, elemT, arity, loc) {
1496
+ const key = `dynfilter:${typeKey(elemT)}:${arity}`;
1497
+ const existing = lowerer.arrHofHelpers.get(key);
1498
+ if (existing)
1499
+ return existing;
1500
+ const name = `%dyn.filter.${lowerer.arrHofHelpers.size}`;
1501
+ lowerer.arrHofHelpers.set(key, name);
1502
+ lowerer.liftedFns.push(buildDynFilterFn(name, elemT, arity, loc));
1503
+ return name;
1504
+ }
1505
+ /** out = []; n = d.length; for (i..n) { v = d[i]; if (f(v, i, d)) out.push(
1506
+ * check<T>(v)); } return out; — with the receiver-kind gate up front. The
1507
+ * length reads ONCE (the checked-dynamic tree is immutable under the static surface), the
1508
+ * element reads through the canonical-index keyed read, the callback gets
1509
+ * whatever prefix of (element, index, receiver) it declares — the element
1510
+ * and receiver as dyn values, exactly what `unknown` code sees. */
1511
+ function buildDynFilterFn(name, elemT, arity, loc) {
1512
+ const outT = arrayOf(elemT);
1513
+ const fnT = funcOf([DYN, F64, DYN].slice(0, arity), BOOL);
1514
+ const d = varRef("d.0", DYN, loc);
1515
+ const body = [
1516
+ {
1517
+ kind: "if",
1518
+ cond: { kind: "dynTest", test: "array", negated: true, value: d, type: BOOL, loc },
1519
+ then: dynamicReceiverThrows(d, varRef("m.0", STRING, loc), varRef("full.0", STRING, loc), loc),
1520
+ else_: null,
1521
+ loc,
1522
+ },
1523
+ {
1524
+ kind: "varDecl",
1525
+ localId: "n.0",
1526
+ init: {
1527
+ kind: "dynCheck",
1528
+ value: {
1529
+ kind: "dynKeyGet",
1530
+ key: { kind: "strLit", value: "length", type: STRING, loc },
1531
+ value: d,
1532
+ type: DYN,
1533
+ loc,
1534
+ },
1535
+ type: F64,
1536
+ loc,
1537
+ },
1538
+ loc,
1539
+ },
1540
+ {
1541
+ kind: "varDecl",
1542
+ localId: "out.0",
1543
+ init: { kind: "arrayLit", elems: [], type: outT, loc },
1544
+ loc,
1545
+ },
1546
+ countedFor(loc, varRef("n.0", F64, loc), () => [
1547
+ {
1548
+ kind: "varDecl",
1549
+ localId: "v.0",
1550
+ init: {
1551
+ kind: "dynKeyGet",
1552
+ key: { kind: "toString", operand: varRef("i.0", F64, loc), type: STRING, loc },
1553
+ value: d,
1554
+ type: DYN,
1555
+ loc,
1556
+ },
1557
+ loc,
1558
+ },
1559
+ {
1560
+ kind: "if",
1561
+ cond: {
1562
+ kind: "callValue",
1563
+ callee: varRef("f.0", fnT, loc),
1564
+ args: [varRef("v.0", DYN, loc), varRef("i.0", F64, loc), d].slice(0, arity),
1565
+ type: BOOL,
1566
+ loc,
1567
+ },
1568
+ then: [
1569
+ {
1570
+ kind: "exprStmt",
1571
+ expr: {
1572
+ kind: "arrIntrinsic",
1573
+ method: "push",
1574
+ receiver: varRef("out.0", outT, loc),
1575
+ args: [{ kind: "dynCheck", value: varRef("v.0", DYN, loc), type: elemT, loc }],
1576
+ type: F64,
1577
+ loc,
1578
+ },
1579
+ loc,
1580
+ },
1581
+ ],
1582
+ else_: null,
1583
+ loc,
1584
+ },
1585
+ ]),
1586
+ { kind: "return", value: varRef("out.0", outT, loc), loc },
1587
+ ];
1588
+ return {
1589
+ name,
1590
+ params: [
1591
+ { localId: "d.0", name: "d", type: DYN },
1592
+ { localId: "f.0", name: "f", type: fnT },
1593
+ { localId: "m.0", name: "m", type: STRING },
1594
+ { localId: "full.0", name: "full", type: STRING },
1595
+ ],
1596
+ returnType: outT,
1597
+ locals: [
1598
+ { id: "d.0", name: "d", type: DYN, mutable: false },
1599
+ { id: "f.0", name: "f", type: fnT, mutable: false },
1600
+ { id: "m.0", name: "m", type: STRING, mutable: false },
1601
+ { id: "full.0", name: "full", type: STRING, mutable: false },
1602
+ { id: "n.0", name: "n", type: F64, mutable: false },
1603
+ { id: "i.0", name: "i", type: F64, mutable: true },
1604
+ { id: "v.0", name: "v", type: DYN, mutable: false },
1605
+ { id: "out.0", name: "out", type: outT, mutable: false },
1606
+ ],
1607
+ body,
1608
+ loc,
1609
+ };
1610
+ }
1611
+ //# sourceMappingURL=array-callbacks.js.map