@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,835 @@
|
|
|
1
|
+
import ts from 'typescript';
|
|
2
|
+
import { heritageClassOrInterfaceOf, isClassSpelledSourceClass, isConstructorFunction } from './model.js';
|
|
3
|
+
import { outermostErasureOf, unwrapErasedExpression } from '../producers/erasure.js';
|
|
4
|
+
import { isTypePositionReference, namespaceMemberDeclarationOf, resolveFlowSymbolAlias, unwrapNaming } from './targets.js';
|
|
5
|
+
import { sourceClassHasDefaultInstanceOfShape } from './source-class-instanceof.js';
|
|
6
|
+
import { sourceClassStaticDataUseOf } from './source-class-static-data.js';
|
|
7
|
+
import { sourcePrototypeMethodIdentityUseOf } from './source-prototype-method-identity.js';
|
|
8
|
+
import { seededOriginSolver, isVacuousOrigin } from './seeded-origins.js';
|
|
9
|
+
import { nodePathToken } from './node-path-token.js';
|
|
10
|
+
import { hypothesisGuardIsOpen, noteHypothesis, popHypothesisTrail, pushHypothesisTrail, registerGuardedAnswer } from './proof-hypotheses.js';
|
|
11
|
+
import { deferredIntrinsicProtocolLedgerOf } from '../deferred-intrinsic-protocols.js';
|
|
12
|
+
import { frameForwardedArgumentOf, frameForwardedParameterOf } from './invocation-facts.js';
|
|
13
|
+
import { exportIsUnimported } from './targets.js';
|
|
14
|
+
import { inProgramImportReferencesOf } from './export-importers.js';
|
|
15
|
+
import { classConstructorSlotIsOriginal } from './source-class-data.js';
|
|
16
|
+
import { sourceClassFamilyOf } from './owned-class-receivers.js';
|
|
17
|
+
const sourceBindingIsUnwritten = (flow, declaration) => !flow.writesToDeclaration(declaration).some((write) => write.slot === 'whole' && write.edge !== 'return' && write.edge !== 'yield');
|
|
18
|
+
export const namedDeclarationAt = (checker, expression) => {
|
|
19
|
+
const named = unwrapNaming(expression);
|
|
20
|
+
if (!ts.isIdentifier(named))
|
|
21
|
+
return namespaceMemberDeclarationOf(checker, named);
|
|
22
|
+
const symbol = resolveFlowSymbolAlias(checker, checker.getSymbolAtLocation(named));
|
|
23
|
+
return symbol?.valueDeclaration ?? symbol?.declarations?.[0] ?? null;
|
|
24
|
+
};
|
|
25
|
+
/** Syntactic constructor selection preserves a finite source identity family.
|
|
26
|
+
* A conditional is not an alias escape when its complete result is constructed;
|
|
27
|
+
* checker union shapes alone cannot establish these actual constructor values. */
|
|
28
|
+
/**
|
|
29
|
+
* `WebGLUniforms.seqWithValue( seq, values )`: the class name naming the
|
|
30
|
+
* receiver of an IMMEDIATE call to one of its own static methods.
|
|
31
|
+
*
|
|
32
|
+
* `Class.staticMethod( ... )` neither constructs nor publishes the
|
|
33
|
+
* constructor, but nothing recognised it, so a single static call anywhere in
|
|
34
|
+
* the program refused the class's whole family -- and through
|
|
35
|
+
* `ownedClassReceiverInventoryOf`, every `new` of it. Three's `WebGLUniforms`
|
|
36
|
+
* publishes `upload` and `seqWithValue` that way and `WebGLRenderer` calls both.
|
|
37
|
+
*
|
|
38
|
+
* Two guards, each load-bearing rather than decorative:
|
|
39
|
+
*
|
|
40
|
+
* - the access must be the callee of a call written right here. A static method
|
|
41
|
+
* read as a VALUE -- assigned, returned, passed as a callback -- can later be
|
|
42
|
+
* invoked through `.call`/`.apply` against any receiver at all, which is a
|
|
43
|
+
* materially harder question than this one and must not be swept into it.
|
|
44
|
+
* - the method's body must not mention `this`. Called as `Class.m( ... )`, a
|
|
45
|
+
* static method's `this` IS the constructor, so `static make() { return new
|
|
46
|
+
* this() }` allocates an instance through a path this inventory never sees.
|
|
47
|
+
* Accepting the call without reading the body would report a complete
|
|
48
|
+
* construction set that is missing those instances -- a silently wrong
|
|
49
|
+
* answer, not a refusal.
|
|
50
|
+
*/
|
|
51
|
+
const staticMethodCallReceiverUse = (checker, use) => {
|
|
52
|
+
const access = use.parent;
|
|
53
|
+
if (!ts.isPropertyAccessExpression(access) || access.expression !== use)
|
|
54
|
+
return false;
|
|
55
|
+
const call = access.parent;
|
|
56
|
+
if (!ts.isCallExpression(call) || call.expression !== access)
|
|
57
|
+
return false;
|
|
58
|
+
const declarations = checker.getSymbolAtLocation(access.name)?.declarations ?? [];
|
|
59
|
+
return (declarations.length > 0 &&
|
|
60
|
+
declarations.every((declaration) => ts.isMethodDeclaration(declaration) &&
|
|
61
|
+
(ts.getCombinedModifierFlags(declaration) & ts.ModifierFlags.Static) !== 0 &&
|
|
62
|
+
declaration.body !== undefined &&
|
|
63
|
+
!mentionsThis(declaration.body)));
|
|
64
|
+
};
|
|
65
|
+
/** `this` anywhere in a body, an arrow function's inherited one included. */
|
|
66
|
+
const mentionsThis = (body) => {
|
|
67
|
+
let found = false;
|
|
68
|
+
const visit = (node) => {
|
|
69
|
+
if (found)
|
|
70
|
+
return;
|
|
71
|
+
if (node.kind === ts.SyntaxKind.ThisKeyword || node.kind === ts.SyntaxKind.SuperKeyword) {
|
|
72
|
+
found = true;
|
|
73
|
+
return;
|
|
74
|
+
}
|
|
75
|
+
// A nested non-arrow function binds its own `this`, so its body says
|
|
76
|
+
// nothing about the static method's.
|
|
77
|
+
if (ts.isFunctionDeclaration(node) || ts.isFunctionExpression(node) || ts.isClassLike(node))
|
|
78
|
+
return;
|
|
79
|
+
ts.forEachChild(node, visit);
|
|
80
|
+
};
|
|
81
|
+
ts.forEachChild(body, visit);
|
|
82
|
+
return found;
|
|
83
|
+
};
|
|
84
|
+
/**
|
|
85
|
+
* Every in-program mention of a source function declaration, or null when its
|
|
86
|
+
* callers cannot all be named.
|
|
87
|
+
*
|
|
88
|
+
* A local declaration's references are the index's; an EXPORTED one is only
|
|
89
|
+
* closed when nobody imports it or every importing module's mentions are
|
|
90
|
+
* enumerable, which is `export-importers.ts`'s question and not this file's to
|
|
91
|
+
* re-answer. `@geastack/core`'s `mount` is exported and imported exactly once,
|
|
92
|
+
* which is the case this exists for.
|
|
93
|
+
*/
|
|
94
|
+
const inProgramMentionsOf = (checker, flow, body) => {
|
|
95
|
+
const name = ts.getNameOfDeclaration(body);
|
|
96
|
+
const own = flow
|
|
97
|
+
.referencesToDeclaration(body)
|
|
98
|
+
.filter((reference) => reference !== name && !isTypePositionReference(reference) && !ts.isExportSpecifier(reference.parent));
|
|
99
|
+
if ((ts.getCombinedModifierFlags(body) & ts.ModifierFlags.Export) === 0)
|
|
100
|
+
return own;
|
|
101
|
+
if (exportIsUnimported(checker, flow, body))
|
|
102
|
+
return own;
|
|
103
|
+
const importers = inProgramImportReferencesOf(checker, flow, body);
|
|
104
|
+
return importers === null ? null : [...own, ...importers];
|
|
105
|
+
};
|
|
106
|
+
/**
|
|
107
|
+
* Every value a PARAMETER can be bound to, or null when this walk cannot name
|
|
108
|
+
* them all.
|
|
109
|
+
*
|
|
110
|
+
* `mount(component: new () => T) { new component() }` -- `@geastack/core`'s own
|
|
111
|
+
* mount, and the one line every gea app reaches its root component through. The
|
|
112
|
+
* class-binding inventory already proves the forward direction of this hop
|
|
113
|
+
* (`forwardedParameterOf` in `classConstructorKeepsInstanceUncached`): a class
|
|
114
|
+
* handed to a source call lands in a parameter whose mentions are inventoried
|
|
115
|
+
* by the same rules that brought the walk there. This is that step read
|
|
116
|
+
* BACKWARDS and held to the same standard, because the standard is what makes
|
|
117
|
+
* it a proof: every caller must be named before the arguments at them are the
|
|
118
|
+
* whole of what the cell can hold. Binding an argument, or a default when one
|
|
119
|
+
* is omitted, is how the cell gets its value; assigning it afterwards makes it
|
|
120
|
+
* a cell whose later contents this walk never saw.
|
|
121
|
+
*/
|
|
122
|
+
const parameterBoundValuesOf = (checker, flow, parameter) => {
|
|
123
|
+
const body = parameter.parent;
|
|
124
|
+
if (!ts.isFunctionDeclaration(body) || body.body === undefined)
|
|
125
|
+
return null;
|
|
126
|
+
if (!sourceBindingIsUnwritten(flow, body) || !flow.callableBodyIsIndexed(body))
|
|
127
|
+
return null;
|
|
128
|
+
if (flow
|
|
129
|
+
.writesToDeclaration(parameter)
|
|
130
|
+
.some((write) => write.slot === 'whole' && write.edge !== 'call-argument' && write.edge !== 'super-argument' && write.edge !== 'default-parameter'))
|
|
131
|
+
return null;
|
|
132
|
+
const mentions = inProgramMentionsOf(checker, flow, body);
|
|
133
|
+
if (mentions === null)
|
|
134
|
+
return null;
|
|
135
|
+
const values = [];
|
|
136
|
+
for (const mention of mentions) {
|
|
137
|
+
// A mention that is not this body's own callee hands the body somewhere
|
|
138
|
+
// this walk cannot follow, so no set of call sites is complete.
|
|
139
|
+
const call = mention.parent;
|
|
140
|
+
if (!ts.isCallExpression(call) || unwrapErasedExpression(call.expression) !== mention)
|
|
141
|
+
return null;
|
|
142
|
+
const argument = frameForwardedArgumentOf(checker, flow, call, body, parameter);
|
|
143
|
+
if (argument === null)
|
|
144
|
+
return null;
|
|
145
|
+
values.push(argument);
|
|
146
|
+
}
|
|
147
|
+
return values.length > 0 ? values : null;
|
|
148
|
+
};
|
|
149
|
+
/** Keyed by the index alone: this walk reads the index and the AST, nothing a
|
|
150
|
+
* solve can revise, so an answer taken once is the answer. It is asked per
|
|
151
|
+
* heritage clause of every class the receiver walks, which is why it is worth
|
|
152
|
+
* holding onto -- following a constructor through a parameter made each answer
|
|
153
|
+
* cost a frame layout per caller. */
|
|
154
|
+
/**
|
|
155
|
+
* The owned class family `this.constructor` allocates from when `callee` is
|
|
156
|
+
* that spelling inside an instance member of a class-spelled source class,
|
|
157
|
+
* or null: the class and every source subclass in the program
|
|
158
|
+
* (`sourceClassFamilyOf`). The `constructor` slot must still be
|
|
159
|
+
* `Object.prototype.constructor` on every member.
|
|
160
|
+
*/
|
|
161
|
+
export const thisConstructorFamilyOf = (checker, flow, callee) => {
|
|
162
|
+
const access = unwrapErasedExpression(callee);
|
|
163
|
+
if (!ts.isPropertyAccessExpression(access) || access.name.text !== 'constructor')
|
|
164
|
+
return null;
|
|
165
|
+
const receiver = unwrapErasedExpression(access.expression);
|
|
166
|
+
if (receiver.kind !== ts.SyntaxKind.ThisKeyword)
|
|
167
|
+
return null;
|
|
168
|
+
const frame = flow.receiverOwnerOf(receiver);
|
|
169
|
+
if (!frame ||
|
|
170
|
+
!(ts.isMethodDeclaration(frame) ||
|
|
171
|
+
ts.isConstructorDeclaration(frame) ||
|
|
172
|
+
ts.isGetAccessorDeclaration(frame) ||
|
|
173
|
+
ts.isSetAccessorDeclaration(frame) ||
|
|
174
|
+
ts.isPropertyDeclaration(frame)) ||
|
|
175
|
+
(ts.getCombinedModifierFlags(frame) & ts.ModifierFlags.Static) !== 0)
|
|
176
|
+
return null;
|
|
177
|
+
const owner = frame.parent;
|
|
178
|
+
if (!ts.isClassDeclaration(owner) && !ts.isClassExpression(owner))
|
|
179
|
+
return null;
|
|
180
|
+
if (owner.getSourceFile().isDeclarationFile || !sourceBindingIsUnwritten(flow, owner))
|
|
181
|
+
return null;
|
|
182
|
+
// Heritage alone, never the receiver inventory: that inventory asks every
|
|
183
|
+
// construction's selections, this is one of them, and the two would recurse.
|
|
184
|
+
const family = sourceClassFamilyOf(checker, flow, new Set([owner]));
|
|
185
|
+
if (!family)
|
|
186
|
+
return null;
|
|
187
|
+
for (const member of family.keys())
|
|
188
|
+
if (!classConstructorSlotIsOriginal(checker, flow, member))
|
|
189
|
+
return null;
|
|
190
|
+
return [...family.keys()];
|
|
191
|
+
};
|
|
192
|
+
const constructorSelections = new WeakMap();
|
|
193
|
+
export const sourceConstructorSelectionsOf = (checker, flow, expression) => {
|
|
194
|
+
let known = constructorSelections.get(flow);
|
|
195
|
+
if (!known)
|
|
196
|
+
constructorSelections.set(flow, (known = new Map()));
|
|
197
|
+
if (known.has(expression))
|
|
198
|
+
return known.get(expression);
|
|
199
|
+
const answer = sourceConstructorSelectionsUncached(checker, flow, expression);
|
|
200
|
+
known.set(expression, answer);
|
|
201
|
+
return answer;
|
|
202
|
+
};
|
|
203
|
+
const sourceConstructorSelectionsUncached = (checker, flow, expression) => {
|
|
204
|
+
const classes = new Set();
|
|
205
|
+
// Parameters are a WORKLIST, not a recursive descent with a visited guard.
|
|
206
|
+
// Mutually forwarding callables (`f` hands the constructor to `g`, `g` hands
|
|
207
|
+
// it back) would otherwise need an "already visiting" answer, and §2 forbids
|
|
208
|
+
// one: `true` invents a selection nobody proved, `false` refuses a program
|
|
209
|
+
// whose every cell IS named. A cell already scheduled is a cell already
|
|
210
|
+
// answered, so a cycle converges.
|
|
211
|
+
const cells = [];
|
|
212
|
+
const scheduled = new Set();
|
|
213
|
+
const visit = (expression) => {
|
|
214
|
+
const value = unwrapErasedExpression(expression);
|
|
215
|
+
if (ts.isConditionalExpression(value))
|
|
216
|
+
return visit(value.whenTrue) && visit(value.whenFalse);
|
|
217
|
+
// `new this.constructor( ... )` -- three's universal `clone()`. In an
|
|
218
|
+
// instance member of a class-spelled source class `C`, `this.constructor`
|
|
219
|
+
// is the constructor of whatever object the member runs on, one of `C`'s
|
|
220
|
+
// owned family while no write replaces a `constructor` slot on it. Every
|
|
221
|
+
// family member is an alternative: the fresh object is a construction of
|
|
222
|
+
// exactly one of them. Which one is the receiver's business -- the value
|
|
223
|
+
// graph checks that every value `this` holds there is a construction of
|
|
224
|
+
// these same classes (`source-value-session.ts`, `case 'value'`), so an
|
|
225
|
+
// explicit-receiver call cannot smuggle a foreign class through here.
|
|
226
|
+
const family = thisConstructorFamilyOf(checker, flow, value);
|
|
227
|
+
if (family !== null) {
|
|
228
|
+
for (const owner of family)
|
|
229
|
+
classes.add(owner);
|
|
230
|
+
return true;
|
|
231
|
+
}
|
|
232
|
+
const declaration = namedDeclarationAt(checker, value);
|
|
233
|
+
if (declaration && ts.isParameter(declaration)) {
|
|
234
|
+
if (!scheduled.has(declaration)) {
|
|
235
|
+
scheduled.add(declaration);
|
|
236
|
+
cells.push(declaration);
|
|
237
|
+
}
|
|
238
|
+
return true;
|
|
239
|
+
}
|
|
240
|
+
if (!declaration ||
|
|
241
|
+
(!ts.isClassDeclaration(declaration) && !ts.isClassExpression(declaration) && !isConstructorFunction(declaration)) ||
|
|
242
|
+
declaration.getSourceFile().isDeclarationFile ||
|
|
243
|
+
!sourceBindingIsUnwritten(flow, declaration))
|
|
244
|
+
return false;
|
|
245
|
+
classes.add(declaration);
|
|
246
|
+
return true;
|
|
247
|
+
};
|
|
248
|
+
if (!visit(expression))
|
|
249
|
+
return null;
|
|
250
|
+
for (let index = 0; index < cells.length; index++) {
|
|
251
|
+
const values = parameterBoundValuesOf(checker, flow, cells[index]);
|
|
252
|
+
if (values === null || !values.every(visit))
|
|
253
|
+
return null;
|
|
254
|
+
}
|
|
255
|
+
return classes.size > 0 ? [...classes] : null;
|
|
256
|
+
};
|
|
257
|
+
/** Possible explicit completions of source construction, including inherited
|
|
258
|
+
* constructors. An absent body in a subclass forwards to its base; it does
|
|
259
|
+
* not prove that `new` returns the fresh receiver. Unknown heritage remains
|
|
260
|
+
* an open boundary. These are source origins, never asserted result types. */
|
|
261
|
+
const constructorReturns = new WeakMap();
|
|
262
|
+
export const sourceConstructorReturnValuesOf = (checker, flow, owner) => {
|
|
263
|
+
let held = constructorReturns.get(flow);
|
|
264
|
+
if (!held)
|
|
265
|
+
constructorReturns.set(flow, (held = new Map()));
|
|
266
|
+
if (held.has(owner))
|
|
267
|
+
return held.get(owner);
|
|
268
|
+
held.set(owner, null);
|
|
269
|
+
if (owner.getSourceFile().isDeclarationFile || !sourceBindingIsUnwritten(flow, owner))
|
|
270
|
+
return null;
|
|
271
|
+
const values = new Set();
|
|
272
|
+
const bodies = isClassSpelledSourceClass(owner) ? owner.members.filter(ts.isConstructorDeclaration) : [owner];
|
|
273
|
+
for (const body of bodies) {
|
|
274
|
+
for (const write of flow.writesToDeclaration(body)) {
|
|
275
|
+
if (write.edge === 'return' && write.value)
|
|
276
|
+
values.add(write.value);
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
if (isClassSpelledSourceClass(owner)) {
|
|
280
|
+
for (const clause of owner.heritageClauses ?? []) {
|
|
281
|
+
if (clause.token !== ts.SyntaxKind.ExtendsKeyword)
|
|
282
|
+
continue;
|
|
283
|
+
for (const base of clause.types) {
|
|
284
|
+
const selections = sourceConstructorSelectionsOf(checker, flow, base.expression);
|
|
285
|
+
if (selections === null)
|
|
286
|
+
return null;
|
|
287
|
+
for (const selection of selections) {
|
|
288
|
+
const inherited = sourceConstructorReturnValuesOf(checker, flow, selection);
|
|
289
|
+
if (inherited === null)
|
|
290
|
+
return null;
|
|
291
|
+
for (const value of inherited)
|
|
292
|
+
values.add(value);
|
|
293
|
+
}
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
}
|
|
297
|
+
const result = [...values];
|
|
298
|
+
held.set(owner, result);
|
|
299
|
+
return result;
|
|
300
|
+
};
|
|
301
|
+
/** Both answers below read only the flow index and the checker's declared
|
|
302
|
+
* types -- no inference input that moves while a census round runs -- so the
|
|
303
|
+
* answer outlives any one proof and retires when the index is rebuilt next
|
|
304
|
+
* round. Without this the same class was re-walked, base chain and every
|
|
305
|
+
* member reference included, once per proof that touched it. */
|
|
306
|
+
const keptInstances = new WeakMap();
|
|
307
|
+
const allocationOrigins = new WeakMap();
|
|
308
|
+
/** Constructor/prototype references must be closed even for a subclass with no
|
|
309
|
+
* visible allocation: handing its constructor elsewhere can create instances
|
|
310
|
+
* with inherited method slots that the local construction list does not name. */
|
|
311
|
+
export const classConstructorKeepsInstanceOf = (checker, flow, instance) => {
|
|
312
|
+
let held = keptInstances.get(flow);
|
|
313
|
+
if (!held)
|
|
314
|
+
keptInstances.set(flow, (held = new Map()));
|
|
315
|
+
const known = held.get(instance);
|
|
316
|
+
if (known !== undefined)
|
|
317
|
+
return known;
|
|
318
|
+
const answer = classConstructorKeepsInstanceUncached(checker, flow, instance);
|
|
319
|
+
held.set(instance, answer);
|
|
320
|
+
return answer;
|
|
321
|
+
};
|
|
322
|
+
const classConstructorKeepsInstanceUncached = (checker, flow, instance) => {
|
|
323
|
+
const seen = new Set();
|
|
324
|
+
/**
|
|
325
|
+
* The class binding reached a call argument. A call is not an escape when it
|
|
326
|
+
* is a source call whose one body this index has walked: the binding lands in
|
|
327
|
+
* a parameter whose every mention is inventoried by the same rules that
|
|
328
|
+
* brought us here. The parameter cell is returned for the inventory to
|
|
329
|
+
* explain in turn, and `null` means this walk cannot name one closed cell.
|
|
330
|
+
*
|
|
331
|
+
* Without this step `mount(App)` -- a call to an ORDINARY source function
|
|
332
|
+
* whose parameter is used only as `new component()` -- refused App's whole
|
|
333
|
+
* receiver family, and with it every `this.method(...)` in the class. The
|
|
334
|
+
* forwarding was never unknown; this walk simply stopped at the call.
|
|
335
|
+
*/
|
|
336
|
+
const forwardedParameterOf = (use) => {
|
|
337
|
+
const parent = use.parent;
|
|
338
|
+
if (!ts.isCallExpression(parent) || parent.expression === use)
|
|
339
|
+
return null;
|
|
340
|
+
const site = flow.callSiteOf(parent);
|
|
341
|
+
if (!site || site.operands.kind !== 'call' || site.operands.explicitThis)
|
|
342
|
+
return null;
|
|
343
|
+
// The callee is held to the same standard as the class binding itself: a
|
|
344
|
+
// plain name, resolving to one source body, whose own binding nothing
|
|
345
|
+
// writes. A checker-selected declaration is a possible target, not a closed
|
|
346
|
+
// target set, so it is required to AGREE here rather than to decide.
|
|
347
|
+
const callee = unwrapErasedExpression(site.operands.callee);
|
|
348
|
+
if (!ts.isIdentifier(callee))
|
|
349
|
+
return null;
|
|
350
|
+
const body = resolveFlowSymbolAlias(checker, checker.getSymbolAtLocation(callee))?.valueDeclaration;
|
|
351
|
+
if (!body || !ts.isFunctionDeclaration(body) || body.body === undefined)
|
|
352
|
+
return null;
|
|
353
|
+
if (!sourceBindingIsUnwritten(flow, body) || !flow.callableBodyIsIndexed(body))
|
|
354
|
+
return null;
|
|
355
|
+
const stated = site.inferredDeclaration ?? site.checkerDeclaration;
|
|
356
|
+
if (stated !== null && stated !== undefined && stated !== body)
|
|
357
|
+
return null;
|
|
358
|
+
if (site.targets.some((target) => target !== body))
|
|
359
|
+
return null;
|
|
360
|
+
// Which parameter an argument binds to is the call-frame contract's fact,
|
|
361
|
+
// read here rather than recomputed from `parent.arguments`. The positional
|
|
362
|
+
// version of this code checked a spread and a rest parameter by hand and
|
|
363
|
+
// did not know about the third unresolved reason the frame states, so a
|
|
364
|
+
// callee that never mentions its parameter and reaches the argument through
|
|
365
|
+
// `arguments[0]` read as closed.
|
|
366
|
+
const parameter = frameForwardedParameterOf(checker, flow, parent, body, use);
|
|
367
|
+
if (parameter === null)
|
|
368
|
+
return null;
|
|
369
|
+
// Binding an argument, or a default when one is omitted, is how the cell
|
|
370
|
+
// gets its value; assigning the parameter afterwards makes it a cell whose
|
|
371
|
+
// later contents this walk never saw.
|
|
372
|
+
if (flow
|
|
373
|
+
.writesToDeclaration(parameter)
|
|
374
|
+
.some((write) => write.slot === 'whole' &&
|
|
375
|
+
write.edge !== 'call-argument' &&
|
|
376
|
+
write.edge !== 'super-argument' &&
|
|
377
|
+
write.edge !== 'default-parameter'))
|
|
378
|
+
return null;
|
|
379
|
+
return parameter;
|
|
380
|
+
};
|
|
381
|
+
/**
|
|
382
|
+
* Every mention of every cell holding this class constructor, explained. The
|
|
383
|
+
* first cell is the class binding itself; `forwardedParameterOf` adds the
|
|
384
|
+
* parameter of a source call the binding was handed to. An unexplained
|
|
385
|
+
* mention refuses: this is the inventory the whole receiver family rests on.
|
|
386
|
+
*
|
|
387
|
+
* The forwarding closure is a WORKLIST, not a recursive descent with a
|
|
388
|
+
* visited guard. Mutually recursive forwarding (`f` hands the binding to `g`,
|
|
389
|
+
* `g` hands it back to `f`) would otherwise need an "already visiting" answer
|
|
390
|
+
* -- `true` invents closure for a cell nobody inventoried, `false` refuses a
|
|
391
|
+
* program whose every cell IS inventoried, and both are the pending-read-as-
|
|
392
|
+
* decided collapse this direction exists to remove. A cell already in the set
|
|
393
|
+
* is a cell already scheduled, so a cycle simply converges.
|
|
394
|
+
*/
|
|
395
|
+
const referenceUsesAreClosed = (declaration, declaredName, type) => {
|
|
396
|
+
const pending = [{ declaration, declaredName }];
|
|
397
|
+
const scheduled = new Set([declaration]);
|
|
398
|
+
for (let index = 0; index < pending.length; index++) {
|
|
399
|
+
const cell = pending[index];
|
|
400
|
+
for (const reference of flow.referencesToDeclaration(cell.declaration)) {
|
|
401
|
+
if (reference === cell.declaredName || isTypePositionReference(reference))
|
|
402
|
+
continue;
|
|
403
|
+
const selection = reference.parent;
|
|
404
|
+
const selectedUse = ((ts.isPropertyAccessExpression(selection) && selection.name === reference) ||
|
|
405
|
+
(ts.isElementAccessExpression(selection) && selection.argumentExpression === reference)) &&
|
|
406
|
+
namespaceMemberDeclarationOf(checker, selection) === cell.declaration
|
|
407
|
+
? selection
|
|
408
|
+
: reference;
|
|
409
|
+
const use = outermostErasureOf(selectedUse);
|
|
410
|
+
const parent = use.parent;
|
|
411
|
+
if (ts.isConditionalExpression(parent) && (parent.whenTrue === use || parent.whenFalse === use)) {
|
|
412
|
+
let selection = parent;
|
|
413
|
+
for (;;) {
|
|
414
|
+
selection = outermostErasureOf(selection);
|
|
415
|
+
const containing = selection.parent;
|
|
416
|
+
if (ts.isConditionalExpression(containing) && (containing.whenTrue === selection || containing.whenFalse === selection)) {
|
|
417
|
+
selection = containing;
|
|
418
|
+
continue;
|
|
419
|
+
}
|
|
420
|
+
break;
|
|
421
|
+
}
|
|
422
|
+
const construction = selection.parent;
|
|
423
|
+
const choices = sourceConstructorSelectionsOf(checker, flow, selection);
|
|
424
|
+
if (!ts.isNewExpression(construction) ||
|
|
425
|
+
construction.expression !== selection ||
|
|
426
|
+
!choices ||
|
|
427
|
+
!choices.every((choice) => {
|
|
428
|
+
const symbol = choice.name ? checker.getSymbolAtLocation(choice.name) : checker.getTypeAtLocation(choice).getSymbol();
|
|
429
|
+
const selected = symbol && checker.getDeclaredTypeOfSymbol(symbol);
|
|
430
|
+
return selected?.isClassOrInterface() === true && visit(selected);
|
|
431
|
+
}))
|
|
432
|
+
return false;
|
|
433
|
+
continue;
|
|
434
|
+
}
|
|
435
|
+
if (ts.isNewExpression(parent) && parent.expression === use)
|
|
436
|
+
continue;
|
|
437
|
+
if (ts.isExpressionWithTypeArguments(parent) && parent.expression === use)
|
|
438
|
+
continue;
|
|
439
|
+
if (ts.isImportSpecifier(parent) || ts.isImportClause(parent) || ts.isNamespaceImport(parent) || ts.isExportSpecifier(parent))
|
|
440
|
+
continue;
|
|
441
|
+
if (sourceClassStaticDataUseOf(checker, flow, use))
|
|
442
|
+
continue;
|
|
443
|
+
if (sourcePrototypeMethodIdentityUseOf(checker, flow, use, type))
|
|
444
|
+
continue;
|
|
445
|
+
if (staticMethodCallReceiverUse(checker, use))
|
|
446
|
+
continue;
|
|
447
|
+
// Constructor identity tests neither invoke coercion hooks nor publish
|
|
448
|
+
// the constructor. Other binary operators can execute user code.
|
|
449
|
+
if (ts.isBinaryExpression(parent) &&
|
|
450
|
+
(parent.operatorToken.kind === ts.SyntaxKind.EqualsEqualsEqualsToken ||
|
|
451
|
+
parent.operatorToken.kind === ts.SyntaxKind.ExclamationEqualsEqualsToken))
|
|
452
|
+
continue;
|
|
453
|
+
// Only the constructor operand is an observation of this closed family.
|
|
454
|
+
// A source/inherited custom @@hasInstance can publish its receiver, so
|
|
455
|
+
// default shape is required in addition to this complete use inventory.
|
|
456
|
+
if (ts.isBinaryExpression(parent) &&
|
|
457
|
+
parent.operatorToken.kind === ts.SyntaxKind.InstanceOfKeyword &&
|
|
458
|
+
parent.right === use &&
|
|
459
|
+
sourceClassHasDefaultInstanceOfShape(checker, type))
|
|
460
|
+
continue;
|
|
461
|
+
const forwardedParameter = forwardedParameterOf(use);
|
|
462
|
+
if (forwardedParameter !== null) {
|
|
463
|
+
if (!scheduled.has(forwardedParameter)) {
|
|
464
|
+
scheduled.add(forwardedParameter);
|
|
465
|
+
pending.push({ declaration: forwardedParameter, declaredName: forwardedParameter.name });
|
|
466
|
+
}
|
|
467
|
+
continue;
|
|
468
|
+
}
|
|
469
|
+
return false;
|
|
470
|
+
}
|
|
471
|
+
}
|
|
472
|
+
return true;
|
|
473
|
+
};
|
|
474
|
+
const visit = (type) => {
|
|
475
|
+
if (seen.has(type))
|
|
476
|
+
return true;
|
|
477
|
+
seen.add(type);
|
|
478
|
+
const owner = type.getSymbol()?.valueDeclaration;
|
|
479
|
+
if (!owner ||
|
|
480
|
+
(!ts.isClassDeclaration(owner) && !ts.isClassExpression(owner) && !isConstructorFunction(owner)) ||
|
|
481
|
+
owner.getSourceFile().isDeclarationFile ||
|
|
482
|
+
!sourceBindingIsUnwritten(flow, owner))
|
|
483
|
+
return false;
|
|
484
|
+
if (!referenceUsesAreClosed(owner, owner.name, type))
|
|
485
|
+
return false;
|
|
486
|
+
// The member walk below asks two questions of CLASS syntax: does a static
|
|
487
|
+
// block or static field leak the constructor through `this`, and does a
|
|
488
|
+
// constructor `return` something other than `this`. A constructor function
|
|
489
|
+
// has neither syntax -- it declares no statics, and a top-level `return
|
|
490
|
+
// <expression>` disqualifies it at admission (`isConstructorFunction`), so
|
|
491
|
+
// its construction always yields `this`. Skipping the walk is the answer to
|
|
492
|
+
// both questions, not an omission of them.
|
|
493
|
+
if (!isClassSpelledSourceClass(owner))
|
|
494
|
+
return true;
|
|
495
|
+
for (const member of owner.members) {
|
|
496
|
+
// Static initialization can publish the constructor through `this`
|
|
497
|
+
// without ever naming its declaration. Instance-owner inventories do
|
|
498
|
+
// not include those constructor-valued receiver uses.
|
|
499
|
+
if ((ts.isClassStaticBlockDeclaration(member) ||
|
|
500
|
+
(ts.isPropertyDeclaration(member) && (ts.getCombinedModifierFlags(member) & ts.ModifierFlags.Static) !== 0)) &&
|
|
501
|
+
flow.receiverReferencesToDeclaration(member).length > 0 &&
|
|
502
|
+
!(ts.isPropertyDeclaration(member) &&
|
|
503
|
+
member.initializer &&
|
|
504
|
+
(ts.isArrowFunction(unwrapNaming(member.initializer)) || unwrapNaming(member.initializer).kind === ts.SyntaxKind.ThisKeyword)))
|
|
505
|
+
return false;
|
|
506
|
+
}
|
|
507
|
+
const completions = sourceConstructorReturnValuesOf(checker, flow, owner);
|
|
508
|
+
if (completions === null || completions.some((value) => unwrapErasedExpression(value).kind !== ts.SyntaxKind.ThisKeyword))
|
|
509
|
+
return false;
|
|
510
|
+
return (checker.getBaseTypes(type) ?? []).every((base) => {
|
|
511
|
+
const declared = heritageClassOrInterfaceOf(base);
|
|
512
|
+
return declared !== null && visit(declared);
|
|
513
|
+
});
|
|
514
|
+
};
|
|
515
|
+
return visit(instance);
|
|
516
|
+
};
|
|
517
|
+
/** The complete source constructor proof shared by receiver observations. */
|
|
518
|
+
export const ordinarySourceClassInstanceTestOf = (checker, flow, expression) => {
|
|
519
|
+
if (expression.operatorToken.kind !== ts.SyntaxKind.InstanceOfKeyword)
|
|
520
|
+
return false;
|
|
521
|
+
const owner = namedDeclarationAt(checker, expression.right);
|
|
522
|
+
if (!owner || (!ts.isClassDeclaration(owner) && !ts.isClassExpression(owner)))
|
|
523
|
+
return false;
|
|
524
|
+
const instance = checker.getTypeAtLocation(owner);
|
|
525
|
+
return (instance.isClassOrInterface() &&
|
|
526
|
+
sourceClassHasDefaultInstanceOfShape(checker, instance) &&
|
|
527
|
+
classConstructorKeepsInstanceOf(checker, flow, instance));
|
|
528
|
+
};
|
|
529
|
+
/** Construction identity is a source fact independent of a caller's frame proof. */
|
|
530
|
+
const constructionFacts = new WeakMap();
|
|
531
|
+
export const exactSourceConstructionOf = (checker, flow, call) => {
|
|
532
|
+
let facts = constructionFacts.get(flow);
|
|
533
|
+
if (!facts)
|
|
534
|
+
constructionFacts.set(flow, (facts = new WeakMap()));
|
|
535
|
+
if (facts.has(call))
|
|
536
|
+
return facts.get(call);
|
|
537
|
+
const fact = exactSourceConstructionUncached(checker, flow, call);
|
|
538
|
+
facts.set(call, fact);
|
|
539
|
+
return fact;
|
|
540
|
+
};
|
|
541
|
+
const exactSourceConstructionUncached = (checker, flow, call) => {
|
|
542
|
+
const alternatives = sourceConstructorSelectionsOf(checker, flow, call.expression);
|
|
543
|
+
if (!alternatives)
|
|
544
|
+
return null;
|
|
545
|
+
for (const declaration of alternatives) {
|
|
546
|
+
const symbol = declaration.name ? checker.getSymbolAtLocation(declaration.name) : checker.getTypeAtLocation(declaration).getSymbol();
|
|
547
|
+
const type = symbol && checker.getDeclaredTypeOfSymbol(symbol);
|
|
548
|
+
if (!type?.isClassOrInterface() || !classConstructorKeepsInstanceOf(checker, flow, type))
|
|
549
|
+
return null;
|
|
550
|
+
}
|
|
551
|
+
return { call, alternatives };
|
|
552
|
+
};
|
|
553
|
+
export const exactClassAllocationOriginsOf = (checker, flow, expression, authority) => {
|
|
554
|
+
let held = allocationOrigins.get(flow);
|
|
555
|
+
if (!held)
|
|
556
|
+
allocationOrigins.set(flow, (held = new WeakMap()));
|
|
557
|
+
let entries = held.get(authority);
|
|
558
|
+
if (!entries)
|
|
559
|
+
held.set(authority, (entries = new Map()));
|
|
560
|
+
const ledger = deferredIntrinsicProtocolLedgerOf(flow);
|
|
561
|
+
const known = entries.get(expression);
|
|
562
|
+
if (known)
|
|
563
|
+
return known.requirements.length === 0 || ledger?.include(known.requirements) === true ? known.answer : null;
|
|
564
|
+
// A refusal this walk already SETTLED, i.e. one whose every hypothesis has
|
|
565
|
+
// since been confirmed by the guard that issued it (`proof-hypotheses.ts`).
|
|
566
|
+
// Until such an entry is settled its `assumed` is non-empty and it is not
|
|
567
|
+
// consulted at all.
|
|
568
|
+
let refused = refusedOrigins.get(flow);
|
|
569
|
+
if (!refused)
|
|
570
|
+
refusedOrigins.set(flow, (refused = new WeakMap()));
|
|
571
|
+
let refusedEntries = refused.get(authority);
|
|
572
|
+
if (!refusedEntries)
|
|
573
|
+
refused.set(authority, (refusedEntries = new Map()));
|
|
574
|
+
const settled = refusedEntries.get(expression);
|
|
575
|
+
if (settled && settled.assumed.size === 0)
|
|
576
|
+
return null;
|
|
577
|
+
const compute = () => exactClassAllocationOriginsUncached(checker, flow, expression, authority);
|
|
578
|
+
// Content-keyed sharing, where the authority offers it. It subsumes both the
|
|
579
|
+
// trail bookkeeping and the settled-refusal store below -- it keeps its own
|
|
580
|
+
// trail, names the parks an answer leaned on, replays the open uses, and
|
|
581
|
+
// memoizes a grounded refusal the same way -- so the two paths are the same
|
|
582
|
+
// policy rather than two, and only the key differs: the question, not the
|
|
583
|
+
// proof that happened to ask it.
|
|
584
|
+
const shared = authority.sharedAnswerOf;
|
|
585
|
+
if (shared !== undefined) {
|
|
586
|
+
const captured = shared(`class-allocation:${nodePathToken(expression)}`, compute);
|
|
587
|
+
if (captured.value !== null) {
|
|
588
|
+
const answer = { answer: captured.value, requirements: captured.requirements };
|
|
589
|
+
authority.whenSettled(() => entries.set(expression, answer));
|
|
590
|
+
}
|
|
591
|
+
return captured.requirements.length === 0 || ledger?.include(captured.requirements) === true ? captured.value : null;
|
|
592
|
+
}
|
|
593
|
+
// The walk's own trail, so a refusal can say what it leaned on. Keys are
|
|
594
|
+
// re-reported outward: an enclosing memo must still hear them, exactly as it
|
|
595
|
+
// did when this walk noted straight onto that enclosing trail.
|
|
596
|
+
const trail = pushHypothesisTrail();
|
|
597
|
+
let result;
|
|
598
|
+
try {
|
|
599
|
+
result = ledger ? ledger.capture(compute) : { value: compute(), requirements: [] };
|
|
600
|
+
}
|
|
601
|
+
finally {
|
|
602
|
+
popHypothesisTrail();
|
|
603
|
+
}
|
|
604
|
+
for (const key of trail)
|
|
605
|
+
noteHypothesis(key);
|
|
606
|
+
if (result.value !== null) {
|
|
607
|
+
const answer = { answer: result.value, requirements: result.requirements };
|
|
608
|
+
authority.whenSettled(() => entries.set(expression, answer));
|
|
609
|
+
}
|
|
610
|
+
else {
|
|
611
|
+
// A refusal used to be thrown away wholesale -- "an unresolved query can be
|
|
612
|
+
// pending in the enclosing proof, never publish that as a permanent
|
|
613
|
+
// negative" -- which was true and cost this walk everything: the origin
|
|
614
|
+
// question is asked for the same expression over and over, it refuses far
|
|
615
|
+
// more often than it succeeds, and each refusal rebuilds a whole seeded
|
|
616
|
+
// origin solver. Naming what the refusal leaned on is what makes it
|
|
617
|
+
// keepable: a refusal that leaned on NOTHING is a fact right now, and one
|
|
618
|
+
// that leaned only on open guards becomes a fact when those guards confirm
|
|
619
|
+
// the answers they handed out. Anything else is not cached at all, as
|
|
620
|
+
// before.
|
|
621
|
+
let onlyGuards = true;
|
|
622
|
+
for (const key of trail)
|
|
623
|
+
if (!hypothesisGuardIsOpen(key)) {
|
|
624
|
+
onlyGuards = false;
|
|
625
|
+
break;
|
|
626
|
+
}
|
|
627
|
+
if (onlyGuards) {
|
|
628
|
+
const entry = { assumed: new Set(trail) };
|
|
629
|
+
refusedEntries.set(expression, entry);
|
|
630
|
+
if (entry.assumed.size !== 0)
|
|
631
|
+
registerGuardedAnswer(entry, () => refusedEntries.delete(expression));
|
|
632
|
+
}
|
|
633
|
+
}
|
|
634
|
+
return result.requirements.length === 0 || ledger?.include(result.requirements) === true ? result.value : null;
|
|
635
|
+
};
|
|
636
|
+
/**
|
|
637
|
+
* Refusals of the origin walk, per flow and per asking authority, each naming
|
|
638
|
+
* the hypotheses it rested on. See the store above for why a refusal is worth
|
|
639
|
+
* keeping at all.
|
|
640
|
+
*/
|
|
641
|
+
const refusedOrigins = new WeakMap();
|
|
642
|
+
// `GEA_ORIGINS_DEBUG=<text>|'*'` names WHICH arm of the origin walk refuses.
|
|
643
|
+
// `allocations-not-enumerable` is the single most re-investigated refusal in
|
|
644
|
+
// the campaign and this authority has never reported a reason, so three
|
|
645
|
+
// separate investigations each rediscovered the walk by reading it.
|
|
646
|
+
// Read once at load: `process.env` is a native interceptor, not a plain object,
|
|
647
|
+
// and the walk below runs once per uncached origin question -- millions of
|
|
648
|
+
// times on a whole-program run -- for a value that cannot change mid-process.
|
|
649
|
+
const watchedOrigins = process.env['GEA_ORIGINS_DEBUG'];
|
|
650
|
+
const exactClassAllocationOriginsUncached = (checker, flow, expression, authority) => {
|
|
651
|
+
const classes = new Set();
|
|
652
|
+
const constructions = new Map();
|
|
653
|
+
const concreteConstruction = (expression) => {
|
|
654
|
+
const fact = exactSourceConstructionOf(checker, flow, expression);
|
|
655
|
+
if (!fact)
|
|
656
|
+
return false;
|
|
657
|
+
for (const declaration of fact.alternatives)
|
|
658
|
+
classes.add(declaration);
|
|
659
|
+
constructions.set(expression, fact.alternatives);
|
|
660
|
+
return true;
|
|
661
|
+
};
|
|
662
|
+
const watchedRoot = watchedOrigins !== undefined && (watchedOrigins === '*' || expression.getText().includes(watchedOrigins));
|
|
663
|
+
const refuseOrigin = (value, arm) => {
|
|
664
|
+
if (watchedOrigins !== undefined) {
|
|
665
|
+
const text = value.getText().slice(0, 60).replace(/\s+/g, ' ');
|
|
666
|
+
if (watchedRoot || watchedOrigins === '*' || text.includes(watchedOrigins))
|
|
667
|
+
console.error(`[ORIGINS] ${arm} ${value.getSourceFile().fileName.split('/').slice(-1)[0]}:${value.getSourceFile().getLineAndCharacterOfPosition(value.getStart()).line + 1} [${text}]`);
|
|
668
|
+
}
|
|
669
|
+
return false;
|
|
670
|
+
};
|
|
671
|
+
const refused = (value, reason) => {
|
|
672
|
+
refuseOrigin(value, reason);
|
|
673
|
+
return { admitted: false, seed: false, dependencies: [] };
|
|
674
|
+
};
|
|
675
|
+
const dependsOn = (values) => ({
|
|
676
|
+
admitted: true,
|
|
677
|
+
seed: false,
|
|
678
|
+
dependencies: values.map(unwrapErasedExpression)
|
|
679
|
+
});
|
|
680
|
+
const origins = seededOriginSolver((value) => {
|
|
681
|
+
if (isVacuousOrigin(flow, value))
|
|
682
|
+
return dependsOn([]);
|
|
683
|
+
if (ts.isNewExpression(value)) {
|
|
684
|
+
if (!concreteConstruction(value))
|
|
685
|
+
return refused(value, 'new:not-a-concrete-construction');
|
|
686
|
+
// The static fact names the owned family; only the value graph knows
|
|
687
|
+
// whether `this` at that site holds nothing but that family's
|
|
688
|
+
// constructions (an explicit-receiver call would make the fresh object
|
|
689
|
+
// a foreign instance). Without the graph's answer the site is not exact.
|
|
690
|
+
if (thisConstructorFamilyOf(checker, flow, value.expression) !== null && (authority.graphValuesOf?.(value) ?? null) === null)
|
|
691
|
+
return refused(value, 'new:this-constructor-receiver-open');
|
|
692
|
+
return { admitted: true, seed: true, dependencies: [] };
|
|
693
|
+
}
|
|
694
|
+
if (ts.isConditionalExpression(value))
|
|
695
|
+
return dependsOn([value.whenTrue, value.whenFalse]);
|
|
696
|
+
if (ts.isCallExpression(value)) {
|
|
697
|
+
const completed = authority.callCompletionValuesOf(value);
|
|
698
|
+
if (completed === null)
|
|
699
|
+
return refused(value, 'call:completion-values-refused');
|
|
700
|
+
return completed.length > 0 ? dependsOn(completed) : refused(value, 'call:empty-completion-values');
|
|
701
|
+
}
|
|
702
|
+
if (value.kind === ts.SyntaxKind.ThisKeyword || value.kind === ts.SyntaxKind.SuperKeyword) {
|
|
703
|
+
const family = authority.thisFamilyOf(value);
|
|
704
|
+
if (!family)
|
|
705
|
+
return refused(value, 'this:family-not-enumerable');
|
|
706
|
+
for (const owner of family.classes)
|
|
707
|
+
classes.add(owner);
|
|
708
|
+
for (const [construction, alternatives] of family.constructions) {
|
|
709
|
+
const previous = constructions.get(construction) ?? [];
|
|
710
|
+
constructions.set(construction, [...new Set([...previous, ...alternatives])]);
|
|
711
|
+
}
|
|
712
|
+
return { admitted: true, seed: true, dependencies: [] };
|
|
713
|
+
}
|
|
714
|
+
if (ts.isPropertyAccessExpression(value) || ts.isElementAccessExpression(value)) {
|
|
715
|
+
const values = authority.fieldValuesOf(value);
|
|
716
|
+
return values && values.length > 0 ? dependsOn(values) : refused(value, 'field:contents-not-closed');
|
|
717
|
+
}
|
|
718
|
+
if (!ts.isIdentifier(value))
|
|
719
|
+
return refused(value, `not-an-identifier:${ts.SyntaxKind[value.kind]}`);
|
|
720
|
+
const declaration = flow.targetOf(value)?.declaration;
|
|
721
|
+
if (declaration && ts.isParameter(declaration)) {
|
|
722
|
+
const values = authority.parameterValuesOf(declaration);
|
|
723
|
+
if (values === null || values.length === 0)
|
|
724
|
+
return refused(value, 'parameter:values-refused');
|
|
725
|
+
return dependsOn(values);
|
|
726
|
+
}
|
|
727
|
+
// `const { held: alias } = nested; alias.draw( ... )`: the walk's own
|
|
728
|
+
// cells are parameters and variable declarations; a destructured name is
|
|
729
|
+
// a slot read the joint graph already resolves.
|
|
730
|
+
if (declaration && ts.isBindingElement(declaration)) {
|
|
731
|
+
const values = authority.graphValuesOf?.(value);
|
|
732
|
+
return values === null || values === undefined ? refused(value, 'identifier:BindingElement') : dependsOn(values);
|
|
733
|
+
}
|
|
734
|
+
if (!declaration || !ts.isVariableDeclaration(declaration))
|
|
735
|
+
return refused(value, `identifier:${declaration ? ts.SyntaxKind[declaration.kind] : 'no-declaration'}`);
|
|
736
|
+
const values = authority.bindingValuesOf(declaration);
|
|
737
|
+
return values === null ? refused(value, 'identifier:unaccounted-write') : dependsOn(values);
|
|
738
|
+
});
|
|
739
|
+
const verdict = origins(unwrapErasedExpression(expression));
|
|
740
|
+
if (watchedRoot && (verdict !== 'allocated' || classes.size === 0))
|
|
741
|
+
refuseOrigin(expression, `root:${verdict}:classes=${classes.size}`);
|
|
742
|
+
return verdict === 'allocated' && classes.size > 0 ? { classes, constructions } : null;
|
|
743
|
+
};
|
|
744
|
+
/**
|
|
745
|
+
* The value a constructor-function member's own `this.<key> = <value>`
|
|
746
|
+
* declares, or null when the declaration is not that shape or does not sit
|
|
747
|
+
* inside a source constructor function.
|
|
748
|
+
*
|
|
749
|
+
* Three's pre-class renderer factories declare every member this way:
|
|
750
|
+
* `function WebGLTextures( _gl, ... ) { function setTexture2D( texture, slot
|
|
751
|
+
* ) { ... } this.setTexture2D = setTexture2D }`. TypeScript files such an
|
|
752
|
+
* assignment's `this.<key>` as the property's OWN declaration -- there is no
|
|
753
|
+
* `MethodDeclaration` to find -- so the former class-only forwarding resolver refused
|
|
754
|
+
* every call through the whole factory family before this recognized the
|
|
755
|
+
* shape at all. Requiring the enclosing function to be `isConstructorFunction`
|
|
756
|
+
* keeps an ordinary assignment to some unrelated object's property
|
|
757
|
+
* (`obj.setSize = ...` where `obj` is not `this` of a source constructor) out
|
|
758
|
+
* of this arm entirely -- that shape is a class-family question this proof
|
|
759
|
+
* does not otherwise ask, and is not what "this member's own declaration" is
|
|
760
|
+
* supposed to mean.
|
|
761
|
+
*/
|
|
762
|
+
export const constructorFunctionMemberAssignment = (declaration) => {
|
|
763
|
+
if (!ts.isBinaryExpression(declaration) ||
|
|
764
|
+
declaration.operatorToken.kind !== ts.SyntaxKind.EqualsToken ||
|
|
765
|
+
!ts.isPropertyAccessExpression(declaration.left) ||
|
|
766
|
+
declaration.left.expression.kind !== ts.SyntaxKind.ThisKeyword)
|
|
767
|
+
return null;
|
|
768
|
+
const frame = ts.findAncestor(declaration, (node) => ts.isFunctionLike(node) && !ts.isArrowFunction(node));
|
|
769
|
+
return frame && isConstructorFunction(frame) ? { value: declaration.right } : null;
|
|
770
|
+
};
|
|
771
|
+
/** An ordinary argument entering a source class constructor reaches its
|
|
772
|
+
* explicit formal slots. Default derived constructors forward the same slots
|
|
773
|
+
* to their base. Unknown constructor identities, replacement returns and
|
|
774
|
+
* arguments/rest aliases remain outside this closed forwarding proof. */
|
|
775
|
+
export const closedConstructorForwardingTargetsOf = (checker, flow, call, argumentsUsesAt) => {
|
|
776
|
+
if (call.arguments?.some(ts.isSpreadElement))
|
|
777
|
+
return null;
|
|
778
|
+
let selections = null;
|
|
779
|
+
if (ts.isNewExpression(call))
|
|
780
|
+
selections = sourceConstructorSelectionsOf(checker, flow, call.expression);
|
|
781
|
+
else if (call.expression.kind === ts.SyntaxKind.SuperKeyword) {
|
|
782
|
+
const constructor = ts.findAncestor(call, ts.isConstructorDeclaration);
|
|
783
|
+
if (!constructor)
|
|
784
|
+
return null;
|
|
785
|
+
const heritage = constructor.parent.heritageClauses?.find((clause) => clause.token === ts.SyntaxKind.ExtendsKeyword)?.types[0];
|
|
786
|
+
selections = heritage ? sourceConstructorSelectionsOf(checker, flow, heritage.expression) : null;
|
|
787
|
+
}
|
|
788
|
+
if (!selections)
|
|
789
|
+
return null;
|
|
790
|
+
const targets = new Map();
|
|
791
|
+
for (const selected of selections) {
|
|
792
|
+
// This proof forwards a construction's ARGUMENTS to the parameters of the
|
|
793
|
+
// `constructor(...)` body it runs, walking `extends` to find one. A
|
|
794
|
+
// constructor function's body is its own constructor and is not a
|
|
795
|
+
// `ts.ConstructorDeclaration`, so it has no target of the shape this
|
|
796
|
+
// returns. Refusing is honest; binding its parameters is the ordinary
|
|
797
|
+
// `call-argument` edge the flow index already records at `new F( ... )`.
|
|
798
|
+
if (!isClassSpelledSourceClass(selected))
|
|
799
|
+
return null;
|
|
800
|
+
const symbol = selected.name ? checker.getSymbolAtLocation(selected.name) : checker.getTypeAtLocation(selected).getSymbol();
|
|
801
|
+
if (!symbol)
|
|
802
|
+
return null;
|
|
803
|
+
const instance = checker.getDeclaredTypeOfSymbol(symbol);
|
|
804
|
+
if (!instance.isClassOrInterface() || !classConstructorKeepsInstanceOf(checker, flow, instance))
|
|
805
|
+
return null;
|
|
806
|
+
const seen = new Set();
|
|
807
|
+
let owner = selected;
|
|
808
|
+
while (owner && !seen.has(owner)) {
|
|
809
|
+
seen.add(owner);
|
|
810
|
+
if (owner.getSourceFile().isDeclarationFile || !sourceBindingIsUnwritten(flow, owner))
|
|
811
|
+
return null;
|
|
812
|
+
const body = owner.members.find((member) => ts.isConstructorDeclaration(member) && !!member.body);
|
|
813
|
+
if (body) {
|
|
814
|
+
if ((argumentsUsesAt(body)?.length ?? 0) > 0 ||
|
|
815
|
+
body.parameters.some((parameter) => parameter.dotDotDotToken || !ts.isIdentifier(parameter.name)))
|
|
816
|
+
return null;
|
|
817
|
+
targets.set(body, { body, parameters: body.parameters });
|
|
818
|
+
owner = null;
|
|
819
|
+
break;
|
|
820
|
+
}
|
|
821
|
+
const base = owner.heritageClauses?.find((clause) => clause.token === ts.SyntaxKind.ExtendsKeyword)?.types[0];
|
|
822
|
+
if (!base) {
|
|
823
|
+
owner = null;
|
|
824
|
+
break;
|
|
825
|
+
}
|
|
826
|
+
const declaration = namedDeclarationAt(checker, base.expression);
|
|
827
|
+
if (!declaration || (!ts.isClassDeclaration(declaration) && !ts.isClassExpression(declaration)))
|
|
828
|
+
return null;
|
|
829
|
+
owner = declaration;
|
|
830
|
+
}
|
|
831
|
+
if (owner !== null)
|
|
832
|
+
return null;
|
|
833
|
+
}
|
|
834
|
+
return [...targets.values()];
|
|
835
|
+
};
|