@scriptc/compiler 0.3.6 → 0.4.1

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 (1358) hide show
  1. package/ambient/scriptc-node-fallback.d.ts +717 -55
  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 +20 -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 +9 -0
  14. package/dist/backend/library-pack.js.map +1 -1
  15. package/dist/backend/link-plan-core.d.ts +2 -0
  16. package/dist/backend/link-plan-core.js +2 -0
  17. package/dist/backend/link-plan-core.js.map +1 -1
  18. package/dist/backend/link-plan.d.ts +1 -0
  19. package/dist/backend/link-plan.js +1 -0
  20. package/dist/backend/link-plan.js.map +1 -1
  21. package/dist/backend/llvm/alloc.d.ts +41 -4
  22. package/dist/backend/llvm/alloc.js +138 -7
  23. package/dist/backend/llvm/alloc.js.map +1 -1
  24. package/dist/backend/llvm/alloc.test.js +30 -1
  25. package/dist/backend/llvm/alloc.test.js.map +1 -1
  26. package/dist/backend/llvm/appended-array-literals.test.js +1 -1
  27. package/dist/backend/llvm/array-search.js +3 -1
  28. package/dist/backend/llvm/array-search.js.map +1 -1
  29. package/dist/backend/llvm/array-search.test.js +1 -1
  30. package/dist/backend/llvm/blocks.d.ts +8 -0
  31. package/dist/backend/llvm/blocks.js +43 -1
  32. package/dist/backend/llvm/blocks.js.map +1 -1
  33. package/dist/backend/llvm/blocks.test.js +22 -1
  34. package/dist/backend/llvm/blocks.test.js.map +1 -1
  35. package/dist/backend/llvm/byte-numbers.js +15 -5
  36. package/dist/backend/llvm/byte-numbers.js.map +1 -1
  37. package/dist/backend/llvm/bytes-alias.d.ts +14 -0
  38. package/dist/backend/llvm/bytes-alias.js +20 -0
  39. package/dist/backend/llvm/bytes-alias.js.map +1 -0
  40. package/dist/backend/llvm/bytes-loop-versions.d.ts +86 -0
  41. package/dist/backend/llvm/bytes-loop-versions.js +506 -0
  42. package/dist/backend/llvm/bytes-loop-versions.js.map +1 -0
  43. package/dist/backend/llvm/bytes-loop-versions.test.d.ts +1 -0
  44. package/dist/backend/llvm/bytes-loop-versions.test.js +244 -0
  45. package/dist/backend/llvm/bytes-loop-versions.test.js.map +1 -0
  46. package/dist/backend/llvm/call-lifetimes.js +50 -1
  47. package/dist/backend/llvm/call-lifetimes.js.map +1 -1
  48. package/dist/backend/llvm/call-lifetimes.test.js +34 -0
  49. package/dist/backend/llvm/call-lifetimes.test.js.map +1 -1
  50. package/dist/backend/llvm/checked-narrows.test.js +1 -1
  51. package/dist/backend/llvm/checked-value-lifetimes.js +4 -1
  52. package/dist/backend/llvm/checked-value-lifetimes.js.map +1 -1
  53. package/dist/backend/llvm/classes.d.ts +38 -1
  54. package/dist/backend/llvm/classes.js +185 -35
  55. package/dist/backend/llvm/classes.js.map +1 -1
  56. package/dist/backend/llvm/classes.test.js +79 -17
  57. package/dist/backend/llvm/classes.test.js.map +1 -1
  58. package/dist/backend/llvm/common.d.ts +21 -3
  59. package/dist/backend/llvm/common.js +51 -3
  60. package/dist/backend/llvm/common.js.map +1 -1
  61. package/dist/backend/llvm/constant-callbacks.d.ts +5 -1
  62. package/dist/backend/llvm/constant-callbacks.js +55 -12
  63. package/dist/backend/llvm/constant-callbacks.js.map +1 -1
  64. package/dist/backend/llvm/constant-callbacks.test.js +88 -1
  65. package/dist/backend/llvm/constant-callbacks.test.js.map +1 -1
  66. package/dist/backend/llvm/counted-loops.d.ts +4 -0
  67. package/dist/backend/llvm/counted-loops.js +37 -0
  68. package/dist/backend/llvm/counted-loops.js.map +1 -1
  69. package/dist/backend/llvm/dense-array-access.d.ts +15 -4
  70. package/dist/backend/llvm/dense-array-access.js +125 -44
  71. package/dist/backend/llvm/dense-array-access.js.map +1 -1
  72. package/dist/backend/llvm/dense-array-access.test.js +63 -3
  73. package/dist/backend/llvm/dense-array-access.test.js.map +1 -1
  74. package/dist/backend/llvm/dense-array-loops.d.ts +51 -0
  75. package/dist/backend/llvm/dense-array-loops.js +162 -0
  76. package/dist/backend/llvm/dense-array-loops.js.map +1 -0
  77. package/dist/backend/llvm/dense-array-loops.test.d.ts +1 -0
  78. package/dist/backend/llvm/dense-array-loops.test.js +128 -0
  79. package/dist/backend/llvm/dense-array-loops.test.js.map +1 -0
  80. package/dist/backend/llvm/dyn-handle-tags.test.d.ts +1 -0
  81. package/dist/backend/llvm/dyn-handle-tags.test.js +38 -0
  82. package/dist/backend/llvm/dyn-handle-tags.test.js.map +1 -0
  83. package/dist/backend/llvm/dyn.d.ts +37 -4
  84. package/dist/backend/llvm/dyn.js +354 -183
  85. package/dist/backend/llvm/dyn.js.map +1 -1
  86. package/dist/backend/llvm/emit-function.d.ts +64 -0
  87. package/dist/backend/llvm/emit-function.js +1193 -0
  88. package/dist/backend/llvm/emit-function.js.map +1 -0
  89. package/dist/backend/llvm/emit-module.d.ts +24 -0
  90. package/dist/backend/llvm/emit-module.js +1557 -0
  91. package/dist/backend/llvm/emit-module.js.map +1 -0
  92. package/dist/backend/llvm/emit-statements.d.ts +59 -0
  93. package/dist/backend/llvm/emit-statements.js +2041 -0
  94. package/dist/backend/llvm/emit-statements.js.map +1 -0
  95. package/dist/backend/llvm/emitter.d.ts +566 -291
  96. package/dist/backend/llvm/emitter.js +728 -4671
  97. package/dist/backend/llvm/emitter.js.map +1 -1
  98. package/dist/backend/llvm/emitter.test.js +57 -3
  99. package/dist/backend/llvm/emitter.test.js.map +1 -1
  100. package/dist/backend/llvm/expr-async.js +73 -46
  101. package/dist/backend/llvm/expr-async.js.map +1 -1
  102. package/dist/backend/llvm/expr-async.test.js +1 -1
  103. package/dist/backend/llvm/expr-bytes.d.ts +2 -0
  104. package/dist/backend/llvm/expr-bytes.js +76 -29
  105. package/dist/backend/llvm/expr-bytes.js.map +1 -1
  106. package/dist/backend/llvm/expr-callbacks.d.ts +6 -2
  107. package/dist/backend/llvm/expr-callbacks.js +48 -11
  108. package/dist/backend/llvm/expr-callbacks.js.map +1 -1
  109. package/dist/backend/llvm/expr-calls.d.ts +1 -1
  110. package/dist/backend/llvm/expr-calls.js +87 -56
  111. package/dist/backend/llvm/expr-calls.js.map +1 -1
  112. package/dist/backend/llvm/expr-calls.test.js +1 -1
  113. package/dist/backend/llvm/expr-containers.js +45 -24
  114. package/dist/backend/llvm/expr-containers.js.map +1 -1
  115. package/dist/backend/llvm/expr-control.js +16 -16
  116. package/dist/backend/llvm/expr-control.js.map +1 -1
  117. package/dist/backend/llvm/expr-dynamic.d.ts +3 -0
  118. package/dist/backend/llvm/expr-dynamic.js +113 -66
  119. package/dist/backend/llvm/expr-dynamic.js.map +1 -1
  120. package/dist/backend/llvm/expr-primitives.js +124 -28
  121. package/dist/backend/llvm/expr-primitives.js.map +1 -1
  122. package/dist/backend/llvm/expr-primitives.test.js +57 -2
  123. package/dist/backend/llvm/expr-primitives.test.js.map +1 -1
  124. package/dist/backend/llvm/expr-records.d.ts +1 -1
  125. package/dist/backend/llvm/expr-records.js +32 -11
  126. package/dist/backend/llvm/expr-records.js.map +1 -1
  127. package/dist/backend/llvm/expr-stream-bridges.js +65 -27
  128. package/dist/backend/llvm/expr-stream-bridges.js.map +1 -1
  129. package/dist/backend/llvm/expr-stream-bridges.test.js +2 -2
  130. package/dist/backend/llvm/expr-stream-callbacks.js +22 -1
  131. package/dist/backend/llvm/expr-stream-callbacks.js.map +1 -1
  132. package/dist/backend/llvm/int32-abi.test.js +2 -2
  133. package/dist/backend/llvm/integer-clones.js +3 -3
  134. package/dist/backend/llvm/integer-clones.js.map +1 -1
  135. package/dist/backend/llvm/integer-clones.test.js +3 -3
  136. package/dist/backend/llvm/integer-remainder.d.ts +34 -13
  137. package/dist/backend/llvm/integer-remainder.js +156 -22
  138. package/dist/backend/llvm/integer-remainder.js.map +1 -1
  139. package/dist/backend/llvm/intern-tables.test.js +1 -1
  140. package/dist/backend/llvm/js-ic.d.ts +18 -0
  141. package/dist/backend/llvm/js-ic.js +712 -0
  142. package/dist/backend/llvm/js-ic.js.map +1 -0
  143. package/dist/backend/llvm/jsval-encoding.d.ts +21 -0
  144. package/dist/backend/llvm/jsval-encoding.js +20 -0
  145. package/dist/backend/llvm/jsval-encoding.js.map +1 -0
  146. package/dist/backend/llvm/jsval.d.ts +12 -0
  147. package/dist/backend/llvm/jsval.js +616 -0
  148. package/dist/backend/llvm/jsval.js.map +1 -0
  149. package/dist/backend/llvm/lazy-captures.d.ts +12 -2
  150. package/dist/backend/llvm/lazy-captures.js +39 -17
  151. package/dist/backend/llvm/lazy-captures.js.map +1 -1
  152. package/dist/backend/llvm/lib-abi.js +1 -1
  153. package/dist/backend/llvm/lib-abi.js.map +1 -1
  154. package/dist/backend/llvm/lib-connect.js +1 -1
  155. package/dist/backend/llvm/lib-connect.js.map +1 -1
  156. package/dist/backend/llvm/lib-datagram.js +14 -8
  157. package/dist/backend/llvm/lib-datagram.js.map +1 -1
  158. package/dist/backend/llvm/lib-dispatch.js +189 -23
  159. package/dist/backend/llvm/lib-dispatch.js.map +1 -1
  160. package/dist/backend/llvm/lib-filesystem.js +42 -13
  161. package/dist/backend/llvm/lib-filesystem.js.map +1 -1
  162. package/dist/backend/llvm/lib-http2.js +3 -3
  163. package/dist/backend/llvm/lib-http2.js.map +1 -1
  164. package/dist/backend/llvm/lib-lookup.js +2 -2
  165. package/dist/backend/llvm/lib-lookup.js.map +1 -1
  166. package/dist/backend/llvm/lib-network.js +56 -22
  167. package/dist/backend/llvm/lib-network.js.map +1 -1
  168. package/dist/backend/llvm/lib-process.js +94 -53
  169. package/dist/backend/llvm/lib-process.js.map +1 -1
  170. package/dist/backend/llvm/lib-shared.d.ts +12 -0
  171. package/dist/backend/llvm/lib-shared.js +209 -6
  172. package/dist/backend/llvm/lib-shared.js.map +1 -1
  173. package/dist/backend/llvm/lib-stream.js +46 -16
  174. package/dist/backend/llvm/lib-stream.js.map +1 -1
  175. package/dist/backend/llvm/lib-test.js +43 -7
  176. package/dist/backend/llvm/lib-test.js.map +1 -1
  177. package/dist/backend/llvm/lib-tls.js +4 -9
  178. package/dist/backend/llvm/lib-tls.js.map +1 -1
  179. package/dist/backend/llvm/local-array-reads.js +42 -33
  180. package/dist/backend/llvm/local-array-reads.js.map +1 -1
  181. package/dist/backend/llvm/local-array-reads.test.js +1 -1
  182. package/dist/backend/llvm/local-extents.d.ts +19 -0
  183. package/dist/backend/llvm/local-extents.js +169 -0
  184. package/dist/backend/llvm/local-extents.js.map +1 -0
  185. package/dist/backend/llvm/local-extents.test.d.ts +1 -0
  186. package/dist/backend/llvm/local-extents.test.js +92 -0
  187. package/dist/backend/llvm/local-extents.test.js.map +1 -0
  188. package/dist/backend/llvm/local-union-storage.js +7 -7
  189. package/dist/backend/llvm/local-union-storage.js.map +1 -1
  190. package/dist/backend/llvm/local-union-storage.test.js +2 -2
  191. package/dist/backend/llvm/map-entry-fusion.test.js +1 -1
  192. package/dist/backend/llvm/map-number-lookup.d.ts +20 -4
  193. package/dist/backend/llvm/map-number-lookup.js +45 -9
  194. package/dist/backend/llvm/map-number-lookup.js.map +1 -1
  195. package/dist/backend/llvm/map-number-lookup.test.js +2 -2
  196. package/dist/backend/llvm/map-read-lifetimes.test.js +2 -2
  197. package/dist/backend/llvm/narrow-guards.d.ts +38 -0
  198. package/dist/backend/llvm/narrow-guards.js +215 -0
  199. package/dist/backend/llvm/narrow-guards.js.map +1 -0
  200. package/dist/backend/llvm/nullable-unions.d.ts +64 -6
  201. package/dist/backend/llvm/nullable-unions.js +103 -6
  202. package/dist/backend/llvm/nullable-unions.js.map +1 -1
  203. package/dist/backend/llvm/nullable-unions.test.d.ts +1 -0
  204. package/dist/backend/llvm/nullable-unions.test.js +65 -0
  205. package/dist/backend/llvm/nullable-unions.test.js.map +1 -0
  206. package/dist/backend/llvm/publish.d.ts +7 -0
  207. package/dist/backend/llvm/publish.js +50 -19
  208. package/dist/backend/llvm/publish.js.map +1 -1
  209. package/dist/backend/llvm/publish.test.js +1 -1
  210. package/dist/backend/llvm/receivers.d.ts +31 -0
  211. package/dist/backend/llvm/receivers.js +395 -0
  212. package/dist/backend/llvm/receivers.js.map +1 -0
  213. package/dist/backend/llvm/record-results.d.ts +12 -1
  214. package/dist/backend/llvm/record-results.js +64 -4
  215. package/dist/backend/llvm/record-results.js.map +1 -1
  216. package/dist/backend/llvm/reference-effects.js +9 -0
  217. package/dist/backend/llvm/reference-effects.js.map +1 -1
  218. package/dist/backend/llvm/reference-writes.d.ts +4 -0
  219. package/dist/backend/llvm/reference-writes.js +142 -6
  220. package/dist/backend/llvm/reference-writes.js.map +1 -1
  221. package/dist/backend/llvm/reference-writes.test.d.ts +1 -0
  222. package/dist/backend/llvm/reference-writes.test.js +88 -0
  223. package/dist/backend/llvm/reference-writes.test.js.map +1 -0
  224. package/dist/backend/llvm/regex-matchers.d.ts +8 -0
  225. package/dist/backend/llvm/regex-matchers.js +33 -0
  226. package/dist/backend/llvm/regex-matchers.js.map +1 -1
  227. package/dist/backend/llvm/regex-matchers.test.js +23 -1
  228. package/dist/backend/llvm/regex-matchers.test.js.map +1 -1
  229. package/dist/backend/llvm/regions.d.ts +1 -1
  230. package/dist/backend/llvm/regions.js +10 -7
  231. package/dist/backend/llvm/regions.js.map +1 -1
  232. package/dist/backend/llvm/regions.test.js +8 -2
  233. package/dist/backend/llvm/regions.test.js.map +1 -1
  234. package/dist/backend/llvm/shapes.d.ts +74 -45
  235. package/dist/backend/llvm/shapes.js +289 -28
  236. package/dist/backend/llvm/shapes.js.map +1 -1
  237. package/dist/backend/llvm/shapes.test.js +37 -3
  238. package/dist/backend/llvm/shapes.test.js.map +1 -1
  239. package/dist/backend/llvm/speculative-integers.d.ts +20 -1
  240. package/dist/backend/llvm/speculative-integers.js +94 -6
  241. package/dist/backend/llvm/speculative-integers.js.map +1 -1
  242. package/dist/backend/llvm/speculative-integers.test.js +55 -1
  243. package/dist/backend/llvm/speculative-integers.test.js.map +1 -1
  244. package/dist/backend/llvm/split-loops.js +2 -2
  245. package/dist/backend/llvm/split-loops.js.map +1 -1
  246. package/dist/backend/llvm/stack-objects.d.ts +26 -6
  247. package/dist/backend/llvm/stack-objects.js +133 -10
  248. package/dist/backend/llvm/stack-objects.js.map +1 -1
  249. package/dist/backend/llvm/stack-objects.test.js +55 -1
  250. package/dist/backend/llvm/stack-objects.test.js.map +1 -1
  251. package/dist/backend/llvm/stack-unions.test.js +1 -1
  252. package/dist/backend/llvm/string-construction.test.js +1 -1
  253. package/dist/backend/llvm/string-lifetimes.test.js +15 -14
  254. package/dist/backend/llvm/string-lifetimes.test.js.map +1 -1
  255. package/dist/backend/llvm/string-reads.d.ts +1 -1
  256. package/dist/backend/llvm/string-reads.js +4 -4
  257. package/dist/backend/llvm/string-reads.js.map +1 -1
  258. package/dist/backend/llvm/string-slices.d.ts +25 -0
  259. package/dist/backend/llvm/string-slices.js +207 -1
  260. package/dist/backend/llvm/string-slices.js.map +1 -1
  261. package/dist/backend/llvm/string-slices.test.js +139 -2
  262. package/dist/backend/llvm/string-slices.test.js.map +1 -1
  263. package/dist/backend/llvm/switch-dispatch.test.js +2 -2
  264. package/dist/backend/llvm/thread-slots.d.ts +5 -0
  265. package/dist/backend/llvm/thread-slots.js +142 -0
  266. package/dist/backend/llvm/thread-slots.js.map +1 -0
  267. package/dist/backend/llvm/thread-slots.test.d.ts +1 -0
  268. package/dist/backend/llvm/thread-slots.test.js +111 -0
  269. package/dist/backend/llvm/thread-slots.test.js.map +1 -0
  270. package/dist/backend/llvm/union-repr.d.ts +7 -7
  271. package/dist/backend/llvm/union-repr.js +18 -2
  272. package/dist/backend/llvm/union-repr.js.map +1 -1
  273. package/dist/backend/llvm/union-retype.test.js +17 -3
  274. package/dist/backend/llvm/union-retype.test.js.map +1 -1
  275. package/dist/backend/llvm/walkers.d.ts +2 -2
  276. package/dist/backend/llvm/walkers.js +51 -26
  277. package/dist/backend/llvm/walkers.js.map +1 -1
  278. package/dist/backend/llvm/wasm-modules.d.ts +16 -0
  279. package/dist/backend/llvm/wasm-modules.js +66 -0
  280. package/dist/backend/llvm/wasm-modules.js.map +1 -0
  281. package/dist/backend/llvm/wrapping-sums.d.ts +7 -0
  282. package/dist/backend/llvm/wrapping-sums.js +11 -3
  283. package/dist/backend/llvm/wrapping-sums.js.map +1 -1
  284. package/dist/backend/mangle.d.ts +12 -0
  285. package/dist/backend/mangle.js +18 -0
  286. package/dist/backend/mangle.js.map +1 -1
  287. package/dist/backend/may-throw.d.ts +3 -0
  288. package/dist/backend/may-throw.js +4 -2
  289. package/dist/backend/may-throw.js.map +1 -1
  290. package/dist/backend/may-throw.test.js +1 -1
  291. package/dist/backend/native/contracts.d.ts +57 -0
  292. package/dist/backend/native/executable.js +211 -139
  293. package/dist/backend/native/executable.js.map +1 -1
  294. package/dist/backend/native/library.js +2 -0
  295. package/dist/backend/native/library.js.map +1 -1
  296. package/dist/backend/native/runtime-inputs.d.ts +1 -1
  297. package/dist/backend/native/runtime-inputs.js +1 -0
  298. package/dist/backend/native/runtime-inputs.js.map +1 -1
  299. package/dist/backend/native-codegen.d.ts +6 -0
  300. package/dist/backend/native-codegen.js +19 -0
  301. package/dist/backend/native-codegen.js.map +1 -1
  302. package/dist/backend/native-codegen.test.js +27 -0
  303. package/dist/backend/native-codegen.test.js.map +1 -1
  304. package/dist/backend/native-link-info-core.d.ts +48 -0
  305. package/dist/backend/native-link-info-core.js.map +1 -1
  306. package/dist/backend/native-profile.d.ts +32 -0
  307. package/dist/backend/native-profile.js +39 -0
  308. package/dist/backend/native-profile.js.map +1 -0
  309. package/dist/backend/native-profile.test.d.ts +1 -0
  310. package/dist/backend/native-profile.test.js +58 -0
  311. package/dist/backend/native-profile.test.js.map +1 -0
  312. package/dist/backend/native-tools.d.ts +14 -0
  313. package/dist/backend/native-tools.js +13 -0
  314. package/dist/backend/native-tools.js.map +1 -1
  315. package/dist/backend/publication.test.js +1 -1
  316. package/dist/backend/runtime-abi.d.ts +2 -2
  317. package/dist/backend/runtime-abi.js +2 -2
  318. package/dist/backend/runtime-pack-core.d.ts +13 -1
  319. package/dist/backend/runtime-pack-core.js +14 -1
  320. package/dist/backend/runtime-pack-core.js.map +1 -1
  321. package/dist/backend/runtime-pack-native.js +1 -1
  322. package/dist/backend/runtime-pack-native.js.map +1 -1
  323. package/dist/backend/runtime-pack-native.test.d.ts +1 -0
  324. package/dist/backend/runtime-pack-native.test.js +31 -0
  325. package/dist/backend/runtime-pack-native.test.js.map +1 -0
  326. package/dist/backend/runtime-pack-targets.test.js +9 -1
  327. package/dist/backend/runtime-pack-targets.test.js.map +1 -1
  328. package/dist/backend/runtime-pack.test.js +9 -1
  329. package/dist/backend/runtime-pack.test.js.map +1 -1
  330. package/dist/backend/stack-observations.d.ts +22 -0
  331. package/dist/backend/stack-observations.js +382 -0
  332. package/dist/backend/stack-observations.js.map +1 -0
  333. package/dist/backend/stack-observations.test.d.ts +1 -0
  334. package/dist/backend/stack-observations.test.js +233 -0
  335. package/dist/backend/stack-observations.test.js.map +1 -0
  336. package/dist/backend/target-diagnostics.js +15 -0
  337. package/dist/backend/target-diagnostics.js.map +1 -1
  338. package/dist/backend/target-diagnostics.test.js +1 -1
  339. package/dist/backend/warm-cache.js +8 -0
  340. package/dist/backend/warm-cache.js.map +1 -1
  341. package/dist/backend/young-nursery.d.ts +7 -0
  342. package/dist/backend/young-nursery.js +10 -0
  343. package/dist/backend/young-nursery.js.map +1 -0
  344. package/dist/cli/command.js +106 -4
  345. package/dist/cli/command.js.map +1 -1
  346. package/dist/cli/host.d.ts +3 -0
  347. package/dist/cli/output-options.d.ts +2 -0
  348. package/dist/cli/output-options.js +9 -0
  349. package/dist/cli/output-options.js.map +1 -1
  350. package/dist/cli/usage.d.ts +21 -1
  351. package/dist/cli/usage.js +43 -1
  352. package/dist/cli/usage.js.map +1 -1
  353. package/dist/compat/fetch-profile.js +10 -1
  354. package/dist/compat/fetch-profile.js.map +1 -1
  355. package/dist/compile-types.d.ts +22 -0
  356. package/dist/contracts/check.js +25 -8
  357. package/dist/contracts/check.js.map +1 -1
  358. package/dist/contracts/int32-elements.d.ts +115 -0
  359. package/dist/contracts/int32-elements.js +1179 -0
  360. package/dist/contracts/int32-elements.js.map +1 -0
  361. package/dist/coverage/report.d.ts +16 -0
  362. package/dist/coverage/report.js +182 -1
  363. package/dist/coverage/report.js.map +1 -1
  364. package/dist/coverage/surface-manifest.js +16 -3
  365. package/dist/coverage/surface-manifest.js.map +1 -1
  366. package/dist/coverage/verdict-cache.d.ts +2 -0
  367. package/dist/coverage/verdict-cache.js +12 -0
  368. package/dist/coverage/verdict-cache.js.map +1 -1
  369. package/dist/coverage/verdict-cache.test.js +2 -1
  370. package/dist/coverage/verdict-cache.test.js.map +1 -1
  371. package/dist/diagnostics/diagnostic.d.ts +10 -6
  372. package/dist/diagnostics/diagnostic.js +29 -21
  373. package/dist/diagnostics/diagnostic.js.map +1 -1
  374. package/dist/diagnostics/envelope.d.ts +39 -2
  375. package/dist/diagnostics/envelope.js.map +1 -1
  376. package/dist/diagnostics/render.d.ts +7 -0
  377. package/dist/diagnostics/render.js +50 -13
  378. package/dist/diagnostics/render.js.map +1 -1
  379. package/dist/diagnostics/render.test.d.ts +1 -0
  380. package/dist/diagnostics/render.test.js +49 -0
  381. package/dist/diagnostics/render.test.js.map +1 -0
  382. package/dist/executable/executable-cache.d.ts +27 -0
  383. package/dist/executable/executable-cache.js +19 -1
  384. package/dist/executable/executable-cache.js.map +1 -1
  385. package/dist/executable/executable-cache.test.js +12 -1
  386. package/dist/executable/executable-cache.test.js.map +1 -1
  387. package/dist/executable/prepare.js +2 -1
  388. package/dist/executable/prepare.js.map +1 -1
  389. package/dist/frontend/analysis.js +6 -1
  390. package/dist/frontend/analysis.js.map +1 -1
  391. package/dist/frontend/arguments-usage.d.ts +8 -0
  392. package/dist/frontend/arguments-usage.js +98 -0
  393. package/dist/frontend/arguments-usage.js.map +1 -1
  394. package/dist/frontend/arguments-usage.test.d.ts +1 -0
  395. package/dist/frontend/arguments-usage.test.js +32 -0
  396. package/dist/frontend/arguments-usage.test.js.map +1 -0
  397. package/dist/frontend/builtin-modules.d.ts +16 -2
  398. package/dist/frontend/builtin-modules.js +40 -7
  399. package/dist/frontend/builtin-modules.js.map +1 -1
  400. package/dist/frontend/builtin-package-aliases.d.ts +24 -0
  401. package/dist/frontend/builtin-package-aliases.js +133 -0
  402. package/dist/frontend/builtin-package-aliases.js.map +1 -0
  403. package/dist/frontend/builtin-package-aliases.test.d.ts +1 -0
  404. package/dist/frontend/builtin-package-aliases.test.js +48 -0
  405. package/dist/frontend/builtin-package-aliases.test.js.map +1 -0
  406. package/dist/frontend/cjs-syntax.js +52 -51
  407. package/dist/frontend/cjs-syntax.js.map +1 -1
  408. package/dist/frontend/contract-types.d.ts +3 -0
  409. package/dist/frontend/contract-types.js +36 -7
  410. package/dist/frontend/contract-types.js.map +1 -1
  411. package/dist/frontend/dts-paths.d.ts +4 -0
  412. package/dist/frontend/dts-paths.js +9 -1
  413. package/dist/frontend/dts-paths.js.map +1 -1
  414. package/dist/frontend/experimental-import.d.ts +5 -1
  415. package/dist/frontend/experimental-import.js +26 -7
  416. package/dist/frontend/experimental-import.js.map +1 -1
  417. package/dist/frontend/fork-target.js +20 -22
  418. package/dist/frontend/fork-target.js.map +1 -1
  419. package/dist/frontend/fork-target.test.js +2 -1
  420. package/dist/frontend/fork-target.test.js.map +1 -1
  421. package/dist/frontend/function-completion.js +6 -6
  422. package/dist/frontend/function-completion.js.map +1 -1
  423. package/dist/frontend/helper-tokens.js +15 -3
  424. package/dist/frontend/helper-tokens.js.map +1 -1
  425. package/dist/frontend/helper-tokens.test.js +7 -1
  426. package/dist/frontend/helper-tokens.test.js.map +1 -1
  427. package/dist/frontend/inferred-js-diagnostics.js +14 -17
  428. package/dist/frontend/inferred-js-diagnostics.js.map +1 -1
  429. package/dist/frontend/input-tracker.d.ts +3 -0
  430. package/dist/frontend/input-tracker.js +32 -3
  431. package/dist/frontend/input-tracker.js.map +1 -1
  432. package/dist/frontend/lib-contract.js +36 -32
  433. package/dist/frontend/lib-contract.js.map +1 -1
  434. package/dist/frontend/lib-exports.js +3 -3
  435. package/dist/frontend/lib-exports.js.map +1 -1
  436. package/dist/frontend/lowering/array-values.d.ts +8 -3
  437. package/dist/frontend/lowering/array-values.js +60 -11
  438. package/dist/frontend/lowering/array-values.js.map +1 -1
  439. package/dist/frontend/lowering/assert-instances.js +4 -4
  440. package/dist/frontend/lowering/assert-instances.js.map +1 -1
  441. package/dist/frontend/lowering/assertion-identity.d.ts +12 -0
  442. package/dist/frontend/lowering/assertion-identity.js +70 -0
  443. package/dist/frontend/lowering/assertion-identity.js.map +1 -0
  444. package/dist/frontend/lowering/assertion-members.d.ts +28 -0
  445. package/dist/frontend/lowering/assertion-members.js +185 -0
  446. package/dist/frontend/lowering/assertion-members.js.map +1 -0
  447. package/dist/frontend/lowering/binding-analysis.js +27 -20
  448. package/dist/frontend/lowering/binding-analysis.js.map +1 -1
  449. package/dist/frontend/lowering/builtin-calls.js +63 -5
  450. package/dist/frontend/lowering/builtin-calls.js.map +1 -1
  451. package/dist/frontend/lowering/builtin-function-fences.d.ts +14 -0
  452. package/dist/frontend/lowering/builtin-function-fences.js +42 -0
  453. package/dist/frontend/lowering/builtin-function-fences.js.map +1 -0
  454. package/dist/frontend/lowering/builtins/arguments.js +1 -1
  455. package/dist/frontend/lowering/builtins/arguments.js.map +1 -1
  456. package/dist/frontend/lowering/builtins/async-context.js +53 -52
  457. package/dist/frontend/lowering/builtins/async-context.js.map +1 -1
  458. package/dist/frontend/lowering/builtins/atomics.js +6 -6
  459. package/dist/frontend/lowering/builtins/atomics.js.map +1 -1
  460. package/dist/frontend/lowering/builtins/blob.js +8 -6
  461. package/dist/frontend/lowering/builtins/blob.js.map +1 -1
  462. package/dist/frontend/lowering/builtins/builtin-class-dyn.d.ts +31 -0
  463. package/dist/frontend/lowering/builtins/builtin-class-dyn.js +205 -0
  464. package/dist/frontend/lowering/builtins/builtin-class-dyn.js.map +1 -0
  465. package/dist/frontend/lowering/builtins/callable-aliases.js +17 -5
  466. package/dist/frontend/lowering/builtins/callable-aliases.js.map +1 -1
  467. package/dist/frontend/lowering/builtins/child-process-async.js +7 -7
  468. package/dist/frontend/lowering/builtins/child-process-async.js.map +1 -1
  469. package/dist/frontend/lowering/builtins/child-process-methods.d.ts +6 -4
  470. package/dist/frontend/lowering/builtins/child-process-methods.js +310 -57
  471. package/dist/frontend/lowering/builtins/child-process-methods.js.map +1 -1
  472. package/dist/frontend/lowering/builtins/child-process-sync.js +16 -10
  473. package/dist/frontend/lowering/builtins/child-process-sync.js.map +1 -1
  474. package/dist/frontend/lowering/builtins/child-process.d.ts +6 -4
  475. package/dist/frontend/lowering/builtins/child-process.js +85 -61
  476. package/dist/frontend/lowering/builtins/child-process.js.map +1 -1
  477. package/dist/frontend/lowering/builtins/class-values.d.ts +60 -0
  478. package/dist/frontend/lowering/builtins/class-values.js +226 -0
  479. package/dist/frontend/lowering/builtins/class-values.js.map +1 -0
  480. package/dist/frontend/lowering/builtins/compression.d.ts +9 -0
  481. package/dist/frontend/lowering/builtins/compression.js +107 -44
  482. package/dist/frontend/lowering/builtins/compression.js.map +1 -1
  483. package/dist/frontend/lowering/builtins/constants.d.ts +9 -1
  484. package/dist/frontend/lowering/builtins/constants.js +28 -7
  485. package/dist/frontend/lowering/builtins/constants.js.map +1 -1
  486. package/dist/frontend/lowering/builtins/crypto.d.ts +22 -0
  487. package/dist/frontend/lowering/builtins/crypto.js +215 -38
  488. package/dist/frontend/lowering/builtins/crypto.js.map +1 -1
  489. package/dist/frontend/lowering/builtins/dates.d.ts +7 -1
  490. package/dist/frontend/lowering/builtins/dates.js +92 -16
  491. package/dist/frontend/lowering/builtins/dates.js.map +1 -1
  492. package/dist/frontend/lowering/builtins/disposable-stack.d.ts +18 -0
  493. package/dist/frontend/lowering/builtins/disposable-stack.js +137 -0
  494. package/dist/frontend/lowering/builtins/disposable-stack.js.map +1 -0
  495. package/dist/frontend/lowering/builtins/ecdh.d.ts +10 -0
  496. package/dist/frontend/lowering/builtins/ecdh.js +208 -0
  497. package/dist/frontend/lowering/builtins/ecdh.js.map +1 -0
  498. package/dist/frontend/lowering/builtins/environment.js +3 -3
  499. package/dist/frontend/lowering/builtins/environment.js.map +1 -1
  500. package/dist/frontend/lowering/builtins/errors.d.ts +14 -10
  501. package/dist/frontend/lowering/builtins/errors.js +169 -3
  502. package/dist/frontend/lowering/builtins/errors.js.map +1 -1
  503. package/dist/frontend/lowering/builtins/filesystem-calls.js +128 -116
  504. package/dist/frontend/lowering/builtins/filesystem-calls.js.map +1 -1
  505. package/dist/frontend/lowering/builtins/filesystem.js +77 -77
  506. package/dist/frontend/lowering/builtins/filesystem.js.map +1 -1
  507. package/dist/frontend/lowering/builtins/fs-glob.js +3 -3
  508. package/dist/frontend/lowering/builtins/fs-glob.js.map +1 -1
  509. package/dist/frontend/lowering/builtins/fs-streams.js +10 -11
  510. package/dist/frontend/lowering/builtins/fs-streams.js.map +1 -1
  511. package/dist/frontend/lowering/builtins/ipc.js +45 -8
  512. package/dist/frontend/lowering/builtins/ipc.js.map +1 -1
  513. package/dist/frontend/lowering/builtins/json.js +284 -24
  514. package/dist/frontend/lowering/builtins/json.js.map +1 -1
  515. package/dist/frontend/lowering/builtins/key-object.js +4 -4
  516. package/dist/frontend/lowering/builtins/key-object.js.map +1 -1
  517. package/dist/frontend/lowering/builtins/module-bindings.d.ts +8 -0
  518. package/dist/frontend/lowering/builtins/module-bindings.js +71 -22
  519. package/dist/frontend/lowering/builtins/module-bindings.js.map +1 -1
  520. package/dist/frontend/lowering/builtins/module-calls.js +55 -44
  521. package/dist/frontend/lowering/builtins/module-calls.js.map +1 -1
  522. package/dist/frontend/lowering/builtins/module-resolution.d.ts +4 -3
  523. package/dist/frontend/lowering/builtins/module-resolution.js +24 -23
  524. package/dist/frontend/lowering/builtins/module-resolution.js.map +1 -1
  525. package/dist/frontend/lowering/builtins/navigator.d.ts +13 -0
  526. package/dist/frontend/lowering/builtins/navigator.js +40 -0
  527. package/dist/frontend/lowering/builtins/navigator.js.map +1 -0
  528. package/dist/frontend/lowering/builtins/net-address.d.ts +19 -0
  529. package/dist/frontend/lowering/builtins/net-address.js +156 -0
  530. package/dist/frontend/lowering/builtins/net-address.js.map +1 -0
  531. package/dist/frontend/lowering/builtins/numbers.js +25 -9
  532. package/dist/frontend/lowering/builtins/numbers.js.map +1 -1
  533. package/dist/frontend/lowering/builtins/operating-system.d.ts +4 -0
  534. package/dist/frontend/lowering/builtins/operating-system.js +25 -12
  535. package/dist/frontend/lowering/builtins/operating-system.js.map +1 -1
  536. package/dist/frontend/lowering/builtins/performance.d.ts +12 -0
  537. package/dist/frontend/lowering/builtins/performance.js +259 -8
  538. package/dist/frontend/lowering/builtins/performance.js.map +1 -1
  539. package/dist/frontend/lowering/builtins/process.d.ts +41 -1
  540. package/dist/frontend/lowering/builtins/process.js +505 -99
  541. package/dist/frontend/lowering/builtins/process.js.map +1 -1
  542. package/dist/frontend/lowering/builtins/promises.d.ts +5 -1
  543. package/dist/frontend/lowering/builtins/promises.js +326 -43
  544. package/dist/frontend/lowering/builtins/promises.js.map +1 -1
  545. package/dist/frontend/lowering/builtins/promisify-callback.d.ts +40 -0
  546. package/dist/frontend/lowering/builtins/promisify-callback.js +338 -0
  547. package/dist/frontend/lowering/builtins/promisify-callback.js.map +1 -0
  548. package/dist/frontend/lowering/builtins/properties.js +37 -1
  549. package/dist/frontend/lowering/builtins/properties.js.map +1 -1
  550. package/dist/frontend/lowering/builtins/querystring.js +14 -14
  551. package/dist/frontend/lowering/builtins/querystring.js.map +1 -1
  552. package/dist/frontend/lowering/builtins/readline.d.ts +12 -2
  553. package/dist/frontend/lowering/builtins/readline.js +136 -39
  554. package/dist/frontend/lowering/builtins/readline.js.map +1 -1
  555. package/dist/frontend/lowering/builtins/receiver-types.js +3 -5
  556. package/dist/frontend/lowering/builtins/receiver-types.js.map +1 -1
  557. package/dist/frontend/lowering/builtins/reflection.js +42 -14
  558. package/dist/frontend/lowering/builtins/reflection.js.map +1 -1
  559. package/dist/frontend/lowering/builtins/runtime-constructor.d.ts +26 -0
  560. package/dist/frontend/lowering/builtins/runtime-constructor.js +165 -0
  561. package/dist/frontend/lowering/builtins/runtime-constructor.js.map +1 -0
  562. package/dist/frontend/lowering/builtins/strings.js +101 -12
  563. package/dist/frontend/lowering/builtins/strings.js.map +1 -1
  564. package/dist/frontend/lowering/builtins/text-codecs.js +41 -38
  565. package/dist/frontend/lowering/builtins/text-codecs.js.map +1 -1
  566. package/dist/frontend/lowering/builtins/timers.js +79 -30
  567. package/dist/frontend/lowering/builtins/timers.js.map +1 -1
  568. package/dist/frontend/lowering/builtins/typed-array-members.d.ts +7 -0
  569. package/dist/frontend/lowering/builtins/typed-array-members.js +160 -0
  570. package/dist/frontend/lowering/builtins/typed-array-members.js.map +1 -0
  571. package/dist/frontend/lowering/builtins/url.d.ts +3 -0
  572. package/dist/frontend/lowering/builtins/url.js +120 -17
  573. package/dist/frontend/lowering/builtins/url.js.map +1 -1
  574. package/dist/frontend/lowering/builtins/util-types.js +20 -4
  575. package/dist/frontend/lowering/builtins/util-types.js.map +1 -1
  576. package/dist/frontend/lowering/builtins/v8.d.ts +11 -0
  577. package/dist/frontend/lowering/builtins/v8.js +105 -0
  578. package/dist/frontend/lowering/builtins/v8.js.map +1 -0
  579. package/dist/frontend/lowering/builtins/webassembly.d.ts +33 -0
  580. package/dist/frontend/lowering/builtins/webassembly.js +388 -0
  581. package/dist/frontend/lowering/builtins/webassembly.js.map +1 -0
  582. package/dist/frontend/lowering/builtins/webcrypto.d.ts +20 -0
  583. package/dist/frontend/lowering/builtins/webcrypto.js +112 -0
  584. package/dist/frontend/lowering/builtins/webcrypto.js.map +1 -0
  585. package/dist/frontend/lowering/builtins/workers.d.ts +12 -0
  586. package/dist/frontend/lowering/builtins/workers.js +193 -8
  587. package/dist/frontend/lowering/builtins/workers.js.map +1 -1
  588. package/dist/frontend/lowering/call-arguments.js +69 -14
  589. package/dist/frontend/lowering/call-arguments.js.map +1 -1
  590. package/dist/frontend/lowering/call-signatures.d.ts +23 -1
  591. package/dist/frontend/lowering/call-signatures.js +379 -55
  592. package/dist/frontend/lowering/call-signatures.js.map +1 -1
  593. package/dist/frontend/lowering/checked-promise-all.d.ts +3 -0
  594. package/dist/frontend/lowering/checked-promise-all.js +1 -1
  595. package/dist/frontend/lowering/checked-promise-all.js.map +1 -1
  596. package/dist/frontend/lowering/cjs-exports-object.d.ts +53 -0
  597. package/dist/frontend/lowering/cjs-exports-object.js +561 -0
  598. package/dist/frontend/lowering/cjs-exports-object.js.map +1 -0
  599. package/dist/frontend/lowering/cjs-inline-require.d.ts +86 -0
  600. package/dist/frontend/lowering/cjs-inline-require.js +314 -0
  601. package/dist/frontend/lowering/cjs-inline-require.js.map +1 -0
  602. package/dist/frontend/lowering/cjs-tsc-interop.d.ts +28 -0
  603. package/dist/frontend/lowering/cjs-tsc-interop.js +208 -0
  604. package/dist/frontend/lowering/cjs-tsc-interop.js.map +1 -0
  605. package/dist/frontend/lowering/class-attributes.d.ts +19 -0
  606. package/dist/frontend/lowering/class-attributes.js +378 -0
  607. package/dist/frontend/lowering/class-attributes.js.map +1 -0
  608. package/dist/frontend/lowering/class-callbacks.d.ts +3 -1
  609. package/dist/frontend/lowering/class-callbacks.js +21 -10
  610. package/dist/frontend/lowering/class-callbacks.js.map +1 -1
  611. package/dist/frontend/lowering/class-construction.js +49 -4
  612. package/dist/frontend/lowering/class-construction.js.map +1 -1
  613. package/dist/frontend/lowering/class-descriptors.d.ts +2 -0
  614. package/dist/frontend/lowering/class-descriptors.js +8 -8
  615. package/dist/frontend/lowering/class-descriptors.js.map +1 -1
  616. package/dist/frontend/lowering/class-dynamic-dispatch.d.ts +64 -0
  617. package/dist/frontend/lowering/class-dynamic-dispatch.js +1124 -90
  618. package/dist/frontend/lowering/class-dynamic-dispatch.js.map +1 -1
  619. package/dist/frontend/lowering/class-instance-constructor.js +1 -1
  620. package/dist/frontend/lowering/class-instance-constructor.js.map +1 -1
  621. package/dist/frontend/lowering/class-iterables.d.ts +11 -0
  622. package/dist/frontend/lowering/class-iterables.js +31 -0
  623. package/dist/frontend/lowering/class-iterables.js.map +1 -0
  624. package/dist/frontend/lowering/class-method-mutations.js +73 -35
  625. package/dist/frontend/lowering/class-method-mutations.js.map +1 -1
  626. package/dist/frontend/lowering/class-method-values.js +56 -10
  627. package/dist/frontend/lowering/class-method-values.js.map +1 -1
  628. package/dist/frontend/lowering/class-protocol-dispatch.js +24 -22
  629. package/dist/frontend/lowering/class-protocol-dispatch.js.map +1 -1
  630. package/dist/frontend/lowering/class-protocols.d.ts +10 -0
  631. package/dist/frontend/lowering/class-protocols.js +76 -45
  632. package/dist/frontend/lowering/class-protocols.js.map +1 -1
  633. package/dist/frontend/lowering/class-prototypes.d.ts +6 -0
  634. package/dist/frontend/lowering/class-prototypes.js +86 -19
  635. package/dist/frontend/lowering/class-prototypes.js.map +1 -1
  636. package/dist/frontend/lowering/class-runtime-statics.js +1 -1
  637. package/dist/frontend/lowering/class-runtime-statics.js.map +1 -1
  638. package/dist/frontend/lowering/class-static-data.js +2 -2
  639. package/dist/frontend/lowering/class-static-data.js.map +1 -1
  640. package/dist/frontend/lowering/class-to-primitive.d.ts +25 -0
  641. package/dist/frontend/lowering/class-to-primitive.js +264 -0
  642. package/dist/frontend/lowering/class-to-primitive.js.map +1 -0
  643. package/dist/frontend/lowering/class-unions.d.ts +25 -0
  644. package/dist/frontend/lowering/class-unions.js +102 -1
  645. package/dist/frontend/lowering/class-unions.js.map +1 -1
  646. package/dist/frontend/lowering/code-generation.d.ts +14 -0
  647. package/dist/frontend/lowering/code-generation.js +127 -0
  648. package/dist/frontend/lowering/code-generation.js.map +1 -0
  649. package/dist/frontend/lowering/coercions/fresh-spread.d.ts +13 -0
  650. package/dist/frontend/lowering/coercions/fresh-spread.js +95 -0
  651. package/dist/frontend/lowering/coercions/fresh-spread.js.map +1 -0
  652. package/dist/frontend/lowering/coercions/function-adapters.d.ts +16 -2
  653. package/dist/frontend/lowering/coercions/function-adapters.js +239 -68
  654. package/dist/frontend/lowering/coercions/function-adapters.js.map +1 -1
  655. package/dist/frontend/lowering/coercions/structural-plans.js +25 -3
  656. package/dist/frontend/lowering/coercions/structural-plans.js.map +1 -1
  657. package/dist/frontend/lowering/coercions/structural.js +35 -3
  658. package/dist/frontend/lowering/coercions/structural.js.map +1 -1
  659. package/dist/frontend/lowering/coercions/unions.d.ts +15 -0
  660. package/dist/frontend/lowering/coercions/unions.js +57 -1
  661. package/dist/frontend/lowering/coercions/unions.js.map +1 -1
  662. package/dist/frontend/lowering/collection-ingestion.js +2 -2
  663. package/dist/frontend/lowering/collection-ingestion.js.map +1 -1
  664. package/dist/frontend/lowering/collection-narrowing.js +2 -4
  665. package/dist/frontend/lowering/collection-narrowing.js.map +1 -1
  666. package/dist/frontend/lowering/construction-escapes.js +8 -8
  667. package/dist/frontend/lowering/construction-escapes.js.map +1 -1
  668. package/dist/frontend/lowering/construction-escapes.test.js +4 -4
  669. package/dist/frontend/lowering/construction-escapes.test.js.map +1 -1
  670. package/dist/frontend/lowering/constructor-returns.d.ts +61 -0
  671. package/dist/frontend/lowering/constructor-returns.js +477 -0
  672. package/dist/frontend/lowering/constructor-returns.js.map +1 -0
  673. package/dist/frontend/lowering/containers/array-callback-call.js +1 -1
  674. package/dist/frontend/lowering/containers/array-callback-call.js.map +1 -1
  675. package/dist/frontend/lowering/containers/array-callbacks.d.ts +17 -0
  676. package/dist/frontend/lowering/containers/array-callbacks.js +287 -118
  677. package/dist/frontend/lowering/containers/array-callbacks.js.map +1 -1
  678. package/dist/frontend/lowering/containers/array-concat.js +1 -1
  679. package/dist/frontend/lowering/containers/array-concat.js.map +1 -1
  680. package/dist/frontend/lowering/containers/array-construction.d.ts +0 -1
  681. package/dist/frontend/lowering/containers/array-construction.js +58 -13
  682. package/dist/frontend/lowering/containers/array-construction.js.map +1 -1
  683. package/dist/frontend/lowering/containers/array-from-async.d.ts +6 -5
  684. package/dist/frontend/lowering/containers/array-from-async.js +159 -14
  685. package/dist/frontend/lowering/containers/array-from-async.js.map +1 -1
  686. package/dist/frontend/lowering/containers/array-methods.js +94 -77
  687. package/dist/frontend/lowering/containers/array-methods.js.map +1 -1
  688. package/dist/frontend/lowering/containers/array-pipelines.js +1 -0
  689. package/dist/frontend/lowering/containers/array-pipelines.js.map +1 -1
  690. package/dist/frontend/lowering/containers/bytes.d.ts +9 -0
  691. package/dist/frontend/lowering/containers/bytes.js +649 -113
  692. package/dist/frontend/lowering/containers/bytes.js.map +1 -1
  693. package/dist/frontend/lowering/containers/callback-arguments.d.ts +9 -1
  694. package/dist/frontend/lowering/containers/callback-arguments.js +55 -5
  695. package/dist/frontend/lowering/containers/callback-arguments.js.map +1 -1
  696. package/dist/frontend/lowering/containers/collection-grouping.d.ts +7 -8
  697. package/dist/frontend/lowering/containers/collection-grouping.js +217 -26
  698. package/dist/frontend/lowering/containers/collection-grouping.js.map +1 -1
  699. package/dist/frontend/lowering/containers/collection-methods.js +126 -28
  700. package/dist/frontend/lowering/containers/collection-methods.js.map +1 -1
  701. package/dist/frontend/lowering/containers/dynamic-receivers.js +1 -1
  702. package/dist/frontend/lowering/containers/dynamic-receivers.js.map +1 -1
  703. package/dist/frontend/lowering/containers/exec-result-uses.js +2 -2
  704. package/dist/frontend/lowering/containers/exec-result-uses.js.map +1 -1
  705. package/dist/frontend/lowering/containers/for-of.d.ts +6 -0
  706. package/dist/frontend/lowering/containers/for-of.js +19 -19
  707. package/dist/frontend/lowering/containers/for-of.js.map +1 -1
  708. package/dist/frontend/lowering/containers/indexed-objects.js +142 -57
  709. package/dist/frontend/lowering/containers/indexed-objects.js.map +1 -1
  710. package/dist/frontend/lowering/containers/iterator-helpers.d.ts +53 -4
  711. package/dist/frontend/lowering/containers/iterator-helpers.js +1581 -462
  712. package/dist/frontend/lowering/containers/iterator-helpers.js.map +1 -1
  713. package/dist/frontend/lowering/containers/match-row-uses.d.ts +17 -0
  714. package/dist/frontend/lowering/containers/match-row-uses.js +264 -0
  715. package/dist/frontend/lowering/containers/match-row-uses.js.map +1 -0
  716. package/dist/frontend/lowering/containers/string-and-regexp.d.ts +14 -0
  717. package/dist/frontend/lowering/containers/string-and-regexp.js +455 -30
  718. package/dist/frontend/lowering/containers/string-and-regexp.js.map +1 -1
  719. package/dist/frontend/lowering/containers/string-replacement.js +1 -1
  720. package/dist/frontend/lowering/containers/string-replacement.js.map +1 -1
  721. package/dist/frontend/lowering/cycle-initialization.d.ts +30 -10
  722. package/dist/frontend/lowering/cycle-initialization.js +191 -35
  723. package/dist/frontend/lowering/cycle-initialization.js.map +1 -1
  724. package/dist/frontend/lowering/deferred-module-initializers.js +47 -43
  725. package/dist/frontend/lowering/deferred-module-initializers.js.map +1 -1
  726. package/dist/frontend/lowering/devirtualize.d.ts +1 -1
  727. package/dist/frontend/lowering/devirtualize.js +27 -7
  728. package/dist/frontend/lowering/devirtualize.js.map +1 -1
  729. package/dist/frontend/lowering/divergences.d.ts +0 -5
  730. package/dist/frontend/lowering/divergences.js +62 -125
  731. package/dist/frontend/lowering/divergences.js.map +1 -1
  732. package/dist/frontend/lowering/dyn-streams.d.ts +25 -0
  733. package/dist/frontend/lowering/dyn-streams.js +257 -0
  734. package/dist/frontend/lowering/dyn-streams.js.map +1 -0
  735. package/dist/frontend/lowering/error-methods.js +4 -1
  736. package/dist/frontend/lowering/error-methods.js.map +1 -1
  737. package/dist/frontend/lowering/error-name-order.d.ts +19 -0
  738. package/dist/frontend/lowering/error-name-order.js +93 -0
  739. package/dist/frontend/lowering/error-name-order.js.map +1 -0
  740. package/dist/frontend/lowering/expressions/array-literals.d.ts +21 -0
  741. package/dist/frontend/lowering/expressions/array-literals.js +723 -0
  742. package/dist/frontend/lowering/expressions/array-literals.js.map +1 -0
  743. package/dist/frontend/lowering/expressions/binary.d.ts +35 -0
  744. package/dist/frontend/lowering/expressions/binary.js +2557 -0
  745. package/dist/frontend/lowering/expressions/binary.js.map +1 -0
  746. package/dist/frontend/lowering/expressions/element-access.d.ts +31 -0
  747. package/dist/frontend/lowering/expressions/element-access.js +1804 -0
  748. package/dist/frontend/lowering/expressions/element-access.js.map +1 -0
  749. package/dist/frontend/lowering/expressions/evaluation-safety.js +4 -3
  750. package/dist/frontend/lowering/expressions/evaluation-safety.js.map +1 -1
  751. package/dist/frontend/lowering/expressions/hosted-narrowing.d.ts +38 -0
  752. package/dist/frontend/lowering/expressions/hosted-narrowing.js +160 -0
  753. package/dist/frontend/lowering/expressions/hosted-narrowing.js.map +1 -0
  754. package/dist/frontend/lowering/expressions/identifiers.d.ts +4 -0
  755. package/dist/frontend/lowering/expressions/identifiers.js +830 -0
  756. package/dist/frontend/lowering/expressions/identifiers.js.map +1 -0
  757. package/dist/frontend/lowering/expressions/keyed-field-targets.d.ts +52 -0
  758. package/dist/frontend/lowering/expressions/keyed-field-targets.js +307 -0
  759. package/dist/frontend/lowering/expressions/keyed-field-targets.js.map +1 -0
  760. package/dist/frontend/lowering/expressions/narrowing.d.ts +37 -0
  761. package/dist/frontend/lowering/expressions/narrowing.js +1337 -0
  762. package/dist/frontend/lowering/expressions/narrowing.js.map +1 -0
  763. package/dist/frontend/lowering/expressions/native-proxy.js +4 -4
  764. package/dist/frontend/lowering/expressions/native-proxy.js.map +1 -1
  765. package/dist/frontend/lowering/expressions/nullish-assignment.js +45 -0
  766. package/dist/frontend/lowering/expressions/nullish-assignment.js.map +1 -1
  767. package/dist/frontend/lowering/expressions/object-literals.d.ts +10 -0
  768. package/dist/frontend/lowering/expressions/object-literals.js +301 -86
  769. package/dist/frontend/lowering/expressions/object-literals.js.map +1 -1
  770. package/dist/frontend/lowering/expressions/optional-chains.d.ts +3 -2
  771. package/dist/frontend/lowering/expressions/optional-chains.js +103 -17
  772. package/dist/frontend/lowering/expressions/optional-chains.js.map +1 -1
  773. package/dist/frontend/lowering/expressions/property-access.d.ts +115 -0
  774. package/dist/frontend/lowering/expressions/property-access.js +3787 -0
  775. package/dist/frontend/lowering/expressions/property-access.js.map +1 -0
  776. package/dist/frontend/lowering/expressions/relational.d.ts +28 -0
  777. package/dist/frontend/lowering/expressions/relational.js +1724 -0
  778. package/dist/frontend/lowering/expressions/relational.js.map +1 -0
  779. package/dist/frontend/lowering/expressions/typeof.d.ts +22 -0
  780. package/dist/frontend/lowering/expressions/typeof.js +551 -0
  781. package/dist/frontend/lowering/expressions/typeof.js.map +1 -0
  782. package/dist/frontend/lowering/expressions/union-fields.js +1 -1
  783. package/dist/frontend/lowering/expressions/union-fields.js.map +1 -1
  784. package/dist/frontend/lowering/expressions/updates.d.ts +21 -0
  785. package/dist/frontend/lowering/expressions/updates.js +780 -0
  786. package/dist/frontend/lowering/expressions/updates.js.map +1 -0
  787. package/dist/frontend/lowering/function-context.d.ts +10 -0
  788. package/dist/frontend/lowering/function-context.js +11 -1
  789. package/dist/frontend/lowering/function-context.js.map +1 -1
  790. package/dist/frontend/lowering/function-returns.js +52 -28
  791. package/dist/frontend/lowering/function-returns.js.map +1 -1
  792. package/dist/frontend/lowering/general-streams.d.ts +25 -0
  793. package/dist/frontend/lowering/general-streams.js +108 -0
  794. package/dist/frontend/lowering/general-streams.js.map +1 -0
  795. package/dist/frontend/lowering/generator-delegation.d.ts +8 -0
  796. package/dist/frontend/lowering/generator-delegation.js +191 -1
  797. package/dist/frontend/lowering/generator-delegation.js.map +1 -1
  798. package/dist/frontend/lowering/generator-dynamic-dispatch.d.ts +7 -0
  799. package/dist/frontend/lowering/generator-dynamic-dispatch.js +172 -69
  800. package/dist/frontend/lowering/generator-dynamic-dispatch.js.map +1 -1
  801. package/dist/frontend/lowering/generic-functions.d.ts +43 -0
  802. package/dist/frontend/lowering/generic-functions.js +593 -118
  803. package/dist/frontend/lowering/generic-functions.js.map +1 -1
  804. package/dist/frontend/lowering/handle-properties.d.ts +24 -0
  805. package/dist/frontend/lowering/handle-properties.js +281 -0
  806. package/dist/frontend/lowering/handle-properties.js.map +1 -0
  807. package/dist/frontend/lowering/import-meta.js +2 -2
  808. package/dist/frontend/lowering/import-meta.js.map +1 -1
  809. package/dist/frontend/lowering/intern-tables.js +10 -9
  810. package/dist/frontend/lowering/intern-tables.js.map +1 -1
  811. package/dist/frontend/lowering/iterable-spelling.d.ts +7 -0
  812. package/dist/frontend/lowering/iterable-spelling.js +38 -0
  813. package/dist/frontend/lowering/iterable-spelling.js.map +1 -0
  814. package/dist/frontend/lowering/iterator-adapters.d.ts +19 -0
  815. package/dist/frontend/lowering/iterator-adapters.js +331 -3
  816. package/dist/frontend/lowering/iterator-adapters.js.map +1 -1
  817. package/dist/frontend/lowering/js-class-fields.d.ts +28 -0
  818. package/dist/frontend/lowering/js-class-fields.js +170 -0
  819. package/dist/frontend/lowering/js-class-fields.js.map +1 -0
  820. package/dist/frontend/lowering/js-dynamic-objects.d.ts +15 -0
  821. package/dist/frontend/lowering/js-dynamic-objects.js +299 -0
  822. package/dist/frontend/lowering/js-dynamic-objects.js.map +1 -0
  823. package/dist/frontend/lowering/js-dynamic-objects.test.d.ts +1 -0
  824. package/dist/frontend/lowering/js-dynamic-objects.test.js +35 -0
  825. package/dist/frontend/lowering/js-dynamic-objects.test.js.map +1 -0
  826. package/dist/frontend/lowering/json-require.d.ts +22 -0
  827. package/dist/frontend/lowering/json-require.js +131 -0
  828. package/dist/frontend/lowering/json-require.js.map +1 -0
  829. package/dist/frontend/lowering/key-order-witness.d.ts +44 -0
  830. package/dist/frontend/lowering/key-order-witness.js +641 -0
  831. package/dist/frontend/lowering/key-order-witness.js.map +1 -0
  832. package/dist/frontend/lowering/key-order-witness.test.d.ts +1 -0
  833. package/dist/frontend/lowering/key-order-witness.test.js +239 -0
  834. package/dist/frontend/lowering/key-order-witness.test.js.map +1 -0
  835. package/dist/frontend/lowering/lifetime-regions.js +7 -7
  836. package/dist/frontend/lowering/lifetime-regions.js.map +1 -1
  837. package/dist/frontend/lowering/lower-array-sort.d.ts +33 -15
  838. package/dist/frontend/lowering/lower-array-sort.js +117 -21
  839. package/dist/frontend/lowering/lower-array-sort.js.map +1 -1
  840. package/dist/frontend/lowering/lower-array-sort.test.js +93 -14
  841. package/dist/frontend/lowering/lower-array-sort.test.js.map +1 -1
  842. package/dist/frontend/lowering/lower-assert.js +61 -60
  843. package/dist/frontend/lowering/lower-assert.js.map +1 -1
  844. package/dist/frontend/lowering/lower-async-iteration.d.ts +10 -1
  845. package/dist/frontend/lowering/lower-async-iteration.js +34 -6
  846. package/dist/frontend/lowering/lower-async-iteration.js.map +1 -1
  847. package/dist/frontend/lowering/lower-builtin-values.d.ts +5 -0
  848. package/dist/frontend/lowering/lower-builtin-values.js +33 -3
  849. package/dist/frontend/lowering/lower-builtin-values.js.map +1 -1
  850. package/dist/frontend/lowering/lower-calls.js +1404 -448
  851. package/dist/frontend/lowering/lower-calls.js.map +1 -1
  852. package/dist/frontend/lowering/lower-classes.d.ts +54 -3
  853. package/dist/frontend/lowering/lower-classes.js +1529 -472
  854. package/dist/frontend/lowering/lower-classes.js.map +1 -1
  855. package/dist/frontend/lowering/lower-comptime.d.ts +4 -2
  856. package/dist/frontend/lowering/lower-comptime.js +111 -13
  857. package/dist/frontend/lowering/lower-comptime.js.map +1 -1
  858. package/dist/frontend/lowering/lower-console.js +13 -11
  859. package/dist/frontend/lowering/lower-console.js.map +1 -1
  860. package/dist/frontend/lowering/lower-dgram.d.ts +10 -0
  861. package/dist/frontend/lowering/lower-dgram.js +241 -21
  862. package/dist/frontend/lowering/lower-dgram.js.map +1 -1
  863. package/dist/frontend/lowering/lower-enums.js +113 -14
  864. package/dist/frontend/lowering/lower-enums.js.map +1 -1
  865. package/dist/frontend/lowering/lower-event-emitter.d.ts +16 -7
  866. package/dist/frontend/lowering/lower-event-emitter.js +258 -70
  867. package/dist/frontend/lowering/lower-event-emitter.js.map +1 -1
  868. package/dist/frontend/lowering/lower-event-target.js +2 -2
  869. package/dist/frontend/lowering/lower-event-target.js.map +1 -1
  870. package/dist/frontend/lowering/lower-expando.js +17 -13
  871. package/dist/frontend/lowering/lower-expando.js.map +1 -1
  872. package/dist/frontend/lowering/lower-exprs.d.ts +188 -186
  873. package/dist/frontend/lowering/lower-exprs.js +1509 -12486
  874. package/dist/frontend/lowering/lower-exprs.js.map +1 -1
  875. package/dist/frontend/lowering/lower-functions.js +72 -22
  876. package/dist/frontend/lowering/lower-functions.js.map +1 -1
  877. package/dist/frontend/lowering/lower-generators.d.ts +6 -0
  878. package/dist/frontend/lowering/lower-generators.js +39 -20
  879. package/dist/frontend/lowering/lower-generators.js.map +1 -1
  880. package/dist/frontend/lowering/lower-global-value.js +5 -1
  881. package/dist/frontend/lowering/lower-global-value.js.map +1 -1
  882. package/dist/frontend/lowering/lower-inspect.js +900 -107
  883. package/dist/frontend/lowering/lower-inspect.js.map +1 -1
  884. package/dist/frontend/lowering/lower-mixins.js +23 -20
  885. package/dist/frontend/lowering/lower-mixins.js.map +1 -1
  886. package/dist/frontend/lowering/lower-mock.d.ts +8 -1
  887. package/dist/frontend/lowering/lower-mock.js +185 -18
  888. package/dist/frontend/lowering/lower-mock.js.map +1 -1
  889. package/dist/frontend/lowering/lower-modules.d.ts +11 -3
  890. package/dist/frontend/lowering/lower-modules.js +445 -94
  891. package/dist/frontend/lowering/lower-modules.js.map +1 -1
  892. package/dist/frontend/lowering/lower-namespaces.d.ts +6 -0
  893. package/dist/frontend/lowering/lower-namespaces.js +65 -33
  894. package/dist/frontend/lowering/lower-namespaces.js.map +1 -1
  895. package/dist/frontend/lowering/lower-node-module.d.ts +16 -0
  896. package/dist/frontend/lowering/lower-node-module.js +147 -14
  897. package/dist/frontend/lowering/lower-node-module.js.map +1 -1
  898. package/dist/frontend/lowering/lower-server.d.ts +6 -6
  899. package/dist/frontend/lowering/lower-server.js +514 -101
  900. package/dist/frontend/lowering/lower-server.js.map +1 -1
  901. package/dist/frontend/lowering/lower-stdlib.d.ts +4 -0
  902. package/dist/frontend/lowering/lower-stdlib.js +179 -118
  903. package/dist/frontend/lowering/lower-stdlib.js.map +1 -1
  904. package/dist/frontend/lowering/lower-stmts.d.ts +30 -7
  905. package/dist/frontend/lowering/lower-stmts.js +1950 -433
  906. package/dist/frontend/lowering/lower-stmts.js.map +1 -1
  907. package/dist/frontend/lowering/lower-stream.d.ts +3 -0
  908. package/dist/frontend/lowering/lower-stream.js +398 -56
  909. package/dist/frontend/lowering/lower-stream.js.map +1 -1
  910. package/dist/frontend/lowering/lower-test.d.ts +3 -0
  911. package/dist/frontend/lowering/lower-test.js +437 -62
  912. package/dist/frontend/lowering/lower-test.js.map +1 -1
  913. package/dist/frontend/lowering/lower-timers.js +96 -32
  914. package/dist/frontend/lowering/lower-timers.js.map +1 -1
  915. package/dist/frontend/lowering/lower-url.js +1 -1
  916. package/dist/frontend/lowering/lower-url.js.map +1 -1
  917. package/dist/frontend/lowering/lowerer.d.ts +424 -27
  918. package/dist/frontend/lowering/lowerer.js +2062 -310
  919. package/dist/frontend/lowering/lowerer.js.map +1 -1
  920. package/dist/frontend/lowering/lowerer.test.js +10 -4
  921. package/dist/frontend/lowering/lowerer.test.js.map +1 -1
  922. package/dist/frontend/lowering/maybe-promise.d.ts +46 -0
  923. package/dist/frontend/lowering/maybe-promise.js +249 -0
  924. package/dist/frontend/lowering/maybe-promise.js.map +1 -0
  925. package/dist/frontend/lowering/module-member-this.d.ts +3 -0
  926. package/dist/frontend/lowering/module-member-this.js +262 -0
  927. package/dist/frontend/lowering/module-member-this.js.map +1 -0
  928. package/dist/frontend/lowering/module-namespace-elements.js +1 -1
  929. package/dist/frontend/lowering/module-namespace-elements.js.map +1 -1
  930. package/dist/frontend/lowering/nan-coded-reads.d.ts +3 -0
  931. package/dist/frontend/lowering/nan-coded-reads.js +45 -32
  932. package/dist/frontend/lowering/nan-coded-reads.js.map +1 -1
  933. package/dist/frontend/lowering/narrowing-stability.d.ts +18 -3
  934. package/dist/frontend/lowering/narrowing-stability.js +104 -32
  935. package/dist/frontend/lowering/narrowing-stability.js.map +1 -1
  936. package/dist/frontend/lowering/native-ffi.js +11 -11
  937. package/dist/frontend/lowering/native-ffi.js.map +1 -1
  938. package/dist/frontend/lowering/object-factory-new.js +6 -8
  939. package/dist/frontend/lowering/object-factory-new.js.map +1 -1
  940. package/dist/frontend/lowering/private-brands.d.ts +46 -0
  941. package/dist/frontend/lowering/private-brands.js +265 -0
  942. package/dist/frontend/lowering/private-brands.js.map +1 -0
  943. package/dist/frontend/lowering/promise-executor-adapter.d.ts +11 -0
  944. package/dist/frontend/lowering/promise-executor-adapter.js +87 -0
  945. package/dist/frontend/lowering/promise-executor-adapter.js.map +1 -0
  946. package/dist/frontend/lowering/rebindable-functions.d.ts +8 -0
  947. package/dist/frontend/lowering/rebindable-functions.js +54 -0
  948. package/dist/frontend/lowering/rebindable-functions.js.map +1 -0
  949. package/dist/frontend/lowering/require-initialization.d.ts +32 -0
  950. package/dist/frontend/lowering/require-initialization.js +246 -0
  951. package/dist/frontend/lowering/require-initialization.js.map +1 -0
  952. package/dist/frontend/lowering/runtime-optional-bounds.js +7 -7
  953. package/dist/frontend/lowering/runtime-optional-bounds.js.map +1 -1
  954. package/dist/frontend/lowering/runtime-optional-elements.js +12 -12
  955. package/dist/frontend/lowering/runtime-optional-elements.js.map +1 -1
  956. package/dist/frontend/lowering/runtime-optional-guards.js +10 -10
  957. package/dist/frontend/lowering/runtime-optional-guards.js.map +1 -1
  958. package/dist/frontend/lowering/runtime-optional-guards.test.js +1 -1
  959. package/dist/frontend/lowering/runtime-optional-guards.test.js.map +1 -1
  960. package/dist/frontend/lowering/runtime-optional-ownership.js +10 -9
  961. package/dist/frontend/lowering/runtime-optional-ownership.js.map +1 -1
  962. package/dist/frontend/lowering/runtime-optional-provenance.js +2 -2
  963. package/dist/frontend/lowering/runtime-optional-provenance.js.map +1 -1
  964. package/dist/frontend/lowering/runtime-optional-records.d.ts +35 -0
  965. package/dist/frontend/lowering/runtime-optional-records.js +205 -32
  966. package/dist/frontend/lowering/runtime-optional-records.js.map +1 -1
  967. package/dist/frontend/lowering/runtime-optional-records.test.js +19 -1
  968. package/dist/frontend/lowering/runtime-optional-records.test.js.map +1 -1
  969. package/dist/frontend/lowering/sanitize-class-types.test.js +2 -2
  970. package/dist/frontend/lowering/split-consumers.js +4 -4
  971. package/dist/frontend/lowering/split-consumers.js.map +1 -1
  972. package/dist/frontend/lowering/static-function-names.d.ts +28 -0
  973. package/dist/frontend/lowering/static-function-names.js +212 -0
  974. package/dist/frontend/lowering/static-function-names.js.map +1 -0
  975. package/dist/frontend/lowering/static-this.js +6 -6
  976. package/dist/frontend/lowering/static-this.js.map +1 -1
  977. package/dist/frontend/lowering/static-typeof.d.ts +26 -0
  978. package/dist/frontend/lowering/static-typeof.js +133 -0
  979. package/dist/frontend/lowering/static-typeof.js.map +1 -0
  980. package/dist/frontend/lowering/strict-mode.d.ts +5 -0
  981. package/dist/frontend/lowering/strict-mode.js +31 -0
  982. package/dist/frontend/lowering/strict-mode.js.map +1 -0
  983. package/dist/frontend/lowering/string-index-bounds.js +13 -12
  984. package/dist/frontend/lowering/string-index-bounds.js.map +1 -1
  985. package/dist/frontend/lowering/string-index.d.ts +12 -0
  986. package/dist/frontend/lowering/string-index.js +72 -1
  987. package/dist/frontend/lowering/string-index.js.map +1 -1
  988. package/dist/frontend/lowering/surfaces.d.ts +12 -3
  989. package/dist/frontend/lowering/surfaces.js +282 -45
  990. package/dist/frontend/lowering/surfaces.js.map +1 -1
  991. package/dist/frontend/lowering/symbol-fields.d.ts +7 -0
  992. package/dist/frontend/lowering/symbol-fields.js +204 -36
  993. package/dist/frontend/lowering/symbol-fields.js.map +1 -1
  994. package/dist/frontend/lowering/symbol-methods.d.ts +2 -1
  995. package/dist/frontend/lowering/symbol-methods.js +24 -6
  996. package/dist/frontend/lowering/symbol-methods.js.map +1 -1
  997. package/dist/frontend/lowering/thenables.d.ts +16 -0
  998. package/dist/frontend/lowering/thenables.js +124 -0
  999. package/dist/frontend/lowering/thenables.js.map +1 -0
  1000. package/dist/frontend/lowering/thread-slots.d.ts +13 -0
  1001. package/dist/frontend/lowering/thread-slots.js +208 -0
  1002. package/dist/frontend/lowering/thread-slots.js.map +1 -0
  1003. package/dist/frontend/lowering/typed-arguments.d.ts +74 -0
  1004. package/dist/frontend/lowering/typed-arguments.js +472 -0
  1005. package/dist/frontend/lowering/typed-arguments.js.map +1 -0
  1006. package/dist/frontend/lowering/union-retag.d.ts +8 -0
  1007. package/dist/frontend/lowering/union-retag.js +27 -0
  1008. package/dist/frontend/lowering/union-retag.js.map +1 -1
  1009. package/dist/frontend/lowering/union-retag.test.js +24 -1
  1010. package/dist/frontend/lowering/union-retag.test.js.map +1 -1
  1011. package/dist/frontend/lowering/var-hoisting.js +6 -6
  1012. package/dist/frontend/lowering/var-hoisting.js.map +1 -1
  1013. package/dist/frontend/lowering/width-lift.d.ts +4 -0
  1014. package/dist/frontend/mock-shapes.js +13 -6
  1015. package/dist/frontend/mock-shapes.js.map +1 -1
  1016. package/dist/frontend/module-source-candidates.js +1 -1
  1017. package/dist/frontend/module-source-candidates.js.map +1 -1
  1018. package/dist/frontend/module-source-candidates.test.js +2 -1
  1019. package/dist/frontend/module-source-candidates.test.js.map +1 -1
  1020. package/dist/frontend/module-syntax.js +8 -8
  1021. package/dist/frontend/module-syntax.js.map +1 -1
  1022. package/dist/frontend/npm-static-builtin-aliases.d.ts +8 -0
  1023. package/dist/frontend/npm-static-builtin-aliases.js +65 -0
  1024. package/dist/frontend/npm-static-builtin-aliases.js.map +1 -0
  1025. package/dist/frontend/npm-static-bundled-chunks.d.ts +58 -0
  1026. package/dist/frontend/npm-static-bundled-chunks.js +981 -0
  1027. package/dist/frontend/npm-static-bundled-chunks.js.map +1 -0
  1028. package/dist/frontend/npm-static-bundled-chunks.test.d.ts +1 -0
  1029. package/dist/frontend/npm-static-bundled-chunks.test.js +399 -0
  1030. package/dist/frontend/npm-static-bundled-chunks.test.js.map +1 -0
  1031. package/dist/frontend/npm-static-bundled-cjs.js +24 -23
  1032. package/dist/frontend/npm-static-bundled-cjs.js.map +1 -1
  1033. package/dist/frontend/npm-static-bundled-esm.d.ts +9 -0
  1034. package/dist/frontend/npm-static-bundled-esm.js +988 -0
  1035. package/dist/frontend/npm-static-bundled-esm.js.map +1 -0
  1036. package/dist/frontend/npm-static-bundled-esm.test.d.ts +1 -0
  1037. package/dist/frontend/npm-static-bundled-esm.test.js +336 -0
  1038. package/dist/frontend/npm-static-bundled-esm.test.js.map +1 -0
  1039. package/dist/frontend/npm-static-cjs-exports-alias.d.ts +2 -0
  1040. package/dist/frontend/npm-static-cjs-exports-alias.js +186 -0
  1041. package/dist/frontend/npm-static-cjs-exports-alias.js.map +1 -0
  1042. package/dist/frontend/npm-static-cjs-exports-alias.test.d.ts +1 -0
  1043. package/dist/frontend/npm-static-cjs-exports-alias.test.js +73 -0
  1044. package/dist/frontend/npm-static-cjs-exports-alias.test.js.map +1 -0
  1045. package/dist/frontend/npm-static-cjs-exports-var.d.ts +2 -0
  1046. package/dist/frontend/npm-static-cjs-exports-var.js +236 -0
  1047. package/dist/frontend/npm-static-cjs-exports-var.js.map +1 -0
  1048. package/dist/frontend/npm-static-declaration-syntax.js +102 -101
  1049. package/dist/frontend/npm-static-declaration-syntax.js.map +1 -1
  1050. package/dist/frontend/npm-static-enum-iife.d.ts +6 -0
  1051. package/dist/frontend/npm-static-enum-iife.js +280 -0
  1052. package/dist/frontend/npm-static-enum-iife.js.map +1 -0
  1053. package/dist/frontend/npm-static-enum-iife.test.d.ts +1 -0
  1054. package/dist/frontend/npm-static-enum-iife.test.js +116 -0
  1055. package/dist/frontend/npm-static-enum-iife.test.js.map +1 -0
  1056. package/dist/frontend/npm-static-prune.js +36 -24
  1057. package/dist/frontend/npm-static-prune.js.map +1 -1
  1058. package/dist/frontend/npm-static-rewrite-host.d.ts +4 -1
  1059. package/dist/frontend/npm-static-rewrite-host.js +14 -3
  1060. package/dist/frontend/npm-static-rewrite-host.js.map +1 -1
  1061. package/dist/frontend/npm-static-rewrite-syntax.d.ts +19 -0
  1062. package/dist/frontend/npm-static-rewrite-syntax.js +274 -101
  1063. package/dist/frontend/npm-static-rewrite-syntax.js.map +1 -1
  1064. package/dist/frontend/npm-static-subtyping.js +7 -9
  1065. package/dist/frontend/npm-static-subtyping.js.map +1 -1
  1066. package/dist/frontend/npm-static.d.ts +25 -1
  1067. package/dist/frontend/npm-static.js +212 -16
  1068. package/dist/frontend/npm-static.js.map +1 -1
  1069. package/dist/frontend/npm-static.test.js +22 -1
  1070. package/dist/frontend/npm-static.test.js.map +1 -1
  1071. package/dist/frontend/npm.js +13 -0
  1072. package/dist/frontend/npm.js.map +1 -1
  1073. package/dist/frontend/package-shims.d.ts +47 -0
  1074. package/dist/frontend/package-shims.js +300 -0
  1075. package/dist/frontend/package-shims.js.map +1 -0
  1076. package/dist/frontend/pipeline.js +230 -26
  1077. package/dist/frontend/pipeline.js.map +1 -1
  1078. package/dist/frontend/pipeline.test.js +22 -1
  1079. package/dist/frontend/pipeline.test.js.map +1 -1
  1080. package/dist/frontend/program-analysis.d.ts +6 -1
  1081. package/dist/frontend/program-analysis.js +7 -0
  1082. package/dist/frontend/program-analysis.js.map +1 -1
  1083. package/dist/frontend/program.d.ts +100 -2
  1084. package/dist/frontend/program.js +1627 -262
  1085. package/dist/frontend/program.js.map +1 -1
  1086. package/dist/frontend/program.test.js +76 -6
  1087. package/dist/frontend/program.test.js.map +1 -1
  1088. package/dist/frontend/resolve.js +49 -2
  1089. package/dist/frontend/resolve.js.map +1 -1
  1090. package/dist/frontend/resolve.test.js +49 -0
  1091. package/dist/frontend/resolve.test.js.map +1 -1
  1092. package/dist/frontend/services.d.ts +26 -1
  1093. package/dist/frontend/services.js +59 -3
  1094. package/dist/frontend/services.js.map +1 -1
  1095. package/dist/frontend/services.test.js +2 -1
  1096. package/dist/frontend/services.test.js.map +1 -1
  1097. package/dist/frontend/threads-import.js +1 -1
  1098. package/dist/frontend/threads-import.js.map +1 -1
  1099. package/dist/frontend/tier-analysis.d.ts +71 -0
  1100. package/dist/frontend/tier-analysis.js +522 -0
  1101. package/dist/frontend/tier-analysis.js.map +1 -0
  1102. package/dist/frontend/ts7/api-conformance.d.ts +234 -0
  1103. package/dist/frontend/ts7/api-conformance.js +7 -0
  1104. package/dist/frontend/ts7/api-conformance.js.map +1 -0
  1105. package/dist/frontend/ts7/ast-guards.generated.js +2 -1
  1106. package/dist/frontend/ts7/ast-guards.generated.js.map +1 -1
  1107. package/dist/frontend/ts7/ast-node.d.ts +47 -25
  1108. package/dist/frontend/ts7/ast-node.js +64 -18
  1109. package/dist/frontend/ts7/ast-node.js.map +1 -1
  1110. package/dist/frontend/ts7/ast-node.test.js +36 -12
  1111. package/dist/frontend/ts7/ast-node.test.js.map +1 -1
  1112. package/dist/frontend/ts7/ast-types.d.ts +10 -3
  1113. package/dist/frontend/ts7/ast-types.generated.d.ts +39 -39
  1114. package/dist/frontend/ts7/ast.d.ts +1 -0
  1115. package/dist/frontend/ts7/ast.js +3 -2
  1116. package/dist/frontend/ts7/ast.js.map +1 -1
  1117. package/dist/frontend/ts7/checker-backend.d.ts +23 -0
  1118. package/dist/frontend/ts7/checker-backend.js +88 -0
  1119. package/dist/frontend/ts7/checker-backend.js.map +1 -0
  1120. package/dist/frontend/ts7/checker-backend.test.d.ts +1 -0
  1121. package/dist/frontend/ts7/checker-backend.test.js +63 -0
  1122. package/dist/frontend/ts7/checker-backend.test.js.map +1 -0
  1123. package/dist/frontend/ts7/checker-cache.d.ts +0 -3
  1124. package/dist/frontend/ts7/checker-cache.js +0 -6
  1125. package/dist/frontend/ts7/checker-cache.js.map +1 -1
  1126. package/dist/frontend/ts7/checker.d.ts +18 -11
  1127. package/dist/frontend/ts7/checker.js +42 -55
  1128. package/dist/frontend/ts7/checker.js.map +1 -1
  1129. package/dist/frontend/ts7/checker.test.js +10 -7
  1130. package/dist/frontend/ts7/checker.test.js.map +1 -1
  1131. package/dist/frontend/ts7/diagnostic.d.ts +19 -0
  1132. package/dist/frontend/ts7/diagnostic.js +22 -0
  1133. package/dist/frontend/ts7/diagnostic.js.map +1 -0
  1134. package/dist/frontend/ts7/node-functions.d.ts +8 -0
  1135. package/dist/frontend/ts7/node-functions.js +18 -0
  1136. package/dist/frontend/ts7/node-functions.js.map +1 -0
  1137. package/dist/frontend/ts7/program-host.d.ts +10 -5
  1138. package/dist/frontend/ts7/program-host.js +19 -0
  1139. package/dist/frontend/ts7/program-host.js.map +1 -1
  1140. package/dist/frontend/ts7/rpc-api.d.ts +5 -1
  1141. package/dist/frontend/ts7/rpc-api.js +8 -1
  1142. package/dist/frontend/ts7/rpc-api.js.map +1 -1
  1143. package/dist/frontend/ts7/semantic-checker.d.ts +13 -6
  1144. package/dist/frontend/ts7/semantic-checker.js +26 -8
  1145. package/dist/frontend/ts7/semantic-checker.js.map +1 -1
  1146. package/dist/frontend/ts7/semantic-checker.test.js +12 -9
  1147. package/dist/frontend/ts7/semantic-checker.test.js.map +1 -1
  1148. package/dist/frontend/ts7/semantic-model.d.ts +57 -24
  1149. package/dist/frontend/ts7/semantic-model.js +114 -16
  1150. package/dist/frontend/ts7/semantic-model.js.map +1 -1
  1151. package/dist/frontend/ts7/semantic-model.test.js +4 -4
  1152. package/dist/frontend/ts7/semantic-model.test.js.map +1 -1
  1153. package/dist/frontend/ts7/semantic-types.d.ts +7 -3
  1154. package/dist/frontend/ts7/semantic-types.js +1 -1
  1155. package/dist/frontend/ts7/semantic-types.js.map +1 -1
  1156. package/dist/frontend/ts7/session.d.ts +30 -15
  1157. package/dist/frontend/ts7/session.js +8 -5
  1158. package/dist/frontend/ts7/session.js.map +1 -1
  1159. package/dist/frontend/ts7/session.test.js +9 -5
  1160. package/dist/frontend/ts7/session.test.js.map +1 -1
  1161. package/dist/frontend/ts7/source-parser.d.ts +6 -2
  1162. package/dist/frontend/ts7/source-parser.js +24 -3
  1163. package/dist/frontend/ts7/source-parser.js.map +1 -1
  1164. package/dist/frontend/ts7/source-parser.test.js +38 -17
  1165. package/dist/frontend/ts7/source-parser.test.js.map +1 -1
  1166. package/dist/frontend/type-mapper.d.ts +122 -2
  1167. package/dist/frontend/type-mapper.js +2735 -723
  1168. package/dist/frontend/type-mapper.js.map +1 -1
  1169. package/dist/frontend/type-only-imports.d.ts +28 -0
  1170. package/dist/frontend/type-only-imports.js +122 -0
  1171. package/dist/frontend/type-only-imports.js.map +1 -0
  1172. package/dist/frontend/worker-target.js +8 -8
  1173. package/dist/frontend/worker-target.js.map +1 -1
  1174. package/dist/index.d.ts +4 -1
  1175. package/dist/index.js +87 -8
  1176. package/dist/index.js.map +1 -1
  1177. package/dist/ir/analysis.js +4 -2
  1178. package/dist/ir/analysis.js.map +1 -1
  1179. package/dist/ir/api.d.ts +1 -1
  1180. package/dist/ir/api.js +1 -1
  1181. package/dist/ir/api.js.map +1 -1
  1182. package/dist/ir/array-length-stability.d.ts +31 -0
  1183. package/dist/ir/array-length-stability.js +249 -0
  1184. package/dist/ir/array-length-stability.js.map +1 -0
  1185. package/dist/ir/array-length-stability.test.d.ts +1 -0
  1186. package/dist/ir/array-length-stability.test.js +134 -0
  1187. package/dist/ir/array-length-stability.test.js.map +1 -0
  1188. package/dist/ir/build.d.ts +2 -2
  1189. package/dist/ir/build.js +1 -1
  1190. package/dist/ir/build.js.map +1 -1
  1191. package/dist/ir/builtin-effects.js +116 -0
  1192. package/dist/ir/builtin-effects.js.map +1 -1
  1193. package/dist/ir/builtin-signatures.d.ts +1 -1
  1194. package/dist/ir/builtin-signatures.js +540 -29
  1195. package/dist/ir/builtin-signatures.js.map +1 -1
  1196. package/dist/ir/byte-numbers.js +3 -0
  1197. package/dist/ir/byte-numbers.js.map +1 -1
  1198. package/dist/ir/callback-specialization.d.ts +37 -0
  1199. package/dist/ir/callback-specialization.js +459 -0
  1200. package/dist/ir/callback-specialization.js.map +1 -0
  1201. package/dist/ir/callback-specialization.test.d.ts +1 -0
  1202. package/dist/ir/callback-specialization.test.js +208 -0
  1203. package/dist/ir/callback-specialization.test.js.map +1 -0
  1204. package/dist/ir/capture-values.d.ts +0 -1
  1205. package/dist/ir/capture-values.js +51 -40
  1206. package/dist/ir/capture-values.js.map +1 -1
  1207. package/dist/ir/constant-globals.test.js +1 -1
  1208. package/dist/ir/constant-tables.test.js +1 -1
  1209. package/dist/ir/field-values.test.js +1 -1
  1210. package/dist/ir/final-fields.test.js +1 -1
  1211. package/dist/ir/function-references.test.js +9 -1
  1212. package/dist/ir/function-references.test.js.map +1 -1
  1213. package/dist/ir/init-only-globals.test.js +1 -1
  1214. package/dist/ir/initializer-bindings.test.js +1 -1
  1215. package/dist/ir/int32-slots.d.ts +14 -0
  1216. package/dist/ir/int32-slots.js +97 -14
  1217. package/dist/ir/int32-slots.js.map +1 -1
  1218. package/dist/ir/int32-slots.test.js +1 -1
  1219. package/dist/ir/integer-loop-facts.d.ts +7 -0
  1220. package/dist/ir/integer-loop-facts.js +103 -17
  1221. package/dist/ir/integer-loop-facts.js.map +1 -1
  1222. package/dist/ir/integer-loops.d.ts +1 -1
  1223. package/dist/ir/integer-loops.js +39 -9
  1224. package/dist/ir/integer-loops.js.map +1 -1
  1225. package/dist/ir/integer-loops.test.js +104 -0
  1226. package/dist/ir/integer-loops.test.js.map +1 -1
  1227. package/dist/ir/integer-ranges.d.ts +13 -1
  1228. package/dist/ir/integer-ranges.js +125 -26
  1229. package/dist/ir/integer-ranges.js.map +1 -1
  1230. package/dist/ir/integer-ranges.test.js +273 -2
  1231. package/dist/ir/integer-ranges.test.js.map +1 -1
  1232. package/dist/ir/intrinsic-signatures.js +6 -0
  1233. package/dist/ir/intrinsic-signatures.js.map +1 -1
  1234. package/dist/ir/ir.d.ts +221 -58
  1235. package/dist/ir/ir.js +127 -12
  1236. package/dist/ir/ir.js.map +1 -1
  1237. package/dist/ir/ir.test.js +10 -0
  1238. package/dist/ir/ir.test.js.map +1 -1
  1239. package/dist/ir/js-ic.d.ts +52 -0
  1240. package/dist/ir/js-ic.js +199 -0
  1241. package/dist/ir/js-ic.js.map +1 -0
  1242. package/dist/ir/js-ic.test.d.ts +1 -0
  1243. package/dist/ir/js-ic.test.js +148 -0
  1244. package/dist/ir/js-ic.test.js.map +1 -0
  1245. package/dist/ir/jsval.d.ts +8 -0
  1246. package/dist/ir/jsval.js +399 -0
  1247. package/dist/ir/jsval.js.map +1 -0
  1248. package/dist/ir/jsval.test.d.ts +1 -0
  1249. package/dist/ir/jsval.test.js +239 -0
  1250. package/dist/ir/jsval.test.js.map +1 -0
  1251. package/dist/ir/runtime-features.d.ts +183 -33
  1252. package/dist/ir/runtime-features.js +795 -422
  1253. package/dist/ir/runtime-features.js.map +1 -1
  1254. package/dist/ir/scalar-records.test.js +1 -1
  1255. package/dist/ir/self-captures.d.ts +33 -0
  1256. package/dist/ir/self-captures.js +245 -0
  1257. package/dist/ir/self-captures.js.map +1 -0
  1258. package/dist/ir/self-captures.test.d.ts +1 -0
  1259. package/dist/ir/self-captures.test.js +135 -0
  1260. package/dist/ir/self-captures.test.js.map +1 -0
  1261. package/dist/ir/serialize.d.ts +1 -1
  1262. package/dist/ir/serialize.js +7 -4
  1263. package/dist/ir/serialize.js.map +1 -1
  1264. package/dist/ir/tiers.d.ts +26 -0
  1265. package/dist/ir/tiers.js +101 -0
  1266. package/dist/ir/tiers.js.map +1 -0
  1267. package/dist/ir/tiers.test.d.ts +1 -0
  1268. package/dist/ir/tiers.test.js +140 -0
  1269. package/dist/ir/tiers.test.js.map +1 -0
  1270. package/dist/ir/traverse.js +201 -150
  1271. package/dist/ir/traverse.js.map +1 -1
  1272. package/dist/ir/traverse.test.js +33 -30
  1273. package/dist/ir/traverse.test.js.map +1 -1
  1274. package/dist/ir/unshare.js +65 -3
  1275. package/dist/ir/unshare.js.map +1 -1
  1276. package/dist/ir/unshare.test.js +1 -1
  1277. package/dist/ir/validate.js +196 -76
  1278. package/dist/ir/validate.js.map +1 -1
  1279. package/dist/ir/validate.test.js +41 -11
  1280. package/dist/ir/validate.test.js.map +1 -1
  1281. package/dist/library/fence-eval.test.js +1 -1
  1282. package/dist/library/int-infer.test.js +4 -4
  1283. package/dist/library/ir-policy.js +14 -0
  1284. package/dist/library/ir-policy.js.map +1 -1
  1285. package/dist/library/library-cache.d.ts +1 -0
  1286. package/dist/library/library-cache.js.map +1 -1
  1287. package/dist/library/library-cache.test.js +5 -5
  1288. package/dist/library/library-profile.d.ts +4 -4
  1289. package/dist/library/library-profile.js +35 -7
  1290. package/dist/library/library-profile.js.map +1 -1
  1291. package/dist/library/prepare.js +13 -1
  1292. package/dist/library/prepare.js.map +1 -1
  1293. package/dist/native/cli.js +22 -0
  1294. package/dist/native/cli.js.map +1 -1
  1295. package/dist/native/compiler.js +35 -6
  1296. package/dist/native/compiler.js.map +1 -1
  1297. package/dist/native/compiler.test.js +2 -2
  1298. package/dist/native/executable-cache.js +3 -0
  1299. package/dist/native/executable-cache.js.map +1 -1
  1300. package/dist/native/prepare.js +10 -0
  1301. package/dist/native/prepare.js.map +1 -1
  1302. package/dist/native/sanitizer.test.js +19 -0
  1303. package/dist/native/sanitizer.test.js.map +1 -1
  1304. package/dist/native/toolchain.d.ts +2 -0
  1305. package/dist/native/toolchain.js +10 -1
  1306. package/dist/native/toolchain.js.map +1 -1
  1307. package/dist/native/toolchain.test.js +39 -1
  1308. package/dist/native/toolchain.test.js.map +1 -1
  1309. package/dist/startup-cache.d.ts +1 -0
  1310. package/dist/startup-cache.js +1 -0
  1311. package/dist/startup-cache.js.map +1 -1
  1312. package/dist/wasm/base64.d.ts +5 -0
  1313. package/dist/wasm/base64.js +62 -0
  1314. package/dist/wasm/base64.js.map +1 -0
  1315. package/dist/wasm/binary.d.ts +36 -0
  1316. package/dist/wasm/binary.js +1976 -0
  1317. package/dist/wasm/binary.js.map +1 -0
  1318. package/dist/wasm/binary.test.d.ts +1 -0
  1319. package/dist/wasm/binary.test.js +190 -0
  1320. package/dist/wasm/binary.test.js.map +1 -0
  1321. package/dist/wasm/discover.d.ts +38 -0
  1322. package/dist/wasm/discover.js +377 -0
  1323. package/dist/wasm/discover.js.map +1 -0
  1324. package/dist/wasm/discover.test.d.ts +1 -0
  1325. package/dist/wasm/discover.test.js +24 -0
  1326. package/dist/wasm/discover.test.js.map +1 -0
  1327. package/dist/wasm/module.d.ts +151 -0
  1328. package/dist/wasm/module.js +575 -0
  1329. package/dist/wasm/module.js.map +1 -0
  1330. package/dist/wasm/translate.d.ts +48 -0
  1331. package/dist/wasm/translate.js +2129 -0
  1332. package/dist/wasm/translate.js.map +1 -0
  1333. package/dist/wasm/translate.test.d.ts +1 -0
  1334. package/dist/wasm/translate.test.js +207 -0
  1335. package/dist/wasm/translate.test.js.map +1 -0
  1336. package/package.json +22 -20
  1337. package/shims/fs-extra/core/api.ts +1192 -0
  1338. package/shims/fs-extra/index.ts +9 -0
  1339. package/shims/undici/core/agent.ts +163 -0
  1340. package/shims/undici/core/api.ts +93 -0
  1341. package/shims/undici/core/client.ts +1304 -0
  1342. package/shims/undici/core/connector.ts +157 -0
  1343. package/shims/undici/core/diagnostics-types.ts +68 -0
  1344. package/shims/undici/core/diagnostics.ts +16 -0
  1345. package/shims/undici/core/dispatcher.ts +574 -0
  1346. package/shims/undici/core/errors-v5.ts +22 -0
  1347. package/shims/undici/core/errors-v7.ts +25 -0
  1348. package/shims/undici/core/errors.ts +255 -0
  1349. package/shims/undici/core/fetch.ts +635 -0
  1350. package/shims/undici/core/pool.ts +280 -0
  1351. package/shims/undici/core/readable.ts +268 -0
  1352. package/shims/undici/core/request.ts +313 -0
  1353. package/shims/undici/core/timers.ts +80 -0
  1354. package/shims/undici/core/types.ts +167 -0
  1355. package/shims/undici/core/util.ts +67 -0
  1356. package/shims/undici/v5.ts +119 -0
  1357. package/shims/undici/v7.ts +119 -0
  1358. package/surface-manifest.json +304 -22
