@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,923 @@
1
+ import ts from 'typescript';
2
+ import { operationId, semanticResultId } from '../../../identity/ids.js';
3
+ import { normalCompletion, pureEffects } from '../../model/operands.js';
4
+ import { familyOf, isFieldInitializerBody } from '../census.js';
5
+ import { blocked, mintOperationId, mintResult, operand } from './mint.js';
6
+ import { contributePlainLoop, contributeTailTestedLoop } from './control-loops.js';
7
+ import { resolveExpressionOperand } from './boundary.js';
8
+ import { isDynamicIterationSource, mintIteratorSteps } from './protocol.js';
9
+ import { hasNativeEnumerationCursor, hasNativeIterationCursor, isGeneratorType, valueEdgesInto } from './shared.js';
10
+ const isFunctionLike = (node) => ts.isFunctionDeclaration(node) ||
11
+ ts.isFunctionExpression(node) ||
12
+ ts.isArrowFunction(node) ||
13
+ ts.isMethodDeclaration(node) ||
14
+ ts.isConstructorDeclaration(node) ||
15
+ ts.isGetAccessorDeclaration(node) ||
16
+ ts.isSetAccessorDeclaration(node);
17
+ const isFunctionBoundary = (node) => isFunctionLike(node) || ts.isClassStaticBlockDeclaration(node);
18
+ const isIterationStatement = (node) => ts.isForStatement(node) || ts.isForOfStatement(node) || ts.isForInStatement(node) || ts.isWhileStatement(node) || ts.isDoStatement(node);
19
+ const isWithin = (node, ancestor) => {
20
+ let current = node;
21
+ while (current) {
22
+ if (current === ancestor)
23
+ return true;
24
+ current = current.parent;
25
+ }
26
+ return false;
27
+ };
28
+ const enclosingTryStatement = (node) => {
29
+ let current = node.parent;
30
+ while (current) {
31
+ if (isFunctionBoundary(current))
32
+ return null;
33
+ if (ts.isTryStatement(current))
34
+ return current;
35
+ current = current.parent;
36
+ }
37
+ return null;
38
+ };
39
+ /**
40
+ * The nearest enclosing `finally` that intercepts an abrupt completion
41
+ * starting at `node`, or `null` if none does before the function boundary.
42
+ *
43
+ * A `finally` never intercepts a completion that originates *inside itself*
44
+ * -- that would route a return-inside-finally back onto its own boundary
45
+ * instead of past it -- so the walk skips a `TryStatement` whose
46
+ * `finallyBlock` already contains `node` and keeps looking further out from
47
+ * there. This is what keeps a `return` written inside a `finally` block from
48
+ * being flattened into an ordinary, unremarkable return.
49
+ */
50
+ const nearestInterceptingFinally = (node) => {
51
+ let current = node;
52
+ while (true) {
53
+ const containingTry = enclosingTryStatement(current);
54
+ if (!containingTry)
55
+ return null;
56
+ const insideFinally = containingTry.finallyBlock !== undefined && isWithin(current, containingTry.finallyBlock);
57
+ if (!insideFinally && containingTry.finallyBlock)
58
+ return containingTry.finallyBlock;
59
+ current = containingTry;
60
+ }
61
+ };
62
+ /**
63
+ * The nearest enclosing `catch`/`finally` a `throw` at `node` is routed to.
64
+ *
65
+ * A throw inside a `tryBlock` goes to that try's own `catch` if it has one,
66
+ * else its `finally` if it has one. A throw inside the `catch` clause itself
67
+ * cannot re-target that same catch (there is no recursive self-handling), so
68
+ * it looks only at that try's `finally`. A throw inside the `finally` skips
69
+ * this try entirely -- symmetric with `nearestInterceptingFinally` above.
70
+ */
71
+ const nearestInterceptingHandler = (node) => {
72
+ let current = node;
73
+ while (true) {
74
+ const containingTry = enclosingTryStatement(current);
75
+ if (!containingTry)
76
+ return null;
77
+ const insideFinally = containingTry.finallyBlock !== undefined && isWithin(current, containingTry.finallyBlock);
78
+ const insideCatch = containingTry.catchClause !== undefined && isWithin(current, containingTry.catchClause);
79
+ if (!insideFinally && !insideCatch) {
80
+ if (containingTry.catchClause)
81
+ return { kind: 'catch', node: containingTry.catchClause };
82
+ if (containingTry.finallyBlock)
83
+ return { kind: 'finally', node: containingTry.finallyBlock };
84
+ }
85
+ else if (insideCatch && containingTry.finallyBlock) {
86
+ return { kind: 'finally', node: containingTry.finallyBlock };
87
+ }
88
+ current = containingTry;
89
+ }
90
+ };
91
+ const nearestLabeledStatement = (node, labelText) => {
92
+ let current = node.parent;
93
+ while (current && !isFunctionBoundary(current)) {
94
+ if (ts.isLabeledStatement(current) && current.label.text === labelText)
95
+ return current;
96
+ current = current.parent;
97
+ }
98
+ return null;
99
+ };
100
+ /**
101
+ * Where an unlabelled/labelled `break`/`continue` transfers control, resolved
102
+ * entirely by walking the enclosing syntax that ECMAScript itself defines a
103
+ * label's binding over, then converting the *resolved node* -- never the
104
+ * label's spelling -- into an identity.
105
+ */
106
+ const resolveBreakContinueTarget = (context, node, form) => {
107
+ if (node.label) {
108
+ const labeled = nearestLabeledStatement(node, node.label.text);
109
+ if (!labeled)
110
+ return null;
111
+ if (form === 'continue') {
112
+ // `continue label` re-enters the labelled loop; it never targets the
113
+ // generic label-target boundary below, which only marks "exit past
114
+ // here" and is meaningless as a place to resume iterating from.
115
+ return isIterationStatement(labeled.statement) ? operationId(context.identities.nodeIdOf(labeled.statement), 'control', 0) : null;
116
+ }
117
+ // `break label` over a labelled iteration exits that iteration itself.
118
+ // Naming the loop gives lowering its real exit block directly; a label is
119
+ // not a second runtime control frame around the loop.
120
+ if (isIterationStatement(labeled.statement))
121
+ return operationId(context.identities.nodeIdOf(labeled.statement), 'control', 0);
122
+ return operationId(context.identities.nodeIdOf(labeled), 'boundary', 0);
123
+ }
124
+ let current = node.parent;
125
+ while (current && !isFunctionBoundary(current)) {
126
+ if (form === 'continue' && isIterationStatement(current))
127
+ return operationId(context.identities.nodeIdOf(current), 'control', 0);
128
+ if (form === 'break' && (isIterationStatement(current) || ts.isSwitchStatement(current))) {
129
+ return operationId(context.identities.nodeIdOf(current), 'control', 0);
130
+ }
131
+ current = current.parent;
132
+ }
133
+ return null;
134
+ };
135
+ const blockedContribution = (candidate, reason) => ({
136
+ kind: 'blocked',
137
+ blocker: blocked(candidate.id, 'control', reason, null)
138
+ });
139
+ const contributeBranch = (context, candidate, node) => {
140
+ const guard = resolveExpressionOperand(context, node.expression);
141
+ if (!guard)
142
+ return blockedContribution(candidate, 'no normalized operation identifies the if-condition value');
143
+ const id = mintOperationId(context.ordinals, candidate.id, 'control');
144
+ const operation = {
145
+ family: 'control',
146
+ id,
147
+ form: 'branch',
148
+ caller: candidate.caller,
149
+ operands: [operand('condition', 0, guard.source, guard.type)],
150
+ results: [],
151
+ completion: normalCompletion,
152
+ effects: pureEffects,
153
+ evaluationOrdinal: candidate.evaluationOrdinal
154
+ };
155
+ // Gating the then/else branch's own operations on this guard needs the
156
+ // identities of whatever those branches contain, which this producer -- one
157
+ // candidate at a time -- cannot see; no other producer file exposes a
158
+ // census-to-operation index either. Recorded as a known gap, not modelled.
159
+ return { kind: 'operations', operations: [operation], edges: [] };
160
+ };
161
+ const contributeForOfIn = (context, candidate, node) => {
162
+ const source = resolveExpressionOperand(context, node.expression);
163
+ if (!source)
164
+ return blockedContribution(candidate, 'no normalized operation identifies the for-of/for-in iterated expression value');
165
+ const isForOf = ts.isForOfStatement(node);
166
+ const isAwait = isForOf && node.awaitModifier !== undefined;
167
+ const protocol = isForOf ? (isAwait ? 'async-iterator' : 'iterator') : 'enumerate';
168
+ // A sync `for`-`of` over a source whose iteration is settled before the
169
+ // program runs never needs a dynamic `Symbol.iterator` lookup at all: a
170
+ // plain `T[]` (ECMA-262 23.1.5), a `Set<T>` (24.2.3.10) and a `string`
171
+ // (22.1.3.36) are each a fixed walk over storage already in hand, so this
172
+ // loop lowers as an ordinary head-tested loop over a native
173
+ // `gea::Iterator<T>` cursor (`runtime-helper-key.ts`'s
174
+ // `protocol:iterator:*` claims, `publish.ts`'s
175
+ // `nativeCursorIteratorOf`) instead of the general sync-iterator protocol.
176
+ // `for`-`in` enumerates keys, a different protocol entirely, and `for await`
177
+ // suspends per iteration, which the native cursor has no representation for
178
+ // -- neither qualifies. A `Map` does not qualify either: see
179
+ // `isNativeIterableSetType` for why its `[K, V]` pair has no cursor carrier.
180
+ // `for`-`in` over a native key table takes the identical reshape: its two
181
+ // steps are the same two, the cursor it walks is the same
182
+ // `gea::Iterator<std::string>`, and the only difference is that the storage
183
+ // being walked is the table's key list rather than its elements. A record,
184
+ // a class instance and a named interface/type-alias reshape the identical
185
+ // way, walking a compile-time field-name snapshot instead of a runtime
186
+ // table -- see `hasNativeEnumerationCursor`'s own doc for which receivers
187
+ // qualify and how the one genuinely unsafe sub-case (a host-bound named
188
+ // type) stays caught, downstream, at preflight rather than here.
189
+ const arrayFastPath = isForOf
190
+ ? !isAwait && hasNativeIterationCursor(context, source.type)
191
+ : hasNativeEnumerationCursor(context, source.type);
192
+ const dynamicSource = isDynamicIterationSource(context, source.type);
193
+ const nativeGeneratorSource = isForOf && !isAwait && isGeneratorType(context, source.type);
194
+ // Every general synchronous iterator record needs IteratorClose routing.
195
+ // Native array/string/set cursors keep their storage walk and are never
196
+ // boxed; a typed custom iterable reaches the same protected region through
197
+ // its concrete record carrier, while a genuinely dynamic source keeps its
198
+ // Value carrier.
199
+ const steps = mintIteratorSteps(context, candidate, protocol, { ...source, iterated: node.expression }, {
200
+ includeGetMethod: !arrayFastPath && isForOf && !dynamicSource,
201
+ includeClose: isForOf && !isAwait && (!arrayFastPath || nativeGeneratorSource)
202
+ });
203
+ const id = mintOperationId(context.ordinals, candidate.id, 'control');
204
+ // Every shape but `for await`-`of` reshapes into an ordinary head-tested
205
+ // loop -- the array/enumeration fast path exactly as before, and now the
206
+ // sync general dynamic-protocol path too (a source neither
207
+ // `hasNativeIterationCursor` nor `hasNativeEnumerationCursor` claims a
208
+ // native cursor for): a `'condition'` operand instead of `'iterator-record'`
209
+ // makes the loop structurally indistinguishable, to every downstream
210
+ // generic consumer (`lower-graph.ts`'s guard detection, `lowerControl`'s
211
+ // 'loop' case, `lower-flow.ts`'s back-edge logic), from a plain
212
+ // `while`/counted `for` -- none of those files need to know this loop is
213
+ // iterator-driven, or which of the two protocol shapes drives it.
214
+ // `lower-protocol.ts`'s `lowerProtocol` already lowers `get-iterator` and
215
+ // `next` (value and done) generically for both -- native cursor and real
216
+ // dynamic dispatch alike -- so nothing downstream of this reshape needed
217
+ // to change for the general case to start working; this producer was the
218
+ // one holdout still building the un-lowerable `iterator-record` shape for
219
+ // it. `for await`-`of` alone stays excluded: its `next` can suspend
220
+ // (`canSuspend: protocol === 'async-iterator'`, `protocol.ts`), and this
221
+ // reshape says nothing about how a condition re-tested every iteration
222
+ // interacts with a suspension point -- that question is exactly as
223
+ // unanswered as it was before this change, so it stays the one shape this
224
+ // function still refuses by name, below.
225
+ // `for await`-`of` reshapes identically, and the suspension question that
226
+ // once excluded it is answered rather than dodged: `gea::Promise<V>` is a
227
+ // settled-value box with no job queue, so every `await` this compiler emits
228
+ // is a synchronous read and an async `next()` hands back an already-settled
229
+ // result. There is no suspension point for a re-tested condition to interact
230
+ // WITH. The step still carries `canSuspend` (`protocol.ts`) because that
231
+ // states what the LANGUAGE does, which stays true; what changed is that this
232
+ // runtime's own answer to it is now written down instead of treated as
233
+ // unknown. A port that grows a real job queue must revisit this together
234
+ // with `await`, `Promise::then` and the async-generator `yield` -- all four
235
+ // rest on the one fact, and none of them is separable from the others.
236
+ {
237
+ // The condition is `!done`, recomputed every iteration from `next`'s own
238
+ // 'completion' result. None of get-iterator/next/this negation has a
239
+ // source `ts.Node` of its own, so `gating.ts` gates them by directly
240
+ // reconstructing their fixed operation ids rather than by visiting one.
241
+ // For the sync general path (unlike the fast path) `get-method` is also
242
+ // minted, at protocol ordinal 0 -- `gating.ts`'s own reconstruction does
243
+ // not yet gate that ordinal at all, having only ever needed to gate
244
+ // ordinals 1 (get-iterator) and 2 (next) for the fast path, where
245
+ // ordinal 0 is reserved but never minted. Whether that gap is load-
246
+ // bearing here -- whether an operation this pass never places under any
247
+ // gate still lands in the correct, once-per-loop scope by construction,
248
+ // via its own evaluation edge into get-iterator -- is exactly what
249
+ // landing this reshape on its own is meant to measure, before anyone
250
+ // opens `gating.ts` to widen it.
251
+ const boolType = context.table.intern({ kind: 'primitive', primitive: 'boolean' });
252
+ const negationId = mintOperationId(context.ordinals, candidate.id, 'computation');
253
+ const negationOperand = operand('operand', 0, { kind: 'result', result: semanticResultId(steps.nextOperationId, 'completion') }, boolType);
254
+ const negation = {
255
+ id: negationId,
256
+ family: 'computation',
257
+ caller: candidate.caller,
258
+ form: 'unary',
259
+ operator: '!',
260
+ operands: [negationOperand],
261
+ results: [mintResult(negationId, 'value', boolType)],
262
+ completion: normalCompletion,
263
+ effects: pureEffects,
264
+ evaluationOrdinal: candidate.evaluationOrdinal
265
+ };
266
+ const loopOperation = {
267
+ family: 'control',
268
+ id,
269
+ form: 'loop',
270
+ iteratorClose: steps.closeOperationId,
271
+ caller: candidate.caller,
272
+ operands: [operand('condition', 0, { kind: 'result', result: semanticResultId(negationId, 'value') }, boolType)],
273
+ results: [],
274
+ completion: normalCompletion,
275
+ effects: pureEffects,
276
+ evaluationOrdinal: candidate.evaluationOrdinal
277
+ };
278
+ const edges = [
279
+ ...steps.edges,
280
+ { kind: 'evaluation', from: steps.nextOperationId, to: negationId },
281
+ ...valueEdgesInto(negationId, [negationOperand]),
282
+ { kind: 'evaluation', from: negationId, to: id }
283
+ ];
284
+ return { kind: 'operations', operations: [...steps.operations, negation, loopOperation], edges };
285
+ }
286
+ };
287
+ /**
288
+ * The test one `case` clause performs, named the way every cross-file citation
289
+ * in this compiler is: recomputed from the clause's own node, never looked up.
290
+ *
291
+ * `gating.ts` needs it to gate the clause's statements, and `contributeSwitch`
292
+ * mints it. Neither may guess at the other's spelling.
293
+ */
294
+ export const citeSwitchCaseTest = (clause, identities) => semanticResultId(operationId(identities.nodeIdOf(clause), 'computation', 0), 'value');
295
+ /**
296
+ * The test a GROUP of clauses performs, for the second and later members of one.
297
+ *
298
+ * `case A: case B: body` is one guarded arm whose test is `A || B`, and
299
+ * `contributeSwitch` mints that disjunction as a second computation on the
300
+ * clause that closes it -- ordinal 1, beside the clause's own equality at
301
+ * ordinal 0. A group of one has no disjunction to name; its guard is
302
+ * `citeSwitchCaseTest` above.
303
+ */
304
+ export const citeSwitchGroupTest = (clause, identities) => semanticResultId(operationId(identities.nodeIdOf(clause), 'computation', 1), 'value');
305
+ /**
306
+ * A sufficient proof that evaluation cannot produce a normal completion.
307
+ * ECMA-262 (2025), StatementList and IfStatement evaluation: a block passes
308
+ * through its final completion, and an if can complete normally if either arm
309
+ * can. Unknown forms stay unproven; in particular a nested loop can consume a
310
+ * break, and a finally can override a pending return.
311
+ *
312
+ * Switch guard chains need this completion fact, not the spelling of the final
313
+ * statement. A block wrapping a return and an if whose arms both return cannot
314
+ * fall through any more than a bare return can.
315
+ */
316
+ const alwaysAbrupt = (statement) => {
317
+ if (!statement)
318
+ return false;
319
+ if (ts.isBlock(statement))
320
+ return alwaysAbrupt(statement.statements[statement.statements.length - 1]);
321
+ if (ts.isIfStatement(statement))
322
+ return alwaysAbrupt(statement.thenStatement) && alwaysAbrupt(statement.elseStatement);
323
+ return (ts.isBreakStatement(statement) || ts.isReturnStatement(statement) || ts.isThrowStatement(statement) || ts.isContinueStatement(statement));
324
+ };
325
+ /**
326
+ * Whether a clause cannot complete normally -- so control never falls out of
327
+ * its bottom into the next clause. Asked here to mint the guards and in
328
+ * `gating.ts` to place the bodies, ONE answer for both.
329
+ */
330
+ export const clauseTerminates = (clause) => alwaysAbrupt(clause.statements[clause.statements.length - 1]);
331
+ const contributeSwitch = (context, candidate, node) => {
332
+ const discriminant = resolveExpressionOperand(context, node.expression);
333
+ if (!discriminant)
334
+ return blockedContribution(candidate, 'no normalized operation identifies the switch discriminant value');
335
+ const clauses = node.caseBlock.clauses;
336
+ // A `default` written anywhere but last is legal and means something this
337
+ // chain cannot say: the language tries every `case` first and only then falls
338
+ // back, while a guard chain would take the default's arm the moment it is
339
+ // reached. Refused rather than reordered -- moving it would change which
340
+ // clause a fall-through reaches.
341
+ const defaultIndex = clauses.findIndex((clause) => ts.isDefaultClause(clause));
342
+ if (defaultIndex >= 0 && defaultIndex !== clauses.length - 1) {
343
+ return blockedContribution(candidate, 'a switch whose `default` clause is not the last one has no guard-chain form');
344
+ }
345
+ const id = mintOperationId(context.ordinals, candidate.id, 'control');
346
+ const operation = {
347
+ family: 'control',
348
+ id,
349
+ form: 'switch',
350
+ caller: candidate.caller,
351
+ operands: [operand('discriminant', 0, discriminant.source, discriminant.type)],
352
+ results: [],
353
+ completion: normalCompletion,
354
+ effects: pureEffects,
355
+ evaluationOrdinal: candidate.evaluationOrdinal
356
+ };
357
+ // One strict-equality test per `case`, keyed on the clause's own node so
358
+ // `gating.ts` can name it without this producer publishing an index. Strict
359
+ // by the specification: `CaseClauseIsSelected` is `IsStrictlyEqual`, so this
360
+ // is the identical operation `===` mints and it can neither coerce nor throw.
361
+ const operations = [operation];
362
+ const edges = [];
363
+ const booleanType = context.table.intern({ kind: 'primitive', primitive: 'boolean' });
364
+ // The guard a run of empty clauses has accumulated so far, or `null` outside
365
+ // one. An empty clause continues its group; a clause with statements closes
366
+ // it, and the next one starts a new group of its own.
367
+ let running = null;
368
+ for (const clause of clauses) {
369
+ if (!ts.isCaseClause(clause)) {
370
+ running = null;
371
+ continue;
372
+ }
373
+ const tested = resolveExpressionOperand(context, clause.expression);
374
+ if (!tested)
375
+ return blockedContribution(candidate, 'no normalized operation identifies a switch case expression');
376
+ const testId = operationId(context.identities.nodeIdOf(clause), 'computation', 0);
377
+ const operands = [
378
+ operand('left', 0, discriminant.source, discriminant.type),
379
+ operand('right', 0, tested.source, tested.type)
380
+ ];
381
+ operations.push({
382
+ id: testId,
383
+ family: 'computation',
384
+ caller: candidate.caller,
385
+ form: 'equality',
386
+ operator: '===',
387
+ operands,
388
+ results: [mintResult(testId, 'value', booleanType)],
389
+ completion: normalCompletion,
390
+ effects: pureEffects,
391
+ evaluationOrdinal: candidate.evaluationOrdinal
392
+ });
393
+ edges.push(...valueEdgesInto(testId, operands));
394
+ let guard = semanticResultId(testId, 'value');
395
+ if (running !== null) {
396
+ // CaseClauseIsSelected stops at the first match. Gate the next label
397
+ // and equality on the accumulated guard's falsy arm, then join exactly
398
+ // as source-level || does. This preserves accessor/call effects and TDZ
399
+ // errors without trying to classify a label as safe to evaluate eagerly.
400
+ const foldId = operationId(context.identities.nodeIdOf(clause), 'computation', 1);
401
+ const foldOperands = [
402
+ operand('left', 0, { kind: 'result', result: running }, booleanType),
403
+ operand('right', 0, { kind: 'result', result: guard }, booleanType)
404
+ ];
405
+ operations.push({
406
+ id: foldId,
407
+ family: 'computation',
408
+ caller: candidate.caller,
409
+ form: 'logical',
410
+ operator: '||',
411
+ operands: foldOperands,
412
+ results: [mintResult(foldId, 'value', booleanType)],
413
+ completion: normalCompletion,
414
+ effects: pureEffects,
415
+ evaluationOrdinal: candidate.evaluationOrdinal
416
+ });
417
+ edges.push(...valueEdgesInto(foldId, foldOperands));
418
+ guard = semanticResultId(foldId, 'value');
419
+ }
420
+ // A clause that can FALL THROUGH hands its guard to the next clause the
421
+ // way an empty one does: `case A: body; case B: more` runs `more` when
422
+ // `A` held and `body` completed normally, or when `B` held -- the very
423
+ // `A || B` disjunction the fold above mints, with `body` placed on the
424
+ // guard's own arm by `gating.ts` and a `break` inside it jumping to the
425
+ // switch's exit (`ir/lower-flow.ts`'s `switchExitOf`) past everything
426
+ // the disjunction would otherwise run. Falling into `default` needs no
427
+ // fold at all: the default's own gate is "no test on the chain held", and
428
+ // a guard handed forward is exactly one not on the chain.
429
+ running = clause.statements.length === 0 || !clauseTerminates(clause) ? guard : null;
430
+ }
431
+ return { kind: 'operations', operations, edges };
432
+ };
433
+ const contributeReturn = (context, candidate, node) => {
434
+ let valueOperand;
435
+ if (node.expression) {
436
+ const resolved = resolveExpressionOperand(context, node.expression);
437
+ if (!resolved)
438
+ return blockedContribution(candidate, 'no normalized operation identifies the returned value');
439
+ valueOperand = operand('value', 0, resolved.source, resolved.type);
440
+ }
441
+ else {
442
+ const undefinedType = context.table.intern({ kind: 'primitive', primitive: 'undefined' });
443
+ valueOperand = operand('value', 0, { kind: 'absent' }, undefinedType);
444
+ }
445
+ const id = mintOperationId(context.ordinals, candidate.id, 'control');
446
+ const operation = {
447
+ family: 'control',
448
+ id,
449
+ form: 'return',
450
+ caller: candidate.caller,
451
+ operands: [valueOperand],
452
+ results: [mintResult(id, 'completion', valueOperand.type)],
453
+ completion: { canThrow: false, canReturn: true, canBreak: false, canContinue: false, canSuspend: false },
454
+ effects: pureEffects,
455
+ evaluationOrdinal: candidate.evaluationOrdinal
456
+ };
457
+ const edges = [];
458
+ const finallyBlock = nearestInterceptingFinally(node);
459
+ if (finallyBlock) {
460
+ edges.push({
461
+ kind: 'completion',
462
+ from: id,
463
+ to: operationId(context.identities.nodeIdOf(finallyBlock), 'boundary', 0),
464
+ completion: 'return'
465
+ });
466
+ }
467
+ return { kind: 'operations', operations: [operation], edges };
468
+ };
469
+ /**
470
+ * The return an arrow function's expression body performs.
471
+ *
472
+ * There is no `ReturnStatement` here to normalize: `EvaluateBody` for an
473
+ * `ExpressionBody` *is* a return, so the operation belongs to the body
474
+ * expression's node under the control family, alongside the operation its own
475
+ * family publishes for the value. Leaving it out gives an arrow function that
476
+ * evaluates its body and then returns nothing -- a wrong answer that no later
477
+ * layer can see, because a body with no return looks exactly like a body that
478
+ * completes normally.
479
+ */
480
+ const contributeImplicitReturn = (context, candidate, node) => {
481
+ const resolved = resolveExpressionOperand(context, node);
482
+ if (!resolved)
483
+ return blockedContribution(candidate, 'no normalized operation identifies the value an arrow function body returns');
484
+ const id = mintOperationId(context.ordinals, candidate.id, 'control');
485
+ const operation = {
486
+ family: 'control',
487
+ id,
488
+ form: 'return',
489
+ caller: candidate.caller,
490
+ operands: [operand('value', 0, resolved.source, resolved.type)],
491
+ results: [mintResult(id, 'completion', resolved.type)],
492
+ completion: { canThrow: false, canReturn: true, canBreak: false, canContinue: false, canSuspend: false },
493
+ effects: pureEffects,
494
+ evaluationOrdinal: candidate.evaluationOrdinal
495
+ };
496
+ // Neither a concise body nor a field initializer can sit inside a `try`, so
497
+ // no `finally` can intercept this return: the expression is the whole body.
498
+ return { kind: 'operations', operations: [operation], edges: [] };
499
+ };
500
+ const contributeThrow = (context, candidate, node) => {
501
+ const resolved = resolveExpressionOperand(context, node.expression);
502
+ if (!resolved)
503
+ return blockedContribution(candidate, 'no normalized operation identifies the thrown value');
504
+ const id = mintOperationId(context.ordinals, candidate.id, 'control');
505
+ const operation = {
506
+ family: 'control',
507
+ id,
508
+ form: 'throw',
509
+ caller: candidate.caller,
510
+ operands: [operand('value', 0, resolved.source, resolved.type)],
511
+ results: [mintResult(id, 'completion', resolved.type)],
512
+ completion: { canThrow: true, canReturn: false, canBreak: false, canContinue: false, canSuspend: false },
513
+ effects: pureEffects,
514
+ evaluationOrdinal: candidate.evaluationOrdinal
515
+ };
516
+ const edges = [];
517
+ const handler = nearestInterceptingHandler(node);
518
+ if (handler) {
519
+ const target = operationId(context.identities.nodeIdOf(handler.node), 'boundary', 0);
520
+ edges.push({ kind: 'completion', from: id, to: target, completion: 'throw' });
521
+ }
522
+ return { kind: 'operations', operations: [operation], edges };
523
+ };
524
+ const contributeBreakOrContinue = (context, candidate, node, form) => {
525
+ const id = mintOperationId(context.ordinals, candidate.id, 'control');
526
+ // `break`/`continue` carry no value -- ECMA-262's own completion record has
527
+ // an empty `[[Value]]` for both -- but every downstream consumer that must
528
+ // cite a `SemanticResultId` (the abrupt-edge obligation, the IR jump's own
529
+ // lineage) needs one to point at. An empty `results: []` starved both:
530
+ // `requireLineage` threw before the jump could be built at all, and
531
+ // `buildAbruptEdgeObligations`'s own `primaryResultOf` guard silently
532
+ // skipped the obligation instead of raising it, so a program using
533
+ // `break`/`continue` certified clean while never lowering the exit. The
534
+ // `void`-typed completion result mirrors the `try` control operation just
535
+ // below, which anchors the same way for the same reason and is likewise
536
+ // never materialized as an IR value.
537
+ const voidType = context.table.intern({ kind: 'primitive', primitive: 'void' });
538
+ const operation = {
539
+ family: 'control',
540
+ id,
541
+ form,
542
+ caller: candidate.caller,
543
+ operands: [],
544
+ results: [mintResult(id, 'completion', voidType)],
545
+ completion: {
546
+ canThrow: false,
547
+ canReturn: false,
548
+ canBreak: form === 'break',
549
+ canContinue: form === 'continue',
550
+ canSuspend: false
551
+ },
552
+ effects: pureEffects,
553
+ evaluationOrdinal: candidate.evaluationOrdinal
554
+ };
555
+ // An intercepting `finally` always wins first: any abrupt completion passing
556
+ // through a try-with-finally, `break`/`continue` included, must be given
557
+ // the chance to be overridden before it reaches its ordinary target.
558
+ const finallyBlock = nearestInterceptingFinally(node);
559
+ if (finallyBlock) {
560
+ const to = operationId(context.identities.nodeIdOf(finallyBlock), 'boundary', 0);
561
+ return { kind: 'operations', operations: [operation], edges: [{ kind: 'completion', from: id, to, completion: form }] };
562
+ }
563
+ const target = resolveBreakContinueTarget(context, node, form);
564
+ if (!target)
565
+ return blockedContribution(candidate, `no ${form} target could be resolved; program may not type-check`);
566
+ return { kind: 'operations', operations: [operation], edges: [{ kind: 'completion', from: id, to: target, completion: form }] };
567
+ };
568
+ const contributeLabeled = (context, candidate, node) => {
569
+ const controlId = mintOperationId(context.ordinals, candidate.id, 'control');
570
+ const controlOperation = {
571
+ family: 'control',
572
+ id: controlId,
573
+ form: 'label',
574
+ caller: candidate.caller,
575
+ operands: [],
576
+ results: [],
577
+ completion: normalCompletion,
578
+ effects: pureEffects,
579
+ evaluationOrdinal: candidate.evaluationOrdinal
580
+ };
581
+ // The label-target boundary is a separate operation from the `'label'`
582
+ // control operation above: the former is what `break label;` completion
583
+ // edges actually point at (`resolveBreakContinueTarget`), the latter is the
584
+ // labelled statement's own structural presence in the CFG.
585
+ const targetId = mintOperationId(context.ordinals, candidate.id, 'boundary');
586
+ const targetOperation = {
587
+ family: 'boundary',
588
+ id: targetId,
589
+ boundary: 'label-target',
590
+ caller: candidate.caller,
591
+ operands: [],
592
+ results: [],
593
+ completion: normalCompletion,
594
+ effects: pureEffects,
595
+ evaluationOrdinal: candidate.evaluationOrdinal
596
+ };
597
+ const edges = [];
598
+ const bodyFamily = familyOf(node.statement, context.namespacePaths);
599
+ if (bodyFamily) {
600
+ edges.push({ kind: 'evaluation', from: controlId, to: operationId(context.identities.nodeIdOf(node.statement), bodyFamily, 0) });
601
+ }
602
+ return { kind: 'operations', operations: [controlOperation, targetOperation], edges };
603
+ };
604
+ const contributeTry = (context, candidate, node) => {
605
+ const id = mintOperationId(context.ordinals, candidate.id, 'control');
606
+ const voidType = context.table.intern({ kind: 'primitive', primitive: 'void' });
607
+ const tryOperation = {
608
+ family: 'control',
609
+ id,
610
+ form: 'try',
611
+ caller: candidate.caller,
612
+ operands: [],
613
+ results: [mintResult(id, 'completion', voidType)],
614
+ completion: normalCompletion,
615
+ effects: pureEffects,
616
+ evaluationOrdinal: candidate.evaluationOrdinal
617
+ };
618
+ const operations = [tryOperation];
619
+ const edges = [];
620
+ // Exception routing *into* `catch` is not wired here: each throwing
621
+ // operation inside the try/catch block resolves its own nearest handler via
622
+ // `nearestInterceptingHandler`, because attributing that edge to the `try`
623
+ // operation itself would be false -- the try construct does not itself
624
+ // throw, only the operations nested inside it can. What *is* owed here is
625
+ // the unconditional normal-completion sequencing into `finally`, which runs
626
+ // after try/catch regardless of how either one completes.
627
+ if (node.finallyBlock) {
628
+ const finallyId = operationId(context.identities.nodeIdOf(node.finallyBlock), 'boundary', 0);
629
+ edges.push({ kind: 'evaluation', from: id, to: finallyId });
630
+ if (node.catchClause) {
631
+ const catchId = operationId(context.identities.nodeIdOf(node.catchClause), 'boundary', 0);
632
+ edges.push({ kind: 'evaluation', from: catchId, to: finallyId });
633
+ }
634
+ const finallyOperation = {
635
+ family: 'boundary',
636
+ id: finallyId,
637
+ boundary: 'finally-region',
638
+ caller: candidate.caller,
639
+ operands: [],
640
+ results: [],
641
+ completion: normalCompletion,
642
+ effects: pureEffects,
643
+ evaluationOrdinal: candidate.evaluationOrdinal
644
+ };
645
+ operations.push(finallyOperation);
646
+ }
647
+ return { kind: 'operations', operations, edges };
648
+ };
649
+ const contributeAwait = (context, candidate, node) => {
650
+ const operand_ = resolveExpressionOperand(context, node.expression);
651
+ if (!operand_)
652
+ return blockedContribution(candidate, 'no normalized operation identifies the awaited value');
653
+ const id = mintOperationId(context.ordinals, candidate.id, 'control');
654
+ // The checker already unwraps `Promise<T>` to `T` for the await expression's
655
+ // own type; publishing that is the resolved value, never a fabricated shape.
656
+ const resolvedType = context.types.typeAt(node);
657
+ const operation = {
658
+ family: 'control',
659
+ id,
660
+ form: 'await',
661
+ caller: candidate.caller,
662
+ operands: [operand('operand', 0, operand_.source, operand_.type)],
663
+ results: [mintResult(id, 'value', resolvedType)],
664
+ completion: { canThrow: true, canReturn: false, canBreak: false, canContinue: false, canSuspend: true },
665
+ effects: { ...pureEffects, callsUserCode: true },
666
+ evaluationOrdinal: candidate.evaluationOrdinal
667
+ };
668
+ const resumeId = mintOperationId(context.ordinals, candidate.id, 'boundary');
669
+ const resumeOperation = {
670
+ family: 'boundary',
671
+ id: resumeId,
672
+ boundary: 'async-resume',
673
+ caller: candidate.caller,
674
+ operands: [],
675
+ results: [mintResult(resumeId, 'value', resolvedType)],
676
+ completion: normalCompletion,
677
+ effects: pureEffects,
678
+ evaluationOrdinal: candidate.evaluationOrdinal
679
+ };
680
+ return {
681
+ kind: 'operations',
682
+ operations: [operation, resumeOperation],
683
+ edges: [{ kind: 'completion', from: id, to: resumeId, completion: 'suspend' }]
684
+ };
685
+ };
686
+ const contributeYield = (context, candidate, node) => {
687
+ // `context.types.typeAt(node)` is the checker's type of the YIELD
688
+ // EXPRESSION ITSELF -- ECMA-262 makes that the RESUME channel (what a
689
+ // later `.next(v)` sends back in, 27.5.3.2), not the value handed out. This
690
+ // IS what a consumer of the expression's own value gets (a `const x = yield
691
+ // 1` binds `x` to this, never to what was yielded out) -- so it is what the
692
+ // operation's own `'value'` result is minted with below, exactly the way
693
+ // `contributeAwait`'s suspend operation publishes the resumed value as its
694
+ // own result. A generator with no explicit `Generator<Y, R, N>` annotation
695
+ // leaves this `unknown`/`any`, which `representation/derive.ts` collapses
696
+ // to the cursor's honest "stores nothing" carrier rather than boxing it
697
+ // (see that file's `GeneratorDeclarationPolicy`) -- a read of `x` in such a
698
+ // program refuses downstream, by name, at emission, never here.
699
+ const resumeType = context.types.typeAt(node);
700
+ const operands = [];
701
+ const auxiliaryOperations = [];
702
+ const auxiliaryEdges = [];
703
+ if (node.asteriskToken) {
704
+ if (!node.expression)
705
+ return blockedContribution(candidate, 'yield* with no delegated expression is not valid syntax to model');
706
+ const source = resolveExpressionOperand(context, node.expression);
707
+ if (!source)
708
+ return blockedContribution(candidate, 'no normalized operation identifies the yield* delegated expression value');
709
+ // `yield*` is refused here rather than modelled and refused later. ECMA-262
710
+ // 27.5.3.7 makes delegation a LOOP -- pull a step from the inner iterator,
711
+ // yield it, repeat, forwarding `return`/`throw` -- and this expression
712
+ // position cannot hold a loop, for the same reason a spread's own drain
713
+ // cannot be built in one (`producers/protocol.ts`'s bypass comment). The
714
+ // steps below were being minted and then never lowered, so the program
715
+ // certified against `protocol:iterator:*` keys nothing consumed.
716
+ return blockedContribution(candidate, 'yield* delegates to another iterator, which is a loop over its steps; this expression position has no loop to build one in');
717
+ }
718
+ else if (node.expression) {
719
+ const resolved = resolveExpressionOperand(context, node.expression);
720
+ if (!resolved)
721
+ return blockedContribution(candidate, 'no normalized operation identifies the yielded value');
722
+ // The generator's own element type is a WRITE SET across every `yield`
723
+ // in its body, exactly as `return-bindings.ts` treats every `return`:
724
+ // what this OPERAND contributes is the YIELDED value's type, never the
725
+ // resume channel's -- that is the operation's own RESULT, minted below.
726
+ operands.push(operand('value', 0, resolved.source, resolved.type));
727
+ }
728
+ // A bare `yield;` yields `undefined` (the same fallback `contributeReturn`
729
+ // uses for a bare `return;`) and needs no operand at all: `emit.ts`'s
730
+ // `emitYield` already refuses a null operand rather than inventing one, so
731
+ // nothing here has to intern a placeholder type for it.
732
+ // ECMAScript's `yield` is an EXPRESSION: its value is what the NEXT
733
+ // `next(v)` sends in (ECMA-262 27.5.3.2). This backend's cursor
734
+ // (`gea::Iterator<E, TReturn, TNext>`, runtime/gea_runtime.h) carries a real
735
+ // resume channel now -- `co_yield`'s own awaiter hands back whatever
736
+ // `next(v)`/an abrupt `.return`/`.throw` injected -- so a `yield` whose own
737
+ // value is read is MODELLED here regardless of parent syntax; whether it
738
+ // can actually be RENDERED depends on whether `TNext` resolved to a native
739
+ // carrier for this generator, which `targets/cpp/emit.ts`'s `emitYield`
740
+ // checks and refuses by name if not.
741
+ // An `async function*` yield is ECMA-262 27.6.3.8 AsyncGeneratorYield: it
742
+ // AWAITS the yielded value, then suspends on a queue of pending `next`
743
+ // promises. Both halves are already no-ops in THIS runtime's async model,
744
+ // which is why the shape is rendered as the synchronous yield rather than
745
+ // refused.
746
+ //
747
+ // `gea::Promise<V>` is a settled-value box with no job queue, so every
748
+ // `await` this compiler emits is a synchronous read of an already-computed
749
+ // value and an async function's entire body has run to completion by the
750
+ // time it returns (`runtime/gea_runtime.h`, `Promise<V>`'s own class
751
+ // comment, and `Promise<V>::then`, which runs its callback immediately for
752
+ // the same reason). Under that model AsyncGeneratorYield's await is the
753
+ // identity, and the pending-`next` queue can never have more than the one
754
+ // caller standing at the suspension point -- so an async generator is
755
+ // exactly a synchronous cursor whose element is the awaited yielded type.
756
+ //
757
+ // This is the SAME documented deviation the runtime already ships and the
758
+ // shipping engine already makes (`gea::host::CameraPhotoPromise::then` is
759
+ // literally `return onResolved(photo)`); it is not a new one taken here. A
760
+ // port that grows a real job queue must revisit this together with `await`
761
+ // and `then`, not on its own -- all three rest on the one fact.
762
+ const id = mintOperationId(context.ordinals, candidate.id, 'control');
763
+ // A `yield` written as a whole statement discards its value by definition
764
+ // (ECMAScript never lets an ExpressionStatement's completion be observed),
765
+ // so this mints a `void` result for that shape -- present for `requireLineage`
766
+ // to anchor on (every operation needs one), but `void` is the one
767
+ // representation `ir/build.ts`'s `mintOptionalResult` never turns into an
768
+ // actual IR value, so nothing downstream ever asks this generator for a
769
+ // resume channel it does not use. That matters beyond tidiness: `resumeType`
770
+ // is the checker's type of the yield EXPRESSION, which for the
771
+ // overwhelmingly common unannotated generator is `unknown` -- a real,
772
+ // boxable `dynamic` carrier, not `undefined` -- and minting a result typed
773
+ // with it here would make a completely ordinary discarded `yield x;` start
774
+ // demanding a resume channel this generator never uses, in every program
775
+ // that yields at all. Every other position (bound to a variable, part of a
776
+ // larger expression) really does consume the value, and mints `resumeType`
777
+ // instead -- `targets/cpp/emit.ts`'s `emitYield` is what refuses it, by
778
+ // name, if `TNext` never resolved to a native carrier for this generator.
779
+ const discardedType = context.table.intern({ kind: 'primitive', primitive: 'void' });
780
+ const results = [mintResult(id, 'value', ts.isExpressionStatement(node.parent) ? discardedType : resumeType)];
781
+ const operation = {
782
+ family: 'control',
783
+ id,
784
+ form: 'yield',
785
+ caller: candidate.caller,
786
+ operands,
787
+ results,
788
+ // `yield` can itself throw the value a `generator.throw()` injects, unlike
789
+ // `await`, which only ever resumes with a resolved value or a rejection
790
+ // surfacing at the same site -- this is a real capability, not symmetry
791
+ // for its own sake.
792
+ completion: { canThrow: true, canReturn: false, canBreak: false, canContinue: false, canSuspend: true },
793
+ effects: { ...pureEffects, callsUserCode: true },
794
+ evaluationOrdinal: candidate.evaluationOrdinal
795
+ };
796
+ const resumeId = mintOperationId(context.ordinals, candidate.id, 'boundary');
797
+ const resumeOperation = {
798
+ family: 'boundary',
799
+ id: resumeId,
800
+ boundary: 'generator-resume',
801
+ caller: candidate.caller,
802
+ operands: [],
803
+ results: [mintResult(resumeId, 'value', resumeType), mintResult(resumeId, 'completion', resumeType)],
804
+ // `generator.throw()`/`.return()` make the resume itself abrupt; `.next()`
805
+ // makes it the ordinary value case captured by the `'value'` result above.
806
+ completion: { canThrow: true, canReturn: true, canBreak: false, canContinue: false, canSuspend: false },
807
+ effects: pureEffects,
808
+ evaluationOrdinal: candidate.evaluationOrdinal
809
+ };
810
+ return {
811
+ kind: 'operations',
812
+ operations: [...auxiliaryOperations, operation, resumeOperation],
813
+ edges: [...auxiliaryEdges, { kind: 'completion', from: id, to: resumeId, completion: 'suspend' }]
814
+ };
815
+ };
816
+ /**
817
+ * The return an arrow's concise body performs when that body is itself
818
+ * `await x` or `yield x`.
819
+ *
820
+ * `familiesOf` (`census.ts`) censuses such a node under `'control'` only --
821
+ * publishing a second, colliding operation at the same identity is refused
822
+ * there -- so this one candidate has to produce everything the body needs:
823
+ * the suspend/resume operations `contributeAwait`/`contributeYield` already
824
+ * build, plus the implicit return every other concise body gets from
825
+ * `contributeImplicitReturn`. That function cannot serve this case: it
826
+ * resolves its operand through `resolveExpressionOperand`, which for this
827
+ * node would recompute this exact candidate's own identity and find nothing
828
+ * published there yet -- a self-citation, not a forward reference, because
829
+ * the suspend operation this return needs to cite is minted right here,
830
+ * never independently. The value operand is built directly from the
831
+ * operation just minted instead.
832
+ */
833
+ const contributeConciseSuspendReturn = (context, candidate, node) => {
834
+ const suspended = ts.isAwaitExpression(node) ? contributeAwait(context, candidate, node) : contributeYield(context, candidate, node);
835
+ if (suspended.kind !== 'operations')
836
+ return suspended;
837
+ const suspend = suspended.operations.find((op) => op.family === 'control' && (op.form === 'await' || op.form === 'yield'));
838
+ const value = suspend?.results.find((result) => result.role === 'value');
839
+ if (!suspend || !value)
840
+ return blockedContribution(candidate, 'a concise arrow body suspend published no value result for its implicit return');
841
+ const id = mintOperationId(context.ordinals, candidate.id, 'control');
842
+ const operation = {
843
+ family: 'control',
844
+ id,
845
+ form: 'return',
846
+ caller: candidate.caller,
847
+ operands: [operand('value', 0, { kind: 'result', result: value.id }, value.type)],
848
+ results: [mintResult(id, 'completion', value.type)],
849
+ completion: { canThrow: false, canReturn: true, canBreak: false, canContinue: false, canSuspend: false },
850
+ effects: pureEffects,
851
+ evaluationOrdinal: candidate.evaluationOrdinal
852
+ };
853
+ // As `contributeImplicitReturn` notes: neither a concise body nor a field
854
+ // initializer can sit inside a `try`, so no `finally` can intercept this.
855
+ return { kind: 'operations', operations: [...suspended.operations, operation], edges: suspended.edges };
856
+ };
857
+ const contributeDebugger = (candidate, context) => {
858
+ const id = mintOperationId(context.ordinals, candidate.id, 'control');
859
+ const operation = {
860
+ family: 'control',
861
+ id,
862
+ form: 'debugger',
863
+ caller: candidate.caller,
864
+ operands: [],
865
+ results: [],
866
+ completion: normalCompletion,
867
+ effects: pureEffects,
868
+ evaluationOrdinal: candidate.evaluationOrdinal
869
+ };
870
+ return { kind: 'operations', operations: [operation], edges: [] };
871
+ };
872
+ export const createControlProducer = (context) => {
873
+ const contribute = (candidate) => {
874
+ const node = candidate.node;
875
+ // Checked first: these nodes are censused under the control family *in
876
+ // addition to* their own, so dispatching on syntax kind would route them to
877
+ // whichever statement form happened to match and lose the return entirely.
878
+ if (node.parent && ts.isArrowFunction(node.parent) && node.parent.body === node && !ts.isBlock(node)) {
879
+ // `await x`/`yield x` as the whole body is the one concise-body shape
880
+ // that is *already* `'control'` family on its own: routing it through
881
+ // `contributeImplicitReturn` the way every other concise body goes
882
+ // would have it resolve its own not-yet-published identity. See
883
+ // `contributeConciseSuspendReturn`'s own comment.
884
+ if (ts.isAwaitExpression(node) || ts.isYieldExpression(node)) {
885
+ return contributeConciseSuspendReturn(context, candidate, node);
886
+ }
887
+ return contributeImplicitReturn(context, candidate, node);
888
+ }
889
+ if (isFieldInitializerBody(node))
890
+ return contributeImplicitReturn(context, candidate, node);
891
+ if (ts.isIfStatement(node))
892
+ return contributeBranch(context, candidate, node);
893
+ if (ts.isForOfStatement(node) || ts.isForInStatement(node))
894
+ return contributeForOfIn(context, candidate, node);
895
+ if (ts.isForStatement(node))
896
+ return contributePlainLoop(context, candidate, node.condition);
897
+ if (ts.isWhileStatement(node))
898
+ return contributePlainLoop(context, candidate, node.expression);
899
+ if (ts.isDoStatement(node))
900
+ return contributeTailTestedLoop(context, candidate, node.expression);
901
+ if (ts.isSwitchStatement(node))
902
+ return contributeSwitch(context, candidate, node);
903
+ if (ts.isReturnStatement(node))
904
+ return contributeReturn(context, candidate, node);
905
+ if (ts.isThrowStatement(node))
906
+ return contributeThrow(context, candidate, node);
907
+ if (ts.isTryStatement(node))
908
+ return contributeTry(context, candidate, node);
909
+ if (ts.isBreakOrContinueStatement(node)) {
910
+ return contributeBreakOrContinue(context, candidate, node, ts.isBreakStatement(node) ? 'break' : 'continue');
911
+ }
912
+ if (ts.isLabeledStatement(node))
913
+ return contributeLabeled(context, candidate, node);
914
+ if (ts.isAwaitExpression(node))
915
+ return contributeAwait(context, candidate, node);
916
+ if (ts.isYieldExpression(node))
917
+ return contributeYield(context, candidate, node);
918
+ if (node.kind === ts.SyntaxKind.DebuggerStatement)
919
+ return contributeDebugger(candidate, context);
920
+ return blockedContribution(candidate, 'control census produced a syntax kind this producer does not model');
921
+ };
922
+ return { family: 'control', contribute };
923
+ };