@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,838 @@
|
|
|
1
|
+
import ts from 'typescript';
|
|
2
|
+
import { isClassSpelledSourceClass, isConstructorFunction } from './model.js';
|
|
3
|
+
import { ownedClassReceiverInventoryOf } from './owned-class-receivers.js';
|
|
4
|
+
import { isSourceInstanceMethod } from './source-prototype-method-identity.js';
|
|
5
|
+
import { deferredIntrinsicProtocolLedgerOf } from '../deferred-intrinsic-protocols.js';
|
|
6
|
+
import { objectPrototypeMemberNames } from '../../../representation/record-fields.js';
|
|
7
|
+
import { accessorPassthroughAliasOf } from '../structural-declarations.js';
|
|
8
|
+
import { isGlobalObjectConstructor, isStandardGlobalValue, isUnusableEvidence } from '../derived-expression-type.js';
|
|
9
|
+
import { unwrapNaming } from './targets.js';
|
|
10
|
+
/**
|
|
11
|
+
* The declaration-only spelling `define-property-source-transform.ts` emits for
|
|
12
|
+
* a `this`-receiver `Object.defineProperties` data descriptor: a bare
|
|
13
|
+
* `/** @type {...} *\/ this.key;` access standing as its own statement.
|
|
14
|
+
*
|
|
15
|
+
* It is the DECLARATION of a data member and executes nothing -- the property
|
|
16
|
+
* is created by the definition call the transform keeps beside it, with that
|
|
17
|
+
* call's own attributes. TypeScript's JS class inference reads it as a member
|
|
18
|
+
* declaration and hands it back as the property's declaration node, so a proof
|
|
19
|
+
* that accepts `this.key = value` and refuses this one is refusing the same
|
|
20
|
+
* fact written in the spelling this compiler itself chose. Three's `LOD`
|
|
21
|
+
* declares `levels` that way, and reading it was the terminal of 35 escapes.
|
|
22
|
+
*/
|
|
23
|
+
export const declaredDataMemberAccess = (declaration) => (ts.isPropertyAccessExpression(declaration) || ts.isElementAccessExpression(declaration)) &&
|
|
24
|
+
ts.isExpressionStatement(declaration.parent) &&
|
|
25
|
+
declaration.parent.expression === declaration;
|
|
26
|
+
/** A source member declaration that creates a plain data property. */
|
|
27
|
+
const isSourceDataDeclaration = (declaration) => !declaration.getSourceFile().isDeclarationFile &&
|
|
28
|
+
(ts.isPropertyDeclaration(declaration) ||
|
|
29
|
+
ts.isParameterPropertyDeclaration(declaration, declaration.parent) ||
|
|
30
|
+
declaredDataMemberAccess(declaration) ||
|
|
31
|
+
(ts.isBinaryExpression(declaration) &&
|
|
32
|
+
declaration.operatorToken.kind === ts.SyntaxKind.EqualsToken &&
|
|
33
|
+
(ts.isPropertyAccessExpression(declaration.left) || ts.isElementAccessExpression(declaration.left))));
|
|
34
|
+
const carriesTypeParameter = (type) => (type.flags & ts.TypeFlags.TypeParameter) !== 0 || (type.isUnionOrIntersection() && type.types.some(carriesTypeParameter));
|
|
35
|
+
/**
|
|
36
|
+
* The plain data member a get/set accessor PAIR does nothing but forward to,
|
|
37
|
+
* on one particular owner class -- or `null` when this owner does not prove
|
|
38
|
+
* it. `isSourceDataDeclaration` above is right to refuse an accessor by
|
|
39
|
+
* itself: an accessor runs code, and its own declaration says nothing about
|
|
40
|
+
* what that code does. This asks the narrower, additional question of
|
|
41
|
+
* whether the code it runs is PROVABLY nothing but forwarding to a real data
|
|
42
|
+
* member, so that a read through the accessor can be answered from the same
|
|
43
|
+
* authority that answers for the member it forwards to -- three's
|
|
44
|
+
* `Texture.image` (`get image() { return this.source.data } set image(v) {
|
|
45
|
+
* this.source.data = v }`) is the motivating case: every read of it across
|
|
46
|
+
* `WebGLTextures.js` is a `Source.data` read wearing a different name.
|
|
47
|
+
*
|
|
48
|
+
* Every one of these must hold, on THIS owner, for the answer to be anything
|
|
49
|
+
* but `null`:
|
|
50
|
+
*
|
|
51
|
+
* - the pair is syntactically a passthrough of one access, both halves
|
|
52
|
+
* agreeing (`accessorPassthroughAliasOf`, `structural-declarations.ts`);
|
|
53
|
+
* - the receiver the access reads off -- `this` itself, or `this.<field>` --
|
|
54
|
+
* resolves on this owner's declared type to a class-or-interface type, so
|
|
55
|
+
* there really is a further object to ask;
|
|
56
|
+
* - the member the access names on THAT type is itself proven a plain data
|
|
57
|
+
* declaration by `isSourceDataDeclaration` -- the SAME guard, asked again,
|
|
58
|
+
* never a looser one, so a target that is itself an accessor (a chain of
|
|
59
|
+
* proxies) refuses rather than being assumed transparent;
|
|
60
|
+
* - the target's own checker type is not vacuous (`any`, `unknown`, or an
|
|
61
|
+
* unsubstituted type parameter) -- an alias to nothing is not evidence.
|
|
62
|
+
*
|
|
63
|
+
* Callers enumerate the outer owner's family. A forwarded receiver field
|
|
64
|
+
* has its own family, which must also exclude accessor overrides.
|
|
65
|
+
*/
|
|
66
|
+
const accessorPassthroughDataMemberOf = (checker, flow, owner, member) => {
|
|
67
|
+
const declarations = member.declarations ?? [];
|
|
68
|
+
if (declarations.length !== 2)
|
|
69
|
+
return null;
|
|
70
|
+
const getter = declarations.find(ts.isGetAccessorDeclaration);
|
|
71
|
+
const setter = declarations.find(ts.isSetAccessorDeclaration);
|
|
72
|
+
if (!getter || !setter)
|
|
73
|
+
return null;
|
|
74
|
+
const alias = accessorPassthroughAliasOf(getter, setter);
|
|
75
|
+
if (!alias)
|
|
76
|
+
return null;
|
|
77
|
+
let receiverType;
|
|
78
|
+
if (alias.receiverField === null)
|
|
79
|
+
receiverType = owner;
|
|
80
|
+
else {
|
|
81
|
+
const receiverSymbol = checker.getPropertyOfType(owner, alias.receiverField);
|
|
82
|
+
if (!receiverSymbol?.declarations?.length || !receiverSymbol.declarations.every(isSourceDataDeclaration))
|
|
83
|
+
return null;
|
|
84
|
+
const receiverDeclaration = receiverSymbol.valueDeclaration ?? receiverSymbol.declarations?.[0];
|
|
85
|
+
if (!receiverDeclaration)
|
|
86
|
+
return null;
|
|
87
|
+
receiverType = checker.getTypeOfSymbolAtLocation(receiverSymbol, receiverDeclaration);
|
|
88
|
+
}
|
|
89
|
+
if (!receiverType.isClassOrInterface())
|
|
90
|
+
return null;
|
|
91
|
+
const target = checker.getPropertyOfType(receiverType, alias.key);
|
|
92
|
+
if (!target?.declarations?.length || !target.declarations.every(isSourceDataDeclaration))
|
|
93
|
+
return null;
|
|
94
|
+
if (alias.receiverField !== null) {
|
|
95
|
+
// The outer owner's family does not establish the nested receiver's
|
|
96
|
+
// family. A Source subclass may replace data with an accessor too.
|
|
97
|
+
const source = receiverType.getSymbol()?.valueDeclaration;
|
|
98
|
+
if (!source || (!ts.isClassDeclaration(source) && !ts.isClassExpression(source)))
|
|
99
|
+
return null;
|
|
100
|
+
const inventory = ownedClassReceiverInventoryOf(checker, flow, new Set([source]));
|
|
101
|
+
if (!inventory)
|
|
102
|
+
return null;
|
|
103
|
+
for (const candidate of inventory.classes) {
|
|
104
|
+
const type = declaredClassTypeOf(checker, candidate);
|
|
105
|
+
const member = type && checker.getPropertyOfType(type, alias.key);
|
|
106
|
+
if (!member?.declarations?.length || !member.declarations.every(isSourceDataDeclaration))
|
|
107
|
+
return null;
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
const targetDeclaration = target.valueDeclaration ?? target.declarations[0];
|
|
111
|
+
const targetType = checker.getTypeOfSymbolAtLocation(target, targetDeclaration);
|
|
112
|
+
if (isUnusableEvidence(targetType) || (targetType.flags & ts.TypeFlags.Unknown) !== 0 || carriesTypeParameter(targetType))
|
|
113
|
+
return null;
|
|
114
|
+
return { declaration: targetDeclaration, type: targetType };
|
|
115
|
+
};
|
|
116
|
+
/**
|
|
117
|
+
* `this`/`super`, or a local binding that is provably nothing else: its only
|
|
118
|
+
* whole-slot write is its own initializer, and that initializer is `this`/
|
|
119
|
+
* `super`. TypeScript's own JS constructor-function member inference scans
|
|
120
|
+
* only a LITERAL `this.<name> = ...`; three's `WebGLRenderer` instead writes
|
|
121
|
+
* most of its instance data through exactly this alias, often from inside a
|
|
122
|
+
* nested helper (`WebGLRenderer.js`: `const _this = this; ... function
|
|
123
|
+
* initGLContext() { ... _this.shadowMap = shadowMap; ... }`). The checker's
|
|
124
|
+
* inferred type for `WebGLRenderer` then has no `shadowMap` member at all --
|
|
125
|
+
* not a wrong answer, an absent one, because the checker never looked. The
|
|
126
|
+
* value-flow index already proves an alias like this exact for other
|
|
127
|
+
* purposes (`callable-reach.ts`'s `thisFamilyAt`, walking straight through
|
|
128
|
+
* `const _this = this`); a member-declaration authority that recognises only
|
|
129
|
+
* the bare keyword was refusing a fact the flow graph had already settled.
|
|
130
|
+
*/
|
|
131
|
+
const thisReceiverOf = (flow, expression) => {
|
|
132
|
+
const value = unwrapNaming(expression);
|
|
133
|
+
if (value.kind === ts.SyntaxKind.ThisKeyword || value.kind === ts.SyntaxKind.SuperKeyword)
|
|
134
|
+
return value;
|
|
135
|
+
if (!ts.isIdentifier(value))
|
|
136
|
+
return null;
|
|
137
|
+
const declaration = flow.targetOf(value)?.declaration;
|
|
138
|
+
if (!declaration || !ts.isVariableDeclaration(declaration))
|
|
139
|
+
return null;
|
|
140
|
+
const writes = flow.writesToDeclaration(declaration).filter((write) => write.slot === 'whole');
|
|
141
|
+
const write = writes.length === 1 ? writes[0] : undefined;
|
|
142
|
+
if (!write || write.edge !== 'declaration-initializer' || write.value === null)
|
|
143
|
+
return null;
|
|
144
|
+
const initial = unwrapNaming(write.value);
|
|
145
|
+
return initial.kind === ts.SyntaxKind.ThisKeyword || initial.kind === ts.SyntaxKind.SuperKeyword ? initial : null;
|
|
146
|
+
};
|
|
147
|
+
/**
|
|
148
|
+
* `owner.<key>` assignments `checker.getPropertyOfType` cannot see: `this.
|
|
149
|
+
* <key> = value` written through a `thisReceiverOf` alias, from directly
|
|
150
|
+
* inside a CONSTRUCTOR FUNCTION's own body or a real class's own
|
|
151
|
+
* `constructor(...)` method. A sibling of `callable-reach.ts`'s
|
|
152
|
+
* `instanceMemberWritesOf`, kept as its own small walk rather than shared:
|
|
153
|
+
* that inventory is keyed to a literal `this`/`super` receiver on purpose,
|
|
154
|
+
* for an unrelated inheritance question multiple other consumers already
|
|
155
|
+
* depend on, and widening it there would change what every one of them
|
|
156
|
+
* sees. This one exists only to hand the checker-backed member/read/data
|
|
157
|
+
* plans below a fallback for the specific keys the checker's own inference
|
|
158
|
+
* never learns -- scoped to a constructor's own frame exactly the way a
|
|
159
|
+
* real class's inferred type is scoped to its own declared members.
|
|
160
|
+
*
|
|
161
|
+
* `owner` is the whole class/function declaration, but `flow.receiverOwnerOf`
|
|
162
|
+
* answers with the innermost enclosing FUNCTION-LIKE node -- for a
|
|
163
|
+
* constructor-function `owner` that IS `owner` itself, but for a real
|
|
164
|
+
* `class Owner { constructor() { ... } }` it is the `constructor` method,
|
|
165
|
+
* never the class node. Three's `WebGLRenderer` is the real-file case: an
|
|
166
|
+
* ES6 class whose constructor keeps a `const _this = this` alias and installs
|
|
167
|
+
* `properties`/`textures`/... through it from a nested `initGLContext`
|
|
168
|
+
* helper, same shape as a constructor function's own alias writes -- so the
|
|
169
|
+
* comparison frame must be the constructor method, not the class.
|
|
170
|
+
*/
|
|
171
|
+
/**
|
|
172
|
+
* Every alias-installed key at once, grouped -- rather than one key at a time
|
|
173
|
+
* -- because the struct-field-layout census (`structural.ts`'s
|
|
174
|
+
* `classInstanceBodyOf`) does not know in advance WHICH keys the checker's
|
|
175
|
+
* `type.getProperties()` is missing; it has to enumerate the whole extra set
|
|
176
|
+
* to append it to the shape. The per-key `constructorInstalledMemberWritesOf`
|
|
177
|
+
* below is now a thin filter over this, so the member-plan/key-read-plan
|
|
178
|
+
* call sites (which DO already know the one key they are asking about) keep
|
|
179
|
+
* their existing shape.
|
|
180
|
+
*/
|
|
181
|
+
// This is a pure function of (flow, owner): the alias-installed write scan
|
|
182
|
+
// consults no proof assumption park, only the whole-program write inventory
|
|
183
|
+
// and the owner's own frame. But the member-plan/key-read-plan call sites
|
|
184
|
+
// below reach it once per VALUE query (`sourceClassDataMemberPlanOf`'s outer
|
|
185
|
+
// cache is proof-local and deliberately bypassed for those -- see
|
|
186
|
+
// `cachedByAnchorAndKey`'s `proofLocal` branch), which is once per re-ask
|
|
187
|
+
// inside the escape proof's coinductive cycle -- millions of times on
|
|
188
|
+
// the three.js app. Recomputing an O(allWrites) scan that many times turned a single
|
|
189
|
+
// full-program pass into the dominant cost; cache it by (flow, owner) here,
|
|
190
|
+
// independent of that proof-local machinery, the same way every other
|
|
191
|
+
// checker-stable answer in this module is held in a WeakMap off `flow`.
|
|
192
|
+
const constructorInstalledMemberDeclarationCache = new WeakMap();
|
|
193
|
+
export const constructorInstalledMemberDeclarationsOf = (flow, owner) => {
|
|
194
|
+
let byOwner = constructorInstalledMemberDeclarationCache.get(flow);
|
|
195
|
+
if (!byOwner)
|
|
196
|
+
constructorInstalledMemberDeclarationCache.set(flow, (byOwner = new WeakMap()));
|
|
197
|
+
const cached = byOwner.get(owner);
|
|
198
|
+
if (cached)
|
|
199
|
+
return cached;
|
|
200
|
+
const computed = constructorInstalledMemberDeclarationsUncachedOf(flow, owner);
|
|
201
|
+
byOwner.set(owner, computed);
|
|
202
|
+
return computed;
|
|
203
|
+
};
|
|
204
|
+
const constructorInstalledMemberDeclarationsUncachedOf = (flow, owner) => {
|
|
205
|
+
const ownerFrame = isConstructorFunction(owner)
|
|
206
|
+
? owner
|
|
207
|
+
: isClassSpelledSourceClass(owner)
|
|
208
|
+
? owner.members.find((member) => ts.isConstructorDeclaration(member) && member.body !== undefined)
|
|
209
|
+
: undefined;
|
|
210
|
+
if (!ownerFrame)
|
|
211
|
+
return new Map();
|
|
212
|
+
const found = new Map();
|
|
213
|
+
for (const write of flow.allWrites) {
|
|
214
|
+
if (write.slot !== 'whole')
|
|
215
|
+
continue;
|
|
216
|
+
const access = write.naming;
|
|
217
|
+
if (!access || (!ts.isPropertyAccessExpression(access) && !ts.isElementAccessExpression(access)))
|
|
218
|
+
continue;
|
|
219
|
+
const writtenKey = ts.isPropertyAccessExpression(access)
|
|
220
|
+
? access.name.text
|
|
221
|
+
: ts.isStringLiteralLike(access.argumentExpression)
|
|
222
|
+
? access.argumentExpression.text
|
|
223
|
+
: null;
|
|
224
|
+
if (writtenKey === null)
|
|
225
|
+
continue;
|
|
226
|
+
const receiver = thisReceiverOf(flow, access.expression);
|
|
227
|
+
if (!receiver || flow.receiverOwnerOf(receiver) !== ownerFrame)
|
|
228
|
+
continue;
|
|
229
|
+
const declaration = access.parent;
|
|
230
|
+
if (ts.isBinaryExpression(declaration) && declaration.left === access && declaration.operatorToken.kind === ts.SyntaxKind.EqualsToken) {
|
|
231
|
+
let declarations = found.get(writtenKey);
|
|
232
|
+
if (!declarations)
|
|
233
|
+
found.set(writtenKey, (declarations = []));
|
|
234
|
+
if (!declarations.includes(declaration))
|
|
235
|
+
declarations.push(declaration);
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
return found;
|
|
239
|
+
};
|
|
240
|
+
const constructorInstalledMemberWritesOf = (flow, owner, key) => constructorInstalledMemberDeclarationsOf(flow, owner).get(key) ?? [];
|
|
241
|
+
/** Exact origins may narrow a descriptor family. Otherwise proving every member
|
|
242
|
+
* of the declared family is conservative; it does not certify allocation origins. */
|
|
243
|
+
const familyRootsOf = (checker, query) => {
|
|
244
|
+
const roots = new Set();
|
|
245
|
+
const seen = new Set();
|
|
246
|
+
const collect = (type) => {
|
|
247
|
+
if (seen.has(type))
|
|
248
|
+
return false;
|
|
249
|
+
seen.add(type);
|
|
250
|
+
if ((type.flags & (ts.TypeFlags.Null | ts.TypeFlags.Undefined)) !== 0)
|
|
251
|
+
return true;
|
|
252
|
+
if (type.isUnion())
|
|
253
|
+
return type.types.every(collect);
|
|
254
|
+
if ((type.flags & ts.TypeFlags.TypeParameter) !== 0) {
|
|
255
|
+
const constraint = checker.getBaseConstraintOfType(type);
|
|
256
|
+
return constraint !== undefined && constraint !== type && collect(constraint);
|
|
257
|
+
}
|
|
258
|
+
const classType = type.isClassOrInterface() ||
|
|
259
|
+
((type.flags & ts.TypeFlags.Object) !== 0 &&
|
|
260
|
+
(type.objectFlags & ts.ObjectFlags.Reference) !== 0 &&
|
|
261
|
+
type.target.isClassOrInterface());
|
|
262
|
+
if (!classType)
|
|
263
|
+
return false;
|
|
264
|
+
const declaration = type.getSymbol()?.valueDeclaration;
|
|
265
|
+
if (!declaration ||
|
|
266
|
+
(!ts.isClassDeclaration(declaration) && !ts.isClassExpression(declaration) && !isConstructorFunction(declaration)) ||
|
|
267
|
+
declaration.getSourceFile().isDeclarationFile)
|
|
268
|
+
return false;
|
|
269
|
+
roots.add(declaration);
|
|
270
|
+
return true;
|
|
271
|
+
};
|
|
272
|
+
const exact = query.kind === 'value' ? query.originsOf(query.expression) : null;
|
|
273
|
+
if (exact)
|
|
274
|
+
for (const owner of exact.classes)
|
|
275
|
+
roots.add(owner);
|
|
276
|
+
else if (!collect(query.receiver))
|
|
277
|
+
return null;
|
|
278
|
+
// TEMPORARY diagnostic for root A's real-WebGLRenderer probe -- names which
|
|
279
|
+
// arm of this function supplied `roots` and how many it found, since a
|
|
280
|
+
// truthy-but-EMPTY `exact` short-circuits the `collect()` fallback and
|
|
281
|
+
// silently produces zero roots. Remove once the real-file refusal is found.
|
|
282
|
+
const watchedFamilyRoots = process.env['GEA_FAMILY_ROOTS_DEBUG'];
|
|
283
|
+
if (watchedFamilyRoots !== undefined &&
|
|
284
|
+
query.kind === 'value' &&
|
|
285
|
+
(watchedFamilyRoots === '*' || query.expression.getText().includes(watchedFamilyRoots))) {
|
|
286
|
+
const file = query.expression.getSourceFile();
|
|
287
|
+
const line = file.getLineAndCharacterOfPosition(query.expression.getStart()).line + 1;
|
|
288
|
+
console.error(`[FAMILY-ROOTS] ${file.fileName.split('/').pop()}#${line} [${query.expression.getText().slice(0, 40)}] arm=${exact ? 'exact' : 'collect'} exactClasses=${exact ? exact.classes.size : '-'} roots=${[...roots].map((r) => r.name?.text ?? '(anonymous)').join(',')}`);
|
|
289
|
+
}
|
|
290
|
+
return roots;
|
|
291
|
+
};
|
|
292
|
+
const declaredClassTypeOf = (checker, owner) => {
|
|
293
|
+
const symbol = owner.name ? checker.getSymbolAtLocation(owner.name) : checker.getTypeAtLocation(owner).getSymbol();
|
|
294
|
+
const type = symbol && checker.getDeclaredTypeOfSymbol(symbol);
|
|
295
|
+
return type?.isClassOrInterface() ? type : null;
|
|
296
|
+
};
|
|
297
|
+
/** A source family's inherited constructor slot, with no own override or recorded replacement. */
|
|
298
|
+
export const sourceClassConstructorSlotIsOriginal = (checker, flow, query) => {
|
|
299
|
+
const roots = familyRootsOf(checker, query);
|
|
300
|
+
const inventory = roots && ownedClassReceiverInventoryOf(checker, flow, roots);
|
|
301
|
+
if (!inventory)
|
|
302
|
+
return false;
|
|
303
|
+
for (const owner of inventory.classes)
|
|
304
|
+
if (!classConstructorSlotIsOriginal(checker, flow, owner))
|
|
305
|
+
return false;
|
|
306
|
+
return true;
|
|
307
|
+
};
|
|
308
|
+
/** One class's `constructor` slot is still `Object.prototype.constructor`: no own member, no recorded write. */
|
|
309
|
+
/**
|
|
310
|
+
* Whether this class still has the `constructor` slot `Object` gave it.
|
|
311
|
+
*
|
|
312
|
+
* Memoized because the question is asked inside two `for` loops -- once per
|
|
313
|
+
* member of a receiver family and once per class of an inventory -- while the
|
|
314
|
+
* answer depends only on the flow index and the class: two checker calls, a
|
|
315
|
+
* write-set lookup, and a `getSourceFile()` parent walk per declaration, all
|
|
316
|
+
* of which give the same result every time. A live three.js profile put it at
|
|
317
|
+
* 7.4% of self time once the proof memo stopped dominating.
|
|
318
|
+
*/
|
|
319
|
+
const constructorSlotOriginal = new WeakMap();
|
|
320
|
+
export const classConstructorSlotIsOriginal = (checker, flow, owner) => {
|
|
321
|
+
let byOwner = constructorSlotOriginal.get(flow);
|
|
322
|
+
if (!byOwner)
|
|
323
|
+
constructorSlotOriginal.set(flow, (byOwner = new WeakMap()));
|
|
324
|
+
const known = byOwner.get(owner);
|
|
325
|
+
if (known !== undefined)
|
|
326
|
+
return known;
|
|
327
|
+
const answer = classConstructorSlotIsOriginalUncached(checker, flow, owner);
|
|
328
|
+
byOwner.set(owner, answer);
|
|
329
|
+
return answer;
|
|
330
|
+
};
|
|
331
|
+
const classConstructorSlotIsOriginalUncached = (checker, flow, owner) => {
|
|
332
|
+
const type = declaredClassTypeOf(checker, owner);
|
|
333
|
+
const slot = type && checker.getPropertyOfType(type, 'constructor');
|
|
334
|
+
return (!!slot?.declarations?.length &&
|
|
335
|
+
flow.writesToSymbol(slot).length === 0 &&
|
|
336
|
+
slot.declarations.every((declaration) => declaration.getSourceFile().hasNoDefaultLib &&
|
|
337
|
+
ts.isPropertySignature(declaration) &&
|
|
338
|
+
ts.isInterfaceDeclaration(declaration.parent) &&
|
|
339
|
+
declaration.parent.name.text === 'Object'));
|
|
340
|
+
};
|
|
341
|
+
const dataMemberPlans = new WeakMap();
|
|
342
|
+
const callableMemberPlans = new WeakMap();
|
|
343
|
+
const keyReadPlans = new WeakMap();
|
|
344
|
+
// Read once at load: `process.env` is a native interceptor, and the member
|
|
345
|
+
// plan below runs once per uncached (anchor, receiver, key) question -- and
|
|
346
|
+
// once per VALUE query outright, since those are proof-local -- so a per-call
|
|
347
|
+
// read was a measurable slice of the three.js app's frontend for a value that cannot
|
|
348
|
+
// change mid-process.
|
|
349
|
+
const watchedOwnedClass = process.env['GEA_OWNED_CLASS_DEBUG'];
|
|
350
|
+
const cachedByAnchorAndKey = (store, flow, anchor, receiver, key, proofLocal, compute) => {
|
|
351
|
+
if (proofLocal)
|
|
352
|
+
return compute();
|
|
353
|
+
let byAnchor = store.get(flow);
|
|
354
|
+
if (!byAnchor)
|
|
355
|
+
store.set(flow, (byAnchor = new WeakMap()));
|
|
356
|
+
let byType = byAnchor.get(anchor);
|
|
357
|
+
if (!byType)
|
|
358
|
+
byAnchor.set(anchor, (byType = new WeakMap()));
|
|
359
|
+
let byKey = byType.get(receiver);
|
|
360
|
+
if (!byKey)
|
|
361
|
+
byType.set(receiver, (byKey = new Map()));
|
|
362
|
+
const ledger = deferredIntrinsicProtocolLedgerOf(flow);
|
|
363
|
+
let answer = byKey.get(key);
|
|
364
|
+
if (!answer) {
|
|
365
|
+
answer = ledger ? ledger.capture(compute) : { value: compute(), requirements: [] };
|
|
366
|
+
byKey.set(key, answer);
|
|
367
|
+
}
|
|
368
|
+
// A cache hit owes exactly the obligations that justified the first read.
|
|
369
|
+
// Without an enclosing capture, compute again so the original fail-closed
|
|
370
|
+
// requirement cannot be bypassed by an earlier successful query.
|
|
371
|
+
if (answer.requirements.length > 0 && ledger?.include(answer.requirements) !== true)
|
|
372
|
+
return compute();
|
|
373
|
+
return answer.value;
|
|
374
|
+
};
|
|
375
|
+
/** A descriptor-family proof, not a receiver-origin or escape proof. The
|
|
376
|
+
* caller already follows a particular source owner through its aliases.
|
|
377
|
+
* Unrelated function constructors with checker type `any` must not become
|
|
378
|
+
* members of that owner's family merely through structural assignability.
|
|
379
|
+
*/
|
|
380
|
+
export const sourceClassDataMemberPlanOf = (checker, flow, query, key) => cachedByAnchorAndKey(dataMemberPlans, flow, query.kind === 'value' ? query.expression : query.receiver, query.receiver, key, query.kind === 'value', () => sourceClassDataMemberPlanUncached(checker, flow, query, key));
|
|
381
|
+
const sourceClassDataMemberPlanUncached = (checker, flow, query, key) => {
|
|
382
|
+
if (key === '__proto__' || key === 'constructor')
|
|
383
|
+
return null;
|
|
384
|
+
const roots = familyRootsOf(checker, query);
|
|
385
|
+
if (!roots)
|
|
386
|
+
return null;
|
|
387
|
+
const watched = watchedOwnedClass;
|
|
388
|
+
const watching = watched !== undefined && [...roots].some((root) => (root.name?.text ?? '') === watched);
|
|
389
|
+
const refuse = (reason, detail) => {
|
|
390
|
+
if (watching)
|
|
391
|
+
console.error(`[SOURCE-CLASS-DATA] ${watched}.${key} ${reason}${detail ? ` ${detail}` : ''}`);
|
|
392
|
+
return null;
|
|
393
|
+
};
|
|
394
|
+
if (roots.size === 0)
|
|
395
|
+
return null;
|
|
396
|
+
const inventory = ownedClassReceiverInventoryOf(checker, flow, roots);
|
|
397
|
+
if (!inventory)
|
|
398
|
+
return refuse('no-inventory');
|
|
399
|
+
const declarations = new Set();
|
|
400
|
+
for (const owner of inventory.classes) {
|
|
401
|
+
const symbol = owner.name ? checker.getSymbolAtLocation(owner.name) : checker.getTypeAtLocation(owner).getSymbol();
|
|
402
|
+
if (!symbol)
|
|
403
|
+
return refuse('unnamed-owner');
|
|
404
|
+
const ownerType = checker.getDeclaredTypeOfSymbol(symbol);
|
|
405
|
+
const member = checker.getPropertyOfType(ownerType, key);
|
|
406
|
+
if (!member?.declarations?.length) {
|
|
407
|
+
const installed = constructorInstalledMemberWritesOf(flow, owner, key);
|
|
408
|
+
if (installed.length === 0)
|
|
409
|
+
return refuse('member-absent-on-owner', owner.name?.text);
|
|
410
|
+
for (const declaration of installed)
|
|
411
|
+
declarations.add(declaration);
|
|
412
|
+
continue;
|
|
413
|
+
}
|
|
414
|
+
if (!member.declarations.every(isSourceDataDeclaration)) {
|
|
415
|
+
const passthrough = accessorPassthroughDataMemberOf(checker, flow, ownerType, member);
|
|
416
|
+
if (!passthrough)
|
|
417
|
+
return refuse('member-not-data-on-owner', owner.name?.text);
|
|
418
|
+
declarations.add(passthrough.declaration);
|
|
419
|
+
continue;
|
|
420
|
+
}
|
|
421
|
+
declarations.add(member.valueDeclaration ?? member.declarations[0]);
|
|
422
|
+
}
|
|
423
|
+
return { declarations: [...declarations] };
|
|
424
|
+
};
|
|
425
|
+
export const sourceClassDataMemberOf = (checker, flow, receiver, key) => sourceClassDataMemberPlanOf(checker, flow, { kind: 'declared', receiver }, key) !== null;
|
|
426
|
+
/**
|
|
427
|
+
* The source method bodies a key resolves to on this class family.
|
|
428
|
+
*
|
|
429
|
+
* A sibling of `sourceClassDataMemberPlanOf`, deliberately not a widening of
|
|
430
|
+
* it. They answer different questions -- "what plain data does this key hold"
|
|
431
|
+
* and "which bodies does this key dispatch to" -- and a consumer asking the
|
|
432
|
+
* first must keep getting `null` for a method, so they get separate caches as
|
|
433
|
+
* well as separate names.
|
|
434
|
+
*
|
|
435
|
+
* **Slot integrity is not proven here, and that separation is the point.**
|
|
436
|
+
* `ownedClassReceiverInventoryOf` admits a family only when
|
|
437
|
+
* `classConstructorKeepsInstanceOf` holds for every class in it, and that
|
|
438
|
+
* inventory refuses any constructor or prototype reference it cannot explain,
|
|
439
|
+
* `C.prototype.m = other` included. What remains -- an instance-side `a.m = f`
|
|
440
|
+
* -- belongs to whoever holds the construction: the value graph's slot transfer
|
|
441
|
+
* enumerates every write to this key on that allocation and refuses the ones it
|
|
442
|
+
* cannot model. This function answers only which declarations the key names,
|
|
443
|
+
* which is §4's distinction between a virtual callable slot and prototype-slot
|
|
444
|
+
* integrity, kept apart on purpose.
|
|
445
|
+
*/
|
|
446
|
+
export const sourceClassCallableMemberPlanOf = (checker, flow, query, key) => cachedByAnchorAndKey(callableMemberPlans, flow, query.kind === 'value' ? query.expression : query.receiver, query.receiver, key, query.kind === 'value', () => sourceClassCallableMemberPlanUncached(checker, flow, query, key));
|
|
447
|
+
const sourceClassCallableMemberPlanUncached = (checker, flow, query, key) => {
|
|
448
|
+
if (key === '__proto__' || key === 'constructor')
|
|
449
|
+
return null;
|
|
450
|
+
const roots = familyRootsOf(checker, query);
|
|
451
|
+
if (!roots || roots.size === 0)
|
|
452
|
+
return null;
|
|
453
|
+
const watched = watchedOwnedClass;
|
|
454
|
+
const watching = watched !== undefined && [...roots].some((root) => (root.name?.text ?? '') === watched);
|
|
455
|
+
const refuse = (reason, detail) => {
|
|
456
|
+
if (watching)
|
|
457
|
+
console.error(`[SOURCE-CLASS-CALLABLE] ${watched}.${key} ${reason}${detail ? ` ${detail}` : ''}`);
|
|
458
|
+
return null;
|
|
459
|
+
};
|
|
460
|
+
const inventory = ownedClassReceiverInventoryOf(checker, flow, roots);
|
|
461
|
+
if (!inventory)
|
|
462
|
+
return refuse('no-inventory');
|
|
463
|
+
const declarations = new Set();
|
|
464
|
+
for (const owner of inventory.classes) {
|
|
465
|
+
const symbol = owner.name ? checker.getSymbolAtLocation(owner.name) : checker.getTypeAtLocation(owner).getSymbol();
|
|
466
|
+
if (!symbol)
|
|
467
|
+
return refuse('unnamed-owner');
|
|
468
|
+
const member = checker.getPropertyOfType(checker.getDeclaredTypeOfSymbol(symbol), key);
|
|
469
|
+
if (!member?.declarations?.length)
|
|
470
|
+
return refuse('member-absent-on-owner', owner.name?.text);
|
|
471
|
+
// Every declaration, on every class the receiver can be: one override that
|
|
472
|
+
// is an accessor, a bodiless overload or an ambient member makes the whole
|
|
473
|
+
// family's answer unknown rather than partly known.
|
|
474
|
+
if (!member.declarations.every(isSourceInstanceMethod))
|
|
475
|
+
return refuse('member-not-a-source-method', owner.name?.text);
|
|
476
|
+
for (const declaration of member.declarations)
|
|
477
|
+
declarations.add(declaration);
|
|
478
|
+
}
|
|
479
|
+
return { declarations: [...declarations] };
|
|
480
|
+
};
|
|
481
|
+
const PRIMITIVE_FLAGS = ts.TypeFlags.StringLike |
|
|
482
|
+
ts.TypeFlags.NumberLike |
|
|
483
|
+
ts.TypeFlags.BooleanLike |
|
|
484
|
+
ts.TypeFlags.BigIntLike |
|
|
485
|
+
ts.TypeFlags.ESSymbolLike |
|
|
486
|
+
ts.TypeFlags.Null |
|
|
487
|
+
ts.TypeFlags.Undefined |
|
|
488
|
+
ts.TypeFlags.Void;
|
|
489
|
+
const primitiveType = (type) => (type.isUnion() ? type.types.every(primitiveType) : (type.flags & PRIMITIVE_FLAGS) !== 0);
|
|
490
|
+
/**
|
|
491
|
+
* A read of `key` through a receiver of this source class family, classified
|
|
492
|
+
* per class -- including keys the receiver's own class never declares.
|
|
493
|
+
*
|
|
494
|
+
* Three's renderer asks every drawable `object.isInstancedMesh` and
|
|
495
|
+
* `object.isSkinnedMesh` (`WebGLRenderLists.js`, `WebGLObjects.js`,
|
|
496
|
+
* `WebGLPrograms.js`, ...). Only `InstancedMesh`/`SkinnedMesh` declare them,
|
|
497
|
+
* and neither is in the three.js app's import graph, so on a `Mesh` the read is simply
|
|
498
|
+
* absent. The read runs no code exactly when no class in the family -- nor
|
|
499
|
+
* any class on its prototype chain up to `Object.prototype` -- has a method
|
|
500
|
+
* or accessor for the key. An absent key further needs the key not to be an
|
|
501
|
+
* `Object.prototype` member and the intrinsic Object prototype intact (the
|
|
502
|
+
* same ledger obligation a record's missing slot pays).
|
|
503
|
+
*
|
|
504
|
+
* `carriers`/`primitive` let a caller that follows the receiver require that
|
|
505
|
+
* the read can never yield the receiver back (`this.self = this`) or a
|
|
506
|
+
* function that captures it. "Absent" states that no class DECLARES the key;
|
|
507
|
+
* an expando store onto an instance is a store the caller's own publication
|
|
508
|
+
* tracking must see. Like the data plan, this assumes a receiver typed as a
|
|
509
|
+
* family class really holds a family instance.
|
|
510
|
+
*/
|
|
511
|
+
export const sourceClassKeyReadPlanOf = (checker, flow, query, key) => cachedByAnchorAndKey(keyReadPlans, flow, query.kind === 'value' ? query.expression : query.receiver, query.receiver, key, query.kind === 'value', () => sourceClassKeyReadPlanUncached(checker, flow, query, key));
|
|
512
|
+
const sourceClassKeyReadPlanUncached = (checker, flow, query, key) => {
|
|
513
|
+
// `toString`, `hasOwnProperty`, `__proto__`, `constructor`: every instance
|
|
514
|
+
// reaches the intrinsic member, and a family class may also shadow it.
|
|
515
|
+
if (objectPrototypeMemberNames.has(key))
|
|
516
|
+
return null;
|
|
517
|
+
const roots = familyRootsOf(checker, query);
|
|
518
|
+
if (!roots || roots.size === 0)
|
|
519
|
+
return null;
|
|
520
|
+
const inventory = ownedClassReceiverInventoryOf(checker, flow, roots);
|
|
521
|
+
if (!inventory)
|
|
522
|
+
return null;
|
|
523
|
+
const interfaceOf = (type) => {
|
|
524
|
+
if (type.isClassOrInterface())
|
|
525
|
+
return type;
|
|
526
|
+
if ((type.flags & ts.TypeFlags.Object) !== 0 && (type.objectFlags & ts.ObjectFlags.Reference) !== 0) {
|
|
527
|
+
const target = type.target;
|
|
528
|
+
return target.isClassOrInterface() ? target : null;
|
|
529
|
+
}
|
|
530
|
+
return null;
|
|
531
|
+
};
|
|
532
|
+
// Every link must be a source class: a declaration-file base states
|
|
533
|
+
// accessors and data properties in the same spelling, so it cannot say
|
|
534
|
+
// which one a read would reach.
|
|
535
|
+
const chainOf = (type, seen) => {
|
|
536
|
+
if (seen.has(type))
|
|
537
|
+
return [];
|
|
538
|
+
seen.add(type);
|
|
539
|
+
const chain = [type];
|
|
540
|
+
for (const base of checker.getBaseTypes(type)) {
|
|
541
|
+
const declared = interfaceOf(base);
|
|
542
|
+
const declaration = base.getSymbol()?.valueDeclaration;
|
|
543
|
+
if (!declared ||
|
|
544
|
+
!declaration ||
|
|
545
|
+
(!ts.isClassDeclaration(declaration) && !ts.isClassExpression(declaration)) ||
|
|
546
|
+
declaration.getSourceFile().isDeclarationFile)
|
|
547
|
+
return null;
|
|
548
|
+
const rest = chainOf(declared, seen);
|
|
549
|
+
if (!rest)
|
|
550
|
+
return null;
|
|
551
|
+
chain.push(base, ...rest);
|
|
552
|
+
}
|
|
553
|
+
return chain;
|
|
554
|
+
};
|
|
555
|
+
const classes = new Map();
|
|
556
|
+
const carriers = [];
|
|
557
|
+
let codeFree = true;
|
|
558
|
+
let primitive = true;
|
|
559
|
+
let absent = false;
|
|
560
|
+
const writeBodies = new Set();
|
|
561
|
+
let writesKnown = true;
|
|
562
|
+
const readBodies = new Set();
|
|
563
|
+
let readsKnown = true;
|
|
564
|
+
for (const owner of inventory.classes) {
|
|
565
|
+
const type = declaredClassTypeOf(checker, owner);
|
|
566
|
+
const chain = type ? chainOf(type, new Set()) : null;
|
|
567
|
+
if (!type || !chain)
|
|
568
|
+
return null;
|
|
569
|
+
let verdict = 'absent';
|
|
570
|
+
for (const link of chain) {
|
|
571
|
+
const member = checker.getPropertyOfType(link, key);
|
|
572
|
+
if (!member)
|
|
573
|
+
continue;
|
|
574
|
+
if (!member.declarations?.length || !member.declarations.every(isSourceDataDeclaration)) {
|
|
575
|
+
// Reading and assigning the same key invoke different code. A source
|
|
576
|
+
// setter can be inspected even when its getter is not transparent.
|
|
577
|
+
// A getter-only property throws (or ignores a sloppy assignment), so
|
|
578
|
+
// that write contributes no receiver publication either.
|
|
579
|
+
if (member.declarations?.length &&
|
|
580
|
+
member.declarations.every((declaration) => !declaration.getSourceFile().isDeclarationFile && ts.isMethodDeclaration(declaration)) &&
|
|
581
|
+
member.declarations.some((declaration) => ts.isMethodDeclaration(declaration) && declaration.body !== undefined)) {
|
|
582
|
+
// Source methods install ordinary writable data descriptors. A
|
|
583
|
+
// store shadows that method on the instance without invoking the
|
|
584
|
+
// old or new callable. Reading/calling it remains a separate proof.
|
|
585
|
+
readsKnown = false;
|
|
586
|
+
}
|
|
587
|
+
else if (member.declarations?.length &&
|
|
588
|
+
member.declarations.every((declaration) => !declaration.getSourceFile().isDeclarationFile &&
|
|
589
|
+
(ts.isGetAccessorDeclaration(declaration) || ts.isSetAccessorDeclaration(declaration)))) {
|
|
590
|
+
for (const declaration of member.declarations) {
|
|
591
|
+
if (ts.isSetAccessorDeclaration(declaration)) {
|
|
592
|
+
if (declaration.body)
|
|
593
|
+
writeBodies.add(declaration);
|
|
594
|
+
else
|
|
595
|
+
writesKnown = false;
|
|
596
|
+
}
|
|
597
|
+
else if (ts.isGetAccessorDeclaration(declaration)) {
|
|
598
|
+
if (declaration.body)
|
|
599
|
+
readBodies.add(declaration);
|
|
600
|
+
else
|
|
601
|
+
readsKnown = false;
|
|
602
|
+
}
|
|
603
|
+
}
|
|
604
|
+
}
|
|
605
|
+
else {
|
|
606
|
+
writesKnown = false;
|
|
607
|
+
readsKnown = false;
|
|
608
|
+
}
|
|
609
|
+
// Not a plain data declaration on this link -- still `data` when it
|
|
610
|
+
// is instead an accessor pair provably forwarding to one; see
|
|
611
|
+
// `accessorPassthroughDataMemberOf`'s header for why this cannot
|
|
612
|
+
// widen the read past what a real data member would have permitted.
|
|
613
|
+
if (member.declarations?.length && accessorPassthroughDataMemberOf(checker, flow, link, member)) {
|
|
614
|
+
verdict = 'data';
|
|
615
|
+
continue;
|
|
616
|
+
}
|
|
617
|
+
verdict = 'other';
|
|
618
|
+
break;
|
|
619
|
+
}
|
|
620
|
+
verdict = 'data';
|
|
621
|
+
}
|
|
622
|
+
// No link on the checker's own chain declares the key at all -- which is
|
|
623
|
+
// exactly what a constructor function writing it only through a `this`
|
|
624
|
+
// alias looks like, since the checker's inference never saw that write
|
|
625
|
+
// either. Fall back to the flow-index's own record of it before reading
|
|
626
|
+
// this as a genuine absence and requiring the intrinsic Object prototype
|
|
627
|
+
// to stay clean for a key the program plainly does assign.
|
|
628
|
+
if (verdict === 'absent') {
|
|
629
|
+
const installed = constructorInstalledMemberWritesOf(flow, owner, key);
|
|
630
|
+
if (installed.length > 0) {
|
|
631
|
+
for (const declaration of installed) {
|
|
632
|
+
const carrier = checker.getTypeAtLocation(declaration.right);
|
|
633
|
+
carriers.push({ owner, declaration, type: carrier });
|
|
634
|
+
primitive &&= primitiveType(carrier);
|
|
635
|
+
}
|
|
636
|
+
classes.set(owner, 'data');
|
|
637
|
+
continue;
|
|
638
|
+
}
|
|
639
|
+
}
|
|
640
|
+
if (verdict === 'data') {
|
|
641
|
+
const member = checker.getPropertyOfType(type, key);
|
|
642
|
+
const passthrough = member.declarations?.length && !member.declarations.every(isSourceDataDeclaration)
|
|
643
|
+
? accessorPassthroughDataMemberOf(checker, flow, type, member)
|
|
644
|
+
: null;
|
|
645
|
+
const declaration = passthrough ? passthrough.declaration : (member.valueDeclaration ?? member.declarations[0]);
|
|
646
|
+
const carrier = passthrough ? passthrough.type : checker.getTypeOfSymbolAtLocation(member, declaration);
|
|
647
|
+
carriers.push({ owner, declaration, type: carrier });
|
|
648
|
+
primitive &&= primitiveType(carrier);
|
|
649
|
+
}
|
|
650
|
+
else if (verdict === 'other')
|
|
651
|
+
codeFree = false;
|
|
652
|
+
else
|
|
653
|
+
absent = true;
|
|
654
|
+
classes.set(owner, verdict);
|
|
655
|
+
}
|
|
656
|
+
if (absent) {
|
|
657
|
+
if (objectPrototypeMemberNames.has(key))
|
|
658
|
+
return null;
|
|
659
|
+
const location = query.kind === 'value' ? query.expression : roots.values().next().value;
|
|
660
|
+
// The read falls through to Object.prototype for exactly this key, so the
|
|
661
|
+
// obligation is that key's absence there -- not the whole prototype, which
|
|
662
|
+
// any unattributed write anywhere in the program fails.
|
|
663
|
+
if (deferredIntrinsicProtocolLedgerOf(flow)?.requirePrototypeKeys('Object', { names: [key] }, location) !== true)
|
|
664
|
+
return null;
|
|
665
|
+
}
|
|
666
|
+
return {
|
|
667
|
+
classes,
|
|
668
|
+
carriers,
|
|
669
|
+
codeFree,
|
|
670
|
+
primitive,
|
|
671
|
+
needsDefaultPrototype: absent,
|
|
672
|
+
writeBodies: writesKnown ? [...writeBodies] : null,
|
|
673
|
+
readBodies: readsKnown ? [...readBodies] : null
|
|
674
|
+
};
|
|
675
|
+
};
|
|
676
|
+
/** `Object.<method>`/`Reflect.<method>` calls, and the legacy per-instance
|
|
677
|
+
* pair, whose effect is INSTALLING an accessor under some key -- as opposed
|
|
678
|
+
* to `Object.assign`/`Reflect.set`, which only ever write THROUGH an
|
|
679
|
+
* existing accessor (or create a plain data property) rather than install a
|
|
680
|
+
* new one. `setPrototypeOf` is here because a replaced prototype can bring
|
|
681
|
+
* any accessor with it, under any key. */
|
|
682
|
+
const REFLECTIVE_ACCESSOR_INSTALLERS = new Set(['defineProperty', 'defineProperties', 'setPrototypeOf']);
|
|
683
|
+
/** A mention of the global `Object`/`Reflect` value that cannot hand one of
|
|
684
|
+
* its mutators out: a member read (the member's own symbol is then scanned
|
|
685
|
+
* separately), a call or construction of it, or an identity/`instanceof`
|
|
686
|
+
* comparison. Mirrors `class-family-member-read.ts`'s `globalValueUseIsInert`,
|
|
687
|
+
* kept as its own small copy rather than imported -- see
|
|
688
|
+
* `reflectiveDefinitionMayInstallGetterOf`'s header for why. */
|
|
689
|
+
const globalValueUseIsInert = (reference) => {
|
|
690
|
+
let node = reference;
|
|
691
|
+
while (ts.isParenthesizedExpression(node.parent))
|
|
692
|
+
node = node.parent;
|
|
693
|
+
const parent = node.parent;
|
|
694
|
+
if (ts.isPropertyAccessExpression(parent))
|
|
695
|
+
return parent.expression === node;
|
|
696
|
+
if (ts.isCallExpression(parent) || ts.isNewExpression(parent))
|
|
697
|
+
return parent.expression === node;
|
|
698
|
+
return (ts.isBinaryExpression(parent) &&
|
|
699
|
+
(parent.operatorToken.kind === ts.SyntaxKind.EqualsEqualsEqualsToken ||
|
|
700
|
+
parent.operatorToken.kind === ts.SyntaxKind.ExclamationEqualsEqualsToken ||
|
|
701
|
+
parent.operatorToken.kind === ts.SyntaxKind.EqualsEqualsToken ||
|
|
702
|
+
parent.operatorToken.kind === ts.SyntaxKind.ExclamationEqualsToken ||
|
|
703
|
+
parent.operatorToken.kind === ts.SyntaxKind.InstanceOfKeyword));
|
|
704
|
+
};
|
|
705
|
+
/** Whether an object-literal descriptor MAP (`defineProperties`'s second
|
|
706
|
+
* argument, or a `__defineGetter__`-style name argument) can be ruled out
|
|
707
|
+
* from naming `key` -- conservatively `true` (may name) for anything that is
|
|
708
|
+
* not a spread-free literal with every property name spelled out. */
|
|
709
|
+
const literalMayNameKey = (expression, key) => {
|
|
710
|
+
if (!expression)
|
|
711
|
+
return true;
|
|
712
|
+
if (ts.isParenthesizedExpression(expression))
|
|
713
|
+
return literalMayNameKey(expression.expression, key);
|
|
714
|
+
if (!ts.isObjectLiteralExpression(expression))
|
|
715
|
+
return true;
|
|
716
|
+
return expression.properties.some((property) => {
|
|
717
|
+
if (ts.isSpreadAssignment(property))
|
|
718
|
+
return true;
|
|
719
|
+
const propertyName = property.name;
|
|
720
|
+
if (!propertyName)
|
|
721
|
+
return true;
|
|
722
|
+
if (ts.isComputedPropertyName(propertyName))
|
|
723
|
+
return true;
|
|
724
|
+
if (ts.isIdentifier(propertyName) || ts.isStringLiteralLike(propertyName) || ts.isNumericLiteral(propertyName))
|
|
725
|
+
return propertyName.text === key;
|
|
726
|
+
return true;
|
|
727
|
+
});
|
|
728
|
+
};
|
|
729
|
+
/** Whether a single NAME argument (`defineProperty`'s key, `__defineGetter__`'s
|
|
730
|
+
* name) can be ruled out from naming `key` -- conservatively `true` for
|
|
731
|
+
* anything but a matching string/numeric literal. */
|
|
732
|
+
const namedArgumentMayNameKey = (argument, key) => {
|
|
733
|
+
if (!argument)
|
|
734
|
+
return true;
|
|
735
|
+
if (ts.isParenthesizedExpression(argument))
|
|
736
|
+
return namedArgumentMayNameKey(argument.expression, key);
|
|
737
|
+
if (ts.isSpreadElement(argument))
|
|
738
|
+
return true;
|
|
739
|
+
if (ts.isStringLiteralLike(argument) || ts.isNumericLiteral(argument))
|
|
740
|
+
return argument.text === key;
|
|
741
|
+
return true;
|
|
742
|
+
};
|
|
743
|
+
const reflectiveDefinitions = new WeakMap();
|
|
744
|
+
/**
|
|
745
|
+
* Whether any reflective definition anywhere in the program -- `Object.defineProperty`/
|
|
746
|
+
* `defineProperties`, `Reflect.defineProperty`, `x.__defineGetter__`/`__defineSetter__`,
|
|
747
|
+
* a prototype swap, or an unaccounted-for alias of one of the `Object`/`Reflect`
|
|
748
|
+
* mutators -- could install a GETTER under `key` on some object.
|
|
749
|
+
*
|
|
750
|
+
* `sourceClassKeyReadPlanOf` classifies a key from the checker's own STATIC
|
|
751
|
+
* declared members; it has no way to see an accessor a reflective call
|
|
752
|
+
* installs on one instance at runtime, on a class the checker still types as
|
|
753
|
+
* plain data. A member-read proof built on that plan must refuse whenever
|
|
754
|
+
* this holds, however data-only the plan itself says the family is.
|
|
755
|
+
*
|
|
756
|
+
* Deliberately conservative and receiver-blind: it does not try to prove the
|
|
757
|
+
* reflective call's TARGET cannot be one of this proof's family instances --
|
|
758
|
+
* that precision is `class-family-member-read.ts`'s own (unexported)
|
|
759
|
+
* `reflectionMayCreate`, not reused here because importing it would cycle
|
|
760
|
+
* back through `callable-reach.ts`, which `class-family-member-read.ts`
|
|
761
|
+
* itself imports (`closedCallableAuthorityOf`). Over-refusing is always
|
|
762
|
+
* sound: this can only ever make a read refuse, never accept one it should
|
|
763
|
+
* not have. `Object.assign`/`Reflect.set` are deliberately excluded -- both
|
|
764
|
+
* write through [[Set]], which invokes an EXISTING accessor or creates a
|
|
765
|
+
* plain data property, but installs no new one.
|
|
766
|
+
*/
|
|
767
|
+
export const reflectiveDefinitionMayInstallGetterOf = (checker, flow, key) => {
|
|
768
|
+
let byKey = reflectiveDefinitions.get(flow);
|
|
769
|
+
if (!byKey)
|
|
770
|
+
reflectiveDefinitions.set(flow, (byKey = new Map()));
|
|
771
|
+
const held = byKey.get(key);
|
|
772
|
+
if (held !== undefined)
|
|
773
|
+
return held;
|
|
774
|
+
const answer = computeReflectiveDefinitionMayInstallGetter(checker, flow, key);
|
|
775
|
+
byKey.set(key, answer);
|
|
776
|
+
return answer;
|
|
777
|
+
};
|
|
778
|
+
const computeReflectiveDefinitionMayInstallGetter = (checker, flow, key) => {
|
|
779
|
+
const directCallees = new Set();
|
|
780
|
+
for (const { call } of flow.calls) {
|
|
781
|
+
if (!ts.isCallExpression(call))
|
|
782
|
+
continue;
|
|
783
|
+
const callee = call.expression;
|
|
784
|
+
if (!ts.isPropertyAccessExpression(callee))
|
|
785
|
+
continue;
|
|
786
|
+
// `x.__defineGetter__( 'key', fn )` / `x.__defineSetter__( ... )`: a
|
|
787
|
+
// direct per-instance call, on any receiver -- conservatively not
|
|
788
|
+
// narrowed to whether `x` could be a family instance, same as the rest
|
|
789
|
+
// of this scan.
|
|
790
|
+
if (callee.name.text === '__defineGetter__' || callee.name.text === '__defineSetter__') {
|
|
791
|
+
if (namedArgumentMayNameKey(call.arguments[0], key))
|
|
792
|
+
return true;
|
|
793
|
+
continue;
|
|
794
|
+
}
|
|
795
|
+
if (!ts.isIdentifier(callee.expression))
|
|
796
|
+
continue;
|
|
797
|
+
const method = callee.name.text;
|
|
798
|
+
if (!REFLECTIVE_ACCESSOR_INSTALLERS.has(method))
|
|
799
|
+
continue;
|
|
800
|
+
const owner = callee.expression;
|
|
801
|
+
const isObject = isGlobalObjectConstructor(checker, owner, checker.getTypeAtLocation(owner));
|
|
802
|
+
const isReflect = !isObject && isStandardGlobalValue(checker, owner, 'Reflect');
|
|
803
|
+
if (!isObject && !isReflect)
|
|
804
|
+
continue;
|
|
805
|
+
directCallees.add(callee.name);
|
|
806
|
+
if (method === 'setPrototypeOf')
|
|
807
|
+
return true;
|
|
808
|
+
if (method === 'defineProperty') {
|
|
809
|
+
if (namedArgumentMayNameKey(call.arguments[1], key))
|
|
810
|
+
return true;
|
|
811
|
+
}
|
|
812
|
+
else if (literalMayNameKey(call.arguments[1], key))
|
|
813
|
+
return true;
|
|
814
|
+
}
|
|
815
|
+
// An unaccounted mention of `Object`/`Reflect` -- passed along, destructured,
|
|
816
|
+
// read for a member other than as a recorded direct callee -- hands its
|
|
817
|
+
// mutators out unnamed; nothing here can then rule them out.
|
|
818
|
+
for (const global of ['Object', 'Reflect']) {
|
|
819
|
+
let value = checker.resolveName(global, undefined, ts.SymbolFlags.Value, false);
|
|
820
|
+
if (value && (value.flags & ts.SymbolFlags.Alias) !== 0)
|
|
821
|
+
value = checker.getAliasedSymbol(value);
|
|
822
|
+
if (!value)
|
|
823
|
+
continue;
|
|
824
|
+
for (const reference of flow.memberReferencesToSymbol(value))
|
|
825
|
+
if (!globalValueUseIsInert(reference))
|
|
826
|
+
return true;
|
|
827
|
+
const valueType = checker.getTypeOfSymbol(value);
|
|
828
|
+
for (const method of REFLECTIVE_ACCESSOR_INSTALLERS) {
|
|
829
|
+
const member = checker.getPropertyOfType(valueType, method);
|
|
830
|
+
if (!member)
|
|
831
|
+
continue;
|
|
832
|
+
for (const reference of flow.memberReferencesToSymbol(member))
|
|
833
|
+
if (!directCallees.has(reference))
|
|
834
|
+
return true;
|
|
835
|
+
}
|
|
836
|
+
}
|
|
837
|
+
return false;
|
|
838
|
+
};
|