@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,823 @@
|
|
|
1
|
+
import ts from 'typescript';
|
|
2
|
+
import { isGlobalObjectConstructor, isStandardInterfaceType, invocationOperandsOf, literalMemberNameOf } from '../derived-expression-type.js';
|
|
3
|
+
import { typedArrayInstanceInterfaceNames } from '../../host-protocols.js';
|
|
4
|
+
import { heritageClassOrInterfaceOf, isConstructorFunction } from './model.js';
|
|
5
|
+
import { calleeDeclarationOf, callableDeclarationOfExpression, flowTargetOf, isRealCallableDeclaration, runtimeParametersOf, isTypePositionReference, resolveFlowSymbolAlias, returnOwnerOf, unwrapNaming } from './targets.js';
|
|
6
|
+
import { forEachReachableStatement } from '../reachability.js';
|
|
7
|
+
import { isAssignmentPattern, isObjectLiteralPrototypeSetter } from '../assignment-patterns.js';
|
|
8
|
+
/**
|
|
9
|
+
* ONE walk of the program, producing every write edge every census needs.
|
|
10
|
+
*
|
|
11
|
+
* See `model.ts` for why this exists. The rules of the house, in the order
|
|
12
|
+
* they matter:
|
|
13
|
+
*
|
|
14
|
+
* 1. **Edges, never answers.** Checker identities supply the initial edges.
|
|
15
|
+
* Later rounds consume receiver types and call attributions from the
|
|
16
|
+
* preceding census. This index never runs its own inference: it adds the
|
|
17
|
+
* argument and collection edges those answers identify. The frontend's
|
|
18
|
+
* fixed point observes these queries and publishes the index together with
|
|
19
|
+
* the settling round, so consumers cannot mix one round's calls with
|
|
20
|
+
* another round's writes.
|
|
21
|
+
* 2. **A census's answer may change only by seeing MORE writes.** Every edge
|
|
22
|
+
* a consumer already discovered for itself is reported here in exactly the
|
|
23
|
+
* spelling that consumer used, including which of the two property-symbol
|
|
24
|
+
* resolutions it keyed on (see `FlowTarget`), so a conversion is an
|
|
25
|
+
* edge-source swap and never a policy change.
|
|
26
|
+
* 3. **Both directions.** A write is recorded against the cell it fills AND
|
|
27
|
+
* against the cell its VALUE names, so "where does this cell's value go"
|
|
28
|
+
* is one lookup rather than a second walk.
|
|
29
|
+
*
|
|
30
|
+
* What it deliberately does NOT do: decide whether an edge is EVIDENCE. A
|
|
31
|
+
* compound assignment carries no fresh value; a spread carries an
|
|
32
|
+
* unenumerable key set; an `Object.assign` source may or may not be readable.
|
|
33
|
+
* Those are policy, and policy stays in the census that owns the cell --
|
|
34
|
+
* `object-bag-bindings.ts` reads a spread as a refusal, and it is right to.
|
|
35
|
+
*/
|
|
36
|
+
const COLLECTION_KEY_METHODS = new Set(['get', 'set', 'has', 'delete', 'add']);
|
|
37
|
+
const APPEND_METHODS = new Set(['push', 'unshift']);
|
|
38
|
+
/**
|
|
39
|
+
* The four standard keyed-collection interface names, resolved by declaration
|
|
40
|
+
* identity (`isStandardInterfaceType`) rather than matched by the call's own
|
|
41
|
+
* method spelling.
|
|
42
|
+
*
|
|
43
|
+
* `COLLECTION_KEY_METHODS`/`APPEND_METHODS`/`'fill'` used to gate on the
|
|
44
|
+
* method name ALONE, against any receiver: a user class declaring its own
|
|
45
|
+
* `get`/`set`/`has`/`delete`/`add` (a Command/Strategy/cache-shaped API is an
|
|
46
|
+
* ordinary reason to) had its calls read as `collection-key`/`collection-value`
|
|
47
|
+
* writes into a cell that was never a `Map`/`Set` at all -- admitting a value
|
|
48
|
+
* into a cell the program never fills that way, which is the one failure mode
|
|
49
|
+
* this whole index exists to avoid rather than merely approximate. See
|
|
50
|
+
* `host-protocols.ts`'s `keyedCollectionDeclarationsOf`, the same four names
|
|
51
|
+
* resolved the same way for the census that reads THEIR identity from the
|
|
52
|
+
* checker directly rather than a Map this layer would have to keep in sync
|
|
53
|
+
* with it.
|
|
54
|
+
*/
|
|
55
|
+
const KEYED_COLLECTION_INTERFACES = ['Map', 'Set', 'WeakMap', 'WeakSet'];
|
|
56
|
+
/**
|
|
57
|
+
* Whether `type` -- after resolving a type parameter to its constraint, and
|
|
58
|
+
* a subclass to the base type its own declaration states -- is one of
|
|
59
|
+
* `names`.
|
|
60
|
+
*
|
|
61
|
+
* `isStandardInterfaceType` alone answers this correctly only for a
|
|
62
|
+
* receiver whose OWN symbol is the standard interface's symbol, which is
|
|
63
|
+
* exactly the case that is NOT one symbol per checker: `class Registry
|
|
64
|
+
* extends Map<string, number> {}` has its own distinct `Registry` symbol,
|
|
65
|
+
* and `<T extends Map<string, number>>(cache: T)` has its own distinct
|
|
66
|
+
* per-declaration type-parameter symbol. Both are real writes to a real
|
|
67
|
+
* `Map`, and answering "no" to either is not a false-positive removed --
|
|
68
|
+
* it is a write silently dropped, which types the target cell more
|
|
69
|
+
* narrowly than the program fills it. the value-flow survey calls that strictly
|
|
70
|
+
* worse than the boxing this whole despecialization pass exists to remove.
|
|
71
|
+
*
|
|
72
|
+
* The cure is two checker calls this file already treats as fixed
|
|
73
|
+
* properties of the program rather than of a census's evolving view:
|
|
74
|
+
* `checker.getApparentType` resolves a type parameter to its constraint
|
|
75
|
+
* (an object type's apparent type is itself, so this is free for the
|
|
76
|
+
* ordinary case), and `checker.getBaseTypes` walks a class/interface's
|
|
77
|
+
* declared `extends` clause -- transitively, since a subclass may itself be
|
|
78
|
+
* subclassed. A union answers "no" unless EVERY constituent qualifies: a
|
|
79
|
+
* `Map<string, number> | SomethingElse` receiver is not a single collection
|
|
80
|
+
* kind this layer can state a write for, so it refuses by name (the
|
|
81
|
+
* `COLLECTION_KEY_METHODS`/`APPEND_METHODS` gate above simply does not fire)
|
|
82
|
+
* rather than picking one union arm and guessing.
|
|
83
|
+
*/
|
|
84
|
+
const matchesStandardInterfaceTransitively = (checker, anchor, names, type) => {
|
|
85
|
+
const apparent = checker.getApparentType(type);
|
|
86
|
+
if (apparent.isUnion()) {
|
|
87
|
+
return (apparent.types.length > 0 && apparent.types.every((member) => matchesStandardInterfaceTransitively(checker, anchor, names, member)));
|
|
88
|
+
}
|
|
89
|
+
const visited = new Set();
|
|
90
|
+
const visit = (candidate) => {
|
|
91
|
+
if (visited.has(candidate))
|
|
92
|
+
return false;
|
|
93
|
+
visited.add(candidate);
|
|
94
|
+
if (names.some((name) => isStandardInterfaceType(checker, anchor, name, candidate)))
|
|
95
|
+
return true;
|
|
96
|
+
const declared = heritageClassOrInterfaceOf(candidate);
|
|
97
|
+
return declared !== null && checker.getBaseTypes(declared).some(visit);
|
|
98
|
+
};
|
|
99
|
+
return visit(apparent);
|
|
100
|
+
};
|
|
101
|
+
/** Whether `receiver`'s type is, or derives from, one of the four standard keyed-collection interfaces -- see `matchesStandardInterfaceTransitively`. */
|
|
102
|
+
const isKeyedCollectionReceiver = (checker, receiver, type) => matchesStandardInterfaceTransitively(checker, receiver, KEYED_COLLECTION_INTERFACES, type);
|
|
103
|
+
/**
|
|
104
|
+
* Whether `receiver`'s type is a real JS array or tuple -- `checker.isArrayType`
|
|
105
|
+
* (the same authority `structural-array-element.ts`/`field-bindings.ts`/
|
|
106
|
+
* `collection-bindings.ts`/`object-bag-bindings.ts`/`structural.ts` already
|
|
107
|
+
* use for the identical question) plus `checker.isTupleType`, since a tuple
|
|
108
|
+
* (`[number, number]`) is not an array type by that authority's own answer
|
|
109
|
+
* but is exactly as real a receiver for `.push`/`.unshift`/`.fill`. Both are
|
|
110
|
+
* asked of the APPARENT type so `<T extends number[]>(xs: T)` resolves `T`
|
|
111
|
+
* to its constraint first, for the same reason `matchesStandardInterfaceTransitively`
|
|
112
|
+
* does.
|
|
113
|
+
*/
|
|
114
|
+
const isArrayReceiver = (checker, type) => {
|
|
115
|
+
const apparent = checker.getApparentType(type);
|
|
116
|
+
return checker.isArrayType(apparent) || checker.isTupleType(apparent);
|
|
117
|
+
};
|
|
118
|
+
/**
|
|
119
|
+
* Whether `receiver`'s type is, or derives from, one of the nine standard
|
|
120
|
+
* TypedArray instance interfaces -- `Int8Array`, ..., `Float64Array` --
|
|
121
|
+
* asked with the same base-chain-aware `matchesStandardInterfaceTransitively`
|
|
122
|
+
* used for the keyed collections above, against the SAME nine names
|
|
123
|
+
* `host-protocols.ts:typedArrayDeclarationsOf` resolves for the census that
|
|
124
|
+
* reads a typed array's element domain. That function itself needs an
|
|
125
|
+
* `IdentityTable`, which does not exist yet when this index is built (see
|
|
126
|
+
* `isStandardInterfaceType`'s own doc comment on why this file resolves
|
|
127
|
+
* standard-library identity by raw `ts.Symbol` rather than `DeclarationId`);
|
|
128
|
+
* `typedArrayInstanceInterfaceNames` is the same nine names exported so this
|
|
129
|
+
* is a second CALLER of one list, not a second, independently-typed list.
|
|
130
|
+
*
|
|
131
|
+
* `.fill` is the only method this file asks of a typed array receiver: a
|
|
132
|
+
* typed array's element write is precisely what the dense-buffer carrier
|
|
133
|
+
* exists to state, and `push`/`unshift` do not type-check against one at
|
|
134
|
+
* all (a typed array has no such methods), so `APPEND_METHODS` never needs
|
|
135
|
+
* this check.
|
|
136
|
+
*/
|
|
137
|
+
const isTypedArrayReceiver = (checker, receiver, type) => matchesStandardInterfaceTransitively(checker, receiver, typedArrayInstanceInterfaceNames, type);
|
|
138
|
+
const COMPOUND_TOKENS = new Set([
|
|
139
|
+
ts.SyntaxKind.PlusEqualsToken,
|
|
140
|
+
ts.SyntaxKind.MinusEqualsToken,
|
|
141
|
+
ts.SyntaxKind.AsteriskEqualsToken,
|
|
142
|
+
ts.SyntaxKind.AsteriskAsteriskEqualsToken,
|
|
143
|
+
ts.SyntaxKind.SlashEqualsToken,
|
|
144
|
+
ts.SyntaxKind.PercentEqualsToken,
|
|
145
|
+
ts.SyntaxKind.LessThanLessThanEqualsToken,
|
|
146
|
+
ts.SyntaxKind.GreaterThanGreaterThanEqualsToken,
|
|
147
|
+
ts.SyntaxKind.GreaterThanGreaterThanGreaterThanEqualsToken,
|
|
148
|
+
ts.SyntaxKind.AmpersandEqualsToken,
|
|
149
|
+
ts.SyntaxKind.BarEqualsToken,
|
|
150
|
+
ts.SyntaxKind.CaretEqualsToken
|
|
151
|
+
]);
|
|
152
|
+
const LOGICAL_TOKENS = new Set([
|
|
153
|
+
ts.SyntaxKind.BarBarEqualsToken,
|
|
154
|
+
ts.SyntaxKind.AmpersandAmpersandEqualsToken,
|
|
155
|
+
ts.SyntaxKind.QuestionQuestionEqualsToken
|
|
156
|
+
]);
|
|
157
|
+
/** Whether this call is `Object.assign(...)` on the real global, resolved by DECLARATION IDENTITY (`isGlobalObjectConstructor`) rather than by the spelling `'ObjectConstructor'`. */
|
|
158
|
+
export const isGlobalObjectAssign = (checker, call) => {
|
|
159
|
+
const callee = call.expression;
|
|
160
|
+
if (!ts.isPropertyAccessExpression(callee) || callee.name.text !== 'assign')
|
|
161
|
+
return false;
|
|
162
|
+
if (!ts.isIdentifier(callee.expression))
|
|
163
|
+
return false;
|
|
164
|
+
return isGlobalObjectConstructor(checker, callee.expression, checker.getTypeAtLocation(callee.expression));
|
|
165
|
+
};
|
|
166
|
+
const push = (table, key, value) => {
|
|
167
|
+
const existing = table.get(key);
|
|
168
|
+
if (existing)
|
|
169
|
+
existing.push(value);
|
|
170
|
+
else
|
|
171
|
+
table.set(key, [value]);
|
|
172
|
+
};
|
|
173
|
+
/**
|
|
174
|
+
* Index every write edge in the program.
|
|
175
|
+
*
|
|
176
|
+
* The initial index uses checker identities. Later rounds add receiver and
|
|
177
|
+
* call facts supplied by the preceding census, retaining the original edges.
|
|
178
|
+
* Call attribution and its argument edges must enter together: publishing a
|
|
179
|
+
* callee without its inputs would hide mutations performed by that body.
|
|
180
|
+
*/
|
|
181
|
+
export const indexValueFlow = (checker, files, reachable,
|
|
182
|
+
/**
|
|
183
|
+
* The round's settled census view of an expression's type, for the ONE
|
|
184
|
+
* question this index cannot answer from the checker alone: a receiver the
|
|
185
|
+
* checker types `any`. Absent it (round one, and every caller that has no
|
|
186
|
+
* census yet) this index is byte-identical to the one it replaced.
|
|
187
|
+
*
|
|
188
|
+
* It is what makes rule 1 above conditional rather than absolute: an `any`
|
|
189
|
+
* receiver has no member symbols and no array/collection identity, so
|
|
190
|
+
* `container.seq.push(x)` -- three's `WebGLUniforms.addUniform`, with
|
|
191
|
+
* `container` unannotated -- names no cell and records no append, and the
|
|
192
|
+
* `seq` it fills is refused `array:no-writes` while every element it holds
|
|
193
|
+
* sits at that push. The checker's answer is used whenever it HAS one; the
|
|
194
|
+
* census is consulted only where the checker said `any`, so no edge this
|
|
195
|
+
* index already stated can change.
|
|
196
|
+
*/
|
|
197
|
+
censusTypeOf,
|
|
198
|
+
/** Existing call-attribution census, not a new resolver in the flow index. */
|
|
199
|
+
censusCallDeclarationOf, censusCallTargetsOf,
|
|
200
|
+
/** A compiler option, not a type/closure result; retained identically in every round. */
|
|
201
|
+
buildIsStrict = false,
|
|
202
|
+
/** Existing `.call`/`.apply` census, not a new resolver in the flow index -- see `invocationOperandsOf`'s own doc. */
|
|
203
|
+
censusExplicitThisAt) => {
|
|
204
|
+
const calls = [];
|
|
205
|
+
const propertyAccesses = [];
|
|
206
|
+
const bindingPatternReads = [];
|
|
207
|
+
const arrayLiterals = [];
|
|
208
|
+
const accessorNames = new Set();
|
|
209
|
+
let hasComputedAccessorName = false;
|
|
210
|
+
const classDeclarations = [];
|
|
211
|
+
const receiverReferences = new Map();
|
|
212
|
+
const receiverOwners = new Map();
|
|
213
|
+
const indexedCallableBodies = new WeakSet();
|
|
214
|
+
const memberReferences = new Map();
|
|
215
|
+
const state = {
|
|
216
|
+
bySymbol: new Map(),
|
|
217
|
+
byDeclaration: new Map(),
|
|
218
|
+
fromSymbol: new Map(),
|
|
219
|
+
fromDeclaration: new Map(),
|
|
220
|
+
referencesBySymbol: new Map(),
|
|
221
|
+
referencesByDeclaration: new Map(),
|
|
222
|
+
allWrites: [],
|
|
223
|
+
edgeCounts: new Map()
|
|
224
|
+
};
|
|
225
|
+
const effectiveType = (expression) => {
|
|
226
|
+
const stated = checker.getTypeAtLocation(expression);
|
|
227
|
+
if (!censusTypeOf || (stated.flags & (ts.TypeFlags.Any | ts.TypeFlags.Unknown)) === 0)
|
|
228
|
+
return stated;
|
|
229
|
+
return censusTypeOf(expression) ?? stated;
|
|
230
|
+
};
|
|
231
|
+
const invocationOperands = new Map();
|
|
232
|
+
const invocationOperandsAt = (call) => {
|
|
233
|
+
const known = invocationOperands.get(call);
|
|
234
|
+
if (known)
|
|
235
|
+
return known;
|
|
236
|
+
// TEMPORARY bisect switch, remove before landing. `GEA_NO_EXPLICIT_THIS_FLOW=1`
|
|
237
|
+
// unthreads the `.call`/`.apply` explicit-this census from the flow index so
|
|
238
|
+
// one build answers whether it is what un-authenticates borrowed builtins.
|
|
239
|
+
const operands = process.env['GEA_NO_EXPLICIT_THIS_FLOW'] === '1'
|
|
240
|
+
? invocationOperandsOf(checker, call)
|
|
241
|
+
: invocationOperandsOf(checker, call, censusExplicitThisAt);
|
|
242
|
+
invocationOperands.set(call, operands);
|
|
243
|
+
return operands;
|
|
244
|
+
};
|
|
245
|
+
const targetMemo = new Map();
|
|
246
|
+
const targetOf = (expression) => {
|
|
247
|
+
const cached = targetMemo.get(expression);
|
|
248
|
+
if (cached !== undefined)
|
|
249
|
+
return cached;
|
|
250
|
+
const resolved = flowTargetOf(checker, expression);
|
|
251
|
+
targetMemo.set(expression, resolved);
|
|
252
|
+
return resolved;
|
|
253
|
+
};
|
|
254
|
+
const record = (target, edge, slot, member, value, site, naming = null, iterationOrigin, propertyAccess = null) => {
|
|
255
|
+
// A computed receiver or an `any` property can have no checker symbol
|
|
256
|
+
// and still name real heap storage. Keep its write in the shared inventory;
|
|
257
|
+
// symbol-keyed consumers have no entry, while provenance follows `naming`.
|
|
258
|
+
if (!target && !naming)
|
|
259
|
+
return;
|
|
260
|
+
const cell = target ?? { symbol: null, nameSymbol: null, declaration: null };
|
|
261
|
+
const write = {
|
|
262
|
+
edge,
|
|
263
|
+
slot,
|
|
264
|
+
member,
|
|
265
|
+
value,
|
|
266
|
+
site,
|
|
267
|
+
target: cell,
|
|
268
|
+
naming,
|
|
269
|
+
propertyAccess,
|
|
270
|
+
...(iterationOrigin ? { iterationOrigin } : {})
|
|
271
|
+
};
|
|
272
|
+
state.allWrites.push(write);
|
|
273
|
+
if (cell.symbol)
|
|
274
|
+
push(state.bySymbol, cell.symbol, write);
|
|
275
|
+
if (cell.declaration)
|
|
276
|
+
push(state.byDeclaration, cell.declaration, write);
|
|
277
|
+
state.edgeCounts.set(edge, (state.edgeCounts.get(edge) ?? 0) + 1);
|
|
278
|
+
// The reverse direction, recorded from the same edge: whatever cell the
|
|
279
|
+
// VALUE names has its contents flowing into `target`.
|
|
280
|
+
if (!value)
|
|
281
|
+
return;
|
|
282
|
+
const source = targetOf(value);
|
|
283
|
+
if (!source)
|
|
284
|
+
return;
|
|
285
|
+
if (source.symbol)
|
|
286
|
+
push(state.fromSymbol, source.symbol, write);
|
|
287
|
+
if (source.declaration)
|
|
288
|
+
push(state.fromDeclaration, source.declaration, write);
|
|
289
|
+
};
|
|
290
|
+
/** A cell reached BY NAME: `o.p = v` fills `p`'s own cell whole, and fills a `member` slot of `o`'s. Both are recorded, because different censuses own the two questions. */
|
|
291
|
+
const recordNamedWrite = (access, edge, value, site) => {
|
|
292
|
+
record(targetOf(access), edge, 'whole', null, value, site, access, undefined, access);
|
|
293
|
+
record(targetOf(access.expression), edge, 'member', access.name.text, value, site, access.expression, undefined, access);
|
|
294
|
+
};
|
|
295
|
+
/** `o[k] = v`. A LITERAL `k` is a named member spelled with brackets -- the same partition every reader in this compiler already draws with `literalMemberNameOf`. */
|
|
296
|
+
const recordIndexedWrite = (access, edge, value, site) => {
|
|
297
|
+
const name = literalMemberNameOf(access);
|
|
298
|
+
if (name !== null) {
|
|
299
|
+
record(targetOf(access), edge, 'whole', null, value, site, access, undefined, access);
|
|
300
|
+
record(targetOf(access.expression), edge, 'member', name, value, site, access.expression, undefined, access);
|
|
301
|
+
return;
|
|
302
|
+
}
|
|
303
|
+
record(targetOf(access.expression), edge, 'element', null, value, site, access.expression, undefined, access);
|
|
304
|
+
};
|
|
305
|
+
/** The write target of an assignment-like form, in whichever of the three naming shapes it takes. */
|
|
306
|
+
const recordAssignmentTarget = (left, edge, value, site, iterationOrigin) => {
|
|
307
|
+
const target = unwrapNaming(left);
|
|
308
|
+
if (ts.isPropertyAccessExpression(target))
|
|
309
|
+
recordNamedWrite(target, edge, value, site);
|
|
310
|
+
else if (ts.isElementAccessExpression(target))
|
|
311
|
+
recordIndexedWrite(target, edge, value, site);
|
|
312
|
+
else
|
|
313
|
+
record(targetOf(target), edge, 'whole', null, value, site, target, iterationOrigin);
|
|
314
|
+
};
|
|
315
|
+
/**
|
|
316
|
+
* A binding pattern's elements, each of which is a cell the pattern fills.
|
|
317
|
+
* The pattern's SOURCE is the write's value where the element names one
|
|
318
|
+
* member of it; where it does not (an array pattern, a rest element), the
|
|
319
|
+
* element states only that the cell exists, which is what a `null` value
|
|
320
|
+
* means everywhere in this index.
|
|
321
|
+
*/
|
|
322
|
+
const recordBindingPattern = (pattern, source) => {
|
|
323
|
+
for (const element of pattern.elements) {
|
|
324
|
+
if (ts.isOmittedExpression(element))
|
|
325
|
+
continue;
|
|
326
|
+
bindingPatternReads.push(element);
|
|
327
|
+
const cell = ts.isIdentifier(element.name) ? targetOf(element.name) : null;
|
|
328
|
+
const naming = ts.isIdentifier(element.name) ? element.name : null;
|
|
329
|
+
record(cell, 'destructuring', 'whole', null, null, element, naming);
|
|
330
|
+
if (element.initializer)
|
|
331
|
+
record(cell, 'destructuring-default', 'whole', null, element.initializer, element, naming);
|
|
332
|
+
if (ts.isObjectBindingPattern(element.name) || ts.isArrayBindingPattern(element.name))
|
|
333
|
+
recordBindingPattern(element.name, null);
|
|
334
|
+
// The pattern READS a slot of its source, which is the reverse-direction
|
|
335
|
+
// fact a consumer asking "where does this cell's value go" needs.
|
|
336
|
+
if (source && ts.isObjectBindingPattern(pattern) && !element.dotDotDotToken) {
|
|
337
|
+
const key = element.propertyName ?? element.name;
|
|
338
|
+
if (ts.isIdentifier(key))
|
|
339
|
+
record(targetOf(source), 'destructuring', 'member', key.text, null, element, source);
|
|
340
|
+
}
|
|
341
|
+
}
|
|
342
|
+
};
|
|
343
|
+
/** `({ p: o.q } = v)` / `[o.q] = v` -- a destructuring ASSIGNMENT, whose targets are ordinary naming expressions rather than binding elements. */
|
|
344
|
+
const recordAssignmentPattern = (pattern) => {
|
|
345
|
+
if (ts.isArrayLiteralExpression(pattern)) {
|
|
346
|
+
for (const element of pattern.elements) {
|
|
347
|
+
if (ts.isOmittedExpression(element))
|
|
348
|
+
continue;
|
|
349
|
+
const inner = ts.isSpreadElement(element) ? element.expression : element;
|
|
350
|
+
if (ts.isBinaryExpression(inner) && inner.operatorToken.kind === ts.SyntaxKind.EqualsToken) {
|
|
351
|
+
const defaultedTarget = unwrapNaming(inner.left);
|
|
352
|
+
// A nested pattern (`[a, [b]] = [1, [2]]`) names no single cell
|
|
353
|
+
// itself -- `recordAssignmentTarget` on it would resolve to no
|
|
354
|
+
// target and record nothing -- so its OWN elements are this same
|
|
355
|
+
// walk one level deeper, the assignment twin of `recordBindingPattern`'s
|
|
356
|
+
// identical recursion for a nested BINDING pattern above.
|
|
357
|
+
if (ts.isObjectLiteralExpression(defaultedTarget) || ts.isArrayLiteralExpression(defaultedTarget)) {
|
|
358
|
+
recordAssignmentPattern(defaultedTarget);
|
|
359
|
+
}
|
|
360
|
+
else {
|
|
361
|
+
recordAssignmentTarget(inner.left, 'destructuring', null, inner);
|
|
362
|
+
}
|
|
363
|
+
recordAssignmentTarget(inner.left, 'destructuring-default', inner.right, inner);
|
|
364
|
+
continue;
|
|
365
|
+
}
|
|
366
|
+
const target = unwrapNaming(inner);
|
|
367
|
+
if (ts.isObjectLiteralExpression(target) || ts.isArrayLiteralExpression(target)) {
|
|
368
|
+
recordAssignmentPattern(target);
|
|
369
|
+
continue;
|
|
370
|
+
}
|
|
371
|
+
recordAssignmentTarget(inner, 'destructuring', null, element);
|
|
372
|
+
}
|
|
373
|
+
return;
|
|
374
|
+
}
|
|
375
|
+
for (const property of pattern.properties) {
|
|
376
|
+
if (ts.isShorthandPropertyAssignment(property)) {
|
|
377
|
+
record(targetOf(property.name), 'destructuring', 'whole', null, null, property, property.name);
|
|
378
|
+
if (property.objectAssignmentInitializer) {
|
|
379
|
+
record(targetOf(property.name), 'destructuring-default', 'whole', null, property.objectAssignmentInitializer, property, property.name);
|
|
380
|
+
}
|
|
381
|
+
continue;
|
|
382
|
+
}
|
|
383
|
+
if (!ts.isPropertyAssignment(property))
|
|
384
|
+
continue;
|
|
385
|
+
const value = property.initializer;
|
|
386
|
+
if (ts.isBinaryExpression(value) && value.operatorToken.kind === ts.SyntaxKind.EqualsToken) {
|
|
387
|
+
recordAssignmentTarget(value.left, 'destructuring', null, value);
|
|
388
|
+
recordAssignmentTarget(value.left, 'destructuring-default', value.right, value);
|
|
389
|
+
continue;
|
|
390
|
+
}
|
|
391
|
+
recordAssignmentTarget(value, 'destructuring', null, property);
|
|
392
|
+
}
|
|
393
|
+
};
|
|
394
|
+
/** Every argument of a call reaching the parameter slot it lands in -- positionally, and never through a rest slot or a spread, neither of which is one slot. */
|
|
395
|
+
const recordCallArguments = (call, edge) => {
|
|
396
|
+
const original = calleeDeclarationOf(checker, call);
|
|
397
|
+
const inferred = censusCallDeclarationOf?.(call);
|
|
398
|
+
const operands = invocationOperandsAt(call);
|
|
399
|
+
const explicitTarget = operands.explicitThis ? callableDeclarationOfExpression(checker, operands.callee) : null;
|
|
400
|
+
for (const callee of new Set([original, explicitTarget, inferred, ...(censusCallTargetsOf?.(call) ?? [])])) {
|
|
401
|
+
if (!callee || !isRealCallableDeclaration(callee) || callee.getSourceFile().isDeclarationFile)
|
|
402
|
+
continue;
|
|
403
|
+
const args = callee === original && callee !== explicitTarget ? call.arguments : operands.args;
|
|
404
|
+
if (!args || args.length === 0)
|
|
405
|
+
continue;
|
|
406
|
+
// Everything from the rest slot onward lands in the SAME parameter, and
|
|
407
|
+
// `parameters[position]` runs out at the first one past it.
|
|
408
|
+
const parameters = runtimeParametersOf(callee);
|
|
409
|
+
const last = parameters[parameters.length - 1];
|
|
410
|
+
const rest = last && ts.isParameter(last) && last.dotDotDotToken ? last : undefined;
|
|
411
|
+
args.forEach((argument, position) => {
|
|
412
|
+
if (ts.isSpreadElement(argument))
|
|
413
|
+
return;
|
|
414
|
+
const parameter = parameters[position] ?? rest;
|
|
415
|
+
// `ts.isFunctionLike` admits a `JSDocSignature`, whose "parameters" are
|
|
416
|
+
// JSDoc TAGS rather than real `ParameterDeclaration`s and carry no
|
|
417
|
+
// `name` at all -- a shape `ts.isIdentifier` crashes on rather than
|
|
418
|
+
// rejecting. A slot with no name is no slot.
|
|
419
|
+
if (!parameter || !ts.isParameter(parameter) || !ts.isIdentifier(parameter.name))
|
|
420
|
+
return;
|
|
421
|
+
if (parameter.dotDotDotToken)
|
|
422
|
+
record(targetOf(parameter.name), 'rest-argument', 'element', null, argument, argument, parameter.name);
|
|
423
|
+
else
|
|
424
|
+
record(targetOf(parameter.name), edge, 'whole', null, argument, argument, parameter.name);
|
|
425
|
+
});
|
|
426
|
+
}
|
|
427
|
+
};
|
|
428
|
+
const visitCall = (node) => {
|
|
429
|
+
recordCallArguments(node, node.expression.kind === ts.SyntaxKind.SuperKeyword ? 'super-argument' : 'call-argument');
|
|
430
|
+
if (isGlobalObjectAssign(checker, node) && node.arguments.length >= 2) {
|
|
431
|
+
const [target, ...sources] = node.arguments;
|
|
432
|
+
// The key set a merge moves is the SOURCE's, and reading it is the
|
|
433
|
+
// consuming census's own policy (`object-bag-bindings.ts` reads three
|
|
434
|
+
// shapes in order and refuses the rest). This layer states only that a
|
|
435
|
+
// bulk write happened and what it came from.
|
|
436
|
+
if (target)
|
|
437
|
+
for (const source of sources)
|
|
438
|
+
record(targetOf(target), 'object-assign', 'bulk', null, source, node, target);
|
|
439
|
+
}
|
|
440
|
+
const callee = node.expression;
|
|
441
|
+
if (!ts.isPropertyAccessExpression(callee))
|
|
442
|
+
return;
|
|
443
|
+
const method = callee.name.text;
|
|
444
|
+
const receiver = callee.expression;
|
|
445
|
+
if (APPEND_METHODS.has(method)) {
|
|
446
|
+
if (isArrayReceiver(checker, effectiveType(receiver))) {
|
|
447
|
+
for (const argument of node.arguments) {
|
|
448
|
+
if (ts.isSpreadElement(argument))
|
|
449
|
+
continue;
|
|
450
|
+
record(targetOf(receiver), 'array-append', 'element', null, argument, node, receiver);
|
|
451
|
+
}
|
|
452
|
+
}
|
|
453
|
+
return;
|
|
454
|
+
}
|
|
455
|
+
if (method === 'fill') {
|
|
456
|
+
if (isArrayReceiver(checker, effectiveType(receiver)) || isTypedArrayReceiver(checker, receiver, effectiveType(receiver))) {
|
|
457
|
+
const value = node.arguments[0];
|
|
458
|
+
if (value && !ts.isSpreadElement(value))
|
|
459
|
+
record(targetOf(receiver), 'array-fill', 'element', null, value, node, receiver);
|
|
460
|
+
}
|
|
461
|
+
return;
|
|
462
|
+
}
|
|
463
|
+
if (!COLLECTION_KEY_METHODS.has(method) || !isKeyedCollectionReceiver(checker, receiver, effectiveType(receiver)))
|
|
464
|
+
return;
|
|
465
|
+
const key = node.arguments[0];
|
|
466
|
+
if (key && !ts.isSpreadElement(key))
|
|
467
|
+
record(targetOf(receiver), 'collection-key', 'collection-key', null, key, node, receiver);
|
|
468
|
+
if (method !== 'set')
|
|
469
|
+
return;
|
|
470
|
+
const value = node.arguments[1];
|
|
471
|
+
if (value && !ts.isSpreadElement(value))
|
|
472
|
+
record(targetOf(receiver), 'collection-value', 'collection-value', null, value, node, receiver);
|
|
473
|
+
};
|
|
474
|
+
/**
|
|
475
|
+
* Every expression that NAMES a cell, in whatever position it stands.
|
|
476
|
+
*
|
|
477
|
+
* Recorded under all three of a `FlowTarget`'s keys deliberately: a
|
|
478
|
+
* consumer's question here is negative ("is there a mention I cannot
|
|
479
|
+
* explain?"), so a mention filed under one key too many can only make it
|
|
480
|
+
* refuse. Filing one under too FEW is what makes an escape analysis
|
|
481
|
+
* silently claim closure it has not proved -- and the two
|
|
482
|
+
* property-symbol resolutions disagree on 1339 of the three.js app's 22556
|
|
483
|
+
* property accesses, so picking one would do exactly that.
|
|
484
|
+
*/
|
|
485
|
+
const recordReference = (expression) => {
|
|
486
|
+
const target = targetOf(expression);
|
|
487
|
+
if (!target)
|
|
488
|
+
return;
|
|
489
|
+
const parent = expression.parent;
|
|
490
|
+
const aliasDeclaration = ts.isNamespaceImport(parent) ||
|
|
491
|
+
ts.isImportSpecifier(parent) ||
|
|
492
|
+
ts.isImportClause(parent) ||
|
|
493
|
+
ts.isImportEqualsDeclaration(parent) ||
|
|
494
|
+
ts.isExportSpecifier(parent);
|
|
495
|
+
if (aliasDeclaration ||
|
|
496
|
+
(((target.symbol?.flags ?? 0) | (target.nameSymbol?.flags ?? 0)) & (ts.SymbolFlags.Alias | ts.SymbolFlags.Module)) === 0) {
|
|
497
|
+
if (target.symbol)
|
|
498
|
+
push(state.referencesBySymbol, target.symbol, expression);
|
|
499
|
+
if (target.nameSymbol && target.nameSymbol !== target.symbol)
|
|
500
|
+
push(state.referencesBySymbol, target.nameSymbol, expression);
|
|
501
|
+
if (target.declaration)
|
|
502
|
+
push(state.referencesByDeclaration, target.declaration, expression);
|
|
503
|
+
return;
|
|
504
|
+
}
|
|
505
|
+
const symbols = new Set();
|
|
506
|
+
const declarations = new Set();
|
|
507
|
+
if (target.declaration)
|
|
508
|
+
declarations.add(target.declaration);
|
|
509
|
+
const addSymbol = (symbol) => {
|
|
510
|
+
if (!symbol || symbols.has(symbol))
|
|
511
|
+
return;
|
|
512
|
+
symbols.add(symbol);
|
|
513
|
+
const canonical = resolveFlowSymbolAlias(checker, symbol);
|
|
514
|
+
if (!canonical)
|
|
515
|
+
return;
|
|
516
|
+
symbols.add(canonical);
|
|
517
|
+
const declaration = canonical.valueDeclaration ?? canonical.declarations?.[0];
|
|
518
|
+
if (declaration)
|
|
519
|
+
declarations.add(declaration);
|
|
520
|
+
};
|
|
521
|
+
addSymbol(target.symbol);
|
|
522
|
+
addSymbol(target.nameSymbol);
|
|
523
|
+
// Keep the import's local cell identity, but also record uses under the
|
|
524
|
+
// declaration it denotes. Otherwise an opaque consumer of an imported
|
|
525
|
+
// constructor disappears from that constructor's escape inventory.
|
|
526
|
+
// A whole namespace publication exposes its exported values as well;
|
|
527
|
+
// selected members have their own references in this same walk.
|
|
528
|
+
const selectedMember = (ts.isPropertyAccessExpression(parent) && parent.expression === expression) ||
|
|
529
|
+
(ts.isElementAccessExpression(parent) && parent.expression === expression && ts.isStringLiteralLike(parent.argumentExpression));
|
|
530
|
+
if (!selectedMember && !isTypePositionReference(expression)) {
|
|
531
|
+
const visited = new Set();
|
|
532
|
+
const exposeNamespace = (symbol) => {
|
|
533
|
+
const canonical = resolveFlowSymbolAlias(checker, symbol);
|
|
534
|
+
if (!canonical || visited.has(canonical))
|
|
535
|
+
return;
|
|
536
|
+
visited.add(canonical);
|
|
537
|
+
if ((canonical.flags & ts.SymbolFlags.Module) === 0 || (canonical.flags & ts.SymbolFlags.Class) !== 0)
|
|
538
|
+
return;
|
|
539
|
+
// Export identities and runtime property visibility answer different
|
|
540
|
+
// questions. The synthetic global namespace exports lexical bindings
|
|
541
|
+
// which globalThis cannot read. Conversely, a JS expando variable has
|
|
542
|
+
// a module flag but its instance type also includes inherited methods;
|
|
543
|
+
// those are receiver uses, not references to exported bindings.
|
|
544
|
+
const runtimeKeys = new Set(checker
|
|
545
|
+
.getTypeOfSymbolAtLocation(canonical, expression)
|
|
546
|
+
.getProperties()
|
|
547
|
+
.map((value) => value.name));
|
|
548
|
+
for (const exported of checker.getExportsOfModule(canonical)) {
|
|
549
|
+
if (!runtimeKeys.has(exported.name))
|
|
550
|
+
continue;
|
|
551
|
+
const value = resolveFlowSymbolAlias(checker, exported);
|
|
552
|
+
if (!value || (value.flags & ts.SymbolFlags.Value) === 0)
|
|
553
|
+
continue;
|
|
554
|
+
addSymbol(value);
|
|
555
|
+
exposeNamespace(value);
|
|
556
|
+
}
|
|
557
|
+
};
|
|
558
|
+
for (const symbol of [...symbols])
|
|
559
|
+
exposeNamespace(symbol);
|
|
560
|
+
}
|
|
561
|
+
for (const symbol of symbols)
|
|
562
|
+
push(state.referencesBySymbol, symbol, expression);
|
|
563
|
+
for (const declaration of declarations)
|
|
564
|
+
push(state.referencesByDeclaration, declaration, expression);
|
|
565
|
+
};
|
|
566
|
+
const visit = (node) => {
|
|
567
|
+
// Use the same member boundary as normalization: excluded bodies cannot
|
|
568
|
+
// contribute callers or writes to the live program's typing evidence.
|
|
569
|
+
if (reachable.memberIsPruned(node))
|
|
570
|
+
return;
|
|
571
|
+
if (ts.isFunctionLike(node) && 'body' in node && node.body)
|
|
572
|
+
indexedCallableBodies.add(node);
|
|
573
|
+
// A pre-ES6 `function F() { this.x = ... }` is a class -- TypeScript types
|
|
574
|
+
// it as one -- and this enumeration is what every family walk means by
|
|
575
|
+
// "the source classes". Widening the type without widening this made the
|
|
576
|
+
// whole change inert: a constructor-function root reached
|
|
577
|
+
// `owned-class-receivers.ts`'s family test, was not in this list, and was
|
|
578
|
+
// refused as `root-outside-family` exactly as before.
|
|
579
|
+
if (ts.isClassDeclaration(node) || ts.isClassExpression(node) || isConstructorFunction(node))
|
|
580
|
+
classDeclarations.push(node);
|
|
581
|
+
if (ts.isArrayLiteralExpression(node) && !isAssignmentPattern(node))
|
|
582
|
+
arrayLiterals.push(node);
|
|
583
|
+
if (ts.isGetAccessorDeclaration(node) || ts.isSetAccessorDeclaration(node)) {
|
|
584
|
+
const name = node.name;
|
|
585
|
+
if (ts.isIdentifier(name) || ts.isStringLiteralLike(name) || ts.isNumericLiteral(name))
|
|
586
|
+
accessorNames.add(name.text);
|
|
587
|
+
else
|
|
588
|
+
hasComputedAccessorName = true;
|
|
589
|
+
}
|
|
590
|
+
if (node.kind === ts.SyntaxKind.ThisKeyword || node.kind === ts.SyntaxKind.SuperKeyword) {
|
|
591
|
+
// `super` changes property lookup, not the receiver. Arrows inherit both
|
|
592
|
+
// references from their enclosing frame; ordinary callables, class field
|
|
593
|
+
// initializers and static blocks each introduce their own. Keep the two
|
|
594
|
+
// spellings in one walk so closure consumers cannot miss a receiver edge
|
|
595
|
+
// hidden behind lexical-super dispatch.
|
|
596
|
+
let branch = node;
|
|
597
|
+
for (let owner = node.parent; owner; branch = owner, owner = owner.parent) {
|
|
598
|
+
// A computed class/object member name evaluates in the enclosing
|
|
599
|
+
// frame, before that member's own receiver exists.
|
|
600
|
+
if ((ts.isMethodDeclaration(owner) ||
|
|
601
|
+
ts.isGetAccessorDeclaration(owner) ||
|
|
602
|
+
ts.isSetAccessorDeclaration(owner) ||
|
|
603
|
+
ts.isPropertyDeclaration(owner)) &&
|
|
604
|
+
owner.name === branch)
|
|
605
|
+
continue;
|
|
606
|
+
if ((ts.isFunctionLike(owner) && !ts.isArrowFunction(owner)) ||
|
|
607
|
+
ts.isPropertyDeclaration(owner) ||
|
|
608
|
+
ts.isClassStaticBlockDeclaration(owner)) {
|
|
609
|
+
push(receiverReferences, owner, node);
|
|
610
|
+
receiverOwners.set(node, owner);
|
|
611
|
+
break;
|
|
612
|
+
}
|
|
613
|
+
if (ts.isSourceFile(owner))
|
|
614
|
+
break;
|
|
615
|
+
}
|
|
616
|
+
}
|
|
617
|
+
if (ts.isIdentifier(node) || ts.isPrivateIdentifier(node)) {
|
|
618
|
+
const symbol = checker.getSymbolAtLocation(node);
|
|
619
|
+
if (symbol)
|
|
620
|
+
push(memberReferences, symbol, node);
|
|
621
|
+
}
|
|
622
|
+
if (ts.isCallExpression(node) || ts.isNewExpression(node)) {
|
|
623
|
+
const operands = invocationOperandsAt(node);
|
|
624
|
+
const explicitThis = operands.explicitThis ? { callee: operands.callee, receiver: operands.receiver, args: operands.args } : null;
|
|
625
|
+
const inferredDeclaration = censusCallDeclarationOf?.(node);
|
|
626
|
+
const explicitTarget = explicitThis ? callableDeclarationOfExpression(checker, explicitThis.callee) : null;
|
|
627
|
+
calls.push({
|
|
628
|
+
call: node,
|
|
629
|
+
targets: [...new Set([...(explicitTarget ? [explicitTarget] : []), ...(censusCallTargetsOf?.(node) ?? [])])],
|
|
630
|
+
explicitThis,
|
|
631
|
+
operands,
|
|
632
|
+
...(inferredDeclaration ? { inferredDeclaration } : {}),
|
|
633
|
+
checkerDeclaration: explicitThis ? null : (checker.getResolvedSignature(node)?.declaration ?? null)
|
|
634
|
+
});
|
|
635
|
+
}
|
|
636
|
+
if ((ts.isPropertyAccessExpression(node) || ts.isElementAccessExpression(node)) && !isTypePositionReference(node))
|
|
637
|
+
propertyAccesses.push(node);
|
|
638
|
+
if (ts.isIdentifier(node) || ts.isPropertyAccessExpression(node) || ts.isElementAccessExpression(node))
|
|
639
|
+
recordReference(node);
|
|
640
|
+
if (ts.isVariableDeclaration(node)) {
|
|
641
|
+
if (ts.isIdentifier(node.name)) {
|
|
642
|
+
if (node.initializer)
|
|
643
|
+
record(targetOf(node.name), 'declaration-initializer', 'whole', null, node.initializer, node, node.name);
|
|
644
|
+
}
|
|
645
|
+
else
|
|
646
|
+
recordBindingPattern(node.name, node.initializer ?? null);
|
|
647
|
+
}
|
|
648
|
+
else if (ts.isParameter(node)) {
|
|
649
|
+
if (ts.isIdentifier(node.name)) {
|
|
650
|
+
if (node.initializer)
|
|
651
|
+
record(targetOf(node.name), 'default-parameter', 'whole', null, node.initializer, node, node.name);
|
|
652
|
+
}
|
|
653
|
+
else
|
|
654
|
+
recordBindingPattern(node.name, null);
|
|
655
|
+
}
|
|
656
|
+
else if (ts.isPropertyDeclaration(node) && node.initializer) {
|
|
657
|
+
record(targetOf(node.name), 'class-field-initializer', 'whole', null, node.initializer, node, node.name);
|
|
658
|
+
}
|
|
659
|
+
else if ((ts.isPropertyAssignment(node) || ts.isShorthandPropertyAssignment(node)) && !isAssignmentPattern(node.parent)) {
|
|
660
|
+
const name = node.name;
|
|
661
|
+
const named = ts.isComputedPropertyName(name) ? name.expression : name;
|
|
662
|
+
if (ts.isPropertyAssignment(node) && isObjectLiteralPrototypeSetter(node)) {
|
|
663
|
+
// This is an observable prototype publication with no ordinary field
|
|
664
|
+
// target. Closure consumers must account for that edge or refuse it.
|
|
665
|
+
record(null, 'prototype-assignment', 'bulk', null, node.initializer, node, node.parent);
|
|
666
|
+
}
|
|
667
|
+
else if ((ts.isIdentifier(named) && !ts.isComputedPropertyName(name)) ||
|
|
668
|
+
ts.isStringLiteralLike(named) ||
|
|
669
|
+
ts.isNumericLiteral(named)) {
|
|
670
|
+
const key = named.text;
|
|
671
|
+
const value = ts.isPropertyAssignment(node) ? node.initializer : node.name;
|
|
672
|
+
// A shorthand's name resolves to its VALUE variable through targetOf;
|
|
673
|
+
// the receiving property has the object type's distinct symbol.
|
|
674
|
+
const property = checker.getTypeAtLocation(node.parent).getProperty(key) ?? null;
|
|
675
|
+
const target = { symbol: property, nameSymbol: property, declaration: property?.declarations?.[0] ?? node };
|
|
676
|
+
record(target, 'property-assignment', 'whole', null, value, node, name);
|
|
677
|
+
const container = node.parent.parent;
|
|
678
|
+
const naming = ts.isVariableDeclaration(container) && container.initializer === node.parent && ts.isIdentifier(container.name)
|
|
679
|
+
? container.name
|
|
680
|
+
: ts.isBinaryExpression(container) &&
|
|
681
|
+
container.operatorToken.kind === ts.SyntaxKind.EqualsToken &&
|
|
682
|
+
container.right === node.parent
|
|
683
|
+
? container.left
|
|
684
|
+
: null;
|
|
685
|
+
if (naming)
|
|
686
|
+
record(targetOf(naming), 'property-assignment', 'member', key, value, node, naming);
|
|
687
|
+
}
|
|
688
|
+
}
|
|
689
|
+
else if (ts.isBinaryExpression(node)) {
|
|
690
|
+
const operator = node.operatorToken.kind;
|
|
691
|
+
if (operator === ts.SyntaxKind.EqualsToken) {
|
|
692
|
+
const left = unwrapNaming(node.left);
|
|
693
|
+
if (ts.isObjectLiteralExpression(left) || ts.isArrayLiteralExpression(left))
|
|
694
|
+
recordAssignmentPattern(left);
|
|
695
|
+
else if (ts.isPropertyAccessExpression(left))
|
|
696
|
+
recordNamedWrite(left, 'property-assignment', node.right, node);
|
|
697
|
+
else if (ts.isElementAccessExpression(left))
|
|
698
|
+
recordIndexedWrite(left, 'index-assignment', node.right, node);
|
|
699
|
+
else
|
|
700
|
+
record(targetOf(left), 'identifier-assignment', 'whole', null, node.right, node, left);
|
|
701
|
+
}
|
|
702
|
+
else if (LOGICAL_TOKENS.has(operator)) {
|
|
703
|
+
recordAssignmentTarget(node.left, 'logical-assignment', node.right, node);
|
|
704
|
+
}
|
|
705
|
+
else if (COMPOUND_TOKENS.has(operator)) {
|
|
706
|
+
recordAssignmentTarget(node.left, 'compound-assignment', null, node);
|
|
707
|
+
}
|
|
708
|
+
}
|
|
709
|
+
else if (ts.isPrefixUnaryExpression(node) || ts.isPostfixUnaryExpression(node)) {
|
|
710
|
+
if (node.operator === ts.SyntaxKind.PlusPlusToken || node.operator === ts.SyntaxKind.MinusMinusToken) {
|
|
711
|
+
recordAssignmentTarget(node.operand, 'compound-assignment', null, node);
|
|
712
|
+
}
|
|
713
|
+
}
|
|
714
|
+
else if (ts.isCallExpression(node))
|
|
715
|
+
visitCall(node);
|
|
716
|
+
else if (ts.isNewExpression(node))
|
|
717
|
+
recordCallArguments(node, 'call-argument');
|
|
718
|
+
else if (ts.isReturnStatement(node)) {
|
|
719
|
+
const owner = returnOwnerOf(node);
|
|
720
|
+
if (owner)
|
|
721
|
+
record({ symbol: null, nameSymbol: null, declaration: owner }, 'return', 'whole', null, node.expression ?? null, node);
|
|
722
|
+
}
|
|
723
|
+
else if (ts.isYieldExpression(node) && node.expression) {
|
|
724
|
+
for (let current = node.parent; current; current = current.parent) {
|
|
725
|
+
if (!ts.isFunctionLike(current))
|
|
726
|
+
continue;
|
|
727
|
+
record({ symbol: null, nameSymbol: null, declaration: current }, 'yield', 'whole', null, node.expression, node);
|
|
728
|
+
break;
|
|
729
|
+
}
|
|
730
|
+
}
|
|
731
|
+
else if (ts.isSpreadAssignment(node) || ts.isSpreadElement(node)) {
|
|
732
|
+
record(targetOf(node.expression), 'spread', 'bulk', null, null, node, node.expression);
|
|
733
|
+
}
|
|
734
|
+
else if (ts.isDeleteExpression(node)) {
|
|
735
|
+
const target = unwrapNaming(node.expression);
|
|
736
|
+
if (ts.isPropertyAccessExpression(target))
|
|
737
|
+
recordNamedWrite(target, 'delete', null, node);
|
|
738
|
+
else if (ts.isElementAccessExpression(target))
|
|
739
|
+
recordIndexedWrite(target, 'delete', null, node);
|
|
740
|
+
}
|
|
741
|
+
else if (ts.isCatchClause(node) && node.variableDeclaration) {
|
|
742
|
+
const name = node.variableDeclaration.name;
|
|
743
|
+
if (ts.isIdentifier(name))
|
|
744
|
+
record(targetOf(name), 'catch-binding', 'whole', null, null, node, name);
|
|
745
|
+
else
|
|
746
|
+
recordBindingPattern(name, null);
|
|
747
|
+
}
|
|
748
|
+
else if (ts.isForOfStatement(node) || ts.isForInStatement(node)) {
|
|
749
|
+
const iterationOrigin = {
|
|
750
|
+
source: node.expression,
|
|
751
|
+
mode: ts.isForInStatement(node) ? 'keys' : 'values',
|
|
752
|
+
asynchronous: ts.isForOfStatement(node) && node.awaitModifier !== undefined
|
|
753
|
+
};
|
|
754
|
+
const initializer = node.initializer;
|
|
755
|
+
if (ts.isVariableDeclarationList(initializer)) {
|
|
756
|
+
for (const declaration of initializer.declarations) {
|
|
757
|
+
if (ts.isIdentifier(declaration.name))
|
|
758
|
+
record(targetOf(declaration.name), 'iteration-binding', 'whole', null, null, declaration, declaration.name, iterationOrigin);
|
|
759
|
+
else
|
|
760
|
+
recordBindingPattern(declaration.name, null);
|
|
761
|
+
}
|
|
762
|
+
}
|
|
763
|
+
else if (ts.isObjectLiteralExpression(initializer) || ts.isArrayLiteralExpression(initializer)) {
|
|
764
|
+
// `for ([a, b] of pairs)` / `for ({ x, y } of points)` -- an array/
|
|
765
|
+
// object LITERAL used directly as the loop's own head is a
|
|
766
|
+
// destructuring ASSIGNMENT the same way `[a, b] = pairs` is; the only
|
|
767
|
+
// difference is the value each iteration writes, which has no
|
|
768
|
+
// right-hand-side expression at all (see `local-bindings.ts`'s
|
|
769
|
+
// `forOfPatternElementTypeAt`, the consumer that derives it from the
|
|
770
|
+
// loop's own iterable/key instead of a literal source).
|
|
771
|
+
// `recordAssignmentPattern` already walks nested patterns and
|
|
772
|
+
// per-element defaults identically to the `=` case -- it never looks
|
|
773
|
+
// at what SYNTAX supplied the pattern's value, only at the pattern
|
|
774
|
+
// itself, so this needs no shape of its own.
|
|
775
|
+
recordAssignmentPattern(initializer);
|
|
776
|
+
}
|
|
777
|
+
else if (ts.isIdentifier(initializer)) {
|
|
778
|
+
recordAssignmentTarget(initializer, 'iteration-binding', null, node, iterationOrigin);
|
|
779
|
+
}
|
|
780
|
+
else
|
|
781
|
+
recordAssignmentTarget(initializer, 'iteration-binding', null, node);
|
|
782
|
+
}
|
|
783
|
+
ts.forEachChild(node, visit);
|
|
784
|
+
};
|
|
785
|
+
for (const file of files)
|
|
786
|
+
forEachReachableStatement(reachable, file, visit);
|
|
787
|
+
const NO_WRITES = [];
|
|
788
|
+
const NO_REFERENCES = [];
|
|
789
|
+
const callSites = new Map(calls.map((site) => [site.call, site]));
|
|
790
|
+
const writesBySite = new Map();
|
|
791
|
+
for (const write of state.allWrites) {
|
|
792
|
+
let entries = writesBySite.get(write.site);
|
|
793
|
+
if (!entries)
|
|
794
|
+
writesBySite.set(write.site, (entries = []));
|
|
795
|
+
entries.push(write);
|
|
796
|
+
}
|
|
797
|
+
return {
|
|
798
|
+
buildIsStrict,
|
|
799
|
+
calls,
|
|
800
|
+
callSiteOf: (call) => callSites.get(call),
|
|
801
|
+
writesAtSite: (site) => writesBySite.get(site) ?? NO_WRITES,
|
|
802
|
+
propertyAccesses,
|
|
803
|
+
bindingPatternReads,
|
|
804
|
+
classDeclarations,
|
|
805
|
+
arrayLiterals,
|
|
806
|
+
accessorNames,
|
|
807
|
+
hasComputedAccessorName,
|
|
808
|
+
receiverReferencesToDeclaration: (declaration) => receiverReferences.get(declaration) ?? [],
|
|
809
|
+
receiverOwnerOf: (reference) => receiverOwners.get(reference) ?? null,
|
|
810
|
+
callableBodyIsIndexed: (declaration) => indexedCallableBodies.has(declaration),
|
|
811
|
+
memberReferencesToSymbol: (symbol) => memberReferences.get(symbol) ?? [],
|
|
812
|
+
targetOf,
|
|
813
|
+
writesToSymbol: (symbol) => state.bySymbol.get(symbol) ?? NO_WRITES,
|
|
814
|
+
writesToDeclaration: (declaration) => state.byDeclaration.get(declaration) ?? NO_WRITES,
|
|
815
|
+
flowsFromSymbol: (symbol) => state.fromSymbol.get(symbol) ?? NO_WRITES,
|
|
816
|
+
flowsFromDeclaration: (declaration) => state.fromDeclaration.get(declaration) ?? NO_WRITES,
|
|
817
|
+
referencesToSymbol: (symbol) => state.referencesBySymbol.get(symbol) ?? NO_REFERENCES,
|
|
818
|
+
referencesToDeclaration: (declaration) => state.referencesByDeclaration.get(declaration) ?? NO_REFERENCES,
|
|
819
|
+
allWrites: state.allWrites,
|
|
820
|
+
edgeCounts: state.edgeCounts,
|
|
821
|
+
writeCount: [...state.edgeCounts.values()].reduce((total, count) => total + count, 0)
|
|
822
|
+
};
|
|
823
|
+
};
|