@@ -0,0 +1,1724 @@
1
+ /* instanceof and in, including private-name and runtime-key in. */
2
+ import * as ts from "../../ts7/adapter.js";
3
+ import { builtinClassInstanceOfAny, builtinClassKind } from "../builtins/builtin-class-dyn.js";
4
+ import { checkedPrivateIn, localPrivateBrandClass, primitiveOperand, privateInMessage, } from "../private-brands.js";
5
+ import { BOOL, BYTES_ELEMENT_NAME, CAUGHT, DYN, F64, RUNTIME_ERROR_CLASSES, STRING, UNDEFINED_T, isUnitType, typeEquals, typeKey, } from "../../../ir/ir.js";
6
+ import { lowerWebAssemblyInstanceof, refuseWebAssemblyUse } from "../builtins/webassembly.js";
7
+ import { lowerSocketInstanceOf } from "../lower-server.js";
8
+ import { builtinClassRefOf } from "../builtins/class-values.js";
9
+ import { lowerZlibInstanceOf } from "../builtins/compression.js";
10
+ import { numLit, strLit, varRef } from "../../../ir/build.js";
11
+ import { lowerDisposableStackInstanceOf } from "../builtins/disposable-stack.js";
12
+ import { lowerBlobInstanceof } from "../builtins/blob.js";
13
+ import { lowerReadlineInstanceof } from "../builtins/readline.js";
14
+ import { lowerKeyObjectInstanceof } from "../builtins/key-object.js";
15
+ import { lowerCryptoKeyInstanceof } from "../builtins/webcrypto.js";
16
+ import { lowerNetAddressInstanceof } from "../builtins/net-address.js";
17
+ import { typedArrayHasMember } from "../builtins/typed-array-members.js";
18
+ import { fenceEarlyNsMemberRef, nsMemberIdentOf } from "../lower-namespaces.js";
19
+ import { maybePromiseInstanceOf } from "../maybe-promise.js";
20
+ import { isSafeToDiscard, isSafeToRepeat } from "./evaluation-safety.js";
21
+ import { storedClassValueType } from "../lower-classes.js";
22
+ import { classInstanceOf } from "../class-dynamic-dispatch.js";
23
+ import { InternalCompilerError } from "../../../errors.js";
24
+ import { tryLowerExpression } from "./try-lower-expression.js";
25
+ import { isJsSourceFile, locOf } from "../../program.js";
26
+ import { checkedClassInstanceOf } from "../class-construction.js";
27
+ import { globalSymbolKey } from "./global-symbols.js";
28
+ import { foldedStringKeyOf } from "./object-literals.js";
29
+ import { NARROW_FIRST, sideEffectFreeOptionValue } from "../surfaces.js";
30
+ import { isExecExceptionType, refuseExecExceptionCode } from "../builtins/errors.js";
31
+ import { hasRuntimeStatics } from "../class-runtime-statics.js";
32
+ import { nullProtoRecordShape, recordNullProtoTest } from "../null-prototype.js";
33
+ /** `x instanceof C` for a program-declared class C. When x's static
34
+ * class and C are both in extends-hierarchies the test is dynamic — the
35
+ * O(1) preorder-interval check against the vtable (`instanceOf` node).
36
+ * Everything else is decided by the static class graph alone and folds
37
+ * to the honest constant: `x instanceof C` is always true when x's
38
+ * static class IS C or descends from it, and always false when the
39
+ * classes are unrelated (a standalone class has no other relatives).
40
+ * Folding is limited to side-effect-free operands — dropping a computed
41
+ * operand would skip its effects, so those are rejected instead. */
42
+ export function lowerInstanceOf(lowerer, expr, loc) {
43
+ const webAssembly = lowerWebAssemblyInstanceof(lowerer, expr);
44
+ if (webAssembly !== null)
45
+ return webAssembly;
46
+ refuseWebAssemblyUse(lowerer, expr.right);
47
+ // `x instanceof net.Socket` over a union with a netSocket arm — the
48
+ // h2 compat 'connect' narrowing (lower-server.ts): a union tag test.
49
+ const sockTest = lowerSocketInstanceOf(lowerer, expr, loc);
50
+ if (sockTest !== null)
51
+ return sockTest;
52
+ const rightClass = builtinClassRefOf(lowerer, expr.right);
53
+ if (rightClass?.kind === "zlib")
54
+ return lowerZlibInstanceOf(lowerer, expr, rightClass.mode, loc);
55
+ if (rightClass?.kind === "collection") {
56
+ const collection = rightClass.which === "Map" ? "map" : "set";
57
+ const value = lowerer.lowerExpr(expr.left);
58
+ if (value.type.kind === "union") {
59
+ const union = lowerer.unions.get(value.type.unionId);
60
+ if (union) {
61
+ const local = lowerer.declareHiddenLocal("%collectionTest", value.type);
62
+ const reference = varRef(local.id, value.type, loc);
63
+ let result = { kind: "boolLit", value: false, type: BOOL, loc };
64
+ union.arms.forEach((arm, tag) => {
65
+ if (arm.kind !== collection)
66
+ return;
67
+ const test = {
68
+ kind: "unionIsTag",
69
+ unionId: union.id,
70
+ value: reference,
71
+ tag,
72
+ negated: false,
73
+ type: BOOL,
74
+ loc,
75
+ };
76
+ result =
77
+ result.kind === "boolLit"
78
+ ? test
79
+ : { kind: "logical", op: "||", left: result, right: test, type: BOOL, loc };
80
+ });
81
+ return {
82
+ kind: "seqExpr",
83
+ stmts: [{ kind: "varDecl", localId: local.id, init: value, loc }],
84
+ result,
85
+ type: BOOL,
86
+ loc,
87
+ };
88
+ }
89
+ }
90
+ if (value.type.kind === "dyn")
91
+ return {
92
+ kind: "libCall",
93
+ fn: collection === "map" ? "dyn.nativeMapIs" : "dyn.nativeSetIs",
94
+ args: [value],
95
+ type: BOOL,
96
+ loc,
97
+ };
98
+ if (value.type.kind === collection)
99
+ return {
100
+ kind: "seqExpr",
101
+ stmts: [{ kind: "exprStmt", expr: value, loc }],
102
+ result: { kind: "boolLit", value: true, type: BOOL, loc },
103
+ type: BOOL,
104
+ loc,
105
+ };
106
+ return {
107
+ kind: "libCall",
108
+ fn: collection === "map" ? "dyn.nativeMapIs" : "dyn.nativeSetIs",
109
+ args: [lowerer.coerceInto(expr.left, value, DYN)],
110
+ type: BOOL,
111
+ loc,
112
+ };
113
+ }
114
+ if (lowerer.isStdlibGlobal(expr.right, "WeakMap") ||
115
+ lowerer.isStdlibGlobal(expr.right, "WeakSet")) {
116
+ const value = lowerer.coerceInto(expr.left, lowerer.lowerExpr(expr.left), DYN);
117
+ return {
118
+ kind: "libCall",
119
+ fn: lowerer.isStdlibGlobal(expr.right, "WeakMap") ? "weakMap.is" : "weakSet.is",
120
+ args: [value],
121
+ type: BOOL,
122
+ loc,
123
+ };
124
+ }
125
+ const rhsBuiltin = ts.isIdentifier(expr.right)
126
+ ? lowerer.builtinImportOf(expr.right)
127
+ : ts.isPropertyAccessExpression(expr.right)
128
+ ? lowerer.builtinMemberOf(expr.right)
129
+ : null;
130
+ if (lowerer.isStdlibGlobal(expr.right, "URL") ||
131
+ (rhsBuiltin?.module === "url" && rhsBuiltin.member === "URL")) {
132
+ const value = lowerer.coerceInto(expr.left, lowerer.lowerExpr(expr.left), DYN);
133
+ return { kind: "libCall", fn: "dyn.nativeUrlIs", args: [value], type: BOOL, loc };
134
+ }
135
+ {
136
+ const stack = lowerDisposableStackInstanceOf(lowerer, expr);
137
+ if (stack)
138
+ return stack;
139
+ }
140
+ if (lowerer.isStdlibGlobal(expr.right, "DataView")) {
141
+ const value = lowerer.coerceInto(expr.left, lowerer.lowerExpr(expr.left), DYN);
142
+ return { kind: "libCall", fn: "dyn.dataViewIs", args: [value], type: BOOL, loc };
143
+ }
144
+ {
145
+ const eventKind = ["Event", "CustomEvent", "EventTarget"].findIndex((name) => lowerer.isStdlibGlobal(expr.right, name));
146
+ if (eventKind >= 0) {
147
+ const value = lowerer.coerceInto(expr.left, lowerer.lowerExpr(expr.left), DYN);
148
+ const kind = { kind: "numLit", value: eventKind, type: F64, loc };
149
+ return { kind: "libCall", fn: "event.is", args: [value, kind], type: BOOL, loc };
150
+ }
151
+ }
152
+ {
153
+ const blob = lowerBlobInstanceof(lowerer, expr);
154
+ if (blob)
155
+ return blob;
156
+ const keyObject = lowerKeyObjectInstanceof(lowerer, expr);
157
+ if (keyObject)
158
+ return keyObject;
159
+ const cryptoKey = lowerCryptoKeyInstanceof(lowerer, expr);
160
+ if (cryptoKey)
161
+ return cryptoKey;
162
+ const netAddress = lowerNetAddressInstanceof(lowerer, expr);
163
+ if (netAddress)
164
+ return netAddress;
165
+ const readlineInterface = lowerReadlineInstanceof(lowerer, expr);
166
+ if (readlineInterface)
167
+ return readlineInterface;
168
+ }
169
+ if (lowerer.isStdlibGlobal(expr.right, "SharedArrayBuffer")) {
170
+ const value = lowerer.coerceInto(expr.left, lowerer.lowerExpr(expr.left), DYN);
171
+ return { kind: "libCall", fn: "sharedArrayBuffer.is", args: [value], type: BOOL, loc };
172
+ }
173
+ if (lowerer.isStdlibGlobal(expr.right, "ArrayBuffer")) {
174
+ const value = lowerer.coerceInto(expr.left, lowerer.lowerExpr(expr.left), DYN);
175
+ return { kind: "libCall", fn: "arrayBuffer.is", args: [value], type: BOOL, loc };
176
+ }
177
+ const rhsSymbol = ts.isIdentifier(expr.right) ? lowerer.resolveValueSymbol(expr.right) : null;
178
+ // `x instanceof events.EventEmitter` — the namespace-member spelling
179
+ // resolves to the same ambient class as the named import.
180
+ const rhsMemberSymbol = (() => {
181
+ if (!ts.isPropertyAccessExpression(expr.right) || !ts.isIdentifier(expr.right.name))
182
+ return null;
183
+ const sym = lowerer.checker.getSymbolAtLocation(expr.right.name);
184
+ return sym && sym.flags & ts.SymbolFlags.Alias
185
+ ? lowerer.checker.getAliasedSymbol(sym)
186
+ : (sym ?? null);
187
+ })();
188
+ // `x instanceof N.C` — the USER-namespace-qualified spelling: the
189
+ // member resolves to the registered program class, with the
190
+ // source-order guard (an init-position test above the class's block
191
+ // would read an uninitialized member in Node).
192
+ const rhsNsClass = (() => {
193
+ if (!ts.isPropertyAccessExpression(expr.right))
194
+ return undefined;
195
+ const nsMember = nsMemberIdentOf(lowerer, expr.right);
196
+ if (!nsMember)
197
+ return undefined;
198
+ const memberSym = lowerer.checker.getSymbolAtLocation(nsMember);
199
+ if (memberSym)
200
+ fenceEarlyNsMemberRef(lowerer, expr.right, memberSym);
201
+ const classSym = lowerer.resolveValueSymbol(nsMember);
202
+ const nsInfo = classSym ? lowerer.classBySymbol.get(classSym) : undefined;
203
+ // Qualified spellings of a rebindable decorated class (import=
204
+ // alias chains) must not fold against the declaration — the
205
+ // decoration result decides at runtime.
206
+ return nsInfo?.classDecorators?.valueGlobalId !== undefined ? undefined : nsInfo;
207
+ })();
208
+ // A rebindable decorated name as the RHS: the runtime target is the
209
+ // decoration result — fall to the class-VALUE path below, whose
210
+ // instanceOfValue reads the interval off the bound class object.
211
+ const directRhs = rhsSymbol ? lowerer.classBySymbol.get(rhsSymbol) : undefined;
212
+ const target = (directRhs?.localClass || directRhs?.classDecorators?.valueGlobalId !== undefined
213
+ ? undefined
214
+ : directRhs) ??
215
+ rhsNsClass ??
216
+ lowerer.builtinErrorInfoOf(rhsSymbol) ??
217
+ lowerer.builtinErrorInfoOf(rhsMemberSymbol) ??
218
+ lowerer.builtinEmitterInfoOf(rhsSymbol) ??
219
+ lowerer.builtinEmitterInfoOf(rhsMemberSymbol) ??
220
+ lowerer.builtinStreamInfoOf(rhsSymbol) ??
221
+ lowerer.builtinStreamInfoOf(rhsMemberSymbol) ??
222
+ undefined;
223
+ if (!target) {
224
+ const date = lowerer.isStdlibGlobal(expr.right, "Date");
225
+ const url = lowerer.isStdlibGlobal(expr.right, "URL");
226
+ if ((date || url) && !lowerer.caughtLocalOf(expr.left)) {
227
+ const value = lowerer.lowerExpr(expr.left);
228
+ if (value.type.kind === "dyn")
229
+ return {
230
+ kind: "libCall",
231
+ fn: date ? "dyn.nativeDateIs" : "dyn.nativeUrlIs",
232
+ args: [value],
233
+ type: BOOL,
234
+ loc,
235
+ };
236
+ if (value.type.kind === "union")
237
+ return {
238
+ kind: "libCall",
239
+ fn: date ? "dyn.nativeDateIs" : "dyn.nativeUrlIs",
240
+ args: [lowerer.coerceInto(expr.left, value, DYN)],
241
+ type: BOOL,
242
+ loc,
243
+ };
244
+ return {
245
+ kind: "seqExpr",
246
+ stmts: [{ kind: "exprStmt", expr: value, loc }],
247
+ result: {
248
+ kind: "boolLit",
249
+ value: value.type.kind === (date ? "date" : "url"),
250
+ type: BOOL,
251
+ loc,
252
+ },
253
+ type: BOOL,
254
+ loc,
255
+ };
256
+ }
257
+ const webBrand = ["Request", "Response", "Headers"].find((name) => lowerer.isStdlibGlobal(expr.right, name));
258
+ if (webBrand)
259
+ return {
260
+ kind: "libCall",
261
+ fn: "fetch.webIs",
262
+ args: [
263
+ lowerer.lowerExprExpecting(expr.left, DYN),
264
+ { kind: "strLit", value: webBrand, type: STRING, loc },
265
+ ],
266
+ type: BOOL,
267
+ loc,
268
+ };
269
+ if (lowerer.isStdlibGlobal(expr.right, "ReadableStream")) {
270
+ const value = lowerer.lowerExprExpecting(expr.left, DYN);
271
+ return { kind: "libCall", fn: "fetch.streamIs", args: [value], type: BOOL, loc };
272
+ }
273
+ // Unknown storage retains each numeric typed array's exact native brand.
274
+ if (!lowerer.caughtLocalOf(expr.left)) {
275
+ const elem = Object.keys(BYTES_ELEMENT_NAME).find((kind) => lowerer.isStdlibGlobal(expr.right, BYTES_ELEMENT_NAME[kind]));
276
+ if (elem !== undefined) {
277
+ const left = lowerer.lowerExpr(expr.left);
278
+ if (left.type.kind === "dyn") {
279
+ return { kind: "dynTest", test: "bytes", bytesElem: elem, value: left, type: BOOL, loc };
280
+ }
281
+ return {
282
+ kind: "dynTest",
283
+ test: "bytes",
284
+ bytesElem: elem,
285
+ value: lowerer.coerceInto(expr.left, left, DYN),
286
+ type: BOOL,
287
+ loc,
288
+ };
289
+ }
290
+ }
291
+ // `x instanceof Promise` over a promise-armed union (the maybe-promise
292
+ // `T | Promise<T>` dispatch): a union tag test — the data arms are
293
+ // never promises (scriptc promises are all native, and no data arm
294
+ // can hold one). A promise-typed operand answers true after its
295
+ // evaluation; a checked-dynamic one asks the runtime.
296
+ if (ts.isIdentifier(expr.right) &&
297
+ lowerer.isStdlibGlobal(expr.right, "Promise") &&
298
+ !lowerer.caughtLocalOf(expr.left)) {
299
+ const left = lowerer.lowerExpr(expr.left);
300
+ const tagTest = maybePromiseInstanceOf(lowerer, left, loc);
301
+ if (tagTest)
302
+ return tagTest;
303
+ if (left.type.kind === "dyn")
304
+ return { kind: "dynTest", test: "promise", value: left, type: BOOL, loc };
305
+ if (left.type.kind === "promise") {
306
+ const yes = { kind: "boolLit", value: true, type: BOOL, loc };
307
+ if (isSafeToDiscard(left))
308
+ return yes;
309
+ return {
310
+ kind: "seqExpr",
311
+ stmts: [{ kind: "exprStmt", expr: left, loc }],
312
+ result: yes,
313
+ type: BOOL,
314
+ loc,
315
+ };
316
+ }
317
+ lowerer.unsupported("SC1090", expr, `'instanceof Promise' on '${lowerer.fmt(left.type)}' values (only promises, promise-armed unions, and checked-dynamic values have a lowering)`);
318
+ }
319
+ // `x instanceof RegExp` over a union with a regex arm (the
320
+ // skip-utility `string | RegExp` dispatch): a union tag test — the
321
+ // socket-narrowing shape; the checker types the branches and
322
+ // maybeNarrow bridges the reads. A plain regex-typed LHS folds
323
+ // true; the fold keeps the operand-purity rule of the class folds
324
+ // (identifier reads only).
325
+ if (ts.isIdentifier(expr.right) &&
326
+ lowerer.isStdlibGlobal(expr.right, "RegExp") &&
327
+ !lowerer.caughtLocalOf(expr.left)) {
328
+ const left = lowerer.lowerExpr(expr.left);
329
+ if (left.type.kind === "dyn")
330
+ return { kind: "libCall", fn: "dyn.nativeRegexIs", args: [left], type: BOOL, loc };
331
+ if (left.type.kind === "union") {
332
+ const def = lowerer.unions.get(left.type.unionId);
333
+ const tag = def ? def.arms.findIndex((a) => a.kind === "regex") : -1;
334
+ if (tag >= 0) {
335
+ return {
336
+ kind: "unionIsTag",
337
+ unionId: left.type.unionId,
338
+ tag,
339
+ negated: false,
340
+ value: left,
341
+ type: BOOL,
342
+ loc,
343
+ };
344
+ }
345
+ }
346
+ return {
347
+ kind: "libCall",
348
+ fn: "dyn.nativeRegexIs",
349
+ args: [lowerer.coerceInto(expr.left, left, DYN)],
350
+ type: BOOL,
351
+ loc,
352
+ };
353
+ }
354
+ // `x instanceof X` where X is a class VALUE (a classval-typed
355
+ // binding): the target is DYNAMIC — a hierarchy target reads its
356
+ // interval from the class object at runtime (instanceOfValue); a
357
+ // STANDALONE target class has exactly one possible runtime value
358
+ // (itself — no descendants can flow into the slot), so the answer
359
+ // folds statically exactly like the named-target folds below.
360
+ const rhsClassval = storedClassValueType(lowerer, expr.right);
361
+ if (rhsClassval?.kind === "classval" && !lowerer.caughtLocalOf(expr.left)) {
362
+ const targetInfo = lowerer.classes.get(rhsClassval.className);
363
+ if (!targetInfo) {
364
+ // The type world names a class the lowering never registered
365
+ // (a fenced class expression, a deferred declaration): flush
366
+ // its diagnostics and poison the test site, never an ICE.
367
+ lowerer.flushDeferredClass(rhsClassval.className);
368
+ lowerer.unsupported("SC1090", expr, "'instanceof' against a class value whose class has no lowering (the class declaration itself was rejected — see its own diagnostic)");
369
+ }
370
+ const left = lowerer.lowerExpr(expr.left);
371
+ if (left.type.kind === "dyn") {
372
+ // An untyped binding the checker narrowed to EventEmitter or a
373
+ // stream class (`ReleaseEmitter = EventEmitter` in JavaScript):
374
+ // the binding holds an untyped constructor, so the test is
375
+ // Function.prototype[Symbol.hasInstance] over it.
376
+ const builtinKind = targetInfo.def.runtime ? builtinClassKind(targetInfo.def.name) : null;
377
+ if (builtinKind !== null) {
378
+ const right = lowerer.lowerExpr(expr.right);
379
+ if (right.type.kind === "dyn")
380
+ return builtinClassInstanceOfAny(lowerer, left, builtinKind, targetInfo, loc, right);
381
+ }
382
+ if (targetInfo.def.runtime) {
383
+ lowerer.unsupported("SC1090", expr, "'instanceof' through a runtime-provided class value on an untyped value (give the operand a class type first)");
384
+ }
385
+ const classValue = lowerer.lowerExpr(expr.right);
386
+ return classInstanceOf(lowerer, left, targetInfo, loc, classValue);
387
+ }
388
+ // A union of class instances against a runtime class value (`new K()`
389
+ // through a widened `[Readable, Writable]` element).
390
+ if (left.type.kind === "union" && targetInfo.def.runtime) {
391
+ const tested = unionClassValueInstanceOf(lowerer, left, expr.right, targetInfo, loc);
392
+ if (tested)
393
+ return tested;
394
+ }
395
+ if (left.type.kind !== "object") {
396
+ lowerer.unsupported("SC1090", expr, "'instanceof' on values other than class instances (narrow union-typed values first)");
397
+ }
398
+ const lhsInfo = lowerer.classes.get(left.type.className);
399
+ if (!lhsInfo)
400
+ throw new InternalCompilerError(`lowerer bug: unknown class ${left.type.className}`);
401
+ if ((lowerer.inHierarchy(targetInfo) && lowerer.inHierarchy(lhsInfo)) ||
402
+ (targetInfo.localClass !== undefined && lhsInfo.localClass !== undefined)) {
403
+ const classValue = lowerer.lowerExpr(expr.right);
404
+ if (classValue.type.kind !== "classval")
405
+ lowerer.badType(expr.right, lowerer.typeOf(expr.right));
406
+ const writableTest = writableClassValueTest(lowerer, left, classValue, targetInfo, lhsInfo, loc);
407
+ if (writableTest)
408
+ return writableTest;
409
+ return { kind: "instanceOfValue", value: left, classValue, type: BOOL, loc };
410
+ }
411
+ // A standalone side: the answer is static (the target slot can
412
+ // only hold the named class; a standalone operand's runtime class
413
+ // IS its static class). Folding discards the operands' evaluation,
414
+ // so only side-effect-free shapes fold — the named-target rule.
415
+ const value = left.type.className === targetInfo.def.name ||
416
+ lowerer.isSubclassOf(left.type.className, targetInfo.def.name);
417
+ if (left.kind === "varRef" &&
418
+ (ts.isIdentifier(expr.right) || expr.right.kind === ts.SyntaxKind.ThisKeyword)) {
419
+ return readsClassAfter(lowerer, targetInfo, expr.right, [], {
420
+ kind: "boolLit",
421
+ value,
422
+ type: BOOL,
423
+ loc,
424
+ });
425
+ }
426
+ lowerer.unsupported("SC1090", expr, "statically-decided 'instanceof' on computed operands (bind the values to variables first)");
427
+ }
428
+ const constructor = tryLowerExpression(lowerer, expr.right);
429
+ if (constructor?.type.kind === "dyn" && isJsSourceFile(ts.getSourceFileOfNode(expr))) {
430
+ const value = lowerer.coerceInto(expr.left, lowerer.lowerExpr(expr.left), DYN);
431
+ return checkedClassInstanceOf(lowerer, value, constructor, loc);
432
+ }
433
+ // `this instanceof Glob` in a JavaScript constructor function: the
434
+ // function's prototype against the value's prototype chain.
435
+ if (constructor?.type.kind === "func" &&
436
+ isJsSourceFile(ts.getSourceFileOfNode(expr)) &&
437
+ lowerer.dynConvertible(constructor.type)) {
438
+ const value = lowerer.coerceInto(expr.left, lowerer.lowerExpr(expr.left), DYN);
439
+ return {
440
+ kind: "libCall",
441
+ fn: "dyn.functionInstanceOf",
442
+ args: [value, { kind: "dynFrom", value: constructor, type: DYN, loc }],
443
+ type: BOOL,
444
+ loc,
445
+ };
446
+ }
447
+ lowerer.unsupported("SC1090", expr.right, "'instanceof' right-hand sides other than classes declared in the program");
448
+ }
449
+ // `x instanceof Writable`: Node's Writable[Symbol.hasInstance] also
450
+ // answers true for streams with a writable side that do not inherit from
451
+ // Writable, which are Duplex and its subclasses (Transform, PassThrough,
452
+ // the zlib streams). Subclasses of Writable keep the prototype test.
453
+ const duplex = target.def.name === "%Writable" && target.builtinStream !== undefined
454
+ ? lowerer.classes.get("%Duplex")
455
+ : undefined;
456
+ // The classes whose interval test can answer true for a value of static
457
+ // class `className`: Writable and Duplex are disjoint, so a value typed
458
+ // as one side needs only that side's test.
459
+ const runtimeTests = (className) => {
460
+ if (!duplex)
461
+ return [target];
462
+ const mayHold = (info) => className === info.def.name ||
463
+ lowerer.isSubclassOf(className, info.def.name) ||
464
+ lowerer.isSubclassOf(info.def.name, className);
465
+ const tests = [target, duplex].filter(mayHold);
466
+ return tests.length > 0 ? tests : [target];
467
+ };
468
+ // A catch binding on the left: the runtime test against the class's
469
+ // preorder interval (false for non-hierarchy-object payloads). tsc's
470
+ // narrowing then types the branches; reads bridge through caughtRead.
471
+ const caughtLocal = lowerer.caughtLocalOf(expr.left);
472
+ if (caughtLocal) {
473
+ const caughtInstanceOf = (info) => {
474
+ if (!lowerer.inHierarchy(info)) {
475
+ const value = varRef(caughtLocal.id, CAUGHT, loc);
476
+ return {
477
+ kind: "ternary",
478
+ cond: {
479
+ kind: "caughtTest",
480
+ value,
481
+ test: "instanceof",
482
+ className: info.def.name,
483
+ type: BOOL,
484
+ loc,
485
+ },
486
+ then: { kind: "boolLit", value: true, type: BOOL, loc },
487
+ else_: classInstanceOf(lowerer, { kind: "caughtToDyn", value, type: DYN, loc }, info, loc),
488
+ type: BOOL,
489
+ loc,
490
+ };
491
+ }
492
+ return {
493
+ kind: "caughtTest",
494
+ value: { kind: "varRef", localId: caughtLocal.id, type: CAUGHT, loc },
495
+ test: "instanceof",
496
+ className: info.def.name,
497
+ type: BOOL,
498
+ loc,
499
+ };
500
+ };
501
+ const test = caughtInstanceOf(target);
502
+ return duplex
503
+ ? { kind: "logical", op: "||", left: test, right: caughtInstanceOf(duplex), type: BOOL, loc }
504
+ : test;
505
+ }
506
+ const left = lowerer.lowerExpr(expr.left);
507
+ // `u instanceof Error` on an `unknown` value: the checked-dynamic tree's error encoding
508
+ // (the shape caughtToDyn builds for Error payloads — the reserved
509
+ // "%error" marker) answers the test, so a caught Error passed through
510
+ // an unknown slot narrows like Node (`error instanceof Error ?
511
+ // error.message : String(error)` — the LAN-monitor handler). ROOT
512
+ // only: the marker cannot honestly answer subclass prototype chains
513
+ // (name strings are user-writable), so `u instanceof TypeError` keeps
514
+ // the fence. Reads past the narrow bridge through maybeNarrow's
515
+ // validated %Error extraction. SEMANTICS.md 67.
516
+ if (left.type.kind === "dyn" &&
517
+ !target.def.runtime &&
518
+ !target.builtinError &&
519
+ !target.builtinEmitter &&
520
+ !target.builtinStream &&
521
+ !target.localClass) {
522
+ return classInstanceOf(lowerer, left, target, loc);
523
+ }
524
+ if (left.type.kind === "dyn" && target.def.name === "%Error") {
525
+ return { kind: "dynTest", test: "error", value: left, type: BOOL, loc };
526
+ }
527
+ // `u instanceof TypeError` (and the other BUILTIN error classes) on a
528
+ // dyn value: the from_error cache holds the checked-dynamic tree↔error identity edge,
529
+ // so the runtime resolves the encoding back to its error and asks the
530
+ // vtable's stamped interval — exact for every error that crossed the
531
+ // boundary (a hand-built {%error} literal answers false: subclass
532
+ // identity is unknowable there). User subclasses keep the fence.
533
+ if (left.type.kind === "dyn" && RUNTIME_ERROR_CLASSES.has(target.def.name)) {
534
+ const rec = RUNTIME_ERROR_CLASSES.get(target.def.name);
535
+ return {
536
+ kind: "libCall",
537
+ fn: "dyn.errInstanceof",
538
+ args: [left, { kind: "numLit", value: rec.kind, type: F64, loc }],
539
+ type: BOOL,
540
+ loc,
541
+ };
542
+ }
543
+ // `u instanceof EventEmitter` (or a stream class): an untyped object
544
+ // built by a constructor function inherits the untyped constructor's
545
+ // prototype (builtin-class-dyn.ts), and a compiled emitter or stream
546
+ // boxes as a typed reference the class test answers for.
547
+ const builtinKind = builtinClassKind(target.def.name);
548
+ if (left.type.kind === "dyn" && builtinKind !== null) {
549
+ return builtinClassInstanceOfAny(lowerer, left, builtinKind, target, loc);
550
+ }
551
+ if (left.type.kind === "dyn") {
552
+ lowerer.unsupported("SC1090", expr, `'instanceof ${target.def.name.replace(/^%/, "")}' on 'unknown' values (only the Error classes answer — test 'instanceof Error' and read '.name')`);
553
+ }
554
+ if (left.type.kind === "union") {
555
+ const unionId = left.type.unionId;
556
+ const arms = lowerer.unions.get(unionId)?.arms;
557
+ // Ordinary records, arrays and scalar values do not carry a class
558
+ // prototype (no program class extends Array). Dynamic/opaque runtime
559
+ // objects keep their existing instanceof fences.
560
+ if (arms?.every((arm) => arm.kind === "object" ||
561
+ arm.kind === "record" ||
562
+ arm.kind === "array" ||
563
+ arm.kind === "f64" ||
564
+ arm.kind === "string" ||
565
+ arm.kind === "bool" ||
566
+ arm.kind === "bigint" ||
567
+ arm.kind === "symbol" ||
568
+ isUnitType(arm))) {
569
+ const key = `instanceof.union:${unionId}:${target.def.name}`;
570
+ let helper = lowerer.valueHelpers.get(key);
571
+ if (!helper) {
572
+ helper = `%instanceof.union.${lowerer.valueHelpers.size}`;
573
+ lowerer.valueHelpers.set(key, helper);
574
+ const value = { kind: "varRef", localId: "value.0", type: left.type, loc };
575
+ const body = [];
576
+ arms.forEach((arm, tag) => {
577
+ if (arm.kind !== "object")
578
+ return;
579
+ const lhsInfo = lowerer.classes.get(arm.className);
580
+ if (!lhsInfo)
581
+ throw new InternalCompilerError(`lowerer bug: unknown class ${arm.className}`);
582
+ const armTest = (info) => lowerer.inHierarchy(lhsInfo) && lowerer.inHierarchy(info)
583
+ ? {
584
+ kind: "instanceOf",
585
+ value: { kind: "unionNarrow", unionId, tag, value, type: arm, loc },
586
+ className: info.def.name,
587
+ type: BOOL,
588
+ loc,
589
+ }
590
+ : {
591
+ kind: "boolLit",
592
+ value: arm.className === info.def.name ||
593
+ lowerer.isSubclassOf(arm.className, info.def.name),
594
+ type: BOOL,
595
+ loc,
596
+ };
597
+ const result = runtimeTests(arm.className)
598
+ .map(armTest)
599
+ .reduce((left, right) => ({
600
+ kind: "logical",
601
+ op: "||",
602
+ left,
603
+ right,
604
+ type: BOOL,
605
+ loc,
606
+ }));
607
+ body.push({
608
+ kind: "if",
609
+ cond: { kind: "unionIsTag", unionId, tag, negated: false, value, type: BOOL, loc },
610
+ then: [{ kind: "return", value: result, loc }],
611
+ else_: null,
612
+ loc,
613
+ });
614
+ });
615
+ body.push({
616
+ kind: "return",
617
+ value: { kind: "boolLit", value: false, type: BOOL, loc },
618
+ loc,
619
+ });
620
+ lowerer.liftedFns.push({
621
+ name: helper,
622
+ params: [{ localId: "value.0", name: "value", type: left.type }],
623
+ returnType: BOOL,
624
+ locals: [{ id: "value.0", name: "value", type: left.type, mutable: false }],
625
+ body,
626
+ loc,
627
+ });
628
+ }
629
+ return { kind: "call", callee: helper, args: [left], type: BOOL, loc };
630
+ }
631
+ // A class arm could hold an instance: the test cannot be decided
632
+ // statically.
633
+ if (arms?.some((arm) => arm.kind === "object"))
634
+ lowerer.unsupported("SC1090", expr, "'instanceof' on a union of class instances and values without a class prototype test");
635
+ }
636
+ if (left.type.kind !== "object") {
637
+ return readsClassAfter(lowerer, target, expr.right, [{ kind: "exprStmt", expr: left, loc }], {
638
+ kind: "boolLit",
639
+ value: false,
640
+ type: BOOL,
641
+ loc,
642
+ });
643
+ }
644
+ const lhsInfo = lowerer.classes.get(left.type.className);
645
+ if (!lhsInfo)
646
+ throw new InternalCompilerError(`lowerer bug: unknown class ${left.type.className}`);
647
+ if (lowerer.inHierarchy(lhsInfo) && lowerer.inHierarchy(target)) {
648
+ const tests = runtimeTests(left.type.className);
649
+ if (tests.length === 1) {
650
+ return { kind: "instanceOf", value: left, className: tests[0].def.name, type: BOOL, loc };
651
+ }
652
+ const local = lowerer.declareHiddenLocal("%writableTest", left.type);
653
+ const ref = varRef(local.id, left.type, loc);
654
+ const test = (className) => ({
655
+ kind: "instanceOf",
656
+ value: ref,
657
+ className,
658
+ type: BOOL,
659
+ loc,
660
+ });
661
+ return {
662
+ kind: "seqExpr",
663
+ stmts: [{ kind: "varDecl", localId: local.id, init: left, loc }],
664
+ result: {
665
+ kind: "logical",
666
+ op: "||",
667
+ left: test(tests[0].def.name),
668
+ right: test(tests[1].def.name),
669
+ type: BOOL,
670
+ loc,
671
+ },
672
+ type: BOOL,
673
+ loc,
674
+ };
675
+ }
676
+ const leftClass = left.type.className;
677
+ const isInstance = (className) => leftClass === className || lowerer.isSubclassOf(leftClass, className);
678
+ const value = isInstance(target.def.name) || (duplex !== undefined && isInstance(duplex.def.name));
679
+ if (left.kind === "varRef") {
680
+ return readsClassAfter(lowerer, target, expr.right, [], {
681
+ kind: "boolLit",
682
+ value,
683
+ type: BOOL,
684
+ loc,
685
+ });
686
+ }
687
+ lowerer.unsupported("SC1090", expr, "statically-decided 'instanceof' on computed operands (bind the value to a variable first)");
688
+ }
689
+ /** `x instanceof K` for a union-typed operand whose arms are class
690
+ * instances or unit values: each instance arm tests against the class
691
+ * value (with the Writable rule), unit arms answer false. Null when an arm
692
+ * is anything else. */
693
+ function unionClassValueInstanceOf(lowerer, left, right, targetInfo, loc) {
694
+ if (left.type.kind !== "union")
695
+ return null;
696
+ const unionId = left.type.unionId;
697
+ const arms = lowerer.unions.get(unionId)?.arms;
698
+ if (!arms?.every((arm) => {
699
+ if (arm.kind !== "object")
700
+ return isUnitType(arm);
701
+ const info = lowerer.classes.get(arm.className);
702
+ return info !== undefined && lowerer.inHierarchy(info);
703
+ }))
704
+ return null;
705
+ const classValue = lowerer.lowerExpr(right);
706
+ if (classValue.type.kind !== "classval")
707
+ lowerer.badType(right, lowerer.typeOf(right));
708
+ const value = lowerer.declareHiddenLocal("%instanceValue", left.type);
709
+ const cls = lowerer.declareHiddenLocal("%instanceClass", classValue.type);
710
+ const valueRef = varRef(value.id, left.type, loc);
711
+ const clsRef = varRef(cls.id, classValue.type, loc);
712
+ let result = { kind: "boolLit", value: false, type: BOOL, loc };
713
+ arms.forEach((arm, tag) => {
714
+ if (arm.kind !== "object")
715
+ return;
716
+ const narrowed = { kind: "unionNarrow", unionId, tag, value: valueRef, type: arm, loc };
717
+ const lhsInfo = lowerer.classes.get(arm.className);
718
+ const test = writableClassValueTest(lowerer, narrowed, clsRef, targetInfo, lhsInfo, loc) ?? { kind: "instanceOfValue", value: narrowed, classValue: clsRef, type: BOOL, loc };
719
+ result = {
720
+ kind: "ternary",
721
+ cond: { kind: "unionIsTag", unionId, tag, negated: false, value: valueRef, type: BOOL, loc },
722
+ then: test,
723
+ else_: result,
724
+ type: BOOL,
725
+ loc,
726
+ };
727
+ });
728
+ return {
729
+ kind: "seqExpr",
730
+ stmts: [
731
+ { kind: "varDecl", localId: value.id, init: left, loc },
732
+ { kind: "varDecl", localId: cls.id, init: classValue, loc },
733
+ ],
734
+ result,
735
+ type: BOOL,
736
+ loc,
737
+ };
738
+ }
739
+ /** `x instanceof K` where K is a class value that may hold Writable (a
740
+ * `typeof Writable` or `typeof EventEmitter` slot): Node's
741
+ * Writable[Symbol.hasInstance] also answers true for streams with a
742
+ * writable side that do not inherit from Writable (Duplex and its
743
+ * subclasses), so when K is Writable the Duplex interval answers too.
744
+ * Null when the slot cannot hold Writable or the operand cannot be a
745
+ * Duplex. */
746
+ function writableClassValueTest(lowerer, left, classValue, targetInfo, lhsInfo, loc) {
747
+ const writable = lowerer.classes.get("%Writable");
748
+ const duplex = lowerer.classes.get("%Duplex");
749
+ if (!writable || !duplex || classValue.type.kind !== "classval" || left.type.kind !== "object")
750
+ return null;
751
+ const slotHoldsWritable = targetInfo === writable || lowerer.isSubclassOf("%Writable", targetInfo.def.name);
752
+ const operandMayBeDuplex = lhsInfo === duplex ||
753
+ lowerer.isSubclassOf(lhsInfo.def.name, "%Duplex") ||
754
+ lowerer.isSubclassOf("%Duplex", lhsInfo.def.name);
755
+ if (!slotHoldsWritable || !operandMayBeDuplex)
756
+ return null;
757
+ lowerer.defineClassValueConstruct(writable);
758
+ const value = lowerer.declareHiddenLocal("%instanceValue", left.type);
759
+ const cls = lowerer.declareHiddenLocal("%instanceClass", classValue.type);
760
+ const valueRef = varRef(value.id, left.type, loc);
761
+ const clsRef = varRef(cls.id, classValue.type, loc);
762
+ return {
763
+ kind: "seqExpr",
764
+ stmts: [
765
+ { kind: "varDecl", localId: value.id, init: left, loc },
766
+ { kind: "varDecl", localId: cls.id, init: classValue, loc },
767
+ ],
768
+ result: {
769
+ kind: "logical",
770
+ op: "||",
771
+ left: { kind: "instanceOfValue", value: valueRef, classValue: clsRef, type: BOOL, loc },
772
+ right: {
773
+ kind: "logical",
774
+ op: "&&",
775
+ left: {
776
+ kind: "bin",
777
+ op: "===",
778
+ left: clsRef,
779
+ right: {
780
+ kind: "classRef",
781
+ className: "%Writable",
782
+ type: { kind: "classval", className: "%Writable" },
783
+ loc,
784
+ },
785
+ type: BOOL,
786
+ loc,
787
+ },
788
+ right: { kind: "instanceOf", value: valueRef, className: "%Duplex", type: BOOL, loc },
789
+ type: BOOL,
790
+ loc,
791
+ },
792
+ type: BOOL,
793
+ loc,
794
+ },
795
+ type: BOOL,
796
+ loc,
797
+ };
798
+ }
799
+ /** A statically decided `instanceof` still reads its class after the left
800
+ * operand: a class with an initialization flag throws there before its
801
+ * declaration ran. */
802
+ function readsClassAfter(lowerer, target, right, stmts, result) {
803
+ if (!lowerer.classInitFlags.has(target.def.name)) {
804
+ if (stmts.length === 0)
805
+ return result;
806
+ return { kind: "seqExpr", stmts, result, type: result.type, loc: result.loc };
807
+ }
808
+ const read = lowerer.lowerExpr(right);
809
+ return {
810
+ kind: "seqExpr",
811
+ stmts: [...stmts, { kind: "exprStmt", expr: read, loc: locOf(right) }],
812
+ result,
813
+ type: result.type,
814
+ loc: result.loc,
815
+ };
816
+ }
817
+ /** `#name in obj` — the ergonomic brand check. In this closed world a
818
+ * brand is held by exactly the instances of the declaring class
819
+ * (subclasses included — construction always runs the declaring class's
820
+ * own initializers), so the test IS `obj instanceof <declaring class>`:
821
+ * statically decided when the receiver's class sits at/below the
822
+ * declarer (true) or in a disjoint subtree (false) — both folds under
823
+ * the instanceof purity rule — and a runtime interval test when the
824
+ * declarer sits strictly BELOW the receiver's static class (the
825
+ * narrowing use; tsc types the true branch at the class, and reads
826
+ * bridge through maybeNarrow's downcast exactly like instanceof). tsc
827
+ * confines the spelling to the declaring class's body and rejects
828
+ * primitive/unknown receivers, so Node's in-operator TypeError is
829
+ * unreachable in compilable programs. Timing residue: JS installs
830
+ * brands DURING construction, so a check reachable from a base
831
+ * constructor can observe false mid-construction where this answers
832
+ * true (SEMANTICS.md). */
833
+ function lowerPrivateIn(lowerer, expr, priv, loc) {
834
+ const pname = priv.text;
835
+ // The declaring class: the nearest enclosing class declaring the name
836
+ // (JS scoping — an inner class's spelling shadows an outer one's).
837
+ let classDecl = null;
838
+ let staticBrand = false;
839
+ for (let n = priv.parent; n; n = n.parent) {
840
+ if (ts.isClassDeclaration(n) || ts.isClassExpression(n)) {
841
+ const owner = n.members.nodes.find((m) => {
842
+ const name = m.name;
843
+ return name !== undefined && ts.isPrivateIdentifier(name) && name.text === pname;
844
+ });
845
+ if (owner) {
846
+ classDecl = n;
847
+ staticBrand =
848
+ ts.canHaveModifiers(owner) &&
849
+ ts.getModifiers(owner)?.some((m) => m.kind === ts.SyntaxKind.StaticKeyword) === true;
850
+ break;
851
+ }
852
+ }
853
+ }
854
+ // tsc rejects the spelling outside a declaring class body; defensive.
855
+ if (!classDecl)
856
+ lowerer.unsupported("SC1090", expr, `'${pname} in …' outside a class declaring '${pname}'`);
857
+ if (staticBrand) {
858
+ lowerer.unsupported("SC1090", expr, `'${pname} in …' brand checks for private STATICS (JS brands the declaring class OBJECT, not instances — compare against the class value directly)`);
859
+ }
860
+ const info = lowerer.currentClass?.decl === classDecl
861
+ ? lowerer.currentClass
862
+ : (() => {
863
+ const sym = classDecl.name
864
+ ? lowerer.checker.getSymbolAtLocation(classDecl.name)
865
+ : undefined;
866
+ return sym ? lowerer.classBySymbol.get(sym) : undefined;
867
+ })();
868
+ if (!info) {
869
+ lowerer.unsupported("SC1090", expr, `'${pname} in …' where the declaring class has no lowering (see the class declaration's own diagnostic)`);
870
+ }
871
+ // A GENERIC family: JS has ONE runtime class and ONE brand for every
872
+ // instantiation, while these layouts mint one class per instantiation
873
+ // — a cross-instantiation check would answer false where Node says
874
+ // true, so the family reports SC1090 instead of splitting the brand.
875
+ if (info.generic || info.genericInstance) {
876
+ lowerer.unsupported("SC1090", expr, `'${pname} in …' inside a generic class (JS shares one brand across every instantiation; these layouts mint one class per instantiation)`);
877
+ }
878
+ const recv = lowerer.lowerExpr(expr.right);
879
+ const declName = info.def.name;
880
+ // A UNION of class instances (`o: Counter | Helper` — the
881
+ // discriminating use): every object arm answers membership STATICALLY
882
+ // (at/below the declarer → true, disjoint subtree → false), so the
883
+ // whole test collapses to runtime TAG tests — the record-shape 'in'
884
+ // discrimination, brand form. An arm ABOVE the declarer answers per
885
+ // VALUE (its slot can hold branded and unbranded instances), and
886
+ // non-object arms have no brand story — both fence.
887
+ if (recv.type.kind === "union") {
888
+ const unionId = recv.type.unionId;
889
+ const arms = lowerer.unions.get(unionId)?.arms ?? [];
890
+ const answers = [];
891
+ let staticAnswers = arms.length > 0;
892
+ for (const arm of arms) {
893
+ const tag = lowerer.armTag(unionId, arm);
894
+ if (tag < 0 || arm.kind !== "object" || lowerer.isSubclassOf(declName, arm.className)) {
895
+ staticAnswers = false;
896
+ break;
897
+ }
898
+ answers.push({
899
+ tag,
900
+ has: arm.className === declName || lowerer.isSubclassOf(arm.className, declName),
901
+ });
902
+ }
903
+ if (staticAnswers) {
904
+ const pureRecv = recv.kind === "varRef" || recv.kind === "recordGet" || recv.kind === "fieldGet";
905
+ const isTag = (tag, negated) => ({
906
+ kind: "unionIsTag",
907
+ unionId,
908
+ tag,
909
+ negated,
910
+ value: recv,
911
+ type: BOOL,
912
+ loc,
913
+ });
914
+ const trues = answers.filter((a) => a.has);
915
+ if (trues.length === answers.length || trues.length === 0) {
916
+ const ans = trues.length !== 0;
917
+ if (pureRecv)
918
+ return { kind: "boolLit", value: ans, type: BOOL, loc };
919
+ // Constant either way, receiver still evaluates once: one tag
920
+ // test whose branches agree (the record-'in' rule verbatim).
921
+ return {
922
+ kind: "ternary",
923
+ cond: isTag(answers[0].tag, false),
924
+ then: { kind: "boolLit", value: ans, type: BOOL, loc },
925
+ else_: { kind: "boolLit", value: ans, type: BOOL, loc },
926
+ type: BOOL,
927
+ loc,
928
+ };
929
+ }
930
+ if (trues.length === 1)
931
+ return isTag(trues[0].tag, false);
932
+ const falses = answers.filter((a) => !a.has);
933
+ if (falses.length === 1)
934
+ return isTag(falses[0].tag, true);
935
+ if (pureRecv) {
936
+ let out = isTag(trues[0].tag, false);
937
+ for (const t of trues.slice(1)) {
938
+ out = {
939
+ kind: "logical",
940
+ op: "||",
941
+ left: out,
942
+ right: isTag(t.tag, false),
943
+ type: BOOL,
944
+ loc,
945
+ };
946
+ }
947
+ return out;
948
+ }
949
+ lowerer.unsupported("SC1090", expr, `statically-decided '${pname} in …' on computed receivers (bind the value to a variable first)`);
950
+ }
951
+ }
952
+ // A checked value in JavaScript (`#x in this` inside a method, whose
953
+ // receiver is the actual call-site value): the brand is present exactly
954
+ // when the value is a class instance at or below the declarer. A typed
955
+ // reference carries the class it was boxed under: the declarer or a
956
+ // descendant answers true; an ancestor answers per instance.
957
+ if (recv.type.kind === "dyn" &&
958
+ recv.kind === "varRef" &&
959
+ isJsSourceFile(ts.getSourceFileOfNode(expr))) {
960
+ // A function-local class has one brand per evaluation.
961
+ if (info.localClass) {
962
+ const owner = localPrivateBrandClass(lowerer, priv);
963
+ if (!owner) {
964
+ lowerer.unsupported("SC1090", expr, `'${pname} in …' inside a function-local class that is not a named declaration`);
965
+ }
966
+ return checkedPrivateIn(lowerer, owner.info, owner.decl, pname, recv, loc);
967
+ }
968
+ const typedRefIs = (className) => ({
969
+ kind: "libCall",
970
+ fn: "dyn.typedRefIs",
971
+ args: [
972
+ recv,
973
+ { kind: "strLit", value: typeKey({ kind: "object", className }), type: STRING, loc },
974
+ ],
975
+ type: BOOL,
976
+ loc,
977
+ });
978
+ const or = (left, right) => left === null ? right : { kind: "logical", op: "||", left, right, type: BOOL, loc };
979
+ let test = null;
980
+ const below = (c) => {
981
+ test = or(test, typedRefIs(c.def.name));
982
+ for (const sub of c.subclasses)
983
+ below(sub);
984
+ };
985
+ below(info);
986
+ for (let base = info.base; base; base = base.base) {
987
+ const baseType = { kind: "object", className: base.def.name };
988
+ test = or(test, {
989
+ kind: "logical",
990
+ op: "&&",
991
+ left: typedRefIs(base.def.name),
992
+ right: {
993
+ kind: "instanceOf",
994
+ value: { kind: "dynCheck", value: recv, type: baseType, loc },
995
+ className: declName,
996
+ type: BOOL,
997
+ loc,
998
+ },
999
+ type: BOOL,
1000
+ loc,
1001
+ });
1002
+ }
1003
+ // Only objects carry private names: a primitive operand throws Node's
1004
+ // TypeError.
1005
+ return {
1006
+ kind: "ternary",
1007
+ cond: primitiveOperand(recv, loc),
1008
+ then: {
1009
+ kind: "libCall",
1010
+ fn: "error.nodeThrow",
1011
+ args: [numLit(1, loc), strLit("", loc), privateInMessage(pname, recv, loc)],
1012
+ type: BOOL,
1013
+ loc,
1014
+ },
1015
+ else_: test,
1016
+ type: BOOL,
1017
+ loc,
1018
+ };
1019
+ }
1020
+ if (recv.type.kind !== "object") {
1021
+ lowerer.unsupported("SC1090", expr, `'${pname} in …' on '${lowerer.fmt(recv.type)}' receivers (only class-instance receivers — and unions of classes below or beside the declarer — have a static brand answer; narrow first)`);
1022
+ }
1023
+ const lhsName = recv.type.className;
1024
+ const lhsInfo = lowerer.classes.get(lhsName);
1025
+ if (!lhsInfo)
1026
+ throw new InternalCompilerError(`lowerer bug: unknown class ${lhsName}`);
1027
+ if (lowerer.isSubclassOf(declName, lhsName)) {
1028
+ // The narrowing direction: the declarer strictly below the
1029
+ // receiver's static class — a strict subclass relation puts both in
1030
+ // a hierarchy, so the vtable interval test always exists.
1031
+ return { kind: "instanceOf", value: recv, className: declName, type: BOOL, loc };
1032
+ }
1033
+ const value = lhsName === declName || lowerer.isSubclassOf(lhsName, declName);
1034
+ if (recv.kind === "varRef")
1035
+ return { kind: "boolLit", value, type: BOOL, loc };
1036
+ lowerer.unsupported("SC1090", expr, `statically-decided '${pname} in …' on computed operands (bind the value to a variable first)`);
1037
+ }
1038
+ /** The string keys every record inherits from Object.prototype. */
1039
+ /** Keys built-in errors carry outside their class fields: Node's system
1040
+ * error properties, and AggregateError's, SuppressedError's and
1041
+ * AssertionError's own members. */
1042
+ const BUILTIN_ERROR_SLOT_KEYS = new Set([
1043
+ "errno",
1044
+ "syscall",
1045
+ "path",
1046
+ "dest",
1047
+ "info",
1048
+ "errors",
1049
+ "error",
1050
+ "suppressed",
1051
+ "actual",
1052
+ "expected",
1053
+ "operator",
1054
+ "generatedMessage",
1055
+ ]);
1056
+ const OBJECT_PROTOTYPE_KEYS = new Set([
1057
+ "constructor",
1058
+ "__defineGetter__",
1059
+ "__defineSetter__",
1060
+ "hasOwnProperty",
1061
+ "__lookupGetter__",
1062
+ "__lookupSetter__",
1063
+ "isPrototypeOf",
1064
+ "propertyIsEnumerable",
1065
+ "toString",
1066
+ "valueOf",
1067
+ "__proto__",
1068
+ "toLocaleString",
1069
+ ]);
1070
+ /** `"key" in v` — the key-presence test. Three lowered receivers:
1071
+ * process.env (getenv(3) presence — Node-exact, an empty value still
1072
+ * counts as present), and monomorphic record shapes, where the answer is
1073
+ * type-directed: a declared non-optional field is a compile-time `true`,
1074
+ * a missing field (no index signature) a compile-time `false` unless
1075
+ * Object.prototype has it — both
1076
+ * folds limited to side-effect-free receivers, the lowerInstanceOf rule —
1077
+ * and an OPTIONAL field (undefined-armed union) is a runtime presence
1078
+ * test on the slot: an omitted or deleted property is absent, while a
1079
+ * property explicitly holding `undefined` is present, as in JS
1080
+ * (`"a" in {a: undefined}` is true). Union receivers (the `in`-narrowing
1081
+ * idiom over multiple shapes), index-signature keys, class instances,
1082
+ * and dyn/unknown stay fenced. Keys are literal strings — a computed key
1083
+ * over a shape would need the runtime key table. */
1084
+ export function lowerInExpression(lowerer, expr, loc) {
1085
+ if (lowerer.isStdlibGlobal(expr.right, "process") &&
1086
+ lowerer.foldedStringKeyOf(expr.left) === "hrtime") {
1087
+ return { kind: "boolLit", value: true, type: BOOL, loc };
1088
+ }
1089
+ const globalKey = globalSymbolKey(lowerer, expr.right, expr.left);
1090
+ if (globalKey)
1091
+ return { kind: "libCall", fn: "dyn.globalSymbolHas", args: [globalKey], type: BOOL, loc };
1092
+ // `#name in obj` — the ergonomic brand check (ES2022) — resolves
1093
+ // before any string-key machinery: the left operand is a private
1094
+ // NAME, not a value.
1095
+ if (ts.isPrivateIdentifier(expr.left)) {
1096
+ return lowerPrivateIn(lowerer, expr, expr.left, loc);
1097
+ }
1098
+ // Compile-time-known STRING keys fold — literals, and the same
1099
+ // const/enum-literal and template folding computed property keys get
1100
+ // (foldedStringKeyOf); runtime-valued keys keep the fence.
1101
+ // NUMERIC literal keys answer on ARRAY receivers through the shared
1102
+ // presence query. Arrays retain holes independently from length, and
1103
+ // noncanonical numeric keys live in their ordinary-property table, so
1104
+ // a length comparison is not an honest `in` answer.
1105
+ {
1106
+ let kNode = expr.left;
1107
+ while (ts.isParenthesizedExpression(kNode))
1108
+ kNode = kNode.expression;
1109
+ if (ts.isNumericLiteral(kNode) &&
1110
+ lowerer.mapTypeOf(lowerer.typeOf(expr.right))?.kind === "array") {
1111
+ const recvArr = lowerer.lowerExpr(expr.right);
1112
+ if (recvArr.type.kind === "array") {
1113
+ const n = Number(kNode.text);
1114
+ return {
1115
+ kind: "arrayHas",
1116
+ arr: recvArr,
1117
+ index: { kind: "numLit", value: n, type: F64, loc },
1118
+ type: BOOL,
1119
+ loc,
1120
+ };
1121
+ }
1122
+ }
1123
+ }
1124
+ // A RUNTIME numeric key over an ARRAY receiver (`if (i in arr)` in a
1125
+ // loop) asks the same slot/property presence query as the literal fold
1126
+ // above and `Object.hasOwn`. The checked-dynamic fallback below would
1127
+ // box the receiver and materialize every element on each evaluation,
1128
+ // which makes such loops quadratic. A Number key never names an
1129
+ // inherited property: neither Array.prototype nor Object.prototype has
1130
+ // index-like or numeric-string keys. JS evaluates the key before the
1131
+ // receiver, so the key is stabilized in a hidden local first.
1132
+ if (lowerer.mapTypeOf(lowerer.typeOf(expr.left))?.kind === "f64" &&
1133
+ lowerer.mapTypeOf(lowerer.typeOf(expr.right))?.kind === "array") {
1134
+ const k = lowerer.lowerExpr(expr.left);
1135
+ const recvArr = lowerer.lowerExpr(expr.right);
1136
+ if (k.type.kind === "f64" && recvArr.type.kind === "array") {
1137
+ const keyLocal = lowerer.declareHiddenLocal("%inIndex", F64);
1138
+ return {
1139
+ kind: "seqExpr",
1140
+ stmts: [{ kind: "varDecl", localId: keyLocal.id, init: k, loc }],
1141
+ result: {
1142
+ kind: "arrayHas",
1143
+ arr: recvArr,
1144
+ index: varRef(keyLocal.id, F64, loc),
1145
+ type: BOOL,
1146
+ loc,
1147
+ },
1148
+ type: BOOL,
1149
+ loc,
1150
+ };
1151
+ }
1152
+ }
1153
+ const key = foldedStringKeyOf(lowerer, expr.left);
1154
+ if (key === null) {
1155
+ // A RUNTIME string key over an INDEX-SIGNATURE record receiver (the
1156
+ // `names.filter((k) => k in config)` idiom): the interned key-
1157
+ // presence helper — declared fields answer statically per name
1158
+ // (optional slots by their runtime presence), then the overflow
1159
+ // map's live keys. Other receivers keep the
1160
+ // fence: fixed shapes want the literal folds above, and there is no
1161
+ // runtime key table to ask.
1162
+ const rIn = lowerRuntimeKeyIn(lowerer, expr, loc);
1163
+ if (rIn)
1164
+ return rIn;
1165
+ // A runtime key over a CHECKED-DYNAMIC receiver (`name in
1166
+ // agent.sockets` — both sides computed; the checker may type the
1167
+ // receiver as a Dict while the VALUE lives in the checked-dynamic tree, so the
1168
+ // LOWERED type decides): the dyn presence answer, with the key
1169
+ // stringified like every property key (o[k] is o[String(k)] in JS;
1170
+ // `in` shares the coercion).
1171
+ {
1172
+ const probed = tryLowerExpression(lowerer, expr.right);
1173
+ if (probed && lowerer.dynConvertible(probed.type)) {
1174
+ const k = lowerer.lowerExpr(expr.left); // JS order: the key evaluates first
1175
+ if (lowerer.dynConvertible(k.type)) {
1176
+ const boxed = lowerer.coerceToExpected(k, DYN);
1177
+ const keyLocal = lowerer.declareHiddenLocal("%inKey", DYN);
1178
+ return {
1179
+ kind: "seqExpr",
1180
+ stmts: [{ kind: "varDecl", localId: keyLocal.id, init: boxed, loc }],
1181
+ result: {
1182
+ kind: "libCall",
1183
+ fn: "dyn.hasKeyComputed",
1184
+ args: [
1185
+ lowerer.coerceToExpected(lowerer.lowerExpr(expr.right), DYN),
1186
+ varRef(keyLocal.id, DYN, loc),
1187
+ ],
1188
+ type: BOOL,
1189
+ loc,
1190
+ },
1191
+ type: BOOL,
1192
+ loc,
1193
+ };
1194
+ }
1195
+ }
1196
+ }
1197
+ lowerer.unsupported("SC1090", expr.left, "'in' with computed (non-literal) keys (a const whose type is one string literal folds; a string-typed key answers over index-signature record receivers)");
1198
+ }
1199
+ // A receiver re-read (the static folds below) is safe for plain reads
1200
+ // AND for side-effect-free expressions (an object literal of literals
1201
+ // — the `"a" in { a: true }` shape).
1202
+ const pureRecvNode = sideEffectFreeOptionValue(expr.right);
1203
+ if (lowerer.isProcessEnv(expr.right)) {
1204
+ // `"NO_COLOR" in process.env`: presence via the one envGet intrinsic —
1205
+ // getenv(3) returning non-NULL is Node's `in` on process.env exactly.
1206
+ const envType = lowerer.envValueType();
1207
+ if (envType.kind !== "union")
1208
+ throw new InternalCompilerError("lowerer bug: env value type is not a union");
1209
+ const undefTag = lowerer.armTag(envType.unionId, UNDEFINED_T);
1210
+ const read = {
1211
+ kind: "libCall",
1212
+ fn: "process.envGet",
1213
+ args: [{ kind: "strLit", value: key, type: STRING, loc }],
1214
+ type: envType,
1215
+ loc,
1216
+ };
1217
+ return {
1218
+ kind: "unionIsTag",
1219
+ unionId: envType.unionId,
1220
+ tag: undefTag,
1221
+ negated: true,
1222
+ value: read,
1223
+ type: BOOL,
1224
+ loc,
1225
+ };
1226
+ }
1227
+ if (key === "code" && isExecExceptionType(lowerer, lowerer.typeOf(expr.right))) {
1228
+ refuseExecExceptionCode(lowerer, expr);
1229
+ }
1230
+ // A literal key that names no declared member of an index-signature
1231
+ // record (`"id" in match.groups`): the same keyed presence probe a
1232
+ // runtime key takes — declared fields by name, then the overflow keys.
1233
+ {
1234
+ const recvT = lowerer.mapTypeOf(lowerer.typeOf(expr.right));
1235
+ const shape = recvT?.kind === "record" ? lowerer.shapes.get(recvT.shapeId) : undefined;
1236
+ if (shape?.indexValue &&
1237
+ !shape.tuple &&
1238
+ !OBJECT_PROTOTYPE_KEYS.has(key) &&
1239
+ !shape.fields.some((f) => f.name === key || f.name === `%get:${key}` || f.name === `%set:${key}`)) {
1240
+ const probed = lowerRuntimeKeyIn(lowerer, expr, loc);
1241
+ if (probed)
1242
+ return probed;
1243
+ }
1244
+ }
1245
+ let recv = lowerer.lowerExpr(expr.right);
1246
+ const classInfo = recv.type.kind === "classval" ? lowerer.classes.get(recv.type.className) : undefined;
1247
+ if ((classInfo && (classInfo.callableBase || hasRuntimeStatics(classInfo))) ||
1248
+ (isJsSourceFile(ts.getSourceFileOfNode(expr)) &&
1249
+ recv.type.kind === "func" &&
1250
+ lowerer.dynConvertible(recv.type))) {
1251
+ recv = lowerer.coerceToExpected(recv, DYN);
1252
+ }
1253
+ const siteType = lowerer.mapTypeOf(lowerer.typeOf(expr.right));
1254
+ if (recv.type.kind === "union" &&
1255
+ siteType?.kind === "union" &&
1256
+ !typeEquals(recv.type, siteType)) {
1257
+ const helper = lowerer.narrowedRetagHelper(expr.right, recv.type.unionId, siteType.unionId, loc);
1258
+ if (helper)
1259
+ recv = { kind: "call", callee: helper, args: [recv], type: siteType, loc };
1260
+ }
1261
+ // Error-rooted receivers (builtin or user subclass — the isErrnoException
1262
+ // predicate's `err instanceof Error && "code" in err` shape): `code`
1263
+ // answers from the runtime error's code slot (stamped by fs/system/
1264
+ // event/spawn errors, absent on plain constructions — exactly Node's
1265
+ // own-property answer), and the always-present members (message, name,
1266
+ // stack, Object.prototype's keys, members the static class declares)
1267
+ // fold true. Other keys test the declaring subclasses and the error's
1268
+ // own runtime properties; keys of built-in errors' extra slots fence.
1269
+ if (recv.type.kind === "object") {
1270
+ // %DOMException first: `'cause' in e` answers the options form's
1271
+ // own-property record (the runtime slot), and code/name/message are
1272
+ // always present.
1273
+ if (recv.type.className === "%DOMException") {
1274
+ if (key === "cause") {
1275
+ return { kind: "libCall", fn: "error.domHasCause", args: [recv], type: BOOL, loc };
1276
+ }
1277
+ if ((key === "code" || key === "message" || key === "name") &&
1278
+ (recv.kind === "varRef" || recv.kind === "caughtNarrow")) {
1279
+ return { kind: "boolLit", value: true, type: BOOL, loc };
1280
+ }
1281
+ }
1282
+ let info = lowerer.classes.get(recv.type.className) ?? null;
1283
+ while (info && info.base)
1284
+ info = info.base;
1285
+ if (info?.def.name === "%Error") {
1286
+ if (key === "cause") {
1287
+ return { kind: "libCall", fn: "error.hasCause", args: [recv], type: BOOL, loc };
1288
+ }
1289
+ // The code slot, or an own `code` with another value
1290
+ // (`err.code = undefined` is present).
1291
+ if (key === "code") {
1292
+ return { kind: "libCall", fn: "error.hasCode", args: [recv], type: BOOL, loc };
1293
+ }
1294
+ // The receiver evaluates for its effects when the answer is static.
1295
+ const always = () => recv.kind === "varRef" || recv.kind === "caughtNarrow"
1296
+ ? { kind: "boolLit", value: true, type: BOOL, loc }
1297
+ : {
1298
+ kind: "seqExpr",
1299
+ stmts: [{ kind: "exprStmt", expr: recv, loc }],
1300
+ result: { kind: "boolLit", value: true, type: BOOL, loc },
1301
+ type: BOOL,
1302
+ loc,
1303
+ };
1304
+ if (key === "message" || key === "name")
1305
+ return always();
1306
+ // Every Error has its own `stack`, and Error.prototype's `toString`
1307
+ // and `constructor` are among Object.prototype's keys.
1308
+ if (key === "stack" || OBJECT_PROTOTYPE_KEYS.has(key))
1309
+ return always();
1310
+ // A member the static class declares is always present.
1311
+ const declares = (c) => c.fields.has(key) ||
1312
+ lowerer.findMethodOn(c, key) !== null ||
1313
+ lowerer.findMethodOn(c, `get:${key}`) !== null ||
1314
+ lowerer.findMethodOn(c, `set:${key}`) !== null;
1315
+ const staticInfo = lowerer.classes.get(recv.type.className);
1316
+ if (staticInfo && declares(staticInfo))
1317
+ return always();
1318
+ // Any other key: a descendant class that declares it (instanceof), or
1319
+ // an own property set at runtime (a throw site's extra fields,
1320
+ // Object.assign, writes through a dynamic view). Keys built-in errors
1321
+ // keep outside their class fields depend on the runtime error and
1322
+ // stay fenced.
1323
+ if (!BUILTIN_ERROR_SLOT_KEYS.has(key)) {
1324
+ const stable = recv.kind === "varRef" || recv.kind === "caughtNarrow";
1325
+ const slot = stable ? null : lowerer.declareHiddenLocal("%inRecv", recv.type);
1326
+ const ref = () => (slot ? varRef(slot.id, recv.type, loc) : recv);
1327
+ const tests = [];
1328
+ const staticName = recv.type.className;
1329
+ for (const c of lowerer.classes.values()) {
1330
+ const name = c.def.name;
1331
+ if (name === staticName || !lowerer.isSubclassOf(name, staticName) || !declares(c))
1332
+ continue;
1333
+ // A declaring ancestor below the static class already covers it.
1334
+ if (c.base && c.base.def.name !== staticName && declares(c.base))
1335
+ continue;
1336
+ tests.push({ kind: "instanceOf", value: ref(), className: name, type: BOOL, loc });
1337
+ }
1338
+ tests.push({
1339
+ kind: "libCall",
1340
+ fn: "error.hasKey",
1341
+ args: [ref(), { kind: "strLit", value: key, type: STRING, loc }],
1342
+ type: BOOL,
1343
+ loc,
1344
+ });
1345
+ const answer = tests.reduce((acc, test) => ({
1346
+ kind: "logical",
1347
+ op: "||",
1348
+ left: acc,
1349
+ right: test,
1350
+ type: BOOL,
1351
+ loc,
1352
+ }));
1353
+ if (!slot)
1354
+ return answer;
1355
+ return {
1356
+ kind: "seqExpr",
1357
+ stmts: [{ kind: "varDecl", localId: slot.id, init: recv, loc }],
1358
+ result: answer,
1359
+ type: BOOL,
1360
+ loc,
1361
+ };
1362
+ }
1363
+ lowerer.unsupported("SC1090", expr, `'in' with the key '${key}' on Error receivers (code answers from the error's code slot; message and name are always present)`);
1364
+ }
1365
+ }
1366
+ // A dyn receiver (`"portless" in pkg` after the `typeof pkg ===
1367
+ // "object"` guard): own-member presence on the checked-dynamic tree — tsc admits `in`
1368
+ // only on object-typed operands, so unit receivers are unreachable.
1369
+ if (recv.type.kind === "dyn") {
1370
+ return { kind: "dynHasKey", key, value: recv, type: BOOL, loc };
1371
+ }
1372
+ // `"k" in u` over a UNION whose arms are FIXED record shapes: every
1373
+ // arm answers membership STATICALLY (a declared non-optional field is
1374
+ // always present, an undeclared name never is), so the whole test
1375
+ // collapses to runtime TAG tests — tsc's own narrowing then types the
1376
+ // branches (the discriminating-`in` idiom). An arm declaring the key
1377
+ // as an optional (undefined-armed) slot answers per VALUE instead:
1378
+ // its tag test joins that payload's presence test (see
1379
+ // perValueUnionIn). Tuple/index-signature arms keep the fence below.
1380
+ if (recv.type.kind === "union") {
1381
+ const unionId = recv.type.unionId;
1382
+ const arms = lowerer.unions.get(unionId)?.arms ?? [];
1383
+ const answers = [];
1384
+ let staticAnswers = arms.length > 0;
1385
+ for (const arm of arms) {
1386
+ const tag = lowerer.armTag(unionId, arm);
1387
+ const shape = arm.kind === "record" ? lowerer.shapes.get(arm.shapeId) : undefined;
1388
+ if (tag < 0 || !shape || shape.tuple || shape.indexValue) {
1389
+ staticAnswers = false;
1390
+ break;
1391
+ }
1392
+ const f = shape.fields.find((x) => x.name === key);
1393
+ const inherited = OBJECT_PROTOTYPE_KEYS.has(key);
1394
+ if (f &&
1395
+ !inherited &&
1396
+ f.type.kind === "union" &&
1397
+ lowerer.armTag(f.type.unionId, UNDEFINED_T) >= 0) {
1398
+ answers.push({ tag, has: "slot", arm }); // presence is per-value
1399
+ continue;
1400
+ }
1401
+ // Accessor properties are own properties to `in` (Node answers
1402
+ // true without invoking the getter) — either slot present makes
1403
+ // the name a member.
1404
+ const acc = shape.fields.some((x) => x.name === `%get:${key}` || x.name === `%set:${key}`);
1405
+ answers.push({ tag, has: f !== undefined || acc || inherited, arm });
1406
+ }
1407
+ if (staticAnswers && answers.some((a) => a.has === "slot")) {
1408
+ return perValueUnionIn(lowerer, recv, unionId, key, answers, loc);
1409
+ }
1410
+ if (staticAnswers) {
1411
+ const pureRecv = recv.kind === "varRef" ||
1412
+ recv.kind === "recordGet" ||
1413
+ recv.kind === "fieldGet" ||
1414
+ pureRecvNode;
1415
+ const isTag = (tag, negated) => ({
1416
+ kind: "unionIsTag",
1417
+ unionId,
1418
+ tag,
1419
+ negated,
1420
+ value: recv,
1421
+ type: BOOL,
1422
+ loc,
1423
+ });
1424
+ const trues = answers.filter((a) => a.has);
1425
+ if (trues.length === answers.length || trues.length === 0) {
1426
+ // Constant either way — but JS still EVALUATES the operand (it
1427
+ // may throw: an ambient-const read is a ReferenceError). Pure
1428
+ // reads fold; anything else rides one tag test whose branches
1429
+ // agree, evaluating the receiver exactly once.
1430
+ const ans = trues.length !== 0;
1431
+ if (pureRecv)
1432
+ return { kind: "boolLit", value: ans, type: BOOL, loc };
1433
+ return {
1434
+ kind: "ternary",
1435
+ cond: isTag(answers[0].tag, false),
1436
+ then: { kind: "boolLit", value: ans, type: BOOL, loc },
1437
+ else_: { kind: "boolLit", value: ans, type: BOOL, loc },
1438
+ type: BOOL,
1439
+ loc,
1440
+ };
1441
+ }
1442
+ // One deciding arm (either polarity): a single tag test, receiver
1443
+ // evaluated once — no purity requirement.
1444
+ if (trues.length === 1)
1445
+ return isTag(trues[0].tag, false);
1446
+ const falses = answers.filter((a) => !a.has);
1447
+ if (falses.length === 1)
1448
+ return isTag(falses[0].tag, true);
1449
+ // Several arms on each side: the OR chain re-reads the receiver,
1450
+ // so only side-effect-free reads qualify.
1451
+ if (pureRecv) {
1452
+ let out = isTag(trues[0].tag, false);
1453
+ for (const t of trues.slice(1)) {
1454
+ out = {
1455
+ kind: "logical",
1456
+ op: "||",
1457
+ left: out,
1458
+ right: isTag(t.tag, false),
1459
+ type: BOOL,
1460
+ loc,
1461
+ };
1462
+ }
1463
+ return out;
1464
+ }
1465
+ lowerer.unsupported("SC1090", expr, "statically-decided 'in' on computed receivers (bind the value to a variable first)");
1466
+ }
1467
+ }
1468
+ // A literal member name over a typed array (`"BYTES_PER_ELEMENT" in a`):
1469
+ // the answer is Node's prototype chain for the value's kind. Numeric keys
1470
+ // (elements) and Buffer-only names on a Uint8Array depend on the value and
1471
+ // keep the fence.
1472
+ if (recv.type.kind === "bytes" && key !== "-0" && String(Number(key)) !== key) {
1473
+ const has = typedArrayHasMember(key, recv.type.elem === "u8");
1474
+ if (has !== null) {
1475
+ const answer = { kind: "boolLit", value: has, type: BOOL, loc };
1476
+ return isSafeToDiscard(recv)
1477
+ ? answer
1478
+ : {
1479
+ kind: "seqExpr",
1480
+ stmts: [{ kind: "exprStmt", expr: recv, loc }],
1481
+ result: answer,
1482
+ type: BOOL,
1483
+ loc,
1484
+ };
1485
+ }
1486
+ }
1487
+ if (recv.type.kind !== "record") {
1488
+ lowerer.unsupported("SC1090", expr, `'in' on '${lowerer.fmt(recv.type)}' receivers (only process.env, Error instances, record-typed values, and unions of fixed record shapes answer; ${NARROW_FIRST})`);
1489
+ }
1490
+ const shape = lowerer.shapes.get(recv.type.shapeId);
1491
+ if (!shape)
1492
+ throw new InternalCompilerError(`lowerer bug: unknown shape ${recv.type.shapeId}`);
1493
+ const field = shape.fields.find((f) => f.name === key);
1494
+ if (field) {
1495
+ if (!OBJECT_PROTOTYPE_KEYS.has(key) &&
1496
+ field.type.kind === "union" &&
1497
+ lowerer.armTag(field.type.unionId, UNDEFINED_T) >= 0) {
1498
+ // Optional slot: the key is present unless the field is absent
1499
+ // (omitted or deleted); an explicit undefined is present.
1500
+ return lowerer.recordFieldPresent(recv, recv.type.shapeId, key, loc);
1501
+ }
1502
+ // A declared non-optional field always exists on every value of the
1503
+ // shape — statically true, but folding may only drop a
1504
+ // side-effect-free receiver read.
1505
+ if (recv.kind === "varRef" ||
1506
+ recv.kind === "recordGet" ||
1507
+ recv.kind === "fieldGet" ||
1508
+ pureRecvNode) {
1509
+ return { kind: "boolLit", value: true, type: BOOL, loc };
1510
+ }
1511
+ lowerer.unsupported("SC1090", expr, "statically-decided 'in' on computed receivers (bind the value to a variable first)");
1512
+ }
1513
+ // Accessor properties answer `in` as own members (Node: true, getter
1514
+ // NOT invoked) — statically true under the same purity discipline as
1515
+ // declared non-optional fields.
1516
+ if (shape.fields.some((f) => f.name === `%get:${key}` || f.name === `%set:${key}`)) {
1517
+ if (recv.kind === "varRef" ||
1518
+ recv.kind === "recordGet" ||
1519
+ recv.kind === "fieldGet" ||
1520
+ pureRecvNode) {
1521
+ return { kind: "boolLit", value: true, type: BOOL, loc };
1522
+ }
1523
+ lowerer.unsupported("SC1090", expr, "statically-decided 'in' on computed receivers (bind the value to a variable first)");
1524
+ }
1525
+ // Records are ordinary objects: Object.prototype's members are in them.
1526
+ const inherited = OBJECT_PROTOTYPE_KEYS.has(key);
1527
+ if (shape.indexValue && !inherited) {
1528
+ lowerer.unsupported("SC1090", expr, "'in' over index-signature keys (read the key and test '!== undefined' instead)");
1529
+ }
1530
+ if (recv.kind === "varRef" ||
1531
+ recv.kind === "recordGet" ||
1532
+ recv.kind === "fieldGet" ||
1533
+ pureRecvNode) {
1534
+ // A null-prototype record (Object.groupBy) has no inherited names.
1535
+ const nullProtoT = inherited ? nullProtoRecordShape(lowerer, recv.type) : null;
1536
+ if (nullProtoT) {
1537
+ return {
1538
+ kind: "unary",
1539
+ op: "!",
1540
+ operand: recordNullProtoTest(recv, nullProtoT.shapeId, loc),
1541
+ type: BOOL,
1542
+ loc,
1543
+ };
1544
+ }
1545
+ return { kind: "boolLit", value: inherited, type: BOOL, loc };
1546
+ }
1547
+ lowerer.unsupported("SC1090", expr, "statically-decided 'in' on computed receivers (bind the value to a variable first)");
1548
+ }
1549
+ /** `"k" in u` over a union of fixed record shapes where some arm declares
1550
+ * `k` as an optional slot. Arms without the name answer false and arms
1551
+ * with an always-present member answer true, both by tag; an optional
1552
+ * slot answers its payload's own-property presence (an explicit
1553
+ * undefined is present, an omitted or deleted property is not), read
1554
+ * through the checked arm extraction the tag test has just proven. The
1555
+ * receiver evaluates once: a non-repeatable one is stabilized in a
1556
+ * hidden local first. */
1557
+ function perValueUnionIn(lowerer, recv, unionId, key, answers, loc) {
1558
+ const recvType = recv.type;
1559
+ const stable = isSafeToRepeat(recv) ? null : lowerer.declareHiddenLocal("%inRecv", recvType);
1560
+ const ref = () => (stable ? varRef(stable.id, recvType, loc) : recv);
1561
+ const isTag = (tag) => ({
1562
+ kind: "unionIsTag",
1563
+ unionId,
1564
+ tag,
1565
+ negated: false,
1566
+ value: ref(),
1567
+ type: BOOL,
1568
+ loc,
1569
+ });
1570
+ let out = null;
1571
+ for (const a of answers) {
1572
+ if (a.has === false)
1573
+ continue;
1574
+ let test = isTag(a.tag);
1575
+ if (a.has === "slot" && a.arm.kind === "record") {
1576
+ test = {
1577
+ kind: "logical",
1578
+ op: "&&",
1579
+ left: test,
1580
+ right: {
1581
+ kind: "recordHas",
1582
+ obj: {
1583
+ kind: "unionNarrow",
1584
+ unionId,
1585
+ tag: a.tag,
1586
+ value: ref(),
1587
+ type: a.arm,
1588
+ loc,
1589
+ },
1590
+ shapeId: a.arm.shapeId,
1591
+ field: key,
1592
+ type: BOOL,
1593
+ loc,
1594
+ },
1595
+ type: BOOL,
1596
+ loc,
1597
+ };
1598
+ }
1599
+ out = out ? { kind: "logical", op: "||", left: out, right: test, type: BOOL, loc } : test;
1600
+ }
1601
+ const result = out ?? { kind: "boolLit", value: false, type: BOOL, loc };
1602
+ if (!stable)
1603
+ return result;
1604
+ return {
1605
+ kind: "seqExpr",
1606
+ stmts: [{ kind: "varDecl", localId: stable.id, init: recv, loc }],
1607
+ result,
1608
+ type: BOOL,
1609
+ loc,
1610
+ };
1611
+ }
1612
+ /** The runtime-key `in` (see lowerInExpression): `k in r` where k is a
1613
+ * runtime string and r an index-signature record — an interned
1614
+ * `%rec.haskey.<n>(k, r)` walks the declared names (a string-equality
1615
+ * chain: non-optional fields and accessor slots answer true, optional
1616
+ * slots answer their per-value tag test) and then probes the overflow
1617
+ * map's hashed key set. Null when the pair is outside that shape (the
1618
+ * caller keeps its fence). */
1619
+ function lowerRuntimeKeyIn(lowerer, expr, loc) {
1620
+ if (lowerer.mapTypeOf(lowerer.typeOf(expr.left))?.kind !== "string")
1621
+ return null;
1622
+ const recvT = lowerer.mapTypeOf(lowerer.typeOf(expr.right));
1623
+ if (recvT?.kind !== "record")
1624
+ return null;
1625
+ const shape = lowerer.shapes.get(recvT.shapeId);
1626
+ if (!shape?.indexValue || shape.tuple)
1627
+ return null;
1628
+ const keyIr = lowerer.lowerExprExpecting(expr.left, STRING);
1629
+ const recv = lowerer.lowerExprExpecting(expr.right, recvT);
1630
+ const hkey = `haskey:${recvT.shapeId}`;
1631
+ let helper = lowerer.valueHelpers.get(hkey);
1632
+ if (!helper) {
1633
+ helper = `%rec.haskey.${lowerer.valueHelpers.size}`;
1634
+ lowerer.valueHelpers.set(hkey, helper);
1635
+ const recT = { kind: "record", shapeId: recvT.shapeId };
1636
+ const k = varRef("k.0", STRING, loc);
1637
+ const r = varRef("r.0", recT, loc);
1638
+ const body = [];
1639
+ const ret = (value) => ({ kind: "return", value, loc });
1640
+ for (const f of shape.fields) {
1641
+ const accessor = f.name.startsWith("%get:") || f.name.startsWith("%set:");
1642
+ if (f.name.startsWith("%") && !accessor)
1643
+ continue;
1644
+ const name = accessor ? f.name.slice(5) : f.name;
1645
+ const eq = {
1646
+ kind: "strEq",
1647
+ negated: false,
1648
+ left: k,
1649
+ right: { kind: "strLit", value: name, type: STRING, loc },
1650
+ type: BOOL,
1651
+ loc,
1652
+ };
1653
+ const answer = accessor
1654
+ ? { kind: "boolLit", value: true, type: BOOL, loc }
1655
+ : lowerer.recordFieldPresent(r, recvT.shapeId, f.name, loc);
1656
+ body.push({ kind: "if", cond: eq, then: [ret(answer)], else_: null, loc });
1657
+ }
1658
+ // Overflow keys answer through the map's hashed presence probe (a
1659
+ // stored undefined value is still present), not a scan over a fresh
1660
+ // key snapshot, which made `k in dict` loops quadratic.
1661
+ const ovfHas = {
1662
+ kind: "recordOvfHas",
1663
+ obj: r,
1664
+ shapeId: recvT.shapeId,
1665
+ key: k,
1666
+ type: BOOL,
1667
+ loc,
1668
+ };
1669
+ // A miss in the record's own keys still finds Object.prototype's,
1670
+ // unless the record has a null prototype (Object.groupBy).
1671
+ let protoName = null;
1672
+ for (const name of OBJECT_PROTOTYPE_KEYS) {
1673
+ if (shape.fields.some((f) => f.name === name))
1674
+ continue;
1675
+ const eq = {
1676
+ kind: "strEq",
1677
+ negated: false,
1678
+ left: k,
1679
+ right: { kind: "strLit", value: name, type: STRING, loc },
1680
+ type: BOOL,
1681
+ loc,
1682
+ };
1683
+ protoName =
1684
+ protoName === null
1685
+ ? eq
1686
+ : { kind: "logical", op: "||", left: protoName, right: eq, type: BOOL, loc };
1687
+ }
1688
+ if (protoName !== null && nullProtoRecordShape(lowerer, recT)) {
1689
+ protoName = {
1690
+ kind: "logical",
1691
+ op: "&&",
1692
+ left: protoName,
1693
+ right: {
1694
+ kind: "unary",
1695
+ op: "!",
1696
+ operand: recordNullProtoTest(r, recvT.shapeId, loc),
1697
+ type: BOOL,
1698
+ loc,
1699
+ },
1700
+ type: BOOL,
1701
+ loc,
1702
+ };
1703
+ }
1704
+ body.push(ret(protoName === null
1705
+ ? ovfHas
1706
+ : { kind: "logical", op: "||", left: ovfHas, right: protoName, type: BOOL, loc }));
1707
+ lowerer.liftedFns.push({
1708
+ name: helper,
1709
+ params: [
1710
+ { localId: "k.0", name: "k", type: STRING },
1711
+ { localId: "r.0", name: "r", type: recT },
1712
+ ],
1713
+ returnType: BOOL,
1714
+ locals: [
1715
+ { id: "k.0", name: "k", type: STRING, mutable: true },
1716
+ { id: "r.0", name: "r", type: recT, mutable: true },
1717
+ ],
1718
+ body,
1719
+ loc,
1720
+ });
1721
+ }
1722
+ return { kind: "call", callee: helper, args: [keyIr, recv], type: BOOL, loc };
1723
+ }
1724
+ //# sourceMappingURL=relational.js.map