@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,695 @@
|
|
|
1
|
+
import ts from 'typescript';
|
|
2
|
+
import { operationId, semanticResultId } from '../../../identity/ids.js';
|
|
3
|
+
import { pureEffects, throwingCompletion } from '../../model/operands.js';
|
|
4
|
+
import { blocked, mintOperationId, mintResult, operand } from './mint.js';
|
|
5
|
+
import { isArgumentsObjectIdentifier } from './bindings.js';
|
|
6
|
+
import { resolveExpressionOperand } from './boundary.js';
|
|
7
|
+
import { hasNativeIterationCursor, iterationPayloadArm, isGeneratorType, isNativeIterableSetType, isNativeIterableStringType, staticSpreadMembersOf, valueEdgesInto } from './shared.js';
|
|
8
|
+
import { iteratorMethodSymbolOf, iteratorRecordTypesOf, iteratorYieldStructuralType } from './iteration-yield.js';
|
|
9
|
+
import { closedTupleElementTypesOf } from './tuple-spread.js';
|
|
10
|
+
import { symbolPropertyKeyText } from '../../model/structural-types.js';
|
|
11
|
+
import { symbolKeyDeclarationOf } from '../structural-leaves.js';
|
|
12
|
+
/**
|
|
13
|
+
* Iterator/enumerate/spread protocols.
|
|
14
|
+
*
|
|
15
|
+
* `f(...xs)`, `[...xs]`, and `{...o}` all read as "spread" in surface syntax,
|
|
16
|
+
* but they are three different runtime protocols and this file must never let
|
|
17
|
+
* one stand in for another:
|
|
18
|
+
*
|
|
19
|
+
* - argument spread and array-literal spread both drive the sync iterator
|
|
20
|
+
* protocol (`GetIterator` / `IteratorNext`) over their operand -- the census
|
|
21
|
+
* assigns both to the single `SpreadElement` syntax kind, and the protocol
|
|
22
|
+
* they imply does not depend on which of the two contexts holds them;
|
|
23
|
+
* - object spread (`SpreadAssignment`) is `CopyDataProperties`: own enumerable
|
|
24
|
+
* string+symbol keys copied directly, with no method lookup and no iterator
|
|
25
|
+
* at all -- it is `protocol: 'spread'` here, never `'iterator'`.
|
|
26
|
+
*
|
|
27
|
+
* `for`-`of`/`for`-`in` need this same sync-iterator/enumerate machinery, but
|
|
28
|
+
* `census.ts` classifies those as `'control'`, not `'protocol'`, so
|
|
29
|
+
* `control.ts` calls `mintIteratorSteps` below directly rather than this file
|
|
30
|
+
* minting operations for a candidate it was never handed.
|
|
31
|
+
*/
|
|
32
|
+
const unresolvedType = (context, reason) => context.table.intern({ kind: 'unresolved', reason });
|
|
33
|
+
/**
|
|
34
|
+
* `any`/`unknown` is the one iteration source whose `@@iterator` lookup must
|
|
35
|
+
* stay in the dynamic runtime. It is deliberately narrower than "not a
|
|
36
|
+
* native cursor": a typed class or a typed structural iterable still owns a
|
|
37
|
+
* concrete method carrier, and routing either through `Value` would box a
|
|
38
|
+
* statically represented value merely to iterate it.
|
|
39
|
+
*/
|
|
40
|
+
export const isDynamicIterationSource = (context, type) => {
|
|
41
|
+
const shape = context.table.get(type).shape;
|
|
42
|
+
return shape.kind === 'primitive' && (shape.primitive === 'any' || shape.primitive === 'unknown');
|
|
43
|
+
};
|
|
44
|
+
/** Which well-known-symbol chain an operation's protocol follows -- `iteration-yield.ts`'s question, asked in this file's own vocabulary. */
|
|
45
|
+
const iterationProtocolOf = (protocol) => protocol === 'async-iterator' ? 'async' : 'sync';
|
|
46
|
+
/**
|
|
47
|
+
* The element type an iteration step yields.
|
|
48
|
+
*
|
|
49
|
+
* An array or tuple source is answered from the already-interned shape: those
|
|
50
|
+
* two are the shapes this layer itself gave the source, so re-asking the
|
|
51
|
+
* checker for them would be a second authority over an answer already held.
|
|
52
|
+
*
|
|
53
|
+
* Every other iterable is answered by `iteration-yield.ts`, which walks the
|
|
54
|
+
* checker's own declared `@@iterator`/`next`/`IteratorResult` chain. That walk
|
|
55
|
+
* used to be absent, and the gap was not small: a `for`-`of` over a `Map`, a
|
|
56
|
+
* `Set` or any program-defined iterable got `unresolved` here, which then
|
|
57
|
+
* propagated into the loop variable's carrier, the iterator record's carrier
|
|
58
|
+
* and every value read out of the loop -- one missing derivation reported as
|
|
59
|
+
* dozens of unrelated-looking carrier failures. `unresolved` is now reached
|
|
60
|
+
* only when the source genuinely declares no protocol to follow, which is a
|
|
61
|
+
* statement about the program rather than about this compiler.
|
|
62
|
+
*/
|
|
63
|
+
const iterationElementType = (context, protocol, sourceType, iterated, rawIterated = null) => {
|
|
64
|
+
if (protocol === 'enumerate') {
|
|
65
|
+
// `for`-`in` yields only own+inherited *string* keys -- never symbols --
|
|
66
|
+
// which is a guarantee of the enumerate protocol itself, not a fact about
|
|
67
|
+
// any particular source, so it is safe to state outright.
|
|
68
|
+
return context.table.intern({ kind: 'primitive', primitive: 'string' });
|
|
69
|
+
}
|
|
70
|
+
// `T | undefined` reaching here as the TOP-LEVEL shape -- exactly what
|
|
71
|
+
// `subclass-member-overlay-transform.ts`'s own sound over-approximation
|
|
72
|
+
// produces for a reference-typed member, and an ordinary pattern on its
|
|
73
|
+
// own merits besides (an optional field checked truthy, then iterated) --
|
|
74
|
+
// is peeled to its one real arm before any of the shape checks below run:
|
|
75
|
+
// none of them recognize `union` at all, so a genuinely iterable single
|
|
76
|
+
// arm buried under `| undefined` fell straight through to the checker
|
|
77
|
+
// walk, which resolves `iterated`'s type from scratch and can disagree
|
|
78
|
+
// with what this layer's own census already settled (an unannotated
|
|
79
|
+
// parameter's call-site-inferred type, `parameter-bindings.ts`, is exactly
|
|
80
|
+
// where the two diverge: the census resolves a concrete member type for
|
|
81
|
+
// the RECEIVER, but the checker's per-expression walk has no memory of
|
|
82
|
+
// that inference and answers plain `any`). Two or more non-nullish arms
|
|
83
|
+
// stays unpeeled -- which arm's element type would even apply is a real
|
|
84
|
+
// question this is not the layer to guess at, and the checker walk below,
|
|
85
|
+
// or the final refusal, still answers it exactly as before.
|
|
86
|
+
// Asked of `shared.ts`'s `iterationPayloadArm`, never re-derived here: this
|
|
87
|
+
// peel and the one `hasNativeIterationCursor` performs are the same question
|
|
88
|
+
// about the same type, and a third inline copy of it is what made the cursor
|
|
89
|
+
// and the element type disagree (see that function's own comment for the
|
|
90
|
+
// union-of-one-interned-id case it answers and this copy did not).
|
|
91
|
+
const nonNullish = iterationPayloadArm(context, sourceType);
|
|
92
|
+
const effectiveType = nonNullish ?? sourceType;
|
|
93
|
+
const shape = context.table.get(effectiveType).shape;
|
|
94
|
+
if (shape.kind === 'array')
|
|
95
|
+
return shape.element;
|
|
96
|
+
if (shape.kind === 'tuple')
|
|
97
|
+
return context.table.intern({ kind: 'union', members: shape.elements.map((element) => element.type) });
|
|
98
|
+
if (shape.kind === 'unresolved')
|
|
99
|
+
return effectiveType;
|
|
100
|
+
// A string yields STRINGS -- one code point per step (ECMA-262 22.1.3.36),
|
|
101
|
+
// and a code point is itself a String value. Answered here rather than by
|
|
102
|
+
// the checker walk below for the same reason an array's is: this layer
|
|
103
|
+
// already knows the shape, and lib.es2015's `String` declares its own
|
|
104
|
+
// `[Symbol.iterator](): IterableIterator<string>`, so asking would be a
|
|
105
|
+
// second authority over an answer already held. It matters that the two
|
|
106
|
+
// agree exactly: `publish.ts` publishes the cursor as `iterator(string)`
|
|
107
|
+
// off the source's own carrier, and a `next` value typed anything else
|
|
108
|
+
// would make the cursor and the value it yields disagree.
|
|
109
|
+
if (isNativeIterableStringType(context, effectiveType))
|
|
110
|
+
return context.table.intern({ kind: 'primitive', primitive: 'string' });
|
|
111
|
+
// A native `Set<T>` yields T directly (ECMA-262 24.2.3.10
|
|
112
|
+
// `%SetPrototype%[Symbol.iterator]` delegates to
|
|
113
|
+
// `%SetIteratorPrototype%.next`, whose `value` is the element itself) --
|
|
114
|
+
// answered here, from the structural shape's own recorded type argument,
|
|
115
|
+
// for the identical reason the array/tuple/string cases above are: this
|
|
116
|
+
// layer already knows Set's own generic parameter
|
|
117
|
+
// (`isNativeIterableSetType`/`context.keyedCollections`, the same
|
|
118
|
+
// structural census `hasNativeIterationCursor` already consults to decide
|
|
119
|
+
// this loop needs no dynamic `Symbol.iterator` lookup at all), so asking
|
|
120
|
+
// the checker again below -- through `iterated`'s own PER-EXPRESSION type --
|
|
121
|
+
// would be a second, less informed authority over an answer this layer
|
|
122
|
+
// already holds: an unannotated parameter's call-site-inferred type
|
|
123
|
+
// (`parameter-bindings.ts`) is exactly the case where the two can
|
|
124
|
+
// genuinely disagree, since the checker's own per-expression walk has no
|
|
125
|
+
// memory of that inference and answers `any` for the receiver where the
|
|
126
|
+
// structural census already resolved a concrete `Set`. A `Set` JSDoc-typed
|
|
127
|
+
// with no explicit type argument (three.js's own `new Set()` idiom, this
|
|
128
|
+
// module's `subclass-member-overlay-transform.ts`) instantiates its one
|
|
129
|
+
// parameter at `any`, which is exactly the honest answer -- an untyped
|
|
130
|
+
// Set's elements are `any`, not a refusal.
|
|
131
|
+
if (shape.kind === 'declared' && isNativeIterableSetType(context, effectiveType)) {
|
|
132
|
+
return shape.typeArguments[0] ?? context.table.intern({ kind: 'primitive', primitive: 'any' });
|
|
133
|
+
}
|
|
134
|
+
// A source the program itself declared `any`/`unknown` is the one other
|
|
135
|
+
// case this is not a gap for: every element an `any`-typed iterable yields
|
|
136
|
+
// is `any` too, by the same rule that indexing an `any` value yields `any`
|
|
137
|
+
// -- restating the source's own carrier is not a guess about a shape the
|
|
138
|
+
// checker did not state, it is citing the shape the checker DID state.
|
|
139
|
+
if (shape.kind === 'primitive' && (shape.primitive === 'any' || shape.primitive === 'unknown'))
|
|
140
|
+
return effectiveType;
|
|
141
|
+
// HOLDS, census-aware: the exact disagreement this function's own comment
|
|
142
|
+
// above warns about (an unannotated parameter's census-inferred receiver
|
|
143
|
+
// vs. the checker's memory-less per-expression walk) applies here just as
|
|
144
|
+
// much as it does to the union-peeling step above -- `context.types.
|
|
145
|
+
// rawTypeAt` is the raw-`ts.Type` form of the same answer `source.type`
|
|
146
|
+
// (this function's own `sourceType` parameter, from `resolveExpressionOperand`'s
|
|
147
|
+
// `context.types.typeAt`) was already built from, so this fallback walk
|
|
148
|
+
// stays in agreement with it instead of re-deriving a second, less informed
|
|
149
|
+
// answer from the bare checker. A caller with no expression to offer (there
|
|
150
|
+
// is none today) falls through to the same honest refusal as before rather
|
|
151
|
+
// than getting a guess.
|
|
152
|
+
const yielded = iterated
|
|
153
|
+
? iteratorYieldStructuralType(context, rawIterated ?? context.types.rawTypeAt(iterated), iterated, iterationProtocolOf(protocol))
|
|
154
|
+
: null;
|
|
155
|
+
if (yielded !== null)
|
|
156
|
+
return yielded;
|
|
157
|
+
return unresolvedType(context, 'the source declares no @@iterator/next/IteratorResult chain this can read an element type from');
|
|
158
|
+
};
|
|
159
|
+
/**
|
|
160
|
+
* The `{ value, done }` result `IteratorNext` produces, and the method/record
|
|
161
|
+
* pair that wraps it -- built once the element type is known, so the two are
|
|
162
|
+
* never asked to name a shape independently and disagree about what each
|
|
163
|
+
* other's `next()` returns.
|
|
164
|
+
*
|
|
165
|
+
* This is not a guess at "the" iterator protocol object: `[Symbol.iterator]`
|
|
166
|
+
* is a niladic function returning a record with (at least) a `next` method,
|
|
167
|
+
* and `next` is a niladic function returning `{value, done}` -- that is the
|
|
168
|
+
* complete, load-bearing iteration shape. The general typed `for`-`of` path
|
|
169
|
+
* now keeps the concrete declared record instead so its optional `return`
|
|
170
|
+
* member remains available to IteratorClose. Every concrete iterator a
|
|
171
|
+
* program can name -- an array's own, a
|
|
172
|
+
* `Map`'s, a class's hand-written `[Symbol.iterator]()` -- satisfies this
|
|
173
|
+
* exact structural record, so stating it is citing a fact the language
|
|
174
|
+
* guarantees, not inventing a layout the source never declared. Scoped to
|
|
175
|
+
* `iterator`/`enumerate`; `async-iterator`'s `next()` returns a `Promise` of
|
|
176
|
+
* this record instead, a different shape this does not yet build.
|
|
177
|
+
*/
|
|
178
|
+
const iteratorMethodAndRecordTypes = (context, elementType,
|
|
179
|
+
// The REAL structural type `receiver[Symbol.iterator]()` returns, when
|
|
180
|
+
// `generatorRecordTypeOf` (below) has already proven it is the standard
|
|
181
|
+
// `Generator<T, TReturn, TNext>` -- in which case that real type IS the
|
|
182
|
+
// record, and the synthetic ECMA-262 simulation below would only publish a
|
|
183
|
+
// second, disagreeing shape for the identical call. `null` for every other
|
|
184
|
+
// source, which is the overwhelming common case and keeps this function's
|
|
185
|
+
// synthetic branch exactly as it always was.
|
|
186
|
+
generatorRecordType) => {
|
|
187
|
+
const recordType = generatorRecordType ??
|
|
188
|
+
(() => {
|
|
189
|
+
const boolType = context.table.intern({ kind: 'primitive', primitive: 'boolean' });
|
|
190
|
+
const nextResultType = context.table.intern({
|
|
191
|
+
kind: 'object',
|
|
192
|
+
members: [
|
|
193
|
+
{ key: { kind: 'string', value: 'value' }, type: elementType, optional: false, readonly: true, accessor: null },
|
|
194
|
+
{ key: { kind: 'string', value: 'done' }, type: boolType, optional: false, readonly: true, accessor: null }
|
|
195
|
+
],
|
|
196
|
+
index: [],
|
|
197
|
+
membersDropped: false
|
|
198
|
+
});
|
|
199
|
+
const nextMethodType = context.table.intern({
|
|
200
|
+
kind: 'signature',
|
|
201
|
+
call: [{ parameters: [], minimumArity: 0, thisParameter: null, result: nextResultType }],
|
|
202
|
+
construct: []
|
|
203
|
+
});
|
|
204
|
+
return context.table.intern({
|
|
205
|
+
kind: 'object',
|
|
206
|
+
members: [{ key: { kind: 'string', value: 'next' }, type: nextMethodType, optional: false, readonly: true, accessor: null }],
|
|
207
|
+
index: [],
|
|
208
|
+
membersDropped: false
|
|
209
|
+
});
|
|
210
|
+
})();
|
|
211
|
+
const methodType = context.table.intern({
|
|
212
|
+
kind: 'signature',
|
|
213
|
+
call: [{ parameters: [], minimumArity: 0, thisParameter: null, result: recordType }],
|
|
214
|
+
construct: []
|
|
215
|
+
});
|
|
216
|
+
return { methodType, recordType };
|
|
217
|
+
};
|
|
218
|
+
/**
|
|
219
|
+
* The REAL structural type `receiver[Symbol.iterator]()` returns, when that
|
|
220
|
+
* return is -- itself, not the receiver -- the standard `Generator<T,
|
|
221
|
+
* TReturn, TNext>`: the one shape `representation/derive.ts`'s
|
|
222
|
+
* `GeneratorDeclarationPolicy` carries as the native `gea::Iterator<T>`
|
|
223
|
+
* cursor rather than a record. `null` otherwise -- including when `iterated`
|
|
224
|
+
* resolves to more than one iterator record (a union receiver whose arms
|
|
225
|
+
* declare different `[Symbol.iterator]`s) -- in which case
|
|
226
|
+
* `iteratorMethodAndRecordTypes`'s synthetic ECMA-262 `{ next(): { value,
|
|
227
|
+
* done } }` shape is exactly right and stays unchanged: it is what this
|
|
228
|
+
* compiler still has to state generically for every OTHER concrete iterator a
|
|
229
|
+
* program can name (a hand-written object literal, `Map`'s or `Set`'s own
|
|
230
|
+
* iterator, a union of sources, etc.).
|
|
231
|
+
*
|
|
232
|
+
* `receiver[Symbol.iterator]` genuinely returning a `Generator<T>` happens
|
|
233
|
+
* when the source declares the member as a GENERATOR method
|
|
234
|
+
* (`*[Symbol.iterator]() { yield ... }`) rather than an ordinary method that
|
|
235
|
+
* builds and returns an object literal. The receiver's own type is NOT
|
|
236
|
+
* itself a Generator in this case -- `hasNativeIterationCursor`'s
|
|
237
|
+
* `isGeneratorType` check, consulted before this producer ever mints a
|
|
238
|
+
* `get-method` step, already routes a directly-Generator-typed receiver
|
|
239
|
+
* around the whole dance -- but CALLING its `[Symbol.iterator]()` produces
|
|
240
|
+
* one, and the call result needs the identical `iterator(T)` carrier a
|
|
241
|
+
* directly-Generator-typed receiver gets: one runtime value, `gea::
|
|
242
|
+
* Iterator<T>`, whether it arrived by being iterated directly or by being
|
|
243
|
+
* handed back from a method call. `iteratorMethodKeyTextOf`, just below,
|
|
244
|
+
* resolves the SAME method symbol this reads the return type of, so the
|
|
245
|
+
* `get-method` step's own key and this record type can never name two
|
|
246
|
+
* different members.
|
|
247
|
+
*/
|
|
248
|
+
const generatorRecordTypeOf = (context, iterated, protocol, rawIterated = null) => {
|
|
249
|
+
if (!iterated)
|
|
250
|
+
return null;
|
|
251
|
+
// HOLDS, census-aware -- kept in agreement with `iterationElementType`'s
|
|
252
|
+
// own fallback walk over the SAME `iterated` expression (both must resolve
|
|
253
|
+
// to the same receiver type, or this and that step could name two
|
|
254
|
+
// different iterator records for one source).
|
|
255
|
+
const sourceType = rawIterated ?? context.types.rawTypeAt(iterated);
|
|
256
|
+
const iterators = iteratorRecordTypesOf(context, sourceType, iterated, protocol);
|
|
257
|
+
if (!iterators || iterators.length !== 1)
|
|
258
|
+
return null;
|
|
259
|
+
const [only] = iterators;
|
|
260
|
+
if (only === undefined)
|
|
261
|
+
return null;
|
|
262
|
+
const recordType = context.types.typeOf(only);
|
|
263
|
+
return isGeneratorType(context, recordType) ? recordType : null;
|
|
264
|
+
};
|
|
265
|
+
/**
|
|
266
|
+
* The concrete method/record pair declared by a statically typed iterable.
|
|
267
|
+
* Keeping the real record is required for IteratorClose: unlike the minimal
|
|
268
|
+
* synthetic `{ next }` protocol view, it retains an optional `return` method
|
|
269
|
+
* without widening the iterator into the dynamic carrier.
|
|
270
|
+
*/
|
|
271
|
+
const declaredIteratorMethodAndRecordTypes = (context, iterated, protocol, rawIterated = null) => {
|
|
272
|
+
if (!iterated)
|
|
273
|
+
return null;
|
|
274
|
+
const sourceType = rawIterated ?? context.types.rawTypeAt(iterated);
|
|
275
|
+
const method = iteratorMethodSymbolOf(sourceType, protocol);
|
|
276
|
+
const records = iteratorRecordTypesOf(context, sourceType, iterated, protocol);
|
|
277
|
+
if (!method || !records || records.length !== 1)
|
|
278
|
+
return null;
|
|
279
|
+
const record = records[0];
|
|
280
|
+
if (!record)
|
|
281
|
+
return null;
|
|
282
|
+
const declaredMethodType = context.checker.getTypeOfSymbolAtLocation(method, iterated);
|
|
283
|
+
// The method's declared type and the record it returns are ONE fact, and the
|
|
284
|
+
// member symbol is only an authority on it while the two agree. For an
|
|
285
|
+
// overloaded generator member they do not: TypeScript shows the bodiless
|
|
286
|
+
// `[Symbol.iterator](): IterableIterator<T>` here and never the
|
|
287
|
+
// `*[Symbol.iterator](): Generator<T>` that physically runs, so the `get`
|
|
288
|
+
// step published `() -> native-record-ref` for a body whose convention
|
|
289
|
+
// returns the native `iterator` cursor -- `emit-class-properties.ts`'s
|
|
290
|
+
// 'method "..." body convention cannot fill its published bound-method
|
|
291
|
+
// convention'. `iteratorRecordTypesOf` already resolved the physical answer
|
|
292
|
+
// (`physicalGeneratorOverloadReturnOf`), so the method type is rebuilt around
|
|
293
|
+
// it rather than re-derived: same parameters, same receiver, the record this
|
|
294
|
+
// pair has already settled on.
|
|
295
|
+
//
|
|
296
|
+
// Only when they DISAGREE. An ordinary iterable's `record` IS this
|
|
297
|
+
// signature's own return type, object-identical, and rebuilding it there
|
|
298
|
+
// would re-intern one unchanged shape through a second path for nothing.
|
|
299
|
+
const only = declaredMethodType.getCallSignatures().length === 1 ? declaredMethodType.getCallSignatures()[0] : undefined;
|
|
300
|
+
const rebuilt = only && context.checker.getReturnTypeOfSignature(only) !== record ? context.types.resolvedSignatureTypeOf(only, 'call', record) : null;
|
|
301
|
+
const answer = { methodType: rebuilt ?? context.types.typeOf(declaredMethodType), recordType: context.types.typeOf(record) };
|
|
302
|
+
// Opt-in, because this is the pair that has now disagreed twice and the
|
|
303
|
+
// disagreement is invisible in the refusal: the emitter reports the METHOD
|
|
304
|
+
// convention and names neither which of these two produced it nor what the
|
|
305
|
+
// other said.
|
|
306
|
+
if (process.env['GEA_DEBUG_ITERATOR']) {
|
|
307
|
+
process.stderr.write(`[ITERATOR] ${method.getName()} declared=${context.checker.typeToString(declaredMethodType)} ` +
|
|
308
|
+
`record=${context.checker.typeToString(record)} rebuilt=${rebuilt !== null} ` +
|
|
309
|
+
`methodType=${answer.methodType} recordType=${answer.recordType}\n`);
|
|
310
|
+
}
|
|
311
|
+
return answer;
|
|
312
|
+
};
|
|
313
|
+
/**
|
|
314
|
+
* The static property-key text `receiver[Symbol.iterator]` names, or `null`
|
|
315
|
+
* when `iterated` is absent or its type declares no such member.
|
|
316
|
+
*
|
|
317
|
+
* This is `producers/shared.ts`'s `symbolMemberKeyOf` in spirit -- a
|
|
318
|
+
* `unique symbol` member's canonical key text, so a computed read and a
|
|
319
|
+
* computed definition of the same well-known symbol resolve one identity --
|
|
320
|
+
* but reached from the OTHER direction: `symbolMemberKeyOf` starts from a
|
|
321
|
+
* key EXPRESSION already in the source and asks whether the receiver
|
|
322
|
+
* declares a matching member, while the general iterator protocol has no
|
|
323
|
+
* `Symbol.iterator` expression to start from at all (`for (const x of xs)`
|
|
324
|
+
* writes no `[Symbol.iterator]` anywhere) and has to start from the
|
|
325
|
+
* RECEIVER's own type instead. `iteratorMethodSymbolOf` is the one lookup
|
|
326
|
+
* both `iterationElementType`'s checker walk (above) and this reuse: the step
|
|
327
|
+
* that types what the source yields and the step that names the member to
|
|
328
|
+
* call can never resolve to two different members of the same type.
|
|
329
|
+
*
|
|
330
|
+
* `symbolKeyDeclarationOf` resolves the member's COMPUTED name back to the
|
|
331
|
+
* `const`/property the symbol was bound to (`Symbol.iterator` itself, for the
|
|
332
|
+
* well-known case) -- the same anchor `representation/object-shape.ts`'s
|
|
333
|
+
* `recordFieldKeyOf` spells a record's own symbol-keyed FIELD by
|
|
334
|
+
* (`symbolPropertyKeyText`), so a class's or a record's `[Symbol.iterator]`
|
|
335
|
+
* member and this producer's `get-method` key agree on one text without
|
|
336
|
+
* either side re-deriving it. The `declarationOfSymbol` fallback covers a
|
|
337
|
+
* member declared directly on the type rather than through a computed name
|
|
338
|
+
* pointing at an aliasable `const` -- the same fallback `keyOfSymbol`
|
|
339
|
+
* (`structural-leaves.ts`) takes for an ordinary interned symbol-keyed
|
|
340
|
+
* member.
|
|
341
|
+
*/
|
|
342
|
+
const iteratorMethodKeyTextOf = (context, iterated, protocol, rawIterated = null) => {
|
|
343
|
+
if (!iterated)
|
|
344
|
+
return null;
|
|
345
|
+
// HOLDS, census-aware -- the same `iterated` receiver `iterationElementType`
|
|
346
|
+
// and `generatorRecordTypeOf` resolve, kept in agreement with both for the
|
|
347
|
+
// reason this function's own doc states: the step that types what the
|
|
348
|
+
// source yields and the step that names the member to call must resolve to
|
|
349
|
+
// the same member of the same type.
|
|
350
|
+
const type = rawIterated ?? context.types.rawTypeAt(iterated);
|
|
351
|
+
const method = iteratorMethodSymbolOf(type, protocol);
|
|
352
|
+
if (!method)
|
|
353
|
+
return null;
|
|
354
|
+
const declaration = symbolKeyDeclarationOf(context.checker, context.identities, method) ?? context.identities.declarationOfSymbol(method);
|
|
355
|
+
return declaration ? symbolPropertyKeyText(context.identities.declarationIdOf(declaration)) : null;
|
|
356
|
+
};
|
|
357
|
+
/**
|
|
358
|
+
* Mints the sync/async-iterator or enumerate protocol steps for one source
|
|
359
|
+
* expression, sharing one implementation between this file's own spread
|
|
360
|
+
* handling and `control.ts`'s `for`-`of`/`for`-`in`/`yield*` handling so both
|
|
361
|
+
* always agree on the shape of "the iteration protocol" instead of drifting
|
|
362
|
+
* into two independently-evolving copies.
|
|
363
|
+
*
|
|
364
|
+
* The four possible steps reserve fixed ordinals -- 0 `get-method`, 1
|
|
365
|
+
* `get-iterator`, 2 `next`, 3 `close` -- by drawing from the counter in that
|
|
366
|
+
* order even when a step is skipped for this `protocol` (`for`-`in` never has
|
|
367
|
+
* a `get-method`; plain spread never has a `close`). Without that, `next`
|
|
368
|
+
* would land at ordinal 1 for `for`-`in` but ordinal 2 for `for`-`of`, and any
|
|
369
|
+
* other producer that needs to cite "the per-iteration value" for a loop node
|
|
370
|
+
* -- the binding producer initializing the loop variable -- would have no
|
|
371
|
+
* fixed identity to build without first knowing which loop variant produced
|
|
372
|
+
* it. Reserving the ordinal even when unused keeps `next` at ordinal 2
|
|
373
|
+
* regardless of variant.
|
|
374
|
+
*/
|
|
375
|
+
export const mintIteratorSteps = (context, candidate, protocol, source, options) => {
|
|
376
|
+
const operations = [];
|
|
377
|
+
const edges = [];
|
|
378
|
+
// The element type is needed to state the record's own `next()` shape, so
|
|
379
|
+
// it is derived first here rather than where `next`'s result is minted
|
|
380
|
+
// below -- the record and the value it eventually yields must agree on one
|
|
381
|
+
// element type, not derive it twice.
|
|
382
|
+
const rawIterated = source.rawIterated ?? null;
|
|
383
|
+
const elementType = iterationElementType(context, protocol, source.type, source.iterated, rawIterated);
|
|
384
|
+
const dynamicSource = isDynamicIterationSource(context, source.type);
|
|
385
|
+
// `enumerate` is the one protocol with no method at all: `for`-`in` reads
|
|
386
|
+
// the object directly and never resolves a `[Symbol.iterator]`, so there is
|
|
387
|
+
// no return type to check. Sync and ASYNC iteration are one question here --
|
|
388
|
+
// `iterationProtocolOf` picks which well-known symbol the walk follows, and
|
|
389
|
+
// everything downstream of that answer is identical, because under this
|
|
390
|
+
// runtime's settled-promise model an async generator is exactly a
|
|
391
|
+
// synchronous cursor (see `producers/control.ts`'s yield comment).
|
|
392
|
+
const generatorRecordType = protocol === 'enumerate' ? null : generatorRecordTypeOf(context, source.iterated, iterationProtocolOf(protocol), rawIterated);
|
|
393
|
+
const declaredRecord = options.includeGetMethod && protocol !== 'enumerate'
|
|
394
|
+
? declaredIteratorMethodAndRecordTypes(context, source.iterated, iterationProtocolOf(protocol), rawIterated)
|
|
395
|
+
: null;
|
|
396
|
+
const { methodType, recordType } = declaredRecord ?? iteratorMethodAndRecordTypes(context, elementType, generatorRecordType);
|
|
397
|
+
// A dynamic source carries both the iterator record and every yielded value
|
|
398
|
+
// as the source's authorized dynamic carrier. The synthetic `{ next }`
|
|
399
|
+
// record is for a statically known protocol member; publishing it here would
|
|
400
|
+
// invent a native layout for a runtime object and strand the dynamic lookup
|
|
401
|
+
// at lowering.
|
|
402
|
+
const iteratorRecordType = dynamicSource ? source.type : recordType;
|
|
403
|
+
const getMethodId = mintOperationId(context.ordinals, candidate.id, 'protocol');
|
|
404
|
+
const getIteratorId = mintOperationId(context.ordinals, candidate.id, 'protocol');
|
|
405
|
+
const nextId = mintOperationId(context.ordinals, candidate.id, 'protocol');
|
|
406
|
+
const closeId = mintOperationId(context.ordinals, candidate.id, 'protocol');
|
|
407
|
+
let methodResult = null;
|
|
408
|
+
if (options.includeGetMethod) {
|
|
409
|
+
// A "key" operand naming the exact member `[Symbol.iterator]` (or
|
|
410
|
+
// `[Symbol.asyncIterator]`) resolves to, when the source's own type
|
|
411
|
+
// declares one this producer can find and this backend's lowering can
|
|
412
|
+
// therefore route as an ordinary `[[Get]]` (`ir/lower-protocol.ts`'s
|
|
413
|
+
// `get-method` case) rather than the still-unbuilt fully dynamic method
|
|
414
|
+
// lookup. Async iteration is out of scope for now -- `iterationElementType`
|
|
415
|
+
// already leaves `methodType`/`recordType` unresolved for it above, so a
|
|
416
|
+
// key here would name a member this backend has nowhere to route it to.
|
|
417
|
+
const methodKeyText = protocol === 'enumerate' ? null : iteratorMethodKeyTextOf(context, source.iterated, iterationProtocolOf(protocol), rawIterated);
|
|
418
|
+
const getMethodOperands = methodKeyText
|
|
419
|
+
? [
|
|
420
|
+
operand('target', 0, source.source, source.type),
|
|
421
|
+
operand('key', 0, { kind: 'constant', text: methodKeyText, literal: 'string' }, context.table.intern({ kind: 'primitive', primitive: 'string' }))
|
|
422
|
+
]
|
|
423
|
+
: [operand('target', 0, source.source, source.type)];
|
|
424
|
+
const getMethod = {
|
|
425
|
+
family: 'protocol',
|
|
426
|
+
id: getMethodId,
|
|
427
|
+
protocol,
|
|
428
|
+
step: 'get-method',
|
|
429
|
+
caller: candidate.caller,
|
|
430
|
+
operands: getMethodOperands,
|
|
431
|
+
results: [mintResult(getMethodId, 'value', methodType)],
|
|
432
|
+
// `GetMethod` throws when the property holds a non-callable, non-nullish
|
|
433
|
+
// value; a missing/undefined method is not an error here; `get-iterator`
|
|
434
|
+
// is where a missing iterator method becomes a `TypeError`.
|
|
435
|
+
completion: throwingCompletion,
|
|
436
|
+
effects: pureEffects,
|
|
437
|
+
evaluationOrdinal: candidate.evaluationOrdinal
|
|
438
|
+
};
|
|
439
|
+
operations.push(getMethod);
|
|
440
|
+
methodResult = semanticResultId(getMethodId, 'value');
|
|
441
|
+
}
|
|
442
|
+
const getIteratorOperands = methodResult
|
|
443
|
+
? [operand('target', 0, source.source, source.type), operand('method', 0, { kind: 'result', result: methodResult }, methodType)]
|
|
444
|
+
: [operand('target', 0, source.source, source.type)];
|
|
445
|
+
const getIterator = {
|
|
446
|
+
family: 'protocol',
|
|
447
|
+
id: getIteratorId,
|
|
448
|
+
protocol,
|
|
449
|
+
step: 'get-iterator',
|
|
450
|
+
caller: candidate.caller,
|
|
451
|
+
operands: getIteratorOperands,
|
|
452
|
+
results: [mintResult(getIteratorId, 'iterator-record', iteratorRecordType)],
|
|
453
|
+
completion: throwingCompletion,
|
|
454
|
+
effects: { ...pureEffects, callsUserCode: true },
|
|
455
|
+
evaluationOrdinal: candidate.evaluationOrdinal
|
|
456
|
+
};
|
|
457
|
+
operations.push(getIterator);
|
|
458
|
+
if (methodResult)
|
|
459
|
+
edges.push({ kind: 'evaluation', from: getMethodId, to: getIteratorId });
|
|
460
|
+
const iteratorRecord = semanticResultId(getIteratorId, 'iterator-record');
|
|
461
|
+
const boolType = context.table.intern({ kind: 'primitive', primitive: 'boolean' });
|
|
462
|
+
const next = {
|
|
463
|
+
family: 'protocol',
|
|
464
|
+
id: nextId,
|
|
465
|
+
protocol,
|
|
466
|
+
step: 'next',
|
|
467
|
+
caller: candidate.caller,
|
|
468
|
+
operands: [operand('iterator-record', 0, { kind: 'result', result: iteratorRecord }, iteratorRecordType)],
|
|
469
|
+
// `IteratorResult` is `{ value, done }`; publishing `done` under the
|
|
470
|
+
// `completion` role (always boolean, never `elementType`) is what lets a
|
|
471
|
+
// consumer gate "run the loop body" without re-deriving the flag itself.
|
|
472
|
+
results: [mintResult(nextId, 'value', elementType), mintResult(nextId, 'completion', boolType)],
|
|
473
|
+
completion: { ...throwingCompletion, canSuspend: protocol === 'async-iterator' },
|
|
474
|
+
effects: { ...pureEffects, callsUserCode: true },
|
|
475
|
+
evaluationOrdinal: candidate.evaluationOrdinal
|
|
476
|
+
};
|
|
477
|
+
if (options.includeNext !== false) {
|
|
478
|
+
operations.push(next);
|
|
479
|
+
edges.push({ kind: 'evaluation', from: getIteratorId, to: nextId });
|
|
480
|
+
}
|
|
481
|
+
const nextValue = semanticResultId(nextId, 'value');
|
|
482
|
+
let closeOperationId = null;
|
|
483
|
+
if (options.includeClose) {
|
|
484
|
+
const voidType = context.table.intern({ kind: 'primitive', primitive: 'void' });
|
|
485
|
+
const close = {
|
|
486
|
+
family: 'protocol',
|
|
487
|
+
id: closeId,
|
|
488
|
+
protocol,
|
|
489
|
+
step: 'close',
|
|
490
|
+
caller: candidate.caller,
|
|
491
|
+
operands: [operand('iterator-record', 0, { kind: 'result', result: iteratorRecord }, iteratorRecordType)],
|
|
492
|
+
// IteratorClose produces no JavaScript value, but it still needs one
|
|
493
|
+
// semantic anchor for IR provenance and its runtime-helper obligation.
|
|
494
|
+
// A void completion is that anchor without inventing readable storage.
|
|
495
|
+
results: [mintResult(closeId, 'completion', voidType)],
|
|
496
|
+
completion: throwingCompletion,
|
|
497
|
+
effects: { ...pureEffects, callsUserCode: true },
|
|
498
|
+
evaluationOrdinal: candidate.evaluationOrdinal
|
|
499
|
+
};
|
|
500
|
+
operations.push(close);
|
|
501
|
+
// `IteratorClose` only runs on an abrupt exit from the loop body, and the
|
|
502
|
+
// operations that can cause one (a `break`, a `return`, a throwing
|
|
503
|
+
// statement inside the body) belong to other producers this single
|
|
504
|
+
// candidate's contribution cannot see. Recording `close` as reachable in
|
|
505
|
+
// program order from `next` states what is proven -- the step exists and
|
|
506
|
+
// is part of this protocol -- without fabricating the precise trigger
|
|
507
|
+
// edge; wiring that exactly needs a cross-producer operation index this
|
|
508
|
+
// tree does not yet have.
|
|
509
|
+
edges.push({ kind: 'evaluation', from: nextId, to: closeId });
|
|
510
|
+
closeOperationId = closeId;
|
|
511
|
+
}
|
|
512
|
+
return { operations, edges, iteratorRecord, recordType: iteratorRecordType, nextValue, nextOperationId: nextId, closeOperationId };
|
|
513
|
+
};
|
|
514
|
+
/**
|
|
515
|
+
* Object spread's `CopyDataProperties`: own enumerable string+symbol keys
|
|
516
|
+
* copied directly into the destination. There is no method lookup and no
|
|
517
|
+
* iterator record, so this mints one operation, not a step sequence.
|
|
518
|
+
*
|
|
519
|
+
* `ProtocolOperation.step` is closed and shaped for iterator-style protocols
|
|
520
|
+
* (`get-method`/`get-iterator`/`next`/`close`/`return`/`throw`); none of those
|
|
521
|
+
* names is what `CopyDataProperties` does. `'next'` is reused here only as
|
|
522
|
+
* "the single step this protocol performs" -- not as a claim that object
|
|
523
|
+
* spread advances an iterator, which it never does.
|
|
524
|
+
*
|
|
525
|
+
* `receiver` names WHERE the copy writes -- `producers/allocations.ts`'s
|
|
526
|
+
* `spreadCopyOf` defers this exact member to this exact operation (predicting
|
|
527
|
+
* this same id, never re-minting it) whenever the source's own-property set
|
|
528
|
+
* is not statically known, and `ir/lower-protocol.ts` needs the destination to
|
|
529
|
+
* lower the copy at all. It is the SAME identity `allocations.ts`'s own
|
|
530
|
+
* `AllocationOperation` for this literal already publishes -- the ordinal is 0
|
|
531
|
+
* because the census gives an `ObjectLiteralExpression` the allocation family
|
|
532
|
+
* exactly once, exactly as `methodValueOf` (allocations.ts) predicts a
|
|
533
|
+
* sibling id the identical way -- so citing it here can never mint a second,
|
|
534
|
+
* disagreeing identity for the one object this literal allocates.
|
|
535
|
+
*/
|
|
536
|
+
const contributeObjectSpread = (context, candidate, node) => {
|
|
537
|
+
// A source whose own-property set is statically known takes no protocol step
|
|
538
|
+
// at all: `producers/allocations.ts` copies its members field by field, so a
|
|
539
|
+
// `spread` operation here would be a step nothing lowers, published for a
|
|
540
|
+
// copy that already happened. Exactly the bypass an array-literal spread of a
|
|
541
|
+
// plain array takes below, decided by the same shared predicate both halves
|
|
542
|
+
// read (`shared.ts`'s `staticSpreadMembersOf`) so the two can never disagree
|
|
543
|
+
// about which sources it covers.
|
|
544
|
+
if (!('blocked' in staticSpreadMembersOf(context, context.types.typeAt(node.expression)))) {
|
|
545
|
+
return { kind: 'operations', operations: [], edges: [] };
|
|
546
|
+
}
|
|
547
|
+
const source = resolveExpressionOperand(context, node.expression);
|
|
548
|
+
if (!source) {
|
|
549
|
+
return {
|
|
550
|
+
kind: 'blocked',
|
|
551
|
+
blocker: blocked(candidate.id, 'protocol', 'no normalized operation identifies the object-spread source expression value', null)
|
|
552
|
+
};
|
|
553
|
+
}
|
|
554
|
+
const literal = node.parent;
|
|
555
|
+
if (!ts.isObjectLiteralExpression(literal)) {
|
|
556
|
+
// Grammar-guaranteed: a `SpreadAssignment` is only ever a property of an
|
|
557
|
+
// object literal. Refused by name rather than assumed, on the same
|
|
558
|
+
// fail-closed footing as every other refusal here.
|
|
559
|
+
return {
|
|
560
|
+
kind: 'blocked',
|
|
561
|
+
blocker: blocked(candidate.id, 'protocol', "an object spread's own parent is not the object literal it copies into", null)
|
|
562
|
+
};
|
|
563
|
+
}
|
|
564
|
+
const receiverType = context.types.typeAt(literal);
|
|
565
|
+
const receiverAllocationId = operationId(context.identities.nodeIdOf(literal), 'allocation', 0);
|
|
566
|
+
const receiverOperand = operand('receiver', 0, { kind: 'result', result: semanticResultId(receiverAllocationId, 'value') }, receiverType, { kind: 'provenance' });
|
|
567
|
+
const id = mintOperationId(context.ordinals, candidate.id, 'protocol');
|
|
568
|
+
const operands = [operand('source', 0, source.source, source.type), receiverOperand];
|
|
569
|
+
const operation = {
|
|
570
|
+
family: 'protocol',
|
|
571
|
+
id,
|
|
572
|
+
protocol: 'spread',
|
|
573
|
+
step: 'next',
|
|
574
|
+
caller: candidate.caller,
|
|
575
|
+
operands,
|
|
576
|
+
// `CopyDataProperties` returns nothing a JS consumer ever reads, but the
|
|
577
|
+
// IR layer still needs a citable anchor for this operation's own lineage
|
|
578
|
+
// (`ir/lower-operands.ts`'s `requireLineage`/`anchorResultOf` finds none
|
|
579
|
+
// in an empty `results`) -- the same reason `producers/allocations.ts`'s
|
|
580
|
+
// own property-install operations publish the RECEIVER as their result
|
|
581
|
+
// even though nothing reads it either.
|
|
582
|
+
results: [mintResult(id, 'value', receiverType)],
|
|
583
|
+
// Unlike iterator/enumerate spread, `CopyDataProperties` on a null/undefined
|
|
584
|
+
// source is a defined no-op, not a `TypeError` -- but reading an own
|
|
585
|
+
// property can still invoke a getter that throws, so this stays throwing.
|
|
586
|
+
completion: throwingCompletion,
|
|
587
|
+
effects: { readsMutableState: true, writesMutableState: true, allocates: false, callsUserCode: true },
|
|
588
|
+
evaluationOrdinal: candidate.evaluationOrdinal
|
|
589
|
+
};
|
|
590
|
+
return { kind: 'operations', operations: [operation], edges: valueEdgesInto(id, operands) };
|
|
591
|
+
};
|
|
592
|
+
const contributeIterationSpread = (context, candidate, node) => {
|
|
593
|
+
// `...arguments` in an invocation is sourced by the CONSUMER, not here.
|
|
594
|
+
// `resolveExpressionOperand` resolves an identifier's value through its
|
|
595
|
+
// declaration, and the magic `arguments` binding has none, so this producer
|
|
596
|
+
// reaches the `!source` refusal below and takes the whole enclosing function
|
|
597
|
+
// with it -- for a spread `spread-arguments.ts` already knows how to read
|
|
598
|
+
// (it calls `argumentsObjectValueAt` directly, minting the phantom rest
|
|
599
|
+
// slot's own read against the invocation's candidate).
|
|
600
|
+
//
|
|
601
|
+
// Scoped to exactly the two parents that consumer serves: `invocations.ts`
|
|
602
|
+
// routes both call and construct through `buildArgumentOperands`. An array
|
|
603
|
+
// literal is deliberately NOT included -- `allocations.ts` has no
|
|
604
|
+
// `arguments` case, so yielding no steps there would elide the iteration and
|
|
605
|
+
// put nothing in its place, which is the same fail-closed reason the JSX
|
|
606
|
+
// child spread is excluded below.
|
|
607
|
+
const consumerSourcesArguments = ts.isCallExpression(node.parent) || ts.isNewExpression(node.parent);
|
|
608
|
+
if (consumerSourcesArguments && isArgumentsObjectIdentifier(node.expression, context.checker)) {
|
|
609
|
+
return { kind: 'operations', operations: [], edges: [] };
|
|
610
|
+
}
|
|
611
|
+
const source = resolveExpressionOperand(context, node.expression);
|
|
612
|
+
if (!source) {
|
|
613
|
+
return {
|
|
614
|
+
kind: 'blocked',
|
|
615
|
+
blocker: blocked(candidate.id, 'protocol', 'no normalized operation identifies the spread source expression value', null)
|
|
616
|
+
};
|
|
617
|
+
}
|
|
618
|
+
// The two source shapes whose iteration is settled before the program runs,
|
|
619
|
+
// in the two contexts that consume them without an iterator:
|
|
620
|
+
//
|
|
621
|
+
// - a plain `T[]`/`Array<T>` RANGE-COPIED: `[...xs, 1]` reads this exact
|
|
622
|
+
// spread element's own operand (role `spread`, `allocations.ts`) and
|
|
623
|
+
// `f(a, ...xs)` reads it under role `spread-argument`
|
|
624
|
+
// (`spread-arguments.ts`), and both end at the same `appendRange` into a
|
|
625
|
+
// freshly built array (`emit-arrays.ts`).
|
|
626
|
+
// - a CLOSED TUPLE expanded positionally: `tuple-spread.ts` mints one
|
|
627
|
+
// `[[Get]]` per position and the consuming producer cites those reads
|
|
628
|
+
// directly.
|
|
629
|
+
//
|
|
630
|
+
// Minting iterator steps for either would publish a `get-iterator`/`next`
|
|
631
|
+
// pair nobody cites, demand the iterator runtime helpers of a program that
|
|
632
|
+
// performs no iteration, and -- for a tuple -- hand every position the UNION
|
|
633
|
+
// of the tuple's element types, since `iterationElementType` has no
|
|
634
|
+
// per-step answer to give. It measurably emitted exactly that: before the
|
|
635
|
+
// call-argument half of this bypass existed, `sumRest(1, ...xs)` emitted a
|
|
636
|
+
// live `gea::Iterator<double>` plus one `arrayNext()`/`done()` pair
|
|
637
|
+
// alongside the `appendRange` that actually performed the spread.
|
|
638
|
+
//
|
|
639
|
+
// Scoped to the three parents that consume it: a JSX spread child
|
|
640
|
+
// (`<div>{...kids}</div>`) is refused by `producers/jsx.ts` and has no
|
|
641
|
+
// operand of its own to cite, so a bypass there would elide the steps and
|
|
642
|
+
// put nothing in their place.
|
|
643
|
+
const consumedWithoutIterator = ts.isArrayLiteralExpression(node.parent) || ts.isCallExpression(node.parent) || ts.isNewExpression(node.parent);
|
|
644
|
+
if (consumedWithoutIterator &&
|
|
645
|
+
(hasNativeIterationCursor(context, source.type) || closedTupleElementTypesOf(context, source.type) !== null)) {
|
|
646
|
+
return { kind: 'operations', operations: [], edges: [] };
|
|
647
|
+
}
|
|
648
|
+
// Everything else keeps its steps. When the source is a provably plain
|
|
649
|
+
// `T[]` reaching here (a context none of the three above), those steps need
|
|
650
|
+
// no dynamic `Symbol.iterator` lookup any more than a `for`-`of` over the
|
|
651
|
+
// same array would (`control.ts`'s `contributeForOfIn` makes the identical
|
|
652
|
+
// call): `get-method` is skipped and `get-iterator` takes the array-native
|
|
653
|
+
// fast path.
|
|
654
|
+
const arrayFastPath = hasNativeIterationCursor(context, source.type);
|
|
655
|
+
const dynamicSource = isDynamicIterationSource(context, source.type);
|
|
656
|
+
const steps = mintIteratorSteps(context, candidate, 'iterator', { ...source, iterated: node.expression }, {
|
|
657
|
+
// A genuinely dynamic source resolves and calls @@iterator in the
|
|
658
|
+
// runtime helper. Keeping a synthetic `get-method` operation here
|
|
659
|
+
// would require a static symbol-key operand that this source does not
|
|
660
|
+
// have, then incorrectly ask `lower-protocol` to emit a native get.
|
|
661
|
+
includeGetMethod: !arrayFastPath && !dynamicSource,
|
|
662
|
+
// A spread element always drains its iterator to completion; there is no
|
|
663
|
+
// `break` inside a spread that would trigger `IteratorClose`.
|
|
664
|
+
includeClose: false,
|
|
665
|
+
// The allocation/invocation consumer drains this record through its
|
|
666
|
+
// gather operation. A speculative `next()` here would skip one value.
|
|
667
|
+
// An ARRAY LITERAL drains whatever record this mints, through its own
|
|
668
|
+
// gather step -- for a typed custom iterable (`[...new Range(1, 4)]`)
|
|
669
|
+
// exactly as for a dynamic one. A speculative `next()` here would eat
|
|
670
|
+
// the first value before the gather ever ran.
|
|
671
|
+
includeNext: !(consumedWithoutIterator && (dynamicSource || ts.isArrayLiteralExpression(node.parent)))
|
|
672
|
+
});
|
|
673
|
+
return { kind: 'operations', operations: steps.operations, edges: steps.edges };
|
|
674
|
+
};
|
|
675
|
+
/**
|
|
676
|
+
* `SpreadElement` covers both `f(...xs)` and `[...xs]` -- the census assigns
|
|
677
|
+
* one syntax kind to both contexts, and this producer treats them identically
|
|
678
|
+
* because the iteration protocol they invoke does not differ by context.
|
|
679
|
+
* `SpreadAssignment` is object-literal spread and is the only candidate routed
|
|
680
|
+
* to `contributeObjectSpread`.
|
|
681
|
+
*/
|
|
682
|
+
export const createProtocolProducer = (context) => {
|
|
683
|
+
const contribute = (candidate) => {
|
|
684
|
+
const node = candidate.node;
|
|
685
|
+
if (ts.isSpreadElement(node))
|
|
686
|
+
return contributeIterationSpread(context, candidate, node);
|
|
687
|
+
if (ts.isSpreadAssignment(node))
|
|
688
|
+
return contributeObjectSpread(context, candidate, node);
|
|
689
|
+
return {
|
|
690
|
+
kind: 'blocked',
|
|
691
|
+
blocker: blocked(candidate.id, 'protocol', 'protocol census produced a syntax kind this producer does not model', null)
|
|
692
|
+
};
|
|
693
|
+
};
|
|
694
|
+
return { family: 'protocol', contribute };
|
|
695
|
+
};
|