@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,923 @@
|
|
|
1
|
+
import ts from 'typescript';
|
|
2
|
+
import { operationId, semanticResultId } from '../../../identity/ids.js';
|
|
3
|
+
import { normalCompletion, pureEffects } from '../../model/operands.js';
|
|
4
|
+
import { familyOf, isFieldInitializerBody } from '../census.js';
|
|
5
|
+
import { blocked, mintOperationId, mintResult, operand } from './mint.js';
|
|
6
|
+
import { contributePlainLoop, contributeTailTestedLoop } from './control-loops.js';
|
|
7
|
+
import { resolveExpressionOperand } from './boundary.js';
|
|
8
|
+
import { isDynamicIterationSource, mintIteratorSteps } from './protocol.js';
|
|
9
|
+
import { hasNativeEnumerationCursor, hasNativeIterationCursor, isGeneratorType, valueEdgesInto } from './shared.js';
|
|
10
|
+
const isFunctionLike = (node) => ts.isFunctionDeclaration(node) ||
|
|
11
|
+
ts.isFunctionExpression(node) ||
|
|
12
|
+
ts.isArrowFunction(node) ||
|
|
13
|
+
ts.isMethodDeclaration(node) ||
|
|
14
|
+
ts.isConstructorDeclaration(node) ||
|
|
15
|
+
ts.isGetAccessorDeclaration(node) ||
|
|
16
|
+
ts.isSetAccessorDeclaration(node);
|
|
17
|
+
const isFunctionBoundary = (node) => isFunctionLike(node) || ts.isClassStaticBlockDeclaration(node);
|
|
18
|
+
const isIterationStatement = (node) => ts.isForStatement(node) || ts.isForOfStatement(node) || ts.isForInStatement(node) || ts.isWhileStatement(node) || ts.isDoStatement(node);
|
|
19
|
+
const isWithin = (node, ancestor) => {
|
|
20
|
+
let current = node;
|
|
21
|
+
while (current) {
|
|
22
|
+
if (current === ancestor)
|
|
23
|
+
return true;
|
|
24
|
+
current = current.parent;
|
|
25
|
+
}
|
|
26
|
+
return false;
|
|
27
|
+
};
|
|
28
|
+
const enclosingTryStatement = (node) => {
|
|
29
|
+
let current = node.parent;
|
|
30
|
+
while (current) {
|
|
31
|
+
if (isFunctionBoundary(current))
|
|
32
|
+
return null;
|
|
33
|
+
if (ts.isTryStatement(current))
|
|
34
|
+
return current;
|
|
35
|
+
current = current.parent;
|
|
36
|
+
}
|
|
37
|
+
return null;
|
|
38
|
+
};
|
|
39
|
+
/**
|
|
40
|
+
* The nearest enclosing `finally` that intercepts an abrupt completion
|
|
41
|
+
* starting at `node`, or `null` if none does before the function boundary.
|
|
42
|
+
*
|
|
43
|
+
* A `finally` never intercepts a completion that originates *inside itself*
|
|
44
|
+
* -- that would route a return-inside-finally back onto its own boundary
|
|
45
|
+
* instead of past it -- so the walk skips a `TryStatement` whose
|
|
46
|
+
* `finallyBlock` already contains `node` and keeps looking further out from
|
|
47
|
+
* there. This is what keeps a `return` written inside a `finally` block from
|
|
48
|
+
* being flattened into an ordinary, unremarkable return.
|
|
49
|
+
*/
|
|
50
|
+
const nearestInterceptingFinally = (node) => {
|
|
51
|
+
let current = node;
|
|
52
|
+
while (true) {
|
|
53
|
+
const containingTry = enclosingTryStatement(current);
|
|
54
|
+
if (!containingTry)
|
|
55
|
+
return null;
|
|
56
|
+
const insideFinally = containingTry.finallyBlock !== undefined && isWithin(current, containingTry.finallyBlock);
|
|
57
|
+
if (!insideFinally && containingTry.finallyBlock)
|
|
58
|
+
return containingTry.finallyBlock;
|
|
59
|
+
current = containingTry;
|
|
60
|
+
}
|
|
61
|
+
};
|
|
62
|
+
/**
|
|
63
|
+
* The nearest enclosing `catch`/`finally` a `throw` at `node` is routed to.
|
|
64
|
+
*
|
|
65
|
+
* A throw inside a `tryBlock` goes to that try's own `catch` if it has one,
|
|
66
|
+
* else its `finally` if it has one. A throw inside the `catch` clause itself
|
|
67
|
+
* cannot re-target that same catch (there is no recursive self-handling), so
|
|
68
|
+
* it looks only at that try's `finally`. A throw inside the `finally` skips
|
|
69
|
+
* this try entirely -- symmetric with `nearestInterceptingFinally` above.
|
|
70
|
+
*/
|
|
71
|
+
const nearestInterceptingHandler = (node) => {
|
|
72
|
+
let current = node;
|
|
73
|
+
while (true) {
|
|
74
|
+
const containingTry = enclosingTryStatement(current);
|
|
75
|
+
if (!containingTry)
|
|
76
|
+
return null;
|
|
77
|
+
const insideFinally = containingTry.finallyBlock !== undefined && isWithin(current, containingTry.finallyBlock);
|
|
78
|
+
const insideCatch = containingTry.catchClause !== undefined && isWithin(current, containingTry.catchClause);
|
|
79
|
+
if (!insideFinally && !insideCatch) {
|
|
80
|
+
if (containingTry.catchClause)
|
|
81
|
+
return { kind: 'catch', node: containingTry.catchClause };
|
|
82
|
+
if (containingTry.finallyBlock)
|
|
83
|
+
return { kind: 'finally', node: containingTry.finallyBlock };
|
|
84
|
+
}
|
|
85
|
+
else if (insideCatch && containingTry.finallyBlock) {
|
|
86
|
+
return { kind: 'finally', node: containingTry.finallyBlock };
|
|
87
|
+
}
|
|
88
|
+
current = containingTry;
|
|
89
|
+
}
|
|
90
|
+
};
|
|
91
|
+
const nearestLabeledStatement = (node, labelText) => {
|
|
92
|
+
let current = node.parent;
|
|
93
|
+
while (current && !isFunctionBoundary(current)) {
|
|
94
|
+
if (ts.isLabeledStatement(current) && current.label.text === labelText)
|
|
95
|
+
return current;
|
|
96
|
+
current = current.parent;
|
|
97
|
+
}
|
|
98
|
+
return null;
|
|
99
|
+
};
|
|
100
|
+
/**
|
|
101
|
+
* Where an unlabelled/labelled `break`/`continue` transfers control, resolved
|
|
102
|
+
* entirely by walking the enclosing syntax that ECMAScript itself defines a
|
|
103
|
+
* label's binding over, then converting the *resolved node* -- never the
|
|
104
|
+
* label's spelling -- into an identity.
|
|
105
|
+
*/
|
|
106
|
+
const resolveBreakContinueTarget = (context, node, form) => {
|
|
107
|
+
if (node.label) {
|
|
108
|
+
const labeled = nearestLabeledStatement(node, node.label.text);
|
|
109
|
+
if (!labeled)
|
|
110
|
+
return null;
|
|
111
|
+
if (form === 'continue') {
|
|
112
|
+
// `continue label` re-enters the labelled loop; it never targets the
|
|
113
|
+
// generic label-target boundary below, which only marks "exit past
|
|
114
|
+
// here" and is meaningless as a place to resume iterating from.
|
|
115
|
+
return isIterationStatement(labeled.statement) ? operationId(context.identities.nodeIdOf(labeled.statement), 'control', 0) : null;
|
|
116
|
+
}
|
|
117
|
+
// `break label` over a labelled iteration exits that iteration itself.
|
|
118
|
+
// Naming the loop gives lowering its real exit block directly; a label is
|
|
119
|
+
// not a second runtime control frame around the loop.
|
|
120
|
+
if (isIterationStatement(labeled.statement))
|
|
121
|
+
return operationId(context.identities.nodeIdOf(labeled.statement), 'control', 0);
|
|
122
|
+
return operationId(context.identities.nodeIdOf(labeled), 'boundary', 0);
|
|
123
|
+
}
|
|
124
|
+
let current = node.parent;
|
|
125
|
+
while (current && !isFunctionBoundary(current)) {
|
|
126
|
+
if (form === 'continue' && isIterationStatement(current))
|
|
127
|
+
return operationId(context.identities.nodeIdOf(current), 'control', 0);
|
|
128
|
+
if (form === 'break' && (isIterationStatement(current) || ts.isSwitchStatement(current))) {
|
|
129
|
+
return operationId(context.identities.nodeIdOf(current), 'control', 0);
|
|
130
|
+
}
|
|
131
|
+
current = current.parent;
|
|
132
|
+
}
|
|
133
|
+
return null;
|
|
134
|
+
};
|
|
135
|
+
const blockedContribution = (candidate, reason) => ({
|
|
136
|
+
kind: 'blocked',
|
|
137
|
+
blocker: blocked(candidate.id, 'control', reason, null)
|
|
138
|
+
});
|
|
139
|
+
const contributeBranch = (context, candidate, node) => {
|
|
140
|
+
const guard = resolveExpressionOperand(context, node.expression);
|
|
141
|
+
if (!guard)
|
|
142
|
+
return blockedContribution(candidate, 'no normalized operation identifies the if-condition value');
|
|
143
|
+
const id = mintOperationId(context.ordinals, candidate.id, 'control');
|
|
144
|
+
const operation = {
|
|
145
|
+
family: 'control',
|
|
146
|
+
id,
|
|
147
|
+
form: 'branch',
|
|
148
|
+
caller: candidate.caller,
|
|
149
|
+
operands: [operand('condition', 0, guard.source, guard.type)],
|
|
150
|
+
results: [],
|
|
151
|
+
completion: normalCompletion,
|
|
152
|
+
effects: pureEffects,
|
|
153
|
+
evaluationOrdinal: candidate.evaluationOrdinal
|
|
154
|
+
};
|
|
155
|
+
// Gating the then/else branch's own operations on this guard needs the
|
|
156
|
+
// identities of whatever those branches contain, which this producer -- one
|
|
157
|
+
// candidate at a time -- cannot see; no other producer file exposes a
|
|
158
|
+
// census-to-operation index either. Recorded as a known gap, not modelled.
|
|
159
|
+
return { kind: 'operations', operations: [operation], edges: [] };
|
|
160
|
+
};
|
|
161
|
+
const contributeForOfIn = (context, candidate, node) => {
|
|
162
|
+
const source = resolveExpressionOperand(context, node.expression);
|
|
163
|
+
if (!source)
|
|
164
|
+
return blockedContribution(candidate, 'no normalized operation identifies the for-of/for-in iterated expression value');
|
|
165
|
+
const isForOf = ts.isForOfStatement(node);
|
|
166
|
+
const isAwait = isForOf && node.awaitModifier !== undefined;
|
|
167
|
+
const protocol = isForOf ? (isAwait ? 'async-iterator' : 'iterator') : 'enumerate';
|
|
168
|
+
// A sync `for`-`of` over a source whose iteration is settled before the
|
|
169
|
+
// program runs never needs a dynamic `Symbol.iterator` lookup at all: a
|
|
170
|
+
// plain `T[]` (ECMA-262 23.1.5), a `Set<T>` (24.2.3.10) and a `string`
|
|
171
|
+
// (22.1.3.36) are each a fixed walk over storage already in hand, so this
|
|
172
|
+
// loop lowers as an ordinary head-tested loop over a native
|
|
173
|
+
// `gea::Iterator<T>` cursor (`runtime-helper-key.ts`'s
|
|
174
|
+
// `protocol:iterator:*` claims, `publish.ts`'s
|
|
175
|
+
// `nativeCursorIteratorOf`) instead of the general sync-iterator protocol.
|
|
176
|
+
// `for`-`in` enumerates keys, a different protocol entirely, and `for await`
|
|
177
|
+
// suspends per iteration, which the native cursor has no representation for
|
|
178
|
+
// -- neither qualifies. A `Map` does not qualify either: see
|
|
179
|
+
// `isNativeIterableSetType` for why its `[K, V]` pair has no cursor carrier.
|
|
180
|
+
// `for`-`in` over a native key table takes the identical reshape: its two
|
|
181
|
+
// steps are the same two, the cursor it walks is the same
|
|
182
|
+
// `gea::Iterator<std::string>`, and the only difference is that the storage
|
|
183
|
+
// being walked is the table's key list rather than its elements. A record,
|
|
184
|
+
// a class instance and a named interface/type-alias reshape the identical
|
|
185
|
+
// way, walking a compile-time field-name snapshot instead of a runtime
|
|
186
|
+
// table -- see `hasNativeEnumerationCursor`'s own doc for which receivers
|
|
187
|
+
// qualify and how the one genuinely unsafe sub-case (a host-bound named
|
|
188
|
+
// type) stays caught, downstream, at preflight rather than here.
|
|
189
|
+
const arrayFastPath = isForOf
|
|
190
|
+
? !isAwait && hasNativeIterationCursor(context, source.type)
|
|
191
|
+
: hasNativeEnumerationCursor(context, source.type);
|
|
192
|
+
const dynamicSource = isDynamicIterationSource(context, source.type);
|
|
193
|
+
const nativeGeneratorSource = isForOf && !isAwait && isGeneratorType(context, source.type);
|
|
194
|
+
// Every general synchronous iterator record needs IteratorClose routing.
|
|
195
|
+
// Native array/string/set cursors keep their storage walk and are never
|
|
196
|
+
// boxed; a typed custom iterable reaches the same protected region through
|
|
197
|
+
// its concrete record carrier, while a genuinely dynamic source keeps its
|
|
198
|
+
// Value carrier.
|
|
199
|
+
const steps = mintIteratorSteps(context, candidate, protocol, { ...source, iterated: node.expression }, {
|
|
200
|
+
includeGetMethod: !arrayFastPath && isForOf && !dynamicSource,
|
|
201
|
+
includeClose: isForOf && !isAwait && (!arrayFastPath || nativeGeneratorSource)
|
|
202
|
+
});
|
|
203
|
+
const id = mintOperationId(context.ordinals, candidate.id, 'control');
|
|
204
|
+
// Every shape but `for await`-`of` reshapes into an ordinary head-tested
|
|
205
|
+
// loop -- the array/enumeration fast path exactly as before, and now the
|
|
206
|
+
// sync general dynamic-protocol path too (a source neither
|
|
207
|
+
// `hasNativeIterationCursor` nor `hasNativeEnumerationCursor` claims a
|
|
208
|
+
// native cursor for): a `'condition'` operand instead of `'iterator-record'`
|
|
209
|
+
// makes the loop structurally indistinguishable, to every downstream
|
|
210
|
+
// generic consumer (`lower-graph.ts`'s guard detection, `lowerControl`'s
|
|
211
|
+
// 'loop' case, `lower-flow.ts`'s back-edge logic), from a plain
|
|
212
|
+
// `while`/counted `for` -- none of those files need to know this loop is
|
|
213
|
+
// iterator-driven, or which of the two protocol shapes drives it.
|
|
214
|
+
// `lower-protocol.ts`'s `lowerProtocol` already lowers `get-iterator` and
|
|
215
|
+
// `next` (value and done) generically for both -- native cursor and real
|
|
216
|
+
// dynamic dispatch alike -- so nothing downstream of this reshape needed
|
|
217
|
+
// to change for the general case to start working; this producer was the
|
|
218
|
+
// one holdout still building the un-lowerable `iterator-record` shape for
|
|
219
|
+
// it. `for await`-`of` alone stays excluded: its `next` can suspend
|
|
220
|
+
// (`canSuspend: protocol === 'async-iterator'`, `protocol.ts`), and this
|
|
221
|
+
// reshape says nothing about how a condition re-tested every iteration
|
|
222
|
+
// interacts with a suspension point -- that question is exactly as
|
|
223
|
+
// unanswered as it was before this change, so it stays the one shape this
|
|
224
|
+
// function still refuses by name, below.
|
|
225
|
+
// `for await`-`of` reshapes identically, and the suspension question that
|
|
226
|
+
// once excluded it is answered rather than dodged: `gea::Promise<V>` is a
|
|
227
|
+
// settled-value box with no job queue, so every `await` this compiler emits
|
|
228
|
+
// is a synchronous read and an async `next()` hands back an already-settled
|
|
229
|
+
// result. There is no suspension point for a re-tested condition to interact
|
|
230
|
+
// WITH. The step still carries `canSuspend` (`protocol.ts`) because that
|
|
231
|
+
// states what the LANGUAGE does, which stays true; what changed is that this
|
|
232
|
+
// runtime's own answer to it is now written down instead of treated as
|
|
233
|
+
// unknown. A port that grows a real job queue must revisit this together
|
|
234
|
+
// with `await`, `Promise::then` and the async-generator `yield` -- all four
|
|
235
|
+
// rest on the one fact, and none of them is separable from the others.
|
|
236
|
+
{
|
|
237
|
+
// The condition is `!done`, recomputed every iteration from `next`'s own
|
|
238
|
+
// 'completion' result. None of get-iterator/next/this negation has a
|
|
239
|
+
// source `ts.Node` of its own, so `gating.ts` gates them by directly
|
|
240
|
+
// reconstructing their fixed operation ids rather than by visiting one.
|
|
241
|
+
// For the sync general path (unlike the fast path) `get-method` is also
|
|
242
|
+
// minted, at protocol ordinal 0 -- `gating.ts`'s own reconstruction does
|
|
243
|
+
// not yet gate that ordinal at all, having only ever needed to gate
|
|
244
|
+
// ordinals 1 (get-iterator) and 2 (next) for the fast path, where
|
|
245
|
+
// ordinal 0 is reserved but never minted. Whether that gap is load-
|
|
246
|
+
// bearing here -- whether an operation this pass never places under any
|
|
247
|
+
// gate still lands in the correct, once-per-loop scope by construction,
|
|
248
|
+
// via its own evaluation edge into get-iterator -- is exactly what
|
|
249
|
+
// landing this reshape on its own is meant to measure, before anyone
|
|
250
|
+
// opens `gating.ts` to widen it.
|
|
251
|
+
const boolType = context.table.intern({ kind: 'primitive', primitive: 'boolean' });
|
|
252
|
+
const negationId = mintOperationId(context.ordinals, candidate.id, 'computation');
|
|
253
|
+
const negationOperand = operand('operand', 0, { kind: 'result', result: semanticResultId(steps.nextOperationId, 'completion') }, boolType);
|
|
254
|
+
const negation = {
|
|
255
|
+
id: negationId,
|
|
256
|
+
family: 'computation',
|
|
257
|
+
caller: candidate.caller,
|
|
258
|
+
form: 'unary',
|
|
259
|
+
operator: '!',
|
|
260
|
+
operands: [negationOperand],
|
|
261
|
+
results: [mintResult(negationId, 'value', boolType)],
|
|
262
|
+
completion: normalCompletion,
|
|
263
|
+
effects: pureEffects,
|
|
264
|
+
evaluationOrdinal: candidate.evaluationOrdinal
|
|
265
|
+
};
|
|
266
|
+
const loopOperation = {
|
|
267
|
+
family: 'control',
|
|
268
|
+
id,
|
|
269
|
+
form: 'loop',
|
|
270
|
+
iteratorClose: steps.closeOperationId,
|
|
271
|
+
caller: candidate.caller,
|
|
272
|
+
operands: [operand('condition', 0, { kind: 'result', result: semanticResultId(negationId, 'value') }, boolType)],
|
|
273
|
+
results: [],
|
|
274
|
+
completion: normalCompletion,
|
|
275
|
+
effects: pureEffects,
|
|
276
|
+
evaluationOrdinal: candidate.evaluationOrdinal
|
|
277
|
+
};
|
|
278
|
+
const edges = [
|
|
279
|
+
...steps.edges,
|
|
280
|
+
{ kind: 'evaluation', from: steps.nextOperationId, to: negationId },
|
|
281
|
+
...valueEdgesInto(negationId, [negationOperand]),
|
|
282
|
+
{ kind: 'evaluation', from: negationId, to: id }
|
|
283
|
+
];
|
|
284
|
+
return { kind: 'operations', operations: [...steps.operations, negation, loopOperation], edges };
|
|
285
|
+
}
|
|
286
|
+
};
|
|
287
|
+
/**
|
|
288
|
+
* The test one `case` clause performs, named the way every cross-file citation
|
|
289
|
+
* in this compiler is: recomputed from the clause's own node, never looked up.
|
|
290
|
+
*
|
|
291
|
+
* `gating.ts` needs it to gate the clause's statements, and `contributeSwitch`
|
|
292
|
+
* mints it. Neither may guess at the other's spelling.
|
|
293
|
+
*/
|
|
294
|
+
export const citeSwitchCaseTest = (clause, identities) => semanticResultId(operationId(identities.nodeIdOf(clause), 'computation', 0), 'value');
|
|
295
|
+
/**
|
|
296
|
+
* The test a GROUP of clauses performs, for the second and later members of one.
|
|
297
|
+
*
|
|
298
|
+
* `case A: case B: body` is one guarded arm whose test is `A || B`, and
|
|
299
|
+
* `contributeSwitch` mints that disjunction as a second computation on the
|
|
300
|
+
* clause that closes it -- ordinal 1, beside the clause's own equality at
|
|
301
|
+
* ordinal 0. A group of one has no disjunction to name; its guard is
|
|
302
|
+
* `citeSwitchCaseTest` above.
|
|
303
|
+
*/
|
|
304
|
+
export const citeSwitchGroupTest = (clause, identities) => semanticResultId(operationId(identities.nodeIdOf(clause), 'computation', 1), 'value');
|
|
305
|
+
/**
|
|
306
|
+
* A sufficient proof that evaluation cannot produce a normal completion.
|
|
307
|
+
* ECMA-262 (2025), StatementList and IfStatement evaluation: a block passes
|
|
308
|
+
* through its final completion, and an if can complete normally if either arm
|
|
309
|
+
* can. Unknown forms stay unproven; in particular a nested loop can consume a
|
|
310
|
+
* break, and a finally can override a pending return.
|
|
311
|
+
*
|
|
312
|
+
* Switch guard chains need this completion fact, not the spelling of the final
|
|
313
|
+
* statement. A block wrapping a return and an if whose arms both return cannot
|
|
314
|
+
* fall through any more than a bare return can.
|
|
315
|
+
*/
|
|
316
|
+
const alwaysAbrupt = (statement) => {
|
|
317
|
+
if (!statement)
|
|
318
|
+
return false;
|
|
319
|
+
if (ts.isBlock(statement))
|
|
320
|
+
return alwaysAbrupt(statement.statements[statement.statements.length - 1]);
|
|
321
|
+
if (ts.isIfStatement(statement))
|
|
322
|
+
return alwaysAbrupt(statement.thenStatement) && alwaysAbrupt(statement.elseStatement);
|
|
323
|
+
return (ts.isBreakStatement(statement) || ts.isReturnStatement(statement) || ts.isThrowStatement(statement) || ts.isContinueStatement(statement));
|
|
324
|
+
};
|
|
325
|
+
/**
|
|
326
|
+
* Whether a clause cannot complete normally -- so control never falls out of
|
|
327
|
+
* its bottom into the next clause. Asked here to mint the guards and in
|
|
328
|
+
* `gating.ts` to place the bodies, ONE answer for both.
|
|
329
|
+
*/
|
|
330
|
+
export const clauseTerminates = (clause) => alwaysAbrupt(clause.statements[clause.statements.length - 1]);
|
|
331
|
+
const contributeSwitch = (context, candidate, node) => {
|
|
332
|
+
const discriminant = resolveExpressionOperand(context, node.expression);
|
|
333
|
+
if (!discriminant)
|
|
334
|
+
return blockedContribution(candidate, 'no normalized operation identifies the switch discriminant value');
|
|
335
|
+
const clauses = node.caseBlock.clauses;
|
|
336
|
+
// A `default` written anywhere but last is legal and means something this
|
|
337
|
+
// chain cannot say: the language tries every `case` first and only then falls
|
|
338
|
+
// back, while a guard chain would take the default's arm the moment it is
|
|
339
|
+
// reached. Refused rather than reordered -- moving it would change which
|
|
340
|
+
// clause a fall-through reaches.
|
|
341
|
+
const defaultIndex = clauses.findIndex((clause) => ts.isDefaultClause(clause));
|
|
342
|
+
if (defaultIndex >= 0 && defaultIndex !== clauses.length - 1) {
|
|
343
|
+
return blockedContribution(candidate, 'a switch whose `default` clause is not the last one has no guard-chain form');
|
|
344
|
+
}
|
|
345
|
+
const id = mintOperationId(context.ordinals, candidate.id, 'control');
|
|
346
|
+
const operation = {
|
|
347
|
+
family: 'control',
|
|
348
|
+
id,
|
|
349
|
+
form: 'switch',
|
|
350
|
+
caller: candidate.caller,
|
|
351
|
+
operands: [operand('discriminant', 0, discriminant.source, discriminant.type)],
|
|
352
|
+
results: [],
|
|
353
|
+
completion: normalCompletion,
|
|
354
|
+
effects: pureEffects,
|
|
355
|
+
evaluationOrdinal: candidate.evaluationOrdinal
|
|
356
|
+
};
|
|
357
|
+
// One strict-equality test per `case`, keyed on the clause's own node so
|
|
358
|
+
// `gating.ts` can name it without this producer publishing an index. Strict
|
|
359
|
+
// by the specification: `CaseClauseIsSelected` is `IsStrictlyEqual`, so this
|
|
360
|
+
// is the identical operation `===` mints and it can neither coerce nor throw.
|
|
361
|
+
const operations = [operation];
|
|
362
|
+
const edges = [];
|
|
363
|
+
const booleanType = context.table.intern({ kind: 'primitive', primitive: 'boolean' });
|
|
364
|
+
// The guard a run of empty clauses has accumulated so far, or `null` outside
|
|
365
|
+
// one. An empty clause continues its group; a clause with statements closes
|
|
366
|
+
// it, and the next one starts a new group of its own.
|
|
367
|
+
let running = null;
|
|
368
|
+
for (const clause of clauses) {
|
|
369
|
+
if (!ts.isCaseClause(clause)) {
|
|
370
|
+
running = null;
|
|
371
|
+
continue;
|
|
372
|
+
}
|
|
373
|
+
const tested = resolveExpressionOperand(context, clause.expression);
|
|
374
|
+
if (!tested)
|
|
375
|
+
return blockedContribution(candidate, 'no normalized operation identifies a switch case expression');
|
|
376
|
+
const testId = operationId(context.identities.nodeIdOf(clause), 'computation', 0);
|
|
377
|
+
const operands = [
|
|
378
|
+
operand('left', 0, discriminant.source, discriminant.type),
|
|
379
|
+
operand('right', 0, tested.source, tested.type)
|
|
380
|
+
];
|
|
381
|
+
operations.push({
|
|
382
|
+
id: testId,
|
|
383
|
+
family: 'computation',
|
|
384
|
+
caller: candidate.caller,
|
|
385
|
+
form: 'equality',
|
|
386
|
+
operator: '===',
|
|
387
|
+
operands,
|
|
388
|
+
results: [mintResult(testId, 'value', booleanType)],
|
|
389
|
+
completion: normalCompletion,
|
|
390
|
+
effects: pureEffects,
|
|
391
|
+
evaluationOrdinal: candidate.evaluationOrdinal
|
|
392
|
+
});
|
|
393
|
+
edges.push(...valueEdgesInto(testId, operands));
|
|
394
|
+
let guard = semanticResultId(testId, 'value');
|
|
395
|
+
if (running !== null) {
|
|
396
|
+
// CaseClauseIsSelected stops at the first match. Gate the next label
|
|
397
|
+
// and equality on the accumulated guard's falsy arm, then join exactly
|
|
398
|
+
// as source-level || does. This preserves accessor/call effects and TDZ
|
|
399
|
+
// errors without trying to classify a label as safe to evaluate eagerly.
|
|
400
|
+
const foldId = operationId(context.identities.nodeIdOf(clause), 'computation', 1);
|
|
401
|
+
const foldOperands = [
|
|
402
|
+
operand('left', 0, { kind: 'result', result: running }, booleanType),
|
|
403
|
+
operand('right', 0, { kind: 'result', result: guard }, booleanType)
|
|
404
|
+
];
|
|
405
|
+
operations.push({
|
|
406
|
+
id: foldId,
|
|
407
|
+
family: 'computation',
|
|
408
|
+
caller: candidate.caller,
|
|
409
|
+
form: 'logical',
|
|
410
|
+
operator: '||',
|
|
411
|
+
operands: foldOperands,
|
|
412
|
+
results: [mintResult(foldId, 'value', booleanType)],
|
|
413
|
+
completion: normalCompletion,
|
|
414
|
+
effects: pureEffects,
|
|
415
|
+
evaluationOrdinal: candidate.evaluationOrdinal
|
|
416
|
+
});
|
|
417
|
+
edges.push(...valueEdgesInto(foldId, foldOperands));
|
|
418
|
+
guard = semanticResultId(foldId, 'value');
|
|
419
|
+
}
|
|
420
|
+
// A clause that can FALL THROUGH hands its guard to the next clause the
|
|
421
|
+
// way an empty one does: `case A: body; case B: more` runs `more` when
|
|
422
|
+
// `A` held and `body` completed normally, or when `B` held -- the very
|
|
423
|
+
// `A || B` disjunction the fold above mints, with `body` placed on the
|
|
424
|
+
// guard's own arm by `gating.ts` and a `break` inside it jumping to the
|
|
425
|
+
// switch's exit (`ir/lower-flow.ts`'s `switchExitOf`) past everything
|
|
426
|
+
// the disjunction would otherwise run. Falling into `default` needs no
|
|
427
|
+
// fold at all: the default's own gate is "no test on the chain held", and
|
|
428
|
+
// a guard handed forward is exactly one not on the chain.
|
|
429
|
+
running = clause.statements.length === 0 || !clauseTerminates(clause) ? guard : null;
|
|
430
|
+
}
|
|
431
|
+
return { kind: 'operations', operations, edges };
|
|
432
|
+
};
|
|
433
|
+
const contributeReturn = (context, candidate, node) => {
|
|
434
|
+
let valueOperand;
|
|
435
|
+
if (node.expression) {
|
|
436
|
+
const resolved = resolveExpressionOperand(context, node.expression);
|
|
437
|
+
if (!resolved)
|
|
438
|
+
return blockedContribution(candidate, 'no normalized operation identifies the returned value');
|
|
439
|
+
valueOperand = operand('value', 0, resolved.source, resolved.type);
|
|
440
|
+
}
|
|
441
|
+
else {
|
|
442
|
+
const undefinedType = context.table.intern({ kind: 'primitive', primitive: 'undefined' });
|
|
443
|
+
valueOperand = operand('value', 0, { kind: 'absent' }, undefinedType);
|
|
444
|
+
}
|
|
445
|
+
const id = mintOperationId(context.ordinals, candidate.id, 'control');
|
|
446
|
+
const operation = {
|
|
447
|
+
family: 'control',
|
|
448
|
+
id,
|
|
449
|
+
form: 'return',
|
|
450
|
+
caller: candidate.caller,
|
|
451
|
+
operands: [valueOperand],
|
|
452
|
+
results: [mintResult(id, 'completion', valueOperand.type)],
|
|
453
|
+
completion: { canThrow: false, canReturn: true, canBreak: false, canContinue: false, canSuspend: false },
|
|
454
|
+
effects: pureEffects,
|
|
455
|
+
evaluationOrdinal: candidate.evaluationOrdinal
|
|
456
|
+
};
|
|
457
|
+
const edges = [];
|
|
458
|
+
const finallyBlock = nearestInterceptingFinally(node);
|
|
459
|
+
if (finallyBlock) {
|
|
460
|
+
edges.push({
|
|
461
|
+
kind: 'completion',
|
|
462
|
+
from: id,
|
|
463
|
+
to: operationId(context.identities.nodeIdOf(finallyBlock), 'boundary', 0),
|
|
464
|
+
completion: 'return'
|
|
465
|
+
});
|
|
466
|
+
}
|
|
467
|
+
return { kind: 'operations', operations: [operation], edges };
|
|
468
|
+
};
|
|
469
|
+
/**
|
|
470
|
+
* The return an arrow function's expression body performs.
|
|
471
|
+
*
|
|
472
|
+
* There is no `ReturnStatement` here to normalize: `EvaluateBody` for an
|
|
473
|
+
* `ExpressionBody` *is* a return, so the operation belongs to the body
|
|
474
|
+
* expression's node under the control family, alongside the operation its own
|
|
475
|
+
* family publishes for the value. Leaving it out gives an arrow function that
|
|
476
|
+
* evaluates its body and then returns nothing -- a wrong answer that no later
|
|
477
|
+
* layer can see, because a body with no return looks exactly like a body that
|
|
478
|
+
* completes normally.
|
|
479
|
+
*/
|
|
480
|
+
const contributeImplicitReturn = (context, candidate, node) => {
|
|
481
|
+
const resolved = resolveExpressionOperand(context, node);
|
|
482
|
+
if (!resolved)
|
|
483
|
+
return blockedContribution(candidate, 'no normalized operation identifies the value an arrow function body returns');
|
|
484
|
+
const id = mintOperationId(context.ordinals, candidate.id, 'control');
|
|
485
|
+
const operation = {
|
|
486
|
+
family: 'control',
|
|
487
|
+
id,
|
|
488
|
+
form: 'return',
|
|
489
|
+
caller: candidate.caller,
|
|
490
|
+
operands: [operand('value', 0, resolved.source, resolved.type)],
|
|
491
|
+
results: [mintResult(id, 'completion', resolved.type)],
|
|
492
|
+
completion: { canThrow: false, canReturn: true, canBreak: false, canContinue: false, canSuspend: false },
|
|
493
|
+
effects: pureEffects,
|
|
494
|
+
evaluationOrdinal: candidate.evaluationOrdinal
|
|
495
|
+
};
|
|
496
|
+
// Neither a concise body nor a field initializer can sit inside a `try`, so
|
|
497
|
+
// no `finally` can intercept this return: the expression is the whole body.
|
|
498
|
+
return { kind: 'operations', operations: [operation], edges: [] };
|
|
499
|
+
};
|
|
500
|
+
const contributeThrow = (context, candidate, node) => {
|
|
501
|
+
const resolved = resolveExpressionOperand(context, node.expression);
|
|
502
|
+
if (!resolved)
|
|
503
|
+
return blockedContribution(candidate, 'no normalized operation identifies the thrown value');
|
|
504
|
+
const id = mintOperationId(context.ordinals, candidate.id, 'control');
|
|
505
|
+
const operation = {
|
|
506
|
+
family: 'control',
|
|
507
|
+
id,
|
|
508
|
+
form: 'throw',
|
|
509
|
+
caller: candidate.caller,
|
|
510
|
+
operands: [operand('value', 0, resolved.source, resolved.type)],
|
|
511
|
+
results: [mintResult(id, 'completion', resolved.type)],
|
|
512
|
+
completion: { canThrow: true, canReturn: false, canBreak: false, canContinue: false, canSuspend: false },
|
|
513
|
+
effects: pureEffects,
|
|
514
|
+
evaluationOrdinal: candidate.evaluationOrdinal
|
|
515
|
+
};
|
|
516
|
+
const edges = [];
|
|
517
|
+
const handler = nearestInterceptingHandler(node);
|
|
518
|
+
if (handler) {
|
|
519
|
+
const target = operationId(context.identities.nodeIdOf(handler.node), 'boundary', 0);
|
|
520
|
+
edges.push({ kind: 'completion', from: id, to: target, completion: 'throw' });
|
|
521
|
+
}
|
|
522
|
+
return { kind: 'operations', operations: [operation], edges };
|
|
523
|
+
};
|
|
524
|
+
const contributeBreakOrContinue = (context, candidate, node, form) => {
|
|
525
|
+
const id = mintOperationId(context.ordinals, candidate.id, 'control');
|
|
526
|
+
// `break`/`continue` carry no value -- ECMA-262's own completion record has
|
|
527
|
+
// an empty `[[Value]]` for both -- but every downstream consumer that must
|
|
528
|
+
// cite a `SemanticResultId` (the abrupt-edge obligation, the IR jump's own
|
|
529
|
+
// lineage) needs one to point at. An empty `results: []` starved both:
|
|
530
|
+
// `requireLineage` threw before the jump could be built at all, and
|
|
531
|
+
// `buildAbruptEdgeObligations`'s own `primaryResultOf` guard silently
|
|
532
|
+
// skipped the obligation instead of raising it, so a program using
|
|
533
|
+
// `break`/`continue` certified clean while never lowering the exit. The
|
|
534
|
+
// `void`-typed completion result mirrors the `try` control operation just
|
|
535
|
+
// below, which anchors the same way for the same reason and is likewise
|
|
536
|
+
// never materialized as an IR value.
|
|
537
|
+
const voidType = context.table.intern({ kind: 'primitive', primitive: 'void' });
|
|
538
|
+
const operation = {
|
|
539
|
+
family: 'control',
|
|
540
|
+
id,
|
|
541
|
+
form,
|
|
542
|
+
caller: candidate.caller,
|
|
543
|
+
operands: [],
|
|
544
|
+
results: [mintResult(id, 'completion', voidType)],
|
|
545
|
+
completion: {
|
|
546
|
+
canThrow: false,
|
|
547
|
+
canReturn: false,
|
|
548
|
+
canBreak: form === 'break',
|
|
549
|
+
canContinue: form === 'continue',
|
|
550
|
+
canSuspend: false
|
|
551
|
+
},
|
|
552
|
+
effects: pureEffects,
|
|
553
|
+
evaluationOrdinal: candidate.evaluationOrdinal
|
|
554
|
+
};
|
|
555
|
+
// An intercepting `finally` always wins first: any abrupt completion passing
|
|
556
|
+
// through a try-with-finally, `break`/`continue` included, must be given
|
|
557
|
+
// the chance to be overridden before it reaches its ordinary target.
|
|
558
|
+
const finallyBlock = nearestInterceptingFinally(node);
|
|
559
|
+
if (finallyBlock) {
|
|
560
|
+
const to = operationId(context.identities.nodeIdOf(finallyBlock), 'boundary', 0);
|
|
561
|
+
return { kind: 'operations', operations: [operation], edges: [{ kind: 'completion', from: id, to, completion: form }] };
|
|
562
|
+
}
|
|
563
|
+
const target = resolveBreakContinueTarget(context, node, form);
|
|
564
|
+
if (!target)
|
|
565
|
+
return blockedContribution(candidate, `no ${form} target could be resolved; program may not type-check`);
|
|
566
|
+
return { kind: 'operations', operations: [operation], edges: [{ kind: 'completion', from: id, to: target, completion: form }] };
|
|
567
|
+
};
|
|
568
|
+
const contributeLabeled = (context, candidate, node) => {
|
|
569
|
+
const controlId = mintOperationId(context.ordinals, candidate.id, 'control');
|
|
570
|
+
const controlOperation = {
|
|
571
|
+
family: 'control',
|
|
572
|
+
id: controlId,
|
|
573
|
+
form: 'label',
|
|
574
|
+
caller: candidate.caller,
|
|
575
|
+
operands: [],
|
|
576
|
+
results: [],
|
|
577
|
+
completion: normalCompletion,
|
|
578
|
+
effects: pureEffects,
|
|
579
|
+
evaluationOrdinal: candidate.evaluationOrdinal
|
|
580
|
+
};
|
|
581
|
+
// The label-target boundary is a separate operation from the `'label'`
|
|
582
|
+
// control operation above: the former is what `break label;` completion
|
|
583
|
+
// edges actually point at (`resolveBreakContinueTarget`), the latter is the
|
|
584
|
+
// labelled statement's own structural presence in the CFG.
|
|
585
|
+
const targetId = mintOperationId(context.ordinals, candidate.id, 'boundary');
|
|
586
|
+
const targetOperation = {
|
|
587
|
+
family: 'boundary',
|
|
588
|
+
id: targetId,
|
|
589
|
+
boundary: 'label-target',
|
|
590
|
+
caller: candidate.caller,
|
|
591
|
+
operands: [],
|
|
592
|
+
results: [],
|
|
593
|
+
completion: normalCompletion,
|
|
594
|
+
effects: pureEffects,
|
|
595
|
+
evaluationOrdinal: candidate.evaluationOrdinal
|
|
596
|
+
};
|
|
597
|
+
const edges = [];
|
|
598
|
+
const bodyFamily = familyOf(node.statement, context.namespacePaths);
|
|
599
|
+
if (bodyFamily) {
|
|
600
|
+
edges.push({ kind: 'evaluation', from: controlId, to: operationId(context.identities.nodeIdOf(node.statement), bodyFamily, 0) });
|
|
601
|
+
}
|
|
602
|
+
return { kind: 'operations', operations: [controlOperation, targetOperation], edges };
|
|
603
|
+
};
|
|
604
|
+
const contributeTry = (context, candidate, node) => {
|
|
605
|
+
const id = mintOperationId(context.ordinals, candidate.id, 'control');
|
|
606
|
+
const voidType = context.table.intern({ kind: 'primitive', primitive: 'void' });
|
|
607
|
+
const tryOperation = {
|
|
608
|
+
family: 'control',
|
|
609
|
+
id,
|
|
610
|
+
form: 'try',
|
|
611
|
+
caller: candidate.caller,
|
|
612
|
+
operands: [],
|
|
613
|
+
results: [mintResult(id, 'completion', voidType)],
|
|
614
|
+
completion: normalCompletion,
|
|
615
|
+
effects: pureEffects,
|
|
616
|
+
evaluationOrdinal: candidate.evaluationOrdinal
|
|
617
|
+
};
|
|
618
|
+
const operations = [tryOperation];
|
|
619
|
+
const edges = [];
|
|
620
|
+
// Exception routing *into* `catch` is not wired here: each throwing
|
|
621
|
+
// operation inside the try/catch block resolves its own nearest handler via
|
|
622
|
+
// `nearestInterceptingHandler`, because attributing that edge to the `try`
|
|
623
|
+
// operation itself would be false -- the try construct does not itself
|
|
624
|
+
// throw, only the operations nested inside it can. What *is* owed here is
|
|
625
|
+
// the unconditional normal-completion sequencing into `finally`, which runs
|
|
626
|
+
// after try/catch regardless of how either one completes.
|
|
627
|
+
if (node.finallyBlock) {
|
|
628
|
+
const finallyId = operationId(context.identities.nodeIdOf(node.finallyBlock), 'boundary', 0);
|
|
629
|
+
edges.push({ kind: 'evaluation', from: id, to: finallyId });
|
|
630
|
+
if (node.catchClause) {
|
|
631
|
+
const catchId = operationId(context.identities.nodeIdOf(node.catchClause), 'boundary', 0);
|
|
632
|
+
edges.push({ kind: 'evaluation', from: catchId, to: finallyId });
|
|
633
|
+
}
|
|
634
|
+
const finallyOperation = {
|
|
635
|
+
family: 'boundary',
|
|
636
|
+
id: finallyId,
|
|
637
|
+
boundary: 'finally-region',
|
|
638
|
+
caller: candidate.caller,
|
|
639
|
+
operands: [],
|
|
640
|
+
results: [],
|
|
641
|
+
completion: normalCompletion,
|
|
642
|
+
effects: pureEffects,
|
|
643
|
+
evaluationOrdinal: candidate.evaluationOrdinal
|
|
644
|
+
};
|
|
645
|
+
operations.push(finallyOperation);
|
|
646
|
+
}
|
|
647
|
+
return { kind: 'operations', operations, edges };
|
|
648
|
+
};
|
|
649
|
+
const contributeAwait = (context, candidate, node) => {
|
|
650
|
+
const operand_ = resolveExpressionOperand(context, node.expression);
|
|
651
|
+
if (!operand_)
|
|
652
|
+
return blockedContribution(candidate, 'no normalized operation identifies the awaited value');
|
|
653
|
+
const id = mintOperationId(context.ordinals, candidate.id, 'control');
|
|
654
|
+
// The checker already unwraps `Promise<T>` to `T` for the await expression's
|
|
655
|
+
// own type; publishing that is the resolved value, never a fabricated shape.
|
|
656
|
+
const resolvedType = context.types.typeAt(node);
|
|
657
|
+
const operation = {
|
|
658
|
+
family: 'control',
|
|
659
|
+
id,
|
|
660
|
+
form: 'await',
|
|
661
|
+
caller: candidate.caller,
|
|
662
|
+
operands: [operand('operand', 0, operand_.source, operand_.type)],
|
|
663
|
+
results: [mintResult(id, 'value', resolvedType)],
|
|
664
|
+
completion: { canThrow: true, canReturn: false, canBreak: false, canContinue: false, canSuspend: true },
|
|
665
|
+
effects: { ...pureEffects, callsUserCode: true },
|
|
666
|
+
evaluationOrdinal: candidate.evaluationOrdinal
|
|
667
|
+
};
|
|
668
|
+
const resumeId = mintOperationId(context.ordinals, candidate.id, 'boundary');
|
|
669
|
+
const resumeOperation = {
|
|
670
|
+
family: 'boundary',
|
|
671
|
+
id: resumeId,
|
|
672
|
+
boundary: 'async-resume',
|
|
673
|
+
caller: candidate.caller,
|
|
674
|
+
operands: [],
|
|
675
|
+
results: [mintResult(resumeId, 'value', resolvedType)],
|
|
676
|
+
completion: normalCompletion,
|
|
677
|
+
effects: pureEffects,
|
|
678
|
+
evaluationOrdinal: candidate.evaluationOrdinal
|
|
679
|
+
};
|
|
680
|
+
return {
|
|
681
|
+
kind: 'operations',
|
|
682
|
+
operations: [operation, resumeOperation],
|
|
683
|
+
edges: [{ kind: 'completion', from: id, to: resumeId, completion: 'suspend' }]
|
|
684
|
+
};
|
|
685
|
+
};
|
|
686
|
+
const contributeYield = (context, candidate, node) => {
|
|
687
|
+
// `context.types.typeAt(node)` is the checker's type of the YIELD
|
|
688
|
+
// EXPRESSION ITSELF -- ECMA-262 makes that the RESUME channel (what a
|
|
689
|
+
// later `.next(v)` sends back in, 27.5.3.2), not the value handed out. This
|
|
690
|
+
// IS what a consumer of the expression's own value gets (a `const x = yield
|
|
691
|
+
// 1` binds `x` to this, never to what was yielded out) -- so it is what the
|
|
692
|
+
// operation's own `'value'` result is minted with below, exactly the way
|
|
693
|
+
// `contributeAwait`'s suspend operation publishes the resumed value as its
|
|
694
|
+
// own result. A generator with no explicit `Generator<Y, R, N>` annotation
|
|
695
|
+
// leaves this `unknown`/`any`, which `representation/derive.ts` collapses
|
|
696
|
+
// to the cursor's honest "stores nothing" carrier rather than boxing it
|
|
697
|
+
// (see that file's `GeneratorDeclarationPolicy`) -- a read of `x` in such a
|
|
698
|
+
// program refuses downstream, by name, at emission, never here.
|
|
699
|
+
const resumeType = context.types.typeAt(node);
|
|
700
|
+
const operands = [];
|
|
701
|
+
const auxiliaryOperations = [];
|
|
702
|
+
const auxiliaryEdges = [];
|
|
703
|
+
if (node.asteriskToken) {
|
|
704
|
+
if (!node.expression)
|
|
705
|
+
return blockedContribution(candidate, 'yield* with no delegated expression is not valid syntax to model');
|
|
706
|
+
const source = resolveExpressionOperand(context, node.expression);
|
|
707
|
+
if (!source)
|
|
708
|
+
return blockedContribution(candidate, 'no normalized operation identifies the yield* delegated expression value');
|
|
709
|
+
// `yield*` is refused here rather than modelled and refused later. ECMA-262
|
|
710
|
+
// 27.5.3.7 makes delegation a LOOP -- pull a step from the inner iterator,
|
|
711
|
+
// yield it, repeat, forwarding `return`/`throw` -- and this expression
|
|
712
|
+
// position cannot hold a loop, for the same reason a spread's own drain
|
|
713
|
+
// cannot be built in one (`producers/protocol.ts`'s bypass comment). The
|
|
714
|
+
// steps below were being minted and then never lowered, so the program
|
|
715
|
+
// certified against `protocol:iterator:*` keys nothing consumed.
|
|
716
|
+
return blockedContribution(candidate, 'yield* delegates to another iterator, which is a loop over its steps; this expression position has no loop to build one in');
|
|
717
|
+
}
|
|
718
|
+
else if (node.expression) {
|
|
719
|
+
const resolved = resolveExpressionOperand(context, node.expression);
|
|
720
|
+
if (!resolved)
|
|
721
|
+
return blockedContribution(candidate, 'no normalized operation identifies the yielded value');
|
|
722
|
+
// The generator's own element type is a WRITE SET across every `yield`
|
|
723
|
+
// in its body, exactly as `return-bindings.ts` treats every `return`:
|
|
724
|
+
// what this OPERAND contributes is the YIELDED value's type, never the
|
|
725
|
+
// resume channel's -- that is the operation's own RESULT, minted below.
|
|
726
|
+
operands.push(operand('value', 0, resolved.source, resolved.type));
|
|
727
|
+
}
|
|
728
|
+
// A bare `yield;` yields `undefined` (the same fallback `contributeReturn`
|
|
729
|
+
// uses for a bare `return;`) and needs no operand at all: `emit.ts`'s
|
|
730
|
+
// `emitYield` already refuses a null operand rather than inventing one, so
|
|
731
|
+
// nothing here has to intern a placeholder type for it.
|
|
732
|
+
// ECMAScript's `yield` is an EXPRESSION: its value is what the NEXT
|
|
733
|
+
// `next(v)` sends in (ECMA-262 27.5.3.2). This backend's cursor
|
|
734
|
+
// (`gea::Iterator<E, TReturn, TNext>`, runtime/gea_runtime.h) carries a real
|
|
735
|
+
// resume channel now -- `co_yield`'s own awaiter hands back whatever
|
|
736
|
+
// `next(v)`/an abrupt `.return`/`.throw` injected -- so a `yield` whose own
|
|
737
|
+
// value is read is MODELLED here regardless of parent syntax; whether it
|
|
738
|
+
// can actually be RENDERED depends on whether `TNext` resolved to a native
|
|
739
|
+
// carrier for this generator, which `targets/cpp/emit.ts`'s `emitYield`
|
|
740
|
+
// checks and refuses by name if not.
|
|
741
|
+
// An `async function*` yield is ECMA-262 27.6.3.8 AsyncGeneratorYield: it
|
|
742
|
+
// AWAITS the yielded value, then suspends on a queue of pending `next`
|
|
743
|
+
// promises. Both halves are already no-ops in THIS runtime's async model,
|
|
744
|
+
// which is why the shape is rendered as the synchronous yield rather than
|
|
745
|
+
// refused.
|
|
746
|
+
//
|
|
747
|
+
// `gea::Promise<V>` is a settled-value box with no job queue, so every
|
|
748
|
+
// `await` this compiler emits is a synchronous read of an already-computed
|
|
749
|
+
// value and an async function's entire body has run to completion by the
|
|
750
|
+
// time it returns (`runtime/gea_runtime.h`, `Promise<V>`'s own class
|
|
751
|
+
// comment, and `Promise<V>::then`, which runs its callback immediately for
|
|
752
|
+
// the same reason). Under that model AsyncGeneratorYield's await is the
|
|
753
|
+
// identity, and the pending-`next` queue can never have more than the one
|
|
754
|
+
// caller standing at the suspension point -- so an async generator is
|
|
755
|
+
// exactly a synchronous cursor whose element is the awaited yielded type.
|
|
756
|
+
//
|
|
757
|
+
// This is the SAME documented deviation the runtime already ships and the
|
|
758
|
+
// shipping engine already makes (`gea::host::CameraPhotoPromise::then` is
|
|
759
|
+
// literally `return onResolved(photo)`); it is not a new one taken here. A
|
|
760
|
+
// port that grows a real job queue must revisit this together with `await`
|
|
761
|
+
// and `then`, not on its own -- all three rest on the one fact.
|
|
762
|
+
const id = mintOperationId(context.ordinals, candidate.id, 'control');
|
|
763
|
+
// A `yield` written as a whole statement discards its value by definition
|
|
764
|
+
// (ECMAScript never lets an ExpressionStatement's completion be observed),
|
|
765
|
+
// so this mints a `void` result for that shape -- present for `requireLineage`
|
|
766
|
+
// to anchor on (every operation needs one), but `void` is the one
|
|
767
|
+
// representation `ir/build.ts`'s `mintOptionalResult` never turns into an
|
|
768
|
+
// actual IR value, so nothing downstream ever asks this generator for a
|
|
769
|
+
// resume channel it does not use. That matters beyond tidiness: `resumeType`
|
|
770
|
+
// is the checker's type of the yield EXPRESSION, which for the
|
|
771
|
+
// overwhelmingly common unannotated generator is `unknown` -- a real,
|
|
772
|
+
// boxable `dynamic` carrier, not `undefined` -- and minting a result typed
|
|
773
|
+
// with it here would make a completely ordinary discarded `yield x;` start
|
|
774
|
+
// demanding a resume channel this generator never uses, in every program
|
|
775
|
+
// that yields at all. Every other position (bound to a variable, part of a
|
|
776
|
+
// larger expression) really does consume the value, and mints `resumeType`
|
|
777
|
+
// instead -- `targets/cpp/emit.ts`'s `emitYield` is what refuses it, by
|
|
778
|
+
// name, if `TNext` never resolved to a native carrier for this generator.
|
|
779
|
+
const discardedType = context.table.intern({ kind: 'primitive', primitive: 'void' });
|
|
780
|
+
const results = [mintResult(id, 'value', ts.isExpressionStatement(node.parent) ? discardedType : resumeType)];
|
|
781
|
+
const operation = {
|
|
782
|
+
family: 'control',
|
|
783
|
+
id,
|
|
784
|
+
form: 'yield',
|
|
785
|
+
caller: candidate.caller,
|
|
786
|
+
operands,
|
|
787
|
+
results,
|
|
788
|
+
// `yield` can itself throw the value a `generator.throw()` injects, unlike
|
|
789
|
+
// `await`, which only ever resumes with a resolved value or a rejection
|
|
790
|
+
// surfacing at the same site -- this is a real capability, not symmetry
|
|
791
|
+
// for its own sake.
|
|
792
|
+
completion: { canThrow: true, canReturn: false, canBreak: false, canContinue: false, canSuspend: true },
|
|
793
|
+
effects: { ...pureEffects, callsUserCode: true },
|
|
794
|
+
evaluationOrdinal: candidate.evaluationOrdinal
|
|
795
|
+
};
|
|
796
|
+
const resumeId = mintOperationId(context.ordinals, candidate.id, 'boundary');
|
|
797
|
+
const resumeOperation = {
|
|
798
|
+
family: 'boundary',
|
|
799
|
+
id: resumeId,
|
|
800
|
+
boundary: 'generator-resume',
|
|
801
|
+
caller: candidate.caller,
|
|
802
|
+
operands: [],
|
|
803
|
+
results: [mintResult(resumeId, 'value', resumeType), mintResult(resumeId, 'completion', resumeType)],
|
|
804
|
+
// `generator.throw()`/`.return()` make the resume itself abrupt; `.next()`
|
|
805
|
+
// makes it the ordinary value case captured by the `'value'` result above.
|
|
806
|
+
completion: { canThrow: true, canReturn: true, canBreak: false, canContinue: false, canSuspend: false },
|
|
807
|
+
effects: pureEffects,
|
|
808
|
+
evaluationOrdinal: candidate.evaluationOrdinal
|
|
809
|
+
};
|
|
810
|
+
return {
|
|
811
|
+
kind: 'operations',
|
|
812
|
+
operations: [...auxiliaryOperations, operation, resumeOperation],
|
|
813
|
+
edges: [...auxiliaryEdges, { kind: 'completion', from: id, to: resumeId, completion: 'suspend' }]
|
|
814
|
+
};
|
|
815
|
+
};
|
|
816
|
+
/**
|
|
817
|
+
* The return an arrow's concise body performs when that body is itself
|
|
818
|
+
* `await x` or `yield x`.
|
|
819
|
+
*
|
|
820
|
+
* `familiesOf` (`census.ts`) censuses such a node under `'control'` only --
|
|
821
|
+
* publishing a second, colliding operation at the same identity is refused
|
|
822
|
+
* there -- so this one candidate has to produce everything the body needs:
|
|
823
|
+
* the suspend/resume operations `contributeAwait`/`contributeYield` already
|
|
824
|
+
* build, plus the implicit return every other concise body gets from
|
|
825
|
+
* `contributeImplicitReturn`. That function cannot serve this case: it
|
|
826
|
+
* resolves its operand through `resolveExpressionOperand`, which for this
|
|
827
|
+
* node would recompute this exact candidate's own identity and find nothing
|
|
828
|
+
* published there yet -- a self-citation, not a forward reference, because
|
|
829
|
+
* the suspend operation this return needs to cite is minted right here,
|
|
830
|
+
* never independently. The value operand is built directly from the
|
|
831
|
+
* operation just minted instead.
|
|
832
|
+
*/
|
|
833
|
+
const contributeConciseSuspendReturn = (context, candidate, node) => {
|
|
834
|
+
const suspended = ts.isAwaitExpression(node) ? contributeAwait(context, candidate, node) : contributeYield(context, candidate, node);
|
|
835
|
+
if (suspended.kind !== 'operations')
|
|
836
|
+
return suspended;
|
|
837
|
+
const suspend = suspended.operations.find((op) => op.family === 'control' && (op.form === 'await' || op.form === 'yield'));
|
|
838
|
+
const value = suspend?.results.find((result) => result.role === 'value');
|
|
839
|
+
if (!suspend || !value)
|
|
840
|
+
return blockedContribution(candidate, 'a concise arrow body suspend published no value result for its implicit return');
|
|
841
|
+
const id = mintOperationId(context.ordinals, candidate.id, 'control');
|
|
842
|
+
const operation = {
|
|
843
|
+
family: 'control',
|
|
844
|
+
id,
|
|
845
|
+
form: 'return',
|
|
846
|
+
caller: candidate.caller,
|
|
847
|
+
operands: [operand('value', 0, { kind: 'result', result: value.id }, value.type)],
|
|
848
|
+
results: [mintResult(id, 'completion', value.type)],
|
|
849
|
+
completion: { canThrow: false, canReturn: true, canBreak: false, canContinue: false, canSuspend: false },
|
|
850
|
+
effects: pureEffects,
|
|
851
|
+
evaluationOrdinal: candidate.evaluationOrdinal
|
|
852
|
+
};
|
|
853
|
+
// As `contributeImplicitReturn` notes: neither a concise body nor a field
|
|
854
|
+
// initializer can sit inside a `try`, so no `finally` can intercept this.
|
|
855
|
+
return { kind: 'operations', operations: [...suspended.operations, operation], edges: suspended.edges };
|
|
856
|
+
};
|
|
857
|
+
const contributeDebugger = (candidate, context) => {
|
|
858
|
+
const id = mintOperationId(context.ordinals, candidate.id, 'control');
|
|
859
|
+
const operation = {
|
|
860
|
+
family: 'control',
|
|
861
|
+
id,
|
|
862
|
+
form: 'debugger',
|
|
863
|
+
caller: candidate.caller,
|
|
864
|
+
operands: [],
|
|
865
|
+
results: [],
|
|
866
|
+
completion: normalCompletion,
|
|
867
|
+
effects: pureEffects,
|
|
868
|
+
evaluationOrdinal: candidate.evaluationOrdinal
|
|
869
|
+
};
|
|
870
|
+
return { kind: 'operations', operations: [operation], edges: [] };
|
|
871
|
+
};
|
|
872
|
+
export const createControlProducer = (context) => {
|
|
873
|
+
const contribute = (candidate) => {
|
|
874
|
+
const node = candidate.node;
|
|
875
|
+
// Checked first: these nodes are censused under the control family *in
|
|
876
|
+
// addition to* their own, so dispatching on syntax kind would route them to
|
|
877
|
+
// whichever statement form happened to match and lose the return entirely.
|
|
878
|
+
if (node.parent && ts.isArrowFunction(node.parent) && node.parent.body === node && !ts.isBlock(node)) {
|
|
879
|
+
// `await x`/`yield x` as the whole body is the one concise-body shape
|
|
880
|
+
// that is *already* `'control'` family on its own: routing it through
|
|
881
|
+
// `contributeImplicitReturn` the way every other concise body goes
|
|
882
|
+
// would have it resolve its own not-yet-published identity. See
|
|
883
|
+
// `contributeConciseSuspendReturn`'s own comment.
|
|
884
|
+
if (ts.isAwaitExpression(node) || ts.isYieldExpression(node)) {
|
|
885
|
+
return contributeConciseSuspendReturn(context, candidate, node);
|
|
886
|
+
}
|
|
887
|
+
return contributeImplicitReturn(context, candidate, node);
|
|
888
|
+
}
|
|
889
|
+
if (isFieldInitializerBody(node))
|
|
890
|
+
return contributeImplicitReturn(context, candidate, node);
|
|
891
|
+
if (ts.isIfStatement(node))
|
|
892
|
+
return contributeBranch(context, candidate, node);
|
|
893
|
+
if (ts.isForOfStatement(node) || ts.isForInStatement(node))
|
|
894
|
+
return contributeForOfIn(context, candidate, node);
|
|
895
|
+
if (ts.isForStatement(node))
|
|
896
|
+
return contributePlainLoop(context, candidate, node.condition);
|
|
897
|
+
if (ts.isWhileStatement(node))
|
|
898
|
+
return contributePlainLoop(context, candidate, node.expression);
|
|
899
|
+
if (ts.isDoStatement(node))
|
|
900
|
+
return contributeTailTestedLoop(context, candidate, node.expression);
|
|
901
|
+
if (ts.isSwitchStatement(node))
|
|
902
|
+
return contributeSwitch(context, candidate, node);
|
|
903
|
+
if (ts.isReturnStatement(node))
|
|
904
|
+
return contributeReturn(context, candidate, node);
|
|
905
|
+
if (ts.isThrowStatement(node))
|
|
906
|
+
return contributeThrow(context, candidate, node);
|
|
907
|
+
if (ts.isTryStatement(node))
|
|
908
|
+
return contributeTry(context, candidate, node);
|
|
909
|
+
if (ts.isBreakOrContinueStatement(node)) {
|
|
910
|
+
return contributeBreakOrContinue(context, candidate, node, ts.isBreakStatement(node) ? 'break' : 'continue');
|
|
911
|
+
}
|
|
912
|
+
if (ts.isLabeledStatement(node))
|
|
913
|
+
return contributeLabeled(context, candidate, node);
|
|
914
|
+
if (ts.isAwaitExpression(node))
|
|
915
|
+
return contributeAwait(context, candidate, node);
|
|
916
|
+
if (ts.isYieldExpression(node))
|
|
917
|
+
return contributeYield(context, candidate, node);
|
|
918
|
+
if (node.kind === ts.SyntaxKind.DebuggerStatement)
|
|
919
|
+
return contributeDebugger(candidate, context);
|
|
920
|
+
return blockedContribution(candidate, 'control census produced a syntax kind this producer does not model');
|
|
921
|
+
};
|
|
922
|
+
return { family: 'control', contribute };
|
|
923
|
+
};
|