@scriptc/compiler 0.3.5 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1243) hide show
  1. package/ambient/scriptc-node-fallback.d.ts +960 -82
  2. package/ambient/scriptc.d.ts +134 -0
  3. package/dist/backend/cycle-analysis.d.ts +1 -1
  4. package/dist/backend/cycle-analysis.js +1 -0
  5. package/dist/backend/cycle-analysis.js.map +1 -1
  6. package/dist/backend/cycle-analysis.test.js +13 -1
  7. package/dist/backend/cycle-analysis.test.js.map +1 -1
  8. package/dist/backend/cycle-mutability.js +16 -5
  9. package/dist/backend/cycle-mutability.js.map +1 -1
  10. package/dist/backend/executable-features.js +13 -0
  11. package/dist/backend/executable-features.js.map +1 -1
  12. package/dist/backend/immutability.test.js +1 -1
  13. package/dist/backend/library-pack.js +6 -0
  14. package/dist/backend/library-pack.js.map +1 -1
  15. package/dist/backend/llvm/alloc.d.ts +41 -4
  16. package/dist/backend/llvm/alloc.js +138 -7
  17. package/dist/backend/llvm/alloc.js.map +1 -1
  18. package/dist/backend/llvm/alloc.test.js +30 -1
  19. package/dist/backend/llvm/alloc.test.js.map +1 -1
  20. package/dist/backend/llvm/appended-array-literals.test.js +1 -1
  21. package/dist/backend/llvm/array-search.test.js +1 -1
  22. package/dist/backend/llvm/blocks.d.ts +8 -0
  23. package/dist/backend/llvm/blocks.js +43 -1
  24. package/dist/backend/llvm/blocks.js.map +1 -1
  25. package/dist/backend/llvm/blocks.test.js +22 -1
  26. package/dist/backend/llvm/blocks.test.js.map +1 -1
  27. package/dist/backend/llvm/byte-numbers.js +15 -5
  28. package/dist/backend/llvm/byte-numbers.js.map +1 -1
  29. package/dist/backend/llvm/bytes-alias.d.ts +14 -0
  30. package/dist/backend/llvm/bytes-alias.js +20 -0
  31. package/dist/backend/llvm/bytes-alias.js.map +1 -0
  32. package/dist/backend/llvm/bytes-loop-versions.d.ts +86 -0
  33. package/dist/backend/llvm/bytes-loop-versions.js +506 -0
  34. package/dist/backend/llvm/bytes-loop-versions.js.map +1 -0
  35. package/dist/backend/llvm/bytes-loop-versions.test.d.ts +1 -0
  36. package/dist/backend/llvm/bytes-loop-versions.test.js +244 -0
  37. package/dist/backend/llvm/bytes-loop-versions.test.js.map +1 -0
  38. package/dist/backend/llvm/call-lifetimes.js +50 -1
  39. package/dist/backend/llvm/call-lifetimes.js.map +1 -1
  40. package/dist/backend/llvm/call-lifetimes.test.js +34 -0
  41. package/dist/backend/llvm/call-lifetimes.test.js.map +1 -1
  42. package/dist/backend/llvm/checked-narrows.test.js +1 -1
  43. package/dist/backend/llvm/checked-value-lifetimes.js +4 -1
  44. package/dist/backend/llvm/checked-value-lifetimes.js.map +1 -1
  45. package/dist/backend/llvm/classes.d.ts +11 -0
  46. package/dist/backend/llvm/classes.js +71 -14
  47. package/dist/backend/llvm/classes.js.map +1 -1
  48. package/dist/backend/llvm/classes.test.js +58 -8
  49. package/dist/backend/llvm/classes.test.js.map +1 -1
  50. package/dist/backend/llvm/common.js +1 -0
  51. package/dist/backend/llvm/common.js.map +1 -1
  52. package/dist/backend/llvm/constant-callbacks.d.ts +5 -1
  53. package/dist/backend/llvm/constant-callbacks.js +55 -12
  54. package/dist/backend/llvm/constant-callbacks.js.map +1 -1
  55. package/dist/backend/llvm/constant-callbacks.test.js +88 -1
  56. package/dist/backend/llvm/constant-callbacks.test.js.map +1 -1
  57. package/dist/backend/llvm/counted-loops.d.ts +4 -0
  58. package/dist/backend/llvm/counted-loops.js +37 -0
  59. package/dist/backend/llvm/counted-loops.js.map +1 -1
  60. package/dist/backend/llvm/dense-array-access.d.ts +12 -3
  61. package/dist/backend/llvm/dense-array-access.js +72 -14
  62. package/dist/backend/llvm/dense-array-access.js.map +1 -1
  63. package/dist/backend/llvm/dense-array-access.test.js +59 -3
  64. package/dist/backend/llvm/dense-array-access.test.js.map +1 -1
  65. package/dist/backend/llvm/dense-array-loops.d.ts +51 -0
  66. package/dist/backend/llvm/dense-array-loops.js +162 -0
  67. package/dist/backend/llvm/dense-array-loops.js.map +1 -0
  68. package/dist/backend/llvm/dense-array-loops.test.d.ts +1 -0
  69. package/dist/backend/llvm/dense-array-loops.test.js +128 -0
  70. package/dist/backend/llvm/dense-array-loops.test.js.map +1 -0
  71. package/dist/backend/llvm/dyn-handle-tags.test.d.ts +1 -0
  72. package/dist/backend/llvm/dyn-handle-tags.test.js +38 -0
  73. package/dist/backend/llvm/dyn-handle-tags.test.js.map +1 -0
  74. package/dist/backend/llvm/dyn.d.ts +28 -4
  75. package/dist/backend/llvm/dyn.js +324 -179
  76. package/dist/backend/llvm/dyn.js.map +1 -1
  77. package/dist/backend/llvm/emit-function.d.ts +64 -0
  78. package/dist/backend/llvm/emit-function.js +1190 -0
  79. package/dist/backend/llvm/emit-function.js.map +1 -0
  80. package/dist/backend/llvm/emit-module.d.ts +24 -0
  81. package/dist/backend/llvm/emit-module.js +1535 -0
  82. package/dist/backend/llvm/emit-module.js.map +1 -0
  83. package/dist/backend/llvm/emit-statements.d.ts +58 -0
  84. package/dist/backend/llvm/emit-statements.js +1964 -0
  85. package/dist/backend/llvm/emit-statements.js.map +1 -0
  86. package/dist/backend/llvm/emitter.d.ts +576 -268
  87. package/dist/backend/llvm/emitter.js +801 -4447
  88. package/dist/backend/llvm/emitter.js.map +1 -1
  89. package/dist/backend/llvm/emitter.test.js +57 -3
  90. package/dist/backend/llvm/emitter.test.js.map +1 -1
  91. package/dist/backend/llvm/expr-async.js +73 -46
  92. package/dist/backend/llvm/expr-async.js.map +1 -1
  93. package/dist/backend/llvm/expr-async.test.js +1 -1
  94. package/dist/backend/llvm/expr-bytes.d.ts +2 -0
  95. package/dist/backend/llvm/expr-bytes.js +76 -29
  96. package/dist/backend/llvm/expr-bytes.js.map +1 -1
  97. package/dist/backend/llvm/expr-callbacks.d.ts +6 -2
  98. package/dist/backend/llvm/expr-callbacks.js +48 -11
  99. package/dist/backend/llvm/expr-callbacks.js.map +1 -1
  100. package/dist/backend/llvm/expr-calls.d.ts +1 -1
  101. package/dist/backend/llvm/expr-calls.js +71 -53
  102. package/dist/backend/llvm/expr-calls.js.map +1 -1
  103. package/dist/backend/llvm/expr-calls.test.js +1 -1
  104. package/dist/backend/llvm/expr-containers.js +39 -15
  105. package/dist/backend/llvm/expr-containers.js.map +1 -1
  106. package/dist/backend/llvm/expr-control.js +16 -16
  107. package/dist/backend/llvm/expr-control.js.map +1 -1
  108. package/dist/backend/llvm/expr-dispatch.js +1 -0
  109. package/dist/backend/llvm/expr-dispatch.js.map +1 -1
  110. package/dist/backend/llvm/expr-dynamic.d.ts +3 -0
  111. package/dist/backend/llvm/expr-dynamic.js +92 -63
  112. package/dist/backend/llvm/expr-dynamic.js.map +1 -1
  113. package/dist/backend/llvm/expr-primitives.d.ts +1 -1
  114. package/dist/backend/llvm/expr-primitives.js +132 -25
  115. package/dist/backend/llvm/expr-primitives.js.map +1 -1
  116. package/dist/backend/llvm/expr-primitives.test.js +2 -2
  117. package/dist/backend/llvm/expr-records.d.ts +1 -1
  118. package/dist/backend/llvm/expr-records.js +32 -11
  119. package/dist/backend/llvm/expr-records.js.map +1 -1
  120. package/dist/backend/llvm/expr-stream-bridges.js +54 -12
  121. package/dist/backend/llvm/expr-stream-bridges.js.map +1 -1
  122. package/dist/backend/llvm/expr-stream-bridges.test.js +2 -2
  123. package/dist/backend/llvm/expr-stream-callbacks.js +22 -1
  124. package/dist/backend/llvm/expr-stream-callbacks.js.map +1 -1
  125. package/dist/backend/llvm/int32-abi.test.js +2 -2
  126. package/dist/backend/llvm/integer-clones.test.js +3 -3
  127. package/dist/backend/llvm/integer-remainder.d.ts +34 -13
  128. package/dist/backend/llvm/integer-remainder.js +156 -22
  129. package/dist/backend/llvm/integer-remainder.js.map +1 -1
  130. package/dist/backend/llvm/intern-tables.test.js +1 -1
  131. package/dist/backend/llvm/jsval-encoding.d.ts +21 -0
  132. package/dist/backend/llvm/jsval-encoding.js +20 -0
  133. package/dist/backend/llvm/jsval-encoding.js.map +1 -0
  134. package/dist/backend/llvm/jsval.d.ts +12 -0
  135. package/dist/backend/llvm/jsval.js +488 -0
  136. package/dist/backend/llvm/jsval.js.map +1 -0
  137. package/dist/backend/llvm/lazy-captures.d.ts +12 -2
  138. package/dist/backend/llvm/lazy-captures.js +39 -17
  139. package/dist/backend/llvm/lazy-captures.js.map +1 -1
  140. package/dist/backend/llvm/lib-abi.js +1 -1
  141. package/dist/backend/llvm/lib-abi.js.map +1 -1
  142. package/dist/backend/llvm/lib-connect.js +1 -1
  143. package/dist/backend/llvm/lib-connect.js.map +1 -1
  144. package/dist/backend/llvm/lib-datagram.js +14 -8
  145. package/dist/backend/llvm/lib-datagram.js.map +1 -1
  146. package/dist/backend/llvm/lib-dispatch.js +217 -24
  147. package/dist/backend/llvm/lib-dispatch.js.map +1 -1
  148. package/dist/backend/llvm/lib-filesystem.js +102 -13
  149. package/dist/backend/llvm/lib-filesystem.js.map +1 -1
  150. package/dist/backend/llvm/lib-http2.js +3 -3
  151. package/dist/backend/llvm/lib-http2.js.map +1 -1
  152. package/dist/backend/llvm/lib-lookup.js +2 -2
  153. package/dist/backend/llvm/lib-lookup.js.map +1 -1
  154. package/dist/backend/llvm/lib-network.js +77 -25
  155. package/dist/backend/llvm/lib-network.js.map +1 -1
  156. package/dist/backend/llvm/lib-process.js +100 -50
  157. package/dist/backend/llvm/lib-process.js.map +1 -1
  158. package/dist/backend/llvm/lib-shared.d.ts +12 -0
  159. package/dist/backend/llvm/lib-shared.js +229 -5
  160. package/dist/backend/llvm/lib-shared.js.map +1 -1
  161. package/dist/backend/llvm/lib-stream.js +46 -16
  162. package/dist/backend/llvm/lib-stream.js.map +1 -1
  163. package/dist/backend/llvm/lib-test.js +57 -8
  164. package/dist/backend/llvm/lib-test.js.map +1 -1
  165. package/dist/backend/llvm/lib-tls.js +4 -9
  166. package/dist/backend/llvm/lib-tls.js.map +1 -1
  167. package/dist/backend/llvm/local-array-reads.js +2 -2
  168. package/dist/backend/llvm/local-array-reads.test.js +1 -1
  169. package/dist/backend/llvm/local-extents.d.ts +19 -0
  170. package/dist/backend/llvm/local-extents.js +169 -0
  171. package/dist/backend/llvm/local-extents.js.map +1 -0
  172. package/dist/backend/llvm/local-extents.test.d.ts +1 -0
  173. package/dist/backend/llvm/local-extents.test.js +92 -0
  174. package/dist/backend/llvm/local-extents.test.js.map +1 -0
  175. package/dist/backend/llvm/local-union-storage.js +7 -7
  176. package/dist/backend/llvm/local-union-storage.js.map +1 -1
  177. package/dist/backend/llvm/local-union-storage.test.js +2 -2
  178. package/dist/backend/llvm/map-entry-fusion.test.js +1 -1
  179. package/dist/backend/llvm/map-number-lookup.js +2 -2
  180. package/dist/backend/llvm/map-number-lookup.test.js +2 -2
  181. package/dist/backend/llvm/map-read-lifetimes.test.js +2 -2
  182. package/dist/backend/llvm/narrow-guards.d.ts +38 -0
  183. package/dist/backend/llvm/narrow-guards.js +151 -0
  184. package/dist/backend/llvm/narrow-guards.js.map +1 -0
  185. package/dist/backend/llvm/nullable-unions.d.ts +70 -9
  186. package/dist/backend/llvm/nullable-unions.js +105 -6
  187. package/dist/backend/llvm/nullable-unions.js.map +1 -1
  188. package/dist/backend/llvm/nullable-unions.test.d.ts +1 -0
  189. package/dist/backend/llvm/nullable-unions.test.js +65 -0
  190. package/dist/backend/llvm/nullable-unions.test.js.map +1 -0
  191. package/dist/backend/llvm/publish.d.ts +4 -0
  192. package/dist/backend/llvm/publish.js +14 -2
  193. package/dist/backend/llvm/publish.js.map +1 -1
  194. package/dist/backend/llvm/publish.test.js +1 -1
  195. package/dist/backend/llvm/receivers.d.ts +31 -0
  196. package/dist/backend/llvm/receivers.js +395 -0
  197. package/dist/backend/llvm/receivers.js.map +1 -0
  198. package/dist/backend/llvm/record-results.d.ts +13 -2
  199. package/dist/backend/llvm/record-results.js +66 -6
  200. package/dist/backend/llvm/record-results.js.map +1 -1
  201. package/dist/backend/llvm/reference-effects.js +9 -0
  202. package/dist/backend/llvm/reference-effects.js.map +1 -1
  203. package/dist/backend/llvm/reference-writes.d.ts +4 -0
  204. package/dist/backend/llvm/reference-writes.js +143 -6
  205. package/dist/backend/llvm/reference-writes.js.map +1 -1
  206. package/dist/backend/llvm/reference-writes.test.d.ts +1 -0
  207. package/dist/backend/llvm/reference-writes.test.js +88 -0
  208. package/dist/backend/llvm/reference-writes.test.js.map +1 -0
  209. package/dist/backend/llvm/regex-matchers.d.ts +8 -0
  210. package/dist/backend/llvm/regex-matchers.js +33 -0
  211. package/dist/backend/llvm/regex-matchers.js.map +1 -1
  212. package/dist/backend/llvm/regex-matchers.test.js +23 -1
  213. package/dist/backend/llvm/regex-matchers.test.js.map +1 -1
  214. package/dist/backend/llvm/regions.d.ts +1 -1
  215. package/dist/backend/llvm/regions.js +9 -6
  216. package/dist/backend/llvm/regions.js.map +1 -1
  217. package/dist/backend/llvm/regions.test.js +1 -1
  218. package/dist/backend/llvm/shapes.d.ts +69 -43
  219. package/dist/backend/llvm/shapes.js +285 -21
  220. package/dist/backend/llvm/shapes.js.map +1 -1
  221. package/dist/backend/llvm/shapes.test.js +37 -3
  222. package/dist/backend/llvm/shapes.test.js.map +1 -1
  223. package/dist/backend/llvm/speculative-integers.d.ts +74 -0
  224. package/dist/backend/llvm/speculative-integers.js +571 -0
  225. package/dist/backend/llvm/speculative-integers.js.map +1 -0
  226. package/dist/backend/llvm/speculative-integers.test.d.ts +1 -0
  227. package/dist/backend/llvm/speculative-integers.test.js +148 -0
  228. package/dist/backend/llvm/speculative-integers.test.js.map +1 -0
  229. package/dist/backend/llvm/split-loops.js +2 -2
  230. package/dist/backend/llvm/split-loops.js.map +1 -1
  231. package/dist/backend/llvm/stack-objects.d.ts +26 -6
  232. package/dist/backend/llvm/stack-objects.js +133 -10
  233. package/dist/backend/llvm/stack-objects.js.map +1 -1
  234. package/dist/backend/llvm/stack-objects.test.js +55 -1
  235. package/dist/backend/llvm/stack-objects.test.js.map +1 -1
  236. package/dist/backend/llvm/stack-unions.test.js +1 -1
  237. package/dist/backend/llvm/string-construction.test.js +1 -1
  238. package/dist/backend/llvm/string-lifetimes.test.js +15 -14
  239. package/dist/backend/llvm/string-lifetimes.test.js.map +1 -1
  240. package/dist/backend/llvm/string-slices.d.ts +25 -0
  241. package/dist/backend/llvm/string-slices.js +207 -1
  242. package/dist/backend/llvm/string-slices.js.map +1 -1
  243. package/dist/backend/llvm/string-slices.test.js +139 -2
  244. package/dist/backend/llvm/string-slices.test.js.map +1 -1
  245. package/dist/backend/llvm/switch-dispatch.test.js +2 -2
  246. package/dist/backend/llvm/thread-slots.d.ts +5 -0
  247. package/dist/backend/llvm/thread-slots.js +142 -0
  248. package/dist/backend/llvm/thread-slots.js.map +1 -0
  249. package/dist/backend/llvm/thread-slots.test.d.ts +1 -0
  250. package/dist/backend/llvm/thread-slots.test.js +110 -0
  251. package/dist/backend/llvm/thread-slots.test.js.map +1 -0
  252. package/dist/backend/llvm/union-repr.d.ts +7 -7
  253. package/dist/backend/llvm/union-repr.js +18 -2
  254. package/dist/backend/llvm/union-repr.js.map +1 -1
  255. package/dist/backend/llvm/union-retype.test.js +17 -3
  256. package/dist/backend/llvm/union-retype.test.js.map +1 -1
  257. package/dist/backend/llvm/walkers.d.ts +2 -2
  258. package/dist/backend/llvm/walkers.js +51 -26
  259. package/dist/backend/llvm/walkers.js.map +1 -1
  260. package/dist/backend/llvm/wasm-modules.d.ts +16 -0
  261. package/dist/backend/llvm/wasm-modules.js +66 -0
  262. package/dist/backend/llvm/wasm-modules.js.map +1 -0
  263. package/dist/backend/llvm/wrapping-sums.d.ts +7 -0
  264. package/dist/backend/llvm/wrapping-sums.js +11 -3
  265. package/dist/backend/llvm/wrapping-sums.js.map +1 -1
  266. package/dist/backend/mangle.d.ts +7 -0
  267. package/dist/backend/mangle.js +11 -0
  268. package/dist/backend/mangle.js.map +1 -1
  269. package/dist/backend/may-throw.d.ts +3 -0
  270. package/dist/backend/may-throw.js +6 -2
  271. package/dist/backend/may-throw.js.map +1 -1
  272. package/dist/backend/may-throw.test.js +1 -1
  273. package/dist/backend/native/contracts.d.ts +37 -0
  274. package/dist/backend/native/executable.js +192 -134
  275. package/dist/backend/native/executable.js.map +1 -1
  276. package/dist/backend/native/library.js +1 -0
  277. package/dist/backend/native/library.js.map +1 -1
  278. package/dist/backend/native/runtime-inputs.d.ts +1 -1
  279. package/dist/backend/native/runtime-inputs.js +2 -0
  280. package/dist/backend/native/runtime-inputs.js.map +1 -1
  281. package/dist/backend/native-link-info-core.d.ts +30 -0
  282. package/dist/backend/native-link-info-core.js.map +1 -1
  283. package/dist/backend/publication.test.js +1 -1
  284. package/dist/backend/runtime-pack-core.d.ts +9 -1
  285. package/dist/backend/runtime-pack-core.js +10 -1
  286. package/dist/backend/runtime-pack-core.js.map +1 -1
  287. package/dist/backend/runtime-pack-native.js +1 -1
  288. package/dist/backend/runtime-pack-native.js.map +1 -1
  289. package/dist/backend/runtime-pack-native.test.d.ts +1 -0
  290. package/dist/backend/runtime-pack-native.test.js +31 -0
  291. package/dist/backend/runtime-pack-native.test.js.map +1 -0
  292. package/dist/backend/runtime-pack-targets.test.js +5 -0
  293. package/dist/backend/runtime-pack-targets.test.js.map +1 -1
  294. package/dist/backend/runtime-pack.d.ts +7 -3
  295. package/dist/backend/runtime-pack.js +12 -6
  296. package/dist/backend/runtime-pack.js.map +1 -1
  297. package/dist/backend/runtime-pack.test.js +20 -6
  298. package/dist/backend/runtime-pack.test.js.map +1 -1
  299. package/dist/backend/stack-observations.d.ts +22 -0
  300. package/dist/backend/stack-observations.js +382 -0
  301. package/dist/backend/stack-observations.js.map +1 -0
  302. package/dist/backend/stack-observations.test.d.ts +1 -0
  303. package/dist/backend/stack-observations.test.js +233 -0
  304. package/dist/backend/stack-observations.test.js.map +1 -0
  305. package/dist/backend/target-diagnostics.js +8 -0
  306. package/dist/backend/target-diagnostics.js.map +1 -1
  307. package/dist/backend/target-diagnostics.test.js +1 -1
  308. package/dist/backend/warm-cache.js +5 -0
  309. package/dist/backend/warm-cache.js.map +1 -1
  310. package/dist/backend/young-nursery.d.ts +7 -0
  311. package/dist/backend/young-nursery.js +10 -0
  312. package/dist/backend/young-nursery.js.map +1 -0
  313. package/dist/cli/command.js +44 -4
  314. package/dist/cli/command.js.map +1 -1
  315. package/dist/cli/usage.d.ts +11 -1
  316. package/dist/cli/usage.js +20 -1
  317. package/dist/cli/usage.js.map +1 -1
  318. package/dist/compat/fetch-profile.js +10 -1
  319. package/dist/compat/fetch-profile.js.map +1 -1
  320. package/dist/compile-types.d.ts +13 -0
  321. package/dist/contracts/check.js +25 -6
  322. package/dist/contracts/check.js.map +1 -1
  323. package/dist/contracts/int32-elements.d.ts +115 -0
  324. package/dist/contracts/int32-elements.js +1179 -0
  325. package/dist/contracts/int32-elements.js.map +1 -0
  326. package/dist/coverage/report.d.ts +16 -0
  327. package/dist/coverage/report.js +182 -1
  328. package/dist/coverage/report.js.map +1 -1
  329. package/dist/coverage/surface-manifest.js +19 -6
  330. package/dist/coverage/surface-manifest.js.map +1 -1
  331. package/dist/coverage/verdict-cache.d.ts +2 -0
  332. package/dist/coverage/verdict-cache.js +12 -0
  333. package/dist/coverage/verdict-cache.js.map +1 -1
  334. package/dist/coverage/verdict-cache.test.js +2 -1
  335. package/dist/coverage/verdict-cache.test.js.map +1 -1
  336. package/dist/diagnostics/diagnostic.d.ts +11 -7
  337. package/dist/diagnostics/diagnostic.js +35 -23
  338. package/dist/diagnostics/diagnostic.js.map +1 -1
  339. package/dist/diagnostics/envelope.d.ts +39 -2
  340. package/dist/diagnostics/envelope.js.map +1 -1
  341. package/dist/diagnostics/render.d.ts +7 -0
  342. package/dist/diagnostics/render.js +50 -13
  343. package/dist/diagnostics/render.js.map +1 -1
  344. package/dist/diagnostics/render.test.d.ts +1 -0
  345. package/dist/diagnostics/render.test.js +49 -0
  346. package/dist/diagnostics/render.test.js.map +1 -0
  347. package/dist/executable/executable-cache.d.ts +17 -0
  348. package/dist/executable/executable-cache.js +13 -1
  349. package/dist/executable/executable-cache.js.map +1 -1
  350. package/dist/executable/executable-cache.test.js +7 -1
  351. package/dist/executable/executable-cache.test.js.map +1 -1
  352. package/dist/executable/prepare.js +2 -1
  353. package/dist/executable/prepare.js.map +1 -1
  354. package/dist/frontend/analysis.js +6 -1
  355. package/dist/frontend/analysis.js.map +1 -1
  356. package/dist/frontend/builtin-modules.d.ts +16 -2
  357. package/dist/frontend/builtin-modules.js +40 -7
  358. package/dist/frontend/builtin-modules.js.map +1 -1
  359. package/dist/frontend/cjs-syntax.js +52 -51
  360. package/dist/frontend/cjs-syntax.js.map +1 -1
  361. package/dist/frontend/contract-types.d.ts +3 -0
  362. package/dist/frontend/contract-types.js +36 -7
  363. package/dist/frontend/contract-types.js.map +1 -1
  364. package/dist/frontend/experimental-import.d.ts +5 -1
  365. package/dist/frontend/experimental-import.js +26 -7
  366. package/dist/frontend/experimental-import.js.map +1 -1
  367. package/dist/frontend/fork-target.js +20 -22
  368. package/dist/frontend/fork-target.js.map +1 -1
  369. package/dist/frontend/fork-target.test.js +2 -1
  370. package/dist/frontend/fork-target.test.js.map +1 -1
  371. package/dist/frontend/function-completion.js +6 -6
  372. package/dist/frontend/function-completion.js.map +1 -1
  373. package/dist/frontend/helper-tokens.js +15 -3
  374. package/dist/frontend/helper-tokens.js.map +1 -1
  375. package/dist/frontend/helper-tokens.test.js +7 -1
  376. package/dist/frontend/helper-tokens.test.js.map +1 -1
  377. package/dist/frontend/inferred-js-diagnostics.js +14 -17
  378. package/dist/frontend/inferred-js-diagnostics.js.map +1 -1
  379. package/dist/frontend/input-tracker.d.ts +3 -0
  380. package/dist/frontend/input-tracker.js +32 -3
  381. package/dist/frontend/input-tracker.js.map +1 -1
  382. package/dist/frontend/lib-contract.js +36 -32
  383. package/dist/frontend/lib-contract.js.map +1 -1
  384. package/dist/frontend/lib-exports.js +3 -3
  385. package/dist/frontend/lib-exports.js.map +1 -1
  386. package/dist/frontend/lowering/array-values.d.ts +8 -3
  387. package/dist/frontend/lowering/array-values.js +60 -11
  388. package/dist/frontend/lowering/array-values.js.map +1 -1
  389. package/dist/frontend/lowering/assert-instances.js +4 -4
  390. package/dist/frontend/lowering/assert-instances.js.map +1 -1
  391. package/dist/frontend/lowering/assertion-identity.d.ts +12 -0
  392. package/dist/frontend/lowering/assertion-identity.js +70 -0
  393. package/dist/frontend/lowering/assertion-identity.js.map +1 -0
  394. package/dist/frontend/lowering/assertion-members.d.ts +28 -0
  395. package/dist/frontend/lowering/assertion-members.js +185 -0
  396. package/dist/frontend/lowering/assertion-members.js.map +1 -0
  397. package/dist/frontend/lowering/binding-analysis.js +27 -20
  398. package/dist/frontend/lowering/binding-analysis.js.map +1 -1
  399. package/dist/frontend/lowering/builtin-calls.js +72 -4
  400. package/dist/frontend/lowering/builtin-calls.js.map +1 -1
  401. package/dist/frontend/lowering/builtin-function-fences.d.ts +14 -0
  402. package/dist/frontend/lowering/builtin-function-fences.js +42 -0
  403. package/dist/frontend/lowering/builtin-function-fences.js.map +1 -0
  404. package/dist/frontend/lowering/builtins/arguments.js +1 -1
  405. package/dist/frontend/lowering/builtins/arguments.js.map +1 -1
  406. package/dist/frontend/lowering/builtins/async-context.js +53 -52
  407. package/dist/frontend/lowering/builtins/async-context.js.map +1 -1
  408. package/dist/frontend/lowering/builtins/atomics.js +6 -6
  409. package/dist/frontend/lowering/builtins/atomics.js.map +1 -1
  410. package/dist/frontend/lowering/builtins/blob.js +8 -6
  411. package/dist/frontend/lowering/builtins/blob.js.map +1 -1
  412. package/dist/frontend/lowering/builtins/builtin-class-dyn.d.ts +23 -0
  413. package/dist/frontend/lowering/builtins/builtin-class-dyn.js +156 -0
  414. package/dist/frontend/lowering/builtins/builtin-class-dyn.js.map +1 -0
  415. package/dist/frontend/lowering/builtins/callable-aliases.js +45 -6
  416. package/dist/frontend/lowering/builtins/callable-aliases.js.map +1 -1
  417. package/dist/frontend/lowering/builtins/child-process-async.js +7 -7
  418. package/dist/frontend/lowering/builtins/child-process-async.js.map +1 -1
  419. package/dist/frontend/lowering/builtins/child-process-methods.d.ts +6 -4
  420. package/dist/frontend/lowering/builtins/child-process-methods.js +310 -57
  421. package/dist/frontend/lowering/builtins/child-process-methods.js.map +1 -1
  422. package/dist/frontend/lowering/builtins/child-process-sync.js +16 -10
  423. package/dist/frontend/lowering/builtins/child-process-sync.js.map +1 -1
  424. package/dist/frontend/lowering/builtins/child-process.d.ts +6 -4
  425. package/dist/frontend/lowering/builtins/child-process.js +85 -61
  426. package/dist/frontend/lowering/builtins/child-process.js.map +1 -1
  427. package/dist/frontend/lowering/builtins/class-values.d.ts +60 -0
  428. package/dist/frontend/lowering/builtins/class-values.js +226 -0
  429. package/dist/frontend/lowering/builtins/class-values.js.map +1 -0
  430. package/dist/frontend/lowering/builtins/compression.d.ts +18 -0
  431. package/dist/frontend/lowering/builtins/compression.js +230 -52
  432. package/dist/frontend/lowering/builtins/compression.js.map +1 -1
  433. package/dist/frontend/lowering/builtins/constants.d.ts +9 -1
  434. package/dist/frontend/lowering/builtins/constants.js +28 -7
  435. package/dist/frontend/lowering/builtins/constants.js.map +1 -1
  436. package/dist/frontend/lowering/builtins/crypto.d.ts +19 -0
  437. package/dist/frontend/lowering/builtins/crypto.js +223 -38
  438. package/dist/frontend/lowering/builtins/crypto.js.map +1 -1
  439. package/dist/frontend/lowering/builtins/dates.d.ts +7 -1
  440. package/dist/frontend/lowering/builtins/dates.js +92 -16
  441. package/dist/frontend/lowering/builtins/dates.js.map +1 -1
  442. package/dist/frontend/lowering/builtins/disposable-stack.d.ts +18 -0
  443. package/dist/frontend/lowering/builtins/disposable-stack.js +137 -0
  444. package/dist/frontend/lowering/builtins/disposable-stack.js.map +1 -0
  445. package/dist/frontend/lowering/builtins/environment.js +3 -3
  446. package/dist/frontend/lowering/builtins/environment.js.map +1 -1
  447. package/dist/frontend/lowering/builtins/errors.d.ts +14 -10
  448. package/dist/frontend/lowering/builtins/errors.js +174 -6
  449. package/dist/frontend/lowering/builtins/errors.js.map +1 -1
  450. package/dist/frontend/lowering/builtins/filesystem-calls.d.ts +4 -0
  451. package/dist/frontend/lowering/builtins/filesystem-calls.js +136 -113
  452. package/dist/frontend/lowering/builtins/filesystem-calls.js.map +1 -1
  453. package/dist/frontend/lowering/builtins/filesystem.d.ts +8 -0
  454. package/dist/frontend/lowering/builtins/filesystem.js +213 -76
  455. package/dist/frontend/lowering/builtins/filesystem.js.map +1 -1
  456. package/dist/frontend/lowering/builtins/fs-glob.js +3 -3
  457. package/dist/frontend/lowering/builtins/fs-glob.js.map +1 -1
  458. package/dist/frontend/lowering/builtins/fs-streams.js +10 -11
  459. package/dist/frontend/lowering/builtins/fs-streams.js.map +1 -1
  460. package/dist/frontend/lowering/builtins/hash-stream.d.ts +12 -0
  461. package/dist/frontend/lowering/builtins/hash-stream.js +80 -0
  462. package/dist/frontend/lowering/builtins/hash-stream.js.map +1 -0
  463. package/dist/frontend/lowering/builtins/ipc.js +45 -8
  464. package/dist/frontend/lowering/builtins/ipc.js.map +1 -1
  465. package/dist/frontend/lowering/builtins/json.js +232 -24
  466. package/dist/frontend/lowering/builtins/json.js.map +1 -1
  467. package/dist/frontend/lowering/builtins/key-object.js +4 -4
  468. package/dist/frontend/lowering/builtins/key-object.js.map +1 -1
  469. package/dist/frontend/lowering/builtins/module-bindings.d.ts +8 -0
  470. package/dist/frontend/lowering/builtins/module-bindings.js +71 -22
  471. package/dist/frontend/lowering/builtins/module-bindings.js.map +1 -1
  472. package/dist/frontend/lowering/builtins/module-calls.js +67 -46
  473. package/dist/frontend/lowering/builtins/module-calls.js.map +1 -1
  474. package/dist/frontend/lowering/builtins/module-resolution.d.ts +4 -3
  475. package/dist/frontend/lowering/builtins/module-resolution.js +24 -23
  476. package/dist/frontend/lowering/builtins/module-resolution.js.map +1 -1
  477. package/dist/frontend/lowering/builtins/navigator.d.ts +13 -0
  478. package/dist/frontend/lowering/builtins/navigator.js +40 -0
  479. package/dist/frontend/lowering/builtins/navigator.js.map +1 -0
  480. package/dist/frontend/lowering/builtins/net-address.d.ts +19 -0
  481. package/dist/frontend/lowering/builtins/net-address.js +156 -0
  482. package/dist/frontend/lowering/builtins/net-address.js.map +1 -0
  483. package/dist/frontend/lowering/builtins/numbers.js +25 -9
  484. package/dist/frontend/lowering/builtins/numbers.js.map +1 -1
  485. package/dist/frontend/lowering/builtins/operating-system.d.ts +4 -0
  486. package/dist/frontend/lowering/builtins/operating-system.js +25 -12
  487. package/dist/frontend/lowering/builtins/operating-system.js.map +1 -1
  488. package/dist/frontend/lowering/builtins/performance.d.ts +12 -0
  489. package/dist/frontend/lowering/builtins/performance.js +259 -8
  490. package/dist/frontend/lowering/builtins/performance.js.map +1 -1
  491. package/dist/frontend/lowering/builtins/process.d.ts +32 -1
  492. package/dist/frontend/lowering/builtins/process.js +468 -99
  493. package/dist/frontend/lowering/builtins/process.js.map +1 -1
  494. package/dist/frontend/lowering/builtins/promises.d.ts +5 -1
  495. package/dist/frontend/lowering/builtins/promises.js +326 -43
  496. package/dist/frontend/lowering/builtins/promises.js.map +1 -1
  497. package/dist/frontend/lowering/builtins/promisify-callback.d.ts +37 -0
  498. package/dist/frontend/lowering/builtins/promisify-callback.js +320 -0
  499. package/dist/frontend/lowering/builtins/promisify-callback.js.map +1 -0
  500. package/dist/frontend/lowering/builtins/properties.js +37 -1
  501. package/dist/frontend/lowering/builtins/properties.js.map +1 -1
  502. package/dist/frontend/lowering/builtins/querystring.js +14 -14
  503. package/dist/frontend/lowering/builtins/querystring.js.map +1 -1
  504. package/dist/frontend/lowering/builtins/readline.d.ts +55 -13
  505. package/dist/frontend/lowering/builtins/readline.js +931 -69
  506. package/dist/frontend/lowering/builtins/readline.js.map +1 -1
  507. package/dist/frontend/lowering/builtins/receiver-types.js +3 -5
  508. package/dist/frontend/lowering/builtins/receiver-types.js.map +1 -1
  509. package/dist/frontend/lowering/builtins/reflection.js +16 -14
  510. package/dist/frontend/lowering/builtins/reflection.js.map +1 -1
  511. package/dist/frontend/lowering/builtins/runtime-constructor.d.ts +26 -0
  512. package/dist/frontend/lowering/builtins/runtime-constructor.js +165 -0
  513. package/dist/frontend/lowering/builtins/runtime-constructor.js.map +1 -0
  514. package/dist/frontend/lowering/builtins/strings.js +101 -12
  515. package/dist/frontend/lowering/builtins/strings.js.map +1 -1
  516. package/dist/frontend/lowering/builtins/text-codecs.js +41 -38
  517. package/dist/frontend/lowering/builtins/text-codecs.js.map +1 -1
  518. package/dist/frontend/lowering/builtins/timers.js +75 -30
  519. package/dist/frontend/lowering/builtins/timers.js.map +1 -1
  520. package/dist/frontend/lowering/builtins/url.d.ts +3 -0
  521. package/dist/frontend/lowering/builtins/url.js +120 -17
  522. package/dist/frontend/lowering/builtins/url.js.map +1 -1
  523. package/dist/frontend/lowering/builtins/util-types.js +20 -4
  524. package/dist/frontend/lowering/builtins/util-types.js.map +1 -1
  525. package/dist/frontend/lowering/builtins/v8.d.ts +11 -0
  526. package/dist/frontend/lowering/builtins/v8.js +105 -0
  527. package/dist/frontend/lowering/builtins/v8.js.map +1 -0
  528. package/dist/frontend/lowering/builtins/webassembly.d.ts +33 -0
  529. package/dist/frontend/lowering/builtins/webassembly.js +388 -0
  530. package/dist/frontend/lowering/builtins/webassembly.js.map +1 -0
  531. package/dist/frontend/lowering/builtins/webcrypto.d.ts +20 -0
  532. package/dist/frontend/lowering/builtins/webcrypto.js +112 -0
  533. package/dist/frontend/lowering/builtins/webcrypto.js.map +1 -0
  534. package/dist/frontend/lowering/builtins/workers.d.ts +16 -0
  535. package/dist/frontend/lowering/builtins/workers.js +246 -3
  536. package/dist/frontend/lowering/builtins/workers.js.map +1 -1
  537. package/dist/frontend/lowering/call-arguments.js +69 -14
  538. package/dist/frontend/lowering/call-arguments.js.map +1 -1
  539. package/dist/frontend/lowering/call-signatures.d.ts +19 -1
  540. package/dist/frontend/lowering/call-signatures.js +254 -47
  541. package/dist/frontend/lowering/call-signatures.js.map +1 -1
  542. package/dist/frontend/lowering/checked-promise-all.d.ts +3 -0
  543. package/dist/frontend/lowering/checked-promise-all.js +1 -1
  544. package/dist/frontend/lowering/checked-promise-all.js.map +1 -1
  545. package/dist/frontend/lowering/cjs-exports-object.d.ts +53 -0
  546. package/dist/frontend/lowering/cjs-exports-object.js +528 -0
  547. package/dist/frontend/lowering/cjs-exports-object.js.map +1 -0
  548. package/dist/frontend/lowering/cjs-inline-require.d.ts +86 -0
  549. package/dist/frontend/lowering/cjs-inline-require.js +314 -0
  550. package/dist/frontend/lowering/cjs-inline-require.js.map +1 -0
  551. package/dist/frontend/lowering/cjs-tsc-interop.d.ts +28 -0
  552. package/dist/frontend/lowering/cjs-tsc-interop.js +208 -0
  553. package/dist/frontend/lowering/cjs-tsc-interop.js.map +1 -0
  554. package/dist/frontend/lowering/class-attributes.d.ts +19 -0
  555. package/dist/frontend/lowering/class-attributes.js +378 -0
  556. package/dist/frontend/lowering/class-attributes.js.map +1 -0
  557. package/dist/frontend/lowering/class-callbacks.d.ts +3 -1
  558. package/dist/frontend/lowering/class-callbacks.js +21 -10
  559. package/dist/frontend/lowering/class-callbacks.js.map +1 -1
  560. package/dist/frontend/lowering/class-construction.js +49 -4
  561. package/dist/frontend/lowering/class-construction.js.map +1 -1
  562. package/dist/frontend/lowering/class-descriptors.d.ts +2 -0
  563. package/dist/frontend/lowering/class-descriptors.js +8 -8
  564. package/dist/frontend/lowering/class-descriptors.js.map +1 -1
  565. package/dist/frontend/lowering/class-dynamic-dispatch.d.ts +64 -0
  566. package/dist/frontend/lowering/class-dynamic-dispatch.js +1115 -89
  567. package/dist/frontend/lowering/class-dynamic-dispatch.js.map +1 -1
  568. package/dist/frontend/lowering/class-instance-constructor.js +1 -1
  569. package/dist/frontend/lowering/class-instance-constructor.js.map +1 -1
  570. package/dist/frontend/lowering/class-iterables.d.ts +11 -0
  571. package/dist/frontend/lowering/class-iterables.js +31 -0
  572. package/dist/frontend/lowering/class-iterables.js.map +1 -0
  573. package/dist/frontend/lowering/class-method-mutations.js +73 -35
  574. package/dist/frontend/lowering/class-method-mutations.js.map +1 -1
  575. package/dist/frontend/lowering/class-method-values.js +56 -10
  576. package/dist/frontend/lowering/class-method-values.js.map +1 -1
  577. package/dist/frontend/lowering/class-protocol-dispatch.js +24 -22
  578. package/dist/frontend/lowering/class-protocol-dispatch.js.map +1 -1
  579. package/dist/frontend/lowering/class-protocols.d.ts +55 -0
  580. package/dist/frontend/lowering/class-protocols.js +738 -22
  581. package/dist/frontend/lowering/class-protocols.js.map +1 -1
  582. package/dist/frontend/lowering/class-prototypes.d.ts +6 -0
  583. package/dist/frontend/lowering/class-prototypes.js +80 -18
  584. package/dist/frontend/lowering/class-prototypes.js.map +1 -1
  585. package/dist/frontend/lowering/class-runtime-statics.js +1 -1
  586. package/dist/frontend/lowering/class-runtime-statics.js.map +1 -1
  587. package/dist/frontend/lowering/class-static-data.js +2 -2
  588. package/dist/frontend/lowering/class-static-data.js.map +1 -1
  589. package/dist/frontend/lowering/class-to-primitive.d.ts +25 -0
  590. package/dist/frontend/lowering/class-to-primitive.js +261 -0
  591. package/dist/frontend/lowering/class-to-primitive.js.map +1 -0
  592. package/dist/frontend/lowering/class-unions.d.ts +25 -0
  593. package/dist/frontend/lowering/class-unions.js +102 -1
  594. package/dist/frontend/lowering/class-unions.js.map +1 -1
  595. package/dist/frontend/lowering/code-generation.d.ts +14 -0
  596. package/dist/frontend/lowering/code-generation.js +127 -0
  597. package/dist/frontend/lowering/code-generation.js.map +1 -0
  598. package/dist/frontend/lowering/coercions/function-adapters.d.ts +16 -2
  599. package/dist/frontend/lowering/coercions/function-adapters.js +145 -3
  600. package/dist/frontend/lowering/coercions/function-adapters.js.map +1 -1
  601. package/dist/frontend/lowering/coercions/structural-plans.js +25 -3
  602. package/dist/frontend/lowering/coercions/structural-plans.js.map +1 -1
  603. package/dist/frontend/lowering/coercions/structural.js +35 -3
  604. package/dist/frontend/lowering/coercions/structural.js.map +1 -1
  605. package/dist/frontend/lowering/coercions/unions.d.ts +15 -0
  606. package/dist/frontend/lowering/coercions/unions.js +57 -1
  607. package/dist/frontend/lowering/coercions/unions.js.map +1 -1
  608. package/dist/frontend/lowering/collection-ingestion.js +2 -2
  609. package/dist/frontend/lowering/collection-ingestion.js.map +1 -1
  610. package/dist/frontend/lowering/collection-narrowing.js +2 -4
  611. package/dist/frontend/lowering/collection-narrowing.js.map +1 -1
  612. package/dist/frontend/lowering/construction-escapes.js +8 -8
  613. package/dist/frontend/lowering/construction-escapes.js.map +1 -1
  614. package/dist/frontend/lowering/construction-escapes.test.js +4 -4
  615. package/dist/frontend/lowering/construction-escapes.test.js.map +1 -1
  616. package/dist/frontend/lowering/constructor-returns.d.ts +61 -0
  617. package/dist/frontend/lowering/constructor-returns.js +477 -0
  618. package/dist/frontend/lowering/constructor-returns.js.map +1 -0
  619. package/dist/frontend/lowering/containers/array-callback-call.js +1 -1
  620. package/dist/frontend/lowering/containers/array-callback-call.js.map +1 -1
  621. package/dist/frontend/lowering/containers/array-callbacks.d.ts +9 -0
  622. package/dist/frontend/lowering/containers/array-callbacks.js +266 -100
  623. package/dist/frontend/lowering/containers/array-callbacks.js.map +1 -1
  624. package/dist/frontend/lowering/containers/array-concat.js +1 -1
  625. package/dist/frontend/lowering/containers/array-concat.js.map +1 -1
  626. package/dist/frontend/lowering/containers/array-construction.d.ts +0 -1
  627. package/dist/frontend/lowering/containers/array-construction.js +51 -13
  628. package/dist/frontend/lowering/containers/array-construction.js.map +1 -1
  629. package/dist/frontend/lowering/containers/array-from-async.d.ts +19 -0
  630. package/dist/frontend/lowering/containers/array-from-async.js +427 -0
  631. package/dist/frontend/lowering/containers/array-from-async.js.map +1 -0
  632. package/dist/frontend/lowering/containers/array-methods.js +89 -77
  633. package/dist/frontend/lowering/containers/array-methods.js.map +1 -1
  634. package/dist/frontend/lowering/containers/array-pipelines.js +1 -0
  635. package/dist/frontend/lowering/containers/array-pipelines.js.map +1 -1
  636. package/dist/frontend/lowering/containers/bytes.js +161 -101
  637. package/dist/frontend/lowering/containers/bytes.js.map +1 -1
  638. package/dist/frontend/lowering/containers/callback-arguments.d.ts +9 -1
  639. package/dist/frontend/lowering/containers/callback-arguments.js +55 -5
  640. package/dist/frontend/lowering/containers/callback-arguments.js.map +1 -1
  641. package/dist/frontend/lowering/containers/collection-grouping.d.ts +7 -8
  642. package/dist/frontend/lowering/containers/collection-grouping.js +219 -27
  643. package/dist/frontend/lowering/containers/collection-grouping.js.map +1 -1
  644. package/dist/frontend/lowering/containers/collection-methods.js +81 -48
  645. package/dist/frontend/lowering/containers/collection-methods.js.map +1 -1
  646. package/dist/frontend/lowering/containers/dynamic-receivers.js +1 -1
  647. package/dist/frontend/lowering/containers/dynamic-receivers.js.map +1 -1
  648. package/dist/frontend/lowering/containers/exec-result-uses.js +2 -2
  649. package/dist/frontend/lowering/containers/exec-result-uses.js.map +1 -1
  650. package/dist/frontend/lowering/containers/for-of.d.ts +6 -0
  651. package/dist/frontend/lowering/containers/for-of.js +19 -19
  652. package/dist/frontend/lowering/containers/for-of.js.map +1 -1
  653. package/dist/frontend/lowering/containers/indexed-objects.js +142 -57
  654. package/dist/frontend/lowering/containers/indexed-objects.js.map +1 -1
  655. package/dist/frontend/lowering/containers/iterator-helpers.d.ts +53 -4
  656. package/dist/frontend/lowering/containers/iterator-helpers.js +1581 -462
  657. package/dist/frontend/lowering/containers/iterator-helpers.js.map +1 -1
  658. package/dist/frontend/lowering/containers/match-row-uses.d.ts +17 -0
  659. package/dist/frontend/lowering/containers/match-row-uses.js +264 -0
  660. package/dist/frontend/lowering/containers/match-row-uses.js.map +1 -0
  661. package/dist/frontend/lowering/containers/string-and-regexp.d.ts +14 -0
  662. package/dist/frontend/lowering/containers/string-and-regexp.js +419 -30
  663. package/dist/frontend/lowering/containers/string-and-regexp.js.map +1 -1
  664. package/dist/frontend/lowering/containers/string-replacement.js +1 -1
  665. package/dist/frontend/lowering/containers/string-replacement.js.map +1 -1
  666. package/dist/frontend/lowering/cycle-initialization.d.ts +4 -0
  667. package/dist/frontend/lowering/cycle-initialization.js +39 -0
  668. package/dist/frontend/lowering/cycle-initialization.js.map +1 -1
  669. package/dist/frontend/lowering/deferred-module-initializers.js +47 -43
  670. package/dist/frontend/lowering/deferred-module-initializers.js.map +1 -1
  671. package/dist/frontend/lowering/devirtualize.d.ts +1 -1
  672. package/dist/frontend/lowering/devirtualize.js +27 -7
  673. package/dist/frontend/lowering/devirtualize.js.map +1 -1
  674. package/dist/frontend/lowering/divergences.d.ts +0 -5
  675. package/dist/frontend/lowering/divergences.js +238 -128
  676. package/dist/frontend/lowering/divergences.js.map +1 -1
  677. package/dist/frontend/lowering/dyn-streams.d.ts +25 -0
  678. package/dist/frontend/lowering/dyn-streams.js +257 -0
  679. package/dist/frontend/lowering/dyn-streams.js.map +1 -0
  680. package/dist/frontend/lowering/error-methods.js +4 -1
  681. package/dist/frontend/lowering/error-methods.js.map +1 -1
  682. package/dist/frontend/lowering/error-name-order.d.ts +19 -0
  683. package/dist/frontend/lowering/error-name-order.js +93 -0
  684. package/dist/frontend/lowering/error-name-order.js.map +1 -0
  685. package/dist/frontend/lowering/expressions/array-literals.d.ts +21 -0
  686. package/dist/frontend/lowering/expressions/array-literals.js +703 -0
  687. package/dist/frontend/lowering/expressions/array-literals.js.map +1 -0
  688. package/dist/frontend/lowering/expressions/binary.d.ts +35 -0
  689. package/dist/frontend/lowering/expressions/binary.js +2483 -0
  690. package/dist/frontend/lowering/expressions/binary.js.map +1 -0
  691. package/dist/frontend/lowering/expressions/element-access.d.ts +31 -0
  692. package/dist/frontend/lowering/expressions/element-access.js +1797 -0
  693. package/dist/frontend/lowering/expressions/element-access.js.map +1 -0
  694. package/dist/frontend/lowering/expressions/evaluation-safety.js +4 -3
  695. package/dist/frontend/lowering/expressions/evaluation-safety.js.map +1 -1
  696. package/dist/frontend/lowering/expressions/hosted-narrowing.d.ts +38 -0
  697. package/dist/frontend/lowering/expressions/hosted-narrowing.js +160 -0
  698. package/dist/frontend/lowering/expressions/hosted-narrowing.js.map +1 -0
  699. package/dist/frontend/lowering/expressions/identifiers.d.ts +4 -0
  700. package/dist/frontend/lowering/expressions/identifiers.js +830 -0
  701. package/dist/frontend/lowering/expressions/identifiers.js.map +1 -0
  702. package/dist/frontend/lowering/expressions/keyed-field-targets.d.ts +40 -0
  703. package/dist/frontend/lowering/expressions/keyed-field-targets.js +226 -0
  704. package/dist/frontend/lowering/expressions/keyed-field-targets.js.map +1 -0
  705. package/dist/frontend/lowering/expressions/narrowing.d.ts +37 -0
  706. package/dist/frontend/lowering/expressions/narrowing.js +1322 -0
  707. package/dist/frontend/lowering/expressions/narrowing.js.map +1 -0
  708. package/dist/frontend/lowering/expressions/native-proxy.js +4 -4
  709. package/dist/frontend/lowering/expressions/native-proxy.js.map +1 -1
  710. package/dist/frontend/lowering/expressions/nullish-assignment.js +45 -0
  711. package/dist/frontend/lowering/expressions/nullish-assignment.js.map +1 -1
  712. package/dist/frontend/lowering/expressions/object-literals.d.ts +10 -0
  713. package/dist/frontend/lowering/expressions/object-literals.js +253 -85
  714. package/dist/frontend/lowering/expressions/object-literals.js.map +1 -1
  715. package/dist/frontend/lowering/expressions/optional-chains.d.ts +2 -1
  716. package/dist/frontend/lowering/expressions/optional-chains.js +91 -14
  717. package/dist/frontend/lowering/expressions/optional-chains.js.map +1 -1
  718. package/dist/frontend/lowering/expressions/property-access.d.ts +110 -0
  719. package/dist/frontend/lowering/expressions/property-access.js +3544 -0
  720. package/dist/frontend/lowering/expressions/property-access.js.map +1 -0
  721. package/dist/frontend/lowering/expressions/relational.d.ts +28 -0
  722. package/dist/frontend/lowering/expressions/relational.js +1679 -0
  723. package/dist/frontend/lowering/expressions/relational.js.map +1 -0
  724. package/dist/frontend/lowering/expressions/typeof.d.ts +22 -0
  725. package/dist/frontend/lowering/expressions/typeof.js +538 -0
  726. package/dist/frontend/lowering/expressions/typeof.js.map +1 -0
  727. package/dist/frontend/lowering/expressions/union-fields.js +1 -1
  728. package/dist/frontend/lowering/expressions/union-fields.js.map +1 -1
  729. package/dist/frontend/lowering/expressions/updates.d.ts +21 -0
  730. package/dist/frontend/lowering/expressions/updates.js +780 -0
  731. package/dist/frontend/lowering/expressions/updates.js.map +1 -0
  732. package/dist/frontend/lowering/function-context.d.ts +10 -0
  733. package/dist/frontend/lowering/function-context.js +11 -1
  734. package/dist/frontend/lowering/function-context.js.map +1 -1
  735. package/dist/frontend/lowering/function-returns.js +52 -28
  736. package/dist/frontend/lowering/function-returns.js.map +1 -1
  737. package/dist/frontend/lowering/general-streams.d.ts +25 -0
  738. package/dist/frontend/lowering/general-streams.js +108 -0
  739. package/dist/frontend/lowering/general-streams.js.map +1 -0
  740. package/dist/frontend/lowering/generator-dynamic-dispatch.d.ts +7 -0
  741. package/dist/frontend/lowering/generator-dynamic-dispatch.js +172 -69
  742. package/dist/frontend/lowering/generator-dynamic-dispatch.js.map +1 -1
  743. package/dist/frontend/lowering/generic-functions.d.ts +39 -0
  744. package/dist/frontend/lowering/generic-functions.js +393 -75
  745. package/dist/frontend/lowering/generic-functions.js.map +1 -1
  746. package/dist/frontend/lowering/import-meta.js +2 -2
  747. package/dist/frontend/lowering/import-meta.js.map +1 -1
  748. package/dist/frontend/lowering/intern-tables.js +10 -9
  749. package/dist/frontend/lowering/intern-tables.js.map +1 -1
  750. package/dist/frontend/lowering/iterator-adapters.d.ts +19 -0
  751. package/dist/frontend/lowering/iterator-adapters.js +331 -3
  752. package/dist/frontend/lowering/iterator-adapters.js.map +1 -1
  753. package/dist/frontend/lowering/js-class-fields.d.ts +28 -0
  754. package/dist/frontend/lowering/js-class-fields.js +170 -0
  755. package/dist/frontend/lowering/js-class-fields.js.map +1 -0
  756. package/dist/frontend/lowering/js-dynamic-objects.d.ts +15 -0
  757. package/dist/frontend/lowering/js-dynamic-objects.js +299 -0
  758. package/dist/frontend/lowering/js-dynamic-objects.js.map +1 -0
  759. package/dist/frontend/lowering/js-dynamic-objects.test.d.ts +1 -0
  760. package/dist/frontend/lowering/js-dynamic-objects.test.js +35 -0
  761. package/dist/frontend/lowering/js-dynamic-objects.test.js.map +1 -0
  762. package/dist/frontend/lowering/json-require.d.ts +22 -0
  763. package/dist/frontend/lowering/json-require.js +131 -0
  764. package/dist/frontend/lowering/json-require.js.map +1 -0
  765. package/dist/frontend/lowering/key-order-witness.d.ts +44 -0
  766. package/dist/frontend/lowering/key-order-witness.js +641 -0
  767. package/dist/frontend/lowering/key-order-witness.js.map +1 -0
  768. package/dist/frontend/lowering/key-order-witness.test.d.ts +1 -0
  769. package/dist/frontend/lowering/key-order-witness.test.js +239 -0
  770. package/dist/frontend/lowering/key-order-witness.test.js.map +1 -0
  771. package/dist/frontend/lowering/lifetime-regions.js +7 -7
  772. package/dist/frontend/lowering/lifetime-regions.js.map +1 -1
  773. package/dist/frontend/lowering/lower-assert.js +61 -60
  774. package/dist/frontend/lowering/lower-assert.js.map +1 -1
  775. package/dist/frontend/lowering/lower-async-iteration.d.ts +10 -1
  776. package/dist/frontend/lowering/lower-async-iteration.js +34 -6
  777. package/dist/frontend/lowering/lower-async-iteration.js.map +1 -1
  778. package/dist/frontend/lowering/lower-builtin-values.d.ts +5 -0
  779. package/dist/frontend/lowering/lower-builtin-values.js +32 -3
  780. package/dist/frontend/lowering/lower-builtin-values.js.map +1 -1
  781. package/dist/frontend/lowering/lower-calls.js +1298 -452
  782. package/dist/frontend/lowering/lower-calls.js.map +1 -1
  783. package/dist/frontend/lowering/lower-classes.d.ts +50 -3
  784. package/dist/frontend/lowering/lower-classes.js +1499 -456
  785. package/dist/frontend/lowering/lower-classes.js.map +1 -1
  786. package/dist/frontend/lowering/lower-comptime.d.ts +4 -2
  787. package/dist/frontend/lowering/lower-comptime.js +111 -13
  788. package/dist/frontend/lowering/lower-comptime.js.map +1 -1
  789. package/dist/frontend/lowering/lower-console.js +13 -11
  790. package/dist/frontend/lowering/lower-console.js.map +1 -1
  791. package/dist/frontend/lowering/lower-dgram.d.ts +10 -0
  792. package/dist/frontend/lowering/lower-dgram.js +179 -8
  793. package/dist/frontend/lowering/lower-dgram.js.map +1 -1
  794. package/dist/frontend/lowering/lower-enums.js +113 -14
  795. package/dist/frontend/lowering/lower-enums.js.map +1 -1
  796. package/dist/frontend/lowering/lower-event-emitter.d.ts +16 -7
  797. package/dist/frontend/lowering/lower-event-emitter.js +268 -71
  798. package/dist/frontend/lowering/lower-event-emitter.js.map +1 -1
  799. package/dist/frontend/lowering/lower-event-target.js +2 -2
  800. package/dist/frontend/lowering/lower-event-target.js.map +1 -1
  801. package/dist/frontend/lowering/lower-expando.js +17 -13
  802. package/dist/frontend/lowering/lower-expando.js.map +1 -1
  803. package/dist/frontend/lowering/lower-exprs.d.ts +188 -186
  804. package/dist/frontend/lowering/lower-exprs.js +1493 -12407
  805. package/dist/frontend/lowering/lower-exprs.js.map +1 -1
  806. package/dist/frontend/lowering/lower-functions.js +68 -22
  807. package/dist/frontend/lowering/lower-functions.js.map +1 -1
  808. package/dist/frontend/lowering/lower-generators.d.ts +6 -0
  809. package/dist/frontend/lowering/lower-generators.js +29 -16
  810. package/dist/frontend/lowering/lower-generators.js.map +1 -1
  811. package/dist/frontend/lowering/lower-global-value.js +5 -1
  812. package/dist/frontend/lowering/lower-global-value.js.map +1 -1
  813. package/dist/frontend/lowering/lower-inspect.js +354 -99
  814. package/dist/frontend/lowering/lower-inspect.js.map +1 -1
  815. package/dist/frontend/lowering/lower-mixins.js +23 -20
  816. package/dist/frontend/lowering/lower-mixins.js.map +1 -1
  817. package/dist/frontend/lowering/lower-mock.d.ts +19 -2
  818. package/dist/frontend/lowering/lower-mock.js +557 -74
  819. package/dist/frontend/lowering/lower-mock.js.map +1 -1
  820. package/dist/frontend/lowering/lower-modules.js +268 -61
  821. package/dist/frontend/lowering/lower-modules.js.map +1 -1
  822. package/dist/frontend/lowering/lower-namespaces.d.ts +6 -0
  823. package/dist/frontend/lowering/lower-namespaces.js +45 -33
  824. package/dist/frontend/lowering/lower-namespaces.js.map +1 -1
  825. package/dist/frontend/lowering/lower-node-module.d.ts +16 -0
  826. package/dist/frontend/lowering/lower-node-module.js +147 -14
  827. package/dist/frontend/lowering/lower-node-module.js.map +1 -1
  828. package/dist/frontend/lowering/lower-server.d.ts +6 -6
  829. package/dist/frontend/lowering/lower-server.js +638 -105
  830. package/dist/frontend/lowering/lower-server.js.map +1 -1
  831. package/dist/frontend/lowering/lower-stdlib.d.ts +4 -0
  832. package/dist/frontend/lowering/lower-stdlib.js +151 -109
  833. package/dist/frontend/lowering/lower-stdlib.js.map +1 -1
  834. package/dist/frontend/lowering/lower-stmts.d.ts +28 -2
  835. package/dist/frontend/lowering/lower-stmts.js +1589 -398
  836. package/dist/frontend/lowering/lower-stmts.js.map +1 -1
  837. package/dist/frontend/lowering/lower-stream.d.ts +4 -3
  838. package/dist/frontend/lowering/lower-stream.js +714 -75
  839. package/dist/frontend/lowering/lower-stream.js.map +1 -1
  840. package/dist/frontend/lowering/lower-test.d.ts +3 -0
  841. package/dist/frontend/lowering/lower-test.js +574 -100
  842. package/dist/frontend/lowering/lower-test.js.map +1 -1
  843. package/dist/frontend/lowering/lower-timers.js +80 -32
  844. package/dist/frontend/lowering/lower-timers.js.map +1 -1
  845. package/dist/frontend/lowering/lower-url.js +1 -1
  846. package/dist/frontend/lowering/lower-url.js.map +1 -1
  847. package/dist/frontend/lowering/lowerer.d.ts +409 -26
  848. package/dist/frontend/lowering/lowerer.js +1918 -305
  849. package/dist/frontend/lowering/lowerer.js.map +1 -1
  850. package/dist/frontend/lowering/lowerer.test.js +10 -4
  851. package/dist/frontend/lowering/lowerer.test.js.map +1 -1
  852. package/dist/frontend/lowering/maybe-promise.d.ts +46 -0
  853. package/dist/frontend/lowering/maybe-promise.js +249 -0
  854. package/dist/frontend/lowering/maybe-promise.js.map +1 -0
  855. package/dist/frontend/lowering/module-member-this.d.ts +3 -0
  856. package/dist/frontend/lowering/module-member-this.js +262 -0
  857. package/dist/frontend/lowering/module-member-this.js.map +1 -0
  858. package/dist/frontend/lowering/module-namespace-elements.js +1 -1
  859. package/dist/frontend/lowering/module-namespace-elements.js.map +1 -1
  860. package/dist/frontend/lowering/nan-coded-reads.d.ts +3 -0
  861. package/dist/frontend/lowering/nan-coded-reads.js +45 -32
  862. package/dist/frontend/lowering/nan-coded-reads.js.map +1 -1
  863. package/dist/frontend/lowering/narrowing-stability.d.ts +18 -3
  864. package/dist/frontend/lowering/narrowing-stability.js +104 -32
  865. package/dist/frontend/lowering/narrowing-stability.js.map +1 -1
  866. package/dist/frontend/lowering/native-ffi.js +11 -11
  867. package/dist/frontend/lowering/native-ffi.js.map +1 -1
  868. package/dist/frontend/lowering/null-prototype.d.ts +13 -0
  869. package/dist/frontend/lowering/null-prototype.js +33 -0
  870. package/dist/frontend/lowering/null-prototype.js.map +1 -0
  871. package/dist/frontend/lowering/object-factory-new.js +6 -8
  872. package/dist/frontend/lowering/object-factory-new.js.map +1 -1
  873. package/dist/frontend/lowering/private-brands.d.ts +46 -0
  874. package/dist/frontend/lowering/private-brands.js +265 -0
  875. package/dist/frontend/lowering/private-brands.js.map +1 -0
  876. package/dist/frontend/lowering/promise-executor-adapter.d.ts +11 -0
  877. package/dist/frontend/lowering/promise-executor-adapter.js +87 -0
  878. package/dist/frontend/lowering/promise-executor-adapter.js.map +1 -0
  879. package/dist/frontend/lowering/require-initialization.d.ts +32 -0
  880. package/dist/frontend/lowering/require-initialization.js +246 -0
  881. package/dist/frontend/lowering/require-initialization.js.map +1 -0
  882. package/dist/frontend/lowering/runtime-optional-bounds.js +7 -7
  883. package/dist/frontend/lowering/runtime-optional-bounds.js.map +1 -1
  884. package/dist/frontend/lowering/runtime-optional-elements.js +12 -12
  885. package/dist/frontend/lowering/runtime-optional-elements.js.map +1 -1
  886. package/dist/frontend/lowering/runtime-optional-guards.js +10 -10
  887. package/dist/frontend/lowering/runtime-optional-guards.js.map +1 -1
  888. package/dist/frontend/lowering/runtime-optional-guards.test.js +1 -1
  889. package/dist/frontend/lowering/runtime-optional-guards.test.js.map +1 -1
  890. package/dist/frontend/lowering/runtime-optional-ownership.js +10 -9
  891. package/dist/frontend/lowering/runtime-optional-ownership.js.map +1 -1
  892. package/dist/frontend/lowering/runtime-optional-provenance.js +2 -2
  893. package/dist/frontend/lowering/runtime-optional-provenance.js.map +1 -1
  894. package/dist/frontend/lowering/runtime-optional-records.d.ts +35 -0
  895. package/dist/frontend/lowering/runtime-optional-records.js +205 -32
  896. package/dist/frontend/lowering/runtime-optional-records.js.map +1 -1
  897. package/dist/frontend/lowering/runtime-optional-records.test.js +19 -1
  898. package/dist/frontend/lowering/runtime-optional-records.test.js.map +1 -1
  899. package/dist/frontend/lowering/sanitize-class-types.test.js +2 -2
  900. package/dist/frontend/lowering/split-consumers.js +4 -4
  901. package/dist/frontend/lowering/split-consumers.js.map +1 -1
  902. package/dist/frontend/lowering/static-function-names.d.ts +28 -0
  903. package/dist/frontend/lowering/static-function-names.js +212 -0
  904. package/dist/frontend/lowering/static-function-names.js.map +1 -0
  905. package/dist/frontend/lowering/static-this.js +6 -6
  906. package/dist/frontend/lowering/static-this.js.map +1 -1
  907. package/dist/frontend/lowering/strict-mode.d.ts +5 -0
  908. package/dist/frontend/lowering/strict-mode.js +31 -0
  909. package/dist/frontend/lowering/strict-mode.js.map +1 -0
  910. package/dist/frontend/lowering/string-index-bounds.js +10 -10
  911. package/dist/frontend/lowering/string-index-bounds.js.map +1 -1
  912. package/dist/frontend/lowering/string-index.d.ts +12 -0
  913. package/dist/frontend/lowering/string-index.js +72 -1
  914. package/dist/frontend/lowering/string-index.js.map +1 -1
  915. package/dist/frontend/lowering/surfaces.d.ts +15 -6
  916. package/dist/frontend/lowering/surfaces.js +278 -45
  917. package/dist/frontend/lowering/surfaces.js.map +1 -1
  918. package/dist/frontend/lowering/symbol-fields.d.ts +7 -0
  919. package/dist/frontend/lowering/symbol-fields.js +204 -36
  920. package/dist/frontend/lowering/symbol-fields.js.map +1 -1
  921. package/dist/frontend/lowering/symbol-methods.d.ts +2 -1
  922. package/dist/frontend/lowering/symbol-methods.js +24 -6
  923. package/dist/frontend/lowering/symbol-methods.js.map +1 -1
  924. package/dist/frontend/lowering/thread-slots.d.ts +13 -0
  925. package/dist/frontend/lowering/thread-slots.js +208 -0
  926. package/dist/frontend/lowering/thread-slots.js.map +1 -0
  927. package/dist/frontend/lowering/typed-arguments.d.ts +74 -0
  928. package/dist/frontend/lowering/typed-arguments.js +472 -0
  929. package/dist/frontend/lowering/typed-arguments.js.map +1 -0
  930. package/dist/frontend/lowering/union-retag.d.ts +8 -0
  931. package/dist/frontend/lowering/union-retag.js +27 -0
  932. package/dist/frontend/lowering/union-retag.js.map +1 -1
  933. package/dist/frontend/lowering/union-retag.test.js +24 -1
  934. package/dist/frontend/lowering/union-retag.test.js.map +1 -1
  935. package/dist/frontend/lowering/var-hoisting.js +6 -6
  936. package/dist/frontend/lowering/var-hoisting.js.map +1 -1
  937. package/dist/frontend/lowering/width-lift.d.ts +4 -0
  938. package/dist/frontend/mock-shapes.d.ts +5 -0
  939. package/dist/frontend/mock-shapes.js +39 -7
  940. package/dist/frontend/mock-shapes.js.map +1 -1
  941. package/dist/frontend/module-source-candidates.js +1 -1
  942. package/dist/frontend/module-source-candidates.js.map +1 -1
  943. package/dist/frontend/module-source-candidates.test.js +2 -1
  944. package/dist/frontend/module-source-candidates.test.js.map +1 -1
  945. package/dist/frontend/module-syntax.js +8 -8
  946. package/dist/frontend/module-syntax.js.map +1 -1
  947. package/dist/frontend/npm-static-bundled-chunks.d.ts +51 -0
  948. package/dist/frontend/npm-static-bundled-chunks.js +810 -0
  949. package/dist/frontend/npm-static-bundled-chunks.js.map +1 -0
  950. package/dist/frontend/npm-static-bundled-chunks.test.d.ts +1 -0
  951. package/dist/frontend/npm-static-bundled-chunks.test.js +287 -0
  952. package/dist/frontend/npm-static-bundled-chunks.test.js.map +1 -0
  953. package/dist/frontend/npm-static-bundled-cjs.js +24 -23
  954. package/dist/frontend/npm-static-bundled-cjs.js.map +1 -1
  955. package/dist/frontend/npm-static-bundled-esm.d.ts +9 -0
  956. package/dist/frontend/npm-static-bundled-esm.js +768 -0
  957. package/dist/frontend/npm-static-bundled-esm.js.map +1 -0
  958. package/dist/frontend/npm-static-bundled-esm.test.d.ts +1 -0
  959. package/dist/frontend/npm-static-bundled-esm.test.js +207 -0
  960. package/dist/frontend/npm-static-bundled-esm.test.js.map +1 -0
  961. package/dist/frontend/npm-static-cjs-exports-alias.d.ts +2 -0
  962. package/dist/frontend/npm-static-cjs-exports-alias.js +186 -0
  963. package/dist/frontend/npm-static-cjs-exports-alias.js.map +1 -0
  964. package/dist/frontend/npm-static-cjs-exports-alias.test.d.ts +1 -0
  965. package/dist/frontend/npm-static-cjs-exports-alias.test.js +73 -0
  966. package/dist/frontend/npm-static-cjs-exports-alias.test.js.map +1 -0
  967. package/dist/frontend/npm-static-cjs-exports-var.d.ts +2 -0
  968. package/dist/frontend/npm-static-cjs-exports-var.js +236 -0
  969. package/dist/frontend/npm-static-cjs-exports-var.js.map +1 -0
  970. package/dist/frontend/npm-static-declaration-syntax.js +102 -101
  971. package/dist/frontend/npm-static-declaration-syntax.js.map +1 -1
  972. package/dist/frontend/npm-static-prune.js +36 -24
  973. package/dist/frontend/npm-static-prune.js.map +1 -1
  974. package/dist/frontend/npm-static-rewrite-host.d.ts +4 -1
  975. package/dist/frontend/npm-static-rewrite-host.js +14 -3
  976. package/dist/frontend/npm-static-rewrite-host.js.map +1 -1
  977. package/dist/frontend/npm-static-rewrite-syntax.d.ts +19 -0
  978. package/dist/frontend/npm-static-rewrite-syntax.js +274 -101
  979. package/dist/frontend/npm-static-rewrite-syntax.js.map +1 -1
  980. package/dist/frontend/npm-static-subtyping.js +7 -9
  981. package/dist/frontend/npm-static-subtyping.js.map +1 -1
  982. package/dist/frontend/npm-static.d.ts +17 -1
  983. package/dist/frontend/npm-static.js +167 -16
  984. package/dist/frontend/npm-static.js.map +1 -1
  985. package/dist/frontend/npm-static.test.js +22 -1
  986. package/dist/frontend/npm-static.test.js.map +1 -1
  987. package/dist/frontend/pipeline.js +164 -26
  988. package/dist/frontend/pipeline.js.map +1 -1
  989. package/dist/frontend/pipeline.test.js +22 -1
  990. package/dist/frontend/pipeline.test.js.map +1 -1
  991. package/dist/frontend/program-analysis.d.ts +6 -1
  992. package/dist/frontend/program-analysis.js +7 -0
  993. package/dist/frontend/program-analysis.js.map +1 -1
  994. package/dist/frontend/program.d.ts +92 -2
  995. package/dist/frontend/program.js +1557 -254
  996. package/dist/frontend/program.js.map +1 -1
  997. package/dist/frontend/program.test.js +76 -6
  998. package/dist/frontend/program.test.js.map +1 -1
  999. package/dist/frontend/resolve.js +36 -2
  1000. package/dist/frontend/resolve.js.map +1 -1
  1001. package/dist/frontend/resolve.test.js +49 -0
  1002. package/dist/frontend/resolve.test.js.map +1 -1
  1003. package/dist/frontend/services.d.ts +20 -1
  1004. package/dist/frontend/services.js +40 -3
  1005. package/dist/frontend/services.js.map +1 -1
  1006. package/dist/frontend/services.test.js +2 -1
  1007. package/dist/frontend/services.test.js.map +1 -1
  1008. package/dist/frontend/threads-import.js +1 -1
  1009. package/dist/frontend/threads-import.js.map +1 -1
  1010. package/dist/frontend/tier-analysis.d.ts +71 -0
  1011. package/dist/frontend/tier-analysis.js +522 -0
  1012. package/dist/frontend/tier-analysis.js.map +1 -0
  1013. package/dist/frontend/ts7/api-conformance.d.ts +234 -0
  1014. package/dist/frontend/ts7/api-conformance.js +7 -0
  1015. package/dist/frontend/ts7/api-conformance.js.map +1 -0
  1016. package/dist/frontend/ts7/ast-guards.generated.js +2 -1
  1017. package/dist/frontend/ts7/ast-guards.generated.js.map +1 -1
  1018. package/dist/frontend/ts7/ast-node.d.ts +47 -25
  1019. package/dist/frontend/ts7/ast-node.js +64 -18
  1020. package/dist/frontend/ts7/ast-node.js.map +1 -1
  1021. package/dist/frontend/ts7/ast-node.test.js +36 -12
  1022. package/dist/frontend/ts7/ast-node.test.js.map +1 -1
  1023. package/dist/frontend/ts7/ast-types.d.ts +10 -3
  1024. package/dist/frontend/ts7/ast-types.generated.d.ts +39 -39
  1025. package/dist/frontend/ts7/ast.d.ts +1 -0
  1026. package/dist/frontend/ts7/ast.js +3 -2
  1027. package/dist/frontend/ts7/ast.js.map +1 -1
  1028. package/dist/frontend/ts7/checker-backend.d.ts +23 -0
  1029. package/dist/frontend/ts7/checker-backend.js +88 -0
  1030. package/dist/frontend/ts7/checker-backend.js.map +1 -0
  1031. package/dist/frontend/ts7/checker-backend.test.d.ts +1 -0
  1032. package/dist/frontend/ts7/checker-backend.test.js +63 -0
  1033. package/dist/frontend/ts7/checker-backend.test.js.map +1 -0
  1034. package/dist/frontend/ts7/checker-cache.d.ts +0 -3
  1035. package/dist/frontend/ts7/checker-cache.js +0 -6
  1036. package/dist/frontend/ts7/checker-cache.js.map +1 -1
  1037. package/dist/frontend/ts7/checker.d.ts +18 -11
  1038. package/dist/frontend/ts7/checker.js +42 -55
  1039. package/dist/frontend/ts7/checker.js.map +1 -1
  1040. package/dist/frontend/ts7/checker.test.js +10 -7
  1041. package/dist/frontend/ts7/checker.test.js.map +1 -1
  1042. package/dist/frontend/ts7/diagnostic.d.ts +19 -0
  1043. package/dist/frontend/ts7/diagnostic.js +22 -0
  1044. package/dist/frontend/ts7/diagnostic.js.map +1 -0
  1045. package/dist/frontend/ts7/node-functions.d.ts +8 -0
  1046. package/dist/frontend/ts7/node-functions.js +18 -0
  1047. package/dist/frontend/ts7/node-functions.js.map +1 -0
  1048. package/dist/frontend/ts7/program-host.d.ts +5 -1
  1049. package/dist/frontend/ts7/program-host.js +12 -0
  1050. package/dist/frontend/ts7/program-host.js.map +1 -1
  1051. package/dist/frontend/ts7/rpc-api.d.ts +5 -1
  1052. package/dist/frontend/ts7/rpc-api.js +8 -1
  1053. package/dist/frontend/ts7/rpc-api.js.map +1 -1
  1054. package/dist/frontend/ts7/semantic-checker.d.ts +13 -6
  1055. package/dist/frontend/ts7/semantic-checker.js +26 -8
  1056. package/dist/frontend/ts7/semantic-checker.js.map +1 -1
  1057. package/dist/frontend/ts7/semantic-checker.test.js +12 -9
  1058. package/dist/frontend/ts7/semantic-checker.test.js.map +1 -1
  1059. package/dist/frontend/ts7/semantic-model.d.ts +54 -24
  1060. package/dist/frontend/ts7/semantic-model.js +88 -16
  1061. package/dist/frontend/ts7/semantic-model.js.map +1 -1
  1062. package/dist/frontend/ts7/semantic-model.test.js +4 -4
  1063. package/dist/frontend/ts7/semantic-model.test.js.map +1 -1
  1064. package/dist/frontend/ts7/semantic-types.d.ts +7 -3
  1065. package/dist/frontend/ts7/semantic-types.js +1 -1
  1066. package/dist/frontend/ts7/semantic-types.js.map +1 -1
  1067. package/dist/frontend/ts7/session.d.ts +11 -11
  1068. package/dist/frontend/ts7/session.js +8 -5
  1069. package/dist/frontend/ts7/session.js.map +1 -1
  1070. package/dist/frontend/ts7/session.test.js +9 -5
  1071. package/dist/frontend/ts7/session.test.js.map +1 -1
  1072. package/dist/frontend/ts7/source-parser.d.ts +6 -2
  1073. package/dist/frontend/ts7/source-parser.js +24 -3
  1074. package/dist/frontend/ts7/source-parser.js.map +1 -1
  1075. package/dist/frontend/ts7/source-parser.test.js +38 -17
  1076. package/dist/frontend/ts7/source-parser.test.js.map +1 -1
  1077. package/dist/frontend/type-mapper.d.ts +122 -2
  1078. package/dist/frontend/type-mapper.js +2612 -695
  1079. package/dist/frontend/type-mapper.js.map +1 -1
  1080. package/dist/frontend/type-only-imports.d.ts +28 -0
  1081. package/dist/frontend/type-only-imports.js +122 -0
  1082. package/dist/frontend/type-only-imports.js.map +1 -0
  1083. package/dist/frontend/worker-target.js +8 -8
  1084. package/dist/frontend/worker-target.js.map +1 -1
  1085. package/dist/index.d.ts +3 -1
  1086. package/dist/index.js +47 -10
  1087. package/dist/index.js.map +1 -1
  1088. package/dist/ir/analysis.js +4 -2
  1089. package/dist/ir/analysis.js.map +1 -1
  1090. package/dist/ir/api.d.ts +1 -1
  1091. package/dist/ir/api.js +1 -1
  1092. package/dist/ir/api.js.map +1 -1
  1093. package/dist/ir/array-length-stability.d.ts +30 -0
  1094. package/dist/ir/array-length-stability.js +236 -0
  1095. package/dist/ir/array-length-stability.js.map +1 -0
  1096. package/dist/ir/array-length-stability.test.d.ts +1 -0
  1097. package/dist/ir/array-length-stability.test.js +113 -0
  1098. package/dist/ir/array-length-stability.test.js.map +1 -0
  1099. package/dist/ir/build.d.ts +2 -2
  1100. package/dist/ir/build.js +1 -1
  1101. package/dist/ir/build.js.map +1 -1
  1102. package/dist/ir/builtin-effects.js +139 -0
  1103. package/dist/ir/builtin-effects.js.map +1 -1
  1104. package/dist/ir/builtin-signatures.d.ts +1 -1
  1105. package/dist/ir/builtin-signatures.js +655 -25
  1106. package/dist/ir/builtin-signatures.js.map +1 -1
  1107. package/dist/ir/byte-numbers.js +3 -0
  1108. package/dist/ir/byte-numbers.js.map +1 -1
  1109. package/dist/ir/callback-specialization.d.ts +37 -0
  1110. package/dist/ir/callback-specialization.js +459 -0
  1111. package/dist/ir/callback-specialization.js.map +1 -0
  1112. package/dist/ir/callback-specialization.test.d.ts +1 -0
  1113. package/dist/ir/callback-specialization.test.js +208 -0
  1114. package/dist/ir/callback-specialization.test.js.map +1 -0
  1115. package/dist/ir/capture-values.d.ts +0 -1
  1116. package/dist/ir/capture-values.js +51 -40
  1117. package/dist/ir/capture-values.js.map +1 -1
  1118. package/dist/ir/constant-globals.test.js +1 -1
  1119. package/dist/ir/constant-tables.test.js +1 -1
  1120. package/dist/ir/field-values.test.js +1 -1
  1121. package/dist/ir/final-fields.test.js +1 -1
  1122. package/dist/ir/function-references.test.js +10 -1
  1123. package/dist/ir/function-references.test.js.map +1 -1
  1124. package/dist/ir/init-only-globals.test.js +1 -1
  1125. package/dist/ir/initializer-bindings.test.js +1 -1
  1126. package/dist/ir/int32-slots.d.ts +14 -0
  1127. package/dist/ir/int32-slots.js +119 -14
  1128. package/dist/ir/int32-slots.js.map +1 -1
  1129. package/dist/ir/int32-slots.test.js +29 -1
  1130. package/dist/ir/int32-slots.test.js.map +1 -1
  1131. package/dist/ir/integer-loop-facts.d.ts +16 -6
  1132. package/dist/ir/integer-loop-facts.js +143 -38
  1133. package/dist/ir/integer-loop-facts.js.map +1 -1
  1134. package/dist/ir/integer-loops.d.ts +1 -1
  1135. package/dist/ir/integer-loops.js +39 -9
  1136. package/dist/ir/integer-loops.js.map +1 -1
  1137. package/dist/ir/integer-loops.test.js +104 -0
  1138. package/dist/ir/integer-loops.test.js.map +1 -1
  1139. package/dist/ir/integer-ranges.d.ts +3 -0
  1140. package/dist/ir/integer-ranges.js +4 -6
  1141. package/dist/ir/integer-ranges.js.map +1 -1
  1142. package/dist/ir/integer-ranges.test.js +142 -1
  1143. package/dist/ir/integer-ranges.test.js.map +1 -1
  1144. package/dist/ir/intrinsic-signatures.js +6 -0
  1145. package/dist/ir/intrinsic-signatures.js.map +1 -1
  1146. package/dist/ir/ir.d.ts +234 -58
  1147. package/dist/ir/ir.js +123 -12
  1148. package/dist/ir/ir.js.map +1 -1
  1149. package/dist/ir/ir.test.js +10 -0
  1150. package/dist/ir/ir.test.js.map +1 -1
  1151. package/dist/ir/jsval.d.ts +8 -0
  1152. package/dist/ir/jsval.js +365 -0
  1153. package/dist/ir/jsval.js.map +1 -0
  1154. package/dist/ir/jsval.test.d.ts +1 -0
  1155. package/dist/ir/jsval.test.js +239 -0
  1156. package/dist/ir/jsval.test.js.map +1 -0
  1157. package/dist/ir/runtime-features.d.ts +150 -33
  1158. package/dist/ir/runtime-features.js +672 -339
  1159. package/dist/ir/runtime-features.js.map +1 -1
  1160. package/dist/ir/runtime-features.test.js +62 -0
  1161. package/dist/ir/runtime-features.test.js.map +1 -1
  1162. package/dist/ir/scalar-records.test.js +1 -1
  1163. package/dist/ir/self-captures.d.ts +33 -0
  1164. package/dist/ir/self-captures.js +245 -0
  1165. package/dist/ir/self-captures.js.map +1 -0
  1166. package/dist/ir/self-captures.test.d.ts +1 -0
  1167. package/dist/ir/self-captures.test.js +135 -0
  1168. package/dist/ir/self-captures.test.js.map +1 -0
  1169. package/dist/ir/serialize.d.ts +1 -1
  1170. package/dist/ir/serialize.js +7 -4
  1171. package/dist/ir/serialize.js.map +1 -1
  1172. package/dist/ir/tiers.d.ts +26 -0
  1173. package/dist/ir/tiers.js +101 -0
  1174. package/dist/ir/tiers.js.map +1 -0
  1175. package/dist/ir/tiers.test.d.ts +1 -0
  1176. package/dist/ir/tiers.test.js +140 -0
  1177. package/dist/ir/tiers.test.js.map +1 -0
  1178. package/dist/ir/traverse.js +107 -94
  1179. package/dist/ir/traverse.js.map +1 -1
  1180. package/dist/ir/traverse.test.js +33 -30
  1181. package/dist/ir/traverse.test.js.map +1 -1
  1182. package/dist/ir/unshare.js +65 -3
  1183. package/dist/ir/unshare.js.map +1 -1
  1184. package/dist/ir/unshare.test.js +1 -1
  1185. package/dist/ir/validate.js +220 -71
  1186. package/dist/ir/validate.js.map +1 -1
  1187. package/dist/ir/validate.test.js +64 -9
  1188. package/dist/ir/validate.test.js.map +1 -1
  1189. package/dist/library/fence-eval.test.js +1 -1
  1190. package/dist/library/int-infer.test.js +4 -4
  1191. package/dist/library/ir-policy.js +18 -0
  1192. package/dist/library/ir-policy.js.map +1 -1
  1193. package/dist/library/library-cache.d.ts +1 -0
  1194. package/dist/library/library-cache.js.map +1 -1
  1195. package/dist/library/library-cache.test.js +5 -5
  1196. package/dist/library/library-profile.d.ts +4 -4
  1197. package/dist/library/library-profile.js +35 -7
  1198. package/dist/library/library-profile.js.map +1 -1
  1199. package/dist/library/prepare.js +13 -1
  1200. package/dist/library/prepare.js.map +1 -1
  1201. package/dist/native/cli.js +5 -0
  1202. package/dist/native/cli.js.map +1 -1
  1203. package/dist/native/compiler.js +2 -2
  1204. package/dist/native/compiler.js.map +1 -1
  1205. package/dist/native/compiler.test.js +2 -2
  1206. package/dist/native/prepare.js +7 -0
  1207. package/dist/native/prepare.js.map +1 -1
  1208. package/dist/native/sanitizer.test.js +12 -0
  1209. package/dist/native/sanitizer.test.js.map +1 -1
  1210. package/dist/native/toolchain.d.ts +2 -0
  1211. package/dist/native/toolchain.js +10 -1
  1212. package/dist/native/toolchain.js.map +1 -1
  1213. package/dist/native/toolchain.test.js +39 -1
  1214. package/dist/native/toolchain.test.js.map +1 -1
  1215. package/dist/startup-cache.d.ts +1 -0
  1216. package/dist/startup-cache.js +1 -0
  1217. package/dist/startup-cache.js.map +1 -1
  1218. package/dist/wasm/base64.d.ts +5 -0
  1219. package/dist/wasm/base64.js +62 -0
  1220. package/dist/wasm/base64.js.map +1 -0
  1221. package/dist/wasm/binary.d.ts +36 -0
  1222. package/dist/wasm/binary.js +1976 -0
  1223. package/dist/wasm/binary.js.map +1 -0
  1224. package/dist/wasm/binary.test.d.ts +1 -0
  1225. package/dist/wasm/binary.test.js +190 -0
  1226. package/dist/wasm/binary.test.js.map +1 -0
  1227. package/dist/wasm/discover.d.ts +38 -0
  1228. package/dist/wasm/discover.js +377 -0
  1229. package/dist/wasm/discover.js.map +1 -0
  1230. package/dist/wasm/discover.test.d.ts +1 -0
  1231. package/dist/wasm/discover.test.js +24 -0
  1232. package/dist/wasm/discover.test.js.map +1 -0
  1233. package/dist/wasm/module.d.ts +151 -0
  1234. package/dist/wasm/module.js +575 -0
  1235. package/dist/wasm/module.js.map +1 -0
  1236. package/dist/wasm/translate.d.ts +48 -0
  1237. package/dist/wasm/translate.js +2129 -0
  1238. package/dist/wasm/translate.js.map +1 -0
  1239. package/dist/wasm/translate.test.d.ts +1 -0
  1240. package/dist/wasm/translate.test.js +207 -0
  1241. package/dist/wasm/translate.test.js.map +1 -0
  1242. package/package.json +21 -20
  1243. package/surface-manifest.json +332 -36
@@ -1,4 +1,12 @@
1
+ import { isForwardedTupleSpread, lowerForwardingApply } from "./typed-arguments.js";
2
+ import { guardNullProto, nullProtoRecordShape } from "./null-prototype.js";
3
+ import { lowerDynStreamMemberCall } from "./dyn-streams.js";
4
+ import { lowerBuiltinClassCall } from "./builtins/builtin-class-dyn.js";
5
+ import { refuseModuleMemberThis } from "./module-member-this.js";
1
6
  import { lowerUnionEquality, tagEqualityMayMissAlias } from "./strict-equality.js";
7
+ import { lowerHashStreamCall } from "./builtins/hash-stream.js";
8
+ import { lowerWebAssemblyValueOf } from "./builtins/webassembly.js";
9
+ import { lowerResponseStaticJson } from "./lower-stdlib.js";
2
10
  import { lowerArrayCallbackCall } from "./containers/array-callback-call.js";
3
11
  /** Dispatch source calls, builtin members and receiver-specific operations.
4
12
  * Signature collection, argument completion and function bodies have their
@@ -7,45 +15,56 @@ import { dynUndefinedExpr, nodeThrowExpr, countedFor, numLit, varRef } from "../
7
15
  import { lowerBuiltinCall } from "./builtin-calls.js";
8
16
  import { threadsImportOf } from "../threads-import.js";
9
17
  import { adaptZeroArgTimerCallback, lowerTimersMemberCall, TIMER_MODULE_MEMBERS, } from "./lower-timers.js";
18
+ import { lowerMockTimersElementCall } from "./lower-test.js";
10
19
  import { objectEnumerationReceiver } from "./object-enumeration-receiver.js";
11
20
  import { InternalCompilerError } from "../../errors.js";
12
21
  import { isFsStreamMember, lowerFsStreamMethodCall } from "./builtins/fs-streams.js";
13
22
  import * as ts from "../ts7/adapter.js";
14
- import { isZlibStreamMember, lowerZlibStreamMethodCall } from "./builtins/compression.js";
23
+ import { isZlibStreamMember, lowerPromisifiedZlibCall, lowerZlibStreamMethodCall, } from "./builtins/compression.js";
24
+ import { inlineNamespaceRequireOf, lowerInlineRequireValue, lowerUncompiledRequireCall, lowerWithInlineRequireInit, } from "./cjs-inline-require.js";
25
+ import { cjsExportCallIgnoresThis, cjsInFileExportGlobalOf } from "./cjs-exports-object.js";
15
26
  import { lowerGenMethodCall } from "./lower-generators.js";
16
27
  import { lowerClassSymbolMethodCall } from "./symbol-methods.js";
28
+ import { lowerReadlineDisposeCall } from "./builtins/readline.js";
17
29
  import { errorToStringCall } from "./error-methods.js";
18
30
  import { lowerClassPrototypeAssign, lowerClassPrototypeDescriptors } from "./class-prototypes.js";
19
- import { BYTES_ELEMENT_NAME, BIGINT_T, BOOL, CAUGHT, DYN, F64, NULL_T, STRING, SYMBOL_T, UNDEFINED_T, VOID, arrayOf, canBoxFuncIntoDyn, canConvertToDyn, canDynCheckTo, funcOf, isDynTypedRefType, isUnitType, shapeHasAccessorSlots, typeEquals, } from "../../ir/ir.js";
31
+ import { BYTES_ELEMENT_NAME, BIGINT_T, BOOL, CAUGHT, DYN, DYN_HANDLE_KINDS, F64, NULL_T, STRING, SYMBOL_T, UNDEFINED_T, VOID, arrayOf, canBoxFuncIntoDyn, canConvertToDyn, canDynCheckTo, funcOf, isDynTypedRefType, isUnitType, shapeHasAccessorSlots, typeEquals, RUNTIME_EMITTER_CLASS, } from "../../ir/ir.js";
20
32
  import { lowerProtocolMethodCall } from "./class-protocol-dispatch.js";
21
33
  import { isJsSourceFile, locOf, requireSpecOf } from "../program.js";
34
+ import { lowerJsonRequireCall } from "./json-require.js";
22
35
  import { lowerAssertInstanceCall } from "./assert-instances.js";
23
- import { isGenericCallableMemberType, typeKey } from "../type-mapper.js";
36
+ import { isGenericCallableMemberType, isOverloadedCallableMemberType, typeKey, } from "../type-mapper.js";
24
37
  import { dynFallbackType, jsFuncNameOf, newFnCtx, staticImportNamespaceType } from "./lowerer.js";
25
38
  import { NARROW_FIRST, STRING_INDEX_METHODS, STR_METHODS, UTIL_TYPES_KEYS, stdlibGlobalNameOf, } from "./surfaces.js";
26
39
  import { dynStringReceiver } from "./containers/dynamic-receivers.js";
27
40
  import { lowerArrayConstructor, lowerArrayFromCall, lowerArrayOfCall, } from "./containers/array-construction.js";
41
+ import { lowerArrayFromAsyncCall } from "./containers/array-from-async.js";
28
42
  import { lowerDynArrayFilterCall, lowerDynArrayFlatMapCall } from "./containers/array-callbacks.js";
29
43
  import { lowerGroupByStaticCall } from "./containers/collection-grouping.js";
30
- import { lowerIteratorHelperCall } from "./containers/iterator-helpers.js";
44
+ import { lowerGeneratorHelperCall, lowerHelperReturnCall, lowerIteratorFromCall, lowerIteratorHelperCall, } from "./containers/iterator-helpers.js";
31
45
  import { lowerObjectAssignIndexShape, lowerObjectConstructor, lowerObjectFromEntriesCall, lowerObjectIterOverIndexShape, } from "./containers/indexed-objects.js";
32
46
  import { lowerTupleReadMethodCall } from "./containers/array-methods.js";
33
47
  import { tryFuseIndexRead } from "./array-values.js";
34
48
  import { lowerBytesStaticCall } from "./containers/bytes.js";
35
- import { lowerRegexMethodCall, lowerStringIndexCall, lowerStringMethodCall, lowerStringPaddingCall, lowerStringSplitCall, } from "./containers/string-and-regexp.js";
49
+ import { lowerRegexMethodCall, lowerStringIndexCall, lowerStringMethodCall, lowerStringPaddingCall, lowerStringSplitCall, isDynPrimitiveKindMethod, lowerDynPrimitiveMethodCall, lowerExtraNumberMethodCall, } from "./containers/string-and-regexp.js";
36
50
  import { createRequireSpecOf } from "./builtins/module-bindings.js";
37
51
  import { lowerChildStreamMethodCall, lowerChildWriterMethodCall, } from "./builtins/child-process-methods.js";
38
52
  import { lowerCreateRequireCall, lowerImportMetaResolveCall, lowerRequireResolveCall, } from "./builtins/module-resolution.js";
39
- import { lowerCipherMethodCall, lowerCryptoHashMethodCall } from "./builtins/crypto.js";
53
+ import { isWebCryptoReceiver, lowerCipherMethodCall, lowerCryptoGetRandomValues, lowerCryptoHashMethodCall, lowerPromisifiedCryptoCall, } from "./builtins/crypto.js";
54
+ import { lowerErrorIsErrorCall } from "./builtins/errors.js";
55
+ import { lowerPromisifiedDnsCall } from "./lower-dgram.js";
56
+ import { lowerDisposableStackUseCall } from "./builtins/disposable-stack.js";
40
57
  import { lowerDirentMethodCall, lowerFileHandleMethodCall, lowerDirMethodCall, lowerWatcherMethodCall, } from "./builtins/filesystem.js";
41
- import { fencePerfEntryKeyWalk, isPerfEntryType, lowerPerfHooksCall, perfEntryTag, } from "./builtins/performance.js";
42
- import { lowerProcStreamMethodCall } from "./builtins/process.js";
58
+ import { fencePerfEntryKeyWalk, isPerfEntryType, lowerHistogramMethodCall, lowerPerfHooksCall, perfEntryTag, } from "./builtins/performance.js";
59
+ import { lowerProcStreamMethodCall, lowerProcessBuiltinModuleNamespace, } from "./builtins/process.js";
43
60
  import { recordMayKeepSource, throughRecordSource } from "./record-sources.js";
44
61
  import { lowerReflectCall } from "./builtins/reflection.js";
45
- import { lowerAbsenceProbe, lowerOptionalNumber, lowerPromiseAllTupleCall, lowerPromiseRejectCall, lowerToNumberArgument, stringWrapperToString, symbolFieldInfo, templateRawTextOf, } from "./lower-exprs.js";
62
+ import { lowerAbsenceProbe, v8CalleeText, lowerOptionalNumber, lowerPromiseAllTupleCall, lowerPromiseRejectCall, lowerToNumberArgument, stringWrapperToString, symbolFieldInfo, templateRawTextOf, } from "./lower-exprs.js";
46
63
  import { isSafeToDiscard } from "./expressions/evaluation-safety.js";
47
64
  import { tryLowerExpression } from "./expressions/try-lower-expression.js";
65
+ import { classToNumberConversion } from "./class-to-primitive.js";
48
66
  import { hasRuntimeStatics } from "./class-runtime-statics.js";
67
+ import { structuralReadType } from "./class-unions.js";
49
68
  import { httpClientFnBindingOf, lowerCompatReqStreamOptionalCall, lowerHttpClientFnCall, } from "./lower-server.js";
50
69
  import { EMITTER_API_MEMBERS, exactClassOfReceiver, exactInstanceClassOf, findGenericMethodOn, lowerClassGenericMethodCall, lowerStaticMethodCall, lowerStaticFieldRead, returnsOnlyThis, storedClassValueType, } from "./lower-classes.js";
51
70
  import { classCallbackCall, isClassCallback } from "./class-callbacks.js";
@@ -59,13 +78,17 @@ import { fenceNodeModuleMutationCall, lowerRequireCacheKeys } from "./lower-node
59
78
  import { defaultAfterUndefined, lowerOptionalArgument, lowerStaticallyUndefinedArgument, positionNumber, } from "./optional-arguments.js";
60
79
  import { fenceSymbolFieldCopy } from "./symbol-fields.js";
61
80
  import { lowerClassDataDescriptor, lowerClassDescriptorRead } from "./class-descriptors.js";
81
+ import { lowerClassFieldDefine, lowerClassIntegrity } from "./class-attributes.js";
62
82
  import { classStaticDataFor } from "./class-static-data.js";
63
83
  import { lowerUrlFactory } from "./lower-url.js";
64
84
  import { nullishValueUnitOf } from "./binding-analysis.js";
65
85
  import { spreadNeedsRuntimeArity, completeFuncValueArgs, lowerSpreadArgsCall, completeArgs, } from "./call-arguments.js";
66
86
  import { isThisParameter } from "./call-signatures.js";
87
+ import { lowerStringIteratorValue } from "./iterator-adapters.js";
67
88
  import { checkedArmExtraction } from "./coercions/unions.js";
89
+ import { maybePromiseReturnStmt, promiseArmedUnionOf } from "./maybe-promise.js";
68
90
  import { requireObjLitGenericReceiver, objLitGenericFnNodeOf, objLitGenericFnInfoOf, genericCallInstance, } from "./generic-functions.js";
91
+ import { codeGenerationCalleeOf, lowerCodeGenerationCall } from "./code-generation.js";
69
92
  const ZLIB_STREAM_METHODS = new Set(["flush", "params", "close", "reset"]);
70
93
  export function lowerCall(lowerer, expr) {
71
94
  const loc = locOf(expr);
@@ -74,10 +97,46 @@ export function lowerCall(lowerer, expr) {
74
97
  if (ts.isIdentifier(expr.expression) &&
75
98
  expr.expression.text === "Object" &&
76
99
  lowerer.isStdlibGlobal(expr.expression, "Object")) {
77
- const object = lowerObjectConstructor(lowerer, expr.arguments, loc);
100
+ const object = lowerObjectConstructor(lowerer, expr.arguments.nodes, loc);
78
101
  if (object)
79
102
  return object;
80
103
  }
104
+ // `EventEmitter.call(this)` in a constructor function: the untyped
105
+ // EventEmitter constructor initializes the receiver.
106
+ const builtinClassCall = lowerBuiltinClassCall(lowerer, expr);
107
+ if (builtinClassCall)
108
+ return builtinClassCall;
109
+ // require() of a JSON document: the shared parsed object.
110
+ const json = lowerJsonRequireCall(lowerer, expr);
111
+ if (json)
112
+ return json;
113
+ // eval(...) and Function(...): Node's EvalError under
114
+ // --disallow-code-generation-from-strings (code-generation.ts).
115
+ {
116
+ const codeGeneration = codeGenerationCalleeOf(lowerer, expr.expression);
117
+ if (codeGeneration !== null)
118
+ return lowerCodeGenerationCall(lowerer, expr, codeGeneration);
119
+ }
120
+ // Inline require() of a program module (cjs-inline-require.ts): a
121
+ // member call over its export table resolves like a binding's member
122
+ // call after the module's %init at this position; the require itself
123
+ // as a value answers the module's whole-export value.
124
+ if (ts.isPropertyAccessExpression(expr.expression) && !expr.expression.questionDotToken) {
125
+ const req = inlineNamespaceRequireOf(lowerer, expr.expression.expression);
126
+ if (req !== null && !lowerer.inlineRequireInitDone.has(req.call)) {
127
+ // Node calls the member with `this` bound to the module's exports.
128
+ if (ts.isIdentifier(expr.expression.name) &&
129
+ !cjsExportCallIgnoresThis(lowerer, req.dep, expr.expression.name.text)) {
130
+ lowerer.unsupported("SC1090", expr, `calling '${expr.expression.name.text}' through require(${JSON.stringify(req.spec)}) when the function may read 'this' (Node binds it to the module's exports object, which compiles to a static table — bind the module and call a local function instead)`);
131
+ }
132
+ return lowerWithInlineRequireInit(lowerer, req, () => lowerCall(lowerer, expr));
133
+ }
134
+ }
135
+ {
136
+ const inlineValue = lowerInlineRequireValue(lowerer, expr);
137
+ if (inlineValue)
138
+ return inlineValue;
139
+ }
81
140
  // A call whose chain ROOTS at an ambient-undefined name (`declare
82
141
  // const value: Y | undefined; value?.foo("a")`, `declare function
83
142
  // chain...; chain(o).mapValues(f).value()`, a trap binding's read):
@@ -138,10 +197,21 @@ export function lowerCall(lowerer, expr) {
138
197
  if (resolved)
139
198
  return resolved;
140
199
  }
200
+ // Any other require() call of the CommonJS global: MODULE_NOT_FOUND for
201
+ // packages nothing installed resolves, a named refusal otherwise.
202
+ {
203
+ const uncompiled = lowerUncompiledRequireCall(lowerer, expr);
204
+ if (uncompiled)
205
+ return uncompiled;
206
+ }
141
207
  // `process.getuid?.()` — intercepted BEFORE the optional-chain
142
208
  // machinery (the member always exists on a POSIX target, so the
143
209
  // optional call IS the call; `process.getuid` itself has no value
144
210
  // lowering for the chain to guard).
211
+ // `h.return!()` / `h.return?.()` on a helper object: the method exists.
212
+ const helperReturn = lowerHelperReturnCall(lowerer, expr);
213
+ if (helperReturn)
214
+ return helperReturn;
145
215
  const processOptional = lowerer.lowerProcessOptionalMethodCall(expr);
146
216
  if (processOptional)
147
217
  return processOptional;
@@ -186,6 +256,15 @@ export function lowerCall(lowerer, expr) {
186
256
  }
187
257
  return { kind: "libCall", fn: "http2.streamNoop", args: [], type: VOID, loc };
188
258
  }
259
+ // `process.getBuiltinModule("node:os")` typed as the module namespace,
260
+ // including pi's cast-and-probe spelling
261
+ // `(process as P).getBuiltinModule?.("node:os")` (the member always
262
+ // exists on Node 24's process object).
263
+ {
264
+ const namespace = lowerProcessBuiltinModuleNamespace(lowerer, expr);
265
+ if (namespace)
266
+ return namespace;
267
+ }
189
268
  // Optional-chain call forms: `f?.()` (the token on the call) and
190
269
  // `a?.m()` (the token on the member access). The handled markers keep
191
270
  // the chain lowering's re-entrant dispatch from looping.
@@ -278,7 +357,7 @@ export function lowerCall(lowerer, expr) {
278
357
  if (ts.isIdentifier(expr.expression) &&
279
358
  expr.expression.text === "queueMicrotask" &&
280
359
  lowerer.isStdlibSymbol(lowerer.resolveValueSymbol(expr.expression) ?? undefined)) {
281
- if (expr.arguments.length === 0) {
360
+ if (expr.arguments.nodes.length === 0) {
282
361
  // Node: queueMicrotask() throws ERR_INVALID_ARG_TYPE at runtime
283
362
  // (the undefined callback) — the Dyn form delivers exactly that.
284
363
  return {
@@ -289,7 +368,7 @@ export function lowerCall(lowerer, expr) {
289
368
  loc,
290
369
  };
291
370
  }
292
- const raw = expr.arguments[0];
371
+ const raw = expr.arguments.nodes[0];
293
372
  const cb = lowerer.lowerExpr(raw);
294
373
  if (cb.type.kind === "dyn") {
295
374
  return { kind: "libCall", fn: "timers.queueMicrotaskDyn", args: [cb], type: VOID, loc };
@@ -322,11 +401,11 @@ export function lowerCall(lowerer, expr) {
322
401
  if (ts.isIdentifier(expr.expression) &&
323
402
  expr.expression.text === "structuredClone" &&
324
403
  lowerer.isStdlibSymbol(lowerer.resolveValueSymbol(expr.expression) ?? undefined)) {
325
- if (expr.arguments.length === 0) {
404
+ if (expr.arguments.nodes.length === 0) {
326
405
  return { kind: "libCall", fn: "dyn.cloneMissing", args: [], type: DYN, loc };
327
406
  }
328
- if (expr.arguments.length > 2) {
329
- lowerer.noLowering(`structuredClone with ${expr.arguments.length} arguments`, expr);
407
+ if (expr.arguments.nodes.length > 2) {
408
+ lowerer.noLowering(`structuredClone with ${expr.arguments.nodes.length} arguments`, expr);
330
409
  }
331
410
  const toDynArg = (a) => {
332
411
  if (!a)
@@ -338,26 +417,26 @@ export function lowerCall(lowerer, expr) {
338
417
  }
339
418
  return conv;
340
419
  };
341
- const valueNode = expr.arguments[0];
420
+ const valueNode = expr.arguments.nodes[0];
342
421
  // A NON-EMPTY transfer array of static values: nothing static is
343
422
  // transferable, so the call is Node's DataCloneError — decided here
344
423
  // (the list's values need no dyn representation to fail). An EMPTY
345
424
  // literal transfer list is a no-op member and drops.
346
425
  {
347
- let optNode = expr.arguments[1];
426
+ let optNode = expr.arguments.nodes[1];
348
427
  while (optNode && ts.isParenthesizedExpression(optNode))
349
428
  optNode = optNode.expression;
350
429
  if (optNode && ts.isObjectLiteralExpression(optNode)) {
351
- const tr = optNode.properties.find((p) => ts.isPropertyAssignment(p) &&
430
+ const tr = optNode.properties.nodes.find((p) => ts.isPropertyAssignment(p) &&
352
431
  p.name !== undefined &&
353
432
  (ts.isIdentifier(p.name) || ts.isStringLiteral(p.name)) &&
354
433
  p.name.text === "transfer");
355
434
  if (tr &&
356
435
  ts.isArrayLiteralExpression(tr.initializer) &&
357
- tr.initializer.elements.length > 0) {
436
+ tr.initializer.elements.nodes.length > 0) {
358
437
  // An ArrayBuffer first member may be a Buffer pool slab, which
359
438
  // Node reports as untransferable.
360
- const first = tr.initializer.elements[0];
439
+ const first = tr.initializer.elements.nodes[0];
361
440
  const firstType = ts.isSpreadElement(first) ? undefined : lowerer.typeOf(first);
362
441
  const parts = !firstType
363
442
  ? []
@@ -366,7 +445,7 @@ export function lowerCall(lowerer, expr) {
366
445
  : [firstType];
367
446
  const isStorage = parts.length > 0 &&
368
447
  parts.every((part) => {
369
- const name = part.getSymbol()?.name;
448
+ const name = ts.symbolNameOf(part.getSymbol());
370
449
  return name === "ArrayBuffer" || name === "SharedArrayBuffer";
371
450
  });
372
451
  if (isStorage) {
@@ -382,7 +461,7 @@ export function lowerCall(lowerer, expr) {
382
461
  }
383
462
  }
384
463
  }
385
- const optsArg = toDynArg(expr.arguments[1]);
464
+ const optsArg = toDynArg(expr.arguments.nodes[1]);
386
465
  // A DOMException value clones through its own runtime arm — the
387
466
  // typed result keeps the class (instanceof, .code, throwability).
388
467
  const valueT = lowerer.mapTypeOf(lowerer.typeOf(valueNode));
@@ -406,11 +485,20 @@ export function lowerCall(lowerer, expr) {
406
485
  };
407
486
  // The declared result is the value's own type (the generic's T):
408
487
  // validate the dyn copy back into it when the type can be checked;
409
- // dyn-typed and unmappable results stay dyn values (JS files).
488
+ // dyn-typed and unmappable results stay dyn values (JS files). An
489
+ // empty record (`{}` inferred from a JavaScript `payload = {}`
490
+ // default) is the checker's supertype of whatever arrives, not a
491
+ // layout: checking into it would drop every member of the copy.
410
492
  const resultT = lowerer.mapTypeOf(lowerer.typeOf(expr));
493
+ const resultShape = resultT?.kind === "record" ? lowerer.shapes.get(resultT.shapeId) : undefined;
494
+ const emptyRecord = resultShape !== undefined &&
495
+ !resultShape.tuple &&
496
+ resultShape.indexValue === undefined &&
497
+ resultShape.fields.length === 0;
411
498
  if (resultT !== null &&
412
499
  resultT.kind !== "dyn" &&
413
500
  resultT.kind !== "void" &&
501
+ !emptyRecord &&
414
502
  canDynCheckTo(resultT, (id) => lowerer.shapes.get(id), (id) => lowerer.unions.get(id))) {
415
503
  return { kind: "dynCheck", value: cloned, type: resultT, loc };
416
504
  }
@@ -435,10 +523,10 @@ export function lowerCall(lowerer, expr) {
435
523
  // constants ("", false, 0). Wrapper objects stay fenced except where
436
524
  // the receiver is immediately converted by a direct String method call.
437
525
  if (lowerer.isStdlibGlobal(expr.expression, "BigInt")) {
438
- if (expr.arguments.length !== 1) {
439
- lowerer.noLowering(`BigInt with ${expr.arguments.length} arguments`, expr);
526
+ if (expr.arguments.nodes.length !== 1) {
527
+ lowerer.noLowering(`BigInt with ${expr.arguments.nodes.length} arguments`, expr);
440
528
  }
441
- const argNode = expr.arguments[0];
529
+ const argNode = expr.arguments.nodes[0];
442
530
  // Captured optional storage can change after TypeScript's guard.
443
531
  // BigInt consumes the stored value, including its nullish tag.
444
532
  const arg = optionalCallValue(lowerer, argNode) ?? lowerer.lowerExpr(argNode);
@@ -455,10 +543,10 @@ export function lowerCall(lowerer, expr) {
455
543
  : lowerer.isStdlibGlobal(expr.expression, "Boolean")
456
544
  ? "Boolean"
457
545
  : "Number";
458
- if (expr.arguments.length > 1) {
459
- lowerer.noLowering(`${name} with ${expr.arguments.length} arguments`, expr);
546
+ if (expr.arguments.nodes.length > 1) {
547
+ lowerer.noLowering(`${name} with ${expr.arguments.nodes.length} arguments`, expr);
460
548
  }
461
- const argNode = expr.arguments[0];
549
+ const argNode = expr.arguments.nodes[0];
462
550
  if (!argNode) {
463
551
  if (name === "String")
464
552
  return { kind: "strLit", value: "", type: STRING, loc };
@@ -513,7 +601,7 @@ export function lowerCall(lowerer, expr) {
513
601
  (source.type.kind === "dyn" ||
514
602
  source.type.kind === "func" ||
515
603
  (source.type.kind === "union" &&
516
- isJsSourceFile(expr.getSourceFile()) &&
604
+ isJsSourceFile(ts.getSourceFileOfNode(expr)) &&
517
605
  lowerer.dynConvertible(source.type)) ||
518
606
  ((source.type.kind === "map" || source.type.kind === "set") &&
519
607
  lowerer.dynConvertible(source.type)) ||
@@ -524,8 +612,8 @@ export function lowerCall(lowerer, expr) {
524
612
  const receiver = varRef(local.id, DYN, loc);
525
613
  const key = lowerer.lowerExprExpecting(access.argumentExpression, DYN);
526
614
  const callee = { kind: "dynKeyGet", value: receiver, key, type: DYN, loc };
527
- const args = expr.arguments.map((arg) => lowerer.lowerExprExpecting(ts.isSpreadElement(arg) ? arg.expression : arg, DYN));
528
- const spreads = expr.arguments.flatMap((arg, index) => ts.isSpreadElement(arg) ? [{ arg: index, what: arg.expression.getText() }] : []);
615
+ const args = expr.arguments.nodes.map((arg) => lowerer.lowerExprExpecting(ts.isSpreadElement(arg) ? arg.expression : arg, DYN));
616
+ const spreads = expr.arguments.nodes.flatMap((arg, index) => ts.isSpreadElement(arg) ? [{ arg: index, what: ts.getTextOfNode(arg.expression) }] : []);
529
617
  return {
530
618
  kind: "seqExpr",
531
619
  stmts: [
@@ -535,7 +623,7 @@ export function lowerCall(lowerer, expr) {
535
623
  kind: "dynCall",
536
624
  callee,
537
625
  receiver,
538
- calleeName: access.getText(),
626
+ calleeName: ts.getTextOfNode(access),
539
627
  args,
540
628
  ...(spreads.length > 0 ? { spreads } : {}),
541
629
  type: DYN,
@@ -556,7 +644,7 @@ export function lowerCall(lowerer, expr) {
556
644
  // all (fs.watch, os.cpus, ...) fence with the module-qualified name.
557
645
  if (ts.isIdentifier(expr.expression)) {
558
646
  if (expr.expression.text === "Array" && lowerer.isStdlibGlobal(expr.expression, "Array")) {
559
- return lowerArrayConstructor(lowerer, expr, expr.arguments);
647
+ return lowerArrayConstructor(lowerer, expr, expr.arguments.nodes);
560
648
  }
561
649
  // A call through a compile-time util.promisify projection. execFile
562
650
  // keeps its custom result helper; ordinary builtins route through
@@ -570,6 +658,15 @@ export function lowerCall(lowerer, expr) {
570
658
  if (projection?.kind === "promisified-exec") {
571
659
  return lowerer.lowerExecFileAsyncCall(expr, loc, true);
572
660
  }
661
+ if (projection?.kind === "promisified-zlib") {
662
+ return lowerPromisifiedZlibCall(lowerer, expr, projection.member, loc);
663
+ }
664
+ if (projection?.kind === "promisified-crypto") {
665
+ return lowerPromisifiedCryptoCall(lowerer, expr, projection.member, loc);
666
+ }
667
+ if (projection?.kind === "promisified-dns") {
668
+ return lowerPromisifiedDnsCall(lowerer, expr, projection.member, loc);
669
+ }
573
670
  if (projection?.kind === "promisified-builtin") {
574
671
  return lowerBuiltinCall(lowerer, expr, { module: projection.module, member: projection.member }, loc);
575
672
  }
@@ -586,9 +683,9 @@ export function lowerCall(lowerer, expr) {
586
683
  if (threadsImportOf(lowerer.program, expr.expression) === "publish") {
587
684
  // @scriptc/threads publish(value): the same value, its graph made
588
685
  // immortal and immutable (backend/llvm/publish.ts).
589
- if (expr.arguments.length !== 1 || ts.isSpreadElement(expr.arguments[0]))
590
- lowerer.noLowering(`publish with ${expr.arguments.length} arguments`, expr);
591
- const value = lowerer.lowerExpr(expr.arguments[0]);
686
+ if (expr.arguments.nodes.length !== 1 || ts.isSpreadElement(expr.arguments.nodes[0]))
687
+ lowerer.noLowering(`publish with ${expr.arguments.nodes.length} arguments`, expr);
688
+ const value = lowerer.lowerExpr(expr.arguments.nodes[0]);
592
689
  return { kind: "intrinsic", name: "threads.publish", args: [value], type: value.type, loc };
593
690
  }
594
691
  const bi = lowerer.builtinImportOf(expr.expression);
@@ -620,10 +717,10 @@ export function lowerCall(lowerer, expr) {
620
717
  // generic new fence keeps it.
621
718
  if (expr.expression.text === "Symbol" &&
622
719
  lowerer.isStdlibSymbol(lowerer.resolveValueSymbol(expr.expression) ?? undefined)) {
623
- if (expr.arguments.length > 1) {
624
- lowerer.noLowering(`Symbol with ${expr.arguments.length} arguments`, expr);
720
+ if (expr.arguments.nodes.length > 1) {
721
+ lowerer.noLowering(`Symbol with ${expr.arguments.nodes.length} arguments`, expr);
625
722
  }
626
- const argNode = expr.arguments[0];
723
+ const argNode = expr.arguments.nodes[0];
627
724
  // A literal `undefined` argument IS the no-description form
628
725
  // (Symbol(undefined).description is undefined, like Symbol()).
629
726
  if (!argNode || (ts.isIdentifier(argNode) && argNode.text === "undefined")) {
@@ -650,7 +747,7 @@ export function lowerCall(lowerer, expr) {
650
747
  expr.expression.text === "parseFloat" ||
651
748
  expr.expression.text === "isFinite") &&
652
749
  lowerer.isStdlibSymbol(lowerer.resolveValueSymbol(expr.expression) ?? undefined)) {
653
- const parsed = lowerStaticNumberGlobal(lowerer, expr.expression.text, expr, expr.arguments, loc);
750
+ const parsed = lowerStaticNumberGlobal(lowerer, expr.expression.text, expr, expr.arguments.nodes, loc);
654
751
  if (parsed !== null)
655
752
  return parsed;
656
753
  }
@@ -670,11 +767,11 @@ export function lowerCall(lowerer, expr) {
670
767
  expr.expression.text === "decodeURIComponent") &&
671
768
  lowerer.isStdlibSymbol(lowerer.resolveValueSymbol(expr.expression) ?? undefined)) {
672
769
  const name = expr.expression.text;
673
- if (expr.arguments.length !== 1) {
674
- lowerer.noLowering(`${name} with ${expr.arguments.length} argument${expr.arguments.length === 1 ? "" : "s"}`, expr);
770
+ if (expr.arguments.nodes.length !== 1) {
771
+ lowerer.noLowering(`${name} with ${expr.arguments.nodes.length} argument${expr.arguments.nodes.length === 1 ? "" : "s"}`, expr);
675
772
  }
676
773
  const loc = locOf(expr);
677
- const argNode = expr.arguments[0];
774
+ const argNode = expr.arguments.nodes[0];
678
775
  if (name === "decodeURIComponent" || name === "decodeURI") {
679
776
  const d = optionalCallValue(lowerer, argNode) ?? lowerer.lowerExpr(argNode);
680
777
  const s = lowerer.ensureString(d, argNode);
@@ -707,13 +804,13 @@ export function lowerCall(lowerer, expr) {
707
804
  if ((expr.expression.text === "atob" || expr.expression.text === "btoa") &&
708
805
  lowerer.isStdlibSymbol(lowerer.resolveValueSymbol(expr.expression) ?? undefined)) {
709
806
  const name = expr.expression.text;
710
- if (expr.arguments.length === 0) {
807
+ if (expr.arguments.nodes.length === 0) {
711
808
  return { kind: "libCall", fn: "str.b64Missing", args: [], type: STRING, loc };
712
809
  }
713
- if (expr.arguments.length > 1) {
714
- lowerer.noLowering(`${name} with ${expr.arguments.length} arguments`, expr);
810
+ if (expr.arguments.nodes.length > 1) {
811
+ lowerer.noLowering(`${name} with ${expr.arguments.nodes.length} arguments`, expr);
715
812
  }
716
- const argNode = expr.arguments[0];
813
+ const argNode = expr.arguments.nodes[0];
717
814
  const v = lowerer.lowerExpr(argNode);
718
815
  let data;
719
816
  if (v.type.kind === "dyn") {
@@ -737,17 +834,17 @@ export function lowerCall(lowerer, expr) {
737
834
  // result exits to the declared static type. A user function
738
835
  // shadowing the name has a different, non-stdlib symbol.
739
836
  const islFn = lowerer.stdlibGlobalFnOf(expr.expression);
740
- if (islFn && expr.arguments.length !== islFn.args.length) {
837
+ if (islFn && expr.arguments.nodes.length !== islFn.args.length) {
741
838
  const name = expr.expression.text;
742
- lowerer.noLowering(`${name} with ${expr.arguments.length} argument${expr.arguments.length === 1 ? "" : "s"}`, expr);
839
+ lowerer.noLowering(`${name} with ${expr.arguments.nodes.length} argument${expr.arguments.nodes.length === 1 ? "" : "s"}`, expr);
743
840
  }
744
- if (islFn && expr.arguments.length === islFn.args.length) {
841
+ if (islFn && expr.arguments.nodes.length === islFn.args.length) {
745
842
  // The static forms above already took the exactly-typed argument
746
843
  // (a string for parseFloat, a number for isFinite): name the
747
844
  // argument type that refused the call, so the message states the
748
845
  // condition rather than reading as if the global itself were
749
846
  // unsupported.
750
- const argText = loweredArgumentText(lowerer, expr.arguments[0]);
847
+ const argText = loweredArgumentText(lowerer, expr.arguments.nodes[0]);
751
848
  const exact = expr.expression.text === "isFinite" ? "number" : "string";
752
849
  lowerer.refuseUnsupportedApi(`'${expr.expression.text}' with a '${argText}' argument`, expr, exact === "string"
753
850
  ? "only a string argument compiles statically: convert the argument explicitly first (for example String(x), or narrow the union)"
@@ -762,8 +859,8 @@ export function lowerCall(lowerer, expr) {
762
859
  // typeof tests) applies inside it, tsc's call-site narrowing types
763
860
  // the guarded branch, and a body construct with no caught lowering
764
861
  // fences per site at its own location.
765
- if (ts.isIdentifier(expr.expression) && expr.arguments.length === 1) {
766
- const caughtArg = lowerer.caughtLocalOf(expr.arguments[0]);
862
+ if (ts.isIdentifier(expr.expression) && expr.arguments.nodes.length === 1) {
863
+ const caughtArg = lowerer.caughtLocalOf(expr.arguments.nodes[0]);
767
864
  if (caughtArg) {
768
865
  const inlined = lowerCaughtPredicateCall(lowerer, expr, caughtArg);
769
866
  if (inlined)
@@ -791,7 +888,8 @@ export function lowerCall(lowerer, expr) {
791
888
  // VALUE path — the runtime-arity lane (lowerSpreadArgsCall) boxes
792
889
  // the declaration's value and applies through a runtime-built
793
890
  // argument list. Typed .ts spreads keep completeArgs' rest packing.
794
- const jsSpreadArgs = expr.arguments.some((a) => ts.isSpreadElement(a)) && isJsSourceFile(expr.getSourceFile());
891
+ const jsSpreadArgs = expr.arguments.nodes.some((a) => ts.isSpreadElement(a)) &&
892
+ isJsSourceFile(ts.getSourceFileOfNode(expr));
795
893
  if (lowerer.isTopLevelFnSymbol(expr.expression) && !lowerer.peekLocal(expr.expression)) {
796
894
  // `import g = N.f; g()` — the alias's own source-order guards
797
895
  // (a no-op for every non-import= binding).
@@ -803,17 +901,18 @@ export function lowerCall(lowerer, expr) {
803
901
  if (generic && !(jsSpreadArgs && generic.implicitParams))
804
902
  return lowerer.lowerGenericCall(expr, generic);
805
903
  const sig = generic ? null : lowerer.fnSigOf(expr.expression);
806
- if (sig && !(jsSpreadArgs && spreadNeedsRuntimeArity(lowerer, sig.params, expr.arguments))) {
904
+ if (sig &&
905
+ !(jsSpreadArgs && spreadNeedsRuntimeArity(lowerer, sig.params, expr.arguments.nodes))) {
807
906
  lowerer.noteEdge(sig.name);
808
- const args = lowerer.completeArgs(expr.arguments, sig.params, loc, expr);
907
+ const args = lowerer.completeArgs(expr.arguments.nodes, sig.params, loc, expr);
809
908
  const symbol = lowerer.resolveValueSymbol(expr.expression);
810
- const declaration = symbol ? lowerer.checker.valueDeclarationOf(symbol) : undefined;
909
+ const declaration = symbol ? symbol.valueDeclaration : undefined;
811
910
  // A bare call supplies undefined as this, even inside a callback
812
911
  // currently carrying a receiver. The value-call ABI saves and
813
912
  // restores that ambient receiver around the function invocation.
814
913
  if (declaration &&
815
914
  ts.isFunctionDeclaration(declaration) &&
816
- declaration.parameters.some(isThisParameter)) {
915
+ declaration.parameters.nodes.some(isThisParameter)) {
817
916
  const callee = lowerer.lowerExpr(expr.expression);
818
917
  return reconcileOverloadReturn(lowerer, expr, {
819
918
  kind: "callValue",
@@ -897,13 +996,14 @@ export function lowerCall(lowerer, expr) {
897
996
  const memberSym = lowerer.checker.getSymbolAtLocation(nsMember);
898
997
  if (memberSym)
899
998
  fenceEarlyNsMemberRef(lowerer, expr.expression, memberSym);
999
+ refuseModuleMemberThis(lowerer, expr, nsMember);
900
1000
  const generic = lowerer.genericFnOf(nsMember);
901
1001
  if (generic)
902
1002
  return lowerer.lowerGenericCall(expr, generic);
903
1003
  const sig = lowerer.fnSigOf(nsMember);
904
1004
  if (sig) {
905
1005
  lowerer.noteEdge(sig.name);
906
- const args = lowerer.completeArgs(expr.arguments, sig.params, loc, expr);
1006
+ const args = lowerer.completeArgs(expr.arguments.nodes, sig.params, loc, expr);
907
1007
  return reconcileOverloadReturn(lowerer, expr, {
908
1008
  kind: "call",
909
1009
  callee: sig.name,
@@ -961,13 +1061,14 @@ export function lowerCall(lowerer, expr) {
961
1061
  if (!ts.isIdentifier(nameId)) {
962
1062
  lowerer.unsupported("SC1090", nameId, "private-named module members");
963
1063
  }
1064
+ refuseModuleMemberThis(lowerer, expr, nameId);
964
1065
  const generic = lowerer.genericFnOf(nameId);
965
1066
  if (generic)
966
1067
  return lowerer.lowerGenericCall(expr, generic);
967
1068
  const sig = lowerer.fnSigOf(nameId);
968
1069
  if (sig) {
969
1070
  lowerer.noteEdge(sig.name);
970
- const args = lowerer.completeArgs(expr.arguments, sig.params, loc, expr);
1071
+ const args = lowerer.completeArgs(expr.arguments.nodes, sig.params, loc, expr);
971
1072
  return reconcileOverloadReturn(lowerer, expr, {
972
1073
  kind: "call",
973
1074
  callee: sig.name,
@@ -987,8 +1088,35 @@ export function lowerCall(lowerer, expr) {
987
1088
  const args = completeFuncValueArgs(lowerer, expr, callee.type, loc);
988
1089
  return { kind: "callValue", callee, args, type: callee.type.ret, loc };
989
1090
  }
1091
+ // `exports.f(x)` / `module.exports.f(x)` inside the module: a call of
1092
+ // the member's export global (cjs-exports-object.ts), the value every
1093
+ // `exports.f =` statement assigns.
1094
+ if (ts.isPropertyAccessExpression(expr.expression) && !expr.questionDotToken) {
1095
+ const g = cjsInFileExportGlobalOf(lowerer, expr.expression);
1096
+ if (g &&
1097
+ (g.type.kind === "func" || g.type.kind === "dyn") &&
1098
+ !cjsExportCallIgnoresThis(lowerer, ts.getSourceFileOfNode(expr), expr.expression.name.text)) {
1099
+ lowerer.unsupported("SC1090", expr, `calling '${ts.getTextOfNode(expr.expression)}' through the module's exports object when the function may read 'this' (Node binds it to the exports object, which compiles to a static table — call a local function instead)`);
1100
+ }
1101
+ if (g && (g.type.kind === "func" || g.type.kind === "dyn")) {
1102
+ const callee = { kind: "varRef", localId: g.id, type: g.type, loc };
1103
+ const checked = lowerCheckedCallableValue(lowerer, expr, callee, loc);
1104
+ if (checked)
1105
+ return checked;
1106
+ if (callee.type.kind === "func") {
1107
+ const args = completeFuncValueArgs(lowerer, expr, callee.type, loc);
1108
+ return { kind: "callValue", callee, args, type: callee.type.ret, loc };
1109
+ }
1110
+ }
1111
+ }
990
1112
  if (ts.isPropertyAccessExpression(expr.expression)) {
991
- const intrinsic = fenceNodeModuleMutationCall(lowerer, expr, expr.expression) ??
1113
+ const intrinsic =
1114
+ // Checked-dynamic stream slots dispatch per value (dyn-streams.ts).
1115
+ lowerDynStreamMemberCall(lowerer, expr, expr.expression) ??
1116
+ fenceNodeModuleMutationCall(lowerer, expr, expr.expression) ??
1117
+ // `f.apply(thisArg, args)` forwarding a fixed argument tuple (typed
1118
+ // `arguments`, a tuple rest parameter): a direct call.
1119
+ lowerForwardingApply(lowerer, expr, expr.expression) ??
992
1120
  // Builtin namespace imports first (`fs.readFileSync(...)` where fs
993
1121
  // is `import * as fs from "node:fs"`): the same tables and fences
994
1122
  // as named builtin imports — before anything below tries to lower
@@ -1000,6 +1128,7 @@ export function lowerCall(lowerer, expr) {
1000
1128
  // .bind(performance) function value over the runtime's
1001
1129
  // process-start-anchored monotonic clock.
1002
1130
  lowerPerfHooksCall(lowerer, expr, expr.expression) ??
1131
+ lowerHistogramMethodCall(lowerer, expr, expr.expression) ??
1003
1132
  // The composed crypto pattern (randomBytes(n).toString(enc))
1004
1133
  // — its receiver is a Buffer-typed CALL no other lowering claims.
1005
1134
  lowerer.lowerCryptoComposedCall(expr, expr.expression) ??
@@ -1026,6 +1155,7 @@ export function lowerCall(lowerer, expr) {
1026
1155
  lowerer.lowerUrlMethodCall(expr, expr.expression) ??
1027
1156
  lowerer.lowerSearchParamsMethodCall(expr, expr.expression) ??
1028
1157
  lowerer.lowerStatsMethodCall(expr, expr.expression) ??
1158
+ lowerHashStreamCall(lowerer, expr, expr.expression) ??
1029
1159
  lowerCryptoHashMethodCall(lowerer, expr, expr.expression) ??
1030
1160
  lowerCipherMethodCall(lowerer, expr, expr.expression) ??
1031
1161
  lowerFileHandleMethodCall(lowerer, expr, expr.expression) ??
@@ -1092,6 +1222,8 @@ export function lowerCall(lowerer, expr) {
1092
1222
  // compile-time-known, so a literal key folds to a constant.
1093
1223
  lowerClassHasOwnPropertyCall(lowerer, expr, expr.expression) ??
1094
1224
  lowerObjectOwnMethodCall(lowerer, expr, expr.expression) ??
1225
+ // Static Response.json(data, init?) builds a native Response.
1226
+ lowerResponseStaticJson(lowerer, expr) ??
1095
1227
  // Refuse Response constructor operations before generic-call
1096
1228
  // fallbacks can report an unrelated SC1090 diagnostic.
1097
1229
  lowerer.fenceUnsupportedFetchConstructorMember(expr.expression) ??
@@ -1101,7 +1233,11 @@ export function lowerCall(lowerer, expr) {
1101
1233
  lowerer.fenceStaticResponseMember(expr.expression, "call") ??
1102
1234
  lowerer.fenceStaticHeadersMember(expr.expression, "call") ??
1103
1235
  lowerer.fenceStaticReadableStreamMember(expr.expression, "call") ??
1236
+ lowerDisposableStackUseCall(lowerer, expr, expr.expression) ??
1104
1237
  lowerer.lowerStdlibMethodCall(expr, expr.expression) ??
1238
+ // crypto.getRandomValues on the WebCrypto global (untyped in
1239
+ // fallback builds, so before the dyn receiver path) or webcrypto.
1240
+ lowerWebCryptoGetRandomValues(lowerer, expr, expr.expression) ??
1105
1241
  // Dyn receivers (JSON.parse-derived `unknown`/`any` values) —
1106
1242
  lowerDynReceiverMethodCall(lowerer, expr, expr.expression) ??
1107
1243
  // Narrowing filters (inferred predicates, filter(Boolean)) claim
@@ -1109,6 +1245,7 @@ export function lowerCall(lowerer, expr) {
1109
1245
  // by the receiver's own element.
1110
1246
  lowerer.lowerFilterNarrowCall(expr, expr.expression) ??
1111
1247
  lowerArrayIsArrayCall(lowerer, expr, expr.expression) ??
1248
+ lowerErrorIsErrorCall(lowerer, expr, expr.expression) ??
1112
1249
  lowerBigIntMethodCall(lowerer, expr, expr.expression) ??
1113
1250
  lowerSymbolStaticCall(lowerer, expr, expr.expression) ??
1114
1251
  lowerSymbolMethodCall(lowerer, expr, expr.expression) ??
@@ -1121,10 +1258,13 @@ export function lowerCall(lowerer, expr) {
1121
1258
  // array method paths (the terminal names collide with array
1122
1259
  // methods, but only iterator-typed receivers reach this).
1123
1260
  lowerIteratorHelperCall(lowerer, expr, expr.expression) ??
1261
+ // Helper calls on generators and other iterator objects.
1262
+ lowerGeneratorHelperCall(lowerer, expr, expr.expression) ??
1124
1263
  lowerIteratorStaticFence(lowerer, expr, expr.expression) ??
1125
1264
  lowerObjectStaticCall(lowerer, expr, expr.expression) ??
1126
1265
  lowerObjectFromEntriesCall(lowerer, expr, expr.expression) ??
1127
1266
  lowerArrayFromCall(lowerer, expr, expr.expression) ??
1267
+ lowerArrayFromAsyncCall(lowerer, expr, expr.expression) ??
1128
1268
  lowerArrayOfCall(lowerer, expr, expr.expression) ??
1129
1269
  lowerer.lowerArrayMethodCall(expr, expr.expression) ??
1130
1270
  // Tuple reads preserve the receiver through argument evaluation;
@@ -1143,15 +1283,20 @@ export function lowerCall(lowerer, expr) {
1143
1283
  lowerObjLitGenericMethodCall(lowerer, expr, expr.expression);
1144
1284
  if (intrinsic)
1145
1285
  return intrinsic;
1146
- if (isJsSourceFile(expr.getSourceFile())) {
1286
+ {
1287
+ const boxed = lowerDynReceiverMethodCall(lowerer, expr, expr.expression, true);
1288
+ if (boxed)
1289
+ return boxed;
1290
+ }
1291
+ if (isJsSourceFile(ts.getSourceFileOfNode(expr))) {
1147
1292
  const staticField = lowerStaticFieldRead(lowerer, expr.expression);
1148
- if (staticField?.type.kind === "dyn" && !expr.arguments.some(ts.isSpreadElement)) {
1293
+ if (staticField?.type.kind === "dyn" && !expr.arguments.nodes.some(ts.isSpreadElement)) {
1149
1294
  return {
1150
1295
  kind: "dynCall",
1151
1296
  callee: staticField,
1152
1297
  receiver: lowerer.lowerExprExpecting(expr.expression.expression, DYN),
1153
- calleeName: expr.expression.getText(),
1154
- args: expr.arguments.map((arg) => lowerer.lowerExprExpecting(arg, DYN)),
1298
+ calleeName: v8CalleeText(expr.expression),
1299
+ args: expr.arguments.nodes.map((arg) => lowerer.lowerExprExpecting(arg, DYN)),
1155
1300
  type: DYN,
1156
1301
  loc: locOf(expr),
1157
1302
  };
@@ -1164,12 +1309,13 @@ export function lowerCall(lowerer, expr) {
1164
1309
  const args = completeFuncValueArgs(lowerer, expr, callee.type, locOf(expr));
1165
1310
  return { kind: "callValue", callee, args, type: callee.type.ret, loc: locOf(expr) };
1166
1311
  }
1167
- if (callee.type.kind === "dyn" && !expr.arguments.some((arg) => ts.isSpreadElement(arg))) {
1168
- const args = expr.arguments.map((arg) => lowerer.lowerExprExpecting(arg, DYN));
1312
+ if (callee.type.kind === "dyn" &&
1313
+ !expr.arguments.nodes.some((arg) => ts.isSpreadElement(arg))) {
1314
+ const args = expr.arguments.nodes.map((arg) => lowerer.lowerExprExpecting(arg, DYN));
1169
1315
  return {
1170
1316
  kind: "dynCall",
1171
1317
  callee,
1172
- calleeName: expr.expression.getText(),
1318
+ calleeName: v8CalleeText(expr.expression),
1173
1319
  args,
1174
1320
  type: DYN,
1175
1321
  loc: locOf(expr),
@@ -1206,7 +1352,7 @@ export function lowerCall(lowerer, expr) {
1206
1352
  {
1207
1353
  const recvT = lowerer.typeOf(expr.expression.expression);
1208
1354
  if (recvT.isIntersectionType() && lowerer.checker.getCallSignatures(recvT).length > 0) {
1209
- lowerer.unsupported("SC1090", expr, `calls through function-with-properties values ('${expr.expression.expression.getText()}' is callable AND carries members — the chalk shape; no hybrid representation exists yet: export the base and the property as separate functions)`);
1355
+ lowerer.unsupported("SC1090", expr, `calls through function-with-properties values ('${ts.getTextOfNode(expr.expression.expression)}' is callable AND carries members — the chalk shape; no hybrid representation exists yet: export the base and the property as separate functions)`);
1210
1356
  }
1211
1357
  }
1212
1358
  // A GENERIC method no lowering above claimed — an ambient `declare
@@ -1221,14 +1367,29 @@ export function lowerCall(lowerer, expr) {
1221
1367
  lowerer.unsupported("SC1090", expr, `calls of the generic method '${expr.expression.name.text}' through this receiver (no compiled declaration with a body resolves statically here — ambient 'declare class' and interface-only methods are signature-only, and only class, static, and object-literal generic methods with bodies monomorphize)`);
1222
1368
  }
1223
1369
  }
1224
- lowerer.unsupported("SC1090", expr, `method calls like '${expr.expression.getText()}'`);
1370
+ lowerer.unsupported("SC1090", expr, `method calls like '${ts.getTextOfNode(expr.expression)}'`);
1371
+ }
1372
+ // `s[Symbol.iterator]()` on a string: the string iterator as a value.
1373
+ if (ts.isElementAccessExpression(expr.expression) &&
1374
+ !expr.expression.questionDotToken &&
1375
+ !expr.questionDotToken &&
1376
+ expr.arguments.nodes.length === 0) {
1377
+ const iterator = lowerStringIteratorCall(lowerer, expr, expr.expression);
1378
+ if (iterator)
1379
+ return iterator;
1225
1380
  }
1226
1381
  // The element spelling of an unsupported native Web method must fence
1227
1382
  // before lowering the callee into a checked-dynamic keyed read.
1228
1383
  if (ts.isElementAccessExpression(expr.expression)) {
1384
+ const timersDispose = lowerMockTimersElementCall(lowerer, expr, expr.expression);
1385
+ if (timersDispose)
1386
+ return timersDispose;
1229
1387
  const symbolMethod = lowerClassSymbolMethodCall(lowerer, expr);
1230
1388
  if (symbolMethod)
1231
1389
  return symbolMethod;
1390
+ const readlineDispose = lowerReadlineDisposeCall(lowerer, expr);
1391
+ if (readlineDispose)
1392
+ return readlineDispose;
1232
1393
  lowerer.fenceUnsupportedFetchConstructorMember(expr.expression);
1233
1394
  lowerer.fenceStaticResponseMember(expr.expression, "call");
1234
1395
  lowerer.fenceStaticHeadersMember(expr.expression, "call");
@@ -1242,7 +1403,7 @@ export function lowerCall(lowerer, expr) {
1242
1403
  !symbolFieldInfo(lowerer, expr.expression)) {
1243
1404
  const access = expr.expression;
1244
1405
  const value = tryLowerExpression(lowerer, access.expression);
1245
- if (value?.type.kind === "array" && !isJsSourceFile(expr.getSourceFile())) {
1406
+ if (value?.type.kind === "array" && !isJsSourceFile(ts.getSourceFileOfNode(expr))) {
1246
1407
  const callback = lowerArrayCallbackCall(lowerer, expr, access, value);
1247
1408
  if (callback)
1248
1409
  return callback;
@@ -1262,7 +1423,7 @@ export function lowerCall(lowerer, expr) {
1262
1423
  const raw = lowerer.lowerExpr(access.argumentExpression);
1263
1424
  const key = raw.type.kind === "string" ? raw : lowerer.coerceInto(access.argumentExpression, raw, DYN);
1264
1425
  const callee = { kind: "dynKeyGet", value: receiver, key, type: DYN, loc };
1265
- const spread = expr.arguments.some(ts.isSpreadElement)
1426
+ const spread = expr.arguments.nodes.some(ts.isSpreadElement)
1266
1427
  ? lowerSpreadArgsCall(lowerer, expr, callee, loc)
1267
1428
  : null;
1268
1429
  if (spread && spread.kind !== "dynCall")
@@ -1273,8 +1434,8 @@ export function lowerCall(lowerer, expr) {
1273
1434
  kind: "dynCall",
1274
1435
  callee,
1275
1436
  receiver,
1276
- calleeName: access.getText(),
1277
- args: expr.arguments.map((arg) => lowerer.lowerExprExpecting(arg, DYN)),
1437
+ calleeName: ts.getTextOfNode(access),
1438
+ args: expr.arguments.nodes.map((arg) => lowerer.lowerExprExpecting(arg, DYN)),
1278
1439
  type: DYN,
1279
1440
  loc,
1280
1441
  };
@@ -1315,7 +1476,7 @@ export function lowerCall(lowerer, expr) {
1315
1476
  else
1316
1477
  lowerer.noteEdge(`%${found.declarer.def.name}.${memberName}`);
1317
1478
  const receiver = lowerer.lowerExpr(expr.expression.expression);
1318
- const args = lowerer.completeArgs(expr.arguments, found.sig.params, locOf(expr), expr);
1479
+ const args = lowerer.completeArgs(expr.arguments.nodes, found.sig.params, locOf(expr), expr);
1319
1480
  const callArgs = [
1320
1481
  lowerer.upcastTo(receiver, virtual ? info.def.name : found.declarer.def.name),
1321
1482
  ...args,
@@ -1366,7 +1527,7 @@ export function lowerCall(lowerer, expr) {
1366
1527
  // function" TypeError. The result is dyn (checked per use like every
1367
1528
  // any-origin value). Spread arguments keep their fence.
1368
1529
  if (callee.type.kind === "dyn") {
1369
- if (expr.arguments.some((a) => ts.isSpreadElement(a))) {
1530
+ if (expr.arguments.nodes.some((a) => ts.isSpreadElement(a))) {
1370
1531
  // The runtime-arity lane: a dyn callee is already boxed — the
1371
1532
  // spread-marked dynCall applies through a fresh dyn argument
1372
1533
  // array (lowerSpreadArgsCall). Sources outside it keep the fence.
@@ -1375,10 +1536,10 @@ export function lowerCall(lowerer, expr) {
1375
1536
  return spreadServed;
1376
1537
  lowerer.unsupported("SC1090", expr, "spread arguments in calls through 'unknown' values");
1377
1538
  }
1378
- const args = expr.arguments.map((a) => lowerer.lowerExprExpecting(a, DYN));
1539
+ const args = expr.arguments.nodes.map((a) => lowerer.lowerExprExpecting(a, DYN));
1379
1540
  const calleeName = ts.isPropertyAccessExpression(expr.expression) ||
1380
1541
  ts.isElementAccessExpression(expr.expression)
1381
- ? expr.expression.getText()
1542
+ ? ts.getTextOfNode(expr.expression)
1382
1543
  : ts.isIdentifier(expr.expression)
1383
1544
  ? expr.expression.text
1384
1545
  : "value";
@@ -1390,8 +1551,8 @@ export function lowerCall(lowerer, expr) {
1390
1551
  return {
1391
1552
  kind: "dynCall",
1392
1553
  callee: lowerer.coerceToExpected(callee, DYN),
1393
- calleeName: expr.expression.getText(),
1394
- args: expr.arguments.map((arg) => lowerer.lowerExprExpecting(arg, DYN)),
1554
+ calleeName: v8CalleeText(expr.expression),
1555
+ args: expr.arguments.nodes.map((arg) => lowerer.lowerExprExpecting(arg, DYN)),
1395
1556
  type: DYN,
1396
1557
  loc,
1397
1558
  };
@@ -1412,7 +1573,16 @@ export function lowerCall(lowerer, expr) {
1412
1573
  // or marshals the callee and applies through a runtime-built argument
1413
1574
  // list (lowerSpreadArgsCall). Shapes outside its lanes fall through
1414
1575
  // to the historical fences.
1415
- if (expr.arguments.some((a) => ts.isSpreadElement(a))) {
1576
+ // Forwarded fixed tuples (`fn(...args)` over a tuple rest parameter or a
1577
+ // typed `arguments`) have a compile-time arity: complete them into the
1578
+ // callee's positional slots directly, without the runtime-arity lane.
1579
+ if (callee.type.rest !== true &&
1580
+ expr.arguments.nodes.some(ts.isSpreadElement) &&
1581
+ expr.arguments.nodes.every((a) => !ts.isSpreadElement(a) || isForwardedTupleSpread(lowerer, a.expression))) {
1582
+ const args = completeFuncValueArgs(lowerer, expr, callee.type, loc);
1583
+ return { kind: "callValue", callee, args, type: callee.type.ret, loc };
1584
+ }
1585
+ if (expr.arguments.nodes.some((a) => ts.isSpreadElement(a))) {
1416
1586
  const spreadServed = lowerSpreadArgsCall(lowerer, expr, callee, loc);
1417
1587
  if (spreadServed)
1418
1588
  return spreadServed;
@@ -1423,12 +1593,12 @@ export function lowerCall(lowerer, expr) {
1423
1593
  // checked-dynamic boundary — box the callee, dynCall — which delivers
1424
1594
  // JS arity exactly (the thunk ignores extras). Result dyn, checked
1425
1595
  // per use like every any-origin value.
1426
- if ((expr.arguments.length > callee.type.params.length || callee.type.rest === true) &&
1427
- (isJsSourceFile(expr.getSourceFile()) ||
1596
+ if ((expr.arguments.nodes.length > callee.type.params.length || callee.type.rest === true) &&
1597
+ (isJsSourceFile(ts.getSourceFileOfNode(expr)) ||
1428
1598
  (callee.type.rest === true && callee.type.restAbi === undefined)) &&
1429
- !expr.arguments.some((a) => ts.isSpreadElement(a)) &&
1599
+ !expr.arguments.nodes.some((a) => ts.isSpreadElement(a)) &&
1430
1600
  canBoxFuncIntoDyn(callee.type, (id) => lowerer.shapes.get(id), (id) => lowerer.unions.get(id))) {
1431
- const args = expr.arguments.map((a) => lowerer.lowerExprExpecting(a, DYN));
1601
+ const args = expr.arguments.nodes.map((a) => lowerer.lowerExprExpecting(a, DYN));
1432
1602
  const calleeName = ts.isIdentifier(expr.expression) ? expr.expression.text : "value";
1433
1603
  const boxed = { kind: "dynFrom", value: callee, type: DYN, loc };
1434
1604
  return { kind: "dynCall", callee: boxed, calleeName, args, type: DYN, loc };
@@ -1443,12 +1613,13 @@ function lowerCheckedCallableValue(lowerer, call, value, loc) {
1443
1613
  if (callee.type.kind !== "dyn") {
1444
1614
  if (callee.type.kind !== "func" ||
1445
1615
  !((callee.type.rest === true && callee.type.restAbi === undefined) ||
1446
- (isJsSourceFile(call.getSourceFile()) && call.arguments.length > callee.type.params.length)) ||
1616
+ (isJsSourceFile(ts.getSourceFileOfNode(call)) &&
1617
+ call.arguments.nodes.length > callee.type.params.length)) ||
1447
1618
  !lowerer.dynConvertible(callee.type))
1448
1619
  return null;
1449
1620
  callee = { kind: "dynFrom", value: callee, type: DYN, loc };
1450
1621
  }
1451
- if (call.arguments.some(ts.isSpreadElement)) {
1622
+ if (call.arguments.nodes.some(ts.isSpreadElement)) {
1452
1623
  const spread = lowerSpreadArgsCall(lowerer, call, callee, loc);
1453
1624
  if (spread)
1454
1625
  return spread;
@@ -1457,8 +1628,8 @@ function lowerCheckedCallableValue(lowerer, call, value, loc) {
1457
1628
  return {
1458
1629
  kind: "dynCall",
1459
1630
  callee,
1460
- calleeName: call.expression.getText(),
1461
- args: call.arguments.map((arg) => lowerer.lowerExprExpecting(arg, DYN)),
1631
+ calleeName: v8CalleeText(call.expression),
1632
+ args: call.arguments.nodes.map((arg) => lowerer.lowerExprExpecting(arg, DYN)),
1462
1633
  type: DYN,
1463
1634
  loc,
1464
1635
  };
@@ -1467,19 +1638,19 @@ function lowerRegexMethodCallWithOptionalArg(lowerer, call, access) {
1467
1638
  const lowered = lowerer.lowerRegexMethodCall(call, access);
1468
1639
  if (lowered?.kind !== "regexIntrinsic" ||
1469
1640
  lowered.method !== "test" ||
1470
- call.arguments.length !== 1)
1641
+ call.arguments.nodes.length !== 1)
1471
1642
  return lowered;
1472
1643
  const subject = lowered.args[0];
1473
1644
  if (subject?.type.kind !== "union" || lowerer.armTag(subject.type.unionId, UNDEFINED_T) < 0)
1474
1645
  return lowered;
1475
- if (lowerer.mapTypeOf(lowerer.typeOf(call.arguments[0]))?.kind !== "string")
1646
+ if (lowerer.mapTypeOf(lowerer.typeOf(call.arguments.nodes[0]))?.kind !== "string")
1476
1647
  return lowered;
1477
1648
  const present = lowerer.stripUndefinedArm(subject.type);
1478
1649
  if (present.kind !== "string")
1479
1650
  return lowered;
1480
1651
  return {
1481
1652
  ...lowered,
1482
- args: [lowerer.ensureString(subject, call.arguments[0])],
1653
+ args: [lowerer.ensureString(subject, call.arguments.nodes[0])],
1483
1654
  };
1484
1655
  }
1485
1656
  function optionalCallValue(lowerer, node) {
@@ -1496,17 +1667,17 @@ function lowerBufferStaticCallWithNarrowedArg(lowerer, call, access) {
1496
1667
  // A callback can store a wider union than the checker sees at this use
1497
1668
  // (including an added undefined arm). Extract the exact arm proven by
1498
1669
  // control-flow narrowing, not merely the union with undefined removed.
1499
- const narrowed = lowerer.mapTypeOf(lowerer.typeOf(call.arguments[0]));
1670
+ const narrowed = lowerer.mapTypeOf(lowerer.typeOf(call.arguments.nodes[0]));
1500
1671
  if (!narrowed ||
1501
1672
  !(narrowed.kind === "f64" ||
1502
1673
  (narrowed.kind === "array" && narrowed.elem.kind === "f64") ||
1503
1674
  (narrowed.kind === "bytes" && narrowed.elem === "u8")) ||
1504
1675
  lowerer.armTag(lowered.source.type.unionId, narrowed) < 0) {
1505
- lowerer.unsupported("SC1090", call.arguments[0], "a Buffer constructor argument whose narrowed type is not a stored source arm");
1676
+ lowerer.unsupported("SC1090", call.arguments.nodes[0], "a Buffer constructor argument whose narrowed type is not a stored source arm");
1506
1677
  }
1507
1678
  const helper = lowerer.narrowedArmHelper(lowered.source.type.unionId, narrowed, lowered.source.loc);
1508
1679
  if (!helper) {
1509
- lowerer.unsupported("SC1090", call.arguments[0], "a Buffer constructor argument whose narrowed type is not a stored source arm");
1680
+ lowerer.unsupported("SC1090", call.arguments.nodes[0], "a Buffer constructor argument whose narrowed type is not a stored source arm");
1510
1681
  }
1511
1682
  const narrowedValue = {
1512
1683
  ...lowered,
@@ -1567,7 +1738,7 @@ function lowerOptionalNumberDefault(lowerer, value, dflt, loc) {
1567
1738
  }
1568
1739
  return { kind: "call", callee: helper, args: [value], type: F64, loc };
1569
1740
  }
1570
- function lowerStringMethodCallWithOptionalArgs(lowerer, call, access, receiver, argumentNodes = call.arguments) {
1741
+ function lowerStringMethodCallWithOptionalArgs(lowerer, call, access, receiver, argumentNodes = call.arguments.nodes) {
1571
1742
  const lowered = lowerStringMethodCall(lowerer, call, access, receiver, argumentNodes);
1572
1743
  if (lowered?.kind !== "strIntrinsic")
1573
1744
  return lowered;
@@ -1664,6 +1835,10 @@ function lowerNumberConstructorValue(lowerer, argNode, loc) {
1664
1835
  const optionalNumber = lowerOptionalStringNumber(lowerer, arg, loc);
1665
1836
  if (optionalNumber)
1666
1837
  return optionalNumber;
1838
+ // A program class instance converts through its own methods.
1839
+ const classNumber = classToNumberConversion(lowerer, arg, argNode);
1840
+ if (classNumber)
1841
+ return classNumber;
1667
1842
  const scalarUnionNumber = lowerScalarUnionNumber(lowerer, arg, argNode, loc);
1668
1843
  if (scalarUnionNumber)
1669
1844
  return scalarUnionNumber;
@@ -1769,7 +1944,7 @@ function immediatePrimitiveWrapperToString(lowerer, node) {
1769
1944
  if ((name !== "Boolean" && name !== "Number") ||
1770
1945
  !lowerer.isStdlibSymbol(lowerer.resolveValueSymbol(wrapped.expression) ?? undefined))
1771
1946
  return null;
1772
- const args = wrapped.arguments ?? [];
1947
+ const args = wrapped.arguments?.nodes ?? [];
1773
1948
  if (args.length > 1 || args.some(ts.isSpreadElement))
1774
1949
  return null;
1775
1950
  const loc = locOf(wrapped);
@@ -1836,7 +2011,7 @@ function immediateObjectTagReceiver(lowerer, node) {
1836
2011
  if ((ts.isCallExpression(value) || ts.isNewExpression(value)) &&
1837
2012
  ts.isIdentifier(value.expression) &&
1838
2013
  (value.expression.text === "Array" || value.expression.text === "Error") &&
1839
- (value.arguments?.length ?? 0) === 0 &&
2014
+ (value.arguments?.nodes.length ?? 0) === 0 &&
1840
2015
  lowerer.isStdlibSymbol(lowerer.resolveValueSymbol(value.expression) ?? undefined)) {
1841
2016
  return { tag: value.expression.text, effect: { kind: "numLit", value: 0, type: F64, loc } };
1842
2017
  }
@@ -1844,7 +2019,7 @@ function immediateObjectTagReceiver(lowerer, node) {
1844
2019
  ts.isIdentifier(value.expression) &&
1845
2020
  lowerer.isStdlibSymbol(lowerer.resolveValueSymbol(value.expression) ?? undefined)) {
1846
2021
  const name = value.expression.text;
1847
- const args = value.arguments ?? [];
2022
+ const args = value.arguments?.nodes ?? [];
1848
2023
  // JavaScript dates use checked native handles, so their IR type alone
1849
2024
  // cannot recover the tag through an immediate Object(...) wrapper.
1850
2025
  if (name === "Date")
@@ -1875,7 +2050,7 @@ function immediateObjectTagReceiver(lowerer, node) {
1875
2050
  ts.isIdentifier(value.expression) &&
1876
2051
  value.expression.text === "Object" &&
1877
2052
  lowerer.isStdlibSymbol(lowerer.resolveValueSymbol(value.expression) ?? undefined)) {
1878
- const args = value.arguments ?? [];
2053
+ const args = value.arguments?.nodes ?? [];
1879
2054
  if (args.some(ts.isSpreadElement))
1880
2055
  return null;
1881
2056
  const first = args[0];
@@ -1930,12 +2105,12 @@ const ARRAY_BORROW_METHODS = new Set([
1930
2105
  "some",
1931
2106
  ]);
1932
2107
  function lowerArrayPrototypeBorrowCall(lowerer, call, access) {
1933
- if (!isJsSourceFile(call.getSourceFile()) ||
2108
+ if (!isJsSourceFile(ts.getSourceFileOfNode(call)) ||
1934
2109
  call.questionDotToken ||
1935
2110
  access.questionDotToken ||
1936
2111
  access.name.text !== "call" ||
1937
2112
  !ts.isPropertyAccessExpression(access.expression) ||
1938
- call.arguments.some(ts.isSpreadElement))
2113
+ call.arguments.nodes.some(ts.isSpreadElement))
1939
2114
  return null;
1940
2115
  const method = access.expression;
1941
2116
  if (method.questionDotToken ||
@@ -1947,10 +2122,10 @@ function lowerArrayPrototypeBorrowCall(lowerer, call, access) {
1947
2122
  !lowerer.isStdlibMember(method))
1948
2123
  return null;
1949
2124
  const loc = locOf(call);
1950
- const receiver = call.arguments[0]
1951
- ? lowerer.lowerExprExpecting(call.arguments[0], DYN)
2125
+ const receiver = call.arguments.nodes[0]
2126
+ ? lowerer.lowerExprExpecting(call.arguments.nodes[0], DYN)
1952
2127
  : dynUndefinedExpr(loc);
1953
- const args = call.arguments.slice(1).map((arg) => lowerer.lowerExprExpecting(arg, DYN));
2128
+ const args = call.arguments.nodes.slice(1).map((arg) => lowerer.lowerExprExpecting(arg, DYN));
1954
2129
  return {
1955
2130
  kind: "libCall",
1956
2131
  fn: "dyn.arrayProtoCall",
@@ -1975,23 +2150,23 @@ function lowerObjectOwnPrototypeCall(lowerer, call, access) {
1975
2150
  prototype.name.text !== "prototype" ||
1976
2151
  !lowerer.isStdlibGlobal(prototype.expression, "Object") ||
1977
2152
  !lowerer.isStdlibMember(method) ||
1978
- call.arguments.some(ts.isSpreadElement))
2153
+ call.arguments.nodes.some(ts.isSpreadElement))
1979
2154
  return null;
1980
- return lowerObjectOwnCall(lowerer, call, call.arguments[0], call.arguments[1], call.arguments.slice(2), method.name.text);
2155
+ return lowerObjectOwnCall(lowerer, call, call.arguments.nodes[0], call.arguments.nodes[1], call.arguments.nodes.slice(2), method.name.text);
1981
2156
  }
1982
2157
  function lowerObjectOwnMethodCall(lowerer, call, access) {
1983
2158
  const method = access.name.text;
1984
2159
  if (call.questionDotToken ||
1985
2160
  access.questionDotToken ||
1986
2161
  (method !== "hasOwnProperty" && method !== "propertyIsEnumerable") ||
1987
- call.arguments.some(ts.isSpreadElement))
2162
+ call.arguments.nodes.some(ts.isSpreadElement))
1988
2163
  return null;
1989
2164
  if (!lowerer.isStdlibMember(access)) {
1990
2165
  const receiver = tryLowerExpression(lowerer, access.expression);
1991
2166
  if (receiver?.type.kind !== "dyn")
1992
2167
  return null;
1993
2168
  }
1994
- return lowerObjectOwnCall(lowerer, call, access.expression, call.arguments[0], call.arguments.slice(1), method);
2169
+ return lowerObjectOwnCall(lowerer, call, access.expression, call.arguments.nodes[0], call.arguments.nodes.slice(1), method, access);
1995
2170
  }
1996
2171
  /** ToPropertyKey for the scalar keys represented by native own-key
1997
2172
  * probes. A lowered array-loop key may carry an undefined arm even when
@@ -2017,7 +2192,10 @@ function ownPropertyKey(lowerer, key) {
2017
2192
  }
2018
2193
  return null;
2019
2194
  }
2020
- function lowerObjectOwnCall(lowerer, call, receiverNode, keyNode, extraNodes, method) {
2195
+ function lowerObjectOwnCall(lowerer, call, receiverNode, keyNode, extraNodes, method,
2196
+ // The `receiver.method` access of a method call (null for the
2197
+ // Object.prototype.method.call form).
2198
+ methodAccess = null) {
2021
2199
  const enumerable = method === "propertyIsEnumerable";
2022
2200
  const loc = locOf(call);
2023
2201
  const stmts = [];
@@ -2089,6 +2267,8 @@ function lowerObjectOwnCall(lowerer, call, receiverNode, keyNode, extraNodes, me
2089
2267
  if (!shape || shape.tuple || shapeHasAccessorSlots(shape)) {
2090
2268
  lowerer.noLowering("Object.prototype." + method + " over this record shape", receiverNode ?? call);
2091
2269
  }
2270
+ // A null-prototype record (Object.groupBy) has no such method: Node
2271
+ // throws after evaluating the arguments.
2092
2272
  result = {
2093
2273
  kind: "call",
2094
2274
  callee: recordHasOwnHelper(lowerer, type.shapeId, loc),
@@ -2096,6 +2276,9 @@ function lowerObjectOwnCall(lowerer, call, receiverNode, keyNode, extraNodes, me
2096
2276
  type: BOOL,
2097
2277
  loc,
2098
2278
  };
2279
+ if (methodAccess && nullProtoRecordShape(lowerer, type)) {
2280
+ result = guardNullProto(receiverRef, type.shapeId, `${ts.getTextOfNode(methodAccess)} is not a function`, result, loc);
2281
+ }
2099
2282
  }
2100
2283
  else if (type.kind === "dyn") {
2101
2284
  result = {
@@ -2209,16 +2392,17 @@ function lowerObjectPrototypeCall(lowerer, call, access) {
2209
2392
  prototype.name.text !== "prototype" ||
2210
2393
  !lowerer.isStdlibGlobal(prototype.expression, "Object") ||
2211
2394
  !lowerer.isStdlibMember(method) ||
2212
- call.arguments.some(ts.isSpreadElement))
2395
+ call.arguments.nodes.some(ts.isSpreadElement))
2213
2396
  return null;
2214
2397
  const loc = locOf(call);
2215
- if (call.arguments.length === 0)
2398
+ if (call.arguments.nodes.length === 0)
2216
2399
  return { kind: "strLit", value: "[object Undefined]", type: STRING, loc };
2217
- const receiverNode = call.arguments[0];
2400
+ const receiverNode = call.arguments.nodes[0];
2218
2401
  const immediate = immediateObjectTagReceiver(lowerer, receiverNode);
2219
2402
  const receiver = immediate?.effect ?? lowerer.lowerExpr(receiverNode);
2220
2403
  const tag = immediate?.tag ?? objectToStringTag(lowerer, receiver.type);
2221
- if (tag === null && receiver.type.kind !== "dyn") {
2404
+ // A generator object answers its tag through its checked capsule.
2405
+ if (tag === null && receiver.type.kind !== "dyn" && receiver.type.kind !== "generator") {
2222
2406
  lowerer.noLowering("Object.prototype.toString.call over a " + lowerer.fmt(receiver.type) + " receiver", receiverNode);
2223
2407
  }
2224
2408
  const stmts = [];
@@ -2232,11 +2416,17 @@ function lowerObjectPrototypeCall(lowerer, call, access) {
2232
2416
  stmts.push({ kind: "varDecl", localId: local.id, init: receiver, loc });
2233
2417
  ref = varRef(local.id, receiver.type, loc);
2234
2418
  }
2235
- for (const extra of call.arguments.slice(1)) {
2419
+ for (const extra of call.arguments.nodes.slice(1)) {
2236
2420
  stmts.push({ kind: "exprStmt", expr: lowerer.lowerExpr(extra), loc: locOf(extra) });
2237
2421
  }
2238
2422
  const result = tag === null
2239
- ? { kind: "libCall", fn: "dyn.objectTag", args: [ref], type: STRING, loc }
2423
+ ? {
2424
+ kind: "libCall",
2425
+ fn: "dyn.objectTag",
2426
+ args: [ref.type.kind === "generator" ? lowerer.coerceToExpected(ref, DYN) : ref],
2427
+ type: STRING,
2428
+ loc,
2429
+ }
2240
2430
  : { kind: "strLit", value: "[object " + tag + "]", type: STRING, loc };
2241
2431
  return { kind: "seqExpr", stmts, result, type: STRING, loc };
2242
2432
  }
@@ -2258,7 +2448,7 @@ function lowerDynamicStringPrototypeCall(lowerer, call, methodAccess, receiver,
2258
2448
  };
2259
2449
  const overrides = [];
2260
2450
  try {
2261
- for (const node of call.arguments.slice(1)) {
2451
+ for (const node of call.arguments.nodes.slice(1)) {
2262
2452
  const undefinedValue = lowerStaticallyUndefinedArgument(lowerer, node);
2263
2453
  const value = undefinedValue ?? lowerer.lowerExpr(node);
2264
2454
  let ref;
@@ -2280,7 +2470,7 @@ function lowerDynamicStringPrototypeCall(lowerer, call, methodAccess, receiver,
2280
2470
  overrides.push({ node, previous: lowerer.chainRecvByNode.get(node) });
2281
2471
  lowerer.chainRecvByNode.set(node, ref);
2282
2472
  }
2283
- const result = lowerStringMethodCallWithOptionalArgs(lowerer, call, methodAccess, () => converted, call.arguments.slice(1));
2473
+ const result = lowerStringMethodCallWithOptionalArgs(lowerer, call, methodAccess, () => converted, call.arguments.nodes.slice(1));
2284
2474
  return result ? { kind: "seqExpr", stmts, result, type: result.type, loc } : null;
2285
2475
  }
2286
2476
  finally {
@@ -2305,7 +2495,7 @@ function lowerStringPrototypeCall(lowerer, call, access) {
2305
2495
  !STRING_INDEX_METHODS.has(methodAccess.name.text)) ||
2306
2496
  !lowerer.isStdlibMember(methodAccess))
2307
2497
  return null;
2308
- if (call.arguments.some(ts.isSpreadElement))
2498
+ if (call.arguments.nodes.some(ts.isSpreadElement))
2309
2499
  return null;
2310
2500
  const entry = STR_METHODS[methodAccess.name.text];
2311
2501
  const indexMethod = STRING_INDEX_METHODS.has(methodAccess.name.text)
@@ -2323,12 +2513,12 @@ function lowerStringPrototypeCall(lowerer, call, access) {
2323
2513
  : methodAccess.name.text;
2324
2514
  const loc = locOf(call);
2325
2515
  const nullishError = nodeThrowExpr(1, "", `String.prototype.${method} called on null or undefined`, resultType, loc);
2326
- const receiverNode = call.arguments[0];
2516
+ const receiverNode = call.arguments.nodes[0];
2327
2517
  if (!receiverNode)
2328
2518
  return nullishError;
2329
2519
  // Receiver coercion runs after .call has evaluated its arguments; keep
2330
2520
  // contextual wrapper lowering on forms without later method arguments.
2331
- const immediateWrapper = entry?.maxArgs === 0 && call.arguments.length === 1
2521
+ const immediateWrapper = entry?.maxArgs === 0 && call.arguments.nodes.length === 1
2332
2522
  ? immediatePrimitiveWrapperToString(lowerer, receiverNode)
2333
2523
  : null;
2334
2524
  const receiverValue = immediateWrapper ?? lowerer.lowerExpr(receiverNode);
@@ -2341,7 +2531,10 @@ function lowerStringPrototypeCall(lowerer, call, access) {
2341
2531
  ?.arms.every((arm) => isUnitType(arm) || arm.kind === "void") ??
2342
2532
  false));
2343
2533
  if (nullish) {
2344
- const values = [receiverValue, ...call.arguments.slice(1).map((arg) => lowerer.lowerExpr(arg))];
2534
+ const values = [
2535
+ receiverValue,
2536
+ ...call.arguments.nodes.slice(1).map((arg) => lowerer.lowerExpr(arg)),
2537
+ ];
2345
2538
  return {
2346
2539
  kind: "seqExpr",
2347
2540
  stmts: values
@@ -2371,28 +2564,28 @@ function lowerStringPrototypeCall(lowerer, call, access) {
2371
2564
  // Other methods convert object receivers before lowering their arguments;
2372
2565
  // padding uses a helper that delays conversion until every argument is ready.
2373
2566
  const objectWithoutMethodArgs = entry?.maxArgs === 0 &&
2374
- call.arguments.length === 1 &&
2567
+ call.arguments.nodes.length === 1 &&
2375
2568
  (receiverType.kind === "record" ||
2376
2569
  receiverType.kind === "array" ||
2377
2570
  receiverType.kind === "object");
2378
2571
  if (padding && !scalar && lowerer.dynConvertible(receiverType)) {
2379
- return lowerStringPaddingCall(lowerer, call, entry.method, lowerer.coerceToExpected(receiverValue, DYN), receiverNode, call.arguments.slice(1));
2572
+ return lowerStringPaddingCall(lowerer, call, entry.method, lowerer.coerceToExpected(receiverValue, DYN), receiverNode, call.arguments.nodes.slice(1));
2380
2573
  }
2381
2574
  if (!scalar && !objectWithoutMethodArgs) {
2382
2575
  lowerer.noLowering(`String.prototype.${methodAccess.name.text}.call with ${lowerer.fmt(receiverType)} receivers`, call);
2383
2576
  }
2384
2577
  if (indexMethod)
2385
- return lowerStringIndexCall(lowerer, call, indexMethod, receiverValue, receiverNode, call.arguments.slice(1));
2578
+ return lowerStringIndexCall(lowerer, call, indexMethod, receiverValue, receiverNode, call.arguments.nodes.slice(1));
2386
2579
  if (!entry)
2387
2580
  return null;
2388
2581
  if (padding) {
2389
- return lowerStringPaddingCall(lowerer, call, entry.method, receiverValue, receiverNode, call.arguments.slice(1));
2582
+ return lowerStringPaddingCall(lowerer, call, entry.method, receiverValue, receiverNode, call.arguments.nodes.slice(1));
2390
2583
  }
2391
2584
  if (entry.method === "split") {
2392
- return lowerStringSplitCall(lowerer, call, receiverValue, receiverNode, call.arguments.slice(1));
2585
+ return lowerStringSplitCall(lowerer, call, receiverValue, receiverNode, call.arguments.nodes.slice(1));
2393
2586
  }
2394
2587
  const receiver = lowerer.ensureString(receiverValue, receiverNode);
2395
- return lowerStringMethodCallWithOptionalArgs(lowerer, call, methodAccess, () => receiver, call.arguments.slice(1));
2588
+ return lowerStringMethodCallWithOptionalArgs(lowerer, call, methodAccess, () => receiver, call.arguments.nodes.slice(1));
2396
2589
  }
2397
2590
  function lowerScalarUnionNumber(lowerer, arg, node, loc) {
2398
2591
  if (arg.type.kind !== "union" ||
@@ -2507,6 +2700,49 @@ function lowerOptionalStringNumber(lowerer, arg, loc, fn = "num.fromString", lab
2507
2700
  }
2508
2701
  return { kind: "call", callee: helper, args: [arg], type: F64, loc };
2509
2702
  }
2703
+ /** `s[Symbol.iterator]()` on a string-typed receiver: the generator over
2704
+ * its code points. Null for other element calls. */
2705
+ function lowerStringIteratorCall(lowerer, call, access) {
2706
+ let key = access.argumentExpression;
2707
+ while (ts.isParenthesizedExpression(key))
2708
+ key = key.expression;
2709
+ if (!ts.isPropertyAccessExpression(key) ||
2710
+ lowerer.stdlibGlobalMember(key, "Symbol") !== "iterator")
2711
+ return null;
2712
+ if (lowerer.mapTypeOf(lowerer.typeOf(access.expression))?.kind !== "string")
2713
+ return null;
2714
+ const type = lowerer.mapTypeOf(lowerer.typeOf(call));
2715
+ if (type?.kind !== "generator")
2716
+ return null;
2717
+ const receiver = lowerer.lowerExpr(access.expression);
2718
+ const value = lowerStringIteratorValue(lowerer, receiver, type, locOf(call));
2719
+ if (!value)
2720
+ lowerer.unsupported("SC1090", call, "this string iterator type");
2721
+ return value;
2722
+ }
2723
+ /** Iterator types with checked runtime receivers, whose helper calls lower
2724
+ * in lowerGeneratorHelperCall. */
2725
+ const CHECKED_ITERATOR_TYPES = new Set(["MapIterator", "SetIterator"]);
2726
+ const ITERATOR_HELPER_METHODS = new Set([
2727
+ "map",
2728
+ "filter",
2729
+ "take",
2730
+ "drop",
2731
+ "flatMap",
2732
+ "toArray",
2733
+ "forEach",
2734
+ "reduce",
2735
+ "some",
2736
+ "every",
2737
+ "find",
2738
+ ]);
2739
+ /** A call expression, through parentheses: its value has no other holder. */
2740
+ function isFreshCallResult(node) {
2741
+ let e = node;
2742
+ while (ts.isParenthesizedExpression(e))
2743
+ e = e.expression;
2744
+ return ts.isCallExpression(e);
2745
+ }
2510
2746
  /** METHOD calls on dyn receivers (`pkg.name.replace(...)`, `rawName.split`,
2511
2747
  * `ws.packages.filter(...)` — JSON.parse-derived values): validate the
2512
2748
  * receiver's dyn kind, extract, and ride the STATIC method machinery — the
@@ -2520,7 +2756,7 @@ function lowerOptionalStringNumber(lowerer, arg, loc, fn = "num.fromString", lab
2520
2756
  * the dyn array and validated-extracts the survivors into the element type
2521
2757
  * the checker committed the result to. Null when the receiver isn't a dyn
2522
2758
  * value or the method isn't claimable (the method-call fence stays). */
2523
- function lowerDynReceiverMethodCall(lowerer, call, access) {
2759
+ function lowerDynReceiverMethodCall(lowerer, call, access, boxTypedTemporary = false) {
2524
2760
  if (lowerer.chainBlocked(call, access))
2525
2761
  return null;
2526
2762
  if (stdlibGlobalNameOf(lowerer, access.expression) !== null) {
@@ -2538,7 +2774,12 @@ function lowerDynReceiverMethodCall(lowerer, call, access) {
2538
2774
  // array — scalar narrowings bridge through maybeNarrow's dynCheck and
2539
2775
  // take the ordinary typed paths, but there is no static home for an
2540
2776
  // any-elemented array). Typed receivers keep their own lowerings.
2541
- const recvTs = lowerer.typeOf(access.expression);
2777
+ // An optional step the chain already guarded (`s?.m(x)`) has a receiver
2778
+ // proven non-nullish.
2779
+ const rawRecvTs = lowerer.typeOf(access.expression);
2780
+ const recvTs = access.questionDotToken !== undefined && lowerer.chainHandled.has(access)
2781
+ ? lowerer.checker.getNonNullableType(rawRecvTs)
2782
+ : rawRecvTs;
2542
2783
  if (lowerer.classImplementedProtocol(recvTs)) {
2543
2784
  const property = lowerer.checker.getPropertyOfType(recvTs, access.name.text);
2544
2785
  if (property &&
@@ -2547,23 +2788,14 @@ function lowerDynReceiverMethodCall(lowerer, call, access) {
2547
2788
  }
2548
2789
  const recvSymbol = recvTs.getSymbol();
2549
2790
  if (recvSymbol &&
2550
- ["MapIterator", "SetIterator"].includes(recvSymbol.name) &&
2791
+ CHECKED_ITERATOR_TYPES.has(ts.symbolName(recvSymbol)) &&
2551
2792
  lowerer.isStdlibSymbol(recvSymbol) &&
2552
- [
2553
- "map",
2554
- "filter",
2555
- "take",
2556
- "drop",
2557
- "flatMap",
2558
- "toArray",
2559
- "forEach",
2560
- "reduce",
2561
- "some",
2562
- "every",
2563
- "find",
2564
- ].includes(access.name.text) &&
2793
+ ITERATOR_HELPER_METHODS.has(access.name.text) &&
2565
2794
  lowerer.isStdlibMember(access)) {
2566
- lowerer.noLowering(`collection iterator .${access.name.text}()`, call, "stored Map/Set iterators support .next() and iteration; iterator helper methods have no lowering");
2795
+ const helper = lowerGeneratorHelperCall(lowerer, call, access);
2796
+ if (helper)
2797
+ return helper;
2798
+ lowerer.noLowering(`collection iterator .${access.name.text}()`, call, "iterator helpers on Map/Set iterators are called directly on the iterator, without optional chaining");
2567
2799
  }
2568
2800
  const arrayReceiver = lowerer.checker.isArrayType(recvTs);
2569
2801
  const anyArray = arrayReceiver &&
@@ -2603,7 +2835,7 @@ function lowerDynReceiverMethodCall(lowerer, call, access) {
2603
2835
  type: DYN,
2604
2836
  loc,
2605
2837
  };
2606
- if (call.arguments.some(ts.isSpreadElement)) {
2838
+ if (call.arguments.nodes.some(ts.isSpreadElement)) {
2607
2839
  lowerer.unsupported("SC1090", call, "spread arguments in callable property calls");
2608
2840
  }
2609
2841
  return {
@@ -2613,8 +2845,8 @@ function lowerDynReceiverMethodCall(lowerer, call, access) {
2613
2845
  kind: "dynCall",
2614
2846
  callee: member,
2615
2847
  receiver,
2616
- calleeName: access.getText(),
2617
- args: call.arguments.map((arg) => lowerer.lowerExprExpecting(arg, DYN)),
2848
+ calleeName: ts.getTextOfNode(access),
2849
+ args: call.arguments.nodes.map((arg) => lowerer.lowerExprExpecting(arg, DYN)),
2618
2850
  type: DYN,
2619
2851
  loc,
2620
2852
  },
@@ -2627,8 +2859,14 @@ function lowerDynReceiverMethodCall(lowerer, call, access) {
2627
2859
  if (info)
2628
2860
  return lowerStaticMethodCall(lowerer, call, access);
2629
2861
  }
2862
+ // A possibly missing element of a class-typed array (`items[i]`) is
2863
+ // the receiver's class or undefined. The class method call checks for
2864
+ // undefined itself, as it does in TypeScript.
2865
+ const presentArm = probed?.type.kind === "union" ? lowerer.stripUndefinedArm(probed.type) : null;
2866
+ if (presentArm?.kind === "object" && typeEquals(presentArm, lowerer.mapTypeOf(recvTs) ?? DYN))
2867
+ return null;
2630
2868
  if (probed?.type.kind === "union" &&
2631
- isJsSourceFile(call.getSourceFile()) &&
2869
+ isJsSourceFile(ts.getSourceFileOfNode(call)) &&
2632
2870
  lowerer.unions
2633
2871
  .get(probed.type.unionId)
2634
2872
  ?.arms.every((arm) => isUnitType(arm) ||
@@ -2663,13 +2901,47 @@ function lowerDynReceiverMethodCall(lowerer, call, access) {
2663
2901
  return (lowerRegexMethodCall(lowerer, call, access, () => recv) ??
2664
2902
  lowerStringMethodCall(lowerer, call, access, () => recv));
2665
2903
  }
2904
+ // A checker-untyped JS binding holding `string | undefined` (string-
2905
+ // width's `const visibleSegment = baseVisible(segment)` after an
2906
+ // `=== undefined` guard the checker cannot see through): no typed
2907
+ // lowering claims the union, so a String method boxes it and takes the
2908
+ // dyn receiver path, whose undefined/null arms throw Node's read errors.
2909
+ if (checkerUntyped &&
2910
+ recv.type.kind === "union" &&
2911
+ isJsSourceFile(ts.getSourceFileOfNode(call)) &&
2912
+ isStringMethodName(access.name.text) &&
2913
+ lowerer.unions
2914
+ .get(recv.type.unionId)
2915
+ ?.arms.every((arm) => arm.kind === "string" || isUnitType(arm)) === true &&
2916
+ lowerer.dynConvertible(recv.type)) {
2917
+ recv = lowerer.coerceToExpected(recv, DYN);
2918
+ }
2919
+ // A native handle read through `as any` (`(hash as any).update(x)`)
2920
+ // dispatches through the handle, as the same value held in an
2921
+ // 'unknown' slot does.
2922
+ if (checkerUntyped && DYN_HANDLE_KINDS.has(recv.type.kind))
2923
+ recv = lowerer.coerceToExpected(recv, DYN);
2924
+ // The last-resort retry (boxTypedTemporary — every other lowering
2925
+ // already declined): a checker-`any` receiver whose value is a FRESH
2926
+ // typed result of an earlier step in the chain (`out.split("\n")`
2927
+ // extracted the string and answered a native string[]) has no typed
2928
+ // home under its `any` spelling, so it boxes into the checked-dynamic
2929
+ // tree and the call dispatches on the runtime kind — `.map`, `.pop`,
2930
+ // `.filter` on that array run JS-exact. Only call results qualify:
2931
+ // the box copies, and a temporary has no other holder to observe it.
2932
+ if (boxTypedTemporary &&
2933
+ checkerUntyped &&
2934
+ recv.type.kind !== "dyn" &&
2935
+ isFreshCallResult(access.expression) &&
2936
+ lowerer.dynConvertible(recv.type))
2937
+ recv = lowerer.coerceToExpected(recv, DYN);
2666
2938
  if (recv.type.kind !== "dyn")
2667
2939
  return null;
2668
2940
  if (access.name.text === "normalize" &&
2669
- call.arguments.length <= 1 &&
2670
- !call.arguments.some(ts.isSpreadElement)) {
2941
+ call.arguments.nodes.length <= 1 &&
2942
+ !call.arguments.nodes.some(ts.isSpreadElement)) {
2671
2943
  const loc = locOf(call);
2672
- const hasArgument = call.arguments.length === 1;
2944
+ const hasArgument = call.arguments.nodes.length === 1;
2673
2945
  const name = `%dyn.string.normalize:${hasArgument ? 1 : 0}`;
2674
2946
  if (!lowerer.liftedFns.some((fn) => fn.name === name)) {
2675
2947
  const value = varRef("receiver", DYN, loc);
@@ -2718,7 +2990,7 @@ function lowerDynReceiverMethodCall(lowerer, call, access) {
2718
2990
  kind: "dynInvoke",
2719
2991
  recv: value,
2720
2992
  method: "normalize",
2721
- calleeName: access.getText(),
2993
+ calleeName: ts.getTextOfNode(access),
2722
2994
  args: hasArgument ? [argument] : [],
2723
2995
  type: DYN,
2724
2996
  loc,
@@ -2733,8 +3005,8 @@ function lowerDynReceiverMethodCall(lowerer, call, access) {
2733
3005
  callee: name,
2734
3006
  args: [
2735
3007
  recv,
2736
- call.arguments[0]
2737
- ? lowerer.lowerExprExpecting(call.arguments[0], DYN)
3008
+ call.arguments.nodes[0]
3009
+ ? lowerer.lowerExprExpecting(call.arguments.nodes[0], DYN)
2738
3010
  : dynUndefinedExpr(loc),
2739
3011
  ],
2740
3012
  type: DYN,
@@ -2753,9 +3025,7 @@ function lowerDynReceiverMethodCall(lowerer, call, access) {
2753
3025
  // Those are not stored members of a checked-dynamic object, so
2754
3026
  // dynKeyGet cannot stand in for JavaScript's prototype lookup. Only
2755
3027
  // an authored declaration can justify the own-member path.
2756
- const authored = lowerer.checker
2757
- .declarationsOf(prop)
2758
- .some((decl) => !lowerer.isStdlibFile(decl.getSourceFile()));
3028
+ const authored = prop.declarations.some((decl) => !lowerer.isStdlibFile(ts.getSourceFileOfNode(decl)));
2759
3029
  return (authored &&
2760
3030
  lowerer.checker.getCallSignatures(lowerer.checker.getTypeOfSymbol(prop)).length > 0);
2761
3031
  })();
@@ -2779,22 +3049,53 @@ function lowerDynReceiverMethodCall(lowerer, call, access) {
2779
3049
  return (lowerRegexMethodCall(lowerer, call, access, checked) ??
2780
3050
  lowerStringMethodCall(lowerer, call, access, checked));
2781
3051
  }
3052
+ // String/Number methods the runtime dispatch has no answer for
3053
+ // (codePointAt, substr, toLocaleLowerCase, toPrecision, ...): a string
3054
+ // or number receiver runs the typed lowering, every other kind keeps the
3055
+ // runtime dispatch.
3056
+ if (!ownCallable &&
3057
+ !call.questionDotToken &&
3058
+ !access.questionDotToken &&
3059
+ isDynPrimitiveKindMethod(access.name.text) &&
3060
+ !lowerer.chainBlocked(access, call)) {
3061
+ const primitive = lowerDynPrimitiveMethodCall(lowerer, call, access.name.text, ts.getTextOfNode(access), recv);
3062
+ if (primitive)
3063
+ return primitive;
3064
+ }
2782
3065
  // The argument is a radix for bigint and an encoding for Buffer.
2783
3066
  // Preserve its runtime value so receiver dispatch can choose correctly.
2784
- if (access.name.text === "toString" && call.arguments.length <= 1) {
2785
- const argument = call.arguments[0];
3067
+ if (access.name.text === "toString" && call.arguments.nodes.length <= 1) {
3068
+ const argument = call.arguments.nodes[0];
2786
3069
  return {
2787
3070
  kind: "libCall",
2788
3071
  fn: "dyn.toString",
2789
3072
  args: [
2790
3073
  recv,
2791
3074
  argument ? lowerer.lowerExprExpecting(argument, DYN) : dynUndefinedExpr(locOf(call)),
2792
- { kind: "strLit", value: access.getText(), type: STRING, loc: locOf(call) },
3075
+ { kind: "strLit", value: ts.getTextOfNode(access), type: STRING, loc: locOf(call) },
2793
3076
  ],
2794
3077
  type: STRING,
2795
3078
  loc: locOf(call),
2796
3079
  };
2797
3080
  }
3081
+ // Every dyn kind's prototype chain declares valueOf, and the runtime
3082
+ // answers each kind's own: primitives and plain objects themselves, a
3083
+ // Date its time value, an own or inherited valueOf member its result.
3084
+ if (access.name.text === "valueOf" && call.arguments.nodes.length === 0) {
3085
+ const webAssembly = lowerWebAssemblyValueOf(lowerer, access.expression, recv, locOf(call));
3086
+ if (webAssembly !== null)
3087
+ return webAssembly;
3088
+ return {
3089
+ kind: "libCall",
3090
+ fn: "dyn.valueOf",
3091
+ args: [
3092
+ recv,
3093
+ { kind: "strLit", value: ts.getTextOfNode(access), type: STRING, loc: locOf(call) },
3094
+ ],
3095
+ type: DYN,
3096
+ loc: locOf(call),
3097
+ };
3098
+ }
2798
3099
  // SHARED prototype names with a runtime dispatch (scr_dyn_invoke):
2799
3100
  // push/slice/join/forEach/map/apply/... dispatch on the receiver's
2800
3101
  // RUNTIME kind — the honest answer for names more than one dyn-
@@ -2816,9 +3117,7 @@ function lowerDynReceiverMethodCall(lowerer, call, access) {
2816
3117
  lowerer.classes.get(arm.className)?.fields.has(access.name.text)))
2817
3118
  return true;
2818
3119
  return (prop !== undefined &&
2819
- lowerer.checker
2820
- .declarationsOf(prop)
2821
- .some((decl) => ts.isPropertyDeclaration(decl) || ts.isPropertySignature(decl)));
3120
+ prop.declarations.some((decl) => ts.isPropertyDeclaration(decl) || ts.isPropertySignature(decl)));
2822
3121
  })();
2823
3122
  // Protocol methods keep their static signature: instances of the
2824
3123
  // implementing classes call the native method.
@@ -2848,7 +3147,19 @@ function lowerDynReceiverMethodCall(lowerer, call, access) {
2848
3147
  // its name overlaps a primitive prototype (`colors.bold(...)`): the
2849
3148
  // source value was compiled from that object shape, while genuinely
2850
3149
  // untyped/any receivers retain the runtime-kind ambiguity and fence.
2851
- if (DYN_PROTO_METHOD_NAMES.has(access.name.text) && !ownCallable)
3150
+ // A name only String.prototype declares (`bold`, `italics`, `link`,
3151
+ // ...) on a checker-untyped receiver: every other dyn kind answers its
3152
+ // own or inherited member exactly like a non-prototype name (chalk's
3153
+ // `chalk.red.bold(...)` reads a prototype getter of a function), so
3154
+ // only a string receiver keeps the refusal, deferred to run time.
3155
+ // The same holds when only the MEMBER is checker-untyped: TypeScript
3156
+ // importing chalk's JavaScript source types the default export as a
3157
+ // plain function, so `chalk.bold` reads as `any` on a typed receiver.
3158
+ const stringOnlyName = (checkerUntyped ||
3159
+ (lowerer.typeOf(access).flags & (ts.TypeFlags.Any | ts.TypeFlags.Unknown)) !== 0) &&
3160
+ !ownCallable &&
3161
+ DYN_STRING_PROTO_ONLY_NAMES.has(access.name.text);
3162
+ if (DYN_PROTO_METHOD_NAMES.has(access.name.text) && !ownCallable && !stringOnlyName)
2852
3163
  return null;
2853
3164
  // Optional forms (`obj.cb?.()`, `obj?.cb()`) belong to the chain
2854
3165
  // machinery's short-circuit semantics — not modeled here yet.
@@ -2857,6 +3168,22 @@ function lowerDynReceiverMethodCall(lowerer, call, access) {
2857
3168
  const loc = locOf(call);
2858
3169
  const receiverLocal = lowerer.declareHiddenLocal("%dynCallReceiver", DYN);
2859
3170
  const receiver = { kind: "varRef", localId: receiverLocal.id, type: DYN, loc };
3171
+ // The string refusal throws in place of the member read (a seqExpr
3172
+ // statement cannot leave the expression).
3173
+ const stringRefusal = (read) => {
3174
+ if (!stringOnlyName)
3175
+ return read;
3176
+ const sf = ts.getSourceFileOfNode(call);
3177
+ const line = ts.getLineAndCharacterOfPosition(sf, ts.tokenStartOfNode(call)).line + 1;
3178
+ return {
3179
+ kind: "ternary",
3180
+ cond: { kind: "dynTest", test: "string", value: receiver, type: BOOL, loc },
3181
+ then: nodeThrowExpr(0, "SC1090", `method calls like '${ts.getTextOfNode(access)}' on a string are not supported yet [SC1090 at ${sf.fileName}:${line}]`, DYN, loc),
3182
+ else_: read,
3183
+ type: DYN,
3184
+ loc,
3185
+ };
3186
+ };
2860
3187
  const member = {
2861
3188
  kind: "dynKeyGet",
2862
3189
  key: { kind: "strLit", value: access.name.text, type: STRING, loc: locOf(access) },
@@ -2868,15 +3195,15 @@ function lowerDynReceiverMethodCall(lowerer, call, access) {
2868
3195
  const callee = varRef(calleeLocal.id, DYN, loc);
2869
3196
  const stmts = [
2870
3197
  { kind: "varDecl", localId: receiverLocal.id, init: recv, loc },
2871
- { kind: "varDecl", localId: calleeLocal.id, init: member, loc },
3198
+ { kind: "varDecl", localId: calleeLocal.id, init: stringRefusal(member), loc },
2872
3199
  ];
2873
- if (call.arguments.some(ts.isSpreadElement)) {
3200
+ if (call.arguments.nodes.some(ts.isSpreadElement)) {
2874
3201
  const spread = lowerSpreadArgsCall(lowerer, call, callee, loc);
2875
3202
  if (spread?.kind === "dynCall")
2876
3203
  return { kind: "seqExpr", stmts, result: { ...spread, receiver }, type: DYN, loc };
2877
3204
  lowerer.unsupported("SC1090", call, "spread arguments in calls through 'unknown' values");
2878
3205
  }
2879
- const args = call.arguments.map((a) => lowerer.lowerExprExpecting(a, DYN));
3206
+ const args = call.arguments.nodes.map((a) => lowerer.lowerExprExpecting(a, DYN));
2880
3207
  return {
2881
3208
  kind: "seqExpr",
2882
3209
  stmts,
@@ -2884,7 +3211,7 @@ function lowerDynReceiverMethodCall(lowerer, call, access) {
2884
3211
  kind: "dynCall",
2885
3212
  callee,
2886
3213
  receiver,
2887
- calleeName: access.getText(),
3214
+ calleeName: ts.getTextOfNode(access),
2888
3215
  args,
2889
3216
  type: DYN,
2890
3217
  loc,
@@ -2975,6 +3302,30 @@ const DYN_PROTO_METHOD_NAMES = new Set([
2975
3302
  "toFixed",
2976
3303
  "toPrecision",
2977
3304
  ]);
3305
+ /** The DYN_PROTO_METHOD_NAMES that only String.prototype declares among
3306
+ * the dyn-representable kinds' prototypes. */
3307
+ const DYN_STRING_PROTO_ONLY_NAMES = new Set([
3308
+ "anchor",
3309
+ "big",
3310
+ "blink",
3311
+ "bold",
3312
+ "codePointAt",
3313
+ "fixed",
3314
+ "fontcolor",
3315
+ "fontsize",
3316
+ "isWellFormed",
3317
+ "italics",
3318
+ "link",
3319
+ "localeCompare",
3320
+ "normalize",
3321
+ "small",
3322
+ "strike",
3323
+ "sub",
3324
+ "sup",
3325
+ "toLocaleLowerCase",
3326
+ "toLocaleUpperCase",
3327
+ "toWellFormed",
3328
+ ]);
2978
3329
  /** The SHARED prototype names scr_dyn_invoke dispatches at runtime (the
2979
3330
  * subset of DYN_PROTO_METHOD_NAMES with a receiver-kind dispatch): the
2980
3331
  * runtime runs the real method for the receiver's kind, throws Node's
@@ -3139,10 +3490,10 @@ const DYN_DISPATCH_METHODS = new Set([
3139
3490
  ]);
3140
3491
  export function lowerDynDispatchMethodCall(lowerer, call, access, recv, arrayReceiver) {
3141
3492
  const method = access.name.text;
3142
- if ((!DYN_DISPATCH_METHODS.has(method) && !isJsSourceFile(call.getSourceFile())) ||
3493
+ if ((!DYN_DISPATCH_METHODS.has(method) && !isJsSourceFile(ts.getSourceFileOfNode(call))) ||
3143
3494
  lowerer.chainBlocked(call, access))
3144
3495
  return null;
3145
- if (call.arguments.some((arg) => ts.isSpreadElement(arg))) {
3496
+ if (call.arguments.nodes.some((arg) => ts.isSpreadElement(arg))) {
3146
3497
  const loc = locOf(call);
3147
3498
  const local = lowerer.declareHiddenLocal("%spreadReceiver", DYN);
3148
3499
  const receiver = varRef(local.id, DYN, loc);
@@ -3171,9 +3522,11 @@ export function lowerDynDispatchMethodCall(lowerer, call, access, recv, arrayRec
3171
3522
  };
3172
3523
  lowerer.unsupported("SC1090", call, "spread arguments in calls through 'unknown' values");
3173
3524
  }
3174
- const predicate = method === "filter" && call.arguments[0] ? lowerer.lowerExpr(call.arguments[0]) : null;
3525
+ const predicate = method === "filter" && call.arguments.nodes[0]
3526
+ ? lowerer.lowerExpr(call.arguments.nodes[0])
3527
+ : null;
3175
3528
  if (arrayReceiver && predicate?.type.kind === "func" && predicate.type.ret.kind === "void") {
3176
- lowerer.unsupported("SC1090", call.arguments[0], "'.filter()' with a void-returning predicate (the callback return value is erased before its truthiness can be tested)");
3529
+ lowerer.unsupported("SC1090", call.arguments.nodes[0], "'.filter()' with a void-returning predicate (the callback return value is erased before its truthiness can be tested)");
3177
3530
  }
3178
3531
  // A dynamic argument array consumed immediately by the fixed-arity arrow
3179
3532
  // apply lowering below never exposes its surplus tail. Keep a pushed
@@ -3182,14 +3535,14 @@ export function lowerDynDispatchMethodCall(lowerer, call, access, recv, arrayRec
3182
3535
  // invented. If the slot falls inside the typed prefix, its dynCheck fails
3183
3536
  // at the callback boundary; valid callers preserve the original prefix.
3184
3537
  if (method === "push" &&
3185
- call.arguments.length === 1 &&
3538
+ call.arguments.nodes.length === 1 &&
3186
3539
  ts.isIdentifier(access.expression) &&
3187
3540
  ts.isExpressionStatement(call.parent) &&
3188
3541
  ts.isBlock(call.parent.parent)) {
3189
3542
  const receiverSymbol = lowerer.checker.getSymbolAtLocation(access.expression);
3190
3543
  const block = call.parent.parent;
3191
- const statementIndex = block.statements.indexOf(call.parent);
3192
- const next = statementIndex >= 0 ? block.statements[statementIndex + 1] : undefined;
3544
+ const statementIndex = block.statements.nodes.indexOf(call.parent);
3545
+ const next = statementIndex >= 0 ? block.statements.nodes[statementIndex + 1] : undefined;
3193
3546
  let returned = next && ts.isReturnStatement(next) ? next.expression : undefined;
3194
3547
  while (returned && ts.isParenthesizedExpression(returned))
3195
3548
  returned = returned.expression;
@@ -3199,7 +3552,7 @@ export function lowerDynDispatchMethodCall(lowerer, call, access, recv, arrayRec
3199
3552
  returned.expression.name.text === "apply"
3200
3553
  ? returned
3201
3554
  : null;
3202
- const argsNode = apply?.arguments[1];
3555
+ const argsNode = apply?.arguments?.nodes[1];
3203
3556
  const sameArgs = receiverSymbol !== undefined &&
3204
3557
  argsNode !== undefined &&
3205
3558
  ts.isIdentifier(argsNode) &&
@@ -3213,7 +3566,7 @@ export function lowerDynDispatchMethodCall(lowerer, call, access, recv, arrayRec
3213
3566
  arrow !== null &&
3214
3567
  targetParams !== null &&
3215
3568
  targetParams.every((param) => canDynCheckTo(param, (id) => lowerer.shapes.get(id), (id) => lowerer.unions.get(id)))) {
3216
- const value = lowerer.lowerExpr(call.arguments[0]);
3569
+ const value = lowerer.lowerExpr(call.arguments.nodes[0]);
3217
3570
  if (value.type.kind !== "dyn" && !lowerer.dynConvertible(value.type)) {
3218
3571
  const saved = lowerer.declareHiddenLocal("%applyTail", DYN);
3219
3572
  return {
@@ -3226,8 +3579,8 @@ export function lowerDynDispatchMethodCall(lowerer, call, access, recv, arrayRec
3226
3579
  kind: "dynInvoke",
3227
3580
  recv: { kind: "varRef", localId: saved.id, type: DYN, loc: locOf(access.expression) },
3228
3581
  method,
3229
- calleeName: access.getText(),
3230
- args: [dynUndefinedExpr(locOf(call.arguments[0]))],
3582
+ calleeName: ts.getTextOfNode(access),
3583
+ args: [dynUndefinedExpr(locOf(call.arguments.nodes[0]))],
3231
3584
  type: DYN,
3232
3585
  loc: locOf(call),
3233
3586
  },
@@ -3237,7 +3590,7 @@ export function lowerDynDispatchMethodCall(lowerer, call, access, recv, arrayRec
3237
3590
  }
3238
3591
  }
3239
3592
  }
3240
- const args = call.arguments.map((arg, i) => {
3593
+ const args = call.arguments.nodes.map((arg, i) => {
3241
3594
  if (i === 0 && predicate)
3242
3595
  return lowerer.coerceInto(arg, predicate, DYN);
3243
3596
  const undefinedArg = lowerStaticallyUndefinedArgument(lowerer, arg);
@@ -3249,12 +3602,22 @@ export function lowerDynDispatchMethodCall(lowerer, call, access, recv, arrayRec
3249
3602
  kind: "dynInvoke",
3250
3603
  recv,
3251
3604
  method,
3252
- calleeName: access.getText(),
3605
+ calleeName: ts.getTextOfNode(access),
3253
3606
  args,
3254
3607
  type: DYN,
3255
3608
  loc: locOf(call),
3256
3609
  };
3257
3610
  }
3611
+ /** Every String.prototype method name a typed or dyn string lowering
3612
+ * answers. */
3613
+ function isStringMethodName(name) {
3614
+ return (Object.hasOwn(STR_METHODS, name) ||
3615
+ STRING_INDEX_METHODS.has(name) ||
3616
+ DYN_STRING_ONLY_METHODS.has(name) ||
3617
+ isDynPrimitiveKindMethod(name) ||
3618
+ name === "normalize" ||
3619
+ name === "lastIndexOf");
3620
+ }
3258
3621
  /** STR_METHODS ∪ the regex-form names, MINUS everything Array (or any
3259
3622
  * other dyn kind's prototype) also declares. */
3260
3623
  const DYN_STRING_ONLY_METHODS = new Set([
@@ -3290,9 +3653,9 @@ function lowerArrayIsArrayCall(lowerer, call, access) {
3290
3653
  return null;
3291
3654
  if (lowerer.stdlibGlobalMember(access, "Array") !== "isArray")
3292
3655
  return null;
3293
- if (call.arguments.length !== 1)
3656
+ if (call.arguments.nodes.length !== 1)
3294
3657
  return null; // the stdlib chokepoint fences
3295
- const argNode = call.arguments[0];
3658
+ const argNode = call.arguments.nodes[0];
3296
3659
  const arg = lowerer.lowerExpr(argNode);
3297
3660
  const loc = locOf(call);
3298
3661
  if (arg.type.kind === "dyn") {
@@ -3364,22 +3727,26 @@ function lowerCaughtPredicateCall(lowerer, call, caughtLocal) {
3364
3727
  if (!ts.isIdentifier(callee))
3365
3728
  return null;
3366
3729
  const symbol = lowerer.resolveValueSymbol(callee);
3367
- const decl = symbol
3368
- ? lowerer.checker.declarationsOf(symbol).find(ts.isFunctionDeclaration)
3369
- : undefined;
3730
+ const decl = symbol ? symbol.declarations.find(ts.isFunctionDeclaration) : undefined;
3370
3731
  if (!symbol || !decl || !decl.body)
3371
3732
  return null;
3372
3733
  if (!decl.type || !ts.isTypePredicateNode(decl.type))
3373
3734
  return null;
3374
- if (decl.parameters.length !== 1)
3735
+ if (decl.parameters.nodes.length !== 1)
3375
3736
  return null;
3376
- const param = decl.parameters[0];
3737
+ const param = decl.parameters.nodes[0];
3377
3738
  if (!ts.isIdentifier(param.name) || param.initializer || param.dotDotDotToken)
3378
3739
  return null;
3379
3740
  const paramSymbol = lowerer.checker.getSymbolAtLocation(param.name);
3380
3741
  if (!paramSymbol)
3381
3742
  return null;
3382
- const ret = decl.body.statements.length === 1 ? decl.body.statements[0] : undefined;
3743
+ const ret = decl.body.statements.nodes.length === 1 ? decl.body.statements.nodes[0] : undefined;
3744
+ // A longer guard whose parameter is `unknown` (or `any`) takes the caught
3745
+ // value as an ordinary checked-dynamic argument: the call path converts
3746
+ // the binding, and the narrowed binding reads through the same value.
3747
+ if ((!ret || !ts.isReturnStatement(ret) || !ret.expression) &&
3748
+ lowerer.mapTypeOf(lowerer.checker.getTypeOfSymbol(paramSymbol))?.kind === "dyn")
3749
+ return null;
3383
3750
  if (!ret || !ts.isReturnStatement(ret) || !ret.expression) {
3384
3751
  lowerer.unsupported("SC1090", call, `the type-guard '${callee.text}' on a catch binding (only single-'return' guard bodies inline over the caught value)`);
3385
3752
  }
@@ -3409,8 +3776,8 @@ function lowerNumberToStringCall(lowerer, call, access) {
3409
3776
  if (lowerer.chainBlocked(call, access))
3410
3777
  return null;
3411
3778
  if (access.name.text !== "toString" ||
3412
- call.arguments.length > 1 ||
3413
- call.arguments.some(ts.isSpreadElement))
3779
+ call.arguments.nodes.length > 1 ||
3780
+ call.arguments.nodes.some(ts.isSpreadElement))
3414
3781
  return null;
3415
3782
  const recvKind = lowerer.mapTypeOf(lowerer.typeOf(access.expression))?.kind;
3416
3783
  if (recvKind !== "f64" && recvKind !== "bool" && recvKind !== "string")
@@ -3427,22 +3794,44 @@ function lowerNumberToStringCall(lowerer, call, access) {
3427
3794
  fn: "dyn.toString",
3428
3795
  args: [
3429
3796
  operand,
3430
- call.arguments[0]
3431
- ? lowerer.lowerExprExpecting(call.arguments[0], DYN)
3797
+ call.arguments.nodes[0]
3798
+ ? lowerer.lowerExprExpecting(call.arguments.nodes[0], DYN)
3432
3799
  : dynUndefinedExpr(locOf(call)),
3433
- { kind: "strLit", value: access.getText(), type: STRING, loc: locOf(call) },
3800
+ { kind: "strLit", value: ts.getTextOfNode(access), type: STRING, loc: locOf(call) },
3434
3801
  ],
3435
3802
  type: STRING,
3436
3803
  loc: locOf(call),
3437
3804
  };
3438
3805
  }
3439
- if (call.arguments.length === 1) {
3806
+ if (call.arguments.nodes.length === 1) {
3440
3807
  if (operand.type.kind !== "f64")
3441
3808
  return null;
3809
+ const arg = call.arguments.nodes[0];
3810
+ // A number radix needs no box: ToIntegerOrInfinity of a number is a
3811
+ // truncation, which the typed entry point applies itself.
3812
+ if (!ts.isSpreadElement(arg) && lowerer.mapTypeOf(lowerer.typeOf(arg))?.kind === "f64") {
3813
+ const radix = lowerer.lowerExpr(arg);
3814
+ if (radix.type.kind === "f64") {
3815
+ return {
3816
+ kind: "libCall",
3817
+ fn: "num.toStringRadixF64",
3818
+ args: [operand, radix],
3819
+ type: STRING,
3820
+ loc: locOf(call),
3821
+ };
3822
+ }
3823
+ return {
3824
+ kind: "libCall",
3825
+ fn: "num.toStringRadix",
3826
+ args: [operand, lowerer.coerceToExpected(radix, DYN)],
3827
+ type: STRING,
3828
+ loc: locOf(call),
3829
+ };
3830
+ }
3442
3831
  return {
3443
3832
  kind: "libCall",
3444
3833
  fn: "num.toStringRadix",
3445
- args: [operand, lowerer.lowerExprExpecting(call.arguments[0], DYN)],
3834
+ args: [operand, lowerer.lowerExprExpecting(arg, DYN)],
3446
3835
  type: STRING,
3447
3836
  loc: locOf(call),
3448
3837
  };
@@ -3464,7 +3853,7 @@ function lowerNumberToStringCall(lowerer, call, access) {
3464
3853
  function lowerUnionToStringCall(lowerer, call, access) {
3465
3854
  if (call.questionDotToken || access.questionDotToken)
3466
3855
  return null;
3467
- if (access.name.text !== "toString" || call.arguments.length !== 0)
3856
+ if (access.name.text !== "toString" || call.arguments.nodes.length !== 0)
3468
3857
  return null;
3469
3858
  const recvT = lowerer.mapTypeOf(lowerer.typeOf(access.expression));
3470
3859
  if (recvT?.kind !== "union")
@@ -3478,9 +3867,17 @@ function lowerUnionToStringCall(lowerer, call, access) {
3478
3867
  (a.kind === "bytes" && a.elem === "u8"));
3479
3868
  if (!stringable)
3480
3869
  return null;
3481
- const operand = lowerer.lowerExpr(access.expression);
3870
+ let operand = lowerer.lowerExpr(access.expression);
3482
3871
  if (operand.type.kind !== "union")
3483
3872
  return null;
3873
+ // A flow-narrowed read keeps its wider storage union (`string | number`
3874
+ // after `!Array.isArray(h.host)` over a `string | number | string[]`
3875
+ // slot): retag it to the proven union before the per-union helper.
3876
+ if (operand.type.unionId !== recvT.unionId) {
3877
+ operand = lowerer.coerceInto(access.expression, operand, recvT);
3878
+ if (operand.type.kind !== "union" || operand.type.unionId !== recvT.unionId)
3879
+ return null;
3880
+ }
3484
3881
  return { kind: "toString", operand, type: STRING, loc: locOf(call) };
3485
3882
  }
3486
3883
  /** `x.toString()` resolving to Object.prototype.toString (stdlib
@@ -3495,7 +3892,7 @@ function lowerUnionToStringCall(lowerer, call, access) {
3495
3892
  function lowerDefaultToStringCall(lowerer, call, access) {
3496
3893
  if (call.questionDotToken || access.questionDotToken)
3497
3894
  return null;
3498
- if (access.name.text !== "toString" || call.arguments.length !== 0)
3895
+ if (access.name.text !== "toString" || call.arguments.nodes.length !== 0)
3499
3896
  return null;
3500
3897
  if (!lowerer.isStdlibMember(access))
3501
3898
  return null;
@@ -3526,20 +3923,33 @@ function lowerDefaultToStringCall(lowerer, call, access) {
3526
3923
  // `(<A>{}).toString()` — assertion-wrapped literals and plain reads
3527
3924
  // have nothing to evaluate; pureObjectToStringReceiver widens
3528
3925
  // pureReceiverNode with the empty object literal.
3529
- if (pureObjectToStringReceiver(access.expression))
3926
+ // A null-prototype record (Object.groupBy) has no toString: Node
3927
+ // throws "<callee> is not a function".
3928
+ const nullProtoT = nullProtoRecordShape(lowerer, recvT);
3929
+ const missing = nullProtoT ? `${ts.getTextOfNode(access)} is not a function` : null;
3930
+ if (!missing && pureObjectToStringReceiver(access.expression))
3530
3931
  return constant;
3531
3932
  const recv = lowerer.lowerExpr(access.expression);
3532
- const key = `objToStr:${typeKey(recv.type)}`;
3933
+ const key = `objToStr:${typeKey(recv.type)}${missing ? `:${missing}` : ""}`;
3533
3934
  let helper = lowerer.valueHelpers.get(key);
3534
3935
  if (!helper) {
3535
3936
  helper = `%obj.tostr.${lowerer.valueHelpers.size}`;
3536
3937
  lowerer.valueHelpers.set(key, helper);
3938
+ const o = varRef("o.0", recv.type, loc);
3537
3939
  lowerer.liftedFns.push({
3538
3940
  name: helper,
3539
3941
  params: [{ localId: "o.0", name: "o", type: recv.type }],
3540
3942
  returnType: STRING,
3541
3943
  locals: [{ id: "o.0", name: "o", type: recv.type, mutable: false }],
3542
- body: [{ kind: "return", value: { ...constant }, loc }],
3944
+ body: [
3945
+ {
3946
+ kind: "return",
3947
+ value: nullProtoT && missing
3948
+ ? guardNullProto(o, nullProtoT.shapeId, missing, { ...constant }, loc)
3949
+ : { ...constant },
3950
+ loc,
3951
+ },
3952
+ ],
3543
3953
  loc,
3544
3954
  });
3545
3955
  }
@@ -3556,7 +3966,7 @@ function pureObjectToStringReceiver(node) {
3556
3966
  ts.isTypeAssertion(e)) {
3557
3967
  e = e.expression;
3558
3968
  }
3559
- if (ts.isObjectLiteralExpression(e) && e.properties.length === 0)
3969
+ if (ts.isObjectLiteralExpression(e) && e.properties.nodes.length === 0)
3560
3970
  return true;
3561
3971
  return pureReceiverNode(e);
3562
3972
  }
@@ -3569,11 +3979,11 @@ function pureObjectToStringReceiver(node) {
3569
3979
  function lowerClassHasOwnPropertyCall(lowerer, call, access) {
3570
3980
  if (call.questionDotToken || access.questionDotToken)
3571
3981
  return null;
3572
- if (access.name.text !== "hasOwnProperty" || call.arguments.length !== 1)
3982
+ if (access.name.text !== "hasOwnProperty" || call.arguments.nodes.length !== 1)
3573
3983
  return null;
3574
3984
  if (!ts.isIdentifier(access.expression))
3575
3985
  return null;
3576
- const argNode = call.arguments[0];
3986
+ const argNode = call.arguments.nodes[0];
3577
3987
  if (!ts.isStringLiteralLike(argNode))
3578
3988
  return null;
3579
3989
  if (!lowerer.isStdlibMember(access))
@@ -3584,7 +3994,7 @@ function lowerClassHasOwnPropertyCall(lowerer, call, access) {
3584
3994
  return null; // builtin/runtime classes keep the fence
3585
3995
  const key = argNode.text;
3586
3996
  const own = new Set(["prototype", "name", "length"]);
3587
- for (const m of info.decl.members) {
3997
+ for (const m of info.decl.members.nodes) {
3588
3998
  const isStatic = ts.canHaveModifiers(m) &&
3589
3999
  (ts.getModifiers(m) ?? []).some((mod) => mod.kind === ts.SyntaxKind.StaticKeyword);
3590
4000
  if (!isStatic)
@@ -3655,26 +4065,52 @@ function lowerPrimitiveProtoCall(lowerer, call, recv, name, memberSym) {
3655
4065
  return null;
3656
4066
  const recvKind = lowerer.mapTypeOf(lowerer.typeOf(recv))?.kind;
3657
4067
  if ((name === "toFixed" || name === "toExponential") &&
3658
- call.arguments.length <= 1 &&
3659
- !call.arguments.some(ts.isSpreadElement) &&
3660
- isJsSourceFile(call.getSourceFile())) {
4068
+ call.arguments.nodes.length <= 1 &&
4069
+ !call.arguments.nodes.some(ts.isSpreadElement) &&
4070
+ isJsSourceFile(ts.getSourceFileOfNode(call))) {
3661
4071
  const operand = lowerer.lowerExpr(recv);
4072
+ if (name === "toExponential" &&
4073
+ call.arguments.nodes.length === 1 &&
4074
+ (operand.type.kind === "dyn" ||
4075
+ (operand.type.kind === "union" && lowerer.dynConvertible(operand.type)))) {
4076
+ const dispatched = lowerDynPrimitiveMethodCall(lowerer, call, name, `${ts.getTextOfNode(recv)}.${name}`, lowerer.coerceToExpected(operand, DYN));
4077
+ if (dispatched)
4078
+ return dispatched;
4079
+ }
3662
4080
  if (operand.type.kind === "dyn" ||
3663
4081
  (operand.type.kind === "union" && lowerer.dynConvertible(operand.type)))
3664
4082
  return {
3665
4083
  kind: "dynInvoke",
3666
4084
  recv: lowerer.coerceToExpected(operand, DYN),
3667
4085
  method: name,
3668
- calleeName: `${recv.getText()}.${name}`,
3669
- args: call.arguments.map((argument) => lowerer.lowerExprExpecting(argument, DYN)),
4086
+ calleeName: `${ts.getTextOfNode(recv)}.${name}`,
4087
+ args: call.arguments.nodes.map((argument) => lowerer.lowerExprExpecting(argument, DYN)),
3670
4088
  type: DYN,
3671
4089
  loc: locOf(call),
3672
4090
  };
3673
4091
  }
4092
+ if (name === "toPrecision" &&
4093
+ call.arguments.nodes.length <= 1 &&
4094
+ !call.arguments.nodes.some(ts.isSpreadElement) &&
4095
+ isJsSourceFile(ts.getSourceFileOfNode(call)) &&
4096
+ recvKind === "union") {
4097
+ const operand = lowerer.lowerExpr(recv);
4098
+ if (operand.type.kind === "union" && lowerer.dynConvertible(operand.type)) {
4099
+ const dispatched = lowerDynPrimitiveMethodCall(lowerer, call, name, `${ts.getTextOfNode(recv)}.${name}`, lowerer.coerceToExpected(operand, DYN));
4100
+ if (dispatched)
4101
+ return dispatched;
4102
+ }
4103
+ }
4104
+ if (recvKind === "f64" &&
4105
+ (name === "toPrecision" || (name === "toExponential" && call.arguments.nodes.length === 1))) {
4106
+ const typed = lowerExtraNumberMethodCall(lowerer, call, name, lowerer.lowerExpr(recv));
4107
+ if (typed)
4108
+ return typed;
4109
+ }
3674
4110
  if (recvKind !== "f64" && recvKind !== "bool" && recvKind !== "string")
3675
4111
  return null;
3676
4112
  const loc = locOf(call);
3677
- if (name === "toString" && call.arguments.length === 0) {
4113
+ if (name === "toString" && call.arguments.nodes.length === 0) {
3678
4114
  const operand = lowerer.lowerExpr(recv);
3679
4115
  if (operand.type.kind === "string")
3680
4116
  return operand; // identity
@@ -3684,16 +4120,16 @@ function lowerPrimitiveProtoCall(lowerer, call, recv, name, memberSym) {
3684
4120
  }
3685
4121
  if ((name === "toExponential" || name === "toFixed") &&
3686
4122
  recvKind === "f64" &&
3687
- call.arguments.length === 0) {
4123
+ call.arguments.nodes.length === 0) {
3688
4124
  const operand = lowerer.lowerExpr(recv);
3689
4125
  if (operand.type.kind !== "f64")
3690
4126
  return null;
3691
4127
  const fn = name === "toExponential" ? "num.toExponential" : "num.toFixed0";
3692
4128
  return { kind: "libCall", fn, args: [operand], type: STRING, loc };
3693
4129
  }
3694
- if (name === "toFixed" && recvKind === "f64" && call.arguments.length === 1) {
4130
+ if (name === "toFixed" && recvKind === "f64" && call.arguments.nodes.length === 1) {
3695
4131
  const operand = lowerer.lowerExpr(recv);
3696
- let digits = lowerer.lowerExpr(call.arguments[0]);
4132
+ let digits = lowerer.lowerExpr(call.arguments.nodes[0]);
3697
4133
  // The optional parameter also admits undefined. Exact unit values
3698
4134
  // become the default 0 after preserving any evaluation effects; an
3699
4135
  // optional number selects 0 at runtime through the same narrowed
@@ -3732,15 +4168,15 @@ function lowerPrimitiveProtoCall(lowerer, call, recv, name, memberSym) {
3732
4168
  // host environment's default, which a compiled binary cannot carry),
3733
4169
  // other locales (ICU data the binary does not embed), options bags.
3734
4170
  if (name === "toLocaleString" && recvKind === "f64") {
3735
- if (call.arguments.length === 0) {
4171
+ if (call.arguments.nodes.length === 0) {
3736
4172
  lowerer.noLowering("Number.prototype.toLocaleString without a locale", call, "the default locale is the host environment's, which a compiled binary cannot carry — " +
3737
4173
  'pass it explicitly: x.toLocaleString("en-US")');
3738
4174
  }
3739
- if (call.arguments.length > 1) {
4175
+ if (call.arguments.nodes.length > 1) {
3740
4176
  lowerer.noLowering("Number.prototype.toLocaleString with an options bag", call, "the embedded data covers DEFAULT options only (decimal notation, up to 3 fraction " +
3741
4177
  'digits, grouping) — x.toLocaleString("en-US")');
3742
4178
  }
3743
- const locNode = call.arguments[0];
4179
+ const locNode = call.arguments.nodes[0];
3744
4180
  if (ts.isSpreadElement(locNode) ||
3745
4181
  !ts.isStringLiteralLike(locNode) ||
3746
4182
  locNode.text !== "en-US") {
@@ -3756,17 +4192,17 @@ function lowerPrimitiveProtoCall(lowerer, call, recv, name, memberSym) {
3756
4192
  }
3757
4193
  if (name === "charAt" &&
3758
4194
  recvKind === "string" &&
3759
- call.arguments.length === 1 &&
3760
- !ts.isSpreadElement(call.arguments[0])) {
4195
+ call.arguments.nodes.length === 1 &&
4196
+ !ts.isSpreadElement(call.arguments.nodes[0])) {
3761
4197
  const receiver = lowerer.lowerExpr(recv);
3762
4198
  if (receiver.type.kind !== "string")
3763
4199
  return null;
3764
- const idx = lowerer.lowerExprExpecting(call.arguments[0], F64);
4200
+ const idx = lowerer.lowerExprExpecting(call.arguments.nodes[0], F64);
3765
4201
  return { kind: "strIntrinsic", method: "charAt", receiver, args: [idx], type: STRING, loc };
3766
4202
  }
3767
- if (name !== "hasOwnProperty" || call.arguments.length !== 1)
4203
+ if (name !== "hasOwnProperty" || call.arguments.nodes.length !== 1)
3768
4204
  return null;
3769
- const argNode = call.arguments[0];
4205
+ const argNode = call.arguments.nodes[0];
3770
4206
  if (!ts.isStringLiteralLike(argNode))
3771
4207
  return null;
3772
4208
  const key = argNode.text;
@@ -3813,7 +4249,7 @@ function lowerPrimitiveProtoCall(lowerer, call, recv, name, memberSym) {
3813
4249
  function implicitReceiverOverloadReturn(lowerer, expr) {
3814
4250
  if (!ts.isCallExpression(expr) ||
3815
4251
  !ts.isPropertyAccessExpression(expr.expression) ||
3816
- expr.arguments.some(ts.isSpreadElement)) {
4252
+ expr.arguments.nodes.some(ts.isSpreadElement)) {
3817
4253
  return null;
3818
4254
  }
3819
4255
  const access = expr.expression;
@@ -3828,14 +4264,14 @@ function implicitReceiverOverloadReturn(lowerer, expr) {
3828
4264
  return null;
3829
4265
  const signatures = lowerer.checker.getCallSignatures(lowerer.checker.getTypeOfSymbol(member));
3830
4266
  const matches = signatures.filter((signature) => {
3831
- const decl = lowerer.checker.signatureDeclaration(signature);
4267
+ const decl = signature.declaration;
3832
4268
  if (!decl || !(ts.isFunctionDeclaration(decl) || ts.isMethodDeclaration(decl)) || decl.body) {
3833
4269
  return false;
3834
4270
  }
3835
- const params = decl.parameters.filter((param) => !isThisParameter(param));
4271
+ const params = decl.parameters.nodes.filter((param) => !isThisParameter(param));
3836
4272
  const required = params.filter((param) => !param.questionToken && !param.initializer && !param.dotDotDotToken).length;
3837
4273
  const maximum = params.some((param) => param.dotDotDotToken) ? Infinity : params.length;
3838
- return expr.arguments.length >= required && expr.arguments.length <= maximum;
4274
+ return expr.arguments.nodes.length >= required && expr.arguments.nodes.length <= maximum;
3839
4275
  });
3840
4276
  if (matches.length !== 1)
3841
4277
  return null;
@@ -3869,21 +4305,38 @@ function isSoleAbstractMethod(decl) {
3869
4305
  const owner = decl.parent;
3870
4306
  if (!ts.isClassDeclaration(owner) && !ts.isClassExpression(owner))
3871
4307
  return false;
3872
- const name = decl.name.getText();
3873
- return !owner.members.some((member) => member !== decl && ts.isMethodDeclaration(member) && member.name.getText() === name);
4308
+ const name = ts.getTextOfNode(decl.name);
4309
+ return !owner.members.nodes.some((member) => member !== decl && ts.isMethodDeclaration(member) && ts.getTextOfNode(member.name) === name);
3874
4310
  }
3875
4311
  function reconcileOverloadReturn(lowerer, expr, call) {
3876
4312
  const rsig = lowerer.checker.getResolvedSignature(expr);
3877
- const rdecl = rsig ? lowerer.checker.signatureDeclaration(rsig) : undefined;
4313
+ const rdecl = rsig ? rsig.declaration : undefined;
3878
4314
  // Nominal covariant overrides share the base's return ABI, but retain
3879
4315
  // their declared subclass result at the call site. Unannotated fluent
3880
4316
  // JS overrides use the same bridge for their proven receiver result.
3881
4317
  if (call.type.kind === "object" &&
3882
4318
  rdecl &&
3883
4319
  ts.isMethodDeclaration(rdecl) &&
3884
- (!isJsSourceFile(rdecl.getSourceFile()) || returnsOnlyThis(rdecl))) {
4320
+ (!isJsSourceFile(ts.getSourceFileOfNode(rdecl)) || returnsOnlyThis(rdecl))) {
3885
4321
  call = lowerer.maybeNarrow(call, expr);
3886
4322
  }
4323
+ // An override narrowed to part of its base's union return shares the
4324
+ // union ABI; a call resolved to that override narrows the result back.
4325
+ if (call.type.kind === "union" &&
4326
+ rsig &&
4327
+ rdecl &&
4328
+ ts.isMethodDeclaration(rdecl) &&
4329
+ lowerer.unionReturnOverrides.has(rdecl)) {
4330
+ const declared = lowerer.mapTypeOf(lowerer.checker.getReturnTypeOfSignature(rsig));
4331
+ if (declared && !typeEquals(declared, call.type)) {
4332
+ if (declared.kind !== "union") {
4333
+ const helper = lowerer.narrowedArmHelper(call.type.unionId, declared, call.loc);
4334
+ if (helper)
4335
+ return lowerer.checkedNarrowCall(helper, call, declared, call.loc);
4336
+ }
4337
+ return lowerer.coerceInto(expr, call, declared);
4338
+ }
4339
+ }
3887
4340
  const resolvedOverload = rsig &&
3888
4341
  rdecl &&
3889
4342
  (ts.isFunctionDeclaration(rdecl) || ts.isMethodDeclaration(rdecl)) &&
@@ -3963,7 +4416,7 @@ export function lowerTaggedTemplate(lowerer, expr) {
3963
4416
  const loc = locOf(expr);
3964
4417
  const pieces = ts.isNoSubstitutionTemplateLiteral(expr.template)
3965
4418
  ? [expr.template]
3966
- : [expr.template.head, ...expr.template.templateSpans.map((s) => s.literal)];
4419
+ : [expr.template.head, ...expr.template.templateSpans.nodes.map((s) => s.literal)];
3967
4420
  for (const p of pieces) {
3968
4421
  if (!templateEscapesValid(templateRawTextOf(p))) {
3969
4422
  lowerer.unsupported("SC1090", p, "tagged templates with invalid escape sequences (the span cooks to undefined, which the strings array cannot carry)");
@@ -3972,7 +4425,7 @@ export function lowerTaggedTemplate(lowerer, expr) {
3972
4425
  const strings = () => loweredTemplateStrings(lowerer, expr, pieces.map((piece) => piece.text), loc);
3973
4426
  const values = ts.isNoSubstitutionTemplateLiteral(expr.template)
3974
4427
  ? []
3975
- : expr.template.templateSpans.map((s) => s.expression);
4428
+ : expr.template.templateSpans.nodes.map((s) => s.expression);
3976
4429
  // Direct call of a top-level declared function — the plain-call fast
3977
4430
  // path with the strings array as the leading completed argument.
3978
4431
  if (ts.isIdentifier(expr.tag) && !lowerer.isSelfReference(expr.tag)) {
@@ -4017,7 +4470,7 @@ export function lowerTaggedTemplate(lowerer, expr) {
4017
4470
  // tag throws Node's catchable "<name> is not a function" TypeError.
4018
4471
  let callee = lowerer.lowerExpr(expr.tag);
4019
4472
  if (callee.type.kind === "func" &&
4020
- isJsSourceFile(expr.getSourceFile()) &&
4473
+ isJsSourceFile(ts.getSourceFileOfNode(expr)) &&
4021
4474
  lowerer.dynConvertible(callee.type)) {
4022
4475
  callee = { kind: "dynFrom", value: callee, type: DYN, loc };
4023
4476
  }
@@ -4027,7 +4480,7 @@ export function lowerTaggedTemplate(lowerer, expr) {
4027
4480
  ...values.map((a) => lowerer.lowerExprExpecting(a, DYN)),
4028
4481
  ];
4029
4482
  const calleeName = ts.isPropertyAccessExpression(expr.tag) || ts.isElementAccessExpression(expr.tag)
4030
- ? expr.tag.getText()
4483
+ ? ts.getTextOfNode(expr.tag)
4031
4484
  : ts.isIdentifier(expr.tag)
4032
4485
  ? expr.tag.text
4033
4486
  : "value";
@@ -4086,7 +4539,7 @@ function loweredTemplateStrings(lowerer, expr, cooked, loc, raw) {
4086
4539
  loc,
4087
4540
  })
4088
4541
  : null;
4089
- const key = `templateStringsGlobal:${loc.file}:${expr.template.getStart()}:${raw ? "checked" : "typed"}`;
4542
+ const key = `templateStringsGlobal:${loc.file}:${ts.tokenStartOfNode(expr.template)}:${raw ? "checked" : "typed"}`;
4090
4543
  let getter = lowerer.valueHelpers.get(key);
4091
4544
  if (!getter) {
4092
4545
  const site = lowerer.globalsList.length;
@@ -4191,7 +4644,7 @@ function markModuleNsHandlerParams(lowerer, handler, type) {
4191
4644
  e = e.expression;
4192
4645
  if (!ts.isArrowFunction(e) && !ts.isFunctionExpression(e))
4193
4646
  return;
4194
- for (const p of e.parameters) {
4647
+ for (const p of e.parameters.nodes) {
4195
4648
  if (ts.isIdentifier(p.name) && !p.dotDotDotToken && !p.initializer) {
4196
4649
  lowerer.moduleNsParamOverrides.set(p, type);
4197
4650
  }
@@ -4232,12 +4685,12 @@ export function lowerPromiseMethodCall(lowerer, call, access) {
4232
4685
  e.text === "undefined" &&
4233
4686
  (lowerer.typeOf(e).flags & ts.TypeFlags.Undefined) !== 0));
4234
4687
  };
4235
- const passthrough = call.arguments.length === 0 ||
4236
- (call.arguments.length === 1 && isAbsentHandler(call.arguments[0]));
4237
- if (call.arguments.length !== 1 &&
4688
+ const passthrough = call.arguments.nodes.length === 0 ||
4689
+ (call.arguments.nodes.length === 1 && isAbsentHandler(call.arguments.nodes[0]));
4690
+ if (call.arguments.nodes.length !== 1 &&
4238
4691
  !passthrough &&
4239
- !(member === "then" && call.arguments.length === 2)) {
4240
- lowerer.noLowering(`${member} with ${call.arguments.length} arguments`, call, member === "then"
4692
+ !(member === "then" && call.arguments.nodes.length === 2)) {
4693
+ lowerer.noLowering(`${member} with ${call.arguments.nodes.length} arguments`, call, member === "then"
4241
4694
  ? "the supported form takes a fulfillment handler and an optional rejection handler"
4242
4695
  : `the supported form takes exactly one ${member === "catch" ? "inline handler" : "callback"}`);
4243
4696
  }
@@ -4306,9 +4759,9 @@ export function lowerPromiseMethodCall(lowerer, call, access) {
4306
4759
  }
4307
4760
  }
4308
4761
  if (member === "then") {
4309
- if (call.arguments.length === 2) {
4310
- const fulfilledNode = call.arguments[0];
4311
- const rejectedNode = call.arguments[1];
4762
+ if (call.arguments.nodes.length === 2) {
4763
+ const fulfilledNode = call.arguments.nodes[0];
4764
+ const rejectedNode = call.arguments.nodes[1];
4312
4765
  const fulfilledAbsent = isAbsentHandler(fulfilledNode);
4313
4766
  const rejectedAbsent = isAbsentHandler(rejectedNode);
4314
4767
  const resultT = lowerer.mapTypeOf(lowerer.typeOf(call));
@@ -4375,6 +4828,9 @@ export function lowerPromiseMethodCall(lowerer, call, access) {
4375
4828
  const resultOf = (value, returnsPromise = false) => {
4376
4829
  if (value.type.kind === "promise")
4377
4830
  return [lowerer.adoptingReturn(value, R, (e) => lowerer.coerceInto(call, e, R))];
4831
+ const flattened = maybePromiseHandlerResult(lowerer, call, value, R);
4832
+ if (flattened)
4833
+ return [flattened];
4378
4834
  if (returnsPromise) {
4379
4835
  // A boxed handler's promise result adopts too: the then job's
4380
4836
  // turn after the call, then the await of the returned value.
@@ -4525,8 +4981,8 @@ export function lowerPromiseMethodCall(lowerer, call, access) {
4525
4981
  // contextual type spelled (a module-namespace type has no mapping —
4526
4982
  // the handle is the value's only story, isIslandExpr's local rule).
4527
4983
  if (inner.kind === "moduleNs")
4528
- markModuleNsHandlerParams(lowerer, call.arguments[0], inner);
4529
- let cb = lowerer.lowerExpr(call.arguments[0]);
4984
+ markModuleNsHandlerParams(lowerer, call.arguments.nodes[0], inner);
4985
+ let cb = lowerer.lowerExpr(call.arguments.nodes[0]);
4530
4986
  // A TYPED handler on a DYN-settling promise (the tracePromise
4531
4987
  // result's `.then((value) => ...)` — the checker's generic
4532
4988
  // instantiation typed the parameter, but the settled value is a
@@ -4555,7 +5011,7 @@ export function lowerPromiseMethodCall(lowerer, call, access) {
4555
5011
  if (canConvertToDyn(v.type, (id) => lowerer.shapes.get(id), (id) => lowerer.unions.get(id))) {
4556
5012
  return { kind: "dynFrom", value: v, type: DYN, loc };
4557
5013
  }
4558
- lowerer.unsupported("SC1090", call.arguments[0], `then handlers receiving '${lowerer.fmt(v.type)}' values through an untyped handler (the settled value cannot cross the checked-dynamic tree boundary)`);
5014
+ lowerer.unsupported("SC1090", call.arguments.nodes[0], `then handlers receiving '${lowerer.fmt(v.type)}' values through an untyped handler (the settled value cannot cross the checked-dynamic tree boundary)`);
4559
5015
  };
4560
5016
  const resultT = { kind: "promise", inner: DYN };
4561
5017
  const fnName = `%fn${lowerer.lambdaCounter++}_then`;
@@ -4592,7 +5048,7 @@ export function lowerPromiseMethodCall(lowerer, call, access) {
4592
5048
  value: {
4593
5049
  kind: "dynCall",
4594
5050
  callee: { kind: "varRef", localId: cbLocal.id, type: DYN, loc },
4595
- calleeName: jsFuncNameOf(call.arguments[0], lowerer) ?? "onFulfilled",
5051
+ calleeName: jsFuncNameOf(call.arguments.nodes[0], lowerer) ?? "onFulfilled",
4596
5052
  args: handlerArgs,
4597
5053
  type: DYN,
4598
5054
  loc,
@@ -4628,13 +5084,13 @@ export function lowerPromiseMethodCall(lowerer, call, access) {
4628
5084
  }
4629
5085
  }
4630
5086
  if (cb.type.kind !== "func" || cb.type.params.length > 1) {
4631
- lowerer.unsupported("SC1090", call.arguments[0], "then handlers with more than one parameter (the two-argument onRejected form has no lowering — chain .catch(...) instead)");
5087
+ lowerer.unsupported("SC1090", call.arguments.nodes[0], "then handlers with more than one parameter (the two-argument onRejected form has no lowering — chain .catch(...) instead)");
4632
5088
  }
4633
5089
  const param = cb.type.params[0];
4634
5090
  if (param !== undefined &&
4635
5091
  !typeEquals(param, inner) &&
4636
5092
  !(param.kind === "dyn" && (inner.kind === "void" || lowerer.dynConvertible(inner)))) {
4637
- lowerer.unsupported("SC1090", call.arguments[0], `then handlers whose parameter is not the settled value's type (expected '${lowerer.fmt(inner)}', got '${lowerer.fmt(param)}')`);
5093
+ lowerer.unsupported("SC1090", call.arguments.nodes[0], `then handlers whose parameter is not the settled value's type (expected '${lowerer.fmt(inner)}', got '${lowerer.fmt(param)}')`);
4638
5094
  }
4639
5095
  const resultT = lowerer.mapTypeOf(lowerer.typeOf(call));
4640
5096
  if (resultT?.kind !== "promise") {
@@ -4686,7 +5142,11 @@ export function lowerPromiseMethodCall(lowerer, call, access) {
4686
5142
  // The handler's result: promise returns flatten exactly like
4687
5143
  // `return p` in any async body (the spec's thenable adoption);
4688
5144
  // everything else coerces into R.
4689
- if (handlerCall.type.kind === "promise" && R.kind !== "promise") {
5145
+ const flattened = maybePromiseHandlerResult(lowerer, call, handlerCall, R);
5146
+ if (flattened) {
5147
+ body.push(flattened);
5148
+ }
5149
+ else if (handlerCall.type.kind === "promise" && R.kind !== "promise") {
4690
5150
  body.push(lowerer.adoptingReturn(handlerCall, R, (e) => lowerer.coerceInto(call, e, R)));
4691
5151
  }
4692
5152
  else if (R.kind === "void") {
@@ -4725,13 +5185,13 @@ export function lowerPromiseMethodCall(lowerer, call, access) {
4725
5185
  }
4726
5186
  }
4727
5187
  if (member === "finally") {
4728
- const cb = lowerer.lowerExpr(call.arguments[0]);
5188
+ const cb = lowerer.lowerExpr(call.arguments.nodes[0]);
4729
5189
  if (lowerer.dynConvertible(promT) && lowerer.dynConvertible(cb.type)) {
4730
5190
  const result = {
4731
5191
  kind: "dynInvoke",
4732
5192
  recv: lowerer.coerceToExpected(receiver, DYN),
4733
5193
  method: "finally",
4734
- calleeName: access.getText(),
5194
+ calleeName: ts.getTextOfNode(access),
4735
5195
  args: [lowerer.coerceToExpected(cb, DYN)],
4736
5196
  type: DYN,
4737
5197
  loc,
@@ -4739,7 +5199,7 @@ export function lowerPromiseMethodCall(lowerer, call, access) {
4739
5199
  return lowerer.coerceToExpected(result, promT);
4740
5200
  }
4741
5201
  if (cb.type.kind !== "func" || cb.type.params.length !== 0 || cb.type.ret.kind !== "void") {
4742
- lowerer.unsupported("SC1090", call.arguments[0], "finally callbacks with parameters or a return value (use () => { ... })");
5202
+ lowerer.unsupported("SC1090", call.arguments.nodes[0], "finally callbacks with parameters or a return value (use () => { ... })");
4743
5203
  }
4744
5204
  const fnName = `%fn${lowerer.lambdaCounter++}_finally`;
4745
5205
  const funcType = {
@@ -4828,9 +5288,9 @@ export function lowerPromiseMethodCall(lowerer, call, access) {
4828
5288
  // snapshot (the dyn-then desugar's catch twin).
4829
5289
  if (member === "catch" &&
4830
5290
  (inner.kind === "dyn" ||
4831
- (isJsSourceFile(call.getSourceFile()) &&
5291
+ (isJsSourceFile(ts.getSourceFileOfNode(call)) &&
4832
5292
  (inner.kind === "void" || lowerer.dynConvertible(inner))))) {
4833
- let cb = lowerer.lowerExpr(call.arguments[0]);
5293
+ let cb = lowerer.lowerExpr(call.arguments.nodes[0]);
4834
5294
  if (cb.type.kind === "func" &&
4835
5295
  canBoxFuncIntoDyn(cb.type, (id) => lowerer.shapes.get(id), (id) => lowerer.unions.get(id))) {
4836
5296
  cb = { kind: "dynFrom", value: cb, type: DYN, loc };
@@ -4875,7 +5335,7 @@ export function lowerPromiseMethodCall(lowerer, call, access) {
4875
5335
  value: {
4876
5336
  kind: "dynCall",
4877
5337
  callee: { kind: "varRef", localId: cbLocal.id, type: DYN, loc },
4878
- calleeName: jsFuncNameOf(call.arguments[0], lowerer) ?? "onRejected",
5338
+ calleeName: jsFuncNameOf(call.arguments.nodes[0], lowerer) ?? "onRejected",
4879
5339
  args: [
4880
5340
  {
4881
5341
  kind: "caughtToDyn",
@@ -4924,20 +5384,20 @@ export function lowerPromiseMethodCall(lowerer, call, access) {
4924
5384
  }
4925
5385
  // .catch: the handler must be INLINE — its parameter becomes the
4926
5386
  // catch binding.
4927
- let handlerNode = call.arguments[0];
5387
+ let handlerNode = call.arguments.nodes[0];
4928
5388
  while (ts.isParenthesizedExpression(handlerNode))
4929
5389
  handlerNode = handlerNode.expression;
4930
5390
  if (!ts.isArrowFunction(handlerNode) && !ts.isFunctionExpression(handlerNode)) {
4931
- lowerer.unsupported("SC1090", call.arguments[0], "catch handlers that are not inline function literals (the handler's parameter " +
5391
+ lowerer.unsupported("SC1090", call.arguments.nodes[0], "catch handlers that are not inline function literals (the handler's parameter " +
4932
5392
  "becomes a typed-catch binding, which only an inline `(e) => ...` can receive)");
4933
5393
  }
4934
- if (handlerNode.modifiers?.some((m) => m.kind === ts.SyntaxKind.AsyncKeyword)) {
5394
+ if (handlerNode.modifiers?.nodes.some((m) => m.kind === ts.SyntaxKind.AsyncKeyword)) {
4935
5395
  lowerer.unsupported("SC1090", handlerNode, "async catch handlers");
4936
5396
  }
4937
- if (handlerNode.parameters.length > 1) {
5397
+ if (handlerNode.parameters.nodes.length > 1) {
4938
5398
  lowerer.unsupported("SC1090", handlerNode, "catch handlers with more than one parameter");
4939
5399
  }
4940
- const param = handlerNode.parameters[0];
5400
+ const param = handlerNode.parameters.nodes[0];
4941
5401
  if (param && (!ts.isIdentifier(param.name) || param.dotDotDotToken || param.initializer)) {
4942
5402
  lowerer.unsupported("SC1062", param);
4943
5403
  }
@@ -4984,7 +5444,7 @@ export function lowerPromiseMethodCall(lowerer, call, access) {
4984
5444
  }
4985
5445
  const hb = handlerNode.body;
4986
5446
  if (ts.isBlock(hb)) {
4987
- catchBody = lowerer.lowerStmts(hb.statements);
5447
+ catchBody = lowerer.lowerStmts(hb.statements.nodes);
4988
5448
  }
4989
5449
  else if (R.kind === "void") {
4990
5450
  catchBody = [{ kind: "exprStmt", expr: lowerer.lowerExpr(hb), loc: locOf(hb) }];
@@ -5082,10 +5542,10 @@ export function lowerFilterNarrowCall(lowerer, call, access) {
5082
5542
  return null;
5083
5543
  if (!lowerer.isStdlibMember(access))
5084
5544
  return null;
5085
- if (call.arguments.length !== 1)
5545
+ if (call.arguments.nodes.length !== 1)
5086
5546
  return null; // the generic path's arity fence
5087
5547
  const elem = receiverIr.elem;
5088
- const argNode = call.arguments[0];
5548
+ const argNode = call.arguments.nodes[0];
5089
5549
  const loc = locOf(call);
5090
5550
  const isBooleanArg = ts.isIdentifier(argNode) &&
5091
5551
  argNode.text === "Boolean" &&
@@ -5287,19 +5747,19 @@ function lowerSymbolStaticCall(lowerer, call, access) {
5287
5747
  const member = access.name.text;
5288
5748
  const loc = locOf(call);
5289
5749
  if (member === "for") {
5290
- if (call.arguments.length !== 1) {
5291
- lowerer.noLowering(`Symbol.for with ${call.arguments.length} arguments`, call);
5750
+ if (call.arguments.nodes.length !== 1) {
5751
+ lowerer.noLowering(`Symbol.for with ${call.arguments.nodes.length} arguments`, call);
5292
5752
  }
5293
- const key = lowerer.lowerExprExpecting(call.arguments[0], STRING);
5753
+ const key = lowerer.lowerExprExpecting(call.arguments.nodes[0], STRING);
5294
5754
  return { kind: "libCall", fn: "sym.for", args: [key], type: SYMBOL_T, loc };
5295
5755
  }
5296
5756
  if (member === "keyFor") {
5297
- if (call.arguments.length !== 1) {
5298
- lowerer.noLowering(`Symbol.keyFor with ${call.arguments.length} arguments`, call);
5757
+ if (call.arguments.nodes.length !== 1) {
5758
+ lowerer.noLowering(`Symbol.keyFor with ${call.arguments.nodes.length} arguments`, call);
5299
5759
  }
5300
- const sym = lowerer.lowerExpr(call.arguments[0]);
5760
+ const sym = lowerer.lowerExpr(call.arguments.nodes[0]);
5301
5761
  if (sym.type.kind !== "symbol") {
5302
- lowerer.noLowering(`Symbol.keyFor of a '${lowerer.fmt(sym.type)}' value`, call.arguments[0], "the argument must be symbol-typed");
5762
+ lowerer.noLowering(`Symbol.keyFor of a '${lowerer.fmt(sym.type)}' value`, call.arguments.nodes[0], "the argument must be symbol-typed");
5303
5763
  }
5304
5764
  // The checker types the call `string | undefined`, which interns
5305
5765
  // the result union (the map.get pattern); the backend builds the
@@ -5320,12 +5780,12 @@ function lowerBigIntStaticCall(lowerer, call, access) {
5320
5780
  const name = access.name.text;
5321
5781
  if (name !== "asUintN" && name !== "asIntN")
5322
5782
  return null;
5323
- if (call.arguments.length !== 2) {
5324
- lowerer.noLowering(`BigInt.${name} with ${call.arguments.length} arguments`, call);
5783
+ if (call.arguments.nodes.length !== 2) {
5784
+ lowerer.noLowering(`BigInt.${name} with ${call.arguments.nodes.length} arguments`, call);
5325
5785
  }
5326
5786
  const loc = locOf(call);
5327
- const bits = lowerer.lowerExprExpecting(call.arguments[0], F64);
5328
- const value = lowerer.lowerExprExpecting(call.arguments[1], BIGINT_T);
5787
+ const bits = lowerer.lowerExprExpecting(call.arguments.nodes[0], F64);
5788
+ const value = lowerer.lowerExprExpecting(call.arguments.nodes[1], BIGINT_T);
5329
5789
  return {
5330
5790
  kind: "libCall",
5331
5791
  fn: name === "asUintN" ? "bigint.asUintN" : "bigint.asIntN",
@@ -5344,12 +5804,12 @@ function lowerBigIntMethodCall(lowerer, call, access) {
5344
5804
  const receiver = lowerer.lowerExpr(access.expression);
5345
5805
  if (receiver.type.kind !== "bigint")
5346
5806
  return null;
5347
- if (name === "valueOf" && call.arguments.length === 0)
5807
+ if (name === "valueOf" && call.arguments.nodes.length === 0)
5348
5808
  return receiver;
5349
- if (name === "toString" && call.arguments.length <= 1) {
5809
+ if (name === "toString" && call.arguments.nodes.length <= 1) {
5350
5810
  const defaultRadix = { kind: "numLit", value: 10, type: F64, loc };
5351
- const radix = call.arguments[0]
5352
- ? lowerOptionalArgument(lowerer, call.arguments[0], F64, defaultRadix)
5811
+ const radix = call.arguments.nodes[0]
5812
+ ? lowerOptionalArgument(lowerer, call.arguments.nodes[0], F64, defaultRadix)
5353
5813
  : defaultRadix;
5354
5814
  return { kind: "libCall", fn: "bigint.toString", args: [receiver, radix], type: STRING, loc };
5355
5815
  }
@@ -5367,13 +5827,13 @@ function lowerSymbolMethodCall(lowerer, call, access) {
5367
5827
  return null;
5368
5828
  const name = access.name.text;
5369
5829
  const loc = locOf(call);
5370
- if (name === "toString" && call.arguments.length === 0) {
5830
+ if (name === "toString" && call.arguments.nodes.length === 0) {
5371
5831
  const receiver = lowerer.lowerExpr(access.expression);
5372
5832
  if (receiver.type.kind !== "symbol")
5373
5833
  return null;
5374
5834
  return { kind: "libCall", fn: "sym.toString", args: [receiver], type: STRING, loc };
5375
5835
  }
5376
- if (name === "valueOf" && call.arguments.length === 0) {
5836
+ if (name === "valueOf" && call.arguments.nodes.length === 0) {
5377
5837
  const receiver = lowerer.lowerExpr(access.expression);
5378
5838
  if (receiver.type.kind !== "symbol")
5379
5839
  return null;
@@ -5390,6 +5850,7 @@ function lowerSymbolMethodCall(lowerer, call, access) {
5390
5850
  * for-in iterates exactly the keys Object.keys answers. */
5391
5851
  export function recordKeysArrayCall(lowerer, receiver, argIr, shape, loc) {
5392
5852
  const resultT = arrayOf(STRING);
5853
+ lowerer.keyOrder.observe(argIr);
5393
5854
  const key = `obj.keys:${argIr.shapeId}:${typeKey(resultT)}`;
5394
5855
  let helper = lowerer.arrHofHelpers.get(key);
5395
5856
  if (!helper) {
@@ -5505,6 +5966,90 @@ function recordHasOwnHelper(lowerer, shapeId, loc) {
5505
5966
  });
5506
5967
  return helper;
5507
5968
  }
5969
+ /** Whether `Object.assign(instance, record)` can copy every field of the
5970
+ * record shape into a field the class declares with the same type: a plain
5971
+ * record (no tuple, index signature or accessor slots) and a compiled
5972
+ * class whose chain has no builtin or runtime-provided storage and no
5973
+ * accessor for the written names. */
5974
+ function classAssignPlan(lowerer, className, srcShapeId) {
5975
+ const info = lowerer.classes.get(className);
5976
+ const shape = lowerer.shapes.get(srcShapeId);
5977
+ if (!info || !shape || shape.tuple || shape.indexValue || shapeHasAccessorSlots(shape))
5978
+ return false;
5979
+ for (let c = info; c; c = c.base) {
5980
+ if (c.builtinError || c.builtinEmitter || c.builtinStream !== undefined || c.def.runtime)
5981
+ return false;
5982
+ }
5983
+ return shape.fields.every((f) => {
5984
+ const declared = info.fields.get(f.name);
5985
+ return (declared !== undefined &&
5986
+ (typeEquals(declared, f.type) || lowerer.widthLiftPlan(f.type, declared) !== null) &&
5987
+ !lowerer.findMethodOn(info, f.name) &&
5988
+ !lowerer.findMethodOn(info, `get:${f.name}`) &&
5989
+ !lowerer.findMethodOn(info, `set:${f.name}`));
5990
+ });
5991
+ }
5992
+ /** Interned `%obj.assignClass.<n>(o, s)` — Object.assign's per-field
5993
+ * write of a record into a class instance (classAssignPlan's gate):
5994
+ * optional source fields write only when present, and the instance
5995
+ * returns. */
5996
+ function classAssignHelper(lowerer, className, srcShapeId, loc) {
5997
+ if (!classAssignPlan(lowerer, className, srcShapeId))
5998
+ return null;
5999
+ const key = `obj.assignClass:${className}:${srcShapeId}`;
6000
+ const existing = lowerer.arrHofHelpers.get(key);
6001
+ if (existing)
6002
+ return existing;
6003
+ const helper = `%obj.assignClass.${lowerer.arrHofHelpers.size}`;
6004
+ lowerer.arrHofHelpers.set(key, helper);
6005
+ const sShape = lowerer.shapes.get(srcShapeId);
6006
+ const oT = { kind: "object", className };
6007
+ const sT = { kind: "record", shapeId: srcShapeId };
6008
+ const oRef = { kind: "varRef", localId: "o.0", type: oT, loc };
6009
+ const sRef = { kind: "varRef", localId: "s.0", type: sT, loc };
6010
+ const body = [];
6011
+ const info = lowerer.classes.get(className);
6012
+ for (const f of sShape.fields) {
6013
+ const declared = info.fields.get(f.name);
6014
+ const read = {
6015
+ kind: "recordGet",
6016
+ obj: sRef,
6017
+ shapeId: srcShapeId,
6018
+ field: f.name,
6019
+ type: f.type,
6020
+ loc,
6021
+ };
6022
+ const lift = typeEquals(declared, f.type) ? null : lowerer.widthLiftPlan(f.type, declared);
6023
+ const set = {
6024
+ kind: "fieldSet",
6025
+ obj: oRef,
6026
+ className,
6027
+ field: f.name,
6028
+ value: lift === null ? read : lowerer.applyWidthLift(lift, read, declared, loc),
6029
+ loc,
6030
+ };
6031
+ const present = lowerer.recordFieldPresent(sRef, srcShapeId, f.name, loc);
6032
+ body.push(present.kind === "recordHas"
6033
+ ? { kind: "if", cond: present, then: [set], else_: null, loc }
6034
+ : set);
6035
+ }
6036
+ body.push({ kind: "return", value: oRef, loc });
6037
+ lowerer.liftedFns.push({
6038
+ name: helper,
6039
+ params: [
6040
+ { localId: "o.0", name: "o", type: oT },
6041
+ { localId: "s.0", name: "s", type: sT },
6042
+ ],
6043
+ returnType: oT,
6044
+ locals: [
6045
+ { id: "o.0", name: "o", type: oT, mutable: true },
6046
+ { id: "s.0", name: "s", type: sT, mutable: true },
6047
+ ],
6048
+ body,
6049
+ loc,
6050
+ });
6051
+ return helper;
6052
+ }
5508
6053
  /** Interned `%obj.assign.<n>(t, s)` — Object.assign's per-field copy
5509
6054
  * over signature-free records (every source field lands on a same-named,
5510
6055
  * same-typed target field — the caller's gate): optional source fields
@@ -5519,6 +6064,7 @@ function recordAssignHelper(lowerer, targetShapeId, srcShapeId, loc) {
5519
6064
  const helper = `%obj.assign.${lowerer.arrHofHelpers.size}`;
5520
6065
  lowerer.arrHofHelpers.set(key, helper);
5521
6066
  const sShape = lowerer.shapes.get(srcShapeId);
6067
+ const tShape = lowerer.shapes.get(targetShapeId);
5522
6068
  const tT = { kind: "record", shapeId: targetShapeId };
5523
6069
  const sT = { kind: "record", shapeId: srcShapeId };
5524
6070
  const tRef = { kind: "varRef", localId: "t.0", type: tT, loc };
@@ -5533,12 +6079,13 @@ function recordAssignHelper(lowerer, targetShapeId, srcShapeId, loc) {
5533
6079
  type: f.type,
5534
6080
  loc,
5535
6081
  };
6082
+ const targetType = tShape.fields.find((x) => x.name === f.name).type;
5536
6083
  const set = {
5537
6084
  kind: "recordSet",
5538
6085
  obj: tRef,
5539
6086
  shapeId: targetShapeId,
5540
6087
  field: f.name,
5541
- value: get,
6088
+ value: typeEquals(targetType, f.type) ? get : lowerer.coerceToExpected(get, targetType),
5542
6089
  loc,
5543
6090
  };
5544
6091
  const present = lowerer.recordFieldPresent(sRef, srcShapeId, f.name, loc);
@@ -5563,17 +6110,22 @@ function recordAssignHelper(lowerer, targetShapeId, srcShapeId, loc) {
5563
6110
  });
5564
6111
  return helper;
5565
6112
  }
5566
- /** The `Iterator` global's statics (ES2025 — Iterator.from, and the
5567
- * abstract constructor as a value): no first-class iterator objects
5568
- * exist here, so every member fences with the working spelling named
5569
- * instead of the generic-method fence's monomorphization wording. */
6113
+ /** The `Iterator` global's statics (ES2025): `Iterator.from` over a typed
6114
+ * built-in iterable lowers (lowerIteratorFromCall); every other member,
6115
+ * and other arguments, fence with the working spelling named instead of
6116
+ * the generic-method fence's monomorphization wording. */
5570
6117
  function lowerIteratorStaticFence(lowerer, call, access) {
5571
6118
  if (!lowerer.isStdlibGlobal(access.expression, "Iterator"))
5572
6119
  return null;
5573
6120
  if (!lowerer.isStdlibMember(access))
5574
6121
  return null;
5575
- lowerer.noLowering(`Iterator.${access.name.text}`, call, "first-class iterator objects have no lowering — iterator helpers compile as one chain on an " +
5576
- "array iterator, consumed in place: arr.values().map(f).take(n).toArray()");
6122
+ const from = lowerIteratorFromCall(lowerer, call, access);
6123
+ if (from)
6124
+ return from;
6125
+ lowerer.noLowering(`Iterator.${access.name.text}`, call, access.name.text === "from"
6126
+ ? "Iterator.from accepts arrays, strings, typed arrays, Sets, Maps and iterator objects such as generators"
6127
+ : "iterator helpers apply directly to generators and to array, Map and Set iterators: " +
6128
+ "arr.values().map(f).take(n).toArray()");
5577
6129
  }
5578
6130
  /** `RegExp.escape(s)` (ES2025) — the one RegExp static with a lowering:
5579
6131
  * a total string→string libCall (scr_regexp_escape). The lib pins the
@@ -5589,12 +6141,12 @@ function lowerRegExpStaticCall(lowerer, call, access) {
5589
6141
  return null;
5590
6142
  if (!lowerer.isStdlibMember(access))
5591
6143
  return null;
5592
- if (call.arguments.length !== 1 || ts.isSpreadElement(call.arguments[0])) {
5593
- lowerer.noLowering(`RegExp.escape with ${call.arguments.length} arguments`, call);
6144
+ if (call.arguments.nodes.length !== 1 || ts.isSpreadElement(call.arguments.nodes[0])) {
6145
+ lowerer.noLowering(`RegExp.escape with ${call.arguments.nodes.length} arguments`, call);
5594
6146
  }
5595
- const arg = lowerer.lowerExprExpecting(call.arguments[0], STRING);
6147
+ const arg = lowerer.lowerExprExpecting(call.arguments.nodes[0], STRING);
5596
6148
  if (arg.type.kind !== "string")
5597
- lowerer.badType(call.arguments[0], lowerer.typeOf(call.arguments[0]));
6149
+ lowerer.badType(call.arguments.nodes[0], lowerer.typeOf(call.arguments.nodes[0]));
5598
6150
  return { kind: "libCall", fn: "regexp.escape", args: [arg], type: STRING, loc: locOf(call) };
5599
6151
  }
5600
6152
  /** The composed en-US Intl.NumberFormat form: `new Intl.NumberFormat(
@@ -5626,7 +6178,7 @@ function lowerIntlNumberFormatCall(lowerer, call, access) {
5626
6178
  !lowerer.isStdlibGlobal(ctor.expression, "Intl")) {
5627
6179
  return null;
5628
6180
  }
5629
- ctorArgs = recv.arguments ?? [];
6181
+ ctorArgs = recv.arguments?.nodes ?? [];
5630
6182
  }
5631
6183
  else {
5632
6184
  return null;
@@ -5647,10 +6199,10 @@ function lowerIntlNumberFormatCall(lowerer, call, access) {
5647
6199
  : "Intl.NumberFormat with a non-literal locale", locArg, '"en-US" (Node\'s default-build locale) is the one locale whose data the runtime embeds — ' +
5648
6200
  "everything else is ICU data the binary does not carry");
5649
6201
  }
5650
- if (call.arguments.length !== 1 || ts.isSpreadElement(call.arguments[0])) {
5651
- lowerer.noLowering(`Intl.NumberFormat("en-US").format with ${call.arguments.length} arguments`, call);
6202
+ if (call.arguments.nodes.length !== 1 || ts.isSpreadElement(call.arguments.nodes[0])) {
6203
+ lowerer.noLowering(`Intl.NumberFormat("en-US").format with ${call.arguments.nodes.length} arguments`, call);
5652
6204
  }
5653
- const argNode = call.arguments[0];
6205
+ const argNode = call.arguments.nodes[0];
5654
6206
  if (lowerer.mapTypeOf(lowerer.typeOf(argNode))?.kind !== "f64") {
5655
6207
  lowerer.noLowering(`Intl.NumberFormat("en-US").format over a '${lowerer.checker.typeToString(lowerer.typeOf(argNode))}'`, argNode, "a number argument is the lowered form (bigint and numeric-string inputs have no representation)");
5656
6208
  }
@@ -5693,9 +6245,9 @@ function lowerObjectStaticCall(lowerer, call, access) {
5693
6245
  if ((member === "getOwnPropertyNames" ||
5694
6246
  member === "getOwnPropertySymbols" ||
5695
6247
  member === "getOwnPropertyDescriptors") &&
5696
- call.arguments.length === 1 &&
5697
- !call.arguments.some(ts.isSpreadElement)) {
5698
- let object = lowerer.lowerExpr(call.arguments[0]);
6248
+ call.arguments.nodes.length === 1 &&
6249
+ !call.arguments.nodes.some(ts.isSpreadElement)) {
6250
+ let object = lowerer.lowerExpr(call.arguments.nodes[0]);
5699
6251
  if (object.type.kind === "string" ||
5700
6252
  object.type.kind === "f64" ||
5701
6253
  object.type.kind === "bool" ||
@@ -5715,11 +6267,11 @@ function lowerObjectStaticCall(lowerer, call, access) {
5715
6267
  };
5716
6268
  }
5717
6269
  if ((member === "getPrototypeOf" || member === "setPrototypeOf") &&
5718
- call.arguments.length === (member === "getPrototypeOf" ? 1 : 2) &&
5719
- !call.arguments.some(ts.isSpreadElement)) {
5720
- let object = lowerer.lowerExpr(call.arguments[0]);
6270
+ call.arguments.nodes.length === (member === "getPrototypeOf" ? 1 : 2) &&
6271
+ !call.arguments.nodes.some(ts.isSpreadElement)) {
6272
+ let object = lowerer.lowerExpr(call.arguments.nodes[0]);
5721
6273
  if (object.type.kind === "func") {
5722
- const fnName = jsFuncNameOf(call.arguments[0], lowerer);
6274
+ const fnName = jsFuncNameOf(call.arguments.nodes[0], lowerer);
5723
6275
  object = {
5724
6276
  kind: "dynFrom",
5725
6277
  value: object,
@@ -5730,7 +6282,7 @@ function lowerObjectStaticCall(lowerer, call, access) {
5730
6282
  }
5731
6283
  if (object.type.kind !== "dyn" &&
5732
6284
  canConvertToDyn(object.type, (id) => lowerer.shapes.get(id), (id) => lowerer.unions.get(id)))
5733
- object = lowerer.coerceInto(call.arguments[0], object, DYN);
6285
+ object = lowerer.coerceInto(call.arguments.nodes[0], object, DYN);
5734
6286
  if (object.type.kind === "dyn") {
5735
6287
  const loc = locOf(call);
5736
6288
  if (member === "getPrototypeOf") {
@@ -5752,7 +6304,7 @@ function lowerObjectStaticCall(lowerer, call, access) {
5752
6304
  ...(identityOnly ? { prototypeIdentityOnly: true } : {}),
5753
6305
  };
5754
6306
  }
5755
- const prototype = lowerer.lowerExprExpecting(call.arguments[1], DYN);
6307
+ const prototype = lowerer.lowerExprExpecting(call.arguments.nodes[1], DYN);
5756
6308
  if (prototype.type.kind === "dyn")
5757
6309
  return {
5758
6310
  kind: "libCall",
@@ -5763,8 +6315,8 @@ function lowerObjectStaticCall(lowerer, call, access) {
5763
6315
  };
5764
6316
  }
5765
6317
  }
5766
- if (member === "getOwnPropertyDescriptor" && call.arguments.length === 2) {
5767
- const [receiver, key] = call.arguments;
6318
+ if (member === "getOwnPropertyDescriptor" && call.arguments.nodes.length === 2) {
6319
+ const [receiver, key] = call.arguments.nodes;
5768
6320
  if (receiver &&
5769
6321
  key &&
5770
6322
  ts.isPropertyAccessExpression(receiver) &&
@@ -5797,12 +6349,13 @@ function lowerObjectStaticCall(lowerer, call, access) {
5797
6349
  // with the operands still evaluated (tsc admits any pair — Object.is
5798
6350
  // is (any, any) — and JS evaluates the arguments either way).
5799
6351
  if (member === "is") {
5800
- if (call.arguments.length !== 2 || call.arguments.some((a) => ts.isSpreadElement(a))) {
5801
- lowerer.noLowering(`Object.is with ${call.arguments.length} arguments`, call, "exactly two arguments are the lowered form (JS treats a missing one as undefined — pass it explicitly)");
6352
+ if (call.arguments.nodes.length !== 2 ||
6353
+ call.arguments.nodes.some((a) => ts.isSpreadElement(a))) {
6354
+ lowerer.noLowering(`Object.is with ${call.arguments.nodes.length} arguments`, call, "exactly two arguments are the lowered form (JS treats a missing one as undefined — pass it explicitly)");
5802
6355
  }
5803
6356
  const loc = locOf(call);
5804
- const leftNode = call.arguments[0];
5805
- const rightNode = call.arguments[1];
6357
+ const leftNode = call.arguments.nodes[0];
6358
+ const rightNode = call.arguments.nodes[1];
5806
6359
  const left = lowerer.lowerExpr(leftNode);
5807
6360
  const right = lowerer.lowerExpr(rightNode);
5808
6361
  const lk = left.type.kind;
@@ -5908,18 +6461,18 @@ function lowerObjectStaticCall(lowerer, call, access) {
5908
6461
  // Native checked objects retain a live prototype and can install an
5909
6462
  // own-property descriptor table during creation.
5910
6463
  if (member === "create") {
5911
- if (call.arguments.some((a) => ts.isSpreadElement(a))) {
6464
+ if (call.arguments.nodes.some((a) => ts.isSpreadElement(a))) {
5912
6465
  lowerer.noLowering("Object.create with spread arguments", call);
5913
6466
  }
5914
- if (call.arguments.length < 1 || call.arguments.length > 2) {
5915
- lowerer.noLowering(`Object.create with ${call.arguments.length} arguments`, call);
6467
+ if (call.arguments.nodes.length < 1 || call.arguments.nodes.length > 2) {
6468
+ lowerer.noLowering(`Object.create with ${call.arguments.nodes.length} arguments`, call);
5916
6469
  }
5917
6470
  const loc = locOf(call);
5918
- let protoNode = call.arguments[0];
6471
+ let protoNode = call.arguments.nodes[0];
5919
6472
  while (ts.isParenthesizedExpression(protoNode))
5920
6473
  protoNode = protoNode.expression;
5921
6474
  const nullProto = protoNode.kind === ts.SyntaxKind.NullKeyword;
5922
- if (nullProto && call.arguments.length === 1) {
6475
+ if (nullProto && call.arguments.nodes.length === 1) {
5923
6476
  return { kind: "libCall", fn: "dyn.objCreateNullProto", args: [], type: DYN, loc };
5924
6477
  }
5925
6478
  let proto = nullProto
@@ -5944,9 +6497,9 @@ function lowerObjectStaticCall(lowerer, call, access) {
5944
6497
  canConvertToDyn(proto.type, (id) => lowerer.shapes.get(id), (id) => lowerer.unions.get(id)))
5945
6498
  proto = lowerer.coerceInto(protoNode, proto, DYN);
5946
6499
  if (proto.type.kind === "dyn") {
5947
- if (call.arguments.length === 1)
6500
+ if (call.arguments.nodes.length === 1)
5948
6501
  return { kind: "libCall", fn: "dyn.objCreate", args: [proto], type: DYN, loc };
5949
- const descriptors = lowerer.lowerExprExpecting(call.arguments[1], DYN);
6502
+ const descriptors = lowerer.lowerExprExpecting(call.arguments.nodes[1], DYN);
5950
6503
  if (descriptors.type.kind === "dyn")
5951
6504
  return {
5952
6505
  kind: "libCall",
@@ -5964,10 +6517,10 @@ function lowerObjectStaticCall(lowerer, call, access) {
5964
6517
  const prototype = lowerClassPrototypeAssign(lowerer, call);
5965
6518
  if (prototype)
5966
6519
  return prototype;
5967
- if (isJsSourceFile(call.getSourceFile()) &&
5968
- call.arguments.length > 0 &&
5969
- !call.arguments.some(ts.isSpreadElement)) {
5970
- const target = tryLowerExpression(lowerer, call.arguments[0]);
6520
+ if (isJsSourceFile(ts.getSourceFileOfNode(call)) &&
6521
+ call.arguments.nodes.length > 0 &&
6522
+ !call.arguments.nodes.some(ts.isSpreadElement)) {
6523
+ const target = tryLowerExpression(lowerer, call.arguments.nodes[0]);
5971
6524
  if (target &&
5972
6525
  ((target.type.kind === "func" && lowerer.dynConvertible(target.type)) ||
5973
6526
  (target.type.kind === "object" && lowerer.dynConvertible(target.type)))) {
@@ -5979,7 +6532,9 @@ function lowerObjectStaticCall(lowerer, call, access) {
5979
6532
  lowerer.coerceToExpected(target, DYN),
5980
6533
  {
5981
6534
  kind: "dynArrLit",
5982
- elems: call.arguments.slice(1).map((arg) => lowerer.lowerExprExpecting(arg, DYN)),
6535
+ elems: call.arguments.nodes
6536
+ .slice(1)
6537
+ .map((arg) => lowerer.lowerExprExpecting(arg, DYN)),
5983
6538
  type: DYN,
5984
6539
  loc,
5985
6540
  },
@@ -5989,6 +6544,9 @@ function lowerObjectStaticCall(lowerer, call, access) {
5989
6544
  };
5990
6545
  }
5991
6546
  }
6547
+ const onError = lowerObjectAssignOntoError(lowerer, call);
6548
+ if (onError)
6549
+ return onError;
5992
6550
  const hybrid = lowerObjectAssignHybrid(lowerer, call);
5993
6551
  if (hybrid)
5994
6552
  return hybrid;
@@ -5997,15 +6555,16 @@ function lowerObjectStaticCall(lowerer, call, access) {
5997
6555
  // exactly the source literal's properties, which IS the source
5998
6556
  // literal evaluated (both fresh, no alias can tell them apart).
5999
6557
  // Everything else keeps the spread hint (stdlibMemberFence).
6000
- if (call.arguments.length === 2 && !call.arguments.some((a) => ts.isSpreadElement(a))) {
6001
- let target = call.arguments[0];
6558
+ if (call.arguments.nodes.length === 2 &&
6559
+ !call.arguments.nodes.some((a) => ts.isSpreadElement(a))) {
6560
+ let target = call.arguments.nodes[0];
6002
6561
  while (ts.isParenthesizedExpression(target))
6003
6562
  target = target.expression;
6004
- let source = call.arguments[1];
6563
+ let source = call.arguments.nodes[1];
6005
6564
  while (ts.isParenthesizedExpression(source))
6006
6565
  source = source.expression;
6007
6566
  if (ts.isObjectLiteralExpression(target) &&
6008
- target.properties.length === 0 &&
6567
+ target.properties.nodes.length === 0 &&
6009
6568
  ts.isObjectLiteralExpression(source)) {
6010
6569
  return lowerer.lowerExpr(source);
6011
6570
  }
@@ -6025,22 +6584,40 @@ function lowerObjectStaticCall(lowerer, call, access) {
6025
6584
  // optional field must not erase the target's value — Node copies own
6026
6585
  // keys only — while an explicit `k: undefined` does). Everything
6027
6586
  // else keeps the spread hint.
6028
- if (call.arguments.length === 2 && !call.arguments.some((a) => ts.isSpreadElement(a))) {
6029
- const tProbe = tryLowerExpression(lowerer, call.arguments[0]);
6030
- const sProbe = tryLowerExpression(lowerer, call.arguments[1]);
6587
+ if (call.arguments.nodes.length === 2 &&
6588
+ !call.arguments.nodes.some((a) => ts.isSpreadElement(a))) {
6589
+ const tProbe = tryLowerExpression(lowerer, call.arguments.nodes[0]);
6590
+ const sProbe = tryLowerExpression(lowerer, call.arguments.nodes[1]);
6031
6591
  // CHECKED-DYNAMIC target and source (the JS file-scope
6032
6592
  // object-literal identity story): the runtime dyn copy — own
6033
6593
  // members of the source land on the target, which returns.
6034
6594
  if (tProbe?.type.kind === "dyn") {
6035
6595
  const loc = locOf(call);
6036
- const target = lowerer.lowerExpr(call.arguments[0]);
6037
- const rawSource = lowerer.lowerExpr(call.arguments[1]);
6038
- fenceSymbolFieldCopy(lowerer, call.arguments[1], rawSource.type);
6596
+ const target = lowerer.lowerExpr(call.arguments.nodes[0]);
6597
+ const rawSource = lowerer.lowerExpr(call.arguments.nodes[1]);
6598
+ fenceSymbolFieldCopy(lowerer, call.arguments.nodes[1], rawSource.type);
6039
6599
  const source = lowerer.coerceToExpected(rawSource, DYN);
6040
6600
  if (target.type.kind === "dyn" && source.type.kind === "dyn") {
6041
6601
  return { kind: "libCall", fn: "dyn.assign", args: [target, source], type: DYN, loc };
6042
6602
  }
6043
6603
  }
6604
+ // A CLASS-INSTANCE target and a plain record source whose fields are
6605
+ // all fields the class declares with the same types
6606
+ // (`Object.assign(this, { retries: 3 })`): the per-field write into
6607
+ // the instance, returning it — the instance mutates in place.
6608
+ if (tProbe?.type.kind === "object" && sProbe?.type.kind === "record") {
6609
+ const helper = classAssignPlan(lowerer, tProbe.type.className, sProbe.type.shapeId);
6610
+ if (helper) {
6611
+ const loc = locOf(call);
6612
+ const target = lowerer.lowerExpr(call.arguments.nodes[0]);
6613
+ const source = lowerer.lowerExpr(call.arguments.nodes[1]);
6614
+ if (target.type.kind === "object" && source.type.kind === "record") {
6615
+ const name = classAssignHelper(lowerer, target.type.className, source.type.shapeId, loc);
6616
+ if (name)
6617
+ return { kind: "call", callee: name, args: [target, source], type: target.type, loc };
6618
+ }
6619
+ }
6620
+ }
6044
6621
  if (tProbe?.type.kind === "record" && sProbe?.type.kind === "record") {
6045
6622
  const tShape = lowerer.shapes.get(tProbe.type.shapeId);
6046
6623
  const sShape = lowerer.shapes.get(sProbe.type.shapeId);
@@ -6054,12 +6631,15 @@ function lowerObjectStaticCall(lowerer, call, access) {
6054
6631
  !shapeHasAccessorSlots(sShape) &&
6055
6632
  sShape.fields.every((sf) => {
6056
6633
  const tf = tShape.fields.find((x) => x.name === sf.name);
6057
- return tf !== undefined && typeEquals(tf.type, sf.type);
6634
+ // A source value converts into a wider target field (`{ bail:
6635
+ // true }` into `bail?: boolean`).
6636
+ return (tf !== undefined &&
6637
+ (typeEquals(tf.type, sf.type) || lowerer.coercibleValue(sf.type, tf.type)));
6058
6638
  });
6059
6639
  if (ok) {
6060
6640
  const loc = locOf(call);
6061
- const target = lowerer.lowerExpr(call.arguments[0]);
6062
- const source = lowerer.lowerExpr(call.arguments[1]);
6641
+ const target = lowerer.lowerExpr(call.arguments.nodes[0]);
6642
+ const source = lowerer.lowerExpr(call.arguments.nodes[1]);
6063
6643
  if (target.type.kind === "record" && source.type.kind === "record") {
6064
6644
  const helper = recordAssignHelper(lowerer, target.type.shapeId, source.type.shapeId, loc);
6065
6645
  return { kind: "call", callee: helper, args: [target, source], type: target.type, loc };
@@ -6067,6 +6647,34 @@ function lowerObjectStaticCall(lowerer, call, access) {
6067
6647
  }
6068
6648
  }
6069
6649
  }
6650
+ // `throw Object.assign(record, { extra })`: an error-shaped record given
6651
+ // a member its type lacks, thrown at once. A fixed record cannot grow
6652
+ // the member, so the throw carries a checked-dynamic copy of the target
6653
+ // with the source's members added. The copy is unobservable: control
6654
+ // leaves with the throw, so nothing on that path reads the target again.
6655
+ {
6656
+ let parent = call.parent;
6657
+ while (parent && ts.isParenthesizedExpression(parent))
6658
+ parent = parent.parent;
6659
+ const argNodes = call.arguments.nodes;
6660
+ if (parent &&
6661
+ ts.isThrowStatement(parent) &&
6662
+ argNodes.length === 2 &&
6663
+ !argNodes.some((a) => ts.isSpreadElement(a))) {
6664
+ const tProbe = tryLowerExpression(lowerer, argNodes[0]);
6665
+ const sProbe = tryLowerExpression(lowerer, argNodes[1]);
6666
+ if (tProbe?.type.kind === "record" &&
6667
+ lowerer.dynConvertible(tProbe.type) &&
6668
+ sProbe &&
6669
+ (sProbe.type.kind === "dyn" || lowerer.dynConvertible(sProbe.type))) {
6670
+ const loc = locOf(call);
6671
+ const target = lowerer.coerceToExpected(lowerer.lowerExpr(argNodes[0]), DYN);
6672
+ const source = lowerer.coerceToExpected(lowerer.lowerExpr(argNodes[1]), DYN);
6673
+ if (target.type.kind === "dyn" && source.type.kind === "dyn")
6674
+ return { kind: "libCall", fn: "dyn.assign", args: [target, source], type: DYN, loc };
6675
+ }
6676
+ }
6677
+ }
6070
6678
  // `Object.assign(target, ...sources)` over a CHECKED-DYNAMIC target
6071
6679
  // — the n-ary/spread form (`Object.assign({}, ...plugins.map(p =>
6072
6680
  // p.options), coreOptions)`, support.js's option-table merge). The
@@ -6086,16 +6694,18 @@ function lowerObjectStaticCall(lowerer, call, access) {
6086
6694
  // unobservable), or a nullish unit (Node's ToObject TypeError
6087
6695
  // throws at the call, catchably); aliased record targets keep the
6088
6696
  // fence — their identity could not survive the conversion.
6089
- if (call.arguments.length >= 1 && !ts.isSpreadElement(call.arguments[0])) {
6090
- let targetNode = call.arguments[0];
6697
+ if (call.arguments.nodes.length >= 1 && !ts.isSpreadElement(call.arguments.nodes[0])) {
6698
+ let targetNode = call.arguments.nodes[0];
6091
6699
  while (ts.isParenthesizedExpression(targetNode))
6092
6700
  targetNode = targetNode.expression;
6093
6701
  const freshLiteralTarget = ts.isObjectLiteralExpression(targetNode);
6094
- const tProbe = freshLiteralTarget ? null : tryLowerExpression(lowerer, call.arguments[0]);
6702
+ const tProbe = freshLiteralTarget
6703
+ ? null
6704
+ : tryLowerExpression(lowerer, call.arguments.nodes[0]);
6095
6705
  const tKind = tProbe?.type.kind;
6096
6706
  if (freshLiteralTarget || tKind === "dyn" || tKind === "nullT" || tKind === "undefinedT") {
6097
6707
  const loc = locOf(call);
6098
- const target = lowerer.lowerExprExpecting(call.arguments[0], DYN);
6708
+ const target = lowerer.lowerExprExpecting(call.arguments.nodes[0], DYN);
6099
6709
  if (target.type.kind === "dyn") {
6100
6710
  const t = lowerer.declareHiddenLocal("%oat", DYN);
6101
6711
  const p = lowerer.declareHiddenLocal("%oap", DYN);
@@ -6115,7 +6725,7 @@ function lowerObjectStaticCall(lowerer, call, access) {
6115
6725
  // SINGLE LAST argument; every other spread position drives
6116
6726
  // the real iterator protocol, whose failure describes the
6117
6727
  // value — the two runtime variants, picked here by position.
6118
- const sources = call.arguments.slice(1);
6728
+ const sources = call.arguments.nodes.slice(1);
6119
6729
  const spreadCount = sources.filter((a) => ts.isSpreadElement(a)).length;
6120
6730
  let ok = true;
6121
6731
  for (let i = 0; i < sources.length; i++) {
@@ -6124,6 +6734,19 @@ function lowerObjectStaticCall(lowerer, call, access) {
6124
6734
  const srcNode = spread ? argNode.expression : argNode;
6125
6735
  const rawSource = lowerer.lowerExpr(srcNode);
6126
6736
  fenceSymbolFieldCopy(lowerer, srcNode, rawSource.type, spread);
6737
+ // A class instance copied into a fresh object
6738
+ // (`Object.assign({}, instance)`): the result is a plain
6739
+ // object holding the instance's own fields, never an
6740
+ // instance, so a result the checker types as the class has
6741
+ // no representation (the checked cast would throw).
6742
+ if (rawSource.type.kind === "object" &&
6743
+ freshLiteralTarget &&
6744
+ !ts.isExpressionStatement(call.parent)) {
6745
+ const resultT = lowerer.mapTypeOf(lowerer.typeOf(call));
6746
+ if (resultT !== null && resultT.kind === "object") {
6747
+ lowerer.unsupported("SC1090", srcNode, `Object.assign copying a '${lowerer.fmt(rawSource.type)}' instance into a fresh object typed as the class (the copy is a plain object holding the instance's own fields, not an instance — build the object literal from the fields you need)`);
6748
+ }
6749
+ }
6127
6750
  const src = lowerer.coerceToExpected(rawSource, DYN);
6128
6751
  if (src.type.kind !== "dyn") {
6129
6752
  ok = false;
@@ -6141,7 +6764,12 @@ function lowerObjectStaticCall(lowerer, call, access) {
6141
6764
  args: [
6142
6765
  pRef(),
6143
6766
  src,
6144
- { kind: "strLit", value: srcNode.getText(), type: STRING, loc: argLoc },
6767
+ {
6768
+ kind: "strLit",
6769
+ value: ts.getTextOfNode(srcNode),
6770
+ type: STRING,
6771
+ loc: argLoc,
6772
+ },
6145
6773
  ],
6146
6774
  type: VOID,
6147
6775
  loc: argLoc,
@@ -6183,24 +6811,29 @@ function lowerObjectStaticCall(lowerer, call, access) {
6183
6811
  }
6184
6812
  return null;
6185
6813
  }
6186
- if ((member === "defineProperty" && call.arguments.length === 3) ||
6187
- (member === "getOwnPropertyDescriptor" && call.arguments.length === 2)) {
6188
- if (call.arguments.some((a) => ts.isSpreadElement(a)))
6814
+ if ((member === "defineProperty" && call.arguments.nodes.length === 3) ||
6815
+ (member === "getOwnPropertyDescriptor" && call.arguments.nodes.length === 2)) {
6816
+ if (call.arguments.nodes.some((a) => ts.isSpreadElement(a)))
6189
6817
  return null;
6190
- let target = tryLowerExpression(lowerer, call.arguments[0]);
6191
- const targetNode = call.arguments[0];
6818
+ let target = tryLowerExpression(lowerer, call.arguments.nodes[0]);
6819
+ const targetNode = call.arguments.nodes[0];
6192
6820
  // The checker gives C.prototype the instance type, but its lowered
6193
6821
  // value is the shared prototype table, not an instance to unbox.
6194
6822
  const prototypeTarget = ts.isPropertyAccessExpression(targetNode) &&
6195
6823
  targetNode.name.text === "prototype" &&
6196
6824
  (exactClassOfReceiver(lowerer, targetNode.expression) !== null ||
6197
6825
  storedClassValueType(lowerer, targetNode.expression)?.kind === "classval");
6198
- const declaredTarget = target?.type.kind === "dyn" && !prototypeTarget && !isJsSourceFile(targetNode.getSourceFile())
6826
+ const declaredTarget = target?.type.kind === "dyn" &&
6827
+ !prototypeTarget &&
6828
+ !isJsSourceFile(ts.getSourceFileOfNode(targetNode))
6199
6829
  ? lowerer.mapTypeOf(lowerer.typeOf(targetNode))
6200
6830
  : null;
6201
6831
  if (target && declaredTarget && isDynTypedRefType(declaredTarget))
6202
6832
  target = lowerer.coerceToExpected(target, declaredTarget);
6203
6833
  if (target && member === "defineProperty") {
6834
+ const field = lowerClassFieldDefine(lowerer, call, target);
6835
+ if (field)
6836
+ return field;
6204
6837
  const native = lowerClassDataDescriptor(lowerer, call, member, target);
6205
6838
  if (native)
6206
6839
  return native;
@@ -6212,7 +6845,7 @@ function lowerObjectStaticCall(lowerer, call, access) {
6212
6845
  target = lowerer.coerceToExpected(target, DYN);
6213
6846
  }
6214
6847
  // Error instances share a live property table with their checked view.
6215
- const keyNode = call.arguments[1];
6848
+ const keyNode = call.arguments.nodes[1];
6216
6849
  if (target?.type.kind === "object" &&
6217
6850
  target.type.className !== "%DOMException" &&
6218
6851
  lowerer.errorHierarchyClassOf(target.type.className) &&
@@ -6221,12 +6854,12 @@ function lowerObjectStaticCall(lowerer, call, access) {
6221
6854
  target = lowerer.coerceToExpected(target, DYN);
6222
6855
  }
6223
6856
  if (target?.type.kind === "func" && lowerer.dynConvertible(target.type)) {
6224
- const fnName = jsFuncNameOf(call.arguments[0], lowerer);
6857
+ const fnName = jsFuncNameOf(call.arguments.nodes[0], lowerer);
6225
6858
  target = {
6226
6859
  kind: "dynFrom",
6227
6860
  value: target,
6228
6861
  type: DYN,
6229
- loc: locOf(call.arguments[0]),
6862
+ loc: locOf(call.arguments.nodes[0]),
6230
6863
  ...(fnName !== null ? { fnName } : {}),
6231
6864
  };
6232
6865
  }
@@ -6236,8 +6869,8 @@ function lowerObjectStaticCall(lowerer, call, access) {
6236
6869
  if (!target || (target.type.kind !== "dyn" && !isUnitType(target.type) && !descriptorPrimitive))
6237
6870
  return null;
6238
6871
  if (target.type.kind !== "dyn")
6239
- target = { kind: "dynFrom", value: target, type: DYN, loc: locOf(call.arguments[0]) };
6240
- const key = lowerer.lowerExprExpecting(call.arguments[1], DYN);
6872
+ target = { kind: "dynFrom", value: target, type: DYN, loc: locOf(call.arguments.nodes[0]) };
6873
+ const key = lowerer.lowerExprExpecting(call.arguments.nodes[1], DYN);
6241
6874
  if (key.type.kind !== "dyn")
6242
6875
  return null;
6243
6876
  if (member === "getOwnPropertyDescriptor") {
@@ -6249,7 +6882,7 @@ function lowerObjectStaticCall(lowerer, call, access) {
6249
6882
  loc: locOf(call),
6250
6883
  };
6251
6884
  }
6252
- const descriptor = lowerer.lowerExprExpecting(call.arguments[2], DYN);
6885
+ const descriptor = lowerer.lowerExprExpecting(call.arguments.nodes[2], DYN);
6253
6886
  if (descriptor.type.kind !== "dyn")
6254
6887
  return null;
6255
6888
  return {
@@ -6268,12 +6901,12 @@ function lowerObjectStaticCall(lowerer, call, access) {
6268
6901
  // The result is the target, like JS. Typed targets keep the fence:
6269
6902
  // static shapes have no property table to extend.
6270
6903
  if (member === "defineProperties" &&
6271
- call.arguments.length === 2 &&
6272
- !call.arguments.some((a) => ts.isSpreadElement(a))) {
6904
+ call.arguments.nodes.length === 2 &&
6905
+ !call.arguments.nodes.some((a) => ts.isSpreadElement(a))) {
6273
6906
  const prototype = lowerClassPrototypeDescriptors(lowerer, call, member);
6274
6907
  if (prototype)
6275
6908
  return prototype;
6276
- let target = tryLowerExpression(lowerer, call.arguments[0]);
6909
+ let target = tryLowerExpression(lowerer, call.arguments.nodes[0]);
6277
6910
  if (target) {
6278
6911
  const native = lowerClassDataDescriptor(lowerer, call, member, target);
6279
6912
  if (native)
@@ -6286,20 +6919,20 @@ function lowerObjectStaticCall(lowerer, call, access) {
6286
6919
  if (target &&
6287
6920
  target.type.kind === "func" &&
6288
6921
  canBoxFuncIntoDyn(target.type, (id) => lowerer.shapes.get(id), (id) => lowerer.unions.get(id))) {
6289
- const fnName = jsFuncNameOf(call.arguments[0], lowerer);
6922
+ const fnName = jsFuncNameOf(call.arguments.nodes[0], lowerer);
6290
6923
  target = {
6291
6924
  kind: "dynFrom",
6292
6925
  value: target,
6293
6926
  type: DYN,
6294
- loc: locOf(call.arguments[0]),
6927
+ loc: locOf(call.arguments.nodes[0]),
6295
6928
  ...(fnName !== null ? { fnName } : {}),
6296
6929
  };
6297
6930
  }
6298
6931
  if (target && isUnitType(target.type)) {
6299
- target = { kind: "dynFrom", value: target, type: DYN, loc: locOf(call.arguments[0]) };
6932
+ target = { kind: "dynFrom", value: target, type: DYN, loc: locOf(call.arguments.nodes[0]) };
6300
6933
  }
6301
6934
  if (target?.type.kind === "dyn") {
6302
- const descs = lowerer.lowerExprExpecting(call.arguments[1], DYN);
6935
+ const descs = lowerer.lowerExprExpecting(call.arguments.nodes[1], DYN);
6303
6936
  if (descs.type.kind === "dyn") {
6304
6937
  return {
6305
6938
  kind: "libCall",
@@ -6313,9 +6946,9 @@ function lowerObjectStaticCall(lowerer, call, access) {
6313
6946
  return null;
6314
6947
  }
6315
6948
  if (["preventExtensions", "isExtensible", "seal", "isSealed"].includes(member) &&
6316
- call.arguments.length === 1 &&
6317
- !ts.isSpreadElement(call.arguments[0])) {
6318
- const value = lowerer.lowerExpr(call.arguments[0]);
6949
+ call.arguments.nodes.length === 1 &&
6950
+ !ts.isSpreadElement(call.arguments.nodes[0])) {
6951
+ const value = lowerer.lowerExpr(call.arguments.nodes[0]);
6319
6952
  if (value.type.kind === "string" ||
6320
6953
  value.type.kind === "f64" ||
6321
6954
  value.type.kind === "bool" ||
@@ -6335,6 +6968,21 @@ function lowerObjectStaticCall(lowerer, call, access) {
6335
6968
  loc,
6336
6969
  };
6337
6970
  }
6971
+ if (member === "preventExtensions" || member === "seal") {
6972
+ const integrity = lowerClassIntegrity(lowerer, call, member, value);
6973
+ if (integrity)
6974
+ return integrity;
6975
+ }
6976
+ else if (isDynTypedRefType(value.type)) {
6977
+ // The instance's checked view carries its integrity state.
6978
+ return {
6979
+ kind: "libCall",
6980
+ fn: member === "isSealed" ? "dyn.isSealed" : "dyn.isExtensible",
6981
+ args: [lowerer.coerceToExpected(value, DYN)],
6982
+ type: BOOL,
6983
+ loc: locOf(call),
6984
+ };
6985
+ }
6338
6986
  if (value.type.kind === "dyn") {
6339
6987
  const operation = {
6340
6988
  preventExtensions: "dyn.preventExtensions",
@@ -6358,19 +7006,19 @@ function lowerObjectStaticCall(lowerer, call, access) {
6358
7006
  // other reference can write). Primitives pass through per ES2015.
6359
7007
  // Aliased objects keep a fence: a later write through the original
6360
7008
  // reference would need the runtime frozen bit (strict mode throws).
6361
- if (member === "isFrozen" && call.arguments.length === 1) {
6362
- const value = lowerer.lowerExprExpecting(call.arguments[0], DYN);
7009
+ if (member === "isFrozen" && call.arguments.nodes.length === 1) {
7010
+ const value = lowerer.lowerExprExpecting(call.arguments.nodes[0], DYN);
6363
7011
  return { kind: "libCall", fn: "dyn.isFrozen", args: [value], type: BOOL, loc: locOf(call) };
6364
7012
  }
6365
7013
  if (member === "freeze") {
6366
- if (call.arguments.length !== 1 || ts.isSpreadElement(call.arguments[0])) {
6367
- lowerer.noLowering(`Object.freeze with ${call.arguments.length} arguments`, call);
7014
+ if (call.arguments.nodes.length !== 1 || ts.isSpreadElement(call.arguments.nodes[0])) {
7015
+ lowerer.noLowering(`Object.freeze with ${call.arguments.nodes.length} arguments`, call);
6368
7016
  }
6369
- const argNode = call.arguments[0];
7017
+ const argNode = call.arguments.nodes[0];
6370
7018
  let inner = argNode;
6371
7019
  while (ts.isParenthesizedExpression(inner) || ts.isAsExpression(inner))
6372
7020
  inner = inner.expression;
6373
- const value = isJsSourceFile(call.getSourceFile()) &&
7021
+ const value = isJsSourceFile(ts.getSourceFileOfNode(call)) &&
6374
7022
  (ts.isObjectLiteralExpression(inner) || ts.isArrayLiteralExpression(inner))
6375
7023
  ? lowerer.lowerExprExpecting(argNode, DYN)
6376
7024
  : lowerer.lowerExpr(argNode);
@@ -6397,6 +7045,9 @@ function lowerObjectStaticCall(lowerer, call, access) {
6397
7045
  arm.kind === "string" ||
6398
7046
  arm.kind === "symbol"))
6399
7047
  return value;
7048
+ const integrity = lowerClassIntegrity(lowerer, call, "freeze", value);
7049
+ if (integrity)
7050
+ return integrity;
6400
7051
  lowerer.noLowering("Object.freeze of a possibly-aliased value", call, "freeze of a FRESH object/array literal (and of primitives) compiles — frozen-ness is unobservable there; an aliased target's later writes would need the runtime frozen bit");
6401
7052
  }
6402
7053
  // `Object.hasOwn(r, k)` over a RECORD receiver: a record's own-key set
@@ -6408,10 +7059,10 @@ function lowerObjectStaticCall(lowerer, call, access) {
6408
7059
  // records additionally probe the overflow map; non-record receivers
6409
7060
  // do too.
6410
7061
  if (member === "hasOwn" &&
6411
- call.arguments.length === 2 &&
6412
- !call.arguments.some((a) => ts.isSpreadElement(a))) {
6413
- const recvNode = call.arguments[0];
6414
- const keyNode = call.arguments[1];
7062
+ call.arguments.nodes.length === 2 &&
7063
+ !call.arguments.nodes.some((a) => ts.isSpreadElement(a))) {
7064
+ const recvNode = call.arguments.nodes[0];
7065
+ const keyNode = call.arguments.nodes[1];
6415
7066
  const probed = tryLowerExpression(lowerer, recvNode);
6416
7067
  const arrayKey = probed?.type.kind === "array" ? lowerer.lowerExpr(keyNode) : null;
6417
7068
  if (probed?.type.kind === "array" && arrayKey?.type.kind === "f64") {
@@ -6470,9 +7121,9 @@ function lowerObjectStaticCall(lowerer, call, access) {
6470
7121
  }
6471
7122
  if (member !== "keys" && member !== "values" && member !== "entries")
6472
7123
  return null;
6473
- if (call.arguments.length !== 1 || ts.isSpreadElement(call.arguments[0]))
7124
+ if (call.arguments.nodes.length !== 1 || ts.isSpreadElement(call.arguments.nodes[0]))
6474
7125
  return null;
6475
- const argNode = call.arguments[0];
7126
+ const argNode = call.arguments.nodes[0];
6476
7127
  // util.types and node:util/types list Node's pinned key census
6477
7128
  // (UTIL_TYPES_KEYS): the object's own keys in Node's order, or the module
6478
7129
  // namespace's export names sorted with "default". values/entries would
@@ -6487,7 +7138,7 @@ function lowerObjectStaticCall(lowerer, call, access) {
6487
7138
  ? lowerer.checker.getSymbolAtLocation(argNode)
6488
7139
  : undefined;
6489
7140
  const namespace = symbol
6490
- ? lowerer.checker.declarationsOf(symbol).some((decl) => ts.isNamespaceImport(decl))
7141
+ ? symbol.declarations.some((decl) => ts.isNamespaceImport(decl))
6491
7142
  : false;
6492
7143
  const names = namespace ? [...UTIL_TYPES_KEYS, "default"].sort() : UTIL_TYPES_KEYS;
6493
7144
  const loc = locOf(call);
@@ -6562,7 +7213,7 @@ function lowerObjectStaticCall(lowerer, call, access) {
6562
7213
  probed.type.kind === "f64" ||
6563
7214
  probed.type.kind === "bool");
6564
7215
  const isJsUnion = probed?.type.kind === "union" &&
6565
- isJsSourceFile(call.getSourceFile()) &&
7216
+ isJsSourceFile(ts.getSourceFileOfNode(call)) &&
6566
7217
  lowerer.dynConvertible(probed.type);
6567
7218
  if (isDyn ||
6568
7219
  isPrimitive ||
@@ -6581,7 +7232,7 @@ function lowerObjectStaticCall(lowerer, call, access) {
6581
7232
  // entries as a native [string, any][]: the checker keeps every later
6582
7233
  // write to the arrays well typed. JavaScript may store anything into
6583
7234
  // them, so it keeps the checked-dynamic arrays.
6584
- const resultT = member !== "values" && !isJsSourceFile(call.getSourceFile())
7235
+ const resultT = member !== "values" && !isJsSourceFile(ts.getSourceFileOfNode(call))
6585
7236
  ? lowerer.mapTypeOf(lowerer.typeOf(call))
6586
7237
  : null;
6587
7238
  if (member === "keys" && resultT?.kind === "array" && resultT.elem.kind === "string")
@@ -6604,7 +7255,9 @@ function lowerObjectStaticCall(lowerer, call, access) {
6604
7255
  // program only iterates or indexes the result, or passes it to a
6605
7256
  // read-only array method, a native vector of the checked values skips
6606
7257
  // building that array and, for for-of, the iterator protocol.
6607
- if (member === "values" && !isJsSourceFile(call.getSourceFile()) && consumesValueList(call))
7258
+ if (member === "values" &&
7259
+ !isJsSourceFile(ts.getSourceFileOfNode(call)) &&
7260
+ consumesValueList(call))
6608
7261
  return {
6609
7262
  kind: "libCall",
6610
7263
  fn: "dyn.objValueList",
@@ -6639,7 +7292,7 @@ function lowerObjectStaticCall(lowerer, call, access) {
6639
7292
  const enumerationType = lowerer.mapTypeOf(lowerer.typeOf(call));
6640
7293
  if ((member === "values" || member === "entries") &&
6641
7294
  (enumerationType?.kind === "dyn" ||
6642
- (enumerationType === null && isJsSourceFile(call.getSourceFile())))) {
7295
+ (enumerationType === null && isJsSourceFile(ts.getSourceFileOfNode(call))))) {
6643
7296
  let receiver = lowerer.coerceToExpected(lowerer.lowerExpr(argNode), DYN);
6644
7297
  if (receiver.type.kind !== "dyn")
6645
7298
  lowerer.badType(argNode, lowerer.typeOf(argNode));
@@ -6707,6 +7360,7 @@ function lowerObjectStaticCall(lowerer, call, access) {
6707
7360
  lowerer.badType(call, lowerer.typeOf(call));
6708
7361
  valueT = tupleShape.fields.find((f) => f.name === "1").type;
6709
7362
  }
7363
+ lowerer.keyOrder.observe(argIr);
6710
7364
  const key = `obj.${member}:${argIr.shapeId}:${typeKey(resultT)}`;
6711
7365
  let helper = lowerer.arrHofHelpers.get(key);
6712
7366
  if (!helper) {
@@ -7011,19 +7665,19 @@ function lowerObjectAssignHybrid(lowerer, call) {
7011
7665
  const callField = shape?.fields.find((f) => f.name === "%call");
7012
7666
  if (!shape || !callField || callField.type.kind !== "func")
7013
7667
  return null;
7014
- if (call.arguments.length < 2 || call.arguments.some((a) => ts.isSpreadElement(a)))
7668
+ if (call.arguments.nodes.length < 2 || call.arguments.nodes.some((a) => ts.isSpreadElement(a)))
7015
7669
  return null;
7016
7670
  const loc = locOf(call);
7017
7671
  const values = new Map();
7018
- values.set("%call", lowerer.lowerExprExpecting(call.arguments[0], callField.type));
7019
- for (const argNode of call.arguments.slice(1)) {
7672
+ values.set("%call", lowerer.lowerExprExpecting(call.arguments.nodes[0], callField.type));
7673
+ for (const argNode of call.arguments.nodes.slice(1)) {
7020
7674
  let src = argNode;
7021
7675
  while (ts.isParenthesizedExpression(src) || ts.isAsExpression(src) || ts.isTypeAssertion(src))
7022
7676
  src = src.expression;
7023
7677
  if (!ts.isObjectLiteralExpression(src)) {
7024
7678
  lowerer.unsupported("SC1090", argNode, "Object.assign sources other than plain object literals when building a function-with-properties value");
7025
7679
  }
7026
- for (const prop of src.properties) {
7680
+ for (const prop of src.properties.nodes) {
7027
7681
  const nameOk = (ts.isPropertyAssignment(prop) || ts.isShorthandPropertyAssignment(prop)) &&
7028
7682
  (ts.isIdentifier(prop.name) || ts.isStringLiteral(prop.name));
7029
7683
  if (!nameOk) {
@@ -7055,6 +7709,25 @@ function lowerObjectAssignHybrid(lowerer, call) {
7055
7709
  }
7056
7710
  return { kind: "recordLit", fields, type: mapped, loc };
7057
7711
  }
7712
+ /** The accessed member is an overload set (isOverloadedCallableMemberType),
7713
+ * also under an optional chain whose access still spells `| undefined`. */
7714
+ function isOverloadedMemberAccess(lowerer, access) {
7715
+ return isOverloadedCallableMemberType(lowerer.checker.getNonNullableType(lowerer.typeOf(access)), lowerer.checker);
7716
+ }
7717
+ /** The result type of the overload a call through an overloaded member
7718
+ * resolved to: the erased slot's result converts to it. A non-generic
7719
+ * overload answers through its declaration, because the resolved signature
7720
+ * of an optional-chain call (`api?.m(x)`) also carries the chain's
7721
+ * undefined; a generic one answers through its instantiation. */
7722
+ function resolvedOverloadResultType(lowerer, call) {
7723
+ const { checker } = lowerer;
7724
+ const signature = checker.getResolvedSignature(call);
7725
+ const decl = signature ? signature.declaration : undefined;
7726
+ const declared = decl ? checker.getSignatureFromDeclaration(decl) : undefined;
7727
+ const source = declared && declared.getTypeParameters().length === 0 ? declared : signature;
7728
+ const result = source ? lowerer.mapTypeOf(checker.getReturnTypeOfSignature(source)) : null;
7729
+ return result ?? lowerer.irTypeOf(call);
7730
+ }
7058
7731
  export function lowerRecordFieldCall(lowerer, call, access) {
7059
7732
  if (lowerer.chainBlocked(call))
7060
7733
  return null;
@@ -7080,11 +7753,22 @@ export function lowerRecordFieldCall(lowerer, call, access) {
7080
7753
  if (callee?.type.kind !== "func")
7081
7754
  return null;
7082
7755
  const args = completeFuncValueArgs(lowerer, call, callee.type, locOf(call));
7083
- return { kind: "callValue", callee, args, type: callee.type.ret, loc: locOf(call) };
7756
+ const value = {
7757
+ kind: "callValue",
7758
+ callee,
7759
+ args,
7760
+ type: callee.type.ret,
7761
+ loc: locOf(call),
7762
+ };
7763
+ // An overloaded member's erased result converts to the resolved
7764
+ // overload's type, as on a single record receiver below.
7765
+ return isOverloadedMemberAccess(lowerer, access)
7766
+ ? lowerer.coerceInto(call, value, resolvedOverloadResultType(lowerer, call))
7767
+ : value;
7084
7768
  }
7085
7769
  const target = lowerer.fieldTarget(access);
7086
7770
  const loc = locOf(call);
7087
- const receiverLocal = target && isJsSourceFile(call.getSourceFile())
7771
+ const receiverLocal = target && isJsSourceFile(ts.getSourceFileOfNode(call))
7088
7772
  ? lowerer.declareHiddenLocal("%callReceiver", target.obj.type)
7089
7773
  : null;
7090
7774
  const init = target && receiverLocal
@@ -7105,10 +7789,10 @@ export function lowerRecordFieldCall(lowerer, call, access) {
7105
7789
  // TypeScript reaches here for callable library types that are checked
7106
7790
  // values (util.DebugLogger).
7107
7791
  if (callee.type.kind === "dyn" &&
7108
- (isJsSourceFile(call.getSourceFile()) ||
7792
+ (isJsSourceFile(ts.getSourceFileOfNode(call)) ||
7109
7793
  lowerer.checker.getCallSignatures(lowerer.typeOf(access)).length > 0)) {
7110
7794
  const receiver = target && receiverLocal ? lowerer.coerceToExpected(target.obj, DYN) : undefined;
7111
- const spread = call.arguments.some(ts.isSpreadElement)
7795
+ const spread = call.arguments.nodes.some(ts.isSpreadElement)
7112
7796
  ? lowerSpreadArgsCall(lowerer, call, callee, loc)
7113
7797
  : null;
7114
7798
  if (spread && spread.kind !== "dynCall")
@@ -7121,24 +7805,48 @@ export function lowerRecordFieldCall(lowerer, call, access) {
7121
7805
  kind: "dynCall",
7122
7806
  callee,
7123
7807
  ...(receiver ? { receiver } : {}),
7124
- calleeName: access.getText(),
7125
- args: call.arguments.map((arg) => lowerer.lowerExprExpecting(arg, DYN)),
7808
+ calleeName: ts.getTextOfNode(access),
7809
+ args: call.arguments.nodes.map((arg) => lowerer.lowerExprExpecting(arg, DYN)),
7126
7810
  type: DYN,
7127
7811
  loc,
7128
7812
  };
7129
7813
  return init ? { kind: "seqExpr", stmts: [init], result, type: result.type, loc } : result;
7130
7814
  }
7815
+ // An optional callback field the checker narrowed at this call
7816
+ // (`o.cb ? o.cb(x) : …`, `if (o.cb) o.cb(x)`): extract the func arm.
7817
+ if (callee.type.kind === "union")
7818
+ callee = lowerer.maybeNarrow(callee, access);
7131
7819
  if (callee.type.kind !== "func")
7132
7820
  lowerer.badType(access, lowerer.typeOf(access));
7821
+ // JavaScript passes the record as `this`. A record with no dynamic form
7822
+ // cannot be that receiver; the library's own function fields (the
7823
+ // resolve/reject of Promise.withResolvers) never read it.
7824
+ let receiver;
7825
+ if (target && receiverLocal) {
7826
+ if (lowerer.dynConvertible(target.obj.type)) {
7827
+ receiver = lowerer.coerceToExpected(target.obj, DYN);
7828
+ }
7829
+ else if (!lowerer.isStdlibMember(access)) {
7830
+ lowerer.unsupported("SC1090", call, `calling a function field of a '${lowerer.fmt(target.obj.type)}' record (the record has no dynamic form to pass as 'this')`);
7831
+ }
7832
+ }
7133
7833
  const args = completeFuncValueArgs(lowerer, call, callee.type, locOf(call));
7134
- const result = {
7834
+ let result = {
7135
7835
  kind: "callValue",
7136
7836
  callee,
7137
- ...(target && receiverLocal ? { receiver: lowerer.coerceToExpected(target.obj, DYN) } : {}),
7837
+ ...(receiver ? { receiver } : {}),
7138
7838
  args,
7139
7839
  type: callee.type.ret,
7140
7840
  loc,
7141
7841
  };
7842
+ // A generic member's field holds its erased instance, and an overloaded
7843
+ // member's field its erased function (the overloads joined): the result
7844
+ // converts to this call's instantiated or resolved return type.
7845
+ const memberType = lowerer.typeOf(access);
7846
+ if (isGenericCallableMemberType(memberType, lowerer.checker))
7847
+ result = lowerer.coerceInto(call, result, lowerer.irTypeOf(call));
7848
+ else if (isOverloadedMemberAccess(lowerer, access))
7849
+ result = lowerer.coerceInto(call, result, resolvedOverloadResultType(lowerer, call));
7142
7850
  return init ? { kind: "seqExpr", stmts: [init], result, type: result.type, loc } : result;
7143
7851
  }
7144
7852
  /** `o.m(args)` where `m` is an object-literal GENERIC method (own type
@@ -7164,12 +7872,12 @@ function lowerUrlStaticCall(lowerer, call, callee) {
7164
7872
  if (!ts.isIdentifier(callee.expression))
7165
7873
  return null;
7166
7874
  const sym = lowerer.resolveValueSymbol(callee.expression);
7167
- if (!sym || !lowerer.isStdlibSymbol(sym) || sym.name !== "URL")
7875
+ if (!sym || !lowerer.isStdlibSymbol(sym) || ts.symbolName(sym) !== "URL")
7168
7876
  return null;
7169
7877
  if (callee.name.text === "canParse" || callee.name.text === "parse") {
7170
7878
  return lowerUrlFactory(lowerer, call, callee.name.text);
7171
7879
  }
7172
- if (callee.name.text !== "revokeObjectURL" || call.arguments.length !== 0)
7880
+ if (callee.name.text !== "revokeObjectURL" || call.arguments.nodes.length !== 0)
7173
7881
  return null;
7174
7882
  return nodeThrowExpr(1, "ERR_MISSING_ARGS", 'The "url" argument must be specified', VOID, locOf(call));
7175
7883
  }
@@ -7191,7 +7899,7 @@ function arrowSignatureOf(lowerer, node) {
7191
7899
  const signatures = lowerer.checker.getCallSignatures(lowerer.typeOf(node));
7192
7900
  if (signatures.length !== 1)
7193
7901
  return null;
7194
- const declaration = lowerer.checker.signatureDeclaration(signatures[0]);
7902
+ const declaration = signatures[0].declaration;
7195
7903
  return declaration !== undefined && ts.isArrowFunction(declaration) ? signatures[0] : null;
7196
7904
  }
7197
7905
  /** An inline arrow has lexical `this` and no observable own properties
@@ -7200,8 +7908,8 @@ function arrowSignatureOf(lowerer, node) {
7200
7908
  * other receivers and rest/preset-argument forms on the named fence. */
7201
7909
  function lowerInlineArrowBind(lowerer, call, access) {
7202
7910
  if (access.name.text !== "bind" ||
7203
- call.arguments.length > 1 ||
7204
- call.arguments.some(ts.isSpreadElement))
7911
+ call.arguments.nodes.length > 1 ||
7912
+ call.arguments.nodes.some(ts.isSpreadElement))
7205
7913
  return null;
7206
7914
  let arrow = access.expression;
7207
7915
  while (ts.isParenthesizedExpression(arrow))
@@ -7215,8 +7923,8 @@ function lowerInlineArrowBind(lowerer, call, access) {
7215
7923
  return null;
7216
7924
  const type = callee.type;
7217
7925
  const loc = locOf(call);
7218
- const firstDefault = arrow.parameters.findIndex((p) => p.initializer !== undefined);
7219
- const length = firstDefault < 0 ? arrow.parameters.length : firstDefault;
7926
+ const firstDefault = arrow.parameters.nodes.findIndex((p) => p.initializer !== undefined);
7927
+ const length = firstDefault < 0 ? arrow.parameters.nodes.length : firstDefault;
7220
7928
  const key = `arrow.bind:${typeKey(type)}:${length}`;
7221
7929
  const existing = lowerer.arrHofHelpers.get(key);
7222
7930
  const name = existing ?? `%arrow.bind.${lowerer.arrHofHelpers.size}`;
@@ -7309,8 +8017,8 @@ function lowerInlineArrowBind(lowerer, call, access) {
7309
8017
  const stmts = [{ kind: "varDecl", localId: saved.id, init: callee, loc }];
7310
8018
  // The receiver is ignored by the arrow, but its effects and throws
7311
8019
  // happen after creating the arrow and before returning the bound value.
7312
- if (call.arguments[0])
7313
- stmts.push(lowerer.lowerExprStatement(call.arguments[0]));
8020
+ if (call.arguments.nodes[0])
8021
+ stmts.push(lowerer.lowerExprStatement(call.arguments.nodes[0]));
7314
8022
  const result = {
7315
8023
  kind: "call",
7316
8024
  callee: name,
@@ -7325,8 +8033,8 @@ function lowerInlineArrowBind(lowerer, call, access) {
7325
8033
  * parameters validate from the dynamic array in order. */
7326
8034
  function lowerArrowFunctionApply(lowerer, call, access) {
7327
8035
  if (access.name.text !== "apply" ||
7328
- call.arguments.length !== 2 ||
7329
- call.arguments.some(ts.isSpreadElement) ||
8036
+ call.arguments.nodes.length !== 2 ||
8037
+ call.arguments.nodes.some(ts.isSpreadElement) ||
7330
8038
  arrowSignatureOf(lowerer, access.expression) === null) {
7331
8039
  return null;
7332
8040
  }
@@ -7336,7 +8044,7 @@ function lowerArrowFunctionApply(lowerer, call, access) {
7336
8044
  if (!callee.type.params.every((param) => canDynCheckTo(param, (id) => lowerer.shapes.get(id), (id) => lowerer.unions.get(id)))) {
7337
8045
  return null;
7338
8046
  }
7339
- const argsList = lowerer.lowerExpr(call.arguments[1]);
8047
+ const argsList = lowerer.lowerExpr(call.arguments.nodes[1]);
7340
8048
  if (argsList.type.kind !== "dyn")
7341
8049
  return null;
7342
8050
  const loc = locOf(call);
@@ -7344,7 +8052,7 @@ function lowerArrowFunctionApply(lowerer, call, access) {
7344
8052
  const savedArgs = lowerer.declareHiddenLocal("%applyArgs", DYN);
7345
8053
  const stmts = [
7346
8054
  { kind: "varDecl", localId: savedCallee.id, init: callee, loc },
7347
- { kind: "exprStmt", expr: lowerer.lowerExpr(call.arguments[0]), loc },
8055
+ { kind: "exprStmt", expr: lowerer.lowerExpr(call.arguments.nodes[0]), loc },
7348
8056
  { kind: "varDecl", localId: savedArgs.id, init: argsList, loc },
7349
8057
  ];
7350
8058
  const args = callee.type.params.map((param, index) => {
@@ -7355,7 +8063,7 @@ function lowerArrowFunctionApply(lowerer, call, access) {
7355
8063
  type: DYN,
7356
8064
  loc,
7357
8065
  };
7358
- return lowerer.coerceInto(call.arguments[1], read, param);
8066
+ return lowerer.coerceInto(call.arguments.nodes[1], read, param);
7359
8067
  });
7360
8068
  const invoked = {
7361
8069
  kind: "callValue",
@@ -7391,7 +8099,7 @@ function lowerObjLitGenericMethodCall(lowerer, call, access) {
7391
8099
  lowerer.mapTypeOf(lowerer.typeOf(access.expression.expression))?.kind === "searchParams" &&
7392
8100
  SP_BRAND_METHODS.has(access.expression.name.text) &&
7393
8101
  lowerer.isStdlibMember(access.expression)) {
7394
- const thisArg = call.arguments[0];
8102
+ const thisArg = call.arguments.nodes[0];
7395
8103
  const thisT = thisArg
7396
8104
  ? lowerer.mapTypeOf(lowerer.typeOf(thisArg))
7397
8105
  : { kind: "undefinedT" };
@@ -7411,7 +8119,7 @@ function lowerObjLitGenericMethodCall(lowerer, call, access) {
7411
8119
  const propSym = lowerer.checker.getPropertyOfType(recvT, name);
7412
8120
  if (!propSym)
7413
8121
  return null;
7414
- const propertyDecl = lowerer.checker.valueDeclarationOf(propSym);
8122
+ const propertyDecl = propSym.valueDeclaration;
7415
8123
  if (propertyDecl &&
7416
8124
  ts.isShorthandPropertyAssignment(propertyDecl) &&
7417
8125
  ts.isIdentifier(propertyDecl.name) &&
@@ -7431,9 +8139,7 @@ function lowerObjLitGenericMethodCall(lowerer, call, access) {
7431
8139
  // CLASS members belong to the class path (lowerClassGenericMethodCall
7432
8140
  // claimed compilable ones; a class that failed collection keeps its
7433
8141
  // own diagnostics and the generic method-call fence downstream).
7434
- if (lowerer.checker
7435
- .declarationsOf(propSym)
7436
- .some((d) => d.parent !== undefined &&
8142
+ if (propSym.declarations.some((d) => d.parent !== undefined &&
7437
8143
  (ts.isClassDeclaration(d.parent) || ts.isClassExpression(d.parent)))) {
7438
8144
  return null;
7439
8145
  }
@@ -7470,19 +8176,19 @@ function lowerObjLitGenericMethodCall(lowerer, call, access) {
7470
8176
  const value = tryLowerExpression(lowerer, access.expression);
7471
8177
  if (value?.type.kind === "func" &&
7472
8178
  lowerer.dynConvertible(value.type) &&
7473
- !call.arguments.some(ts.isSpreadElement)) {
8179
+ !call.arguments.nodes.some(ts.isSpreadElement)) {
7474
8180
  const loc = locOf(call);
7475
8181
  return {
7476
8182
  kind: "dynInvoke",
7477
8183
  recv: { kind: "dynFrom", value, type: DYN, loc },
7478
8184
  method: name,
7479
- calleeName: access.getText(),
7480
- args: call.arguments.map((arg) => lowerer.lowerExprExpecting(arg, DYN)),
8185
+ calleeName: ts.getTextOfNode(access),
8186
+ args: call.arguments.nodes.map((arg) => lowerer.lowerExprExpecting(arg, DYN)),
7481
8187
  type: DYN,
7482
8188
  loc,
7483
8189
  };
7484
8190
  }
7485
- lowerer.unsupported("SC1090", call, `Function.prototype.${name} on a function whose signature cannot cross the checked-value boundary (call '${access.expression.getText()}(...)' directly)`);
8191
+ lowerer.unsupported("SC1090", call, `Function.prototype.${name} on a function whose signature cannot cross the checked-value boundary (call '${ts.getTextOfNode(access.expression)}(...)' directly)`);
7486
8192
  }
7487
8193
  // STANDARD-LIBRARY generic members (Promise.then, Object.
7488
8194
  // defineProperty, Array-augmentation methods) are the lib fence's
@@ -7495,9 +8201,27 @@ function lowerObjLitGenericMethodCall(lowerer, call, access) {
7495
8201
  // receiver's runtime class must be provable — name that discipline
7496
8202
  // instead of the object-literal wording when the method lives on an
7497
8203
  // interface.
7498
- const onInterface = lowerer.checker
7499
- .declarationsOf(propSym)
7500
- .some((d) => d.parent !== undefined && ts.isInterfaceDeclaration(d.parent));
8204
+ const onInterface = propSym.declarations.some((d) => d.parent !== undefined && ts.isInterfaceDeclaration(d.parent));
8205
+ // A receiver held as a checked-dynamic value (a class-backed interface)
8206
+ // dispatches by name to the runtime object's member, which a generic
8207
+ // method answers with its erased instance; the result converts to this
8208
+ // call's instantiated return type.
8209
+ if (onInterface && !call.arguments.nodes.some(ts.isSpreadElement)) {
8210
+ const receiver = lowerer.lowerExpr(access.expression);
8211
+ if (receiver.type.kind === "dyn") {
8212
+ const loc = locOf(call);
8213
+ const invoked = {
8214
+ kind: "dynInvoke",
8215
+ recv: receiver,
8216
+ method: name,
8217
+ calleeName: ts.getTextOfNode(access),
8218
+ args: call.arguments.nodes.map((arg) => lowerer.lowerExprExpecting(arg, DYN)),
8219
+ type: DYN,
8220
+ loc,
8221
+ };
8222
+ return lowerer.coerceInto(call, invoked, lowerer.irTypeOf(call));
8223
+ }
8224
+ }
7501
8225
  if (onInterface) {
7502
8226
  lowerer.unsupported("SC1090", call, `calls of the generic method '${name}' through this receiver (the interface declaration is signature-only and generic methods dispatch statically, so the receiver's runtime class must be provable — bind the receiver to a const initialized with its 'new' expression, e.g. 'const r: ${lowerer.checker.typeToString(recvT)} = new C(...)')`);
7503
8227
  }
@@ -7507,7 +8231,7 @@ function lowerObjLitGenericMethodCall(lowerer, call, access) {
7507
8231
  const info = objLitGenericFnInfoOf(lowerer, call, name, found);
7508
8232
  const instance = genericCallInstance(lowerer, call, info);
7509
8233
  const loc = locOf(call);
7510
- const args = lowerer.completeArgs(call.arguments, instance.params, loc, call);
8234
+ const args = lowerer.completeArgs(call.arguments.nodes, instance.params, loc, call);
7511
8235
  return { kind: "call", callee: instance.name, args, type: instance.returnType, loc };
7512
8236
  }
7513
8237
  /** `obj.method(args)` — whole-program devirtualization decides the form:
@@ -7519,7 +8243,17 @@ function lowerObjLitGenericMethodCall(lowerer, call, access) {
7519
8243
  export function lowerObjectMethodCall(lowerer, call, access) {
7520
8244
  if (lowerer.chainBlocked(access, call))
7521
8245
  return null;
7522
- let mappedReceiver = lowerer.mapTypeOf(lowerer.typeOf(access.expression));
8246
+ let mappedReceiver = lowerer.receiverTypeOverrides.get(access.expression) ??
8247
+ structuralReadType(lowerer, access.expression) ??
8248
+ lowerer.mapTypeOf(lowerer.typeOf(access.expression));
8249
+ // EventEmitter's static side (the class, a value of it, or the events
8250
+ // module, which is the class) keeps its static surface on the emitter
8251
+ // dispatch (`EventEmitter.setMaxListeners(n)`), which tells the statics
8252
+ // apart by the receiver's construct signatures. The stream classes
8253
+ // inherit the same statics.
8254
+ if (mappedReceiver?.kind === "classval" && mappedReceiver.className === RUNTIME_EMITTER_CLASS) {
8255
+ mappedReceiver = { kind: "object", className: RUNTIME_EMITTER_CLASS };
8256
+ }
7523
8257
  // A specialized JS parameter can expose a native field whose checker
7524
8258
  // type still belongs to the unspecialized body (plane.normal.dot()).
7525
8259
  // Use the lowered receiver's representation and retain its evaluation.
@@ -7527,7 +8261,7 @@ export function lowerObjectMethodCall(lowerer, call, access) {
7527
8261
  (lowerer.implicitParamTypes !== null ||
7528
8262
  lowerer.classImplementedProtocol(lowerer.typeOf(access.expression)) ||
7529
8263
  ts.isNewExpression(access.expression) ||
7530
- isJsSourceFile(call.getSourceFile()))
8264
+ isJsSourceFile(ts.getSourceFileOfNode(call)))
7531
8265
  ? ts.isNewExpression(access.expression)
7532
8266
  ? lowerer.lowerExpr(access.expression)
7533
8267
  : tryLowerExpression(lowerer, access.expression)
@@ -7545,7 +8279,7 @@ export function lowerObjectMethodCall(lowerer, call, access) {
7545
8279
  if (dispatched)
7546
8280
  return dispatched;
7547
8281
  const arms = lowerer.unions.get(mappedReceiver.unionId)?.arms;
7548
- if (isJsSourceFile(call.getSourceFile()) &&
8282
+ if (isJsSourceFile(ts.getSourceFileOfNode(call)) &&
7549
8283
  arms?.every((arm) => arm.kind === "object" && !lowerer.classes.get(arm.className)?.def.runtime) &&
7550
8284
  lowerer.dynConvertible(mappedReceiver)) {
7551
8285
  return lowerDynReceiverMethodCall(lowerer, call, access);
@@ -7615,7 +8349,13 @@ export function lowerObjectMethodCall(lowerer, call, access) {
7615
8349
  // The EventEmitter surface: API-named calls on emitter-rooted
7616
8350
  // receivers lower through the emitter spoke (subclass members with
7617
8351
  // these names are fenced at collection, so `found` never shadows).
7618
- if (info && !found && EMITTER_API_MEMBERS.has(access.name.text) && emitterRooted(lowerer, info)) {
8352
+ if (info &&
8353
+ !found &&
8354
+ (EMITTER_API_MEMBERS.has(access.name.text) ||
8355
+ // A static with no instance twin (events.getEventListeners).
8356
+ (access.name.text === "getEventListeners" &&
8357
+ lowerer.checker.getConstructSignatures(lowerer.typeOf(access.expression)).length > 0)) &&
8358
+ emitterRooted(lowerer, info)) {
7619
8359
  return lowerEmitterMethodCall(lowerer, call, access, info);
7620
8360
  }
7621
8361
  // The inherited EventTarget/Event methods of a class rooted at those
@@ -7674,7 +8414,7 @@ export function lowerObjectMethodCall(lowerer, call, access) {
7674
8414
  let callee = target ? lowerer.fieldGetExpr(target, locOf(access), access) : null;
7675
8415
  if (callee?.type.kind === "union" && callableType !== null) {
7676
8416
  // Calling a cleared callback field throws Node's call TypeError.
7677
- const inPlace = checkedArmExtraction(lowerer, callee, lowerer.armTag(callee.type.unionId, callableType), callableType, () => `${access.getText()} is not a function`);
8417
+ const inPlace = checkedArmExtraction(lowerer, callee, lowerer.armTag(callee.type.unionId, callableType), callableType, () => `${ts.getTextOfNode(access)} is not a function`);
7678
8418
  const helper = inPlace
7679
8419
  ? null
7680
8420
  : lowerer.narrowedArmHelper(callee.type.unionId, callableType, locOf(access));
@@ -7686,19 +8426,19 @@ export function lowerObjectMethodCall(lowerer, call, access) {
7686
8426
  }
7687
8427
  if (callee?.type.kind === "func") {
7688
8428
  if (((callee.type.rest === true && callee.type.restAbi === undefined) ||
7689
- call.arguments.length > callee.type.params.length) &&
7690
- isJsSourceFile(call.getSourceFile()) &&
8429
+ call.arguments.nodes.length > callee.type.params.length) &&
8430
+ isJsSourceFile(ts.getSourceFileOfNode(call)) &&
7691
8431
  lowerer.dynConvertible(callee.type)) {
7692
8432
  const boxed = { kind: "dynFrom", value: callee, type: DYN, loc };
7693
8433
  const spread = lowerSpreadArgsCall(lowerer, call, boxed, loc);
7694
8434
  if (spread?.kind === "dynCall")
7695
8435
  return finish({ ...spread, ...receiver });
7696
- const args = call.arguments.map((arg) => lowerer.lowerExprExpecting(arg, DYN));
8436
+ const args = call.arguments.nodes.map((arg) => lowerer.lowerExprExpecting(arg, DYN));
7697
8437
  return finish({
7698
8438
  kind: "dynCall",
7699
8439
  callee: boxed,
7700
8440
  ...receiver,
7701
- calleeName: access.getText(),
8441
+ calleeName: ts.getTextOfNode(access),
7702
8442
  args,
7703
8443
  type: DYN,
7704
8444
  loc,
@@ -7708,15 +8448,15 @@ export function lowerObjectMethodCall(lowerer, call, access) {
7708
8448
  return finish({ kind: "callValue", callee, ...receiver, args, type: callee.type.ret, loc });
7709
8449
  }
7710
8450
  if (callee?.type.kind === "dyn") {
7711
- if (call.arguments.some((a) => ts.isSpreadElement(a))) {
8451
+ if (call.arguments.nodes.some((a) => ts.isSpreadElement(a))) {
7712
8452
  lowerer.unsupported("SC1090", call, "spread arguments in calls through 'unknown' values");
7713
8453
  }
7714
- const args = call.arguments.map((a) => lowerer.lowerExprExpecting(a, DYN));
8454
+ const args = call.arguments.nodes.map((a) => lowerer.lowerExprExpecting(a, DYN));
7715
8455
  return finish({
7716
8456
  kind: "dynCall",
7717
8457
  callee,
7718
8458
  ...receiver,
7719
- calleeName: access.getText(),
8459
+ calleeName: ts.getTextOfNode(access),
7720
8460
  args,
7721
8461
  type: DYN,
7722
8462
  loc,
@@ -7724,7 +8464,7 @@ export function lowerObjectMethodCall(lowerer, call, access) {
7724
8464
  }
7725
8465
  }
7726
8466
  if (!fieldType &&
7727
- isJsSourceFile(call.getSourceFile()) &&
8467
+ isJsSourceFile(ts.getSourceFileOfNode(call)) &&
7728
8468
  !info.def.runtime &&
7729
8469
  !info.builtinError &&
7730
8470
  !info.builtinEmitter &&
@@ -7741,7 +8481,7 @@ export function lowerObjectMethodCall(lowerer, call, access) {
7741
8481
  type: DYN,
7742
8482
  loc,
7743
8483
  };
7744
- const spread = call.arguments.some(ts.isSpreadElement)
8484
+ const spread = call.arguments.nodes.some(ts.isSpreadElement)
7745
8485
  ? lowerSpreadArgsCall(lowerer, call, callee, loc)
7746
8486
  : null;
7747
8487
  if (spread && spread.kind !== "dynCall")
@@ -7752,8 +8492,8 @@ export function lowerObjectMethodCall(lowerer, call, access) {
7752
8492
  kind: "dynCall",
7753
8493
  callee,
7754
8494
  receiver,
7755
- calleeName: access.getText(),
7756
- args: call.arguments.map((arg) => lowerer.lowerExprExpecting(arg, DYN)),
8495
+ calleeName: ts.getTextOfNode(access),
8496
+ args: call.arguments.nodes.map((arg) => lowerer.lowerExprExpecting(arg, DYN)),
7757
8497
  type: DYN,
7758
8498
  loc,
7759
8499
  };
@@ -7775,7 +8515,7 @@ export function lowerObjectMethodCall(lowerer, call, access) {
7775
8515
  const receiver = lowerReceiver();
7776
8516
  const local = lowerer.declareHiddenLocal("%callbackReceiver", receiver.type);
7777
8517
  const value = { kind: "varRef", localId: local.id, type: receiver.type, loc };
7778
- const args = lowerer.completeArgs(call.arguments, found.sig.params, loc, call);
8518
+ const args = lowerer.completeArgs(call.arguments.nodes, found.sig.params, loc, call);
7779
8519
  const virtual = lowerer.overrideBelow(info, method);
7780
8520
  if (virtual)
7781
8521
  lowerer.noteVirtualEdge(info, method);
@@ -7797,7 +8537,7 @@ export function lowerObjectMethodCall(lowerer, call, access) {
7797
8537
  type: found.sig.ret,
7798
8538
  loc,
7799
8539
  };
7800
- const result = classCallbackCall(lowerer, value, method, call.arguments, fallback, loc, access.getText());
8540
+ const result = classCallbackCall(lowerer, value, method, call.arguments.nodes, fallback, loc, ts.getTextOfNode(access));
7801
8541
  return {
7802
8542
  kind: "seqExpr",
7803
8543
  stmts: [{ kind: "varDecl", localId: local.id, init: receiver, loc }],
@@ -7818,12 +8558,34 @@ export function lowerObjectMethodCall(lowerer, call, access) {
7818
8558
  if (found.sig.abstract === true && !lowerer.overrideBelow(info, method)) {
7819
8559
  lowerer.unsupported("SC1090", call, `calls of the abstract method '${method}' with no concrete implementation below the receiver's static class`);
7820
8560
  }
8561
+ // The static receiver's nearest declaration is an override adapted to
8562
+ // the inherited ABI, and nothing below overrides it: call its body
8563
+ // directly under its declared signature (exact parameters and result).
8564
+ // The slot function stays reachable; it lifts the body.
8565
+ const adapted = found.declarer.returnAdapters?.get(method);
8566
+ // A TypeScript override's own entry answers its declared result. A
8567
+ // JavaScript body's result is inferred, so its callers keep the slot.
8568
+ const declarerDecl = found.declarer.decl;
8569
+ if (adapted &&
8570
+ !(declarerDecl && isJsSourceFile(ts.getSourceFileOfNode(declarerDecl))) &&
8571
+ !lowerer.overrideBelow(info, method)) {
8572
+ lowerer.noteEdge(`%${found.declarer.def.name}.${method}`);
8573
+ const receiver = lowerReceiver();
8574
+ const args = lowerer.completeArgs(call.arguments.nodes, adapted.params, locOf(call), call);
8575
+ return {
8576
+ kind: "call",
8577
+ callee: `%${found.declarer.def.name}.${method}$own`,
8578
+ args: [lowerer.upcastTo(receiver, found.declarer.def.name), ...args],
8579
+ type: adapted.ret,
8580
+ loc: locOf(call),
8581
+ };
8582
+ }
7821
8583
  if (lowerer.overrideBelow(info, method))
7822
8584
  lowerer.noteVirtualEdge(info, method);
7823
8585
  else
7824
8586
  lowerer.noteEdge(`%${found.declarer.def.name}.${method}`);
7825
8587
  const receiver = lowerReceiver();
7826
- const args = lowerer.completeArgs(call.arguments, found.sig.params, locOf(call), call);
8588
+ const args = lowerer.completeArgs(call.arguments.nodes, found.sig.params, locOf(call), call);
7827
8589
  if (lowerer.overrideBelow(info, method)) {
7828
8590
  return reconcileOverloadReturn(lowerer, call, {
7829
8591
  kind: "virtualCall",
@@ -7877,7 +8639,7 @@ function lowerUnionObjectMethodCall(lowerer, call, access, receiverT) {
7877
8639
  type: DYN,
7878
8640
  loc,
7879
8641
  };
7880
- const spread = call.arguments.some(ts.isSpreadElement)
8642
+ const spread = call.arguments.nodes.some(ts.isSpreadElement)
7881
8643
  ? lowerSpreadArgsCall(lowerer, call, callee, loc)
7882
8644
  : null;
7883
8645
  if (spread && spread.kind !== "dynCall")
@@ -7888,8 +8650,8 @@ function lowerUnionObjectMethodCall(lowerer, call, access, receiverT) {
7888
8650
  kind: "dynCall",
7889
8651
  callee,
7890
8652
  receiver,
7891
- calleeName: access.getText(),
7892
- args: call.arguments.map((arg) => lowerer.lowerExprExpecting(arg, DYN)),
8653
+ calleeName: ts.getTextOfNode(access),
8654
+ args: call.arguments.nodes.map((arg) => lowerer.lowerExprExpecting(arg, DYN)),
7893
8655
  type: DYN,
7894
8656
  loc,
7895
8657
  };
@@ -7917,7 +8679,7 @@ function lowerUnionObjectMethodCall(lowerer, call, access, receiverT) {
7917
8679
  return null;
7918
8680
  const loc = locOf(call);
7919
8681
  const receiver = lowerer.coerceInto(access.expression, lowerer.lowerExpr(access.expression), receiverT);
7920
- const args = lowerer.completeArgs(call.arguments, shapes, loc, call);
8682
+ const args = lowerer.completeArgs(call.arguments.nodes, shapes, loc, call);
7921
8683
  const helper = unionObjectMethodHelper(lowerer, call, receiverT, method, plans, shapes, resultT, loc);
7922
8684
  return { kind: "call", callee: helper, args: [receiver, ...args], type: resultT, loc };
7923
8685
  }
@@ -7949,7 +8711,7 @@ function lowerUnionObjectDynFieldCall(lowerer, call, access, receiverT) {
7949
8711
  return null;
7950
8712
  plans.push({ arm, info });
7951
8713
  }
7952
- if (call.arguments.some(ts.isSpreadElement)) {
8714
+ if (call.arguments.nodes.some(ts.isSpreadElement)) {
7953
8715
  lowerer.unsupported("SC1090", call, "spread arguments in calls through 'unknown' values");
7954
8716
  }
7955
8717
  const loc = locOf(call);
@@ -8017,7 +8779,7 @@ function lowerUnionObjectDynFieldCall(lowerer, call, access, receiverT) {
8017
8779
  lowerer.liftedFns.push({ name: helper, params, returnType: DYN, locals, body, loc });
8018
8780
  }
8019
8781
  const callee = { kind: "call", callee: helper, args: [receiverRef], type: DYN, loc };
8020
- const args = call.arguments.map((arg) => lowerer.lowerExprExpecting(arg, DYN));
8782
+ const args = call.arguments.nodes.map((arg) => lowerer.lowerExprExpecting(arg, DYN));
8021
8783
  return {
8022
8784
  kind: "seqExpr",
8023
8785
  stmts: [{ kind: "varDecl", localId: receiverLocal.id, init: receiver, loc }],
@@ -8025,7 +8787,7 @@ function lowerUnionObjectDynFieldCall(lowerer, call, access, receiverT) {
8025
8787
  kind: "dynCall",
8026
8788
  callee,
8027
8789
  receiver: lowerer.coerceToExpected(receiverRef, DYN),
8028
- calleeName: access.getText(),
8790
+ calleeName: ts.getTextOfNode(access),
8029
8791
  args,
8030
8792
  type: DYN,
8031
8793
  loc,
@@ -8041,6 +8803,18 @@ function unionObjectMethodHelper(lowerer, sourceCall, receiverT, method, plans,
8041
8803
  return existing;
8042
8804
  const name = `%union.call.${lowerer.unionCallHelpers.size}`;
8043
8805
  lowerer.unionCallHelpers.set(key, name);
8806
+ // A probe that catches a refusal while the body lowers must not leave
8807
+ // the name registered for a helper that was never emitted.
8808
+ try {
8809
+ lowerer.liftedFns.push(unionObjectMethodFunction(lowerer, name, sourceCall, receiverT, method, plans, shapes, resultT, loc));
8810
+ }
8811
+ catch (e) {
8812
+ lowerer.unionCallHelpers.delete(key);
8813
+ throw e;
8814
+ }
8815
+ return name;
8816
+ }
8817
+ function unionObjectMethodFunction(lowerer, name, sourceCall, receiverT, method, plans, shapes, resultT, loc) {
8044
8818
  const receiver = varRef("this.0", receiverT, loc);
8045
8819
  const argRefs = shapes.map((shape, i) => varRef(`a.${i}`, shape.type, loc));
8046
8820
  const branch = (plan) => {
@@ -8117,8 +8891,7 @@ function unionObjectMethodHelper(lowerer, sourceCall, receiverT, method, plans,
8117
8891
  type: param.type,
8118
8892
  mutable: false,
8119
8893
  }));
8120
- lowerer.liftedFns.push({ name, params, returnType: resultT, locals, body, loc });
8121
- return name;
8894
+ return { name, params, returnType: resultT, locals, body, loc };
8122
8895
  }
8123
8896
  /** The argument's lowered type for a message (what the static form saw),
8124
8897
  * or the checker's text when the argument itself does not lower. */
@@ -8288,4 +9061,77 @@ export function lowerStaticNumberGlobal(lowerer, name, call, args, loc) {
8288
9061
  }
8289
9062
  return null;
8290
9063
  }
9064
+ /** `crypto.getRandomValues(view)` on the WebCrypto global or webcrypto. */
9065
+ function lowerWebCryptoGetRandomValues(lowerer, call, access) {
9066
+ if (access.name.text !== "getRandomValues" ||
9067
+ call.questionDotToken ||
9068
+ access.questionDotToken ||
9069
+ !isWebCryptoReceiver(lowerer, access.expression))
9070
+ return null;
9071
+ return lowerCryptoGetRandomValues(lowerer, call);
9072
+ }
9073
+ /** A then handler's promise-armed result (`.then(() => cached ?? load())`
9074
+ * typed `T | Promise<T>`, or a `Promise<void> | void` callback's result):
9075
+ * the lifted async body adopts the promise arm and fulfills with the
9076
+ * others, like `return u` in an async function. Null for other results. */
9077
+ function maybePromiseHandlerResult(lowerer, call, value, R) {
9078
+ const mp = promiseArmedUnionOf(lowerer, value.type);
9079
+ if (!mp || promiseArmedUnionOf(lowerer, R))
9080
+ return null;
9081
+ const stmt = maybePromiseReturnStmt(lowerer, value, mp, R, (e) => lowerer.coerceInto(call, e, R));
9082
+ if (stmt === null) {
9083
+ lowerer.unsupported("SC1090", call, `then handlers returning '${lowerer.fmt(value.type)}' into '${lowerer.fmt(R)}' (an arm does not convert to the result)`);
9084
+ }
9085
+ return stmt;
9086
+ }
9087
+ /** `Object.assign(err, ...sources)` in TypeScript onto an error-hierarchy
9088
+ * target (`Object.assign(new Error(message), details)`): the sources'
9089
+ * own members land on the error — the runtime copy over its
9090
+ * checked-dynamic node, whose name, message, stack, cause and code feed
9091
+ * back into the typed slots — and the call answers the error itself.
9092
+ * Null for every other target. */
9093
+ function lowerObjectAssignOntoError(lowerer, call) {
9094
+ const argNodes = call.arguments.nodes;
9095
+ if (isJsSourceFile(ts.getSourceFileOfNode(call)) ||
9096
+ argNodes.length < 2 ||
9097
+ argNodes.some((a) => ts.isSpreadElement(a)))
9098
+ return null;
9099
+ const probe = tryLowerExpression(lowerer, argNodes[0]);
9100
+ if (probe?.type.kind !== "object" || !lowerer.isErrorRootedClass(probe.type.className))
9101
+ return null;
9102
+ const loc = locOf(call);
9103
+ const target = lowerer.lowerExpr(argNodes[0]);
9104
+ const slot = lowerer.declareHiddenLocal("%assignErr", target.type);
9105
+ const sources = [];
9106
+ for (const node of argNodes.slice(1)) {
9107
+ const raw = lowerer.lowerExpr(node);
9108
+ fenceSymbolFieldCopy(lowerer, node, raw.type);
9109
+ const source = lowerer.coerceToExpected(raw, DYN);
9110
+ if (source.type.kind !== "dyn") {
9111
+ lowerer.unsupported("SC1090", node, `Object.assign onto an Error from a '${lowerer.fmt(raw.type)}' source (sources enter the error's dynamic properties)`);
9112
+ }
9113
+ sources.push(source);
9114
+ }
9115
+ const ref = () => ({ kind: "varRef", localId: slot.id, type: target.type, loc });
9116
+ return {
9117
+ kind: "seqExpr",
9118
+ stmts: [
9119
+ { kind: "varDecl", localId: slot.id, init: target, loc },
9120
+ {
9121
+ kind: "exprStmt",
9122
+ expr: {
9123
+ kind: "libCall",
9124
+ fn: "error.assign",
9125
+ args: [ref(), { kind: "dynArrLit", elems: sources, type: DYN, loc }],
9126
+ type: VOID,
9127
+ loc,
9128
+ },
9129
+ loc,
9130
+ },
9131
+ ],
9132
+ result: ref(),
9133
+ type: target.type,
9134
+ loc,
9135
+ };
9136
+ }
8291
9137
  //# sourceMappingURL=lower-calls.js.map