@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,20 @@
|
|
|
1
|
+
import type { RepresentationDeriver } from '../representation/derive.js';
|
|
2
|
+
import type { Representation } from '../representation/model.js';
|
|
3
|
+
/**
|
|
4
|
+
* ECMA-262 ToPrimitive, decided from a carrier alone.
|
|
5
|
+
*
|
|
6
|
+
* ApplyStringOrNumericBinaryOperator (13.15.3) and IsLessThan (7.2.13) both
|
|
7
|
+
* run ToPrimitive on each operand BEFORE choosing between the string and the
|
|
8
|
+
* numeric rule, and for every object this compiler carries that step has a
|
|
9
|
+
* compile-time answer: an ordinary object with no own `valueOf` falls through
|
|
10
|
+
* OrdinaryToPrimitive's `valueOf` attempt to `toString` whatever the hint,
|
|
11
|
+
* so its primitive IS a string. A Date is the one exception -- its own
|
|
12
|
+
* `@@toPrimitive` prefers `valueOf` for hint "number" -- and a primitive
|
|
13
|
+
* carrier is already its own answer. The slot census reads this to decide
|
|
14
|
+
* which coercion (`ToNumber` or `ToString`) a mixed-carrier operator's
|
|
15
|
+
* operands take; the printer's ToNumber renderer reads the same set to know
|
|
16
|
+
* which carriers reach a number only through their string.
|
|
17
|
+
*/
|
|
18
|
+
export declare const toStringOnlyObjectKinds: ReadonlySet<Representation['kind']>;
|
|
19
|
+
/** Whether an operand's ToPrimitive is a String for every value the carrier can hold. */
|
|
20
|
+
export declare const provablyStringPrimitive: (representation: Representation, deriver: Pick<RepresentationDeriver, "isDateCarrier">) => boolean;
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ECMA-262 ToPrimitive, decided from a carrier alone.
|
|
3
|
+
*
|
|
4
|
+
* ApplyStringOrNumericBinaryOperator (13.15.3) and IsLessThan (7.2.13) both
|
|
5
|
+
* run ToPrimitive on each operand BEFORE choosing between the string and the
|
|
6
|
+
* numeric rule, and for every object this compiler carries that step has a
|
|
7
|
+
* compile-time answer: an ordinary object with no own `valueOf` falls through
|
|
8
|
+
* OrdinaryToPrimitive's `valueOf` attempt to `toString` whatever the hint,
|
|
9
|
+
* so its primitive IS a string. A Date is the one exception -- its own
|
|
10
|
+
* `@@toPrimitive` prefers `valueOf` for hint "number" -- and a primitive
|
|
11
|
+
* carrier is already its own answer. The slot census reads this to decide
|
|
12
|
+
* which coercion (`ToNumber` or `ToString`) a mixed-carrier operator's
|
|
13
|
+
* operands take; the printer's ToNumber renderer reads the same set to know
|
|
14
|
+
* which carriers reach a number only through their string.
|
|
15
|
+
*/
|
|
16
|
+
export const toStringOnlyObjectKinds = new Set([
|
|
17
|
+
'record',
|
|
18
|
+
'record-with-index',
|
|
19
|
+
'native-record-ref',
|
|
20
|
+
'class-ref',
|
|
21
|
+
'array-object',
|
|
22
|
+
'dictionary',
|
|
23
|
+
'keyed-collection',
|
|
24
|
+
'promise',
|
|
25
|
+
'typed-array',
|
|
26
|
+
'array-buffer',
|
|
27
|
+
'shared-array-buffer',
|
|
28
|
+
'data-view',
|
|
29
|
+
'proxy-object'
|
|
30
|
+
]);
|
|
31
|
+
/** Whether an operand's ToPrimitive is a String for every value the carrier can hold. */
|
|
32
|
+
export const provablyStringPrimitive = (representation, deriver) => representation.kind === 'string' ||
|
|
33
|
+
(toStringOnlyObjectKinds.has(representation.kind) && !(deriver.isDateCarrier?.(representation) ?? false));
|
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
import type { DeclarationId, FunctionId } from '../identity/ids.js';
|
|
2
|
+
import type { ClassLayout, ClassMethod } from './classes.js';
|
|
3
|
+
import type { ConversionCensus } from '../conversion/nodes.js';
|
|
4
|
+
import type { CallableAbi } from '../representation/model.js';
|
|
5
|
+
/** Exact allocation identities and the method each prototype lookup selects.
|
|
6
|
+
* Selection happens when the property is read, before a later call supplies
|
|
7
|
+
* its receiver. A virtual call adapter would select at the wrong time.
|
|
8
|
+
*/
|
|
9
|
+
export declare const classPrototypeMethodValueArmsOf: (classes: ReadonlyMap<DeclarationId, ClassLayout>, receiver: DeclarationId, key: string) => readonly {
|
|
10
|
+
readonly allocation: DeclarationId;
|
|
11
|
+
readonly method: (ClassMethod & {
|
|
12
|
+
readonly callable: FunctionId;
|
|
13
|
+
}) | null;
|
|
14
|
+
}[] | null;
|
|
15
|
+
/** All prototype keys reachable through this native family, including keys
|
|
16
|
+
* introduced below the static receiver and inherited above it.
|
|
17
|
+
*/
|
|
18
|
+
export declare const classPrototypeMethodKeysOf: (classes: ReadonlyMap<DeclarationId, ClassLayout>, receiver: DeclarationId) => readonly string[];
|
|
19
|
+
/** A statically callable family still requires a method on every allocation. */
|
|
20
|
+
export declare const classMethodValueArmsOf: (classes: ReadonlyMap<DeclarationId, ClassLayout>, receiver: DeclarationId, key: string) => readonly {
|
|
21
|
+
readonly allocation: DeclarationId;
|
|
22
|
+
readonly method: ClassMethod & {
|
|
23
|
+
readonly callable: FunctionId;
|
|
24
|
+
};
|
|
25
|
+
}[] | null;
|
|
26
|
+
/**
|
|
27
|
+
* The class-hierarchy topology behind method dispatch: which key belongs to
|
|
28
|
+
* which override family, and who redeclares what.
|
|
29
|
+
*
|
|
30
|
+
* Both questions are pure functions of `ClassLayout` -- no lowered IR, no
|
|
31
|
+
* capture analysis, no render-time ABI comparison enters them -- so they
|
|
32
|
+
* belong here rather than in the C++ target, and `targets/cpp/virtual-methods.
|
|
33
|
+
* ts`/`targets/cpp/class-layout.ts` re-export them rather than defining their
|
|
34
|
+
* own copies. `virtual-methods.ts` previously carried its own `extendsClass`,
|
|
35
|
+
* byte-identical to `class-layout.ts`'s: two definitions of one graph walk is
|
|
36
|
+
* the exact two-authorities shape a single import now forecloses.
|
|
37
|
+
*
|
|
38
|
+
* The DISPATCHABILITY verdict -- whether a family is actually dispatchable
|
|
39
|
+
* (every override's ABI is compatible, and none of them captures an
|
|
40
|
+
* environment a C++ member function has no formal to carry) -- lives here
|
|
41
|
+
* too now, as `virtualDispatchVerdictOf` below. It used to live in
|
|
42
|
+
* `targets/cpp/virtual-methods.ts`, decided from the LOWERED bodies' ABIs and
|
|
43
|
+
* `targets/cpp/captures.ts`'s whole-unit capture index, both of which existed
|
|
44
|
+
* only after every body in the unit had lowered (`translation-unit.ts`'s
|
|
45
|
+
* `renderTranslationUnit`) -- a fact this module, which runs before any body
|
|
46
|
+
* lowers, could not see. What moved it here is `ir/captures.ts`'s
|
|
47
|
+
* `publishCaptureFacts`, sealed onto every body as `IrBody.facts` right after
|
|
48
|
+
* `shakeProgram`, which is where `ir/captures.ts` fills the allocation op:
|
|
49
|
+
* `IrBodyFacts.capturedDeclarations`/
|
|
50
|
+
* `.capturedReceiver` name capture-freedom with no C++ in the answer, so a
|
|
51
|
+
* caller can hand `virtualDispatchVerdictOf` a plain predicate over those
|
|
52
|
+
* published facts instead of a render-time capture index. The one thing that
|
|
53
|
+
* still cannot move is ABI-compatibility TEXT (the exact conversion an
|
|
54
|
+
* implementor's parameter or receiver needs) -- that stays a C++ spelling in
|
|
55
|
+
* `virtual-methods.ts`, which renders it having already been TOLD by this
|
|
56
|
+
* verdict that every implementor converts; see that file's `virtualMethodAdapterOf`.
|
|
57
|
+
*/
|
|
58
|
+
/** Whether `candidate`'s base chain reaches `ancestor`. A class reached twice would be a class extending itself, which no well-formed program has, so the walk stops there rather than looping. */
|
|
59
|
+
export declare const extendsClass: (classes: ReadonlyMap<DeclarationId, ClassLayout>, candidate: DeclarationId, ancestor: DeclarationId) => boolean;
|
|
60
|
+
/**
|
|
61
|
+
* Every class BELOW `declaration` that redeclares `key`, nearest first.
|
|
62
|
+
*
|
|
63
|
+
* `classMemberOf` (`projection/fields.ts`) walks UP, which is the language's
|
|
64
|
+
* lookup for a receiver whose class is known exactly. It is not the whole
|
|
65
|
+
* answer for a CALL. A receiver annotated as a base can hold an instance of
|
|
66
|
+
* anything derived from it, and the language dispatches on the object; so a
|
|
67
|
+
* member found up the chain is only safe to bind directly when nothing below
|
|
68
|
+
* redeclares it. An empty result is the proof that the family is closed at
|
|
69
|
+
* this key -- the assumption every direct bind of a method or accessor body
|
|
70
|
+
* already makes, now asked rather than assumed.
|
|
71
|
+
*
|
|
72
|
+
* The search is over the whole class map because inheritance is stated
|
|
73
|
+
* upward: a layout names its base and never its derivations, so the derived
|
|
74
|
+
* side exists only as the set of classes whose own chain leads here.
|
|
75
|
+
*/
|
|
76
|
+
export declare const classFamilyOverridesOf: (classes: ReadonlyMap<DeclarationId, ClassLayout>, declaration: DeclarationId, key: string) => readonly DeclarationId[];
|
|
77
|
+
/**
|
|
78
|
+
* Which of a member's three dispatchable halves a family is.
|
|
79
|
+
*
|
|
80
|
+
* A key is a method OR an accessor, never both, so `call` never coexists with
|
|
81
|
+
* the other two on one key -- but a getter and a setter are two bodies with
|
|
82
|
+
* two conventions, and each needs its own slot.
|
|
83
|
+
*/
|
|
84
|
+
export type VirtualMemberRole = 'call' | 'get' | 'set';
|
|
85
|
+
/** One key, and every class in its family that implements it. */
|
|
86
|
+
export interface VirtualMethodFamily {
|
|
87
|
+
readonly key: string;
|
|
88
|
+
/** Which half of the member this family dispatches. */
|
|
89
|
+
readonly role: VirtualMemberRole;
|
|
90
|
+
/** The topmost class declaring the key: the struct that gets the `virtual` member. */
|
|
91
|
+
readonly root: DeclarationId;
|
|
92
|
+
readonly implementors: readonly VirtualMethodImplementor[];
|
|
93
|
+
/**
|
|
94
|
+
* Whether the root's own declaration is BODYLESS -- `abstract check(value:
|
|
95
|
+
* number): boolean`, or an overload signature with no implementation.
|
|
96
|
+
*
|
|
97
|
+
* The root is what gives the family its dispatch slot, and a slot is a
|
|
98
|
+
* declaration, not a body: an abstract root states the convention every
|
|
99
|
+
* override is checked against and supplies nothing to run. Dropping the
|
|
100
|
+
* family for want of a root body is what sent `rules.map(r => r.describe())`
|
|
101
|
+
* over `Rule[]` through a boxed dynamic property read, which then aborted at
|
|
102
|
+
* runtime -- the program was statically dispatchable the whole time.
|
|
103
|
+
*/
|
|
104
|
+
readonly abstractRoot: boolean;
|
|
105
|
+
}
|
|
106
|
+
export interface VirtualMethodImplementor {
|
|
107
|
+
readonly declaration: DeclarationId;
|
|
108
|
+
readonly callable: FunctionId;
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Every method key the program actually overrides, grouped by the class that
|
|
112
|
+
* roots the family.
|
|
113
|
+
*
|
|
114
|
+
* A key declared only by unrelated classes is not a family: no receiver can be
|
|
115
|
+
* typed as a common base that has it, so nothing dispatches. Only a key whose
|
|
116
|
+
* ROOT declares it, and which something derived from that root redeclares,
|
|
117
|
+
* needs a vtable slot.
|
|
118
|
+
*/
|
|
119
|
+
export declare const virtualMethodFamiliesOf: (classes: ReadonlyMap<DeclarationId, ClassLayout>) => readonly VirtualMethodFamily[];
|
|
120
|
+
/** The key a call site looks up: the class it resolved the member ON, plus the member. Moved here from `targets/cpp/virtual-methods.ts` (which still re-exports it) so `ir/call-dispatch.ts` can ask the identical question without importing a target module. */
|
|
121
|
+
export declare const virtualDispatchKey: (owner: DeclarationId, key: string, role?: VirtualMemberRole) => string;
|
|
122
|
+
/** One family `virtualDispatchVerdictOf` proved dispatchable: the topology (`virtualMethodFamiliesOf`'s answer) plus the ABI every implementor was proven to convert to. */
|
|
123
|
+
export interface VirtualFamilyVerdict {
|
|
124
|
+
readonly family: VirtualMethodFamily;
|
|
125
|
+
readonly rootAbi: CallableAbi;
|
|
126
|
+
/** Every selected receiver, parameter and result adapter avoids native field protocols. */
|
|
127
|
+
readonly nativeFieldProtocol?: 'unused';
|
|
128
|
+
}
|
|
129
|
+
/** One family `virtualDispatchVerdictOf` refused, and why. */
|
|
130
|
+
export interface VirtualFamilyRefusal {
|
|
131
|
+
readonly key: string;
|
|
132
|
+
readonly role: VirtualMemberRole;
|
|
133
|
+
readonly owner: DeclarationId;
|
|
134
|
+
readonly reason: string;
|
|
135
|
+
}
|
|
136
|
+
export interface VirtualDispatchVerdict {
|
|
137
|
+
readonly families: readonly VirtualFamilyVerdict[];
|
|
138
|
+
readonly refused: readonly VirtualFamilyRefusal[];
|
|
139
|
+
/**
|
|
140
|
+
* Every class-key-role a receiver ANYWHERE in a dispatchable family's
|
|
141
|
+
* subtree resolves to, expanded from `families` the way a call site looks
|
|
142
|
+
* a member up: a class between the root and an implementor inherits the
|
|
143
|
+
* member, so the whole subtree -- not only the implementors -- is
|
|
144
|
+
* dispatchable through it. Keyed by `virtualDispatchKey`.
|
|
145
|
+
*/
|
|
146
|
+
readonly dispatched: ReadonlyMap<string, VirtualFamilyVerdict>;
|
|
147
|
+
}
|
|
148
|
+
/**
|
|
149
|
+
* The dispatchability verdict for every override family: whether it can be
|
|
150
|
+
* dispatched through a C++ virtual member at all, and the exact convention
|
|
151
|
+
* (`rootAbi`) every call site converts to when it can.
|
|
152
|
+
*
|
|
153
|
+
* `abiOf` answers with the convention a body was compiled under, which is the
|
|
154
|
+
* one authority on its formals -- deriving them here a second way is the
|
|
155
|
+
* two-authorities shape that produces a member the definition cannot match. A
|
|
156
|
+
* family whose implementors disagree on that convention, or one whose body
|
|
157
|
+
* captures an environment (a capturing body carries a formal no member can
|
|
158
|
+
* supply), is REFUSED rather than approximated: a call site then declines the
|
|
159
|
+
* direct bind too, so the program never silently runs the base's body.
|
|
160
|
+
*
|
|
161
|
+
* `capturesNothing` is asked directly of `IrBody.facts` by the caller (see
|
|
162
|
+
* `ir/captures.ts`'s `IrBodyFacts.capturedDeclarations`/`.capturedReceiver`)
|
|
163
|
+
* -- not of a render-time `CaptureIndex` admission, which only ever answers
|
|
164
|
+
* for a body some `allocate-callable` operation names, and a plain instance
|
|
165
|
+
* method almost never is one.
|
|
166
|
+
*/
|
|
167
|
+
export declare const virtualDispatchVerdictOf: (classes: ReadonlyMap<DeclarationId, ClassLayout>, abiOf: (callable: FunctionId) => CallableAbi | null, capturesNothing: (callable: FunctionId) => boolean, conversions: ConversionCensus) => VirtualDispatchVerdict;
|
|
@@ -0,0 +1,379 @@
|
|
|
1
|
+
import { representationKey } from '../representation/model.js';
|
|
2
|
+
import { classMemberOf } from './fields.js';
|
|
3
|
+
/** Exact allocation identities and the method each prototype lookup selects.
|
|
4
|
+
* Selection happens when the property is read, before a later call supplies
|
|
5
|
+
* its receiver. A virtual call adapter would select at the wrong time.
|
|
6
|
+
*/
|
|
7
|
+
export const classPrototypeMethodValueArmsOf = (classes, receiver, key) => {
|
|
8
|
+
const arms = [];
|
|
9
|
+
for (const [allocation, layout] of classes) {
|
|
10
|
+
if (allocation !== receiver && !extendsClass(classes, allocation, receiver))
|
|
11
|
+
continue;
|
|
12
|
+
if (layout.nativeBase !== null)
|
|
13
|
+
return null;
|
|
14
|
+
const site = classMemberOf(classes, allocation, key);
|
|
15
|
+
// Absence belongs to the language's undefined result. An accessor is an
|
|
16
|
+
// invocation, not a method value, and must keep its separate proof path.
|
|
17
|
+
if (site === null)
|
|
18
|
+
arms.push({ allocation, method: null });
|
|
19
|
+
else if (site.kind === 'method' && site.method.callable !== null)
|
|
20
|
+
arms.push({ allocation, method: { ...site.method, callable: site.method.callable } });
|
|
21
|
+
else
|
|
22
|
+
return null;
|
|
23
|
+
}
|
|
24
|
+
return arms.length === 0 ? null : arms;
|
|
25
|
+
};
|
|
26
|
+
/** All prototype keys reachable through this native family, including keys
|
|
27
|
+
* introduced below the static receiver and inherited above it.
|
|
28
|
+
*/
|
|
29
|
+
export const classPrototypeMethodKeysOf = (classes, receiver) => {
|
|
30
|
+
const keys = new Set();
|
|
31
|
+
const visited = new Set();
|
|
32
|
+
for (const allocation of classes.keys()) {
|
|
33
|
+
if (allocation !== receiver && !extendsClass(classes, allocation, receiver))
|
|
34
|
+
continue;
|
|
35
|
+
for (let current = allocation; current !== null && !visited.has(current);) {
|
|
36
|
+
visited.add(current);
|
|
37
|
+
const layout = classes.get(current);
|
|
38
|
+
if (!layout)
|
|
39
|
+
break;
|
|
40
|
+
for (const method of layout.methods)
|
|
41
|
+
keys.add(method.key);
|
|
42
|
+
current = layout.base;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
return [...keys];
|
|
46
|
+
};
|
|
47
|
+
/** A statically callable family still requires a method on every allocation. */
|
|
48
|
+
export const classMethodValueArmsOf = (classes, receiver, key) => {
|
|
49
|
+
const arms = classPrototypeMethodValueArmsOf(classes, receiver, key);
|
|
50
|
+
if (arms === null || arms.some((arm) => arm.method === null))
|
|
51
|
+
return null;
|
|
52
|
+
return arms.map((arm) => ({ allocation: arm.allocation, method: arm.method }));
|
|
53
|
+
};
|
|
54
|
+
/**
|
|
55
|
+
* The class-hierarchy topology behind method dispatch: which key belongs to
|
|
56
|
+
* which override family, and who redeclares what.
|
|
57
|
+
*
|
|
58
|
+
* Both questions are pure functions of `ClassLayout` -- no lowered IR, no
|
|
59
|
+
* capture analysis, no render-time ABI comparison enters them -- so they
|
|
60
|
+
* belong here rather than in the C++ target, and `targets/cpp/virtual-methods.
|
|
61
|
+
* ts`/`targets/cpp/class-layout.ts` re-export them rather than defining their
|
|
62
|
+
* own copies. `virtual-methods.ts` previously carried its own `extendsClass`,
|
|
63
|
+
* byte-identical to `class-layout.ts`'s: two definitions of one graph walk is
|
|
64
|
+
* the exact two-authorities shape a single import now forecloses.
|
|
65
|
+
*
|
|
66
|
+
* The DISPATCHABILITY verdict -- whether a family is actually dispatchable
|
|
67
|
+
* (every override's ABI is compatible, and none of them captures an
|
|
68
|
+
* environment a C++ member function has no formal to carry) -- lives here
|
|
69
|
+
* too now, as `virtualDispatchVerdictOf` below. It used to live in
|
|
70
|
+
* `targets/cpp/virtual-methods.ts`, decided from the LOWERED bodies' ABIs and
|
|
71
|
+
* `targets/cpp/captures.ts`'s whole-unit capture index, both of which existed
|
|
72
|
+
* only after every body in the unit had lowered (`translation-unit.ts`'s
|
|
73
|
+
* `renderTranslationUnit`) -- a fact this module, which runs before any body
|
|
74
|
+
* lowers, could not see. What moved it here is `ir/captures.ts`'s
|
|
75
|
+
* `publishCaptureFacts`, sealed onto every body as `IrBody.facts` right after
|
|
76
|
+
* `shakeProgram`, which is where `ir/captures.ts` fills the allocation op:
|
|
77
|
+
* `IrBodyFacts.capturedDeclarations`/
|
|
78
|
+
* `.capturedReceiver` name capture-freedom with no C++ in the answer, so a
|
|
79
|
+
* caller can hand `virtualDispatchVerdictOf` a plain predicate over those
|
|
80
|
+
* published facts instead of a render-time capture index. The one thing that
|
|
81
|
+
* still cannot move is ABI-compatibility TEXT (the exact conversion an
|
|
82
|
+
* implementor's parameter or receiver needs) -- that stays a C++ spelling in
|
|
83
|
+
* `virtual-methods.ts`, which renders it having already been TOLD by this
|
|
84
|
+
* verdict that every implementor converts; see that file's `virtualMethodAdapterOf`.
|
|
85
|
+
*/
|
|
86
|
+
/** Whether `candidate`'s base chain reaches `ancestor`. A class reached twice would be a class extending itself, which no well-formed program has, so the walk stops there rather than looping. */
|
|
87
|
+
export const extendsClass = (classes, candidate, ancestor) => {
|
|
88
|
+
const walked = new Set();
|
|
89
|
+
let current = classes.get(candidate)?.base ?? null;
|
|
90
|
+
while (current !== null && !walked.has(current)) {
|
|
91
|
+
if (current === ancestor)
|
|
92
|
+
return true;
|
|
93
|
+
walked.add(current);
|
|
94
|
+
current = classes.get(current)?.base ?? null;
|
|
95
|
+
}
|
|
96
|
+
return false;
|
|
97
|
+
};
|
|
98
|
+
/**
|
|
99
|
+
* Every class BELOW `declaration` that redeclares `key`, nearest first.
|
|
100
|
+
*
|
|
101
|
+
* `classMemberOf` (`projection/fields.ts`) walks UP, which is the language's
|
|
102
|
+
* lookup for a receiver whose class is known exactly. It is not the whole
|
|
103
|
+
* answer for a CALL. A receiver annotated as a base can hold an instance of
|
|
104
|
+
* anything derived from it, and the language dispatches on the object; so a
|
|
105
|
+
* member found up the chain is only safe to bind directly when nothing below
|
|
106
|
+
* redeclares it. An empty result is the proof that the family is closed at
|
|
107
|
+
* this key -- the assumption every direct bind of a method or accessor body
|
|
108
|
+
* already makes, now asked rather than assumed.
|
|
109
|
+
*
|
|
110
|
+
* The search is over the whole class map because inheritance is stated
|
|
111
|
+
* upward: a layout names its base and never its derivations, so the derived
|
|
112
|
+
* side exists only as the set of classes whose own chain leads here.
|
|
113
|
+
*/
|
|
114
|
+
export const classFamilyOverridesOf = (classes, declaration, key) => {
|
|
115
|
+
const overriding = [];
|
|
116
|
+
for (const [candidate, layout] of classes) {
|
|
117
|
+
if (candidate === declaration)
|
|
118
|
+
continue;
|
|
119
|
+
if (!layout.accessors.some((entry) => entry.key === key) && !layout.methods.some((entry) => entry.key === key))
|
|
120
|
+
continue;
|
|
121
|
+
if (extendsClass(classes, candidate, declaration))
|
|
122
|
+
overriding.push(candidate);
|
|
123
|
+
}
|
|
124
|
+
return overriding;
|
|
125
|
+
};
|
|
126
|
+
/** The topmost class along `declaration`'s chain that declares `key` as a method. */
|
|
127
|
+
const rootDeclaring = (classes, declaration, key) => {
|
|
128
|
+
const walked = new Set();
|
|
129
|
+
let root = declaration;
|
|
130
|
+
let current = declaration;
|
|
131
|
+
while (current !== null && !walked.has(current)) {
|
|
132
|
+
walked.add(current);
|
|
133
|
+
const layout = classes.get(current);
|
|
134
|
+
if (!layout)
|
|
135
|
+
return root;
|
|
136
|
+
// Accessors alongside methods: `get label()` overridden by `get label()`
|
|
137
|
+
// is the identical family question, and asking only about methods rooted
|
|
138
|
+
// every override at its own class, which is no family at all.
|
|
139
|
+
if (layout.methods.some((method) => method.key === key) || layout.accessors.some((entry) => entry.key === key))
|
|
140
|
+
root = current;
|
|
141
|
+
current = layout.base;
|
|
142
|
+
}
|
|
143
|
+
return root;
|
|
144
|
+
};
|
|
145
|
+
/**
|
|
146
|
+
* Every method key the program actually overrides, grouped by the class that
|
|
147
|
+
* roots the family.
|
|
148
|
+
*
|
|
149
|
+
* A key declared only by unrelated classes is not a family: no receiver can be
|
|
150
|
+
* typed as a common base that has it, so nothing dispatches. Only a key whose
|
|
151
|
+
* ROOT declares it, and which something derived from that root redeclares,
|
|
152
|
+
* needs a vtable slot.
|
|
153
|
+
*/
|
|
154
|
+
export const virtualMethodFamiliesOf = (classes) => {
|
|
155
|
+
const byRoot = new Map();
|
|
156
|
+
const record = (declaration, key, role, callable) => {
|
|
157
|
+
const root = rootDeclaring(classes, declaration, key);
|
|
158
|
+
const id = `${root} ${key} ${role}`;
|
|
159
|
+
const entry = byRoot.get(id) ?? { key, role, root, rootDeclares: false, implementors: [] };
|
|
160
|
+
if (declaration === root)
|
|
161
|
+
entry.rootDeclares = true;
|
|
162
|
+
if (callable !== null)
|
|
163
|
+
entry.implementors.push({ declaration, callable });
|
|
164
|
+
byRoot.set(id, entry);
|
|
165
|
+
};
|
|
166
|
+
for (const [declaration, layout] of classes) {
|
|
167
|
+
for (const method of layout.methods)
|
|
168
|
+
record(declaration, method.key, 'call', method.callable);
|
|
169
|
+
for (const accessor of layout.accessors) {
|
|
170
|
+
record(declaration, accessor.key, 'get', accessor.getter);
|
|
171
|
+
record(declaration, accessor.key, 'set', accessor.setter);
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
return [...byRoot.values()]
|
|
175
|
+
.filter((entry) => entry.implementors.some((implementor) => implementor.declaration !== entry.root))
|
|
176
|
+
.filter((entry) => entry.rootDeclares)
|
|
177
|
+
.map((entry) => ({
|
|
178
|
+
key: entry.key,
|
|
179
|
+
role: entry.role,
|
|
180
|
+
root: entry.root,
|
|
181
|
+
abstractRoot: !entry.implementors.some((implementor) => implementor.declaration === entry.root),
|
|
182
|
+
implementors: [...entry.implementors].sort((left, right) => (left.declaration < right.declaration ? -1 : 1))
|
|
183
|
+
}))
|
|
184
|
+
.sort((left, right) => (`${left.root} ${left.key} ${left.role}` < `${right.root} ${right.key} ${right.role}` ? -1 : 1));
|
|
185
|
+
};
|
|
186
|
+
/** The key a call site looks up: the class it resolved the member ON, plus the member. Moved here from `targets/cpp/virtual-methods.ts` (which still re-exports it) so `ir/call-dispatch.ts` can ask the identical question without importing a target module. */
|
|
187
|
+
export const virtualDispatchKey = (owner, key, role = 'call') => `${owner} ${key} ${role}`;
|
|
188
|
+
/**
|
|
189
|
+
* Whether `source`'s class-ref carrier can reach `target`'s -- an upcast to
|
|
190
|
+
* an ancestor (or itself), or a runtime-checked downcast to a descendant
|
|
191
|
+
* with at least one other concrete class in the program to distinguish it
|
|
192
|
+
* from. Mirrors `targets/cpp/virtual-methods.ts`'s old `classRefConversionText`'s
|
|
193
|
+
* null-vs-text branching, minus the text: virtual dispatch's receiver/
|
|
194
|
+
* argument adaptation is a C++ mechanism with no ECMAScript-level conversion
|
|
195
|
+
* behind it, so this stays a standalone structural test rather than a
|
|
196
|
+
* `ConversionCensus` entry.
|
|
197
|
+
*/
|
|
198
|
+
const classRefConvertible = (classes, source, target) => {
|
|
199
|
+
if (source.ownership !== 'shared-refcount' || target.ownership !== 'shared-refcount')
|
|
200
|
+
return false;
|
|
201
|
+
if (source.declaration === target.declaration || extendsClass(classes, source.declaration, target.declaration))
|
|
202
|
+
return true;
|
|
203
|
+
if (!extendsClass(classes, target.declaration, source.declaration))
|
|
204
|
+
return false;
|
|
205
|
+
return [...classes.keys()].some((declaration) => declaration === target.declaration || extendsClass(classes, declaration, target.declaration));
|
|
206
|
+
};
|
|
207
|
+
/**
|
|
208
|
+
* Whether an OMITTED argument -- an implementor with more formals than the
|
|
209
|
+
* family's root convention supplies -- can be represented at all.
|
|
210
|
+
*
|
|
211
|
+
* Mirrors `targets/cpp/types.ts`'s `cppUndefinedIn` EXISTENCE check (which
|
|
212
|
+
* kinds admit an `undefined` value) without any of its C++ text: the verdict
|
|
213
|
+
* only needs to know an omitted value CAN be carried, never what its spelling
|
|
214
|
+
* is, so duplicating the shape test here -- rather than threading a text
|
|
215
|
+
* builder into a projection-level module -- is the one part of that function
|
|
216
|
+
* safe to restate.
|
|
217
|
+
*/
|
|
218
|
+
const admitsUndefined = (representation) => {
|
|
219
|
+
if (representation.kind === 'undefined' || representation.kind === 'dynamic')
|
|
220
|
+
return true;
|
|
221
|
+
if (representation.kind === 'optional' && representation.absence === 'undefined')
|
|
222
|
+
return true;
|
|
223
|
+
if (representation.kind === 'tagged-union')
|
|
224
|
+
return representation.arms.some((arm) => arm.value.kind === 'undefined');
|
|
225
|
+
return false;
|
|
226
|
+
};
|
|
227
|
+
/**
|
|
228
|
+
* One parameter/receiver/result conversion a virtual member adapter needs,
|
|
229
|
+
* decided generically: class-ref pairs by the structural rule above,
|
|
230
|
+
* everything else by asking the SAME conversion census the printer's own
|
|
231
|
+
* `alignedValueText` consults (`emit-narrowing.ts`), so this can never
|
|
232
|
+
* approve a pair the printer would refuse.
|
|
233
|
+
*/
|
|
234
|
+
const virtualValueConvertible = (classes, conversions, source, target) => {
|
|
235
|
+
if (source.kind === 'class-ref' && target.kind === 'class-ref')
|
|
236
|
+
return classRefConvertible(classes, source, target);
|
|
237
|
+
return conversions.nodeFor(source, target).capability.kind !== 'never';
|
|
238
|
+
};
|
|
239
|
+
const virtualValueUsesNoFields = (classes, conversions, source, target) => {
|
|
240
|
+
if (source.kind === 'class-ref' && target.kind === 'class-ref')
|
|
241
|
+
return classRefConvertible(classes, source, target);
|
|
242
|
+
const capability = conversions.nodeFor(source, target).capability;
|
|
243
|
+
return (capability.kind === 'identity' ||
|
|
244
|
+
((capability.kind === 'atom' || capability.kind === 'static' || capability.kind === 'class-family') &&
|
|
245
|
+
capability.materializer.nativeFieldProtocol === 'unused'));
|
|
246
|
+
};
|
|
247
|
+
/**
|
|
248
|
+
* The dispatchability verdict for every override family: whether it can be
|
|
249
|
+
* dispatched through a C++ virtual member at all, and the exact convention
|
|
250
|
+
* (`rootAbi`) every call site converts to when it can.
|
|
251
|
+
*
|
|
252
|
+
* `abiOf` answers with the convention a body was compiled under, which is the
|
|
253
|
+
* one authority on its formals -- deriving them here a second way is the
|
|
254
|
+
* two-authorities shape that produces a member the definition cannot match. A
|
|
255
|
+
* family whose implementors disagree on that convention, or one whose body
|
|
256
|
+
* captures an environment (a capturing body carries a formal no member can
|
|
257
|
+
* supply), is REFUSED rather than approximated: a call site then declines the
|
|
258
|
+
* direct bind too, so the program never silently runs the base's body.
|
|
259
|
+
*
|
|
260
|
+
* `capturesNothing` is asked directly of `IrBody.facts` by the caller (see
|
|
261
|
+
* `ir/captures.ts`'s `IrBodyFacts.capturedDeclarations`/`.capturedReceiver`)
|
|
262
|
+
* -- not of a render-time `CaptureIndex` admission, which only ever answers
|
|
263
|
+
* for a body some `allocate-callable` operation names, and a plain instance
|
|
264
|
+
* method almost never is one.
|
|
265
|
+
*/
|
|
266
|
+
export const virtualDispatchVerdictOf = (classes, abiOf, capturesNothing, conversions) => {
|
|
267
|
+
const families = [];
|
|
268
|
+
const refused = [];
|
|
269
|
+
for (const family of virtualMethodFamiliesOf(classes)) {
|
|
270
|
+
const rootImplementor = family.implementors.find((implementor) => implementor.declaration === family.root);
|
|
271
|
+
// An ABSTRACT root has no body, and therefore no ABI of its own to state
|
|
272
|
+
// the slot's convention with. Every override is checked against the same
|
|
273
|
+
// declared signature, so any implementor's convention IS that slot's --
|
|
274
|
+
// taking the first in the family's own deterministic order keeps the
|
|
275
|
+
// choice reproducible; the per-implementor loop below still proves every
|
|
276
|
+
// other implementor converts to it rather than assuming they agree.
|
|
277
|
+
const borrowed = family.implementors.map((implementor) => abiOf(implementor.callable)).find((abi) => abi !== null) ?? null;
|
|
278
|
+
// The borrowed convention states the PARAMETERS and RESULT of the slot,
|
|
279
|
+
// never its receiver: an implementor's receiver is its own concrete class,
|
|
280
|
+
// and a call site converting `Ref<Rule>` to it downcast every element of
|
|
281
|
+
// `Rule[]` to whichever subclass happened to be borrowed. The slot's
|
|
282
|
+
// receiver is the root's.
|
|
283
|
+
const rootInstance = classes.get(family.root)?.instance ?? null;
|
|
284
|
+
const inheritedAbi = borrowed === null || rootInstance === null ? null : { ...borrowed, receiver: rootInstance };
|
|
285
|
+
const rootAbi = (rootImplementor ? abiOf(rootImplementor.callable) : null) ?? (family.abstractRoot ? inheritedAbi : null);
|
|
286
|
+
const capturing = family.implementors.filter((implementor) => !capturesNothing(implementor.callable));
|
|
287
|
+
if (rootAbi === null || capturing.length > 0) {
|
|
288
|
+
refused.push({
|
|
289
|
+
key: family.key,
|
|
290
|
+
role: family.role,
|
|
291
|
+
owner: family.root,
|
|
292
|
+
reason: rootAbi === null
|
|
293
|
+
? 'the class that roots the family names no body to dispatch to'
|
|
294
|
+
: `these implementations capture an environment, which a member function has no formal to carry: ${capturing.map((implementor) => implementor.declaration).join(', ')}`
|
|
295
|
+
});
|
|
296
|
+
continue;
|
|
297
|
+
}
|
|
298
|
+
let incompatible = null;
|
|
299
|
+
let nativeFieldProtocolUnused = true;
|
|
300
|
+
for (const implementor of family.implementors) {
|
|
301
|
+
const actualAbi = abiOf(implementor.callable);
|
|
302
|
+
if (actualAbi === null) {
|
|
303
|
+
incompatible = `implementation ${implementor.declaration} names no callable convention`;
|
|
304
|
+
break;
|
|
305
|
+
}
|
|
306
|
+
if (actualAbi.receiver === null) {
|
|
307
|
+
incompatible = `implementation ${implementor.declaration} declares no receiver`;
|
|
308
|
+
break;
|
|
309
|
+
}
|
|
310
|
+
if (rootAbi.restFrom !== actualAbi.restFrom) {
|
|
311
|
+
incompatible =
|
|
312
|
+
`implementation ${implementor.declaration} uses rest slot ${String(actualAbi.restFrom)}, while the family root uses ` +
|
|
313
|
+
`${String(rootAbi.restFrom)}; repartitioning an already-packed rest array is not installed`;
|
|
314
|
+
break;
|
|
315
|
+
}
|
|
316
|
+
const instance = classes.get(implementor.declaration)?.instance;
|
|
317
|
+
if (instance === null || instance === undefined || instance.kind !== 'class-ref') {
|
|
318
|
+
incompatible = `implementation ${implementor.declaration}'s class publishes no class-ref instance carrier`;
|
|
319
|
+
break;
|
|
320
|
+
}
|
|
321
|
+
if (!virtualValueConvertible(classes, conversions, instance, actualAbi.receiver)) {
|
|
322
|
+
incompatible = `implementation ${implementor.declaration}'s receiver cannot be converted to "${representationKey(actualAbi.receiver)}"`;
|
|
323
|
+
break;
|
|
324
|
+
}
|
|
325
|
+
nativeFieldProtocolUnused &&= virtualValueUsesNoFields(classes, conversions, instance, actualAbi.receiver);
|
|
326
|
+
let parameterIncompatible = null;
|
|
327
|
+
for (const [position, parameter] of actualAbi.parameters.entries()) {
|
|
328
|
+
const source = rootAbi.parameters[position];
|
|
329
|
+
if (source !== undefined) {
|
|
330
|
+
nativeFieldProtocolUnused &&= virtualValueUsesNoFields(classes, conversions, source.value, parameter.value);
|
|
331
|
+
if (!virtualValueConvertible(classes, conversions, source.value, parameter.value)) {
|
|
332
|
+
parameterIncompatible =
|
|
333
|
+
`implementation ${implementor.declaration}'s parameter ${position} expects "${representationKey(parameter.value)}", while the ` +
|
|
334
|
+
`family member carries "${representationKey(source.value)}"`;
|
|
335
|
+
}
|
|
336
|
+
continue;
|
|
337
|
+
}
|
|
338
|
+
if (actualAbi.restFrom === position && parameter.value.kind === 'array-object')
|
|
339
|
+
continue;
|
|
340
|
+
if (!admitsUndefined(parameter.value)) {
|
|
341
|
+
parameterIncompatible =
|
|
342
|
+
`implementation ${implementor.declaration}'s extra parameter ${position} is carried as "${representationKey(parameter.value)}", ` +
|
|
343
|
+
'which cannot hold the undefined supplied by an omitted argument';
|
|
344
|
+
}
|
|
345
|
+
}
|
|
346
|
+
if (parameterIncompatible !== null) {
|
|
347
|
+
incompatible = parameterIncompatible;
|
|
348
|
+
break;
|
|
349
|
+
}
|
|
350
|
+
if (!virtualValueConvertible(classes, conversions, actualAbi.result, rootAbi.result)) {
|
|
351
|
+
incompatible =
|
|
352
|
+
`implementation ${implementor.declaration} returns "${representationKey(actualAbi.result)}", while family ${family.root}.${family.key} ` +
|
|
353
|
+
`returns "${representationKey(rootAbi.result)}"`;
|
|
354
|
+
break;
|
|
355
|
+
}
|
|
356
|
+
nativeFieldProtocolUnused &&= virtualValueUsesNoFields(classes, conversions, actualAbi.result, rootAbi.result);
|
|
357
|
+
}
|
|
358
|
+
if (incompatible !== null) {
|
|
359
|
+
refused.push({
|
|
360
|
+
key: family.key,
|
|
361
|
+
role: family.role,
|
|
362
|
+
owner: family.root,
|
|
363
|
+
reason: `the implementations need incompatible virtual member conventions: ${incompatible}`
|
|
364
|
+
});
|
|
365
|
+
continue;
|
|
366
|
+
}
|
|
367
|
+
families.push({ family, rootAbi, ...(nativeFieldProtocolUnused ? { nativeFieldProtocol: 'unused' } : {}) });
|
|
368
|
+
}
|
|
369
|
+
const dispatched = new Map();
|
|
370
|
+
for (const verdict of families) {
|
|
371
|
+
dispatched.set(virtualDispatchKey(verdict.family.root, verdict.family.key, verdict.family.role), verdict);
|
|
372
|
+
for (const [declaration] of classes) {
|
|
373
|
+
if (extendsClass(classes, declaration, verdict.family.root)) {
|
|
374
|
+
dispatched.set(virtualDispatchKey(declaration, verdict.family.key, verdict.family.role), verdict);
|
|
375
|
+
}
|
|
376
|
+
}
|
|
377
|
+
}
|
|
378
|
+
return { families, refused, dispatched };
|
|
379
|
+
};
|