@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,902 @@
|
|
|
1
|
+
import ts from 'typescript';
|
|
2
|
+
import { operationId, operationOfResult } from '../../../identity/ids.js';
|
|
3
|
+
import { normalCompletion, pureEffects, throwingCompletion } from '../../model/operands.js';
|
|
4
|
+
import { isParameterProperty } from '../census.js';
|
|
5
|
+
import { parameterBindingResultOf } from './bindings.js';
|
|
6
|
+
import { parameterSlotTypeOf } from '../parameter-slot.js';
|
|
7
|
+
import { mintOperationId, mintResult, operand } from './mint.js';
|
|
8
|
+
import { resultOf } from '../../model/operands.js';
|
|
9
|
+
import { asBlocked, resultEdge, uniqueSymbolKeyTextOf, staticFunctionNameOf, staticClassNameOf, staticClassLengthOf, expectedParameterCountOf, ownPrototypePropertyOf } from './shared.js';
|
|
10
|
+
import { citeExpressionResult } from './references.js';
|
|
11
|
+
import { physicalInitializerTypeOf } from '../structural-declarations.js';
|
|
12
|
+
import { transparentConstClassAliasTarget } from '../../class-alias.js';
|
|
13
|
+
import { inheritedAccessorOfAssignment } from '../../inherited-accessor.js';
|
|
14
|
+
const isStaticMember = (node) => ts.canHaveModifiers(node) && (ts.getModifiers(node) ?? []).some((modifier) => modifier.kind === ts.SyntaxKind.StaticKeyword);
|
|
15
|
+
/**
|
|
16
|
+
* Whether `node`'s heritage clause is present, and therefore whether
|
|
17
|
+
* `bind-class-value` is this class's first or second minted operation.
|
|
18
|
+
*
|
|
19
|
+
* Member producers below need to reference the class's own `bind-class-value`
|
|
20
|
+
* id from a *different* census candidate than the one that minted it (the class
|
|
21
|
+
* declaration and its members are separate candidates). Recomputing the
|
|
22
|
+
* identity-ordinal from this same rule -- rather than threading the id through
|
|
23
|
+
* shared state -- keeps the two sides of that reference from drifting apart.
|
|
24
|
+
* This is `context.ordinals`' per-(node,family) mint count, unrelated to the
|
|
25
|
+
* `evaluationOrdinal` data field, which comes from `context.evaluationOrdinals`.
|
|
26
|
+
*/
|
|
27
|
+
const hasExtendsClause = (classNode) => (classNode.heritageClauses ?? []).some((clause) => clause.token === ts.SyntaxKind.ExtendsKeyword);
|
|
28
|
+
const bindClassValueOperationId = (identities, classNode) => operationId(identities.nodeIdOf(classNode), 'class-lifecycle', hasExtendsClause(classNode) ? 1 : 0);
|
|
29
|
+
/** The class whose body lexically contains `node`, stopping before an outer class can claim a nested one's member. */
|
|
30
|
+
const containingClassOf = (node) => {
|
|
31
|
+
for (let current = node.parent; current; current = current.parent) {
|
|
32
|
+
if (ts.isClassLike(current))
|
|
33
|
+
return current;
|
|
34
|
+
}
|
|
35
|
+
return null;
|
|
36
|
+
};
|
|
37
|
+
/**
|
|
38
|
+
* The `this.key` access ONE JavaScript class member's own value declaration
|
|
39
|
+
* names -- for both spellings TypeScript's JS class inference accepts.
|
|
40
|
+
*
|
|
41
|
+
* `this.key = value` declares through the assignment. A JSDoc-typed statement
|
|
42
|
+
* `/** @type {T} *\/ this.key;` declares through the access alone: the checker
|
|
43
|
+
* publishes one property symbol either way, the second carrying the type the
|
|
44
|
+
* program STATED rather than one inferred from a store, and its value
|
|
45
|
+
* declaration is the bare access rather than a `BinaryExpression`. Reading
|
|
46
|
+
* only the assignment spelling left the second one's member fully typed at
|
|
47
|
+
* every read while the class layout had no `define-field` event for it --
|
|
48
|
+
* exactly the "typed but no storage event" hole this census exists to close,
|
|
49
|
+
* one spelling further along, and the reason a descriptor-defined field's
|
|
50
|
+
* definition could not tell whether it was CREATING the property or
|
|
51
|
+
* redefining one that already existed.
|
|
52
|
+
*
|
|
53
|
+
* The declaration-only spelling installs no property of its own: the statement
|
|
54
|
+
* is a read. It is admitted only as a statement of its own, never as a larger
|
|
55
|
+
* expression's operand, which would be an ordinary read.
|
|
56
|
+
*/
|
|
57
|
+
const declaredThisAccessOf = (declaration) => {
|
|
58
|
+
const access = ts.isBinaryExpression(declaration)
|
|
59
|
+
? declaration.operatorToken.kind === ts.SyntaxKind.EqualsToken
|
|
60
|
+
? declaration.left
|
|
61
|
+
: null
|
|
62
|
+
: ts.isExpressionStatement(declaration.parent)
|
|
63
|
+
? declaration
|
|
64
|
+
: null;
|
|
65
|
+
if (access === null)
|
|
66
|
+
return null;
|
|
67
|
+
if (!ts.isPropertyAccessExpression(access) && !ts.isElementAccessExpression(access))
|
|
68
|
+
return null;
|
|
69
|
+
return access.expression.kind === ts.SyntaxKind.ThisKeyword ? access : null;
|
|
70
|
+
};
|
|
71
|
+
/**
|
|
72
|
+
* A JavaScript class field TypeScript inferred from a `this.key` declaration.
|
|
73
|
+
*
|
|
74
|
+
* JavaScript has no `PropertyDeclaration` node for this idiom. The checker does
|
|
75
|
+
* still publish one property symbol for it, whose declarations are the assignment
|
|
76
|
+
* expressions themselves, and `field-bindings.ts` already uses that same fact to
|
|
77
|
+
* derive the slot's type. Class projection used to read only explicit declaration
|
|
78
|
+
* events, so a field could be fully typed at every access while the C++ struct had
|
|
79
|
+
* no storage for it. The symbol's value declaration identifies the class that owns
|
|
80
|
+
* the slot; later writes in subclasses or methods must not redeclare it there.
|
|
81
|
+
*/
|
|
82
|
+
const inferredJavaScriptFieldsOf = (checker, classNode) => {
|
|
83
|
+
const instance = checker.getTypeAtLocation(classNode);
|
|
84
|
+
const fields = [];
|
|
85
|
+
for (const symbol of checker.getPropertiesOfType(instance)) {
|
|
86
|
+
if (inheritedAccessorOfAssignment(checker, symbol))
|
|
87
|
+
continue;
|
|
88
|
+
const declaration = symbol.valueDeclaration;
|
|
89
|
+
if (!declaration)
|
|
90
|
+
continue;
|
|
91
|
+
const access = declaredThisAccessOf(declaration);
|
|
92
|
+
if (access === null)
|
|
93
|
+
continue;
|
|
94
|
+
if (containingClassOf(declaration) !== classNode)
|
|
95
|
+
continue;
|
|
96
|
+
const name = ts.isPropertyAccessExpression(access)
|
|
97
|
+
? access.name.text
|
|
98
|
+
: ts.isStringLiteralLike(access.argumentExpression)
|
|
99
|
+
? access.argumentExpression.text
|
|
100
|
+
: null;
|
|
101
|
+
if (name !== null)
|
|
102
|
+
fields.push({ name, declaration, access });
|
|
103
|
+
}
|
|
104
|
+
return fields;
|
|
105
|
+
};
|
|
106
|
+
export const createClassLifecycleProducer = (context) => {
|
|
107
|
+
const voidType = context.table.intern({ kind: 'primitive', primitive: 'void' });
|
|
108
|
+
const buildOperation = (id, caller, evaluationOrdinal, event, declaration, classDeclaration, descriptor, placement, operands, completion, effects) => ({
|
|
109
|
+
id,
|
|
110
|
+
caller,
|
|
111
|
+
operands,
|
|
112
|
+
results: [mintResult(id, 'completion', voidType)],
|
|
113
|
+
completion,
|
|
114
|
+
effects,
|
|
115
|
+
evaluationOrdinal,
|
|
116
|
+
family: 'class-lifecycle',
|
|
117
|
+
event,
|
|
118
|
+
declaration,
|
|
119
|
+
classDeclaration,
|
|
120
|
+
descriptor,
|
|
121
|
+
placement
|
|
122
|
+
});
|
|
123
|
+
const staticKeyType = context.table.intern({ kind: 'primitive', primitive: 'string' });
|
|
124
|
+
/**
|
|
125
|
+
* A member's key operand.
|
|
126
|
+
*
|
|
127
|
+
* A written name is a constant, exactly as a property access carries one --
|
|
128
|
+
* the key is part of the definition, and leaving it out means every consumer
|
|
129
|
+
* has to recover which member was defined from the declaration node, which is
|
|
130
|
+
* the syntax walk this graph exists to replace. A computed name is cited from
|
|
131
|
+
* whichever family normalized the bracketed expression.
|
|
132
|
+
*/
|
|
133
|
+
const keyOperand = (name) => {
|
|
134
|
+
if (ts.isComputedPropertyName(name)) {
|
|
135
|
+
// A `unique symbol` name declares a member with a compile-time identity
|
|
136
|
+
// -- `class C { [S]: T }` is as much a declared member as `class C { x: T
|
|
137
|
+
// }`, and `keyof C` includes it. Publishing it as a *constant* key is
|
|
138
|
+
// what puts it in the class layout at all: `projection/classes.ts`
|
|
139
|
+
// deliberately skips a `define-field` whose key is not constant, so
|
|
140
|
+
// before this the field was dropped from the struct and every
|
|
141
|
+
// `this[S]` read had no member to find. `properties.ts` resolves the
|
|
142
|
+
// read's key through the same `uniqueSymbolKeyTextOf`, so the two
|
|
143
|
+
// sides name one member.
|
|
144
|
+
const symbolKey = uniqueSymbolKeyTextOf(context, context.types.typeAt(name.expression));
|
|
145
|
+
if (symbolKey !== null) {
|
|
146
|
+
return { operands: [operand('key', 0, { kind: 'constant', text: symbolKey, literal: 'string' }, staticKeyType)] };
|
|
147
|
+
}
|
|
148
|
+
const cited = citeExpressionResult(name.expression, context);
|
|
149
|
+
if (cited.kind === 'unmodelled')
|
|
150
|
+
return { blocked: cited.reason };
|
|
151
|
+
return { operands: [operand('key', 0, cited.source, context.types.typeAt(name.expression))] };
|
|
152
|
+
}
|
|
153
|
+
if (ts.isIdentifier(name) || ts.isStringLiteralLike(name) || ts.isNumericLiteral(name)) {
|
|
154
|
+
return { operands: [operand('key', 0, { kind: 'constant', text: name.text, literal: 'string' }, staticKeyType)] };
|
|
155
|
+
}
|
|
156
|
+
// `#x` is not a property key in the language's sense -- it resolves against
|
|
157
|
+
// the class's private scope and `[[DefineOwnProperty]]` never sees it --
|
|
158
|
+
// but it *is* a member of a fixed layout, and the layout is what this
|
|
159
|
+
// operand feeds. `projection/classes.ts` skips any `define-field` whose key
|
|
160
|
+
// is not constant, so publishing nothing here dropped the member's
|
|
161
|
+
// initializer while `representation/object-shape.ts` (which reads the
|
|
162
|
+
// checker's own member list, where a private name appears exactly like any
|
|
163
|
+
// other) had already given the struct a field for it: `#count = 5` emitted
|
|
164
|
+
// a struct member that was never written, and the value was silently the
|
|
165
|
+
// C++ zero rather than the initializer's.
|
|
166
|
+
//
|
|
167
|
+
// The key is the private name's own text, `#` included, which is precisely
|
|
168
|
+
// the spelling the checker reports for the member and therefore the
|
|
169
|
+
// spelling the layout already uses -- so the definition here and a
|
|
170
|
+
// `this.#count` read (`properties.ts`) name one member without either side
|
|
171
|
+
// inventing a mangling. `types.ts` escapes it into a legal C++ member name
|
|
172
|
+
// exactly as it escapes any other non-identifier key. Two classes each
|
|
173
|
+
// declaring `#x` do not collide: each has its own layout.
|
|
174
|
+
if (ts.isPrivateIdentifier(name)) {
|
|
175
|
+
return { operands: [operand('key', 0, { kind: 'constant', text: name.text, literal: 'string' }, staticKeyType)] };
|
|
176
|
+
}
|
|
177
|
+
return { operands: [] };
|
|
178
|
+
};
|
|
179
|
+
/**
|
|
180
|
+
* The function object a class evaluation step creates.
|
|
181
|
+
*
|
|
182
|
+
* `DefineMethod` performs `OrdinaryFunctionCreate` before it defines
|
|
183
|
+
* anything, and `ClassDefinitionEvaluation` creates the constructor function
|
|
184
|
+
* object before binding the class name -- so these really are allocations,
|
|
185
|
+
* and publishing them under the allocation family is what gives each body a
|
|
186
|
+
* calling convention. Without them a method is a body nobody allocated: the
|
|
187
|
+
* ABI projection finds no callable carrier and refuses the whole function.
|
|
188
|
+
*
|
|
189
|
+
* The census routes these nodes to `class-lifecycle` alone, so no other
|
|
190
|
+
* producer mints an allocation at this identity.
|
|
191
|
+
*/
|
|
192
|
+
// A class method/accessor is the only shape `contributeMethod` ever passes
|
|
193
|
+
// as `callable` here (the class-constructor-object allocation passes
|
|
194
|
+
// `null`, and reads its own `[[Name]]`/`length` through the unrelated
|
|
195
|
+
// `CallableConstructorObject` carrier this producer does not touch), so a
|
|
196
|
+
// simple type guard is exhaustive rather than a partial one that silently
|
|
197
|
+
// drops a shape it should have named.
|
|
198
|
+
const isNamedCallableMember = (declaration) => ts.isMethodDeclaration(declaration) || ts.isGetAccessorDeclaration(declaration) || ts.isSetAccessorDeclaration(declaration);
|
|
199
|
+
const allocateFunctionObject = (candidate, node, allocated, callable) => {
|
|
200
|
+
const id = mintOperationId(context.ordinals, candidate.id, 'allocation');
|
|
201
|
+
const shape = context.types.valueTypeAt(node);
|
|
202
|
+
return {
|
|
203
|
+
id,
|
|
204
|
+
family: 'allocation',
|
|
205
|
+
allocated,
|
|
206
|
+
shape,
|
|
207
|
+
callable: callable ? context.identities.functionIdOf(callable) : null,
|
|
208
|
+
...(callable
|
|
209
|
+
? {
|
|
210
|
+
functionSource: callable.getText(),
|
|
211
|
+
generatorFunction: 'asteriskToken' in callable && callable.asteriskToken !== undefined,
|
|
212
|
+
...(ownPrototypePropertyOf(callable) === null ? {} : { ownPrototypeProperty: ownPrototypePropertyOf(callable) === true }),
|
|
213
|
+
...(isNamedCallableMember(callable)
|
|
214
|
+
? { functionName: staticFunctionNameOf(callable), functionLength: expectedParameterCountOf(callable) }
|
|
215
|
+
: {})
|
|
216
|
+
}
|
|
217
|
+
: {}),
|
|
218
|
+
// A class's constructor object states the class it belongs to and its
|
|
219
|
+
// `[[Name]]`, the way a function allocation states `functionName` --
|
|
220
|
+
// `C.name` is read off this, and a memberless class expression has no
|
|
221
|
+
// other event to prove it was evaluated (`preflight/property-access.ts`).
|
|
222
|
+
...(allocated === 'class-constructor-object' && ts.isClassLike(node)
|
|
223
|
+
? {
|
|
224
|
+
classDeclaration: context.identities.declarationIdOf(node),
|
|
225
|
+
functionName: staticClassNameOf(node),
|
|
226
|
+
functionLength: staticClassLengthOf(node)
|
|
227
|
+
}
|
|
228
|
+
: {}),
|
|
229
|
+
caller: candidate.caller,
|
|
230
|
+
operands: [],
|
|
231
|
+
results: [mintResult(id, 'value', shape)],
|
|
232
|
+
completion: normalCompletion,
|
|
233
|
+
effects: { ...pureEffects, allocates: true },
|
|
234
|
+
evaluationOrdinal: candidate.evaluationOrdinal
|
|
235
|
+
};
|
|
236
|
+
};
|
|
237
|
+
/** The one constructor declaration that owns a body -- an overload set's implementation, never a bodiless overload. */
|
|
238
|
+
const writtenConstructorOf = (node) => node.members.find((member) => ts.isConstructorDeclaration(member) && member.body !== undefined);
|
|
239
|
+
/**
|
|
240
|
+
* The written constructor's callable allocation, shared by the declaration
|
|
241
|
+
* and expression forms of a class: `[[Construct]]` enters the same body
|
|
242
|
+
* either way, and an expression that published no convention for it was
|
|
243
|
+
* refused at ABI projection ("no function-object allocation published a
|
|
244
|
+
* callable carrier") the moment its constructor read `this`.
|
|
245
|
+
*/
|
|
246
|
+
const writtenConstructorAllocationOf = (candidate, node) => {
|
|
247
|
+
// The written constructor's own body convention: the instance as receiver,
|
|
248
|
+
// the declared parameters, and no result. `[[Construct]]` returns the
|
|
249
|
+
// instance it was given, never the body's completion value, so a body
|
|
250
|
+
// compiled to return one would be returning something the language discards.
|
|
251
|
+
// An overloaded class carries several ConstructorDeclarations, but only
|
|
252
|
+
// the implementation owns an executable body and frame. Selecting the
|
|
253
|
+
// first declaration binds the callable allocation to a bodyless overload
|
|
254
|
+
// (`constructor();`) while every parameter/body operation is owned by the
|
|
255
|
+
// later implementation's FunctionId. The ABI projection then correctly
|
|
256
|
+
// finds no allocation for that real body. A class with no bodyful
|
|
257
|
+
// constructor has no constructor body to allocate here.
|
|
258
|
+
const written = writtenConstructorOf(node);
|
|
259
|
+
if (!written)
|
|
260
|
+
return null;
|
|
261
|
+
{
|
|
262
|
+
const shape = context.table.intern({
|
|
263
|
+
kind: 'signature',
|
|
264
|
+
call: [
|
|
265
|
+
{
|
|
266
|
+
parameters: written.parameters.map((parameter) => {
|
|
267
|
+
const flags = {
|
|
268
|
+
optional: parameter.questionToken !== undefined,
|
|
269
|
+
rest: parameter.dotDotDotToken !== undefined,
|
|
270
|
+
hasInitializer: parameter.initializer !== undefined
|
|
271
|
+
};
|
|
272
|
+
const type = context.types.typeAt(parameter);
|
|
273
|
+
// Widen the census-aware type itself. A defaulted parameter's
|
|
274
|
+
// physical slot always admits `undefined`, including when the
|
|
275
|
+
// census replaced the checker's initializer-derived `{}` with
|
|
276
|
+
// the record its call sites actually pass. Leaving that replaced
|
|
277
|
+
// type unwidened makes the constructor ABI require the record
|
|
278
|
+
// while `contributeDefaultedParameter` correctly reads an
|
|
279
|
+
// optional raw argument, so the body and its callable allocation
|
|
280
|
+
// publish different frames and ABI projection must refuse them.
|
|
281
|
+
return {
|
|
282
|
+
type,
|
|
283
|
+
slot: parameterSlotTypeOf((members) => context.table.intern({ kind: 'union', members }), context.types.typeOf(context.checker.getUndefinedType()), flags, type),
|
|
284
|
+
...flags
|
|
285
|
+
};
|
|
286
|
+
}),
|
|
287
|
+
minimumArity: written.parameters.filter((parameter) => !parameter.questionToken && !parameter.initializer).length,
|
|
288
|
+
thisParameter: context.types.instanceTypeAt(node),
|
|
289
|
+
result: voidType
|
|
290
|
+
}
|
|
291
|
+
],
|
|
292
|
+
construct: []
|
|
293
|
+
});
|
|
294
|
+
const id = mintOperationId(context.ordinals, candidate.id, 'allocation');
|
|
295
|
+
return {
|
|
296
|
+
id,
|
|
297
|
+
family: 'allocation',
|
|
298
|
+
allocated: 'function-object',
|
|
299
|
+
shape,
|
|
300
|
+
callable: context.identities.functionIdOf(written),
|
|
301
|
+
classConstructorBodyOf: context.identities.declarationIdOf(node),
|
|
302
|
+
functionSource: written.getText(),
|
|
303
|
+
generatorFunction: 'asteriskToken' in written && written.asteriskToken !== undefined,
|
|
304
|
+
...(ownPrototypePropertyOf(written) === null ? {} : { ownPrototypeProperty: ownPrototypePropertyOf(written) === true }),
|
|
305
|
+
caller: candidate.caller,
|
|
306
|
+
operands: [],
|
|
307
|
+
results: [mintResult(id, 'value', shape)],
|
|
308
|
+
completion: normalCompletion,
|
|
309
|
+
effects: { ...pureEffects, allocates: true },
|
|
310
|
+
evaluationOrdinal: candidate.evaluationOrdinal
|
|
311
|
+
};
|
|
312
|
+
}
|
|
313
|
+
};
|
|
314
|
+
const contributeClass = (candidate, node) => {
|
|
315
|
+
const source = candidate.id;
|
|
316
|
+
const declaration = context.identities.declarationIdOf(node);
|
|
317
|
+
const operations = [];
|
|
318
|
+
const edges = [];
|
|
319
|
+
const heritageExpression = node.heritageClauses?.find((clause) => clause.token === ts.SyntaxKind.ExtendsKeyword)?.types[0]?.expression;
|
|
320
|
+
let heritageOperation = null;
|
|
321
|
+
if (heritageExpression) {
|
|
322
|
+
const evaluatedHeritage = transparentConstClassAliasTarget(context.checker, heritageExpression) ?? heritageExpression;
|
|
323
|
+
let heritageSource = { kind: 'absent' };
|
|
324
|
+
if (!candidate.classLayoutOnly) {
|
|
325
|
+
const cited = citeExpressionResult(evaluatedHeritage, context);
|
|
326
|
+
if (cited.kind === 'unmodelled') {
|
|
327
|
+
return asBlocked(candidate.id, 'class-lifecycle', `class heritage expression ${cited.reason}`, null);
|
|
328
|
+
}
|
|
329
|
+
heritageSource = cited.source;
|
|
330
|
+
}
|
|
331
|
+
const id = mintOperationId(context.ordinals, source, 'class-lifecycle');
|
|
332
|
+
// `ClassHeritage : extends LeftHandSideExpression` throws a TypeError when
|
|
333
|
+
// the evaluated value is neither a constructor nor null.
|
|
334
|
+
heritageOperation = buildOperation(id, candidate.caller, context.evaluationOrdinals.next(candidate.caller), 'evaluate-heritage', declaration, declaration, null, null, [operand('heritage', 0, heritageSource, context.types.typeAt(evaluatedHeritage))], candidate.classLayoutOnly ? normalCompletion : throwingCompletion, candidate.classLayoutOnly
|
|
335
|
+
? pureEffects
|
|
336
|
+
: { readsMutableState: true, writesMutableState: false, allocates: false, callsUserCode: false });
|
|
337
|
+
if (candidate.classLayoutOnly)
|
|
338
|
+
heritageOperation = { ...heritageOperation, classLayoutOnly: true };
|
|
339
|
+
operations.push(heritageOperation);
|
|
340
|
+
const heritageValueEdge = resultEdge(heritageSource, id, 'heritage', 0);
|
|
341
|
+
if (heritageValueEdge)
|
|
342
|
+
edges.push(heritageValueEdge);
|
|
343
|
+
}
|
|
344
|
+
// The class binding and its member definitions refer to the evaluated
|
|
345
|
+
// constructor object. The allocation below must precede this event, after
|
|
346
|
+
// heritage resolves, so a static initializer uses that same prototype
|
|
347
|
+
// owner rather than inventing a second constructor evaluation.
|
|
348
|
+
const bindId = mintOperationId(context.ordinals, source, 'class-lifecycle');
|
|
349
|
+
const bindOperation = {
|
|
350
|
+
...buildOperation(bindId, candidate.caller, candidate.evaluationOrdinal, 'bind-class-value', declaration, declaration, null, null, candidate.classLayoutOnly ? [operand('instance-layout', 0, { kind: 'absent' }, context.types.instanceTypeAt(node))] : [], normalCompletion, candidate.classLayoutOnly
|
|
351
|
+
? pureEffects
|
|
352
|
+
: {
|
|
353
|
+
readsMutableState: false,
|
|
354
|
+
writesMutableState: true,
|
|
355
|
+
allocates: true,
|
|
356
|
+
callsUserCode: false
|
|
357
|
+
}),
|
|
358
|
+
...(candidate.classLayoutOnly ? { classLayoutOnly: true } : {})
|
|
359
|
+
};
|
|
360
|
+
operations.push(bindOperation);
|
|
361
|
+
if (heritageOperation)
|
|
362
|
+
edges.push({ kind: 'evaluation', from: heritageOperation.id, to: bindOperation.id });
|
|
363
|
+
// The constructor function object, and the binding the class name holds.
|
|
364
|
+
// `ClassDefinitionEvaluation` creates the one and initializes the other,
|
|
365
|
+
// and both have to be published: without the allocation `new C()` has no
|
|
366
|
+
// convention to construct through, and without the binding every `new C()`
|
|
367
|
+
// reads a cell nothing in the program ever introduced.
|
|
368
|
+
//
|
|
369
|
+
// The allocation names no callable. `[[Construct]]` and the constructor
|
|
370
|
+
// *body* are two conventions -- one takes the arguments and returns an
|
|
371
|
+
// instance, the other takes the instance and returns nothing -- and giving
|
|
372
|
+
// the body the construct signature would compile it to return a value it
|
|
373
|
+
// never produces.
|
|
374
|
+
const constructorObject = candidate.classLayoutOnly ? null : allocateFunctionObject(candidate, node, 'class-constructor-object', null);
|
|
375
|
+
if (constructorObject) {
|
|
376
|
+
operations.push(constructorObject);
|
|
377
|
+
if (heritageOperation)
|
|
378
|
+
edges.push({ kind: 'evaluation', from: heritageOperation.id, to: constructorObject.id });
|
|
379
|
+
edges.push({ kind: 'evaluation', from: constructorObject.id, to: bindOperation.id });
|
|
380
|
+
}
|
|
381
|
+
const classValue = constructorObject ? resultOf(constructorObject, 'value') : null;
|
|
382
|
+
if (classValue && constructorObject) {
|
|
383
|
+
const nameId = mintOperationId(context.ordinals, source, 'binding');
|
|
384
|
+
const nameBinding = {
|
|
385
|
+
id: nameId,
|
|
386
|
+
family: 'binding',
|
|
387
|
+
action: 'initialize',
|
|
388
|
+
declaration,
|
|
389
|
+
// A class binding is `const`-like inside its own body and let-like
|
|
390
|
+
// outside; the observable half is the dead zone before evaluation.
|
|
391
|
+
mutable: false,
|
|
392
|
+
temporalDeadZone: true,
|
|
393
|
+
caller: candidate.caller,
|
|
394
|
+
operands: [operand('initializer', 0, { kind: 'result', result: classValue.id }, constructorObject.shape)],
|
|
395
|
+
results: [mintResult(nameId, 'value', constructorObject.shape)],
|
|
396
|
+
completion: normalCompletion,
|
|
397
|
+
effects: { ...pureEffects, writesMutableState: true },
|
|
398
|
+
evaluationOrdinal: candidate.evaluationOrdinal
|
|
399
|
+
};
|
|
400
|
+
operations.push(nameBinding);
|
|
401
|
+
edges.push({ kind: 'value', result: classValue.id, to: nameId, role: 'initializer', ordinal: 0 });
|
|
402
|
+
}
|
|
403
|
+
const written = writtenConstructorOf(node);
|
|
404
|
+
const writtenConstructor = candidate.classLayoutOnly ? null : writtenConstructorAllocationOf(candidate, node);
|
|
405
|
+
if (writtenConstructor)
|
|
406
|
+
operations.push(writtenConstructor);
|
|
407
|
+
// A parameter property is two declarations written as one:
|
|
408
|
+
// `constructor(readonly name: string)` declares the formal AND an instance
|
|
409
|
+
// member the constructor assigns it into. This is the member half -- the
|
|
410
|
+
// same `define-field` an ordinary field declaration publishes, with no
|
|
411
|
+
// initializer operand, because the value does not come from an initializer
|
|
412
|
+
// at all. It comes from the argument, and the store that writes it is
|
|
413
|
+
// minted from the parameter's OWN candidate (`contributeParameterProperty`
|
|
414
|
+
// below), whose caller is the constructor rather than this class
|
|
415
|
+
// evaluation -- which is exactly where the language runs it.
|
|
416
|
+
//
|
|
417
|
+
// Published here rather than from that candidate because a `define-field`
|
|
418
|
+
// is class evaluation: it runs once, in the class's own caller, and
|
|
419
|
+
// `projection/classes.ts` reads it into the layout every construction and
|
|
420
|
+
// every `this.name` lookup consults.
|
|
421
|
+
for (const parameter of written?.parameters ?? []) {
|
|
422
|
+
if (!isParameterProperty(parameter))
|
|
423
|
+
continue;
|
|
424
|
+
if (!ts.isIdentifier(parameter.name)) {
|
|
425
|
+
return asBlocked(candidate.id, 'class-lifecycle', 'a parameter property named by a destructuring pattern declares no single member for the class layout to hold', 'P1');
|
|
426
|
+
}
|
|
427
|
+
const fieldId = mintOperationId(context.ordinals, source, 'class-lifecycle');
|
|
428
|
+
operations.push(buildOperation(fieldId, candidate.caller, context.evaluationOrdinals.next(candidate.caller), 'define-field', context.identities.declarationIdOf(parameter), declaration, { writable: true, enumerable: true, configurable: true }, 'own', [operand('key', 0, { kind: 'constant', text: parameter.name.text, literal: 'string' }, staticKeyType)], normalCompletion, { readsMutableState: false, writesMutableState: true, allocates: false, callsUserCode: false }));
|
|
429
|
+
edges.push({ kind: 'evaluation', from: bindOperation.id, to: fieldId });
|
|
430
|
+
}
|
|
431
|
+
// `this.x = value` in a JavaScript class declares an instance member to
|
|
432
|
+
// TypeScript without creating a PropertyDeclaration in the AST. Publish
|
|
433
|
+
// the same layout event an explicit `x;` field would publish, but no field
|
|
434
|
+
// initializer: the ordinary property store in the constructor remains the
|
|
435
|
+
// one runtime initialization, so this event contributes storage only.
|
|
436
|
+
for (const field of inferredJavaScriptFieldsOf(context.checker, node)) {
|
|
437
|
+
const fieldId = mintOperationId(context.ordinals, source, 'class-lifecycle');
|
|
438
|
+
operations.push(buildOperation(fieldId, candidate.caller, context.evaluationOrdinals.next(candidate.caller), 'define-field', context.identities.declarationIdOf(field.declaration), declaration, { writable: true, enumerable: true, configurable: true }, 'own', [
|
|
439
|
+
operand('key', 0, { kind: 'constant', text: field.name, literal: 'string' }, staticKeyType),
|
|
440
|
+
operand('field-storage', 0, { kind: 'absent' }, context.types.typeAt(field.access))
|
|
441
|
+
], normalCompletion, { readsMutableState: false, writesMutableState: true, allocates: false, callsUserCode: false }));
|
|
442
|
+
edges.push({ kind: 'evaluation', from: bindOperation.id, to: fieldId });
|
|
443
|
+
}
|
|
444
|
+
return { kind: 'operations', operations, edges };
|
|
445
|
+
};
|
|
446
|
+
/**
|
|
447
|
+
* The `super(...)` a constructor runs, when it is a statement of its own body.
|
|
448
|
+
*
|
|
449
|
+
* Only a top-level one is answered. A parameter property's store has to run
|
|
450
|
+
* AFTER the base is initialized -- that is the order the language states, and
|
|
451
|
+
* it is the order in which a base constructor calling an overridden method
|
|
452
|
+
* sees the derived object -- and ordering it needs an operation to order it
|
|
453
|
+
* against. A `super()` nested inside an `if` is a different question: the
|
|
454
|
+
* store is unconditional and the call is not, so the precedence would reach
|
|
455
|
+
* across a branch. That shape is refused by name rather than ordered wrongly.
|
|
456
|
+
*/
|
|
457
|
+
const topLevelSuperCallOf = (constructorNode) => {
|
|
458
|
+
for (const statement of constructorNode.body?.statements ?? []) {
|
|
459
|
+
if (!ts.isExpressionStatement(statement))
|
|
460
|
+
continue;
|
|
461
|
+
const call = statement.expression;
|
|
462
|
+
if (ts.isCallExpression(call) && call.expression.kind === ts.SyntaxKind.SuperKeyword)
|
|
463
|
+
return call;
|
|
464
|
+
}
|
|
465
|
+
return null;
|
|
466
|
+
};
|
|
467
|
+
/**
|
|
468
|
+
* `constructor(readonly name: string)`: the store, in the constructor.
|
|
469
|
+
*
|
|
470
|
+
* The member itself is declared by the `define-field` `contributeClass`
|
|
471
|
+
* publishes above. What is left is the assignment TypeScript writes at the
|
|
472
|
+
* top of the constructor body -- and it belongs to the constructor's own
|
|
473
|
+
* caller, which is why it is minted from this candidate: `callerOf` walks
|
|
474
|
+
* from the parameter's parent, and that parent is the constructor.
|
|
475
|
+
*
|
|
476
|
+
* The receiver is a `reference`/`this` of this producer's own, exactly the
|
|
477
|
+
* shape `references.ts` mints for a written `this` -- because every stage
|
|
478
|
+
* after normalization asks its questions of a published RESULT: the plan
|
|
479
|
+
* selects a carrier per result, and `preflight/carrier-kind.ts` reads the
|
|
480
|
+
* receiver's carrier off `plan.selected`. Citing the frame's
|
|
481
|
+
* `{kind: 'receiver'}` provenance directly instead was measured and does not
|
|
482
|
+
* work: it has no result, so the receiver's carrier reads as `constant` and
|
|
483
|
+
* the site asks for a `property-access:constant:set:false` recipe no target
|
|
484
|
+
* has.
|
|
485
|
+
*
|
|
486
|
+
* It is minted at the CONSTRUCTOR's node rather than the parameter's. At the
|
|
487
|
+
* parameter's it would take the `reference` ordinal `bindings.ts`'s
|
|
488
|
+
* `parameterValueResultOf` predicts for a DEFAULTED parameter, so
|
|
489
|
+
* `constructor(readonly n = 5)` would have its default guard testing this
|
|
490
|
+
* operation instead of the raw argument -- a silent miscompile resting on
|
|
491
|
+
* which producer happened to run first. Nothing else mints a `reference` at a
|
|
492
|
+
* `ConstructorDeclaration`, and each store cites the result it minted itself.
|
|
493
|
+
*
|
|
494
|
+
* The value is the parameter's BINDING, not its raw slot: a defaulted
|
|
495
|
+
* parameter property stores the default when the caller passed nothing.
|
|
496
|
+
*/
|
|
497
|
+
const contributeParameterProperty = (candidate, node) => {
|
|
498
|
+
const constructorNode = node.parent;
|
|
499
|
+
if (!ts.isConstructorDeclaration(constructorNode) || !ts.isClassLike(constructorNode.parent)) {
|
|
500
|
+
return asBlocked(candidate.id, 'class-lifecycle', 'a parameter property outside a class constructor is not modelled', 'P1');
|
|
501
|
+
}
|
|
502
|
+
if (!ts.isIdentifier(node.name)) {
|
|
503
|
+
return asBlocked(candidate.id, 'class-lifecycle', 'a parameter property named by a destructuring pattern declares no single member to store into', 'P1');
|
|
504
|
+
}
|
|
505
|
+
const classNode = constructorNode.parent;
|
|
506
|
+
// The member half is published by `contributeClass`, and only a class
|
|
507
|
+
// DECLARATION reaches it -- a class expression's own evaluation is minted
|
|
508
|
+
// by the allocation family, which has no candidate for this parameter.
|
|
509
|
+
// Emitting the store without the `define-field` would write into a member
|
|
510
|
+
// the layout does not declare, so the whole parameter property is refused
|
|
511
|
+
// by name instead of half-modelled.
|
|
512
|
+
if (!ts.isClassDeclaration(classNode)) {
|
|
513
|
+
return asBlocked(candidate.id, 'class-lifecycle', 'a parameter property of a class EXPRESSION publishes no "define-field": only a class declaration mints one, and a ' +
|
|
514
|
+
'store with no member declared is a write into a layout nothing states', 'P1');
|
|
515
|
+
}
|
|
516
|
+
const superCall = topLevelSuperCallOf(constructorNode);
|
|
517
|
+
if (hasExtendsClause(classNode) && superCall === null) {
|
|
518
|
+
return asBlocked(candidate.id, 'class-lifecycle', "a parameter property in a derived class whose `super(...)` is not a statement of the constructor's own body has " +
|
|
519
|
+
'nothing unconditional to order its store after', 'P1');
|
|
520
|
+
}
|
|
521
|
+
const receiverType = context.types.instanceTypeAt(classNode);
|
|
522
|
+
const valueType = context.types.typeAt(node);
|
|
523
|
+
const bound = parameterBindingResultOf(node, context.identities);
|
|
524
|
+
const receiverId = mintOperationId(context.ordinals, context.identities.nodeIdOf(constructorNode), 'reference');
|
|
525
|
+
const receiverResult = mintResult(receiverId, 'value', receiverType);
|
|
526
|
+
const receiver = {
|
|
527
|
+
id: receiverId,
|
|
528
|
+
family: 'reference',
|
|
529
|
+
form: 'this',
|
|
530
|
+
strict: true,
|
|
531
|
+
unresolvableThrows: false,
|
|
532
|
+
hasNoCell: false,
|
|
533
|
+
caller: candidate.caller,
|
|
534
|
+
// Supplied by the frame the caller established, so it is recorded as
|
|
535
|
+
// provenance rather than as a runtime step -- the same operand
|
|
536
|
+
// `references.ts`'s `buildThisReference` gives a written `this`.
|
|
537
|
+
operands: [operand('receiver', 0, { kind: 'receiver' }, receiverType, { kind: 'provenance' })],
|
|
538
|
+
results: [receiverResult],
|
|
539
|
+
completion: normalCompletion,
|
|
540
|
+
effects: { ...pureEffects, readsMutableState: true },
|
|
541
|
+
evaluationOrdinal: candidate.evaluationOrdinal
|
|
542
|
+
};
|
|
543
|
+
const storeId = mintOperationId(context.ordinals, candidate.id, 'property');
|
|
544
|
+
const store = {
|
|
545
|
+
id: storeId,
|
|
546
|
+
family: 'property',
|
|
547
|
+
internalMethod: 'set',
|
|
548
|
+
strict: true,
|
|
549
|
+
keyIsComputed: false,
|
|
550
|
+
// `[[Set]]` consults whatever descriptor the definition installed; it
|
|
551
|
+
// states none of its own, exactly as every other store does.
|
|
552
|
+
descriptor: null,
|
|
553
|
+
caller: candidate.caller,
|
|
554
|
+
operands: [
|
|
555
|
+
operand('receiver', 0, { kind: 'result', result: receiverResult.id }, receiverType),
|
|
556
|
+
operand('key', 0, { kind: 'constant', text: node.name.text, literal: 'string' }, staticKeyType),
|
|
557
|
+
operand('value', 0, { kind: 'result', result: bound }, valueType)
|
|
558
|
+
],
|
|
559
|
+
results: [mintResult(storeId, 'value', receiverType)],
|
|
560
|
+
completion: normalCompletion,
|
|
561
|
+
effects: { readsMutableState: false, writesMutableState: true, allocates: false, callsUserCode: false },
|
|
562
|
+
evaluationOrdinal: candidate.evaluationOrdinal
|
|
563
|
+
};
|
|
564
|
+
const edges = [
|
|
565
|
+
{ kind: 'value', result: receiverResult.id, to: storeId, role: 'receiver', ordinal: 0 },
|
|
566
|
+
{ kind: 'value', result: bound, to: storeId, role: 'value', ordinal: 0 }
|
|
567
|
+
];
|
|
568
|
+
// After EVERY parameter of this constructor is bound, not just this one.
|
|
569
|
+
// `FunctionDeclarationInstantiation` binds the whole parameter list --
|
|
570
|
+
// running each default initializer -- before the body's first statement,
|
|
571
|
+
// and these stores are body statements. Without this,
|
|
572
|
+
// `constructor(readonly a = f(), readonly b = g())` stored `a` between
|
|
573
|
+
// `f()` and `g()` instead of after both, which `g()` can observe.
|
|
574
|
+
for (const sibling of constructorNode.parameters) {
|
|
575
|
+
if (sibling === node || (ts.isIdentifier(sibling.name) && sibling.name.text === 'this'))
|
|
576
|
+
continue;
|
|
577
|
+
edges.push({ kind: 'evaluation', from: operationId(context.identities.nodeIdOf(sibling), 'binding', 0), to: storeId });
|
|
578
|
+
}
|
|
579
|
+
// And after the base is initialized: a base constructor that calls an
|
|
580
|
+
// overridden method must not see a member this class has already written.
|
|
581
|
+
if (superCall) {
|
|
582
|
+
edges.push({ kind: 'evaluation', from: operationId(context.identities.nodeIdOf(superCall), 'invocation', 0), to: storeId });
|
|
583
|
+
}
|
|
584
|
+
return { kind: 'operations', operations: [receiver, store], edges };
|
|
585
|
+
};
|
|
586
|
+
/** Shared prelude for a class-element candidate: locate it among its siblings. */
|
|
587
|
+
const memberContext = (candidate, node) => {
|
|
588
|
+
const classNode = node.parent;
|
|
589
|
+
if (!ts.isClassLike(classNode)) {
|
|
590
|
+
return asBlocked(candidate.id, 'class-lifecycle', 'class element with no class-like parent is not modelled', 'P6');
|
|
591
|
+
}
|
|
592
|
+
if (ts.isClassDeclaration(classNode))
|
|
593
|
+
return { classNode, ready: bindClassValueOperationId(context.identities, classNode) };
|
|
594
|
+
const constructor = citeExpressionResult(classNode, context);
|
|
595
|
+
if (constructor.kind === 'unmodelled' || constructor.source.kind !== 'result') {
|
|
596
|
+
return asBlocked(candidate.id, 'class-lifecycle', 'class member definition has no evaluated constructor object', 'P6');
|
|
597
|
+
}
|
|
598
|
+
return { classNode, ready: operationOfResult(constructor.source.result) };
|
|
599
|
+
};
|
|
600
|
+
const contributeMethodOrAccessor = (candidate, node) => {
|
|
601
|
+
const located = memberContext(candidate, node);
|
|
602
|
+
if ('kind' in located)
|
|
603
|
+
return located;
|
|
604
|
+
const { classNode, ready } = located;
|
|
605
|
+
const resolvedKey = keyOperand(node.name);
|
|
606
|
+
if ('blocked' in resolvedKey) {
|
|
607
|
+
return asBlocked(candidate.id, 'class-lifecycle', `computed method/accessor name ${resolvedKey.blocked}`, 'P1');
|
|
608
|
+
}
|
|
609
|
+
const keyOperands = resolvedKey.operands;
|
|
610
|
+
const keySource = ts.isComputedPropertyName(node.name) ? (keyOperands[0]?.source ?? null) : null;
|
|
611
|
+
const source = candidate.id;
|
|
612
|
+
const declaration = context.identities.declarationIdOf(node);
|
|
613
|
+
const classId = context.identities.declarationIdOf(classNode);
|
|
614
|
+
const isPrivate = ts.isPrivateIdentifier(node.name);
|
|
615
|
+
const placement = isStaticMember(node) ? 'static' : 'prototype';
|
|
616
|
+
const event = ts.isMethodDeclaration(node) ? 'define-method' : ts.isGetAccessorDeclaration(node) ? 'define-getter' : 'define-setter';
|
|
617
|
+
// Private methods/accessors become PrivateElement records, not ordinary
|
|
618
|
+
// properties: no [[DefineOwnProperty]] happens, so there is no descriptor.
|
|
619
|
+
// An accessor descriptor has no [[Writable]] slot at all; `false` is the
|
|
620
|
+
// closest the fixed `PropertyDescriptorShape` (data-descriptor shaped) can
|
|
621
|
+
// state, since it cannot distinguish get/set descriptors from data ones.
|
|
622
|
+
const descriptor = isPrivate
|
|
623
|
+
? null
|
|
624
|
+
: { writable: event === 'define-method', enumerable: false, configurable: true };
|
|
625
|
+
const operations = [];
|
|
626
|
+
const edges = [];
|
|
627
|
+
// `DefineMethod` creates the function object first; the definition that
|
|
628
|
+
// follows installs it. Two operations, because they are two steps, and
|
|
629
|
+
// because only the first states the convention the body is compiled to.
|
|
630
|
+
// An `abstract` member has no body, so there is no function object to
|
|
631
|
+
// create: what it publishes is the DECLARATION alone -- the key this class
|
|
632
|
+
// states and every concrete subclass must fill. `projection/classes.ts`
|
|
633
|
+
// already models a method whose callable is absent, and the dispatch
|
|
634
|
+
// family reads exactly that to root itself on the abstract class.
|
|
635
|
+
const methodObject = node.body === undefined ? null : allocateFunctionObject(candidate, node, 'function-object', node);
|
|
636
|
+
if (methodObject)
|
|
637
|
+
operations.push(methodObject);
|
|
638
|
+
const methodValue = methodObject ? resultOf(methodObject, 'value') : null;
|
|
639
|
+
const methodStorage = ts.isMethodDeclaration(node) && placement === 'prototype' ? context.types.mutableMethodStorageTypeAt(node) : null;
|
|
640
|
+
const methodOperands = methodValue && methodObject
|
|
641
|
+
? [
|
|
642
|
+
...keyOperands,
|
|
643
|
+
operand('method', 0, { kind: 'result', result: methodValue.id }, methodObject.shape),
|
|
644
|
+
...(methodStorage === null ? [] : [operand('method-storage', 0, { kind: 'absent' }, methodStorage)])
|
|
645
|
+
]
|
|
646
|
+
: [...keyOperands, ...(methodStorage === null ? [] : [operand('method-storage', 0, { kind: 'absent' }, methodStorage)])];
|
|
647
|
+
const defineId = mintOperationId(context.ordinals, source, 'class-lifecycle');
|
|
648
|
+
const defineOperation = buildOperation(defineId, candidate.caller, candidate.evaluationOrdinal, event, declaration, classId, descriptor, placement, methodOperands, normalCompletion, {
|
|
649
|
+
readsMutableState: false,
|
|
650
|
+
writesMutableState: true,
|
|
651
|
+
allocates: true,
|
|
652
|
+
callsUserCode: false
|
|
653
|
+
});
|
|
654
|
+
operations.push(defineOperation);
|
|
655
|
+
if (methodValue)
|
|
656
|
+
edges.push({ kind: 'value', result: methodValue.id, to: defineId, role: 'method', ordinal: 0 });
|
|
657
|
+
if (keySource) {
|
|
658
|
+
const keyEdge = resultEdge(keySource, defineId, 'key', 0);
|
|
659
|
+
if (keyEdge)
|
|
660
|
+
edges.push(keyEdge);
|
|
661
|
+
}
|
|
662
|
+
edges.push({ kind: 'evaluation', from: ready, to: defineOperation.id });
|
|
663
|
+
if (isPrivate) {
|
|
664
|
+
const brandId = mintOperationId(context.ordinals, source, 'class-lifecycle');
|
|
665
|
+
const brandOperation = buildOperation(brandId, candidate.caller, candidate.evaluationOrdinal, 'install-private-brand', declaration, classId, null, null, [], normalCompletion, {
|
|
666
|
+
readsMutableState: false,
|
|
667
|
+
writesMutableState: true,
|
|
668
|
+
allocates: false,
|
|
669
|
+
callsUserCode: false
|
|
670
|
+
});
|
|
671
|
+
operations.push(brandOperation);
|
|
672
|
+
edges.push({ kind: 'evaluation', from: defineOperation.id, to: brandOperation.id });
|
|
673
|
+
}
|
|
674
|
+
return { kind: 'operations', operations, edges };
|
|
675
|
+
};
|
|
676
|
+
const contributeField = (candidate, node) => {
|
|
677
|
+
const located = memberContext(candidate, node);
|
|
678
|
+
if ('kind' in located)
|
|
679
|
+
return located;
|
|
680
|
+
const { classNode, ready } = located;
|
|
681
|
+
const resolvedKey = keyOperand(node.name);
|
|
682
|
+
if ('blocked' in resolvedKey)
|
|
683
|
+
return asBlocked(candidate.id, 'class-lifecycle', `computed field name ${resolvedKey.blocked}`, 'P1');
|
|
684
|
+
const keyOperands = resolvedKey.operands;
|
|
685
|
+
const keySource = ts.isComputedPropertyName(node.name) ? (keyOperands[0]?.source ?? null) : null;
|
|
686
|
+
const source = candidate.id;
|
|
687
|
+
const declaration = context.identities.declarationIdOf(node);
|
|
688
|
+
const classId = context.identities.declarationIdOf(classNode);
|
|
689
|
+
const isPrivate = ts.isPrivateIdentifier(node.name);
|
|
690
|
+
const isStatic = isStaticMember(node);
|
|
691
|
+
// A field is installed via CreateDataPropertyOrThrow: writable, enumerable,
|
|
692
|
+
// and configurable are all true by construction (15.7.10/15.7.14), unlike a
|
|
693
|
+
// method's non-enumerable descriptor. A static field's placement is on the
|
|
694
|
+
// constructor object itself, never the prototype.
|
|
695
|
+
const descriptor = isPrivate ? null : { writable: true, enumerable: true, configurable: true };
|
|
696
|
+
const operations = [];
|
|
697
|
+
const edges = [];
|
|
698
|
+
// The initializer is a function: `ClassFieldDefinition` creates one and
|
|
699
|
+
// calls it once per construction with the instance as receiver. Allocating
|
|
700
|
+
// it here is what states that convention -- the body's own `this` reads the
|
|
701
|
+
// receiver this signature declares, and the construction site knows what to
|
|
702
|
+
// call. A field with no initializer creates none, which is why the operand
|
|
703
|
+
// is absent rather than a function that returns undefined.
|
|
704
|
+
let initializerObject = null;
|
|
705
|
+
// A field initialized with a GENERIC function literal the program never
|
|
706
|
+
// instantiates -- hono's `redirect = <T extends RedirectStatusCode = 302>(
|
|
707
|
+
// location, status?) => ...` in a program that never calls `c.redirect` --
|
|
708
|
+
// is a body `census.ts` walks not at all ("there is no such function in
|
|
709
|
+
// this program"), the same rule `declaration-lifecycle.ts`'s
|
|
710
|
+
// `namesUninstantiatedGeneric` applies to an import of one. Stating an
|
|
711
|
+
// initializer here anyway minted a thunk over an empty region: its return
|
|
712
|
+
// carried no value, the emitter spelled that as the `never` trap it is
|
|
713
|
+
// for a `return fail()`, and every `new Context(...)` threw before hono's
|
|
714
|
+
// handler ran. The field is recorded exactly as one declared with no
|
|
715
|
+
// initializer -- the only reads that could tell the difference are
|
|
716
|
+
// dynamic ones, and an uninstantiated generic has no value in this
|
|
717
|
+
// program for them to see either. A generic literal the program DOES
|
|
718
|
+
// call (`json: JSONRespond = <T, U>(...) => ...`) has copies, and keeps
|
|
719
|
+
// its initializer: `specialization.ts`'s `implementationOfCallee` is
|
|
720
|
+
// what gives it those copies through the field's declared signature.
|
|
721
|
+
const uninstantiatedGenericInitializer = node.initializer !== undefined &&
|
|
722
|
+
(ts.isArrowFunction(node.initializer) || ts.isFunctionExpression(node.initializer)) &&
|
|
723
|
+
context.specializations.isGeneric(node.initializer) &&
|
|
724
|
+
context.specializations.specializationsOf(context.identities.genericSubjectOf(node.initializer)).length === 0;
|
|
725
|
+
if (node.initializer && !candidate.classLayoutOnly && !uninstantiatedGenericInitializer) {
|
|
726
|
+
// An instance field initializer runs with the new instance as `this`;
|
|
727
|
+
// a static field initializer runs during class evaluation with the
|
|
728
|
+
// constructor object as `this`. These are different physical carriers,
|
|
729
|
+
// so the initializer convention has to state the corresponding side of
|
|
730
|
+
// the class rather than giving both the instance-side type.
|
|
731
|
+
const receiver = isStatic ? context.types.valueTypeAt(classNode) : context.types.instanceTypeAt(classNode);
|
|
732
|
+
// What the thunk RETURNS is what the initializer evaluates to, and for a
|
|
733
|
+
// field annotated with an overload set and initialized with a function
|
|
734
|
+
// literal those are two different types -- the annotation has the
|
|
735
|
+
// overloads, the literal has the one convention it physically allocates.
|
|
736
|
+
// Asked at the initializer in exactly that case (`structural-parts.ts`'s
|
|
737
|
+
// `memberOf` asks the same question of the same helper, so the field's
|
|
738
|
+
// layout and its initializer's return cannot disagree), and at the
|
|
739
|
+
// declaration for every other field, whose annotation is its storage and
|
|
740
|
+
// is what the rest of the program already agreed on.
|
|
741
|
+
// STATED: the field's own written annotation, so `physicalInitializerTypeOf`
|
|
742
|
+
// can tell an authored overload set apart from the initializer's one real
|
|
743
|
+
// convention -- not a question a census answers, since the census's job
|
|
744
|
+
// is inferring an ABSENT annotation, and this only fires when one exists.
|
|
745
|
+
const physical = physicalInitializerTypeOf(context.checker, node, context.checker.getTypeAtLocation(node));
|
|
746
|
+
const result = context.types.typeAt(physical === null ? node : node.initializer);
|
|
747
|
+
const shape = context.table.intern({
|
|
748
|
+
kind: 'signature',
|
|
749
|
+
call: [{ parameters: [], minimumArity: 0, thisParameter: receiver, result }],
|
|
750
|
+
construct: []
|
|
751
|
+
});
|
|
752
|
+
const id = mintOperationId(context.ordinals, source, 'allocation');
|
|
753
|
+
initializerObject = {
|
|
754
|
+
id,
|
|
755
|
+
family: 'allocation',
|
|
756
|
+
allocated: 'function-object',
|
|
757
|
+
shape,
|
|
758
|
+
callable: context.identities.functionIdOf(node),
|
|
759
|
+
caller: candidate.caller,
|
|
760
|
+
operands: [],
|
|
761
|
+
results: [mintResult(id, 'value', shape)],
|
|
762
|
+
completion: normalCompletion,
|
|
763
|
+
effects: { ...pureEffects, allocates: true },
|
|
764
|
+
evaluationOrdinal: candidate.evaluationOrdinal
|
|
765
|
+
};
|
|
766
|
+
operations.push(initializerObject);
|
|
767
|
+
}
|
|
768
|
+
const initializerValue = initializerObject ? resultOf(initializerObject, 'value') : null;
|
|
769
|
+
// The field's declared storage type is needed even when it has no
|
|
770
|
+
// initializer (`static cacheHexString: boolean`). It is carried as an
|
|
771
|
+
// absent operand because class definition does not evaluate another value
|
|
772
|
+
// for it; the shape is metadata consumed by the class projection.
|
|
773
|
+
const storageOperand = operand('field-storage', 0, { kind: 'absent' }, context.types.typeAt(node));
|
|
774
|
+
const fieldOperands = initializerValue
|
|
775
|
+
? [
|
|
776
|
+
...keyOperands,
|
|
777
|
+
storageOperand,
|
|
778
|
+
operand('initializer', 0, { kind: 'result', result: initializerValue.id }, initializerObject?.shape ?? voidType)
|
|
779
|
+
]
|
|
780
|
+
: [...keyOperands, storageOperand];
|
|
781
|
+
const defineId = mintOperationId(context.ordinals, source, 'class-lifecycle');
|
|
782
|
+
// Instance fields run their initializer at construction, after `super()`
|
|
783
|
+
// returns in a derived class -- this event records that the field exists
|
|
784
|
+
// and where it is installed. The initializer's own operations are attributed
|
|
785
|
+
// to the `field-initializer` region census already creates for this
|
|
786
|
+
// declaration, ordered against `super()` by whatever family models the
|
|
787
|
+
// constructor's invocation graph; this producer has no channel to that
|
|
788
|
+
// family's operation ids (see report on the `this`-not-bound-before-`super`
|
|
789
|
+
// requirement, which needs a binding event this event vocabulary lacks).
|
|
790
|
+
const defineOperation = {
|
|
791
|
+
...buildOperation(defineId, candidate.caller, context.evaluationOrdinals.next(candidate.caller), 'define-field', declaration, classId, descriptor, isStatic ? 'static' : 'own', fieldOperands, normalCompletion, { readsMutableState: false, writesMutableState: true, allocates: false, callsUserCode: false }),
|
|
792
|
+
...(ts.getJSDocTags(node).some((tag) => tag.tagName.text === 'geaSubclassMemberOverlay')
|
|
793
|
+
? { syntheticSubclassMemberOverlay: true }
|
|
794
|
+
: {})
|
|
795
|
+
};
|
|
796
|
+
operations.push(defineOperation);
|
|
797
|
+
if (initializerValue)
|
|
798
|
+
edges.push({ kind: 'value', result: initializerValue.id, to: defineId, role: 'initializer', ordinal: 0 });
|
|
799
|
+
if (keySource) {
|
|
800
|
+
const keyEdge = resultEdge(keySource, defineId, 'key', 0);
|
|
801
|
+
if (keyEdge)
|
|
802
|
+
edges.push(keyEdge);
|
|
803
|
+
}
|
|
804
|
+
edges.push({ kind: 'evaluation', from: ready, to: defineOperation.id });
|
|
805
|
+
if (isPrivate) {
|
|
806
|
+
const brandId = mintOperationId(context.ordinals, source, 'class-lifecycle');
|
|
807
|
+
const brandOperation = buildOperation(brandId, candidate.caller, candidate.evaluationOrdinal, 'install-private-brand', declaration, classId, null, null, [], normalCompletion, {
|
|
808
|
+
readsMutableState: false,
|
|
809
|
+
writesMutableState: true,
|
|
810
|
+
allocates: false,
|
|
811
|
+
callsUserCode: false
|
|
812
|
+
});
|
|
813
|
+
operations.push(brandOperation);
|
|
814
|
+
edges.push({ kind: 'evaluation', from: defineOperation.id, to: brandOperation.id });
|
|
815
|
+
}
|
|
816
|
+
return { kind: 'operations', operations, edges };
|
|
817
|
+
};
|
|
818
|
+
const contributeStaticBlock = (candidate, node) => {
|
|
819
|
+
const located = memberContext(candidate, node);
|
|
820
|
+
if ('kind' in located)
|
|
821
|
+
return located;
|
|
822
|
+
const { classNode, ready } = located;
|
|
823
|
+
const source = candidate.id;
|
|
824
|
+
const declaration = context.identities.declarationIdOf(node);
|
|
825
|
+
const classId = context.identities.declarationIdOf(classNode);
|
|
826
|
+
const id = mintOperationId(context.ordinals, source, 'class-lifecycle');
|
|
827
|
+
const operation = buildOperation(id, candidate.caller, context.evaluationOrdinals.next(candidate.caller), 'run-static-block', declaration, classId, null, null, [],
|
|
828
|
+
// The block body can throw and can read/write arbitrary state; its own
|
|
829
|
+
// statements are separately normalized under the `static-block` region
|
|
830
|
+
// census already creates, so this operation is the block's entry point.
|
|
831
|
+
throwingCompletion, { readsMutableState: true, writesMutableState: true, allocates: false, callsUserCode: true });
|
|
832
|
+
const edges = [];
|
|
833
|
+
edges.push({ kind: 'evaluation', from: ready, to: operation.id });
|
|
834
|
+
return { kind: 'operations', operations: [operation], edges };
|
|
835
|
+
};
|
|
836
|
+
/**
|
|
837
|
+
* A class expression's `evaluate-heritage` event -- the one lifecycle step
|
|
838
|
+
* an expression shares with a declaration. Its constructor object is the
|
|
839
|
+
* allocation family's (`allocations.ts`), and it binds no name, so neither
|
|
840
|
+
* `bind-class-value` nor a name binding is minted here; `census.ts`'s
|
|
841
|
+
* `familiesOf` routes only an expression WITH an `extends` clause this way.
|
|
842
|
+
*/
|
|
843
|
+
const contributeClassExpressionHeritage = (candidate, node) => {
|
|
844
|
+
const heritageExpression = node.heritageClauses?.find((clause) => clause.token === ts.SyntaxKind.ExtendsKeyword)?.types[0]?.expression;
|
|
845
|
+
const writtenConstructor = writtenConstructorAllocationOf(candidate, node);
|
|
846
|
+
if (!heritageExpression)
|
|
847
|
+
return { kind: 'operations', operations: writtenConstructor ? [writtenConstructor] : [], edges: [] };
|
|
848
|
+
const declaration = context.identities.declarationIdOf(node);
|
|
849
|
+
const evaluatedHeritage = transparentConstClassAliasTarget(context.checker, heritageExpression) ?? heritageExpression;
|
|
850
|
+
const cited = citeExpressionResult(evaluatedHeritage, context);
|
|
851
|
+
if (cited.kind === 'unmodelled') {
|
|
852
|
+
return asBlocked(candidate.id, 'class-lifecycle', `class heritage expression ${cited.reason}`, null);
|
|
853
|
+
}
|
|
854
|
+
const id = mintOperationId(context.ordinals, candidate.id, 'class-lifecycle');
|
|
855
|
+
const operation = buildOperation(id, candidate.caller, context.evaluationOrdinals.next(candidate.caller), 'evaluate-heritage', declaration, declaration, null, null, [operand('heritage', 0, cited.source, context.types.typeAt(evaluatedHeritage))], throwingCompletion, { readsMutableState: true, writesMutableState: false, allocates: false, callsUserCode: false });
|
|
856
|
+
const edge = resultEdge(cited.source, id, 'heritage', 0);
|
|
857
|
+
const constructor = citeExpressionResult(node, context);
|
|
858
|
+
if (constructor.kind === 'unmodelled' || constructor.source.kind !== 'result') {
|
|
859
|
+
return asBlocked(candidate.id, 'class-lifecycle', 'class heritage has no evaluated constructor object', 'P6');
|
|
860
|
+
}
|
|
861
|
+
return {
|
|
862
|
+
kind: 'operations',
|
|
863
|
+
operations: writtenConstructor ? [writtenConstructor, operation] : [operation],
|
|
864
|
+
edges: [...(edge ? [edge] : []), { kind: 'evaluation', from: id, to: operationOfResult(constructor.source.result) }]
|
|
865
|
+
};
|
|
866
|
+
};
|
|
867
|
+
const contribute = (candidate) => {
|
|
868
|
+
const { node } = candidate;
|
|
869
|
+
if (ts.isClassDeclaration(node))
|
|
870
|
+
return contributeClass(candidate, node);
|
|
871
|
+
if (ts.isClassExpression(node))
|
|
872
|
+
return contributeClassExpressionHeritage(candidate, node);
|
|
873
|
+
if (ts.isMethodDeclaration(node) || ts.isGetAccessorDeclaration(node) || ts.isSetAccessorDeclaration(node)) {
|
|
874
|
+
return contributeMethodOrAccessor(candidate, node);
|
|
875
|
+
}
|
|
876
|
+
if (ts.isPropertyDeclaration(node))
|
|
877
|
+
return contributeField(candidate, node);
|
|
878
|
+
if (ts.isClassStaticBlockDeclaration(node))
|
|
879
|
+
return contributeStaticBlock(candidate, node);
|
|
880
|
+
if (ts.isParameter(node))
|
|
881
|
+
return contributeParameterProperty(candidate, node);
|
|
882
|
+
// A written constructor has no lifecycle event of its own: unlike a method
|
|
883
|
+
// or accessor, it is never installed onto a prototype, and unlike a field
|
|
884
|
+
// it is never run as a per-instance initializer step -- `[[Construct]]`
|
|
885
|
+
// calls it directly as the class's own body. Its allocation (the callable
|
|
886
|
+
// convention `functionIdOf(written)` gives the body) and its binding into
|
|
887
|
+
// the class's own name are both already published by `contributeClass`
|
|
888
|
+
// above, from the *class declaration's* candidate, because both need
|
|
889
|
+
// `written` before this per-member candidate for the constructor node
|
|
890
|
+
// itself is even visited. Its parameters are ordinary `binding`-family
|
|
891
|
+
// candidates (bodied since `bindings.ts`'s `hasArgumentFrame` recognizes
|
|
892
|
+
// `ConstructorDeclaration`) and its statements are their own families
|
|
893
|
+
// under its own `FunctionId` as caller -- neither runs through this
|
|
894
|
+
// family at all. So this candidate genuinely has nothing left to
|
|
895
|
+
// introduce, the same "nothing at this coordinate" answer a
|
|
896
|
+
// pattern-nested `BindingElement` gives in `bindings.ts`.
|
|
897
|
+
if (ts.isConstructorDeclaration(node))
|
|
898
|
+
return { kind: 'operations', operations: [], edges: [] };
|
|
899
|
+
return asBlocked(candidate.id, 'class-lifecycle', 'census produced a class-lifecycle candidate of an unmodelled node kind', null);
|
|
900
|
+
};
|
|
901
|
+
return { family: 'class-lifecycle', contribute };
|
|
902
|
+
};
|