@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.
- package/LICENSE +202 -0
- package/README.md +149 -0
- package/dist/cli-analyze.d.ts +1 -0
- package/dist/cli-analyze.js +61 -0
- package/dist/cli-coverage.d.ts +1 -0
- package/dist/cli-coverage.js +329 -0
- package/dist/cli-emit.d.ts +10 -0
- package/dist/cli-emit.js +398 -0
- package/dist/cli-module-graph.d.ts +18 -0
- package/dist/cli-module-graph.js +123 -0
- package/dist/cli-package-source.d.ts +5 -0
- package/dist/cli-package-source.js +116 -0
- package/dist/cli-project.d.ts +2 -0
- package/dist/cli-project.js +60 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.js +199 -0
- package/dist/compiler.d.ts +228 -0
- package/dist/compiler.js +1029 -0
- package/dist/conversion/algebra.d.ts +218 -0
- package/dist/conversion/algebra.js +155 -0
- package/dist/conversion/build.d.ts +67 -0
- package/dist/conversion/build.js +1378 -0
- package/dist/conversion/derive.d.ts +37 -0
- package/dist/conversion/derive.js +260 -0
- package/dist/conversion/graph-validation.d.ts +8 -0
- package/dist/conversion/graph-validation.js +97 -0
- package/dist/conversion/native-callable-adapter.d.ts +13 -0
- package/dist/conversion/native-callable-adapter.js +53 -0
- package/dist/conversion/native-class-reference.d.ts +12 -0
- package/dist/conversion/native-class-reference.js +39 -0
- package/dist/conversion/native-payload-transport.d.ts +25 -0
- package/dist/conversion/native-payload-transport.js +33 -0
- package/dist/conversion/native-selection.d.ts +49 -0
- package/dist/conversion/native-selection.js +135 -0
- package/dist/conversion/native-sum.d.ts +42 -0
- package/dist/conversion/native-sum.js +115 -0
- package/dist/conversion/nodes.d.ts +55 -0
- package/dist/conversion/nodes.js +91 -0
- package/dist/conversion/operand-view.d.ts +14 -0
- package/dist/conversion/operand-view.js +20 -0
- package/dist/conversion/record-view.d.ts +157 -0
- package/dist/conversion/record-view.js +273 -0
- package/dist/conversion/registry.d.ts +217 -0
- package/dist/conversion/registry.js +1 -0
- package/dist/diagnostics/model.d.ts +76 -0
- package/dist/diagnostics/model.js +60 -0
- package/dist/diagnostics/sweep.d.ts +31 -0
- package/dist/diagnostics/sweep.js +112 -0
- package/dist/identity/ids.d.ts +179 -0
- package/dist/identity/ids.js +212 -0
- package/dist/ir/absent-class-arm.d.ts +48 -0
- package/dist/ir/absent-class-arm.js +157 -0
- package/dist/ir/borrow-effects.d.ts +23 -0
- package/dist/ir/borrow-effects.js +151 -0
- package/dist/ir/borrowed-call-arguments.d.ts +40 -0
- package/dist/ir/borrowed-call-arguments.js +117 -0
- package/dist/ir/build.d.ts +168 -0
- package/dist/ir/build.js +459 -0
- package/dist/ir/call-dispatch.d.ts +38 -0
- package/dist/ir/call-dispatch.js +502 -0
- package/dist/ir/call-entry.d.ts +142 -0
- package/dist/ir/call-entry.js +386 -0
- package/dist/ir/callable-class-flow.d.ts +27 -0
- package/dist/ir/callable-class-flow.js +1386 -0
- package/dist/ir/callable-field-slots.d.ts +22 -0
- package/dist/ir/callable-field-slots.js +166 -0
- package/dist/ir/callable-identity-demand.d.ts +52 -0
- package/dist/ir/callable-identity-demand.js +460 -0
- package/dist/ir/callable-member-candidates.d.ts +9 -0
- package/dist/ir/callable-member-candidates.js +39 -0
- package/dist/ir/callable-records.d.ts +21 -0
- package/dist/ir/callable-records.js +411 -0
- package/dist/ir/captures.d.ts +26 -0
- package/dist/ir/captures.js +335 -0
- package/dist/ir/certificate.d.ts +45 -0
- package/dist/ir/certificate.js +47 -0
- package/dist/ir/certify/carrier-keys.d.ts +73 -0
- package/dist/ir/certify/carrier-keys.js +221 -0
- package/dist/ir/certify/function-source.d.ts +4 -0
- package/dist/ir/certify/function-source.js +28 -0
- package/dist/ir/certify/has-property-key.d.ts +88 -0
- package/dist/ir/certify/has-property-key.js +116 -0
- package/dist/ir/certify/instanceof-key.d.ts +24 -0
- package/dist/ir/certify/instanceof-key.js +35 -0
- package/dist/ir/certify/property-access-keys.d.ts +172 -0
- package/dist/ir/certify/property-access-keys.js +291 -0
- package/dist/ir/certify/property-access.d.ts +3 -0
- package/dist/ir/certify/property-access.js +597 -0
- package/dist/ir/certify/runtime-helper.d.ts +3 -0
- package/dist/ir/certify/runtime-helper.js +326 -0
- package/dist/ir/certify/typeof-operand.d.ts +14 -0
- package/dist/ir/certify/typeof-operand.js +16 -0
- package/dist/ir/certify.d.ts +123 -0
- package/dist/ir/certify.js +481 -0
- package/dist/ir/class-evaluation.d.ts +26 -0
- package/dist/ir/class-evaluation.js +50 -0
- package/dist/ir/class-static-fields.d.ts +60 -0
- package/dist/ir/class-static-fields.js +108 -0
- package/dist/ir/construct-entry.d.ts +26 -0
- package/dist/ir/construct-entry.js +117 -0
- package/dist/ir/dead-values.d.ts +90 -0
- package/dist/ir/dead-values.js +184 -0
- package/dist/ir/deferral.d.ts +99 -0
- package/dist/ir/deferral.js +409 -0
- package/dist/ir/dense-loops.d.ts +230 -0
- package/dist/ir/dense-loops.js +697 -0
- package/dist/ir/dominance.d.ts +82 -0
- package/dist/ir/dominance.js +268 -0
- package/dist/ir/emission-representations.d.ts +71 -0
- package/dist/ir/emission-representations.js +350 -0
- package/dist/ir/facts.d.ts +218 -0
- package/dist/ir/facts.js +181 -0
- package/dist/ir/fixed-data-definition.d.ts +19 -0
- package/dist/ir/fixed-data-definition.js +49 -0
- package/dist/ir/generator-split.d.ts +38 -0
- package/dist/ir/generator-split.js +329 -0
- package/dist/ir/hoist.d.ts +55 -0
- package/dist/ir/hoist.js +375 -0
- package/dist/ir/instantiation.d.ts +61 -0
- package/dist/ir/instantiation.js +137 -0
- package/dist/ir/integer-storage.d.ts +170 -0
- package/dist/ir/integer-storage.js +822 -0
- package/dist/ir/integers.d.ts +161 -0
- package/dist/ir/integers.js +539 -0
- package/dist/ir/integrity-restrictions.d.ts +50 -0
- package/dist/ir/integrity-restrictions.js +118 -0
- package/dist/ir/local-iterators.d.ts +4 -0
- package/dist/ir/local-iterators.js +27 -0
- package/dist/ir/lower-allocation.d.ts +4 -0
- package/dist/ir/lower-allocation.js +325 -0
- package/dist/ir/lower-completion.d.ts +15 -0
- package/dist/ir/lower-completion.js +25 -0
- package/dist/ir/lower-destructuring.d.ts +5 -0
- package/dist/ir/lower-destructuring.js +693 -0
- package/dist/ir/lower-element.d.ts +29 -0
- package/dist/ir/lower-element.js +111 -0
- package/dist/ir/lower-exceptions.d.ts +47 -0
- package/dist/ir/lower-exceptions.js +92 -0
- package/dist/ir/lower-flow.d.ts +137 -0
- package/dist/ir/lower-flow.js +600 -0
- package/dist/ir/lower-graph.d.ts +218 -0
- package/dist/ir/lower-graph.js +687 -0
- package/dist/ir/lower-invocation.d.ts +4 -0
- package/dist/ir/lower-invocation.js +514 -0
- package/dist/ir/lower-narrow.d.ts +53 -0
- package/dist/ir/lower-narrow.js +320 -0
- package/dist/ir/lower-operands.d.ts +272 -0
- package/dist/ir/lower-operands.js +461 -0
- package/dist/ir/lower-property.d.ts +21 -0
- package/dist/ir/lower-property.js +132 -0
- package/dist/ir/lower-protocol.d.ts +11 -0
- package/dist/ir/lower-protocol.js +118 -0
- package/dist/ir/lower-short-circuit.d.ts +41 -0
- package/dist/ir/lower-short-circuit.js +63 -0
- package/dist/ir/lower.d.ts +82 -0
- package/dist/ir/lower.js +1346 -0
- package/dist/ir/model.d.ts +1474 -0
- package/dist/ir/model.js +6 -0
- package/dist/ir/native-absent-property.d.ts +3 -0
- package/dist/ir/native-absent-property.js +13 -0
- package/dist/ir/native-array-transport.d.ts +7 -0
- package/dist/ir/native-array-transport.js +46 -0
- package/dist/ir/native-callable-bind.d.ts +9 -0
- package/dist/ir/native-callable-bind.js +30 -0
- package/dist/ir/native-carrier-predicate.d.ts +34 -0
- package/dist/ir/native-carrier-predicate.js +49 -0
- package/dist/ir/native-class-accessor.d.ts +18 -0
- package/dist/ir/native-class-accessor.js +52 -0
- package/dist/ir/native-class-construction.d.ts +16 -0
- package/dist/ir/native-class-construction.js +71 -0
- package/dist/ir/native-class-initialization.d.ts +15 -0
- package/dist/ir/native-class-initialization.js +56 -0
- package/dist/ir/native-class-origins.d.ts +13 -0
- package/dist/ir/native-class-origins.js +237 -0
- package/dist/ir/native-dictionary-transport.d.ts +6 -0
- package/dist/ir/native-dictionary-transport.js +37 -0
- package/dist/ir/native-enumeration.d.ts +14 -0
- package/dist/ir/native-enumeration.js +26 -0
- package/dist/ir/native-equality.d.ts +10 -0
- package/dist/ir/native-equality.js +18 -0
- package/dist/ir/native-field-owner.d.ts +37 -0
- package/dist/ir/native-field-owner.js +183 -0
- package/dist/ir/native-fixed-layout.d.ts +41 -0
- package/dist/ir/native-fixed-layout.js +232 -0
- package/dist/ir/native-host-construction.d.ts +53 -0
- package/dist/ir/native-host-construction.js +62 -0
- package/dist/ir/native-key-query.d.ts +4 -0
- package/dist/ir/native-key-query.js +38 -0
- package/dist/ir/native-merge-transport.d.ts +25 -0
- package/dist/ir/native-merge-transport.js +71 -0
- package/dist/ir/native-record-index-transport.d.ts +11 -0
- package/dist/ir/native-record-index-transport.js +34 -0
- package/dist/ir/native-record-index.d.ts +12 -0
- package/dist/ir/native-record-index.js +27 -0
- package/dist/ir/native-reflect-field.d.ts +5 -0
- package/dist/ir/native-reflect-field.js +33 -0
- package/dist/ir/native-sequence-transport.d.ts +7 -0
- package/dist/ir/native-sequence-transport.js +53 -0
- package/dist/ir/numeric-intrinsics.d.ts +13 -0
- package/dist/ir/numeric-intrinsics.js +57 -0
- package/dist/ir/object-value-conversions.d.ts +20 -0
- package/dist/ir/object-value-conversions.js +50 -0
- package/dist/ir/physical-class-reflection.d.ts +9 -0
- package/dist/ir/physical-class-reflection.js +57 -0
- package/dist/ir/presence-proof.d.ts +42 -0
- package/dist/ir/presence-proof.js +490 -0
- package/dist/ir/program-facts.d.ts +106 -0
- package/dist/ir/program-facts.js +319 -0
- package/dist/ir/proven-branches.d.ts +16 -0
- package/dist/ir/proven-branches.js +219 -0
- package/dist/ir/queries.d.ts +41 -0
- package/dist/ir/queries.js +213 -0
- package/dist/ir/reflection-demand.d.ts +64 -0
- package/dist/ir/reflection-demand.js +1394 -0
- package/dist/ir/refusal.d.ts +43 -0
- package/dist/ir/refusal.js +28 -0
- package/dist/ir/shake.d.ts +37 -0
- package/dist/ir/shake.js +1078 -0
- package/dist/ir/static-callables.d.ts +11 -0
- package/dist/ir/static-callables.js +163 -0
- package/dist/ir/string-layout-reuse.d.ts +13 -0
- package/dist/ir/string-layout-reuse.js +39 -0
- package/dist/ir/string-length-reuse.d.ts +8 -0
- package/dist/ir/string-length-reuse.js +47 -0
- package/dist/ir/transfer.d.ts +78 -0
- package/dist/ir/transfer.js +270 -0
- package/dist/ir/type-query-results.d.ts +25 -0
- package/dist/ir/type-query-results.js +96 -0
- package/dist/ir/typed-property-access.d.ts +100 -0
- package/dist/ir/typed-property-access.js +161 -0
- package/dist/ir/verify.d.ts +19 -0
- package/dist/ir/verify.js +355 -0
- package/dist/plugins/apple/constructors.d.ts +112 -0
- package/dist/plugins/apple/constructors.js +217 -0
- package/dist/plugins/apple/host.d.ts +181 -0
- package/dist/plugins/apple/host.js +262 -0
- package/dist/plugins/apple/jsx.d.ts +2 -0
- package/dist/plugins/apple/jsx.js +293 -0
- package/dist/plugins/apple/members.d.ts +16 -0
- package/dist/plugins/apple/members.js +190 -0
- package/dist/plugins/apple/plugin.d.ts +2 -0
- package/dist/plugins/apple/plugin.js +156 -0
- package/dist/plugins/gea/component-classes.d.ts +25 -0
- package/dist/plugins/gea/component-classes.js +162 -0
- package/dist/plugins/gea/component-inline.d.ts +13 -0
- package/dist/plugins/gea/component-inline.js +532 -0
- package/dist/plugins/gea/constructors.d.ts +23 -0
- package/dist/plugins/gea/constructors.js +100 -0
- package/dist/plugins/gea/contract.d.ts +150 -0
- package/dist/plugins/gea/contract.js +195 -0
- package/dist/plugins/gea/element-ref.d.ts +31 -0
- package/dist/plugins/gea/element-ref.js +45 -0
- package/dist/plugins/gea/host.d.ts +520 -0
- package/dist/plugins/gea/host.js +762 -0
- package/dist/plugins/gea/lower.d.ts +6 -0
- package/dist/plugins/gea/lower.js +195 -0
- package/dist/plugins/gea/members.d.ts +22 -0
- package/dist/plugins/gea/members.js +221 -0
- package/dist/plugins/gea/plugin.d.ts +22 -0
- package/dist/plugins/gea/plugin.js +307 -0
- package/dist/plugins/gea/prelude.d.ts +78 -0
- package/dist/plugins/gea/prelude.js +153 -0
- package/dist/plugins/gea/producer.d.ts +5 -0
- package/dist/plugins/gea/producer.js +52 -0
- package/dist/plugins/gea/reactive-slots.d.ts +49 -0
- package/dist/plugins/gea/reactive-slots.js +578 -0
- package/dist/plugins/gea/render-bridge.d.ts +6 -0
- package/dist/plugins/gea/render-bridge.js +281 -0
- package/dist/plugins/gea/slots.d.ts +15 -0
- package/dist/plugins/gea/slots.js +36 -0
- package/dist/plugins/gea/template-analysis.d.ts +151 -0
- package/dist/plugins/gea/template-analysis.js +346 -0
- package/dist/plugins/gea/user-agent-styles.d.ts +9 -0
- package/dist/plugins/gea/user-agent-styles.js +94 -0
- package/dist/plugins/installed.d.ts +19 -0
- package/dist/plugins/installed.js +21 -0
- package/dist/plugins/load.d.ts +7 -0
- package/dist/plugins/load.js +207 -0
- package/dist/plugins/model.d.ts +735 -0
- package/dist/plugins/model.js +47 -0
- package/dist/plugins/webgl/host.d.ts +77 -0
- package/dist/plugins/webgl/host.js +162 -0
- package/dist/plugins/webgl/plugin.d.ts +40 -0
- package/dist/plugins/webgl/plugin.js +99 -0
- package/dist/preflight/obligations.d.ts +206 -0
- package/dist/preflight/obligations.js +36 -0
- package/dist/preflight/report.d.ts +20 -0
- package/dist/preflight/report.js +61 -0
- package/dist/preflight/run.d.ts +39 -0
- package/dist/preflight/run.js +403 -0
- package/dist/project-preparation.d.ts +33 -0
- package/dist/project-preparation.js +314 -0
- package/dist/projection/abi.d.ts +82 -0
- package/dist/projection/abi.js +349 -0
- package/dist/projection/apply-arguments.d.ts +12 -0
- package/dist/projection/apply-arguments.js +20 -0
- package/dist/projection/bindings.d.ts +250 -0
- package/dist/projection/bindings.js +340 -0
- package/dist/projection/callee.d.ts +196 -0
- package/dist/projection/callee.js +444 -0
- package/dist/projection/class-property-presence.d.ts +28 -0
- package/dist/projection/class-property-presence.js +58 -0
- package/dist/projection/class-prototype.d.ts +5 -0
- package/dist/projection/class-prototype.js +23 -0
- package/dist/projection/class-storage.d.ts +26 -0
- package/dist/projection/class-storage.js +236 -0
- package/dist/projection/classes.d.ts +283 -0
- package/dist/projection/classes.js +944 -0
- package/dist/projection/coercions.d.ts +20 -0
- package/dist/projection/coercions.js +33 -0
- package/dist/projection/dispatch.d.ts +167 -0
- package/dist/projection/dispatch.js +379 -0
- package/dist/projection/fields.d.ts +123 -0
- package/dist/projection/fields.js +383 -0
- package/dist/projection/instance-test.d.ts +78 -0
- package/dist/projection/instance-test.js +156 -0
- package/dist/projection/slots.d.ts +146 -0
- package/dist/projection/slots.js +663 -0
- package/dist/projection/synthesized-abi.d.ts +61 -0
- package/dist/projection/synthesized-abi.js +94 -0
- package/dist/representation/array-index.d.ts +14 -0
- package/dist/representation/array-index.js +17 -0
- package/dist/representation/callable-object.d.ts +3 -0
- package/dist/representation/callable-object.js +6 -0
- package/dist/representation/collections.d.ts +84 -0
- package/dist/representation/collections.js +139 -0
- package/dist/representation/derive.d.ts +159 -0
- package/dist/representation/derive.js +2546 -0
- package/dist/representation/difference.d.ts +30 -0
- package/dist/representation/difference.js +240 -0
- package/dist/representation/field-descriptor-policy.d.ts +19 -0
- package/dist/representation/field-descriptor-policy.js +39 -0
- package/dist/representation/function-constructor.d.ts +13 -0
- package/dist/representation/function-constructor.js +9 -0
- package/dist/representation/host-abi.d.ts +32 -0
- package/dist/representation/host-abi.js +97 -0
- package/dist/representation/host-templates.d.ts +67 -0
- package/dist/representation/host-templates.js +94 -0
- package/dist/representation/intersection.d.ts +84 -0
- package/dist/representation/intersection.js +149 -0
- package/dist/representation/literal-destination.d.ts +43 -0
- package/dist/representation/literal-destination.js +133 -0
- package/dist/representation/merge.d.ts +18 -0
- package/dist/representation/merge.js +83 -0
- package/dist/representation/model.d.ts +1160 -0
- package/dist/representation/model.js +1019 -0
- package/dist/representation/numeric-index.d.ts +13 -0
- package/dist/representation/numeric-index.js +29 -0
- package/dist/representation/object-shape.d.ts +109 -0
- package/dist/representation/object-shape.js +123 -0
- package/dist/representation/optional.d.ts +12 -0
- package/dist/representation/optional.js +87 -0
- package/dist/representation/plan.d.ts +60 -0
- package/dist/representation/plan.js +78 -0
- package/dist/representation/policies.d.ts +589 -0
- package/dist/representation/policies.js +107 -0
- package/dist/representation/primitive-domain.d.ts +1 -0
- package/dist/representation/primitive-domain.js +1 -0
- package/dist/representation/primitives.d.ts +44 -0
- package/dist/representation/primitives.js +78 -0
- package/dist/representation/publish.d.ts +49 -0
- package/dist/representation/publish.js +648 -0
- package/dist/representation/record-fields.d.ts +96 -0
- package/dist/representation/record-fields.js +116 -0
- package/dist/representation/template-object.d.ts +11 -0
- package/dist/representation/template-object.js +26 -0
- package/dist/representation/union.d.ts +30 -0
- package/dist/representation/union.js +324 -0
- package/dist/representation/value-records.d.ts +3 -0
- package/dist/representation/value-records.js +307 -0
- package/dist/representation/verify.d.ts +17 -0
- package/dist/representation/verify.js +221 -0
- package/dist/semantics/alias-this-field-declaration-transform.d.ts +4 -0
- package/dist/semantics/alias-this-field-declaration-transform.js +207 -0
- package/dist/semantics/ambient-type-realization-transform.d.ts +62 -0
- package/dist/semantics/ambient-type-realization-transform.js +168 -0
- package/dist/semantics/ambient.d.ts +24 -0
- package/dist/semantics/ambient.js +119 -0
- package/dist/semantics/borrowed-builtin-call-bind-source-transform.d.ts +4 -0
- package/dist/semantics/borrowed-builtin-call-bind-source-transform.js +341 -0
- package/dist/semantics/callable-origins.d.ts +46 -0
- package/dist/semantics/callable-origins.js +354 -0
- package/dist/semantics/class-alias.d.ts +7 -0
- package/dist/semantics/class-alias.js +37 -0
- package/dist/semantics/class-heritage.d.ts +34 -0
- package/dist/semantics/class-heritage.js +104 -0
- package/dist/semantics/commonjs-wrapper.d.ts +69 -0
- package/dist/semantics/commonjs-wrapper.js +231 -0
- package/dist/semantics/constructor-slot-subclasses.d.ts +28 -0
- package/dist/semantics/constructor-slot-subclasses.js +112 -0
- package/dist/semantics/declaration-overlay-transform.d.ts +35 -0
- package/dist/semantics/declaration-overlay-transform.js +2157 -0
- package/dist/semantics/define-property-source-transform.d.ts +4 -0
- package/dist/semantics/define-property-source-transform.js +437 -0
- package/dist/semantics/diagnostic-source-preparation.d.ts +24 -0
- package/dist/semantics/diagnostic-source-preparation.js +82 -0
- package/dist/semantics/documentation-ranges.d.ts +22 -0
- package/dist/semantics/documentation-ranges.js +36 -0
- package/dist/semantics/dynamic-fallback.d.ts +86 -0
- package/dist/semantics/dynamic-fallback.js +249 -0
- package/dist/semantics/frontend-timing.d.ts +6 -0
- package/dist/semantics/frontend-timing.js +35 -0
- package/dist/semantics/frontend.d.ts +504 -0
- package/dist/semantics/frontend.js +1157 -0
- package/dist/semantics/host-declaration-provenance.d.ts +11 -0
- package/dist/semantics/host-declaration-provenance.js +18 -0
- package/dist/semantics/host-methods.d.ts +24 -0
- package/dist/semantics/host-methods.js +74 -0
- package/dist/semantics/host-protocols.d.ts +429 -0
- package/dist/semantics/host-protocols.js +1501 -0
- package/dist/semantics/inherited-accessor.d.ts +7 -0
- package/dist/semantics/inherited-accessor.js +48 -0
- package/dist/semantics/interface-families.d.ts +70 -0
- package/dist/semantics/interface-families.js +180 -0
- package/dist/semantics/interface-implementors.d.ts +53 -0
- package/dist/semantics/interface-implementors.js +87 -0
- package/dist/semantics/jsdoc-namepath-transform.d.ts +4 -0
- package/dist/semantics/jsdoc-namepath-transform.js +85 -0
- package/dist/semantics/model/coverage.d.ts +68 -0
- package/dist/semantics/model/coverage.js +73 -0
- package/dist/semantics/model/edges.d.ts +103 -0
- package/dist/semantics/model/edges.js +20 -0
- package/dist/semantics/model/graph.d.ts +55 -0
- package/dist/semantics/model/graph.js +129 -0
- package/dist/semantics/model/operands.d.ts +159 -0
- package/dist/semantics/model/operands.js +26 -0
- package/dist/semantics/model/operations.d.ts +496 -0
- package/dist/semantics/model/operations.js +2 -0
- package/dist/semantics/model/primitive-domain.d.ts +26 -0
- package/dist/semantics/model/primitive-domain.js +38 -0
- package/dist/semantics/model/selected-signature.d.ts +261 -0
- package/dist/semantics/model/selected-signature.js +55 -0
- package/dist/semantics/model/structural-type-table.d.ts +93 -0
- package/dist/semantics/model/structural-type-table.js +237 -0
- package/dist/semantics/model/structural-types.d.ts +367 -0
- package/dist/semantics/model/structural-types.js +200 -0
- package/dist/semantics/module-resolution.d.ts +23 -0
- package/dist/semantics/module-resolution.js +227 -0
- package/dist/semantics/new-callee-class-tag-source-transform.d.ts +4 -0
- package/dist/semantics/new-callee-class-tag-source-transform.js +64 -0
- package/dist/semantics/node-project.d.ts +13 -0
- package/dist/semantics/node-project.js +107 -0
- package/dist/semantics/node-source-hooks.d.ts +1 -0
- package/dist/semantics/node-source-hooks.js +63 -0
- package/dist/semantics/normalize/absent-globals.d.ts +143 -0
- package/dist/semantics/normalize/absent-globals.js +191 -0
- package/dist/semantics/normalize/arguments-objects.d.ts +43 -0
- package/dist/semantics/normalize/arguments-objects.js +60 -0
- package/dist/semantics/normalize/asserted-arm-absence.d.ts +28 -0
- package/dist/semantics/normalize/asserted-arm-absence.js +61 -0
- package/dist/semantics/normalize/assignment-patterns.d.ts +70 -0
- package/dist/semantics/normalize/assignment-patterns.js +147 -0
- package/dist/semantics/normalize/bag-absence.d.ts +8 -0
- package/dist/semantics/normalize/bag-absence.js +42 -0
- package/dist/semantics/normalize/binding-fixpoint.d.ts +36 -0
- package/dist/semantics/normalize/binding-fixpoint.js +140 -0
- package/dist/semantics/normalize/callback-parameter-contracts.d.ts +16 -0
- package/dist/semantics/normalize/callback-parameter-contracts.js +91 -0
- package/dist/semantics/normalize/cells/agreement.d.ts +46 -0
- package/dist/semantics/normalize/cells/agreement.js +34 -0
- package/dist/semantics/normalize/cells/candidates.d.ts +17 -0
- package/dist/semantics/normalize/cells/candidates.js +35 -0
- package/dist/semantics/normalize/cells/facts.d.ts +19 -0
- package/dist/semantics/normalize/cells/facts.js +90 -0
- package/dist/semantics/normalize/cells/index.d.ts +10 -0
- package/dist/semantics/normalize/cells/index.js +6 -0
- package/dist/semantics/normalize/cells/model.d.ts +98 -0
- package/dist/semantics/normalize/cells/model.js +2 -0
- package/dist/semantics/normalize/cells/policies/bag.d.ts +44 -0
- package/dist/semantics/normalize/cells/policies/bag.js +114 -0
- package/dist/semantics/normalize/cells/policies/collection.d.ts +42 -0
- package/dist/semantics/normalize/cells/policies/collection.js +218 -0
- package/dist/semantics/normalize/cells/policies/field.d.ts +28 -0
- package/dist/semantics/normalize/cells/policies/field.js +40 -0
- package/dist/semantics/normalize/cells/policies/index.d.ts +49 -0
- package/dist/semantics/normalize/cells/policies/index.js +58 -0
- package/dist/semantics/normalize/cells/policies/local.d.ts +18 -0
- package/dist/semantics/normalize/cells/policies/local.js +37 -0
- package/dist/semantics/normalize/cells/policies/parameter.d.ts +28 -0
- package/dist/semantics/normalize/cells/policies/parameter.js +39 -0
- package/dist/semantics/normalize/cells/policies/return.d.ts +26 -0
- package/dist/semantics/normalize/cells/policies/return.js +45 -0
- package/dist/semantics/normalize/cells/policies/shared.d.ts +33 -0
- package/dist/semantics/normalize/cells/policies/shared.js +45 -0
- package/dist/semantics/normalize/cells/policy.d.ts +72 -0
- package/dist/semantics/normalize/cells/policy.js +18 -0
- package/dist/semantics/normalize/cells/registry.d.ts +14 -0
- package/dist/semantics/normalize/cells/registry.js +17 -0
- package/dist/semantics/normalize/census-refusal.d.ts +62 -0
- package/dist/semantics/normalize/census-refusal.js +27 -0
- package/dist/semantics/normalize/census.d.ts +109 -0
- package/dist/semantics/normalize/census.js +667 -0
- package/dist/semantics/normalize/collection-bindings.d.ts +278 -0
- package/dist/semantics/normalize/collection-bindings.js +677 -0
- package/dist/semantics/normalize/commonjs-module-record.d.ts +21 -0
- package/dist/semantics/normalize/commonjs-module-record.js +289 -0
- package/dist/semantics/normalize/commonjs-require.d.ts +13 -0
- package/dist/semantics/normalize/commonjs-require.js +1527 -0
- package/dist/semantics/normalize/contribution.d.ts +63 -0
- package/dist/semantics/normalize/contribution.js +172 -0
- package/dist/semantics/normalize/dead-typeof-guards.d.ts +64 -0
- package/dist/semantics/normalize/dead-typeof-guards.js +152 -0
- package/dist/semantics/normalize/deferred-intrinsic-protocols.d.ts +57 -0
- package/dist/semantics/normalize/deferred-intrinsic-protocols.js +109 -0
- package/dist/semantics/normalize/derived-expression-type.d.ts +1070 -0
- package/dist/semantics/normalize/derived-expression-type.js +3463 -0
- package/dist/semantics/normalize/evaluation-order.d.ts +16 -0
- package/dist/semantics/normalize/evaluation-order.js +37 -0
- package/dist/semantics/normalize/field-bindings.d.ts +167 -0
- package/dist/semantics/normalize/field-bindings.js +1125 -0
- package/dist/semantics/normalize/flow/array-element-continuation.d.ts +27 -0
- package/dist/semantics/normalize/flow/array-element-continuation.js +1452 -0
- package/dist/semantics/normalize/flow/callable-array-origins.d.ts +42 -0
- package/dist/semantics/normalize/flow/callable-array-origins.js +318 -0
- package/dist/semantics/normalize/flow/callable-completions.d.ts +45 -0
- package/dist/semantics/normalize/flow/callable-completions.js +82 -0
- package/dist/semantics/normalize/flow/callable-reach.d.ts +237 -0
- package/dist/semantics/normalize/flow/callable-reach.js +7174 -0
- package/dist/semantics/normalize/flow/class-family-member-read.d.ts +16 -0
- package/dist/semantics/normalize/flow/class-family-member-read.js +992 -0
- package/dist/semantics/normalize/flow/collection-value-continuation.d.ts +21 -0
- package/dist/semantics/normalize/flow/collection-value-continuation.js +192 -0
- package/dist/semantics/normalize/flow/component-solver.d.ts +199 -0
- package/dist/semantics/normalize/flow/component-solver.js +587 -0
- package/dist/semantics/normalize/flow/computed-key-set.d.ts +84 -0
- package/dist/semantics/normalize/flow/computed-key-set.js +660 -0
- package/dist/semantics/normalize/flow/export-importers.d.ts +24 -0
- package/dist/semantics/normalize/flow/export-importers.js +269 -0
- package/dist/semantics/normalize/flow/host-text-sink.d.ts +25 -0
- package/dist/semantics/normalize/flow/host-text-sink.js +87 -0
- package/dist/semantics/normalize/flow/intrinsic-array-callback-frames.d.ts +84 -0
- package/dist/semantics/normalize/flow/intrinsic-array-callback-frames.js +180 -0
- package/dist/semantics/normalize/flow/intrinsic-data-definition.d.ts +35 -0
- package/dist/semantics/normalize/flow/intrinsic-data-definition.js +140 -0
- package/dist/semantics/normalize/flow/invocation-facts.d.ts +98 -0
- package/dist/semantics/normalize/flow/invocation-facts.js +257 -0
- package/dist/semantics/normalize/flow/member-call-forwarding.d.ts +122 -0
- package/dist/semantics/normalize/flow/member-call-forwarding.js +835 -0
- package/dist/semantics/normalize/flow/model.d.ts +357 -0
- package/dist/semantics/normalize/flow/model.js +177 -0
- package/dist/semantics/normalize/flow/native-collection-protocol.d.ts +24 -0
- package/dist/semantics/normalize/flow/native-collection-protocol.js +252 -0
- package/dist/semantics/normalize/flow/node-path-token.d.ts +3 -0
- package/dist/semantics/normalize/flow/node-path-token.js +53 -0
- package/dist/semantics/normalize/flow/object-binding-continuation.d.ts +11 -0
- package/dist/semantics/normalize/flow/object-binding-continuation.js +42 -0
- package/dist/semantics/normalize/flow/origin-authority.d.ts +56 -0
- package/dist/semantics/normalize/flow/origin-authority.js +2 -0
- package/dist/semantics/normalize/flow/owned-class-receivers.d.ts +35 -0
- package/dist/semantics/normalize/flow/owned-class-receivers.js +191 -0
- package/dist/semantics/normalize/flow/parameter-values.d.ts +27 -0
- package/dist/semantics/normalize/flow/parameter-values.js +251 -0
- package/dist/semantics/normalize/flow/proof-hypotheses.d.ts +66 -0
- package/dist/semantics/normalize/flow/proof-hypotheses.js +162 -0
- package/dist/semantics/normalize/flow/record-alias-closure.d.ts +27 -0
- package/dist/semantics/normalize/flow/record-alias-closure.js +298 -0
- package/dist/semantics/normalize/flow/seeded-origins.d.ts +43 -0
- package/dist/semantics/normalize/flow/seeded-origins.js +54 -0
- package/dist/semantics/normalize/flow/source-class-data.d.ts +132 -0
- package/dist/semantics/normalize/flow/source-class-data.js +838 -0
- package/dist/semantics/normalize/flow/source-class-instanceof.d.ts +13 -0
- package/dist/semantics/normalize/flow/source-class-instanceof.js +37 -0
- package/dist/semantics/normalize/flow/source-class-static-data.d.ts +16 -0
- package/dist/semantics/normalize/flow/source-class-static-data.js +47 -0
- package/dist/semantics/normalize/flow/source-construction-frames.d.ts +12 -0
- package/dist/semantics/normalize/flow/source-construction-frames.js +118 -0
- package/dist/semantics/normalize/flow/source-invocation-frame-layout.d.ts +34 -0
- package/dist/semantics/normalize/flow/source-invocation-frame-layout.js +78 -0
- package/dist/semantics/normalize/flow/source-invocation-receiver.d.ts +37 -0
- package/dist/semantics/normalize/flow/source-invocation-receiver.js +95 -0
- package/dist/semantics/normalize/flow/source-prototype-method-identity.d.ts +23 -0
- package/dist/semantics/normalize/flow/source-prototype-method-identity.js +81 -0
- package/dist/semantics/normalize/flow/source-record-data.d.ts +29 -0
- package/dist/semantics/normalize/flow/source-record-data.js +626 -0
- package/dist/semantics/normalize/flow/source-value-session.d.ts +77 -0
- package/dist/semantics/normalize/flow/source-value-session.js +3089 -0
- package/dist/semantics/normalize/flow/targets.d.ts +118 -0
- package/dist/semantics/normalize/flow/targets.js +405 -0
- package/dist/semantics/normalize/flow/value-flow.d.ts +36 -0
- package/dist/semantics/normalize/flow/value-flow.js +823 -0
- package/dist/semantics/normalize/flow/value-provenance.d.ts +31 -0
- package/dist/semantics/normalize/flow/value-provenance.js +112 -0
- package/dist/semantics/normalize/gating.d.ts +51 -0
- package/dist/semantics/normalize/gating.js +560 -0
- package/dist/semantics/normalize/generic-function-choice.d.ts +31 -0
- package/dist/semantics/normalize/generic-function-choice.js +115 -0
- package/dist/semantics/normalize/global-host-mutations.d.ts +51 -0
- package/dist/semantics/normalize/global-host-mutations.js +5989 -0
- package/dist/semantics/normalize/host-effect-contracts.d.ts +77 -0
- package/dist/semantics/normalize/host-effect-contracts.js +143 -0
- package/dist/semantics/normalize/host-mutation-computed-keys.d.ts +38 -0
- package/dist/semantics/normalize/host-mutation-computed-keys.js +26 -0
- package/dist/semantics/normalize/host-mutation-key-reader.d.ts +66 -0
- package/dist/semantics/normalize/host-mutation-key-reader.js +192 -0
- package/dist/semantics/normalize/host-mutation-keys.d.ts +114 -0
- package/dist/semantics/normalize/host-mutation-keys.js +183 -0
- package/dist/semantics/normalize/identities.d.ts +172 -0
- package/dist/semantics/normalize/identities.js +426 -0
- package/dist/semantics/normalize/implicit-arguments-tuple.d.ts +97 -0
- package/dist/semantics/normalize/implicit-arguments-tuple.js +197 -0
- package/dist/semantics/normalize/implicit-arguments.d.ts +11 -0
- package/dist/semantics/normalize/implicit-arguments.js +39 -0
- package/dist/semantics/normalize/instantiation.d.ts +73 -0
- package/dist/semantics/normalize/instantiation.js +399 -0
- package/dist/semantics/normalize/intrinsic-property-call.d.ts +18 -0
- package/dist/semantics/normalize/intrinsic-property-call.js +69 -0
- package/dist/semantics/normalize/intrinsic-prototype.d.ts +41 -0
- package/dist/semantics/normalize/intrinsic-prototype.js +87 -0
- package/dist/semantics/normalize/intrinsic-static-member.d.ts +14 -0
- package/dist/semantics/normalize/intrinsic-static-member.js +23 -0
- package/dist/semantics/normalize/jsdoc-type-names.d.ts +32 -0
- package/dist/semantics/normalize/jsdoc-type-names.js +512 -0
- package/dist/semantics/normalize/keyof.d.ts +32 -0
- package/dist/semantics/normalize/keyof.js +110 -0
- package/dist/semantics/normalize/local-bindings.d.ts +176 -0
- package/dist/semantics/normalize/local-bindings.js +1826 -0
- package/dist/semantics/normalize/logical-result-type.d.ts +16 -0
- package/dist/semantics/normalize/logical-result-type.js +102 -0
- package/dist/semantics/normalize/namespace-paths.d.ts +57 -0
- package/dist/semantics/normalize/namespace-paths.js +108 -0
- package/dist/semantics/normalize/normalize.d.ts +57 -0
- package/dist/semantics/normalize/normalize.js +68 -0
- package/dist/semantics/normalize/object-bag-bindings.d.ts +305 -0
- package/dist/semantics/normalize/object-bag-bindings.js +1290 -0
- package/dist/semantics/normalize/omitted-stated-parameter.d.ts +53 -0
- package/dist/semantics/normalize/omitted-stated-parameter.js +59 -0
- package/dist/semantics/normalize/open-type-form.d.ts +10 -0
- package/dist/semantics/normalize/open-type-form.js +32 -0
- package/dist/semantics/normalize/parameter-bindings.d.ts +361 -0
- package/dist/semantics/normalize/parameter-bindings.js +3339 -0
- package/dist/semantics/normalize/parameter-slot.d.ts +264 -0
- package/dist/semantics/normalize/parameter-slot.js +491 -0
- package/dist/semantics/normalize/physical-overload-result.d.ts +77 -0
- package/dist/semantics/normalize/physical-overload-result.js +99 -0
- package/dist/semantics/normalize/primitive-property-absence.d.ts +12 -0
- package/dist/semantics/normalize/primitive-property-absence.js +60 -0
- package/dist/semantics/normalize/producer-context.d.ts +376 -0
- package/dist/semantics/normalize/producer-context.js +1 -0
- package/dist/semantics/normalize/producers/allocations.d.ts +3 -0
- package/dist/semantics/normalize/producers/allocations.js +863 -0
- package/dist/semantics/normalize/producers/binding-kind.d.ts +37 -0
- package/dist/semantics/normalize/producers/binding-kind.js +36 -0
- package/dist/semantics/normalize/producers/bindings.d.ts +85 -0
- package/dist/semantics/normalize/producers/bindings.js +710 -0
- package/dist/semantics/normalize/producers/boundary.d.ts +34 -0
- package/dist/semantics/normalize/producers/boundary.js +123 -0
- package/dist/semantics/normalize/producers/class-lifecycle.d.ts +3 -0
- package/dist/semantics/normalize/producers/class-lifecycle.js +902 -0
- package/dist/semantics/normalize/producers/computations.d.ts +3 -0
- package/dist/semantics/normalize/producers/computations.js +613 -0
- package/dist/semantics/normalize/producers/control-loops.d.ts +30 -0
- package/dist/semantics/normalize/producers/control-loops.js +91 -0
- package/dist/semantics/normalize/producers/control.d.ts +30 -0
- package/dist/semantics/normalize/producers/control.js +923 -0
- package/dist/semantics/normalize/producers/declaration-lifecycle.d.ts +3 -0
- package/dist/semantics/normalize/producers/declaration-lifecycle.js +390 -0
- package/dist/semantics/normalize/producers/destructuring.d.ts +45 -0
- package/dist/semantics/normalize/producers/destructuring.js +1180 -0
- package/dist/semantics/normalize/producers/dynamic-language.d.ts +3 -0
- package/dist/semantics/normalize/producers/dynamic-language.js +70 -0
- package/dist/semantics/normalize/producers/erasure.d.ts +51 -0
- package/dist/semantics/normalize/producers/erasure.js +90 -0
- package/dist/semantics/normalize/producers/installed.d.ts +3 -0
- package/dist/semantics/normalize/producers/installed.js +55 -0
- package/dist/semantics/normalize/producers/invocations.d.ts +35 -0
- package/dist/semantics/normalize/producers/invocations.js +1796 -0
- package/dist/semantics/normalize/producers/iteration-yield.d.ts +59 -0
- package/dist/semantics/normalize/producers/iteration-yield.js +235 -0
- package/dist/semantics/normalize/producers/jsx.d.ts +3 -0
- package/dist/semantics/normalize/producers/jsx.js +360 -0
- package/dist/semantics/normalize/producers/mint.d.ts +39 -0
- package/dist/semantics/normalize/producers/mint.js +44 -0
- package/dist/semantics/normalize/producers/nullish.d.ts +16 -0
- package/dist/semantics/normalize/producers/nullish.js +27 -0
- package/dist/semantics/normalize/producers/object-assignment.d.ts +8 -0
- package/dist/semantics/normalize/producers/object-assignment.js +204 -0
- package/dist/semantics/normalize/producers/object-tag.d.ts +9 -0
- package/dist/semantics/normalize/producers/object-tag.js +119 -0
- package/dist/semantics/normalize/producers/optional-chain.d.ts +44 -0
- package/dist/semantics/normalize/producers/optional-chain.js +75 -0
- package/dist/semantics/normalize/producers/properties.d.ts +21 -0
- package/dist/semantics/normalize/producers/properties.js +1053 -0
- package/dist/semantics/normalize/producers/protocol.d.ts +67 -0
- package/dist/semantics/normalize/producers/protocol.js +695 -0
- package/dist/semantics/normalize/producers/references.d.ts +53 -0
- package/dist/semantics/normalize/producers/references.js +1027 -0
- package/dist/semantics/normalize/producers/shared.d.ts +561 -0
- package/dist/semantics/normalize/producers/shared.js +1683 -0
- package/dist/semantics/normalize/producers/spread-arguments.d.ts +72 -0
- package/dist/semantics/normalize/producers/spread-arguments.js +375 -0
- package/dist/semantics/normalize/producers/tagged-template.d.ts +5 -0
- package/dist/semantics/normalize/producers/tagged-template.js +307 -0
- package/dist/semantics/normalize/producers/tuple-spread.d.ts +189 -0
- package/dist/semantics/normalize/producers/tuple-spread.js +279 -0
- package/dist/semantics/normalize/property-key-domain.d.ts +36 -0
- package/dist/semantics/normalize/property-key-domain.js +150 -0
- package/dist/semantics/normalize/reachability.d.ts +189 -0
- package/dist/semantics/normalize/reachability.js +1057 -0
- package/dist/semantics/normalize/reassigned-bindings.d.ts +13 -0
- package/dist/semantics/normalize/reassigned-bindings.js +41 -0
- package/dist/semantics/normalize/record-storage-families.d.ts +11 -0
- package/dist/semantics/normalize/record-storage-families.js +109 -0
- package/dist/semantics/normalize/return-bindings.d.ts +260 -0
- package/dist/semantics/normalize/return-bindings.js +1311 -0
- package/dist/semantics/normalize/return-paths.d.ts +2 -0
- package/dist/semantics/normalize/return-paths.js +28 -0
- package/dist/semantics/normalize/script-global-redefinition.d.ts +44 -0
- package/dist/semantics/normalize/script-global-redefinition.js +75 -0
- package/dist/semantics/normalize/specialization.d.ts +201 -0
- package/dist/semantics/normalize/specialization.js +1824 -0
- package/dist/semantics/normalize/structural-array-element.d.ts +176 -0
- package/dist/semantics/normalize/structural-array-element.js +700 -0
- package/dist/semantics/normalize/structural-array-read.d.ts +13 -0
- package/dist/semantics/normalize/structural-array-read.js +124 -0
- package/dist/semantics/normalize/structural-callable.d.ts +12 -0
- package/dist/semantics/normalize/structural-callable.js +82 -0
- package/dist/semantics/normalize/structural-creation-order.d.ts +32 -0
- package/dist/semantics/normalize/structural-creation-order.js +111 -0
- package/dist/semantics/normalize/structural-declarations.d.ts +395 -0
- package/dist/semantics/normalize/structural-declarations.js +968 -0
- package/dist/semantics/normalize/structural-declared-body.d.ts +25 -0
- package/dist/semantics/normalize/structural-declared-body.js +147 -0
- package/dist/semantics/normalize/structural-generics.d.ts +56 -0
- package/dist/semantics/normalize/structural-generics.js +120 -0
- package/dist/semantics/normalize/structural-indexed-access.d.ts +11 -0
- package/dist/semantics/normalize/structural-indexed-access.js +126 -0
- package/dist/semantics/normalize/structural-instantiated-member.d.ts +64 -0
- package/dist/semantics/normalize/structural-instantiated-member.js +407 -0
- package/dist/semantics/normalize/structural-joins.d.ts +44 -0
- package/dist/semantics/normalize/structural-joins.js +143 -0
- package/dist/semantics/normalize/structural-layout-relevance.d.ts +29 -0
- package/dist/semantics/normalize/structural-layout-relevance.js +391 -0
- package/dist/semantics/normalize/structural-layout-type.d.ts +11 -0
- package/dist/semantics/normalize/structural-layout-type.js +1468 -0
- package/dist/semantics/normalize/structural-leaves.d.ts +49 -0
- package/dist/semantics/normalize/structural-leaves.js +125 -0
- package/dist/semantics/normalize/structural-local-union.d.ts +13 -0
- package/dist/semantics/normalize/structural-local-union.js +133 -0
- package/dist/semantics/normalize/structural-members.d.ts +26 -0
- package/dist/semantics/normalize/structural-members.js +84 -0
- package/dist/semantics/normalize/structural-mutable-method.d.ts +15 -0
- package/dist/semantics/normalize/structural-mutable-method.js +109 -0
- package/dist/semantics/normalize/structural-parts.d.ts +131 -0
- package/dist/semantics/normalize/structural-parts.js +737 -0
- package/dist/semantics/normalize/structural-receiver.d.ts +66 -0
- package/dist/semantics/normalize/structural-receiver.js +551 -0
- package/dist/semantics/normalize/structural-rules.d.ts +112 -0
- package/dist/semantics/normalize/structural-rules.js +93 -0
- package/dist/semantics/normalize/structural-self-reference.d.ts +150 -0
- package/dist/semantics/normalize/structural-self-reference.js +494 -0
- package/dist/semantics/normalize/structural.d.ts +202 -0
- package/dist/semantics/normalize/structural.js +4218 -0
- package/dist/semantics/normalize/unreduced-type-form.d.ts +41 -0
- package/dist/semantics/normalize/unreduced-type-form.js +53 -0
- package/dist/semantics/normalize/unresolvable-names.d.ts +56 -0
- package/dist/semantics/normalize/unresolvable-names.js +140 -0
- package/dist/semantics/package-sources.d.ts +16 -0
- package/dist/semantics/package-sources.js +365 -0
- package/dist/semantics/program.d.ts +151 -0
- package/dist/semantics/program.js +667 -0
- package/dist/semantics/prototype-install-source-transform.d.ts +4 -0
- package/dist/semantics/prototype-install-source-transform.js +341 -0
- package/dist/semantics/prototype-object-class-source-transform.d.ts +4 -0
- package/dist/semantics/prototype-object-class-source-transform.js +525 -0
- package/dist/semantics/prototype-reparenting.d.ts +50 -0
- package/dist/semantics/prototype-reparenting.js +317 -0
- package/dist/semantics/stable-checker.d.ts +10 -0
- package/dist/semantics/stable-checker.js +148 -0
- package/dist/semantics/subclass-member-overlay-transform.d.ts +35 -0
- package/dist/semantics/subclass-member-overlay-transform.js +1418 -0
- package/dist/semantics/symbol-keyed-expando-source-transform.d.ts +4 -0
- package/dist/semantics/symbol-keyed-expando-source-transform.js +66 -0
- package/dist/semantics/this-constructor-source-transform.d.ts +4 -0
- package/dist/semantics/this-constructor-source-transform.js +122 -0
- package/dist/semantics/uninstantiable-classes.d.ts +22 -0
- package/dist/semantics/uninstantiable-classes.js +75 -0
- package/dist/targets/cpp/balanced-units.d.ts +3 -0
- package/dist/targets/cpp/balanced-units.js +58 -0
- package/dist/targets/cpp/borrowed-call-entry.d.ts +30 -0
- package/dist/targets/cpp/borrowed-call-entry.js +68 -0
- package/dist/targets/cpp/captures.d.ts +68 -0
- package/dist/targets/cpp/captures.js +269 -0
- package/dist/targets/cpp/class-layout.d.ts +313 -0
- package/dist/targets/cpp/class-layout.js +483 -0
- package/dist/targets/cpp/class-properties/computed-method-value.d.ts +25 -0
- package/dist/targets/cpp/class-properties/computed-method-value.js +22 -0
- package/dist/targets/cpp/class-properties/emit-class-properties.d.ts +216 -0
- package/dist/targets/cpp/class-properties/emit-class-properties.js +917 -0
- package/dist/targets/cpp/class-properties/native-prototype.d.ts +11 -0
- package/dist/targets/cpp/class-properties/native-prototype.js +101 -0
- package/dist/targets/cpp/class-ref-transport.d.ts +12 -0
- package/dist/targets/cpp/class-ref-transport.js +32 -0
- package/dist/targets/cpp/conversions.d.ts +3 -0
- package/dist/targets/cpp/conversions.js +2027 -0
- package/dist/targets/cpp/deferral-safety.d.ts +82 -0
- package/dist/targets/cpp/deferral-safety.js +86 -0
- package/dist/targets/cpp/direct-call-receivers.d.ts +37 -0
- package/dist/targets/cpp/direct-call-receivers.js +79 -0
- package/dist/targets/cpp/document.d.ts +74 -0
- package/dist/targets/cpp/document.js +106 -0
- package/dist/targets/cpp/emit-allocation.d.ts +60 -0
- package/dist/targets/cpp/emit-allocation.js +573 -0
- package/dist/targets/cpp/emit-arrays.d.ts +119 -0
- package/dist/targets/cpp/emit-arrays.js +1047 -0
- package/dist/targets/cpp/emit-binding-reference.d.ts +17 -0
- package/dist/targets/cpp/emit-binding-reference.js +120 -0
- package/dist/targets/cpp/emit-bindings.d.ts +158 -0
- package/dist/targets/cpp/emit-bindings.js +769 -0
- package/dist/targets/cpp/emit-buffers.d.ts +156 -0
- package/dist/targets/cpp/emit-buffers.js +573 -0
- package/dist/targets/cpp/emit-callable.d.ts +230 -0
- package/dist/targets/cpp/emit-callable.js +2154 -0
- package/dist/targets/cpp/emit-carrier-members.d.ts +406 -0
- package/dist/targets/cpp/emit-carrier-members.js +1224 -0
- package/dist/targets/cpp/emit-coercion.d.ts +26 -0
- package/dist/targets/cpp/emit-coercion.js +39 -0
- package/dist/targets/cpp/emit-context.d.ts +1882 -0
- package/dist/targets/cpp/emit-context.js +904 -0
- package/dist/targets/cpp/emit-dynamic-properties.d.ts +174 -0
- package/dist/targets/cpp/emit-dynamic-properties.js +1249 -0
- package/dist/targets/cpp/emit-equality.d.ts +39 -0
- package/dist/targets/cpp/emit-equality.js +472 -0
- package/dist/targets/cpp/emit-exceptions.d.ts +104 -0
- package/dist/targets/cpp/emit-exceptions.js +513 -0
- package/dist/targets/cpp/emit-field-owner.d.ts +4 -0
- package/dist/targets/cpp/emit-field-owner.js +27 -0
- package/dist/targets/cpp/emit-in.d.ts +31 -0
- package/dist/targets/cpp/emit-in.js +426 -0
- package/dist/targets/cpp/emit-instanceof.d.ts +19 -0
- package/dist/targets/cpp/emit-instanceof.js +601 -0
- package/dist/targets/cpp/emit-integers.d.ts +68 -0
- package/dist/targets/cpp/emit-integers.js +184 -0
- package/dist/targets/cpp/emit-iterator.d.ts +100 -0
- package/dist/targets/cpp/emit-iterator.js +1137 -0
- package/dist/targets/cpp/emit-json.d.ts +73 -0
- package/dist/targets/cpp/emit-json.js +823 -0
- package/dist/targets/cpp/emit-jsx.d.ts +74 -0
- package/dist/targets/cpp/emit-jsx.js +806 -0
- package/dist/targets/cpp/emit-mixed-binary.d.ts +51 -0
- package/dist/targets/cpp/emit-mixed-binary.js +60 -0
- package/dist/targets/cpp/emit-namespaces.d.ts +101 -0
- package/dist/targets/cpp/emit-namespaces.js +133 -0
- package/dist/targets/cpp/emit-narrowing.d.ts +738 -0
- package/dist/targets/cpp/emit-narrowing.js +3967 -0
- package/dist/targets/cpp/emit-native-equality.d.ts +3 -0
- package/dist/targets/cpp/emit-native-equality.js +14 -0
- package/dist/targets/cpp/emit-native-selection.d.ts +5 -0
- package/dist/targets/cpp/emit-native-selection.js +37 -0
- package/dist/targets/cpp/emit-object-tag.d.ts +4 -0
- package/dist/targets/cpp/emit-object-tag.js +108 -0
- package/dist/targets/cpp/emit-owned-record.d.ts +2 -0
- package/dist/targets/cpp/emit-owned-record.js +15 -0
- package/dist/targets/cpp/emit-presence.d.ts +78 -0
- package/dist/targets/cpp/emit-presence.js +376 -0
- package/dist/targets/cpp/emit-properties.d.ts +105 -0
- package/dist/targets/cpp/emit-properties.js +1640 -0
- package/dist/targets/cpp/emit-record-view.d.ts +20 -0
- package/dist/targets/cpp/emit-record-view.js +354 -0
- package/dist/targets/cpp/emit-return.d.ts +5 -0
- package/dist/targets/cpp/emit-return.js +237 -0
- package/dist/targets/cpp/emit-sum-widening.d.ts +10 -0
- package/dist/targets/cpp/emit-sum-widening.js +69 -0
- package/dist/targets/cpp/emit-tonumber.d.ts +38 -0
- package/dist/targets/cpp/emit-tonumber.js +177 -0
- package/dist/targets/cpp/emit-tostring.d.ts +92 -0
- package/dist/targets/cpp/emit-tostring.js +556 -0
- package/dist/targets/cpp/emit-typeof.d.ts +49 -0
- package/dist/targets/cpp/emit-typeof.js +317 -0
- package/dist/targets/cpp/emit-union-properties.d.ts +181 -0
- package/dist/targets/cpp/emit-union-properties.js +1281 -0
- package/dist/targets/cpp/emit.d.ts +45 -0
- package/dist/targets/cpp/emit.js +2225 -0
- package/dist/targets/cpp/error-types.d.ts +4 -0
- package/dist/targets/cpp/error-types.js +11 -0
- package/dist/targets/cpp/function-source-reads.d.ts +72 -0
- package/dist/targets/cpp/function-source-reads.js +148 -0
- package/dist/targets/cpp/host/atomics.d.ts +25 -0
- package/dist/targets/cpp/host/atomics.js +63 -0
- package/dist/targets/cpp/host/core-globals.d.ts +108 -0
- package/dist/targets/cpp/host/core-globals.js +158 -0
- package/dist/targets/cpp/host/dynamic-argument-members.d.ts +42 -0
- package/dist/targets/cpp/host/dynamic-argument-members.js +61 -0
- package/dist/targets/cpp/host/emit-host-arity.d.ts +139 -0
- package/dist/targets/cpp/host/emit-host-arity.js +232 -0
- package/dist/targets/cpp/host/emit-host-invoke.d.ts +91 -0
- package/dist/targets/cpp/host/emit-host-invoke.js +1105 -0
- package/dist/targets/cpp/host/emit-host-object.d.ts +55 -0
- package/dist/targets/cpp/host/emit-host-object.js +2206 -0
- package/dist/targets/cpp/host/emit-host-properties.d.ts +69 -0
- package/dist/targets/cpp/host/emit-host-properties.js +533 -0
- package/dist/targets/cpp/host/emit-host-reflect.d.ts +4 -0
- package/dist/targets/cpp/host/emit-host-reflect.js +180 -0
- package/dist/targets/cpp/host/emit-host-value.d.ts +120 -0
- package/dist/targets/cpp/host/emit-host-value.js +392 -0
- package/dist/targets/cpp/host/host-members.d.ts +505 -0
- package/dist/targets/cpp/host/host-members.js +819 -0
- package/dist/targets/cpp/host/host-method-aliases.d.ts +30 -0
- package/dist/targets/cpp/host/host-method-aliases.js +76 -0
- package/dist/targets/cpp/host/native-protocols.d.ts +47 -0
- package/dist/targets/cpp/host/native-protocols.js +183 -0
- package/dist/targets/cpp/host/object-protocol.d.ts +351 -0
- package/dist/targets/cpp/host/object-protocol.js +671 -0
- package/dist/targets/cpp/host-namespace-reads.d.ts +83 -0
- package/dist/targets/cpp/host-namespace-reads.js +113 -0
- package/dist/targets/cpp/manifest/capabilities.d.ts +39 -0
- package/dist/targets/cpp/manifest/capabilities.js +1484 -0
- package/dist/targets/cpp/manifest.d.ts +23 -0
- package/dist/targets/cpp/manifest.js +113 -0
- package/dist/targets/cpp/native-error-base.d.ts +38 -0
- package/dist/targets/cpp/native-error-base.js +74 -0
- package/dist/targets/cpp/native-narrowing-transport.d.ts +12 -0
- package/dist/targets/cpp/native-narrowing-transport.js +151 -0
- package/dist/targets/cpp/native-selection-helpers.d.ts +11 -0
- package/dist/targets/cpp/native-selection-helpers.js +46 -0
- package/dist/targets/cpp/native-symbol-keys.d.ts +8 -0
- package/dist/targets/cpp/native-symbol-keys.js +34 -0
- package/dist/targets/cpp/ownership.d.ts +43 -0
- package/dist/targets/cpp/ownership.js +38 -0
- package/dist/targets/cpp/owning-conversion-input.d.ts +14 -0
- package/dist/targets/cpp/owning-conversion-input.js +12 -0
- package/dist/targets/cpp/property-read-claims.d.ts +62 -0
- package/dist/targets/cpp/property-read-claims.js +23 -0
- package/dist/targets/cpp/property-store-claims.d.ts +62 -0
- package/dist/targets/cpp/property-store-claims.js +26 -0
- package/dist/targets/cpp/prototype/emit-prototype-array.d.ts +111 -0
- package/dist/targets/cpp/prototype/emit-prototype-array.js +602 -0
- package/dist/targets/cpp/prototype/emit-prototype-date.d.ts +133 -0
- package/dist/targets/cpp/prototype/emit-prototype-date.js +515 -0
- package/dist/targets/cpp/prototype/emit-prototype-error.d.ts +13 -0
- package/dist/targets/cpp/prototype/emit-prototype-error.js +54 -0
- package/dist/targets/cpp/prototype/emit-prototype-invoke.d.ts +34 -0
- package/dist/targets/cpp/prototype/emit-prototype-invoke.js +1003 -0
- package/dist/targets/cpp/prototype/emit-prototype-iterator.d.ts +47 -0
- package/dist/targets/cpp/prototype/emit-prototype-iterator.js +250 -0
- package/dist/targets/cpp/prototype/emit-prototype-promise.d.ts +46 -0
- package/dist/targets/cpp/prototype/emit-prototype-promise.js +143 -0
- package/dist/targets/cpp/prototype/emit-prototype-regexp.d.ts +335 -0
- package/dist/targets/cpp/prototype/emit-prototype-regexp.js +853 -0
- package/dist/targets/cpp/prototype/emit-prototype-string.d.ts +42 -0
- package/dist/targets/cpp/prototype/emit-prototype-string.js +252 -0
- package/dist/targets/cpp/prototype/prototype-method-reads.d.ts +25 -0
- package/dist/targets/cpp/prototype/prototype-method-reads.js +182 -0
- package/dist/targets/cpp/reactive-dependencies.d.ts +140 -0
- package/dist/targets/cpp/reactive-dependencies.js +432 -0
- package/dist/targets/cpp/reactive-origins.d.ts +44 -0
- package/dist/targets/cpp/reactive-origins.js +82 -0
- package/dist/targets/cpp/records.d.ts +277 -0
- package/dist/targets/cpp/records.js +2427 -0
- package/dist/targets/cpp/recursive-containers.d.ts +43 -0
- package/dist/targets/cpp/recursive-containers.js +144 -0
- package/dist/targets/cpp/regexp-types.d.ts +56 -0
- package/dist/targets/cpp/regexp-types.js +59 -0
- package/dist/targets/cpp/substrate.d.ts +125 -0
- package/dist/targets/cpp/substrate.js +12 -0
- package/dist/targets/cpp/translation-unit.d.ts +219 -0
- package/dist/targets/cpp/translation-unit.js +2063 -0
- package/dist/targets/cpp/types.d.ts +280 -0
- package/dist/targets/cpp/types.js +1135 -0
- package/dist/targets/cpp/virtual-methods.d.ts +95 -0
- package/dist/targets/cpp/virtual-methods.js +264 -0
- package/package.json +95 -0
- package/src/targets/cpp/runtime/gea_dynamic_proxy.h +824 -0
- package/src/targets/cpp/runtime/gea_eval.h +1376 -0
- package/src/targets/cpp/runtime/gea_native_class_prototype.h +44 -0
- package/src/targets/cpp/runtime/gea_runtime.h +29222 -0
- 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
|
+
};
|