@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,806 @@
1
+ import { operandsOfIrOperation } from '../../ir/queries.js';
2
+ import { stringConstantsOf } from '../../ir/dead-values.js';
3
+ import { bindingReference, cppReceiverName, createCppEmitBlockedError, defineValue, nameOfValue, operandText } from './emit-context.js';
4
+ import { memberAccessOperator } from './emit-carrier-members.js';
5
+ import { alignedValueText } from './emit-narrowing.js';
6
+ import { booleanTestText } from './emit-presence.js';
7
+ import { cppReactiveRevisionFieldName, recordFieldsOfShape, representationCanCell } from './records.js';
8
+ import { cppRecordFieldName, cppStringLiteral, cppTypeOf } from './types.js';
9
+ /**
10
+ * The three JSX operations, rendered against `gea::jsx` in the runtime header.
11
+ *
12
+ * Split out of `emit.ts` because they are one subject with one shared
13
+ * constraint: C++ has no reflection, so anything that depends on knowing a
14
+ * generated struct's members has to be spelled HERE, by the emitter that does
15
+ * know them, rather than by a template in the header. `emitElementProp`'s style
16
+ * handling is the whole of that constraint in one place.
17
+ */
18
+ export const emitElement = (ctx, lines, operation) => {
19
+ const representation = operation.result.representation;
20
+ if (representation.kind !== 'native-handle') {
21
+ throw createCppEmitBlockedError(`runtime-helper:element:${operation.form}`, `carries a "${representation.kind}" result, but a host element is an opaque handle and needs a "native-handle" carrier; ` +
22
+ "no host protocol is bound to this program's JSX element type");
23
+ }
24
+ // A fragment names no tag, so it cannot go through the create-with-a-tag
25
+ // recipe below; what it builds is the host's own answer, stated by the
26
+ // plugin that installs that host (`PluginCapabilities.elementFragment`) and
27
+ // rendered verbatim here. A host with none leaves this `null` and the
28
+ // fragment is refused by name, like any other unclaimed spelling.
29
+ if (operation.form === 'fragment') {
30
+ if (ctx.hosts.fragment === null) {
31
+ throw createCppEmitBlockedError('runtime-helper:element:fragment', 'a JSX fragment builds whatever the host that installed the element tree says it builds, and no installed plugin states one');
32
+ }
33
+ lines.push(`${defineValue(ctx, operation.result)} = ${ctx.hosts.fragment};`);
34
+ return;
35
+ }
36
+ if (operation.form !== 'intrinsic') {
37
+ throw createCppEmitBlockedError(`runtime-helper:element:${operation.form}`, `a "${operation.form}" element names a value rather than a tag the JSX namespace declares; what such an element builds is ` +
38
+ 'stated by the library that declared it, and no installed plugin claimed this one');
39
+ }
40
+ const tag = operation.tag;
41
+ if (!tag)
42
+ throw createCppEmitBlockedError('runtime-helper:element:intrinsic', 'an intrinsic element names no tag');
43
+ const name = defineValue(ctx, operation.result);
44
+ // A leaf that IS its text is a different node in the host's model, not a
45
+ // decorated container -- and the kind is fixed at creation, which is why
46
+ // lowering decided it there rather than leaving it to be discovered here when
47
+ // the child arrives. Recorded so the child operation, which names only the
48
+ // node, writes into it instead of appending to it.
49
+ //
50
+ // The TAG still travels. Collapsing the element is a choice about which host
51
+ // node holds the characters, not about what the element IS -- and the tag is
52
+ // the whole of what every element-selector CSS rule matches on. Dropping it
53
+ // took `h1 { font-size: 32px }` out of reach of the very node it was written
54
+ // for, silently, because an unmatched rule is not an error.
55
+ if (operation.textLeaf) {
56
+ lines.push(`${name} = gea::jsx::createTextLeaf<${cppTypeOf(representation)}>(${operandText(ctx, tag)});`);
57
+ return;
58
+ }
59
+ lines.push(`${name} = gea::jsx::create<${cppTypeOf(representation)}>(${operandText(ctx, tag)});`);
60
+ };
61
+ /**
62
+ * One JSX prop.
63
+ *
64
+ * Almost every prop is handed whole to `gea::jsx::prop`, which dispatches on
65
+ * the value's C++ type -- an attribute, or an event listener -- exactly as the
66
+ * host's own overload set is written to.
67
+ *
68
+ * A record-carried value is the one shape that cannot be: `style={{ width:
69
+ * '50%' }}` allocates a generated struct, and C++ has no reflection with which
70
+ * a header could name its members. The shape is a fact this emitter already
71
+ * holds, in the carrier's own `fields`, so the block is spelled out here --
72
+ * one `styleProperty` call per member, each still dispatching on that member's
73
+ * own C++ type. The prop's name travels with every call so the host can refuse
74
+ * an object handed to a prop that has no object rule, rather than write style
75
+ * properties the program never asked for.
76
+ *
77
+ * `record-with-index` deliberately does not take this path. Its open half is a
78
+ * dictionary whose keys exist only at runtime; emitting its named fields alone
79
+ * would silently drop the rest of the block, so it falls through to `prop` and
80
+ * is refused there by name.
81
+ */
82
+ export const emitElementProp = (ctx, lines, operation) => {
83
+ const node = operandText(ctx, operation.node);
84
+ const key = operandText(ctx, operation.key);
85
+ const value = operation.value.representation;
86
+ // A style object reaches C++ as a generated struct, and C++ has no
87
+ // reflection to enumerate one -- so the emitter, which does know the shape,
88
+ // spells one `styleProperty` call per member. `gea::jsx::prop` deliberately
89
+ // has no rule for it and static_asserts instead (see its comment).
90
+ //
91
+ // BOTH record carriers, because a style literal can arrive as either. A bare
92
+ // `style={{ width: '50%' }}` whose prop type is anonymous derives a
93
+ // structural `record` with its fields inline; one whose prop is DECLARED
94
+ // (`style?: Style`) takes that declared type as its layout -- correctly, so
95
+ // the value has one identity rather than two -- and a declared name is
96
+ // carried nominally as `native-record-ref`, whose fields live in the sealed
97
+ // structural table rather than on the carrier. `recordFieldsOfShape` reads
98
+ // them back from the one authority that owns them. Missing this second
99
+ // carrier sent 17 JSX programs into `prop`'s static_assert.
100
+ const styled = value.kind === 'record'
101
+ ? { ownership: value.ownership, fields: value.fields }
102
+ : value.kind === 'native-record-ref'
103
+ ? { ownership: value.ownership, fields: recordFieldsOfShape(ctx.deriver, value.shapeId) }
104
+ : null;
105
+ const styleFields = styled?.fields ?? null;
106
+ if (styled && styleFields) {
107
+ const receiver = `${operandText(ctx, operation.value)}${memberAccessOperator(styled.ownership)}`;
108
+ // Members this literal was initialized from, so a member wired to an
109
+ // expression is recognisable as one. A style object is written member by
110
+ // member (C++ cannot enumerate a struct), and each member is an
111
+ // independent value with its own dependencies -- so each binds
112
+ // separately, exactly the split v1's own `emitTemplateStyleSlot` makes
113
+ // between its static and dynamic members.
114
+ const sources = ctx.recordFieldSources.get(operation.value.value);
115
+ for (const field of styleFields) {
116
+ const property = cppStringLiteral(cssPropertyName(field.key));
117
+ const source = sources?.get(field.key);
118
+ const computed = source ? reactiveThunkPlan(ctx, node, source) : null;
119
+ if (computed) {
120
+ lines.push(...reactiveApplyBlock(`gea::jsx::reactiveStyleApply(${node}, ${key}, ${property}, ${computed.thunk})`, computed.subscriptions));
121
+ continue;
122
+ }
123
+ lines.push(`gea::jsx::styleProperty(${node}, ${key}, ${property}, ${receiver}${cppRecordFieldName(field.key)});`);
124
+ }
125
+ return;
126
+ }
127
+ // A candidate class table's own lines were withheld (see
128
+ // `EmitContext.classTableRoots`), and this is where they are settled: the
129
+ // reactive path claiming the prop needs the table, so its lines are replayed
130
+ // ahead of the apply; declining is the condition under which the table is
131
+ // spelled away and its lines dropped. The claim is rendered into a scratch
132
+ // array so that the withheld lines still precede it.
133
+ const table = ctx.classTableRoots.get(operation.value.value);
134
+ const withheld = table === undefined ? null : (ctx.pendingClassTableLines.get(table) ?? []);
135
+ const claimed = [];
136
+ if (emitObjectPropEntries(ctx, claimed, operation, node, key, value)) {
137
+ if (withheld)
138
+ lines.push(...withheld);
139
+ lines.push(...claimed);
140
+ return;
141
+ }
142
+ if (table !== undefined && emitClassTokens(ctx, lines, operation, node, key, table))
143
+ return;
144
+ if (withheld)
145
+ lines.push(...withheld);
146
+ const computed = reactiveThunkPlan(ctx, node, operation.value);
147
+ if (computed) {
148
+ lines.push(...reactiveApplyBlock(`gea::jsx::reactivePropApply(${node}, ${key}, ${computed.thunk})`, computed.subscriptions));
149
+ return;
150
+ }
151
+ const reactive = reactiveMemberPointer(ctx, operation.value);
152
+ if (reactive) {
153
+ lines.push(`gea::jsx::reactiveProp(${node}, ${key}, ${reactive.receiver}, ${reactive.member});`);
154
+ return;
155
+ }
156
+ lines.push(`gea::jsx::prop(${node}, ${key}, ${operandText(ctx, operation.value)});`);
157
+ };
158
+ /**
159
+ * A `class={{ base: true, 'is-on': flag }}` block, wired ENTRY BY ENTRY, or
160
+ * `false` when this prop is not one that can be.
161
+ *
162
+ * The style form above and this one are the same problem answered by two
163
+ * different carriers, and the difference is what makes this a separate branch
164
+ * rather than a case of that one. A style literal derives a generated STRUCT,
165
+ * so its members are emitter-visible names and each gets its own
166
+ * `styleProperty` call; a class map is declared with an index signature
167
+ * (`ClassMap` in the elements package), so its literal derives a
168
+ * `gea::Dictionary` -- one value, whose members exist only as runtime table
169
+ * entries. `prop` therefore takes the table WHOLE and `objectProp` rebuilds the
170
+ * entire space-separated attribute from it, which is why there is no per-entry
171
+ * host rule to hang a per-entry apply on.
172
+ *
173
+ * What was wrong before this existed: `plugins/gea/reactive-slots.ts` claims
174
+ * such a literal's members individually -- correctly, and for the same reason
175
+ * it claims a style literal's -- so `'is-on': this.opaque` really does lower to
176
+ * a thunk. But nothing downstream asked for it: the allocation CALLED the thunk
177
+ * once to fill the table, and the prop fell through to the once-only
178
+ * `gea::jsx::prop`. The program compiled, linked, ran, and simply never changed
179
+ * its class attribute again. A silent wrongness, not a refusal.
180
+ *
181
+ * Claiming the literal WHOLE instead -- one thunk returning the table -- is not
182
+ * the fix, and was measured not to be: an IIFE around a contextually-typed
183
+ * object literal gives the arrow an inferred return type computed from the
184
+ * literal's own members while the literal keeps the attribute's contextual type,
185
+ * so the thunk returns a `Dictionary` from a function whose C++ return type is
186
+ * the generated struct that inference minted (`no viable conversion from ...
187
+ * Ref<gea::Dictionary<...>> to ... Ref<gea_record_type_4000>`). Two TS types for
188
+ * one expression. The member claims are the ones that are right.
189
+ *
190
+ * So the re-runnable unit is: write this entry back into the table the first
191
+ * render already built, then re-apply the whole prop. Re-applying is what makes
192
+ * it correct rather than merely cheap -- `objectProp` writes the class
193
+ * attribute as a set built from every truthy key, so a per-entry write that did
194
+ * not re-run it would leave the attribute stale, and re-running it is
195
+ * idempotent by construction (the same reason `reactivePropApply` delegates to
196
+ * `prop`).
197
+ *
198
+ * The entry's value is reconciled HERE and not in the header. The table's value
199
+ * type is `ClassMap`'s declared union, so `flag`'s `bool` has to become an arm
200
+ * of it, and a `gea::TaggedUnion` has no converting assignment from an arm
201
+ * type; `convertedValueText` is the one authority that spells that store, and
202
+ * it is the same call `emit-allocation.ts` makes to fill this very table.
203
+ *
204
+ * It asked `widenedStoreText` directly until 2026-09-03, which spells the
205
+ * widening half only. A dynamic value reaching this table has to be NARROWED
206
+ * out of its box first, and that direction returned `null` and fell through to
207
+ * the raw operand -- one of eight sites in the emitter sharing that shape.
208
+ * `convertedValueText` ends in this same `widenedStoreText` call, so the
209
+ * widening story above is unchanged.
210
+ *
211
+ * Two stated gaps, both falling through to the once-only path rather than
212
+ * binding to the wrong thing:
213
+ *
214
+ * - a table that is not `shared-refcount`. Each entry's apply captures the
215
+ * table, and a by-value table would give every apply its own COPY -- entry
216
+ * A re-propping from its copy would revert whatever entry B last wrote.
217
+ * - a table this frame does not name by a plain identifier, which cannot
218
+ * appear in a lambda capture list.
219
+ *
220
+ * A THUNK this frame does not so name used to be a third, and is not one any
221
+ * more: it is bound to a local first and the capture list names that. See the
222
+ * loop.
223
+ */
224
+ const emitObjectPropEntries = (ctx, lines, operation, node, key, value) => {
225
+ if (value.kind !== 'dictionary' || value.ownership !== 'shared-refcount')
226
+ return false;
227
+ // Recorded for every record SHAPE, the dictionary path included
228
+ // (`emit-allocation.ts`), which is what makes a table's entries reachable
229
+ // from here at all.
230
+ const sources = ctx.recordFieldSources.get(operation.value.value);
231
+ if (!sources)
232
+ return false;
233
+ if (value.key === 'symbol' && sources.size > 0) {
234
+ // Sibling of the `element:<form>` allocation rows, one level down: this is
235
+ // an `element-prop` write's own reactive-dictionary sub-capability, which
236
+ // no `ElementOperation` form's key would name.
237
+ throw createCppEmitBlockedError('runtime-helper:element-prop:symbol-keyed-dictionary', 'a reactive symbol-keyed object prop needs each computed Symbol expression, but this field-source table retains only canonical field names');
238
+ }
239
+ const table = operandText(ctx, operation.value);
240
+ if (!isPlainName(table))
241
+ return false;
242
+ const subscript = memberAccessOperator(value.ownership) === '->' ? `(*${table})` : table;
243
+ const blocks = [];
244
+ let named = 0;
245
+ for (const [entry, source] of sources) {
246
+ const computed = reactiveThunkPlan(ctx, node, source);
247
+ if (!computed)
248
+ continue;
249
+ // A CAPTURELESS thunk has no variable to be named by, and the capture list
250
+ // below can hold nothing else. `emit.ts`'s dead-value rule elides such a
251
+ // thunk's producer -- its only call is by name -- so `deferredTexts` spells
252
+ // it as the prvalue it is, `gea::CallableObject<bool()>{&body_thunk,
253
+ // nullptr}`. Skipping the entry on that ground dropped it: `class={{ lit:
254
+ // store.engaged }}` fell through to the once-only `classTokens` and never
255
+ // changed its attribute again, while the SAME expression bound correctly as
256
+ // a style member, whose `reactiveStyleApply` is a plain argument and takes
257
+ // the prvalue as written. The difference was the lambda, not the thunk.
258
+ //
259
+ // So the prvalue is given a name rather than refused -- one `const auto`
260
+ // ahead of the apply, which the capture list then names. Scoped by the
261
+ // node's own variable, which is unique within the body, so two elements'
262
+ // tables cannot collide.
263
+ let thunk = computed.thunk;
264
+ if (!isPlainName(thunk)) {
265
+ thunk = `gea_class_thunk_${node}_${named++}`;
266
+ blocks.push(`const auto ${thunk} = ${computed.thunk};`);
267
+ }
268
+ // Numeric dictionaries retain canonical PropertyKey text as their safe
269
+ // physical key, so NaN and infinities never enter an ordered double map.
270
+ const entryKey = cppStringLiteral(entry);
271
+ const call = `${thunk}.call()`;
272
+ const written = alignedValueText(ctx, 'emit-jsx.ts:276', computed.origin.representation, value.value, call) ?? call;
273
+ const write = `[${table}, ${thunk}]() { ${subscript}[${entryKey}] = ${written}; }`;
274
+ blocks.push(...reactiveApplyBlock(`gea::jsx::reactiveObjectPropApply(${node}, ${key}, ${table}, ${write})`, computed.subscriptions));
275
+ }
276
+ // No reactive entry means nothing here has anything to say about this prop,
277
+ // and it takes the path it always took.
278
+ if (blocks.length === 0)
279
+ return false;
280
+ lines.push(...blocks);
281
+ return true;
282
+ };
283
+ /**
284
+ * Whether this frame names a value by something that can appear in a C++ lambda
285
+ * capture list -- an identifier, and not an expression that happens to have
286
+ * been rendered inline.
287
+ *
288
+ * Spelled as a character walk because `targets/cpp` may hold no RegExp literal.
289
+ */
290
+ const isPlainName = (text) => {
291
+ const first = text.slice(0, 1);
292
+ if (first === '')
293
+ return false;
294
+ for (const character of text) {
295
+ const alphabetic = character.toLowerCase() !== character.toUpperCase();
296
+ const digit = character >= '0' && character <= '9';
297
+ if (!alphabetic && !digit && character !== '_')
298
+ return false;
299
+ }
300
+ return !(first >= '0' && first <= '9');
301
+ };
302
+ /**
303
+ * The CSS property a style member names.
304
+ *
305
+ * `style={{ backgroundColor: c }}` writes the member in the spelling the
306
+ * declared style type uses -- camelCase, because that is what an object
307
+ * literal's keys can be -- and a stylesheet takes the hyphenated one. The two
308
+ * are the same property, and the mapping between them is CSSOM's own
309
+ * (`CSS2Properties`): an uppercase letter is a hyphen plus its lowercase, so a
310
+ * leading one produces the leading hyphen a vendor-prefixed property needs
311
+ * (`WebkitTransform` -> `-webkit-transform`).
312
+ *
313
+ * Emitting the member name unconverted is invisible rather than wrong-looking:
314
+ * a stylesheet classifies an unknown property name and drops it, so the
315
+ * program compiles, links, runs, and silently renders without that one
316
+ * declaration. `backgroundColor` on gea's engine is exactly that -- 64 balls
317
+ * laid out at the right coordinates in no colour at all.
318
+ *
319
+ * Spelled as a character walk because `targets/cpp` may hold no RegExp
320
+ * literal, and the rule is one branch per character anyway.
321
+ */
322
+ const cssPropertyName = (member) => {
323
+ let name = '';
324
+ for (const character of member) {
325
+ const lower = character.toLowerCase();
326
+ name += lower === character ? character : `-${lower}`;
327
+ }
328
+ return name;
329
+ };
330
+ /**
331
+ * The pointer-to-member a reactive JSX position subscribes through, or `null`
332
+ * when this value did not come from a cell.
333
+ *
334
+ * Two conditions, and both are the same one asked of two authorities that must
335
+ * not drift: the read was recorded as coming from a field the plugin marked
336
+ * reactive (`emit-properties.ts`), AND that field's carrier is one the struct
337
+ * renderer actually celled (`representationCanCell`, the renderer's own
338
+ * predicate rather than a copy of it). A field marked reactive whose carrier
339
+ * cannot be celled is a plain member in the emitted struct, and binding to it
340
+ * would deduce `Signal<T>` against a bare `T` -- a template-deduction error in
341
+ * clang instead of a named refusal here. Reading the renderer's predicate is
342
+ * what makes the two answers one answer.
343
+ *
344
+ * Such a field falls through to the ordinary, once-only rendering below, which
345
+ * is what it did before any of this existed. It is a real gap -- an array field
346
+ * of a reactive class does not re-render -- and it is left visible rather than
347
+ * papered over with a cell that cannot detect its own mutation.
348
+ */
349
+ const reactiveMemberPointer = (ctx, operand) => {
350
+ const read = ctx.reactiveFieldReads.get(operand.value);
351
+ if (!read || !representationCanCell(operand.representation))
352
+ return null;
353
+ return { receiver: operandText(ctx, read.receiver), member: `&${read.struct}::${cppRecordFieldName(read.key)}` };
354
+ };
355
+ /**
356
+ * The subscription block a JSX position wired to an EXPRESSION renders, or
357
+ * `null` when this value is not one.
358
+ *
359
+ * `class={todo.done ? 'a' : 'b'}` cannot be bound by a pointer-to-member the
360
+ * way a bare `{this.count}` can: a conditional is control flow, not a load, and
361
+ * there is no single member to point at. The gea plugin's source transform
362
+ * (`plugins/gea/reactive-slots.ts`) makes it a THUNK -- `(() => (expr))()` --
363
+ * which lowers to an ordinary `CallableObject` allocation plus a call of it,
364
+ * so the re-runnable unit exists in the emitted C++ already and needs no
365
+ * re-emission of the expression here. This finds it: the value came from a
366
+ * call, the callee was a callable this body allocated, and the body behind it
367
+ * reads at least one reactive cell.
368
+ *
369
+ * `null` is not a failure. Every position that is not such a call, and every
370
+ * such call whose body reads no cell (a constant slot, or one over plain
371
+ * fields), falls through to the ordinary once-only rendering below -- which is
372
+ * exactly what it did before any of this existed.
373
+ */
374
+ const reactiveThunkPlan = (ctx,
375
+ /** The node the subscription belongs to; removing it releases the subscription. */
376
+ node, operand, admits = representationCanCell,
377
+ /**
378
+ * Which census names this slot's dependencies. `'value'` -- a text, a prop,
379
+ * a style member, a class entry -- re-runs by writing a value again, so it
380
+ * takes the whole reading. `'node'` re-runs by rebuilding a subtree, which
381
+ * repaints, so it takes the narrowed one: see `ReactiveDependencyCensus`.
382
+ */
383
+ scope = 'value') => {
384
+ const trace = process.env['GEA_DEBUG_REACTIVE_SLOTS']
385
+ ? (text) => process.stderr.write(`reactive slot ${ctx.owner}: ${text}\n`)
386
+ : null;
387
+ // The slot's own value first, then each carrier it was converted out of,
388
+ // nearest first: a thunk call whose result lowering converted into the
389
+ // slot's carrier is one `convert` behind the value the slot holds (see
390
+ // `EmitContext.conversionSources`). Nearest first because the predicate
391
+ // is about the SLOT -- a conditional child is admitted as the optional the
392
+ // slot holds, not as the bare node its arm produced.
393
+ let origin = operand;
394
+ let callee;
395
+ let functionId;
396
+ while (origin !== undefined) {
397
+ callee = admits(origin.representation) ? ctx.callCallees.get(origin.value) : undefined;
398
+ functionId = callee === undefined ? undefined : ctx.thunkValues.get(callee);
399
+ if (callee !== undefined && functionId !== undefined)
400
+ break;
401
+ origin = ctx.conversionSources.get(origin.value);
402
+ }
403
+ if (origin === undefined || callee === undefined || functionId === undefined) {
404
+ trace?.(`${operand.value} (${operand.representation.kind}): no admitted value in its history is a call of a recorded thunk`);
405
+ return null;
406
+ }
407
+ const census = scope === 'node' ? ctx.hosts.reactive.nodeDependencies : ctx.hosts.reactive.dependencies;
408
+ const dependencies = census.get(functionId) ?? [];
409
+ if (dependencies.length === 0) {
410
+ trace?.(`${operand.value}: thunk ${functionId} reads no reactive cell`);
411
+ return null;
412
+ }
413
+ const subscriptions = [];
414
+ for (const dependency of dependencies) {
415
+ const owner = subscriptionOwnerText(ctx, dependency);
416
+ // A dependency whose owner this frame cannot NAME is skipped rather than
417
+ // guessed at: subscribing the wrong object would re-render against
418
+ // somebody else's state, which is worse than not re-rendering. Skipping
419
+ // every one of them leaves an empty list, and the slot then falls through
420
+ // to the once-only path below -- the same stated gap, not a silent
421
+ // half-binding.
422
+ const member = dependency.revision ? cppReactiveRevisionFieldName(dependency.key) : cppRecordFieldName(dependency.key);
423
+ if (owner !== null) {
424
+ subscriptions.push(`gea::jsx::subscribeSignal(${node}, ${owner}, &${dependency.struct}::${member}, gea_apply);`);
425
+ }
426
+ }
427
+ if (subscriptions.length === 0) {
428
+ trace?.(`${operand.value}: thunk ${functionId} has ${dependencies.length} dependencies but none this frame can name`);
429
+ return null;
430
+ }
431
+ return { thunk: nameOfValue(ctx, callee), origin, subscriptions };
432
+ };
433
+ /**
434
+ * The C++ expression this frame names one dependency's owning object by.
435
+ *
436
+ * Two shapes, because those are the two a slot expression uses (see
437
+ * `reactive-dependencies.ts`): the thunk captured the enclosing template's
438
+ * receiver, so `this.count` is subscribed through this frame's own receiver;
439
+ * and a module-scope store has a global cell any frame can reach by name.
440
+ *
441
+ * A boxed binding is refused. `bindingReference` names the BOX for one -- a
442
+ * `std::shared_ptr` to the cell, not the object in it -- and handing that to
443
+ * `subscribeSignal` would deduce `Owner` as the wrong type. It is a real gap
444
+ * (a store captured by a closure that reassigns it), reported by falling
445
+ * through rather than by emitting a binding to the wrong thing.
446
+ */
447
+ const subscriptionOwnerText = (ctx, dependency) => {
448
+ if (dependency.source.kind === 'receiver')
449
+ return ctx.abi?.receiver ? cppReceiverName : null;
450
+ const reference = bindingReference(ctx, dependency.source.declaration, 'a reactive subscription');
451
+ return reference.boxed ? null : reference.name;
452
+ };
453
+ const reactiveApplyBlock = (open, subscriptions) => [
454
+ '{',
455
+ ` const auto gea_apply = ${open};`,
456
+ ...subscriptions.map((line) => ` ${line}`),
457
+ '}'
458
+ ];
459
+ /**
460
+ * A LIST child -- `{items.map(item => <Row/>)}` -- as opposed to a single value.
461
+ *
462
+ * The distinction is the child's own carrier and nothing syntactic: an array of
463
+ * anything is appended element by element (`gea::jsx::child`'s array rule), and
464
+ * re-rendering one means taking those elements back down and building them
465
+ * again rather than re-setting one node's text.
466
+ */
467
+ const isListChild = (representation) => representation.kind === 'array-object';
468
+ /**
469
+ * A SUBTREE child -- one node, produced by a component invocation -- as opposed
470
+ * to a value rendered as text.
471
+ *
472
+ * `representationCanCell` answers `false` for a host handle (it is neither a
473
+ * scalar nor a string), which is what keeps a node out of the text path below;
474
+ * it is also why a node-valued thunk needs its own predicate rather than the
475
+ * default one.
476
+ */
477
+ const isNodeChild = (representation) => representation.kind === 'native-handle';
478
+ /**
479
+ * A CONDITIONAL subtree child -- `{companion.view === 7 && <div class="page"/>}`
480
+ * -- whose value is either one node or nothing.
481
+ *
482
+ * A third node-shaped carrier, distinct from `isNodeChild` and needing its own
483
+ * apply, because "nothing" is a state the program asked for: the subtree has to
484
+ * come DOWN when the condition goes false, which a rule written for a component
485
+ * invocation (whose thunk always produces a node) has no case for.
486
+ *
487
+ * The screen is deliberately exact rather than "a union that mentions a node",
488
+ * because what makes the binding correct is that every OTHER arm renders
489
+ * nothing. `gea::jsx::child`'s own rules are the authority for which those are:
490
+ * a `bool` arm is dropped ("JSX drops a boolean child rather than printing
491
+ * it"), and an absent optional appends nothing. A `string` or number arm is not
492
+ * one of them -- `{name && <Row/>}` over a string really does render the string
493
+ * when it is non-empty -- so such a union falls through to the once-only path
494
+ * rather than being bound to a rule that would silently drop its other half.
495
+ * That is a stated gap, not a refusal, and it is the same gap it was before.
496
+ *
497
+ * Exactly one node arm, for the same reason: two would make "which subtree is
498
+ * on screen" a question the apply cannot answer from a handle alone.
499
+ */
500
+ const isOptionalNodeChild = (representation) => {
501
+ if (representation.kind === 'optional')
502
+ return representation.payload.kind === 'native-handle';
503
+ if (representation.kind !== 'tagged-union')
504
+ return false;
505
+ let nodes = 0;
506
+ for (const arm of representation.arms) {
507
+ const value = arm.value;
508
+ if (value.kind === 'native-handle') {
509
+ nodes += 1;
510
+ continue;
511
+ }
512
+ if (value.kind === 'null' || value.kind === 'undefined' || value.kind === 'void')
513
+ continue;
514
+ if (value.kind === 'scalar' && value.domain === 'boolean')
515
+ continue;
516
+ return false;
517
+ }
518
+ return nodes === 1;
519
+ };
520
+ export const emitElementChild = (ctx, lines, operation) => {
521
+ // Before the single-value path: a list's thunk returns an array, which
522
+ // `representationCanCell` rejects, so it would otherwise fall straight
523
+ // through to the once-only `child` below -- which is exactly the bug this
524
+ // exists to fix (a store's array renders one frame and then never again).
525
+ const list = reactiveThunkPlan(ctx, operandText(ctx, operation.node), operation.child, isListChild, 'node');
526
+ if (list) {
527
+ // The child operand is the array the emitted call already produced; it is
528
+ // handed over so the first render appends it instead of building a second,
529
+ // orphaned copy of every row.
530
+ lines.push(...reactiveApplyBlock(`gea::jsx::reactiveListApply(${operandText(ctx, operation.node)}, ${list.thunk}, ${operandText(ctx, operation.child)})`, list.subscriptions));
531
+ return;
532
+ }
533
+ // Before the text path, for the same reason the list is: a component
534
+ // invocation's thunk returns a NODE, and rendering one as text is not a
535
+ // weaker binding, it is a wrong one. `plugins/gea/reactive-slots.ts` claims a
536
+ // component element whose props read reactive state, so the whole invocation
537
+ // -- props record and call -- is one re-runnable unit; what changes when a
538
+ // prop changes is the subtree, so the subtree is replaced.
539
+ const subtree = reactiveThunkPlan(ctx, operandText(ctx, operation.node), operation.child, isNodeChild, 'node');
540
+ if (subtree) {
541
+ lines.push(...reactiveApplyBlock(`gea::jsx::reactiveNodeApply(${operandText(ctx, operation.node)}, ${subtree.thunk}, ${operandText(ctx, operation.child)})`, subtree.subscriptions));
542
+ return;
543
+ }
544
+ // And before the text path for the third time, because a conditional's union
545
+ // is neither a node nor a value to render as text. `{view === 7 && <div/>}`
546
+ // is the shape, and what it needs that `reactiveNodeApply` above does not
547
+ // give it is the ABSENT state: the subtree comes down when the condition goes
548
+ // false and returns to its own position when it goes true. Without this it
549
+ // fell through to the once-only `child` below -- the thunk minted, called
550
+ // once, and its value appended as a static child -- so a detail pane rendered
551
+ // whatever the condition held at build time and never switched again.
552
+ const conditional = reactiveThunkPlan(ctx, operandText(ctx, operation.node), operation.child, isOptionalNodeChild, 'node');
553
+ if (conditional) {
554
+ lines.push(...reactiveApplyBlock(`gea::jsx::reactiveOptionalNodeApply(${operandText(ctx, operation.node)}, ${conditional.thunk}, ${operandText(ctx, operation.child)})`, conditional.subscriptions));
555
+ return;
556
+ }
557
+ // A text leaf's content is the node's OWN characters. Every spelling below is
558
+ // the same binding the container form uses with the created-and-appended text
559
+ // node removed: there is nothing to create, because lowering already proved
560
+ // this element has exactly one run and the host built the node as that run.
561
+ const leaf = operation.textLeaf;
562
+ const computed = reactiveThunkPlan(ctx, operandText(ctx, operation.node), operation.child);
563
+ if (computed) {
564
+ const apply = leaf ? 'reactiveLeafTextApply' : 'reactiveChildApply';
565
+ lines.push(...reactiveApplyBlock(`gea::jsx::${apply}(${operandText(ctx, operation.node)}, ${computed.thunk})`, computed.subscriptions));
566
+ return;
567
+ }
568
+ const reactive = reactiveMemberPointer(ctx, operation.child);
569
+ if (reactive) {
570
+ const bind = leaf ? 'reactiveLeafText' : 'reactiveChild';
571
+ lines.push(`gea::jsx::${bind}(${operandText(ctx, operation.node)}, ${reactive.receiver}, ${reactive.member});`);
572
+ return;
573
+ }
574
+ if (leaf) {
575
+ lines.push(`gea::jsx::leafText(${operandText(ctx, operation.node)}, ${operandText(ctx, operation.child)});`);
576
+ return;
577
+ }
578
+ lines.push(`gea::jsx::child(${operandText(ctx, operation.node)}, ${operandText(ctx, operation.child)});`);
579
+ };
580
+ /**
581
+ * A once-only `class={{...}}` block, spelled as its own attribute text.
582
+ *
583
+ * The table this replaces exists only to be walked once: `objectProp` joins the
584
+ * truthy keys, sets the attribute and drops it. Every one of those keys is a
585
+ * literal the emitter already holds, so the join is a compile-time question
586
+ * wearing a runtime table's clothes -- a heap `Dictionary` plus one doubly
587
+ * boxed `TaggedUnion` per entry, several of them inside list rows and therefore
588
+ * per row per render.
589
+ *
590
+ * The split is by what each entry's truthiness is KNOWN to be, which is what
591
+ * makes the always-true key free rather than merely cheap:
592
+ *
593
+ * - a constant-true entry is text, concatenated into the literal prefix;
594
+ * - a constant-false entry is nothing at all -- it is dropped;
595
+ * - anything else is one token, tested at run time by `booleanTestText`,
596
+ * the same authority every other truthiness question in this emitter asks.
597
+ *
598
+ * A block whose entries are all constant therefore renders as `prop(node,
599
+ * "class", "a b")` -- indistinguishable from having been written `class="a b"`,
600
+ * which is what the program meant.
601
+ *
602
+ * Applies only where `emitObjectPropEntries` declined. A reactive entry needs
603
+ * the table to persist so its apply can write back into it, and that path
604
+ * claiming the prop is exactly the signal that it does -- which is why no
605
+ * reactivity question is asked here or in the census.
606
+ */
607
+ /**
608
+ * The primitive a value was widened out of, or the value itself.
609
+ *
610
+ * Follows `convert` results back only while the step lands on a scalar or a
611
+ * string: those are the carriers whose truthiness a widening preserves and
612
+ * whose constant-ness `booleanConstants` records. A narrowing out of a box
613
+ * or an optional is not followed -- its source's truthiness is a different
614
+ * question (an absent optional is falsy where its payload may not be).
615
+ */
616
+ const primitiveOriginOf = (ctx, operand) => {
617
+ let origin = operand;
618
+ for (;;) {
619
+ const previous = ctx.conversionSources.get(origin.value);
620
+ if (previous === undefined || !representationCanCell(previous.representation))
621
+ return origin;
622
+ origin = previous;
623
+ }
624
+ };
625
+ const emitClassTokens = (ctx, lines, operation, node, key, table) => {
626
+ const sources = ctx.recordFieldSources.get(operation.value.value);
627
+ if (!sources)
628
+ return false;
629
+ const constant = [];
630
+ const tokens = [];
631
+ for (const [entry, recorded] of sources) {
632
+ // The entry's truthiness is asked of the value BEFORE lowering widened it
633
+ // into the table's declared union: a widening of a primitive keeps its
634
+ // truthiness, and the primitive is where the constant is known and where
635
+ // the test is one comparison rather than a walk over every arm of the
636
+ // union (`EmitContext.conversionSources`).
637
+ const source = primitiveOriginOf(ctx, recorded);
638
+ const known = ctx.booleanConstants.get(source.value);
639
+ if (known === false)
640
+ continue;
641
+ if (known === true) {
642
+ constant.push(entry);
643
+ continue;
644
+ }
645
+ tokens.push(`{${cppStringLiteral(entry)}, ${booleanTestText(operandText(ctx, source), source.representation)}}`);
646
+ }
647
+ // The allocation rendered nothing, but `defineValue` hoisted a declaration
648
+ // for it before this decision was reachable. Retract it: an unused local of a
649
+ // `Ref<Dictionary<...>>` type is both an allocation this lowering exists to
650
+ // remove and, under `-Werror`, a build failure.
651
+ const name = ctx.valueNames.get(table);
652
+ const declared = ctx.declarations.findIndex((declaration) => declaration.name === name);
653
+ if (declared >= 0)
654
+ ctx.declarations.splice(declared, 1);
655
+ const text = cppStringLiteral(constant.join(' '));
656
+ if (tokens.length === 0) {
657
+ lines.push(`gea::jsx::prop(${node}, ${key}, ${text});`);
658
+ return true;
659
+ }
660
+ lines.push(`gea::jsx::classTokens(${node}, ${key}, ${text}, {${tokens.join(', ')}});`);
661
+ return true;
662
+ };
663
+ /**
664
+ * The class-map tables this body may spell as a token list instead of building.
665
+ *
666
+ * `class={{ 'city-row': true, 'is-hidden-row': flag }}` derives a
667
+ * `gea::Dictionary` because `ClassMap` is declared with an index signature, and
668
+ * the once-only path then hands that table WHOLE to `objectProp`, which walks
669
+ * it, joins the truthy keys, sets the attribute and drops it. So the table is a
670
+ * heap allocation and one doubly-boxed `TaggedUnion` per entry, built to be
671
+ * read once, by a walk whose every key the emitter already knows -- 19 of them
672
+ * in `examples/apps/weather`, most inside list rows and therefore per row per
673
+ * render.
674
+ *
675
+ * An object literal is not one operation. It is an EMPTY `allocate-record`
676
+ * followed by a `define-own-property` per member, each threading the table
677
+ * onward as its own result -- the same chain `emit-properties.ts` accumulates
678
+ * `recordFieldSources` along, and the reason this census follows a lineage
679
+ * rather than reading `allocate-record.fields`, which for a literal is empty.
680
+ *
681
+ * A chain qualifies when every value in it is read only by the next link, and
682
+ * the last link is read exactly once: by an `element-prop` whose key is the
683
+ * constant `"class"`. Both halves are load bearing. A second reader anywhere
684
+ * would see a table this emitter never built; any other prop has no rule that
685
+ * joins keys. A member whose key is not a constant disqualifies the chain
686
+ * outright -- the emitter cannot spell a key it cannot name.
687
+ *
688
+ * A chain must also live in ONE block. The lines are withheld and replayed at
689
+ * the prop, so a table built under a condition the prop does not share would be
690
+ * moved across that condition -- and one built in a loop, replayed once.
691
+ *
692
+ * Reactive entries are NOT excluded here, and the omission is the design. That
693
+ * question is settled at the prop, where `emitObjectPropEntries` either claims
694
+ * the table -- and the buffer is flushed, table built, nothing lost -- or
695
+ * declines, and it is spelled away. Asking it here as well would mean
696
+ * re-deriving an answer from facts that are not filled until callables render;
697
+ * an earlier revision did exactly that and, being necessarily conservative,
698
+ * excluded all 19 of `weather`'s tables to protect the 3 that bind.
699
+ */
700
+ export const classTableRootsOf = (body) => {
701
+ const strings = stringConstantsOf(body);
702
+ // Every value that IS some literal table, and which table it is. A store
703
+ // republishes the table as its own result, and different lowerings thread
704
+ // that differently -- each store naming the original, or each naming the one
705
+ // before it -- so membership is by lineage and never by counting links.
706
+ const root = new Map();
707
+ const members = new Map();
708
+ const broken = new Set();
709
+ const storeSites = new Map();
710
+ const propSites = new Map();
711
+ const tableBlocks = new Map();
712
+ const sited = (table, blockId) => {
713
+ tableBlocks.set(table, (tableBlocks.get(table) ?? new Set()).add(blockId));
714
+ };
715
+ const join = (table, value) => {
716
+ root.set(value, table);
717
+ members.set(table, (members.get(table) ?? new Set()).add(value));
718
+ };
719
+ for (const blockId of body.blockOrder) {
720
+ const block = body.blocks.get(blockId);
721
+ if (!block)
722
+ continue;
723
+ for (const operation of block.operations) {
724
+ if (operation.kind === 'allocate-record' && operation.result.representation.kind === 'dictionary') {
725
+ join(operation.result.id, operation.result.id);
726
+ sited(operation.result.id, blockId);
727
+ continue;
728
+ }
729
+ if (operation.kind === 'define-own-property' || operation.kind === 'set') {
730
+ const table = root.get(operation.receiver.value);
731
+ if (table === undefined)
732
+ continue;
733
+ // A key this compilation cannot name reaches any member, so the chain
734
+ // stops being one the emitter can spell.
735
+ if (strings.get(operation.key.value) === undefined)
736
+ broken.add(table);
737
+ storeSites.set(table, (storeSites.get(table) ?? new Set()).add(operation));
738
+ sited(table, blockId);
739
+ if (operation.result !== null)
740
+ join(table, operation.result.id);
741
+ continue;
742
+ }
743
+ if (operation.kind === 'element-prop' && strings.get(operation.key.value) === 'class') {
744
+ const table = root.get(operation.value.value);
745
+ if (table === undefined)
746
+ continue;
747
+ propSites.set(table, [...(propSites.get(table) ?? []), operation]);
748
+ sited(table, blockId);
749
+ }
750
+ }
751
+ }
752
+ // Every reader of every value in a chain, so a table that reaches anything
753
+ // but its own stores and its one class prop is left alone. Terminators are
754
+ // walked as well -- a table that escapes through a `return` or is thrown has
755
+ // a reader this body cannot see -- and are spelled out because `ir/queries.ts`
756
+ // has no operand helper for them.
757
+ const escaped = new Set();
758
+ for (const blockId of body.blockOrder) {
759
+ const block = body.blocks.get(blockId);
760
+ if (!block)
761
+ continue;
762
+ for (const operation of block.operations) {
763
+ for (const operand of operandsOfIrOperation(operation)) {
764
+ const table = root.get(operand.value);
765
+ if (table === undefined)
766
+ continue;
767
+ const stores = storeSites.get(table);
768
+ const props = propSites.get(table) ?? [];
769
+ const accounted = (stores !== undefined && stores.has(operation)) || props.some((prop) => prop === operation);
770
+ if (!accounted)
771
+ escaped.add(table);
772
+ }
773
+ }
774
+ const terminator = block.terminator;
775
+ const carried = terminator.kind === 'return'
776
+ ? terminator.value
777
+ : terminator.kind === 'throw'
778
+ ? terminator.value
779
+ : terminator.kind === 'branch'
780
+ ? terminator.condition
781
+ : terminator.kind === 'switch'
782
+ ? terminator.discriminant
783
+ : null;
784
+ const mentions = [
785
+ ...(carried === null ? [] : [carried]),
786
+ ...(terminator.kind === 'switch' ? terminator.cases.map((one) => one.test) : [])
787
+ ];
788
+ for (const operand of mentions) {
789
+ const table = root.get(operand.value);
790
+ if (table !== undefined)
791
+ escaped.add(table);
792
+ }
793
+ }
794
+ const spelled = new Map();
795
+ for (const [table, values] of members) {
796
+ if (broken.has(table) || escaped.has(table))
797
+ continue;
798
+ if ((propSites.get(table) ?? []).length !== 1)
799
+ continue;
800
+ if ((tableBlocks.get(table) ?? new Set()).size !== 1)
801
+ continue;
802
+ for (const value of values)
803
+ spelled.set(value, table);
804
+ }
805
+ return spelled;
806
+ };