@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,3 @@
1
+ import type { FamilyProducer } from '../contribution.js';
2
+ import type { ProducerContext } from '../producer-context.js';
3
+ export declare const createComputationProducer: (context: ProducerContext) => FamilyProducer;
@@ -0,0 +1,613 @@
1
+ import ts from 'typescript';
2
+ import { operationId, regionId, semanticResultId } from '../../../identity/ids.js';
3
+ import { objectAssignTargetType } from '../derived-expression-type.js';
4
+ import { keptLeftPartTypeOf } from '../logical-result-type.js';
5
+ import { bindingKindOf } from './binding-kind.js';
6
+ import { blocked, mintOperationId, mintResult, operand } from './mint.js';
7
+ import { isAssignmentOperatorKind, logicalAssignmentOperators, sourceForValue, symbolMemberKeyOf, unwrapErased, valueEdgesInto } from './shared.js';
8
+ import { normalCompletion, pureEffects, throwingCompletion } from '../../model/operands.js';
9
+ import { propertyExpressionValueTypeAt } from './properties.js';
10
+ import { objectCreateResultOverride } from './invocations.js';
11
+ const tokenText = (kind) => ts.tokenToString(kind) ?? ts.SyntaxKind[kind];
12
+ /**
13
+ * The operator a compound assignment applies, or `null` for a plain `=`.
14
+ *
15
+ * Derived by dropping the trailing `=` from the token's own spelling: the
16
+ * operator set is the language's, and enumerating it by hand here would be a
17
+ * second list to keep in step with the first.
18
+ */
19
+ const compoundBaseOperator = (kind) => {
20
+ if (kind === ts.SyntaxKind.EqualsToken)
21
+ return null;
22
+ const text = ts.tokenToString(kind);
23
+ return text && text.length > 1 && text.endsWith('=') ? text.slice(0, -1) : null;
24
+ };
25
+ /**
26
+ * The write a compound or plain assignment to a *name* performs.
27
+ *
28
+ * A property target is not handled here: the property family owns that node and
29
+ * publishes the `[[Set]]` itself. Publishing a second write from this side
30
+ * would give one store two authorities.
31
+ */
32
+ const bindingWriteFor = (context, candidate, node, targetExpression, stored = null) => {
33
+ const target = unwrapErased(targetExpression);
34
+ // A namespace-qualified member (`Debug.level = 2`) is a name too -- see
35
+ // `namespace-paths.ts`. The census gave it the `reference` family, so no
36
+ // property family publishes a `[[Set]]` for it: this write is the store.
37
+ const symbol = ts.isIdentifier(target)
38
+ ? context.checker.getSymbolAtLocation(target)
39
+ : ts.isPropertyAccessExpression(target)
40
+ ? (context.namespacePaths.memberSymbolOf(target) ?? undefined)
41
+ : undefined;
42
+ if (!symbol)
43
+ return null;
44
+ const declaration = context.identities.symbolDeclarationId(symbol);
45
+ if (!declaration)
46
+ return null;
47
+ const declarationNode = context.identities.declarationOfSymbol(symbol);
48
+ const { mutable, temporalDeadZone } = declarationNode ? bindingKindOf(declarationNode) : { mutable: true, temporalDeadZone: false };
49
+ // The value stored is the one the computation at ordinal 0 published, which is
50
+ // the sum for `x += 1` and the incremented number for both `x++` and `++x`.
51
+ // Its type is the target's, not the enclosing expression's: `x++` evaluates to
52
+ // the *old* value, and taking that type here would spell the write's slot from
53
+ // the wrong side of the increment.
54
+ const type = context.types.typeAt(target);
55
+ // Which value is stored is the caller's to state, because the two shapes
56
+ // genuinely differ. A compound assignment or an update stores what THIS
57
+ // node's computation published -- the sum, the incremented number -- and
58
+ // predicts that result rather than running the producer. A logical
59
+ // assignment stores the right-hand side's OWN value: its computation is the
60
+ // merge of both branches, and storing that would write the left-hand value
61
+ // back on the branch where the language performs no store at all.
62
+ const value = stored ?? {
63
+ kind: 'result',
64
+ result: semanticResultId(operationId(context.identities.nodeIdOf(node), 'computation', 0), 'value')
65
+ };
66
+ const id = mintOperationId(context.ordinals, context.identities.nodeIdOf(node), 'binding');
67
+ return {
68
+ operation: {
69
+ id,
70
+ family: 'binding',
71
+ action: 'write',
72
+ declaration,
73
+ mutable,
74
+ temporalDeadZone,
75
+ ...(context.commonJsBindings.has(declaration)
76
+ ? {
77
+ commonJs: {
78
+ global: context.commonJsBindings.get(declaration),
79
+ owner: regionId(context.identities.nodeIdOf(node.getSourceFile()), 'module-body')
80
+ }
81
+ }
82
+ : {}),
83
+ caller: candidate.caller,
84
+ operands: [operand('value', 0, value, type)],
85
+ results: [mintResult(id, 'value', type)],
86
+ completion: normalCompletion,
87
+ effects: { ...pureEffects, writesMutableState: true },
88
+ evaluationOrdinal: candidate.evaluationOrdinal
89
+ },
90
+ // A constant right-hand side (`f ??= 'x'`) publishes no result, so there is
91
+ // no value edge to draw -- the operand carries the literal itself, exactly
92
+ // as a plain `=` with a literal does.
93
+ edges: value.kind === 'result' ? [{ kind: 'value', result: value.result, to: id, role: 'value', ordinal: 0 }] : []
94
+ };
95
+ };
96
+ const finishComputation = (context, candidate, node, form, operatorText, operands, completion, effects, extraEdges = []) => {
97
+ const operationIdentity = mintOperationId(context.ordinals, candidate.id, 'computation');
98
+ // A plain `=` evaluates to the value assigned -- `AssignmentExpression :
99
+ // LeftHandSideExpression = AssignmentExpression` completes with the RHS
100
+ // value after PutValue -- which is exactly the `value` operand built above.
101
+ // That operand's type already carries the RHS's contextual type (`typeAt`
102
+ // special-cases an array/object literal onto its contextual type), while
103
+ // asking the checker about the assignment node itself does not: `this.items
104
+ // = []` reports the literal's own fresh type, `never[]`, not the field's
105
+ // element type. Citing the operand here instead of re-deriving the answer
106
+ // is what keeps the two from disagreeing.
107
+ const resultType = (() => {
108
+ if (form === 'conditional') {
109
+ // `ConditionalExpression` evaluates to one of the two branch values
110
+ // themselves. Its physical result therefore comes from the branch
111
+ // operands this operation already cites, including any contextual
112
+ // layout each literal acquired. Asking the checker for the enclosing
113
+ // expression independently can describe a different, pre-contextual
114
+ // pair: BSON's `const root: Document = flag ? [] : {}` reports
115
+ // `never[] | {}` for the expression while each branch is contextually
116
+ // `Document`, and the array branch's value-flow census further proves
117
+ // an array of dynamic elements. Building the merge from the stale
118
+ // expression type asks those actual values to convert into empty
119
+ // literal carriers, reversing the flow.
120
+ //
121
+ // A union of the two cited branch types is exact: only one branch runs,
122
+ // and `deriveUnion` still collapses arms that share a carrier or have a
123
+ // sound widening. This changes no control-flow fact and invents no
124
+ // type; it stops a second checker query from disagreeing with the
125
+ // operation's own operands.
126
+ const branches = operands.filter((candidate) => candidate.role === 'consequent' || candidate.role === 'alternate');
127
+ const first = branches[0];
128
+ const second = branches[1];
129
+ if (!first || !second)
130
+ throw new Error('a conditional computation must carry consequent and alternate operands');
131
+ return first.type === second.type ? first.type : context.table.intern({ kind: 'union', members: [first.type, second.type] });
132
+ }
133
+ if (form === 'binary' &&
134
+ ts.isBinaryExpression(node) &&
135
+ isAssignmentOperatorKind(node.operatorToken.kind) &&
136
+ compoundBaseOperator(node.operatorToken.kind) !== null) {
137
+ // A compound assignment publishes the value it writes back into its
138
+ // target. The target operand is already the flow-narrowed type under
139
+ // which TypeScript admitted the operator, and `bindingWriteFor` uses the
140
+ // same type for the store. The checker's type for the enclosing JS
141
+ // expression can remain `any` even when parameter census proved the
142
+ // target numeric (Three's `hue2rgb`: `t += 1`); publishing that stale
143
+ // outer answer makes the binding write unbox an expression the numeric
144
+ // emitter has already produced as `double`.
145
+ const target = operands[0];
146
+ if (!target)
147
+ throw new Error('a compound assignment computation must carry its target operand');
148
+ return target.type;
149
+ }
150
+ if (form === 'logical' && ts.isBinaryExpression(node) && (operatorText === '||' || operatorText === '??')) {
151
+ // The same rule as the conditional above, for the other merge: `a ?? b`
152
+ // and `a || b` evaluate to the LEFT value when it is kept and the RIGHT
153
+ // value otherwise, so the merge holds the union of the two cited
154
+ // operand types -- the left one less the absences the operator
155
+ // discards, which is `getNonNullableType`, the checker's own
156
+ // half of `a ?? b`'s rule. Applied only where the right operand's
157
+ // cited type is not the checker's own for that node: an operand this
158
+ // compiler re-typed (`links.serialized ??= new Map()`, where the
159
+ // allocation is `Map<any, any>` to the checker and `Map<string,
160
+ // number>` to `typeAt`) is exactly the one the checker's expression
161
+ // type absorbed -- `Map<string, number> | Map<any, any>` subtype-
162
+ // reduces to `Map<any, any>` -- so the expression type describes a
163
+ // value nobody publishes. Elsewhere the checker's answer stands: its
164
+ // `||` also drops falsy LITERALS from the left arm, a narrowing this
165
+ // union would not reproduce, and no operand disagrees with it there.
166
+ const right = operands.find((candidate) => candidate.role === 'right');
167
+ if (right && right.type !== context.types.typeOf(context.checker.getTypeAtLocation(node.right))) {
168
+ const kept = context.types.typeOf(context.checker.getNonNullableType(context.checker.getTypeAtLocation(node.left)));
169
+ return kept === right.type ? kept : context.table.intern({ kind: 'union', members: [kept, right.type] });
170
+ }
171
+ }
172
+ if (form === 'logical' && ts.isBinaryExpression(node) && operatorText === '&&') {
173
+ // `&&` is the same merge as `||` and `??` above and was the one this
174
+ // rule did not cover, so its result alone kept coming from a second
175
+ // checker query at the whole expression -- which is exactly the query
176
+ // that cannot see what the operand censuses proved.
177
+ //
178
+ // Measured on the three.js app: `WebGLPrograms.js`'s `fogExp2: ( !! fog &&
179
+ // fog.isFogExp2 )`. `fog` is `?(Fog|FogExp2)` and `isFogExp2` is
180
+ // declared on only ONE arm, so the checker types the property read
181
+ // `any` (a missing member on a union is an error type, silent in JS)
182
+ // and therefore types the whole `&&` `any`. The member census does NOT
183
+ // agree: it publishes the read as `optional`, having proved the absent
184
+ // arm. The operation's own right operand thus cites `optional` while
185
+ // its result cited `dynamic` -- one expression, two authorities -- and
186
+ // the `dynamic` propagated into the 130-field `parameters` record that
187
+ // every program build copies.
188
+ //
189
+ // The kept half of the left operand is the FALSY arms, not
190
+ // `getNonNullableType`: `&&` discards the truthy ones. Where there are
191
+ // none -- an object-typed guard, `obj && obj.x` -- the expression IS
192
+ // the right operand, and saying so is what keeps a class carrier from
193
+ // being unioned into a numeric answer.
194
+ const right = operands.find((candidate) => candidate.role === 'right');
195
+ if (right && right.type !== context.types.typeOf(context.checker.getTypeAtLocation(node.right))) {
196
+ const keptType = keptLeftPartTypeOf(context.checker, '&&', context.checker.getTypeAtLocation(node.left));
197
+ // An `any`/`unknown` guard keeps an arm that states nothing, and a
198
+ // union built on it states nothing either -- `inferred-logical-result`
199
+ // (`/** @param {*} value */ value && value.isMarker`) is the measured
200
+ // case: this rule fired because the right operand was re-typed, and
201
+ // unioned `dynamic` against it, producing a carrier no producer
202
+ // publishes and losing the program's emission entirely. The rule
203
+ // exists to stop a STALE expression type from overriding PROVEN
204
+ // operand carriers; where the kept half is itself unproven there is
205
+ // nothing to prove with, and the checker's own answer for the
206
+ // expression -- equally unproven, but the one every consumer already
207
+ // agrees on -- stands.
208
+ if (keptType !== null && (keptType.flags & (ts.TypeFlags.Any | ts.TypeFlags.Unknown)) === 0) {
209
+ const kept = context.types.typeOf(keptType);
210
+ return kept === right.type ? kept : context.table.intern({ kind: 'union', members: [kept, right.type] });
211
+ }
212
+ // No falsy arm at all -- an object-typed guard -- means the expression
213
+ // IS the right operand, which is exact and needs no union.
214
+ if (keptType === null)
215
+ return right.type;
216
+ }
217
+ }
218
+ if (form !== 'assignment')
219
+ return context.types.typeAt(node);
220
+ const value = operands[0];
221
+ // The plain-assignment call site always builds exactly one operand, the
222
+ // value assigned -- this is an internal invariant of this file, not a
223
+ // fact about source, so a violation is a producer bug to surface loudly
224
+ // rather than a case to paper over with a fallback answer.
225
+ if (!value)
226
+ throw new Error('a plain assignment computation must carry the value operand it assigns as operand 0');
227
+ return value.type;
228
+ })();
229
+ const operation = {
230
+ id: operationIdentity,
231
+ family: 'computation',
232
+ caller: candidate.caller,
233
+ form,
234
+ operator: operatorText,
235
+ operands,
236
+ results: [mintResult(operationIdentity, 'value', resultType)],
237
+ completion,
238
+ effects,
239
+ // Evaluation position comes from the shared per-caller counter, never
240
+ // from a source offset: the two are not comparable, so an operation
241
+ // ordinalled by offset sorts before every operation ordinalled by count
242
+ // regardless of the order either actually runs in.
243
+ evaluationOrdinal: candidate.evaluationOrdinal
244
+ };
245
+ return { kind: 'operations', operations: [operation], edges: [...valueEdgesInto(operationIdentity, operands), ...extraEdges] };
246
+ };
247
+ /** Coercions that can invoke user-defined `valueOf`/`toString`/`Symbol.toPrimitive` can throw. */
248
+ const coercingEffects = { readsMutableState: false, writesMutableState: false, allocates: false, callsUserCode: true };
249
+ const contributeLogical = (context, candidate, node, kind) => {
250
+ const leftSource = sourceForValue(context, node.left);
251
+ if (leftSource.kind !== 'result') {
252
+ return {
253
+ kind: 'blocked',
254
+ blocker: blocked(candidate.id, 'computation', 'a logical short-circuit guard needs a producible left-hand result; a constant, this, or super guard is not modelled', 'P0')
255
+ };
256
+ }
257
+ const takenWhen = kind === ts.SyntaxKind.AmpersandAmpersandToken ? 'truthy' : kind === ts.SyntaxKind.BarBarToken ? 'falsy' : 'nullish';
258
+ const left = operand('left', 0, leftSource, context.types.typeAt(node.left));
259
+ const right = operand('right', 0, sourceForValue(context, node.right), context.types.typeAt(node.right), {
260
+ kind: 'conditional',
261
+ guard: leftSource.result,
262
+ takenWhen
263
+ });
264
+ // No conditional edge is published here: gating a whole subtree is what the
265
+ // normalization gating pass does, and two producers of the same relation
266
+ // would order one operation's scope chain two ways.
267
+ return finishComputation(context, candidate, node, 'logical', tokenText(kind), [left, right], normalCompletion, pureEffects);
268
+ };
269
+ /**
270
+ * `a &&= b` / `a ||= b` / `a ??= b` -- ECMA-262 13.15.2.
271
+ *
272
+ * Not a read-operate-write, and decomposing it as one would be wrong: the
273
+ * language performs NO store at all on the short-circuiting branch, so a
274
+ * lowering that always wrote would write a value the source leaves untouched
275
+ * (`shared.ts`'s `logicalAssignmentOperators` says exactly this, which is why
276
+ * `isCompoundAssignmentOperator` excludes these three).
277
+ *
278
+ * What it IS, is the plain logical operator plus a conditional store. So it is
279
+ * published as exactly that pair, and nothing new is invented for it:
280
+ *
281
+ * - the value of `a ||= b` is the value of `a || b` -- the left-hand value on
282
+ * the short-circuiting branch, the right-hand one otherwise -- so the
283
+ * computation is `contributeLogical`'s own `'logical'` form under the base
284
+ * operator, with the right operand conditional on the same guard;
285
+ * - the store happens only on the branch that evaluates the right-hand side,
286
+ * and stores THAT value, not the merge. Storing the merge would write the
287
+ * left-hand value back over itself on the other branch -- an observable
288
+ * difference through a setter, and a spurious mutation of a `const`-like
289
+ * cell either way.
290
+ *
291
+ * Placing the store on the right branch is `normalize/gating.ts`'s job, not
292
+ * this producer's: an `OperandEvaluation` says an OPERAND is conditionally
293
+ * evaluated, while which block an OPERATION lands in is decided by the gate
294
+ * walk, from syntax. This states the operand condition; `gating.ts`'s own
295
+ * logical-assignment case gates the `binding` operation to match. The two
296
+ * halves are separate on purpose -- the same split `a?.b()`'s argument
297
+ * subtree needed.
298
+ *
299
+ * Only an identifier target is served here. `bindingWriteFor` returns `null`
300
+ * for anything else, and a property target (`obj.x ??= v`) is the property
301
+ * family's own get-then-set shape rather than this one -- it refuses by name
302
+ * in `producers/properties.ts` until that half is written.
303
+ */
304
+ const contributeLogicalAssignment = (context, candidate, node, kind) => {
305
+ const leftSource = sourceForValue(context, node.left);
306
+ if (leftSource.kind !== 'result') {
307
+ return {
308
+ kind: 'blocked',
309
+ blocker: blocked(candidate.id, 'computation', "a logical assignment short-circuits on its target's own value, and this target publishes no citable result", 'P0')
310
+ };
311
+ }
312
+ const takenWhen = kind === ts.SyntaxKind.AmpersandAmpersandEqualsToken ? 'truthy' : kind === ts.SyntaxKind.BarBarEqualsToken ? 'falsy' : 'nullish';
313
+ const rightSource = sourceForValue(context, node.right);
314
+ const left = operand('left', 0, leftSource, context.types.typeAt(node.left));
315
+ const right = operand('right', 0, rightSource, context.types.typeAt(node.right), {
316
+ kind: 'conditional',
317
+ guard: leftSource.result,
318
+ takenWhen
319
+ });
320
+ // The base operator, deliberately: the emitted merge is `a || b`'s, and
321
+ // spelling it `||=` here would name an operator the computation families
322
+ // downstream have no case for.
323
+ const operatorText = tokenText(kind === ts.SyntaxKind.AmpersandAmpersandEqualsToken
324
+ ? ts.SyntaxKind.AmpersandAmpersandToken
325
+ : kind === ts.SyntaxKind.BarBarEqualsToken
326
+ ? ts.SyntaxKind.BarBarToken
327
+ : ts.SyntaxKind.QuestionQuestionToken);
328
+ const computed = finishComputation(context, candidate, node, 'logical', operatorText, [left, right], throwingCompletion, {
329
+ readsMutableState: true,
330
+ writesMutableState: true,
331
+ allocates: false,
332
+ callsUserCode: true
333
+ });
334
+ if (computed.kind !== 'operations')
335
+ return computed;
336
+ const write = bindingWriteFor(context, candidate, node, node.left, rightSource);
337
+ // A property target publishes no binding write at all: the property family
338
+ // owns that store and publishes it -- gated the same way -- from its own
339
+ // `logical-set` intent. Exactly the division a plain `=` already has.
340
+ if (!write)
341
+ return computed;
342
+ return {
343
+ kind: 'operations',
344
+ operations: [...computed.operations, write.operation],
345
+ edges: [
346
+ ...computed.edges,
347
+ ...write.edges,
348
+ // The store happens only on the branch the operator does not
349
+ // short-circuit on. Stated as an edge, because an edge is what places an
350
+ // OPERATION; `normalize/gating.ts` places the right-hand subtree.
351
+ { kind: 'conditional', guard: leftSource.result, to: write.operation.id, takenWhen }
352
+ ]
353
+ };
354
+ };
355
+ const contributeConditional = (context, candidate, node) => {
356
+ const conditionSource = sourceForValue(context, node.condition);
357
+ if (conditionSource.kind !== 'result') {
358
+ return {
359
+ kind: 'blocked',
360
+ blocker: blocked(candidate.id, 'computation', 'a conditional expression needs a producible condition result to gate its branches; a constant, this, or super condition is not modelled', 'P0')
361
+ };
362
+ }
363
+ const condition = operand('condition', 0, conditionSource, context.types.typeAt(node.condition));
364
+ const branchValueTypeAt = (branch) => ts.isPropertyAccessExpression(branch) || ts.isElementAccessExpression(branch)
365
+ ? propertyExpressionValueTypeAt(context, branch)
366
+ : context.types.typeAt(branch);
367
+ const consequent = operand('consequent', 0, sourceForValue(context, node.whenTrue), branchValueTypeAt(node.whenTrue), {
368
+ kind: 'conditional',
369
+ guard: conditionSource.result,
370
+ takenWhen: 'truthy'
371
+ });
372
+ const alternate = operand('alternate', 0, sourceForValue(context, node.whenFalse), branchValueTypeAt(node.whenFalse), {
373
+ kind: 'conditional',
374
+ guard: conditionSource.result,
375
+ takenWhen: 'falsy'
376
+ });
377
+ return finishComputation(context, candidate, node, 'conditional', '?:', [condition, consequent, alternate], normalCompletion, pureEffects);
378
+ };
379
+ const contributeTemplate = (context, candidate, node) => {
380
+ // The literal text between the substitutions is part of the value, so it is
381
+ // carried as operands rather than left on the syntax node: an IR that has to
382
+ // reach back to the AST to know what a template concatenates is an IR that
383
+ // does not state the computation. They are interleaved in the order the
384
+ // language concatenates them -- head, substitution 0, the text after it, ...
385
+ // -- so the consumer folds the operand list and never has to re-derive the
386
+ // arrangement. An empty chunk is dropped: it contributes nothing, and
387
+ // `` `${a}${b}` `` is full of them.
388
+ const stringType = context.table.intern({ kind: 'primitive', primitive: 'string' });
389
+ const operands = [];
390
+ const chunk = (text, index) => {
391
+ if (text.length === 0)
392
+ return;
393
+ operands.push(operand('chunk', index, { kind: 'constant', text, literal: 'string' }, stringType));
394
+ };
395
+ chunk(node.head.text, 0);
396
+ node.templateSpans.forEach((span, index) => {
397
+ operands.push(operand('substitution', index, sourceForValue(context, span.expression), context.types.typeAt(span.expression)));
398
+ chunk(span.literal.text, index + 1);
399
+ });
400
+ // Each substitution goes through ToString, which can invoke a user-defined
401
+ // `toString`/`Symbol.toPrimitive`, or throw outright for a `symbol`.
402
+ return finishComputation(context, candidate, node, 'template', 'template', operands, throwingCompletion, coercingEffects);
403
+ };
404
+ /** `typeof`/`void`/`delete`: a single operand, form and throwability keyed by the operator keyword. */
405
+ const contributeKeywordUnary = (context, candidate, node, operandExpr, form, operatorText) => {
406
+ const value = operand('operand', 0, sourceForValue(context, operandExpr), context.types.typeAt(operandExpr));
407
+ if (operatorText === 'typeof' || operatorText === 'void') {
408
+ // `typeof` never throws (every reference it inspects is checker-resolved,
409
+ // so the unresolvable-reference exemption never has to fire), and `void`
410
+ // only evaluates and discards.
411
+ return finishComputation(context, candidate, node, form, operatorText, [value], normalCompletion, pureEffects);
412
+ }
413
+ // `delete` can throw in strict-mode code (all TypeScript/ESM code is
414
+ // strict) when the target is a non-configurable own property, and a Proxy
415
+ // `deleteProperty` trap can run arbitrary code.
416
+ return finishComputation(context, candidate, node, form, operatorText, [value], throwingCompletion, {
417
+ readsMutableState: false,
418
+ writesMutableState: true,
419
+ allocates: false,
420
+ callsUserCode: true
421
+ });
422
+ };
423
+ /**
424
+ * `++` and `--`, decomposed the way the language defines them.
425
+ *
426
+ * The language performs three steps: read the target, coerce the old value with
427
+ * ToNumeric, and store old +/- 1. A prefix form evaluates to the stored value; a
428
+ * postfix form evaluates to the *old* one, which is why the coercion is a
429
+ * published operation of its own rather than something folded into the update.
430
+ * Nothing here re-reads the target: the read is whatever the target's own family
431
+ * published -- a name's GetValue, a property's [[Get]] -- exactly as a compound
432
+ * assignment cites it, so both sides of `o.p++` see one read.
433
+ *
434
+ * The increment is minted first, at ordinal 0, because ordinal 0 is the identity
435
+ * every writer already cites as "the value stored": `bindingWriteFor` here and
436
+ * the property family's `get-then-set` both predict it without running this
437
+ * producer. The postfix coercion therefore lands at ordinal 1, and
438
+ * `citeExpressionResult` predicts that same ordinal for a postfix consumer.
439
+ */
440
+ const contributeUpdate = (context, candidate, node) => {
441
+ const postfix = ts.isPostfixUnaryExpression(node);
442
+ const targetSource = sourceForValue(context, node.operand);
443
+ const oldType = context.types.typeAt(node.operand);
444
+ const storedType = postfix ? oldType : context.types.typeAt(node);
445
+ const updateId = mintOperationId(context.ordinals, candidate.id, 'computation');
446
+ const coercionId = postfix ? mintOperationId(context.ordinals, candidate.id, 'computation') : null;
447
+ // ToNumeric can run a user-defined `valueOf`, so the increment reads a value
448
+ // an arbitrary call produced. A prefix form has no separate coercion to cite
449
+ // and folds it into the update, exactly as `x += 1` folds it into the `+`.
450
+ const incrementOperand = coercionId
451
+ ? operand('operand', 0, { kind: 'result', result: semanticResultId(coercionId, 'value') }, oldType)
452
+ : operand('operand', 0, targetSource, oldType);
453
+ const update = {
454
+ id: updateId,
455
+ family: 'computation',
456
+ caller: candidate.caller,
457
+ form: 'update',
458
+ operator: tokenText(node.operator),
459
+ operands: [incrementOperand],
460
+ results: [mintResult(updateId, 'value', storedType)],
461
+ completion: throwingCompletion,
462
+ effects: coercingEffects,
463
+ evaluationOrdinal: candidate.evaluationOrdinal
464
+ };
465
+ const operations = [update];
466
+ const edges = [...valueEdgesInto(updateId, update.operands)];
467
+ if (coercionId) {
468
+ const coercion = {
469
+ id: coercionId,
470
+ family: 'computation',
471
+ caller: candidate.caller,
472
+ form: 'coercion',
473
+ operator: 'ToNumeric',
474
+ operands: [operand('operand', 0, targetSource, oldType)],
475
+ results: [mintResult(coercionId, 'value', context.types.typeAt(node))],
476
+ completion: throwingCompletion,
477
+ effects: coercingEffects,
478
+ evaluationOrdinal: candidate.evaluationOrdinal
479
+ };
480
+ operations.push(coercion);
481
+ edges.push(...valueEdgesInto(coercionId, coercion.operands));
482
+ }
483
+ const write = bindingWriteFor(context, candidate, node, node.operand);
484
+ if (!write)
485
+ return { kind: 'operations', operations, edges };
486
+ return { kind: 'operations', operations: [...operations, write.operation], edges: [...edges, ...write.edges] };
487
+ };
488
+ const contributeUnaryOrUpdate = (context, candidate, node) => {
489
+ if (node.operator === ts.SyntaxKind.PlusPlusToken || node.operator === ts.SyntaxKind.MinusMinusToken) {
490
+ return contributeUpdate(context, candidate, node);
491
+ }
492
+ // Only `PrefixUnaryExpression` reaches here: a `PostfixUnaryExpression`'s
493
+ // operator is always `++`/`--`, handled above.
494
+ const prefix = node;
495
+ const operatorText = tokenText(prefix.operator);
496
+ const value = operand('operand', 0, sourceForValue(context, prefix.operand), context.types.typeAt(prefix.operand));
497
+ if (prefix.operator === ts.SyntaxKind.ExclamationToken) {
498
+ // `!` performs ToBoolean, which never invokes user code and never throws.
499
+ return finishComputation(context, candidate, prefix, 'unary', operatorText, [value], normalCompletion, pureEffects);
500
+ }
501
+ // `+`, `-`, `~`: ToNumeric coercion can invoke a user-defined `valueOf`.
502
+ return finishComputation(context, candidate, prefix, 'unary', operatorText, [value], throwingCompletion, coercingEffects);
503
+ };
504
+ const contributeBinary = (context, candidate, node) => {
505
+ const kind = node.operatorToken.kind;
506
+ if (kind === ts.SyntaxKind.CommaToken) {
507
+ const left = operand('left', 0, sourceForValue(context, node.left), context.types.typeAt(node.left));
508
+ const right = operand('right', 0, sourceForValue(context, node.right), context.types.typeAt(node.right));
509
+ // The comma operator itself never throws; either operand's own operation
510
+ // carries whatever completion evaluating it can produce.
511
+ return finishComputation(context, candidate, node, 'comma', tokenText(kind), [left, right], normalCompletion, pureEffects);
512
+ }
513
+ if (kind === ts.SyntaxKind.AmpersandAmpersandToken ||
514
+ kind === ts.SyntaxKind.BarBarToken ||
515
+ kind === ts.SyntaxKind.QuestionQuestionToken) {
516
+ return contributeLogical(context, candidate, node, kind);
517
+ }
518
+ if (isAssignmentOperatorKind(kind)) {
519
+ if (logicalAssignmentOperators.has(kind))
520
+ return contributeLogicalAssignment(context, candidate, node, kind);
521
+ const compound = compoundBaseOperator(kind);
522
+ // A compound assignment is a read, an operation, and a write -- the same
523
+ // three the language performs, published as the three operations they are.
524
+ // The read is not invented here: the target's own family already publishes
525
+ // it (a name's GetValue, a property's [[Get]]), and this cites it, so the
526
+ // value combined is the same one any other consumer of that target sees.
527
+ const assignedObjectTarget = compound === null ? objectAssignTargetType(context.checker, node.right) : null;
528
+ const createdObjectTarget = compound === null && assignedObjectTarget === null && ts.isCallExpression(node.right)
529
+ ? objectCreateResultOverride(context, node.right, unwrapErased(node.right.expression))
530
+ : null;
531
+ const operands = compound
532
+ ? [
533
+ operand('left', 0, sourceForValue(context, node.left), context.types.typeAt(node.left)),
534
+ operand('right', 0, sourceForValue(context, node.right), context.types.typeAt(node.right))
535
+ ]
536
+ : // Plain `=` never reads the target's old value: it evaluates the target
537
+ // as a Reference and the right-hand side as a value, then performs
538
+ // PutValue. This operation carries the value; the write is published
539
+ // below, or by the property family when the target is a property.
540
+ [
541
+ operand('value', 0, sourceForValue(context, node.right), assignedObjectTarget !== null
542
+ ? context.types.typeOf(assignedObjectTarget)
543
+ : (createdObjectTarget ?? context.types.typeAt(node.right)))
544
+ ];
545
+ const computed = finishComputation(context, candidate, node, compound ? 'binary' : 'assignment', compound ?? tokenText(kind), operands, throwingCompletion, { readsMutableState: compound !== null, writesMutableState: true, allocates: false, callsUserCode: true });
546
+ if (computed.kind !== 'operations')
547
+ return computed;
548
+ const write = bindingWriteFor(context, candidate, node, node.left);
549
+ if (!write)
550
+ return computed;
551
+ return { kind: 'operations', operations: [...computed.operations, write.operation], edges: [...computed.edges, ...write.edges] };
552
+ }
553
+ // `k in o` for a `unique symbol` binding that names one of `o`'s own
554
+ // DECLARED members is compile-time-known exactly as `o[k]` is
555
+ // (`properties.ts`'s `keyOf`/`symbolMemberKeyOf`, whose doc comment states
556
+ // the same distinction): the left operand is the member's static text, not
557
+ // a runtime symbol value, so the census-level `in` obligation
558
+ // (`ir/certify/property-access.ts`'s `hasPropertyRuntimeHelperKey`) can
559
+ // prove presence/absence from the declared field's own presence bit
560
+ // instead of falling to "record(unproven)". A symbol that is NOT a
561
+ // declared member of `o` (an expando the program tests for, `cacheKey in
562
+ // res`) is left exactly as before -- `symbolMemberKeyOf` answers `null` for
563
+ // it, same as it does for `properties.ts`.
564
+ const inKeyType = kind === ts.SyntaxKind.InKeyword ? context.types.typeAt(node.left) : null;
565
+ const inSymbolKey = inKeyType !== null ? symbolMemberKeyOf(context, node.right, inKeyType) : null;
566
+ const left = inSymbolKey !== null
567
+ ? operand('left', 0, { kind: 'constant', text: inSymbolKey, literal: 'string' }, inKeyType)
568
+ : operand('left', 0, sourceForValue(context, node.left), context.types.typeAt(node.left));
569
+ const right = operand('right', 0, sourceForValue(context, node.right), context.types.typeAt(node.right));
570
+ if (kind === ts.SyntaxKind.EqualsEqualsEqualsToken || kind === ts.SyntaxKind.ExclamationEqualsEqualsToken) {
571
+ // Strict (in)equality is `SameValueZero`-like: it never coerces and never
572
+ // invokes user code, so it is the one binary form that provably cannot throw.
573
+ return finishComputation(context, candidate, node, 'equality', tokenText(kind), [left, right], normalCompletion, pureEffects);
574
+ }
575
+ if (kind === ts.SyntaxKind.EqualsEqualsToken || kind === ts.SyntaxKind.ExclamationEqualsToken) {
576
+ // Loose (in)equality can invoke `ToPrimitive` on an object operand.
577
+ return finishComputation(context, candidate, node, 'equality', tokenText(kind), [left, right], throwingCompletion, coercingEffects);
578
+ }
579
+ if (kind === ts.SyntaxKind.InstanceOfKeyword) {
580
+ // Can invoke a user-defined `Symbol.hasInstance`, or throw if the
581
+ // right-hand side is not callable.
582
+ return finishComputation(context, candidate, node, 'instanceof', tokenText(kind), [left, right], throwingCompletion, coercingEffects);
583
+ }
584
+ if (kind === ts.SyntaxKind.InKeyword) {
585
+ // Throws if the right-hand side is not an object; a Proxy `has` trap can
586
+ // run arbitrary code.
587
+ return finishComputation(context, candidate, node, 'in', tokenText(kind), [left, right], throwingCompletion, coercingEffects);
588
+ }
589
+ // Arithmetic, bitwise, shift, and relational operators: `ToNumeric`/
590
+ // `ToPrimitive` coercion can invoke a user-defined `valueOf`/`toString`, or
591
+ // throw on a `BigInt`/`Number` mix.
592
+ return finishComputation(context, candidate, node, 'binary', tokenText(kind), [left, right], throwingCompletion, coercingEffects);
593
+ };
594
+ export const createComputationProducer = (context) => ({
595
+ family: 'computation',
596
+ contribute: (candidate) => {
597
+ const node = candidate.node;
598
+ if (ts.isBinaryExpression(node))
599
+ return contributeBinary(context, candidate, node);
600
+ if (ts.isPrefixUnaryExpression(node) || ts.isPostfixUnaryExpression(node))
601
+ return contributeUnaryOrUpdate(context, candidate, node);
602
+ if (ts.isConditionalExpression(node))
603
+ return contributeConditional(context, candidate, node);
604
+ if (ts.isTemplateExpression(node))
605
+ return contributeTemplate(context, candidate, node);
606
+ if (ts.isTypeOfExpression(node))
607
+ return contributeKeywordUnary(context, candidate, node, node.expression, 'typeof', 'typeof');
608
+ if (ts.isVoidExpression(node))
609
+ return contributeKeywordUnary(context, candidate, node, node.expression, 'unary', 'void');
610
+ // The only remaining census member is `DeleteExpression`.
611
+ return contributeKeywordUnary(context, candidate, node, node.expression, 'unary', 'delete');
612
+ }
613
+ });
@@ -0,0 +1,30 @@
1
+ import ts from 'typescript';
2
+ import { type SemanticOperand } from '../../model/operands.js';
3
+ import type { CensusCandidate } from '../census.js';
4
+ import type { CandidateContribution } from '../contribution.js';
5
+ import type { ProducerContext } from '../producer-context.js';
6
+ export declare const contributeLoopCondition: (context: ProducerContext, candidate: CensusCandidate, condition: ts.Expression | undefined) => CandidateContribution | {
7
+ readonly operand: SemanticOperand | null;
8
+ };
9
+ export declare const contributePlainLoop: (context: ProducerContext, candidate: CensusCandidate, condition: ts.Expression | undefined) => CandidateContribution;
10
+ /**
11
+ * `do { body } while (cond)` -- the one tail-tested loop the language spells.
12
+ *
13
+ * Structurally this is `contributePlainLoop` with the test moved to the other
14
+ * end, and that is the whole of the difference: the same `'condition'` operand
15
+ * naming the same citable result, minted under `'loop-tail'` so every consumer
16
+ * that has to place a block knows which end the test sits at. The body is not
17
+ * gated on the condition at all (`gating.ts` puts it in the loop scope with no
18
+ * guard above it), which is exactly ECMA-262 14.7.2's `DoWhileLoopEvaluation`:
19
+ * the statement runs, and only then is the expression evaluated to decide
20
+ * whether to repeat.
21
+ *
22
+ * A condition that is a compile-time constant publishes no result to cite, so
23
+ * there is nothing for the back edge's branch to test. `while (true)` is the
24
+ * one such loop with a correct shape anyway -- an unconditional back edge --
25
+ * and it reaches this producer with no operand at all, exactly as a head-tested
26
+ * `while (true)` does. Every other constant (`while (false)` most of all) would
27
+ * need a folded exit this loop shape does not build, and is refused by name
28
+ * rather than compiled into a loop that never ends.
29
+ */
30
+ export declare const contributeTailTestedLoop: (context: ProducerContext, candidate: CensusCandidate, condition: ts.Expression) => CandidateContribution;