@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,525 @@
|
|
|
1
|
+
import ts from 'typescript';
|
|
2
|
+
/**
|
|
3
|
+
* An object literal a script uses only as a prototype, rewritten into the class
|
|
4
|
+
* whose prototype it is.
|
|
5
|
+
*
|
|
6
|
+
* ## The shape
|
|
7
|
+
*
|
|
8
|
+
* `@hono/node-server`'s lightweight `Request` is a plain object of methods and
|
|
9
|
+
* accessors, grown with `Object.defineProperty`, re-parented onto the global
|
|
10
|
+
* `Request` and instantiated with `Object.create`:
|
|
11
|
+
*
|
|
12
|
+
* const requestPrototype: Record<string | symbol, any> = { get method() {...}, [getRequestCache]() {...} }
|
|
13
|
+
* Object.defineProperty(requestPrototype, 'signal', { get() {...} })
|
|
14
|
+
* Object.setPrototypeOf(requestPrototype, Request.prototype)
|
|
15
|
+
* const req = Object.create(requestPrototype)
|
|
16
|
+
*
|
|
17
|
+
* The checker types that object as a dictionary and every instance as `any`,
|
|
18
|
+
* so nothing downstream can see that the instances share one layout and one
|
|
19
|
+
* set of members. A class states exactly that: its prototype holds the same
|
|
20
|
+
* methods and accessors, `new C()` on a class with no constructor and no fields
|
|
21
|
+
* is `Object.create(C.prototype)`, and the installs and the re-parenting then
|
|
22
|
+
* read as the class forms `prototypeInstallSourceTransform` and
|
|
23
|
+
* `prototype-reparenting.ts` already model.
|
|
24
|
+
*
|
|
25
|
+
* ## What the rewrite preserves, and what it does not
|
|
26
|
+
*
|
|
27
|
+
* - Every member keeps its text. A `this` that reads a member the class
|
|
28
|
+
* declares stays the class; every other `this` is read as `any`, as the
|
|
29
|
+
* literal's contextual `ThisType` typed it, so the symbol-keyed state the
|
|
30
|
+
* object gains at run time stays dynamic and the class states no storage.
|
|
31
|
+
* - Instances stay `any` (`new C() as any`), as `Object.create` typed them.
|
|
32
|
+
* - Literal members are enumerable where class members are not. The rewrite
|
|
33
|
+
* is only admitted when the object's name appears in nothing but
|
|
34
|
+
* `Object.defineProperty`, `Object.setPrototypeOf` and one-argument
|
|
35
|
+
* `Object.create` calls, so no enumeration of it can be observed.
|
|
36
|
+
* - A literal with a data property, a spread, a shorthand, a `super` read, or
|
|
37
|
+
* `__proto__` is left as written, as is a name that is exported or
|
|
38
|
+
* declared twice in the file.
|
|
39
|
+
*
|
|
40
|
+
* ## Instances typed as the class, and the per-instance symbol slots that earns
|
|
41
|
+
*
|
|
42
|
+
* The paragraph above was the whole rewrite until this file also proved: when
|
|
43
|
+
* every symbol-keyed slot the module writes onto a created instance -- from
|
|
44
|
+
* inside the class's own members (`this[incomingKey]`) and from the site that
|
|
45
|
+
* calls `Object.create` (`req[incomingKey] = incoming`, right after) -- names
|
|
46
|
+
* a `const key = Symbol(...)` this file can see, the class declares a field
|
|
47
|
+
* for each one (`[incomingKey]: T | undefined`, the same shape
|
|
48
|
+
* `records.ts`'s declared-symbol-field dispatch already answers reads,
|
|
49
|
+
* writes, `in` and `delete` for) and the instance keeps the class as its
|
|
50
|
+
* static type instead of losing it to `Object.create`'s `any`. A dynamic
|
|
51
|
+
* receiver over that same instance -- `(this as any)[key]` inside a getter,
|
|
52
|
+
* or a helper function typed `Record<string | symbol, any>` -- still reaches
|
|
53
|
+
* the declared field rather than a side-table entry, so this file does not
|
|
54
|
+
* need to also rewrite those internal reads; only the instance's own static
|
|
55
|
+
* type, and the fields that let dropping `any` still type-check, are new.
|
|
56
|
+
*
|
|
57
|
+
* A slot's declared type is read from what this file can prove locally, with
|
|
58
|
+
* no checker: a parameter's own annotation, a `new X(...)`, a literal, or a
|
|
59
|
+
* same-file function's explicit return type. Whatever cannot be proven that
|
|
60
|
+
* way is `unknown` on that one field -- honest, and safe, because every read
|
|
61
|
+
* this file leaves untouched is already behind an `any`-shaped receiver.
|
|
62
|
+
*
|
|
63
|
+
* The rewrite backs out of typing the instance -- keeping today's `any` --
|
|
64
|
+
* the moment `Object.create`'s result is not a plain `const`/assigned
|
|
65
|
+
* identifier, or anything reachable from that identifier writes or reads a
|
|
66
|
+
* member this file cannot attribute to either a declared name or a `Symbol`
|
|
67
|
+
* constant: an unrecognized shape must fail closed rather than emit a class
|
|
68
|
+
* that does not cover everything the module does to it.
|
|
69
|
+
*/
|
|
70
|
+
const scriptKindOf = (fileName) => {
|
|
71
|
+
if (fileName.endsWith('.tsx'))
|
|
72
|
+
return ts.ScriptKind.TSX;
|
|
73
|
+
if (fileName.endsWith('.jsx'))
|
|
74
|
+
return ts.ScriptKind.JSX;
|
|
75
|
+
if (fileName.endsWith('.js') || fileName.endsWith('.mjs') || fileName.endsWith('.cjs'))
|
|
76
|
+
return ts.ScriptKind.JS;
|
|
77
|
+
return ts.ScriptKind.TS;
|
|
78
|
+
};
|
|
79
|
+
const isObjectMember = (expression, member) => ts.isPropertyAccessExpression(expression) &&
|
|
80
|
+
ts.isIdentifier(expression.expression) &&
|
|
81
|
+
expression.expression.text === 'Object' &&
|
|
82
|
+
expression.name.text === member;
|
|
83
|
+
const readsSuper = (node) => node.kind === ts.SyntaxKind.SuperKeyword || (ts.forEachChild(node, readsSuper) ?? false);
|
|
84
|
+
/**
|
|
85
|
+
* Whether a `this` stays the class: a read of a member the class declares
|
|
86
|
+
* resolves on it exactly as it did on the literal. Every other `this` -- a
|
|
87
|
+
* key the object only gains at run time, or the receiver passed on as a
|
|
88
|
+
* value -- is read as `any`, which is what the literal's `ThisType` gave it.
|
|
89
|
+
*/
|
|
90
|
+
const staysTyped = (node, declared) => {
|
|
91
|
+
const parent = node.parent;
|
|
92
|
+
if (ts.isPropertyAccessExpression(parent) && parent.expression === node)
|
|
93
|
+
return declared.names.has(parent.name.text);
|
|
94
|
+
if (ts.isElementAccessExpression(parent) && parent.expression === node) {
|
|
95
|
+
const key = parent.argumentExpression;
|
|
96
|
+
if (ts.isStringLiteralLike(key))
|
|
97
|
+
return declared.names.has(key.text);
|
|
98
|
+
return ts.isIdentifier(key) && declared.computed.has(key.text);
|
|
99
|
+
}
|
|
100
|
+
return false;
|
|
101
|
+
};
|
|
102
|
+
/**
|
|
103
|
+
* A member's text with every `this` it binds that does not stay the class
|
|
104
|
+
* read as `any` (see `staysTyped`). Nested ordinary functions and classes
|
|
105
|
+
* bind their own `this` and are left alone.
|
|
106
|
+
*/
|
|
107
|
+
const memberTextOf = (member, file, declared) => {
|
|
108
|
+
const text = member.getText(file);
|
|
109
|
+
if (declared === null)
|
|
110
|
+
return text;
|
|
111
|
+
const start = member.getStart(file);
|
|
112
|
+
const at = [];
|
|
113
|
+
const visit = (node) => {
|
|
114
|
+
if (ts.isFunctionDeclaration(node) || ts.isFunctionExpression(node) || ts.isClassLike(node) || ts.isObjectLiteralElementLike(node))
|
|
115
|
+
if (node !== member)
|
|
116
|
+
return;
|
|
117
|
+
if (node.kind === ts.SyntaxKind.ThisKeyword && !staysTyped(node, declared))
|
|
118
|
+
at.push(node.getStart(file) - start);
|
|
119
|
+
ts.forEachChild(node, visit);
|
|
120
|
+
};
|
|
121
|
+
ts.forEachChild(member, visit);
|
|
122
|
+
let out = text;
|
|
123
|
+
for (const offset of at.reverse())
|
|
124
|
+
out = `${out.slice(0, offset)}(this as any)${out.slice(offset + 'this'.length)}`;
|
|
125
|
+
return out;
|
|
126
|
+
};
|
|
127
|
+
/** Where each `this` a descriptor's own functions bind, and that does not stay the class, sits in the file. */
|
|
128
|
+
const receiverOffsetsIn = (descriptor, file, declared) => {
|
|
129
|
+
const offsets = [];
|
|
130
|
+
const visit = (node, bound) => {
|
|
131
|
+
if (ts.isFunctionDeclaration(node) || ts.isClassLike(node))
|
|
132
|
+
return;
|
|
133
|
+
// A function that is the descriptor's own `get`/`value` binds the receiver; any other ordinary function binds its own.
|
|
134
|
+
if (ts.isFunctionExpression(node) || ts.isMethodDeclaration(node)) {
|
|
135
|
+
const owned = ts.isPropertyAssignment(node.parent) ? node.parent.parent === descriptor : node.parent === descriptor;
|
|
136
|
+
if (!owned)
|
|
137
|
+
return;
|
|
138
|
+
ts.forEachChild(node, (child) => visit(child, true));
|
|
139
|
+
return;
|
|
140
|
+
}
|
|
141
|
+
if (bound && node.kind === ts.SyntaxKind.ThisKeyword && !staysTyped(node, declared))
|
|
142
|
+
offsets.push(node.getStart(file));
|
|
143
|
+
ts.forEachChild(node, (child) => visit(child, bound));
|
|
144
|
+
};
|
|
145
|
+
visit(descriptor, false);
|
|
146
|
+
return offsets;
|
|
147
|
+
};
|
|
148
|
+
/** The names a literal and its installs declare. */
|
|
149
|
+
const declaredOf = (literal, installs) => {
|
|
150
|
+
const names = new Set();
|
|
151
|
+
const computed = new Set();
|
|
152
|
+
for (const property of literal.properties) {
|
|
153
|
+
const name = property.name;
|
|
154
|
+
if (name === undefined)
|
|
155
|
+
continue;
|
|
156
|
+
if (ts.isIdentifier(name) || ts.isStringLiteral(name))
|
|
157
|
+
names.add(name.text);
|
|
158
|
+
else if (ts.isComputedPropertyName(name) && ts.isIdentifier(name.expression))
|
|
159
|
+
computed.add(name.expression.text);
|
|
160
|
+
}
|
|
161
|
+
for (const call of installs) {
|
|
162
|
+
const key = call.arguments[1];
|
|
163
|
+
if (key === undefined)
|
|
164
|
+
continue;
|
|
165
|
+
if (ts.isStringLiteralLike(key))
|
|
166
|
+
names.add(key.text);
|
|
167
|
+
else if (ts.isIdentifier(key)) {
|
|
168
|
+
// `[...literals].forEach((k) => Object.defineProperty(P, k, ...))`
|
|
169
|
+
let arrow = call;
|
|
170
|
+
while (!ts.isArrowFunction(arrow) && !ts.isSourceFile(arrow))
|
|
171
|
+
arrow = arrow.parent;
|
|
172
|
+
const loop = arrow.parent;
|
|
173
|
+
if (ts.isArrowFunction(arrow) && ts.isCallExpression(loop) && ts.isPropertyAccessExpression(loop.expression)) {
|
|
174
|
+
const list = loop.expression.expression;
|
|
175
|
+
if (ts.isArrayLiteralExpression(list))
|
|
176
|
+
for (const element of list.elements)
|
|
177
|
+
if (ts.isStringLiteralLike(element))
|
|
178
|
+
names.add(element.text);
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
return { names, computed };
|
|
183
|
+
};
|
|
184
|
+
/** A name declared exactly `const NAME = Symbol(...)` -- usable as a computed class member name. */
|
|
185
|
+
const symbolConstNamesIn = (file) => {
|
|
186
|
+
const names = new Set();
|
|
187
|
+
const visit = (node) => {
|
|
188
|
+
if (ts.isVariableDeclaration(node) &&
|
|
189
|
+
ts.isIdentifier(node.name) &&
|
|
190
|
+
node.initializer &&
|
|
191
|
+
ts.isCallExpression(node.initializer) &&
|
|
192
|
+
ts.isIdentifier(node.initializer.expression) &&
|
|
193
|
+
node.initializer.expression.text === 'Symbol' &&
|
|
194
|
+
ts.isVariableDeclarationList(node.parent) &&
|
|
195
|
+
(node.parent.flags & ts.NodeFlags.Const) !== 0)
|
|
196
|
+
names.add(node.name.text);
|
|
197
|
+
ts.forEachChild(node, visit);
|
|
198
|
+
};
|
|
199
|
+
visit(file);
|
|
200
|
+
return names;
|
|
201
|
+
};
|
|
202
|
+
/** A same-file `function NAME(...): T` or `const NAME = (...): T => ...`'s explicit return-type text, by name. */
|
|
203
|
+
const declaredReturnTypesIn = (file) => {
|
|
204
|
+
const types = new Map();
|
|
205
|
+
const visit = (node) => {
|
|
206
|
+
if (ts.isFunctionDeclaration(node) && node.name && node.type)
|
|
207
|
+
types.set(node.name.text, node.type.getText(file));
|
|
208
|
+
if (ts.isVariableDeclaration(node) &&
|
|
209
|
+
ts.isIdentifier(node.name) &&
|
|
210
|
+
node.initializer &&
|
|
211
|
+
(ts.isArrowFunction(node.initializer) || ts.isFunctionExpression(node.initializer)) &&
|
|
212
|
+
node.initializer.type)
|
|
213
|
+
types.set(node.name.text, node.initializer.type.getText(file));
|
|
214
|
+
ts.forEachChild(node, visit);
|
|
215
|
+
};
|
|
216
|
+
visit(file);
|
|
217
|
+
return types;
|
|
218
|
+
};
|
|
219
|
+
/** The value an element-access write assigns, or `null` when the access is not the target of `=`/`||=`/`??=`/`&&=`. */
|
|
220
|
+
const writeRhsOf = (elementAccess) => {
|
|
221
|
+
const parent = elementAccess.parent;
|
|
222
|
+
if (ts.isBinaryExpression(parent) &&
|
|
223
|
+
parent.left === elementAccess &&
|
|
224
|
+
(parent.operatorToken.kind === ts.SyntaxKind.EqualsToken ||
|
|
225
|
+
parent.operatorToken.kind === ts.SyntaxKind.BarBarEqualsToken ||
|
|
226
|
+
parent.operatorToken.kind === ts.SyntaxKind.QuestionQuestionEqualsToken ||
|
|
227
|
+
parent.operatorToken.kind === ts.SyntaxKind.AmpersandAmpersandEqualsToken))
|
|
228
|
+
return parent.right;
|
|
229
|
+
return null;
|
|
230
|
+
};
|
|
231
|
+
const emptyScan = () => ({ keys: new Set(), writes: new Map() });
|
|
232
|
+
/** Records one `root[key]` use, skipping a key called as a method (`root[key](...)`) -- that is a member read, not a data slot. */
|
|
233
|
+
const recordElementKeyUse = (scan, access) => {
|
|
234
|
+
const arg = access.argumentExpression;
|
|
235
|
+
if (!ts.isIdentifier(arg))
|
|
236
|
+
return;
|
|
237
|
+
const parent = access.parent;
|
|
238
|
+
if (ts.isCallExpression(parent) && parent.expression === access)
|
|
239
|
+
return;
|
|
240
|
+
scan.keys.add(arg.text);
|
|
241
|
+
const rhs = writeRhsOf(access);
|
|
242
|
+
if (rhs) {
|
|
243
|
+
const list = scan.writes.get(arg.text) ?? [];
|
|
244
|
+
list.push(rhs);
|
|
245
|
+
scan.writes.set(arg.text, list);
|
|
246
|
+
}
|
|
247
|
+
};
|
|
248
|
+
/** Every `this[identifier]` a literal member's own body reaches -- nested functions/classes bind their own `this` and are skipped. */
|
|
249
|
+
const thisElementAccessScanIn = (member) => {
|
|
250
|
+
const scan = emptyScan();
|
|
251
|
+
const visit = (node) => {
|
|
252
|
+
if (ts.isFunctionDeclaration(node) || ts.isFunctionExpression(node) || ts.isClassLike(node) || ts.isObjectLiteralElementLike(node))
|
|
253
|
+
if (node !== member)
|
|
254
|
+
return;
|
|
255
|
+
if (node.kind === ts.SyntaxKind.ThisKeyword && ts.isElementAccessExpression(node.parent) && node.parent.expression === node)
|
|
256
|
+
recordElementKeyUse(scan, node.parent);
|
|
257
|
+
ts.forEachChild(node, visit);
|
|
258
|
+
};
|
|
259
|
+
ts.forEachChild(member, visit);
|
|
260
|
+
return scan;
|
|
261
|
+
};
|
|
262
|
+
/** Every `this[identifier]` an install descriptor's own `get`/`set`/`value` function reaches (mirrors `receiverOffsetsIn`'s bound tracking). */
|
|
263
|
+
const thisElementAccessScanInDescriptor = (descriptor) => {
|
|
264
|
+
const scan = emptyScan();
|
|
265
|
+
const visit = (node, bound) => {
|
|
266
|
+
if (ts.isFunctionDeclaration(node) || ts.isClassLike(node))
|
|
267
|
+
return;
|
|
268
|
+
if (ts.isFunctionExpression(node) || ts.isMethodDeclaration(node)) {
|
|
269
|
+
const owned = ts.isPropertyAssignment(node.parent) ? node.parent.parent === descriptor : node.parent === descriptor;
|
|
270
|
+
if (!owned)
|
|
271
|
+
return;
|
|
272
|
+
ts.forEachChild(node, (child) => visit(child, true));
|
|
273
|
+
return;
|
|
274
|
+
}
|
|
275
|
+
if (bound && node.kind === ts.SyntaxKind.ThisKeyword && ts.isElementAccessExpression(node.parent) && node.parent.expression === node)
|
|
276
|
+
recordElementKeyUse(scan, node.parent);
|
|
277
|
+
ts.forEachChild(node, (child) => visit(child, bound));
|
|
278
|
+
};
|
|
279
|
+
visit(descriptor, false);
|
|
280
|
+
return scan;
|
|
281
|
+
};
|
|
282
|
+
const mergeScans = (scans) => {
|
|
283
|
+
const merged = emptyScan();
|
|
284
|
+
for (const scan of scans) {
|
|
285
|
+
for (const key of scan.keys)
|
|
286
|
+
merged.keys.add(key);
|
|
287
|
+
for (const [key, exprs] of scan.writes) {
|
|
288
|
+
const list = merged.writes.get(key) ?? [];
|
|
289
|
+
list.push(...exprs);
|
|
290
|
+
merged.writes.set(key, list);
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
return merged;
|
|
294
|
+
};
|
|
295
|
+
/** The nearest enclosing function (or the file itself) a node sits in -- the scope a `const x = Object.create(...)` result is live in. */
|
|
296
|
+
const enclosingScopeOf = (node) => {
|
|
297
|
+
let scope = node;
|
|
298
|
+
while (!ts.isSourceFile(scope) &&
|
|
299
|
+
!ts.isFunctionDeclaration(scope) &&
|
|
300
|
+
!ts.isFunctionExpression(scope) &&
|
|
301
|
+
!ts.isArrowFunction(scope) &&
|
|
302
|
+
!ts.isMethodDeclaration(scope))
|
|
303
|
+
scope = scope.parent;
|
|
304
|
+
return scope;
|
|
305
|
+
};
|
|
306
|
+
/**
|
|
307
|
+
* Every use of `varName` in `scope`: an element/property access must resolve to a name the class
|
|
308
|
+
* already declares or a `Symbol` constant this file can turn into a field, or `allResolved` is
|
|
309
|
+
* `false` -- the signal to keep `Object.create`'s instance untyped rather than emit a class that
|
|
310
|
+
* does not cover something the module does to it.
|
|
311
|
+
*/
|
|
312
|
+
const scanVariableUses = (scope, varName, declared, symbolConsts) => {
|
|
313
|
+
const scan = emptyScan();
|
|
314
|
+
let allResolved = true;
|
|
315
|
+
const visit = (node) => {
|
|
316
|
+
if (ts.isIdentifier(node) && node.text === varName) {
|
|
317
|
+
const parent = node.parent;
|
|
318
|
+
if (ts.isElementAccessExpression(parent) && parent.expression === node) {
|
|
319
|
+
const arg = parent.argumentExpression;
|
|
320
|
+
if (ts.isStringLiteralLike(arg)) {
|
|
321
|
+
if (!declared.names.has(arg.text))
|
|
322
|
+
allResolved = false;
|
|
323
|
+
}
|
|
324
|
+
else if (ts.isIdentifier(arg)) {
|
|
325
|
+
if (!declared.computed.has(arg.text) && !symbolConsts.has(arg.text))
|
|
326
|
+
allResolved = false;
|
|
327
|
+
else
|
|
328
|
+
recordElementKeyUse(scan, parent);
|
|
329
|
+
}
|
|
330
|
+
else
|
|
331
|
+
allResolved = false;
|
|
332
|
+
}
|
|
333
|
+
else if (ts.isPropertyAccessExpression(parent) && parent.expression === node && !declared.names.has(parent.name.text))
|
|
334
|
+
allResolved = false;
|
|
335
|
+
}
|
|
336
|
+
ts.forEachChild(node, visit);
|
|
337
|
+
};
|
|
338
|
+
visit(scope);
|
|
339
|
+
return { ...scan, allResolved };
|
|
340
|
+
};
|
|
341
|
+
/** The best-effort static type of an expression assigned to a data-slot field, from local syntax alone -- `null` when not confidently known. */
|
|
342
|
+
const syntacticTypeOf = (expr, file, returnTypes) => {
|
|
343
|
+
if (ts.isParenthesizedExpression(expr))
|
|
344
|
+
return syntacticTypeOf(expr.expression, file, returnTypes);
|
|
345
|
+
if (expr.kind === ts.SyntaxKind.TrueKeyword || expr.kind === ts.SyntaxKind.FalseKeyword)
|
|
346
|
+
return 'boolean';
|
|
347
|
+
if (ts.isStringLiteralLike(expr))
|
|
348
|
+
return 'string';
|
|
349
|
+
if (ts.isNumericLiteral(expr))
|
|
350
|
+
return 'number';
|
|
351
|
+
if (ts.isNewExpression(expr) && ts.isIdentifier(expr.expression))
|
|
352
|
+
return expr.expression.text;
|
|
353
|
+
if (ts.isCallExpression(expr) && ts.isIdentifier(expr.expression))
|
|
354
|
+
return returnTypes.get(expr.expression.text) ?? null;
|
|
355
|
+
if (ts.isIdentifier(expr)) {
|
|
356
|
+
if (expr.text === 'undefined')
|
|
357
|
+
return null;
|
|
358
|
+
for (let node = expr; !ts.isSourceFile(node); node = node.parent) {
|
|
359
|
+
const parent = node.parent;
|
|
360
|
+
if (ts.isFunctionDeclaration(parent) ||
|
|
361
|
+
ts.isFunctionExpression(parent) ||
|
|
362
|
+
ts.isArrowFunction(parent) ||
|
|
363
|
+
ts.isMethodDeclaration(parent))
|
|
364
|
+
for (const p of parent.parameters)
|
|
365
|
+
if (ts.isIdentifier(p.name) && p.name.text === expr.text && p.type)
|
|
366
|
+
return p.type.getText(file);
|
|
367
|
+
}
|
|
368
|
+
}
|
|
369
|
+
return null;
|
|
370
|
+
};
|
|
371
|
+
/** A data-slot field's declared type: the union of every write this file can attribute a type to, or `unknown` when none can be. */
|
|
372
|
+
const fieldTypeOf = (writes, file, returnTypes) => {
|
|
373
|
+
const texts = new Set();
|
|
374
|
+
for (const write of writes) {
|
|
375
|
+
const type = syntacticTypeOf(write, file, returnTypes);
|
|
376
|
+
if (type)
|
|
377
|
+
texts.add(type);
|
|
378
|
+
}
|
|
379
|
+
return texts.size === 0 ? 'unknown' : [...texts].join(' | ');
|
|
380
|
+
};
|
|
381
|
+
/** The literal's members as class member texts, or `null` when one has no class form. */
|
|
382
|
+
const classMembersOf = (literal, file, declared) => {
|
|
383
|
+
const members = [];
|
|
384
|
+
for (const property of literal.properties) {
|
|
385
|
+
if (!(ts.isMethodDeclaration(property) || ts.isGetAccessorDeclaration(property) || ts.isSetAccessorDeclaration(property)))
|
|
386
|
+
return null;
|
|
387
|
+
const name = property.name;
|
|
388
|
+
if ((ts.isIdentifier(name) || ts.isStringLiteral(name)) && name.text === '__proto__')
|
|
389
|
+
return null;
|
|
390
|
+
if (readsSuper(property))
|
|
391
|
+
return null;
|
|
392
|
+
members.push(memberTextOf(property, file, declared));
|
|
393
|
+
}
|
|
394
|
+
return members;
|
|
395
|
+
};
|
|
396
|
+
const isCreateUse = (use) => use.kind === 'create';
|
|
397
|
+
/** The identifier a `const NAME = Object.create(...)` or `NAME = Object.create(...)` binds its result to, or `null` for any other shape. */
|
|
398
|
+
const boundNameOf = (call) => {
|
|
399
|
+
const parent = call.parent;
|
|
400
|
+
if (ts.isVariableDeclaration(parent) && ts.isIdentifier(parent.name))
|
|
401
|
+
return parent.name.text;
|
|
402
|
+
if (ts.isBinaryExpression(parent) && parent.operatorToken.kind === ts.SyntaxKind.EqualsToken && ts.isIdentifier(parent.left))
|
|
403
|
+
return parent.left.text;
|
|
404
|
+
return null;
|
|
405
|
+
};
|
|
406
|
+
/**
|
|
407
|
+
* The fields to declare on the class for the symbol-keyed slots the module writes on its
|
|
408
|
+
* instances, and whether every such write is attributable -- the gate for typing the instance as
|
|
409
|
+
* the class instead of `Object.create`'s `any`. `declared === null` (an untyped `.js` file) always
|
|
410
|
+
* answers no fields and no gate, matching this rewrite's existing untyped behaviour.
|
|
411
|
+
*/
|
|
412
|
+
const instanceTypingOf = (file, literal, installs, createUses, declared, symbolConsts, returnTypes) => {
|
|
413
|
+
if (declared === null)
|
|
414
|
+
return { fieldMembers: [], instantiationIsTyped: false };
|
|
415
|
+
const memberScans = [
|
|
416
|
+
...literal.properties.map((member) => thisElementAccessScanIn(member)),
|
|
417
|
+
...installs.flatMap((call) => (call.arguments[2] ? [thisElementAccessScanInDescriptor(call.arguments[2])] : []))
|
|
418
|
+
];
|
|
419
|
+
let instantiationIsTyped = createUses.length > 0;
|
|
420
|
+
const instanceScans = [];
|
|
421
|
+
for (const call of createUses) {
|
|
422
|
+
const varName = boundNameOf(call);
|
|
423
|
+
if (varName === null) {
|
|
424
|
+
instantiationIsTyped = false;
|
|
425
|
+
continue;
|
|
426
|
+
}
|
|
427
|
+
const scan = scanVariableUses(enclosingScopeOf(call), varName, declared, symbolConsts);
|
|
428
|
+
if (!scan.allResolved)
|
|
429
|
+
instantiationIsTyped = false;
|
|
430
|
+
instanceScans.push(scan);
|
|
431
|
+
}
|
|
432
|
+
const merged = mergeScans([...memberScans, ...instanceScans]);
|
|
433
|
+
const dataSlotNames = [...merged.keys].filter((key) => symbolConsts.has(key) && !declared.names.has(key) && !declared.computed.has(key));
|
|
434
|
+
const fieldMembers = dataSlotNames.map((key) => `[${key}]: ${fieldTypeOf(merged.writes.get(key) ?? [], file, returnTypes)} | undefined`);
|
|
435
|
+
return { fieldMembers, instantiationIsTyped };
|
|
436
|
+
};
|
|
437
|
+
/** Every use of `name` in the file, or `null` when one is not a prototype-surgery argument. */
|
|
438
|
+
const usesOf = (file, name, declaration) => {
|
|
439
|
+
const uses = [];
|
|
440
|
+
let refused = false;
|
|
441
|
+
const visit = (node) => {
|
|
442
|
+
if (refused || node === declaration.name)
|
|
443
|
+
return;
|
|
444
|
+
if (ts.isIdentifier(node) && node.text === name) {
|
|
445
|
+
const parent = node.parent;
|
|
446
|
+
const isMemberName = (ts.isPropertyAccessExpression(parent) && parent.name === node) ||
|
|
447
|
+
(ts.isPropertyAssignment(parent) && parent.name === node) ||
|
|
448
|
+
((ts.isMethodDeclaration(parent) || ts.isPropertyDeclaration(parent) || ts.isAccessor(parent)) && parent.name === node);
|
|
449
|
+
if (isMemberName)
|
|
450
|
+
return;
|
|
451
|
+
if (ts.isCallExpression(parent) &&
|
|
452
|
+
parent.arguments[0] === node &&
|
|
453
|
+
((isObjectMember(parent.expression, 'defineProperty') && parent.arguments.length === 3) ||
|
|
454
|
+
(isObjectMember(parent.expression, 'setPrototypeOf') && parent.arguments.length === 2)))
|
|
455
|
+
uses.push({ kind: 'target', node });
|
|
456
|
+
else if (ts.isCallExpression(parent) && isObjectMember(parent.expression, 'create') && parent.arguments.length === 1)
|
|
457
|
+
uses.push({ kind: 'create', node: parent });
|
|
458
|
+
else
|
|
459
|
+
refused = true;
|
|
460
|
+
return;
|
|
461
|
+
}
|
|
462
|
+
ts.forEachChild(node, visit);
|
|
463
|
+
};
|
|
464
|
+
visit(file);
|
|
465
|
+
return refused ? null : uses;
|
|
466
|
+
};
|
|
467
|
+
export const prototypeObjectClassSourceTransform = (input) => {
|
|
468
|
+
if (!input.text.includes('Object.create') || !input.text.includes('setPrototypeOf'))
|
|
469
|
+
return null;
|
|
470
|
+
const kind = scriptKindOf(input.fileName);
|
|
471
|
+
const file = ts.createSourceFile(input.fileName, input.text, ts.ScriptTarget.Latest, true, kind);
|
|
472
|
+
const typed = kind === ts.ScriptKind.TS || kind === ts.ScriptKind.TSX;
|
|
473
|
+
const symbolConsts = typed ? symbolConstNamesIn(file) : new Set();
|
|
474
|
+
const returnTypes = typed ? declaredReturnTypesIn(file) : new Map();
|
|
475
|
+
const edits = [];
|
|
476
|
+
for (const statement of file.statements) {
|
|
477
|
+
if (!ts.isVariableStatement(statement) || statement.modifiers?.length)
|
|
478
|
+
continue;
|
|
479
|
+
if ((statement.declarationList.flags & ts.NodeFlags.Const) === 0 || statement.declarationList.declarations.length !== 1)
|
|
480
|
+
continue;
|
|
481
|
+
const declaration = statement.declarationList.declarations[0];
|
|
482
|
+
if (!ts.isIdentifier(declaration.name) || !declaration.initializer || !ts.isObjectLiteralExpression(declaration.initializer))
|
|
483
|
+
continue;
|
|
484
|
+
const name = declaration.name.text;
|
|
485
|
+
const uses = usesOf(file, name, declaration);
|
|
486
|
+
if (uses === null || !uses.some((use) => use.kind === 'create'))
|
|
487
|
+
continue;
|
|
488
|
+
const installs = uses.flatMap((use) => use.kind === 'target' && isObjectMember(use.node.parent.expression, 'defineProperty')
|
|
489
|
+
? [use.node.parent]
|
|
490
|
+
: []);
|
|
491
|
+
const declared = typed ? declaredOf(declaration.initializer, installs) : null;
|
|
492
|
+
const members = classMembersOf(declaration.initializer, file, declared);
|
|
493
|
+
if (members === null || members.length === 0)
|
|
494
|
+
continue;
|
|
495
|
+
const createUses = uses.filter(isCreateUse).map((use) => use.node);
|
|
496
|
+
const { fieldMembers, instantiationIsTyped } = instanceTypingOf(file, declaration.initializer, installs, createUses, declared, symbolConsts, returnTypes);
|
|
497
|
+
const classMembers = [...members, ...fieldMembers];
|
|
498
|
+
edits.push({ start: statement.getStart(file), end: statement.end, text: `class ${name} {\n${classMembers.join('\n')}\n}` });
|
|
499
|
+
for (const use of uses) {
|
|
500
|
+
if (use.kind === 'target' && declared !== null) {
|
|
501
|
+
// The descriptor's functions become members of the class too
|
|
502
|
+
// (`prototypeInstallSourceTransform`); their `this` reads the same way.
|
|
503
|
+
const call = use.node.parent;
|
|
504
|
+
const descriptor = call.arguments[2];
|
|
505
|
+
if (descriptor)
|
|
506
|
+
for (const offset of receiverOffsetsIn(descriptor, file, declared))
|
|
507
|
+
edits.push({ start: offset, end: offset + 4, text: '(this as any)' });
|
|
508
|
+
}
|
|
509
|
+
if (use.kind === 'target')
|
|
510
|
+
edits.push({ start: use.node.getStart(file), end: use.node.end, text: `${name}.prototype` });
|
|
511
|
+
else
|
|
512
|
+
edits.push({
|
|
513
|
+
start: use.node.getStart(file),
|
|
514
|
+
end: use.node.end,
|
|
515
|
+
text: !typed || instantiationIsTyped ? `new ${name}()` : `(new ${name}() as any)`
|
|
516
|
+
});
|
|
517
|
+
}
|
|
518
|
+
}
|
|
519
|
+
if (edits.length === 0)
|
|
520
|
+
return null;
|
|
521
|
+
let rewritten = input.text;
|
|
522
|
+
for (const edit of [...edits].sort((left, right) => right.start - left.start))
|
|
523
|
+
rewritten = rewritten.slice(0, edit.start) + edit.text + rewritten.slice(edit.end);
|
|
524
|
+
return rewritten;
|
|
525
|
+
};
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import ts from 'typescript';
|
|
2
|
+
import type { DeclarationId } from '../identity/ids.js';
|
|
3
|
+
import type { IdentityTable } from './normalize/identities.js';
|
|
4
|
+
export interface PrototypeReparenting {
|
|
5
|
+
/** The class whose prototype is re-parented. */
|
|
6
|
+
readonly derived: ts.ClassDeclaration;
|
|
7
|
+
/** The expression naming the class object whose prototype becomes the parent. */
|
|
8
|
+
readonly baseValue: ts.Expression;
|
|
9
|
+
/** The class that value is typed as. */
|
|
10
|
+
readonly base: ts.ClassLikeDeclaration;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* `Object.setPrototypeOf(C.prototype, B.prototype)` run once, at the top level
|
|
14
|
+
* of the module that declares the class `C`, where `C` has no `extends` and
|
|
15
|
+
* `B` is a class this program compiles.
|
|
16
|
+
*
|
|
17
|
+
* `@hono/node-server`'s `RequestHeaders` is the shape: it answers the
|
|
18
|
+
* `Headers` surface itself and re-parents its prototype so its instances are
|
|
19
|
+
* `instanceof Headers`. After the call `C.prototype`'s [[Prototype]] is
|
|
20
|
+
* `B.prototype`, so for member lookup a `C` instance is exactly what an
|
|
21
|
+
* instance of `class C extends B` would be, except that `B`'s constructor
|
|
22
|
+
* never ran on it. That is what this compiler models: `B` becomes `C`'s base
|
|
23
|
+
* for layout, dispatch and upcasts, and the call itself checks at run time
|
|
24
|
+
* that the value really is `B` and links the two class evaluations
|
|
25
|
+
* (`gea::reparentNativeClass`). `reparentingIsSound` is what makes the
|
|
26
|
+
* missing constructor run unobservable.
|
|
27
|
+
*
|
|
28
|
+
* The class and the call must be statements of the same module body with the
|
|
29
|
+
* call unconditional, so the re-parenting happens before any function the
|
|
30
|
+
* module exports can run. A class with `extends` already has a prototype
|
|
31
|
+
* parent that its constructor's `super()` initializes, which this does not
|
|
32
|
+
* model.
|
|
33
|
+
*
|
|
34
|
+
* `Object` is authenticated by the caller, each with its own authority.
|
|
35
|
+
*/
|
|
36
|
+
export declare const prototypeReparentingOf: (checker: ts.TypeChecker, call: ts.CallExpression) => PrototypeReparenting | null;
|
|
37
|
+
/** Whether `call` is `Object.setPrototypeOf` on the standard `Object`. */
|
|
38
|
+
export declare const isObjectSetPrototypeOf: (checker: ts.TypeChecker, call: ts.CallExpression) => boolean;
|
|
39
|
+
export interface PrototypeReparentingCensus {
|
|
40
|
+
/** The re-parenting a call performs, when it is one this program models. */
|
|
41
|
+
readonly of: (call: ts.CallExpression) => PrototypeReparenting | null;
|
|
42
|
+
/** The class a re-parented class now inherits from. */
|
|
43
|
+
readonly baseOf: (derived: ts.ClassLikeDeclaration) => ts.ClassLikeDeclaration | null;
|
|
44
|
+
readonly bases: ReadonlyMap<DeclarationId, DeclarationId>;
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Every class this program re-parents. A class re-parented twice has no single
|
|
48
|
+
* base and is left out, so both of its calls stay with the mutation census.
|
|
49
|
+
*/
|
|
50
|
+
export declare const prototypeReparentingsOf: (checker: ts.TypeChecker, identities: IdentityTable, files: readonly ts.SourceFile[]) => PrototypeReparentingCensus;
|