@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,1125 @@
1
+ import ts from 'typescript';
2
+ import { inheritedAccessorOfAssignment } from '../inherited-accessor.js';
3
+ import { annotationStatesNothing, containsUnstatedPosition, derivedExpressionType, disjointUnionMembersOf, exactEmptyObjectLiteralType, indexedTypeOf, explicitThisCallReturnType, overloadInvariantReturnTypeAt, joinOfWrites, jsDocTypeStatesNothing, literalMemberNameOf, narrowsOnlyUnstatedPositions, memberTypeOf, objectAssignTargetType, unwrapExplicitThisCall } from './derived-expression-type.js';
4
+ import { carriesUnsubstitutedGeneric, emptyParameterBindingCensus } from './parameter-bindings.js';
5
+ import { emptyCollectionBindingCensus } from './collection-bindings.js';
6
+ import { classFamilyMemberReadTypeOf } from './flow/class-family-member-read.js';
7
+ import { forEachReachableStatement } from './reachability.js';
8
+ import { censusRefusal } from './census-refusal.js';
9
+ /** A census that binds nothing, for callers that state no program. */
10
+ export const emptyFieldBindingCensus = {
11
+ typeAt: () => null,
12
+ unionArmsAt: () => null,
13
+ statedTypeAt: () => null,
14
+ boundCount: 0,
15
+ refusals: [],
16
+ refusalOf: () => null
17
+ };
18
+ const WIDENED = process.env['GEA_FLOW_WIDE'] === '1';
19
+ const isAnyType = (type) => (type.flags & ts.TypeFlags.Any) !== 0;
20
+ /** Duplicated from `parameter-bindings.ts` (not exported there): `any`/`void`/`never` say nothing about storage. */
21
+ const isUnusableEvidence = (type) => (type.flags & (ts.TypeFlags.Any | ts.TypeFlags.Void | ts.TypeFlags.Never)) !== 0;
22
+ /**
23
+ * `never[]` (or `readonly never[]`) -- TypeScript's own answer for `this.x =
24
+ * [];` with no contextual type to narrow it, and no more a fact about the
25
+ * program than the empty object type `{}` is; `annotationStatesNothing`
26
+ * already carries that reasoning for `{}` (see its own comment) but never
27
+ * asked the array-shaped version of the same question, so a field whose only
28
+ * whole-value write is a bare `[]` was read as REAL evidence -- bound to
29
+ * `never[]`, a type nothing can ever be assigned into or read out of, in
30
+ * front of every other write the program plainly makes to it (a `.push`, a
31
+ * computed-index write) elsewhere in the class. Same test
32
+ * `object-bag-bindings.ts`'s `statesNothing` already applies to a bag's own
33
+ * candidacy, asked here of a FIELD's write evidence instead.
34
+ *
35
+ * `any[]` and `unknown[]` are the same statement, and the test asked only the
36
+ * `never` half. `isUnusableEvidence` already refuses a bare `any` because it
37
+ * says nothing about what a slot holds; an array OF `any` says nothing about
38
+ * what its elements hold, and the only difference is one level of nesting.
39
+ * three's `Texture.mipmaps` is the measured case: `@type {Array<Object>}`,
40
+ * where the global `Object` INTERFACE is collapsed to `any` by
41
+ * `structural.ts`'s `isGlobalObjectInterface` for the same reason
42
+ * `annotationStatesNothing` refuses it bare -- so the annotation arrives here
43
+ * as `any[]`, read as REAL evidence, and the field's write set (which the
44
+ * program plainly fills with real mip records) was never consulted at all.
45
+ */
46
+ const isVacuousArrayType = (checker, type) => {
47
+ if (!checker.isArrayType(type))
48
+ return false;
49
+ const [element] = checker.getTypeArguments(type);
50
+ return element !== undefined && (element.flags & (ts.TypeFlags.Never | ts.TypeFlags.Any | ts.TypeFlags.Unknown)) !== 0;
51
+ };
52
+ // The constructor allocates a fresh anonymous checker type. Intern by its
53
+ // complete inputs so repeated inference rounds publish the same fact identity.
54
+ const dictionaryTypes = new WeakMap();
55
+ const dictionaryTypeOf = (checker, valueType) => {
56
+ const cached = dictionaryTypes.get(checker)?.get(valueType);
57
+ if (cached)
58
+ return cached;
59
+ const constructing = checker;
60
+ if (typeof constructing.createIndexInfo !== 'function' || typeof constructing.createAnonymousType !== 'function')
61
+ return null;
62
+ const indexInfo = constructing.createIndexInfo(checker.getStringType(), valueType, false);
63
+ const dictionary = constructing.createAnonymousType(undefined, new Map(), [], [], [indexInfo]);
64
+ if (!dictionary || checker.getIndexInfosOfType(dictionary).length === 0)
65
+ return null;
66
+ let cache = dictionaryTypes.get(checker);
67
+ if (!cache) {
68
+ cache = new Map();
69
+ dictionaryTypes.set(checker, cache);
70
+ }
71
+ cache.set(valueType, dictionary);
72
+ return dictionary;
73
+ };
74
+ /** `type | null | undefined`, joining ONLY the nullish members of `nullish` -- a real `undefined`/`null` write the field's own whole-value evidence made is a FACT this module must not drop just because a separate pool of evidence (a write made THROUGH the field) answered its shape. */
75
+ const withNullish = (checker, type, nullish) => {
76
+ if (nullish.length === 0)
77
+ return type;
78
+ const constructing = checker;
79
+ if (typeof constructing.getUnionType !== 'function')
80
+ return null;
81
+ return constructing.getUnionType([type, ...nullish]);
82
+ };
83
+ /** A plain `x.field = expr` assignment -- what TypeScript's JS-class inference leaves in `declarations` for a field the program never declares. */
84
+ const isAssignmentDeclaration = (declaration) => ts.isBinaryExpression(declaration) && declaration.operatorToken.kind === ts.SyntaxKind.EqualsToken;
85
+ /**
86
+ * Whether a declaration is ambient (`declare class C { x }`, or anything
87
+ * nested inside a `declare module`) -- the same test `local-bindings.ts`
88
+ * applies to a cell, for the same reason: a host owns that storage, so its
89
+ * type is a host-boundary capability question and never this module's to
90
+ * answer.
91
+ */
92
+ const isAmbientDeclaration = (node) => {
93
+ if ((ts.getCombinedModifierFlags(node) & ts.ModifierFlags.Ambient) !== 0)
94
+ return true;
95
+ for (let current = node.parent; current; current = current.parent) {
96
+ if (ts.isModuleDeclaration(current) && (ts.getCombinedModifierFlags(current) & ts.ModifierFlags.Ambient) !== 0)
97
+ return true;
98
+ }
99
+ return false;
100
+ };
101
+ /**
102
+ * A `PropertyDeclaration` that states storage and nothing else: `aspect;`.
103
+ * No annotation, no initializer and no JSDoc `@type` -- each of which is the
104
+ * program stating an answer this module must not contradict -- and not
105
+ * ambient, and not in a `.d.ts`. See the module doc comment's "The second
106
+ * shape".
107
+ *
108
+ * A JSDoc tag that resolves to NOTHING is not a statement, which is why the
109
+ * test is `jsDocTypeStatesNothing` rather than the tag's mere presence --
110
+ * the same distinction `local-bindings.ts`'s own `isCandidate` draws, and for
111
+ * the same reason: the checker degrades a tag naming an unbindable type to
112
+ * `any`, so reading presence alone excludes a field the program described
113
+ * and then records it as declared-dynamic.
114
+ */
115
+ const isBareFieldDeclaration = (checker, declaration) => {
116
+ if (!ts.isPropertyDeclaration(declaration))
117
+ return false;
118
+ if (declaration.type || declaration.initializer)
119
+ return false;
120
+ if (declaration.getSourceFile().isDeclarationFile)
121
+ return false;
122
+ const jsDocType = ts.getJSDocType(declaration);
123
+ if (jsDocType && !jsDocTypeStatesNothing(checker, jsDocType))
124
+ return false;
125
+ return !isAmbientDeclaration(declaration);
126
+ };
127
+ /**
128
+ * A field the program DID type, whose statement is still only an UPPER BOUND
129
+ * -- the FIELD form of `parameter-bindings.ts`'s `statedUpperBound`, and the
130
+ * same question about the same kind of storage: an annotation with an
131
+ * `any`/`unknown`/bare-`Function` position somewhere inside it, satisfied at
132
+ * every position it constrains by what the program actually writes there.
133
+ *
134
+ * hono's `HonoRequest` is the measured case, and it is why this exists at all.
135
+ * Its constructor parameter `matchResult: Result<[unknown, RouterRoute]>` is
136
+ * already narrowed to the concrete `Result<[H, RouterRoute]>` its only caller
137
+ * passes, by exactly the parameter rule above. The FIELD it is stored into,
138
+ * `#matchResult: Result<[unknown, RouterRoute]>`, kept the annotation -- so
139
+ * the cell held the stated type while its one writer held the narrowed one,
140
+ * and the store between them asked the backend to reconcile two `Result`
141
+ * carriers. That reconciliation rebuilds two arrays, and an array rebuild is
142
+ * a COPY of an array the caller still holds, so it is not renderable at all:
143
+ * the carriers have to be made to AGREE here rather than converted there.
144
+ *
145
+ * An INITIALIZED field is excluded: the initializer is a write, and this
146
+ * module's write discovery reads property-assignment edges, not initializers,
147
+ * so joining without it would answer from a strict subset of the evidence.
148
+ * An OPTIONAL field's statement is `T | undefined` whatever the annotation
149
+ * spells, for the same reason a defaulted parameter's is.
150
+ */
151
+ const statedUpperBoundOfField = (checker, declaration) => {
152
+ if (!ts.isPropertyDeclaration(declaration))
153
+ return null;
154
+ if (!declaration.type || declaration.initializer)
155
+ return null;
156
+ if (declaration.getSourceFile().isDeclarationFile)
157
+ return null;
158
+ if (isAmbientDeclaration(declaration))
159
+ return null;
160
+ const declared = checker.getTypeFromTypeNode(declaration.type);
161
+ // A whole annotation that states nothing is `isBareFieldDeclaration`'s
162
+ // business one shape over, not an upper bound to narrow within.
163
+ if (annotationStatesNothing(checker, declaration.type, declared))
164
+ return null;
165
+ if (isUnusableEvidence(declared))
166
+ return null;
167
+ if (!containsUnstatedPosition(checker, declaration.type, declared))
168
+ return null;
169
+ return declaration.questionToken ? checker.getNullableType(declared, ts.TypeFlags.Undefined) : declared;
170
+ };
171
+ /**
172
+ * The INTERFACE a field's annotation names, when it names exactly one.
173
+ *
174
+ * JavaScript has no interfaces. An `interface` annotation states what may be
175
+ * READ out of a slot; it never says what the slot physically holds, because
176
+ * nothing in the language ever constructs one. What the slot holds is whatever
177
+ * the program writes into it -- and when every write is an instance of one
178
+ * class, that class IS the storage.
179
+ *
180
+ * hono is the measured case and it is not a boxing question, it is a
181
+ * CORRECTNESS one. `HonoBase.router` is annotated `Router<[H, RouterRoute]>`,
182
+ * an interface whose members are `name`, `add` and `match`; the constructor
183
+ * writes `new PatternRouter()` and nothing else ever writes it. Carried as the
184
+ * interface, the field became a struct with two `gea::CallableObject` members
185
+ * that nothing could fill (a class's methods are free functions taking the
186
+ * instance, not storage), the class instance would not assign into it at all,
187
+ * and -- worse than either -- `PatternRouter.add`/`.match` were never reached
188
+ * through the class, so the census never walked them and NO BODY FOR EITHER
189
+ * WAS EMITTED. The program compiled its router away.
190
+ *
191
+ * Deliberately narrower than `statedUpperBoundOfField` above, which asks
192
+ * whether an annotation left a position UNSTATED and narrows within it. This
193
+ * asks a different question -- whether the annotation names a shape rather
194
+ * than a thing -- so the answer is held to a different test in `resolveSymbol`:
195
+ * the join must be a CLASS, and assignable to the interface. Anything else
196
+ * (two classes, an object literal, a plain type) refuses and leaves the field
197
+ * exactly as it is.
198
+ */
199
+ const interfaceAnnotationOfField = (checker, declaration) => {
200
+ if (!ts.isPropertyDeclaration(declaration))
201
+ return null;
202
+ if (!declaration.type || declaration.initializer || declaration.questionToken)
203
+ return null;
204
+ if (declaration.getSourceFile().isDeclarationFile)
205
+ return null;
206
+ if (isAmbientDeclaration(declaration))
207
+ return null;
208
+ const declared = checker.getTypeFromTypeNode(declaration.type);
209
+ if (isUnusableEvidence(declared))
210
+ return null;
211
+ const declarations = declared.getSymbol()?.declarations;
212
+ const sole = declarations && declarations.length === 1 ? declarations[0] : undefined;
213
+ return sole && ts.isInterfaceDeclaration(sole) ? declared : null;
214
+ };
215
+ /** The interface annotation of the field `symbol` declares -- `null` unless it has exactly one declaration and that declaration names one. */
216
+ const interfaceBoundOfSymbol = (checker, symbol) => {
217
+ const declarations = symbol.declarations;
218
+ const sole = declarations && declarations.length === 1 ? declarations[0] : undefined;
219
+ return sole ? interfaceAnnotationOfField(checker, sole) : null;
220
+ };
221
+ /** Whether a type is a CLASS INSTANCE -- a thing the program constructs, as opposed to a shape it describes. */
222
+ const isClassInstanceType = (type) => {
223
+ const symbol = type.getSymbol();
224
+ if (!symbol || (symbol.flags & ts.SymbolFlags.Class) === 0)
225
+ return false;
226
+ const declaration = symbol.valueDeclaration;
227
+ return declaration !== undefined && ts.isClassLike(declaration);
228
+ };
229
+ /** The stated upper bound of the field `symbol` declares, with the declaration that states it -- `narrowsOnlyUnstatedPositions` needs the node as its anchor. `null` unless `symbol` has exactly one declaration and it is one; see `statedUpperBoundOfField`. */
230
+ const statedBoundOfSymbol = (checker, symbol) => {
231
+ const declarations = symbol.declarations;
232
+ const sole = declarations && declarations.length === 1 ? declarations[0] : undefined;
233
+ if (!sole)
234
+ return null;
235
+ const bound = statedUpperBoundOfField(checker, sole);
236
+ return bound ? { declaration: sole, bound } : null;
237
+ };
238
+ /**
239
+ * An assignment declaration (`this.x = expr;`) carrying its OWN JSDoc
240
+ * `@type` tag that states the slot's storage COMPLETELY -- not vacuous
241
+ * itself (`annotationStatesNothing`) and with no unstated position anywhere
242
+ * inside it (`containsUnstatedPosition`).
243
+ *
244
+ * TypeScript's JS-class inference builds an assignment-only field's
245
+ * declaration list from every `this.x = expr` alone, so `isCandidateSymbol`'s
246
+ * first shape ("the whole list is assignments") used to admit one as a
247
+ * fully-UNANNOTATED field regardless of a JSDoc comment sitting directly
248
+ * above the assignment -- even though `ts.getJSDocType` reads that comment
249
+ * from a `BinaryExpression` exactly as it does from a `PropertyDeclaration`,
250
+ * and the checker's own `getTypeOfSymbolAtLocation` already uses it for the
251
+ * symbol's type: three's `/** @type {Array<Plane>} *\/ this.clippingPlanes =
252
+ * [];` types the SYMBOL `Plane[]`, in full, from the tag alone. A
253
+ * `PropertyDeclaration` this fully stated is excluded from candidacy
254
+ * entirely -- this module's own doc below says why ("an annotated ... field
255
+ * ... means the program DID state something ... this module defers") -- but
256
+ * an assignment declaration carrying the identical statement was never asked
257
+ * the question.
258
+ *
259
+ * Left a CANDIDATE, this manufactures a refusal STRICTLY WORSE than doing
260
+ * nothing: `compute`'s `PropertyAccessExpression` case returns whatever
261
+ * `resolveSymbol` answers the instant `isCandidateSymbol` is true, never
262
+ * falling through to `propertyTypeOf`/`memberTypeOf` -- the ordinary
263
+ * checker-backed lookup that would have read the JSDoc-informed `Plane[]`
264
+ * directly. So a field the program fully described boxed every read of it,
265
+ * for want of a check a sibling shape (`isBareFieldDeclaration`) already
266
+ * makes for the OTHER declaration kind. Measured on the three.js app:
267
+ * `WebGLRenderer.clippingPlanes` and `UniformsGroup.uniforms`, each written
268
+ * once as an empty literal the evolving-array checker calls `never[]`
269
+ * (correctly silent as evidence -- see `resolveSymbol`'s `write-unresolved`)
270
+ * and annotated `Array<Plane>`/`Array<Uniform>` directly above that one
271
+ * write: fully concrete container types the program already committed to,
272
+ * refused here for want of ever reading the annotation.
273
+ *
274
+ * Deliberately narrower than "any JSDoc-typed assignment": `Array<Object>`
275
+ * (three's `updateRanges`/`coefficients`, same shape, same single silent
276
+ * write) has an UNSTATED position (`Object` states nothing on its own,
277
+ * `containsUnstatedPosition` agrees) and stays a candidate, unaffected by
278
+ * this check -- narrowing that kind of annotation from write evidence is the
279
+ * THIRD shape's job (`statedUpperBoundOfField`), not this one's, and a field
280
+ * whose only write is silent still has no evidence to narrow with, so it
281
+ * keeps refusing exactly as before rather than being declared "fully
282
+ * described" when the annotation itself says otherwise.
283
+ */
284
+ const assignmentStatesCompleteJsDocType = (checker, declaration) => {
285
+ if (!ts.isBinaryExpression(declaration))
286
+ return false;
287
+ const jsDocType = ts.getJSDocType(declaration);
288
+ if (!jsDocType)
289
+ return false;
290
+ const declared = checker.getTypeFromTypeNode(jsDocType);
291
+ if (isUnusableEvidence(declared))
292
+ return false;
293
+ if (annotationStatesNothing(checker, declaration, declared))
294
+ return false;
295
+ return !containsUnstatedPosition(checker, declaration, declared);
296
+ };
297
+ /**
298
+ * Whether `symbol` is one of the two shapes this module types: a property
299
+ * whose ENTIRE declaration list is plain `x.field = expr` assignments (no
300
+ * declaration at all -- TypeScript's own JS-class inference), or one declared
301
+ * exactly once as a BARE `field;` (storage stated, type not).
302
+ *
303
+ * Anything else -- an accessor, an annotated/initialized/JSDoc-typed field, a
304
+ * mixed list pairing an assignment with a real declaration -- means the
305
+ * program DID state something, or another authority already answers it, and
306
+ * this module defers.
307
+ */
308
+ const isCandidateSymbol = (checker, symbol) => {
309
+ if (inheritedAccessorOfAssignment(checker, symbol))
310
+ return false;
311
+ const declarations = symbol.declarations;
312
+ if (!declarations || declarations.length === 0)
313
+ return false;
314
+ if (declarations.every(isAssignmentDeclaration)) {
315
+ // A SOLE assignment whose own JSDoc tag already states its storage
316
+ // completely defers to the checker's (JSDoc-informed) answer instead of
317
+ // becoming a candidate that could only ever refuse -- see
318
+ // `assignmentStatesCompleteJsDocType`. A multi-declaration symbol (a
319
+ // subclass also writes it) is unaffected: agreeing that ONE declaration
320
+ // is fully stated says nothing about whether the OTHERS are, so this
321
+ // stays conservative and only fires where `statedBoundOfSymbol` and
322
+ // friends already require a sole declaration.
323
+ const sole = declarations.length === 1 ? declarations[0] : undefined;
324
+ return sole === undefined || !assignmentStatesCompleteJsDocType(checker, sole);
325
+ }
326
+ const sole = declarations.length === 1 ? declarations[0] : undefined;
327
+ if (sole === undefined)
328
+ return false;
329
+ // The third shape: an annotated field whose statement is only an upper
330
+ // bound. Admitted as a candidate here and held to that statement in
331
+ // `resolveSymbol`, which refuses it unless every write narrows the
332
+ // annotation only where the annotation said nothing.
333
+ // The fourth shape: an annotation that names an INTERFACE. See
334
+ // `interfaceAnnotationOfField` for why that is a description of the slot's
335
+ // readers rather than a statement of what it holds.
336
+ return (isBareFieldDeclaration(checker, sole) ||
337
+ statedUpperBoundOfField(checker, sole) !== null ||
338
+ interfaceAnnotationOfField(checker, sole) !== null);
339
+ };
340
+ /**
341
+ * Whole-program census of what every unannotated, assignment-only class
342
+ * field holds, once every write to it agrees.
343
+ *
344
+ * `parameters` is the already-settled, composed census this runs on top of
345
+ * (parameters + returns + locals, in whatever order `frontend.ts` composed
346
+ * them) -- asked first at every identifier, exactly as `local-bindings.ts`
347
+ * asks it first. This module never reopens that fixpoint; it only adds what
348
+ * none of those authorities could answer because the chain passed through a
349
+ * field with no declaration of its own.
350
+ */
351
+ export const censusFieldBindings = (checker, files, reachable, parameters = emptyParameterBindingCensus,
352
+ /** The same-round array census -- see `return-bindings.ts`'s identical parameter for why, and `frontend.ts`'s `compose`. */
353
+ collections = emptyCollectionBindingCensus,
354
+ /**
355
+ * The whole-program value-flow index -- the ONE walk that states where every
356
+ * write is. This module's own write discovery reads its edges from it rather
357
+ * than re-deriving them; see `flow/model.ts`.
358
+ */
359
+ flow) => {
360
+ const bound = new Map();
361
+ /** The synthesized union arms for a field whose writes disagree but disjointly -- see `resolveSymbol`. */
362
+ const unionArms = new Map();
363
+ /** The subset of `bound` that came from a STATED annotation -- see `statedTypeAt`. */
364
+ const statedBindings = new Map();
365
+ const refusalOf = new Map();
366
+ const resolvingSymbols = new Set();
367
+ /** Whether resolution is in the relaxed retry phase, where a silent write is an absence rather than a veto. See `resolveSymbol`. */
368
+ let lenientPhase = false;
369
+ /**
370
+ * Every write this module treats as EVIDENCE about a field's own storage,
371
+ * read from the shared value-flow index rather than re-derived by a private
372
+ * walk of this module's own.
373
+ *
374
+ * This is an EDGE-SOURCE swap, not a policy change. `property-assignment`
375
+ * with a `whole` slot is exactly the `x.field = expr` shape the private walk
376
+ * this replaced looked for, resolved by the identical
377
+ * `checker.getSymbolAtLocation` call at the identical node -- see
378
+ * `FlowTarget`, which records BOTH property-symbol resolutions precisely so
379
+ * a swap like this one cannot silently change which symbol a write lands on.
380
+ *
381
+ * What the swap ADDS is the edges the private walk never had:
382
+ *
383
+ * - `index-assignment` at a `whole` slot -- `o[ 'field' ] = v`, a named
384
+ * member spelled with brackets. `literalMemberNameOf` already draws this
385
+ * partition on the READ side in every census here; the write side asked a
386
+ * narrower question purely because each census wrote its own walk.
387
+ * - `logical-assignment` -- `this.field ??= v`. The slot ends up holding
388
+ * either its previous contents, which every other write already describes,
389
+ * or `v`. So `v` is ordinary write evidence, and joining it is the same
390
+ * rule applied to a write the old walk could not see.
391
+ * - `destructuring-default` -- `({ x: this.a = v } = o)`, the same argument.
392
+ *
393
+ * A write with no VALUE is deliberately excluded: a compound assignment, a
394
+ * `delete`, an iteration binding and a plain destructuring target all state
395
+ * that the slot EXISTS and nothing about what it holds. Admitting them would
396
+ * feed the join a write it cannot type, which this module's own strict phase
397
+ * reads as a veto -- turning a bound field into a refused one, which is the
398
+ * one direction adding evidence must never move.
399
+ */
400
+ const isFieldEvidence = (write) => write.slot === 'whole' &&
401
+ write.value !== null &&
402
+ (write.edge === 'property-assignment' ||
403
+ (WIDENED && (write.edge === 'index-assignment' || write.edge === 'logical-assignment' || write.edge === 'destructuring-default')));
404
+ /**
405
+ * Every expression written into `symbol`'s storage. For a field with no
406
+ * declaration these are its declarations' own right-hand sides; for a bare
407
+ * `field;` they are the indexed writes. Deduplicated by node, because the
408
+ * two sources overlap exactly on the first shape.
409
+ */
410
+ const writesOf = (symbol) => {
411
+ const writes = new Set();
412
+ for (const declaration of symbol.declarations ?? []) {
413
+ if (ts.isBinaryExpression(declaration))
414
+ writes.add(declaration.right);
415
+ }
416
+ for (const write of flow.writesToSymbol(symbol))
417
+ if (isFieldEvidence(write) && write.value)
418
+ writes.add(write.value);
419
+ return [...writes];
420
+ };
421
+ /**
422
+ * The checker's own answer at this node, when it says something usable.
423
+ *
424
+ * `annotationStatesNothing` is part of the test, not just
425
+ * `isUnusableEvidence`, and the difference is the single measured root of
426
+ * the vacuous-receiver family: three.js writes `@type {?Object}` above
427
+ * `this.view = null;`, the checker dutifully types the SYMBOL
428
+ * `Object | null`, and `Object` -- which states nothing about what the
429
+ * value holds -- is not `any`, so it read as real evidence. Worse than
430
+ * slipping through, it DOMINATES a `widestOf` join, because every type is
431
+ * assignable to `Object`: the one vacuous write out-voted the real record
432
+ * the program also wrote, `this.view` answered `Object | null`, and all 23
433
+ * member reads off it boxed. The layout resolver has asked
434
+ * `annotationStatesNothing` of the checker's answer since the two-
435
+ * authorities split it records; this census asking only half the question
436
+ * was drift, now closed.
437
+ */
438
+ const known = (node) => {
439
+ const type = objectAssignTargetType(checker, node) ?? checker.getTypeAtLocation(node);
440
+ return isUnusableEvidence(type) || annotationStatesNothing(checker, node, type) || isVacuousArrayType(checker, type) ? null : type;
441
+ };
442
+ /**
443
+ * `this.bag[k] = v` and `this.bag.p = v`, read as ONE primitive: a bind
444
+ * whose reference's base resolves to `symbol`, with the slot being
445
+ * named or not. Read by `FlowSlotKind` alone -- `member`/`element` -- never
446
+ * by which edge kind produced it, so this stays correct regardless of
447
+ * which syntax (or, per the index's own roadmap, which call whose callee
448
+ * write-through the graph resolves) the write arrives as; `member`/
449
+ * `element` are the two REFERENCE shapes the language actually has, not a
450
+ * list of syntax forms this module enumerates.
451
+ *
452
+ * Evidence, never an answer: `dictionaryShapeOf` below is the one place
453
+ * this becomes a type, and only for the narrow shape it can answer
454
+ * soundly (every shape write UNNAMED). A field that also gets NAMED writes
455
+ * through it needs a real member symbol table to represent, which is a
456
+ * further extension this does not attempt.
457
+ */
458
+ const shapeWritesOf = (symbol) => flow.writesToSymbol(symbol).filter((write) => (write.slot === 'member' || write.slot === 'element') && write.value !== null);
459
+ /**
460
+ * A field's shape read from writes made THROUGH it elsewhere in the
461
+ * program -- `this.morphTargetDictionary[ name ] = m` reached from a
462
+ * different method than the one that creates `morphTargetDictionary`,
463
+ * three separate times in three unrelated classes (`Line`/`Mesh`/`Points`)
464
+ * -- rather than from an `x.field = expr` write to the field itself.
465
+ * `field-bindings.ts`'s own write-set collection (`writesOf`) only ever
466
+ * looks at writes to the field's OWN whole value; a computed-index write
467
+ * made through it names no member of `field`'s own declaration list at
468
+ * all, so this is genuinely separate evidence, gathered and joined the
469
+ * same way (`known ?? resolveExpr`, then `joinOfWrites`) and refusing on
470
+ * the same terms (silence vetoes in the strict phase, joins what remains
471
+ * once the lenient retry allows it).
472
+ *
473
+ * Deliberately narrow: answered ONLY when every shape write is UNNAMED
474
+ * (`element` slot) -- a plain index signature, `{ [k: string]: V }`, over
475
+ * the join of every value ever written that way. A field that ALSO
476
+ * receives a NAMED (`member`-slot) write refuses here rather than guess at
477
+ * a mixed record-with-index shape; see `dictionaryTypeOf`'s own comment
478
+ * for why building one soundly needs more than this module has today.
479
+ */
480
+ /**
481
+ * `wholeValueTypes` is whatever this symbol's OWN `x.field = expr` writes
482
+ * already typed before this fallback ran (e.g. a real `this.field =
483
+ * undefined;` write elsewhere in the same class) -- evidence this module
484
+ * must not silently drop just because it did not, by itself, settle the
485
+ * field's shape. Folded in only when EVERY one of them is nullish: a
486
+ * genuine non-nullish disagreement (some other write states a real,
487
+ * different shape) is a fact this fallback is not sound to override, so it
488
+ * refuses rather than guess which answer wins.
489
+ */
490
+ const dictionaryShapeOf = (symbol, wholeValueTypes) => {
491
+ if (wholeValueTypes.some((type) => (type.flags & (ts.TypeFlags.Null | ts.TypeFlags.Undefined)) === 0))
492
+ return null;
493
+ const writes = shapeWritesOf(symbol);
494
+ if (writes.length === 0 || writes.some((write) => write.slot === 'member'))
495
+ return null;
496
+ const types = [];
497
+ let silent = 0;
498
+ for (const write of writes) {
499
+ const value = write.value;
500
+ const type = known(value) ?? resolveExpr(value);
501
+ if (type)
502
+ types.push(type);
503
+ else
504
+ silent += 1;
505
+ }
506
+ if (types.length === 0 || (silent > 0 && !lenientPhase))
507
+ return null;
508
+ const joined = joinOfWrites(checker, types);
509
+ const dictionary = joined ? dictionaryTypeOf(checker, joined) : null;
510
+ return dictionary ? withNullish(checker, dictionary, wholeValueTypes) : null;
511
+ };
512
+ /** Whether the checker's raw answer at a write is a REAL fact refusing storage (`void`/`never`), as opposed to silence. */
513
+ const statesNoStorage = (node) => (checker.getTypeAtLocation(node).flags & (ts.TypeFlags.Void | ts.TypeFlags.Never)) !== 0;
514
+ /** Node-level memo/cycle-guard for the general resolver below. */
515
+ const nodeMemo = new Map();
516
+ const nodeResolving = new Set();
517
+ // The closed-family fallback is the parameter census's own rule, asked the
518
+ // same way -- see `flow/class-family-member-read.ts`.
519
+ const propertyTypeOf = (receiver, name, at) => memberTypeOf(checker, receiver, name, at, flow) ?? classFamilyMemberReadTypeOf(checker, flow, receiver, name, parameters);
520
+ /** The member symbol a census-resolved receiver declares under `name` -- the symbol a read through an `any` receiver could not name itself. */
521
+ const memberSymbolOf = (receiver, name) => checker.getPropertyOfType(checker.getNonNullableType(receiver), name) ?? null;
522
+ /** The expression a literal member was written with -- `{ depth: depthBuffer }` or shorthand `{ depthBuffer }` -- or `null` for any other declaration kind. */
523
+ const literalMemberInitializerOf = (member) => {
524
+ const declaration = member?.valueDeclaration;
525
+ if (!declaration)
526
+ return null;
527
+ if (ts.isPropertyAssignment(declaration))
528
+ return declaration.initializer;
529
+ if (ts.isShorthandPropertyAssignment(declaration))
530
+ return declaration.name;
531
+ return null;
532
+ };
533
+ /**
534
+ * The `value` initializer of an `Object.defineProperty(this, name, { value })`
535
+ * in the receiver class's constructor -- or `null` when no constructor of the
536
+ * class or its bases defines `name` that way.
537
+ *
538
+ * With `checkJs` off the checker declares NO member for a descriptor-defined
539
+ * field, so a read of it names no symbol and `memberSymbolOf` answers
540
+ * nothing; the class LAYOUT, which consumes the define-own-property
541
+ * operation, carries the field natively all the same. Three's `LOD` defines
542
+ * `levels` exactly this way (`define-property-source-transform.ts` lowers
543
+ * the `defineProperties` map to one call per key, binding the receiver and
544
+ * each descriptor to a `const` first), and every `this.levels` read fell to
545
+ * the checker's `any`, so `levels[ i ].hysteresis` reached a `*` as a box.
546
+ * The receiver may be `this` or a `const` alias of it, and the descriptor an
547
+ * object literal or a `const` bound to one: both are the shapes the
548
+ * transform emits.
549
+ */
550
+ const descriptorDefinedInitializerOf = (receiver, name) => {
551
+ const constInitializerOf = (expression) => {
552
+ if (!ts.isIdentifier(expression))
553
+ return null;
554
+ const declaration = checker.getSymbolAtLocation(expression)?.valueDeclaration;
555
+ if (!declaration || !ts.isVariableDeclaration(declaration) || !declaration.initializer)
556
+ return null;
557
+ if (!(ts.getCombinedNodeFlags(declaration) & ts.NodeFlags.Const))
558
+ return null;
559
+ return declaration.initializer;
560
+ };
561
+ const isThisReceiver = (expression) => expression.kind === ts.SyntaxKind.ThisKeyword || constInitializerOf(expression)?.kind === ts.SyntaxKind.ThisKeyword;
562
+ const descriptorLiteralOf = (expression) => {
563
+ if (ts.isObjectLiteralExpression(expression))
564
+ return expression;
565
+ const bound = constInitializerOf(expression);
566
+ return bound && ts.isObjectLiteralExpression(bound) ? bound : null;
567
+ };
568
+ const seen = new Set();
569
+ let current = checker.getNonNullableType(receiver);
570
+ while (current && !seen.has(current)) {
571
+ seen.add(current);
572
+ const declaration = current.getSymbol()?.valueDeclaration;
573
+ if (!declaration || !ts.isClassLike(declaration))
574
+ return null;
575
+ const constructor = declaration.members.find(ts.isConstructorDeclaration);
576
+ let found = null;
577
+ const visit = (node) => {
578
+ if (found || ts.isFunctionLike(node))
579
+ return;
580
+ if (ts.isCallExpression(node) &&
581
+ ts.isPropertyAccessExpression(node.expression) &&
582
+ ts.isIdentifier(node.expression.expression) &&
583
+ node.expression.expression.text === 'Object' &&
584
+ node.expression.name.text === 'defineProperty' &&
585
+ node.arguments.length === 3) {
586
+ const [target, key, descriptor] = node.arguments;
587
+ if (target && key && descriptor && ts.isStringLiteralLike(key) && key.text === name && isThisReceiver(target)) {
588
+ const literal = descriptorLiteralOf(descriptor);
589
+ const value = literal?.properties.find((property) => ts.isPropertyAssignment(property) &&
590
+ (ts.isIdentifier(property.name) || ts.isStringLiteral(property.name)) &&
591
+ property.name.text === 'value');
592
+ if (value) {
593
+ found = value.initializer;
594
+ return;
595
+ }
596
+ }
597
+ }
598
+ ts.forEachChild(node, visit);
599
+ };
600
+ if (constructor?.body)
601
+ visit(constructor.body);
602
+ if (found)
603
+ return found;
604
+ const bases = checker.getBaseTypes(current);
605
+ current = bases.length === 1 && bases[0] ? bases[0] : null;
606
+ }
607
+ return null;
608
+ };
609
+ /**
610
+ * The two arms of a NAMED read through a string index signature --
611
+ * `uniforms.dfgLUT` on three's `NativeUniforms = Record<string,
612
+ * NativeUniformSlot>` -- or `null` when the receiver declares the member (or
613
+ * nothing at all).
614
+ *
615
+ * Such a read names no property symbol, so `memberSymbolOf` and
616
+ * `propertyTypeOf` both answered nothing and every `uniforms.X.value = v`
617
+ * store in `WebGLRenderer.setProgram` boxed the slot to write through
618
+ * `reflectSet`. Answering the index signature's value type ALONE is the
619
+ * other failure: `m_uniforms.dfgLUT !== undefined` then folded to `true`
620
+ * and a phong material's uniforms, which have no `dfgLUT`, dereferenced the
621
+ * null slot. The read is the value OR absence, which is the same
622
+ * synthesized-union channel a field's disagreeing write set already
623
+ * publishes through (`unionArmsAt`): a lone dictionary read stays a
624
+ * per-key optional, and the comparison stays a real comparison.
625
+ */
626
+ const indexMemberArmsAt = (node) => {
627
+ if (checker.getSymbolAtLocation(node))
628
+ return null;
629
+ const receiver = receiverTypeOf(node.expression);
630
+ if (!receiver)
631
+ return null;
632
+ const object = checker.getNonNullableType(receiver);
633
+ if ((object.flags & (ts.TypeFlags.Any | ts.TypeFlags.Unknown)) !== 0)
634
+ return null;
635
+ if (checker.getPropertyOfType(object, node.name.text))
636
+ return null;
637
+ const indexed = checker.getIndexInfoOfType(object, ts.IndexKind.String)?.type;
638
+ if (!indexed || (indexed.flags & (ts.TypeFlags.Any | ts.TypeFlags.Unknown)) !== 0)
639
+ return null;
640
+ // Flat, like every other arm list this channel publishes: a declared
641
+ // `Array<...> | undefined` value contributes its own members, and the
642
+ // read's absence is the one `undefined` arm.
643
+ const members = indexed.isUnion() ? indexed.types : [indexed];
644
+ const present = members.filter((member) => (member.flags & ts.TypeFlags.Undefined) === 0);
645
+ return present.length === 0 ? null : [...present, checker.getUndefinedType()];
646
+ };
647
+ /** The census's type for a receiver expression: its resolved type, or the PRESENT arm of an index-signature read the union channel answers -- absence is the read's own guard, not the member lookup's. */
648
+ const receiverTypeOf = (expression) => {
649
+ const resolved = knownOrResolve(expression);
650
+ if (resolved)
651
+ return resolved;
652
+ const unwrapped = unwrapParens(expression);
653
+ if (!ts.isPropertyAccessExpression(unwrapped))
654
+ return null;
655
+ const arms = indexMemberArmsAt(unwrapped);
656
+ return arms?.find((arm) => (arm.flags & ts.TypeFlags.Undefined) === 0) ?? null;
657
+ };
658
+ /** `getSymbolAtLocation` for a member read, falling back to the census-resolved receiver's own member when the checker names none. */
659
+ const memberSymbolAt = (node) => {
660
+ const named = checker.getSymbolAtLocation(node);
661
+ if (named)
662
+ return named;
663
+ const receiver = knownOrResolve(node.expression);
664
+ return receiver ? memberSymbolOf(receiver, node.name.text) : null;
665
+ };
666
+ const attribute = (symbol, reason) => {
667
+ if (!refusalOf.has(symbol))
668
+ refusalOf.set(symbol, reason);
669
+ return null;
670
+ };
671
+ /**
672
+ * `symbol`'s own resolved type -- the join of every write to it -- or
673
+ * `null` when this module refuses it. Memoized in `bound`; cycle-guarded
674
+ * by `resolvingSymbols` so a field whose write reads itself (or another
675
+ * field/cell whose write reads this one) refuses instead of looping.
676
+ */
677
+ const resolveSymbol = (symbol) => {
678
+ const already = bound.get(symbol);
679
+ if (already)
680
+ return already;
681
+ if (unionArms.has(symbol))
682
+ return null;
683
+ if (!isCandidateSymbol(checker, symbol))
684
+ return null;
685
+ if (refusalOf.has(symbol))
686
+ return null;
687
+ if (resolvingSymbols.has(symbol))
688
+ return null;
689
+ resolvingSymbols.add(symbol);
690
+ const stated = statedBoundOfSymbol(checker, symbol);
691
+ let result = null;
692
+ const writes = writesOf(symbol);
693
+ const types = [];
694
+ let silent = 0;
695
+ let refused = null;
696
+ for (const write of writes) {
697
+ // A STATED CELL THE UPSTREAM CENSUS NARROWED OUTRANKS THE CHECKER at
698
+ // this write. `known` asks the checker first everywhere else, which is
699
+ // right when the checker's answer is the last word about the value --
700
+ // and wrong for exactly the value whose own cell was narrowed WITHIN a
701
+ // statement the checker still reports in full. hono's
702
+ // `this.#matchResult = matchResult` is the measured case: the parameter
703
+ // census already bound `matchResult` to the concrete
704
+ // `Result<[H, RouterRoute]>` its only caller passes, while the checker
705
+ // keeps answering the annotation's `Result<[unknown, RouterRoute]>`, so
706
+ // reading the checker here typed the FIELD as the upper bound and left
707
+ // the store between two disagreeing carriers -- the same
708
+ // two-authorities split every census here exists to close, one hop
709
+ // downstream. `statedTypeAt` answers only where such a narrowing was
710
+ // admitted, so this changes nothing anywhere else.
711
+ // An EMPTY literal the program writes is a fresh object with zero
712
+ // members, not the vacuous `{}` annotation `known` rightly discards --
713
+ // the same holder `parameter-bindings.ts`/`local-bindings.ts` already
714
+ // read it as (`exactEmptyObjectLiteralType`). three's
715
+ // `/** @type {Object} */ this.userData = {};` is the measured case:
716
+ // with that write silent, every class's `userData` fell back to the
717
+ // annotation's `any` and boxed the empty object it only ever holds.
718
+ const type = parameters.statedTypeAt(write) ?? exactEmptyObjectLiteralType(checker, write) ?? known(write) ?? resolveExpr(write);
719
+ if (type)
720
+ types.push(type);
721
+ // A write typed `void`/`never` is a real fact stating the storage holds
722
+ // nothing a program can use -- a veto in both phases, exactly as
723
+ // `parameter-bindings.ts` keeps `call-passes-no-argument` firing in its
724
+ // own relaxed phase. Only a write nobody could type at all is SILENCE.
725
+ else if (statesNoStorage(write)) {
726
+ refused = 'write-states-no-storage';
727
+ break;
728
+ }
729
+ else
730
+ silent += 1;
731
+ }
732
+ // A bare `field;` nothing ever writes says nothing about its storage --
733
+ // distinct from a disagreement, and left exactly as the checker has it.
734
+ if (writes.length === 0)
735
+ attribute(symbol, 'no-writes');
736
+ else if (refused)
737
+ attribute(symbol, refused);
738
+ // EVIDENCE EXHAUSTED -- the same rule, the same order, as
739
+ // `parameter-bindings.ts`'s `skipSilentSites` phase: a write that states
740
+ // nothing is not a write that disagrees. In the strict phase one silent
741
+ // write still refuses the whole field; the relaxed retry (below, run only
742
+ // over fields the strict pass could not bind) joins the writes that DO
743
+ // speak. `writes-disagree` still fires over what remains, and a field
744
+ // whose every write is silent refuses exactly as before. Measured shape:
745
+ // `Vector3`'s `x`/`y`/`z` carry 34 writes each, 33 typed `number` and one
746
+ // (`this.x = e[ 12 ]`, `e` unannotated) silent -- 759 reads boxed by a
747
+ // veto that read no fact.
748
+ else if (silent > 0 && (!lenientPhase || types.length === 0))
749
+ attribute(symbol, 'write-unresolved');
750
+ else {
751
+ const joined = joinOfWrites(checker, types);
752
+ if (joined)
753
+ result = joined;
754
+ else {
755
+ // The join found no single covering type. Before refusing, ask
756
+ // whether the disagreement is itself a sound answer -- see
757
+ // `disjointUnionMembersOf`'s own comment for what "sound" means.
758
+ const arms = disjointUnionMembersOf(checker, types);
759
+ if (arms)
760
+ unionArms.set(symbol, arms);
761
+ else
762
+ attribute(symbol, 'writes-disagree');
763
+ }
764
+ }
765
+ // A field's OWN writes settled on NOTHING -- no `x.field = expr` at all,
766
+ // or every one silent. Before leaving it there, ask whether the program
767
+ // instead writes THROUGH it: `dictionaryShapeOf` reads exactly that,
768
+ // uniformly by slot rather than by syntax (see its own comment). Tried
769
+ // only here, as a fallback -- a field whose own writes already answered
770
+ // something (bound, union-armed, or refused for a REAL reason such as
771
+ // `write-states-no-storage`/`writes-disagree`) keeps that answer.
772
+ // A STATED field is held to its statement, exactly as
773
+ // `parameter-bindings.ts` holds a stated parameter to its own: the join
774
+ // has to be assignable to the annotation (the floor -- a write the
775
+ // annotation forbids is not what this field holds, whatever the writes
776
+ // say) AND to differ from it only where the annotation said nothing. A
777
+ // synthesized disjoint union is refused outright: those arms are a member
778
+ // LIST for `table.intern`, never a `ts.Type` the statement can be tested
779
+ // against, so there is nothing to hold it to.
780
+ // See `interfaceAnnotationOfField`: an `interface` annotation describes a
781
+ // slot's readers, never its storage, so a join that settles on ONE CLASS
782
+ // satisfying it is what the slot holds -- including where the annotation
783
+ // ALSO left a position unstated, which is the ordinary case for a generic
784
+ // interface and would otherwise be refused below as narrowing a stated
785
+ // position (the class is a different nominal type, not a filled hole).
786
+ const declaredInterface = interfaceBoundOfSymbol(checker, symbol);
787
+ const classSatisfiesInterface = declaredInterface !== null &&
788
+ result !== null &&
789
+ !unionArms.has(symbol) &&
790
+ isClassInstanceType(result) &&
791
+ checker.isTypeAssignableTo(result, declaredInterface);
792
+ if (declaredInterface !== null && !classSatisfiesInterface && !stated) {
793
+ if (unionArms.has(symbol)) {
794
+ unionArms.delete(symbol);
795
+ attribute(symbol, 'interface-field-synthesized-union');
796
+ }
797
+ else if (result) {
798
+ result = null;
799
+ attribute(symbol, 'interface-field-write-is-not-a-satisfying-class');
800
+ }
801
+ }
802
+ if (classSatisfiesInterface && result)
803
+ statedBindings.set(symbol, result);
804
+ if (stated && !classSatisfiesInterface) {
805
+ if (unionArms.has(symbol)) {
806
+ unionArms.delete(symbol);
807
+ attribute(symbol, 'stated-field-synthesized-union');
808
+ }
809
+ else if (result && carriesUnsubstitutedGeneric(checker, result)) {
810
+ result = null;
811
+ attribute(symbol, 'stated-field-open-generic');
812
+ }
813
+ else if (result && !checker.isTypeAssignableTo(result, stated.bound)) {
814
+ result = null;
815
+ attribute(symbol, 'stated-field-write-not-assignable');
816
+ }
817
+ else if (result && !narrowsOnlyUnstatedPositions(checker, stated.declaration, stated.bound, result)) {
818
+ result = null;
819
+ attribute(symbol, 'stated-field-narrows-a-stated-position');
820
+ }
821
+ if (result)
822
+ statedBindings.set(symbol, result);
823
+ }
824
+ // A stated field takes no dictionary fallback: the program described the
825
+ // storage, so "the program writes THROUGH it" is not a reading of an
826
+ // absence any more -- it is a second opinion about a slot that already
827
+ // has one.
828
+ if (!result && !stated && !unionArms.has(symbol)) {
829
+ const reason = refusalOf.get(symbol);
830
+ if (reason === 'no-writes' || reason === 'write-unresolved') {
831
+ const shape = dictionaryShapeOf(symbol, types);
832
+ if (shape) {
833
+ result = shape;
834
+ refusalOf.delete(symbol);
835
+ }
836
+ }
837
+ }
838
+ resolvingSymbols.delete(symbol);
839
+ if (result)
840
+ bound.set(symbol, result);
841
+ return result;
842
+ };
843
+ const unwrapParens = (node) => {
844
+ let current = node;
845
+ while (ts.isParenthesizedExpression(current))
846
+ current = current.expression;
847
+ return current;
848
+ };
849
+ /** Preserve upstream receiver evidence before deriving a field answer. Casts remain explicit boundaries. */
850
+ const knownOrResolve = (node) => {
851
+ const unwrapped = unwrapParens(node);
852
+ if (ts.isAsExpression(unwrapped) || ts.isTypeAssertionExpression(unwrapped))
853
+ return known(unwrapped);
854
+ return known(node) ?? parameters.typeAt(node) ?? resolveExpr(node);
855
+ };
856
+ /**
857
+ * The general walk. A property access checks whether ITS OWN symbol is a
858
+ * field candidate first -- a write's left-hand side and a read are the
859
+ * SAME symbol, so both answer from the SAME `resolveSymbol` computation --
860
+ * and only falls to the ordinary receiver-typed property lookup when it is
861
+ * not. Every other node kind recurses through the SAME upstream-first rule
862
+ * at its own operands, so a chain like `this.view.enabled` resolves once
863
+ * `view` does, regardless of which layer actually answered it.
864
+ */
865
+ const compute = (node) => {
866
+ if (ts.isParenthesizedExpression(node) ||
867
+ ts.isAsExpression(node) ||
868
+ ts.isNonNullExpression(node) ||
869
+ ts.isTypeAssertionExpression(node)) {
870
+ return knownOrResolve(node.expression);
871
+ }
872
+ // A bare `field;` declaration is a node a downstream producer can publish
873
+ // a carrier from, so it MUST answer identically to every read of the same
874
+ // slot -- both from this one `resolveSymbol` computation. Answering reads
875
+ // while leaving the declaration to the checker's `any` is precisely the
876
+ // two-authorities-on-one-storage-location split that manufactures
877
+ // `binding-read-conversion` obligations; see `local-bindings.ts`'s header,
878
+ // which mirrors this hop for a `VariableDeclaration`.
879
+ if (ts.isPropertyDeclaration(node)) {
880
+ const declared = checker.getSymbolAtLocation(node.name);
881
+ return declared ? resolveSymbol(declared) : null;
882
+ }
883
+ if (ts.isPropertyAccessExpression(node)) {
884
+ const symbol = checker.getSymbolAtLocation(node);
885
+ if (symbol && isCandidateSymbol(checker, symbol))
886
+ return resolveSymbol(symbol);
887
+ const receiver = receiverTypeOf(node.expression);
888
+ if (!receiver)
889
+ return null;
890
+ // A named read through an index signature is answered as a union by
891
+ // `unionArmsAt` (see `indexMemberArmsAt`); a single type here would
892
+ // state presence the receiver never declared.
893
+ if (indexMemberArmsAt(node))
894
+ return null;
895
+ // An `any` receiver names no symbol,
896
+ // so the checker cannot say which field this read names -- but the
897
+ // census just resolved the receiver, and THAT type does. Look the member
898
+ // up on it and answer from this census's own write-set join, exactly as
899
+ // a read the checker could attribute is answered above. Without this
900
+ // hop the read fell to `propertyTypeOf`, which reads the checker's
901
+ // `any` for the field and refuses, so the census had typed the field
902
+ // AND the receiver and still boxed the read between them: three's
903
+ // `WebGLShadowMap( renderer, ... )` binds `renderer` from its one call
904
+ // site, `renderer.state` resolved to the typed struct field in the
905
+ // emitted C++, and `const _state = renderer.state` was laid out
906
+ // `gea::Value` from the checker's `any` -- every `_state.setBlending()`
907
+ // then went through dynamic lookup and threw on the first frame.
908
+ const member = symbol ? null : memberSymbolOf(receiver, node.name.text);
909
+ if (member && isCandidateSymbol(checker, member))
910
+ return resolveSymbol(member);
911
+ const typed = propertyTypeOf(receiver, node.name.text, node);
912
+ if (typed)
913
+ return typed;
914
+ // An OBJECT-LITERAL member the checker types `any` still has the one
915
+ // expression that filled it. Three's `WebGLState` returns
916
+ // `{ buffers: { depth: depthBuffer, ... } }` where `depthBuffer` is
917
+ // `new DepthBuffer()` -- `new` on a JS factory with no construct
918
+ // signature, `any` to the checker, a typed record to this census (the
919
+ // parameter census reads the factory's return). The literal's LAYOUT was
920
+ // already derived from that initializer, so the struct carries `depth`
921
+ // natively; a READ answered `null` here instead, and the emitter then
922
+ // boxed the native callable field to call it dynamically -- which threw
923
+ // on the first frame of the app's shadow pass. Answer the read from the
924
+ // same initializer the layout came from.
925
+ const filled = literalMemberInitializerOf(member ?? memberSymbolOf(receiver, node.name.text)) ??
926
+ descriptorDefinedInitializerOf(receiver, node.name.text);
927
+ return filled ? knownOrResolve(filled) : null;
928
+ }
929
+ if (ts.isElementAccessExpression(node) && node.argumentExpression) {
930
+ const receiver = knownOrResolve(node.expression);
931
+ if (!receiver)
932
+ return collections.arrayElementForRead(node.expression);
933
+ // A literal key is a named member spelled with brackets; any other key
934
+ // is answered by the receiver's index signature, and by nothing else.
935
+ const name = literalMemberNameOf(node);
936
+ if (name !== null)
937
+ return propertyTypeOf(receiver, name, node);
938
+ const key = knownOrResolve(node.argumentExpression);
939
+ if (!key)
940
+ return null;
941
+ // See `return-bindings.ts`'s identical fallback: a resolved receiver
942
+ // with no index signature of its own is still answerable from the
943
+ // array census's own push/write evidence.
944
+ return indexedTypeOf(checker, receiver, key, node, flow, parameters) ?? collections.arrayElementForRead(node.expression);
945
+ }
946
+ if (ts.isIdentifier(node))
947
+ return parameters.typeAt(node);
948
+ if (ts.isCallExpression(node) || ts.isNewExpression(node)) {
949
+ const upstream = parameters.typeAt(node);
950
+ if (upstream)
951
+ return upstream;
952
+ const invariant = overloadInvariantReturnTypeAt(checker, node, knownOrResolve);
953
+ if (invariant)
954
+ return invariant;
955
+ const callee = knownOrResolve(node.expression);
956
+ if (!callee)
957
+ return null;
958
+ const constructed = ts.isNewExpression(node) ? callee.getConstructSignatures() : [];
959
+ const signatures = constructed.length > 0 ? constructed : callee.getCallSignatures();
960
+ if (signatures.length !== 1)
961
+ return null;
962
+ const signature = signatures[0];
963
+ const unwrapped = ts.isCallExpression(node) ? unwrapExplicitThisCall(checker, node) : null;
964
+ const returned = explicitThisCallReturnType(signature, unwrapped ? knownOrResolve(unwrapped.callee) : null);
965
+ if ((returned.flags & (ts.TypeFlags.Void | ts.TypeFlags.Never)) !== 0)
966
+ return null;
967
+ return isAnyType(returned) ? null : returned;
968
+ }
969
+ if (ts.isBinaryExpression(node) && node.operatorToken.kind === ts.SyntaxKind.EqualsToken)
970
+ return knownOrResolve(node.right);
971
+ if (ts.isConditionalExpression(node) || ts.isBinaryExpression(node) || ts.isTemplateExpression(node)) {
972
+ return derivedExpressionType(checker, node, (operand) => knownOrResolve(operand));
973
+ }
974
+ return null;
975
+ };
976
+ const resolveExpr = (node) => {
977
+ const cached = nodeMemo.get(node);
978
+ if (cached !== undefined)
979
+ return cached;
980
+ if (nodeResolving.has(node))
981
+ return null;
982
+ nodeResolving.add(node);
983
+ const answer = compute(node);
984
+ nodeResolving.delete(node);
985
+ nodeMemo.set(node, answer);
986
+ return answer;
987
+ };
988
+ // Enumerate every candidate SYMBOL up front, from every `x.field = expr`
989
+ // write's left-hand side, so `boundCount`/`refusals` reflect the whole
990
+ // program rather than only the nodes some other pass happened to query.
991
+ const candidateSymbols = new Set();
992
+ const visit = (node) => {
993
+ if (ts.isBinaryExpression(node) && node.operatorToken.kind === ts.SyntaxKind.EqualsToken && ts.isPropertyAccessExpression(node.left)) {
994
+ const symbol = checker.getSymbolAtLocation(node.left);
995
+ if (symbol && isCandidateSymbol(checker, symbol))
996
+ candidateSymbols.add(symbol);
997
+ }
998
+ // A bare `field;` is a candidate whether or not anything writes it -- one
999
+ // nothing writes must be REFUSED rather than absent, or `refusals` stops
1000
+ // describing the program.
1001
+ if (ts.isPropertyDeclaration(node)) {
1002
+ const declared = checker.getSymbolAtLocation(node.name);
1003
+ if (declared && isCandidateSymbol(checker, declared))
1004
+ candidateSymbols.add(declared);
1005
+ }
1006
+ ts.forEachChild(node, visit);
1007
+ };
1008
+ for (const file of files)
1009
+ forEachReachableStatement(reachable, file, visit);
1010
+ for (const symbol of candidateSymbols)
1011
+ resolveSymbol(symbol);
1012
+ // The relaxed phase, run only once the strict pass has settled -- so every
1013
+ // field the strict rule can bind is bound from ALL its writes before any
1014
+ // field is bound from a subset. Rounds repeat because a field bound from
1015
+ // surviving evidence is itself evidence for another field's writes; the
1016
+ // node memo is cleared each round because its cached nulls are answers to
1017
+ // the smaller view. Terminates because bindings are only ever added.
1018
+ lenientPhase = true;
1019
+ for (;;) {
1020
+ const retry = [...candidateSymbols].filter((symbol) => !bound.has(symbol) && refusalOf.get(symbol) === 'write-unresolved');
1021
+ if (retry.length === 0)
1022
+ break;
1023
+ for (const symbol of retry)
1024
+ refusalOf.delete(symbol);
1025
+ nodeMemo.clear();
1026
+ const before = bound.size;
1027
+ for (const symbol of retry)
1028
+ resolveSymbol(symbol);
1029
+ if (bound.size === before)
1030
+ break;
1031
+ }
1032
+ /**
1033
+ * A refusal's `owner` for a field SYMBOL: its own name and where the
1034
+ * program first declares/writes it -- the same rendering
1035
+ * `local-bindings.ts`'s `ownerOfDeclaration` uses for a `VariableDeclaration`,
1036
+ * asked of a symbol whose "declaration" is often a bare `x.field = expr`
1037
+ * assignment rather than a real declaration node, which is why the name
1038
+ * comes from `checker.symbolToString` (works for either shape) rather than
1039
+ * from a `.name` a `BinaryExpression` declaration does not have.
1040
+ */
1041
+ const ownerOfSymbol = (symbol) => {
1042
+ const declaration = symbol.declarations?.[0];
1043
+ if (!declaration)
1044
+ return checker.symbolToString(symbol);
1045
+ const file = declaration.getSourceFile();
1046
+ const line = file.getLineAndCharacterOfPosition(declaration.getStart()).line + 1;
1047
+ return `${checker.symbolToString(symbol)} (${file.fileName}:${line})`;
1048
+ };
1049
+ // `root` is the same stable, hand-written reason string this census always
1050
+ // keyed its old count map by (`no-writes`, `write-unresolved`,
1051
+ // `writes-disagree`, one of the `stated-field-*`/`interface-field-*`
1052
+ // family, ...) -- never node text or a type spelling, so it is already the
1053
+ // ROOT `census-refusal.ts` asks for. `owner` is the new fact: the symbol's
1054
+ // own name and source location, the one thing a count could never say.
1055
+ const refusals = [];
1056
+ for (const symbol of candidateSymbols) {
1057
+ if (bound.has(symbol) || unionArms.has(symbol))
1058
+ continue;
1059
+ const root = refusalOf.get(symbol) ?? 'unresolved';
1060
+ refusals.push(censusRefusal('field', root, root, ownerOfSymbol(symbol)));
1061
+ }
1062
+ /** The union-arms mirror of `compute`'s two symbol-resolving node shapes -- a leaf lookup, not a walk: a synthesized union is never itself an operand another expression resolves through. */
1063
+ const unionArmsAt = (node) => {
1064
+ if (ts.isPropertyDeclaration(node)) {
1065
+ const declared = checker.getSymbolAtLocation(node.name);
1066
+ return declared ? (unionArms.get(declared) ?? null) : null;
1067
+ }
1068
+ if (ts.isPropertyAccessExpression(node)) {
1069
+ const symbol = memberSymbolAt(node);
1070
+ if (symbol)
1071
+ return unionArms.get(symbol) ?? null;
1072
+ return indexMemberArmsAt(node);
1073
+ }
1074
+ return null;
1075
+ };
1076
+ /** The `unionArmsAt` shape asked of `statedBindings` -- the same two symbol-resolving node kinds, a leaf lookup rather than a walk. */
1077
+ const statedTypeAt = (node) => {
1078
+ if (statedBindings.size === 0)
1079
+ return null;
1080
+ const symbol = ts.isPropertyDeclaration(node)
1081
+ ? checker.getSymbolAtLocation(node.name)
1082
+ : ts.isPropertyAccessExpression(node)
1083
+ ? memberSymbolAt(node)
1084
+ : ts.isElementAccessExpression(node)
1085
+ ? checker.getSymbolAtLocation(node)
1086
+ : undefined;
1087
+ return symbol ? (statedBindings.get(symbol) ?? null) : null;
1088
+ };
1089
+ return {
1090
+ typeAt: (node) => resolveExpr(node),
1091
+ unionArmsAt,
1092
+ statedTypeAt,
1093
+ boundCount: bound.size + unionArms.size,
1094
+ refusals,
1095
+ refusalOf: (symbol) => refusalOf.get(symbol) ?? null
1096
+ };
1097
+ };
1098
+ /**
1099
+ * A `ParameterBindingCensus`-shaped view answering from BOTH: `parameters`'s
1100
+ * own answer first, this census's otherwise -- composed exactly as
1101
+ * `local-bindings.ts`'s own `withLocalBindings` is, and meant to sit
1102
+ * immediately after it in `frontend.ts`:
1103
+ *
1104
+ * const parameters = withFieldBindings(checker, files, withLocalBindings(checker, files, withReturnBindings(...)))
1105
+ */
1106
+ export const withFieldBindings = (checker, files, reachable, parameters, collections = emptyCollectionBindingCensus, flow) => {
1107
+ const fields = censusFieldBindings(checker, files, reachable, parameters, collections, flow);
1108
+ // `ParameterBindingCensus.refusals` is itself a `readonly CensusRefusal[]`
1109
+ // now (`parameter-bindings.ts`'s own conversion), so composing the two
1110
+ // lists is a plain concatenation -- no reason-string prefixing, no count
1111
+ // merge, and nothing to disagree about. `censusRefusal('field', ...)`
1112
+ // already namespaces every key as `census:field:<root>`, distinct from
1113
+ // `parameters`' own `census:parameter:<root>`/`census:local:<root>`/etc.
1114
+ // keys by construction, so nothing here can collide the way the old
1115
+ // `field:${reason}` string concatenation existed to prevent.
1116
+ const refusals = [...parameters.refusals, ...fields.refusals];
1117
+ return {
1118
+ ...parameters,
1119
+ typeAt: (node) => parameters.typeAt(node) ?? fields.typeAt(node),
1120
+ statedTypeAt: (node) => parameters.statedTypeAt(node) ?? fields.statedTypeAt(node),
1121
+ unionArmsAt: (node) => parameters.unionArmsAt(node) ?? fields.unionArmsAt(node),
1122
+ boundCount: parameters.boundCount + fields.boundCount,
1123
+ refusals
1124
+ };
1125
+ };