@geastack/compiler 1.0.15

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 (966) hide show
  1. package/LICENSE +202 -0
  2. package/README.md +149 -0
  3. package/dist/cli-analyze.d.ts +1 -0
  4. package/dist/cli-analyze.js +61 -0
  5. package/dist/cli-coverage.d.ts +1 -0
  6. package/dist/cli-coverage.js +329 -0
  7. package/dist/cli-emit.d.ts +10 -0
  8. package/dist/cli-emit.js +398 -0
  9. package/dist/cli-module-graph.d.ts +18 -0
  10. package/dist/cli-module-graph.js +123 -0
  11. package/dist/cli-package-source.d.ts +5 -0
  12. package/dist/cli-package-source.js +116 -0
  13. package/dist/cli-project.d.ts +2 -0
  14. package/dist/cli-project.js +60 -0
  15. package/dist/cli.d.ts +2 -0
  16. package/dist/cli.js +199 -0
  17. package/dist/compiler.d.ts +228 -0
  18. package/dist/compiler.js +1029 -0
  19. package/dist/conversion/algebra.d.ts +218 -0
  20. package/dist/conversion/algebra.js +155 -0
  21. package/dist/conversion/build.d.ts +67 -0
  22. package/dist/conversion/build.js +1378 -0
  23. package/dist/conversion/derive.d.ts +37 -0
  24. package/dist/conversion/derive.js +260 -0
  25. package/dist/conversion/graph-validation.d.ts +8 -0
  26. package/dist/conversion/graph-validation.js +97 -0
  27. package/dist/conversion/native-callable-adapter.d.ts +13 -0
  28. package/dist/conversion/native-callable-adapter.js +53 -0
  29. package/dist/conversion/native-class-reference.d.ts +12 -0
  30. package/dist/conversion/native-class-reference.js +39 -0
  31. package/dist/conversion/native-payload-transport.d.ts +25 -0
  32. package/dist/conversion/native-payload-transport.js +33 -0
  33. package/dist/conversion/native-selection.d.ts +49 -0
  34. package/dist/conversion/native-selection.js +135 -0
  35. package/dist/conversion/native-sum.d.ts +42 -0
  36. package/dist/conversion/native-sum.js +115 -0
  37. package/dist/conversion/nodes.d.ts +55 -0
  38. package/dist/conversion/nodes.js +91 -0
  39. package/dist/conversion/operand-view.d.ts +14 -0
  40. package/dist/conversion/operand-view.js +20 -0
  41. package/dist/conversion/record-view.d.ts +157 -0
  42. package/dist/conversion/record-view.js +273 -0
  43. package/dist/conversion/registry.d.ts +217 -0
  44. package/dist/conversion/registry.js +1 -0
  45. package/dist/diagnostics/model.d.ts +76 -0
  46. package/dist/diagnostics/model.js +60 -0
  47. package/dist/diagnostics/sweep.d.ts +31 -0
  48. package/dist/diagnostics/sweep.js +112 -0
  49. package/dist/identity/ids.d.ts +179 -0
  50. package/dist/identity/ids.js +212 -0
  51. package/dist/ir/absent-class-arm.d.ts +48 -0
  52. package/dist/ir/absent-class-arm.js +157 -0
  53. package/dist/ir/borrow-effects.d.ts +23 -0
  54. package/dist/ir/borrow-effects.js +151 -0
  55. package/dist/ir/borrowed-call-arguments.d.ts +40 -0
  56. package/dist/ir/borrowed-call-arguments.js +117 -0
  57. package/dist/ir/build.d.ts +168 -0
  58. package/dist/ir/build.js +459 -0
  59. package/dist/ir/call-dispatch.d.ts +38 -0
  60. package/dist/ir/call-dispatch.js +502 -0
  61. package/dist/ir/call-entry.d.ts +142 -0
  62. package/dist/ir/call-entry.js +386 -0
  63. package/dist/ir/callable-class-flow.d.ts +27 -0
  64. package/dist/ir/callable-class-flow.js +1386 -0
  65. package/dist/ir/callable-field-slots.d.ts +22 -0
  66. package/dist/ir/callable-field-slots.js +166 -0
  67. package/dist/ir/callable-identity-demand.d.ts +52 -0
  68. package/dist/ir/callable-identity-demand.js +460 -0
  69. package/dist/ir/callable-member-candidates.d.ts +9 -0
  70. package/dist/ir/callable-member-candidates.js +39 -0
  71. package/dist/ir/callable-records.d.ts +21 -0
  72. package/dist/ir/callable-records.js +411 -0
  73. package/dist/ir/captures.d.ts +26 -0
  74. package/dist/ir/captures.js +335 -0
  75. package/dist/ir/certificate.d.ts +45 -0
  76. package/dist/ir/certificate.js +47 -0
  77. package/dist/ir/certify/carrier-keys.d.ts +73 -0
  78. package/dist/ir/certify/carrier-keys.js +221 -0
  79. package/dist/ir/certify/function-source.d.ts +4 -0
  80. package/dist/ir/certify/function-source.js +28 -0
  81. package/dist/ir/certify/has-property-key.d.ts +88 -0
  82. package/dist/ir/certify/has-property-key.js +116 -0
  83. package/dist/ir/certify/instanceof-key.d.ts +24 -0
  84. package/dist/ir/certify/instanceof-key.js +35 -0
  85. package/dist/ir/certify/property-access-keys.d.ts +172 -0
  86. package/dist/ir/certify/property-access-keys.js +291 -0
  87. package/dist/ir/certify/property-access.d.ts +3 -0
  88. package/dist/ir/certify/property-access.js +597 -0
  89. package/dist/ir/certify/runtime-helper.d.ts +3 -0
  90. package/dist/ir/certify/runtime-helper.js +326 -0
  91. package/dist/ir/certify/typeof-operand.d.ts +14 -0
  92. package/dist/ir/certify/typeof-operand.js +16 -0
  93. package/dist/ir/certify.d.ts +123 -0
  94. package/dist/ir/certify.js +481 -0
  95. package/dist/ir/class-evaluation.d.ts +26 -0
  96. package/dist/ir/class-evaluation.js +50 -0
  97. package/dist/ir/class-static-fields.d.ts +60 -0
  98. package/dist/ir/class-static-fields.js +108 -0
  99. package/dist/ir/construct-entry.d.ts +26 -0
  100. package/dist/ir/construct-entry.js +117 -0
  101. package/dist/ir/dead-values.d.ts +90 -0
  102. package/dist/ir/dead-values.js +184 -0
  103. package/dist/ir/deferral.d.ts +99 -0
  104. package/dist/ir/deferral.js +409 -0
  105. package/dist/ir/dense-loops.d.ts +230 -0
  106. package/dist/ir/dense-loops.js +697 -0
  107. package/dist/ir/dominance.d.ts +82 -0
  108. package/dist/ir/dominance.js +268 -0
  109. package/dist/ir/emission-representations.d.ts +71 -0
  110. package/dist/ir/emission-representations.js +350 -0
  111. package/dist/ir/facts.d.ts +218 -0
  112. package/dist/ir/facts.js +181 -0
  113. package/dist/ir/fixed-data-definition.d.ts +19 -0
  114. package/dist/ir/fixed-data-definition.js +49 -0
  115. package/dist/ir/generator-split.d.ts +38 -0
  116. package/dist/ir/generator-split.js +329 -0
  117. package/dist/ir/hoist.d.ts +55 -0
  118. package/dist/ir/hoist.js +375 -0
  119. package/dist/ir/instantiation.d.ts +61 -0
  120. package/dist/ir/instantiation.js +137 -0
  121. package/dist/ir/integer-storage.d.ts +170 -0
  122. package/dist/ir/integer-storage.js +822 -0
  123. package/dist/ir/integers.d.ts +161 -0
  124. package/dist/ir/integers.js +539 -0
  125. package/dist/ir/integrity-restrictions.d.ts +50 -0
  126. package/dist/ir/integrity-restrictions.js +118 -0
  127. package/dist/ir/local-iterators.d.ts +4 -0
  128. package/dist/ir/local-iterators.js +27 -0
  129. package/dist/ir/lower-allocation.d.ts +4 -0
  130. package/dist/ir/lower-allocation.js +325 -0
  131. package/dist/ir/lower-completion.d.ts +15 -0
  132. package/dist/ir/lower-completion.js +25 -0
  133. package/dist/ir/lower-destructuring.d.ts +5 -0
  134. package/dist/ir/lower-destructuring.js +693 -0
  135. package/dist/ir/lower-element.d.ts +29 -0
  136. package/dist/ir/lower-element.js +111 -0
  137. package/dist/ir/lower-exceptions.d.ts +47 -0
  138. package/dist/ir/lower-exceptions.js +92 -0
  139. package/dist/ir/lower-flow.d.ts +137 -0
  140. package/dist/ir/lower-flow.js +600 -0
  141. package/dist/ir/lower-graph.d.ts +218 -0
  142. package/dist/ir/lower-graph.js +687 -0
  143. package/dist/ir/lower-invocation.d.ts +4 -0
  144. package/dist/ir/lower-invocation.js +514 -0
  145. package/dist/ir/lower-narrow.d.ts +53 -0
  146. package/dist/ir/lower-narrow.js +320 -0
  147. package/dist/ir/lower-operands.d.ts +272 -0
  148. package/dist/ir/lower-operands.js +461 -0
  149. package/dist/ir/lower-property.d.ts +21 -0
  150. package/dist/ir/lower-property.js +132 -0
  151. package/dist/ir/lower-protocol.d.ts +11 -0
  152. package/dist/ir/lower-protocol.js +118 -0
  153. package/dist/ir/lower-short-circuit.d.ts +41 -0
  154. package/dist/ir/lower-short-circuit.js +63 -0
  155. package/dist/ir/lower.d.ts +82 -0
  156. package/dist/ir/lower.js +1346 -0
  157. package/dist/ir/model.d.ts +1474 -0
  158. package/dist/ir/model.js +6 -0
  159. package/dist/ir/native-absent-property.d.ts +3 -0
  160. package/dist/ir/native-absent-property.js +13 -0
  161. package/dist/ir/native-array-transport.d.ts +7 -0
  162. package/dist/ir/native-array-transport.js +46 -0
  163. package/dist/ir/native-callable-bind.d.ts +9 -0
  164. package/dist/ir/native-callable-bind.js +30 -0
  165. package/dist/ir/native-carrier-predicate.d.ts +34 -0
  166. package/dist/ir/native-carrier-predicate.js +49 -0
  167. package/dist/ir/native-class-accessor.d.ts +18 -0
  168. package/dist/ir/native-class-accessor.js +52 -0
  169. package/dist/ir/native-class-construction.d.ts +16 -0
  170. package/dist/ir/native-class-construction.js +71 -0
  171. package/dist/ir/native-class-initialization.d.ts +15 -0
  172. package/dist/ir/native-class-initialization.js +56 -0
  173. package/dist/ir/native-class-origins.d.ts +13 -0
  174. package/dist/ir/native-class-origins.js +237 -0
  175. package/dist/ir/native-dictionary-transport.d.ts +6 -0
  176. package/dist/ir/native-dictionary-transport.js +37 -0
  177. package/dist/ir/native-enumeration.d.ts +14 -0
  178. package/dist/ir/native-enumeration.js +26 -0
  179. package/dist/ir/native-equality.d.ts +10 -0
  180. package/dist/ir/native-equality.js +18 -0
  181. package/dist/ir/native-field-owner.d.ts +37 -0
  182. package/dist/ir/native-field-owner.js +183 -0
  183. package/dist/ir/native-fixed-layout.d.ts +41 -0
  184. package/dist/ir/native-fixed-layout.js +232 -0
  185. package/dist/ir/native-host-construction.d.ts +53 -0
  186. package/dist/ir/native-host-construction.js +62 -0
  187. package/dist/ir/native-key-query.d.ts +4 -0
  188. package/dist/ir/native-key-query.js +38 -0
  189. package/dist/ir/native-merge-transport.d.ts +25 -0
  190. package/dist/ir/native-merge-transport.js +71 -0
  191. package/dist/ir/native-record-index-transport.d.ts +11 -0
  192. package/dist/ir/native-record-index-transport.js +34 -0
  193. package/dist/ir/native-record-index.d.ts +12 -0
  194. package/dist/ir/native-record-index.js +27 -0
  195. package/dist/ir/native-reflect-field.d.ts +5 -0
  196. package/dist/ir/native-reflect-field.js +33 -0
  197. package/dist/ir/native-sequence-transport.d.ts +7 -0
  198. package/dist/ir/native-sequence-transport.js +53 -0
  199. package/dist/ir/numeric-intrinsics.d.ts +13 -0
  200. package/dist/ir/numeric-intrinsics.js +57 -0
  201. package/dist/ir/object-value-conversions.d.ts +20 -0
  202. package/dist/ir/object-value-conversions.js +50 -0
  203. package/dist/ir/physical-class-reflection.d.ts +9 -0
  204. package/dist/ir/physical-class-reflection.js +57 -0
  205. package/dist/ir/presence-proof.d.ts +42 -0
  206. package/dist/ir/presence-proof.js +490 -0
  207. package/dist/ir/program-facts.d.ts +106 -0
  208. package/dist/ir/program-facts.js +319 -0
  209. package/dist/ir/proven-branches.d.ts +16 -0
  210. package/dist/ir/proven-branches.js +219 -0
  211. package/dist/ir/queries.d.ts +41 -0
  212. package/dist/ir/queries.js +213 -0
  213. package/dist/ir/reflection-demand.d.ts +64 -0
  214. package/dist/ir/reflection-demand.js +1394 -0
  215. package/dist/ir/refusal.d.ts +43 -0
  216. package/dist/ir/refusal.js +28 -0
  217. package/dist/ir/shake.d.ts +37 -0
  218. package/dist/ir/shake.js +1078 -0
  219. package/dist/ir/static-callables.d.ts +11 -0
  220. package/dist/ir/static-callables.js +163 -0
  221. package/dist/ir/string-layout-reuse.d.ts +13 -0
  222. package/dist/ir/string-layout-reuse.js +39 -0
  223. package/dist/ir/string-length-reuse.d.ts +8 -0
  224. package/dist/ir/string-length-reuse.js +47 -0
  225. package/dist/ir/transfer.d.ts +78 -0
  226. package/dist/ir/transfer.js +270 -0
  227. package/dist/ir/type-query-results.d.ts +25 -0
  228. package/dist/ir/type-query-results.js +96 -0
  229. package/dist/ir/typed-property-access.d.ts +100 -0
  230. package/dist/ir/typed-property-access.js +161 -0
  231. package/dist/ir/verify.d.ts +19 -0
  232. package/dist/ir/verify.js +355 -0
  233. package/dist/plugins/apple/constructors.d.ts +112 -0
  234. package/dist/plugins/apple/constructors.js +217 -0
  235. package/dist/plugins/apple/host.d.ts +181 -0
  236. package/dist/plugins/apple/host.js +262 -0
  237. package/dist/plugins/apple/jsx.d.ts +2 -0
  238. package/dist/plugins/apple/jsx.js +293 -0
  239. package/dist/plugins/apple/members.d.ts +16 -0
  240. package/dist/plugins/apple/members.js +190 -0
  241. package/dist/plugins/apple/plugin.d.ts +2 -0
  242. package/dist/plugins/apple/plugin.js +156 -0
  243. package/dist/plugins/gea/component-classes.d.ts +25 -0
  244. package/dist/plugins/gea/component-classes.js +162 -0
  245. package/dist/plugins/gea/component-inline.d.ts +13 -0
  246. package/dist/plugins/gea/component-inline.js +532 -0
  247. package/dist/plugins/gea/constructors.d.ts +23 -0
  248. package/dist/plugins/gea/constructors.js +100 -0
  249. package/dist/plugins/gea/contract.d.ts +150 -0
  250. package/dist/plugins/gea/contract.js +195 -0
  251. package/dist/plugins/gea/element-ref.d.ts +31 -0
  252. package/dist/plugins/gea/element-ref.js +45 -0
  253. package/dist/plugins/gea/host.d.ts +520 -0
  254. package/dist/plugins/gea/host.js +762 -0
  255. package/dist/plugins/gea/lower.d.ts +6 -0
  256. package/dist/plugins/gea/lower.js +195 -0
  257. package/dist/plugins/gea/members.d.ts +22 -0
  258. package/dist/plugins/gea/members.js +221 -0
  259. package/dist/plugins/gea/plugin.d.ts +22 -0
  260. package/dist/plugins/gea/plugin.js +307 -0
  261. package/dist/plugins/gea/prelude.d.ts +78 -0
  262. package/dist/plugins/gea/prelude.js +153 -0
  263. package/dist/plugins/gea/producer.d.ts +5 -0
  264. package/dist/plugins/gea/producer.js +52 -0
  265. package/dist/plugins/gea/reactive-slots.d.ts +49 -0
  266. package/dist/plugins/gea/reactive-slots.js +578 -0
  267. package/dist/plugins/gea/render-bridge.d.ts +6 -0
  268. package/dist/plugins/gea/render-bridge.js +281 -0
  269. package/dist/plugins/gea/slots.d.ts +15 -0
  270. package/dist/plugins/gea/slots.js +36 -0
  271. package/dist/plugins/gea/template-analysis.d.ts +151 -0
  272. package/dist/plugins/gea/template-analysis.js +346 -0
  273. package/dist/plugins/gea/user-agent-styles.d.ts +9 -0
  274. package/dist/plugins/gea/user-agent-styles.js +94 -0
  275. package/dist/plugins/installed.d.ts +19 -0
  276. package/dist/plugins/installed.js +21 -0
  277. package/dist/plugins/load.d.ts +7 -0
  278. package/dist/plugins/load.js +207 -0
  279. package/dist/plugins/model.d.ts +735 -0
  280. package/dist/plugins/model.js +47 -0
  281. package/dist/plugins/webgl/host.d.ts +77 -0
  282. package/dist/plugins/webgl/host.js +162 -0
  283. package/dist/plugins/webgl/plugin.d.ts +40 -0
  284. package/dist/plugins/webgl/plugin.js +99 -0
  285. package/dist/preflight/obligations.d.ts +206 -0
  286. package/dist/preflight/obligations.js +36 -0
  287. package/dist/preflight/report.d.ts +20 -0
  288. package/dist/preflight/report.js +61 -0
  289. package/dist/preflight/run.d.ts +39 -0
  290. package/dist/preflight/run.js +403 -0
  291. package/dist/project-preparation.d.ts +33 -0
  292. package/dist/project-preparation.js +314 -0
  293. package/dist/projection/abi.d.ts +82 -0
  294. package/dist/projection/abi.js +349 -0
  295. package/dist/projection/apply-arguments.d.ts +12 -0
  296. package/dist/projection/apply-arguments.js +20 -0
  297. package/dist/projection/bindings.d.ts +250 -0
  298. package/dist/projection/bindings.js +340 -0
  299. package/dist/projection/callee.d.ts +196 -0
  300. package/dist/projection/callee.js +444 -0
  301. package/dist/projection/class-property-presence.d.ts +28 -0
  302. package/dist/projection/class-property-presence.js +58 -0
  303. package/dist/projection/class-prototype.d.ts +5 -0
  304. package/dist/projection/class-prototype.js +23 -0
  305. package/dist/projection/class-storage.d.ts +26 -0
  306. package/dist/projection/class-storage.js +236 -0
  307. package/dist/projection/classes.d.ts +283 -0
  308. package/dist/projection/classes.js +944 -0
  309. package/dist/projection/coercions.d.ts +20 -0
  310. package/dist/projection/coercions.js +33 -0
  311. package/dist/projection/dispatch.d.ts +167 -0
  312. package/dist/projection/dispatch.js +379 -0
  313. package/dist/projection/fields.d.ts +123 -0
  314. package/dist/projection/fields.js +383 -0
  315. package/dist/projection/instance-test.d.ts +78 -0
  316. package/dist/projection/instance-test.js +156 -0
  317. package/dist/projection/slots.d.ts +146 -0
  318. package/dist/projection/slots.js +663 -0
  319. package/dist/projection/synthesized-abi.d.ts +61 -0
  320. package/dist/projection/synthesized-abi.js +94 -0
  321. package/dist/representation/array-index.d.ts +14 -0
  322. package/dist/representation/array-index.js +17 -0
  323. package/dist/representation/callable-object.d.ts +3 -0
  324. package/dist/representation/callable-object.js +6 -0
  325. package/dist/representation/collections.d.ts +84 -0
  326. package/dist/representation/collections.js +139 -0
  327. package/dist/representation/derive.d.ts +159 -0
  328. package/dist/representation/derive.js +2546 -0
  329. package/dist/representation/difference.d.ts +30 -0
  330. package/dist/representation/difference.js +240 -0
  331. package/dist/representation/field-descriptor-policy.d.ts +19 -0
  332. package/dist/representation/field-descriptor-policy.js +39 -0
  333. package/dist/representation/function-constructor.d.ts +13 -0
  334. package/dist/representation/function-constructor.js +9 -0
  335. package/dist/representation/host-abi.d.ts +32 -0
  336. package/dist/representation/host-abi.js +97 -0
  337. package/dist/representation/host-templates.d.ts +67 -0
  338. package/dist/representation/host-templates.js +94 -0
  339. package/dist/representation/intersection.d.ts +84 -0
  340. package/dist/representation/intersection.js +149 -0
  341. package/dist/representation/literal-destination.d.ts +43 -0
  342. package/dist/representation/literal-destination.js +133 -0
  343. package/dist/representation/merge.d.ts +18 -0
  344. package/dist/representation/merge.js +83 -0
  345. package/dist/representation/model.d.ts +1160 -0
  346. package/dist/representation/model.js +1019 -0
  347. package/dist/representation/numeric-index.d.ts +13 -0
  348. package/dist/representation/numeric-index.js +29 -0
  349. package/dist/representation/object-shape.d.ts +109 -0
  350. package/dist/representation/object-shape.js +123 -0
  351. package/dist/representation/optional.d.ts +12 -0
  352. package/dist/representation/optional.js +87 -0
  353. package/dist/representation/plan.d.ts +60 -0
  354. package/dist/representation/plan.js +78 -0
  355. package/dist/representation/policies.d.ts +589 -0
  356. package/dist/representation/policies.js +107 -0
  357. package/dist/representation/primitive-domain.d.ts +1 -0
  358. package/dist/representation/primitive-domain.js +1 -0
  359. package/dist/representation/primitives.d.ts +44 -0
  360. package/dist/representation/primitives.js +78 -0
  361. package/dist/representation/publish.d.ts +49 -0
  362. package/dist/representation/publish.js +648 -0
  363. package/dist/representation/record-fields.d.ts +96 -0
  364. package/dist/representation/record-fields.js +116 -0
  365. package/dist/representation/template-object.d.ts +11 -0
  366. package/dist/representation/template-object.js +26 -0
  367. package/dist/representation/union.d.ts +30 -0
  368. package/dist/representation/union.js +324 -0
  369. package/dist/representation/value-records.d.ts +3 -0
  370. package/dist/representation/value-records.js +307 -0
  371. package/dist/representation/verify.d.ts +17 -0
  372. package/dist/representation/verify.js +221 -0
  373. package/dist/semantics/alias-this-field-declaration-transform.d.ts +4 -0
  374. package/dist/semantics/alias-this-field-declaration-transform.js +207 -0
  375. package/dist/semantics/ambient-type-realization-transform.d.ts +62 -0
  376. package/dist/semantics/ambient-type-realization-transform.js +168 -0
  377. package/dist/semantics/ambient.d.ts +24 -0
  378. package/dist/semantics/ambient.js +119 -0
  379. package/dist/semantics/borrowed-builtin-call-bind-source-transform.d.ts +4 -0
  380. package/dist/semantics/borrowed-builtin-call-bind-source-transform.js +341 -0
  381. package/dist/semantics/callable-origins.d.ts +46 -0
  382. package/dist/semantics/callable-origins.js +354 -0
  383. package/dist/semantics/class-alias.d.ts +7 -0
  384. package/dist/semantics/class-alias.js +37 -0
  385. package/dist/semantics/class-heritage.d.ts +34 -0
  386. package/dist/semantics/class-heritage.js +104 -0
  387. package/dist/semantics/commonjs-wrapper.d.ts +69 -0
  388. package/dist/semantics/commonjs-wrapper.js +231 -0
  389. package/dist/semantics/constructor-slot-subclasses.d.ts +28 -0
  390. package/dist/semantics/constructor-slot-subclasses.js +112 -0
  391. package/dist/semantics/declaration-overlay-transform.d.ts +35 -0
  392. package/dist/semantics/declaration-overlay-transform.js +2157 -0
  393. package/dist/semantics/define-property-source-transform.d.ts +4 -0
  394. package/dist/semantics/define-property-source-transform.js +437 -0
  395. package/dist/semantics/diagnostic-source-preparation.d.ts +24 -0
  396. package/dist/semantics/diagnostic-source-preparation.js +82 -0
  397. package/dist/semantics/documentation-ranges.d.ts +22 -0
  398. package/dist/semantics/documentation-ranges.js +36 -0
  399. package/dist/semantics/dynamic-fallback.d.ts +86 -0
  400. package/dist/semantics/dynamic-fallback.js +249 -0
  401. package/dist/semantics/frontend-timing.d.ts +6 -0
  402. package/dist/semantics/frontend-timing.js +35 -0
  403. package/dist/semantics/frontend.d.ts +504 -0
  404. package/dist/semantics/frontend.js +1157 -0
  405. package/dist/semantics/host-declaration-provenance.d.ts +11 -0
  406. package/dist/semantics/host-declaration-provenance.js +18 -0
  407. package/dist/semantics/host-methods.d.ts +24 -0
  408. package/dist/semantics/host-methods.js +74 -0
  409. package/dist/semantics/host-protocols.d.ts +429 -0
  410. package/dist/semantics/host-protocols.js +1501 -0
  411. package/dist/semantics/inherited-accessor.d.ts +7 -0
  412. package/dist/semantics/inherited-accessor.js +48 -0
  413. package/dist/semantics/interface-families.d.ts +70 -0
  414. package/dist/semantics/interface-families.js +180 -0
  415. package/dist/semantics/interface-implementors.d.ts +53 -0
  416. package/dist/semantics/interface-implementors.js +87 -0
  417. package/dist/semantics/jsdoc-namepath-transform.d.ts +4 -0
  418. package/dist/semantics/jsdoc-namepath-transform.js +85 -0
  419. package/dist/semantics/model/coverage.d.ts +68 -0
  420. package/dist/semantics/model/coverage.js +73 -0
  421. package/dist/semantics/model/edges.d.ts +103 -0
  422. package/dist/semantics/model/edges.js +20 -0
  423. package/dist/semantics/model/graph.d.ts +55 -0
  424. package/dist/semantics/model/graph.js +129 -0
  425. package/dist/semantics/model/operands.d.ts +159 -0
  426. package/dist/semantics/model/operands.js +26 -0
  427. package/dist/semantics/model/operations.d.ts +496 -0
  428. package/dist/semantics/model/operations.js +2 -0
  429. package/dist/semantics/model/primitive-domain.d.ts +26 -0
  430. package/dist/semantics/model/primitive-domain.js +38 -0
  431. package/dist/semantics/model/selected-signature.d.ts +261 -0
  432. package/dist/semantics/model/selected-signature.js +55 -0
  433. package/dist/semantics/model/structural-type-table.d.ts +93 -0
  434. package/dist/semantics/model/structural-type-table.js +237 -0
  435. package/dist/semantics/model/structural-types.d.ts +367 -0
  436. package/dist/semantics/model/structural-types.js +200 -0
  437. package/dist/semantics/module-resolution.d.ts +23 -0
  438. package/dist/semantics/module-resolution.js +227 -0
  439. package/dist/semantics/new-callee-class-tag-source-transform.d.ts +4 -0
  440. package/dist/semantics/new-callee-class-tag-source-transform.js +64 -0
  441. package/dist/semantics/node-project.d.ts +13 -0
  442. package/dist/semantics/node-project.js +107 -0
  443. package/dist/semantics/node-source-hooks.d.ts +1 -0
  444. package/dist/semantics/node-source-hooks.js +63 -0
  445. package/dist/semantics/normalize/absent-globals.d.ts +143 -0
  446. package/dist/semantics/normalize/absent-globals.js +191 -0
  447. package/dist/semantics/normalize/arguments-objects.d.ts +43 -0
  448. package/dist/semantics/normalize/arguments-objects.js +60 -0
  449. package/dist/semantics/normalize/asserted-arm-absence.d.ts +28 -0
  450. package/dist/semantics/normalize/asserted-arm-absence.js +61 -0
  451. package/dist/semantics/normalize/assignment-patterns.d.ts +70 -0
  452. package/dist/semantics/normalize/assignment-patterns.js +147 -0
  453. package/dist/semantics/normalize/bag-absence.d.ts +8 -0
  454. package/dist/semantics/normalize/bag-absence.js +42 -0
  455. package/dist/semantics/normalize/binding-fixpoint.d.ts +36 -0
  456. package/dist/semantics/normalize/binding-fixpoint.js +140 -0
  457. package/dist/semantics/normalize/callback-parameter-contracts.d.ts +16 -0
  458. package/dist/semantics/normalize/callback-parameter-contracts.js +91 -0
  459. package/dist/semantics/normalize/cells/agreement.d.ts +46 -0
  460. package/dist/semantics/normalize/cells/agreement.js +34 -0
  461. package/dist/semantics/normalize/cells/candidates.d.ts +17 -0
  462. package/dist/semantics/normalize/cells/candidates.js +35 -0
  463. package/dist/semantics/normalize/cells/facts.d.ts +19 -0
  464. package/dist/semantics/normalize/cells/facts.js +90 -0
  465. package/dist/semantics/normalize/cells/index.d.ts +10 -0
  466. package/dist/semantics/normalize/cells/index.js +6 -0
  467. package/dist/semantics/normalize/cells/model.d.ts +98 -0
  468. package/dist/semantics/normalize/cells/model.js +2 -0
  469. package/dist/semantics/normalize/cells/policies/bag.d.ts +44 -0
  470. package/dist/semantics/normalize/cells/policies/bag.js +114 -0
  471. package/dist/semantics/normalize/cells/policies/collection.d.ts +42 -0
  472. package/dist/semantics/normalize/cells/policies/collection.js +218 -0
  473. package/dist/semantics/normalize/cells/policies/field.d.ts +28 -0
  474. package/dist/semantics/normalize/cells/policies/field.js +40 -0
  475. package/dist/semantics/normalize/cells/policies/index.d.ts +49 -0
  476. package/dist/semantics/normalize/cells/policies/index.js +58 -0
  477. package/dist/semantics/normalize/cells/policies/local.d.ts +18 -0
  478. package/dist/semantics/normalize/cells/policies/local.js +37 -0
  479. package/dist/semantics/normalize/cells/policies/parameter.d.ts +28 -0
  480. package/dist/semantics/normalize/cells/policies/parameter.js +39 -0
  481. package/dist/semantics/normalize/cells/policies/return.d.ts +26 -0
  482. package/dist/semantics/normalize/cells/policies/return.js +45 -0
  483. package/dist/semantics/normalize/cells/policies/shared.d.ts +33 -0
  484. package/dist/semantics/normalize/cells/policies/shared.js +45 -0
  485. package/dist/semantics/normalize/cells/policy.d.ts +72 -0
  486. package/dist/semantics/normalize/cells/policy.js +18 -0
  487. package/dist/semantics/normalize/cells/registry.d.ts +14 -0
  488. package/dist/semantics/normalize/cells/registry.js +17 -0
  489. package/dist/semantics/normalize/census-refusal.d.ts +62 -0
  490. package/dist/semantics/normalize/census-refusal.js +27 -0
  491. package/dist/semantics/normalize/census.d.ts +109 -0
  492. package/dist/semantics/normalize/census.js +667 -0
  493. package/dist/semantics/normalize/collection-bindings.d.ts +278 -0
  494. package/dist/semantics/normalize/collection-bindings.js +677 -0
  495. package/dist/semantics/normalize/commonjs-module-record.d.ts +21 -0
  496. package/dist/semantics/normalize/commonjs-module-record.js +289 -0
  497. package/dist/semantics/normalize/commonjs-require.d.ts +13 -0
  498. package/dist/semantics/normalize/commonjs-require.js +1527 -0
  499. package/dist/semantics/normalize/contribution.d.ts +63 -0
  500. package/dist/semantics/normalize/contribution.js +172 -0
  501. package/dist/semantics/normalize/dead-typeof-guards.d.ts +64 -0
  502. package/dist/semantics/normalize/dead-typeof-guards.js +152 -0
  503. package/dist/semantics/normalize/deferred-intrinsic-protocols.d.ts +57 -0
  504. package/dist/semantics/normalize/deferred-intrinsic-protocols.js +109 -0
  505. package/dist/semantics/normalize/derived-expression-type.d.ts +1070 -0
  506. package/dist/semantics/normalize/derived-expression-type.js +3463 -0
  507. package/dist/semantics/normalize/evaluation-order.d.ts +16 -0
  508. package/dist/semantics/normalize/evaluation-order.js +37 -0
  509. package/dist/semantics/normalize/field-bindings.d.ts +167 -0
  510. package/dist/semantics/normalize/field-bindings.js +1125 -0
  511. package/dist/semantics/normalize/flow/array-element-continuation.d.ts +27 -0
  512. package/dist/semantics/normalize/flow/array-element-continuation.js +1452 -0
  513. package/dist/semantics/normalize/flow/callable-array-origins.d.ts +42 -0
  514. package/dist/semantics/normalize/flow/callable-array-origins.js +318 -0
  515. package/dist/semantics/normalize/flow/callable-completions.d.ts +45 -0
  516. package/dist/semantics/normalize/flow/callable-completions.js +82 -0
  517. package/dist/semantics/normalize/flow/callable-reach.d.ts +237 -0
  518. package/dist/semantics/normalize/flow/callable-reach.js +7174 -0
  519. package/dist/semantics/normalize/flow/class-family-member-read.d.ts +16 -0
  520. package/dist/semantics/normalize/flow/class-family-member-read.js +992 -0
  521. package/dist/semantics/normalize/flow/collection-value-continuation.d.ts +21 -0
  522. package/dist/semantics/normalize/flow/collection-value-continuation.js +192 -0
  523. package/dist/semantics/normalize/flow/component-solver.d.ts +199 -0
  524. package/dist/semantics/normalize/flow/component-solver.js +587 -0
  525. package/dist/semantics/normalize/flow/computed-key-set.d.ts +84 -0
  526. package/dist/semantics/normalize/flow/computed-key-set.js +660 -0
  527. package/dist/semantics/normalize/flow/export-importers.d.ts +24 -0
  528. package/dist/semantics/normalize/flow/export-importers.js +269 -0
  529. package/dist/semantics/normalize/flow/host-text-sink.d.ts +25 -0
  530. package/dist/semantics/normalize/flow/host-text-sink.js +87 -0
  531. package/dist/semantics/normalize/flow/intrinsic-array-callback-frames.d.ts +84 -0
  532. package/dist/semantics/normalize/flow/intrinsic-array-callback-frames.js +180 -0
  533. package/dist/semantics/normalize/flow/intrinsic-data-definition.d.ts +35 -0
  534. package/dist/semantics/normalize/flow/intrinsic-data-definition.js +140 -0
  535. package/dist/semantics/normalize/flow/invocation-facts.d.ts +98 -0
  536. package/dist/semantics/normalize/flow/invocation-facts.js +257 -0
  537. package/dist/semantics/normalize/flow/member-call-forwarding.d.ts +122 -0
  538. package/dist/semantics/normalize/flow/member-call-forwarding.js +835 -0
  539. package/dist/semantics/normalize/flow/model.d.ts +357 -0
  540. package/dist/semantics/normalize/flow/model.js +177 -0
  541. package/dist/semantics/normalize/flow/native-collection-protocol.d.ts +24 -0
  542. package/dist/semantics/normalize/flow/native-collection-protocol.js +252 -0
  543. package/dist/semantics/normalize/flow/node-path-token.d.ts +3 -0
  544. package/dist/semantics/normalize/flow/node-path-token.js +53 -0
  545. package/dist/semantics/normalize/flow/object-binding-continuation.d.ts +11 -0
  546. package/dist/semantics/normalize/flow/object-binding-continuation.js +42 -0
  547. package/dist/semantics/normalize/flow/origin-authority.d.ts +56 -0
  548. package/dist/semantics/normalize/flow/origin-authority.js +2 -0
  549. package/dist/semantics/normalize/flow/owned-class-receivers.d.ts +35 -0
  550. package/dist/semantics/normalize/flow/owned-class-receivers.js +191 -0
  551. package/dist/semantics/normalize/flow/parameter-values.d.ts +27 -0
  552. package/dist/semantics/normalize/flow/parameter-values.js +251 -0
  553. package/dist/semantics/normalize/flow/proof-hypotheses.d.ts +66 -0
  554. package/dist/semantics/normalize/flow/proof-hypotheses.js +162 -0
  555. package/dist/semantics/normalize/flow/record-alias-closure.d.ts +27 -0
  556. package/dist/semantics/normalize/flow/record-alias-closure.js +298 -0
  557. package/dist/semantics/normalize/flow/seeded-origins.d.ts +43 -0
  558. package/dist/semantics/normalize/flow/seeded-origins.js +54 -0
  559. package/dist/semantics/normalize/flow/source-class-data.d.ts +132 -0
  560. package/dist/semantics/normalize/flow/source-class-data.js +838 -0
  561. package/dist/semantics/normalize/flow/source-class-instanceof.d.ts +13 -0
  562. package/dist/semantics/normalize/flow/source-class-instanceof.js +37 -0
  563. package/dist/semantics/normalize/flow/source-class-static-data.d.ts +16 -0
  564. package/dist/semantics/normalize/flow/source-class-static-data.js +47 -0
  565. package/dist/semantics/normalize/flow/source-construction-frames.d.ts +12 -0
  566. package/dist/semantics/normalize/flow/source-construction-frames.js +118 -0
  567. package/dist/semantics/normalize/flow/source-invocation-frame-layout.d.ts +34 -0
  568. package/dist/semantics/normalize/flow/source-invocation-frame-layout.js +78 -0
  569. package/dist/semantics/normalize/flow/source-invocation-receiver.d.ts +37 -0
  570. package/dist/semantics/normalize/flow/source-invocation-receiver.js +95 -0
  571. package/dist/semantics/normalize/flow/source-prototype-method-identity.d.ts +23 -0
  572. package/dist/semantics/normalize/flow/source-prototype-method-identity.js +81 -0
  573. package/dist/semantics/normalize/flow/source-record-data.d.ts +29 -0
  574. package/dist/semantics/normalize/flow/source-record-data.js +626 -0
  575. package/dist/semantics/normalize/flow/source-value-session.d.ts +77 -0
  576. package/dist/semantics/normalize/flow/source-value-session.js +3089 -0
  577. package/dist/semantics/normalize/flow/targets.d.ts +118 -0
  578. package/dist/semantics/normalize/flow/targets.js +405 -0
  579. package/dist/semantics/normalize/flow/value-flow.d.ts +36 -0
  580. package/dist/semantics/normalize/flow/value-flow.js +823 -0
  581. package/dist/semantics/normalize/flow/value-provenance.d.ts +31 -0
  582. package/dist/semantics/normalize/flow/value-provenance.js +112 -0
  583. package/dist/semantics/normalize/gating.d.ts +51 -0
  584. package/dist/semantics/normalize/gating.js +560 -0
  585. package/dist/semantics/normalize/generic-function-choice.d.ts +31 -0
  586. package/dist/semantics/normalize/generic-function-choice.js +115 -0
  587. package/dist/semantics/normalize/global-host-mutations.d.ts +51 -0
  588. package/dist/semantics/normalize/global-host-mutations.js +5989 -0
  589. package/dist/semantics/normalize/host-effect-contracts.d.ts +77 -0
  590. package/dist/semantics/normalize/host-effect-contracts.js +143 -0
  591. package/dist/semantics/normalize/host-mutation-computed-keys.d.ts +38 -0
  592. package/dist/semantics/normalize/host-mutation-computed-keys.js +26 -0
  593. package/dist/semantics/normalize/host-mutation-key-reader.d.ts +66 -0
  594. package/dist/semantics/normalize/host-mutation-key-reader.js +192 -0
  595. package/dist/semantics/normalize/host-mutation-keys.d.ts +114 -0
  596. package/dist/semantics/normalize/host-mutation-keys.js +183 -0
  597. package/dist/semantics/normalize/identities.d.ts +172 -0
  598. package/dist/semantics/normalize/identities.js +426 -0
  599. package/dist/semantics/normalize/implicit-arguments-tuple.d.ts +97 -0
  600. package/dist/semantics/normalize/implicit-arguments-tuple.js +197 -0
  601. package/dist/semantics/normalize/implicit-arguments.d.ts +11 -0
  602. package/dist/semantics/normalize/implicit-arguments.js +39 -0
  603. package/dist/semantics/normalize/instantiation.d.ts +73 -0
  604. package/dist/semantics/normalize/instantiation.js +399 -0
  605. package/dist/semantics/normalize/intrinsic-property-call.d.ts +18 -0
  606. package/dist/semantics/normalize/intrinsic-property-call.js +69 -0
  607. package/dist/semantics/normalize/intrinsic-prototype.d.ts +41 -0
  608. package/dist/semantics/normalize/intrinsic-prototype.js +87 -0
  609. package/dist/semantics/normalize/intrinsic-static-member.d.ts +14 -0
  610. package/dist/semantics/normalize/intrinsic-static-member.js +23 -0
  611. package/dist/semantics/normalize/jsdoc-type-names.d.ts +32 -0
  612. package/dist/semantics/normalize/jsdoc-type-names.js +512 -0
  613. package/dist/semantics/normalize/keyof.d.ts +32 -0
  614. package/dist/semantics/normalize/keyof.js +110 -0
  615. package/dist/semantics/normalize/local-bindings.d.ts +176 -0
  616. package/dist/semantics/normalize/local-bindings.js +1826 -0
  617. package/dist/semantics/normalize/logical-result-type.d.ts +16 -0
  618. package/dist/semantics/normalize/logical-result-type.js +102 -0
  619. package/dist/semantics/normalize/namespace-paths.d.ts +57 -0
  620. package/dist/semantics/normalize/namespace-paths.js +108 -0
  621. package/dist/semantics/normalize/normalize.d.ts +57 -0
  622. package/dist/semantics/normalize/normalize.js +68 -0
  623. package/dist/semantics/normalize/object-bag-bindings.d.ts +305 -0
  624. package/dist/semantics/normalize/object-bag-bindings.js +1290 -0
  625. package/dist/semantics/normalize/omitted-stated-parameter.d.ts +53 -0
  626. package/dist/semantics/normalize/omitted-stated-parameter.js +59 -0
  627. package/dist/semantics/normalize/open-type-form.d.ts +10 -0
  628. package/dist/semantics/normalize/open-type-form.js +32 -0
  629. package/dist/semantics/normalize/parameter-bindings.d.ts +361 -0
  630. package/dist/semantics/normalize/parameter-bindings.js +3339 -0
  631. package/dist/semantics/normalize/parameter-slot.d.ts +264 -0
  632. package/dist/semantics/normalize/parameter-slot.js +491 -0
  633. package/dist/semantics/normalize/physical-overload-result.d.ts +77 -0
  634. package/dist/semantics/normalize/physical-overload-result.js +99 -0
  635. package/dist/semantics/normalize/primitive-property-absence.d.ts +12 -0
  636. package/dist/semantics/normalize/primitive-property-absence.js +60 -0
  637. package/dist/semantics/normalize/producer-context.d.ts +376 -0
  638. package/dist/semantics/normalize/producer-context.js +1 -0
  639. package/dist/semantics/normalize/producers/allocations.d.ts +3 -0
  640. package/dist/semantics/normalize/producers/allocations.js +863 -0
  641. package/dist/semantics/normalize/producers/binding-kind.d.ts +37 -0
  642. package/dist/semantics/normalize/producers/binding-kind.js +36 -0
  643. package/dist/semantics/normalize/producers/bindings.d.ts +85 -0
  644. package/dist/semantics/normalize/producers/bindings.js +710 -0
  645. package/dist/semantics/normalize/producers/boundary.d.ts +34 -0
  646. package/dist/semantics/normalize/producers/boundary.js +123 -0
  647. package/dist/semantics/normalize/producers/class-lifecycle.d.ts +3 -0
  648. package/dist/semantics/normalize/producers/class-lifecycle.js +902 -0
  649. package/dist/semantics/normalize/producers/computations.d.ts +3 -0
  650. package/dist/semantics/normalize/producers/computations.js +613 -0
  651. package/dist/semantics/normalize/producers/control-loops.d.ts +30 -0
  652. package/dist/semantics/normalize/producers/control-loops.js +91 -0
  653. package/dist/semantics/normalize/producers/control.d.ts +30 -0
  654. package/dist/semantics/normalize/producers/control.js +923 -0
  655. package/dist/semantics/normalize/producers/declaration-lifecycle.d.ts +3 -0
  656. package/dist/semantics/normalize/producers/declaration-lifecycle.js +390 -0
  657. package/dist/semantics/normalize/producers/destructuring.d.ts +45 -0
  658. package/dist/semantics/normalize/producers/destructuring.js +1180 -0
  659. package/dist/semantics/normalize/producers/dynamic-language.d.ts +3 -0
  660. package/dist/semantics/normalize/producers/dynamic-language.js +70 -0
  661. package/dist/semantics/normalize/producers/erasure.d.ts +51 -0
  662. package/dist/semantics/normalize/producers/erasure.js +90 -0
  663. package/dist/semantics/normalize/producers/installed.d.ts +3 -0
  664. package/dist/semantics/normalize/producers/installed.js +55 -0
  665. package/dist/semantics/normalize/producers/invocations.d.ts +35 -0
  666. package/dist/semantics/normalize/producers/invocations.js +1796 -0
  667. package/dist/semantics/normalize/producers/iteration-yield.d.ts +59 -0
  668. package/dist/semantics/normalize/producers/iteration-yield.js +235 -0
  669. package/dist/semantics/normalize/producers/jsx.d.ts +3 -0
  670. package/dist/semantics/normalize/producers/jsx.js +360 -0
  671. package/dist/semantics/normalize/producers/mint.d.ts +39 -0
  672. package/dist/semantics/normalize/producers/mint.js +44 -0
  673. package/dist/semantics/normalize/producers/nullish.d.ts +16 -0
  674. package/dist/semantics/normalize/producers/nullish.js +27 -0
  675. package/dist/semantics/normalize/producers/object-assignment.d.ts +8 -0
  676. package/dist/semantics/normalize/producers/object-assignment.js +204 -0
  677. package/dist/semantics/normalize/producers/object-tag.d.ts +9 -0
  678. package/dist/semantics/normalize/producers/object-tag.js +119 -0
  679. package/dist/semantics/normalize/producers/optional-chain.d.ts +44 -0
  680. package/dist/semantics/normalize/producers/optional-chain.js +75 -0
  681. package/dist/semantics/normalize/producers/properties.d.ts +21 -0
  682. package/dist/semantics/normalize/producers/properties.js +1053 -0
  683. package/dist/semantics/normalize/producers/protocol.d.ts +67 -0
  684. package/dist/semantics/normalize/producers/protocol.js +695 -0
  685. package/dist/semantics/normalize/producers/references.d.ts +53 -0
  686. package/dist/semantics/normalize/producers/references.js +1027 -0
  687. package/dist/semantics/normalize/producers/shared.d.ts +561 -0
  688. package/dist/semantics/normalize/producers/shared.js +1683 -0
  689. package/dist/semantics/normalize/producers/spread-arguments.d.ts +72 -0
  690. package/dist/semantics/normalize/producers/spread-arguments.js +375 -0
  691. package/dist/semantics/normalize/producers/tagged-template.d.ts +5 -0
  692. package/dist/semantics/normalize/producers/tagged-template.js +307 -0
  693. package/dist/semantics/normalize/producers/tuple-spread.d.ts +189 -0
  694. package/dist/semantics/normalize/producers/tuple-spread.js +279 -0
  695. package/dist/semantics/normalize/property-key-domain.d.ts +36 -0
  696. package/dist/semantics/normalize/property-key-domain.js +150 -0
  697. package/dist/semantics/normalize/reachability.d.ts +189 -0
  698. package/dist/semantics/normalize/reachability.js +1057 -0
  699. package/dist/semantics/normalize/reassigned-bindings.d.ts +13 -0
  700. package/dist/semantics/normalize/reassigned-bindings.js +41 -0
  701. package/dist/semantics/normalize/record-storage-families.d.ts +11 -0
  702. package/dist/semantics/normalize/record-storage-families.js +109 -0
  703. package/dist/semantics/normalize/return-bindings.d.ts +260 -0
  704. package/dist/semantics/normalize/return-bindings.js +1311 -0
  705. package/dist/semantics/normalize/return-paths.d.ts +2 -0
  706. package/dist/semantics/normalize/return-paths.js +28 -0
  707. package/dist/semantics/normalize/script-global-redefinition.d.ts +44 -0
  708. package/dist/semantics/normalize/script-global-redefinition.js +75 -0
  709. package/dist/semantics/normalize/specialization.d.ts +201 -0
  710. package/dist/semantics/normalize/specialization.js +1824 -0
  711. package/dist/semantics/normalize/structural-array-element.d.ts +176 -0
  712. package/dist/semantics/normalize/structural-array-element.js +700 -0
  713. package/dist/semantics/normalize/structural-array-read.d.ts +13 -0
  714. package/dist/semantics/normalize/structural-array-read.js +124 -0
  715. package/dist/semantics/normalize/structural-callable.d.ts +12 -0
  716. package/dist/semantics/normalize/structural-callable.js +82 -0
  717. package/dist/semantics/normalize/structural-creation-order.d.ts +32 -0
  718. package/dist/semantics/normalize/structural-creation-order.js +111 -0
  719. package/dist/semantics/normalize/structural-declarations.d.ts +395 -0
  720. package/dist/semantics/normalize/structural-declarations.js +968 -0
  721. package/dist/semantics/normalize/structural-declared-body.d.ts +25 -0
  722. package/dist/semantics/normalize/structural-declared-body.js +147 -0
  723. package/dist/semantics/normalize/structural-generics.d.ts +56 -0
  724. package/dist/semantics/normalize/structural-generics.js +120 -0
  725. package/dist/semantics/normalize/structural-indexed-access.d.ts +11 -0
  726. package/dist/semantics/normalize/structural-indexed-access.js +126 -0
  727. package/dist/semantics/normalize/structural-instantiated-member.d.ts +64 -0
  728. package/dist/semantics/normalize/structural-instantiated-member.js +407 -0
  729. package/dist/semantics/normalize/structural-joins.d.ts +44 -0
  730. package/dist/semantics/normalize/structural-joins.js +143 -0
  731. package/dist/semantics/normalize/structural-layout-relevance.d.ts +29 -0
  732. package/dist/semantics/normalize/structural-layout-relevance.js +391 -0
  733. package/dist/semantics/normalize/structural-layout-type.d.ts +11 -0
  734. package/dist/semantics/normalize/structural-layout-type.js +1468 -0
  735. package/dist/semantics/normalize/structural-leaves.d.ts +49 -0
  736. package/dist/semantics/normalize/structural-leaves.js +125 -0
  737. package/dist/semantics/normalize/structural-local-union.d.ts +13 -0
  738. package/dist/semantics/normalize/structural-local-union.js +133 -0
  739. package/dist/semantics/normalize/structural-members.d.ts +26 -0
  740. package/dist/semantics/normalize/structural-members.js +84 -0
  741. package/dist/semantics/normalize/structural-mutable-method.d.ts +15 -0
  742. package/dist/semantics/normalize/structural-mutable-method.js +109 -0
  743. package/dist/semantics/normalize/structural-parts.d.ts +131 -0
  744. package/dist/semantics/normalize/structural-parts.js +737 -0
  745. package/dist/semantics/normalize/structural-receiver.d.ts +66 -0
  746. package/dist/semantics/normalize/structural-receiver.js +551 -0
  747. package/dist/semantics/normalize/structural-rules.d.ts +112 -0
  748. package/dist/semantics/normalize/structural-rules.js +93 -0
  749. package/dist/semantics/normalize/structural-self-reference.d.ts +150 -0
  750. package/dist/semantics/normalize/structural-self-reference.js +494 -0
  751. package/dist/semantics/normalize/structural.d.ts +202 -0
  752. package/dist/semantics/normalize/structural.js +4218 -0
  753. package/dist/semantics/normalize/unreduced-type-form.d.ts +41 -0
  754. package/dist/semantics/normalize/unreduced-type-form.js +53 -0
  755. package/dist/semantics/normalize/unresolvable-names.d.ts +56 -0
  756. package/dist/semantics/normalize/unresolvable-names.js +140 -0
  757. package/dist/semantics/package-sources.d.ts +16 -0
  758. package/dist/semantics/package-sources.js +365 -0
  759. package/dist/semantics/program.d.ts +151 -0
  760. package/dist/semantics/program.js +667 -0
  761. package/dist/semantics/prototype-install-source-transform.d.ts +4 -0
  762. package/dist/semantics/prototype-install-source-transform.js +341 -0
  763. package/dist/semantics/prototype-object-class-source-transform.d.ts +4 -0
  764. package/dist/semantics/prototype-object-class-source-transform.js +525 -0
  765. package/dist/semantics/prototype-reparenting.d.ts +50 -0
  766. package/dist/semantics/prototype-reparenting.js +317 -0
  767. package/dist/semantics/stable-checker.d.ts +10 -0
  768. package/dist/semantics/stable-checker.js +148 -0
  769. package/dist/semantics/subclass-member-overlay-transform.d.ts +35 -0
  770. package/dist/semantics/subclass-member-overlay-transform.js +1418 -0
  771. package/dist/semantics/symbol-keyed-expando-source-transform.d.ts +4 -0
  772. package/dist/semantics/symbol-keyed-expando-source-transform.js +66 -0
  773. package/dist/semantics/this-constructor-source-transform.d.ts +4 -0
  774. package/dist/semantics/this-constructor-source-transform.js +122 -0
  775. package/dist/semantics/uninstantiable-classes.d.ts +22 -0
  776. package/dist/semantics/uninstantiable-classes.js +75 -0
  777. package/dist/targets/cpp/balanced-units.d.ts +3 -0
  778. package/dist/targets/cpp/balanced-units.js +58 -0
  779. package/dist/targets/cpp/borrowed-call-entry.d.ts +30 -0
  780. package/dist/targets/cpp/borrowed-call-entry.js +68 -0
  781. package/dist/targets/cpp/captures.d.ts +68 -0
  782. package/dist/targets/cpp/captures.js +269 -0
  783. package/dist/targets/cpp/class-layout.d.ts +313 -0
  784. package/dist/targets/cpp/class-layout.js +483 -0
  785. package/dist/targets/cpp/class-properties/computed-method-value.d.ts +25 -0
  786. package/dist/targets/cpp/class-properties/computed-method-value.js +22 -0
  787. package/dist/targets/cpp/class-properties/emit-class-properties.d.ts +216 -0
  788. package/dist/targets/cpp/class-properties/emit-class-properties.js +917 -0
  789. package/dist/targets/cpp/class-properties/native-prototype.d.ts +11 -0
  790. package/dist/targets/cpp/class-properties/native-prototype.js +101 -0
  791. package/dist/targets/cpp/class-ref-transport.d.ts +12 -0
  792. package/dist/targets/cpp/class-ref-transport.js +32 -0
  793. package/dist/targets/cpp/conversions.d.ts +3 -0
  794. package/dist/targets/cpp/conversions.js +2027 -0
  795. package/dist/targets/cpp/deferral-safety.d.ts +82 -0
  796. package/dist/targets/cpp/deferral-safety.js +86 -0
  797. package/dist/targets/cpp/direct-call-receivers.d.ts +37 -0
  798. package/dist/targets/cpp/direct-call-receivers.js +79 -0
  799. package/dist/targets/cpp/document.d.ts +74 -0
  800. package/dist/targets/cpp/document.js +106 -0
  801. package/dist/targets/cpp/emit-allocation.d.ts +60 -0
  802. package/dist/targets/cpp/emit-allocation.js +573 -0
  803. package/dist/targets/cpp/emit-arrays.d.ts +119 -0
  804. package/dist/targets/cpp/emit-arrays.js +1047 -0
  805. package/dist/targets/cpp/emit-binding-reference.d.ts +17 -0
  806. package/dist/targets/cpp/emit-binding-reference.js +120 -0
  807. package/dist/targets/cpp/emit-bindings.d.ts +158 -0
  808. package/dist/targets/cpp/emit-bindings.js +769 -0
  809. package/dist/targets/cpp/emit-buffers.d.ts +156 -0
  810. package/dist/targets/cpp/emit-buffers.js +573 -0
  811. package/dist/targets/cpp/emit-callable.d.ts +230 -0
  812. package/dist/targets/cpp/emit-callable.js +2154 -0
  813. package/dist/targets/cpp/emit-carrier-members.d.ts +406 -0
  814. package/dist/targets/cpp/emit-carrier-members.js +1224 -0
  815. package/dist/targets/cpp/emit-coercion.d.ts +26 -0
  816. package/dist/targets/cpp/emit-coercion.js +39 -0
  817. package/dist/targets/cpp/emit-context.d.ts +1882 -0
  818. package/dist/targets/cpp/emit-context.js +904 -0
  819. package/dist/targets/cpp/emit-dynamic-properties.d.ts +174 -0
  820. package/dist/targets/cpp/emit-dynamic-properties.js +1249 -0
  821. package/dist/targets/cpp/emit-equality.d.ts +39 -0
  822. package/dist/targets/cpp/emit-equality.js +472 -0
  823. package/dist/targets/cpp/emit-exceptions.d.ts +104 -0
  824. package/dist/targets/cpp/emit-exceptions.js +513 -0
  825. package/dist/targets/cpp/emit-field-owner.d.ts +4 -0
  826. package/dist/targets/cpp/emit-field-owner.js +27 -0
  827. package/dist/targets/cpp/emit-in.d.ts +31 -0
  828. package/dist/targets/cpp/emit-in.js +426 -0
  829. package/dist/targets/cpp/emit-instanceof.d.ts +19 -0
  830. package/dist/targets/cpp/emit-instanceof.js +601 -0
  831. package/dist/targets/cpp/emit-integers.d.ts +68 -0
  832. package/dist/targets/cpp/emit-integers.js +184 -0
  833. package/dist/targets/cpp/emit-iterator.d.ts +100 -0
  834. package/dist/targets/cpp/emit-iterator.js +1137 -0
  835. package/dist/targets/cpp/emit-json.d.ts +73 -0
  836. package/dist/targets/cpp/emit-json.js +823 -0
  837. package/dist/targets/cpp/emit-jsx.d.ts +74 -0
  838. package/dist/targets/cpp/emit-jsx.js +806 -0
  839. package/dist/targets/cpp/emit-mixed-binary.d.ts +51 -0
  840. package/dist/targets/cpp/emit-mixed-binary.js +60 -0
  841. package/dist/targets/cpp/emit-namespaces.d.ts +101 -0
  842. package/dist/targets/cpp/emit-namespaces.js +133 -0
  843. package/dist/targets/cpp/emit-narrowing.d.ts +738 -0
  844. package/dist/targets/cpp/emit-narrowing.js +3967 -0
  845. package/dist/targets/cpp/emit-native-equality.d.ts +3 -0
  846. package/dist/targets/cpp/emit-native-equality.js +14 -0
  847. package/dist/targets/cpp/emit-native-selection.d.ts +5 -0
  848. package/dist/targets/cpp/emit-native-selection.js +37 -0
  849. package/dist/targets/cpp/emit-object-tag.d.ts +4 -0
  850. package/dist/targets/cpp/emit-object-tag.js +108 -0
  851. package/dist/targets/cpp/emit-owned-record.d.ts +2 -0
  852. package/dist/targets/cpp/emit-owned-record.js +15 -0
  853. package/dist/targets/cpp/emit-presence.d.ts +78 -0
  854. package/dist/targets/cpp/emit-presence.js +376 -0
  855. package/dist/targets/cpp/emit-properties.d.ts +105 -0
  856. package/dist/targets/cpp/emit-properties.js +1640 -0
  857. package/dist/targets/cpp/emit-record-view.d.ts +20 -0
  858. package/dist/targets/cpp/emit-record-view.js +354 -0
  859. package/dist/targets/cpp/emit-return.d.ts +5 -0
  860. package/dist/targets/cpp/emit-return.js +237 -0
  861. package/dist/targets/cpp/emit-sum-widening.d.ts +10 -0
  862. package/dist/targets/cpp/emit-sum-widening.js +69 -0
  863. package/dist/targets/cpp/emit-tonumber.d.ts +38 -0
  864. package/dist/targets/cpp/emit-tonumber.js +177 -0
  865. package/dist/targets/cpp/emit-tostring.d.ts +92 -0
  866. package/dist/targets/cpp/emit-tostring.js +556 -0
  867. package/dist/targets/cpp/emit-typeof.d.ts +49 -0
  868. package/dist/targets/cpp/emit-typeof.js +317 -0
  869. package/dist/targets/cpp/emit-union-properties.d.ts +181 -0
  870. package/dist/targets/cpp/emit-union-properties.js +1281 -0
  871. package/dist/targets/cpp/emit.d.ts +45 -0
  872. package/dist/targets/cpp/emit.js +2225 -0
  873. package/dist/targets/cpp/error-types.d.ts +4 -0
  874. package/dist/targets/cpp/error-types.js +11 -0
  875. package/dist/targets/cpp/function-source-reads.d.ts +72 -0
  876. package/dist/targets/cpp/function-source-reads.js +148 -0
  877. package/dist/targets/cpp/host/atomics.d.ts +25 -0
  878. package/dist/targets/cpp/host/atomics.js +63 -0
  879. package/dist/targets/cpp/host/core-globals.d.ts +108 -0
  880. package/dist/targets/cpp/host/core-globals.js +158 -0
  881. package/dist/targets/cpp/host/dynamic-argument-members.d.ts +42 -0
  882. package/dist/targets/cpp/host/dynamic-argument-members.js +61 -0
  883. package/dist/targets/cpp/host/emit-host-arity.d.ts +139 -0
  884. package/dist/targets/cpp/host/emit-host-arity.js +232 -0
  885. package/dist/targets/cpp/host/emit-host-invoke.d.ts +91 -0
  886. package/dist/targets/cpp/host/emit-host-invoke.js +1105 -0
  887. package/dist/targets/cpp/host/emit-host-object.d.ts +55 -0
  888. package/dist/targets/cpp/host/emit-host-object.js +2206 -0
  889. package/dist/targets/cpp/host/emit-host-properties.d.ts +69 -0
  890. package/dist/targets/cpp/host/emit-host-properties.js +533 -0
  891. package/dist/targets/cpp/host/emit-host-reflect.d.ts +4 -0
  892. package/dist/targets/cpp/host/emit-host-reflect.js +180 -0
  893. package/dist/targets/cpp/host/emit-host-value.d.ts +120 -0
  894. package/dist/targets/cpp/host/emit-host-value.js +392 -0
  895. package/dist/targets/cpp/host/host-members.d.ts +505 -0
  896. package/dist/targets/cpp/host/host-members.js +819 -0
  897. package/dist/targets/cpp/host/host-method-aliases.d.ts +30 -0
  898. package/dist/targets/cpp/host/host-method-aliases.js +76 -0
  899. package/dist/targets/cpp/host/native-protocols.d.ts +47 -0
  900. package/dist/targets/cpp/host/native-protocols.js +183 -0
  901. package/dist/targets/cpp/host/object-protocol.d.ts +351 -0
  902. package/dist/targets/cpp/host/object-protocol.js +671 -0
  903. package/dist/targets/cpp/host-namespace-reads.d.ts +83 -0
  904. package/dist/targets/cpp/host-namespace-reads.js +113 -0
  905. package/dist/targets/cpp/manifest/capabilities.d.ts +39 -0
  906. package/dist/targets/cpp/manifest/capabilities.js +1484 -0
  907. package/dist/targets/cpp/manifest.d.ts +23 -0
  908. package/dist/targets/cpp/manifest.js +113 -0
  909. package/dist/targets/cpp/native-error-base.d.ts +38 -0
  910. package/dist/targets/cpp/native-error-base.js +74 -0
  911. package/dist/targets/cpp/native-narrowing-transport.d.ts +12 -0
  912. package/dist/targets/cpp/native-narrowing-transport.js +151 -0
  913. package/dist/targets/cpp/native-selection-helpers.d.ts +11 -0
  914. package/dist/targets/cpp/native-selection-helpers.js +46 -0
  915. package/dist/targets/cpp/native-symbol-keys.d.ts +8 -0
  916. package/dist/targets/cpp/native-symbol-keys.js +34 -0
  917. package/dist/targets/cpp/ownership.d.ts +43 -0
  918. package/dist/targets/cpp/ownership.js +38 -0
  919. package/dist/targets/cpp/owning-conversion-input.d.ts +14 -0
  920. package/dist/targets/cpp/owning-conversion-input.js +12 -0
  921. package/dist/targets/cpp/property-read-claims.d.ts +62 -0
  922. package/dist/targets/cpp/property-read-claims.js +23 -0
  923. package/dist/targets/cpp/property-store-claims.d.ts +62 -0
  924. package/dist/targets/cpp/property-store-claims.js +26 -0
  925. package/dist/targets/cpp/prototype/emit-prototype-array.d.ts +111 -0
  926. package/dist/targets/cpp/prototype/emit-prototype-array.js +602 -0
  927. package/dist/targets/cpp/prototype/emit-prototype-date.d.ts +133 -0
  928. package/dist/targets/cpp/prototype/emit-prototype-date.js +515 -0
  929. package/dist/targets/cpp/prototype/emit-prototype-error.d.ts +13 -0
  930. package/dist/targets/cpp/prototype/emit-prototype-error.js +54 -0
  931. package/dist/targets/cpp/prototype/emit-prototype-invoke.d.ts +34 -0
  932. package/dist/targets/cpp/prototype/emit-prototype-invoke.js +1003 -0
  933. package/dist/targets/cpp/prototype/emit-prototype-iterator.d.ts +47 -0
  934. package/dist/targets/cpp/prototype/emit-prototype-iterator.js +250 -0
  935. package/dist/targets/cpp/prototype/emit-prototype-promise.d.ts +46 -0
  936. package/dist/targets/cpp/prototype/emit-prototype-promise.js +143 -0
  937. package/dist/targets/cpp/prototype/emit-prototype-regexp.d.ts +335 -0
  938. package/dist/targets/cpp/prototype/emit-prototype-regexp.js +853 -0
  939. package/dist/targets/cpp/prototype/emit-prototype-string.d.ts +42 -0
  940. package/dist/targets/cpp/prototype/emit-prototype-string.js +252 -0
  941. package/dist/targets/cpp/prototype/prototype-method-reads.d.ts +25 -0
  942. package/dist/targets/cpp/prototype/prototype-method-reads.js +182 -0
  943. package/dist/targets/cpp/reactive-dependencies.d.ts +140 -0
  944. package/dist/targets/cpp/reactive-dependencies.js +432 -0
  945. package/dist/targets/cpp/reactive-origins.d.ts +44 -0
  946. package/dist/targets/cpp/reactive-origins.js +82 -0
  947. package/dist/targets/cpp/records.d.ts +277 -0
  948. package/dist/targets/cpp/records.js +2427 -0
  949. package/dist/targets/cpp/recursive-containers.d.ts +43 -0
  950. package/dist/targets/cpp/recursive-containers.js +144 -0
  951. package/dist/targets/cpp/regexp-types.d.ts +56 -0
  952. package/dist/targets/cpp/regexp-types.js +59 -0
  953. package/dist/targets/cpp/substrate.d.ts +125 -0
  954. package/dist/targets/cpp/substrate.js +12 -0
  955. package/dist/targets/cpp/translation-unit.d.ts +219 -0
  956. package/dist/targets/cpp/translation-unit.js +2063 -0
  957. package/dist/targets/cpp/types.d.ts +280 -0
  958. package/dist/targets/cpp/types.js +1135 -0
  959. package/dist/targets/cpp/virtual-methods.d.ts +95 -0
  960. package/dist/targets/cpp/virtual-methods.js +264 -0
  961. package/package.json +95 -0
  962. package/src/targets/cpp/runtime/gea_dynamic_proxy.h +824 -0
  963. package/src/targets/cpp/runtime/gea_eval.h +1376 -0
  964. package/src/targets/cpp/runtime/gea_native_class_prototype.h +44 -0
  965. package/src/targets/cpp/runtime/gea_runtime.h +29222 -0
  966. package/src/targets/cpp/runtime/gea_runtime_builtins.cpp +55 -0
