@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,863 @@
|
|
|
1
|
+
import ts from 'typescript';
|
|
2
|
+
import { operationId, semanticResultId } from '../../../identity/ids.js';
|
|
3
|
+
import { bindingKindOf } from './binding-kind.js';
|
|
4
|
+
import { blocked, mintOperationId, mintResult, operand } from './mint.js';
|
|
5
|
+
import { citeExpressionResult } from './references.js';
|
|
6
|
+
import { sourceForValue, valueEdgesInto, hasNativeIterationCursor, staticPropertyKeyTextOf, isRuntimeSymbolMember, staticSpreadMembersOf, staticFunctionNameOf, staticClassNameOf, staticClassLengthOf, expectedParameterCountOf, ownPrototypePropertyOf } from './shared.js';
|
|
7
|
+
import { isClosedTupleSpread, tupleSpreadReads } from './tuple-spread.js';
|
|
8
|
+
import { isDynamicIterationSource } from './protocol.js';
|
|
9
|
+
import { iteratorMethodSymbolOf } from './iteration-yield.js';
|
|
10
|
+
import { sharedPrimitiveDomainOf } from '../../model/primitive-domain.js';
|
|
11
|
+
import { symbolPropertyKeyText } from '../../model/structural-types.js';
|
|
12
|
+
import { normalCompletion, pureEffects } from '../../model/operands.js';
|
|
13
|
+
const unwrappedStructuralShape = (context, type) => {
|
|
14
|
+
const shape = context.table.get(type).shape;
|
|
15
|
+
if ((shape.kind === 'declared' || shape.kind === 'object-anchor') && shape.body !== null)
|
|
16
|
+
return unwrappedStructuralShape(context, shape.body);
|
|
17
|
+
if (shape.kind === 'intersection' && shape.resolved !== null)
|
|
18
|
+
return unwrappedStructuralShape(context, shape.resolved);
|
|
19
|
+
return shape;
|
|
20
|
+
};
|
|
21
|
+
const structuralMemberKeyText = (member) => {
|
|
22
|
+
const key = member.key;
|
|
23
|
+
return key.kind === 'symbol' ? symbolPropertyKeyText(key.declaration) : String(key.value);
|
|
24
|
+
};
|
|
25
|
+
/** The declared field a statically keyed literal property installs, if any. */
|
|
26
|
+
const objectLiteralFieldTypeOf = (context, receiverType, key) => {
|
|
27
|
+
const shape = unwrappedStructuralShape(context, receiverType);
|
|
28
|
+
if (!shape || shape.kind !== 'object')
|
|
29
|
+
return null;
|
|
30
|
+
return shape.members.find((member) => structuralMemberKeyText(member) === key)?.type ?? null;
|
|
31
|
+
};
|
|
32
|
+
/** The concrete element slot each ordinary array-literal operand enters. */
|
|
33
|
+
const arrayLiteralElementRolesOf = (context, shapeType, operands) => {
|
|
34
|
+
const shape = unwrappedStructuralShape(context, shapeType);
|
|
35
|
+
if (!shape)
|
|
36
|
+
return [];
|
|
37
|
+
const roles = [];
|
|
38
|
+
for (const element of operands) {
|
|
39
|
+
if (element.role !== 'element')
|
|
40
|
+
continue;
|
|
41
|
+
const type = shape.kind === 'array' ? shape.element : shape.kind === 'tuple' ? shape.elements[element.ordinal]?.type : undefined;
|
|
42
|
+
if (type !== undefined)
|
|
43
|
+
roles.push({ role: 'element', ordinal: element.ordinal, owner: 'array-element', type });
|
|
44
|
+
}
|
|
45
|
+
return roles;
|
|
46
|
+
};
|
|
47
|
+
/** A data-property key as the language sees it: a string, from a non-computed name. */
|
|
48
|
+
const keyTextOf = (name) => {
|
|
49
|
+
if (!name)
|
|
50
|
+
return null;
|
|
51
|
+
if (ts.isIdentifier(name) || ts.isPrivateIdentifier(name))
|
|
52
|
+
return name.text;
|
|
53
|
+
if (ts.isStringLiteral(name) || ts.isNumericLiteral(name))
|
|
54
|
+
return name.text;
|
|
55
|
+
return null;
|
|
56
|
+
};
|
|
57
|
+
/**
|
|
58
|
+
* The key one object-literal member is defined under, and whether it is
|
|
59
|
+
* computed.
|
|
60
|
+
*
|
|
61
|
+
* `{ [k]: v }` is two different constructs wearing one syntax, and which one it
|
|
62
|
+
* is is decided by the key's TYPE, never by the brackets:
|
|
63
|
+
*
|
|
64
|
+
* - A key the type system pins -- `{ ['a']: v }`, `{ [K]: v }` for a
|
|
65
|
+
* literal-typed `const`, `{ [S]: v }` for a `unique symbol` -- is a STATIC
|
|
66
|
+
* key. The checker resolves the literal's own type to a named member
|
|
67
|
+
* (`{ a: V }`, and `keyof` lists it), the layout gives that member a struct
|
|
68
|
+
* field, and `o.a` reads it. So it is published exactly as a written name is:
|
|
69
|
+
* one constant operand, `keyIsComputed: false`. This is the identical rule
|
|
70
|
+
* `class-lifecycle.ts` already applies to `class C { [S]: T }`, generalized
|
|
71
|
+
* from `unique symbol` to every fixed key by `staticPropertyKeyTextOf`.
|
|
72
|
+
* - A key that is genuinely a runtime value is a DYNAMIC definition, cited from
|
|
73
|
+
* whichever family normalized the bracketed expression and marked
|
|
74
|
+
* `keyIsComputed: true`. Whether the receiver can take one is not decided
|
|
75
|
+
* here: `preflight/property-access.ts` asks the target for the
|
|
76
|
+
* `<carrier>:define-own-property:true` recipe, which a dictionary claims and
|
|
77
|
+
* a struct does not.
|
|
78
|
+
*
|
|
79
|
+
* ToPropertyKey is what separates the second case from a refusal. `string`,
|
|
80
|
+
* `number` and `symbol`, including literal unions in one domain, already have
|
|
81
|
+
* one primitive carrier. No union dispatch or coercion is needed. A
|
|
82
|
+
* numeric key needs no separate coercion here because the receiver a numeric
|
|
83
|
+
* index signature derives is itself numerically keyed, so both sides of the
|
|
84
|
+
* store already agree. Every other carrier (`any`/`unknown` above all, which
|
|
85
|
+
* the checker admits where it admits nothing else) has no key conversion at
|
|
86
|
+
* all, and is refused by name rather than spelled into a table whose key type
|
|
87
|
+
* it does not have.
|
|
88
|
+
*/
|
|
89
|
+
const objectLiteralKeyOperand = (context, name, stringType, receiverType) => {
|
|
90
|
+
const constantKey = (text) => ({
|
|
91
|
+
operand: operand('key', 0, { kind: 'constant', text, literal: 'string' }, stringType),
|
|
92
|
+
computed: false
|
|
93
|
+
});
|
|
94
|
+
if (!ts.isComputedPropertyName(name)) {
|
|
95
|
+
const text = keyTextOf(name);
|
|
96
|
+
return text === null
|
|
97
|
+
? { blocked: `an object literal property name of syntax kind ${ts.SyntaxKind[name.kind]} is not a data-property key` }
|
|
98
|
+
: constantKey(text);
|
|
99
|
+
}
|
|
100
|
+
const keyType = context.types.typeAt(name.expression);
|
|
101
|
+
const staticText = staticPropertyKeyTextOf(context, keyType);
|
|
102
|
+
if (staticText !== null && !isRuntimeSymbolMember(context, receiverType, keyType))
|
|
103
|
+
return constantKey(staticText);
|
|
104
|
+
const shape = context.table.get(keyType).shape;
|
|
105
|
+
const domain = sharedPrimitiveDomainOf((id) => context.table.get(id).shape, shape);
|
|
106
|
+
const convertible = domain === 'string' || domain === 'number' || domain === 'symbol';
|
|
107
|
+
if (!convertible) {
|
|
108
|
+
const described = shape.kind === 'primitive' ? shape.primitive : shape.kind;
|
|
109
|
+
return {
|
|
110
|
+
blocked: `a computed property key of type "${described}" has no ToPropertyKey conversion; only string, number and symbol keys convert`
|
|
111
|
+
};
|
|
112
|
+
}
|
|
113
|
+
const cited = citeExpressionResult(name.expression, context);
|
|
114
|
+
if (cited.kind === 'unmodelled')
|
|
115
|
+
return { blocked: cited.reason };
|
|
116
|
+
return { operand: operand('key', 0, cited.source, keyType), computed: true };
|
|
117
|
+
};
|
|
118
|
+
/**
|
|
119
|
+
* The value an object literal method installs: the function object its own
|
|
120
|
+
* allocation candidate publishes.
|
|
121
|
+
*
|
|
122
|
+
* The census routes a `MethodDeclaration` inside an object literal to the
|
|
123
|
+
* allocation family in its own right (`census.ts`'s `familyOf`), exactly as it
|
|
124
|
+
* routes the object literal itself, so `createAllocationProducer.contribute`
|
|
125
|
+
* is called on it independently and mints a `function-object` allocation from
|
|
126
|
+
* it via the same `isCallableNode` path an arrow-function property value goes
|
|
127
|
+
* through. That call has not necessarily happened yet by the time this
|
|
128
|
+
* property is defined -- producers run candidate by candidate, not in any
|
|
129
|
+
* order this file controls -- so citing its result cannot be a lookup. It is
|
|
130
|
+
* a prediction instead, computing the exact identity that call independently
|
|
131
|
+
* mints from the same node: `sourceForValue`/`citeExpressionResult` do this
|
|
132
|
+
* for every ordinary expression already, and this is that same rule stated
|
|
133
|
+
* for a method, which is not an expression and so has no entry through that
|
|
134
|
+
* path. The ordinal is 0 because the census gives a `MethodDeclaration` the
|
|
135
|
+
* allocation family exactly once, so `mintOperationId` only ever assigns it
|
|
136
|
+
* one identity.
|
|
137
|
+
*/
|
|
138
|
+
const methodValueOf = (method, context) => {
|
|
139
|
+
const allocationId = operationId(context.identities.nodeIdOf(method), 'allocation', 0);
|
|
140
|
+
return {
|
|
141
|
+
source: { kind: 'result', result: semanticResultId(allocationId, 'value') },
|
|
142
|
+
type: context.types.typeAt(method)
|
|
143
|
+
};
|
|
144
|
+
};
|
|
145
|
+
/**
|
|
146
|
+
* The data properties an object literal installs, as their own operations.
|
|
147
|
+
*
|
|
148
|
+
* A property key here is a language-level *value* -- the string
|
|
149
|
+
* CreateDataPropertyOrThrow receives -- not an identity, which is why reading
|
|
150
|
+
* the name node's text is correct rather than a source-shaped shortcut: two
|
|
151
|
+
* different literals spelling the same key really do install the same key, and
|
|
152
|
+
* that is exactly what the constant records. A method installs the same way:
|
|
153
|
+
* `PropertyDefinitionEvaluation` for a `MethodDefinition` is `CreateMethod`
|
|
154
|
+
* followed by the identical `CreateDataPropertyOrThrow` an ordinary value
|
|
155
|
+
* property gets, which is why this is one loop and not two -- a method is a
|
|
156
|
+
* data-property definition whose value happens to come from a function
|
|
157
|
+
* allocation instead of an evaluated expression.
|
|
158
|
+
*/
|
|
159
|
+
/**
|
|
160
|
+
* `{ ...a, b: 1 }` -- CopyDataProperties (ECMA-262 7.3.25), for a source whose
|
|
161
|
+
* shape is statically known.
|
|
162
|
+
*
|
|
163
|
+
* The spec copies the source's OWN ENUMERABLE properties, and for a data-only
|
|
164
|
+
* object shape that set is exactly its members: one `[[Get]]` on the source
|
|
165
|
+
* and one `CreateDataPropertyOrThrow` on the target per member, in the shape's
|
|
166
|
+
* own order, installed at the position the spread occupies so a later literal
|
|
167
|
+
* key still overwrites it -- which is the whole of the spec's semantics here.
|
|
168
|
+
*
|
|
169
|
+
* Refused BY NAME, never approximated, when the source is not that:
|
|
170
|
+
*
|
|
171
|
+
* - an INDEX SIGNATURE means the own-property set is not known until runtime,
|
|
172
|
+
* and copying only the declared members would silently drop the rest;
|
|
173
|
+
* - an ACCESSOR must be CALLED -- `{ ...o }` copies a getter's returned value,
|
|
174
|
+
* not the getter -- and calling one is a user-code invocation this producer
|
|
175
|
+
* does not model here;
|
|
176
|
+
* - a `signature`-shaped member is a METHOD, which on a class instance lives
|
|
177
|
+
* on the prototype and is therefore not own-enumerable at all; the shape
|
|
178
|
+
* alone cannot tell an own function-valued field from a prototype method,
|
|
179
|
+
* so both are refused rather than one guessed;
|
|
180
|
+
* - `membersDropped` says a projection already filtered this body, so its
|
|
181
|
+
* member list is not the source's own-property set (see
|
|
182
|
+
* `representation/object-shape.ts` for why that bit exists);
|
|
183
|
+
* - a symbol key is skipped by CopyDataProperties only when non-enumerable,
|
|
184
|
+
* and the shape does not record enumerability, so it is refused too.
|
|
185
|
+
*
|
|
186
|
+
* The two operations per member are minted on the SPREAD's own node, so their
|
|
187
|
+
* ordinals are consecutive within `(node, 'property')` exactly as
|
|
188
|
+
* `operationsOfNode` (normalize/gating.ts) requires.
|
|
189
|
+
*/
|
|
190
|
+
const spreadCopyOf = (property, receiver, receiverType, candidate, context) => {
|
|
191
|
+
const sourceType = context.types.typeAt(property.expression);
|
|
192
|
+
const admitted = staticSpreadMembersOf(context, sourceType);
|
|
193
|
+
if ('blocked' in admitted) {
|
|
194
|
+
// A source with no statically known own-property set is not a refusal
|
|
195
|
+
// here any more -- `producers/protocol.ts`'s `contributeObjectSpread`
|
|
196
|
+
// mints a `protocol: 'spread'` operation for this EXACT `SpreadAssignment`
|
|
197
|
+
// node under exactly this condition (the same shared predicate,
|
|
198
|
+
// `staticSpreadMembersOf`, so the two can never disagree about which
|
|
199
|
+
// sources take which path), and that operation performs the runtime
|
|
200
|
+
// `CopyDataProperties` copy this field-by-field loop cannot. So this
|
|
201
|
+
// member is DEFERRED to that operation rather than blocking the whole
|
|
202
|
+
// literal: the id is predicted, not re-minted -- `protocol.ts` owns this
|
|
203
|
+
// node's `'protocol'` family census assignment and mints the operation
|
|
204
|
+
// itself, exactly as `methodValueOf` above predicts an object-literal
|
|
205
|
+
// method's own allocation id without re-minting it.
|
|
206
|
+
//
|
|
207
|
+
// Whether that operation can actually LOWER -- the receiver must resolve
|
|
208
|
+
// to a dictionary-capable carrier, and the source's arm kinds must be
|
|
209
|
+
// ones the copy knows how to render -- is answered later, by
|
|
210
|
+
// `ir/lower-protocol.ts`, which fails closed by name when it cannot; this
|
|
211
|
+
// producer does not re-derive that answer, which is not available until
|
|
212
|
+
// representation is derived.
|
|
213
|
+
return { deferred: operationId(context.identities.nodeIdOf(property), 'protocol', 0) };
|
|
214
|
+
}
|
|
215
|
+
// Only the fields the LITERAL's own type declares are installed.
|
|
216
|
+
//
|
|
217
|
+
// `{ ...extra, ...base }` typed `Extra` really does carry `base`'s extra keys
|
|
218
|
+
// in JavaScript, and a native record cannot: its layout is fixed, and the
|
|
219
|
+
// struct this literal allocates is the one its own type names. Which is also
|
|
220
|
+
// the only view any consumer can ever take of it -- no typed read reaches a
|
|
221
|
+
// key the type does not declare, and a native record has no dynamic
|
|
222
|
+
// enumeration to expose one. So the copy is scoped to the target's own
|
|
223
|
+
// fields, rather than emitting a store into a member that does not exist.
|
|
224
|
+
// A target whose shape is not statically known has no field set to scope to,
|
|
225
|
+
// and refuses by name here rather than installing a guess.
|
|
226
|
+
const target = staticSpreadMembersOf(context, receiverType);
|
|
227
|
+
if ('blocked' in target) {
|
|
228
|
+
return { blocked: `an object spread into a target with no statically known field set cannot place its copies (${target.blocked})` };
|
|
229
|
+
}
|
|
230
|
+
const installable = new Map(target.members.flatMap((member) => (member.key.kind === 'symbol' ? [] : [[String(member.key.value), member.type]])));
|
|
231
|
+
const stringType = context.table.intern({ kind: 'primitive', primitive: 'string' });
|
|
232
|
+
const sourceValue = sourceForValue(context, property.expression);
|
|
233
|
+
const operations = [];
|
|
234
|
+
const edges = [];
|
|
235
|
+
const spreadNode = context.identities.nodeIdOf(property);
|
|
236
|
+
for (const member of admitted.members) {
|
|
237
|
+
// Every member reaching here was admitted by `staticSpreadMembersOf`
|
|
238
|
+
// above -- data-only, non-accessor, string- or number-keyed -- so the key
|
|
239
|
+
// is readable without a second check that could disagree with it.
|
|
240
|
+
if (member.key.kind === 'symbol')
|
|
241
|
+
continue;
|
|
242
|
+
const key = String(member.key.value);
|
|
243
|
+
const destinationType = installable.get(key);
|
|
244
|
+
if (destinationType === undefined)
|
|
245
|
+
continue;
|
|
246
|
+
const read = mintOperationId(context.ordinals, spreadNode, 'property');
|
|
247
|
+
const readOperands = [
|
|
248
|
+
operand('receiver', 0, sourceValue, sourceType),
|
|
249
|
+
operand('key', 0, { kind: 'constant', text: key, literal: 'string' }, stringType)
|
|
250
|
+
];
|
|
251
|
+
operations.push({
|
|
252
|
+
id: read,
|
|
253
|
+
family: 'property',
|
|
254
|
+
internalMethod: 'get',
|
|
255
|
+
strict: true,
|
|
256
|
+
keyIsComputed: false,
|
|
257
|
+
descriptor: null,
|
|
258
|
+
caller: candidate.caller,
|
|
259
|
+
operands: readOperands,
|
|
260
|
+
results: [mintResult(read, 'value', member.type)],
|
|
261
|
+
completion: normalCompletion,
|
|
262
|
+
effects: { ...pureEffects, readsMutableState: true },
|
|
263
|
+
evaluationOrdinal: candidate.evaluationOrdinal
|
|
264
|
+
});
|
|
265
|
+
edges.push(...valueEdgesInto(read, readOperands));
|
|
266
|
+
const install = mintOperationId(context.ordinals, spreadNode, 'property');
|
|
267
|
+
const installOperands = [
|
|
268
|
+
operand('receiver', 0, { kind: 'result', result: receiver }, receiverType, { kind: 'provenance' }),
|
|
269
|
+
operand('key', 0, { kind: 'constant', text: key, literal: 'string' }, stringType),
|
|
270
|
+
operand('value', 0, { kind: 'result', result: semanticResultId(read, 'value') }, member.type)
|
|
271
|
+
];
|
|
272
|
+
operations.push({
|
|
273
|
+
id: install,
|
|
274
|
+
family: 'property',
|
|
275
|
+
internalMethod: 'define-own-property',
|
|
276
|
+
strict: true,
|
|
277
|
+
keyIsComputed: false,
|
|
278
|
+
descriptor: { writable: true, enumerable: true, configurable: true },
|
|
279
|
+
caller: candidate.caller,
|
|
280
|
+
operands: installOperands,
|
|
281
|
+
// The source member is what this read PRODUCES; the destination member
|
|
282
|
+
// is what the following definition STORES. They can differ under a
|
|
283
|
+
// contextual literal type (`{ p: any }` spread into `{ p: void }`), so
|
|
284
|
+
// the conversion role must name the latter or preflight audits the
|
|
285
|
+
// source against itself and silently skips the real store conversion.
|
|
286
|
+
conversionRoles: [{ role: 'value', ordinal: 0, owner: 'declared-field', type: destinationType }],
|
|
287
|
+
results: [mintResult(install, 'value', receiverType)],
|
|
288
|
+
completion: normalCompletion,
|
|
289
|
+
effects: { readsMutableState: false, writesMutableState: true, allocates: false, callsUserCode: false },
|
|
290
|
+
evaluationOrdinal: candidate.evaluationOrdinal
|
|
291
|
+
});
|
|
292
|
+
edges.push(...valueEdgesInto(install, installOperands), { kind: 'evaluation', from: read, to: install });
|
|
293
|
+
}
|
|
294
|
+
return { operations, edges };
|
|
295
|
+
};
|
|
296
|
+
const definePropertiesOf = (node, receiver, receiverType, candidate, context) => {
|
|
297
|
+
if (!receiver)
|
|
298
|
+
return { blocked: 'an object literal allocation published no result for its property definitions to install onto' };
|
|
299
|
+
const stringType = context.table.intern({ kind: 'primitive', primitive: 'string' });
|
|
300
|
+
const operations = [];
|
|
301
|
+
const edges = [];
|
|
302
|
+
let previous = null;
|
|
303
|
+
for (const property of node.properties) {
|
|
304
|
+
// A spread installs one property per member of its source, in the shape's
|
|
305
|
+
// own order and at the position the spread occupies -- so a later literal
|
|
306
|
+
// key still overwrites what it copied, exactly as the language orders it.
|
|
307
|
+
if (ts.isSpreadAssignment(property)) {
|
|
308
|
+
const copy = spreadCopyOf(property, receiver, receiverType, candidate, context);
|
|
309
|
+
if ('blocked' in copy)
|
|
310
|
+
return copy;
|
|
311
|
+
if ('deferred' in copy) {
|
|
312
|
+
// This member's copy is performed by the `protocol: 'spread'`
|
|
313
|
+
// operation `protocol.ts` publishes for this same node, not by any
|
|
314
|
+
// operation minted here -- see `spreadCopyOf`. Still order it exactly
|
|
315
|
+
// where the source places it: `{ 'Content-Type': x, ...headers }`
|
|
316
|
+
// sets the known key FIRST and the spread's runtime copy can OVERWRITE
|
|
317
|
+
// it, so the evaluation edge into and out of the deferred operation is
|
|
318
|
+
// the only thing here that keeps that order observable.
|
|
319
|
+
if (previous)
|
|
320
|
+
edges.push({ kind: 'evaluation', from: previous, to: copy.deferred });
|
|
321
|
+
previous = copy.deferred;
|
|
322
|
+
continue;
|
|
323
|
+
}
|
|
324
|
+
for (const copied of copy.operations) {
|
|
325
|
+
if (previous)
|
|
326
|
+
edges.push({ kind: 'evaluation', from: previous, to: copied.id });
|
|
327
|
+
previous = copied.id;
|
|
328
|
+
}
|
|
329
|
+
operations.push(...copy.operations);
|
|
330
|
+
edges.push(...copy.edges);
|
|
331
|
+
continue;
|
|
332
|
+
}
|
|
333
|
+
// An accessor installs no *value*: `MethodDefinitionEvaluation` gives it an
|
|
334
|
+
// accessor descriptor, whose get/set slots hold the bodies this literal's
|
|
335
|
+
// own shape already names (`structural-declarations.ts`'s
|
|
336
|
+
// `literalAccessorOf`), so there is no data property to define here and no
|
|
337
|
+
// storage for one to be defined into. Creating the function object is pure,
|
|
338
|
+
// so skipping the definition drops nothing observable -- the body itself is
|
|
339
|
+
// still allocated, by this producer, at the accessor's own candidate.
|
|
340
|
+
if (ts.isGetAccessorDeclaration(property) || ts.isSetAccessorDeclaration(property)) {
|
|
341
|
+
// ...but only when the shape this literal ALLOCATES really does name it.
|
|
342
|
+
// The literal's own shape always does (`literalAccessorOf`); the shape a
|
|
343
|
+
// CONTEXTUAL type supplies need not -- an interface's `get next(): T` has
|
|
344
|
+
// no body, so it is an ordinary data member of a shape the host
|
|
345
|
+
// implements, and a literal laid out as that interface had its getter
|
|
346
|
+
// skipped here and no field written for it either. The record allocated
|
|
347
|
+
// with a default-constructed `CallableObject` in that slot then
|
|
348
|
+
// segfaulted on the first read (`typed-custom-iterator-close.ts`'s
|
|
349
|
+
// `typedNextGetterSource`). Matched on the DECLARATION's own id rather
|
|
350
|
+
// than on a re-derived key, so a computed well-known-symbol accessor is
|
|
351
|
+
// checked by the same test as a written one.
|
|
352
|
+
const own = context.identities.declarationIdOf(property);
|
|
353
|
+
const shape = unwrappedStructuralShape(context, receiverType);
|
|
354
|
+
const named = shape !== null &&
|
|
355
|
+
shape.kind === 'object' &&
|
|
356
|
+
shape.members.some((member) => member.accessor?.getter === own || member.accessor?.setter === own);
|
|
357
|
+
if (!named) {
|
|
358
|
+
return {
|
|
359
|
+
blocked: 'an object literal accessor whose allocated shape declares the member as ordinary data has nowhere to install its body; ' +
|
|
360
|
+
'reading it would call an unset slot'
|
|
361
|
+
};
|
|
362
|
+
}
|
|
363
|
+
continue;
|
|
364
|
+
}
|
|
365
|
+
const name = property.name;
|
|
366
|
+
const isMethod = ts.isMethodDeclaration(property);
|
|
367
|
+
// Read before the narrowing below exhausts this union, so the refusal can
|
|
368
|
+
// still name the form it refused if the union ever grows a member the
|
|
369
|
+
// three tests do not cover.
|
|
370
|
+
const propertyKind = property.kind;
|
|
371
|
+
if (!(ts.isPropertyAssignment(property) || ts.isShorthandPropertyAssignment(property) || isMethod)) {
|
|
372
|
+
// A member form this producer does not model at all -- saying so is
|
|
373
|
+
// better than installing a property under a guessed name.
|
|
374
|
+
return { blocked: `an object literal property of syntax kind ${ts.SyntaxKind[propertyKind]} has no readable data-property key` };
|
|
375
|
+
}
|
|
376
|
+
const key = objectLiteralKeyOperand(context, name, stringType, receiverType);
|
|
377
|
+
if ('blocked' in key)
|
|
378
|
+
return key;
|
|
379
|
+
const id = mintOperationId(context.ordinals, context.identities.nodeIdOf(property), 'property');
|
|
380
|
+
// `{ x }` is sugar for `{ x: x }`: the value is a read of the same
|
|
381
|
+
// identifier that names the key. A method has no separate value
|
|
382
|
+
// expression at all -- its own declaration node *is* the value, by way of
|
|
383
|
+
// the allocation it independently publishes.
|
|
384
|
+
const value = isMethod
|
|
385
|
+
? methodValueOf(property, context)
|
|
386
|
+
: (() => {
|
|
387
|
+
const valueNode = ts.isPropertyAssignment(property) ? property.initializer : property.name;
|
|
388
|
+
return { source: sourceForValue(context, valueNode), type: context.types.typeAt(valueNode) };
|
|
389
|
+
})();
|
|
390
|
+
const operands = [
|
|
391
|
+
operand('receiver', 0, { kind: 'result', result: receiver }, receiverType, { kind: 'provenance' }),
|
|
392
|
+
key.operand,
|
|
393
|
+
operand('value', 0, value.source, value.type)
|
|
394
|
+
];
|
|
395
|
+
const fieldType = key.operand.source.kind === 'constant' ? objectLiteralFieldTypeOf(context, receiverType, key.operand.source.text) : null;
|
|
396
|
+
operations.push({
|
|
397
|
+
id,
|
|
398
|
+
family: 'property',
|
|
399
|
+
internalMethod: 'define-own-property',
|
|
400
|
+
strict: true,
|
|
401
|
+
keyIsComputed: key.computed,
|
|
402
|
+
// CreateDataPropertyOrThrow installs a fully permissive data property;
|
|
403
|
+
// these are the attributes the language fixes, not a default chosen here.
|
|
404
|
+
descriptor: { writable: true, enumerable: true, configurable: true },
|
|
405
|
+
caller: candidate.caller,
|
|
406
|
+
operands,
|
|
407
|
+
...(fieldType === null ? {} : { conversionRoles: [{ role: 'value', ordinal: 0, owner: 'declared-field', type: fieldType }] }),
|
|
408
|
+
// The result is the object with this property installed, not the value
|
|
409
|
+
// that was installed: CreateDataPropertyOrThrow returns nothing useful,
|
|
410
|
+
// and it is the object that the literal's consumers go on to cite.
|
|
411
|
+
results: [mintResult(id, 'value', receiverType)],
|
|
412
|
+
completion: normalCompletion,
|
|
413
|
+
effects: { readsMutableState: false, writesMutableState: true, allocates: false, callsUserCode: false },
|
|
414
|
+
evaluationOrdinal: candidate.evaluationOrdinal
|
|
415
|
+
});
|
|
416
|
+
edges.push(...valueEdgesInto(id, operands));
|
|
417
|
+
// Properties install left to right, and that order is observable through
|
|
418
|
+
// enumeration and through side effects in the values. Sharing the
|
|
419
|
+
// candidate's ordinal says nothing about which of these runs first, so the
|
|
420
|
+
// order travels on an explicit edge, which is the only thing a consumer is
|
|
421
|
+
// allowed to read it from.
|
|
422
|
+
if (previous)
|
|
423
|
+
edges.push({ kind: 'evaluation', from: previous, to: id });
|
|
424
|
+
previous = id;
|
|
425
|
+
}
|
|
426
|
+
return { operations, edges };
|
|
427
|
+
};
|
|
428
|
+
const isCallableNode = (node) => ts.isFunctionExpression(node) ||
|
|
429
|
+
ts.isArrowFunction(node) ||
|
|
430
|
+
ts.isFunctionDeclaration(node) ||
|
|
431
|
+
ts.isMethodDeclaration(node) ||
|
|
432
|
+
// An object literal's own accessor. `MethodDefinitionEvaluation` for a
|
|
433
|
+
// `get`/`set` runs `OrdinaryFunctionCreate` exactly as it does for a method;
|
|
434
|
+
// what differs is only what the definition that follows installs, and that
|
|
435
|
+
// is the *literal's* business, below. (A class accessor never arrives here:
|
|
436
|
+
// the census routes it to `class-lifecycle`, which allocates it itself.)
|
|
437
|
+
ts.isGetAccessorDeclaration(node) ||
|
|
438
|
+
ts.isSetAccessorDeclaration(node);
|
|
439
|
+
/** A declaration instantiated with the enclosing function body, before that body's statements execute. */
|
|
440
|
+
const isBodyLevelFunctionDeclaration = (node) => {
|
|
441
|
+
if (!ts.isFunctionDeclaration(node) || !ts.isBlock(node.parent))
|
|
442
|
+
return false;
|
|
443
|
+
const owner = node.parent.parent;
|
|
444
|
+
return ((ts.isFunctionDeclaration(owner) ||
|
|
445
|
+
ts.isFunctionExpression(owner) ||
|
|
446
|
+
ts.isArrowFunction(owner) ||
|
|
447
|
+
ts.isMethodDeclaration(owner) ||
|
|
448
|
+
ts.isConstructorDeclaration(owner) ||
|
|
449
|
+
ts.isGetAccessorDeclaration(owner) ||
|
|
450
|
+
ts.isSetAccessorDeclaration(owner)) &&
|
|
451
|
+
owner.body === node.parent);
|
|
452
|
+
};
|
|
453
|
+
/**
|
|
454
|
+
* `null` for a node this producer does not model.
|
|
455
|
+
*
|
|
456
|
+
* The census routes an object literal's own accessor definitions here too,
|
|
457
|
+
* and those are not any of the kinds below. Falling through to
|
|
458
|
+
* `function-object` for them would publish a callable allocation that names no
|
|
459
|
+
* function -- a shape `AllocationOperation.callable` cannot honestly fill --
|
|
460
|
+
* so the unmodelled kinds are refused by name instead.
|
|
461
|
+
*/
|
|
462
|
+
/**
|
|
463
|
+
* The binding a `function f() {}` statement initializes.
|
|
464
|
+
*
|
|
465
|
+
* A function declaration does two things: it instantiates a callable, and it
|
|
466
|
+
* initializes the binding that names it -- hoisted, so the name holds the
|
|
467
|
+
* function before any statement in the enclosing body runs. A function
|
|
468
|
+
* *expression* with a BindingIdentifier does the same two things in a
|
|
469
|
+
* different scope: `InstantiateOrdinaryFunctionExpression` builds a fresh
|
|
470
|
+
* declarative environment, gives it exactly one immutable binding for that
|
|
471
|
+
* name, makes it the closure's `[[Environment]]`, and initializes it with the
|
|
472
|
+
* closure before returning. So it introduces a cell too, and publishing only
|
|
473
|
+
* the declaration's was the defect -- every read of a named function
|
|
474
|
+
* expression's own name (the `requestAnimationFrame(loop)` idiom, one
|
|
475
|
+
* occurrence in each of twelve corpus apps) named a declaration no operation
|
|
476
|
+
* introduced, and `bindingReference` refused it as an ambient one with no host
|
|
477
|
+
* protocol. Which execution context owns the cell is already answered by
|
|
478
|
+
* `candidate.caller`: the environment is created by whatever evaluates the
|
|
479
|
+
* expression, exactly as a declaration's cell belongs to the body that hoists
|
|
480
|
+
* it. Nothing leaks to the enclosing scope from this, because scoping is the
|
|
481
|
+
* checker's answer, not this one's -- an outer name never resolves to this
|
|
482
|
+
* declaration, so no read outside the body can reach the cell.
|
|
483
|
+
*
|
|
484
|
+
* An anonymous function expression still names nothing, and neither does an
|
|
485
|
+
* object-literal method: its name is a property key installed by
|
|
486
|
+
* `definePropertiesOf`, not a binding any scope resolves.
|
|
487
|
+
*/
|
|
488
|
+
const nameBindingOf = (node, allocation, candidate, context) => {
|
|
489
|
+
if (!(ts.isFunctionDeclaration(node) || ts.isFunctionExpression(node)) || !node.name)
|
|
490
|
+
return [];
|
|
491
|
+
const value = allocation.results[0];
|
|
492
|
+
if (!value)
|
|
493
|
+
return [];
|
|
494
|
+
const id = mintOperationId(context.ordinals, candidate.id, 'binding');
|
|
495
|
+
// Mutability and the dead zone come from the one shared authority rather
|
|
496
|
+
// than from constants here, because the read side asks the same function --
|
|
497
|
+
// `references.ts`, `computations.ts` and `invocations.ts` all reach a
|
|
498
|
+
// binding read's kind through `bindingKindOf`. A declaration binding is
|
|
499
|
+
// still mutable and hoisted; a function expression's self-name is the
|
|
500
|
+
// immutable, dead-zone-free binding the language creates for it. Two
|
|
501
|
+
// producers computing this separately is what `BindingKind`'s own doc
|
|
502
|
+
// comment forbids, and a cell whose introduction and reads disagreed about
|
|
503
|
+
// its lifetime would be one cell with two lifetimes.
|
|
504
|
+
const { mutable, temporalDeadZone } = bindingKindOf(node);
|
|
505
|
+
return [
|
|
506
|
+
{
|
|
507
|
+
id,
|
|
508
|
+
family: 'binding',
|
|
509
|
+
action: 'initialize',
|
|
510
|
+
declaration: context.identities.declarationIdOf(node),
|
|
511
|
+
mutable,
|
|
512
|
+
temporalDeadZone,
|
|
513
|
+
...(isBodyLevelFunctionDeclaration(node) ? { hoistedFunctionInitialization: true } : {}),
|
|
514
|
+
caller: candidate.caller,
|
|
515
|
+
operands: [operand('initializer', 0, { kind: 'result', result: value.id }, allocation.shape)],
|
|
516
|
+
results: [mintResult(id, 'value', allocation.shape)],
|
|
517
|
+
completion: normalCompletion,
|
|
518
|
+
effects: { ...pureEffects, writesMutableState: true },
|
|
519
|
+
evaluationOrdinal: candidate.evaluationOrdinal
|
|
520
|
+
}
|
|
521
|
+
];
|
|
522
|
+
};
|
|
523
|
+
/**
|
|
524
|
+
* A spread source that is neither a native cursor nor dynamic, but declares
|
|
525
|
+
* its own `[Symbol.iterator]` -- a class with a `*[Symbol.iterator]()`, the
|
|
526
|
+
* shape every hand-written iterable has.
|
|
527
|
+
*
|
|
528
|
+
* `protocol.ts` already mints the whole GetIterator record for it; only this
|
|
529
|
+
* producer refused to consume one, so `[...new Range(1, 4)]` was blocked for
|
|
530
|
+
* a protocol that was installed. The operand cites that record exactly as a
|
|
531
|
+
* dynamic spread's does, and `ir/lower-allocation.ts` gathers the cursor it
|
|
532
|
+
* carries.
|
|
533
|
+
*/
|
|
534
|
+
const gathersDeclaredIterator = (context, expression) => {
|
|
535
|
+
// A plain array, a Set, a string, a tuple -- everything with a native range
|
|
536
|
+
// copy -- declares `[Symbol.iterator]` too, and `protocol.ts` mints NO
|
|
537
|
+
// record for those (its `consumedWithoutIterator` bypass returns first). So
|
|
538
|
+
// they are excluded here rather than asked: citing a record nobody publishes
|
|
539
|
+
// is a withheld certificate, which is what `[...state.items, action.item]`
|
|
540
|
+
// became when this predicate answered on the symbol alone.
|
|
541
|
+
const type = context.types.typeAt(expression);
|
|
542
|
+
if (hasNativeIterationCursor(context, type) || isDynamicIterationSource(context, type) || isClosedTupleSpread(context, expression))
|
|
543
|
+
return false;
|
|
544
|
+
return iteratorMethodSymbolOf(context.types.rawTypeAt(expression)) !== null;
|
|
545
|
+
};
|
|
546
|
+
const allocatedKindOf = (node) => {
|
|
547
|
+
if (ts.isObjectLiteralExpression(node))
|
|
548
|
+
return 'object-literal';
|
|
549
|
+
if (ts.isArrayLiteralExpression(node))
|
|
550
|
+
return 'array-literal';
|
|
551
|
+
if (ts.isClassExpression(node))
|
|
552
|
+
return 'class-constructor-object';
|
|
553
|
+
if (ts.isRegularExpressionLiteral(node))
|
|
554
|
+
return 'regexp-object';
|
|
555
|
+
return isCallableNode(node) ? 'function-object' : null;
|
|
556
|
+
};
|
|
557
|
+
/**
|
|
558
|
+
* The outermost `as T`/`<T>` assertion in an unbroken chain of assertions and
|
|
559
|
+
* parentheses wrapping `node`, or `null` when `node` is not the operand of one.
|
|
560
|
+
*
|
|
561
|
+
* `expr as unknown as T` -- the standard double-cast idiom for bypassing
|
|
562
|
+
* structural compatibility -- parses as two nested `AsExpression`s, the inner
|
|
563
|
+
* one asserting `unknown`. `producers/invocations.ts`'s own
|
|
564
|
+
* `enclosingTypeAssertion` correctly reads only the immediate wrapper for its
|
|
565
|
+
* single-assertion call sites; reading only the immediate parent here would
|
|
566
|
+
* answer `unknown` and miss the caller's actual intent, so this climbs
|
|
567
|
+
* through every chained assertion to the last one instead of stopping at the
|
|
568
|
+
* first.
|
|
569
|
+
*/
|
|
570
|
+
const outermostTypeAssertion = (node) => {
|
|
571
|
+
let current = node;
|
|
572
|
+
let outermost = null;
|
|
573
|
+
for (;;) {
|
|
574
|
+
let parent = current.parent;
|
|
575
|
+
while (parent !== undefined && ts.isParenthesizedExpression(parent) && parent.expression === current) {
|
|
576
|
+
current = parent;
|
|
577
|
+
parent = current.parent;
|
|
578
|
+
}
|
|
579
|
+
if (parent === undefined || !(ts.isAsExpression(parent) || ts.isTypeAssertionExpression(parent)) || parent.expression !== current) {
|
|
580
|
+
return outermost;
|
|
581
|
+
}
|
|
582
|
+
outermost = parent;
|
|
583
|
+
current = parent;
|
|
584
|
+
}
|
|
585
|
+
};
|
|
586
|
+
/**
|
|
587
|
+
* Whether `id`'s structural shape is a call+construct signature, through
|
|
588
|
+
* `unwrappedStructuralShape` above -- the one place this file already
|
|
589
|
+
* answers "what does a `declared`/intersection wrapper actually name," so a
|
|
590
|
+
* second, narrower unwrap here would be the same two-authorities risk this
|
|
591
|
+
* file's own header on `unwrappedStructuralShape`'s callers exists to avoid.
|
|
592
|
+
*/
|
|
593
|
+
const isCallAndConstructShape = (context, id) => {
|
|
594
|
+
const signature = unwrappedStructuralShape(context, id);
|
|
595
|
+
return signature?.kind === 'signature' && signature.call.length > 0 && signature.construct.length > 0;
|
|
596
|
+
};
|
|
597
|
+
/**
|
|
598
|
+
* A plain function's allocation shape, honoring an immediate `as T`/`<T>`
|
|
599
|
+
* assertion that adds a construct signature the literal's own inferred type
|
|
600
|
+
* never states.
|
|
601
|
+
*
|
|
602
|
+
* TypeScript's checker never gives an ordinary `FunctionExpression`/
|
|
603
|
+
* `FunctionDeclaration` a construct signature of its own -- `valueTypeAt`
|
|
604
|
+
* below reflects exactly what the checker inferred, a call-only signature --
|
|
605
|
+
* even though ECMA-262 15.2.4 OrdinaryFunctionCreate gives every non-arrow,
|
|
606
|
+
* non-method, non-generator, non-async function real `[[Construct]]`
|
|
607
|
+
* behavior and a real own "prototype" property. A program that casts such a
|
|
608
|
+
* value to a call+construct interface (`function (v) {...} as unknown as
|
|
609
|
+
* DualCallableConstructor`, an ajv-style `((v) => boolean) & { new (...): T
|
|
610
|
+
* }` intersection) is not lying about the runtime -- it is naming a fact the
|
|
611
|
+
* checker's own inference just does not surface for typed function syntax
|
|
612
|
+
* the way it does for the untyped `this.x = ` constructor-function idiom
|
|
613
|
+
* (`structural-receiver.ts`'s `jsConstructorReceiverOf`).
|
|
614
|
+
*
|
|
615
|
+
* Safe to honor because this compiler renders the callable's own construct
|
|
616
|
+
* thunk from its own body (`targets/cpp/translation-unit.ts`'s
|
|
617
|
+
* `constructThunkOf`, `targets/cpp/emit-callable.ts`'s `emitAllocateCallable`)
|
|
618
|
+
* -- unlike `JSON.parse`'s `any` (`producers/invocations.ts`'s
|
|
619
|
+
* `jsonParseResultOverride`), this is never trusting an opaque host's word
|
|
620
|
+
* for a shape it does not itself build. Restricted to the allocation's own
|
|
621
|
+
* DIRECT assertion chain -- never a later `as T` on a separate reference to
|
|
622
|
+
* the same declaration (`const reflected = Factory as FactoryWithDefault`
|
|
623
|
+
* elsewhere in the file), which would need a whole-program census of every
|
|
624
|
+
* reachable cast this producer is not given -- and to ordinary function
|
|
625
|
+
* syntax only: an arrow, a method, a generator or an async function is never
|
|
626
|
+
* a legal `new` target in real JavaScript, and honoring a cast that claims
|
|
627
|
+
* otherwise here would certify an impossible construction instead of
|
|
628
|
+
* refusing it.
|
|
629
|
+
*
|
|
630
|
+
* That census was BUILT and reverted on 2026-09-08, measured rather than
|
|
631
|
+
* argued: it resolves the cast correctly and still buys nothing, because the
|
|
632
|
+
* asserted type in every program that wants this is an INTERSECTION
|
|
633
|
+
* (`typeof Factory & (new (v: number) => T)`) and an intersection of a call
|
|
634
|
+
* type with a construct type interns as an object shape with zero members --
|
|
635
|
+
* so `isCallAndConstructShape` answers `false` for the DIRECT spelling too.
|
|
636
|
+
* The wall is intersection resolution, not the reach of this rule. See
|
|
637
|
+
* a finding of the same date.
|
|
638
|
+
*/
|
|
639
|
+
const constructibleAssertionShapeOf = (context, node) => {
|
|
640
|
+
if (node.asteriskToken !== undefined)
|
|
641
|
+
return null;
|
|
642
|
+
if ((ts.getCombinedModifierFlags(node) & ts.ModifierFlags.Async) !== 0)
|
|
643
|
+
return null;
|
|
644
|
+
const assertion = outermostTypeAssertion(node);
|
|
645
|
+
if (!assertion)
|
|
646
|
+
return null;
|
|
647
|
+
const asserted = context.types.typeAt(assertion);
|
|
648
|
+
return isCallAndConstructShape(context, asserted) ? asserted : null;
|
|
649
|
+
};
|
|
650
|
+
export const createAllocationProducer = (context) => ({
|
|
651
|
+
family: 'allocation',
|
|
652
|
+
contribute: (candidate) => {
|
|
653
|
+
const node = candidate.node;
|
|
654
|
+
if (ts.isArrayLiteralExpression(node)) {
|
|
655
|
+
// A spread is admitted when its own source has a NATIVE ITERATION CURSOR
|
|
656
|
+
// -- a plain array, a `Set<T>`, a `Map<K, V>`, a `string` or a
|
|
657
|
+
// `Generator<T, ...>`, the same predicate `protocol.ts`'s bypass uses so
|
|
658
|
+
// the two halves cannot disagree about which sources take the range copy
|
|
659
|
+
// -- or when it is a CLOSED TUPLE (positional expansion,
|
|
660
|
+
// `tuple-spread.ts`). Anything else -- a user-defined iterable, a
|
|
661
|
+
// `Symbol.iterator` method written by hand, a tuple with an
|
|
662
|
+
// optional/rest element -- still
|
|
663
|
+
// needs the general iterator protocol, which is not installed, so it is
|
|
664
|
+
// refused here exactly as before. `.find()` rather than `.some()`
|
|
665
|
+
// because the refusal needs to name a candidate; which one is a detail,
|
|
666
|
+
// not part of the contract.
|
|
667
|
+
const inadmissibleSpread = node.elements.find((element) => ts.isSpreadElement(element) &&
|
|
668
|
+
!hasNativeIterationCursor(context, context.types.typeAt(element.expression)) &&
|
|
669
|
+
!isDynamicIterationSource(context, context.types.typeAt(element.expression)) &&
|
|
670
|
+
!isClosedTupleSpread(context, element.expression) &&
|
|
671
|
+
!gathersDeclaredIterator(context, element.expression));
|
|
672
|
+
if (inadmissibleSpread) {
|
|
673
|
+
return {
|
|
674
|
+
kind: 'blocked',
|
|
675
|
+
blocker: blocked(candidate.id, 'allocation', 'array literal spread needs the iterator protocol, which is not installed', 'P4')
|
|
676
|
+
};
|
|
677
|
+
}
|
|
678
|
+
}
|
|
679
|
+
const operationIdentity = mintOperationId(context.ordinals, candidate.id, 'allocation');
|
|
680
|
+
const operands = [];
|
|
681
|
+
// The reads a tuple spread expands to, and the edges wiring each one to the
|
|
682
|
+
// receiver it indexes. Collected here so the contribution can publish them
|
|
683
|
+
// alongside the allocation itself.
|
|
684
|
+
const expansions = [];
|
|
685
|
+
const expansionEdges = [];
|
|
686
|
+
if (ts.isArrayLiteralExpression(node)) {
|
|
687
|
+
// The operand's own ordinal is its position in the ELEMENT SEQUENCE the
|
|
688
|
+
// literal builds, which stops being the syntactic index the moment a
|
|
689
|
+
// tuple spread expands one written element into several. Everything
|
|
690
|
+
// downstream reads the ordinal as that sequence position -- `lowerTupleLiteral`
|
|
691
|
+
// matches operand `n` to the record field keyed `String(n)`,
|
|
692
|
+
// `arrayLiteralSlotsOf` merges the `element`/`spread` roles back into one
|
|
693
|
+
// ordered run by it, and `arrayLiteralElementTarget` looks a tuple field
|
|
694
|
+
// up by it -- so it is counted, never taken from `forEach`'s index.
|
|
695
|
+
let position = 0;
|
|
696
|
+
for (const element of node.elements) {
|
|
697
|
+
if (ts.isOmittedExpression(element)) {
|
|
698
|
+
// A hole is not an element whose value is `undefined`; it is a slot
|
|
699
|
+
// the language defines but this site leaves empty, and the two are
|
|
700
|
+
// observably different (`in`, enumeration order on assignment).
|
|
701
|
+
operands.push(operand('element', position, { kind: 'absent' }, context.types.typeOf(context.checker.getUndefinedType())));
|
|
702
|
+
position += 1;
|
|
703
|
+
}
|
|
704
|
+
else if (ts.isSpreadElement(element)) {
|
|
705
|
+
// A closed tuple is expanded into one ordinary `element` operand per
|
|
706
|
+
// position, each citing its own `[[Get]]`: the literal `[...pair, 4]`
|
|
707
|
+
// then reaches every later layer as the three-element literal it
|
|
708
|
+
// provably is, needing no spread-aware code anywhere downstream.
|
|
709
|
+
const expanded = tupleSpreadReads(context, candidate, element.expression);
|
|
710
|
+
if (expanded) {
|
|
711
|
+
expansions.push(...expanded.operations);
|
|
712
|
+
expansionEdges.push(...expanded.edges);
|
|
713
|
+
for (const slot of expanded.positions) {
|
|
714
|
+
operands.push(operand('element', position, slot.source, slot.type));
|
|
715
|
+
position += 1;
|
|
716
|
+
}
|
|
717
|
+
continue;
|
|
718
|
+
}
|
|
719
|
+
// Admitted only when `hasNativeIterationCursor` passed above. This operand
|
|
720
|
+
// names the spread's own source (the whole array, e.g. `xs`), not a
|
|
721
|
+
// single element, so `ir/lower-allocation.ts` can range-copy it
|
|
722
|
+
// directly instead of through a materialized iterator. The distinct
|
|
723
|
+
// 'spread' role is what tells this operand apart from an ordinary
|
|
724
|
+
// element at the same position -- collapsing the two under 'element'
|
|
725
|
+
// would leave that lowering no way to know which push shape a given
|
|
726
|
+
// operand needs.
|
|
727
|
+
const sourceType = context.types.typeAt(element.expression);
|
|
728
|
+
// A dynamic spread consumes the one GetIterator record the protocol
|
|
729
|
+
// candidate publishes. Re-reading the source here would invoke
|
|
730
|
+
// @@iterator twice and lose observable iterator identity.
|
|
731
|
+
const source = isDynamicIterationSource(context, sourceType) || gathersDeclaredIterator(context, element.expression)
|
|
732
|
+
? {
|
|
733
|
+
kind: 'result',
|
|
734
|
+
result: semanticResultId(operationId(context.identities.nodeIdOf(element), 'protocol', 1), 'iterator-record')
|
|
735
|
+
}
|
|
736
|
+
: sourceForValue(context, element.expression);
|
|
737
|
+
operands.push(operand('spread', position, source, sourceType));
|
|
738
|
+
position += 1;
|
|
739
|
+
}
|
|
740
|
+
else {
|
|
741
|
+
operands.push(operand('element', position, sourceForValue(context, element), context.types.typeAt(element)));
|
|
742
|
+
position += 1;
|
|
743
|
+
}
|
|
744
|
+
}
|
|
745
|
+
}
|
|
746
|
+
if (ts.isRegularExpressionLiteral(node)) {
|
|
747
|
+
// A regexp literal's pattern and flags are SOURCE TEXT, exactly as a
|
|
748
|
+
// template literal's segments are, so they travel the same way: as
|
|
749
|
+
// constant operands the producer read off the token. No step of the
|
|
750
|
+
// language computes either one (ECMA-262 22.2.4.1 `RegExp(pattern,
|
|
751
|
+
// flags)` receives them already final from the literal's Parse Node),
|
|
752
|
+
// and nothing downstream should have to re-lex the literal to get them.
|
|
753
|
+
//
|
|
754
|
+
// The split is on the LAST `/`, which is exact rather than approximate:
|
|
755
|
+
// the grammar is `/ RegularExpressionBody / RegularExpressionFlags`, and
|
|
756
|
+
// `RegularExpressionFlags` is a sequence of `IdentifierPartChar`, which
|
|
757
|
+
// never includes `/`. So the final `/` in the token is always the
|
|
758
|
+
// terminating one, even when the body contains `[/]` or `\/`.
|
|
759
|
+
const text = node.text;
|
|
760
|
+
const terminator = text.lastIndexOf('/');
|
|
761
|
+
if (terminator <= 0) {
|
|
762
|
+
return {
|
|
763
|
+
kind: 'blocked',
|
|
764
|
+
blocker: blocked(candidate.id, 'allocation', `a regular-expression literal's token ${JSON.stringify(text)} has no closing delimiter to split its flags off`, 'P1')
|
|
765
|
+
};
|
|
766
|
+
}
|
|
767
|
+
const patternType = context.table.intern({ kind: 'primitive', primitive: 'string' });
|
|
768
|
+
operands.push(operand('pattern-source', 0, { kind: 'constant', text: text.slice(1, terminator), literal: 'string' }, patternType));
|
|
769
|
+
operands.push(operand('pattern-flags', 0, { kind: 'constant', text: text.slice(terminator + 1), literal: 'string' }, patternType));
|
|
770
|
+
}
|
|
771
|
+
const allocated = allocatedKindOf(node);
|
|
772
|
+
if (!allocated) {
|
|
773
|
+
return {
|
|
774
|
+
kind: 'blocked',
|
|
775
|
+
blocker: blocked(candidate.id, 'allocation', `no allocation is modelled for a node of syntax kind ${ts.SyntaxKind[node.kind]}`, 'P1')
|
|
776
|
+
};
|
|
777
|
+
}
|
|
778
|
+
// A callable's shape is what its *declaration* denotes, which for an
|
|
779
|
+
// accessor is its own signature and not the property type its name carries
|
|
780
|
+
// -- see `structural-declarations.ts`'s `accessorSignatureOf`. An ordinary
|
|
781
|
+
// function directly wrapped in an `as T`/`<T>` assertion that adds a
|
|
782
|
+
// construct signature overrides that default -- see
|
|
783
|
+
// `constructibleAssertionShapeOf` just above.
|
|
784
|
+
const constructibleShape = ts.isFunctionExpression(node) || ts.isFunctionDeclaration(node) ? constructibleAssertionShapeOf(context, node) : null;
|
|
785
|
+
const shape = constructibleShape ?? (isCallableNode(node) ? context.types.valueTypeAt(node) : context.types.typeAt(node));
|
|
786
|
+
const operation = {
|
|
787
|
+
id: operationIdentity,
|
|
788
|
+
family: 'allocation',
|
|
789
|
+
caller: candidate.caller,
|
|
790
|
+
allocated,
|
|
791
|
+
// Only a callable allocation names a function; everything else states
|
|
792
|
+
// `null` rather than an id that would be meaningless at that coordinate.
|
|
793
|
+
callable: isCallableNode(node) ? context.identities.functionIdOf(node) : null,
|
|
794
|
+
...(isCallableNode(node)
|
|
795
|
+
? {
|
|
796
|
+
functionSource: node.getText(),
|
|
797
|
+
functionName: staticFunctionNameOf(node),
|
|
798
|
+
functionLength: expectedParameterCountOf(node),
|
|
799
|
+
generatorFunction: 'asteriskToken' in node && node.asteriskToken !== undefined,
|
|
800
|
+
...(ownPrototypePropertyOf(node) === null ? {} : { ownPrototypeProperty: ownPrototypePropertyOf(node) === true })
|
|
801
|
+
}
|
|
802
|
+
: {}),
|
|
803
|
+
// A class expression's constructor object names its class and its
|
|
804
|
+
// `[[Name]]` (`const A = class {}` is "A"), exactly as
|
|
805
|
+
// `class-lifecycle.ts`'s `allocateFunctionObject` does for a declaration.
|
|
806
|
+
...(ts.isClassExpression(node)
|
|
807
|
+
? {
|
|
808
|
+
classDeclaration: context.identities.declarationIdOf(node),
|
|
809
|
+
functionName: staticClassNameOf(node),
|
|
810
|
+
functionLength: staticClassLengthOf(node)
|
|
811
|
+
}
|
|
812
|
+
: {}),
|
|
813
|
+
shape,
|
|
814
|
+
...(allocated === 'array-literal' ? { conversionRoles: arrayLiteralElementRolesOf(context, shape, operands) } : {}),
|
|
815
|
+
...(isBodyLevelFunctionDeclaration(node) ? { hoistedFunctionInitialization: true } : {}),
|
|
816
|
+
operands,
|
|
817
|
+
results: [mintResult(operationIdentity, 'value', shape)],
|
|
818
|
+
// The allocation itself never throws; a throwing element or heritage
|
|
819
|
+
// evaluation is that sub-expression's own operation, not this one's.
|
|
820
|
+
completion: normalCompletion,
|
|
821
|
+
effects: { readsMutableState: false, writesMutableState: false, allocates: true, callsUserCode: false },
|
|
822
|
+
// Evaluation position comes from the shared per-caller counter, never
|
|
823
|
+
// from a source offset: the two are not comparable, so an operation
|
|
824
|
+
// ordinalled by offset sorts before every operation ordinalled by count
|
|
825
|
+
// regardless of the order either actually runs in.
|
|
826
|
+
evaluationOrdinal: candidate.evaluationOrdinal
|
|
827
|
+
};
|
|
828
|
+
if (isCallableNode(node)) {
|
|
829
|
+
return {
|
|
830
|
+
kind: 'operations',
|
|
831
|
+
operations: [operation, ...nameBindingOf(node, operation, candidate, context)],
|
|
832
|
+
edges: valueEdgesInto(operationIdentity, operands)
|
|
833
|
+
};
|
|
834
|
+
}
|
|
835
|
+
if (!ts.isObjectLiteralExpression(node)) {
|
|
836
|
+
// The expanded tuple-spread reads are published with the allocation that
|
|
837
|
+
// cites them, never separately: `contribution.ts` commits one candidate
|
|
838
|
+
// atomically, so an allocation whose operands name results published by
|
|
839
|
+
// a *different* candidate would be withheld the moment that candidate
|
|
840
|
+
// were blocked, and the two must stand or fall together.
|
|
841
|
+
return {
|
|
842
|
+
kind: 'operations',
|
|
843
|
+
operations: [...expansions, operation],
|
|
844
|
+
edges: [...expansionEdges, ...valueEdgesInto(operationIdentity, operands)]
|
|
845
|
+
};
|
|
846
|
+
}
|
|
847
|
+
// An object literal is OrdinaryObjectCreate followed by one
|
|
848
|
+
// CreateDataPropertyOrThrow per property, and modelling it as a single
|
|
849
|
+
// allocation carrying value operands loses every key: `{ a: 1 }` and
|
|
850
|
+
// `{ x: 1 }` would publish identical operations. Each definition is its
|
|
851
|
+
// own operation, keyed on its own property node, so its key survives and
|
|
852
|
+
// so the emitted object is the one the source describes.
|
|
853
|
+
const definitions = definePropertiesOf(node, operation.results[0]?.id ?? null, shape, candidate, context);
|
|
854
|
+
if ('blocked' in definitions) {
|
|
855
|
+
return { kind: 'blocked', blocker: blocked(candidate.id, 'allocation', definitions.blocked, 'P1') };
|
|
856
|
+
}
|
|
857
|
+
return {
|
|
858
|
+
kind: 'operations',
|
|
859
|
+
operations: [operation, ...definitions.operations],
|
|
860
|
+
edges: [...valueEdgesInto(operationIdentity, operands), ...definitions.edges]
|
|
861
|
+
};
|
|
862
|
+
}
|
|
863
|
+
});
|