@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,1053 @@
1
+ import { isObjectTagCalleePart } from './object-tag.js';
2
+ import ts from 'typescript';
3
+ import { operationId, semanticResultId } from '../../../identity/ids.js';
4
+ import { normalCompletion, pureEffects, throwingCompletion } from '../../model/operands.js';
5
+ import { blocked, mintOperationId, mintResult, operand } from './mint.js';
6
+ import { optionalChainGuardOf, publishesShortCircuit } from './optional-chain.js';
7
+ import { excludesNullish } from './nullish.js';
8
+ import { calleeAwareTypeAt, isStrictContext, logicalAssignmentOperators, sourceForValue, symbolMemberKeyOf } from './shared.js';
9
+ import { citeExpressionResult } from './references.js';
10
+ import { isGlobalFunctionConstructor, literalMemberNameOf } from '../derived-expression-type.js';
11
+ import { enclosingCallIfCallee, outermostErasureOf, unwrapErasedExpression } from './erasure.js';
12
+ import { isScriptGlobalObjectPropertyDeclaration } from '../script-global-redefinition.js';
13
+ import { primitivePropertyIsAbsent } from '../primitive-property-absence.js';
14
+ import { assertedReceiverArmMayLackMember } from '../asserted-arm-absence.js';
15
+ const compoundAssignmentOperators = new Set([
16
+ ts.SyntaxKind.PlusEqualsToken,
17
+ ts.SyntaxKind.MinusEqualsToken,
18
+ ts.SyntaxKind.AsteriskEqualsToken,
19
+ ts.SyntaxKind.AsteriskAsteriskEqualsToken,
20
+ ts.SyntaxKind.SlashEqualsToken,
21
+ ts.SyntaxKind.PercentEqualsToken,
22
+ ts.SyntaxKind.LessThanLessThanEqualsToken,
23
+ ts.SyntaxKind.GreaterThanGreaterThanEqualsToken,
24
+ ts.SyntaxKind.GreaterThanGreaterThanGreaterThanEqualsToken,
25
+ ts.SyntaxKind.AmpersandEqualsToken,
26
+ ts.SyntaxKind.BarEqualsToken,
27
+ ts.SyntaxKind.CaretEqualsToken
28
+ ]);
29
+ /**
30
+ * `&&=`/`||=`/`??=` only write when the guard takes a particular branch, which
31
+ * is the same short-circuit primitive optional chaining needs and that is not
32
+ * installed yet. Modelling them as an unconditional get-then-set would write a
33
+ * value the source program would have left untouched -- a silent miscompile,
34
+ * not a simplification -- so they are blocked instead.
35
+ */
36
+ const intentOf = (node) => {
37
+ // The position this access occupies is read past the wrappers that erase:
38
+ // `o.p! = 1` and `(o.p) = 1` are the same store `o.p = 1` is, and reading
39
+ // the raw `parent` saw the `!` and published no store at all.
40
+ const placed = outermostErasureOf(node);
41
+ const parent = placed.parent;
42
+ if (ts.isDeleteExpression(parent) && parent.expression === placed)
43
+ return { kind: 'delete' };
44
+ // `k in o.p` is deliberately NOT a `[[HasProperty]]` on `o`. ECMA-262 13.10.1
45
+ // evaluates the right operand with GetValue -- an ordinary `[[Get]]` of `p`
46
+ // -- and performs `HasProperty` on the RESULT, keyed by the LEFT operand. An
47
+ // access classified here by its position under `in` would ask the wrong
48
+ // question of the wrong object: `'value' in table.a` became `table.has("a")`,
49
+ // which is a different key on a different receiver, and the boolean it
50
+ // published then poisoned the operator's own object operand. The operator
51
+ // owns its `[[HasProperty]]`; `ir/lower.ts` lowers it to the shared
52
+ // primitive, and this family only ever reads.
53
+ if (ts.isBinaryExpression(parent) && parent.left === placed) {
54
+ const operator = parent.operatorToken.kind;
55
+ if (operator === ts.SyntaxKind.EqualsToken)
56
+ return { kind: 'set' };
57
+ if (logicalAssignmentOperators.has(operator)) {
58
+ return {
59
+ kind: 'logical-set',
60
+ takenWhen: operator === ts.SyntaxKind.AmpersandAmpersandEqualsToken
61
+ ? 'truthy'
62
+ : operator === ts.SyntaxKind.BarBarEqualsToken
63
+ ? 'falsy'
64
+ : 'nullish'
65
+ };
66
+ }
67
+ if (compoundAssignmentOperators.has(operator))
68
+ return { kind: 'get-then-set' };
69
+ }
70
+ if ((ts.isPrefixUnaryExpression(parent) || ts.isPostfixUnaryExpression(parent)) &&
71
+ parent.operand === placed &&
72
+ (parent.operator === ts.SyntaxKind.PlusPlusToken || parent.operator === ts.SyntaxKind.MinusMinusToken)) {
73
+ return { kind: 'get-then-set' };
74
+ }
75
+ return { kind: 'get' };
76
+ };
77
+ const keyOf = (node, context) => {
78
+ // A static key is a String, whatever the property it names holds. Asking the
79
+ // checker for the type at the name node answers a different question -- it
80
+ // gives the *property's* type -- and taking that answer spells the key with
81
+ // the value's carrier, so `origin.y` looks up a `double` named `y`.
82
+ const staticKeyType = context.table.intern({ kind: 'primitive', primitive: 'string' });
83
+ if (ts.isPropertyAccessExpression(node)) {
84
+ // A private name is a static key exactly as a written one is, and needs no
85
+ // brand check *here*. ECMA-262 13.3.2.1 does perform one --
86
+ // `PrivateElementFind` throws a `TypeError` when the receiver carries no
87
+ // matching PrivateElement -- but the checker has already proven this
88
+ // receiver does: a private name is in scope only inside the class that
89
+ // declares it, and the checker refuses `o.#x` for any `o` whose type is not
90
+ // that class. So the only receiver this syntax can ever reach is one whose
91
+ // layout has the member, and the find cannot fail.
92
+ //
93
+ // What genuinely needs the brand check is `#x in o`, whose whole purpose is
94
+ // asking about a receiver that might not be an instance; that reaches the
95
+ // reference producer, not this one, and is refused by name there.
96
+ //
97
+ // `node.name.text` carries the `#` for a private name, which is precisely
98
+ // the spelling the checker reports for the member -- so this read and
99
+ // `class-lifecycle.ts`'s definition name one member without either side
100
+ // inventing a mangling.
101
+ return { kind: 'key', computed: false, source: { kind: 'constant', text: node.name.text, literal: 'string' }, type: staticKeyType };
102
+ }
103
+ const argument = node.argumentExpression;
104
+ if (ts.isStringLiteralLike(argument) || ts.isNumericLiteral(argument)) {
105
+ // ToPropertyKey turns a numeric index into a String too: `o[0]` and `o["0"]`
106
+ // reach the same property, and giving one a numeric carrier would make two
107
+ // spellings of one key look like two different keys.
108
+ return { kind: 'key', computed: false, source: { kind: 'constant', text: argument.text, literal: 'string' }, type: staticKeyType };
109
+ }
110
+ const argumentType = context.types.typeAt(argument);
111
+ // A `unique symbol` key that names a DECLARED member is compile-time-known:
112
+ // `class C { [S]: T }` declares a member and `this[S]` reads it, exactly as
113
+ // `this.x` reads `x`. Carrying it as a constant is what makes a symbol-named
114
+ // field an ordinary struct member load rather than a dynamic lookup -- and
115
+ // `staticKeyType` is right for it for the same reason it is right for
116
+ // `o[0]`: what the operand carries is the key's canonical *text*, never a
117
+ // runtime symbol value (which a literal could not reproduce anyway, since
118
+ // `Symbol()` mints a fresh one per evaluation).
119
+ //
120
+ // The same syntax over an INDEX SIGNATURE (`(o as Record<symbol, T>)[S]`) is
121
+ // deliberately left computed: that is a real dynamic-table lookup keyed by
122
+ // the symbol's runtime value, and spelling it as a static text would file it
123
+ // under the string half of the object's key space, where `Object.keys` would
124
+ // list a property whose whole purpose is not being enumerated.
125
+ // `symbolMemberKeyOf` asks the receiver's own shape which of the two this is.
126
+ const symbolKey = symbolMemberKeyOf(context, node.expression, argumentType);
127
+ if (symbolKey !== null) {
128
+ return { kind: 'key', computed: false, source: { kind: 'constant', text: symbolKey, literal: 'string' }, type: staticKeyType };
129
+ }
130
+ const cited = citeExpressionResult(argument, context);
131
+ if (cited.kind === 'unmodelled')
132
+ return { kind: 'blocked', reason: cited.reason, missingPrimitive: null };
133
+ return { kind: 'key', computed: true, source: cited.source, type: argumentType };
134
+ };
135
+ /**
136
+ * What the `[[Get]]` inside `a?.b` produces.
137
+ *
138
+ * The checker types the whole expression `T | undefined`, and only part of that
139
+ * `undefined` belongs to the operator. The rest can be the property's own:
140
+ * `w.options?.name` where `name?: string` is `string | undefined` for two
141
+ * independent reasons, and stripping both would tell the backend the read
142
+ * yields a `string` wherever the receiver was present -- which it does not when
143
+ * the property is simply absent.
144
+ *
145
+ * So the strip is licensed rather than assumed. The property's type on the
146
+ * *narrowed* receiver is asked, and the `undefined` is removed only when that
147
+ * type has none of its own. A key this cannot ask about -- a computed one, an
148
+ * index signature, a receiver with no such property -- keeps the union, which
149
+ * is wider than the truth and never narrower than it.
150
+ */
151
+ const presentValueTypeOf = (node, key, valueType, context) => {
152
+ if (key.source.kind !== 'constant')
153
+ return valueType;
154
+ // The `undefined` an arm lacking the member answers is the READ's, not the
155
+ // operator's; the asserted receiver below declares the member and would
156
+ // take it off.
157
+ if (assertedReadMayLackMember(context, node))
158
+ return valueType;
159
+ // HOLDS: the receiver, read the census-aware way (`context.types.rawTypeAt`)
160
+ // rather than the bare checker -- an under-typed receiver the parameter/
161
+ // return census resolved must not fall back to `any` here, or
162
+ // `getPropertyOfType` below finds nothing and this whole strip silently
163
+ // never fires.
164
+ const receiver = context.checker.getNonNullableType(context.types.rawTypeAt(node.expression));
165
+ const property = context.checker.getPropertyOfType(receiver, key.source.text);
166
+ // An optional property declares its own `undefined` in the modifier rather
167
+ // than in the type, and a location-sensitive read can hand it back already
168
+ // stripped, so the modifier is consulted first and believed.
169
+ if (!property || (property.flags & ts.SymbolFlags.Optional) !== 0)
170
+ return valueType;
171
+ // STATED: the resolved member's own type at this read location -- given a
172
+ // real property symbol (found above, on the now-census-corrected
173
+ // receiver), its declared/narrowed type is the checker's own question to
174
+ // answer, not one a census re-derives.
175
+ if (!excludesNullish(context.checker.getTypeOfSymbolAtLocation(property, node)))
176
+ return valueType;
177
+ // HOLDS: this read's own value, which is `valueType` -- already the
178
+ // census-aware, callee-aware answer for this exact node -- with the
179
+ // operator's absence taken off. Re-deriving it from the checker
180
+ // (`typeOf(getNonNullableType(rawTypeAt(node)))`) threw away every
181
+ // node-keyed correction the mapper had made and published the checker's
182
+ // raw reading instead: `host.realpath?.bind(host)` came back as
183
+ // `Function.prototype.bind`'s five-overload set --
184
+ // `unresolved(no primitive joining 2 overload signatures)` -- while the
185
+ // non-optional `host.readFile.bind(host)` beside it resolved fine. One
186
+ // read, two authorities, and the strip was the only place they parted.
187
+ return withoutAbsentMembers(context, valueType);
188
+ };
189
+ /** One structural type with its `undefined`/`null` members removed -- the absence an optional chain's operator adds, taken back off. */
190
+ const withoutAbsentMembers = (context, type) => {
191
+ const shape = context.table.get(type).shape;
192
+ if (shape.kind !== 'union')
193
+ return type;
194
+ const members = shape.members.filter((member) => {
195
+ const own = context.table.get(member).shape;
196
+ return own.kind !== 'primitive' || (own.primitive !== 'undefined' && own.primitive !== 'null');
197
+ });
198
+ if (members.length === 0 || members.length === shape.members.length)
199
+ return type;
200
+ return members.length === 1 ? members[0] : context.table.intern({ kind: 'union', members });
201
+ };
202
+ /** The function-object protocol's own keys -- see `fixedCallableSurface`'s use below. */
203
+ const fixedCallableSurface = new Set(['name', 'length', 'prototype', 'caller', 'arguments']);
204
+ /**
205
+ * A callable's own non-fixed property, read at its DECLARED (never narrowed)
206
+ * type, or `null` for every access this does not apply to.
207
+ *
208
+ * A callable value's own extra properties -- `validate.errors`,
209
+ * `callableConstructor.sidecar` -- live in one shared, boxed `properties`
210
+ * table on the callable's identity (`gea::callableDynamicGet`), reachable
211
+ * through `Reflect.set`/`Object.defineProperty`/a computed write the checker
212
+ * never models as an assignment to THIS property. TypeScript's control-flow
213
+ * narrowing is sound only against assignments syntactically visible to it --
214
+ * `callableConstructor.sidecar = 7` narrows the next read to `number`, a
215
+ * `delete` narrows it to `undefined`, and neither narrowing is ever
216
+ * invalidated by a `Reflect.set` that does the exact same write through a
217
+ * call the analysis does not track. An ordinary struct field has no such gap:
218
+ * its storage IS the declared type, so a narrowed read only ever narrows how
219
+ * the call is RENDERED, never what the runtime can hold there. A callable's
220
+ * sidecar has no struct field -- narrowing it therefore narrows what the
221
+ * runtime is TRUSTED to hold, and `Reflect.set(callableConstructor,
222
+ * 'sidecar', 8)` right before this exact read (`callable-intersection.ts`)
223
+ * is a real, spec-legal write a narrowed `unboxAs<gea::Undefined>` aborts on.
224
+ *
225
+ * `checker.getTypeOfSymbol` is TypeScript's own "ignore control flow" escape
226
+ * hatch: the member's declared type is, by definition, every value any
227
+ * write -- visible to the checker or not -- may legally store. Excluded: a
228
+ * callee position (`calleeAwareTypeAt` owns that, and correctly narrows to
229
+ * the resolved signature actually invoked) and a computed key (handled
230
+ * entirely dynamically elsewhere already).
231
+ */
232
+ const declaredMemberTypeOf = (context, node) => {
233
+ if (!ts.isPropertyAccessExpression(node))
234
+ return null;
235
+ const call = enclosingCallIfCallee(node);
236
+ if (call !== null)
237
+ return null;
238
+ const receiverType = context.checker.getTypeAtLocation(node.expression);
239
+ const isCallable = context.checker.getSignaturesOfType(receiverType, ts.SignatureKind.Call).length > 0 ||
240
+ context.checker.getSignaturesOfType(receiverType, ts.SignatureKind.Construct).length > 0;
241
+ if (!isCallable)
242
+ return null;
243
+ // The function-object's OWN fixed surface is not a sidecar and is not ours
244
+ // to answer. `name`, `length` and `prototype` are decided by the callable
245
+ // arm of `objectDescriptorReturnTypeAt`/`valueIdOfShape`
246
+ // (semantics/normalize/structural.ts), which knows whether the callable is a
247
+ // real function and what each key means for it. Claiming them here made this
248
+ // a SECOND authority on one question, and it silently retyped every
249
+ // reflective read of a builtin method -- `Date.prototype.getTime.length`,
250
+ // `RegExp.prototype.test.name` -- taking ten Date/prototype-reflection
251
+ // fixtures with it. A sidecar is what is left once the fixed surface is
252
+ // excluded.
253
+ if (fixedCallableSurface.has(node.name.text))
254
+ return null;
255
+ const symbol = context.checker.getSymbolAtLocation(node.name);
256
+ if (symbol === undefined)
257
+ return null;
258
+ return context.types.typeOf(context.checker.getTypeOfSymbol(symbol));
259
+ };
260
+ const primitiveReadIsAbsent = (context, node) => ts.isPropertyAccessExpression(node) &&
261
+ intentOf(node).kind === 'get' &&
262
+ primitivePropertyIsAbsent(node.expression, context.types.typeAt(node.expression), node.name.text, context);
263
+ const provenNumericReadIsAbsent = (context, node) => ts.isElementAccessExpression(node) &&
264
+ intentOf(node).kind === 'get' &&
265
+ node.argumentExpression !== undefined &&
266
+ context.numericIndexAbsenceProvenAt?.(node.expression, node.argumentExpression) === true;
267
+ /**
268
+ * A named read (`x.name` or its bracket spelling `x[ 'name' ]`) proven absent
269
+ * from every instance of a closed object-literal record -- `getParameters()`'s
270
+ * `parameters.morphAttributeCount` in three's `WebGLPrograms.js` is the
271
+ * motivating case: `closedLiteralMemberAbsenceProvenAt` (wired from
272
+ * `closedLiteralMemberAbsenceProven`) is the ONLY thing that licenses treating
273
+ * this GET as a compile-time `undefined` rather than a runtime lookup -- a
274
+ * `record` receiver is typically `owned` (a by-value struct with no stable
275
+ * identity), so the generic dynamic-property-sidecar path this function's
276
+ * caller falls back to for an unmatched key cannot run for it at all.
277
+ */
278
+ const provenClosedLiteralMemberReadIsAbsent = (context, node) => {
279
+ if (intentOf(node).kind !== 'get')
280
+ return false;
281
+ const name = ts.isPropertyAccessExpression(node) ? node.name.text : ts.isElementAccessExpression(node) ? literalMemberNameOf(node) : null;
282
+ return name !== null && context.closedLiteralMemberAbsenceProvenAt?.(node.expression, name) === true;
283
+ };
284
+ const normalReadIsAbsent = (context, node) => primitiveReadIsAbsent(context, node) || provenNumericReadIsAbsent(context, node) || provenClosedLiteralMemberReadIsAbsent(context, node);
285
+ /** See `asserted-arm-absence.ts`; a read (not a store) at this exact node. */
286
+ const assertedReadMayLackMember = (context, node) => intentOf(node).kind === 'get' && assertedReceiverArmMayLackMember(context.checker, node, (receiver) => context.types.rawTypeAt(receiver));
287
+ const propertyValueTypeAt = (context, node) => {
288
+ const undefinedType = context.table.intern({ kind: 'primitive', primitive: 'undefined' });
289
+ if (normalReadIsAbsent(context, node))
290
+ return undefinedType;
291
+ const own = declaredMemberTypeOf(context, node) ?? calleeAwareTypeAt(context, node);
292
+ return assertedReadMayLackMember(context, node) ? context.table.intern({ kind: 'union', members: [own, undefinedType] }) : own;
293
+ };
294
+ /**
295
+ * The type an optional chain's own expression result publishes.
296
+ *
297
+ * The access's value type plus the `undefined` the operator produces. The
298
+ * value type is the CALLEE-AWARE one, for the same reason the `[[Get]]`'s own
299
+ * result uses it: `symbol.declarations?.find(isClassLike)` reads `find` for
300
+ * one call, and that call's resolved signature is the one type the access has
301
+ * there. The member's declared type is BOTH of `Array.prototype.find`'s
302
+ * overloads, which no single calling convention joins, so publishing it here
303
+ * put `unresolved(no primitive joining 2 overload signatures ...)` on the
304
+ * chain's result -- 20 of tsc's `checker.ts` rows, every one
305
+ * `x.declarations?.find(...)` -- while the very same access certified without
306
+ * the `?.`.
307
+ *
308
+ * The `undefined` arm is the OPERATOR's and is stated whenever it could be
309
+ * missing from `own`: when the checker has decided the receiver cannot be
310
+ * nullish (see the call site for why that decision is not one this compiler
311
+ * can adopt), and when the callee-aware type replaced the checker's, because
312
+ * a resolved signature says what the method returns and nothing about the
313
+ * branch on which it does not run. The earlier attempt published the
314
+ * callee-aware type WITHOUT that arm, and the merge then had to store the
315
+ * operator's `undefined` into a function carrier. An answer that is the
316
+ * checker's own and already nullish is returned untouched, so the ordinary
317
+ * chain is unaffected and no carrier moves.
318
+ */
319
+ const chainValueTypeOf = (context, node) => {
320
+ const checkers = context.types.typeAt(node);
321
+ const own = propertyValueTypeAt(context, node);
322
+ if (own === checkers && !excludesNullish(context.types.rawTypeAt(node)))
323
+ return own;
324
+ return context.table.intern({ kind: 'union', members: [own, context.table.intern({ kind: 'primitive', primitive: 'undefined' })] });
325
+ };
326
+ /**
327
+ * Whether an expression sits where ECMA-262 turns its value into a BOOLEAN --
328
+ * `ToBoolean` of whatever it evaluated to -- rather than where the value
329
+ * itself is consumed.
330
+ *
331
+ * These are test positions that can observe an `undefined` no type mentions.
332
+ * Equality with `undefined` is the other direct observation. See
333
+ * `observablyAbsentElementTypeOf` for why the widening is bounded to them.
334
+ */
335
+ const testsItsOperand = (node) => {
336
+ let inner = node;
337
+ let parent = inner.parent;
338
+ while (parent && ts.isParenthesizedExpression(parent)) {
339
+ inner = parent;
340
+ parent = parent.parent;
341
+ }
342
+ if (!parent)
343
+ return false;
344
+ if (ts.isIfStatement(parent) || ts.isWhileStatement(parent) || ts.isDoStatement(parent))
345
+ return parent.expression === inner;
346
+ if (ts.isForStatement(parent))
347
+ return parent.condition === inner;
348
+ if (ts.isConditionalExpression(parent))
349
+ return parent.condition === inner;
350
+ if (ts.isPrefixUnaryExpression(parent))
351
+ return parent.operator === ts.SyntaxKind.ExclamationToken;
352
+ if (ts.isBinaryExpression(parent)) {
353
+ const operator = parent.operatorToken.kind;
354
+ const tested = operator === ts.SyntaxKind.AmpersandAmpersandToken ||
355
+ operator === ts.SyntaxKind.BarBarToken ||
356
+ operator === ts.SyntaxKind.QuestionQuestionToken;
357
+ return tested && parent.left === inner;
358
+ }
359
+ // `?.` IS a test of its base, and the one that consumes nothing on the
360
+ // absent branch: ECMA-262 13.3.9.1 evaluates the whole chain to `undefined`
361
+ // without ever performing the `[[Get]]`. `root.children[3]?.value` therefore
362
+ // needs the same widening `if (array[i])` gets -- without it the base's
363
+ // carrier says never-absent, the chain's guard folds to `if (true)`, and
364
+ // `elementAt` aborts on the read the program wrote `?.` precisely to avoid.
365
+ if (ts.isPropertyAccessExpression(parent) || ts.isElementAccessExpression(parent) || ts.isCallExpression(parent)) {
366
+ return parent.expression === inner && ts.isOptionalChain(parent) && parent.questionDotToken !== undefined;
367
+ }
368
+ return false;
369
+ };
370
+ /** A test that consumes this value immediately, including a logical assignment's own guard. */
371
+ const directlyTestsItsOperand = (node) => {
372
+ let inner = node;
373
+ let parent = inner.parent;
374
+ while (parent && ts.isParenthesizedExpression(parent)) {
375
+ inner = parent;
376
+ parent = parent.parent;
377
+ }
378
+ if (!parent)
379
+ return false;
380
+ if (ts.isIfStatement(parent) || ts.isWhileStatement(parent) || ts.isDoStatement(parent))
381
+ return parent.expression === inner;
382
+ if (ts.isForStatement(parent))
383
+ return parent.condition === inner;
384
+ if (ts.isConditionalExpression(parent))
385
+ return parent.condition === inner;
386
+ if (ts.isBinaryExpression(parent) && parent.left === inner)
387
+ return logicalAssignmentOperators.has(parent.operatorToken.kind);
388
+ return ts.isPrefixUnaryExpression(parent) && parent.operator === ts.SyntaxKind.ExclamationToken;
389
+ };
390
+ /** Whether a checker type explicitly has an `undefined` constituent. */
391
+ const includesUndefined = (type) => {
392
+ if ((type.flags & ts.TypeFlags.Undefined) !== 0)
393
+ return true;
394
+ return type.isUnion() && type.types.some(includesUndefined);
395
+ };
396
+ /** Whether an equality operation directly compares this expression with `undefined`. */
397
+ const comparesWithUndefined = (context, node) => {
398
+ let inner = node;
399
+ let parent = inner.parent;
400
+ while (parent && ts.isParenthesizedExpression(parent)) {
401
+ inner = parent;
402
+ parent = parent.parent;
403
+ }
404
+ if (!parent || !ts.isBinaryExpression(parent))
405
+ return false;
406
+ const operator = parent.operatorToken.kind;
407
+ if (operator !== ts.SyntaxKind.EqualsEqualsToken &&
408
+ operator !== ts.SyntaxKind.ExclamationEqualsToken &&
409
+ operator !== ts.SyntaxKind.EqualsEqualsEqualsToken &&
410
+ operator !== ts.SyntaxKind.ExclamationEqualsEqualsToken) {
411
+ return false;
412
+ }
413
+ const other = parent.left === inner ? parent.right : parent.right === inner ? parent.left : null;
414
+ return other !== null && (context.types.rawTypeAt(other).flags & ts.TypeFlags.Undefined) !== 0;
415
+ };
416
+ /**
417
+ * Whether this compiler has normalized the receiver as an index-signature
418
+ * object for the key at this access. This asks the same structural source of
419
+ * truth the representation layer will later turn into a dictionary; asking
420
+ * only the checker would miss an empty object whose object-bag census learned
421
+ * its value type from indexed writes.
422
+ */
423
+ const isIndexedObjectFor = (context, type, key, visiting = new Set()) => {
424
+ if (visiting.has(type))
425
+ return false;
426
+ const next = new Set(visiting);
427
+ next.add(type);
428
+ const shape = context.table.get(type).shape;
429
+ if (shape.kind === 'union')
430
+ return shape.members.length > 0 && shape.members.every((member) => isIndexedObjectFor(context, member, key, next));
431
+ if (shape.kind === 'declared' || shape.kind === 'class-instance' || shape.kind === 'object-anchor') {
432
+ return shape.body !== null && isIndexedObjectFor(context, shape.body, key, next);
433
+ }
434
+ if (shape.kind !== 'object')
435
+ return false;
436
+ return shape.index.some((index) => index.key === key || (key === 'number' && index.key === 'string'));
437
+ };
438
+ /**
439
+ * An indexed read whose consumer can observe absence, as `T | undefined`.
440
+ *
441
+ * ECMA-262 gives no other answer: `[[Get]]` on an Array with an index that is
442
+ * not a present element runs OrdinaryGet (10.1.8.1), finds no property, and
443
+ * returns `undefined` -- unconditionally, exactly the way an optional chain
444
+ * evaluates to `undefined` for a nullish base. `lib.es5.d.ts`'s number index
445
+ * signature says `T` instead, which is a convenience the checker offers (and
446
+ * withdraws under `noUncheckedIndexedAccess`), not a fact about the read.
447
+ * hono's `compose` relies on the real rule: `if (middleware[i])` walks off the
448
+ * end of the array on the 404 path, and under the checker's carrier that guard
449
+ * compiled to `if (true)` and the read aborted in `ArrayObject::elementAt`.
450
+ *
451
+ * Bounded to a test position, and that bound is not timidity: everywhere else
452
+ * the program goes on to USE the value, and a carrier with an absence the
453
+ * consumer has no home for turns one honest read into a conversion the whole
454
+ * chain has to answer for. A test consumes nothing -- `ToBoolean(undefined)`
455
+ * is `false` (7.1.2) -- so the widening is free of that, and the emitter
456
+ * already renders the guarded read (`emit-carrier-members.ts`'s
457
+ * `absentCapableElementText`) as soon as the carrier admits absence.
458
+ *
459
+ * A TUPLE is excluded: its element types are positional facts, and the checker
460
+ * states out-of-range for one as an error rather than a silent `T`.
461
+ */
462
+ const observablyAbsentElementTypeOf = (context, node, valueType) => {
463
+ // The local-binding census connects `const value = array[index]` to a later
464
+ // direct `value === undefined` observation. Structural array reads normally
465
+ // derive their bare element from the receiver before layout overrides run,
466
+ // so honor that precise preferred answer here, where the [[Get]] result is
467
+ // published. This is the same optional carrier the existing guarded array
468
+ // emitter already consumes; unrelated reads have no preferred answer.
469
+ const observedAbsence = context.parameters.preferredTypeAt?.(node);
470
+ if (observedAbsence && includesUndefined(observedAbsence))
471
+ return context.types.typeOf(observedAbsence);
472
+ const key = ts.isElementAccessExpression(node) ? context.types.rawTypeAt(node.argumentExpression) : null;
473
+ const numeric = key !== null && (key.flags & ts.TypeFlags.NumberLike) !== 0;
474
+ const symbol = key !== null && (key.flags & (ts.TypeFlags.ESSymbol | ts.TypeFlags.UniqueESSymbol)) !== 0;
475
+ if (ts.isPropertyAccessExpression(node) && context.checker.getPropertyOfType(context.types.rawTypeAt(node.expression), node.name.text))
476
+ return valueType;
477
+ // A dictionary's `read` alone cannot distinguish a missing key from the
478
+ // default value of its payload carrier. When the consumer explicitly has a
479
+ // home for `undefined` -- an annotated return, declaration initializer, or
480
+ // assignment target as reported by the checker's contextual type -- publish
481
+ // that absence at the read itself. The C++ dictionary emitter can then use
482
+ // `has(key)` and leave the optional empty; waiting until the return/store
483
+ // conversion would wrap the already-defaulted payload as PRESENT.
484
+ const contextual = context.checker.getContextualType(node);
485
+ const receiverType = context.types.typeAt(node.expression);
486
+ const indexedObject = isIndexedObjectFor(context, receiverType, symbol ? 'symbol' : numeric ? 'number' : 'string');
487
+ if (((contextual !== undefined && includesUndefined(contextual)) ||
488
+ comparesWithUndefined(context, node) ||
489
+ directlyTestsItsOperand(node)) &&
490
+ indexedObject &&
491
+ excludesNullish(context.types.rawTypeAt(node))) {
492
+ return context.table.intern({
493
+ kind: 'union',
494
+ members: [valueType, context.table.intern({ kind: 'primitive', primitive: 'undefined' })]
495
+ });
496
+ }
497
+ if (!ts.isElementAccessExpression(node) || !testsItsOperand(node))
498
+ return valueType;
499
+ // Each constituent, because a union of array types indexes the same way:
500
+ // hono's `compose` declares `middleware: [[Function, unknown], unknown][] |
501
+ // [[Function]][]`, and asking `isArrayType` of the union answers no.
502
+ const receiver = context.types.rawTypeAt(node.expression);
503
+ const constituents = receiver.isUnion() ? receiver.types : [receiver];
504
+ const indexable = (one) => context.checker.isArrayType(one) && !context.checker.isTupleType(one);
505
+ if (!constituents.every(indexable))
506
+ return valueType;
507
+ if (!numeric)
508
+ return valueType;
509
+ if (!excludesNullish(context.types.rawTypeAt(node)))
510
+ return valueType;
511
+ return context.table.intern({ kind: 'union', members: [valueType, context.table.intern({ kind: 'primitive', primitive: 'undefined' })] });
512
+ };
513
+ /**
514
+ * The value type published for this exact property expression.
515
+ *
516
+ * Consumers cite the property producer's result by identity, so they must cite
517
+ * its type from the same rule as well. In particular, an indexed dictionary
518
+ * read can publish `T | undefined` even when TypeScript's unchecked index
519
+ * signature reports only `T`; asking the checker again at a conditional merge
520
+ * erases the missing-key state the property operation deliberately restored.
521
+ * Optional chains cite their whole-expression result, including the synthetic
522
+ * `undefined` branch, rather than the present-only internal `[[Get]]` result.
523
+ */
524
+ export const propertyExpressionValueTypeAt = (context, node) => {
525
+ const valueType = observablyAbsentElementTypeOf(context, node, propertyValueTypeAt(context, node));
526
+ return publishesShortCircuit(node) && !isAlwaysPresentHostExpression(node.expression, context)
527
+ ? chainValueTypeOf(context, node)
528
+ : valueType;
529
+ };
530
+ const buildOperations = (candidate, node, intent, key, receiverSource, context, resolvedBinding, resolvedGlobalBinding) => {
531
+ // A property access that is itself an invocation's callee reads its value
532
+ // type off that call's own resolved signature rather than off the property
533
+ // in isolation -- see `calleeAwareTypeAt`'s own comment for why that is
534
+ // exact, not an approximation, for this one occurrence of the access.
535
+ const valueType = observablyAbsentElementTypeOf(context, node, propertyValueTypeAt(context, node));
536
+ // `a?.b` is typed `T | undefined` by the checker, and both halves are needed:
537
+ // the whole expression really is that union, while the `[[Get]]` inside it
538
+ // produces a `T` and never an `undefined` -- it does not run at all on the
539
+ // branch where the receiver was absent. `getNonNullableType` is the language's
540
+ // own answer to which type that is, asked rather than reconstructed.
541
+ const shortCircuits = publishesShortCircuit(node);
542
+ const shortCircuitAlwaysPresent = shortCircuits && isAlwaysPresentHostExpression(node.expression, context);
543
+ // A computed key's proven finite name set (`PropertyOperation.provenKeyTexts`'s
544
+ // own comment has the full contract). Asked only for a genuinely computed
545
+ // element access -- a static key already carries its text as the key
546
+ // operand's own constant, and `key.computed` is false for every
547
+ // property-access spelling -- and published as nothing at all when the hook
548
+ // is absent or refuses, which is the fail-closed default this producer must
549
+ // never weaken.
550
+ const provenKeyTexts = key.computed && ts.isElementAccessExpression(node) ? (context.computedKeyTextsOf?.(node.argumentExpression) ?? undefined) : undefined;
551
+ const guardExpression = optionalChainGuardOf(node);
552
+ const guardSource = guardExpression === null ? null : sourceForValue(context, guardExpression);
553
+ const presentValueType = shortCircuits ? presentValueTypeOf(node, key, valueType, context) : valueType;
554
+ // What the *expression* evaluates to is the checker's own type for it, never
555
+ // the callee-aware one. The two part company at exactly one place: an access
556
+ // that is a call's callee, where `calleeAwareTypeAt` deliberately answers
557
+ // with the method's own signature -- correct for the `[[Get]]`'s value, and
558
+ // wrong for a result that must also carry the `undefined` the operator
559
+ // produces on the other branch. Publishing the callee-aware type here made
560
+ // the merge try to store `undefined` into a function carrier.
561
+ //
562
+ // And the `undefined` is the OPERATOR's, so it is stated here rather than
563
+ // taken on trust from the checker's type for the node. ECMA-262 13.3.9.1
564
+ // evaluates an optional chain to `undefined` whenever the base is nullish,
565
+ // which is unconditional -- but the checker drops that arm from the
566
+ // expression's type whenever it believes the receiver cannot be nullish, and
567
+ // an `as` assertion is enough to make it believe that. hono's
568
+ // `resolveCallback` is the case: `(str as HtmlEscapedString).callbacks as
569
+ // HtmlEscapedCallback[]` gives `callbacks` a non-nullable type, so
570
+ // `callbacks?.length` is typed plain `number` while the cell the value came
571
+ // from is still an optional this compiler placed from the initializer's own
572
+ // type. `publishesShortCircuit` is syntactic and builds both arms either
573
+ // way, so the merge then had to store `undefined` into a `scalar(number)`
574
+ // and refused.
575
+ //
576
+ // Widening rather than dropping the arm, deliberately: the other repair is
577
+ // to believe the non-nullish claim and emit the access unguarded, which
578
+ // trades a compile error for an unchecked read of an absent optional on a
579
+ // path hono takes on every call.
580
+ const expressionValueType = shortCircuits && !shortCircuitAlwaysPresent ? chainValueTypeOf(context, node) : context.types.typeAt(node);
581
+ // Only a link carrying ?. proves its own receiver present. A plain suffix
582
+ // such as a?.b.c is gated on a, and must still throw when b itself is absent.
583
+ // Its cited present value removes only the chain's synthetic undefined;
584
+ // any absence belonging to the property remains in that value's carrier.
585
+ // A non-null assertion erases; it must not license a presence conversion
586
+ // before the property read can perform its runtime nullish check.
587
+ let receiverExpression = node.expression;
588
+ let receiverWasAsserted = false;
589
+ while (ts.isNonNullExpression(receiverExpression) ||
590
+ ts.isParenthesizedExpression(receiverExpression) ||
591
+ ts.isAsExpression(receiverExpression) ||
592
+ ts.isTypeAssertionExpression(receiverExpression)) {
593
+ // In JavaScript, `/** @type {T} */ (value)` is represented as a
594
+ // ParenthesizedExpression carrying a JSDoc type tag, not as an
595
+ // AsExpression. It is nevertheless the same explicit runtime assertion:
596
+ // when the wrapped value is `any`/`unknown`, this property read must use
597
+ // the asserted receiver type so lowering emits the checked unbox before
598
+ // native member lookup. Missing this case left the result type narrowed
599
+ // (the checker sees `T.clone`) while the receiver stayed dynamic, yielding
600
+ // a boxed `getProperty("clone")` on a class whose methods live on its
601
+ // prototype.
602
+ const jsDocTypeAssertion = ts.isParenthesizedExpression(receiverExpression) && ts.getJSDocTypeTag(receiverExpression) !== undefined;
603
+ receiverWasAsserted ||= ts.isAsExpression(receiverExpression) || ts.isTypeAssertionExpression(receiverExpression) || jsDocTypeAssertion;
604
+ receiverExpression = receiverExpression.expression;
605
+ }
606
+ // A type assertion does not inspect or replace the receiver at runtime.
607
+ // Preserve a statically known union so its property read dispatches on the
608
+ // actual arm. Loading the asserted arm unconditionally turns a harmless
609
+ // missing property on a string into an invalid native record dereference.
610
+ // A genuinely unknown receiver still needs the assertion's checked unbox.
611
+ if (receiverWasAsserted) {
612
+ const physicalReceiverShape = context.table.get(context.types.typeAt(receiverExpression)).shape;
613
+ if (physicalReceiverShape.kind === 'primitive' &&
614
+ (physicalReceiverShape.primitive === 'any' || physicalReceiverShape.primitive === 'unknown'))
615
+ receiverExpression = node.expression;
616
+ }
617
+ const guardsReceiver = node.questionDotToken !== undefined;
618
+ const receiverType = guardsReceiver
619
+ ? context.types.typeOf(context.checker.getNonNullableType(context.types.rawTypeAt(receiverExpression)))
620
+ : context.types.typeAt(receiverExpression);
621
+ const canThrow = !guardsReceiver && !excludesNullish(context.types.rawTypeAt(receiverExpression));
622
+ const completion = canThrow ? throwingCompletion : normalCompletion;
623
+ const booleanResultType = context.table.intern({ kind: 'primitive', primitive: 'boolean' });
624
+ const reads = { ...pureEffects, readsMutableState: true };
625
+ const writes = { ...pureEffects, writesMutableState: true };
626
+ const runtime = { kind: 'runtime' };
627
+ const provenance = { kind: 'provenance' };
628
+ /**
629
+ * The value a `[[Set]]` at this site stores.
630
+ *
631
+ * It is the result of the computation at the assignment or update node --
632
+ * `x` for `o.p = x`, the sum for `o.p += x`, the incremented number for
633
+ * `o.p++`. Citing that one operation is what keeps "the value written" from
634
+ * having two answers: this producer never re-derives it from the right-hand
635
+ * side, which for a compound assignment would be the wrong value entirely.
636
+ */
637
+ const storedValue = () => {
638
+ // Read through erasure for the same reason `intentOf` does, and it must be
639
+ // the SAME reading: the intent decides that a store happens and this
640
+ // decides which value it stores, so a disagreement between them would
641
+ // publish a `[[Set]]` citing a computation at a node that has none.
642
+ const parent = outermostErasureOf(node).parent;
643
+ const assignment = ts.isBinaryExpression(parent) || ts.isPrefixUnaryExpression(parent) || ts.isPostfixUnaryExpression(parent);
644
+ if (!assignment)
645
+ return null;
646
+ // A logical assignment is the one shape where the computation's result is
647
+ // NOT what gets stored: that result is the merge of both branches, and
648
+ // storing it would write the property's own old value back over itself on
649
+ // the branch where the language performs no store at all -- observable
650
+ // through a setter, and a spurious mutation regardless. What it stores is
651
+ // the right-hand side, which is exactly what this `[[Set]]` is gated on
652
+ // having evaluated.
653
+ if (intent.kind === 'logical-set' && ts.isBinaryExpression(parent))
654
+ return sourceForValue(context, parent.right);
655
+ return { kind: 'result', result: semanticResultId(operationId(context.identities.nodeIdOf(parent), 'computation', 0), 'value') };
656
+ };
657
+ const makeOperation = (internalMethod, receiverEvaluation, keyEvaluation, effects) => {
658
+ const id = mintOperationId(context.ordinals, candidate.id, 'property');
659
+ const stored = internalMethod === 'set' ? storedValue() : null;
660
+ const hostMethod = internalMethod === 'get' ? context.hostMethodOf?.(node) : null;
661
+ const intrinsicValue = internalMethod === 'get' &&
662
+ !key.computed &&
663
+ key.source.kind === 'constant' &&
664
+ key.source.text === 'prototype' &&
665
+ isGlobalFunctionConstructor(context.checker, node.expression, context.checker.getTypeAtLocation(node.expression))
666
+ ? 'function-prototype'
667
+ : null;
668
+ return {
669
+ ...(hostMethod ? { hostMethod } : {}),
670
+ ...(internalMethod === 'get' && resolvedBinding !== null ? { resolvedBinding } : {}),
671
+ ...(internalMethod === 'get' && resolvedGlobalBinding ? { resolvedGlobalBinding: true } : {}),
672
+ ...(internalMethod === 'get' && shortCircuitAlwaysPresent ? { shortCircuitAlwaysPresent: true } : {}),
673
+ ...(intrinsicValue ? { intrinsicValue } : {}),
674
+ ...(internalMethod === 'get' && normalReadIsAbsent(context, node) ? { normalResult: 'undefined' } : {}),
675
+ ...(provenKeyTexts ? { provenKeyTexts } : {}),
676
+ id,
677
+ family: 'property',
678
+ internalMethod,
679
+ strict: isStrictContext(node, context.buildIsStrict),
680
+ keyIsComputed: key.computed,
681
+ // A property access consults the descriptor already installed on the
682
+ // object; it never states one of its own.
683
+ descriptor: null,
684
+ caller: candidate.caller,
685
+ operands: [
686
+ operand('receiver', 0, receiverSource, receiverType, receiverEvaluation),
687
+ operand('key', 0, key.source, key.type, keyEvaluation),
688
+ ...(stored ? [operand('value', 0, stored, valueType)] : []),
689
+ ...(guardSource && guardExpression
690
+ ? [operand('short-circuit-guard', 0, guardSource, context.types.typeAt(guardExpression), { kind: 'provenance' })]
691
+ : [])
692
+ ],
693
+ // A store's result is the receiver it wrote into, threaded onward. The
694
+ // internal method's own answer is a success boolean, which nothing can
695
+ // consume and which no native field store can ever report false; what a
696
+ // consumer actually needs is the object *after* the write, and naming it
697
+ // here is what orders a later reader after the store instead of leaving
698
+ // the two unordered and hoping the tie-break lands the right way. The
699
+ // enclosing expression's own value -- `v` in `o.x = v` -- is published by
700
+ // the computation that owns the assignment, not by this.
701
+ // An optional chain publishes a second result, and the two are different
702
+ // values. `value` is the property, which exists only on the branch where
703
+ // the receiver was present; `short-circuit` is what the *expression*
704
+ // evaluates to, which is that property on one branch and `undefined` on
705
+ // the other. A consumer of `a?.b` wants the second -- that is the whole
706
+ // meaning of the operator -- and the first is what the `[[Get]]` itself
707
+ // produced, which nothing outside the present branch may read.
708
+ // `delete` and `in` publish a BOOLEAN, not the property's own type.
709
+ // `[[Delete]]` answers "the property is gone" (ECMA-262 13.5.1.2 step 5)
710
+ // and `[[HasProperty]]` answers "the key resolves" (13.10.2 step 7); the
711
+ // property's type describes what a *read* would produce and no read
712
+ // happens at either site. Publishing `valueType` for them told the
713
+ // backend a `delete` yielded whatever the property held, which for an
714
+ // `any`-typed property meant a boxed carrier where the operator's answer
715
+ // is a `bool`.
716
+ results: internalMethod === 'get' && shortCircuits
717
+ ? [mintResult(id, 'value', presentValueType), mintResult(id, 'short-circuit', expressionValueType)]
718
+ : [
719
+ mintResult(id, 'value', internalMethod === 'set'
720
+ ? receiverType
721
+ : internalMethod === 'delete' || internalMethod === 'has-property'
722
+ ? booleanResultType
723
+ : valueType)
724
+ ],
725
+ completion,
726
+ effects,
727
+ evaluationOrdinal: candidate.evaluationOrdinal
728
+ };
729
+ };
730
+ switch (intent.kind) {
731
+ case 'get': {
732
+ const get = makeOperation('get', runtime, runtime, reads);
733
+ // The `[[Get]]` runs only where the receiver is present. Stating that as a
734
+ // conditional edge rather than as a flag on the operation is what lets one
735
+ // machinery serve `if (a)`, `a && b` and `a?.b`: all three are a guard, a
736
+ // gated region, and a join, and only the question asked of the guard
737
+ // differs.
738
+ if (!shortCircuits || shortCircuitAlwaysPresent || guardSource?.kind !== 'result')
739
+ return { operations: [get], edges: [] };
740
+ return {
741
+ operations: [get],
742
+ edges: [{ kind: 'conditional', guard: guardSource.result, to: get.id, takenWhen: 'present' }]
743
+ };
744
+ }
745
+ case 'set':
746
+ return { operations: [makeOperation('set', runtime, runtime, writes)], edges: [] };
747
+ case 'delete':
748
+ return { operations: [makeOperation('delete', runtime, runtime, writes)], edges: [] };
749
+ case 'logical-set': {
750
+ // The get is the guard, so it is not gated; the set is, on the get's own
751
+ // published value. Stated as a `conditional` edge because an edge is what
752
+ // places an OPERATION -- `normalize/gating.ts` places the right-hand
753
+ // subtree, and `producers/computations.ts` publishes the merge. The
754
+ // receiver and key are evaluated once, by the get, exactly as in
755
+ // `get-then-set`: `a[b()] ??= 1` calls `b` once even though both internal
756
+ // methods run.
757
+ const get = makeOperation('get', runtime, runtime, reads);
758
+ const set = makeOperation('set', provenance, provenance, writes);
759
+ const guard = get.results[0];
760
+ if (!guard) {
761
+ return {
762
+ operations: [get],
763
+ edges: []
764
+ };
765
+ }
766
+ return {
767
+ operations: [get, set],
768
+ edges: [
769
+ { kind: 'evaluation', from: get.id, to: set.id },
770
+ { kind: 'conditional', guard: guard.id, to: set.id, takenWhen: intent.takenWhen }
771
+ ]
772
+ };
773
+ }
774
+ case 'get-then-set': {
775
+ // The receiver and key are evaluated once, by the get; the set reuses
776
+ // that same evaluation, exactly as the language evaluates `a[b()] += 1`'s
777
+ // `a` and `b()` a single time even though both [[Get]] and [[Set]] run.
778
+ const get = makeOperation('get', runtime, runtime, reads);
779
+ const set = makeOperation('set', provenance, provenance, writes);
780
+ return { operations: [get, set], edges: [{ kind: 'evaluation', from: get.id, to: set.id }] };
781
+ }
782
+ }
783
+ };
784
+ /** The live exported binding named by `namespace.member`, or `null`. */
785
+ const namespaceMemberBindingOf = (node, key, context) => {
786
+ if (key.computed || key.source.kind !== 'constant')
787
+ return null;
788
+ const receiver = node.expression;
789
+ if (!ts.isIdentifier(receiver))
790
+ return null;
791
+ const namespace = context.checker.getSymbolAtLocation(receiver);
792
+ if (!namespace?.declarations?.some((declaration) => ts.isNamespaceImport(declaration)))
793
+ return null;
794
+ const member = ts.isPropertyAccessExpression(node)
795
+ ? context.checker.getSymbolAtLocation(node.name)
796
+ : context.checker.getPropertyOfType(context.types.rawTypeAt(receiver), key.source.text);
797
+ return member ? context.identities.symbolValueDeclarationId(member, node) : null;
798
+ };
799
+ /**
800
+ * The existing ambient binding named by an intrinsic-global-object property.
801
+ *
802
+ * `globalThis.process` and bare `process` are two language routes to the same
803
+ * global binding. Only a host-authenticated singleton or namespace root is
804
+ * admitted here; an ordinary expando remains a property of the open global
805
+ * dictionary. The receiver must be TypeScript's declarationless intrinsic
806
+ * `globalThis`, so a caller-owned variable with that spelling cannot acquire
807
+ * host provenance.
808
+ */
809
+ const hostGlobalMemberDeclarationOf = (node, key, context) => {
810
+ if (key.source.kind !== 'constant')
811
+ return null;
812
+ const receiver = unwrapErasedExpression(node.expression);
813
+ if (!ts.isIdentifier(receiver) || !context.unresolvableNames.isIntrinsicGlobalThis(receiver))
814
+ return null;
815
+ const member = ts.isPropertyAccessExpression(node)
816
+ ? context.checker.getSymbolAtLocation(node.name)
817
+ : context.checker.getPropertyOfType(context.types.rawTypeAt(receiver), key.source.text);
818
+ if (!member)
819
+ return null;
820
+ const declaration = context.identities.symbolValueDeclarationId(member, node);
821
+ if (declaration === null)
822
+ return null;
823
+ if (!context.hostSingletonBindings.has(declaration) && !context.hostNamespaceBindings.has(declaration))
824
+ return null;
825
+ return declaration;
826
+ };
827
+ const hostGlobalMemberBindingOf = (node, key, context) => {
828
+ const declaration = hostGlobalMemberDeclarationOf(node, key, context);
829
+ if (declaration === null)
830
+ return null;
831
+ return context.globalHostMutationTaint.has('*') || context.globalHostMutationTaint.has(declaration) ? null : declaration;
832
+ };
833
+ /**
834
+ * The program's own global-object property a read off the intrinsic global
835
+ * object names.
836
+ *
837
+ * `var Headers: typeof HeadersImpl = HeadersImpl` in a script, then
838
+ * `globalThis.Headers` in `@hono/node-server`'s `headers.ts`: 9.1.1.4 makes
839
+ * the `var` an own property of the global object, so the read IS the `var`'s
840
+ * cell -- the same live-binding answer `hostGlobalMemberDeclarationOf` gives
841
+ * a host singleton, for the same reason. Reading it through the open expando
842
+ * dictionary instead found nothing there (the dictionary holds only what the
843
+ * program installed at run time) and aborted at startup on the unbox.
844
+ *
845
+ * Refused, like the host case, once the global-object-mutation census saw
846
+ * the property changed through the object in a way that is not a plain store
847
+ * to the var: the binding then has a writer this backend does not reconcile,
848
+ * and a stale read would be a silently wrong answer. A value-only
849
+ * `Object.defineProperty(globalThis, 'Request', { value })` IS a plain store
850
+ * (`script-global-redefinition.ts`) and taints nothing.
851
+ */
852
+ const scriptGlobalMemberDeclarationOf = (node, key, context) => {
853
+ if (key.source.kind !== 'constant')
854
+ return null;
855
+ const receiver = unwrapErasedExpression(node.expression);
856
+ if (!ts.isIdentifier(receiver) || !context.unresolvableNames.isIntrinsicGlobalThis(receiver))
857
+ return null;
858
+ const member = ts.isPropertyAccessExpression(node)
859
+ ? context.checker.getSymbolAtLocation(node.name)
860
+ : context.checker.getPropertyOfType(context.types.rawTypeAt(receiver), key.source.text);
861
+ const valueDeclaration = member?.valueDeclaration;
862
+ if (!member || valueDeclaration === undefined || !isScriptGlobalObjectPropertyDeclaration(valueDeclaration))
863
+ return null;
864
+ return context.identities.symbolValueDeclarationId(member, node);
865
+ };
866
+ /** Whether an expression is an authenticated host identity that cannot be nullish in this program. */
867
+ export const isAlwaysPresentHostExpression = (expression, context) => {
868
+ const current = unwrapErasedExpression(expression);
869
+ if (ts.isIdentifier(current)) {
870
+ if (context.unresolvableNames.isIntrinsicGlobalThis(current))
871
+ return true;
872
+ const symbol = context.checker.getSymbolAtLocation(current);
873
+ const declaration = symbol ? context.identities.symbolValueDeclarationId(symbol, current) : null;
874
+ if (declaration === null)
875
+ return false;
876
+ if (!context.hostSingletonBindings.has(declaration) && !context.hostNamespaceBindings.has(declaration))
877
+ return false;
878
+ return !context.globalHostMutationTaint.has('*') && !context.globalHostMutationTaint.has(declaration);
879
+ }
880
+ if (!ts.isPropertyAccessExpression(current) && !ts.isElementAccessExpression(current))
881
+ return false;
882
+ const key = keyOf(current, context);
883
+ if (key.kind !== 'key')
884
+ return false;
885
+ if (hostGlobalMemberBindingOf(current, key, context) !== null)
886
+ return true;
887
+ return context.hostMethodOf?.(current) != null && isAlwaysPresentHostExpression(current.expression, context);
888
+ };
889
+ /**
890
+ * Why a read of `instance.m` refuses when `m` was declared by `F.prototype.m =
891
+ * function () {}` on a pre-`class` constructor function `F`.
892
+ *
893
+ * TypeScript puts such a member on `F`'s inferred instance type flagged
894
+ * `SymbolFlags.Method`, and the instance layout leaves it out for the same
895
+ * reason a `class` instance leaves its methods out (`structural-members.ts`'s
896
+ * `data-only`): it is a prototype member, not per-instance storage. What a
897
+ * `class` has and this constructor does not is a `class-ref` carrier with a
898
+ * projected method table (`projection/classes.ts`), which is where a read of a
899
+ * prototype method resolves to its body. A `record` has no such table and this
900
+ * runtime models no prototype chain for one, so lowering the read as a dynamic
901
+ * view over the instance's own fields could only ever find `undefined` and then
902
+ * fail to unbox it as the callable the checker promised -- a certified program
903
+ * that aborts on its first method call. Before the layout fix it was worse: the
904
+ * method WAS a struct field, nothing ever wrote it, and the call segfaulted.
905
+ *
906
+ * Only a read through an INSTANCE refuses. `F.prototype.m` itself, read or
907
+ * written, goes through the prototype object -- a boxed value whose expando
908
+ * really does hold what the assignment stored -- and that path is sound.
909
+ *
910
+ * Refusing here rather than deeper keeps the defect in the census, ranked by
911
+ * root, where the fix (model such a function as the class it is) can be
912
+ * measured against it. The old `structural-declarations.ts` refusal that hid
913
+ * this shape behind a construct-signature drop is gone; this is the honest
914
+ * refusal it was standing in for.
915
+ */
916
+ /**
917
+ * Whether every instance this constructor makes is a boxed `DynamicObject`.
918
+ *
919
+ * `prototypeMutatedConstructorTypes` (semantics/dynamic-fallback.ts) marks the
920
+ * return type of every construct signature under `--dynamic-fallback`, and
921
+ * `Value::construct` links such an instance's `[[Prototype]]` to whatever
922
+ * `F.prototype` holds. Spelled here exactly as the census spells it, so the
923
+ * two ask one question: a constructor with no construct signature answers
924
+ * `false`, because there is then no instance type that could have been marked.
925
+ */
926
+ const constructedTypesAreBoxed = (constructor, context) => {
927
+ const signatures = context.checker.getTypeAtLocation(constructor).getConstructSignatures();
928
+ if (signatures.length === 0)
929
+ return false;
930
+ return signatures.every((signature) => context.dynamicFallbackTypes.has(context.types.typeOf(context.checker.getReturnTypeOfSignature(signature))));
931
+ };
932
+ const jsConstructorPrototypeMemberRefusalOf = (node, intent, context) => {
933
+ if (intent.kind === 'set' || intent.kind === 'delete')
934
+ return null;
935
+ const receiverExpression = unwrapErasedExpression(node.expression);
936
+ if (ts.isPropertyAccessExpression(receiverExpression) && receiverExpression.name.text === 'prototype')
937
+ return null;
938
+ const symbol = ts.isPropertyAccessExpression(node) ? context.checker.getSymbolAtLocation(node.name) : null;
939
+ if (!symbol)
940
+ return null;
941
+ // EVERY declaration, not just one, and a DATA property is refused on the
942
+ // same evidence as a method.
943
+ //
944
+ // Asking for `SymbolFlags.Method` scoped this to the shape that crashed, and
945
+ // left the quieter half of the same defect answering. `Routed.prototype.kind
946
+ // = 'route'` puts `kind` on the checker's instance type, so the record gets a
947
+ // `std::string kind` field marked present -- and nothing ever writes it, so
948
+ // `first.kind` reads `""` where the language reads `route`
949
+ // (`dynamic-callable-abi-recovery.runtime.js`). A silently wrong answer is
950
+ // the one outcome worse than the abort the method case produced.
951
+ //
952
+ // `every`, because a member the CONSTRUCTOR BODY also assigns (`this.kind =
953
+ // ...` alongside `F.prototype.kind = 0`, the ordinary "declare a default,
954
+ // then set it" pattern) has a declaration that is not a prototype assignment,
955
+ // and its field really is written -- the prototype write is a default the
956
+ // instance overwrites, not the only source of the value. Only a member whose
957
+ // ONLY declaration is the prototype assignment has nothing to read.
958
+ const declarations = symbol.getDeclarations() ?? [];
959
+ const onlyOnPrototype = declarations.length > 0 &&
960
+ declarations.every((declaration) => ts.isPropertyAccessExpression(declaration) &&
961
+ ts.isPropertyAccessExpression(declaration.expression) &&
962
+ declaration.expression.name.text === 'prototype');
963
+ if (!onlyOnPrototype)
964
+ return null;
965
+ // Unless this program HAS a prototype chain for the instance. Under
966
+ // `--dynamic-fallback`, `prototypeMutatedConstructorTypes` marks every
967
+ // construct signature's return type, so the instance is a real
968
+ // `DynamicObject` and `Value::construct` (gea_runtime.h) links its
969
+ // `[[Prototype]]` to whatever `F.prototype` holds -- the read then finds
970
+ // exactly what the language says it finds, through the same table the
971
+ // assignment wrote. The premise of this refusal is the NATIVE carrier ("a
972
+ // record with no prototype chain"), and where that premise is false the
973
+ // refusal would be refusing a capability the program was given.
974
+ //
975
+ // Asked of the CONSTRUCTOR the prototype assignment names, in the same words
976
+ // the census used -- `types.typeOf` of each construct signature's return
977
+ // type -- rather than of the receiver expression here. Those are the ids the
978
+ // census put in the set; `typeAt` on this read's own receiver is a different
979
+ // derivation and would compare two things that only usually agree.
980
+ const prototypeOwner = declarations[0];
981
+ if (prototypeOwner !== undefined &&
982
+ ts.isPropertyAccessExpression(prototypeOwner) &&
983
+ ts.isPropertyAccessExpression(prototypeOwner.expression) &&
984
+ constructedTypesAreBoxed(prototypeOwner.expression.expression, context)) {
985
+ return null;
986
+ }
987
+ const what = (symbol.flags & ts.SymbolFlags.Method) !== 0 ? 'a method' : 'a data property';
988
+ return (`"${symbol.name}" is ${what} assigned onto a pre-class constructor function's prototype; ` +
989
+ 'an instance of one is a record with no prototype chain and no method table, so the read can find nothing ' +
990
+ '-- model the constructor as the class it is');
991
+ };
992
+ const contributeAccess = (candidate, node, context) => {
993
+ // `super.x`/`super.x(...)` used to be refused here by name -- a class
994
+ // method's home object is a fully static fact (`references.ts`'s
995
+ // `buildSuperReference`, which now publishes a value for the bare `super`
996
+ // keyword typed as the class's base), so this access needs nothing special
997
+ // once that receiver citation succeeds: it is an ordinary property/method
998
+ // access on a `class-ref` receiver, exactly the path `this.x`/`obj.x`
999
+ // already take, and `classMemberText` (emit-properties.ts) already starts
1000
+ // its member lookup from whichever class the receiver's representation
1001
+ // names -- here, the base, because that is what the citation published.
1002
+ const intent = intentOf(node);
1003
+ const key = keyOf(node, context);
1004
+ if (key.kind === 'blocked')
1005
+ return { kind: 'blocked', blocker: blocked(candidate.id, 'property', key.reason, key.missingPrimitive) };
1006
+ const globalDeclaration = hostGlobalMemberDeclarationOf(node, key, context);
1007
+ if (globalDeclaration !== null && (context.globalHostMutationTaint.has('*') || context.globalHostMutationTaint.has(globalDeclaration))) {
1008
+ return {
1009
+ kind: 'blocked',
1010
+ blocker: blocked(candidate.id, 'property', 'an authenticated host global may be mutated through globalThis, so its native binding identity is not stable', 'P0')
1011
+ };
1012
+ }
1013
+ const scriptGlobalDeclaration = scriptGlobalMemberDeclarationOf(node, key, context);
1014
+ if (scriptGlobalDeclaration !== null &&
1015
+ (context.globalHostMutationTaint.has('*') || context.globalHostMutationTaint.has(scriptGlobalDeclaration))) {
1016
+ return {
1017
+ kind: 'blocked',
1018
+ blocker: blocked(candidate.id, 'property', "a script's global var is redefined through the global object (Object.defineProperty(globalThis, ...)), so a read of it through globalThis has two writers this backend does not reconcile", 'P0')
1019
+ };
1020
+ }
1021
+ const receiver = citeExpressionResult(node.expression, context, ts.isOptionalChain(node) && node.questionDotToken === undefined ? 'present' : 'expression');
1022
+ if (receiver.kind === 'unmodelled')
1023
+ return { kind: 'blocked', blocker: blocked(candidate.id, 'property', receiver.reason, null) };
1024
+ const prototypeMember = jsConstructorPrototypeMemberRefusalOf(node, intent, context);
1025
+ if (prototypeMember !== null)
1026
+ return { kind: 'blocked', blocker: blocked(candidate.id, 'property', prototypeMember, null) };
1027
+ const namespaceBinding = intent.kind === 'get' ? namespaceMemberBindingOf(node, key, context) : null;
1028
+ const globalBinding = intent.kind === 'get' ? (hostGlobalMemberBindingOf(node, key, context) ?? scriptGlobalDeclaration) : null;
1029
+ const resolvedBinding = namespaceBinding ?? globalBinding;
1030
+ const { operations, edges } = buildOperations(candidate, node, intent, key, receiver.source, context, resolvedBinding, globalBinding !== null);
1031
+ return { kind: 'operations', operations, edges };
1032
+ };
1033
+ export const createPropertyProducer = (context) => ({
1034
+ family: 'property',
1035
+ contribute: (candidate) => {
1036
+ const node = candidate.node;
1037
+ if (isObjectTagCalleePart(context, node))
1038
+ return { kind: 'operations', operations: [], edges: [] };
1039
+ // A modelled `Object.setPrototypeOf(C.prototype, B.prototype)` is a class
1040
+ // lifecycle step, not a call through a function value, so its callee is
1041
+ // never read as one (`invocations.ts`'s `contributePrototypeReparenting`).
1042
+ if (ts.isPropertyAccessExpression(node) &&
1043
+ ts.isCallExpression(node.parent) &&
1044
+ node.parent.expression === node &&
1045
+ context.prototypeReparentings.of(node.parent) !== null)
1046
+ return { kind: 'operations', operations: [], edges: [] };
1047
+ if (ts.isPropertyAccessExpression(node) || ts.isElementAccessExpression(node))
1048
+ return contributeAccess(candidate, node, context);
1049
+ // census.ts assigns the 'property' family only to these two node kinds;
1050
+ // reaching here means the census and this producer have drifted apart.
1051
+ throw new Error(`property producer received a candidate of unexpected syntax kind ${ts.SyntaxKind[node.kind]}`);
1052
+ }
1053
+ });