@@ -0,0 +1,687 @@
1
+ import { operationOfResult } from '../identity/ids.js';
2
+ import { operandOf, resultOf } from '../semantics/model/operands.js';
3
+ /**
4
+ * Shared owner-grouping, ordering, and lookup primitives for IR lowering.
5
+ *
6
+ * `lowerToIr` must abort one owner without harming another, so every failure
7
+ * here is thrown as `IrLoweringBlockedError` and caught once, at the single
8
+ * per-owner boundary in `lower.ts`. That keeps every helper a plain function
9
+ * that either returns an answer or fails closed -- never a `Result` type
10
+ * threaded through a dozen call sites, and never a silent partial answer.
11
+ */
12
+ /** Thrown to abort lowering of exactly one owner. The message states the missing capability, never a source site. */
13
+ export class IrLoweringBlockedError extends Error {
14
+ constructor(reason) {
15
+ super(reason);
16
+ this.name = 'IrLoweringBlockedError';
17
+ }
18
+ }
19
+ export const callerOwner = (caller) => (caller.kind === 'function' ? caller.functionId : caller.regionId);
20
+ /** Every operation, bucketed by the owner that executes it. One bucket becomes one `IrBody`. */
21
+ export const groupOperationsByOwner = (graph) => {
22
+ const groups = new Map();
23
+ for (const [id, operation] of graph.operations) {
24
+ const owner = callerOwner(operation.caller);
25
+ const bucket = groups.get(owner);
26
+ if (bucket)
27
+ bucket.push(id);
28
+ else
29
+ groups.set(owner, [id]);
30
+ }
31
+ return groups;
32
+ };
33
+ /**
34
+ * The result role an IR operation's `lineage` cites for a semantic operation
35
+ * with several published results.
36
+ *
37
+ * `value` is preferred because it is what a consumer most often needs to
38
+ * resolve; the rest follow `resultRoles` order as a deterministic fallback so
39
+ * two lowerings of the same operation always pick the same anchor.
40
+ */
41
+ const anchorRolePriority = ['value', 'completion', 'reference', 'iterator-record', 'short-circuit'];
42
+ /**
43
+ * The published result an operation's own IR lowering cites as `lineage`.
44
+ *
45
+ * `null` when the operation published no result at all. That is a real gap
46
+ * between the semantic model (a step may publish nothing) and the IR model
47
+ * (`IrOperationBase.lineage` is mandatory): lowering cannot invent a
48
+ * `SemanticResultId` the operation never published without becoming a second,
49
+ * competing authority over what that operation's identity is, so the caller
50
+ * must fail closed instead.
51
+ */
52
+ export const anchorResultOf = (operation) => {
53
+ for (const role of anchorRolePriority) {
54
+ const found = operation.results.find((result) => result.role === role);
55
+ if (found)
56
+ return found.id;
57
+ }
58
+ return operation.results[0]?.id ?? null;
59
+ };
60
+ /** The one authoritative carrier for a published result, or a thrown blocker naming why it cannot materialize. */
61
+ export const requireRepresentation = (plan, result, describe) => {
62
+ const representation = plan.selected.get(result);
63
+ if (!representation)
64
+ throw new IrLoweringBlockedError(`${describe} has no carrier selected in the sealed representation plan`);
65
+ if (representation.kind === 'unresolved') {
66
+ throw new IrLoweringBlockedError(`${describe} selected an unresolved carrier: ${representation.reason}`);
67
+ }
68
+ return representation;
69
+ };
70
+ export const collectRegionParts = (graph) => {
71
+ const regionParts = new Map();
72
+ for (const edge of graph.edges) {
73
+ if (edge.kind !== 'region')
74
+ continue;
75
+ const key = `${edge.region}|${edge.part}`;
76
+ const bucket = regionParts.get(key);
77
+ if (bucket)
78
+ bucket.push(edge.to);
79
+ else
80
+ regionParts.set(key, [edge.to]);
81
+ }
82
+ return regionParts;
83
+ };
84
+ export const orderOwnerOperations = (graph, operations, membership,
85
+ /**
86
+ * The edges whose target this owner holds, in `graph.edges` order.
87
+ *
88
+ * Every use of the edge table below is a filter that keeps only edges landing
89
+ * inside `operations` -- `addPrecedence` refuses any pair with an endpoint
90
+ * outside `members` -- so passing the owner's own share is the same answer as
91
+ * passing the whole table, reached without walking owners x edges to get it.
92
+ * Order is preserved because the share is dealt in table order.
93
+ */
94
+ ownerEdges,
95
+ /** The whole program's region-part groups; see `collectRegionParts` for why this one is not split. */
96
+ regionParts) => {
97
+ const members = new Set(operations);
98
+ const indegree = new Map();
99
+ const successors = new Map();
100
+ const predecessors = new Map();
101
+ for (const id of operations) {
102
+ indegree.set(id, 0);
103
+ successors.set(id, new Set());
104
+ predecessors.set(id, new Set());
105
+ }
106
+ const addPrecedence = (before, after) => {
107
+ if (before === after || !members.has(before) || !members.has(after))
108
+ return;
109
+ const bucket = successors.get(before);
110
+ if (!bucket || bucket.has(after))
111
+ return;
112
+ bucket.add(after);
113
+ predecessors.get(after)?.add(before);
114
+ indegree.set(after, (indegree.get(after) ?? 0) + 1);
115
+ };
116
+ for (const id of operations) {
117
+ const operation = graph.operations.get(id);
118
+ if (!operation)
119
+ continue;
120
+ for (const operand of operation.operands) {
121
+ if (operand.source.kind !== 'result')
122
+ continue;
123
+ addPrecedence(operationOfResult(operand.source.result), id);
124
+ }
125
+ }
126
+ for (const edge of ownerEdges) {
127
+ if (edge.kind === 'evaluation' || edge.kind === 'effect')
128
+ addPrecedence(edge.from, edge.to);
129
+ else if (edge.kind === 'conditional')
130
+ addPrecedence(operationOfResult(edge.guard), edge.to);
131
+ // A region's own opening operation (`contributeTry`'s `TryStatement`
132
+ // marker) is not a value the try/catch/finally body's operations consume
133
+ // -- it publishes nothing any operand cites -- so without this it has no
134
+ // precedence forcing it before the body it logically precedes, and
135
+ // census's post-order `evaluationOrdinal` ("children first, then this
136
+ // node") places it *after* instead. Left unordered, `orderOwnerOperations`
137
+ // schedules the whole region body first (contiguity keeps it together and
138
+ // its operations are otherwise ready), then reaches this marker with the
139
+ // scope already closed and the block already terminated -- exactly the
140
+ // same shape a guard's own boolean test avoids via the `'conditional'`
141
+ // case just above, and the identical fix: a real precedence edge, not an
142
+ // ordinal that happens to work out.
143
+ else if (edge.kind === 'region')
144
+ addPrecedence(edge.region, edge.to);
145
+ }
146
+ // A `'catch'` part's own `boundary` operation (`producers/boundary.ts`) --
147
+ // and, when the clause binds a name, the `binding` operation chained off
148
+ // it -- materializes the value entering that specific part, the same role
149
+ // `edge.region` plays for the region as a whole. Nothing else in the group
150
+ // consumes it as an operand (a bindingless catch's boundary publishes no
151
+ // result at all; a bound catch's sibling statements read the *binding*, not
152
+ // the boundary, and only through an ordinary reference, not this list), so
153
+ // without an explicit precedence here it is subject to the identical
154
+ // post-order-ordinal defect `edge.region` needed fixing for above: census
155
+ // orders it after its own part's body, and a body that returns on every
156
+ // path schedules it into an already-closed scope.
157
+ // How many region parts each operation is a member of, so the loop below can
158
+ // tell a group's OWN opener from a boundary that merely sits inside it.
159
+ const partsContaining = new Map();
160
+ for (const members of regionParts.values()) {
161
+ for (const member of members)
162
+ partsContaining.set(member, (partsContaining.get(member) ?? 0) + 1);
163
+ }
164
+ for (const [key, members] of regionParts) {
165
+ // Only a `catch` part is entered through a boundary. A `try` part is
166
+ // entered by falling into it and has no opening operation at all -- and
167
+ // asking for one anyway is what made a NESTED try/catch unlowerable: the
168
+ // gating pass gives an inner catch clause both its own gate and every gate
169
+ // enclosing it, so the inner catch's boundary is a legitimate member of the
170
+ // OUTER try's part, and taking the first boundary found there forced it
171
+ // ahead of the operations that must run before it. The result was a real
172
+ // cycle -- "the evaluation graph for this owner contains a cycle" -- for
173
+ // any `try { try {} catch {} } catch {}`. The key's last segment is the
174
+ // part; see `collectRegionParts` directly above for the format.
175
+ if (!key.endsWith('|catch'))
176
+ continue;
177
+ // The same nesting one level in: a try/catch written INSIDE this catch
178
+ // contributes its own boundary to this group too. The one that opens this
179
+ // group is the one that is in no deeper part -- it belongs to this group
180
+ // plus whatever encloses it, while any nested boundary belongs to all of
181
+ // those and at least one more.
182
+ let opener = null;
183
+ for (const id of members) {
184
+ if (graph.operations.get(id)?.family !== 'boundary')
185
+ continue;
186
+ if (opener === null || (partsContaining.get(id) ?? 0) < (partsContaining.get(opener) ?? 0))
187
+ opener = id;
188
+ }
189
+ if (opener === null)
190
+ continue;
191
+ // The clause's own parameter binding, when it binds a name. The paragraph
192
+ // above says this operation is part of the prologue; it used to leave it
193
+ // out, and the boundary alone is not enough. `catch (caught)` publishes
194
+ // TWO operations -- the boundary that materializes the caught value, and
195
+ // the `binding:initialize` that writes it into `caught`'s cell -- and the
196
+ // handler's own statements read that CELL, through an ordinary
197
+ // `binding:read` whose only operand is a reference. A read cites the
198
+ // reference, never the write, so nothing ordered the write before it, and
199
+ // the census's post-order ordinal ("children first, then this node") puts
200
+ // the CatchClause's own operations after the body it contains. The write
201
+ // was therefore scheduled after the handler's `return`, landing in the
202
+ // region's join block: the handler read an uninitialized cell, and the
203
+ // write itself was emitted outside the `catch` scope where the C++ catch
204
+ // parameter it copies from does not exist. Both halves of that were
205
+ // clang-visible in `test/fixtures/try-catch-bound.ts` ("use of undeclared
206
+ // identifier", plus the bare `return;` the stray block left behind in a
207
+ // `std::string` function) -- and a `typeof` of the caught value certified
208
+ // clean while reading the cell before anything wrote it.
209
+ //
210
+ // Matched by the operand role rather than by family so this stays the same
211
+ // fact the value edge already states: the binding is the operation that
212
+ // takes one of the opener's results AS ITS INITIALIZER. Prologue members
213
+ // are not ordered against each other here -- that value edge already
214
+ // ordered them, and adding the reverse direction would be a cycle.
215
+ const openerResults = new Set((graph.operations.get(opener)?.results ?? []).map((result) => result.id));
216
+ const prologue = members.filter((id) => id === opener ||
217
+ (graph.operations.get(id)?.operands ?? []).some((operand) => operand.role === 'initializer' && operand.source.kind === 'result' && openerResults.has(operand.source.result)));
218
+ const inPrologue = new Set(prologue);
219
+ for (const member of members) {
220
+ if (inPrologue.has(member))
221
+ continue;
222
+ for (const before of prologue)
223
+ addPrecedence(before, member);
224
+ }
225
+ }
226
+ // FunctionDeclarationInstantiation creates every direct body-level function
227
+ // binding after parameter initialization and before the first executable
228
+ // body statement. A source-order tie-break cannot express that phase: a
229
+ // declaration written after `return` or after its first call is still live,
230
+ // and one early-called declaration may itself call a sibling declared later.
231
+ //
232
+ // The producer marks both halves of each declaration (callable allocation
233
+ // and binding initialization), and parameter bindings mark the phase that
234
+ // must remain ahead of them. Dependencies of those parameter writes are part
235
+ // of the same prologue. All function bindings then precede everything else;
236
+ // leaving the allocations mutually unordered is deliberate because capture
237
+ // analysis will box any sibling binding an earlier closure must share.
238
+ const parameterRoots = operations.filter((id) => {
239
+ const operation = graph.operations.get(id);
240
+ return operation?.family === 'binding' && operation.parameterInitialization === true;
241
+ });
242
+ const parameterPrologue = new Set();
243
+ const collectPredecessors = (id) => {
244
+ if (parameterPrologue.has(id))
245
+ return;
246
+ parameterPrologue.add(id);
247
+ for (const before of predecessors.get(id) ?? [])
248
+ collectPredecessors(before);
249
+ };
250
+ for (const root of parameterRoots)
251
+ collectPredecessors(root);
252
+ const hoistedAllocations = operations.filter((id) => {
253
+ const operation = graph.operations.get(id);
254
+ return operation?.family === 'allocation' && operation.hoistedFunctionInitialization === true;
255
+ });
256
+ const hoistedBindings = operations.filter((id) => {
257
+ const operation = graph.operations.get(id);
258
+ return operation?.family === 'binding' && operation.hoistedFunctionInitialization === true;
259
+ });
260
+ const hoisted = new Set([...hoistedAllocations, ...hoistedBindings]);
261
+ for (const parameter of parameterRoots)
262
+ for (const allocation of hoistedAllocations)
263
+ addPrecedence(parameter, allocation);
264
+ const orderedHoistedBindings = [...hoistedBindings].sort((left, right) => {
265
+ const byOrdinal = (graph.operations.get(left)?.evaluationOrdinal ?? 0) - (graph.operations.get(right)?.evaluationOrdinal ?? 0);
266
+ return byOrdinal !== 0 ? byOrdinal : left.localeCompare(right);
267
+ });
268
+ for (let index = 1; index < orderedHoistedBindings.length; index += 1) {
269
+ const before = orderedHoistedBindings[index - 1];
270
+ const after = orderedHoistedBindings[index];
271
+ if (before && after)
272
+ addPrecedence(before, after);
273
+ }
274
+ const hoistBarrier = orderedHoistedBindings[orderedHoistedBindings.length - 1];
275
+ if (hoistBarrier) {
276
+ for (const operation of operations) {
277
+ if (parameterPrologue.has(operation) || hoisted.has(operation))
278
+ continue;
279
+ addPrecedence(hoistBarrier, operation);
280
+ }
281
+ }
282
+ // A dependency of a region member that lives outside that SAME part has to
283
+ // run before the region opens. Topological contiguity alone cannot ensure
284
+ // this: a hoisted function declaration used halfway through a try body is
285
+ // ready at function entry, but its later source ordinal can leave the try's
286
+ // marker first in the ready queue. Lowering then emits the early try
287
+ // operations, closes the part to materialize the dependency, and re-enters
288
+ // the cached try entry for the use. The finished graph has several outside
289
+ // predecessors for that entry, a transfer C++ cannot express because `goto`
290
+ // may not enter a try block.
291
+ //
292
+ // The dependency edge is the authority for moving the prerequisite. If an
293
+ // operation outside the part must precede something inside it, it must also
294
+ // precede the region marker: executing it between two operations of the part
295
+ // would leave and re-enter the region. A dependency from a sibling part
296
+ // instead forms a cycle with the marker-to-member edges above and therefore
297
+ // still fails closed; no ordering can make a catch-side value available in
298
+ // the try body before the statement begins. Snapshot the existing edges so
299
+ // the entry-precedence edges added here do not recursively become evidence
300
+ // for more edges of their own.
301
+ //
302
+ // "Outside the part" means outside the REGION: a catch handler sequenced
303
+ // before the finally clause of the same statement (`producers/control.ts`
304
+ // wires that edge, and the try marker itself feeds its finally the same
305
+ // way) is not a prerequisite the statement has to wait for -- it is the
306
+ // statement. Reading it as one added `catch -> marker` to the marker's own
307
+ // `marker -> catch`, and every `try`/`catch`/`finally` cycled.
308
+ const dependencies = [...successors].flatMap(([before, afters]) => [...afters].map((after) => ({ before, after })));
309
+ for (const { before, after } of dependencies) {
310
+ const beforeRegions = new Set(membership.requiredScopeOf(before).flatMap((ref) => (ref.kind === 'region' ? [ref.region] : [])));
311
+ for (const ref of membership.requiredScopeOf(after)) {
312
+ if (ref.kind !== 'region' || ref.region === before || beforeRegions.has(ref.region))
313
+ continue;
314
+ addPrecedence(before, ref.region);
315
+ }
316
+ }
317
+ const evaluationOrdinalOf = (id) => graph.operations.get(id)?.evaluationOrdinal ?? 0;
318
+ const compareReady = (left, right) => {
319
+ const byOrdinal = evaluationOrdinalOf(left) - evaluationOrdinalOf(right);
320
+ // Only a tie-break among operations the graph left otherwise unordered;
321
+ // comparing the identity string decides nothing on its own, it just makes
322
+ // that tie reproducible across runs.
323
+ return byOrdinal !== 0 ? byOrdinal : left.localeCompare(right);
324
+ };
325
+ // How much of two scope chains is the same nesting, counted from the
326
+ // outside in. `0` means the two operations share no branch at all, and the
327
+ // lowering has to close every frame one of them is in to reach the other.
328
+ const sharedScopeDepth = (left, right) => {
329
+ let depth = 0;
330
+ while (depth < left.length && depth < right.length) {
331
+ const outer = left[depth];
332
+ const inner = right[depth];
333
+ if (!outer || !inner || scopeKeyOf(outer) !== scopeKeyOf(inner))
334
+ break;
335
+ depth += 1;
336
+ }
337
+ return depth;
338
+ };
339
+ const ready = operations.filter((id) => (indegree.get(id) ?? 0) === 0).sort(compareReady);
340
+ const ordered = [];
341
+ let currentScope = [];
342
+ while (ready.length > 0) {
343
+ // `ready` is kept in `compareReady` order, so scanning it front to back and
344
+ // only accepting a *strictly* deeper match leaves the ordinal tie-break in
345
+ // charge of everything contiguity does not decide.
346
+ let chosen = 0;
347
+ let deepest = -1;
348
+ for (let index = 0; index < ready.length; index += 1) {
349
+ const candidate = ready[index];
350
+ if (candidate === undefined)
351
+ continue;
352
+ const depth = sharedScopeDepth(currentScope, membership.requiredScopeOf(candidate));
353
+ if (depth > deepest) {
354
+ deepest = depth;
355
+ chosen = index;
356
+ }
357
+ }
358
+ const next = ready.splice(chosen, 1)[0];
359
+ if (next === undefined)
360
+ break;
361
+ ordered.push(next);
362
+ currentScope = membership.requiredScopeOf(next);
363
+ const unlocked = [];
364
+ for (const successor of successors.get(next) ?? []) {
365
+ const remaining = (indegree.get(successor) ?? 0) - 1;
366
+ indegree.set(successor, remaining);
367
+ if (remaining === 0)
368
+ unlocked.push(successor);
369
+ }
370
+ if (unlocked.length === 0)
371
+ continue;
372
+ ready.push(...unlocked);
373
+ ready.sort(compareReady);
374
+ }
375
+ if (ordered.length !== operations.length) {
376
+ throw new IrLoweringBlockedError('the evaluation graph for this owner contains a cycle and has no well-defined execution order');
377
+ }
378
+ return { order: ordered, parameterPrologue };
379
+ };
380
+ /**
381
+ * The two-sided arm a `ScopeRef`'s four-valued `takenWhen` selects, independent
382
+ * of which predicate reads it.
383
+ *
384
+ * `nullish`/`present` are not a third and fourth kind of arm -- they are the
385
+ * same two arms tested differently -- so everything that compares scopes has
386
+ * to apply this mapping first. A `ScopeRef` compared before it is mapped is a
387
+ * `ScopeRef` compared in the wrong vocabulary.
388
+ */
389
+ export const armSideOf = (takenWhen) => takenWhen === 'truthy' || takenWhen === 'present' ? 'truthy' : 'falsy';
390
+ /**
391
+ * One scope's identity. Two refs with the same key name the same block-level
392
+ * nesting, and the ordering and the flow controller must agree on that or one
393
+ * of them will think a scope was left when it was not.
394
+ */
395
+ export const scopeKeyOf = (ref) => ref.kind === 'loop'
396
+ ? `loop|${ref.loop}`
397
+ : ref.kind === 'loop-latch'
398
+ ? `loop-latch|${ref.loop}`
399
+ : ref.kind === 'region'
400
+ ? `region|${ref.region}|${ref.part}`
401
+ : `guard|${ref.guard}|${armSideOf(ref.takenWhen)}`;
402
+ /**
403
+ * Every operation's conditional membership, read directly from `ConditionalEdge`.
404
+ *
405
+ * Nesting order is derived from edge order rather than guessed: a guard whose
406
+ * producing operation runs earlier can only be an outer condition, because a
407
+ * later guard's own evaluation is itself gated by whichever condition already
408
+ * let it run. That is an edge-derived fact, not a source-shaped one, even
409
+ * though it happens to agree with source order.
410
+ *
411
+ * `operations` is this owner's membership set, in any order -- nothing here
412
+ * reads a position from it. That independence is what lets the execution order
413
+ * be computed *from* this answer rather than before it: `orderOwnerOperations`
414
+ * needs every operation's scope chain to keep one branch's operations
415
+ * contiguous, and a membership that depended on the order would be circular.
416
+ */
417
+ /**
418
+ * Puts every scope chain in enclosure order, outermost first.
419
+ *
420
+ * The chains arrive in edge-table order, and that is chain order only WITHIN a
421
+ * single publisher. Two publishers state them: a producer states an operation's
422
+ * OWN gate as a conditional edge -- `a?.b()`'s call is placed by the presence
423
+ * test -- while `gatingEdges` states the gates of the SUBTREES it walks
424
+ * (`gating.ts`: "an edge places an operation, a gate places a subtree"). Each is
425
+ * internally outermost-first; between them there is no order at all, because
426
+ * every producer edge is appended while operations are being built and every
427
+ * gating edge afterwards.
428
+ *
429
+ * So an optional chain written inside any other gate came out INVERTED. For
430
+ * `if (k) { s.emit?.("a") }` the call's chain read
431
+ * `[?.-guard, if-guard]` -- the producer's own-gate edge first, the walk's
432
+ * `if` edge second -- while every sibling operation in the branch read
433
+ * `[if-guard]`. `sharedScopeDepth` compares from the outside in, so it scored
434
+ * those two chains as sharing nothing, and the lowering closed the `if` arm to
435
+ * enter the `?.` frame and then tried to re-enter the arm it had just ended:
436
+ * "the truthy arm of guard ... was re-entered after it had already ended".
437
+ * That was not a corner -- it was EVERY `?.` inside an `if`, a `while`, a
438
+ * ternary or a `try`, and it refused the whole body.
439
+ *
440
+ * Sorting is not a second opinion about nesting, because the nesting is not
441
+ * being guessed at: a scope encloses another exactly when the enclosed one's
442
+ * OWN opening operation is gated by it, which the chains already record. Depth
443
+ * is the length of that containment, so ordering by it reproduces the walk's
444
+ * own order wherever one publisher stated the whole chain, and repairs it where
445
+ * two did. A tie keeps insertion order -- the sort is stable -- so nothing that
446
+ * was already coherent moves.
447
+ *
448
+ * A loop is the case that makes position-derived order wrong and this one
449
+ * right: a loop's condition is produced INSIDE the loop, so its chain contains
450
+ * the loop frame, so the guard on that condition scores deeper than the frame
451
+ * and stays within it. Reading position would have hoisted it out.
452
+ */
453
+ const orderChainsByEnclosure = (perOperation, headTestOfLoop) => {
454
+ const openerOf = (ref) => ref.kind === 'guard' ? operationOfResult(ref.guard) : ref.kind === 'region' ? ref.region : ref.loop;
455
+ const depths = new Map();
456
+ const visiting = new Set();
457
+ const depthAbove = (opener) => {
458
+ let depth = 0;
459
+ for (const enclosing of perOperation.get(opener) ?? [])
460
+ depth = Math.max(depth, depthOf(enclosing) + 1);
461
+ return depth;
462
+ };
463
+ /**
464
+ * A latch is one scope deeper than its loop's test, not one deeper than the
465
+ * loop.
466
+ *
467
+ * Every other scope is measured through the chain of its own opening
468
+ * operation, and a latch has none -- it opens at the END of the body rather
469
+ * than at any operation. Falling back to the loop operation scored it level
470
+ * with the loop frame, so `i++`'s chain `[loop, test-truthy, latch]` sorted to
471
+ * `[loop, latch, test-truthy]` and the lowering closed the body arm to enter
472
+ * the latch and then re-entered the arm it had just ended. That is every
473
+ * head-tested `for` and `while` with an update -- `array_read`'s two loops
474
+ * included -- so the whole ordering pass refused ordinary programs.
475
+ *
476
+ * The containment is not a guess: a head-tested loop reaches its latch only
477
+ * from the body, and the body IS the test's truthy arm, so the latch is
478
+ * inside it. A tail-tested loop has no such arm -- its test decides only the
479
+ * back edge -- and its latch sits directly in the loop frame.
480
+ */
481
+ const latchDepth = (loop) => {
482
+ const test = headTestOfLoop(loop);
483
+ return test === null ? depthAbove(loop) + 1 : depthAbove(operationOfResult(test)) + 1;
484
+ };
485
+ const depthOf = (ref) => {
486
+ const key = scopeKeyOf(ref);
487
+ const known = depths.get(key);
488
+ if (known !== undefined)
489
+ return known;
490
+ // A chain that refers back to itself has no containment to measure. It
491
+ // cannot arise from a well-formed program -- a scope does not open inside
492
+ // itself -- but answering 0 keeps a malformed graph from recursing forever,
493
+ // and leaves the affected chain in the order it arrived, which is what it
494
+ // would have had before any of this.
495
+ if (visiting.has(key))
496
+ return 0;
497
+ visiting.add(key);
498
+ const depth = ref.kind === 'loop-latch' ? latchDepth(ref.loop) : depthAbove(openerOf(ref));
499
+ visiting.delete(key);
500
+ depths.set(key, depth);
501
+ return depth;
502
+ };
503
+ for (const chain of perOperation.values()) {
504
+ if (chain.length < 2)
505
+ continue;
506
+ chain.sort((left, right) => depthOf(left) - depthOf(right));
507
+ }
508
+ };
509
+ export const collectConditionalMembership = (graph, operations,
510
+ /** This owner's share of the edge table, in `graph.edges` order; the walk below keeps only edges landing inside `operations` anyway. */
511
+ ownerEdges) => {
512
+ const members = new Set(operations);
513
+ const perOperation = new Map();
514
+ const arms = new Map();
515
+ const predicates = new Map();
516
+ const loopGuards = new Map();
517
+ const tailTests = new Map();
518
+ const latchLoops = new Set();
519
+ // Edge order is the chain order WITHIN one publisher, and the chains are
520
+ // sorted by enclosure once the walk below has collected them -- see
521
+ // `orderChainsByEnclosure`.
522
+ for (const edge of ownerEdges) {
523
+ if (!members.has(edge.to))
524
+ continue;
525
+ if (edge.kind === 'loop') {
526
+ const list = perOperation.get(edge.to) ?? [];
527
+ if (!list.some((ref) => ref.kind === 'loop' && ref.loop === edge.loop)) {
528
+ list.push({ kind: 'loop', loop: edge.loop });
529
+ perOperation.set(edge.to, list);
530
+ }
531
+ continue;
532
+ }
533
+ if (edge.kind === 'loop-latch') {
534
+ latchLoops.add(edge.loop);
535
+ const list = perOperation.get(edge.to) ?? [];
536
+ if (!list.some((ref) => ref.kind === 'loop-latch' && ref.loop === edge.loop)) {
537
+ list.push({ kind: 'loop-latch', loop: edge.loop });
538
+ perOperation.set(edge.to, list);
539
+ }
540
+ continue;
541
+ }
542
+ if (edge.kind === 'region') {
543
+ const list = perOperation.get(edge.to) ?? [];
544
+ if (!list.some((ref) => ref.kind === 'region' && ref.region === edge.region && ref.part === edge.part)) {
545
+ list.push({ kind: 'region', region: edge.region, part: edge.part });
546
+ perOperation.set(edge.to, list);
547
+ }
548
+ continue;
549
+ }
550
+ if (edge.kind !== 'conditional')
551
+ continue;
552
+ const list = perOperation.get(edge.to) ?? [];
553
+ if (!list.some((ref) => ref.kind === 'guard' && ref.guard === edge.guard && ref.takenWhen === edge.takenWhen)) {
554
+ list.push({ kind: 'guard', guard: edge.guard, takenWhen: edge.takenWhen });
555
+ perOperation.set(edge.to, list);
556
+ }
557
+ // `present` and `nullish` are the two arms of a nullish branch, not two
558
+ // more kinds of arm: recording them here as truthy/falsy is what lets one
559
+ // pair of blocks serve both branch shapes, with the predicate carrying the
560
+ // only difference.
561
+ const bucket = arms.get(edge.guard) ?? { truthy: false, falsy: false };
562
+ if (edge.takenWhen === 'truthy' || edge.takenWhen === 'present')
563
+ bucket.truthy = true;
564
+ if (edge.takenWhen === 'falsy' || edge.takenWhen === 'nullish')
565
+ bucket.falsy = true;
566
+ arms.set(edge.guard, bucket);
567
+ if (edge.takenWhen === 'present' || edge.takenWhen === 'nullish')
568
+ predicates.set(edge.guard, 'is-present');
569
+ }
570
+ // `a ?? b` tests presence, and that is a fact of the operator -- not of the
571
+ // edge that happens to gate its right-hand side. When the right side produces
572
+ // no operation of its own (`x ?? 'default'`, whose right side is a constant)
573
+ // there is no conditional edge at all, and reading the predicate only off
574
+ // edges silently leaves the guard a truthiness test: `'' ?? 'default'` would
575
+ // then answer `'default'` where the language answers `''`. So the operator
576
+ // states it directly, for every `??` in this owner, edge or no edge.
577
+ for (const operationId of operations) {
578
+ const operation = graph.operations.get(operationId);
579
+ if (operation?.family !== 'computation' || operation.form !== 'logical' || operation.operator !== '??')
580
+ continue;
581
+ const left = operandOf(operation, 'left');
582
+ if (left?.source.kind === 'result')
583
+ predicates.set(left.source.result, 'is-present');
584
+ }
585
+ // A default parameter initializer's guard is the same fact about a
586
+ // different operation: `reference`/`parameter-value` publishes the raw
587
+ // argument for exactly one reason, testing its presence, and every such
588
+ // operation in this owner needs that predicate whether or not the
589
+ // initializer it guards happens to mint an operation of its own --
590
+ // `function f(x = 0)`'s initializer is a constant, so `gatingEdges` never
591
+ // emits a conditional edge for it at all, the same gap the `??` loop above
592
+ // closes for a constant right-hand side.
593
+ for (const operationId of operations) {
594
+ const operation = graph.operations.get(operationId);
595
+ if (operation?.family !== 'reference' || operation.form !== 'parameter-value')
596
+ continue;
597
+ const result = resultOf(operation, 'value');
598
+ // `is-defined`, not `is-present`. A default runs when the argument was
599
+ // OMITTED, and an omitted argument is `undefined` -- `null` is a value a
600
+ // caller chose, and the language binds it: `f(x = 0)` called `f(null)`
601
+ // binds `null`, not `0` (ECMA-262 8.6.3, which tests `undefined` and
602
+ // nothing else). A nullish test answers the wrong question for every
603
+ // carrier that can hold `null` at all -- a box, and the three-armed union
604
+ // a `T | null` default now derives (`normalize/parameter-slot.ts`) -- and
605
+ // asking the right one costs nothing for the carriers that cannot, where
606
+ // both tests read the same flag.
607
+ if (result)
608
+ predicates.set(result.id, 'is-defined');
609
+ }
610
+ // A binding element's default asks the same question of a different
611
+ // operation: `const { width = 10 } = options` runs its initializer when the
612
+ // EXTRACTION was `undefined`. The `default-value` step names that extraction
613
+ // itself, through its own `extracted` operand, so this is a citation rather
614
+ // than a second opinion about which result is the guard -- and `is-defined`
615
+ // over `is-present` for the reason the parameter loop above gives: `{ a = 1 }`
616
+ // destructuring `{ a: null }` binds `null`, never `1` (ECMA-262 8.6.3 tests
617
+ // `undefined` and nothing else). The `nullish` gating edge `gating.ts` writes
618
+ // would otherwise leave this at `is-present`.
619
+ for (const operationId of operations) {
620
+ const operation = graph.operations.get(operationId);
621
+ if (operation?.family !== 'destructuring' || operation.form !== 'default-value')
622
+ continue;
623
+ const extracted = operandOf(operation, 'extracted');
624
+ if (extracted?.source.kind === 'result')
625
+ predicates.set(extracted.source.result, 'is-defined');
626
+ }
627
+ // A loop's own test is the guard its `condition` operand names. The loop
628
+ // operation states that directly, so reading it is a citation rather than a
629
+ // second opinion -- and the distinction matters because closing a loop-test
630
+ // arm is not like closing an `if`: it ends in a back edge to the header, not
631
+ // a jump forward to a join, so the arm is deliberately registered as no join
632
+ // source at all.
633
+ //
634
+ // Deriving it from the scope chain's *shape* instead -- "a guard sitting
635
+ // directly inside a loop frame, whose own condition was evaluated in that
636
+ // loop" -- cannot tell a loop's test from a guard *inside* a compound
637
+ // condition. In `while (a && b)`, the operations computing `b` run under a
638
+ // guard on `a`; that guard also sits directly inside the loop frame and `a`
639
+ // is also evaluated there, so the shape rule classified BOTH `a` and the
640
+ // `&&`'s own merged result as the loop's test. Two guards then claimed one
641
+ // loop, which `guardOfLoop`'s first-match scan resolved arbitrarily, and
642
+ // `a`'s truthy arm was closed with a back edge -- leaving the merge the `&&`
643
+ // still needs with no join source, so `requireMergeSources` jumped an
644
+ // already-terminated block and the compiler threw. `while (a && b)` is
645
+ // ordinary TypeScript, and it crashed compilation outright.
646
+ //
647
+ // A tail-tested loop states its condition through the identical operand, and
648
+ // is separated here by form alone: its test decides only the back edge, so it
649
+ // is recorded as this loop's tail test and never as a guard anything is
650
+ // inside. Folding it into `loopGuards` would make `while`'s own "the truthy
651
+ // arm is the body" rule apply to a body that is not in any arm.
652
+ for (const operationId of operations) {
653
+ const operation = graph.operations.get(operationId);
654
+ if (operation?.family !== 'control')
655
+ continue;
656
+ if (operation.form !== 'loop' && operation.form !== 'loop-tail')
657
+ continue;
658
+ const condition = operandOf(operation, 'condition', 0);
659
+ if (condition?.source.kind !== 'result')
660
+ continue;
661
+ if (operation.form === 'loop')
662
+ loopGuards.set(condition.source.result, operationId);
663
+ else
664
+ tailTests.set(operationId, condition.source.result);
665
+ }
666
+ const headTests = new Map();
667
+ for (const [test, loop] of loopGuards)
668
+ headTests.set(loop, test);
669
+ orderChainsByEnclosure(perOperation, (loop) => headTests.get(loop) ?? null);
670
+ return {
671
+ requiredScopeOf: (operation) => perOperation.get(operation) ?? [],
672
+ predicateOf: (guard) => predicates.get(guard) ?? 'to-boolean',
673
+ armsOf: (guard) => {
674
+ const bucket = arms.get(guard);
675
+ return { hasTruthy: bucket?.truthy ?? false, hasFalsy: bucket?.falsy ?? false };
676
+ },
677
+ loopOfGuard: (guard) => loopGuards.get(guard) ?? null,
678
+ guardOfLoop: (loop) => {
679
+ for (const [guard, owner] of loopGuards)
680
+ if (owner === loop)
681
+ return guard;
682
+ return null;
683
+ },
684
+ hasLatch: (loop) => latchLoops.has(loop),
685
+ tailTestOf: (loop) => tailTests.get(loop) ?? null
686
+ };
687
+ };