@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,944 @@
|
|
|
1
|
+
import { representationKey, walkRepresentation } from '../representation/model.js';
|
|
2
|
+
import { symbolPropertyKeyDeclarationOf } from '../semantics/model/structural-types.js';
|
|
3
|
+
import { operandOf, resultOf } from '../semantics/model/operands.js';
|
|
4
|
+
import { abiOfCallee } from './callee.js';
|
|
5
|
+
/**
|
|
6
|
+
* The one class that owns the static storage behind these constructor-family
|
|
7
|
+
* members, or `null` when they disagree -- which for a family of genuinely
|
|
8
|
+
* different classes (a base's slot the program stores subclasses into) they
|
|
9
|
+
* do, and for the layouts of ONE generic they never do.
|
|
10
|
+
*/
|
|
11
|
+
export const sharedStaticOwnerOf = (classes, members) => {
|
|
12
|
+
const [first, ...rest] = members;
|
|
13
|
+
if (first === undefined)
|
|
14
|
+
return null;
|
|
15
|
+
const owner = classes.get(first)?.staticOwner ?? first;
|
|
16
|
+
return rest.every((member) => (classes.get(member)?.staticOwner ?? member) === owner) ? owner : null;
|
|
17
|
+
};
|
|
18
|
+
/**
|
|
19
|
+
* The physical class a census copy id belongs to.
|
|
20
|
+
*
|
|
21
|
+
* Exact id first (a physical id IS the copy id of its group's lowest copy,
|
|
22
|
+
* and a non-generic class is its own only copy); then the class that lists
|
|
23
|
+
* the copy among its `copies`; then the generic root, which is where a copy
|
|
24
|
+
* with no constructor-object carrier of its own was published.
|
|
25
|
+
*/
|
|
26
|
+
export const classLayoutOfCopy = (classes, copy) => {
|
|
27
|
+
const exact = classes.get(copy);
|
|
28
|
+
if (exact)
|
|
29
|
+
return exact;
|
|
30
|
+
let index = copyIndexes.get(classes);
|
|
31
|
+
if (!index) {
|
|
32
|
+
index = new Map();
|
|
33
|
+
for (const layout of classes.values())
|
|
34
|
+
for (const one of layout.copies ?? [])
|
|
35
|
+
if (!index.has(one))
|
|
36
|
+
index.set(one, layout);
|
|
37
|
+
copyIndexes.set(classes, index);
|
|
38
|
+
}
|
|
39
|
+
return index.get(copy) ?? classes.get(genericRootOf(copy));
|
|
40
|
+
};
|
|
41
|
+
const copyIndexes = new WeakMap();
|
|
42
|
+
/** Runtime class candidates exclude definitions retained solely for type layout. */
|
|
43
|
+
/** The class whose construction this class's construction runs first, which a prototype-only base is not. */
|
|
44
|
+
export const constructedBaseOf = (layout) => layout.prototypeBase ? null : layout.base;
|
|
45
|
+
export const runtimeClassLayoutsOf = (classes) => [...classes.values()].filter((layout) => layout.layoutOnly !== true);
|
|
46
|
+
/**
|
|
47
|
+
* Build the sealed class-ref authority used to close physical ancestry.
|
|
48
|
+
* Existing runtime class layouts win because their instance carrier is the
|
|
49
|
+
* projection's canonical shape. For type-only declarations, every
|
|
50
|
+
* class-instance structural anchor is derived and grouped by declaration;
|
|
51
|
+
* more than one distinct carrier is ambiguous and therefore resolves to null.
|
|
52
|
+
*/
|
|
53
|
+
export const physicalClassInstanceResolverOf = (classes, structuralTypes, deriver) => {
|
|
54
|
+
const resolved = new Map();
|
|
55
|
+
const ambiguous = new Set();
|
|
56
|
+
const candidates = new Map();
|
|
57
|
+
for (const [declaration, layout] of classes) {
|
|
58
|
+
if (layout.instance?.kind === 'class-ref')
|
|
59
|
+
resolved.set(declaration, layout.instance);
|
|
60
|
+
}
|
|
61
|
+
for (const [typeId, structural] of structuralTypes) {
|
|
62
|
+
const shape = structural.shape;
|
|
63
|
+
if (shape.kind !== 'class-instance' || shape.body === null || resolved.has(shape.declaration))
|
|
64
|
+
continue;
|
|
65
|
+
const ids = candidates.get(shape.declaration) ?? [];
|
|
66
|
+
ids.push(typeId);
|
|
67
|
+
candidates.set(shape.declaration, ids);
|
|
68
|
+
}
|
|
69
|
+
return (declaration) => {
|
|
70
|
+
if (resolved.has(declaration))
|
|
71
|
+
return resolved.get(declaration) ?? null;
|
|
72
|
+
if (ambiguous.has(declaration))
|
|
73
|
+
return null;
|
|
74
|
+
let selected = null;
|
|
75
|
+
for (const typeId of candidates.get(declaration) ?? []) {
|
|
76
|
+
const representation = deriver.derive(typeId);
|
|
77
|
+
if (representation.kind !== 'class-ref' || representation.declaration !== declaration)
|
|
78
|
+
continue;
|
|
79
|
+
if (selected && representationKey(selected) !== representationKey(representation)) {
|
|
80
|
+
ambiguous.add(declaration);
|
|
81
|
+
return null;
|
|
82
|
+
}
|
|
83
|
+
selected = representation;
|
|
84
|
+
}
|
|
85
|
+
if (selected)
|
|
86
|
+
resolved.set(declaration, selected);
|
|
87
|
+
else
|
|
88
|
+
ambiguous.add(declaration);
|
|
89
|
+
return selected;
|
|
90
|
+
};
|
|
91
|
+
};
|
|
92
|
+
/**
|
|
93
|
+
* The callable each allocation's own published value names, by that value's id.
|
|
94
|
+
*
|
|
95
|
+
* One pass instead of one scan per member. The lookup below asks "which
|
|
96
|
+
* allocation published this result", once per method, once per accessor half
|
|
97
|
+
* and once per field initializer -- and answering it by walking the whole
|
|
98
|
+
* operation table made class projection cost members x operations: 1,172 calls
|
|
99
|
+
* against 104,641 operations on one measured application, which is 123 million
|
|
100
|
+
* visits to answer 1,172 questions. The first allocation to publish a result id
|
|
101
|
+
* wins, exactly as the scan's own `return` on first match did, so a table built
|
|
102
|
+
* in `graph.operations` order gives the identical answer.
|
|
103
|
+
*/
|
|
104
|
+
const allocatedCallablesByResult = (graph) => {
|
|
105
|
+
const callables = new Map();
|
|
106
|
+
for (const operation of graph.operations.values()) {
|
|
107
|
+
if (operation.family !== 'allocation')
|
|
108
|
+
continue;
|
|
109
|
+
const published = resultOf(operation, 'value');
|
|
110
|
+
if (!published || callables.has(published.id))
|
|
111
|
+
continue;
|
|
112
|
+
callables.set(published.id, operation.callable);
|
|
113
|
+
}
|
|
114
|
+
return callables;
|
|
115
|
+
};
|
|
116
|
+
/** The function a `define-field`/`define-method` event's own allocation names, or `null`. */
|
|
117
|
+
const allocatedCallableOf = (callables, resultId) => resultId === undefined ? null : (callables.get(resultId) ?? null);
|
|
118
|
+
/**
|
|
119
|
+
* The generic root of a declaration id, or the id itself when it names no copy.
|
|
120
|
+
*
|
|
121
|
+
* `identity/ids.ts` spells a monomorphized copy as `decl|file|ordinal@key`, so
|
|
122
|
+
* the root is everything up to the separator -- read here rather than
|
|
123
|
+
* reconstructed, because the two halves are minted in one place and a second
|
|
124
|
+
* spelling of the same split is exactly the drift this collapse exists to end.
|
|
125
|
+
*/
|
|
126
|
+
const genericRootOf = (declaration) => {
|
|
127
|
+
const at = declaration.indexOf('@');
|
|
128
|
+
return at === -1 ? declaration : declaration.slice(0, at);
|
|
129
|
+
};
|
|
130
|
+
/**
|
|
131
|
+
* One class, one published id.
|
|
132
|
+
*
|
|
133
|
+
* `class-lifecycle` events are minted inside the census's own per-copy walk, so
|
|
134
|
+
* a GENERIC class publishes its members under a copy id (`decl|f71|904@0`).
|
|
135
|
+
* Nothing else in the backend uses that id: `cppTypeOf` spells a `class-ref`'s
|
|
136
|
+
* C++ type as `cppClassName(representation.declaration)`, and a `class-ref`
|
|
137
|
+
* carrier's declaration is its structural shape's anchor, which is the generic
|
|
138
|
+
* ROOT -- `structural.ts` deliberately keys the anchor on the root plus the
|
|
139
|
+
* layout-RELEVANT type arguments, so that two instantiations differing only in
|
|
140
|
+
* a phantom parameter share one physical layout. This same file already mixes
|
|
141
|
+
* the two: `constructorBodies` above keys on the carrier's declaration while
|
|
142
|
+
* every member bucket keys on the event's.
|
|
143
|
+
*
|
|
144
|
+
* The result was a class whose members were published under an id no consumer
|
|
145
|
+
* ever asks about. `classMemberOf` looked up the carrier's root, found
|
|
146
|
+
* nothing, and `emit-class-properties.ts` refused with "whose members no class
|
|
147
|
+
* evaluation published" -- for hono's `Context` and `Hono`, whose every method
|
|
148
|
+
* read (`c.text`, `c.json`, `c.req`, `app.fetch`) died on it.
|
|
149
|
+
*
|
|
150
|
+
* So the copy id is re-keyed onto the root, and ONLY when the root has exactly
|
|
151
|
+
* one published copy and no publication of its own. That condition is the
|
|
152
|
+
* whole proof: with one copy there is one layout, so the two ids denote one
|
|
153
|
+
* struct and merging them invents nothing. A root with two published copies is
|
|
154
|
+
* left exactly as it is -- those are two genuinely different layouts (a
|
|
155
|
+
* `Context<E>` whose `env: E['Bindings']` field really does differ per `E`),
|
|
156
|
+
* and collapsing them onto one root would give two structs one name. That case
|
|
157
|
+
* still refuses, which is correct until a `class-ref` carrier can say WHICH
|
|
158
|
+
* copy it holds; the carrier is the authority that has to grow, and this is
|
|
159
|
+
* not a substitute for it.
|
|
160
|
+
*/
|
|
161
|
+
/**
|
|
162
|
+
* Members unioned by KEY, never concatenated: every copy of one class installs
|
|
163
|
+
* the same members from the same source declarations, so the copies' lists are
|
|
164
|
+
* the same list seen N times. The first copy to publish a key wins.
|
|
165
|
+
*/
|
|
166
|
+
const mergedMembersByKey = (layouts, pick) => {
|
|
167
|
+
const seen = new Map();
|
|
168
|
+
for (const layout of layouts)
|
|
169
|
+
for (const entry of pick(layout))
|
|
170
|
+
if (!seen.has(entry.key))
|
|
171
|
+
seen.set(entry.key, entry);
|
|
172
|
+
return [...seen.values()];
|
|
173
|
+
};
|
|
174
|
+
/**
|
|
175
|
+
* Methods unioned by key AND BODY, because one key can legitimately name
|
|
176
|
+
* several bodies: a generic method is monomorphized per type argument and
|
|
177
|
+
* every copy installs under the name they share. Merging those by key alone
|
|
178
|
+
* kept whichever copy the first class copy happened to publish, so a method
|
|
179
|
+
* copy minted only under a LATER class copy -- `c.tag<number>()` on a
|
|
180
|
+
* `Chain<string>`, where the two `Chain` copies share one layout and merge --
|
|
181
|
+
* vanished before any call could resolve to it. A same-key list is not a
|
|
182
|
+
* duplicate to collapse: `classMemberOf` disambiguates it by the site's own
|
|
183
|
+
* convention, and every other consumer already walks the whole list because a
|
|
184
|
+
* NON-generic class's generic method has always produced one.
|
|
185
|
+
*/
|
|
186
|
+
const mergedMethods = (layouts, pick) => {
|
|
187
|
+
const seen = new Map();
|
|
188
|
+
for (const layout of layouts)
|
|
189
|
+
for (const entry of pick(layout)) {
|
|
190
|
+
// Two entries that agree on the key AND on the installed convention are
|
|
191
|
+
// one method. A folded class -- every copy naming one layout -- installs
|
|
192
|
+
// the identical method once per copy, differing only in the ordinal
|
|
193
|
+
// inside the callable id, and emitting all of them made the C++ reject
|
|
194
|
+
// the redefinitions. A genuine method copy (`map<R>` at `number` and at
|
|
195
|
+
// `string`) has a different convention and is kept.
|
|
196
|
+
const identity = `${entry.key}${entry.representation === undefined ? (entry.callable ?? '') : representationKey(entry.representation)}`;
|
|
197
|
+
if (!seen.has(identity))
|
|
198
|
+
seen.set(identity, entry);
|
|
199
|
+
}
|
|
200
|
+
return [...seen.values()];
|
|
201
|
+
};
|
|
202
|
+
/**
|
|
203
|
+
* The static side every physical class of one generic root shares.
|
|
204
|
+
*
|
|
205
|
+
* Only the INSTANCE is split by layout. `Box<number>` and `Box<string>` are
|
|
206
|
+
* two structs because their fields are physically different, while `Box`
|
|
207
|
+
* itself is one constructor object with one `count` cell and one `create`
|
|
208
|
+
* function -- so each layout is given the union of every layout's static
|
|
209
|
+
* members, and `staticOwner` points them all at the root so the storage
|
|
210
|
+
* census mints one cell rather than one per struct.
|
|
211
|
+
*/
|
|
212
|
+
const shareStaticSides = (merged) => {
|
|
213
|
+
const byGeneric = new Map();
|
|
214
|
+
for (const declaration of merged.keys()) {
|
|
215
|
+
const root = genericRootOf(declaration);
|
|
216
|
+
byGeneric.set(root, [...(byGeneric.get(root) ?? []), declaration]);
|
|
217
|
+
}
|
|
218
|
+
for (const [root, family] of byGeneric) {
|
|
219
|
+
if (family.length < 2)
|
|
220
|
+
continue;
|
|
221
|
+
const layouts = family.flatMap((declaration) => {
|
|
222
|
+
const layout = merged.get(declaration);
|
|
223
|
+
return layout ? [layout] : [];
|
|
224
|
+
});
|
|
225
|
+
const staticFields = mergedMembersByKey(layouts, (layout) => layout.staticFields);
|
|
226
|
+
const staticMethods = mergedMethods(layouts, (layout) => layout.staticMethods);
|
|
227
|
+
const staticAccessors = mergedMembersByKey(layouts, (layout) => layout.staticAccessors);
|
|
228
|
+
const name = layouts.find((layout) => layout.name !== null)?.name ?? null;
|
|
229
|
+
const length = layouts.find((layout) => layout.length !== null)?.length ?? null;
|
|
230
|
+
for (const declaration of family) {
|
|
231
|
+
const layout = merged.get(declaration);
|
|
232
|
+
if (!layout)
|
|
233
|
+
continue;
|
|
234
|
+
merged.set(declaration, { ...layout, staticOwner: root, staticFields, staticMethods, staticAccessors, name, length });
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
};
|
|
238
|
+
const collapseSpecializations = (layouts, physicalOf) => {
|
|
239
|
+
// One bucket per PHYSICAL class: the id the copy's own constructor-object
|
|
240
|
+
// carrier named (`structural.ts`'s `physicalClassDeclarationOf` -- the
|
|
241
|
+
// root, or `root@<ordinal>` when the class has more than one layout), and
|
|
242
|
+
// the root for a copy that published no carrier of its own.
|
|
243
|
+
const byRoot = new Map();
|
|
244
|
+
for (const [declaration, layout] of layouts) {
|
|
245
|
+
const root = physicalOf.get(declaration) ?? genericRootOf(declaration);
|
|
246
|
+
byRoot.set(root, [...(byRoot.get(root) ?? []), layout]);
|
|
247
|
+
}
|
|
248
|
+
const merged = new Map();
|
|
249
|
+
for (const [root, group] of byRoot) {
|
|
250
|
+
const [first, ...rest] = group;
|
|
251
|
+
if (!first)
|
|
252
|
+
continue;
|
|
253
|
+
const copies = group.map((layout) => layout.declaration).filter((one) => one !== genericRootOf(one));
|
|
254
|
+
if (rest.length === 0) {
|
|
255
|
+
merged.set(root, first.declaration === root && copies.length === 0
|
|
256
|
+
? first
|
|
257
|
+
: { ...first, declaration: root, ...(copies.length > 0 ? { copies } : {}) });
|
|
258
|
+
continue;
|
|
259
|
+
}
|
|
260
|
+
const mergeByKey = (pick) => mergedMembersByKey(group, pick);
|
|
261
|
+
merged.set(root, {
|
|
262
|
+
declaration: root,
|
|
263
|
+
...(group.every((layout) => layout.layoutOnly) ? { layoutOnly: true } : {}),
|
|
264
|
+
base: group.find((layout) => layout.base !== null)?.base ?? null,
|
|
265
|
+
...(group.find((layout) => layout.base !== null)?.prototypeBase ? { prototypeBase: true } : {}),
|
|
266
|
+
...(group.every((layout) => layout.uninstantiable) ? { uninstantiable: true } : {}),
|
|
267
|
+
nativeBase: group.find((layout) => layout.nativeBase !== null)?.nativeBase ?? null,
|
|
268
|
+
construct: group.find((layout) => layout.construct !== null)?.construct ?? null,
|
|
269
|
+
instance: group.find((layout) => layout.instance !== null)?.instance ?? null,
|
|
270
|
+
constructor: group.find((layout) => layout.constructor !== null)?.constructor ?? null,
|
|
271
|
+
fields: mergeByKey((layout) => layout.fields),
|
|
272
|
+
fieldOwnership: [],
|
|
273
|
+
methods: mergedMethods(group, (layout) => layout.methods),
|
|
274
|
+
accessors: mergeByKey((layout) => layout.accessors),
|
|
275
|
+
staticFields: mergeByKey((layout) => layout.staticFields),
|
|
276
|
+
staticMethods: mergedMethods(group, (layout) => layout.staticMethods),
|
|
277
|
+
staticAccessors: mergeByKey((layout) => layout.staticAccessors),
|
|
278
|
+
name: group.find((layout) => layout.name !== null)?.name ?? null,
|
|
279
|
+
length: group.find((layout) => layout.length !== null)?.length ?? null,
|
|
280
|
+
...(copies.length > 0 ? { copies } : {})
|
|
281
|
+
});
|
|
282
|
+
}
|
|
283
|
+
shareStaticSides(merged);
|
|
284
|
+
// A base link names whichever id its heritage carrier stated -- a physical
|
|
285
|
+
// id, which this merge published as-is when the base has that layout, and
|
|
286
|
+
// otherwise a copy this merge just retired onto its root.
|
|
287
|
+
const relinked = new Map();
|
|
288
|
+
for (const [declaration, layout] of merged) {
|
|
289
|
+
const base = layout.base === null || merged.has(layout.base) ? layout.base : genericRootOf(layout.base);
|
|
290
|
+
relinked.set(declaration, base === layout.base ? layout : { ...layout, base });
|
|
291
|
+
}
|
|
292
|
+
return relinked;
|
|
293
|
+
};
|
|
294
|
+
/** Whether `candidate` reaches `ancestor` through the published base links. */
|
|
295
|
+
const descendsFrom = (layouts, candidate, ancestor) => {
|
|
296
|
+
const seen = new Set();
|
|
297
|
+
let current = layouts.get(candidate)?.base ?? null;
|
|
298
|
+
while (current !== null && !seen.has(current)) {
|
|
299
|
+
if (current === ancestor)
|
|
300
|
+
return true;
|
|
301
|
+
seen.add(current);
|
|
302
|
+
current = layouts.get(current)?.base ?? null;
|
|
303
|
+
}
|
|
304
|
+
return false;
|
|
305
|
+
};
|
|
306
|
+
/**
|
|
307
|
+
* Publish synthetic overlay ownership after specialization collapse.
|
|
308
|
+
*
|
|
309
|
+
* This pass records evidence and physical owners without changing `fields`.
|
|
310
|
+
* Keeping the existing field list intact is intentional: access recipes and
|
|
311
|
+
* the target layout must consume this census before any storage can be
|
|
312
|
+
* removed. A missing representation remains visible as an owner but cannot
|
|
313
|
+
* be treated as a typed storage recipe by a later consumer.
|
|
314
|
+
*/
|
|
315
|
+
export const publishClassFieldOwnership = (layouts) => {
|
|
316
|
+
const published = new Map();
|
|
317
|
+
for (const [declaration, layout] of layouts) {
|
|
318
|
+
const ownership = layout.fields
|
|
319
|
+
.filter((field) => field.syntheticSubclassMemberOverlay)
|
|
320
|
+
.map((evidence) => {
|
|
321
|
+
const physicalOwners = [...layouts.entries()]
|
|
322
|
+
.filter(([candidate, candidateLayout]) => {
|
|
323
|
+
if (candidate === declaration || !descendsFrom(layouts, candidate, declaration))
|
|
324
|
+
return false;
|
|
325
|
+
return candidateLayout.fields.some((field) => field.key === evidence.key && !field.syntheticSubclassMemberOverlay);
|
|
326
|
+
})
|
|
327
|
+
.flatMap(([candidate, candidateLayout]) => {
|
|
328
|
+
const field = candidateLayout.fields.find((entry) => entry.key === evidence.key && !entry.syntheticSubclassMemberOverlay);
|
|
329
|
+
return field ? [{ declaration: candidate, field }] : [];
|
|
330
|
+
})
|
|
331
|
+
.sort((left, right) => (left.declaration < right.declaration ? -1 : left.declaration > right.declaration ? 1 : 0));
|
|
332
|
+
return { key: evidence.key, evidenceOwner: declaration, evidence, physicalOwners };
|
|
333
|
+
});
|
|
334
|
+
published.set(declaration, { ...layout, fieldOwnership: ownership });
|
|
335
|
+
}
|
|
336
|
+
return published;
|
|
337
|
+
};
|
|
338
|
+
/**
|
|
339
|
+
* Publish physical class ancestry for the final carrier set.
|
|
340
|
+
*
|
|
341
|
+
* `projectClasses` is intentionally event-driven: it describes executable
|
|
342
|
+
* class lifecycle, so a class used only as a retained field type may have no
|
|
343
|
+
* entry there. The target still needs its authenticated base link to avoid
|
|
344
|
+
* flattening inherited storage into the derived struct. This pass publishes
|
|
345
|
+
* only that physical fact from the already-sealed class-ref carriers and
|
|
346
|
+
* reuses full projected layouts where they exist. It must run on the final
|
|
347
|
+
* emission carrier set, after shaking, so a dropped type-only value cannot
|
|
348
|
+
* root a class merely because it appeared in the plan.
|
|
349
|
+
*/
|
|
350
|
+
export const physicalClassLayoutsOf = (classes, representations, resolveClassRef = null) => {
|
|
351
|
+
const carriers = new Map();
|
|
352
|
+
for (const representation of representations)
|
|
353
|
+
for (const nested of walkRepresentation(representation))
|
|
354
|
+
if (nested.kind === 'class-ref' && !carriers.has(nested.declaration))
|
|
355
|
+
carriers.set(nested.declaration, nested);
|
|
356
|
+
const layouts = new Map();
|
|
357
|
+
for (const [declaration, layout] of classes) {
|
|
358
|
+
if (layout.instance?.kind !== 'class-ref')
|
|
359
|
+
continue;
|
|
360
|
+
layouts.set(declaration, {
|
|
361
|
+
declaration,
|
|
362
|
+
base: layout.base,
|
|
363
|
+
instance: layout.instance,
|
|
364
|
+
nativeBase: layout.nativeBase,
|
|
365
|
+
...(layout.nativeStorage === undefined ? {} : { nativeStorage: layout.nativeStorage })
|
|
366
|
+
});
|
|
367
|
+
}
|
|
368
|
+
for (const [declaration, instance] of carriers) {
|
|
369
|
+
if (layouts.has(declaration))
|
|
370
|
+
continue;
|
|
371
|
+
layouts.set(declaration, {
|
|
372
|
+
declaration,
|
|
373
|
+
base: instance.ancestors[0] ?? null,
|
|
374
|
+
instance,
|
|
375
|
+
nativeBase: null
|
|
376
|
+
});
|
|
377
|
+
}
|
|
378
|
+
// A type-only carrier can name a direct base whose own carrier was not
|
|
379
|
+
// independently retained. Ask the sealed structural publisher for that
|
|
380
|
+
// declaration's authenticated class-ref and continue the same closure; a
|
|
381
|
+
// resolver that cannot prove one unique carrier leaves the publication
|
|
382
|
+
// incomplete rather than guessing a shape from the descendant.
|
|
383
|
+
const resolved = new Set();
|
|
384
|
+
let changed = true;
|
|
385
|
+
while (changed) {
|
|
386
|
+
changed = false;
|
|
387
|
+
for (const layout of [...layouts.values()]) {
|
|
388
|
+
if (layout.base === null || layouts.has(layout.base) || resolved.has(layout.base))
|
|
389
|
+
continue;
|
|
390
|
+
resolved.add(layout.base);
|
|
391
|
+
const instance = resolveClassRef?.(layout.base) ?? null;
|
|
392
|
+
if (!instance || instance.declaration !== layout.base)
|
|
393
|
+
continue;
|
|
394
|
+
layouts.set(instance.declaration, {
|
|
395
|
+
declaration: instance.declaration,
|
|
396
|
+
base: instance.ancestors[0] ?? null,
|
|
397
|
+
instance,
|
|
398
|
+
nativeBase: null
|
|
399
|
+
});
|
|
400
|
+
changed = true;
|
|
401
|
+
}
|
|
402
|
+
}
|
|
403
|
+
const missingBases = new Set();
|
|
404
|
+
for (const layout of layouts.values())
|
|
405
|
+
if (layout.base !== null && !layouts.has(layout.base))
|
|
406
|
+
missingBases.add(layout.base);
|
|
407
|
+
return Object.freeze({
|
|
408
|
+
layouts,
|
|
409
|
+
complete: missingBases.size === 0,
|
|
410
|
+
missingBases: Object.freeze([...missingBases])
|
|
411
|
+
});
|
|
412
|
+
};
|
|
413
|
+
export const projectClasses = (input) => {
|
|
414
|
+
const allocatedCallables = allocatedCallablesByResult(input.graph);
|
|
415
|
+
const fields = new Map();
|
|
416
|
+
const methods = new Map();
|
|
417
|
+
const accessors = new Map();
|
|
418
|
+
const staticFields = new Map();
|
|
419
|
+
const staticMethods = new Map();
|
|
420
|
+
const staticAccessors = new Map();
|
|
421
|
+
const constructs = new Map();
|
|
422
|
+
const instances = new Map();
|
|
423
|
+
const constructors = new Map();
|
|
424
|
+
const layoutOnly = new Set();
|
|
425
|
+
const bases = new Map();
|
|
426
|
+
const prototypeBases = new Set();
|
|
427
|
+
const nativeBases = new Map();
|
|
428
|
+
const names = new Map();
|
|
429
|
+
const lengths = new Map();
|
|
430
|
+
const nativeErrorConstructors = new Set([
|
|
431
|
+
'ErrorConstructor',
|
|
432
|
+
'EvalErrorConstructor',
|
|
433
|
+
'RangeErrorConstructor',
|
|
434
|
+
'ReferenceErrorConstructor',
|
|
435
|
+
'SyntaxErrorConstructor',
|
|
436
|
+
'TypeErrorConstructor',
|
|
437
|
+
'URIErrorConstructor'
|
|
438
|
+
]);
|
|
439
|
+
// The physical class each census copy belongs to, read off the copy's own
|
|
440
|
+
// carriers: its constructor object names the class it constructs
|
|
441
|
+
// (`constructor-family.members[0]`), a layout-only copy's instance carrier
|
|
442
|
+
// names the class it is an instance of. Both are `structural.ts`'s
|
|
443
|
+
// `physicalClassDeclarationOf` answer for that copy's own fillings.
|
|
444
|
+
const physicalOf = new Map();
|
|
445
|
+
const publishPhysical = (copy, physical) => {
|
|
446
|
+
if (physical !== undefined && !physicalOf.has(copy) && genericRootOf(physical) === genericRootOf(copy))
|
|
447
|
+
physicalOf.set(copy, physical);
|
|
448
|
+
};
|
|
449
|
+
for (const operation of input.graph.operations.values()) {
|
|
450
|
+
if (operation.family === 'allocation' &&
|
|
451
|
+
operation.allocated === 'class-constructor-object' &&
|
|
452
|
+
operation.classDeclaration !== undefined) {
|
|
453
|
+
const published = resultOf(operation, 'value');
|
|
454
|
+
const carrier = published ? input.plan.selected.get(published.id) : undefined;
|
|
455
|
+
if (carrier?.kind === 'constructor-family')
|
|
456
|
+
publishPhysical(operation.classDeclaration, carrier.members[0]);
|
|
457
|
+
continue;
|
|
458
|
+
}
|
|
459
|
+
if (operation.family !== 'class-lifecycle')
|
|
460
|
+
continue;
|
|
461
|
+
if (operation.event === 'bind-class-value' && operation.classLayoutOnly) {
|
|
462
|
+
layoutOnly.add(operation.classDeclaration);
|
|
463
|
+
const storage = operation.operands.find((operand) => operand.role === 'instance-layout');
|
|
464
|
+
if (storage) {
|
|
465
|
+
const instance = input.deriver.derive(storage.type);
|
|
466
|
+
instances.set(operation.classDeclaration, instance);
|
|
467
|
+
if (instance.kind === 'class-ref')
|
|
468
|
+
publishPhysical(operation.classDeclaration, instance.declaration);
|
|
469
|
+
}
|
|
470
|
+
}
|
|
471
|
+
}
|
|
472
|
+
// Constructor bodies are identified by their producer, never by an ABI
|
|
473
|
+
// shared with ordinary callbacks and methods (class receiver, void result).
|
|
474
|
+
const constructorBodies = new Map();
|
|
475
|
+
for (const operation of input.graph.operations.values()) {
|
|
476
|
+
if (operation.family !== 'allocation' ||
|
|
477
|
+
operation.allocated !== 'function-object' ||
|
|
478
|
+
!operation.callable ||
|
|
479
|
+
!operation.classConstructorBodyOf)
|
|
480
|
+
continue;
|
|
481
|
+
constructorBodies.set(operation.classConstructorBodyOf, operation.callable);
|
|
482
|
+
}
|
|
483
|
+
// A constructor-family carrier names its members by generic ROOT -- the
|
|
484
|
+
// anchor `structural.ts` keys a `class-ref` on -- while `class-lifecycle`
|
|
485
|
+
// minted the body's ownership above under the census's per-copy id
|
|
486
|
+
// (`decl|f168|1@0`): the same two spellings `collapseSpecializations`
|
|
487
|
+
// reconciles for every other member bucket. Looked up by the member alone,
|
|
488
|
+
// the body of every GENERIC class was simply never found: `new Box<T>(v)`
|
|
489
|
+
// allocated, ran its field initializers and returned, with `this.value = v`
|
|
490
|
+
// never executed -- a construction that silently skipped its constructor,
|
|
491
|
+
// the exact half-emission `constructionsOf` refuses by name when it can see
|
|
492
|
+
// it. One copy with a body is one answer. Two copies with different bodies
|
|
493
|
+
// is the two-layout case `collapseSpecializations` leaves refused, and it
|
|
494
|
+
// gets no answer here either.
|
|
495
|
+
const constructorBodyOfRoot = (member) => {
|
|
496
|
+
const root = genericRootOf(member);
|
|
497
|
+
const bodies = new Set();
|
|
498
|
+
for (const [owner, body] of constructorBodies)
|
|
499
|
+
if (genericRootOf(owner) === root)
|
|
500
|
+
bodies.add(body);
|
|
501
|
+
return bodies.size === 1 ? [...bodies][0] : null;
|
|
502
|
+
};
|
|
503
|
+
/**
|
|
504
|
+
* The body belonging to the COPY this constructor object is the constructor
|
|
505
|
+
* object OF.
|
|
506
|
+
*
|
|
507
|
+
* `constructorBodyOfRoot` above answers for a root with exactly one body,
|
|
508
|
+
* and abstains when several copies each minted their own -- there is no way
|
|
509
|
+
* to pick between two bodies knowing only the root. The allocation knows:
|
|
510
|
+
* `classDeclaration` is the per-copy id this constructor object was minted
|
|
511
|
+
* for, and `constructorBodies` is keyed by exactly that spelling, so the
|
|
512
|
+
* copy's own body is a direct lookup rather than a choice.
|
|
513
|
+
*
|
|
514
|
+
* `runtime/node/globals.ts`'s `class MessageEvent<T = any> extends Event` is
|
|
515
|
+
* why this exists. The census holds two copies of it -- one from the
|
|
516
|
+
* argument `websocket.ts` constructs with, one from the listener type it is
|
|
517
|
+
* handed to -- whose layouts collapse onto one struct, so the abstention
|
|
518
|
+
* above left the class with NO constructor and `constructionsOf` built the
|
|
519
|
+
* implicit `super(...args)` instead: `data` was never assigned, and the
|
|
520
|
+
* forwarded second argument was a `MessageEventInit` where the base's
|
|
521
|
+
* `EventInit` was declared, which is the store clang refused.
|
|
522
|
+
*/
|
|
523
|
+
const constructorBodyOfCopy = (operation) => operation.classDeclaration === undefined ? null : (constructorBodies.get(String(operation.classDeclaration)) ?? null);
|
|
524
|
+
for (const operation of input.graph.operations.values()) {
|
|
525
|
+
if (operation.family === 'allocation' && operation.allocated === 'class-constructor-object') {
|
|
526
|
+
const published = resultOf(operation, 'value');
|
|
527
|
+
const carrier = published ? input.plan.selected.get(published.id) : undefined;
|
|
528
|
+
// The construction's result carrier is the instance carrier: it is the
|
|
529
|
+
// constructor's own published convention, not a second derivation of what
|
|
530
|
+
// an instance of this class looks like.
|
|
531
|
+
const abi = carrier && (carrier.kind === 'constructor-family' || carrier.kind === 'function') ? carrier.abi : null;
|
|
532
|
+
// Only the class this allocation evaluates: a family may also name the
|
|
533
|
+
// subclasses the program stores into this constructor's slot, and those
|
|
534
|
+
// have constructions of their own.
|
|
535
|
+
const allocated = operation.classDeclaration === undefined ? null : genericRootOf(operation.classDeclaration);
|
|
536
|
+
const members = carrier?.kind === 'constructor-family' ? carrier.members : [];
|
|
537
|
+
for (const member of members.filter((one) => allocated === null || members.length === 1 || genericRootOf(one) === allocated)) {
|
|
538
|
+
constructs.set(member, abi);
|
|
539
|
+
instances.set(member, abi?.result ?? null);
|
|
540
|
+
constructors.set(member, constructorBodies.get(member) ?? constructorBodyOfCopy(operation) ?? constructorBodyOfRoot(member));
|
|
541
|
+
}
|
|
542
|
+
if (operation.classDeclaration !== undefined && operation.functionName !== undefined)
|
|
543
|
+
names.set(operation.classDeclaration, operation.functionName);
|
|
544
|
+
if (operation.classDeclaration !== undefined && operation.functionLength !== undefined)
|
|
545
|
+
lengths.set(operation.classDeclaration, operation.functionLength);
|
|
546
|
+
continue;
|
|
547
|
+
}
|
|
548
|
+
if (operation.family !== 'class-lifecycle')
|
|
549
|
+
continue;
|
|
550
|
+
// A modelled prototype re-parenting links the two classes exactly as
|
|
551
|
+
// `extends` does for layout and dispatch; its heritage operand is read the
|
|
552
|
+
// same way.
|
|
553
|
+
if (operation.event === 'evaluate-heritage' || operation.event === 'reparent-prototype') {
|
|
554
|
+
if (operation.event === 'reparent-prototype')
|
|
555
|
+
prototypeBases.add(operation.classDeclaration);
|
|
556
|
+
const heritage = operation.operands.find((operand) => operand.role === 'heritage');
|
|
557
|
+
const carrier = heritage?.source.kind === 'result'
|
|
558
|
+
? input.plan.selected.get(heritage.source.result)
|
|
559
|
+
: operation.classLayoutOnly && heritage
|
|
560
|
+
? input.deriver.derive(heritage.type)
|
|
561
|
+
: null;
|
|
562
|
+
if (!carrier)
|
|
563
|
+
continue;
|
|
564
|
+
// The base is read off the heritage value's own carrier rather than off
|
|
565
|
+
// the syntax: `class D extends B` and `class D extends mixin(B)` are the
|
|
566
|
+
// same event, and only the carrier says which class the evaluated value
|
|
567
|
+
// actually constructs. A family naming several classes states no single
|
|
568
|
+
// base, so it is left absent instead of resolved to whichever came first.
|
|
569
|
+
if (carrier?.kind === 'native-handle' &&
|
|
570
|
+
nativeErrorConstructors.has(carrier.protocol) &&
|
|
571
|
+
carrier.construct?.result.kind === 'native-record-ref') {
|
|
572
|
+
nativeBases.set(operation.classDeclaration, { protocol: carrier.protocol, instance: carrier.construct.result });
|
|
573
|
+
continue;
|
|
574
|
+
}
|
|
575
|
+
if (carrier?.kind !== 'constructor-family')
|
|
576
|
+
continue;
|
|
577
|
+
const [only, ...rest] = carrier.members;
|
|
578
|
+
if (!only)
|
|
579
|
+
continue;
|
|
580
|
+
if (rest.length === 0) {
|
|
581
|
+
bases.set(operation.classDeclaration, only);
|
|
582
|
+
continue;
|
|
583
|
+
}
|
|
584
|
+
// A base's constructor slot that also holds subclasses: the family's
|
|
585
|
+
// declared class is the base, and the emitted heritage evaluation checks
|
|
586
|
+
// the value is exactly it (`gea::exactNativeClassHeritage`).
|
|
587
|
+
const declared = carrier.abi.result.kind === 'class-ref' ? carrier.abi.result.declaration : null;
|
|
588
|
+
if (declared !== null && carrier.members.includes(declared))
|
|
589
|
+
bases.set(operation.classDeclaration, declared);
|
|
590
|
+
continue;
|
|
591
|
+
}
|
|
592
|
+
if (operation.event === 'define-method') {
|
|
593
|
+
const key = operation.operands.find((operand) => operand.role === 'key');
|
|
594
|
+
const method = operation.operands.find((operand) => operand.role === 'method');
|
|
595
|
+
const storage = operandOf(operation, 'method-storage');
|
|
596
|
+
if (key?.source.kind !== 'constant')
|
|
597
|
+
continue;
|
|
598
|
+
const target = operation.placement === 'static' ? staticMethods : methods;
|
|
599
|
+
const bucket = target.get(operation.classDeclaration) ?? [];
|
|
600
|
+
bucket.push({
|
|
601
|
+
key: key.source.text,
|
|
602
|
+
callable: method?.source.kind === 'result' ? allocatedCallableOf(allocatedCallables, method.source.result) : null,
|
|
603
|
+
...(method?.source.kind === 'result' && input.plan.selected.get(method.source.result)
|
|
604
|
+
? { representation: input.plan.selected.get(method.source.result) }
|
|
605
|
+
: {}),
|
|
606
|
+
...(storage ? { storageRepresentation: input.deriver.derive(storage.type) } : {})
|
|
607
|
+
});
|
|
608
|
+
target.set(operation.classDeclaration, bucket);
|
|
609
|
+
continue;
|
|
610
|
+
}
|
|
611
|
+
if (operation.event === 'define-getter' || operation.event === 'define-setter') {
|
|
612
|
+
const key = operation.operands.find((operand) => operand.role === 'key');
|
|
613
|
+
const half = operation.operands.find((operand) => operand.role === 'method');
|
|
614
|
+
if (key?.source.kind !== 'constant')
|
|
615
|
+
continue;
|
|
616
|
+
const name = key.source.text;
|
|
617
|
+
const callable = half?.source.kind === 'result' ? allocatedCallableOf(allocatedCallables, half.source.result) : null;
|
|
618
|
+
const target = operation.placement === 'static' ? staticAccessors : accessors;
|
|
619
|
+
const bucket = target.get(operation.classDeclaration) ?? [];
|
|
620
|
+
// A getter and its setter are two events over one member, so the second
|
|
621
|
+
// fills in the half the first left null rather than appending a second
|
|
622
|
+
// entry a lookup would then have to choose between.
|
|
623
|
+
const existing = bucket.find((entry) => entry.key === name);
|
|
624
|
+
const selected = half?.source.kind === 'result' ? (input.plan.selected.get(half.source.result) ?? null) : null;
|
|
625
|
+
const merged = operation.event === 'define-getter'
|
|
626
|
+
? { key: name, getter: callable, setter: existing?.setter ?? null, ...(selected ? { representation: selected } : {}) }
|
|
627
|
+
: {
|
|
628
|
+
key: name,
|
|
629
|
+
getter: existing?.getter ?? null,
|
|
630
|
+
setter: callable,
|
|
631
|
+
...(existing?.representation ? { representation: existing.representation } : {})
|
|
632
|
+
};
|
|
633
|
+
if (existing)
|
|
634
|
+
bucket[bucket.indexOf(existing)] = merged;
|
|
635
|
+
else
|
|
636
|
+
bucket.push(merged);
|
|
637
|
+
target.set(operation.classDeclaration, bucket);
|
|
638
|
+
continue;
|
|
639
|
+
}
|
|
640
|
+
if (operation.event !== 'define-field')
|
|
641
|
+
continue;
|
|
642
|
+
const initializerOperand = operation.operands.find((operand) => operand.role === 'initializer');
|
|
643
|
+
const keyOperand = operation.operands.find((operand) => operand.role === 'key');
|
|
644
|
+
// A field whose key is not a constant is skipped rather than guessed: a
|
|
645
|
+
// computed key names a member no fixed struct layout has, and inventing a
|
|
646
|
+
// name for it would produce a store into a field nothing declares.
|
|
647
|
+
if (keyOperand?.source.kind !== 'constant')
|
|
648
|
+
continue;
|
|
649
|
+
const target = operation.placement === 'static' ? staticFields : fields;
|
|
650
|
+
const bucket = target.get(operation.classDeclaration) ?? [];
|
|
651
|
+
bucket.push({
|
|
652
|
+
declaration: operation.declaration,
|
|
653
|
+
key: keyOperand.source.text,
|
|
654
|
+
initializer: initializerOperand?.source.kind === 'result' ? allocatedCallableOf(allocatedCallables, initializerOperand.source.result) : null,
|
|
655
|
+
representation: (() => {
|
|
656
|
+
const storage = operandOf(operation, 'field-storage');
|
|
657
|
+
return storage ? input.deriver.derive(storage.type) : null;
|
|
658
|
+
})(),
|
|
659
|
+
syntheticSubclassMemberOverlay: operation.syntheticSubclassMemberOverlay === true
|
|
660
|
+
});
|
|
661
|
+
target.set(operation.classDeclaration, bucket);
|
|
662
|
+
}
|
|
663
|
+
const layouts = new Map();
|
|
664
|
+
for (const declaration of new Set([
|
|
665
|
+
...instances.keys(),
|
|
666
|
+
...fields.keys(),
|
|
667
|
+
...methods.keys(),
|
|
668
|
+
...accessors.keys(),
|
|
669
|
+
...staticFields.keys(),
|
|
670
|
+
...staticMethods.keys(),
|
|
671
|
+
...staticAccessors.keys(),
|
|
672
|
+
...bases.keys(),
|
|
673
|
+
...nativeBases.keys(),
|
|
674
|
+
...names.keys()
|
|
675
|
+
])) {
|
|
676
|
+
layouts.set(declaration, {
|
|
677
|
+
declaration,
|
|
678
|
+
...(layoutOnly.has(declaration) ? { layoutOnly: true } : {}),
|
|
679
|
+
base: bases.get(declaration) ?? null,
|
|
680
|
+
...(prototypeBases.has(declaration) && bases.has(declaration) ? { prototypeBase: true } : {}),
|
|
681
|
+
...(input.uninstantiable?.has(declaration) ? { uninstantiable: true } : {}),
|
|
682
|
+
nativeBase: nativeBases.get(declaration) ?? null,
|
|
683
|
+
construct: constructs.get(declaration) ?? null,
|
|
684
|
+
instance: instances.get(declaration) ?? null,
|
|
685
|
+
constructor: constructors.get(declaration) ?? null,
|
|
686
|
+
fields: fields.get(declaration) ?? [],
|
|
687
|
+
fieldOwnership: [],
|
|
688
|
+
methods: methods.get(declaration) ?? [],
|
|
689
|
+
accessors: accessors.get(declaration) ?? [],
|
|
690
|
+
staticFields: staticFields.get(declaration) ?? [],
|
|
691
|
+
staticMethods: staticMethods.get(declaration) ?? [],
|
|
692
|
+
staticAccessors: staticAccessors.get(declaration) ?? [],
|
|
693
|
+
name: names.get(declaration) ?? null,
|
|
694
|
+
length: lengths.get(declaration) ?? null
|
|
695
|
+
});
|
|
696
|
+
}
|
|
697
|
+
return publishClassMethodOverrides(publishClassFieldOwnership(collapseSpecializations(layouts, physicalOf)), input);
|
|
698
|
+
};
|
|
699
|
+
/**
|
|
700
|
+
* Whether a runtime property key held in `carrier` can never be a Symbol.
|
|
701
|
+
*
|
|
702
|
+
* ToPropertyKey (ECMA-262 7.1.19) returns a Symbol only for a Symbol, or for
|
|
703
|
+
* an object whose ToPrimitive answers one. Every other primitive becomes its
|
|
704
|
+
* string. So a key carried as a string, a number, a boolean or an absence --
|
|
705
|
+
* or a union of only those -- spells string keys alone; an object, a symbol
|
|
706
|
+
* or a dynamic key may spell either and answers `false`.
|
|
707
|
+
*/
|
|
708
|
+
export const keyExcludesSymbols = (carrier) => {
|
|
709
|
+
switch (carrier.kind) {
|
|
710
|
+
case 'string':
|
|
711
|
+
case 'scalar':
|
|
712
|
+
case 'null':
|
|
713
|
+
case 'undefined':
|
|
714
|
+
return true;
|
|
715
|
+
case 'optional':
|
|
716
|
+
return keyExcludesSymbols(carrier.payload);
|
|
717
|
+
case 'borrowed-ref':
|
|
718
|
+
return keyExcludesSymbols(carrier.referent);
|
|
719
|
+
case 'tagged-union':
|
|
720
|
+
return carrier.arms.length > 0 && carrier.arms.every((arm) => keyExcludesSymbols(arm.value));
|
|
721
|
+
default:
|
|
722
|
+
return false;
|
|
723
|
+
}
|
|
724
|
+
};
|
|
725
|
+
/** A write creates an own callable property without replacing its prototype declaration. */
|
|
726
|
+
export const publishClassMethodOverrides = (layouts, input) => {
|
|
727
|
+
const overrides = new Map();
|
|
728
|
+
const prototypeMutations = new Map();
|
|
729
|
+
const prototypes = new Map();
|
|
730
|
+
const prototypeBindings = new Map();
|
|
731
|
+
const mergeOrigins = (map, key, origins) => {
|
|
732
|
+
const prior = map.get(key) ?? new Set();
|
|
733
|
+
const size = prior.size;
|
|
734
|
+
for (const declaration of origins)
|
|
735
|
+
prior.add(declaration);
|
|
736
|
+
if (prior.size === size)
|
|
737
|
+
return false;
|
|
738
|
+
map.set(key, prior);
|
|
739
|
+
return true;
|
|
740
|
+
};
|
|
741
|
+
let changed = true;
|
|
742
|
+
while (changed) {
|
|
743
|
+
changed = false;
|
|
744
|
+
for (const operation of input.graph.operations.values()) {
|
|
745
|
+
const result = resultOf(operation, 'value');
|
|
746
|
+
if (operation.family === 'property' && operation.internalMethod === 'get') {
|
|
747
|
+
const key = operandOf(operation, 'key');
|
|
748
|
+
const receiver = operandOf(operation, 'receiver');
|
|
749
|
+
const carrier = receiver?.source.kind === 'result' ? input.plan.selected.get(receiver.source.result) : null;
|
|
750
|
+
if (result && key?.source.kind === 'constant' && key.source.text === 'prototype' && carrier?.kind === 'constructor-family')
|
|
751
|
+
changed = mergeOrigins(prototypes, result.id, carrier.members.map(genericRootOf)) || changed;
|
|
752
|
+
}
|
|
753
|
+
else if (operation.family === 'binding') {
|
|
754
|
+
if (operation.action === 'read' && result)
|
|
755
|
+
changed = mergeOrigins(prototypes, result.id, prototypeBindings.get(operation.declaration) ?? []) || changed;
|
|
756
|
+
else if (operation.action === 'write' || operation.action === 'initialize') {
|
|
757
|
+
const source = operandOf(operation, operation.action === 'initialize' ? 'initializer' : 'value');
|
|
758
|
+
if (source?.source.kind === 'result') {
|
|
759
|
+
changed = mergeOrigins(prototypeBindings, operation.declaration, prototypes.get(source.source.result) ?? []) || changed;
|
|
760
|
+
if (result)
|
|
761
|
+
changed = mergeOrigins(prototypes, result.id, prototypes.get(source.source.result) ?? []) || changed;
|
|
762
|
+
}
|
|
763
|
+
}
|
|
764
|
+
}
|
|
765
|
+
else if (operation.family === 'computation' && result && (operation.form === 'conditional' || operation.form === 'logical')) {
|
|
766
|
+
for (const operand of operation.operands)
|
|
767
|
+
if (operand.source.kind === 'result')
|
|
768
|
+
changed = mergeOrigins(prototypes, result.id, prototypes.get(operand.source.result) ?? []) || changed;
|
|
769
|
+
}
|
|
770
|
+
}
|
|
771
|
+
}
|
|
772
|
+
const unsupportedPrototypes = new Map();
|
|
773
|
+
const unsupported = (declaration, reason) => {
|
|
774
|
+
const reasons = unsupportedPrototypes.get(declaration) ?? new Set();
|
|
775
|
+
reasons.add(reason);
|
|
776
|
+
unsupportedPrototypes.set(declaration, reasons);
|
|
777
|
+
};
|
|
778
|
+
const prototypeMemberIsMethod = (declaration, key) => {
|
|
779
|
+
const seen = new Set();
|
|
780
|
+
for (let current = declaration; current !== null && !seen.has(current);) {
|
|
781
|
+
seen.add(current);
|
|
782
|
+
const layout = layouts.get(current);
|
|
783
|
+
if (!layout)
|
|
784
|
+
return false;
|
|
785
|
+
if (layout.fields.some((field) => field.key === key) || layout.accessors.some((accessor) => accessor.key === key))
|
|
786
|
+
return false;
|
|
787
|
+
if (layout.methods.some((method) => method.key === key))
|
|
788
|
+
return true;
|
|
789
|
+
current = layout.base;
|
|
790
|
+
}
|
|
791
|
+
return false;
|
|
792
|
+
};
|
|
793
|
+
for (const operation of input.graph.operations.values()) {
|
|
794
|
+
for (const operand of operation.operands) {
|
|
795
|
+
if (operand.source.kind !== 'result')
|
|
796
|
+
continue;
|
|
797
|
+
const origins = prototypes.get(operand.source.result);
|
|
798
|
+
if (!origins?.size)
|
|
799
|
+
continue;
|
|
800
|
+
if (operation.family === 'binding' || operation.family === 'reference')
|
|
801
|
+
continue;
|
|
802
|
+
if (operation.family === 'computation' &&
|
|
803
|
+
(operation.form === 'conditional' ||
|
|
804
|
+
operation.form === 'logical' ||
|
|
805
|
+
operation.form === 'typeof' ||
|
|
806
|
+
operation.form === 'equality' ||
|
|
807
|
+
operation.form === 'instanceof'))
|
|
808
|
+
continue;
|
|
809
|
+
if (operation.family === 'property' && operand.role === 'receiver') {
|
|
810
|
+
const key = operandOf(operation, 'key');
|
|
811
|
+
const name = key?.source.kind === 'constant' ? key.source.text : null;
|
|
812
|
+
for (const declaration of origins) {
|
|
813
|
+
if ((operation.internalMethod === 'get' || operation.internalMethod === 'set') &&
|
|
814
|
+
name !== null &&
|
|
815
|
+
prototypeMemberIsMethod(declaration, name))
|
|
816
|
+
continue;
|
|
817
|
+
unsupported(declaration, `prototype ${operation.internalMethod} of ${name ?? 'a runtime key'} has no typed method protocol`);
|
|
818
|
+
}
|
|
819
|
+
}
|
|
820
|
+
else {
|
|
821
|
+
for (const declaration of origins)
|
|
822
|
+
unsupported(declaration, `prototype escapes through ${operation.family}:${operand.role}`);
|
|
823
|
+
}
|
|
824
|
+
}
|
|
825
|
+
}
|
|
826
|
+
const mark = (receiver, key, prototype = null, symbolKeys = true) => {
|
|
827
|
+
if (receiver.kind === 'optional')
|
|
828
|
+
return mark(receiver.payload, key, prototype, symbolKeys);
|
|
829
|
+
if (receiver.kind === 'borrowed-ref')
|
|
830
|
+
return mark(receiver.referent, key, prototype, symbolKeys);
|
|
831
|
+
if (receiver.kind === 'tagged-union') {
|
|
832
|
+
for (const arm of receiver.arms)
|
|
833
|
+
mark(arm.value, key, prototype, symbolKeys);
|
|
834
|
+
return;
|
|
835
|
+
}
|
|
836
|
+
if (receiver.kind !== 'class-ref')
|
|
837
|
+
return;
|
|
838
|
+
const chain = [];
|
|
839
|
+
const seen = new Set();
|
|
840
|
+
for (let declaration = genericRootOf(receiver.declaration); declaration !== null && !seen.has(declaration);) {
|
|
841
|
+
seen.add(declaration);
|
|
842
|
+
const layout = layouts.get(declaration);
|
|
843
|
+
if (!layout)
|
|
844
|
+
break;
|
|
845
|
+
chain.push(layout);
|
|
846
|
+
declaration = layout.base;
|
|
847
|
+
}
|
|
848
|
+
// A runtime key reaches every method its key domain can spell. A key that
|
|
849
|
+
// can only be a string or number never names a symbol-keyed member
|
|
850
|
+
// (`*[Symbol.iterator]()` is `sym(<declaration>)`), so it reserves no own
|
|
851
|
+
// slot for one -- reserving it anyway put a symbol key in the instance
|
|
852
|
+
// layout, which no fixed-slot protocol can prove.
|
|
853
|
+
const names = key === null
|
|
854
|
+
? new Set(chain.flatMap((layout) => layout.methods.map((method) => method.key).filter((name) => symbolKeys || symbolPropertyKeyDeclarationOf(name) === null)))
|
|
855
|
+
: new Set([key]);
|
|
856
|
+
for (const name of names) {
|
|
857
|
+
// A real own field/accessor hides the prototype method and owns its own
|
|
858
|
+
// storage contract. A method override in a subclass shares the root slot.
|
|
859
|
+
const visible = chain.find((layout) => layout.fields.some((field) => field.key === name) ||
|
|
860
|
+
layout.accessors.some((field) => field.key === name) ||
|
|
861
|
+
layout.methods.some((method) => method.key === name));
|
|
862
|
+
if (!visible?.methods.some((method) => method.key === name))
|
|
863
|
+
continue;
|
|
864
|
+
let owner = visible;
|
|
865
|
+
for (const ancestor of chain.slice(chain.indexOf(visible) + 1)) {
|
|
866
|
+
if (ancestor.fields.some((field) => field.key === name) || ancestor.accessors.some((field) => field.key === name))
|
|
867
|
+
break;
|
|
868
|
+
if (ancestor.methods.some((method) => method.key === name))
|
|
869
|
+
owner = ancestor;
|
|
870
|
+
}
|
|
871
|
+
const method = owner.methods.find((method) => method.key === name);
|
|
872
|
+
const representation = method?.storageRepresentation ?? method?.representation;
|
|
873
|
+
if (!representation)
|
|
874
|
+
continue;
|
|
875
|
+
const abi = abiOfCallee(representation);
|
|
876
|
+
if (!abi)
|
|
877
|
+
continue;
|
|
878
|
+
const fields = overrides.get(owner.declaration) ?? new Map();
|
|
879
|
+
fields.set(name, { key: name, value: { kind: 'function-value-dispatch', abi }, required: false });
|
|
880
|
+
overrides.set(owner.declaration, fields);
|
|
881
|
+
if (prototype !== null) {
|
|
882
|
+
const keys = prototypeMutations.get(prototype) ?? new Set();
|
|
883
|
+
keys.add(name);
|
|
884
|
+
prototypeMutations.set(prototype, keys);
|
|
885
|
+
}
|
|
886
|
+
}
|
|
887
|
+
};
|
|
888
|
+
const carrierOf = (operand) => (operand.source.kind === 'result' ? input.plan.selected.get(operand.source.result) : undefined) ?? input.deriver.derive(operand.type);
|
|
889
|
+
for (const operation of input.graph.operations.values()) {
|
|
890
|
+
let receiver;
|
|
891
|
+
let key = null;
|
|
892
|
+
// The operand a runtime key is computed from, when the write names one.
|
|
893
|
+
// Intrinsics without a key operand (`Object.assign`) copy whatever own
|
|
894
|
+
// keys their source holds, symbols included, and keep `undefined` here.
|
|
895
|
+
let runtimeKey;
|
|
896
|
+
if (operation.family === 'property' &&
|
|
897
|
+
(operation.internalMethod === 'set' || operation.internalMethod === 'delete' || operation.internalMethod === 'define-own-property')) {
|
|
898
|
+
receiver = operandOf(operation, 'receiver');
|
|
899
|
+
const named = operandOf(operation, 'key');
|
|
900
|
+
if (named?.source.kind === 'constant')
|
|
901
|
+
key = named.source.text;
|
|
902
|
+
else
|
|
903
|
+
runtimeKey = named;
|
|
904
|
+
}
|
|
905
|
+
else if (operation.family === 'invocation' && operation.intrinsicMutation) {
|
|
906
|
+
receiver = operation.operands.find((operand) => operand.role === 'argument' && operand.ordinal === 0);
|
|
907
|
+
if (operation.intrinsicMutation === 'reflect-set' || operation.intrinsicMutation === 'object-define-property') {
|
|
908
|
+
const named = operation.operands.find((operand) => operand.role === 'argument' && operand.ordinal === 1);
|
|
909
|
+
if (named?.source.kind === 'constant')
|
|
910
|
+
key = named.source.text;
|
|
911
|
+
else
|
|
912
|
+
runtimeKey = named;
|
|
913
|
+
}
|
|
914
|
+
}
|
|
915
|
+
if (!receiver)
|
|
916
|
+
continue;
|
|
917
|
+
const symbolKeys = runtimeKey === undefined || !keyExcludesSymbols(carrierOf(runtimeKey));
|
|
918
|
+
const selected = receiver.source.kind === 'result' ? input.plan.selected.get(receiver.source.result) : undefined;
|
|
919
|
+
const prototypeOrigins = receiver.source.kind === 'result' ? prototypes.get(receiver.source.result) : undefined;
|
|
920
|
+
if (prototypeOrigins?.size) {
|
|
921
|
+
for (const declaration of prototypeOrigins) {
|
|
922
|
+
const instance = layouts.get(declaration)?.instance;
|
|
923
|
+
if (instance)
|
|
924
|
+
mark(instance, key, declaration, symbolKeys);
|
|
925
|
+
}
|
|
926
|
+
}
|
|
927
|
+
else
|
|
928
|
+
mark(selected ?? input.deriver.derive(receiver.type), key, null, symbolKeys);
|
|
929
|
+
}
|
|
930
|
+
return new Map([...layouts].map(([declaration, layout]) => {
|
|
931
|
+
const fields = overrides.get(declaration);
|
|
932
|
+
const prototypeKeys = prototypeMutations.get(declaration);
|
|
933
|
+
const unsupportedUses = unsupportedPrototypes.get(declaration);
|
|
934
|
+
return [
|
|
935
|
+
declaration,
|
|
936
|
+
{
|
|
937
|
+
...layout,
|
|
938
|
+
...(fields ? { methodOverrides: [...fields.values()] } : {}),
|
|
939
|
+
...(prototypeKeys ? { prototypeMethodMutations: [...prototypeKeys] } : {}),
|
|
940
|
+
...(unsupportedUses ? { prototypeUnsupportedUses: [...unsupportedUses] } : {})
|
|
941
|
+
}
|
|
942
|
+
];
|
|
943
|
+
}));
|
|
944
|
+
};
|