@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,693 @@
|
|
|
1
|
+
import { operationOfResult } from '../identity/ids.js';
|
|
2
|
+
import { carriesUndefined, representationKey } from '../representation/model.js';
|
|
3
|
+
import { operandOf } from '../semantics/model/operands.js';
|
|
4
|
+
import { IrLoweringBlockedError } from './lower-graph.js';
|
|
5
|
+
import { mergeIncoming } from './lower-narrow.js';
|
|
6
|
+
import { convertTo, namedOperand, reactiveFieldReadOf, recordLayoutOf, registerResult, requireLineage, requireResultRepresentation, resolveRequiredOperand } from './lower-operands.js';
|
|
7
|
+
/**
|
|
8
|
+
* Destructuring, lowered as the operations it actually is.
|
|
9
|
+
*
|
|
10
|
+
* An object pattern's element is a `[[Get]]` with a static key and nothing
|
|
11
|
+
* else: `const {a} = o` reads `o.a`, and there is no separate extraction step
|
|
12
|
+
* in the language for it to be. Lowering it as a `get` is what lets it share
|
|
13
|
+
* every property recipe, ownership rule, and carrier check an ordinary
|
|
14
|
+
* property read already goes through, instead of acquiring a second spine that
|
|
15
|
+
* would have to be kept in agreement with the first.
|
|
16
|
+
*
|
|
17
|
+
* An array pattern over a plain array source takes the same fast path a
|
|
18
|
+
* spread does: `const [a,b] = xs` reads `xs->elementAt(0)`/`xs->elementAt(1)`
|
|
19
|
+
* directly, and `const [head, ...tail] = xs` range-copies the remainder with
|
|
20
|
+
* `appendRange`, exactly as `lower-allocation.ts`'s spread handling does.
|
|
21
|
+
* `destructuring.ts`'s own semantic model never publishes a numeric index for
|
|
22
|
+
* an element, though -- each bound/elided step only cites the *shared*
|
|
23
|
+
* getIterator step's result as its `iterator` operand -- so the index has to
|
|
24
|
+
* be recovered by walking the `evaluation`-edge chain the census wires
|
|
25
|
+
* between them, which is what `arrayPatternIndexOf` does below. This is sound
|
|
26
|
+
* only because `orderOwnerOperations` (`lower-graph.ts`) already guarantees
|
|
27
|
+
* that chain is visited in the pattern's own written order.
|
|
28
|
+
*
|
|
29
|
+
* An array pattern over a *tuple* source (`record`/`native-record-ref` --
|
|
30
|
+
* `lower-allocation.ts`'s `lowerTupleLiteral` doc comment is the reason there
|
|
31
|
+
* is no separate tuple carrier: a tuple is a record whose keys are its
|
|
32
|
+
* positions) takes a second, sibling fast path: `const [a,b] = pair` reads
|
|
33
|
+
* `pair->gea_slot_0`/`pair->gea_slot_1`, an ordinary record field get keyed by
|
|
34
|
+
* the position's own string, exactly as an object pattern's `[[Get]]` already
|
|
35
|
+
* is. Neither fast path needs the iterator protocol -- a statically-typed
|
|
36
|
+
* tuple's shape is closed at compile time, so GetIterator/next() would answer
|
|
37
|
+
* a question a field lookup already answers directly.
|
|
38
|
+
*
|
|
39
|
+
* A `default-value` is a conditional evaluation whose guard is "the extracted
|
|
40
|
+
* value is `undefined`": the extraction step it is chained after is the guard,
|
|
41
|
+
* `gating.ts` puts the initializer in that guard's absent arm, and this merges
|
|
42
|
+
* the two. An object-pattern rest element over a genuinely dynamic source is
|
|
43
|
+
* still refused: `CopyDataProperties` over a key set computed at runtime has
|
|
44
|
+
* no IR primitive. Over a `record`/`native-record-ref` source, though, the key
|
|
45
|
+
* set is CLOSED -- TypeScript already resolved the rest binding's own type to
|
|
46
|
+
* `Omit<Source, K>` -- so `lowerObjectPatternRest` reads it back as an
|
|
47
|
+
* ordinary field-by-field copy, no different from an object literal's own
|
|
48
|
+
* allocation.
|
|
49
|
+
*/
|
|
50
|
+
const chainSuccessorOf = (graph, id) => {
|
|
51
|
+
for (const edge of graph.edges) {
|
|
52
|
+
if (edge.kind === 'evaluation' && edge.from === id)
|
|
53
|
+
return edge.to;
|
|
54
|
+
}
|
|
55
|
+
return null;
|
|
56
|
+
};
|
|
57
|
+
/**
|
|
58
|
+
* The zero-based position of an array-pattern element, recovered by walking
|
|
59
|
+
* the `evaluation` chain from the pattern's own shared getIterator step until
|
|
60
|
+
* `target` is reached. Throws rather than returning `-1` on a broken chain: a
|
|
61
|
+
* `target` this walk never reaches is the semantic graph and this lowering
|
|
62
|
+
* disagreeing about the pattern's own element order, which is a defect to
|
|
63
|
+
* surface, not a position to guess at.
|
|
64
|
+
*/
|
|
65
|
+
const arrayPatternIndexOf = (graph, iteratorRecord, target) => {
|
|
66
|
+
let current = operationOfResult(iteratorRecord);
|
|
67
|
+
let index = -1;
|
|
68
|
+
for (;;) {
|
|
69
|
+
const next = chainSuccessorOf(graph, current);
|
|
70
|
+
if (next === null) {
|
|
71
|
+
throw new IrLoweringBlockedError('an array-pattern element was not reachable by following the "evaluation" chain from its own shared getIterator step; ' +
|
|
72
|
+
"the semantic graph and this lowering disagree about the pattern's element order");
|
|
73
|
+
}
|
|
74
|
+
// Only THIS pattern's own element steps hold a position. A defaulted
|
|
75
|
+
// element's `default-value` step sits on the same evaluation chain right
|
|
76
|
+
// after its read, and counting it advanced every later position by one:
|
|
77
|
+
// `const [, a, b = 'B', c = 'C', d] = arr` read `c` from slot 4 and `d`
|
|
78
|
+
// from slot 6. An own element step is the one that names this pattern's
|
|
79
|
+
// iterator record as its "iterator" operand; a nested pattern's steps
|
|
80
|
+
// name their own.
|
|
81
|
+
const step = graph.operations.get(next);
|
|
82
|
+
const iterator = step ? operandOf(step, 'iterator') : undefined;
|
|
83
|
+
const own = iterator?.source.kind === 'result' && iterator.source.result === iteratorRecord;
|
|
84
|
+
if (own)
|
|
85
|
+
index += 1;
|
|
86
|
+
if (next === target) {
|
|
87
|
+
if (!own) {
|
|
88
|
+
throw new IrLoweringBlockedError("an array-pattern element step does not name its own pattern's iterator record; the semantic graph and this lowering disagree about the pattern's element order");
|
|
89
|
+
}
|
|
90
|
+
return index;
|
|
91
|
+
}
|
|
92
|
+
current = next;
|
|
93
|
+
}
|
|
94
|
+
};
|
|
95
|
+
const indexOfArrayPatternElement = (graph, iteratorOperand, target) => {
|
|
96
|
+
if (iteratorOperand.source.kind !== 'result') {
|
|
97
|
+
throw new IrLoweringBlockedError('an array-pattern element\'s own "iterator" operand names no prior result to trace back to its shared getIterator step');
|
|
98
|
+
}
|
|
99
|
+
return arrayPatternIndexOf(graph, iteratorOperand.source.result, target);
|
|
100
|
+
};
|
|
101
|
+
const lowerObjectPatternStep = (ctx, block, operation) => {
|
|
102
|
+
const lineage = requireLineage(operation);
|
|
103
|
+
const receiver = resolveRequiredOperand(ctx, block, lineage, namedOperand(operation, 'base'));
|
|
104
|
+
const keyOperand = namedOperand(operation, 'key');
|
|
105
|
+
const key = resolveRequiredOperand(ctx, block, lineage, keyOperand);
|
|
106
|
+
const representation = requireResultRepresentation(ctx, operation, 'value', 'an object destructuring step');
|
|
107
|
+
// `const { count } = this` reads a class field exactly as `this.count` does
|
|
108
|
+
// -- see `GetOperation.reactive` -- and this is the pattern's own `[[Get]]`,
|
|
109
|
+
// not a second read the property path already covered.
|
|
110
|
+
const reactive = keyOperand.source.kind === 'constant'
|
|
111
|
+
? reactiveFieldReadOf(ctx.program.classes, receiver.representation, keyOperand.source.text, ctx.program.reactiveFields)
|
|
112
|
+
: false;
|
|
113
|
+
registerResult(ctx, operation, ctx.builder.get(block, lineage, receiver, key, representation, undefined, reactive));
|
|
114
|
+
};
|
|
115
|
+
/** Whether a carrier is one of the two record shapes a tuple can be given -- see `lower-allocation.ts`'s `lowerTupleLiteral` for why there is no separate tuple carrier. */
|
|
116
|
+
const isTupleCarrier = (kind) => kind === 'record' || kind === 'native-record-ref';
|
|
117
|
+
/**
|
|
118
|
+
* Whether a source carries a `tagged-union` all of whose arms are themselves
|
|
119
|
+
* tuple carriers -- `[T, ParamIndexMap] | [T, Params]`, hono's own router
|
|
120
|
+
* match result, is exactly this: a fixed-arity 2-tuple in EVERY arm, differing
|
|
121
|
+
* only in one slot's own value type.
|
|
122
|
+
*
|
|
123
|
+
* A tuple's shape is closed and known at compile time, so reading its
|
|
124
|
+
* position never needed the iterator protocol (`lowerTuplePatternRead`'s own
|
|
125
|
+
* doc). That is equally true per arm here: every arm still has the SAME fixed
|
|
126
|
+
* arity at the SAME positions (a tagged union's arms are already required to
|
|
127
|
+
* share the discriminant read that told the two apart in the first place),
|
|
128
|
+
* so the shared source step still has nothing for GetIterator/next() to
|
|
129
|
+
* resolve -- it aliases straight to the base value, one union carrier
|
|
130
|
+
* instead of one record carrier, and each element step reads position `i`
|
|
131
|
+
* off whichever arm is live. `emit-union-properties.ts`'s `taggedUnionGetText`
|
|
132
|
+
* already renders exactly that per-arm dispatch for a STATIC field key -- the
|
|
133
|
+
* identical primitive an ordinary tuple's own `[[Get]]` reaches -- so nothing
|
|
134
|
+
* new is needed on the emit side, only the acceptance here that a tagged
|
|
135
|
+
* union of tuples is as closed-shape as a lone tuple is.
|
|
136
|
+
*/
|
|
137
|
+
const isTupleUnionCarrier = (representation) => representation.kind === 'tagged-union' && representation.arms.every((arm) => isTupleCarrier(arm.value.kind));
|
|
138
|
+
/** Whether a carrier is a source this pattern reads by SNAPSHOT rather than in place -- see `lowerArrayPatternSource`. */
|
|
139
|
+
const isSnapshotSource = (kind) => kind === 'string' || kind === 'keyed-collection' || kind === 'native-record-ref';
|
|
140
|
+
/**
|
|
141
|
+
* Whether a carrier is ALREADY the native cursor `gea::Iterator<E>` --
|
|
142
|
+
* `Generator<T>`'s own carrier (`representation/derive.ts`'s
|
|
143
|
+
* `GeneratorDeclarationPolicy`), reached either directly (`var [a] = g()`) or
|
|
144
|
+
* because the resolved `[Symbol.iterator]()` is itself a generator method
|
|
145
|
+
* (`producers/protocol.ts`'s `generatorRecordTypeOf`). `%GeneratorPrototype%
|
|
146
|
+
* [@@iterator]` returns `this` (ECMA-262 27.5.1.2), so the pattern's own
|
|
147
|
+
* "get iterator" step is an alias of the base value here too, exactly like the
|
|
148
|
+
* tuple/array-object fast paths above -- see `lowerArrayPatternSource`'s own
|
|
149
|
+
* widened guard and `lowerArrayPatternIteratorRead`/`lowerArrayPatternIteratorElision`
|
|
150
|
+
* below for the per-position reads this one cursor answers.
|
|
151
|
+
*/
|
|
152
|
+
const isCursorCarrier = (kind) => kind === 'iterator';
|
|
153
|
+
/**
|
|
154
|
+
* The pattern's own shared getIterator step.
|
|
155
|
+
*
|
|
156
|
+
* For a plain array and for a tuple this aliases straight to the base value:
|
|
157
|
+
* neither has a separate iterator record to materialize, and every element step
|
|
158
|
+
* reads the base in place, by index or by field.
|
|
159
|
+
*
|
|
160
|
+
* For a `Set<T>` or a `string` it materializes an ARRAY SNAPSHOT instead --
|
|
161
|
+
* the identical range copy `[...set]`/`[...str]` already build -- because the
|
|
162
|
+
* element steps read BY POSITION and neither source offers positional access.
|
|
163
|
+
* The snapshot is not this lowering's own idea: `representation/publish.ts`'s
|
|
164
|
+
* `patternSourceSnapshotOf` is what published the `array-object` carrier this
|
|
165
|
+
* step selected, so the plan and the IR state one answer, and that function's
|
|
166
|
+
* comment carries the ECMA-262 7.4 divergence the snapshot implies. Reaching
|
|
167
|
+
* here with a snapshot-shaped source whose declared carrier is NOT that array
|
|
168
|
+
* means the override declined it (a `Map`, a weak collection), and it is
|
|
169
|
+
* refused rather than materialized against a carrier nothing published.
|
|
170
|
+
*/
|
|
171
|
+
const lowerArrayPatternSource = (ctx, block, operation) => {
|
|
172
|
+
const lineage = requireLineage(operation);
|
|
173
|
+
let source = resolveRequiredOperand(ctx, block, lineage, namedOperand(operation, 'base'));
|
|
174
|
+
const declared = requireResultRepresentation(ctx, operation, 'iterator-record', 'an array binding pattern source');
|
|
175
|
+
// A position that may run past a plain array's own length, or fed by an
|
|
176
|
+
// enclosing pattern's own absent-capable element read, reaches here
|
|
177
|
+
// wrapped: `optional(...)`, and -- when the source's own element is itself
|
|
178
|
+
// a union like `number | number[]` -- a `tagged-union` around the payload
|
|
179
|
+
// `declared` resolved to (`representation/publish.ts`'s `patternSourceArmOf`
|
|
180
|
+
// is what resolved `declared` to that payload rather than the wrapper).
|
|
181
|
+
// Both are real runtime facts ECMA-262 7.4.2's `GetIterator` throws over --
|
|
182
|
+
// absence, and a union's non-iterable arm -- so both checks run, in
|
|
183
|
+
// whichever order the value wraps them, before the positional fast path
|
|
184
|
+
// below ever reads a position.
|
|
185
|
+
if (source.representation.kind === 'optional') {
|
|
186
|
+
const payload = source.representation.payload;
|
|
187
|
+
const value = ctx.builder.compute(block, lineage, 'require-iterable-present', 'RequireIterablePresent', [source], payload);
|
|
188
|
+
source = { value, representation: payload };
|
|
189
|
+
}
|
|
190
|
+
if (source.representation.kind === 'tagged-union' && declared.kind !== 'tagged-union') {
|
|
191
|
+
const armIndex = source.representation.arms.findIndex((arm) => representationKey(arm.value) === representationKey(declared));
|
|
192
|
+
if (armIndex < 0) {
|
|
193
|
+
throw new IrLoweringBlockedError(`an array binding pattern's source resolved to a tagged union none of whose arms carry the declared ` +
|
|
194
|
+
`"${representationKey(declared)}" iterator-record shape`);
|
|
195
|
+
}
|
|
196
|
+
const value = ctx.builder.compute(block, lineage, 'require-tagged-union-arm', String(armIndex), [source], declared);
|
|
197
|
+
source = { value, representation: declared };
|
|
198
|
+
}
|
|
199
|
+
if (isSnapshotSource(source.representation.kind) && declared.kind === 'array-object') {
|
|
200
|
+
registerResult(ctx, operation, ctx.builder.allocateArrayObject(block, lineage, [{ kind: 'spread', value: source, from: 0 }], declared));
|
|
201
|
+
return;
|
|
202
|
+
}
|
|
203
|
+
// The true arm of `Array.isArray(dynamicValue)` remains a `gea::Value`, not
|
|
204
|
+
// an `ArrayObject<Value>` projection. The dynamic carrier is the original
|
|
205
|
+
// object identity and its runtime metadata already records the Array exotic
|
|
206
|
+
// operations. Acquire the iterator through the generic protocol so a
|
|
207
|
+
// custom @@iterator is still observed; the runtime falls back to the
|
|
208
|
+
// native Array iterator only when that property is absent. A typed array
|
|
209
|
+
// never reaches this branch: its carrier is `array-object` above.
|
|
210
|
+
if (source.representation.kind === 'dynamic' && declared.kind === 'dynamic') {
|
|
211
|
+
registerResult(ctx, operation, ctx.builder.getIterator(block, lineage, 'iterator', source, null, declared));
|
|
212
|
+
return;
|
|
213
|
+
}
|
|
214
|
+
// A boxed value the program asserts to a tuple or array type
|
|
215
|
+
// (`(res as any)[cacheKey] as InternalCache`) is read out of its box into
|
|
216
|
+
// that carrier first, by the conversion census's own checked load.
|
|
217
|
+
if (source.representation.kind === 'dynamic' &&
|
|
218
|
+
(declared.kind === 'array-object' || isTupleCarrier(declared.kind) || isTupleUnionCarrier(declared))) {
|
|
219
|
+
const unboxed = convertTo(ctx, block, lineage, source, declared, 'array-pattern-source');
|
|
220
|
+
if (unboxed !== null)
|
|
221
|
+
source = unboxed;
|
|
222
|
+
}
|
|
223
|
+
if (source.representation.kind !== 'array-object' &&
|
|
224
|
+
!isTupleCarrier(source.representation.kind) &&
|
|
225
|
+
!isTupleUnionCarrier(source.representation) &&
|
|
226
|
+
!isCursorCarrier(source.representation.kind)) {
|
|
227
|
+
throw new IrLoweringBlockedError(`an array binding pattern's own source carries a "${source.representation.kind}" carrier; the array fast path only reads ` +
|
|
228
|
+
'an "array-object" source by index, the tuple fast path only reads a "record"/"native-record-ref" source by position, a ' +
|
|
229
|
+
'tagged-union-of-tuples source reads the same way per live arm, the Set/string snapshot path only covers a source whose ' +
|
|
230
|
+
'own step published an "array-object", and the native cursor path only covers a source that is ALREADY a "Generator<T>" -- ' +
|
|
231
|
+
'a general iterable needs the fully dynamic iterator protocol, which is not installed');
|
|
232
|
+
}
|
|
233
|
+
if (representationKey(declared) !== representationKey(source.representation)) {
|
|
234
|
+
throw new IrLoweringBlockedError(`an array binding pattern's source resolved to "${representationKey(source.representation)}", but its own iterator-record result ` +
|
|
235
|
+
`selected "${representationKey(declared)}" -- the two must agree for the fast path's per-element index reads to be sound`);
|
|
236
|
+
}
|
|
237
|
+
registerResult(ctx, operation, source.value);
|
|
238
|
+
};
|
|
239
|
+
/**
|
|
240
|
+
* `const [a, b] = pair` over a tuple source: a record field get keyed by the
|
|
241
|
+
* position's own string, the same field `lowerTupleLiteral` wrote it under.
|
|
242
|
+
* Never the iterator protocol -- a tuple's shape is closed and known at
|
|
243
|
+
* compile time, so there is nothing for GetIterator/next() to resolve that
|
|
244
|
+
* this field lookup does not already answer directly.
|
|
245
|
+
*/
|
|
246
|
+
const lowerTuplePatternRead = (ctx, block, lineage, operation, source, index) => {
|
|
247
|
+
const layout = recordLayoutOf(ctx, source.representation);
|
|
248
|
+
if (!layout) {
|
|
249
|
+
throw new IrLoweringBlockedError(`an array-pattern element reads a "${representationKey(source.representation)}" source, which states no record layout to read position ${index} from`);
|
|
250
|
+
}
|
|
251
|
+
const field = layout[index];
|
|
252
|
+
if (!field || field.key !== String(index)) {
|
|
253
|
+
throw new IrLoweringBlockedError(`an array-pattern element reads position ${index} of a "${representationKey(source.representation)}" tuple, whose record layout has no field keyed "${index}"`);
|
|
254
|
+
}
|
|
255
|
+
const representation = requireResultRepresentation(ctx, operation, 'value', 'an array-pattern element');
|
|
256
|
+
if (representationKey(representation) !== representationKey(field.value)) {
|
|
257
|
+
throw new IrLoweringBlockedError(`an array-pattern element's own carrier ("${representationKey(representation)}") does not match its tuple source's field ${index} carrier ` +
|
|
258
|
+
`("${representationKey(field.value)}")`);
|
|
259
|
+
}
|
|
260
|
+
const key = {
|
|
261
|
+
value: ctx.builder.constant(block, lineage, String(index), 'string', { kind: 'string' }),
|
|
262
|
+
representation: { kind: 'string' }
|
|
263
|
+
};
|
|
264
|
+
registerResult(ctx, operation, ctx.builder.get(block, lineage, source, key, representation));
|
|
265
|
+
};
|
|
266
|
+
/**
|
|
267
|
+
* `const [a, b] = pair` over a `tagged-union` source whose every arm is a
|
|
268
|
+
* tuple -- the union-of-arms mirror of `lowerTuplePatternRead` immediately
|
|
269
|
+
* above, sharing its own reasoning: position `index` is closed and known at
|
|
270
|
+
* compile time in EVERY arm, so there is nothing for GetIterator/next() to
|
|
271
|
+
* resolve here either.
|
|
272
|
+
*
|
|
273
|
+
* The difference from a lone tuple is the per-arm check: every arm's own
|
|
274
|
+
* record layout must have a field at `index`, and (deliberately as strict as
|
|
275
|
+
* `lowerTuplePatternRead`'s own single-source check, rather than reaching for
|
|
276
|
+
* the C++ backend's `narrowedLoadText` widening) that field's carrier must be
|
|
277
|
+
* the EXACT one this element publishes -- a mismatched arm is refused by name
|
|
278
|
+
* rather than silently routed through a reconciliation this IR layer has no
|
|
279
|
+
* business performing; `emit-union-properties.ts`'s `taggedUnionGetText`
|
|
280
|
+
* still reconciles per arm at emission time for the union's OWN published
|
|
281
|
+
* result, this only has to agree that every arm's raw field is the same
|
|
282
|
+
* shape to begin with.
|
|
283
|
+
*/
|
|
284
|
+
const lowerTaggedUnionTuplePatternRead = (ctx, block, lineage, operation, source, index) => {
|
|
285
|
+
const receiver = source.representation;
|
|
286
|
+
if (receiver.kind !== 'tagged-union') {
|
|
287
|
+
throw new IrLoweringBlockedError('an array-pattern element expected a "tagged-union" source to read a tuple-union position from');
|
|
288
|
+
}
|
|
289
|
+
const representation = requireResultRepresentation(ctx, operation, 'value', 'an array-pattern element');
|
|
290
|
+
for (const arm of receiver.arms) {
|
|
291
|
+
const layout = recordLayoutOf(ctx, arm.value);
|
|
292
|
+
if (!layout) {
|
|
293
|
+
throw new IrLoweringBlockedError(`an array-pattern element reads position ${index} of a tagged union whose arm is carried as "${representationKey(arm.value)}", which ` +
|
|
294
|
+
'states no record layout to read that position from');
|
|
295
|
+
}
|
|
296
|
+
const field = layout[index];
|
|
297
|
+
if (!field || field.key !== String(index)) {
|
|
298
|
+
throw new IrLoweringBlockedError(`an array-pattern element reads position ${index} of a tagged union whose arm "${representationKey(arm.value)}" has no field keyed "${index}"`);
|
|
299
|
+
}
|
|
300
|
+
if (representationKey(field.value) !== representationKey(representation)) {
|
|
301
|
+
throw new IrLoweringBlockedError(`an array-pattern element's own carrier ("${representationKey(representation)}") does not match position ${index} of tagged-union ` +
|
|
302
|
+
`arm "${representationKey(arm.value)}", carried as "${representationKey(field.value)}" -- not every arm of this union answers this ` +
|
|
303
|
+
'position with the same carrier, which is a narrowing the source program should have stated');
|
|
304
|
+
}
|
|
305
|
+
}
|
|
306
|
+
const key = {
|
|
307
|
+
value: ctx.builder.constant(block, lineage, String(index), 'string', { kind: 'string' }),
|
|
308
|
+
representation: { kind: 'string' }
|
|
309
|
+
};
|
|
310
|
+
registerResult(ctx, operation, ctx.builder.get(block, lineage, source, key, representation));
|
|
311
|
+
};
|
|
312
|
+
const lowerArrayPatternRead = (ctx, block, operation) => {
|
|
313
|
+
const lineage = requireLineage(operation);
|
|
314
|
+
const iteratorOperand = namedOperand(operation, 'iterator');
|
|
315
|
+
const source = resolveRequiredOperand(ctx, block, lineage, iteratorOperand);
|
|
316
|
+
const index = indexOfArrayPatternElement(ctx.graph, iteratorOperand, operation.id);
|
|
317
|
+
if (isTupleCarrier(source.representation.kind)) {
|
|
318
|
+
lowerTuplePatternRead(ctx, block, lineage, operation, source, index);
|
|
319
|
+
return;
|
|
320
|
+
}
|
|
321
|
+
if (isTupleUnionCarrier(source.representation)) {
|
|
322
|
+
lowerTaggedUnionTuplePatternRead(ctx, block, lineage, operation, source, index);
|
|
323
|
+
return;
|
|
324
|
+
}
|
|
325
|
+
if (source.representation.kind === 'dynamic') {
|
|
326
|
+
const representation = requireResultRepresentation(ctx, operation, 'value', 'an array-pattern element');
|
|
327
|
+
registerResult(ctx, operation, ctx.builder.iteratorNext(block, lineage, source, null, representation));
|
|
328
|
+
return;
|
|
329
|
+
}
|
|
330
|
+
if (source.representation.kind !== 'array-object') {
|
|
331
|
+
throw new IrLoweringBlockedError(`an array-pattern element reads a "${source.representation.kind}" source; the array/string fast path only reads an "array-object" ` +
|
|
332
|
+
'source by index, and the tuple fast path only reads a "record"/"native-record-ref" source by position');
|
|
333
|
+
}
|
|
334
|
+
const representation = requireResultRepresentation(ctx, operation, 'value', 'an array-pattern element');
|
|
335
|
+
// A position the producer typed `undefined` outright lies past every
|
|
336
|
+
// element the source can hold (`[x, y] = []`, a tuple shorter than the
|
|
337
|
+
// pattern): the language's step yields `undefined` there and, over a plain
|
|
338
|
+
// array, observes nothing -- so nothing is read.
|
|
339
|
+
if (representation.kind === 'undefined') {
|
|
340
|
+
registerResult(ctx, operation, ctx.builder.constant(block, lineage, 'undefined', 'undefined', representation));
|
|
341
|
+
return;
|
|
342
|
+
}
|
|
343
|
+
// An array whose ELEMENT is uninhabited (`[]` typed `never[]`, carried as
|
|
344
|
+
// `array-object(undefined)`) holds nothing at any position, so a read
|
|
345
|
+
// published with an absence is that absence, constant -- there is no
|
|
346
|
+
// element carrier to bounds-test a read of.
|
|
347
|
+
const sourceElement = source.representation.element;
|
|
348
|
+
if ((sourceElement.kind === 'undefined' || sourceElement.kind === 'void') &&
|
|
349
|
+
representation.kind === 'optional' &&
|
|
350
|
+
representation.absence === 'undefined') {
|
|
351
|
+
registerResult(ctx, operation, ctx.builder.constant(block, lineage, 'undefined', 'undefined', representation));
|
|
352
|
+
return;
|
|
353
|
+
}
|
|
354
|
+
// The step reads the element WITH its absence -- `optional(E, undefined)`
|
|
355
|
+
// over an array of `E` -- because the pattern may run past the array's
|
|
356
|
+
// length; `emit-carrier-members.ts`'s `absentCapableElementText` is the
|
|
357
|
+
// bounds-tested read that answers exactly that carrier for an indexed get.
|
|
358
|
+
// ... or, for an element that already carries `null`, the same read spelled
|
|
359
|
+
// as the tagged union `undefined | null | E`: an `Optional` of an `Optional`
|
|
360
|
+
// has no primitive (`representation/optional.ts`), so `(number | null)[]`
|
|
361
|
+
// read past its end publishes the three-armed union, and the emitter widens
|
|
362
|
+
// the present element into it (`presentElementText`).
|
|
363
|
+
const absentCapable = (representation.kind === 'optional' &&
|
|
364
|
+
representation.absence === 'undefined' &&
|
|
365
|
+
representationKey(representation.payload) === representationKey(source.representation.element)) ||
|
|
366
|
+
isElementPlusUndefined(representation, source.representation.element);
|
|
367
|
+
if (!absentCapable && representationKey(representation) !== representationKey(source.representation.element)) {
|
|
368
|
+
throw new IrLoweringBlockedError(`an array-pattern element's own carrier ("${representationKey(representation)}") does not match its source's element carrier ` +
|
|
369
|
+
`("${representationKey(source.representation.element)}")`);
|
|
370
|
+
}
|
|
371
|
+
const key = {
|
|
372
|
+
value: ctx.builder.constant(block, lineage, String(index), 'number', { kind: 'scalar', domain: 'number' }),
|
|
373
|
+
representation: { kind: 'scalar', domain: 'number' }
|
|
374
|
+
};
|
|
375
|
+
registerResult(ctx, operation, ctx.builder.get(block, lineage, source, key, representation));
|
|
376
|
+
};
|
|
377
|
+
const lowerArrayPatternRest = (ctx, block, operation) => {
|
|
378
|
+
const lineage = requireLineage(operation);
|
|
379
|
+
const iteratorOperand = namedOperand(operation, 'iterator');
|
|
380
|
+
const source = resolveRequiredOperand(ctx, block, lineage, iteratorOperand);
|
|
381
|
+
const representation = requireResultRepresentation(ctx, operation, 'value', 'an array-pattern rest element');
|
|
382
|
+
// A dynamic pattern source has already performed GetIterator once in its
|
|
383
|
+
// shared source step. Gather the remaining values from that record; do not
|
|
384
|
+
// restart from the original value, which would rerun @@iterator and include
|
|
385
|
+
// positions the pattern already consumed.
|
|
386
|
+
if (source.representation.kind === 'dynamic') {
|
|
387
|
+
// Two destinations admit a native gather: an explicit "array of dynamic"
|
|
388
|
+
// carrier, or the destination cell being `dynamic` itself -- `const [a,
|
|
389
|
+
// ...rest] = anyIterable` types `rest` as a boxed `any[]`, exactly the
|
|
390
|
+
// shape `allocation:array-literal:dynamic(dynamic-gather)` already
|
|
391
|
+
// allocates for an array LITERAL's `[...anyIterable]` spread
|
|
392
|
+
// (`lower-allocation.ts`, `emitAllocateArrayObject`'s `representation.kind
|
|
393
|
+
// === 'dynamic'` branch). `reason` records only WHY a cell is dynamic
|
|
394
|
+
// (`opt-in-fallback` for the literal path, ordinarily
|
|
395
|
+
// `declared-any-never-narrowed` for a rest binding never subsequently
|
|
396
|
+
// narrowed) -- it names no different runtime representation, so gating
|
|
397
|
+
// this capability on one specific reason was the identical carrier
|
|
398
|
+
// refusing itself over a label that carries no consequence for how
|
|
399
|
+
// `gea::Value::box` stores the result.
|
|
400
|
+
const dynamicDestination = representation.kind === 'dynamic';
|
|
401
|
+
if (!dynamicDestination && (representation.kind !== 'array-object' || representation.element.kind !== 'dynamic')) {
|
|
402
|
+
throw new IrLoweringBlockedError(`an array-pattern rest gathers dynamic iterator values into a "${representation.kind === 'array-object' ? representationKey(representation.element) : representation.kind}" carrier; ` +
|
|
403
|
+
'per-element dynamic conversion is not installed');
|
|
404
|
+
}
|
|
405
|
+
registerResult(ctx, operation, ctx.builder.allocateArrayObject(block, lineage, [{ kind: 'gather', iterator: source }], representation));
|
|
406
|
+
return;
|
|
407
|
+
}
|
|
408
|
+
if (source.representation.kind !== 'array-object') {
|
|
409
|
+
throw new IrLoweringBlockedError(`an array-pattern rest element reads a "${source.representation.kind}" source; the array/string fast path only range-copies an "array-object" source`);
|
|
410
|
+
}
|
|
411
|
+
if (representation.kind !== 'array-object' ||
|
|
412
|
+
representationKey(representation.element) !== representationKey(source.representation.element)) {
|
|
413
|
+
throw new IrLoweringBlockedError("an array-pattern rest element's own carrier does not match its source's element carrier; a mismatch would need a per-element " +
|
|
414
|
+
'conversion into the destination carrier, which the shared range-copy primitive does not perform');
|
|
415
|
+
}
|
|
416
|
+
const index = indexOfArrayPatternElement(ctx.graph, iteratorOperand, operation.id);
|
|
417
|
+
registerResult(ctx, operation, ctx.builder.allocateArrayObject(block, lineage, [{ kind: 'spread', value: source, from: index }], representation));
|
|
418
|
+
};
|
|
419
|
+
/**
|
|
420
|
+
* `const { strict, ...rest } = options` over a source whose shape is CLOSED
|
|
421
|
+
* and known at compile time (`record`/`native-record-ref`) -- never the
|
|
422
|
+
* general "{...rest}" case (`CopyDataProperties` over a key set computed at
|
|
423
|
+
* runtime, still refused above): TypeScript already resolved the rest
|
|
424
|
+
* binding's own type to `Omit<Source, K>`, one field short of the source, so
|
|
425
|
+
* the field set to copy is not runtime state this lowering has to discover --
|
|
426
|
+
* it is the rest binding's own required representation, read back the same
|
|
427
|
+
* way `lowerTuplePatternRead`'s field lookup already is. Each remaining field
|
|
428
|
+
* is an ordinary keyed `[[Get]]` off the source (`ctx.builder.get`, the same
|
|
429
|
+
* primitive an object-pattern element read uses), assembled into a fresh
|
|
430
|
+
* record with `allocateRecord` -- the identical primitive an object literal's
|
|
431
|
+
* own allocation uses. No CopyDataProperties, no runtime key enumeration: the
|
|
432
|
+
* key set is closed, so there is nothing dynamic left to perform.
|
|
433
|
+
*/
|
|
434
|
+
const lowerObjectPatternRest = (ctx, block, operation) => {
|
|
435
|
+
const lineage = requireLineage(operation);
|
|
436
|
+
const source = resolveRequiredOperand(ctx, block, lineage, namedOperand(operation, 'base'));
|
|
437
|
+
const representation = requireResultRepresentation(ctx, operation, 'value', 'an object-pattern rest element');
|
|
438
|
+
// CopyDataProperties over an open dictionary is a runtime key walk. Reuse
|
|
439
|
+
// object spread's exact dictionary copy primitive, then delete the excluded
|
|
440
|
+
// keys from the new table. Dictionary entries are data properties, so this
|
|
441
|
+
// produces the same key order and values as skipping those keys during the
|
|
442
|
+
// copy, while keeping the source untouched.
|
|
443
|
+
if (source.representation.kind === 'dictionary' && representation.kind === 'dictionary') {
|
|
444
|
+
const value = ctx.builder.allocateRecord(block, lineage, [], representation);
|
|
445
|
+
const target = { value, representation };
|
|
446
|
+
ctx.builder.spreadCopy(block, lineage, target, source);
|
|
447
|
+
const excluded = operation.operands
|
|
448
|
+
.filter((operand) => operand.role === 'excluded-key')
|
|
449
|
+
.sort((left, right) => left.ordinal - right.ordinal);
|
|
450
|
+
for (const operand of excluded) {
|
|
451
|
+
const key = resolveRequiredOperand(ctx, block, lineage, operand);
|
|
452
|
+
// Object-rest's internal CopyDataProperties exclusion is not source
|
|
453
|
+
// `delete` syntax, so its successful bookkeeping erase has no strict
|
|
454
|
+
// Reference Record to propagate.
|
|
455
|
+
ctx.builder.delete(block, lineage, target, key, false, null);
|
|
456
|
+
}
|
|
457
|
+
registerResult(ctx, operation, value);
|
|
458
|
+
return;
|
|
459
|
+
}
|
|
460
|
+
const sourceLayout = recordLayoutOf(ctx, source.representation);
|
|
461
|
+
if (!sourceLayout) {
|
|
462
|
+
throw new IrLoweringBlockedError(`an object-pattern rest element reads a "${representationKey(source.representation)}" source, which states no record layout to copy fields from`);
|
|
463
|
+
}
|
|
464
|
+
const targetLayout = recordLayoutOf(ctx, representation);
|
|
465
|
+
if (!targetLayout) {
|
|
466
|
+
throw new IrLoweringBlockedError(`an object-pattern rest element's own carrier "${representationKey(representation)}" states no record layout to build`);
|
|
467
|
+
}
|
|
468
|
+
const fields = targetLayout.map((field) => {
|
|
469
|
+
const sourceField = sourceLayout.find((candidate) => candidate.key === field.key);
|
|
470
|
+
if (!sourceField || representationKey(sourceField.value) !== representationKey(field.value)) {
|
|
471
|
+
throw new IrLoweringBlockedError(`an object-pattern rest element's own field "${field.key}" has no matching field in its source's record layout, or the two ` +
|
|
472
|
+
'carry different carriers -- a mismatch would need a per-field conversion this fast path does not perform');
|
|
473
|
+
}
|
|
474
|
+
const key = {
|
|
475
|
+
value: ctx.builder.constant(block, lineage, field.key, 'string', { kind: 'string' }),
|
|
476
|
+
representation: { kind: 'string' }
|
|
477
|
+
};
|
|
478
|
+
return { key: field.key, value: { value: ctx.builder.get(block, lineage, source, key, field.value), representation: field.value } };
|
|
479
|
+
});
|
|
480
|
+
registerResult(ctx, operation, ctx.builder.allocateRecord(block, lineage, fields, representation));
|
|
481
|
+
};
|
|
482
|
+
/**
|
|
483
|
+
* `const [a] = g()`'s own per-element read over a source already resolved to
|
|
484
|
+
* the native `gea::Iterator<E>` cursor -- see `isCursorCarrier`'s own doc for
|
|
485
|
+
* why `lowerArrayPatternSource` aliases such a source rather than building an
|
|
486
|
+
* iterator record for it. Each bound position advances that ONE shared
|
|
487
|
+
* cursor with `arrayNext()`, the identical primitive a `for`-`of` over the
|
|
488
|
+
* same generator already lowers through (`ir/lower-protocol.ts`'s `next`
|
|
489
|
+
* case) -- called once per POSITION here instead of once per loop iteration,
|
|
490
|
+
* which is sound because `orderOwnerOperations` (`lower-graph.ts`) already
|
|
491
|
+
* guarantees the pattern's elements are visited in their own written order,
|
|
492
|
+
* exactly the guarantee `arrayPatternIndexOf`'s own doc relies on above.
|
|
493
|
+
*
|
|
494
|
+
* A position this producer's own typing proves PRESENT reads the bare element
|
|
495
|
+
* carrier; a position the cursor may already be exhausted at
|
|
496
|
+
* (`extractedArrayTypeOf`, producers/destructuring.ts) reads an `optional`
|
|
497
|
+
* one instead, and the carrier check below accepts either -- the merge itself
|
|
498
|
+
* (the done-check and the phi to `undefined`) is not built here: `iteratorNext`
|
|
499
|
+
* mints one IR op regardless of which carrier it is asked for, and
|
|
500
|
+
* `emit-iterator.ts`'s own `next` case is what renders the done-check and
|
|
501
|
+
* wraps the read into the requested carrier. A carrier that is neither the
|
|
502
|
+
* exact element nor an absence-capable widening of it is refused by name
|
|
503
|
+
* rather than approximated, the same fail-closed posture `lowerDefaultValueStep`'s
|
|
504
|
+
* own guard check takes for the identical reason.
|
|
505
|
+
*/
|
|
506
|
+
const lowerArrayPatternIteratorRead = (ctx, block, operation) => {
|
|
507
|
+
const lineage = requireLineage(operation);
|
|
508
|
+
const iteratorOperand = namedOperand(operation, 'iterator');
|
|
509
|
+
const iterator = resolveRequiredOperand(ctx, block, lineage, iteratorOperand);
|
|
510
|
+
if (iterator.representation.kind !== 'iterator') {
|
|
511
|
+
throw new IrLoweringBlockedError(`an array-pattern element's own cursor read expected an "iterator" source, but resolved a "${iterator.representation.kind}" one`);
|
|
512
|
+
}
|
|
513
|
+
const representation = requireResultRepresentation(ctx, operation, 'value', 'an array-pattern element');
|
|
514
|
+
// The read is the element itself where the typing proved the position
|
|
515
|
+
// present, and the element-or-absence where it did not: a cursor that is
|
|
516
|
+
// exhausted before this position hands the pattern `undefined` (ECMA-262
|
|
517
|
+
// 8.6.2, IteratorStep returning done), which the `next` step spells as the
|
|
518
|
+
// absence of the result's own carrier (`emit-iterator.ts`).
|
|
519
|
+
if (representationKey(representation) !== representationKey(iterator.representation.element) && !carriesUndefined(representation)) {
|
|
520
|
+
throw new IrLoweringBlockedError(`an array-pattern element's own carrier ("${representationKey(representation)}") does not match its cursor source's element ` +
|
|
521
|
+
`carrier ("${representationKey(iterator.representation.element)}") and holds no absence for an exhausted cursor`);
|
|
522
|
+
}
|
|
523
|
+
registerResult(ctx, operation, ctx.builder.iteratorNext(block, lineage, iterator, null, representation));
|
|
524
|
+
};
|
|
525
|
+
const lowerArrayPatternStep = (ctx, block, operation) => {
|
|
526
|
+
const role = operation.results[0]?.role;
|
|
527
|
+
if (role === 'iterator-record') {
|
|
528
|
+
lowerArrayPatternSource(ctx, block, operation);
|
|
529
|
+
return;
|
|
530
|
+
}
|
|
531
|
+
if (role === undefined) {
|
|
532
|
+
// An elision binds nothing, but over a cursor it still STEPS: ECMA-262
|
|
533
|
+
// 8.6.2 IteratorDestructuringAssignmentEvaluation's `Elision` rule calls
|
|
534
|
+
// `IteratorStep` and discards the result, so `[,] = g()` resumes the
|
|
535
|
+
// generator once -- and a generator that throws on its first resume
|
|
536
|
+
// throws out of the pattern. An array or tuple source reads by position
|
|
537
|
+
// and has nothing to do for a skipped one.
|
|
538
|
+
const elided = operandOf(operation, 'iterator');
|
|
539
|
+
if (!elided || elided.source.kind !== 'result')
|
|
540
|
+
return;
|
|
541
|
+
const lineage = elided.source.result;
|
|
542
|
+
const cursor = resolveRequiredOperand(ctx, block, lineage, elided);
|
|
543
|
+
if (cursor.representation.kind === 'iterator')
|
|
544
|
+
ctx.builder.iteratorNext(block, lineage, cursor, null, cursor.representation.element);
|
|
545
|
+
// A dynamic pattern cursor is the same stateful iterator record as a
|
|
546
|
+
// dynamic for-of cursor. An elision still performs IteratorStep; omitting
|
|
547
|
+
// it would make `[ , value ] = dynamic` read the first item for `value`.
|
|
548
|
+
if (cursor.representation.kind === 'dynamic')
|
|
549
|
+
ctx.builder.iteratorNext(block, lineage, cursor, null, { kind: 'dynamic', reason: 'declared-any-never-narrowed' });
|
|
550
|
+
return;
|
|
551
|
+
}
|
|
552
|
+
const iteratorOperand = operandOf(operation, 'iterator');
|
|
553
|
+
if (iteratorOperand) {
|
|
554
|
+
const lineage = requireLineage(operation);
|
|
555
|
+
const iterator = resolveRequiredOperand(ctx, block, lineage, iteratorOperand);
|
|
556
|
+
if (iterator.representation.kind === 'iterator') {
|
|
557
|
+
lowerArrayPatternIteratorRead(ctx, block, operation);
|
|
558
|
+
return;
|
|
559
|
+
}
|
|
560
|
+
if (iterator.representation.kind === 'dynamic') {
|
|
561
|
+
lowerArrayPatternRead(ctx, block, operation);
|
|
562
|
+
return;
|
|
563
|
+
}
|
|
564
|
+
}
|
|
565
|
+
lowerArrayPatternRead(ctx, block, operation);
|
|
566
|
+
};
|
|
567
|
+
/**
|
|
568
|
+
* A `default-value` step: a merge over a presence guard.
|
|
569
|
+
*
|
|
570
|
+
* The extracted value on the branch where it was proven present, the
|
|
571
|
+
* initializer's own value on the branch where it was `undefined`. The guard has
|
|
572
|
+
* to already exist -- `flow.requireMergeSources` only closes branches
|
|
573
|
+
* `lower-flow.ts`'s `ensureGuardBlocks` opened, which happens only for a result
|
|
574
|
+
* some other pass already gated -- so this is scoped to the one producer that
|
|
575
|
+
* installs one today: a defaulted parameter's raw argument
|
|
576
|
+
* (`semantics/normalize/producers/bindings.ts`'s `contributeDefaultedParameter`).
|
|
577
|
+
* An object or array pattern's own default (`{a = 1}`) has no such guard and is
|
|
578
|
+
* refused by name rather than approximated.
|
|
579
|
+
*/
|
|
580
|
+
/** The arms a carrier holds, by key: a tagged union's own, an optional's absence and payload, else the carrier itself. */
|
|
581
|
+
const armKeysOf = (representation) => representation.kind === 'tagged-union'
|
|
582
|
+
? representation.arms.map((arm) => representationKey(arm.value))
|
|
583
|
+
: representation.kind === 'optional'
|
|
584
|
+
? [representation.absence, representationKey(representation.payload)]
|
|
585
|
+
: [representationKey(representation)];
|
|
586
|
+
const isElementPlusUndefined = (read, element) => {
|
|
587
|
+
if (read.kind !== 'tagged-union' || !carriesUndefined(read))
|
|
588
|
+
return false;
|
|
589
|
+
const present = armKeysOf(read).filter((key) => key !== 'undefined');
|
|
590
|
+
const held = armKeysOf(element);
|
|
591
|
+
return present.length === held.length && held.every((key) => present.includes(key));
|
|
592
|
+
};
|
|
593
|
+
const lowerDefaultValueStep = (ctx, flow, operation) => {
|
|
594
|
+
const lineage = requireLineage(operation);
|
|
595
|
+
const extracted = namedOperand(operation, 'extracted');
|
|
596
|
+
if (extracted.source.kind !== 'result') {
|
|
597
|
+
throw new IrLoweringBlockedError('a "default-value" destructuring step has no guard result to branch on');
|
|
598
|
+
}
|
|
599
|
+
const guardResult = extracted.source.result;
|
|
600
|
+
const guardOperation = ctx.graph.operations.get(operationOfResult(guardResult));
|
|
601
|
+
// Two producers install a presence-tested guard for their own extraction, and
|
|
602
|
+
// the merge below is the same merge over either. A defaulted PARAMETER tests
|
|
603
|
+
// its raw argument (`reference`/`parameter-value`); a defaulted binding
|
|
604
|
+
// ELEMENT tests what the pattern read out of the source, which is the
|
|
605
|
+
// extraction step this one is chained after. Anything else has no guard, so
|
|
606
|
+
// the arms this merge needs were never opened, and refusing by name is what
|
|
607
|
+
// keeps that from being approximated into a fallback that always runs.
|
|
608
|
+
// An array-pattern step is absence-capable too: its producer types the read
|
|
609
|
+
// `E | undefined` for any source that can be exhausted before the position
|
|
610
|
+
// (`extractedArrayTypeOf`), and the carrier test below is what proves it.
|
|
611
|
+
const extractsFromPattern = guardOperation?.family === 'destructuring' && (guardOperation.form === 'object-pattern' || guardOperation.form === 'array-pattern');
|
|
612
|
+
const bindsAParameter = guardOperation?.family === 'reference' && guardOperation.form === 'parameter-value';
|
|
613
|
+
if (!extractsFromPattern && !bindsAParameter) {
|
|
614
|
+
throw new IrLoweringBlockedError('a "default-value" destructuring step needs a presence-tested guard installed for its own extraction, ' +
|
|
615
|
+
'which only a defaulted parameter or a defaulted pattern element has');
|
|
616
|
+
}
|
|
617
|
+
// A guard carrier with no `undefined` state answers the definedness test
|
|
618
|
+
// with the constant `true` (`emit-presence.ts`, one rule, shared): the
|
|
619
|
+
// default arm is dead and the present arm reads the value unconditionally.
|
|
620
|
+
// That is the language's own answer for a position the source PROVES --
|
|
621
|
+
// `var [a, b = 5] = [1, 2]` binds 2 and never evaluates `5`, and a
|
|
622
|
+
// parameter pattern every call site fills (`impliedPatternPositionPresent-
|
|
623
|
+
// Everywhere`) is the same fact one census over. Both censuses type such a
|
|
624
|
+
// read without the absence on purpose, so the dead arm here is the proof
|
|
625
|
+
// arriving, not a name's type standing in for the read's.
|
|
626
|
+
const sources = flow.requireMergeSources(guardResult);
|
|
627
|
+
const representation = requireResultRepresentation(ctx, operation, 'value', 'a default-value step');
|
|
628
|
+
// A default's truthy arm is the raw extraction after the `is-defined`
|
|
629
|
+
// guard proved every top-level `undefined` arm dead. Carry that site-local
|
|
630
|
+
// proof into the IR instead of asking the representation-only conversion
|
|
631
|
+
// renderer to rediscover it. `T | null | undefined` -> `T | null` is the
|
|
632
|
+
// important shape: the surviving `null` and `T` arms must be dispatched
|
|
633
|
+
// separately, or stripping the result's optional wrapper first reads the
|
|
634
|
+
// inactive `T` arm when the caller explicitly supplied `null`.
|
|
635
|
+
const extractedIncoming = resolveRequiredOperand(ctx, sources.truthy, lineage, extracted);
|
|
636
|
+
const liveDefinedArms = extractedIncoming.representation.kind === 'tagged-union'
|
|
637
|
+
? extractedIncoming.representation.arms
|
|
638
|
+
.map((arm, index) => (arm.value.kind === 'undefined' ? -1 : index))
|
|
639
|
+
.filter((index) => index >= 0)
|
|
640
|
+
: [];
|
|
641
|
+
const present = extractedIncoming.representation.kind === 'tagged-union' &&
|
|
642
|
+
liveDefinedArms.length > 0 &&
|
|
643
|
+
liveDefinedArms.length < extractedIncoming.representation.arms.length
|
|
644
|
+
? {
|
|
645
|
+
value: ctx.builder.mergeLiveArmRebuild(sources.truthy, lineage, extractedIncoming, representation, liveDefinedArms, false, ctx.program.conversions),
|
|
646
|
+
representation
|
|
647
|
+
}
|
|
648
|
+
: mergeIncoming(ctx, sources.truthy, lineage, operation, 'extracted', extracted, representation);
|
|
649
|
+
const fallback = mergeIncoming(ctx, sources.falsy, lineage, operation, 'fallback', namedOperand(operation, 'fallback'), representation);
|
|
650
|
+
registerResult(ctx, operation, ctx.builder.phi(sources.join, lineage, [
|
|
651
|
+
{ block: sources.truthy, value: present },
|
|
652
|
+
{ block: sources.falsy, value: fallback }
|
|
653
|
+
], representation));
|
|
654
|
+
};
|
|
655
|
+
export const lowerDestructuring = (ctx, flow, block, operation) => {
|
|
656
|
+
if (operation.form === 'object-source') {
|
|
657
|
+
const lineage = requireLineage(operation);
|
|
658
|
+
const source = resolveRequiredOperand(ctx, block, lineage, namedOperand(operation, 'base'));
|
|
659
|
+
const result = ctx.builder.compute(block, lineage, 'require-object-coercible', 'RequireObjectCoercible', [source], source.representation);
|
|
660
|
+
registerResult(ctx, operation, result);
|
|
661
|
+
return;
|
|
662
|
+
}
|
|
663
|
+
if (operation.form === 'object-pattern') {
|
|
664
|
+
lowerObjectPatternStep(ctx, block, operation);
|
|
665
|
+
return;
|
|
666
|
+
}
|
|
667
|
+
if (operation.form === 'array-pattern-close') {
|
|
668
|
+
const lineage = requireLineage(operation);
|
|
669
|
+
const iterator = resolveRequiredOperand(ctx, block, lineage, namedOperand(operation, 'iterator'));
|
|
670
|
+
if (iterator.representation.kind !== 'dynamic' && iterator.representation.kind !== 'iterator') {
|
|
671
|
+
throw new IrLoweringBlockedError(`a finite array-pattern close expected a dynamic or generator iterator, but resolved a "${iterator.representation.kind}" carrier`);
|
|
672
|
+
}
|
|
673
|
+
const completion = operation.results.find((result) => result.role === 'completion');
|
|
674
|
+
const representation = completion ? requireResultRepresentation(ctx, operation, 'completion', 'a finite array-pattern close') : null;
|
|
675
|
+
const result = ctx.builder.iteratorClose(block, lineage, iterator, representation, true);
|
|
676
|
+
if (completion && result)
|
|
677
|
+
ctx.values.set(completion.id, result);
|
|
678
|
+
return;
|
|
679
|
+
}
|
|
680
|
+
if (operation.form === 'array-pattern') {
|
|
681
|
+
lowerArrayPatternStep(ctx, block, operation);
|
|
682
|
+
return;
|
|
683
|
+
}
|
|
684
|
+
if (operation.form === 'rest-element') {
|
|
685
|
+
if (operandOf(operation, 'iterator', 0)) {
|
|
686
|
+
lowerArrayPatternRest(ctx, block, operation);
|
|
687
|
+
return;
|
|
688
|
+
}
|
|
689
|
+
lowerObjectPatternRest(ctx, block, operation);
|
|
690
|
+
return;
|
|
691
|
+
}
|
|
692
|
+
lowerDefaultValueStep(ctx, flow, operation);
|
|
693
|
+
};
|