@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,992 @@
|
|
|
1
|
+
import ts from 'typescript';
|
|
2
|
+
import { heritageClassOrInterfaceOf } from './model.js';
|
|
3
|
+
import { sourceClassKeyReadPlanOf } from './source-class-data.js';
|
|
4
|
+
import { classConstructorKeepsInstanceOf } from './member-call-forwarding.js';
|
|
5
|
+
import { unwrapNaming } from './targets.js';
|
|
6
|
+
import { annotationStatesNothing, isGlobalObjectConstructor, isStandardGlobalValue, isUnusableEvidence } from '../derived-expression-type.js';
|
|
7
|
+
import { createPropertyKeyDomains } from '../property-key-domain.js';
|
|
8
|
+
import { objectPrototypeMemberNames } from '../../../representation/record-fields.js';
|
|
9
|
+
import { deferredIntrinsicProtocolLedgerOf, intrinsicProtocolRequirementKind } from '../deferred-intrinsic-protocols.js';
|
|
10
|
+
import { computedKeySetOf } from './computed-key-set.js';
|
|
11
|
+
import { closedCallableAuthorityOf } from './callable-reach.js';
|
|
12
|
+
import { censusArgumentsObjects } from '../arguments-objects.js';
|
|
13
|
+
const KEYED_EDGES = new Set([
|
|
14
|
+
'index-assignment',
|
|
15
|
+
'compound-assignment',
|
|
16
|
+
'logical-assignment',
|
|
17
|
+
'destructuring',
|
|
18
|
+
'destructuring-default',
|
|
19
|
+
'iteration-binding'
|
|
20
|
+
]);
|
|
21
|
+
/** `Object.<method>` calls that add own properties or replace the prototype. */
|
|
22
|
+
const OBJECT_MUTATORS = new Set(['assign', 'defineProperty', 'defineProperties', 'setPrototypeOf']);
|
|
23
|
+
/** `Reflect.<method>` calls that add own properties or replace the prototype. */
|
|
24
|
+
const REFLECT_MUTATORS = new Set(['set', 'defineProperty', 'setPrototypeOf']);
|
|
25
|
+
const MUTATOR_OWNERS = [
|
|
26
|
+
['Object', OBJECT_MUTATORS],
|
|
27
|
+
['Reflect', REFLECT_MUTATORS]
|
|
28
|
+
];
|
|
29
|
+
const INERT_COMPARISONS = new Set([
|
|
30
|
+
ts.SyntaxKind.EqualsEqualsEqualsToken,
|
|
31
|
+
ts.SyntaxKind.ExclamationEqualsEqualsToken,
|
|
32
|
+
ts.SyntaxKind.EqualsEqualsToken,
|
|
33
|
+
ts.SyntaxKind.ExclamationEqualsToken,
|
|
34
|
+
ts.SyntaxKind.InstanceOfKeyword
|
|
35
|
+
]);
|
|
36
|
+
/**
|
|
37
|
+
* A mention of the global `Object`/`Reflect` value that cannot hand one of
|
|
38
|
+
* its mutators out: a member read (the member's own symbol is then scanned),
|
|
39
|
+
* a call or construction of it, or an identity/`instanceof` comparison --
|
|
40
|
+
* three's `value.constructor === Object` style checks.
|
|
41
|
+
*/
|
|
42
|
+
const globalValueUseIsInert = (reference) => {
|
|
43
|
+
let node = reference;
|
|
44
|
+
while (ts.isParenthesizedExpression(node.parent))
|
|
45
|
+
node = node.parent;
|
|
46
|
+
const parent = node.parent;
|
|
47
|
+
if (ts.isPropertyAccessExpression(parent))
|
|
48
|
+
return parent.expression === node;
|
|
49
|
+
if (ts.isCallExpression(parent) || ts.isNewExpression(parent))
|
|
50
|
+
return parent.expression === node;
|
|
51
|
+
return ts.isBinaryExpression(parent) && INERT_COMPARISONS.has(parent.operatorToken.kind);
|
|
52
|
+
};
|
|
53
|
+
const PRIMITIVE_FLAGS = ts.TypeFlags.StringLike |
|
|
54
|
+
ts.TypeFlags.NumberLike |
|
|
55
|
+
ts.TypeFlags.BigIntLike |
|
|
56
|
+
ts.TypeFlags.BooleanLike |
|
|
57
|
+
ts.TypeFlags.EnumLike |
|
|
58
|
+
ts.TypeFlags.ESSymbolLike |
|
|
59
|
+
ts.TypeFlags.Void |
|
|
60
|
+
ts.TypeFlags.Undefined |
|
|
61
|
+
ts.TypeFlags.Null |
|
|
62
|
+
ts.TypeFlags.Never;
|
|
63
|
+
const skipParentheses = (expression) => unwrapNaming(expression);
|
|
64
|
+
const debugName = process.env['GEA_FAMILY_MEMBER_DEBUG'];
|
|
65
|
+
const debugAllName = process.env['GEA_FAMILY_MEMBER_DEBUG_ALL'];
|
|
66
|
+
/** `GEA_FAMILY_MEMBER_ORIGIN_DEBUG=<member>[,<member>]|*` names the exact sub-check that refused a member slot in `memberExcludesFamily`. */
|
|
67
|
+
const originDebug = process.env['GEA_FAMILY_MEMBER_ORIGIN_DEBUG'];
|
|
68
|
+
/**
|
|
69
|
+
* `GEA_MEMBER_READ_DEBUG=<member>[,<member>]|*` is `GEA_FAMILY_MEMBER_DEBUG_ALL`
|
|
70
|
+
* widened two ways. First, `debugAllName`'s enumeration used to cover only the
|
|
71
|
+
* write/keyed-write scan in `computeClosureRefusal`: a hit there returned
|
|
72
|
+
* `blocking[0]` immediately, so the reflective-call scan right after it (
|
|
73
|
+
* `Object.assign`/`defineProperties`/`Reflect.set`/…) never ran and never got
|
|
74
|
+
* a chance to add its own refusals to the list. This value makes BOTH scans
|
|
75
|
+
* enumerate into the same `blocking` array before anything returns. Second,
|
|
76
|
+
* `classFamilyMemberReadTypeOf` (the caller) prints the Object obligation the
|
|
77
|
+
* closure proof would have recorded -- `plan.needsDefaultPrototype` and the
|
|
78
|
+
* requirement count -- which the closure proof itself never sees, because
|
|
79
|
+
* that fact is computed one layer up, before the proof is even asked.
|
|
80
|
+
*/
|
|
81
|
+
const memberReadDebug = process.env['GEA_MEMBER_READ_DEBUG'];
|
|
82
|
+
const memberReadWatching = (name) => memberReadDebug !== undefined && (memberReadDebug === '*' || memberReadDebug.split(',').includes(name));
|
|
83
|
+
/** ` file:line text` for a debug line, or nothing. */
|
|
84
|
+
const describeAt = (at) => {
|
|
85
|
+
const file = at?.getSourceFile();
|
|
86
|
+
return at && file
|
|
87
|
+
? ` ${file.fileName.split('/').pop()}:${file.getLineAndCharacterOfPosition(at.getStart()).line + 1} ${at.getText().slice(0, 100)}`
|
|
88
|
+
: '';
|
|
89
|
+
};
|
|
90
|
+
/** The source class an INSTANCE type is an instance of -- never `typeof C`, whose symbol is the same class symbol. */
|
|
91
|
+
const instanceClassOf = (type) => {
|
|
92
|
+
if ((type.flags & ts.TypeFlags.Object) === 0)
|
|
93
|
+
return null;
|
|
94
|
+
const objectFlags = type.objectFlags;
|
|
95
|
+
const target = (objectFlags & ts.ObjectFlags.Reference) !== 0 ? type.target : type;
|
|
96
|
+
if (!target.isClassOrInterface() || (target.objectFlags & ts.ObjectFlags.Class) === 0)
|
|
97
|
+
return null;
|
|
98
|
+
const declaration = target.getSymbol()?.valueDeclaration;
|
|
99
|
+
if (!declaration || (!ts.isClassDeclaration(declaration) && !ts.isClassExpression(declaration)))
|
|
100
|
+
return null;
|
|
101
|
+
return declaration.getSourceFile().isDeclarationFile ? null : declaration;
|
|
102
|
+
};
|
|
103
|
+
const isConstVariable = (declaration) => declaration !== undefined &&
|
|
104
|
+
ts.isVariableDeclaration(declaration) &&
|
|
105
|
+
ts.isVariableDeclarationList(declaration.parent) &&
|
|
106
|
+
(declaration.parent.flags & ts.NodeFlags.Const) !== 0;
|
|
107
|
+
const carriesTypeParameter = (type) => (type.flags & ts.TypeFlags.TypeParameter) !== 0 || (type.isUnionOrIntersection() && type.types.some(carriesTypeParameter));
|
|
108
|
+
const inventories = new WeakMap();
|
|
109
|
+
const closures = new WeakMap();
|
|
110
|
+
const NO_CENSUS = {};
|
|
111
|
+
/**
|
|
112
|
+
* Whether a computed write's key is PROVEN to range over a finite set that
|
|
113
|
+
* excludes `target` -- three's `for ( const key in values ) { this[ key ] =
|
|
114
|
+
* newValue }` in `Texture.setValues`/`Material.setValues`, whose `values`
|
|
115
|
+
* only ever holds the options literals the program passes, none of which
|
|
116
|
+
* spell `isFogExp2` or `arrayBuffers`. `computed-key-set.ts` proves the exact
|
|
117
|
+
* set (`this[key]` in `Texture.setValues` is 13 keys, `Material.setValues` is
|
|
118
|
+
* 7, neither containing either name).
|
|
119
|
+
*
|
|
120
|
+
* `false` whenever the set cannot be proven -- an open caller, an unresolved
|
|
121
|
+
* alias, anything `computed-key-set.ts`'s own header lists -- and the write
|
|
122
|
+
* still blocks exactly as before: this only ever NARROWS a `mayName` that was
|
|
123
|
+
* already true, never widens one that was already false.
|
|
124
|
+
*
|
|
125
|
+
* Uses the enclosing proof's complete frame authority. The inventory of
|
|
126
|
+
* possible keys must not shrink because a consumer omitted origin queries.
|
|
127
|
+
*/
|
|
128
|
+
const keyProvenToExclude = (checker, flow, key, target, authority) => {
|
|
129
|
+
const keys = computedKeySetOf(checker, flow, key, authority);
|
|
130
|
+
return keys !== null && !keys.has(target);
|
|
131
|
+
};
|
|
132
|
+
/** The KEY expression of a write recorded as `receiver[key] = value` -- `null` for any other write shape. */
|
|
133
|
+
const elementAccessKeyOf = (write) => {
|
|
134
|
+
const receiver = write.naming;
|
|
135
|
+
const access = receiver?.parent;
|
|
136
|
+
if (!receiver || !access || !ts.isElementAccessExpression(access) || access.expression !== receiver)
|
|
137
|
+
return null;
|
|
138
|
+
return access.argumentExpression;
|
|
139
|
+
};
|
|
140
|
+
const writeInventoryOf = (checker, flow) => {
|
|
141
|
+
const held = inventories.get(flow);
|
|
142
|
+
if (held)
|
|
143
|
+
return held;
|
|
144
|
+
const memberWrites = new Map();
|
|
145
|
+
const namedOrigins = new Map();
|
|
146
|
+
const keyedWrites = [];
|
|
147
|
+
for (const write of flow.allWrites) {
|
|
148
|
+
if (write.slot === 'member' && write.member !== null) {
|
|
149
|
+
// `namedOrigins` takes the write before the two exclusions below: a
|
|
150
|
+
// literal's own `{ k: v }` member is not an expando, but it IS one of
|
|
151
|
+
// the values a slot of that name can hold. A `delete` still states only
|
|
152
|
+
// that the slot existed, and a binding pattern's `member` edge is a READ.
|
|
153
|
+
if (write.edge !== 'delete' &&
|
|
154
|
+
!((write.edge === 'destructuring' || write.edge === 'destructuring-default') && ts.isBindingElement(write.site))) {
|
|
155
|
+
const origins = namedOrigins.get(write.member);
|
|
156
|
+
if (origins)
|
|
157
|
+
origins.push(write);
|
|
158
|
+
else
|
|
159
|
+
namedOrigins.set(write.member, [write]);
|
|
160
|
+
}
|
|
161
|
+
// `{ k: v }` initializing a fresh literal is that literal's own member,
|
|
162
|
+
// never an expando on an object that already existed; a binding
|
|
163
|
+
// pattern's `member` edge is a READ of its source.
|
|
164
|
+
if (ts.isPropertyAssignment(write.site) || ts.isShorthandPropertyAssignment(write.site))
|
|
165
|
+
continue;
|
|
166
|
+
if ((write.edge === 'destructuring' || write.edge === 'destructuring-default') && ts.isBindingElement(write.site))
|
|
167
|
+
continue;
|
|
168
|
+
// A delete never creates a property.
|
|
169
|
+
if (write.edge === 'delete')
|
|
170
|
+
continue;
|
|
171
|
+
const list = memberWrites.get(write.member);
|
|
172
|
+
if (list)
|
|
173
|
+
list.push(write);
|
|
174
|
+
else
|
|
175
|
+
memberWrites.set(write.member, [write]);
|
|
176
|
+
}
|
|
177
|
+
else if (write.slot === 'element' && KEYED_EDGES.has(write.edge))
|
|
178
|
+
keyedWrites.push(write);
|
|
179
|
+
}
|
|
180
|
+
const reflectiveCalls = [];
|
|
181
|
+
let reflectiveAlias = null;
|
|
182
|
+
const directCallees = new Set();
|
|
183
|
+
for (const { call } of flow.calls) {
|
|
184
|
+
if (!ts.isCallExpression(call))
|
|
185
|
+
continue;
|
|
186
|
+
const callee = skipParentheses(call.expression);
|
|
187
|
+
if (!ts.isPropertyAccessExpression(callee) || !ts.isIdentifier(callee.expression))
|
|
188
|
+
continue;
|
|
189
|
+
const method = callee.name.text;
|
|
190
|
+
const owner = callee.expression;
|
|
191
|
+
const mutates = (OBJECT_MUTATORS.has(method) && isGlobalObjectConstructor(checker, owner, checker.getTypeAtLocation(owner))) ||
|
|
192
|
+
(REFLECT_MUTATORS.has(method) && isStandardGlobalValue(checker, owner, 'Reflect'));
|
|
193
|
+
if (!mutates)
|
|
194
|
+
continue;
|
|
195
|
+
reflectiveCalls.push({ call, method });
|
|
196
|
+
directCallees.add(callee.name);
|
|
197
|
+
}
|
|
198
|
+
// `const define = Object.defineProperty; define(o, 'k', d)`, or
|
|
199
|
+
// `const R = Reflect; R.set(o, 'k', v)`, calls a mutator the scan above
|
|
200
|
+
// never recorded. The mutators are resolved from the globals themselves,
|
|
201
|
+
// not from the calls, so a program that only ever aliases one is still
|
|
202
|
+
// seen: any mention other than a recorded direct callee name leaves the
|
|
203
|
+
// inventory open. The globals' own values may be read for their members,
|
|
204
|
+
// compared, or called; any other use (`const { defineProperty } = Object`,
|
|
205
|
+
// `Object[key]`, passing `Reflect` along) hands the mutators out unnamed.
|
|
206
|
+
for (const [global, methods] of MUTATOR_OWNERS) {
|
|
207
|
+
let value = checker.resolveName(global, undefined, ts.SymbolFlags.Value, false);
|
|
208
|
+
if (value && (value.flags & ts.SymbolFlags.Alias) !== 0)
|
|
209
|
+
value = checker.getAliasedSymbol(value);
|
|
210
|
+
if (!value)
|
|
211
|
+
continue;
|
|
212
|
+
for (const reference of flow.memberReferencesToSymbol(value)) {
|
|
213
|
+
if (!globalValueUseIsInert(reference) && reflectiveAlias === null)
|
|
214
|
+
reflectiveAlias = reference;
|
|
215
|
+
}
|
|
216
|
+
const valueType = checker.getTypeOfSymbol(value);
|
|
217
|
+
for (const method of methods) {
|
|
218
|
+
const member = checker.getPropertyOfType(valueType, method);
|
|
219
|
+
if (!member)
|
|
220
|
+
continue;
|
|
221
|
+
for (const reference of flow.memberReferencesToSymbol(member)) {
|
|
222
|
+
if (!directCallees.has(reference) && reflectiveAlias === null)
|
|
223
|
+
reflectiveAlias = reference;
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
// Every write this index holds is already reachable: the flow walk prunes
|
|
228
|
+
// unreachable members before it records anything.
|
|
229
|
+
const keys = createPropertyKeyDomains(checker, flow, () => true);
|
|
230
|
+
// A spread-free object literal is the only source that can be shown not to
|
|
231
|
+
// carry `key`; anything else (a variable, a call result, a spread) may.
|
|
232
|
+
const literalMayNameKey = (expression, key) => {
|
|
233
|
+
const literal = expression && skipParentheses(expression);
|
|
234
|
+
if (!literal || !ts.isObjectLiteralExpression(literal))
|
|
235
|
+
return true;
|
|
236
|
+
return literal.properties.some((property) => {
|
|
237
|
+
if (ts.isSpreadAssignment(property))
|
|
238
|
+
return true;
|
|
239
|
+
const propertyName = property.name;
|
|
240
|
+
if (!propertyName)
|
|
241
|
+
return true;
|
|
242
|
+
if (ts.isComputedPropertyName(propertyName))
|
|
243
|
+
return keys.mayName(keys.of(propertyName.expression), key);
|
|
244
|
+
if (ts.isIdentifier(propertyName) || ts.isStringLiteralLike(propertyName) || ts.isNumericLiteral(propertyName)) {
|
|
245
|
+
if (ts.isPropertyAssignment(property) && propertyName.text === '__proto__' && !ts.isStringLiteralLike(propertyName))
|
|
246
|
+
return false;
|
|
247
|
+
return propertyName.text === key;
|
|
248
|
+
}
|
|
249
|
+
return true;
|
|
250
|
+
});
|
|
251
|
+
};
|
|
252
|
+
const keyedByName = new Map();
|
|
253
|
+
const reflectionByName = new Map();
|
|
254
|
+
const keyedWritesNaming = (key) => {
|
|
255
|
+
const held = keyedByName.get(key);
|
|
256
|
+
if (held)
|
|
257
|
+
return held;
|
|
258
|
+
const matching = keyedWrites.filter((write) => {
|
|
259
|
+
const access = write.naming?.parent;
|
|
260
|
+
// A keyed write this layer could not attribute to an element access has
|
|
261
|
+
// no key to test, so it may name anything.
|
|
262
|
+
if (!write.naming || !access || !ts.isElementAccessExpression(access) || access.expression !== write.naming)
|
|
263
|
+
return true;
|
|
264
|
+
return keys.mayName(keys.of(access.argumentExpression), key);
|
|
265
|
+
});
|
|
266
|
+
keyedByName.set(key, matching);
|
|
267
|
+
return matching;
|
|
268
|
+
};
|
|
269
|
+
const reflectionMayCreate = (key) => {
|
|
270
|
+
const held = reflectionByName.get(key);
|
|
271
|
+
if (held !== undefined)
|
|
272
|
+
return held;
|
|
273
|
+
const answer = reflectiveCalls.some(({ call, method }) => {
|
|
274
|
+
const args = call.arguments;
|
|
275
|
+
// A spread hides which argument is the target and which the key.
|
|
276
|
+
if (args.some(ts.isSpreadElement))
|
|
277
|
+
return true;
|
|
278
|
+
// A replaced prototype can bring any member with it.
|
|
279
|
+
if (method === 'setPrototypeOf')
|
|
280
|
+
return true;
|
|
281
|
+
const owner = skipParentheses(call.expression);
|
|
282
|
+
const isReflect = ts.isPropertyAccessExpression(owner) && isStandardGlobalValue(checker, owner.expression, 'Reflect');
|
|
283
|
+
// `Object.assign(a, b)` is NAME-PRESERVING: the only value it can put in
|
|
284
|
+
// `a.k` is the one that already sat in some `b.k`, which a union keyed by
|
|
285
|
+
// NAME therefore already holds. A source whose own `k` was written with a
|
|
286
|
+
// COMPUTED key is the exception, and the keyed-write scan covers it.
|
|
287
|
+
if (method === 'assign' && !isReflect)
|
|
288
|
+
return false;
|
|
289
|
+
// `defineProperties(a, map)` is not: `a.k` becomes `map.k.value`, so the
|
|
290
|
+
// value arrives under a DESCRIPTOR rather than under the name itself.
|
|
291
|
+
if (method === 'defineProperties')
|
|
292
|
+
return literalMayNameKey(args[1], key);
|
|
293
|
+
// `defineProperty` (either owner) and `Reflect.set`: the value is stated
|
|
294
|
+
// outright, under no name a member write would have recorded.
|
|
295
|
+
const named = args[1];
|
|
296
|
+
return named === undefined || ts.isSpreadElement(named) || keys.mayName(keys.of(named), key);
|
|
297
|
+
});
|
|
298
|
+
reflectionByName.set(key, answer);
|
|
299
|
+
return answer;
|
|
300
|
+
};
|
|
301
|
+
const inventory = {
|
|
302
|
+
memberWrites,
|
|
303
|
+
namedOrigins,
|
|
304
|
+
keyedWrites,
|
|
305
|
+
reflectiveCalls,
|
|
306
|
+
reflectiveAlias,
|
|
307
|
+
keyedWritesNaming,
|
|
308
|
+
reflectionMayCreate,
|
|
309
|
+
keys
|
|
310
|
+
};
|
|
311
|
+
inventories.set(flow, inventory);
|
|
312
|
+
return inventory;
|
|
313
|
+
};
|
|
314
|
+
/**
|
|
315
|
+
* Whether a keyed store can only overwrite a key the receiver already holds.
|
|
316
|
+
*
|
|
317
|
+
* three's `Material.setValues` is the shape, and it is the only computed-key
|
|
318
|
+
* store on a `Material` receiver:
|
|
319
|
+
*
|
|
320
|
+
* for ( const key in values ) {
|
|
321
|
+
* ...
|
|
322
|
+
* const currentValue = this[ key ];
|
|
323
|
+
* if ( currentValue === undefined ) { warn( ... ); continue; }
|
|
324
|
+
* ...
|
|
325
|
+
* else this[ key ] = newValue;
|
|
326
|
+
* }
|
|
327
|
+
*
|
|
328
|
+
* On an instance that has no `k` anywhere -- no field, nothing on its
|
|
329
|
+
* prototype chain, and (inductively, since every other writer is proved not
|
|
330
|
+
* to add one) no own expando -- `this[ k ]` reads `undefined`, the guard
|
|
331
|
+
* leaves the iteration, and the store never runs. So the store can overwrite
|
|
332
|
+
* a declarer's own `k` (which the declarer's carrier already describes) but
|
|
333
|
+
* never create `k` on an instance lacking it.
|
|
334
|
+
*
|
|
335
|
+
* Admitted only exactly: the receiver is `this`; the key is a `const` binding
|
|
336
|
+
* (so guard and store name one slot); and some statement preceding the store
|
|
337
|
+
* in an enclosing block of the SAME function is `if (<absence of this[key]>)`
|
|
338
|
+
* whose consequent unconditionally leaves (`continue`/`break`/`return`/
|
|
339
|
+
* `throw`). The absence test reads the slot directly or through a `const`
|
|
340
|
+
* initialized from it in the same function, compared `=== undefined`,
|
|
341
|
+
* `== undefined`/`== null`, `typeof ... === 'undefined'`, or negated.
|
|
342
|
+
*/
|
|
343
|
+
const guardedAbsentKeyStore = (checker, write, access) => {
|
|
344
|
+
if (write.edge !== 'index-assignment' && write.edge !== 'compound-assignment' && write.edge !== 'logical-assignment')
|
|
345
|
+
return false;
|
|
346
|
+
if (skipParentheses(access.expression).kind !== ts.SyntaxKind.ThisKeyword)
|
|
347
|
+
return false;
|
|
348
|
+
const key = skipParentheses(access.argumentExpression);
|
|
349
|
+
if (!ts.isIdentifier(key))
|
|
350
|
+
return false;
|
|
351
|
+
const keySymbol = checker.getSymbolAtLocation(key);
|
|
352
|
+
if (!keySymbol || !isConstVariable(keySymbol.valueDeclaration))
|
|
353
|
+
return false;
|
|
354
|
+
const owner = ts.findAncestor(access, ts.isFunctionLike);
|
|
355
|
+
if (!owner)
|
|
356
|
+
return false;
|
|
357
|
+
const readsSlotDirectly = (expression) => {
|
|
358
|
+
const read = skipParentheses(expression);
|
|
359
|
+
if (!ts.isElementAccessExpression(read) || skipParentheses(read.expression).kind !== ts.SyntaxKind.ThisKeyword)
|
|
360
|
+
return false;
|
|
361
|
+
const readKey = skipParentheses(read.argumentExpression);
|
|
362
|
+
return (ts.isIdentifier(readKey) && checker.getSymbolAtLocation(readKey) === keySymbol && ts.findAncestor(read, ts.isFunctionLike) === owner);
|
|
363
|
+
};
|
|
364
|
+
const readsSlot = (expression) => {
|
|
365
|
+
const read = skipParentheses(expression);
|
|
366
|
+
if (readsSlotDirectly(read))
|
|
367
|
+
return true;
|
|
368
|
+
if (!ts.isIdentifier(read))
|
|
369
|
+
return false;
|
|
370
|
+
const declaration = checker.getSymbolAtLocation(read)?.valueDeclaration;
|
|
371
|
+
return isConstVariable(declaration) && declaration.initializer !== undefined && readsSlotDirectly(declaration.initializer);
|
|
372
|
+
};
|
|
373
|
+
const isUndefinedValue = (expression) => {
|
|
374
|
+
const value = skipParentheses(expression);
|
|
375
|
+
if (ts.isVoidExpression(value))
|
|
376
|
+
return true;
|
|
377
|
+
return ts.isIdentifier(value) && value.text === 'undefined' && isStandardGlobalValue(checker, value, 'undefined');
|
|
378
|
+
};
|
|
379
|
+
const testsAbsence = (condition) => {
|
|
380
|
+
const test = skipParentheses(condition);
|
|
381
|
+
if (ts.isPrefixUnaryExpression(test) && test.operator === ts.SyntaxKind.ExclamationToken)
|
|
382
|
+
return readsSlot(test.operand);
|
|
383
|
+
if (!ts.isBinaryExpression(test))
|
|
384
|
+
return false;
|
|
385
|
+
const operator = test.operatorToken.kind;
|
|
386
|
+
// Either disjunct holding makes the whole condition hold.
|
|
387
|
+
if (operator === ts.SyntaxKind.BarBarToken)
|
|
388
|
+
return testsAbsence(test.left) || testsAbsence(test.right);
|
|
389
|
+
const strict = operator === ts.SyntaxKind.EqualsEqualsEqualsToken;
|
|
390
|
+
if (!strict && operator !== ts.SyntaxKind.EqualsEqualsToken)
|
|
391
|
+
return false;
|
|
392
|
+
const absentValue = (side) => isUndefinedValue(side) || (!strict && skipParentheses(side).kind === ts.SyntaxKind.NullKeyword);
|
|
393
|
+
if ((absentValue(test.right) && readsSlot(test.left)) || (absentValue(test.left) && readsSlot(test.right)))
|
|
394
|
+
return true;
|
|
395
|
+
const typeofSide = (side, other) => {
|
|
396
|
+
const unary = skipParentheses(side);
|
|
397
|
+
const literal = skipParentheses(other);
|
|
398
|
+
return ts.isTypeOfExpression(unary) && ts.isStringLiteralLike(literal) && literal.text === 'undefined' && readsSlot(unary.expression);
|
|
399
|
+
};
|
|
400
|
+
return typeofSide(test.left, test.right) || typeofSide(test.right, test.left);
|
|
401
|
+
};
|
|
402
|
+
const exits = (statement) => {
|
|
403
|
+
if (ts.isContinueStatement(statement) ||
|
|
404
|
+
ts.isBreakStatement(statement) ||
|
|
405
|
+
ts.isReturnStatement(statement) ||
|
|
406
|
+
ts.isThrowStatement(statement))
|
|
407
|
+
return true;
|
|
408
|
+
if (!ts.isBlock(statement))
|
|
409
|
+
return false;
|
|
410
|
+
const last = statement.statements[statement.statements.length - 1];
|
|
411
|
+
return last !== undefined && exits(last);
|
|
412
|
+
};
|
|
413
|
+
for (let child = access, parent = access.parent; parent !== undefined; child = parent, parent = parent.parent) {
|
|
414
|
+
if (ts.isFunctionLike(parent) || ts.isClassLike(parent) || ts.isSourceFile(parent))
|
|
415
|
+
return false;
|
|
416
|
+
if (!ts.isBlock(parent) && !ts.isCaseClause(parent) && !ts.isDefaultClause(parent))
|
|
417
|
+
continue;
|
|
418
|
+
const statements = parent.statements;
|
|
419
|
+
const at = statements.indexOf(child);
|
|
420
|
+
for (let index = 0; index < at; index++) {
|
|
421
|
+
const statement = statements[index];
|
|
422
|
+
if (ts.isIfStatement(statement) && testsAbsence(statement.expression) && exits(statement.thenStatement))
|
|
423
|
+
return true;
|
|
424
|
+
}
|
|
425
|
+
}
|
|
426
|
+
return false;
|
|
427
|
+
};
|
|
428
|
+
const familyKeyOf = (classes) => [...classes]
|
|
429
|
+
.map((owner) => `${owner.getSourceFile().fileName}:${owner.pos}`)
|
|
430
|
+
.sort()
|
|
431
|
+
.join(',');
|
|
432
|
+
/**
|
|
433
|
+
* What can give a `lacking` instance its own `name`, or replace a family
|
|
434
|
+
* instance's prototype -- the part of closure `sourceClassKeyReadPlanOf`
|
|
435
|
+
* leaves to its caller. `null` when nothing can. The write inventory and every
|
|
436
|
+
* type this consults are fixed for one flow index, so the verdict is cached
|
|
437
|
+
* per flow, member name and family split; the plan itself, and the ledger
|
|
438
|
+
* obligation it raises, is asked again on every query.
|
|
439
|
+
*/
|
|
440
|
+
const closureRefusalOf = (checker, flow, instances, lacking, name, census) => {
|
|
441
|
+
let byCensus = closures.get(flow);
|
|
442
|
+
if (!byCensus)
|
|
443
|
+
closures.set(flow, (byCensus = new WeakMap()));
|
|
444
|
+
let byKey = byCensus.get(census ?? NO_CENSUS);
|
|
445
|
+
if (!byKey)
|
|
446
|
+
byCensus.set(census ?? NO_CENSUS, (byKey = new Map()));
|
|
447
|
+
const key = `${name}|${familyKeyOf(instances.keys())}|${familyKeyOf(lacking)}`;
|
|
448
|
+
const held = byKey.get(key);
|
|
449
|
+
if (held)
|
|
450
|
+
return held;
|
|
451
|
+
// The finite-key-set consultation `computeClosureRefusal` may now make
|
|
452
|
+
// (via `keyProvenToExclude`) is itself an intrinsic obligation --
|
|
453
|
+
// `computedKeySetOf`'s for-in/`Object.keys` arms register a requirement on
|
|
454
|
+
// whichever capture is ACTIVE (`deferred-intrinsic-protocols.ts`), and with
|
|
455
|
+
// none active that registration silently no-ops. Wrapping the whole proof
|
|
456
|
+
// in one capture here, once, is what lets a memoized cache hit still carry
|
|
457
|
+
// forward the obligations the FIRST computation incurred: they are stored
|
|
458
|
+
// beside the verdict and replayed by the caller on every hit, never
|
|
459
|
+
// re-derived and never dropped.
|
|
460
|
+
const ledger = deferredIntrinsicProtocolLedgerOf(flow);
|
|
461
|
+
const proof = ledger
|
|
462
|
+
? (({ value, requirements }) => ({ refusal: value, requirements }))(ledger.capture(() => computeClosureRefusal(checker, flow, instances, lacking, name, census)))
|
|
463
|
+
: { refusal: computeClosureRefusal(checker, flow, instances, lacking, name, census), requirements: [] };
|
|
464
|
+
byKey.set(key, proof);
|
|
465
|
+
return proof;
|
|
466
|
+
};
|
|
467
|
+
const computeClosureRefusal = (checker, flow, instances, lacking, name, census) => {
|
|
468
|
+
const refuse = (reason, at) => (at ? { reason, at } : { reason });
|
|
469
|
+
/** The checker's type, or -- only where the checker says nothing -- the settled census's. */
|
|
470
|
+
const typeOf = (expression) => {
|
|
471
|
+
const own = checker.getTypeAtLocation(expression);
|
|
472
|
+
if (!census || (own.flags & (ts.TypeFlags.Any | ts.TypeFlags.Unknown)) === 0)
|
|
473
|
+
return own;
|
|
474
|
+
const settled = census.typeAt(expression);
|
|
475
|
+
return settled && (settled.flags & (ts.TypeFlags.Any | ts.TypeFlags.Unknown)) === 0 ? settled : own;
|
|
476
|
+
};
|
|
477
|
+
let keysAuthority;
|
|
478
|
+
const completeKeys = () => {
|
|
479
|
+
if (keysAuthority)
|
|
480
|
+
return keysAuthority;
|
|
481
|
+
const argumentsByFile = new Map();
|
|
482
|
+
keysAuthority = closedCallableAuthorityOf(checker, flow, typeOf, (owner) => {
|
|
483
|
+
const file = owner.getSourceFile();
|
|
484
|
+
let census = argumentsByFile.get(file);
|
|
485
|
+
if (!census)
|
|
486
|
+
argumentsByFile.set(file, (census = censusArgumentsObjects(checker, [file])));
|
|
487
|
+
return census.usesByOwner.get(owner);
|
|
488
|
+
});
|
|
489
|
+
return keysAuthority;
|
|
490
|
+
};
|
|
491
|
+
const family = new Set(instances.keys());
|
|
492
|
+
const ancestorsOf = new Map();
|
|
493
|
+
const ancestry = (member) => {
|
|
494
|
+
const known = ancestorsOf.get(member);
|
|
495
|
+
if (known)
|
|
496
|
+
return known;
|
|
497
|
+
const found = new Set();
|
|
498
|
+
const visit = (type) => {
|
|
499
|
+
const declared = heritageClassOrInterfaceOf(type);
|
|
500
|
+
for (const base of declared === null ? [] : checker.getBaseTypes(declared)) {
|
|
501
|
+
const declaration = instanceClassOf(base);
|
|
502
|
+
if (declaration && !found.has(declaration))
|
|
503
|
+
found.add(declaration);
|
|
504
|
+
visit(base);
|
|
505
|
+
}
|
|
506
|
+
};
|
|
507
|
+
visit(instances.get(member));
|
|
508
|
+
ancestorsOf.set(member, found);
|
|
509
|
+
return found;
|
|
510
|
+
};
|
|
511
|
+
const typeMayHold = (type, targets, depth = 0) => {
|
|
512
|
+
if (depth > 8 || (type.flags & (ts.TypeFlags.Any | ts.TypeFlags.Unknown)) !== 0)
|
|
513
|
+
return true;
|
|
514
|
+
if (type.isUnionOrIntersection())
|
|
515
|
+
return type.types.some((part) => typeMayHold(part, targets, depth + 1));
|
|
516
|
+
if ((type.flags & ts.TypeFlags.TypeParameter) !== 0) {
|
|
517
|
+
const constraint = checker.getBaseConstraintOfType(type);
|
|
518
|
+
return constraint === undefined || constraint === type ? true : typeMayHold(constraint, targets, depth + 1);
|
|
519
|
+
}
|
|
520
|
+
if ((type.flags & PRIMITIVE_FLAGS) !== 0)
|
|
521
|
+
return false;
|
|
522
|
+
if ((type.flags & (ts.TypeFlags.Object | ts.TypeFlags.NonPrimitive)) === 0)
|
|
523
|
+
return true;
|
|
524
|
+
const declaration = instanceClassOf(type);
|
|
525
|
+
if (declaration)
|
|
526
|
+
return [...targets].some((target) => target === declaration || ancestry(target).has(declaration));
|
|
527
|
+
return [...targets].some((target) => checker.isTypeAssignableTo(instances.get(target), type));
|
|
528
|
+
};
|
|
529
|
+
/**
|
|
530
|
+
* Whether every value `expression` can hold was allocated by something that
|
|
531
|
+
* is not a family constructor -- `const cache = {}` in three's
|
|
532
|
+
* `WebGLPrograms`/`WebGLShaderCache`, typed `{}` by the checker and so
|
|
533
|
+
* assignable-from every class. A literal is a fresh object; a `new` of a
|
|
534
|
+
* library constructor or of a source class outside the family (whose
|
|
535
|
+
* constructor provably returns its own `this`) is an instance of that class;
|
|
536
|
+
* an unwritten-elsewhere `const`/`let` holds only what its writes put there.
|
|
537
|
+
*/
|
|
538
|
+
const excludesFamily = (expression, active = new Set()) => {
|
|
539
|
+
let value = skipParentheses(expression);
|
|
540
|
+
while (ts.isAsExpression(value) || ts.isTypeAssertionExpression(value) || ts.isSatisfiesExpression(value))
|
|
541
|
+
value = skipParentheses(value.expression);
|
|
542
|
+
if (active.has(value))
|
|
543
|
+
return true;
|
|
544
|
+
active.add(value);
|
|
545
|
+
if (ts.isObjectLiteralExpression(value) ||
|
|
546
|
+
ts.isArrayLiteralExpression(value) ||
|
|
547
|
+
ts.isFunctionExpression(value) ||
|
|
548
|
+
ts.isArrowFunction(value) ||
|
|
549
|
+
ts.isRegularExpressionLiteral(value))
|
|
550
|
+
return true;
|
|
551
|
+
if (ts.isNewExpression(value)) {
|
|
552
|
+
const constructed = checker.getTypeAtLocation(value);
|
|
553
|
+
const declaration = instanceClassOf(constructed);
|
|
554
|
+
if (declaration) {
|
|
555
|
+
const instance = constructed.isClassOrInterface() ? constructed : null;
|
|
556
|
+
return (!family.has(declaration) &&
|
|
557
|
+
![...family].some((member) => ancestry(member).has(declaration)) &&
|
|
558
|
+
instance !== null &&
|
|
559
|
+
classConstructorKeepsInstanceOf(checker, flow, instance));
|
|
560
|
+
}
|
|
561
|
+
const callee = checker.getSymbolAtLocation(value.expression)?.valueDeclaration;
|
|
562
|
+
return callee !== undefined && callee.getSourceFile().isDeclarationFile && !typeMayHold(constructed, family);
|
|
563
|
+
}
|
|
564
|
+
if (ts.isPropertyAccessExpression(value))
|
|
565
|
+
return memberExcludesFamily(value.name.text, active);
|
|
566
|
+
if (!ts.isIdentifier(value))
|
|
567
|
+
return false;
|
|
568
|
+
const declaration = flow.targetOf(value)?.declaration;
|
|
569
|
+
if (!declaration || !ts.isVariableDeclaration(declaration))
|
|
570
|
+
return false;
|
|
571
|
+
const whole = flow.writesToDeclaration(declaration).filter((write) => write.slot === 'whole');
|
|
572
|
+
return (whole.length > 0 &&
|
|
573
|
+
whole.every((write) => (write.edge === 'declaration-initializer' || write.edge === 'identifier-assignment') &&
|
|
574
|
+
write.value !== null &&
|
|
575
|
+
excludesFamily(write.value, active)));
|
|
576
|
+
};
|
|
577
|
+
/**
|
|
578
|
+
* `excludesFamily` for a MEMBER slot: what can a slot of this name hold,
|
|
579
|
+
* anywhere in the program.
|
|
580
|
+
*
|
|
581
|
+
* The receiver is asked by NAME rather than by symbol because the receivers
|
|
582
|
+
* that reach here have none -- three's `data.arrayBuffers` is an expando on
|
|
583
|
+
* a `@param {Object} [data]`, so the checker declares no such member and
|
|
584
|
+
* `flow.targetOf` resolves nothing. A union over every object in the
|
|
585
|
+
* program is the sound over-approximation of "some object whose slot of
|
|
586
|
+
* this name is being written": it can only add values, so it can only make
|
|
587
|
+
* this proof refuse.
|
|
588
|
+
*
|
|
589
|
+
* For that union to be a superset, every way a slot can acquire a value has
|
|
590
|
+
* to be accounted for, and each one that cannot be enumerated is a refusal:
|
|
591
|
+
* an ACCESSOR is not a stored slot at all (its value is whatever the body
|
|
592
|
+
* returns, and no write records it); a REFLECTIVE mutator can create any
|
|
593
|
+
* name on any object; and a KEYED store whose key may spell this name is
|
|
594
|
+
* one more origin of it. What remains is the recorded writes, and every one
|
|
595
|
+
* of them must state a value that excludes the family.
|
|
596
|
+
*/
|
|
597
|
+
const memberExcludesFamily = (key, active) => {
|
|
598
|
+
// Which of the five sub-checks refused decides what to fix, and they are
|
|
599
|
+
// indistinguishable from the outside. See `originDebug`.
|
|
600
|
+
const tracing = originDebug !== undefined && (originDebug === '*' || originDebug.split(',').includes(key));
|
|
601
|
+
const traced = (reason, at) => {
|
|
602
|
+
if (tracing)
|
|
603
|
+
console.error(`[FAMILY-MEMBER-ORIGIN] ${key} ${reason}${at ? describeAt(at) : ''}`);
|
|
604
|
+
return false;
|
|
605
|
+
};
|
|
606
|
+
if (flow.hasComputedAccessorName)
|
|
607
|
+
return traced('computed-accessor-name-somewhere');
|
|
608
|
+
if (flow.accessorNames.has(key))
|
|
609
|
+
return traced('declared-by-an-accessor');
|
|
610
|
+
if (writes.reflectionMayCreate(key))
|
|
611
|
+
return traced('reflective-mutator-may-create');
|
|
612
|
+
// The same conjunction `mayHold` uses, and for the same reason: the
|
|
613
|
+
// checker's own answer settles most origins outright (`x.slice(0).buffer`
|
|
614
|
+
// is an `ArrayBufferLike`, and no class in the family is one), and only a
|
|
615
|
+
// value the checker cannot rule out needs its allocation traced. Asking
|
|
616
|
+
// `excludesFamily` alone would refuse every host-typed value, because a
|
|
617
|
+
// member no source file writes has no origin to enumerate.
|
|
618
|
+
const cannotBeFamily = (value) => value !== null && (!typeMayHold(typeOf(value), family) || excludesFamily(value, active));
|
|
619
|
+
for (const keyed of writes.keyedWritesNaming(key)) {
|
|
620
|
+
// `keyedWritesNaming` answers from `property-key-domain.ts`'s coarser,
|
|
621
|
+
// forever-cached "may name" proof; `computed-key-set.ts` can PROVE a
|
|
622
|
+
// finite key set for the same expression (a `for (const k in values)`
|
|
623
|
+
// loop closed over an options literal, three's `Texture`/`Material`
|
|
624
|
+
// `setValues`) and rule this one write out even where that coarser
|
|
625
|
+
// proof would not. Asked fresh on every call -- never folded into that
|
|
626
|
+
// cache -- so the intrinsic requirement it raises lands in whichever
|
|
627
|
+
// capture `closureRefusalOf` has open right now, not a stale one from
|
|
628
|
+
// an earlier round or a different family.
|
|
629
|
+
const keyExpression = elementAccessKeyOf(keyed);
|
|
630
|
+
if (keyExpression && keyProvenToExclude(checker, flow, keyExpression, key, completeKeys()))
|
|
631
|
+
continue;
|
|
632
|
+
if (!cannotBeFamily(keyed.value))
|
|
633
|
+
return traced('keyed-write-may-create', keyed.site);
|
|
634
|
+
}
|
|
635
|
+
const origins = writes.namedOrigins.get(key) ?? [];
|
|
636
|
+
if (origins.length === 0)
|
|
637
|
+
return traced('no-origin');
|
|
638
|
+
for (const write of origins)
|
|
639
|
+
if (!cannotBeFamily(write.value))
|
|
640
|
+
return traced('origin-unproven', write.site);
|
|
641
|
+
return true;
|
|
642
|
+
};
|
|
643
|
+
const mayHold = (expression, targets) => expression === null || (targets.size > 0 && typeMayHold(typeOf(expression), targets) && !excludesFamily(expression));
|
|
644
|
+
/** A key typed purely number/symbol can never spell an identifier-shaped `name` (numeric names are refused up front). */
|
|
645
|
+
const keyCannotName = (key) => {
|
|
646
|
+
const type = typeOf(key);
|
|
647
|
+
const parts = type.isUnion() ? type.types : [type];
|
|
648
|
+
const typed = parts.every((part) => (part.flags & (ts.TypeFlags.Any | ts.TypeFlags.Unknown)) === 0 &&
|
|
649
|
+
(part.flags & (ts.TypeFlags.NumberLike | ts.TypeFlags.ESSymbolLike)) !== 0);
|
|
650
|
+
if (typed || !writes.keys.mayName(writes.keys.of(key), name))
|
|
651
|
+
return true;
|
|
652
|
+
return keyProvenToExclude(checker, flow, key, name, completeKeys());
|
|
653
|
+
};
|
|
654
|
+
const writes = writeInventoryOf(checker, flow);
|
|
655
|
+
if (writes.reflectiveAlias)
|
|
656
|
+
return refuse('reflective-mutator-escapes', writes.reflectiveAlias);
|
|
657
|
+
// `GEA_FAMILY_MEMBER_DEBUG_ALL=<name|*>` (or the newer `GEA_MEMBER_READ_DEBUG`,
|
|
658
|
+
// see its own comment) lists EVERY store that blocks the family rather than
|
|
659
|
+
// stopping at the first -- which one to discharge next. Without it the scan
|
|
660
|
+
// still returns at the first refusal. The two write scans below AND the
|
|
661
|
+
// reflective-call scan after them all feed the same `blocking` array, so a
|
|
662
|
+
// member blocked by e.g. one keyed write and one `Reflect.set` reports both
|
|
663
|
+
// in one run instead of needing a re-run per fix.
|
|
664
|
+
const listing = (debugAllName !== undefined && (debugAllName === '*' || debugAllName === name)) || memberReadWatching(name);
|
|
665
|
+
const blocking = [];
|
|
666
|
+
const blocked = (reason, at) => {
|
|
667
|
+
const refusal = refuse(reason, at);
|
|
668
|
+
if (!listing)
|
|
669
|
+
return refusal;
|
|
670
|
+
blocking.push(refusal);
|
|
671
|
+
return null;
|
|
672
|
+
};
|
|
673
|
+
// A MEASUREMENT ARM, and DELIBERATELY UNSOUND -- never a fix.
|
|
674
|
+
// `GEA_FAMILY_MEMBER_FORCE_ABSENT=<name>[,<name>...]` (or `*`) skips the
|
|
675
|
+
// blocking write scan for those member names, granting the absence proof as
|
|
676
|
+
// if every store had been discharged. It exists because this proof sits at
|
|
677
|
+
// the head of a long causal chain -- `isFogExp2` alone decides whether
|
|
678
|
+
// three's `WebGLPrograms` parameters record has a boxed field, which decides
|
|
679
|
+
// whether the program cache key is built at all -- and the only honest way
|
|
680
|
+
// to price a discharge before writing it is to grant it and measure what
|
|
681
|
+
// moves. Anything it makes green is a claim about the chain, never about the
|
|
682
|
+
// program being correct.
|
|
683
|
+
const forcedAbsent = process.env['GEA_FAMILY_MEMBER_FORCE_ABSENT'];
|
|
684
|
+
const forced = forcedAbsent !== undefined && (forcedAbsent === '*' || forcedAbsent.split(',').includes(name));
|
|
685
|
+
if (!forced) {
|
|
686
|
+
for (const write of writes.memberWrites.get(name) ?? []) {
|
|
687
|
+
const refusal = mayHold(write.naming, lacking) ? blocked('expando-write', write.site) : null;
|
|
688
|
+
if (refusal)
|
|
689
|
+
return refusal;
|
|
690
|
+
}
|
|
691
|
+
for (const write of writes.memberWrites.get('__proto__') ?? []) {
|
|
692
|
+
const refusal = mayHold(write.naming, family) ? blocked('prototype-write', write.site) : null;
|
|
693
|
+
if (refusal)
|
|
694
|
+
return refusal;
|
|
695
|
+
}
|
|
696
|
+
for (const write of writes.keyedWrites) {
|
|
697
|
+
const receiver = write.naming;
|
|
698
|
+
const access = receiver?.parent;
|
|
699
|
+
if (!receiver || !access || !ts.isElementAccessExpression(access) || access.expression !== receiver) {
|
|
700
|
+
const refusal = mayHold(receiver ?? null, lacking) ? blocked('keyed-write-unattributed', write.site) : null;
|
|
701
|
+
if (refusal)
|
|
702
|
+
return refusal;
|
|
703
|
+
continue;
|
|
704
|
+
}
|
|
705
|
+
if (keyCannotName(access.argumentExpression))
|
|
706
|
+
continue;
|
|
707
|
+
if (!mayHold(receiver, lacking))
|
|
708
|
+
continue;
|
|
709
|
+
if (guardedAbsentKeyStore(checker, write, access))
|
|
710
|
+
continue;
|
|
711
|
+
const refusal = blocked('keyed-write', write.site);
|
|
712
|
+
if (refusal)
|
|
713
|
+
return refusal;
|
|
714
|
+
}
|
|
715
|
+
}
|
|
716
|
+
/** Whether an `Object.assign` source or `defineProperties` map can carry `name`: only a spread-free literal says it cannot. */
|
|
717
|
+
const literalMayName = (expression) => {
|
|
718
|
+
const literal = expression && skipParentheses(expression);
|
|
719
|
+
if (!literal || !ts.isObjectLiteralExpression(literal))
|
|
720
|
+
return true;
|
|
721
|
+
return literal.properties.some((property) => {
|
|
722
|
+
if (ts.isSpreadAssignment(property))
|
|
723
|
+
return true;
|
|
724
|
+
const key = property.name;
|
|
725
|
+
if (!key)
|
|
726
|
+
return true;
|
|
727
|
+
if (ts.isComputedPropertyName(key))
|
|
728
|
+
return writes.keys.mayName(writes.keys.of(key.expression), name);
|
|
729
|
+
if (ts.isIdentifier(key) || ts.isStringLiteralLike(key) || ts.isNumericLiteral(key)) {
|
|
730
|
+
// `{ __proto__: v }` sets the literal's own prototype, never an own key.
|
|
731
|
+
if (ts.isPropertyAssignment(property) && key.text === '__proto__' && !ts.isStringLiteralLike(key))
|
|
732
|
+
return false;
|
|
733
|
+
return key.text === name;
|
|
734
|
+
}
|
|
735
|
+
return true;
|
|
736
|
+
});
|
|
737
|
+
};
|
|
738
|
+
const keyMayName = (expression) => expression === undefined || ts.isSpreadElement(expression) || writes.keys.mayName(writes.keys.of(expression), name);
|
|
739
|
+
for (const { call, method } of writes.reflectiveCalls) {
|
|
740
|
+
const args = call.arguments;
|
|
741
|
+
// A spread hides which argument is the target and which the key, so the
|
|
742
|
+
// rest of this call's checks below (which index into `args` positionally)
|
|
743
|
+
// cannot run meaningfully -- move to the next call even while listing.
|
|
744
|
+
if (args.some(ts.isSpreadElement)) {
|
|
745
|
+
const refusal = blocked('reflective-spread-arguments', call);
|
|
746
|
+
if (refusal)
|
|
747
|
+
return refusal;
|
|
748
|
+
continue;
|
|
749
|
+
}
|
|
750
|
+
const target = args[0] && !ts.isSpreadElement(args[0]) ? args[0] : null;
|
|
751
|
+
const owner = skipParentheses(call.expression);
|
|
752
|
+
const isReflect = isStandardGlobalValue(checker, owner.expression, 'Reflect');
|
|
753
|
+
if (method === 'setPrototypeOf') {
|
|
754
|
+
if (mayHold(target, family)) {
|
|
755
|
+
const refusal = blocked('prototype-replaced', call);
|
|
756
|
+
if (refusal)
|
|
757
|
+
return refusal;
|
|
758
|
+
}
|
|
759
|
+
continue;
|
|
760
|
+
}
|
|
761
|
+
if (method === 'assign' && !isReflect) {
|
|
762
|
+
if (mayHold(target, lacking) && args.slice(1).some((source) => literalMayName(source))) {
|
|
763
|
+
const refusal = blocked('object-assign', call);
|
|
764
|
+
if (refusal)
|
|
765
|
+
return refusal;
|
|
766
|
+
}
|
|
767
|
+
continue;
|
|
768
|
+
}
|
|
769
|
+
if (method === 'defineProperties') {
|
|
770
|
+
if (mayHold(target, lacking) && literalMayName(args[1])) {
|
|
771
|
+
const refusal = blocked('define-properties', call);
|
|
772
|
+
if (refusal)
|
|
773
|
+
return refusal;
|
|
774
|
+
}
|
|
775
|
+
continue;
|
|
776
|
+
}
|
|
777
|
+
// `defineProperty` (either owner) and `Reflect.set`, whose optional
|
|
778
|
+
// fourth argument is the receiver a data property is created on.
|
|
779
|
+
const receivers = method === 'set' && isReflect && args[3] ? [target, args[3]] : [target];
|
|
780
|
+
if (receivers.some((receiver) => mayHold(receiver, lacking)) && keyMayName(args[1])) {
|
|
781
|
+
const refusal = blocked(`reflective-${method}`, call);
|
|
782
|
+
if (refusal)
|
|
783
|
+
return refusal;
|
|
784
|
+
}
|
|
785
|
+
}
|
|
786
|
+
if (blocking.length > 0) {
|
|
787
|
+
const clauses = new Map();
|
|
788
|
+
for (const { reason } of blocking)
|
|
789
|
+
clauses.set(reason, (clauses.get(reason) ?? 0) + 1);
|
|
790
|
+
for (const { reason, at } of blocking)
|
|
791
|
+
console.error(`[FAMILY-MEMBER-BLOCK] ${name} ${reason}${describeAt(at)}`);
|
|
792
|
+
if (memberReadWatching(name))
|
|
793
|
+
console.error(`[MEMBER-READ-SUMMARY] ${name} refused=${blocking.length} clauses=${[...clauses].map(([clause, count]) => `${clause}:${count}`).join(',')}`);
|
|
794
|
+
return blocking[0];
|
|
795
|
+
}
|
|
796
|
+
return null;
|
|
797
|
+
};
|
|
798
|
+
/**
|
|
799
|
+
* Whether `type` is a plain, closed record shape -- an object literal's type,
|
|
800
|
+
* or the same shape after the parameter census widens an assigned value --
|
|
801
|
+
* with no index signature and no call/construct signature: `_emptyScene` in
|
|
802
|
+
* three's `WebGLRenderer` (`{ background: null, fog: null, environment: null,
|
|
803
|
+
* overrideMaterial: null, isScene: true }`), assigned into a parameter cell
|
|
804
|
+
* right beside real class instances as a sentinel default. It is never a
|
|
805
|
+
* class or a declared interface (no constructor, no prototype chain to
|
|
806
|
+
* enumerate) and never open-ended (no index signature lets an unrelated key
|
|
807
|
+
* appear, no call signature makes it a callable with its own dispatch), so
|
|
808
|
+
* its OWN declared members are the complete, closed answer for anything read
|
|
809
|
+
* off it -- unlike a source class, which needs the whole closure proof below
|
|
810
|
+
* to rule out an expando or a subclass.
|
|
811
|
+
*
|
|
812
|
+
* Deliberately NOT gated on `ObjectFlags.ObjectLiteral`: the census's own
|
|
813
|
+
* write-join widens an assigned literal's type (`writeSetTypeOf`/`widestOf`)
|
|
814
|
+
* before this module ever sees it, which measurably drops that flag while
|
|
815
|
+
* leaving the shape -- no index signature, no call surface, not a class --
|
|
816
|
+
* exactly as closed as the literal it came from.
|
|
817
|
+
*/
|
|
818
|
+
const isClosedRecordType = (checker, type) => {
|
|
819
|
+
if ((type.flags & ts.TypeFlags.Object) === 0)
|
|
820
|
+
return false;
|
|
821
|
+
if (type.isClassOrInterface())
|
|
822
|
+
return false;
|
|
823
|
+
if (instanceClassOf(type) !== null)
|
|
824
|
+
return false;
|
|
825
|
+
if (checker.getIndexInfosOfType(type).length > 0)
|
|
826
|
+
return false;
|
|
827
|
+
if (checker.getSignaturesOfType(type, ts.SignatureKind.Call).length > 0)
|
|
828
|
+
return false;
|
|
829
|
+
if (checker.getSignaturesOfType(type, ts.SignatureKind.Construct).length > 0)
|
|
830
|
+
return false;
|
|
831
|
+
return true;
|
|
832
|
+
};
|
|
833
|
+
/**
|
|
834
|
+
* `receiver.name` read off ONE closed object-literal union member -- `null`
|
|
835
|
+
* when this member cannot be trusted as a plain carrier (the property is
|
|
836
|
+
* itself unusable evidence, or -- because JavaScript reads an absent
|
|
837
|
+
* property as `undefined`, and this module has no write-safety proof for a
|
|
838
|
+
* receiver that is not a `SourceClass` -- the literal simply lacks `name`,
|
|
839
|
+
* which `memberWrites`/`keyedWrites`/reflective-mutator scans below are never
|
|
840
|
+
* asked about a bare literal type). A literal missing the member therefore
|
|
841
|
+
* refuses the WHOLE split (see the caller), exactly as a class whose carrier
|
|
842
|
+
* is unusable does.
|
|
843
|
+
*/
|
|
844
|
+
const literalMemberCarrierOf = (checker, type, name) => {
|
|
845
|
+
const member = checker.getPropertyOfType(type, name);
|
|
846
|
+
if (!member?.valueDeclaration)
|
|
847
|
+
return null;
|
|
848
|
+
const memberType = checker.getTypeOfSymbolAtLocation(member, member.valueDeclaration);
|
|
849
|
+
if (isUnusableEvidence(memberType) || (memberType.flags & ts.TypeFlags.Unknown) !== 0 || carriesTypeParameter(memberType))
|
|
850
|
+
return null;
|
|
851
|
+
return memberType;
|
|
852
|
+
};
|
|
853
|
+
/**
|
|
854
|
+
* The type of `receiver.name` when some class the receiver can hold does not
|
|
855
|
+
* declare `name` -- see this module's header. `null` whenever the checker
|
|
856
|
+
* already answers, the receiver is not a union of source class instances,
|
|
857
|
+
* or any closure proof fails.
|
|
858
|
+
*/
|
|
859
|
+
export const classFamilyMemberReadTypeOf = (checker, flow, receiver, name, census) => {
|
|
860
|
+
// The measurement arm, kept runnable the way `GEA_BAG_OFF` is.
|
|
861
|
+
if (process.env['GEA_FAMILY_MEMBER_OFF'])
|
|
862
|
+
return null;
|
|
863
|
+
if (objectPrototypeMemberNames.has(name) || name === '__proto__' || String(Number(name)) === name)
|
|
864
|
+
return null;
|
|
865
|
+
const wholeReceiver = checker.getNonNullableType(receiver);
|
|
866
|
+
const watching = debugName !== undefined && (debugName === '*' || debugName === name);
|
|
867
|
+
const refuse = (reason, at) => {
|
|
868
|
+
if (watching)
|
|
869
|
+
console.error(`[FAMILY-MEMBER] ${checker.typeToString(wholeReceiver)}.${name} ${reason}${describeAt(at)}`);
|
|
870
|
+
return null;
|
|
871
|
+
};
|
|
872
|
+
const union = checker.getUnionType;
|
|
873
|
+
// A receiver flowing through a guarded reassignment -- three's `if (
|
|
874
|
+
// scene.isScene !== true ) scene = _emptyScene` -- holds a union of real
|
|
875
|
+
// class instances AND a sentinel object literal. `familyRootsOf` (below,
|
|
876
|
+
// through `sourceClassKeyReadPlanOf`) can only enumerate a CLASS family; a
|
|
877
|
+
// bare literal in the same union is neither a family member nor an
|
|
878
|
+
// ancestor, so asking it the class question for the WHOLE union refuses
|
|
879
|
+
// outright. Splitting the literal member(s) out first and reading each
|
|
880
|
+
// one's OWN declared member directly is what keeps the class machinery
|
|
881
|
+
// answerable for the rest -- see `isClosedRecordType`'s header.
|
|
882
|
+
const parts = wholeReceiver.isUnion() ? wholeReceiver.types : [wholeReceiver];
|
|
883
|
+
const literalParts = parts.filter((part) => isClosedRecordType(checker, part));
|
|
884
|
+
const classParts = parts.filter((part) => !isClosedRecordType(checker, part));
|
|
885
|
+
let literalCarriers = null;
|
|
886
|
+
if (literalParts.length > 0 && union) {
|
|
887
|
+
const resolved = literalParts.map((part) => literalMemberCarrierOf(checker, part, name));
|
|
888
|
+
if (resolved.every((carrier) => carrier !== null))
|
|
889
|
+
literalCarriers = resolved;
|
|
890
|
+
}
|
|
891
|
+
// Nothing to split, or the split could not be trusted end to end: fall
|
|
892
|
+
// through exactly as before, over the WHOLE receiver, so a program with no
|
|
893
|
+
// literal-sentinel arm is untouched and a disqualified one still refuses.
|
|
894
|
+
const present = literalCarriers && classParts.length < parts.length ? (classParts.length > 0 ? union.call(checker, classParts) : null) : wholeReceiver;
|
|
895
|
+
if (present === null) {
|
|
896
|
+
// Every union member was a closed literal -- there is no class family to
|
|
897
|
+
// ask at all, and the literals' own members are the whole answer.
|
|
898
|
+
return literalCarriers && literalCarriers.length > 0 ? union.call(checker, literalCarriers) : refuse('no-declarer');
|
|
899
|
+
}
|
|
900
|
+
const ledger = deferredIntrinsicProtocolLedgerOf(flow);
|
|
901
|
+
if (!ledger)
|
|
902
|
+
return refuse('no-intrinsic-ledger');
|
|
903
|
+
const { value: plan, requirements } = ledger.capture(() => sourceClassKeyReadPlanOf(checker, flow, { kind: 'declared', receiver: present }, name));
|
|
904
|
+
if (!plan)
|
|
905
|
+
return refuse('no-key-read-plan');
|
|
906
|
+
if (!plan.codeFree)
|
|
907
|
+
return refuse('member-runs-code');
|
|
908
|
+
if (plan.carriers.length === 0)
|
|
909
|
+
return refuse('no-declarer');
|
|
910
|
+
// See "The Object obligation": an absent class's `undefined` rests on
|
|
911
|
+
// Object.prototype lacking exactly this key. It is admitted by default when
|
|
912
|
+
// every Object obligation the plan published is that per-key question; a
|
|
913
|
+
// whole-prototype obligation fails under any key write the census cannot
|
|
914
|
+
// attribute, so an answer resting on one is still refused.
|
|
915
|
+
// GEA_FAMILY_MEMBER_ABSENT_KEYS is a kill switch: `0` refuses, `1` admits.
|
|
916
|
+
// The installed hosts can state the `0` refusal for every build that loads
|
|
917
|
+
// them (`ledger.refusesObjectPrototypeAbsenceProofs`); `=1` exists for tests
|
|
918
|
+
// of the proof itself and does not override a host's statement.
|
|
919
|
+
const absentKeys = process.env['GEA_FAMILY_MEMBER_ABSENT_KEYS'];
|
|
920
|
+
if (plan.needsDefaultPrototype &&
|
|
921
|
+
(ledger.refusesObjectPrototypeAbsenceProofs ||
|
|
922
|
+
(absentKeys !== '1' &&
|
|
923
|
+
(absentKeys === '0' ||
|
|
924
|
+
requirements.some(isWholeObjectPrototypeRequirement) ||
|
|
925
|
+
!requirements.some((requirement) => objectPrototypeLacksKeyRequirement(requirement, name))))))
|
|
926
|
+
return refuse('absent-class-needs-object-prototype');
|
|
927
|
+
const carriers = [];
|
|
928
|
+
for (const { owner, type } of plan.carriers) {
|
|
929
|
+
if (isUnusableEvidence(type) ||
|
|
930
|
+
(type.flags & ts.TypeFlags.Unknown) !== 0 ||
|
|
931
|
+
annotationStatesNothing(checker, owner, type) ||
|
|
932
|
+
carriesTypeParameter(type))
|
|
933
|
+
return refuse('declarer-carrier-unknown', owner);
|
|
934
|
+
carriers.push(type);
|
|
935
|
+
}
|
|
936
|
+
const instances = new Map();
|
|
937
|
+
const lacking = new Set();
|
|
938
|
+
for (const [owner, verdict] of plan.classes) {
|
|
939
|
+
const symbol = owner.name ? checker.getSymbolAtLocation(owner.name) : checker.getTypeAtLocation(owner).getSymbol();
|
|
940
|
+
const type = symbol && checker.getDeclaredTypeOfSymbol(symbol);
|
|
941
|
+
if (!type?.isClassOrInterface())
|
|
942
|
+
return refuse('family-member-untyped', owner);
|
|
943
|
+
instances.set(owner, type);
|
|
944
|
+
if (verdict === 'absent')
|
|
945
|
+
lacking.add(owner);
|
|
946
|
+
}
|
|
947
|
+
const closure = closureRefusalOf(checker, flow, instances, lacking, name, census ?? null);
|
|
948
|
+
// The Object obligation this read would have recorded, independent of
|
|
949
|
+
// whether the closure proof itself refused: `plan.needsDefaultPrototype`
|
|
950
|
+
// and the requirement counts are settled ONE layer above `computeClosureRefusal`
|
|
951
|
+
// (in `plan`, from `sourceClassKeyReadPlanOf`, before the closure proof is
|
|
952
|
+
// even asked), so the closure proof itself has no way to report them --
|
|
953
|
+
// they have to be printed here, at the only point that holds both.
|
|
954
|
+
if (memberReadWatching(name))
|
|
955
|
+
console.error(`[MEMBER-READ-OBLIGATION] ${name} needs-default-prototype=${plan.needsDefaultPrototype} plan-requirements=${requirements.length} closure-requirements=${closure.requirements.length} closure-refused=${closure.refusal !== null}`);
|
|
956
|
+
if (closure.refusal)
|
|
957
|
+
return refuse(closure.refusal.reason, closure.refusal.at);
|
|
958
|
+
if (!union)
|
|
959
|
+
return null;
|
|
960
|
+
publish(ledger, closure.requirements.length > 0 ? [...requirements, ...closure.requirements] : requirements);
|
|
961
|
+
const familyCarriers = plan.needsDefaultPrototype ? [...carriers, checker.getUndefinedType()] : carriers;
|
|
962
|
+
return union.call(checker, literalCarriers ? [...familyCarriers, ...literalCarriers] : familyCarriers);
|
|
963
|
+
};
|
|
964
|
+
const isWholeObjectPrototypeRequirement = (requirement) => requirement.intrinsic === 'Object' && requirement.member === undefined && requirement.prototypeKeys === undefined;
|
|
965
|
+
/** The per-key question an absent class's `undefined` rests on: Object.prototype lacks `name`. */
|
|
966
|
+
const objectPrototypeLacksKeyRequirement = (requirement, name) => requirement.intrinsic === 'Object' && requirement.member === undefined && requirement.prototypeKeys?.names?.includes(name) === true;
|
|
967
|
+
const LEDGER_SCOPE = 'class-family-member-read';
|
|
968
|
+
const published = new WeakMap();
|
|
969
|
+
/** Keep a surviving answer's intrinsic obligations -- see "The Object obligation". */
|
|
970
|
+
const publish = (ledger, requirements) => {
|
|
971
|
+
if (requirements.length === 0)
|
|
972
|
+
return;
|
|
973
|
+
// A parameter inference that asked for this read depends on it too.
|
|
974
|
+
ledger.include(requirements);
|
|
975
|
+
let held = published.get(ledger);
|
|
976
|
+
if (!held)
|
|
977
|
+
published.set(ledger, (held = { all: [], seen: new Map() }));
|
|
978
|
+
let added = false;
|
|
979
|
+
for (const requirement of requirements) {
|
|
980
|
+
let kinds = held.seen.get(requirement.location);
|
|
981
|
+
if (!kinds)
|
|
982
|
+
held.seen.set(requirement.location, (kinds = new Set()));
|
|
983
|
+
const kind = `${requirement.intrinsic}.${intrinsicProtocolRequirementKind(requirement) ?? ''}`;
|
|
984
|
+
if (kinds.has(kind))
|
|
985
|
+
continue;
|
|
986
|
+
kinds.add(kind);
|
|
987
|
+
held.all.push(requirement);
|
|
988
|
+
added = true;
|
|
989
|
+
}
|
|
990
|
+
if (added)
|
|
991
|
+
ledger.replace(LEDGER_SCOPE, held.all);
|
|
992
|
+
};
|