@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,968 @@
|
|
|
1
|
+
import ts from 'typescript';
|
|
2
|
+
import { censusedTypeAt, isStandardInterfaceType } from './derived-expression-type.js';
|
|
3
|
+
import { emptyParameterBindingCensus } from './parameter-bindings.js';
|
|
4
|
+
import { forEachReachableStatement } from './reachability.js';
|
|
5
|
+
/**
|
|
6
|
+
* The type of the value a declaration binds, asked of the declaration's own
|
|
7
|
+
* name rather than of the declaration node.
|
|
8
|
+
*
|
|
9
|
+
* The two differ, and the difference is the point: a node's type at its own
|
|
10
|
+
* position can be the *declared* type of the thing being defined, while the
|
|
11
|
+
* symbol its name introduces carries what a reader of that name receives. For
|
|
12
|
+
* a method those coincide; for anything whose name is introduced by a
|
|
13
|
+
* declaration the checker treats specially they do not, and the name is the
|
|
14
|
+
* authority on what the binding holds. A class is the motivating case: the
|
|
15
|
+
* checker's own type AT a class declaration node is its *instance* type, and
|
|
16
|
+
* only asking after the class's own name symbol recovers the constructor.
|
|
17
|
+
*
|
|
18
|
+
* A function expression or arrow function is excluded from that: for both,
|
|
19
|
+
* `ts.getNameOfDeclaration` never reads the node's own name (a *named*
|
|
20
|
+
* function expression's name included) and instead always defers to
|
|
21
|
+
* `getAssignedName`, which walks up to whatever the value is being stored
|
|
22
|
+
* into -- a variable declarator, a property assignment, a binding element --
|
|
23
|
+
* and answers with THAT construct's own declared type. For
|
|
24
|
+
* `activeRecorder.ondataavailable = (event) => {}` this resolves to the
|
|
25
|
+
* property's declared `Handler | null`, not the arrow's own
|
|
26
|
+
* `(event: Event) => void`. Handing that union back as a *callable
|
|
27
|
+
* allocation's* own shape is the same defect `accessorSignatureOf`'s doc
|
|
28
|
+
* comment already names for accessors ("reading the property's type there
|
|
29
|
+
* hands the callable carrier a scalar"): one call to
|
|
30
|
+
* `OrdinaryFunctionCreate`/`InstantiateArrowFunctionExpression` allocates a
|
|
31
|
+
* plain callable independent of wherever it is later stored, and an optional
|
|
32
|
+
* or nullable wrapper is a fact about that later BINDING, never about this
|
|
33
|
+
* value -- so it must not reach `allocations.ts`'s `shape` field for the
|
|
34
|
+
* allocation itself. A method or a plain function declaration never takes
|
|
35
|
+
* this path: `getNameOfDeclaration` reads their OWN name directly, so no
|
|
36
|
+
* assignment target's type can substitute for theirs.
|
|
37
|
+
*
|
|
38
|
+
* `null` when the declaration introduces no name the checker resolves to a
|
|
39
|
+
* symbol, which is the caller's cue to fall back to the node's own type --
|
|
40
|
+
* exactly what a function expression or arrow function now always does.
|
|
41
|
+
*/
|
|
42
|
+
export const declaredValueTypeOf = (checker, node) => {
|
|
43
|
+
if (ts.isFunctionExpression(node) || ts.isArrowFunction(node))
|
|
44
|
+
return null;
|
|
45
|
+
const name = ts.getNameOfDeclaration(node);
|
|
46
|
+
const symbol = name ? checker.getSymbolAtLocation(name) : undefined;
|
|
47
|
+
// STATED, not held: this function's whole job (see the header comment) is
|
|
48
|
+
// reading what the BINDING's own name was ANNOTATED/declared as, precisely
|
|
49
|
+
// so callers can compare it against what the initializer physically is
|
|
50
|
+
// (`physicalInitializerTypeOf`, below). A census answers "what does this
|
|
51
|
+
// node hold"; asking it here would substitute the held value for the
|
|
52
|
+
// declared one this function exists to name, collapsing the very
|
|
53
|
+
// distinction its callers depend on.
|
|
54
|
+
return symbol ? checker.getTypeOfSymbolAtLocation(symbol, node) : null;
|
|
55
|
+
};
|
|
56
|
+
/**
|
|
57
|
+
* The type of the FUNCTION LITERAL a declaration is initialized with, when the
|
|
58
|
+
* declaration's own annotation is an overload set and the literal is not.
|
|
59
|
+
*
|
|
60
|
+
* `class Context { json: JSONRespond = (object, arg?, headers?) => {...} }`
|
|
61
|
+
* (hono's `context.ts`) is the shape. `JSONRespond` declares two call
|
|
62
|
+
* signatures differing at a shared parameter -- `status?: U` in one,
|
|
63
|
+
* `init?: ResponseOrInit<U>` in the other -- so `sharedAbiOf` (derive.ts)
|
|
64
|
+
* rightly finds no single convention and `widestSubsumingAbi` (host-abi.ts)
|
|
65
|
+
* rightly declines to widen, since that only forgives a TRAILING-optional
|
|
66
|
+
* difference and not a differing type at a shared position. The member then
|
|
67
|
+
* carries `unresolved(no primitive joining 2 overload signatures into one
|
|
68
|
+
* calling convention)`.
|
|
69
|
+
*
|
|
70
|
+
* But nothing with two conventions is ever allocated here. A function or arrow
|
|
71
|
+
* LITERAL cannot itself be overloaded -- only a `function` declaration merges
|
|
72
|
+
* that way -- so the checker types this initializer as exactly one signature,
|
|
73
|
+
* whose second parameter is the union `U | ResponseOrInit<U>` the body already
|
|
74
|
+
* discriminates on at runtime (`typeof arg === 'number' ? ...`). One physical
|
|
75
|
+
* convention, which this backend does model.
|
|
76
|
+
*
|
|
77
|
+
* This is `declaredValueTypeOf`'s own rule one level out. That function already
|
|
78
|
+
* refuses to let a storage slot's declared type reach a callable ALLOCATION's
|
|
79
|
+
* shape, for the reason its comment gives: the allocation is independent of
|
|
80
|
+
* wherever the value is later stored. The same is true of a member whose
|
|
81
|
+
* initializer is that allocation -- so the member's physical type is the
|
|
82
|
+
* literal's, not the annotation's.
|
|
83
|
+
*
|
|
84
|
+
* Sound because the checker has already proved the literal assignable to every
|
|
85
|
+
* declared overload; that is what let the program typecheck at all. This reads
|
|
86
|
+
* back the concrete answer the checker computed for the literal rather than
|
|
87
|
+
* inventing one. `null` whenever either half of the premise fails -- no
|
|
88
|
+
* function-literal initializer, or a declared type that was never an overload
|
|
89
|
+
* set -- so nothing that already resolves is re-derived.
|
|
90
|
+
*/
|
|
91
|
+
/**
|
|
92
|
+
* The single physical type of a node that DECLARES a binding annotated with an
|
|
93
|
+
* overloaded type, or `null` when the node is not one.
|
|
94
|
+
*
|
|
95
|
+
* `physicalInitializerTypeOf` asks this of a declaration whose type is already
|
|
96
|
+
* in hand; this is the same question asked of a bare node, which is what
|
|
97
|
+
* `structural.ts`'s `typeAt` has -- the BINDING's own type, as opposed to the
|
|
98
|
+
* ALLOCATION's, which `valueTypeAt` answers from the initializer directly. Both
|
|
99
|
+
* have to agree: hono's `export const parseBody: ParseBody = async (...)`
|
|
100
|
+
* allocated one async arrow and bound it under `ParseBody`'s two overloads, so
|
|
101
|
+
* the value had one convention and the name it is read through had none.
|
|
102
|
+
*/
|
|
103
|
+
export const physicalOverloadTypeAt = (checker, node, parameters = emptyParameterBindingCensus) => {
|
|
104
|
+
const declaration = node;
|
|
105
|
+
const declares = ts.isVariableDeclaration(declaration) ||
|
|
106
|
+
ts.isPropertyDeclaration(declaration) ||
|
|
107
|
+
ts.isPropertyAssignment(declaration) ||
|
|
108
|
+
ts.isImportSpecifier(declaration) ||
|
|
109
|
+
ts.isExportSpecifier(declaration) ||
|
|
110
|
+
ts.isImportClause(declaration) ||
|
|
111
|
+
// The NAME, not the specifier: `declaration-lifecycle.ts` asks about the
|
|
112
|
+
// identifier an import binds, and an ordinary reference to the same value
|
|
113
|
+
// asks about an identifier too. Both must get the one convention the
|
|
114
|
+
// value physically has, or a program that imports an overloaded-annotated
|
|
115
|
+
// binding disagrees with the module that defines it.
|
|
116
|
+
ts.isIdentifier(declaration);
|
|
117
|
+
if (!declares)
|
|
118
|
+
return null;
|
|
119
|
+
// STATED, not held: `declared` here plays the identical role
|
|
120
|
+
// `declaredValueTypeOf` names -- the ANNOTATED type this overload check
|
|
121
|
+
// exists to compare the physical initializer against (see the header
|
|
122
|
+
// comment above and `physicalInitializerTypeOf`'s `declared` parameter).
|
|
123
|
+
// The census answers "what is held", which is precisely the OTHER half of
|
|
124
|
+
// that comparison; asking it here would make both sides of the check the
|
|
125
|
+
// same question.
|
|
126
|
+
const declared = checker.getTypeAtLocation(declaration);
|
|
127
|
+
return physicalInitializerTypeOf(checker, declaration, declared, parameters);
|
|
128
|
+
};
|
|
129
|
+
/**
|
|
130
|
+
* The declaration an alias resolves to, or `null` for a node that names none.
|
|
131
|
+
*
|
|
132
|
+
* Both spellings reach here: the import SPECIFIER itself, and the identifier a
|
|
133
|
+
* producer asks about (`declaration-lifecycle.ts` asks `typeAt` about the
|
|
134
|
+
* name, not about the specifier node), so the answer cannot depend on which
|
|
135
|
+
* of the two a caller happens to hold.
|
|
136
|
+
*/
|
|
137
|
+
const aliasTargetDeclaration = (checker, node) => {
|
|
138
|
+
const named = ts.isImportSpecifier(node) || ts.isExportSpecifier(node) || ts.isImportClause(node);
|
|
139
|
+
const at = ts.isIdentifier(node) ? node : named ? ts.getNameOfDeclaration(node) : undefined;
|
|
140
|
+
const symbol = at ? checker.getSymbolAtLocation(at) : undefined;
|
|
141
|
+
if (!symbol || (symbol.flags & ts.SymbolFlags.Alias) === 0)
|
|
142
|
+
return null;
|
|
143
|
+
const target = checker.getAliasedSymbol(symbol);
|
|
144
|
+
if (target === symbol)
|
|
145
|
+
return null;
|
|
146
|
+
const targetDeclaration = target.valueDeclaration ?? target.declarations?.[0];
|
|
147
|
+
return targetDeclaration && targetDeclaration !== node ? targetDeclaration : null;
|
|
148
|
+
};
|
|
149
|
+
/**
|
|
150
|
+
* Whether a physical initializer's trailing REST parameter is a sound stand-in
|
|
151
|
+
* for a declared single signature's trailing parameters -- the other shape a
|
|
152
|
+
* member's literal and its annotation can disagree about arity, one level
|
|
153
|
+
* over the overload case this function already handles.
|
|
154
|
+
*
|
|
155
|
+
* hono's own `Hono.fetch`: `fetch: (request, Env?, executionCtx?) => ... =
|
|
156
|
+
* (request, ...rest) => { return this.#dispatch(request, rest[1], rest[0],
|
|
157
|
+
* request.method) }`. `declared` has ONE signature (never overloaded -- the
|
|
158
|
+
* overload branch below does not apply), so the existing gate
|
|
159
|
+
* (`getCallSignatures().length < 2`) correctly stayed out of this case, and
|
|
160
|
+
* the member's published type kept the declared 3-named-parameter signature
|
|
161
|
+
* while the value's OWN parameter slot -- once `parameter-slot.ts`'s
|
|
162
|
+
* `restParameterArrayTypeOf` stopped it publishing a closed record for `rest`
|
|
163
|
+
* -- correctly types it as an array. That left the member and its own
|
|
164
|
+
* allocation naming two different conventions for the identical value: the
|
|
165
|
+
* shape target 3 fixed for the parameter, still open for the member.
|
|
166
|
+
*
|
|
167
|
+
* Publishing the physical (rest-taking) signature here is sound for exactly
|
|
168
|
+
* the same reason `ECMA-262`'s own calling convention makes it sound at
|
|
169
|
+
* every ordinary call site: a rest parameter absorbs whatever a caller
|
|
170
|
+
* actually passed into a real array or tuple, REGARDLESS of whether the
|
|
171
|
+
* positions it absorbs are declared optional or required -- binding is a
|
|
172
|
+
* fact about the call, not about the annotation. A value assignable to the
|
|
173
|
+
* declared type remains callable exactly as before once the member's own
|
|
174
|
+
* type is the rest-taking one, because TypeScript already proved the
|
|
175
|
+
* initializer assignable to `declared` (what let the program compile at
|
|
176
|
+
* all); this does not re-derive that, only decides which signature the
|
|
177
|
+
* member's own type publishes.
|
|
178
|
+
*
|
|
179
|
+
* This used to require the declared tail to be entirely OPTIONAL, which is
|
|
180
|
+
* what told `fetch` (`Env?`, `executionCtx?`) apart from hono's own
|
|
181
|
+
* `render: Renderer = (...args) => {...}` (`Renderer` resolves to
|
|
182
|
+
* `DefaultRenderer`'s ONE REQUIRED parameter). That distinction never traced
|
|
183
|
+
* to a soundness difference -- both shapes have the physical rest parameter
|
|
184
|
+
* absorbing exactly the positions the declared signature's tail names, and
|
|
185
|
+
* `render`'s own inner `this.#renderer(...args)` already resolves through
|
|
186
|
+
* `tuple-spread.ts`'s `tupleSpreadReads` (the CLOSED, all-required tuple
|
|
187
|
+
* path, not the optional-tailed `maxArityTupleSpreadReads` one) -- so a
|
|
188
|
+
* required tail is not a harder case, only a different one. Requiring
|
|
189
|
+
* optionality bought nothing here and left `render` publishing two
|
|
190
|
+
* disagreeing conventions for the same value, the identical shape target 3
|
|
191
|
+
* fixed for `fetch`. Gated narrowly still, to the shape the proof covers:
|
|
192
|
+
* - `declared` must be a SINGLE signature (the overload branch below owns
|
|
193
|
+
* two-or-more);
|
|
194
|
+
* - the physical initializer's LAST parameter must be a rest parameter that
|
|
195
|
+
* `declared`'s signature does not have at all;
|
|
196
|
+
* - `declared` must have at least one parameter beyond the physical
|
|
197
|
+
* signature's fixed prefix, so there is a real tail for the rest to
|
|
198
|
+
* absorb rather than an equal-arity coincidence.
|
|
199
|
+
*/
|
|
200
|
+
const restAbsorbsDeclaredOptionalTail = (declaredSignature, physicalParameters) => {
|
|
201
|
+
const lastPhysical = physicalParameters[physicalParameters.length - 1];
|
|
202
|
+
if (!lastPhysical || lastPhysical.dotDotDotToken === undefined)
|
|
203
|
+
return false;
|
|
204
|
+
const declaredDeclaration = declaredSignature.declaration;
|
|
205
|
+
if (!declaredDeclaration)
|
|
206
|
+
return false;
|
|
207
|
+
// `declaredDeclaration.parameters` widens to include `JSDocParameterTag`
|
|
208
|
+
// for a JSDoc-derived signature, which carries none of the syntax fields
|
|
209
|
+
// below -- fail closed (not a parameter this proof can read) rather than
|
|
210
|
+
// guess at one it cannot.
|
|
211
|
+
if (!declaredDeclaration.parameters.every(ts.isParameter))
|
|
212
|
+
return false;
|
|
213
|
+
const declaredParameters = declaredDeclaration.parameters;
|
|
214
|
+
const lastDeclared = declaredParameters[declaredParameters.length - 1];
|
|
215
|
+
if (lastDeclared && lastDeclared.dotDotDotToken !== undefined)
|
|
216
|
+
return false;
|
|
217
|
+
const physicalFixedCount = physicalParameters.length - 1;
|
|
218
|
+
if (physicalFixedCount >= declaredParameters.length)
|
|
219
|
+
return false;
|
|
220
|
+
const declaredTail = declaredParameters.slice(physicalFixedCount);
|
|
221
|
+
return declaredTail.length > 0;
|
|
222
|
+
};
|
|
223
|
+
/** An expression with its parentheses removed -- the layer that changes how a write READS without changing what it stores. */
|
|
224
|
+
const withoutParens = (node) => (ts.isParenthesizedExpression(node) ? withoutParens(node.expression) : node);
|
|
225
|
+
/**
|
|
226
|
+
* Whether an assignment target can name `member`: `yes` when it provably
|
|
227
|
+
* does, `no` when it provably does not, `open` when nothing here can tell.
|
|
228
|
+
*
|
|
229
|
+
* A COMPUTED target is decided by the checker's own type for the key. hono
|
|
230
|
+
* writes its seven route registrars as `allMethods.forEach((method) => {
|
|
231
|
+
* this[method] = (args1, ...args) => {...} })` (`hono-base.ts`), and
|
|
232
|
+
* `method` is typed by the `as const` array it iterates -- a union of string
|
|
233
|
+
* literals. That union is a guarantee of the same kind every other decision
|
|
234
|
+
* in this compiler rests on: the value at run time IS one of those names.
|
|
235
|
+
* A key typed any wider (`string`, a `for-in` binding, `any`) states nothing
|
|
236
|
+
* about which member it lands on, so it is `open` and the caller refuses.
|
|
237
|
+
*/
|
|
238
|
+
const assignmentNamesMember = (checker, target, member) => {
|
|
239
|
+
if (ts.isPropertyAccessExpression(target)) {
|
|
240
|
+
if (target.name.text !== member)
|
|
241
|
+
return 'no';
|
|
242
|
+
return target.expression.kind === ts.SyntaxKind.ThisKeyword ? 'yes' : 'open';
|
|
243
|
+
}
|
|
244
|
+
if (!ts.isElementAccessExpression(target))
|
|
245
|
+
return 'no';
|
|
246
|
+
const key = checker.getTypeAtLocation(target.argumentExpression);
|
|
247
|
+
const arms = key.isUnion() ? key.types : [key];
|
|
248
|
+
if (!arms.every((arm) => arm.isStringLiteral()))
|
|
249
|
+
return 'open';
|
|
250
|
+
const names = arms.map((arm) => arm.value);
|
|
251
|
+
if (!names.includes(member))
|
|
252
|
+
return 'no';
|
|
253
|
+
return target.expression.kind === ts.SyntaxKind.ThisKeyword ? 'yes' : 'open';
|
|
254
|
+
};
|
|
255
|
+
/**
|
|
256
|
+
* The ONE function literal a class writes into a member it declares with an
|
|
257
|
+
* overload set and no initializer -- `physicalInitializerTypeOf`'s premise
|
|
258
|
+
* for the other spelling of the same allocation.
|
|
259
|
+
*
|
|
260
|
+
* hono's `HonoBase` is the shape: `get!: HandlerInterface<E, 'get', ...>`
|
|
261
|
+
* declares roughly a dozen overloads that join into no single convention, and
|
|
262
|
+
* the cell is filled by the constructor's `allMethods.forEach((method) => {
|
|
263
|
+
* this[method] = (args1: string | H, ...args: H[]) => {...} })`. One arrow is
|
|
264
|
+
* allocated; every route registrar holds it. Read off the annotation instead,
|
|
265
|
+
* the member carried `callable-identity` -- a function the plan knows only by
|
|
266
|
+
* identity -- so `app.get('/', handler)`, the first statement of every hono
|
|
267
|
+
* program, had no invoke path at all
|
|
268
|
+
* (`call-abi:no-invoke-path:callable-identity`).
|
|
269
|
+
*
|
|
270
|
+
* The premise is `physicalInitializerTypeOf`'s verbatim: a function or arrow
|
|
271
|
+
* LITERAL cannot be overloaded, TypeScript already proved this one assignable
|
|
272
|
+
* to every declared overload (which is what let the program typecheck), and
|
|
273
|
+
* whichever overload a CALL matched is a type-level fiction over the single
|
|
274
|
+
* function that exists. Only the spelling differs -- `= <literal>` at the
|
|
275
|
+
* declaration versus `this[k] = <literal>` in the constructor -- and the
|
|
276
|
+
* value allocated is the same either way.
|
|
277
|
+
*
|
|
278
|
+
* Refuses on anything it cannot see to the end of: a second distinct literal
|
|
279
|
+
* (two conventions, and nothing here picks), a non-literal right-hand side (a
|
|
280
|
+
* value whose own convention is a further question), or a target whose key
|
|
281
|
+
* cannot be resolved to names. Scoped to the declaring class's own body, the
|
|
282
|
+
* same scope the initializer arm has -- a write from outside is bound by the
|
|
283
|
+
* declared type exactly as a later write over an initialized member is, and
|
|
284
|
+
* fails closed at that write's own conversion rather than silently here.
|
|
285
|
+
*
|
|
286
|
+
* Gated to a declared OVERLOAD SET, so nothing that already resolves to one
|
|
287
|
+
* convention is re-derived: a member with a single declared signature keeps
|
|
288
|
+
* the checker's answer, and the class layout keeps agreeing with it.
|
|
289
|
+
*/
|
|
290
|
+
const writtenFunctionLiteralOf = (checker, declaration, declared) => {
|
|
291
|
+
if (!ts.isPropertyDeclaration(declaration) || declaration.initializer !== undefined)
|
|
292
|
+
return null;
|
|
293
|
+
if (declared.getCallSignatures().length < 2)
|
|
294
|
+
return null;
|
|
295
|
+
const owner = declaration.parent;
|
|
296
|
+
if (!ts.isClassLike(owner))
|
|
297
|
+
return null;
|
|
298
|
+
const name = declaration.name;
|
|
299
|
+
if (!ts.isIdentifier(name) && !ts.isStringLiteralLike(name))
|
|
300
|
+
return null;
|
|
301
|
+
const member = name.text;
|
|
302
|
+
let found = null;
|
|
303
|
+
let open = false;
|
|
304
|
+
const visit = (node) => {
|
|
305
|
+
if (open)
|
|
306
|
+
return;
|
|
307
|
+
if (ts.isBinaryExpression(node) && node.operatorToken.kind === ts.SyntaxKind.EqualsToken) {
|
|
308
|
+
const names = assignmentNamesMember(checker, withoutParens(node.left), member);
|
|
309
|
+
if (names === 'open')
|
|
310
|
+
open = true;
|
|
311
|
+
else if (names === 'yes') {
|
|
312
|
+
const value = withoutParens(node.right);
|
|
313
|
+
if (!ts.isArrowFunction(value) && !ts.isFunctionExpression(value))
|
|
314
|
+
open = true;
|
|
315
|
+
else if (found !== null && found !== value)
|
|
316
|
+
open = true;
|
|
317
|
+
else
|
|
318
|
+
found = value;
|
|
319
|
+
}
|
|
320
|
+
}
|
|
321
|
+
ts.forEachChild(node, visit);
|
|
322
|
+
};
|
|
323
|
+
for (const each of owner.members)
|
|
324
|
+
visit(each);
|
|
325
|
+
return open ? null : found;
|
|
326
|
+
};
|
|
327
|
+
export const physicalInitializerTypeOf = (checker, declaration, declared, parameters = emptyParameterBindingCensus) => {
|
|
328
|
+
// An IMPORT of such a binding asks the same question one module over. The
|
|
329
|
+
// specifier is an alias, so the symbol at the import site is the alias's --
|
|
330
|
+
// and its type is the exported name's DECLARED type, every overload of it,
|
|
331
|
+
// never the one function the exporting module actually allocated. hono's
|
|
332
|
+
// `export const parseBody: ParseBody = async (...)` is the case:
|
|
333
|
+
// `utils/body.ts` resolves to the single async arrow (below), and
|
|
334
|
+
// `request.ts`'s `import { parseBody }` resolved to `ParseBody`'s two
|
|
335
|
+
// overloads, so one value had two conventions depending on which module
|
|
336
|
+
// asked -- the two-authorities shape, with the import site refusing.
|
|
337
|
+
const alias = aliasTargetDeclaration(checker, declaration);
|
|
338
|
+
if (alias)
|
|
339
|
+
return physicalInitializerTypeOf(checker, alias, declared, parameters);
|
|
340
|
+
if (!ts.isPropertyDeclaration(declaration) && !ts.isVariableDeclaration(declaration) && !ts.isPropertyAssignment(declaration)) {
|
|
341
|
+
return null;
|
|
342
|
+
}
|
|
343
|
+
const initializer = declaration.initializer ?? writtenFunctionLiteralOf(checker, declaration, declared);
|
|
344
|
+
if (!initializer || (!ts.isArrowFunction(initializer) && !ts.isFunctionExpression(initializer)))
|
|
345
|
+
return null;
|
|
346
|
+
const declaredSignatures = declared.getCallSignatures();
|
|
347
|
+
// HOLDS: what the initializer LITERAL physically is, as opposed to
|
|
348
|
+
// `declared`'s stated/annotated type -- the whole distinction this
|
|
349
|
+
// function exists to draw (see the header comment). Asked through the
|
|
350
|
+
// shared authority; a function/arrow literal is rarely `any`-degraded, so
|
|
351
|
+
// this mostly falls straight through to the checker exactly as before,
|
|
352
|
+
// but stays uniform with every other "what does this hold" question.
|
|
353
|
+
const physical = censusedTypeAt(checker, parameters, initializer);
|
|
354
|
+
if (physical.getCallSignatures().length !== 1)
|
|
355
|
+
return null;
|
|
356
|
+
if (declaredSignatures.length >= 2)
|
|
357
|
+
return physical;
|
|
358
|
+
const soleDeclared = declaredSignatures[0];
|
|
359
|
+
if (declaredSignatures.length === 1 && soleDeclared && restAbsorbsDeclaredOptionalTail(soleDeclared, initializer.parameters))
|
|
360
|
+
return physical;
|
|
361
|
+
return null;
|
|
362
|
+
};
|
|
363
|
+
/**
|
|
364
|
+
* Whether `type` IS the standard library's `String` wrapper-object interface
|
|
365
|
+
* -- resolved by declaration identity (`isStandardInterfaceType`), which is
|
|
366
|
+
* what this function's own doc comment already claimed of it before this fix:
|
|
367
|
+
* `stringObjectDeclarationOf` (host-protocols.ts) resolves `String` through
|
|
368
|
+
* `checker.resolveName` and compares declaration identity; this used to
|
|
369
|
+
* compare the symbol's own NAME plus "some declaration sits in a `.d.ts`
|
|
370
|
+
* file" instead, which is not the same check -- a program declaring its own
|
|
371
|
+
* ambient `interface String { ... }` (or merely a same-named local one bundled
|
|
372
|
+
* from a `.d.ts`) would satisfy the old test without being the standard
|
|
373
|
+
* wrapper at all. Routed through the shared resolver so the two are one
|
|
374
|
+
* authority rather than a real one and a look-alike.
|
|
375
|
+
*/
|
|
376
|
+
const isAmbientStringObjectType = (checker, anchor, type) => isStandardInterfaceType(checker, anchor, 'String', type);
|
|
377
|
+
/** The `new` expression an initializer physically is, unwrapped through `as`/type-assertion/parens/non-null -- the layers that change the STATIC view without changing what is allocated. */
|
|
378
|
+
const unwrappedAllocation = (node) => {
|
|
379
|
+
if (ts.isNewExpression(node))
|
|
380
|
+
return node;
|
|
381
|
+
if (ts.isAsExpression(node) || ts.isTypeAssertionExpression(node) || ts.isParenthesizedExpression(node) || ts.isNonNullExpression(node)) {
|
|
382
|
+
return unwrappedAllocation(node.expression);
|
|
383
|
+
}
|
|
384
|
+
return null;
|
|
385
|
+
};
|
|
386
|
+
/** Whether `declaration` is a `const` variable declaration -- a `let`/`var` can be reassigned to something that is not a String object, and nothing here re-proves that for every later assignment. */
|
|
387
|
+
const isConstVariableDeclaration = (declaration) => {
|
|
388
|
+
const list = declaration.parent;
|
|
389
|
+
return ts.isVariableDeclarationList(list) && (list.flags & ts.NodeFlags.Const) !== 0;
|
|
390
|
+
};
|
|
391
|
+
const physicalStringObjectTypeOfDeclaringNode = (checker, declaration, parameters = emptyParameterBindingCensus) => {
|
|
392
|
+
if (!ts.isVariableDeclaration(declaration) && !ts.isPropertyDeclaration(declaration) && !ts.isPropertyAssignment(declaration))
|
|
393
|
+
return null;
|
|
394
|
+
const allocation = declaration.initializer ? unwrappedAllocation(declaration.initializer) : null;
|
|
395
|
+
if (!allocation)
|
|
396
|
+
return null;
|
|
397
|
+
// HOLDS: what the `new String(...)` expression physically allocates, the
|
|
398
|
+
// same "physical, not declared/stated" question `physicalInitializerTypeOf`
|
|
399
|
+
// asks of a function literal, one type-object over (see the header
|
|
400
|
+
// comment). A `new` expression's own type is essentially never `any`, so
|
|
401
|
+
// this almost always falls straight through to the checker unchanged --
|
|
402
|
+
// asked through the shared authority anyway, for the same uniformity
|
|
403
|
+
// reason, not because a change here was measured to move anything.
|
|
404
|
+
const physical = censusedTypeAt(checker, parameters, allocation);
|
|
405
|
+
return isAmbientStringObjectType(checker, allocation, physical) ? physical : null;
|
|
406
|
+
};
|
|
407
|
+
/**
|
|
408
|
+
* The type a `new String(x)` allocation actually has, when a declaration or a
|
|
409
|
+
* same-module reference to it is annotated with something else.
|
|
410
|
+
*
|
|
411
|
+
* hono's `utils/html.ts`: `const escapedString = new String(value) as
|
|
412
|
+
* HtmlEscapedString`. The declared/annotated type is `HtmlEscapedString =
|
|
413
|
+
* string & HtmlEscaped`, which `deriveIntersection` (representation/derive.ts)
|
|
414
|
+
* deliberately collapses to plain `string` -- correct for the alias in
|
|
415
|
+
* general, and wrong for the one value this expression actually allocates: a
|
|
416
|
+
* String WRAPPER OBJECT with identity, not a primitive. `as` changes only the
|
|
417
|
+
* STATIC view a reader gets; it does not change what `new String(...)`
|
|
418
|
+
* constructs at runtime.
|
|
419
|
+
*
|
|
420
|
+
* `physicalInitializerTypeOf`'s exact shape one level over: that function
|
|
421
|
+
* recovers the one convention a function LITERAL actually has past an
|
|
422
|
+
* overloaded annotation; this recovers the one OBJECT a `new String(...)`
|
|
423
|
+
* expression actually allocates past a widened/cast annotation. Both exist
|
|
424
|
+
* because the checker's type at the BINDING can legitimately differ from the
|
|
425
|
+
* type of the value physically stored there, and both must be asked
|
|
426
|
+
* uniformly at every site that reads the binding back, not only at its
|
|
427
|
+
* declaration -- `structural.ts`'s `typeAt` is exactly that uniform point,
|
|
428
|
+
* for the same reason it already calls `physicalOverloadTypeAt` there. A
|
|
429
|
+
* held cell and every read of it must agree, or a store/read pair would
|
|
430
|
+
* disagree about the binding's own carrier for no reason the program stated.
|
|
431
|
+
*
|
|
432
|
+
* Deliberately narrow, for the identical blast-radius reason
|
|
433
|
+
* `physicalInitializerTypeOf`'s own comment gives for its narrower cases: this
|
|
434
|
+
* does not see through an arbitrary `as`-cast pattern. It fires only when the
|
|
435
|
+
* unwrapped initializer is itself a `new` expression whose resolved type's
|
|
436
|
+
* symbol is literally named `String`, declared ambiently. `Number`/`Boolean`/
|
|
437
|
+
* every other constructor is untouched.
|
|
438
|
+
*
|
|
439
|
+
* A same-module IDENTIFIER reference reaches the same answer by walking to
|
|
440
|
+
* its declaring `VariableDeclaration`, gated to `const` only.
|
|
441
|
+
*/
|
|
442
|
+
export const physicalStringObjectTypeAt = (checker, node, parameters = emptyParameterBindingCensus) => {
|
|
443
|
+
const direct = physicalStringObjectTypeOfDeclaringNode(checker, node, parameters);
|
|
444
|
+
if (direct)
|
|
445
|
+
return direct;
|
|
446
|
+
if (!ts.isIdentifier(node))
|
|
447
|
+
return null;
|
|
448
|
+
const symbol = checker.getSymbolAtLocation(node);
|
|
449
|
+
const declaration = symbol?.valueDeclaration;
|
|
450
|
+
if (!declaration || !ts.isVariableDeclaration(declaration) || !isConstVariableDeclaration(declaration))
|
|
451
|
+
return null;
|
|
452
|
+
return physicalStringObjectTypeOfDeclaringNode(checker, declaration, parameters);
|
|
453
|
+
};
|
|
454
|
+
/**
|
|
455
|
+
* The signature a get/set accessor declaration implements, or `null` for a node
|
|
456
|
+
* that is not one.
|
|
457
|
+
*
|
|
458
|
+
* An accessor's name symbol is the *property* it implements, so its type is
|
|
459
|
+
* that property's -- `number` for `get value(): number`. What is allocated at
|
|
460
|
+
* an accessor declaration is the accessor function, whose type is its own
|
|
461
|
+
* signature. Reading the property's type there hands the callable carrier a
|
|
462
|
+
* scalar, and a call through it then has no convention to select at all.
|
|
463
|
+
*/
|
|
464
|
+
export const accessorSignatureOf = (checker, node) => {
|
|
465
|
+
if (!ts.isGetAccessorDeclaration(node) && !ts.isSetAccessorDeclaration(node))
|
|
466
|
+
return null;
|
|
467
|
+
return checker.getSignatureFromDeclaration(node) ?? null;
|
|
468
|
+
};
|
|
469
|
+
/**
|
|
470
|
+
* The single property/element access a passthrough accessor half reads or
|
|
471
|
+
* writes -- `R.k` / `R['k']` for a receiver `R` that is either a bare `this`
|
|
472
|
+
* or `this.<field>` -- or `null` for anything else. Shared by both halves of
|
|
473
|
+
* `accessorPassthroughAliasOf` so a getter and setter are compared on the
|
|
474
|
+
* identical representation of "the same access".
|
|
475
|
+
*/
|
|
476
|
+
const passthroughAccessOf = (node) => {
|
|
477
|
+
if (!ts.isPropertyAccessExpression(node) && !ts.isElementAccessExpression(node))
|
|
478
|
+
return null;
|
|
479
|
+
const receiver = node.expression;
|
|
480
|
+
const receiverField = receiver.kind === ts.SyntaxKind.ThisKeyword
|
|
481
|
+
? null
|
|
482
|
+
: ts.isPropertyAccessExpression(receiver) && receiver.expression.kind === ts.SyntaxKind.ThisKeyword
|
|
483
|
+
? receiver.name.text
|
|
484
|
+
: undefined;
|
|
485
|
+
if (receiverField === undefined)
|
|
486
|
+
return null;
|
|
487
|
+
const key = ts.isPropertyAccessExpression(node)
|
|
488
|
+
? node.name.text
|
|
489
|
+
: ts.isStringLiteralLike(node.argumentExpression)
|
|
490
|
+
? node.argumentExpression.text
|
|
491
|
+
: null;
|
|
492
|
+
if (key === null)
|
|
493
|
+
return null;
|
|
494
|
+
return { receiverField, key };
|
|
495
|
+
};
|
|
496
|
+
/**
|
|
497
|
+
* The field a get/set accessor PAIR does nothing but forward to, when both
|
|
498
|
+
* halves are exactly one statement long and agree on the identical access --
|
|
499
|
+
* `get image() { return this.source.data }` / `set image(value) {
|
|
500
|
+
* this.source.data = value }` (three's `Texture`) is the motivating shape.
|
|
501
|
+
* `null` for anything that is not provably this exact shape.
|
|
502
|
+
*
|
|
503
|
+
* This states only the SYNTACTIC fact: which access both bodies name, and
|
|
504
|
+
* that the setter's whole right-hand side is its own parameter untouched --
|
|
505
|
+
* nothing here asks whether the target the access names is itself a plain
|
|
506
|
+
* field, whether it even exists, or whether some sibling class overrides
|
|
507
|
+
* either half differently. Those are per-owner, per-family questions that
|
|
508
|
+
* need the checker and the class family's own closure, and belong beside the
|
|
509
|
+
* caller that already asks them one owner at a time --
|
|
510
|
+
* `accessorPassthroughDataMemberOf` (`flow/source-class-data.ts`), next to
|
|
511
|
+
* `isSourceDataDeclaration`, which this function's result is deliberately
|
|
512
|
+
* NOT allowed to bypass: a target that is itself an accessor still refuses.
|
|
513
|
+
*
|
|
514
|
+
* Deliberately narrow, for the same reason `physicalStringObjectTypeAt` above
|
|
515
|
+
* gives: guessing at a looser shape (a body with an early return, a
|
|
516
|
+
* multi-statement setter, a right-hand side that merely INCLUDES the
|
|
517
|
+
* parameter) risks calling something a passthrough that quietly does more,
|
|
518
|
+
* which would make a read of the alias silently skip real behavior.
|
|
519
|
+
*/
|
|
520
|
+
export const accessorPassthroughAliasOf = (getter, setter) => {
|
|
521
|
+
const getterStatements = getter.body?.statements;
|
|
522
|
+
if (!getterStatements || getterStatements.length !== 1)
|
|
523
|
+
return null;
|
|
524
|
+
const onlyReturn = getterStatements[0];
|
|
525
|
+
if (!ts.isReturnStatement(onlyReturn) || !onlyReturn.expression)
|
|
526
|
+
return null;
|
|
527
|
+
const read = passthroughAccessOf(onlyReturn.expression);
|
|
528
|
+
if (!read)
|
|
529
|
+
return null;
|
|
530
|
+
const setterStatements = setter.body?.statements;
|
|
531
|
+
if (!setterStatements || setterStatements.length !== 1)
|
|
532
|
+
return null;
|
|
533
|
+
const onlyAssignment = setterStatements[0];
|
|
534
|
+
if (!ts.isExpressionStatement(onlyAssignment))
|
|
535
|
+
return null;
|
|
536
|
+
const assignment = onlyAssignment.expression;
|
|
537
|
+
if (!ts.isBinaryExpression(assignment) || assignment.operatorToken.kind !== ts.SyntaxKind.EqualsToken)
|
|
538
|
+
return null;
|
|
539
|
+
const write = passthroughAccessOf(assignment.left);
|
|
540
|
+
if (!write || write.receiverField !== read.receiverField || write.key !== read.key)
|
|
541
|
+
return null;
|
|
542
|
+
// The whole RHS must be exactly the setter's own sole parameter, so nothing
|
|
543
|
+
// but the value the caller wrote ever reaches the receiver's real storage.
|
|
544
|
+
const parameter = setter.parameters[0];
|
|
545
|
+
if (!parameter || setter.parameters.length !== 1 || !ts.isIdentifier(parameter.name))
|
|
546
|
+
return null;
|
|
547
|
+
if (!ts.isIdentifier(assignment.right) || assignment.right.text !== parameter.name.text)
|
|
548
|
+
return null;
|
|
549
|
+
return read;
|
|
550
|
+
};
|
|
551
|
+
/**
|
|
552
|
+
* The MEMBER a passthrough accessor pair forwards to -- the storage half of
|
|
553
|
+
* the syntactic fact `accessorPassthroughAliasOf` states.
|
|
554
|
+
*
|
|
555
|
+
* three's `Texture` writes `get image() { return this.source.data }` and the
|
|
556
|
+
* matching setter, and annotates the GETTER `@type {?Object}`. That annotation
|
|
557
|
+
* is an upper bound on what may be read back, never a statement about what the
|
|
558
|
+
* slot holds -- the slot IS `Source.data`, and nothing else can be. But
|
|
559
|
+
* `Object | null` is not `any`/`void`/`never`, so every authority gated on
|
|
560
|
+
* `isUnusableEvidence` treats it as a final answer and never asks the census
|
|
561
|
+
* that knows better. `Texture.image` is read dozens of times across
|
|
562
|
+
* `WebGLTextures.js` alone, and each read boxed.
|
|
563
|
+
*
|
|
564
|
+
* The receiver type is taken from the getter's OWN access node rather than
|
|
565
|
+
* rebuilt from the owning class's symbol: the node is what the program
|
|
566
|
+
* actually wrote, the checker already types it in its real lexical position,
|
|
567
|
+
* and reconstructing an instance type from a class declaration would answer a
|
|
568
|
+
* different question for a constructor function or a class expression.
|
|
569
|
+
*
|
|
570
|
+
* Fails closed on a target that is itself an accessor. Forwarding to a second
|
|
571
|
+
* accessor is not storage -- it is another body that may do anything -- and
|
|
572
|
+
* admitting it is how a passthrough proof turns into a chain of guesses.
|
|
573
|
+
*/
|
|
574
|
+
export const accessorPassthroughMemberTargetOf = (checker, symbol) => {
|
|
575
|
+
const declarations = symbol.declarations ?? [];
|
|
576
|
+
const getter = declarations.find(ts.isGetAccessorDeclaration);
|
|
577
|
+
const setter = declarations.find(ts.isSetAccessorDeclaration);
|
|
578
|
+
if (!getter || !setter || !accessorPassthroughAliasOf(getter, setter))
|
|
579
|
+
return null;
|
|
580
|
+
const onlyReturn = getter.body?.statements[0];
|
|
581
|
+
if (!onlyReturn || !ts.isReturnStatement(onlyReturn) || !onlyReturn.expression)
|
|
582
|
+
return null;
|
|
583
|
+
const access = onlyReturn.expression;
|
|
584
|
+
if (!ts.isPropertyAccessExpression(access) && !ts.isElementAccessExpression(access))
|
|
585
|
+
return null;
|
|
586
|
+
const key = ts.isPropertyAccessExpression(access)
|
|
587
|
+
? access.name.text
|
|
588
|
+
: ts.isStringLiteralLike(access.argumentExpression)
|
|
589
|
+
? access.argumentExpression.text
|
|
590
|
+
: null;
|
|
591
|
+
if (key === null)
|
|
592
|
+
return null;
|
|
593
|
+
const receiver = checker.getApparentType(checker.getTypeAtLocation(access.expression));
|
|
594
|
+
if (isUninformativeReceiver(receiver))
|
|
595
|
+
return null;
|
|
596
|
+
const target = checker.getPropertyOfType(receiver, key);
|
|
597
|
+
const declaration = target?.declarations?.[0];
|
|
598
|
+
if (!target || !declaration)
|
|
599
|
+
return null;
|
|
600
|
+
if (ts.isGetAccessorDeclaration(declaration) || ts.isSetAccessorDeclaration(declaration))
|
|
601
|
+
return null;
|
|
602
|
+
return { symbol: target, declaration };
|
|
603
|
+
};
|
|
604
|
+
/** A receiver the checker could not type states nothing about what its members hold. */
|
|
605
|
+
const isUninformativeReceiver = (type) => (type.flags & (ts.TypeFlags.Any | ts.TypeFlags.Unknown | ts.TypeFlags.Void | ts.TypeFlags.Never)) !== 0;
|
|
606
|
+
/**
|
|
607
|
+
* The one signature an OVERLOADED function or method's implementation
|
|
608
|
+
* declares, or `null` when the node is not an overload set's implementation.
|
|
609
|
+
*
|
|
610
|
+
* `class HonoRequest { param(key: string): string; param(): Record<...>;
|
|
611
|
+
* param(key?: string): unknown { ... } }` (hono's `request.ts`) is the shape,
|
|
612
|
+
* and it is `physicalInitializerTypeOf`'s twin at TypeScript's other spelling
|
|
613
|
+
* of the same thing. Asked through the symbol, the type is every OVERLOAD
|
|
614
|
+
* signature and never the implementation's -- that is the checker's rule, and
|
|
615
|
+
* it is right for call resolution -- so `sharedAbiOf` (derive.ts) sees N
|
|
616
|
+
* conventions and refuses. But the implementation is the only body that ever
|
|
617
|
+
* runs, and it declares exactly one; N is a fact about how the method may be
|
|
618
|
+
* CALLED, never about the single function that exists.
|
|
619
|
+
*
|
|
620
|
+
* `accessorSignatureOf` above already reaches past the symbol for the same
|
|
621
|
+
* class of reason (an accessor's name symbol is the property, not the
|
|
622
|
+
* function), and this asks the checker the identical way -- from the
|
|
623
|
+
* declaration node rather than the symbol.
|
|
624
|
+
*
|
|
625
|
+
* Resolve the body's declaration from the symbol: a call-site value declaration
|
|
626
|
+
* can be the first overload, which has no body of its own. The same function
|
|
627
|
+
* object still implements the symbol's one body.
|
|
628
|
+
*
|
|
629
|
+
* ⚠ A second DECLARATION is not a second overload. TypeScript's JS expando
|
|
630
|
+
* inference makes `SourceNode.fromStringWithSourceMap = function ...` a
|
|
631
|
+
* declaration of the `SourceNode` SYMBOL, so a pre-class constructor function
|
|
632
|
+
* with any static on it has two declarations and no overloads at all. Reading
|
|
633
|
+
* the signature off its body then returns the CALL signature alone and throws
|
|
634
|
+
* away the construct signature TS's JS inference attached to the symbol -- the
|
|
635
|
+
* declaration's cell became `function-value-dispatch` while every reference
|
|
636
|
+
* stayed `function-and-constructor`, which is 96 rows of tsc's self-compile
|
|
637
|
+
* concentrated in the `source-map` packages, and a two-authorities defect of
|
|
638
|
+
* exactly the kind this compiler exists to avoid. So the set is recognized by
|
|
639
|
+
* an actual overload being present: a method/function declaration with NO
|
|
640
|
+
* body, which is the only thing an overload signature can be.
|
|
641
|
+
*/
|
|
642
|
+
export const implementationSignatureOf = (checker, node) => {
|
|
643
|
+
if (!ts.isMethodDeclaration(node) && !ts.isFunctionDeclaration(node))
|
|
644
|
+
return null;
|
|
645
|
+
const name = ts.getNameOfDeclaration(node);
|
|
646
|
+
const symbol = name ? checker.getSymbolAtLocation(name) : undefined;
|
|
647
|
+
const declarations = symbol?.getDeclarations() ?? [];
|
|
648
|
+
const overloaded = declarations.some((declaration) => (ts.isMethodDeclaration(declaration) || ts.isFunctionDeclaration(declaration)) && declaration.body === undefined);
|
|
649
|
+
if (!overloaded)
|
|
650
|
+
return null;
|
|
651
|
+
const implementation = declarations.find((declaration) => (ts.isMethodDeclaration(declaration) || ts.isFunctionDeclaration(declaration)) && declaration.body !== undefined);
|
|
652
|
+
return implementation ? (checker.getSignatureFromDeclaration(implementation) ?? null) : null;
|
|
653
|
+
};
|
|
654
|
+
/**
|
|
655
|
+
* The signature a `?`-marked class METHOD implements, when it has a real
|
|
656
|
+
* body -- or `null` when the node is not one.
|
|
657
|
+
*
|
|
658
|
+
* `bar?(): string { ... }` inside a class is not a member that may or may
|
|
659
|
+
* not be defined: `DefineMethod` runs unconditionally during
|
|
660
|
+
* `ClassDefinitionEvaluation`, so the method exists on every instance the
|
|
661
|
+
* moment the class is instantiated. The `?` states a fact about READING
|
|
662
|
+
* `bar` through a structural interface that does not require it -- a
|
|
663
|
+
* caller who only knows the interface may see `undefined` -- never a fact
|
|
664
|
+
* about whether THIS declaration's own function object gets created.
|
|
665
|
+
*
|
|
666
|
+
* `declaredValueTypeOf` (above) asks the checker for the member SYMBOL's
|
|
667
|
+
* type, and for an optional member the checker answers `T | undefined`
|
|
668
|
+
* whether the query is symbol- or node-based -- `getTypeOfSymbolAtLocation`
|
|
669
|
+
* and `getTypeAtLocation` on the declaration itself agree, verified
|
|
670
|
+
* directly against the checker rather than assumed. That answer is
|
|
671
|
+
* CORRECT for "what does reading this member give you" and simply the
|
|
672
|
+
* wrong question for an ALLOCATION's own shape: `class-lifecycle.ts`'s
|
|
673
|
+
* `allocateFunctionObject` asks `valueTypeAt` for what `DefineMethod`
|
|
674
|
+
* creates, not for what a later read of the member sees.
|
|
675
|
+
*
|
|
676
|
+
* `accessorSignatureOf` and `implementationSignatureOf` above already
|
|
677
|
+
* reach past the symbol for the identical reason (an accessor's/overload
|
|
678
|
+
* set's symbol answers a different question than the one physical function
|
|
679
|
+
* being allocated); this is the same move for the third case `questionToken`
|
|
680
|
+
* introduces. Gated on there being a body, so an interface or `.d.ts`
|
|
681
|
+
* member SIGNATURE (`ts.isMethodSignature`) is untouched: that node
|
|
682
|
+
* allocates nothing at all, and `?` there states exactly what it says --
|
|
683
|
+
* an implementer MAY omit the member.
|
|
684
|
+
*/
|
|
685
|
+
export const optionalMethodSignatureOf = (checker, node) => {
|
|
686
|
+
if (!ts.isMethodDeclaration(node))
|
|
687
|
+
return null;
|
|
688
|
+
if (node.questionToken === undefined)
|
|
689
|
+
return null;
|
|
690
|
+
if (node.body === undefined)
|
|
691
|
+
return null;
|
|
692
|
+
return checker.getSignatureFromDeclaration(node) ?? null;
|
|
693
|
+
};
|
|
694
|
+
/**
|
|
695
|
+
* The accessor pair behind an *object literal's* member, or `null`.
|
|
696
|
+
*
|
|
697
|
+
* Restricted to object literals on purpose. A class accessor is installed by a
|
|
698
|
+
* class-evaluation event and read back from the class layout
|
|
699
|
+
* (`projection/classes.ts`), so naming it here as well would be a second
|
|
700
|
+
* authority over one member. An accessor declared in an interface or a `.d.ts`
|
|
701
|
+
* has no body at all, so there is nothing for a reader to call and it stays an
|
|
702
|
+
* ordinary member of a shape the host implements.
|
|
703
|
+
*/
|
|
704
|
+
export const literalAccessorOf = (symbol, identities) => {
|
|
705
|
+
const declarations = symbol.declarations ?? [];
|
|
706
|
+
const getter = declarations.find((node) => ts.isGetAccessorDeclaration(node) && ts.isObjectLiteralExpression(node.parent));
|
|
707
|
+
const setter = declarations.find((node) => ts.isSetAccessorDeclaration(node) && ts.isObjectLiteralExpression(node.parent));
|
|
708
|
+
if (!getter && !setter)
|
|
709
|
+
return null;
|
|
710
|
+
return {
|
|
711
|
+
getter: getter ? identities.declarationIdOf(getter) : null,
|
|
712
|
+
setter: setter ? identities.declarationIdOf(setter) : null
|
|
713
|
+
};
|
|
714
|
+
};
|
|
715
|
+
/**
|
|
716
|
+
* The one signature an OVERLOADED CONSTRUCTOR's implementation declares, or
|
|
717
|
+
* `null` when the class does not overload its constructor.
|
|
718
|
+
*
|
|
719
|
+
* `implementationSignatureOf` above states the rule; this is the same fact at
|
|
720
|
+
* TypeScript's other spelling of it. `class Long { constructor(low: number,
|
|
721
|
+
* high?: number, unsigned?: boolean); constructor(value: bigint, unsigned?:
|
|
722
|
+
* boolean); constructor(value: string, unsigned?: boolean); constructor(
|
|
723
|
+
* lowOrValue: number | bigint | string = 0, highOrUnsigned?: number | boolean,
|
|
724
|
+
* unsigned?: boolean) { ... } }` (bson's `long.ts`) declares three ways to
|
|
725
|
+
* CALL `new Long`, and exactly one frame the body runs with. `sharedAbiOf`
|
|
726
|
+
* (derive.ts), asked for a convention the three share, correctly finds none
|
|
727
|
+
* and refuses -- and refusing is wrong here for the same reason it was wrong
|
|
728
|
+
* for a method: the three are views of one physical constructor, and the
|
|
729
|
+
* implementation is the one that states its frame.
|
|
730
|
+
*
|
|
731
|
+
* A constructor has no name, so the symbol test `implementationSignatureOf`
|
|
732
|
+
* uses cannot be spelled here. The class's own member list is the same
|
|
733
|
+
* question asked where it can be answered: an overload set is precisely a
|
|
734
|
+
* class carrying more than one `ConstructorDeclaration`, of which at most one
|
|
735
|
+
* has a body.
|
|
736
|
+
*
|
|
737
|
+
* Gated on the class declaring no type parameters. `getSignatureFromDeclaration`
|
|
738
|
+
* answers from the declaration, so its signature is the UNINSTANTIATED one;
|
|
739
|
+
* for a generic class that would silently drop the instantiation the
|
|
740
|
+
* constructor type was reached through. Such a class keeps refusing exactly as
|
|
741
|
+
* it does today rather than being answered with the wrong frame.
|
|
742
|
+
*/
|
|
743
|
+
export const constructorImplementationSignatureOf = (checker, declaration) => {
|
|
744
|
+
if (!ts.isClassLike(declaration))
|
|
745
|
+
return null;
|
|
746
|
+
if ((declaration.typeParameters ?? []).length > 0)
|
|
747
|
+
return null;
|
|
748
|
+
const constructors = declaration.members.filter(ts.isConstructorDeclaration);
|
|
749
|
+
if (constructors.length < 2)
|
|
750
|
+
return null;
|
|
751
|
+
const implementation = constructors.find((one) => one.body !== undefined);
|
|
752
|
+
return implementation ? (checker.getSignatureFromDeclaration(implementation) ?? null) : null;
|
|
753
|
+
};
|
|
754
|
+
/**
|
|
755
|
+
* The source of a mapped type that changes only MODIFIERS -- `Mutable<T>`,
|
|
756
|
+
* `Readonly<T>` -- or `null` for every mapped type that changes what the
|
|
757
|
+
* object holds.
|
|
758
|
+
*
|
|
759
|
+
* `type Mutable<T extends object> = { -readonly [K in keyof T]: T[K] }`
|
|
760
|
+
* (tsc's `utilities.ts`) states the same storage as `T`: `readonly` is a
|
|
761
|
+
* checker-side permission, not a physical fact, and every field keeps its own
|
|
762
|
+
* key and its own type. So `Mutable<Node>` IS `Node`, and walking it as a
|
|
763
|
+
* fresh anonymous object was not merely wasteful -- it re-entered the alias
|
|
764
|
+
* once per nested instantiation and refused with "type alias Mutable
|
|
765
|
+
* re-entered with no equivalent active instantiation", 4,503 unmet
|
|
766
|
+
* obligations on the tsc self-compile, all of them behind
|
|
767
|
+
* `nodeFactory.ts`'s `update<T extends Node>(updated: Mutable<T>, original:
|
|
768
|
+
* T)`.
|
|
769
|
+
*
|
|
770
|
+
* Every other mapped type is refused here, by construction rather than by a
|
|
771
|
+
* name list:
|
|
772
|
+
*
|
|
773
|
+
* - `Partial<T>`/`Required<T>` carry a `?` modifier, which IS physical (a
|
|
774
|
+
* presence bit), so a question token of either sign disqualifies.
|
|
775
|
+
* - `Pick<T, K>`/`Record<K, V>` constrain the key variable to something other
|
|
776
|
+
* than `keyof <source>`, so they change the key set.
|
|
777
|
+
* - A remapped key (`as`) changes the names, and a body that is anything but
|
|
778
|
+
* the identity `T[K]` changes the values.
|
|
779
|
+
*
|
|
780
|
+
* Answered through the ALIAS's own type arguments: an instantiation's type
|
|
781
|
+
* arguments are where the source actually is (the mapped type's own instance
|
|
782
|
+
* carries the substitution internally, and the checker does not publish it).
|
|
783
|
+
* A mapped type reached without an alias keeps the general path.
|
|
784
|
+
*/
|
|
785
|
+
export const modifierOnlyMappedSourceOf = (type) => {
|
|
786
|
+
const alias = type.aliasSymbol;
|
|
787
|
+
const suppliedArguments = type.aliasTypeArguments ?? [];
|
|
788
|
+
if (!alias || suppliedArguments.length === 0)
|
|
789
|
+
return null;
|
|
790
|
+
if ((type.flags & ts.TypeFlags.Object) === 0 || (type.objectFlags & ts.ObjectFlags.Mapped) === 0)
|
|
791
|
+
return null;
|
|
792
|
+
const declaration = (alias.declarations ?? []).find(ts.isTypeAliasDeclaration);
|
|
793
|
+
if (!declaration || !ts.isMappedTypeNode(declaration.type))
|
|
794
|
+
return null;
|
|
795
|
+
const mapped = declaration.type;
|
|
796
|
+
if (mapped.nameType !== undefined || mapped.questionToken !== undefined || mapped.type === undefined)
|
|
797
|
+
return null;
|
|
798
|
+
if (!ts.isIndexedAccessTypeNode(mapped.type))
|
|
799
|
+
return null;
|
|
800
|
+
const constraint = mapped.typeParameter.constraint;
|
|
801
|
+
if (!constraint || !ts.isTypeOperatorNode(constraint) || constraint.operator !== ts.SyntaxKind.KeyOfKeyword)
|
|
802
|
+
return null;
|
|
803
|
+
const sourceName = typeReferenceName(constraint.type);
|
|
804
|
+
if (sourceName === null || sourceName !== typeReferenceName(mapped.type.objectType))
|
|
805
|
+
return null;
|
|
806
|
+
if (typeReferenceName(mapped.type.indexType) !== mapped.typeParameter.name.text)
|
|
807
|
+
return null;
|
|
808
|
+
const position = (declaration.typeParameters ?? []).findIndex((parameter) => parameter.name.text === sourceName);
|
|
809
|
+
const source = position < 0 ? undefined : suppliedArguments[position];
|
|
810
|
+
// A source the caller left to the parameter's own default is not in the
|
|
811
|
+
// argument list; the general path answers it.
|
|
812
|
+
return source ?? null;
|
|
813
|
+
};
|
|
814
|
+
/** The single identifier a type reference names, or `null` for every compound type node. */
|
|
815
|
+
const typeReferenceName = (node) => ts.isTypeReferenceNode(node) && ts.isIdentifier(node.typeName) && node.typeArguments === undefined ? node.typeName.text : null;
|
|
816
|
+
const declaredMemberKeyOf = (symbol) => symbol.declarations?.[0] ?? symbol;
|
|
817
|
+
export const emptyDeclaredMemberCensus = {
|
|
818
|
+
accessorBodiesOf: () => null,
|
|
819
|
+
implementationReadsReceiver: () => false,
|
|
820
|
+
declaredMemberImplementedBy: () => null
|
|
821
|
+
};
|
|
822
|
+
export const censusDeclaredMembers = (checker, sourceFiles, identities, readsReceiver, reachable) => {
|
|
823
|
+
const accessors = new Map();
|
|
824
|
+
const conflicted = new Set();
|
|
825
|
+
const receivers = new Set();
|
|
826
|
+
const implemented = new Map();
|
|
827
|
+
const recordAccessor = (declared, getter, setter) => {
|
|
828
|
+
const key = declaredMemberKeyOf(declared);
|
|
829
|
+
const existing = accessors.get(key);
|
|
830
|
+
if (existing === undefined) {
|
|
831
|
+
accessors.set(key, { getter, setter });
|
|
832
|
+
return;
|
|
833
|
+
}
|
|
834
|
+
// A second implementer of one declared member. Identical bodies are the
|
|
835
|
+
// same literal reached twice; different ones are two objects that cannot
|
|
836
|
+
// share one interned shape, and neither may be preferred over the other.
|
|
837
|
+
if (existing.getter !== getter || existing.setter !== setter)
|
|
838
|
+
conflicted.add(key);
|
|
839
|
+
};
|
|
840
|
+
/** The declared member this literal member implements, or `null`. */
|
|
841
|
+
const declaredMemberOf = (literal, name) => {
|
|
842
|
+
const own = checker.getSymbolAtLocation(name);
|
|
843
|
+
if (!own)
|
|
844
|
+
return null;
|
|
845
|
+
const contextual = checker.getContextualType(literal);
|
|
846
|
+
if (!contextual)
|
|
847
|
+
return null;
|
|
848
|
+
const declared = contextual.getProperties().find((candidate) => candidate.escapedName === own.escapedName);
|
|
849
|
+
// No declared member, or the contextual type IS this literal's own shape --
|
|
850
|
+
// `literalAccessorOf` already answers that one, and restating it here would
|
|
851
|
+
// be the second authority this census exists to avoid. Compared through the
|
|
852
|
+
// same key the census is built on, for the reason `declaredMemberKeyOf`
|
|
853
|
+
// gives: "the literal's own member" is a fact about the DECLARATION, and a
|
|
854
|
+
// contextual type that is this literal's own shape, instantiated, would
|
|
855
|
+
// otherwise slip past an identity test on the symbol object.
|
|
856
|
+
if (!declared || declaredMemberKeyOf(declared) === declaredMemberKeyOf(own))
|
|
857
|
+
return null;
|
|
858
|
+
implemented.set(name, declared);
|
|
859
|
+
return declared;
|
|
860
|
+
};
|
|
861
|
+
/** Whether a function-like value declares its own `this` parameter. */
|
|
862
|
+
const declaresReceiver = (expression) => ts.isFunctionExpression(expression) &&
|
|
863
|
+
expression.parameters.some((parameter) => ts.isIdentifier(parameter.name) && parameter.name.escapedText === 'this');
|
|
864
|
+
/**
|
|
865
|
+
* Whether the value a getter hands back carries a receiver.
|
|
866
|
+
*
|
|
867
|
+
* `get next(): () => Step { return function (this: GetterCursor) { ... } }`
|
|
868
|
+
* stores a receiver-carrying callable into a member the program spelled
|
|
869
|
+
* `readonly next: () => Step`. The declaration says nothing about the frame;
|
|
870
|
+
* the value stored into it does, exactly as a method body does for a
|
|
871
|
+
* `MethodSignature`. Only the getter's OWN returns count -- a `return` inside
|
|
872
|
+
* a nested ordinary function belongs to that function, not to this one -- so
|
|
873
|
+
* the walk stops at every construct that introduces its own frame, which is
|
|
874
|
+
* the same boundary `bodyReadsThis` draws.
|
|
875
|
+
*/
|
|
876
|
+
const returnsReceiverCarrier = (body) => {
|
|
877
|
+
let found = false;
|
|
878
|
+
const visit = (node) => {
|
|
879
|
+
if (found)
|
|
880
|
+
return;
|
|
881
|
+
if (ts.isReturnStatement(node)) {
|
|
882
|
+
if (node.expression && declaresReceiver(node.expression))
|
|
883
|
+
found = true;
|
|
884
|
+
return;
|
|
885
|
+
}
|
|
886
|
+
if (ts.isFunctionDeclaration(node) ||
|
|
887
|
+
ts.isFunctionExpression(node) ||
|
|
888
|
+
ts.isArrowFunction(node) ||
|
|
889
|
+
ts.isMethodDeclaration(node) ||
|
|
890
|
+
ts.isGetAccessorDeclaration(node) ||
|
|
891
|
+
ts.isSetAccessorDeclaration(node) ||
|
|
892
|
+
ts.isClassLike(node)) {
|
|
893
|
+
return;
|
|
894
|
+
}
|
|
895
|
+
ts.forEachChild(node, visit);
|
|
896
|
+
};
|
|
897
|
+
ts.forEachChild(body, visit);
|
|
898
|
+
return found;
|
|
899
|
+
};
|
|
900
|
+
const visitLiteral = (literal) => {
|
|
901
|
+
for (const property of literal.properties) {
|
|
902
|
+
if (ts.isMethodDeclaration(property)) {
|
|
903
|
+
if (!property.body || !readsReceiver(property.body))
|
|
904
|
+
continue;
|
|
905
|
+
const declared = declaredMemberOf(literal, property.name);
|
|
906
|
+
if (declared)
|
|
907
|
+
receivers.add(declaredMemberKeyOf(declared));
|
|
908
|
+
continue;
|
|
909
|
+
}
|
|
910
|
+
if (ts.isPropertyAssignment(property)) {
|
|
911
|
+
// The ES5 spelling of the same store: a function VALUE placed in a
|
|
912
|
+
// member the declaration spells receiver-free.
|
|
913
|
+
if (!declaresReceiver(property.initializer))
|
|
914
|
+
continue;
|
|
915
|
+
const held = declaredMemberOf(literal, property.name);
|
|
916
|
+
if (held)
|
|
917
|
+
receivers.add(declaredMemberKeyOf(held));
|
|
918
|
+
continue;
|
|
919
|
+
}
|
|
920
|
+
if (!ts.isGetAccessorDeclaration(property) && !ts.isSetAccessorDeclaration(property))
|
|
921
|
+
continue;
|
|
922
|
+
const declared = declaredMemberOf(literal, property.name);
|
|
923
|
+
if (!declared)
|
|
924
|
+
continue;
|
|
925
|
+
if (ts.isGetAccessorDeclaration(property) && property.body && returnsReceiverCarrier(property.body))
|
|
926
|
+
receivers.add(declaredMemberKeyOf(declared));
|
|
927
|
+
const own = checker.getSymbolAtLocation(property.name);
|
|
928
|
+
// The pair is found by SYMBOL too: a computed `[Symbol.iterator]` getter
|
|
929
|
+
// and setter share one symbol and would compare equal by text only by
|
|
930
|
+
// accident.
|
|
931
|
+
const pairs = literal.properties.filter((node) => (ts.isGetAccessorDeclaration(node) || ts.isSetAccessorDeclaration(node)) && checker.getSymbolAtLocation(node.name) === own);
|
|
932
|
+
const getter = pairs.find(ts.isGetAccessorDeclaration);
|
|
933
|
+
const setter = pairs.find(ts.isSetAccessorDeclaration);
|
|
934
|
+
recordAccessor(declared, getter ? identities.declarationIdOf(getter) : null, setter ? identities.declarationIdOf(setter) : null);
|
|
935
|
+
}
|
|
936
|
+
};
|
|
937
|
+
// `recordAccessor` fails closed the moment two DIFFERENT declaration ids
|
|
938
|
+
// implement the same declared member (`existing.getter !== getter`), even
|
|
939
|
+
// when both bodies are textually identical -- two AST nodes are never one
|
|
940
|
+
// id. An unreached platform adapter counts as a second implementer just as
|
|
941
|
+
// readily as a reached one: hono's `WSContext.readyState` getter is
|
|
942
|
+
// implemented by the Node adapter's `websocket.ts` AND, unreached in a
|
|
943
|
+
// Node program, by `adapter/deno/websocket.ts` and
|
|
944
|
+
// `adapter/cloudflare-workers/websocket.ts` -- three distinct getter
|
|
945
|
+
// declarations for one declared member, which conflicts the symbol and
|
|
946
|
+
// sends every implementer's `accessorBodiesOf` to `null`, even the one
|
|
947
|
+
// program that actually runs. Restricting the walk to what `reachable`
|
|
948
|
+
// keeps is the same fix `parameter-bindings.ts`'s census family already
|
|
949
|
+
// took for the identical shape of bug.
|
|
950
|
+
const walk = (node) => {
|
|
951
|
+
if (ts.isObjectLiteralExpression(node))
|
|
952
|
+
visitLiteral(node);
|
|
953
|
+
ts.forEachChild(node, walk);
|
|
954
|
+
};
|
|
955
|
+
for (const file of sourceFiles)
|
|
956
|
+
forEachReachableStatement(reachable, file, walk);
|
|
957
|
+
return {
|
|
958
|
+
accessorBodiesOf: (symbol) => {
|
|
959
|
+
const key = declaredMemberKeyOf(symbol);
|
|
960
|
+
if (conflicted.has(key))
|
|
961
|
+
return null;
|
|
962
|
+
const bodies = accessors.get(key);
|
|
963
|
+
return bodies === undefined ? null : { getter: bodies.getter, setter: bodies.setter };
|
|
964
|
+
},
|
|
965
|
+
implementationReadsReceiver: (symbol) => receivers.has(declaredMemberKeyOf(symbol)),
|
|
966
|
+
declaredMemberImplementedBy: (name) => implemented.get(name) ?? null
|
|
967
|
+
};
|
|
968
|
+
};
|