@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,578 @@
|
|
|
1
|
+
import ts from 'typescript';
|
|
2
|
+
/**
|
|
3
|
+
* A JSX expression that computes its value from other values, rewritten into an
|
|
4
|
+
* immediately-invoked arrow over the same expression.
|
|
5
|
+
*
|
|
6
|
+
* ## Why a source transform, and why this shape
|
|
7
|
+
*
|
|
8
|
+
* `class={done ? 'a' : 'b'}` has to be RE-EVALUATED when `done` changes, and a
|
|
9
|
+
* ternary does not lower to a C++ conditional expression -- it lowers to real
|
|
10
|
+
* control flow (two blocks writing one merge variable), inline in the enclosing
|
|
11
|
+
* template body. There is nothing there a later stage could re-run: the value
|
|
12
|
+
* was computed once, by statements that are not a callable.
|
|
13
|
+
*
|
|
14
|
+
* v1 has the same problem and solves it by lowering the slot expression a
|
|
15
|
+
* SECOND time, as a C++ expression string inside a re-render lambda
|
|
16
|
+
* (`cpp-template-renderer.ts`'s `emitReactiveApply`). Its re-runnable unit is a
|
|
17
|
+
* thunk over the expression. So is this one -- but rather than lowering
|
|
18
|
+
* anything twice, this asks the compiler for the thunk in the one way the
|
|
19
|
+
* language already has of spelling "this expression, deferred": an arrow
|
|
20
|
+
* function. `(() => (expr))()` is exactly the original expression semantically,
|
|
21
|
+
* and it lowers to `CallableObject{&thunk, new env{...}}` followed by a call --
|
|
22
|
+
* a real body, with real captures, and with the ternary's control flow inside
|
|
23
|
+
* it where it was already emitted correctly. The emitter then keeps the thunk
|
|
24
|
+
* instead of discarding it after the first call.
|
|
25
|
+
*
|
|
26
|
+
* Before the checker, because that is the only place it can be: the rewrite has
|
|
27
|
+
* to produce ordinary, well-typed TypeScript, and it does -- an IIFE has the
|
|
28
|
+
* type of its body, so `class` still receives a `string`. Nothing downstream
|
|
29
|
+
* needs a new type, a marker declaration, or a widened JSX attribute.
|
|
30
|
+
*
|
|
31
|
+
* ## What is deliberately NOT wrapped
|
|
32
|
+
*
|
|
33
|
+
* - **An arrow or function expression.** `onClick={() => ...}` is a handler,
|
|
34
|
+
* not a value to recompute; wrapping it would hand the prop a thunk that
|
|
35
|
+
* returns the handler.
|
|
36
|
+
* - **An identifier or a plain property access.** `{this.count}` is a direct
|
|
37
|
+
* field read, which the emitter binds natively through the field's own cell
|
|
38
|
+
* (`emit-jsx.ts`'s `reactiveMemberPointer`) -- strictly better than a thunk,
|
|
39
|
+
* since it needs no call at all. Wrapping it would take that away.
|
|
40
|
+
* - **A literal.** Nothing to recompute.
|
|
41
|
+
* - **Anything with no property access anywhere inside it.** A reactive field
|
|
42
|
+
* is reached through a receiver, so an expression that reads no property of
|
|
43
|
+
* anything cannot depend on one. This is a syntactic screen, not a semantic
|
|
44
|
+
* one -- it is allowed to over-approximate (a wrapped expression that turns
|
|
45
|
+
* out to read nothing reactive simply keeps its once-only behaviour, at the
|
|
46
|
+
* cost of one call), and it must never under-approximate, which is why it
|
|
47
|
+
* asks the weakest question that is still sound.
|
|
48
|
+
* - **An object literal, AS A WHOLE.** `style={{ display: ... }}` reaches the
|
|
49
|
+
* emitter as a generated struct whose FIELDS are the values, and a thunk
|
|
50
|
+
* returning the whole struct is not what the per-member `styleProperty` calls
|
|
51
|
+
* consume. So the rewrite descends one level and claims the MEMBERS instead,
|
|
52
|
+
* each becoming its own thunk -- which is the same granularity the emitter
|
|
53
|
+
* already writes style at.
|
|
54
|
+
*
|
|
55
|
+
* A member's screen is weaker than a slot's by one rule: a plain property
|
|
56
|
+
* access IS claimed here. `{this.count}` in a child position is left alone
|
|
57
|
+
* because the emitter binds it natively through the field's own cell, which
|
|
58
|
+
* is strictly better; a style MEMBER has no such path -- the value is read
|
|
59
|
+
* into a struct field and the struct is what the prop receives -- so a thunk
|
|
60
|
+
* is not the worse of two bindings there, it is the only one.
|
|
61
|
+
*
|
|
62
|
+
* The member claim is what a `class={{ base: true, 'is-on': flag }}` block
|
|
63
|
+
* gets too, and it is equally right there for a different reason: a class
|
|
64
|
+
* map's literal derives a `gea::Dictionary` rather than a struct (`ClassMap`
|
|
65
|
+
* is declared with an index signature), and `emit-jsx.ts` re-applies the
|
|
66
|
+
* whole table per changed ENTRY. What is NOT right is claiming such a
|
|
67
|
+
* literal whole: an IIFE around it gives the arrow an inferred return type
|
|
68
|
+
* computed from the literal's own members while the literal itself keeps the
|
|
69
|
+
* attribute's contextual type, so the thunk returns a `Dictionary` from a
|
|
70
|
+
* function whose C++ return type is a generated struct. Measured, on this
|
|
71
|
+
* exact app: `no viable conversion from ... Ref<gea::Dictionary<...>> to
|
|
72
|
+
* ... Ref<gea_record_type_4000>`.
|
|
73
|
+
*/
|
|
74
|
+
const containsPropertyAccess = (node) => {
|
|
75
|
+
if (ts.isPropertyAccessExpression(node) || ts.isElementAccessExpression(node))
|
|
76
|
+
return true;
|
|
77
|
+
let found = false;
|
|
78
|
+
ts.forEachChild(node, (child) => {
|
|
79
|
+
if (!found && containsPropertyAccess(child))
|
|
80
|
+
found = true;
|
|
81
|
+
});
|
|
82
|
+
return found;
|
|
83
|
+
};
|
|
84
|
+
/**
|
|
85
|
+
* Whether this expression is already something better than a thunk, or could
|
|
86
|
+
* not depend on a reactive field at all.
|
|
87
|
+
*
|
|
88
|
+
* A property access is NOT one of them, and used to be. The reading was that
|
|
89
|
+
* `{this.count}` is a direct field read the emitter binds natively through the
|
|
90
|
+
* field's own cell (`emit-jsx.ts`'s `reactiveMemberPointer`), so a thunk would
|
|
91
|
+
* only take that away. True of a FIELD. A getter is spelled identically and has
|
|
92
|
+
* no cell: `{reader.pageNumberLabel}` is a call, `reactiveFieldReads` has no
|
|
93
|
+
* entry for it, and the slot fell through to the once-only `leafText` -- the
|
|
94
|
+
* page counter froze at whatever it read on the first render, which on the
|
|
95
|
+
* e-reader was the one-page entry preview of a walk still in progress ("1 / 1"
|
|
96
|
+
* for a book of fourteen hundred pages). The same wrongness
|
|
97
|
+
* `enclosingLocalConstInitializer` below was written for: the screen said
|
|
98
|
+
* "already something better" and the truth was "nothing at all".
|
|
99
|
+
*
|
|
100
|
+
* Which of the two a `store.x` is cannot be asked here -- this transform runs
|
|
101
|
+
* BEFORE the checker (see the header for why it has to), and the class is in
|
|
102
|
+
* another file besides. So the screen answers the way the header requires when
|
|
103
|
+
* it cannot be exact: it may OVER-approximate, never under. A field claimed
|
|
104
|
+
* here still binds -- the thunk's one dependency is that field, and
|
|
105
|
+
* `reactiveThunkPlan` subscribes to exactly the cell `reactiveMemberPointer`
|
|
106
|
+
* would have pointed at -- at the cost of one call per notification. A getter
|
|
107
|
+
* left unclaimed does not bind at all.
|
|
108
|
+
*
|
|
109
|
+
* `a?.b` and a parenthesized access are the same read as `a.b` and are treated
|
|
110
|
+
* the same for the same reason.
|
|
111
|
+
*/
|
|
112
|
+
const isDirectOrConstant = (expression) => {
|
|
113
|
+
const inner = ts.isParenthesizedExpression(expression) ? expression.expression : expression;
|
|
114
|
+
if (ts.isIdentifier(inner) || inner.kind === ts.SyntaxKind.ThisKeyword)
|
|
115
|
+
return true;
|
|
116
|
+
if (ts.isStringLiteral(inner) || ts.isNumericLiteral(inner) || ts.isNoSubstitutionTemplateLiteral(inner))
|
|
117
|
+
return true;
|
|
118
|
+
if (inner.kind === ts.SyntaxKind.TrueKeyword || inner.kind === ts.SyntaxKind.FalseKeyword)
|
|
119
|
+
return true;
|
|
120
|
+
return false;
|
|
121
|
+
};
|
|
122
|
+
/**
|
|
123
|
+
* The initializer of the `const` an identifier names, when that `const` is a
|
|
124
|
+
* LOCAL of the template's own body -- otherwise `null`.
|
|
125
|
+
*
|
|
126
|
+
* Why this exists: `isDirectOrConstant` declines a bare identifier because
|
|
127
|
+
* `{this.count}` is a direct field read the emitter binds natively through the
|
|
128
|
+
* field's own cell, which is strictly better than a thunk. That reasoning holds
|
|
129
|
+
* for a field read. It does NOT hold for a local:
|
|
130
|
+
*
|
|
131
|
+
* const label = stopwatch.running ? 'Pause' : 'Start'
|
|
132
|
+
* return <span class={labelClass}>{label}</span>
|
|
133
|
+
*
|
|
134
|
+
* `label` is not a cell and never was -- it is a merge variable written once by
|
|
135
|
+
* the ternary's control flow -- so `reactiveMemberPointer` finds nothing to
|
|
136
|
+
* point at and the slot falls through to the once-only path. The screen said
|
|
137
|
+
* "already something better"; the truth was "nothing at all", and the button
|
|
138
|
+
* kept its first label for the life of the program (`examples/apps/
|
|
139
|
+
* stopwatch-jsx`: Start never became Pause).
|
|
140
|
+
*
|
|
141
|
+
* The re-runnable unit is the const's INITIALIZER, so that is what is claimed:
|
|
142
|
+
* the identifier's range is replaced by the initializer's text, and the thunk
|
|
143
|
+
* that wraps it reads the reactive field itself. This is the reading the gea
|
|
144
|
+
* framework's own template compiler already states in the IR it ships beside
|
|
145
|
+
* the program -- `StartPauseButton`'s text slot arrives as
|
|
146
|
+
* `expr: "stopwatch.running ? 'Pause' : 'Start'"`, not as `label` -- so this
|
|
147
|
+
* makes the C++ backend agree with the authority the app was written against
|
|
148
|
+
* rather than inventing a rule.
|
|
149
|
+
*
|
|
150
|
+
* Scoped to the enclosing function body, and to `const`. A `let` may be
|
|
151
|
+
* reassigned between its initializer and the slot, so its initializer is not
|
|
152
|
+
* the value the slot holds; a binding from an outer function or module scope is
|
|
153
|
+
* evaluated once for reasons of its own and is not this template's to re-run.
|
|
154
|
+
*/
|
|
155
|
+
const enclosingLocalConstInitializer = (identifier) => {
|
|
156
|
+
const name = identifier.text;
|
|
157
|
+
let node = identifier;
|
|
158
|
+
while (node.parent) {
|
|
159
|
+
const parent = node.parent;
|
|
160
|
+
const statements = ts.isBlock(parent) || ts.isCaseClause(parent) || ts.isDefaultClause(parent) ? parent.statements : null;
|
|
161
|
+
if (statements) {
|
|
162
|
+
for (const statement of statements) {
|
|
163
|
+
if (!ts.isVariableStatement(statement))
|
|
164
|
+
continue;
|
|
165
|
+
if ((statement.declarationList.flags & ts.NodeFlags.Const) === 0)
|
|
166
|
+
continue;
|
|
167
|
+
// Declared before the use, which is what `const` guarantees for a
|
|
168
|
+
// reachable read and what makes substituting the initializer legal.
|
|
169
|
+
if (statement.end > identifier.getStart())
|
|
170
|
+
continue;
|
|
171
|
+
for (const declaration of statement.declarationList.declarations) {
|
|
172
|
+
if (!ts.isIdentifier(declaration.name) || declaration.name.text !== name)
|
|
173
|
+
continue;
|
|
174
|
+
return declaration.initializer ?? null;
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
// The function this slot is written in is the boundary: everything above it
|
|
179
|
+
// belongs to a scope with its own evaluation, not to this render.
|
|
180
|
+
if (ts.isFunctionDeclaration(parent) ||
|
|
181
|
+
ts.isFunctionExpression(parent) ||
|
|
182
|
+
ts.isArrowFunction(parent) ||
|
|
183
|
+
ts.isMethodDeclaration(parent)) {
|
|
184
|
+
return null;
|
|
185
|
+
}
|
|
186
|
+
node = parent;
|
|
187
|
+
}
|
|
188
|
+
return null;
|
|
189
|
+
};
|
|
190
|
+
const containsJsx = (node) => {
|
|
191
|
+
if (ts.isJsxElement(node) || ts.isJsxSelfClosingElement(node) || ts.isJsxFragment(node))
|
|
192
|
+
return true;
|
|
193
|
+
let found = false;
|
|
194
|
+
ts.forEachChild(node, (child) => {
|
|
195
|
+
if (!found && containsJsx(child))
|
|
196
|
+
found = true;
|
|
197
|
+
});
|
|
198
|
+
return found;
|
|
199
|
+
};
|
|
200
|
+
const isHandlerLike = (expression) => ts.isArrowFunction(expression) || ts.isFunctionExpression(expression) || ts.isObjectLiteralExpression(expression);
|
|
201
|
+
/**
|
|
202
|
+
* Whether this expression container is a `ref` attribute.
|
|
203
|
+
*
|
|
204
|
+
* `ref={this.imgEl}` is an OUT parameter, not a value slot: lowering requires it
|
|
205
|
+
* to NAME a property it can store the created node into (`a "ref" attribute must
|
|
206
|
+
* name a property to store the node in`), so a thunk around it -- which names
|
|
207
|
+
* the result of an invocation -- is refused outright rather than merely wasted.
|
|
208
|
+
* It was excluded only incidentally while `isDirectOrConstant` declined every
|
|
209
|
+
* property access; now that a property access is claimed, the exclusion has to
|
|
210
|
+
* be stated, and it belongs beside `isHandlerLike` for the same reason: neither
|
|
211
|
+
* is a value this render depends on.
|
|
212
|
+
*/
|
|
213
|
+
const isRefAttribute = (container) => {
|
|
214
|
+
const parent = container.parent;
|
|
215
|
+
if (!ts.isJsxAttribute(parent))
|
|
216
|
+
return false;
|
|
217
|
+
return ts.isIdentifier(parent.name) && parent.name.text === 'ref';
|
|
218
|
+
};
|
|
219
|
+
/**
|
|
220
|
+
* Whether this tag names a VALUE rather than an intrinsic name.
|
|
221
|
+
*
|
|
222
|
+
* JSX's own rule, and the same one `producers/jsx.ts`'s `intrinsicTagOf` reads:
|
|
223
|
+
* a lowercase-initial plain identifier is an intrinsic name, anything else --
|
|
224
|
+
* `ClockHand`, `ui.Row` -- resolves as a value. A namespaced name is never a
|
|
225
|
+
* component.
|
|
226
|
+
*/
|
|
227
|
+
export const namesAComponent = (tag) => {
|
|
228
|
+
if (ts.isJsxNamespacedName(tag))
|
|
229
|
+
return false;
|
|
230
|
+
if (!ts.isIdentifier(tag))
|
|
231
|
+
return true;
|
|
232
|
+
const first = tag.text.charAt(0);
|
|
233
|
+
return !(first === first.toLowerCase() && first !== first.toUpperCase());
|
|
234
|
+
};
|
|
235
|
+
export const openingOf = (element) => ts.isJsxElement(element) ? element.openingElement : element;
|
|
236
|
+
/**
|
|
237
|
+
* Whether any attribute of a component element reads a property of anything.
|
|
238
|
+
*
|
|
239
|
+
* The same weakest-sound screen the slot rule uses, asked of the element's
|
|
240
|
+
* attributes together: a reactive field is reached through a receiver, so an
|
|
241
|
+
* element whose attributes read no property of anything cannot pass one. A
|
|
242
|
+
* handler is excluded for the reason `isHandlerLike` states -- `onClick={() =>
|
|
243
|
+
* store.toggle(i)}` reads a property, but the read happens when the handler
|
|
244
|
+
* RUNS, not when the props are built, so it is not an input this element's
|
|
245
|
+
* output depends on.
|
|
246
|
+
*/
|
|
247
|
+
const attributesReadAProperty = (element) => {
|
|
248
|
+
for (const attribute of openingOf(element).attributes.properties) {
|
|
249
|
+
if (ts.isJsxSpreadAttribute(attribute)) {
|
|
250
|
+
if (containsPropertyAccess(attribute.expression))
|
|
251
|
+
return true;
|
|
252
|
+
continue;
|
|
253
|
+
}
|
|
254
|
+
const initializer = attribute.initializer;
|
|
255
|
+
if (!initializer || !ts.isJsxExpression(initializer) || !initializer.expression)
|
|
256
|
+
continue;
|
|
257
|
+
const expression = initializer.expression;
|
|
258
|
+
if (ts.isArrowFunction(expression) || ts.isFunctionExpression(expression))
|
|
259
|
+
continue;
|
|
260
|
+
if (containsPropertyAccess(expression))
|
|
261
|
+
return true;
|
|
262
|
+
}
|
|
263
|
+
return false;
|
|
264
|
+
};
|
|
265
|
+
/**
|
|
266
|
+
* A COMPONENT element in a child position, whose props are computed from
|
|
267
|
+
* something read out of an object.
|
|
268
|
+
*
|
|
269
|
+
* This is the one JSX position whose reactivity nothing else can reach.
|
|
270
|
+
* `plugins/gea/lower.ts` lowers `<ClockHand angle={clock.second}/>` to what the
|
|
271
|
+
* checker checked -- a props record built from the attributes, and a call --
|
|
272
|
+
* so the reactive field is read ONCE, into a plain field of that record, and
|
|
273
|
+
* the callee's body then sees an ordinary parameter. Every reactive binding
|
|
274
|
+
* this backend has is attached at an INTRINSIC element's own prop or child
|
|
275
|
+
* (`targets/cpp/emit-jsx.ts`), and there is no intrinsic element here: the
|
|
276
|
+
* emitter cannot bind a member pointer through a call it cannot see inside.
|
|
277
|
+
*
|
|
278
|
+
* So the re-runnable unit is the whole invocation -- props record and call
|
|
279
|
+
* together -- which is exactly what wrapping the element in an IIFE makes it.
|
|
280
|
+
* Re-running the call alone would not do: it would hand the callee the SAME
|
|
281
|
+
* record, still holding the value the first render read.
|
|
282
|
+
*
|
|
283
|
+
* Claimed only in a child position. A component element that is a function's
|
|
284
|
+
* return value (`return <AnalogClockView/>`) is not a slot of anything -- there
|
|
285
|
+
* is no parent node to re-attach a rebuilt subtree to -- and the rewrite would
|
|
286
|
+
* only add a call.
|
|
287
|
+
*
|
|
288
|
+
* And only under an INTRINSIC parent. The re-attach point this rewrite is for
|
|
289
|
+
* is an `element-child` operation on a real host node -- the only place
|
|
290
|
+
* `targets/cpp/emit-jsx.ts` can write `reactiveNodeApply` -- and only an
|
|
291
|
+
* intrinsic element lowers to one. A component nested directly inside another
|
|
292
|
+
* COMPONENT element (`<UILabel/>` under `<UIView>`, as every apple-native app
|
|
293
|
+
* writes its tree) is not a child slot of a node at all: it is an attribute of
|
|
294
|
+
* the props record the outer component's own invocation builds, attached by
|
|
295
|
+
* that call rather than by this compiler. Wrapping it offers a re-run nothing
|
|
296
|
+
* can attach -- and measurably costs: it moves the element out of the position
|
|
297
|
+
* whose type the checker had, so `producers/jsx.ts` sees `any` and blocks the
|
|
298
|
+
* census (four `ios-*` apps lost their certificate on exactly this).
|
|
299
|
+
*/
|
|
300
|
+
export const isReactiveComponentChild = (node) => {
|
|
301
|
+
if (!ts.isJsxElement(node) && !ts.isJsxSelfClosingElement(node))
|
|
302
|
+
return false;
|
|
303
|
+
const parent = node.parent;
|
|
304
|
+
if (ts.isJsxElement(parent)) {
|
|
305
|
+
if (namesAComponent(parent.openingElement.tagName))
|
|
306
|
+
return false;
|
|
307
|
+
}
|
|
308
|
+
else if (!ts.isJsxFragment(parent)) {
|
|
309
|
+
return false;
|
|
310
|
+
}
|
|
311
|
+
return namesAComponent(openingOf(node).tagName) && attributesReadAProperty(node);
|
|
312
|
+
};
|
|
313
|
+
/**
|
|
314
|
+
* Whether this identifier is being READ as a value.
|
|
315
|
+
*
|
|
316
|
+
* `a.label` and `{ label: 1 }` both contain an identifier spelled `label` that
|
|
317
|
+
* names something else entirely, and substituting an initializer for either
|
|
318
|
+
* would rewrite a member name into an expression.
|
|
319
|
+
*/
|
|
320
|
+
const isValueRead = (identifier) => {
|
|
321
|
+
const parent = identifier.parent;
|
|
322
|
+
if (ts.isPropertyAccessExpression(parent) && parent.name === identifier)
|
|
323
|
+
return false;
|
|
324
|
+
if (ts.isQualifiedName(parent) && parent.right === identifier)
|
|
325
|
+
return false;
|
|
326
|
+
if (ts.isPropertyAssignment(parent) && parent.name === identifier)
|
|
327
|
+
return false;
|
|
328
|
+
if (ts.isShorthandPropertyAssignment(parent) && parent.name === identifier)
|
|
329
|
+
return false;
|
|
330
|
+
if (ts.isBindingElement(parent) && parent.propertyName === identifier)
|
|
331
|
+
return false;
|
|
332
|
+
if (ts.isJsxAttribute(parent))
|
|
333
|
+
return false;
|
|
334
|
+
return true;
|
|
335
|
+
};
|
|
336
|
+
/**
|
|
337
|
+
* One local-`const` initializer with its own local-`const` reads substituted,
|
|
338
|
+
* as source text.
|
|
339
|
+
*
|
|
340
|
+
* A chain is one dependency, not several: `const running = store.running; const
|
|
341
|
+
* label = running ? 'Pause' : 'Start'` reads exactly the field the one-step
|
|
342
|
+
* inline of `label` would fail to mention, because `running` is another merge
|
|
343
|
+
* variable and re-running a thunk over it re-reads nothing. Substituting the
|
|
344
|
+
* whole chain is what makes the thunk's dependency set the fields it actually
|
|
345
|
+
* depends on -- which is the property `reactive-dependencies.ts` needs, and the
|
|
346
|
+
* one the comment on component attributes above is protecting.
|
|
347
|
+
*
|
|
348
|
+
* `seen` is the cycle guard. `const a = a` does not typecheck, but a shadowed
|
|
349
|
+
* name across nested blocks can walk in a circle, and a compiler that loops is
|
|
350
|
+
* worse than one that declines.
|
|
351
|
+
*/
|
|
352
|
+
const inlinedTextOf = (file, expression, seen) => {
|
|
353
|
+
const substitutions = [];
|
|
354
|
+
const walk = (node) => {
|
|
355
|
+
if (ts.isIdentifier(node) && isValueRead(node)) {
|
|
356
|
+
const initializer = enclosingLocalConstInitializer(node);
|
|
357
|
+
if (initializer && !seen.has(initializer) && !containsJsx(initializer) && !isHandlerLike(initializer)) {
|
|
358
|
+
substitutions.push({
|
|
359
|
+
start: node.getStart(file),
|
|
360
|
+
end: node.end,
|
|
361
|
+
text: `(${inlinedTextOf(file, initializer, new Set([...seen, initializer]))})`
|
|
362
|
+
});
|
|
363
|
+
return;
|
|
364
|
+
}
|
|
365
|
+
}
|
|
366
|
+
ts.forEachChild(node, walk);
|
|
367
|
+
};
|
|
368
|
+
walk(expression);
|
|
369
|
+
const text = file.text;
|
|
370
|
+
let out = '';
|
|
371
|
+
let cursor = expression.getStart(file);
|
|
372
|
+
for (const substitution of substitutions) {
|
|
373
|
+
out += text.slice(cursor, substitution.start) + substitution.text;
|
|
374
|
+
cursor = substitution.end;
|
|
375
|
+
}
|
|
376
|
+
return out + text.slice(cursor, expression.end);
|
|
377
|
+
};
|
|
378
|
+
/**
|
|
379
|
+
* Whether this expression reads a NAMED member of something -- `a.b`, not
|
|
380
|
+
* `a[i]`.
|
|
381
|
+
*
|
|
382
|
+
* A stronger question than `containsPropertyAccess`, and deliberately so. That
|
|
383
|
+
* one screens an expression the author already wrote in the slot, where an
|
|
384
|
+
* over-claim costs one call. This one screens an expression the author wrote
|
|
385
|
+
* SOMEWHERE ELSE and this rewrite is moving, where an over-claim also changes
|
|
386
|
+
* where the value is computed -- so it asks for the shape a reactive field
|
|
387
|
+
* actually has: a name, off a receiver. `DIAL_PAD[row * 3 + col]` is an index
|
|
388
|
+
* into a module constant and reads no field of anything; it was being claimed,
|
|
389
|
+
* and every such claim is a thunk that subscribes to nothing.
|
|
390
|
+
*/
|
|
391
|
+
const readsANamedMember = (node) => {
|
|
392
|
+
if (ts.isPropertyAccessExpression(node))
|
|
393
|
+
return true;
|
|
394
|
+
let found = false;
|
|
395
|
+
ts.forEachChild(node, (child) => {
|
|
396
|
+
if (!found && readsANamedMember(child))
|
|
397
|
+
found = true;
|
|
398
|
+
});
|
|
399
|
+
return found;
|
|
400
|
+
};
|
|
401
|
+
const containsCall = (node) => {
|
|
402
|
+
if (ts.isCallExpression(node) || ts.isNewExpression(node) || ts.isTaggedTemplateExpression(node))
|
|
403
|
+
return true;
|
|
404
|
+
let found = false;
|
|
405
|
+
ts.forEachChild(node, (child) => {
|
|
406
|
+
if (!found && containsCall(child))
|
|
407
|
+
found = true;
|
|
408
|
+
});
|
|
409
|
+
return found;
|
|
410
|
+
};
|
|
411
|
+
/**
|
|
412
|
+
* The expression a bare identifier in a slot position stands for, or `null`.
|
|
413
|
+
*
|
|
414
|
+
* The screen a slot expression gets, plus two rules this position needs that a
|
|
415
|
+
* slot the author wrote in place does not:
|
|
416
|
+
*
|
|
417
|
+
* - **No call.** `reactive-dependencies.ts` deliberately does not look through
|
|
418
|
+
* a call, so a thunk whose body IS one subscribes to nothing the callee
|
|
419
|
+
* reads: the claim would cost an allocation and bind nothing. It is also the
|
|
420
|
+
* shape that already cost four `ios-*` apps their certificate once (see
|
|
421
|
+
* `isReactiveComponentChild`) -- `const leftButton = controlButton(...)`
|
|
422
|
+
* inlined into a child position moves a component invocation out of the
|
|
423
|
+
* position whose type the checker had.
|
|
424
|
+
* - **A named member somewhere.** See `readsANamedMember`.
|
|
425
|
+
*/
|
|
426
|
+
const localConstSlotText = (file, expression) => {
|
|
427
|
+
if (!ts.isIdentifier(expression) || !isValueRead(expression))
|
|
428
|
+
return null;
|
|
429
|
+
const initializer = enclosingLocalConstInitializer(expression);
|
|
430
|
+
if (!initializer)
|
|
431
|
+
return null;
|
|
432
|
+
if (isHandlerLike(initializer) || containsJsx(initializer))
|
|
433
|
+
return null;
|
|
434
|
+
const text = inlinedTextOf(file, initializer, new Set([initializer]));
|
|
435
|
+
// Asked of the SUBSTITUTED text, not of the initializer: a chain whose last
|
|
436
|
+
// link is the field read is what decides this, and only the substitution
|
|
437
|
+
// knows what the chain resolved to. Re-parsed rather than re-walked because
|
|
438
|
+
// the text is what the rewrite will emit.
|
|
439
|
+
const parsed = ts.createSourceFile('slot.ts', `(${text})`, ts.ScriptTarget.Latest, true, ts.ScriptKind.TS);
|
|
440
|
+
const statement = parsed.statements[0];
|
|
441
|
+
if (!statement || !ts.isExpressionStatement(statement))
|
|
442
|
+
return null;
|
|
443
|
+
if (containsCall(statement.expression))
|
|
444
|
+
return null;
|
|
445
|
+
if (!readsANamedMember(statement.expression))
|
|
446
|
+
return null;
|
|
447
|
+
return text;
|
|
448
|
+
};
|
|
449
|
+
/**
|
|
450
|
+
* Every JSX expression container this rewrite claims, in source order.
|
|
451
|
+
*
|
|
452
|
+
* Claims NEST. `{items.map(item => <Row class={item.done ? 'a' : 'b'}/>)}` is
|
|
453
|
+
* one claim -- the list -- containing another -- the row's class -- and both
|
|
454
|
+
* are real: the outer makes the list re-runnable, the inner makes one row's
|
|
455
|
+
* prop re-runnable without rebuilding the row. Recursing into a claimed
|
|
456
|
+
* expression is therefore required, not optional, and it is why the rewrite
|
|
457
|
+
* below is a recursive rebuild rather than a flat splice.
|
|
458
|
+
*
|
|
459
|
+
* The one thing that is NOT recursed into is a claimed expression that
|
|
460
|
+
* contains no JSX: `class={a.b ? x : y}` becomes one thunk, and a second thunk
|
|
461
|
+
* for a sub-expression of it would only re-evaluate what the outer one already
|
|
462
|
+
* re-evaluates.
|
|
463
|
+
*/
|
|
464
|
+
const claimedExpressionsOf = (file) => {
|
|
465
|
+
const claimed = [];
|
|
466
|
+
const claim = (node, braced, text) => {
|
|
467
|
+
claimed.push({ start: node.getStart(file), end: node.end, braced, ...(text === undefined ? {} : { text }) });
|
|
468
|
+
};
|
|
469
|
+
const visit = (node) => {
|
|
470
|
+
// Before the expression-container rule: a component element in a child
|
|
471
|
+
// position is a claim of the ELEMENT, not of any expression inside it.
|
|
472
|
+
if (isReactiveComponentChild(node)) {
|
|
473
|
+
claim(node, true);
|
|
474
|
+
// Its CHILDREN are recursed into and its attributes are not, and the
|
|
475
|
+
// asymmetry is the difference between a claim that binds something and
|
|
476
|
+
// one that only hides a dependency. A child of a component element is
|
|
477
|
+
// built in THIS frame and handed over, so a slot inside it is an
|
|
478
|
+
// ordinary slot of this frame's own tree and binds normally. An
|
|
479
|
+
// attribute is not: nothing binds it, the outer thunk re-evaluates it
|
|
480
|
+
// whole -- and wrapping it in a thunk of its own would move the field
|
|
481
|
+
// read into a body the outer thunk merely CALLS, which
|
|
482
|
+
// `reactive-dependencies.ts` deliberately does not look through. The
|
|
483
|
+
// outer thunk would then subscribe to strictly fewer fields than it
|
|
484
|
+
// reads. `<LapRow value={s.lap1} active={s.lapCount >= 1}/>` is exactly
|
|
485
|
+
// that: `lapCount` would vanish from the row's dependency set.
|
|
486
|
+
if (ts.isJsxElement(node))
|
|
487
|
+
for (const child of node.children)
|
|
488
|
+
visit(child);
|
|
489
|
+
return;
|
|
490
|
+
}
|
|
491
|
+
if (ts.isJsxExpression(node) && node.expression && !node.dotDotDotToken) {
|
|
492
|
+
const parent = node.parent;
|
|
493
|
+
const positioned = ts.isJsxAttribute(parent) || ts.isJsxElement(parent) || ts.isJsxFragment(parent);
|
|
494
|
+
const expression = node.expression;
|
|
495
|
+
// An attribute's object literal is claimed one level down, member by
|
|
496
|
+
// member -- see the header. Written before the whole-expression test
|
|
497
|
+
// below, which `isHandlerLike` would otherwise decline it at.
|
|
498
|
+
if (positioned && ts.isJsxAttribute(parent) && ts.isObjectLiteralExpression(expression)) {
|
|
499
|
+
for (const property of expression.properties) {
|
|
500
|
+
const value = ts.isPropertyAssignment(property) ? property.initializer : null;
|
|
501
|
+
if (value && !isHandlerLike(value) && containsPropertyAccess(value))
|
|
502
|
+
claim(value, false);
|
|
503
|
+
else
|
|
504
|
+
visit(property);
|
|
505
|
+
}
|
|
506
|
+
return;
|
|
507
|
+
}
|
|
508
|
+
// A bare identifier naming a local `const`, claimed as what it stands
|
|
509
|
+
// for. Written before the whole-expression test below, which
|
|
510
|
+
// `isDirectOrConstant` declines every identifier at -- see
|
|
511
|
+
// `enclosingLocalConstInitializer` for why that reading is wrong here.
|
|
512
|
+
if (positioned) {
|
|
513
|
+
const inlined = localConstSlotText(file, expression);
|
|
514
|
+
if (inlined !== null) {
|
|
515
|
+
claim(expression, false, inlined);
|
|
516
|
+
return;
|
|
517
|
+
}
|
|
518
|
+
}
|
|
519
|
+
if (positioned &&
|
|
520
|
+
!isRefAttribute(node) &&
|
|
521
|
+
!isHandlerLike(expression) &&
|
|
522
|
+
!isDirectOrConstant(expression) &&
|
|
523
|
+
containsPropertyAccess(expression)) {
|
|
524
|
+
claim(expression, false);
|
|
525
|
+
// Recursed into anyway when it contains JSX of its own -- a list whose
|
|
526
|
+
// rows have their own reactive slots. See `claimedExpressionsOf`.
|
|
527
|
+
if (containsJsx(expression))
|
|
528
|
+
ts.forEachChild(expression, visit);
|
|
529
|
+
return;
|
|
530
|
+
}
|
|
531
|
+
}
|
|
532
|
+
ts.forEachChild(node, visit);
|
|
533
|
+
};
|
|
534
|
+
ts.forEachChild(file, visit);
|
|
535
|
+
return claimed;
|
|
536
|
+
};
|
|
537
|
+
/**
|
|
538
|
+
* The claimed ranges rewritten, innermost first, as one recursive rebuild.
|
|
539
|
+
*
|
|
540
|
+
* A flat splice cannot do this. `plugins/apple/jsx.ts` splices from the end of
|
|
541
|
+
* the file because its claims are disjoint, so every earlier range is still at
|
|
542
|
+
* the offset it was measured at. These claims NEST, and rewriting an outer
|
|
543
|
+
* range invalidates the offsets of every claim inside it -- so the text is
|
|
544
|
+
* rebuilt by walking the ranges in source order and recursing into whatever
|
|
545
|
+
* falls inside the one being written.
|
|
546
|
+
*/
|
|
547
|
+
const rewriteClaims = (text, claims, from, to, at) => {
|
|
548
|
+
let out = '';
|
|
549
|
+
let cursor = from;
|
|
550
|
+
let index = at;
|
|
551
|
+
while (index < claims.length && claims[index].start < to) {
|
|
552
|
+
const claim = claims[index];
|
|
553
|
+
out += text.slice(cursor, claim.start);
|
|
554
|
+
const inner = rewriteClaims(text, claims, claim.start, claim.end, index + 1);
|
|
555
|
+
// A local-`const` claim carries its own expression -- the initializer the
|
|
556
|
+
// identifier stands for -- and nothing else can be claimed inside an
|
|
557
|
+
// identifier, so `inner` is the identifier's own text and is discarded.
|
|
558
|
+
const thunk = `(() => (${claim.text ?? inner.text}))()`;
|
|
559
|
+
out += claim.braced ? `{${thunk}}` : thunk;
|
|
560
|
+
cursor = claim.end;
|
|
561
|
+
index = inner.next;
|
|
562
|
+
}
|
|
563
|
+
return { text: out + text.slice(cursor, to), next: index };
|
|
564
|
+
};
|
|
565
|
+
export const geaReactiveSlotTransform = ({ fileName, text }) => {
|
|
566
|
+
if (!fileName.endsWith('.tsx') && !fileName.endsWith('.jsx'))
|
|
567
|
+
return null;
|
|
568
|
+
if (!text.includes('<'))
|
|
569
|
+
return null;
|
|
570
|
+
const file = ts.createSourceFile(fileName, text, ts.ScriptTarget.Latest, true, ts.ScriptKind.TSX);
|
|
571
|
+
const claimed = claimedExpressionsOf(file);
|
|
572
|
+
if (claimed.length === 0)
|
|
573
|
+
return null;
|
|
574
|
+
// Source order, which for a nested pair is the enclosing claim first -- the
|
|
575
|
+
// order `rewriteClaims` walks in.
|
|
576
|
+
const claims = [...claimed].sort((left, right) => left.start - right.start || right.end - left.end);
|
|
577
|
+
return rewriteClaims(text, claims, 0, text.length, 0).text;
|
|
578
|
+
};
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { DeclarationId } from '../../identity/ids.js';
|
|
2
|
+
import type { SemanticOperation } from '../../semantics/model/operations.js';
|
|
3
|
+
import { type LoweringContext } from '../../ir/lower-operands.js';
|
|
4
|
+
import type { IrBlockId } from '../../ir/model.js';
|
|
5
|
+
/** Both halves, tried in the order they are read: a "get" first, the call that reads it second. */
|
|
6
|
+
export declare const lowerGeaRenderBridge: (ctx: LoweringContext, block: IrBlockId, operation: SemanticOperation, componentClasses: ReadonlySet<DeclarationId>) => boolean;
|