@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,1452 @@
1
+ import ts from 'typescript';
2
+ import { outermostErasureOf, unwrapErasedExpression } from '../producers/erasure.js';
3
+ import { isGlobalObjectConstructor, isStandardGlobalValue, literalMemberNameOf } from '../derived-expression-type.js';
4
+ import { isAssignmentPattern } from '../assignment-patterns.js';
5
+ import { createPropertyKeyDomains } from '../property-key-domain.js';
6
+ import { isClassSpelledSourceClass } from './model.js';
7
+ import { deferredIntrinsicProtocolLedgerOf } from '../deferred-intrinsic-protocols.js';
8
+ import { invocationValueUsesOf } from './invocation-facts.js';
9
+ import { collectionStoredValuesOf, collectionValueContinuationsOf } from './collection-value-continuation.js';
10
+ import { arrayIterationKeys, computedKeySetOf } from './computed-key-set.js';
11
+ import { classConstructorKeepsInstanceOf } from './member-call-forwarding.js';
12
+ import { nativeArrayProtocolPlanOf } from './native-collection-protocol.js';
13
+ import { originAuthorityIdentity } from './origin-authority.js';
14
+ import { isVacuousOrigin, seededOriginSolver } from './seeded-origins.js';
15
+ import { sourceClassKeyReadPlanOf } from './source-class-data.js';
16
+ import { isModuleExportedDeclaration, isTypePositionReference, resolveFlowSymbolAlias } from './targets.js';
17
+ import { valueLeavesOf } from './value-provenance.js';
18
+ import { enterHypothesisGuard, exitHypothesisGuard, noteHypothesis } from './proof-hypotheses.js';
19
+ const isFieldCell = (key) => !('kind' in key);
20
+ /**
21
+ * The syntax inventory is fixed per flow index, but the protocol and key
22
+ * authorities are the caller's: the deferred intrinsic ledger records a
23
+ * requirement only inside the capture active at the time it is asked. So an
24
+ * inventory is built assuming its protocols, remembers which plans it
25
+ * assumed, and every query discharges them again -- a cached answer can never
26
+ * leave a later capture without the requirement it depends on.
27
+ */
28
+ const namedWrites = new WeakMap();
29
+ const computing = new WeakMap();
30
+ const computingFramesOf = (authority, flow) => {
31
+ const identity = originAuthorityIdentity(authority);
32
+ let byFlow = computing.get(identity);
33
+ if (!byFlow)
34
+ computing.set(identity, (byFlow = new WeakMap()));
35
+ let frames = byFlow.get(flow);
36
+ if (!frames)
37
+ byFlow.set(flow, (frames = []));
38
+ return frames;
39
+ };
40
+ const NO_WRITES = [];
41
+ /** Every element or member write whose receiver is spelled by exactly this expression. */
42
+ const writesNamedBy = (flow, naming) => {
43
+ let inventory = namedWrites.get(flow);
44
+ if (!inventory) {
45
+ inventory = new Map();
46
+ for (const write of flow.allWrites) {
47
+ if (!write.naming || write.slot === 'whole')
48
+ continue;
49
+ const writes = inventory.get(write.naming);
50
+ if (writes)
51
+ writes.push(write);
52
+ else
53
+ inventory.set(write.naming, [write]);
54
+ }
55
+ namedWrites.set(flow, inventory);
56
+ }
57
+ return inventory.get(naming) ?? NO_WRITES;
58
+ };
59
+ const CANONICAL_INDEX = /^(?:0|[1-9]\d*)$/;
60
+ /** A store through a family reference the element walk accounts for. A
61
+ * destructuring target (`[ a[ i ] ] = v`), `for ( a[ i ] of v )`, a compound
62
+ * update or a named member write would otherwise pass as an ordinary read. */
63
+ const namedWriteIsClosed = (write) => {
64
+ const index = write.slot === 'element' || (write.slot === 'member' && write.member !== null && CANONICAL_INDEX.test(write.member));
65
+ switch (write.edge) {
66
+ case 'index-assignment':
67
+ case 'logical-assignment':
68
+ case 'delete':
69
+ return index;
70
+ case 'array-append':
71
+ case 'array-fill':
72
+ case 'spread':
73
+ return true;
74
+ case 'property-assignment':
75
+ return write.slot === 'member' && write.member === 'length';
76
+ default:
77
+ return false;
78
+ }
79
+ };
80
+ const CELL_WRITES = new Set([
81
+ 'declaration-initializer',
82
+ 'identifier-assignment',
83
+ 'logical-assignment',
84
+ 'class-field-initializer',
85
+ 'property-assignment'
86
+ ]);
87
+ const numericType = (checker, expression) => {
88
+ const check = (type) => (type.isUnion() ? type.types.every(check) : (type.flags & ts.TypeFlags.NumberLike) !== 0);
89
+ return check(checker.getTypeAtLocation(expression));
90
+ };
91
+ const arrayTyped = (checker, expression) => {
92
+ const type = checker.getTypeAtLocation(expression);
93
+ return checker.isArrayType(type) || checker.isTupleType(type);
94
+ };
95
+ const isGlobalArray = (checker, expression) => {
96
+ const held = unwrapErasedExpression(expression);
97
+ if (!ts.isIdentifier(held) || held.text !== 'Array')
98
+ return false;
99
+ const symbol = resolveFlowSymbolAlias(checker, checker.getSymbolAtLocation(held));
100
+ return symbol?.valueDeclaration?.getSourceFile().isDeclarationFile === true;
101
+ };
102
+ /** `Array.of( ... )` / `Array.from( ... )` on the intrinsic constructor. Its
103
+ * static members' integrity rides on the same Array protocol requirement: the
104
+ * sealed mutation census taints the constructor's own identity. */
105
+ const isStaticArrayCall = (checker, call, name) => {
106
+ const callee = unwrapErasedExpression(call.expression);
107
+ if (!ts.isPropertyAccessExpression(callee) || callee.name.text !== name || !isGlobalArray(checker, callee.expression))
108
+ return false;
109
+ const member = checker.getSymbolAtLocation(callee.name);
110
+ return ((member?.declarations?.length ?? 0) > 0 && member.declarations.every((declaration) => declaration.getSourceFile().isDeclarationFile));
111
+ };
112
+ const isAssignmentOperator = (kind) => kind >= ts.SyntaxKind.FirstAssignment && kind <= ts.SyntaxKind.LastAssignment;
113
+ const LOGICAL_ASSIGNMENTS = new Set([
114
+ ts.SyntaxKind.BarBarEqualsToken,
115
+ ts.SyntaxKind.AmpersandAmpersandEqualsToken,
116
+ ts.SyntaxKind.QuestionQuestionEqualsToken
117
+ ]);
118
+ const EQUALITY = new Set([
119
+ ts.SyntaxKind.EqualsEqualsEqualsToken,
120
+ ts.SyntaxKind.ExclamationEqualsEqualsToken,
121
+ ts.SyntaxKind.EqualsEqualsToken,
122
+ ts.SyntaxKind.ExclamationEqualsToken
123
+ ]);
124
+ const isUpdate = (node) => (ts.isPrefixUnaryExpression(node) || ts.isPostfixUnaryExpression(node)) &&
125
+ (node.operator === ts.SyntaxKind.PlusPlusToken || node.operator === ts.SyntaxKind.MinusMinusToken);
126
+ /** The class an instance type is an instance of -- never `typeof C`, whose symbol is the same class symbol. */
127
+ const sourceClassOf = (type) => {
128
+ if ((type.flags & ts.TypeFlags.Object) === 0)
129
+ return null;
130
+ const target = (type.objectFlags & ts.ObjectFlags.Reference) !== 0 ? type.target : type;
131
+ if (!target.isClassOrInterface() || (target.objectFlags & ts.ObjectFlags.Class) === 0)
132
+ return null;
133
+ const declaration = target.getSymbol()?.valueDeclaration;
134
+ if (!declaration || (!ts.isClassDeclaration(declaration) && !ts.isClassExpression(declaration)))
135
+ return null;
136
+ return declaration.getSourceFile().isDeclarationFile ? null : declaration;
137
+ };
138
+ const declaredClassTypeOf = (checker, owner) => {
139
+ const symbol = owner.name ? checker.getSymbolAtLocation(owner.name) : checker.getTypeAtLocation(owner).getSymbol();
140
+ const type = symbol && checker.getDeclaredTypeOfSymbol(symbol);
141
+ return type?.isClassOrInterface() ? type : null;
142
+ };
143
+ const keyTextOf = (name) => ts.isIdentifier(name) || ts.isStringLiteralLike(name) || ts.isNumericLiteral(name) ? name.text : null;
144
+ /** Field identity, family and inventory read only the flow index and declared types: one answer per (flow, field declaration). */
145
+ const fieldStates = new WeakMap();
146
+ const fieldStateOf = (flow) => {
147
+ let state = fieldStates.get(flow);
148
+ if (!state)
149
+ fieldStates.set(flow, (state = { cells: new Map(), roots: new Map(), families: new Map(), recorded: new Map() }));
150
+ return state;
151
+ };
152
+ const debugKey = process.env['GEA_ARRAY_FIELD_DEBUG'];
153
+ /** `GEA_ARRAY_FIELD_DEBUG=<key>` or `*`: why a field family did not close, and where. */
154
+ const traceField = (cell, reason, at) => {
155
+ if (debugKey === undefined || (debugKey !== '*' && debugKey !== cell.key))
156
+ return;
157
+ const file = at?.getSourceFile();
158
+ const where = at && file
159
+ ? ` ${file.fileName.split('/').pop()}:${file.getLineAndCharacterOfPosition(at.getStart()).line + 1} ${at.getText().slice(0, 80)}`
160
+ : '';
161
+ console.error(`[ARRAY-FIELD] ${cell.root.name?.text ?? '(anonymous)'}.${cell.key} ${reason}${where}`);
162
+ };
163
+ /** The field cell `key` names on instances of `owner`: keyed by the topmost class on `owner`'s chain that declares it. */
164
+ const fieldCellAt = (checker, flow, owner, key) => {
165
+ let root = owner;
166
+ for (let depth = 0; depth < 64; depth += 1) {
167
+ const type = declaredClassTypeOf(checker, root);
168
+ const base = type ? checker.getBaseTypes(type)[0] : undefined;
169
+ const declaring = base && checker.getPropertyOfType(base, key) ? sourceClassOf(base) : null;
170
+ if (!declaring)
171
+ break;
172
+ root = declaring;
173
+ }
174
+ const rootType = declaredClassTypeOf(checker, root);
175
+ const member = rootType && checker.getPropertyOfType(rootType, key);
176
+ const declaration = member?.valueDeclaration ?? member?.declarations?.[0];
177
+ if (!declaration)
178
+ return null;
179
+ const state = fieldStateOf(flow);
180
+ let cell = state.roots.get(declaration);
181
+ if (!cell)
182
+ state.roots.set(declaration, (cell = { key, root, declaration }));
183
+ return cell;
184
+ };
185
+ const declaredFieldCellOf = (checker, flow, declaration, key) => {
186
+ // A canonical numeric key is an element index, which the element walk owns.
187
+ if (CANONICAL_INDEX.test(key) || key === '__proto__' || key === 'constructor')
188
+ return null;
189
+ // A parameter property's value is a constructor argument, which is no origin this walk enumerates.
190
+ if (ts.isPropertyDeclaration(declaration)) {
191
+ if (ts.isPrivateIdentifier(declaration.name) || (ts.getCombinedModifierFlags(declaration) & ts.ModifierFlags.Static) !== 0)
192
+ return null;
193
+ }
194
+ else if (!ts.isBinaryExpression(declaration) &&
195
+ !ts.isPropertyAccessExpression(declaration) &&
196
+ !ts.isElementAccessExpression(declaration))
197
+ return null;
198
+ const owner = ts.findAncestor(declaration, (node) => ts.isClassDeclaration(node) || ts.isClassExpression(node));
199
+ if (!owner || owner.getSourceFile().isDeclarationFile)
200
+ return null;
201
+ const type = declaredClassTypeOf(checker, owner);
202
+ const member = type && checker.getPropertyOfType(type, key);
203
+ // An instance member of `owner`, not a static or a nested function's expando.
204
+ if (!member?.declarations?.some((entry) => entry === declaration))
205
+ return null;
206
+ return fieldCellAt(checker, flow, owner, key);
207
+ };
208
+ /** The closed family of a field cell, or `null` when some instance is unattributed or some class runs code for the key. */
209
+ const fieldFamilyOf = (checker, flow, cell) => {
210
+ const state = fieldStateOf(flow);
211
+ if (state.families.has(cell))
212
+ return state.families.get(cell);
213
+ const family = computeFieldFamily(checker, flow, cell);
214
+ state.families.set(cell, family);
215
+ if (!family)
216
+ traceField(cell, 'family-not-closed');
217
+ return family;
218
+ };
219
+ const computeFieldFamily = (checker, flow, cell) => {
220
+ const type = declaredClassTypeOf(checker, cell.root);
221
+ // Every member is a `data` class: a method or accessor for the key anywhere
222
+ // on any chain runs code a store or read would reach instead of the slot.
223
+ const plan = type ? sourceClassKeyReadPlanOf(checker, flow, { kind: 'declared', receiver: type }, cell.key) : null;
224
+ if (!plan || !plan.codeFree || plan.needsDefaultPrototype)
225
+ return null;
226
+ const instances = new Map();
227
+ const lineage = new Set();
228
+ for (const [owner, verdict] of plan.classes) {
229
+ const instance = verdict === 'data' ? declaredClassTypeOf(checker, owner) : null;
230
+ if (!instance)
231
+ return null;
232
+ instances.set(owner, instance);
233
+ for (let link = owner, depth = 0; link && !lineage.has(link) && depth < 64; depth += 1) {
234
+ lineage.add(link);
235
+ const declared = declaredClassTypeOf(checker, link);
236
+ const base = declared ? checker.getBaseTypes(declared)[0] : undefined;
237
+ link = base ? sourceClassOf(base) : null;
238
+ }
239
+ }
240
+ return { instances, lineage };
241
+ };
242
+ /** Every non-nullish type a receiver can have is an instance of this family, so its member names this family's cell. */
243
+ const confinedTo = (checker, family, type, depth = 0) => {
244
+ if (depth > 8)
245
+ return false;
246
+ if (type.isUnion())
247
+ return type.types.every((part) => confinedTo(checker, family, part, depth + 1));
248
+ if ((type.flags & (ts.TypeFlags.Null | ts.TypeFlags.Undefined)) !== 0)
249
+ return true;
250
+ if ((type.flags & ts.TypeFlags.TypeParameter) !== 0) {
251
+ const constraint = checker.getBaseConstraintOfType(type);
252
+ return constraint !== undefined && constraint !== type && confinedTo(checker, family, constraint, depth + 1);
253
+ }
254
+ const owner = sourceClassOf(type);
255
+ return owner !== null && family.instances.has(owner);
256
+ };
257
+ /** `o.k` through a receiver confined to the family whose field the checker resolves `k` to. */
258
+ const fieldCellOf = (checker, flow, access, authority) => {
259
+ const key = ts.isPropertyAccessExpression(access) ? (ts.isIdentifier(access.name) ? access.name.text : null) : literalMemberNameOf(access);
260
+ if (key === null)
261
+ return null;
262
+ const declaration = flow.targetOf(access)?.declaration;
263
+ if (declaration) {
264
+ const state = fieldStateOf(flow);
265
+ let cell = state.cells.get(declaration);
266
+ if (cell === undefined)
267
+ state.cells.set(declaration, (cell = declaredFieldCellOf(checker, flow, declaration, key)));
268
+ if (!cell || cell.key !== key)
269
+ return null;
270
+ // `a.k` on `A | B` names two different cells when both declare `k`.
271
+ const family = fieldFamilyOf(checker, flow, cell);
272
+ if (family && confinedTo(checker, family, checker.getTypeAtLocation(access.expression)))
273
+ return cell;
274
+ }
275
+ return provenanceFieldCellOf(checker, flow, access.expression, key, authority);
276
+ };
277
+ /** Every non-nullish part of the type is a source class instance, so the checker has already attributed the value. */
278
+ const classTyped = (type) => (type.isUnion() ? type.types : [type]).every((part) => (part.flags & (ts.TypeFlags.Null | ts.TypeFlags.Undefined)) !== 0 || sourceClassOf(part) !== null);
279
+ /**
280
+ * `o.k` through a receiver the checker cannot confine -- three's JSDoc-less
281
+ * `uploadTexture( textureProperties, texture, slot )` -- when every value that
282
+ * reaches `o` (`valueLeavesOf`) is an instance of one family whose field is `k`.
283
+ */
284
+ const provenanceFieldCellOf = (checker, flow, receiver, key, authority) => {
285
+ if (CANONICAL_INDEX.test(key) || key === '__proto__' || key === 'constructor')
286
+ return null;
287
+ const leaves = valueLeavesOf(flow, receiver, authority, (value) => classTyped(checker.getTypeAtLocation(value)));
288
+ if (!leaves)
289
+ return null;
290
+ let cell = null;
291
+ for (const leaf of leaves) {
292
+ const type = checker.getTypeAtLocation(leaf);
293
+ for (const part of type.isUnion() ? type.types : [type]) {
294
+ if ((part.flags & (ts.TypeFlags.Null | ts.TypeFlags.Undefined)) !== 0)
295
+ continue;
296
+ const owner = sourceClassOf(part);
297
+ const found = owner && fieldCellAt(checker, flow, owner, key);
298
+ if (!found || (cell !== null && found !== cell))
299
+ return null;
300
+ cell = found;
301
+ }
302
+ }
303
+ if (!cell || declaredFieldCellOf(checker, flow, cell.declaration, key) !== cell)
304
+ return null;
305
+ const family = fieldFamilyOf(checker, flow, cell);
306
+ return family && leaves.every((leaf) => confinedTo(checker, family, checker.getTypeAtLocation(leaf))) ? cell : null;
307
+ };
308
+ /** A local, an ES private field, or a public field of a closed family (see `FieldCell`). */
309
+ const cellNamedBy = (checker, flow, expression, authority) => {
310
+ const value = unwrapErasedExpression(expression);
311
+ if (!ts.isIdentifier(value) && !ts.isPropertyAccessExpression(value) && !ts.isElementAccessExpression(value))
312
+ return null;
313
+ const declaration = flow.targetOf(value)?.declaration;
314
+ // `texture.mipmaps` on an `any` receiver resolves no declaration, but its provenance may still name a field.
315
+ if (!declaration)
316
+ return ts.isIdentifier(value) ? null : fieldCellOf(checker, flow, value, authority);
317
+ if (ts.isVariableDeclaration(declaration) && ts.isIdentifier(declaration.name))
318
+ return declaration;
319
+ if (ts.isPropertyDeclaration(declaration) && ts.isPrivateIdentifier(declaration.name))
320
+ return declaration;
321
+ if (ts.isParameter(declaration) && ts.isIdentifier(declaration.name) && !declaration.dotDotDotToken)
322
+ return declaration;
323
+ return ts.isIdentifier(value) ? null : fieldCellOf(checker, flow, value, authority);
324
+ };
325
+ const PRIMITIVE_FLAGS = ts.TypeFlags.StringLike |
326
+ ts.TypeFlags.NumberLike |
327
+ ts.TypeFlags.BigIntLike |
328
+ ts.TypeFlags.BooleanLike |
329
+ ts.TypeFlags.EnumLike |
330
+ ts.TypeFlags.ESSymbolLike |
331
+ ts.TypeFlags.Void |
332
+ ts.TypeFlags.Undefined |
333
+ ts.TypeFlags.Null |
334
+ ts.TypeFlags.Never;
335
+ /**
336
+ * Whether a value of this static type can be a family instance. A source
337
+ * class holds the members it is, or is an ancestor of -- descent is nominal,
338
+ * as everywhere else in this compiler; any other object type holds a member
339
+ * assignable to it; `any`/`unknown` cannot be attributed at all.
340
+ */
341
+ const holdingOfType = (checker, family, type, depth = 0) => {
342
+ if (depth > 8 || (type.flags & (ts.TypeFlags.Any | ts.TypeFlags.Unknown)) !== 0)
343
+ return 'unknown';
344
+ if (type.isUnionOrIntersection()) {
345
+ let held = 'no';
346
+ for (const part of type.types) {
347
+ const answer = holdingOfType(checker, family, part, depth + 1);
348
+ if (answer === 'unknown')
349
+ return answer;
350
+ if (answer === 'may')
351
+ held = answer;
352
+ }
353
+ return held;
354
+ }
355
+ if ((type.flags & ts.TypeFlags.TypeParameter) !== 0) {
356
+ const constraint = checker.getBaseConstraintOfType(type);
357
+ return constraint === undefined || constraint === type ? 'unknown' : holdingOfType(checker, family, constraint, depth + 1);
358
+ }
359
+ if ((type.flags & PRIMITIVE_FLAGS) !== 0)
360
+ return 'no';
361
+ if ((type.flags & (ts.TypeFlags.Object | ts.TypeFlags.NonPrimitive)) === 0)
362
+ return 'unknown';
363
+ const owner = sourceClassOf(type);
364
+ if (owner)
365
+ return family.lineage.has(owner) ? 'may' : 'no';
366
+ return [...family.instances.values()].some((instance) => checker.isTypeAssignableTo(instance, type)) ? 'may' : 'no';
367
+ };
368
+ /**
369
+ * Whether the flow index walked this node: an unused member and a module the
370
+ * program never reaches are not code. The index records every identifier it
371
+ * visits under its symbol, and every `this` under its receiver owner; a node
372
+ * with neither is assumed live.
373
+ */
374
+ const visitedByFlow = (checker, flow, node) => {
375
+ const state = fieldStateOf(flow);
376
+ const recorded = (key, mentions) => {
377
+ let held = state.recorded.get(key);
378
+ if (!held)
379
+ state.recorded.set(key, (held = new Set(mentions())));
380
+ return held;
381
+ };
382
+ const receiverVisited = (receiver) => {
383
+ let branch = receiver;
384
+ for (let owner = receiver.parent; owner; branch = owner, owner = owner.parent) {
385
+ if ((ts.isMethodDeclaration(owner) ||
386
+ ts.isGetAccessorDeclaration(owner) ||
387
+ ts.isSetAccessorDeclaration(owner) ||
388
+ ts.isPropertyDeclaration(owner)) &&
389
+ owner.name === branch)
390
+ continue;
391
+ if ((ts.isFunctionLike(owner) && !ts.isArrowFunction(owner)) ||
392
+ ts.isPropertyDeclaration(owner) ||
393
+ ts.isClassStaticBlockDeclaration(owner)) {
394
+ const frame = owner;
395
+ return recorded(frame, () => flow.receiverReferencesToDeclaration(frame)).has(receiver);
396
+ }
397
+ if (ts.isSourceFile(owner))
398
+ return null;
399
+ }
400
+ return null;
401
+ };
402
+ const probe = (current) => {
403
+ if (current.kind === ts.SyntaxKind.ThisKeyword || current.kind === ts.SyntaxKind.SuperKeyword) {
404
+ const visited = receiverVisited(current);
405
+ return visited === null ? undefined : { visited };
406
+ }
407
+ if (ts.isIdentifier(current)) {
408
+ const symbol = checker.getSymbolAtLocation(current);
409
+ if (symbol)
410
+ return { visited: recorded(symbol, () => flow.memberReferencesToSymbol(symbol)).has(current) };
411
+ }
412
+ return ts.forEachChild(current, probe);
413
+ };
414
+ return probe(node)?.visited ?? true;
415
+ };
416
+ /**
417
+ * The files the flow index walked, closed over their static and literal
418
+ * dynamic imports. Extra files only add mentions `visitedByFlow` then drops.
419
+ */
420
+ const programSyntaxOf = (checker, flow) => {
421
+ const state = fieldStateOf(flow);
422
+ if (state.syntax)
423
+ return state.syntax;
424
+ const files = new Set();
425
+ const queue = [];
426
+ const add = (node) => {
427
+ const file = node?.getSourceFile();
428
+ if (!file || file.isDeclarationFile || files.has(file))
429
+ return;
430
+ files.add(file);
431
+ queue.push(file);
432
+ };
433
+ const follow = (specifier) => {
434
+ if (!specifier || !ts.isStringLiteralLike(specifier))
435
+ return;
436
+ const module = checker.getSymbolAtLocation(specifier)?.valueDeclaration;
437
+ if (module && ts.isSourceFile(module))
438
+ add(module);
439
+ };
440
+ for (const site of flow.calls) {
441
+ add(site.call);
442
+ add(site.checkerDeclaration);
443
+ add(site.inferredDeclaration);
444
+ site.targets.forEach(add);
445
+ const call = site.call;
446
+ if (ts.isCallExpression(call) &&
447
+ (call.expression.kind === ts.SyntaxKind.ImportKeyword || (ts.isIdentifier(call.expression) && call.expression.text === 'require')))
448
+ follow(call.arguments[0]);
449
+ }
450
+ for (const write of flow.allWrites)
451
+ add(write.site);
452
+ for (const owner of flow.classDeclarations)
453
+ add(owner);
454
+ for (const literal of flow.arrayLiterals)
455
+ add(literal);
456
+ for (let file = queue.pop(); file; file = queue.pop())
457
+ for (const statement of file.statements) {
458
+ if (ts.isImportDeclaration(statement) || ts.isExportDeclaration(statement))
459
+ follow(statement.moduleSpecifier);
460
+ else if (ts.isImportEqualsDeclaration(statement) && ts.isExternalModuleReference(statement.moduleReference))
461
+ follow(statement.moduleReference.expression);
462
+ }
463
+ const named = new Map();
464
+ const computed = [];
465
+ const copies = [];
466
+ const name = (key, node) => {
467
+ const list = named.get(key);
468
+ if (list)
469
+ list.push(node);
470
+ else
471
+ named.set(key, [node]);
472
+ };
473
+ const propertyKey = (property, node) => {
474
+ if (!property)
475
+ return;
476
+ if (ts.isComputedPropertyName(property))
477
+ computed.push(node);
478
+ else {
479
+ const key = keyTextOf(property);
480
+ if (key !== null)
481
+ name(key, node);
482
+ }
483
+ };
484
+ const visit = (node) => {
485
+ if (ts.isPropertyAccessExpression(node)) {
486
+ if (ts.isIdentifier(node.name))
487
+ name(node.name.text, node);
488
+ }
489
+ else if (ts.isElementAccessExpression(node)) {
490
+ const key = literalMemberNameOf(node);
491
+ if (key !== null)
492
+ name(key, node);
493
+ else if (!numericType(checker, node.argumentExpression))
494
+ computed.push(node);
495
+ }
496
+ else if (ts.isBindingElement(node) && ts.isObjectBindingPattern(node.parent)) {
497
+ if (node.dotDotDotToken)
498
+ copies.push(node);
499
+ else
500
+ propertyKey(node.propertyName ?? (ts.isIdentifier(node.name) ? node.name : undefined), node);
501
+ }
502
+ else if (ts.isObjectLiteralExpression(node) && isAssignmentPattern(node)) {
503
+ for (const property of node.properties) {
504
+ if (ts.isSpreadAssignment(property))
505
+ copies.push(property);
506
+ else if (ts.isShorthandPropertyAssignment(property))
507
+ name(property.name.text, property);
508
+ else
509
+ propertyKey(property.name, property);
510
+ }
511
+ }
512
+ else if ((ts.isSpreadAssignment(node) && !isAssignmentPattern(node.parent)) || ts.isJsxSpreadAttribute(node))
513
+ copies.push(node);
514
+ ts.forEachChild(node, visit);
515
+ };
516
+ for (const file of files)
517
+ visit(file);
518
+ const syntax = { named, computed, copies };
519
+ state.syntax = syntax;
520
+ return syntax;
521
+ };
522
+ /** `Object.<method>` calls that store or hand out own property values. */
523
+ const OBJECT_TRANSFERS = new Set([
524
+ 'assign',
525
+ 'defineProperty',
526
+ 'defineProperties',
527
+ 'setPrototypeOf',
528
+ 'values',
529
+ 'entries',
530
+ 'getOwnPropertyDescriptor',
531
+ 'getOwnPropertyDescriptors'
532
+ ]);
533
+ /** `Reflect.<method>` calls that store or hand out own property values. */
534
+ const REFLECT_TRANSFERS = new Set(['get', 'set', 'defineProperty', 'setPrototypeOf', 'getOwnPropertyDescriptor']);
535
+ const INERT_GLOBAL_USES = new Set([...EQUALITY, ts.SyntaxKind.InstanceOfKeyword]);
536
+ /**
537
+ * Every direct reflective call that can store or read an own property, and
538
+ * the first mention that hands one of those functions out unnamed
539
+ * (`const { values } = Object`, `const R = Reflect`) -- after which their
540
+ * calls cannot be enumerated.
541
+ */
542
+ const reflectiveCallsOf = (checker, flow) => {
543
+ const state = fieldStateOf(flow);
544
+ if (state.reflective)
545
+ return state.reflective;
546
+ const calls = [];
547
+ const callees = new Set();
548
+ for (const { call } of flow.calls) {
549
+ if (!ts.isCallExpression(call))
550
+ continue;
551
+ const callee = unwrapErasedExpression(call.expression);
552
+ if (!ts.isPropertyAccessExpression(callee) || !ts.isIdentifier(callee.expression))
553
+ continue;
554
+ const method = callee.name.text;
555
+ const owner = callee.expression;
556
+ const reflect = REFLECT_TRANSFERS.has(method) && isStandardGlobalValue(checker, owner, 'Reflect');
557
+ if (!reflect && !(OBJECT_TRANSFERS.has(method) && isGlobalObjectConstructor(checker, owner, checker.getTypeAtLocation(owner))))
558
+ continue;
559
+ calls.push({ call, method, reflect });
560
+ callees.add(callee.name);
561
+ }
562
+ let escaped = null;
563
+ for (const [global, methods] of [
564
+ ['Object', OBJECT_TRANSFERS],
565
+ ['Reflect', REFLECT_TRANSFERS]
566
+ ]) {
567
+ let value = checker.resolveName(global, undefined, ts.SymbolFlags.Value, false);
568
+ if (value && (value.flags & ts.SymbolFlags.Alias) !== 0)
569
+ value = checker.getAliasedSymbol(value);
570
+ if (!value)
571
+ continue;
572
+ for (const reference of flow.memberReferencesToSymbol(value)) {
573
+ const position = outermostErasureOf(reference);
574
+ const parent = position.parent;
575
+ const inert = ((ts.isPropertyAccessExpression(parent) || ts.isCallExpression(parent) || ts.isNewExpression(parent)) &&
576
+ parent.expression === position) ||
577
+ (ts.isBinaryExpression(parent) && INERT_GLOBAL_USES.has(parent.operatorToken.kind));
578
+ if (!inert)
579
+ escaped ??= reference;
580
+ }
581
+ const type = checker.getTypeOfSymbol(value);
582
+ for (const method of methods) {
583
+ const member = checker.getPropertyOfType(type, method);
584
+ if (!member)
585
+ continue;
586
+ for (const reference of flow.memberReferencesToSymbol(member))
587
+ if (!callees.has(reference))
588
+ escaped ??= reference;
589
+ }
590
+ }
591
+ const reflective = { calls, escaped };
592
+ state.reflective = reflective;
593
+ return reflective;
594
+ };
595
+ const authorityProofs = new WeakMap();
596
+ const fieldProofStateOf = (authority, flow) => {
597
+ const identity = originAuthorityIdentity(authority);
598
+ let byFlow = authorityProofs.get(identity);
599
+ if (!byFlow)
600
+ authorityProofs.set(identity, (byFlow = new WeakMap()));
601
+ let state = byFlow.get(flow);
602
+ if (!state)
603
+ byFlow.set(flow, (state = { proving: new Set(), hypotheses: new WeakMap(), provisional: new WeakSet() }));
604
+ return state;
605
+ };
606
+ /** Complete authority identity scopes every cached provenance answer. */
607
+ const authorityFacts = new WeakMap();
608
+ const authorityInventories = new WeakMap();
609
+ const scopedCache = (caches, authority, flow, make) => {
610
+ const identity = originAuthorityIdentity(authority);
611
+ let byFlow = caches.get(identity);
612
+ if (!byFlow)
613
+ caches.set(identity, (byFlow = new WeakMap()));
614
+ let cache = byFlow.get(flow);
615
+ if (!cache)
616
+ byFlow.set(flow, (cache = make()));
617
+ return cache;
618
+ };
619
+ /** Re-asked on every query, like the Array plans: the authority's own check, else the flow's deferred ledger, else refused. */
620
+ const intrinsicHeld = (flow, authority, requirement) => {
621
+ const { intrinsic, member, location } = requirement;
622
+ if (authority.intrinsicIntact)
623
+ return authority.intrinsicIntact(intrinsic, member, location);
624
+ const ledger = deferredIntrinsicProtocolLedgerOf(flow);
625
+ if (!ledger)
626
+ return false;
627
+ // A whole `Array` key requirement is only ever `computedKeySetOf`'s
628
+ // key-iteration ask, which every other path files per key (`arrayIterationKeys`).
629
+ return member === undefined
630
+ ? intrinsic === 'Array'
631
+ ? ledger.requirePrototypeKeys('Array', arrayIterationKeys, location)
632
+ : ledger.require(intrinsic, location)
633
+ : intrinsic === 'Object' && ledger.requireMember(intrinsic, member, location);
634
+ };
635
+ const fieldFactsOf = (checker, flow, cell, authority) => {
636
+ const proof = fieldProofStateOf(authority, flow);
637
+ const cache = scopedCache(authorityFacts, authority, flow, () => new Map());
638
+ if (cache.has(cell)) {
639
+ const cached = cache.get(cell);
640
+ if (cached && cached.requirements.length > 0 && deferredIntrinsicProtocolLedgerOf(flow)?.include(cached.requirements) !== true)
641
+ return null;
642
+ return cached;
643
+ }
644
+ if (proof.proving.has(cell)) {
645
+ const hypothesis = proof.hypotheses.get(cell);
646
+ if (!hypothesis)
647
+ return null;
648
+ for (const other of proof.proving)
649
+ if (other !== cell)
650
+ proof.provisional.add(other);
651
+ return { origins: hypothesis, mentions: [], keyRequirements: [], requirements: [] };
652
+ }
653
+ proof.proving.add(cell);
654
+ try {
655
+ const ledger = deferredIntrinsicProtocolLedgerOf(flow);
656
+ const captured = ledger?.capture(() => {
657
+ const family = fieldFamilyOf(checker, flow, cell);
658
+ return family ? computeFieldFacts(checker, flow, cell, family, authority) : null;
659
+ });
660
+ const result = captured
661
+ ? captured.value
662
+ : (() => {
663
+ const family = fieldFamilyOf(checker, flow, cell);
664
+ return family ? computeFieldFacts(checker, flow, cell, family, authority) : null;
665
+ })();
666
+ const facts = result ? { ...result, requirements: captured?.requirements ?? [] } : null;
667
+ if (facts && facts.requirements.length > 0 && ledger?.include(facts.requirements) !== true)
668
+ return null;
669
+ if (proof.provisional.has(cell))
670
+ proof.provisional.delete(cell);
671
+ else if (facts)
672
+ authority.whenSettled(() => cache.set(cell, facts));
673
+ return facts;
674
+ }
675
+ finally {
676
+ proof.proving.delete(cell);
677
+ proof.hypotheses.delete(cell);
678
+ }
679
+ };
680
+ const KEYED_EDGES = new Set([
681
+ 'index-assignment',
682
+ 'compound-assignment',
683
+ 'logical-assignment',
684
+ 'destructuring',
685
+ 'destructuring-default',
686
+ 'iteration-binding'
687
+ ]);
688
+ /** Named stores whose value is the whole new content of the slot (or, for `||=`, one of its two contents). */
689
+ const FIELD_ORIGIN_EDGES = new Set(['property-assignment', 'logical-assignment', 'index-assignment']);
690
+ /**
691
+ * The origins and aliasing mentions of a family's field, or `null` when some
692
+ * store or read cannot be accounted for.
693
+ *
694
+ * Stores come from the flow index, which prunes unreached code: every named
695
+ * store of the key whose receiver may hold a family instance must be a plain
696
+ * or logical assignment (its value is an origin), and an `any` receiver --
697
+ * which no authority attributes to a family or away from it -- refuses. So do
698
+ * a computed-key store that may spell the key, a prototype replacement, and a
699
+ * reflective store or read. Reads come from `ProgramSyntax`: a destructuring
700
+ * read or an own-property copy refuses, because the alias it makes has no
701
+ * reference this walk can follow; every other mention is returned for the
702
+ * element walk to follow like a local's reference.
703
+ */
704
+ const computeFieldFacts = (checker, flow, cell, family, authority) => {
705
+ const proof = fieldProofStateOf(authority, flow);
706
+ const refuse = (reason, at) => {
707
+ traceField(cell, reason, at);
708
+ return null;
709
+ };
710
+ const keyRequirements = [];
711
+ const typedHolding = (expression) => holdingOfType(checker, family, checker.getTypeAtLocation(expression));
712
+ /** One value `valueLeavesOf` reached: its syntax, its constructor, or another field's own origins sharpen its type. */
713
+ const leafHolding = (leaf) => {
714
+ const typed = typedHolding(leaf);
715
+ if (typed === 'no')
716
+ return typed;
717
+ if (ts.isObjectLiteralExpression(leaf) ||
718
+ ts.isArrayLiteralExpression(leaf) ||
719
+ ts.isFunctionExpression(leaf) ||
720
+ ts.isArrowFunction(leaf) ||
721
+ ts.isClassExpression(leaf) ||
722
+ ts.isRegularExpressionLiteral(leaf))
723
+ return 'no';
724
+ if (ts.isNewExpression(leaf)) {
725
+ const constructed = checker.getTypeAtLocation(leaf);
726
+ const owner = sourceClassOf(constructed);
727
+ if (owner && family.instances.has(owner))
728
+ return 'may';
729
+ // A constructor that keeps its instance returns exactly that non-family object.
730
+ return owner && constructed.isClassOrInterface() && classConstructorKeepsInstanceOf(checker, flow, constructed) ? 'no' : typed;
731
+ }
732
+ // `listeners = this._listeners`: what that field was ever assigned (its facts' complete origins).
733
+ const field = (ts.isPropertyAccessExpression(leaf) || ts.isElementAccessExpression(leaf)) && fieldCellOf(checker, flow, leaf, authority);
734
+ const facts = field ? fieldFactsOf(checker, flow, field, authority) : null;
735
+ if (facts)
736
+ keyRequirements.push(...facts.keyRequirements);
737
+ const held = facts ? holdingOfValues(facts.origins) : 'unknown';
738
+ return held === 'unknown' ? typed : held;
739
+ };
740
+ const holdingOfValues = (expressions) => {
741
+ let held = 'no';
742
+ for (const expression of expressions) {
743
+ const answer = holdingOfValue(expression);
744
+ if (answer === 'unknown')
745
+ return answer;
746
+ if (answer === 'may')
747
+ held = answer;
748
+ }
749
+ return held;
750
+ };
751
+ /**
752
+ * The checker's answer, sharpened by provenance: when every value reaching
753
+ * the expression is enumerable, the expression holds only what they are.
754
+ * An open binding keeps the checker's answer.
755
+ */
756
+ const holdingOfValue = (expression) => {
757
+ if (!expression)
758
+ return 'unknown';
759
+ const typed = typedHolding(expression);
760
+ if (typed === 'no')
761
+ return typed;
762
+ const leaves = valueLeavesOf(flow, expression, authority, (value) => typedHolding(value) === 'no');
763
+ if (!leaves)
764
+ return typed;
765
+ let held = 'no';
766
+ for (const leaf of leaves) {
767
+ const answer = leafHolding(leaf);
768
+ if (answer === 'unknown')
769
+ return typed;
770
+ if (answer === 'may')
771
+ held = answer;
772
+ }
773
+ return held;
774
+ };
775
+ const state = fieldStateOf(flow);
776
+ const keys = (state.keys ??= createPropertyKeyDomains(checker, flow, () => true));
777
+ const keyMayName = (expression) => {
778
+ if (expression === undefined || ts.isSpreadElement(expression))
779
+ return true;
780
+ if (numericType(checker, expression) || !keys.mayName(keys.of(expression), cell.key))
781
+ return false;
782
+ // Three's `setValues`: `this[ key ] = newValue` for `key` of
783
+ // `for ( const key in values )`, a key set the program's own literals close.
784
+ const requirements = keyRequirements;
785
+ const recording = {
786
+ ...authority,
787
+ intrinsicIntact: (intrinsic, member, location) => {
788
+ requirements.push({ intrinsic, member, location });
789
+ return true;
790
+ }
791
+ };
792
+ const names = computedKeySetOf(checker, flow, expression, recording);
793
+ return names === null || names.has(cell.key);
794
+ };
795
+ const origins = [];
796
+ for (const owner of family.instances.keys()) {
797
+ // This walk enumerates the class-element spellings that can write the key
798
+ // -- a parameter property, a field initializer, an accessor. A constructor
799
+ // function has none of them as `ts.ClassElement`; its equivalents are
800
+ // statements in a body this walk does not read, so it cannot state that
801
+ // the key's origins are complete.
802
+ if (!isClassSpelledSourceClass(owner))
803
+ return refuse('constructor-function-member-origins', owner);
804
+ for (const member of owner.members) {
805
+ if (ts.isConstructorDeclaration(member)) {
806
+ const property = member.parameters.find((parameter) => ts.isParameterPropertyDeclaration(parameter, member) && ts.isIdentifier(parameter.name) && parameter.name.text === cell.key);
807
+ if (property)
808
+ return refuse('parameter-property', property);
809
+ continue;
810
+ }
811
+ if (!ts.isPropertyDeclaration(member) || (ts.getCombinedModifierFlags(member) & ts.ModifierFlags.Static) !== 0)
812
+ continue;
813
+ if (ts.isComputedPropertyName(member.name)) {
814
+ if (keyMayName(member.name.expression))
815
+ return refuse('computed-field', member);
816
+ continue;
817
+ }
818
+ if (keyTextOf(member.name) === cell.key && member.initializer)
819
+ origins.push(member.initializer);
820
+ }
821
+ }
822
+ for (const write of flow.allWrites) {
823
+ if (write.slot !== 'member' || (write.member !== cell.key && write.member !== '__proto__'))
824
+ continue;
825
+ // A literal's own initial member, and a binding pattern's READ of its
826
+ // source (walked with the other destructuring reads below).
827
+ if (ts.isPropertyAssignment(write.site) || ts.isShorthandPropertyAssignment(write.site))
828
+ continue;
829
+ if ((write.edge === 'destructuring' || write.edge === 'destructuring-default') && ts.isBindingElement(write.site))
830
+ continue;
831
+ const held = holdingOfValue(write.naming);
832
+ if (held === 'no')
833
+ continue;
834
+ if (held === 'unknown')
835
+ return refuse('unattributed-store', write.site);
836
+ if (write.member === '__proto__')
837
+ return refuse('prototype-store', write.site);
838
+ if (!FIELD_ORIGIN_EDGES.has(write.edge) || write.value === null)
839
+ return refuse(`store-${write.edge}`, write.site);
840
+ origins.push(write.value);
841
+ }
842
+ // Every origin is named; from here on, checks only refuse within this authority.
843
+ proof.hypotheses.set(cell, [...origins]);
844
+ for (const write of flow.allWrites) {
845
+ if (write.slot !== 'element' || !KEYED_EDGES.has(write.edge))
846
+ continue;
847
+ const receiver = write.naming;
848
+ const access = receiver?.parent;
849
+ if (!receiver || !access || !ts.isElementAccessExpression(access) || access.expression !== receiver) {
850
+ if (holdingOfValue(receiver) !== 'no')
851
+ return refuse('keyed-store-unattributed', write.site);
852
+ continue;
853
+ }
854
+ if (keyMayName(access.argumentExpression) && holdingOfValue(receiver) !== 'no')
855
+ return refuse('keyed-store', write.site);
856
+ }
857
+ const syntax = programSyntaxOf(checker, flow);
858
+ /** The value a destructuring pattern element reads from. */
859
+ const patternHolding = (element) => {
860
+ if (ts.isBindingElement(element))
861
+ return holdingOfType(checker, family, checker.getTypeAtLocation(element.parent));
862
+ const pattern = outermostErasureOf(element.parent);
863
+ const assignment = pattern.parent;
864
+ return ts.isBinaryExpression(assignment) && assignment.operatorToken.kind === ts.SyntaxKind.EqualsToken && assignment.left === pattern
865
+ ? holdingOfValue(assignment.right)
866
+ : 'unknown';
867
+ };
868
+ const mentions = [];
869
+ /** `key` is a computed key's expression; an absent one may spell anything. */
870
+ const mention = (node, computed, key) => {
871
+ if (!visitedByFlow(checker, flow, node))
872
+ return true;
873
+ if (computed && !keyMayName(key))
874
+ return true;
875
+ if (ts.isPropertyAccessExpression(node) || ts.isElementAccessExpression(node)) {
876
+ if (holdingOfValue(node.expression) !== 'no')
877
+ mentions.push(node);
878
+ return true;
879
+ }
880
+ if (patternHolding(node) === 'no')
881
+ return true;
882
+ refuse('destructuring-read', node);
883
+ return false;
884
+ };
885
+ for (const node of syntax.named.get(cell.key) ?? [])
886
+ if (!mention(node, false))
887
+ return null;
888
+ for (const node of syntax.computed) {
889
+ const key = ts.isElementAccessExpression(node)
890
+ ? node.argumentExpression
891
+ : ts.isBindingElement(node) && node.propertyName && ts.isComputedPropertyName(node.propertyName)
892
+ ? node.propertyName.expression
893
+ : ts.isPropertyAssignment(node) && ts.isComputedPropertyName(node.name)
894
+ ? node.name.expression
895
+ : undefined;
896
+ if (!mention(node, true, key))
897
+ return null;
898
+ }
899
+ for (const node of syntax.copies) {
900
+ if (!visitedByFlow(checker, flow, node))
901
+ continue;
902
+ const held = ts.isBindingElement(node)
903
+ ? holdingOfType(checker, family, checker.getTypeAtLocation(node.parent))
904
+ : ts.isSpreadAssignment(node) && isAssignmentPattern(node.parent)
905
+ ? patternHolding(node)
906
+ : holdingOfValue(node.expression);
907
+ if (held !== 'no')
908
+ return refuse('own-property-copy', node);
909
+ }
910
+ const reflective = reflectiveCallsOf(checker, flow);
911
+ if (reflective.escaped)
912
+ return refuse('reflective-function-escapes', reflective.escaped);
913
+ /** Only a spread-free literal naming neither the key nor a computed key that may spell it carries no value for it. */
914
+ const literalMayName = (expression) => {
915
+ const literal = expression && unwrapErasedExpression(expression);
916
+ if (!literal || !ts.isObjectLiteralExpression(literal))
917
+ return true;
918
+ return literal.properties.some((property) => {
919
+ if (ts.isSpreadAssignment(property) || !property.name)
920
+ return true;
921
+ if (ts.isComputedPropertyName(property.name))
922
+ return keyMayName(property.name.expression);
923
+ const key = keyTextOf(property.name);
924
+ return key === null || key === cell.key;
925
+ });
926
+ };
927
+ for (const { call, method, reflect } of reflective.calls) {
928
+ const args = call.arguments;
929
+ if (args.some(ts.isSpreadElement)) {
930
+ if (args.some((argument) => ts.isSpreadElement(argument) || holdingOfValue(argument) !== 'no'))
931
+ return refuse('reflective-spread', call);
932
+ continue;
933
+ }
934
+ const [target, key] = args;
935
+ const held = holdingOfValue(target) !== 'no';
936
+ const refused = (() => {
937
+ switch (method) {
938
+ case 'assign':
939
+ // A family source hands its field to the target; a family target takes the source's.
940
+ return args.slice(1).some((source) => holdingOfValue(source) !== 'no') || (held && args.slice(1).some(literalMayName));
941
+ case 'defineProperties':
942
+ return held && literalMayName(key);
943
+ case 'setPrototypeOf':
944
+ case 'values':
945
+ case 'entries':
946
+ case 'getOwnPropertyDescriptors':
947
+ return held;
948
+ case 'set':
949
+ return reflect && (held || (args[3] !== undefined && holdingOfValue(args[3]) !== 'no')) && keyMayName(key);
950
+ default:
951
+ return held && keyMayName(key);
952
+ }
953
+ })();
954
+ if (refused)
955
+ return refuse(`reflective-${method}`, call);
956
+ }
957
+ return { origins, mentions, keyRequirements, requirements: [] };
958
+ };
959
+ const REFUSED = { seed: false, admitted: false, dependencies: [] };
960
+ const VACUOUS = { seed: false, admitted: true, dependencies: [] };
961
+ const SEED = { seed: true, admitted: true, dependencies: [] };
962
+ const through = (dependencies) => ({ seed: false, admitted: true, dependencies });
963
+ const computeInventory = (checker, flow, entry, authority) => {
964
+ const original = unwrapErasedExpression;
965
+ const values = new Set();
966
+ const plans = new Set();
967
+ const keys = new Set();
968
+ const keyRequirements = new Set();
969
+ const requirements = new Set();
970
+ const cells = new Set();
971
+ // Cells whose references, and allocations or map reads whose positions,
972
+ // still need their uses classified. Grows while it is drained: adopting an
973
+ // alias cell expands that cell's own origins.
974
+ const pending = [];
975
+ let anchor = null;
976
+ const assume = (plan) => {
977
+ plans.add(plan);
978
+ return true;
979
+ };
980
+ const obligations = (inventory) => {
981
+ for (const plan of inventory.plans)
982
+ plans.add(plan);
983
+ for (const key of inventory.keys)
984
+ keys.add(key);
985
+ for (const requirement of inventory.keyRequirements)
986
+ keyRequirements.add(requirement);
987
+ for (const requirement of inventory.requirements)
988
+ requirements.add(requirement);
989
+ };
990
+ // A copy (`slice`, `concat`, `Array.from`, a literal spread) is a fresh
991
+ // allocation holding what its source held. A copy of a cell this family
992
+ // already holds -- three's `this.mipmaps = source.mipmaps.slice( 0 )` --
993
+ // holds nothing the family does not: every store into that cell is already
994
+ // in this inventory. Any other source is proven on its own.
995
+ const copied = (source) => {
996
+ const cell = cellNamedBy(checker, flow, source, authority);
997
+ if (cell !== null && cells.has(cell))
998
+ return true;
999
+ const inventory = inventoryOf(checker, flow, source, authority);
1000
+ if (!inventory)
1001
+ return false;
1002
+ obligations(inventory);
1003
+ for (const value of inventory.values)
1004
+ values.add(value);
1005
+ return true;
1006
+ };
1007
+ const seed = (allocation, stored) => {
1008
+ for (const value of stored)
1009
+ values.add(value);
1010
+ if (anchor === null && arrayTyped(checker, allocation))
1011
+ anchor = allocation;
1012
+ pending.push(allocation);
1013
+ return SEED;
1014
+ };
1015
+ const expand = (node) => {
1016
+ if (isFieldCell(node)) {
1017
+ const facts = fieldFactsOf(checker, flow, node, authority);
1018
+ if (!facts || facts.origins.length === 0)
1019
+ return REFUSED;
1020
+ for (const requirement of facts.keyRequirements)
1021
+ keyRequirements.add(requirement);
1022
+ for (const requirement of facts.requirements)
1023
+ requirements.add(requirement);
1024
+ cells.add(node);
1025
+ pending.push(node);
1026
+ return through(facts.origins.map(original));
1027
+ }
1028
+ if (ts.isVariableDeclaration(node) || ts.isPropertyDeclaration(node)) {
1029
+ if (isModuleExportedDeclaration(checker, node, checker.getSymbolAtLocation(node.name) ?? null))
1030
+ return REFUSED;
1031
+ const writes = flow.writesToDeclaration(node).filter((write) => write.slot === 'whole');
1032
+ if (!writes.every((write) => write.value !== null && CELL_WRITES.has(write.edge)))
1033
+ return REFUSED;
1034
+ const origins = writes.map((write) => original(write.value));
1035
+ // A private name is not an expression the index can target, so a
1036
+ // `#items = []` initializer reaches no declaration there; read it here.
1037
+ if (ts.isPropertyDeclaration(node) && node.initializer && !writes.some((write) => write.value === node.initializer))
1038
+ origins.push(original(node.initializer));
1039
+ if (origins.length === 0)
1040
+ return REFUSED;
1041
+ cells.add(node);
1042
+ pending.push(node);
1043
+ return through(origins);
1044
+ }
1045
+ if (ts.isParameter(node)) {
1046
+ const values = authority.parameterValuesOf(node);
1047
+ if (!values)
1048
+ return REFUSED;
1049
+ // No call binds it, so it never holds an array.
1050
+ if (values.length === 0)
1051
+ return VACUOUS;
1052
+ cells.add(node);
1053
+ pending.push(node);
1054
+ return through(values.map(original));
1055
+ }
1056
+ const value = node;
1057
+ if (isVacuousOrigin(flow, value))
1058
+ return VACUOUS;
1059
+ if (ts.isConditionalExpression(value))
1060
+ return through([original(value.whenTrue), original(value.whenFalse)]);
1061
+ if (ts.isBinaryExpression(value) &&
1062
+ (value.operatorToken.kind === ts.SyntaxKind.BarBarToken || value.operatorToken.kind === ts.SyntaxKind.QuestionQuestionToken))
1063
+ return through([original(value.left), original(value.right)]);
1064
+ const cell = cellNamedBy(checker, flow, value, authority);
1065
+ if (cell)
1066
+ return through([cell]);
1067
+ if (ts.isArrayLiteralExpression(value)) {
1068
+ const stored = [];
1069
+ for (const element of value.elements) {
1070
+ if (ts.isOmittedExpression(element))
1071
+ continue;
1072
+ if (ts.isSpreadElement(element)) {
1073
+ if (!copied(element.expression))
1074
+ return REFUSED;
1075
+ continue;
1076
+ }
1077
+ stored.push(element);
1078
+ }
1079
+ return seed(value, stored);
1080
+ }
1081
+ if ((ts.isNewExpression(value) || ts.isCallExpression(value)) && isGlobalArray(checker, value.expression)) {
1082
+ const args = value.arguments ?? [];
1083
+ if (args.some(ts.isSpreadElement))
1084
+ return REFUSED;
1085
+ // `new Array( n )` allocates n holes; n itself is never an element.
1086
+ return seed(value, args.length === 1 && numericType(checker, args[0]) ? [] : args);
1087
+ }
1088
+ if (!ts.isCallExpression(value) || value.arguments.some(ts.isSpreadElement))
1089
+ return REFUSED;
1090
+ const callee = original(value.expression);
1091
+ if (!ts.isPropertyAccessExpression(callee))
1092
+ return REFUSED;
1093
+ if (isStaticArrayCall(checker, value, 'of'))
1094
+ return seed(value, value.arguments);
1095
+ // A mapping callback's results are not source expressions this inventory can name.
1096
+ if (isStaticArrayCall(checker, value, 'from'))
1097
+ return value.arguments.length === 1 && copied(value.arguments[0]) ? seed(value, []) : REFUSED;
1098
+ const method = callee.name.text;
1099
+ if (method === 'slice' || method === 'concat') {
1100
+ // The receiver's own family proves it is a real array, so the method
1101
+ // is the intrinsic one. A non-array `concat` argument would be appended
1102
+ // as itself, which this inventory cannot tell apart; each must be an array.
1103
+ if (!copied(callee.expression))
1104
+ return REFUSED;
1105
+ if (method === 'concat' && !value.arguments.every(copied))
1106
+ return REFUSED;
1107
+ return seed(value, []);
1108
+ }
1109
+ // `lists.get( scene )` in `WebGLRenderLists.get`: whatever the native map
1110
+ // ever stored under any key, each of which must itself be a family origin.
1111
+ if (method === 'get') {
1112
+ const stored = collectionStoredValuesOf(checker, flow, value, assume);
1113
+ if (!stored)
1114
+ return REFUSED;
1115
+ pending.push(value);
1116
+ return through(stored.map(original));
1117
+ }
1118
+ return REFUSED;
1119
+ };
1120
+ const solve = seededOriginSolver(expand);
1121
+ const adopt = (cell) => cells.has(cell) || solve(cell) !== 'refused';
1122
+ const seen = new Set();
1123
+ /** Ordinary calls use the admitted frame. Construction still asks its
1124
+ * source constructor frame; checker selection alone never admits a method. */
1125
+ const bound = (call, reference) => {
1126
+ if (ts.isCallExpression(call) && call.expression.kind !== ts.SyntaxKind.SuperKeyword) {
1127
+ const fact = authority.invocationFactOf(call);
1128
+ const forwarded = fact && invocationValueUsesOf(fact, reference);
1129
+ if (forwarded === null)
1130
+ return false;
1131
+ const parameters = new Set(forwarded.map((use) => flow.targetOf(use)?.declaration ?? null));
1132
+ return [...parameters].every((parameter) => parameter !== null && ts.isParameter(parameter) && adopt(parameter));
1133
+ }
1134
+ const args = call.arguments ?? [];
1135
+ if (args.some(ts.isSpreadElement))
1136
+ return false;
1137
+ const callee = checker.getResolvedSignature(call)?.declaration;
1138
+ if (!callee || ts.isJSDocSignature(callee))
1139
+ return false;
1140
+ if (ts.isNewExpression(call)) {
1141
+ const named = original(call.expression);
1142
+ const binding = ts.isIdentifier(named) ? (flow.targetOf(named)?.declaration ?? null) : null;
1143
+ if (!binding || !(ts.isClassDeclaration(binding) || ts.isClassExpression(binding)) || !ts.isConstructorDeclaration(callee))
1144
+ return false;
1145
+ if (flow.writesToDeclaration(binding).some((write) => write.slot === 'whole' && write.edge !== 'return'))
1146
+ return false;
1147
+ }
1148
+ const position = args.indexOf(reference);
1149
+ if (position < 0)
1150
+ return false;
1151
+ const parameter = callee.parameters.filter((each) => !(ts.isIdentifier(each.name) && each.name.text === 'this'))[position];
1152
+ const values = parameter && authority.parameterValuesOf(parameter);
1153
+ if (!values)
1154
+ return false;
1155
+ // The parameter accounts for this argument when it holds the argument as
1156
+ // spelled, or -- the value graph answers by VALUE, resolving `levels` to
1157
+ // the `[first]` it holds -- when it holds everything the argument holds.
1158
+ const accounted = values.includes(reference) || (authority.graphValuesOf?.(reference)?.every((held) => values.includes(held)) ?? false);
1159
+ return accounted && adopt(parameter);
1160
+ };
1161
+ const use = (reference) => {
1162
+ if (seen.has(reference))
1163
+ return true;
1164
+ seen.add(reference);
1165
+ if (isTypePositionReference(reference))
1166
+ return true;
1167
+ if (!writesNamedBy(flow, reference).every(namedWriteIsClosed))
1168
+ return false;
1169
+ const parent = reference.parent;
1170
+ if ((ts.isParenthesizedExpression(parent) ||
1171
+ ts.isAsExpression(parent) ||
1172
+ ts.isTypeAssertionExpression(parent) ||
1173
+ ts.isNonNullExpression(parent) ||
1174
+ ts.isSatisfiesExpression(parent)) &&
1175
+ parent.expression === reference)
1176
+ return use(parent);
1177
+ if (ts.isTypeQueryNode(parent))
1178
+ return true;
1179
+ if (ts.isPropertyAccessExpression(parent) && parent.name === reference)
1180
+ return use(parent);
1181
+ if (ts.isVariableDeclaration(parent) || ts.isParameter(parent))
1182
+ return parent.name === reference || (parent.initializer === reference && ts.isIdentifier(parent.name) && adopt(parent));
1183
+ if (ts.isPropertyDeclaration(parent)) {
1184
+ if (parent.initializer !== reference)
1185
+ return false;
1186
+ if (ts.isPrivateIdentifier(parent.name))
1187
+ return adopt(parent);
1188
+ const key = keyTextOf(parent.name);
1189
+ const field = key === null ? null : declaredFieldCellOf(checker, flow, parent, key);
1190
+ return field !== null && adopt(field);
1191
+ }
1192
+ if (ts.isBinaryExpression(parent)) {
1193
+ const operator = parent.operatorToken.kind;
1194
+ if (operator === ts.SyntaxKind.EqualsToken || LOGICAL_ASSIGNMENTS.has(operator)) {
1195
+ // The cell's whole writes are its admitted origins. The expression
1196
+ // result aliases the array, so a used result is followed too.
1197
+ if (parent.left === reference)
1198
+ return ts.isExpressionStatement(parent.parent) || use(parent);
1199
+ const owner = cellNamedBy(checker, flow, parent.left, authority);
1200
+ return owner !== null && adopt(owner) && (ts.isExpressionStatement(parent.parent) || use(parent));
1201
+ }
1202
+ if (EQUALITY.has(operator))
1203
+ return true;
1204
+ if (operator === ts.SyntaxKind.CommaToken)
1205
+ return parent.left === reference || use(parent);
1206
+ if (operator === ts.SyntaxKind.BarBarToken ||
1207
+ operator === ts.SyntaxKind.AmpersandAmpersandToken ||
1208
+ operator === ts.SyntaxKind.QuestionQuestionToken)
1209
+ return use(parent);
1210
+ return false;
1211
+ }
1212
+ if (ts.isElementAccessExpression(parent) && parent.expression === reference) {
1213
+ // A string key can name `push` or `length`: a read would extract a
1214
+ // method, a store would shadow one. Only index keys reach elements.
1215
+ if (!numericType(checker, parent.argumentExpression))
1216
+ keys.add(parent.argumentExpression);
1217
+ const position = outermostErasureOf(parent);
1218
+ const context = position.parent;
1219
+ // Calling an element passes the array as its receiver.
1220
+ if ((ts.isCallExpression(context) || ts.isNewExpression(context)) && context.expression === position)
1221
+ return false;
1222
+ if (ts.isTaggedTemplateExpression(context) && context.tag === position)
1223
+ return false;
1224
+ if (ts.isBinaryExpression(context) && context.left === position) {
1225
+ const operator = context.operatorToken.kind;
1226
+ if (operator === ts.SyntaxKind.EqualsToken || LOGICAL_ASSIGNMENTS.has(operator)) {
1227
+ values.add(context.right);
1228
+ return true;
1229
+ }
1230
+ return !isAssignmentOperator(operator);
1231
+ }
1232
+ return !isUpdate(context);
1233
+ }
1234
+ if (ts.isPropertyAccessExpression(parent) && parent.expression === reference) {
1235
+ if (ts.isPrivateIdentifier(parent.name))
1236
+ return false;
1237
+ // Provenance, not the checker, proves this is an array; a member the
1238
+ // checker does resolve must still be the intrinsic declaration.
1239
+ const member = checker.getSymbolAtLocation(parent.name);
1240
+ if (member?.declarations?.some((declaration) => !declaration.getSourceFile().isDeclarationFile))
1241
+ return false;
1242
+ const position = outermostErasureOf(parent);
1243
+ const context = position.parent;
1244
+ if (parent.name.text === 'length') {
1245
+ if (ts.isBinaryExpression(context) && context.left === position) {
1246
+ const operator = context.operatorToken.kind;
1247
+ if (operator === ts.SyntaxKind.EqualsToken)
1248
+ return numericType(checker, context.right);
1249
+ return !isAssignmentOperator(operator);
1250
+ }
1251
+ return !ts.isDeleteExpression(context) && !isUpdate(context);
1252
+ }
1253
+ if (!ts.isCallExpression(context) || context.expression !== position || context.arguments.some(ts.isSpreadElement))
1254
+ return false;
1255
+ const args = context.arguments;
1256
+ switch (parent.name.text) {
1257
+ case 'push':
1258
+ case 'unshift':
1259
+ for (const argument of args)
1260
+ values.add(argument);
1261
+ return true;
1262
+ case 'splice':
1263
+ for (const argument of args.slice(2))
1264
+ values.add(argument);
1265
+ return true;
1266
+ case 'fill':
1267
+ if (args[0])
1268
+ values.add(args[0]);
1269
+ return use(context);
1270
+ // These return their receiver, so the result is the same array.
1271
+ // `sort`'s comparator receives elements, never the array.
1272
+ case 'reverse':
1273
+ case 'sort':
1274
+ case 'copyWithin':
1275
+ return use(context);
1276
+ case 'pop':
1277
+ case 'shift':
1278
+ case 'at':
1279
+ case 'indexOf':
1280
+ case 'lastIndexOf':
1281
+ case 'includes':
1282
+ case 'slice':
1283
+ case 'concat':
1284
+ return true;
1285
+ // `forEach`/`map`/... hand the array to their callback as the third
1286
+ // argument; without that callback's complete frame it is exposed.
1287
+ default:
1288
+ return false;
1289
+ }
1290
+ }
1291
+ if (ts.isCallExpression(parent) && parent.arguments.some((argument) => argument === reference)) {
1292
+ if (parent.arguments.some(ts.isSpreadElement))
1293
+ return false;
1294
+ if (isStaticArrayCall(checker, parent, 'from'))
1295
+ return parent.arguments.length === 1;
1296
+ const callee = original(parent.expression);
1297
+ if (!ts.isPropertyAccessExpression(callee))
1298
+ return bound(parent, reference);
1299
+ // `x.concat( array )` only reads the argument -- when `x` is itself a
1300
+ // proven array, so the method is the intrinsic one.
1301
+ if (callee.name.text === 'concat') {
1302
+ const receiver = inventoryOf(checker, flow, callee.expression, authority);
1303
+ if (!receiver)
1304
+ return false;
1305
+ obligations(receiver);
1306
+ return true;
1307
+ }
1308
+ // `lists.set( scene, [ list ] )`: every read of that native map aliases
1309
+ // the stored array, so each read continues this family.
1310
+ if (callee.name.text === 'set' && parent.arguments[1] === reference) {
1311
+ const reads = collectionValueContinuationsOf(checker, flow, parent, reference, assume);
1312
+ return reads !== null && reads.every(use);
1313
+ }
1314
+ return false;
1315
+ }
1316
+ // `new CompressedTexture( mipmaps, ... )`: the constructor's parameter joins the family.
1317
+ if (ts.isNewExpression(parent) && parent.arguments?.some((argument) => argument === reference))
1318
+ return bound(parent, reference);
1319
+ if (ts.isSpreadElement(parent))
1320
+ return ts.isArrayLiteralExpression(parent.parent);
1321
+ if (ts.isForOfStatement(parent))
1322
+ return parent.expression === reference;
1323
+ if (ts.isConditionalExpression(parent))
1324
+ return parent.condition === reference || use(parent);
1325
+ if ((ts.isIfStatement(parent) || ts.isWhileStatement(parent) || ts.isDoStatement(parent)) && parent.expression === reference)
1326
+ return true;
1327
+ if (ts.isPrefixUnaryExpression(parent))
1328
+ return parent.operator === ts.SyntaxKind.ExclamationToken;
1329
+ return ts.isTypeOfExpression(parent) || ts.isVoidExpression(parent) || ts.isExpressionStatement(parent);
1330
+ };
1331
+ const fieldMentionsClosed = (cell) => {
1332
+ const facts = fieldFactsOf(checker, flow, cell, authority);
1333
+ const open = facts?.mentions.find((mention) => !use(mention));
1334
+ if (open)
1335
+ traceField(cell, 'open-use', open);
1336
+ return facts !== null && open === undefined;
1337
+ };
1338
+ const root = cellNamedBy(checker, flow, entry, authority) ?? original(entry);
1339
+ if (solve(root) !== 'allocated')
1340
+ return null;
1341
+ for (let index = 0; index < pending.length; index += 1) {
1342
+ const item = pending[index];
1343
+ const closed = isFieldCell(item)
1344
+ ? fieldMentionsClosed(item)
1345
+ : ts.isVariableDeclaration(item) || ts.isPropertyDeclaration(item) || ts.isParameter(item)
1346
+ ? flow.referencesToDeclaration(item).every(use)
1347
+ : use(item);
1348
+ if (!closed)
1349
+ return null;
1350
+ }
1351
+ const held = anchor ?? flow.arrayLiterals.find((literal) => arrayTyped(checker, literal)) ?? null;
1352
+ const protocol = held ? nativeArrayProtocolPlanOf(checker, flow, held) : null;
1353
+ if (!protocol)
1354
+ return null;
1355
+ plans.add(protocol);
1356
+ return { values: [...values], plans, keys, keyRequirements, requirements: [...requirements] };
1357
+ };
1358
+ /** An origin key spelled for a cross-proof cache: its file and position. */
1359
+ const keyNameOf = (key) => {
1360
+ const node = isFieldCell(key) ? key.declaration : key;
1361
+ return `${isFieldCell(key) ? `${key.key}@` : ''}${node.getSourceFile().fileName}#${node.pos}`;
1362
+ };
1363
+ const inventoryOf = (checker, flow, expression, authority) => {
1364
+ const key = cellNamedBy(checker, flow, expression, authority) ?? unwrapErasedExpression(expression);
1365
+ const cache = scopedCache(authorityInventories, authority, flow, () => new Map());
1366
+ if (cache.has(key)) {
1367
+ const cached = cache.get(key);
1368
+ if (cached && cached.requirements.length > 0 && deferredIntrinsicProtocolLedgerOf(flow)?.include(cached.requirements) !== true)
1369
+ return null;
1370
+ return cached;
1371
+ }
1372
+ const frames = computingFramesOf(authority, flow);
1373
+ // A family whose proof needs itself through another entry is refused:
1374
+ // `items = items.concat( more )` proves `more` on its own, and `more`'s use
1375
+ // at that concat needs `items` proven first. Families between the two
1376
+ // occurrences answered from an incomplete view, so they are not cached.
1377
+ const blocked = frames.findIndex((frame) => frame.key === key);
1378
+ if (blocked >= 0) {
1379
+ for (const frame of frames.slice(blocked + 1))
1380
+ frame.tainted = true;
1381
+ // `tainted` withholds the ASKING frame's own answer. Anything else
1382
+ // computed inside this window -- a record plan, an invocation fact --
1383
+ // leaned on this refusal too, and only the trail can tell it so.
1384
+ noteHypothesis(key);
1385
+ return null;
1386
+ }
1387
+ const frame = { key, tainted: false };
1388
+ frames.push(frame);
1389
+ enterHypothesisGuard(key);
1390
+ try {
1391
+ const ledger = deferredIntrinsicProtocolLedgerOf(flow);
1392
+ const compute = () => computeInventory(checker, flow, expression, authority);
1393
+ // Shared across proofs where the authority can (see `sharedAnswerOf`); a
1394
+ // tainted inventory answered from an incomplete view stays this proof's.
1395
+ const captured = authority.sharedAnswerOf
1396
+ ? authority.sharedAnswerOf(`array-inventory:${keyNameOf(key)}`, compute, () => !frame.tainted)
1397
+ : ledger
1398
+ ? ledger.capture(compute)
1399
+ : { value: compute(), requirements: [] };
1400
+ const computed = captured.value;
1401
+ const inventory = computed
1402
+ ? { ...computed, requirements: captured.requirements.length > 0 ? captured.requirements : computed.requirements }
1403
+ : null;
1404
+ if (inventory && inventory.requirements.length > 0 && ledger?.include(inventory.requirements) !== true)
1405
+ return null;
1406
+ if (inventory && !frame.tainted)
1407
+ authority.whenSettled(() => cache.set(key, inventory));
1408
+ return inventory;
1409
+ }
1410
+ finally {
1411
+ exitHypothesisGuard(key, true);
1412
+ frames.pop();
1413
+ }
1414
+ };
1415
+ /**
1416
+ * Every expression whose value was ever stored into the array `array` names,
1417
+ * or `null` when that set is not closed.
1418
+ *
1419
+ * Origins are array literals, `new Array`/`Array()`/`Array.of`, and copies
1420
+ * (`slice`, `concat`, unmapped `Array.from`, literal spread) of arrays whose
1421
+ * own stored values are enumerated -- reached through local cells, ES-private
1422
+ * fields, public fields of a closed class family (see `FieldCell`), and
1423
+ * native-map slots whose every write is proven the same way. Stored values
1424
+ * are literal elements, numeric-index stores, and
1425
+ * `push`/`unshift`/`splice`/`fill` arguments. An element read may also yield
1426
+ * `undefined` (a hole or a miss); that is the reader's own case to handle.
1427
+ *
1428
+ * The authority's `protocolClosed` is asked for the intrinsic Array plan, and for every
1429
+ * native-map plan the family passes through, on EVERY call. Its `numericKey`
1430
+ * discharges index keys the checker cannot type as numbers -- three's
1431
+ * `listArray[ renderCallDepth ]` indexes by an unannotated parameter -- and
1432
+ * without it such a key refuses.
1433
+ *
1434
+ * The same complete caller authority closes computed-key sets and every
1435
+ * parameter frame. No standalone frame inference or authority-free cache is
1436
+ * accepted.
1437
+ */
1438
+ export const arrayStoredValuesOf = (checker, flow, array, authority) => {
1439
+ const inventory = inventoryOf(checker, flow, array, authority);
1440
+ if (!inventory)
1441
+ return null;
1442
+ for (const plan of inventory.plans)
1443
+ if (!authority.protocolClosed(plan))
1444
+ return null;
1445
+ for (const key of inventory.keys)
1446
+ if (!authority.numericKey(key))
1447
+ return null;
1448
+ for (const requirement of inventory.keyRequirements)
1449
+ if (!intrinsicHeld(flow, authority, requirement))
1450
+ return null;
1451
+ return inventory.values;
1452
+ };