@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,677 @@
|
|
|
1
|
+
import ts from 'typescript';
|
|
2
|
+
import { censusRefusal } from './census-refusal.js';
|
|
3
|
+
import { disjointUnionTypeOf, joinOfWrites, widestOf } from './derived-expression-type.js';
|
|
4
|
+
import { emptyParameterBindingCensus } from './parameter-bindings.js';
|
|
5
|
+
import { forEachReachableStatement } from './reachability.js';
|
|
6
|
+
/** A census that binds nothing, for callers that state no program. */
|
|
7
|
+
export const emptyCollectionBindingCensus = {
|
|
8
|
+
typeArgumentsAt: () => null,
|
|
9
|
+
boundCount: 0,
|
|
10
|
+
refusals: [],
|
|
11
|
+
refusalOf: () => null,
|
|
12
|
+
arrayElementAt: () => null,
|
|
13
|
+
arrayRefusalOf: () => null,
|
|
14
|
+
arrayElementForRead: () => null,
|
|
15
|
+
arrayElementForOwner: () => null,
|
|
16
|
+
arrayRefusalForOwner: () => null,
|
|
17
|
+
arrayRefusalForRead: () => null,
|
|
18
|
+
typeArgumentsForOwner: () => null,
|
|
19
|
+
typeArgumentsForRead: () => null
|
|
20
|
+
};
|
|
21
|
+
/**
|
|
22
|
+
* The four standard collection constructor names, to the family each is --
|
|
23
|
+
* hardcoded for the same reason `host-protocols.ts`'s `keyedCollectionFamilies`
|
|
24
|
+
* is: these are core ECMAScript (`lib.es2015.collection.d.ts`), not something
|
|
25
|
+
* a host installs, so there is no table to read them from.
|
|
26
|
+
*/
|
|
27
|
+
const CONSTRUCTOR_NAMES = new Map([
|
|
28
|
+
['Map', 'map'],
|
|
29
|
+
['Set', 'set'],
|
|
30
|
+
['WeakMap', 'weak-map'],
|
|
31
|
+
['WeakSet', 'weak-set']
|
|
32
|
+
]);
|
|
33
|
+
const isUnusableEvidence = (type) => (type.flags & (ts.TypeFlags.Any | ts.TypeFlags.Void | ts.TypeFlags.Never)) !== 0;
|
|
34
|
+
/**
|
|
35
|
+
* Whole-program census of every bare collection constructor's inferred type
|
|
36
|
+
* arguments, once every call site that reads/writes it agrees.
|
|
37
|
+
*
|
|
38
|
+
* `parameters` is the already-settled, composed census (parameter+return,
|
|
39
|
+
* optionally +local) -- asked at every observed argument exactly the way
|
|
40
|
+
* `local-bindings.ts` asks it at every write, so this module never reopens
|
|
41
|
+
* that fixpoint and never duplicates its resolution logic.
|
|
42
|
+
*/
|
|
43
|
+
export const censusCollectionBindings = (checker, files, reachable, parameters = emptyParameterBindingCensus,
|
|
44
|
+
/**
|
|
45
|
+
* The whole-program value-flow index -- the ONE walk that states where every
|
|
46
|
+
* write is. This module's own four collection passes read their edges from
|
|
47
|
+
* it rather than re-deriving them; see `flow/model.ts`.
|
|
48
|
+
*/
|
|
49
|
+
flow) => {
|
|
50
|
+
const anchor = files[0];
|
|
51
|
+
if (!anchor)
|
|
52
|
+
return emptyCollectionBindingCensus;
|
|
53
|
+
// The real global constructor VALUE symbols, resolved once -- comparing
|
|
54
|
+
// AGAINST these (never against the spelling `X` in `new X()`) is what keeps
|
|
55
|
+
// a program's own `class WeakMap` untouched: its constructor symbol is a
|
|
56
|
+
// different symbol than the one `resolveName` finds at global scope.
|
|
57
|
+
const constructorSymbols = new Map();
|
|
58
|
+
for (const [name, family] of CONSTRUCTOR_NAMES) {
|
|
59
|
+
const symbol = checker.resolveName(name, anchor, ts.SymbolFlags.Value, false);
|
|
60
|
+
if (symbol)
|
|
61
|
+
constructorSymbols.set(family, symbol);
|
|
62
|
+
}
|
|
63
|
+
/** The family this expression constructs, if it is genuinely the standard-library constructor -- `null` otherwise. */
|
|
64
|
+
const realConstructorFamily = (node) => {
|
|
65
|
+
if (!ts.isIdentifier(node.expression))
|
|
66
|
+
return null;
|
|
67
|
+
const family = CONSTRUCTOR_NAMES.get(node.expression.text);
|
|
68
|
+
if (!family)
|
|
69
|
+
return null;
|
|
70
|
+
const expected = constructorSymbols.get(family);
|
|
71
|
+
if (!expected)
|
|
72
|
+
return null;
|
|
73
|
+
return checker.getSymbolAtLocation(node.expression) === expected ? family : null;
|
|
74
|
+
};
|
|
75
|
+
/** A bare `new X()`: no explicit type arguments, no constructor argument -- the program stated nothing for this module to override. */
|
|
76
|
+
const bareConstruction = (node) => (node.typeArguments === undefined || node.typeArguments.length === 0) && (node.arguments === undefined || node.arguments.length === 0);
|
|
77
|
+
// Declaration-node identity is the stable key for EVERY owner this module
|
|
78
|
+
// tracks -- a variable, a class field, or a property -- not just the array
|
|
79
|
+
// case below: a property symbol is late-bound per lookup (`checker.
|
|
80
|
+
// getSymbolAtLocation` on a property name returns a DIFFERENT `ts.Symbol`
|
|
81
|
+
// object at its declaration than at each later access), but its
|
|
82
|
+
// declaration node is the same object every time. Keying `Map`/`Set`
|
|
83
|
+
// ownership by symbol (as this module used to) meant `this.m = new Map()`
|
|
84
|
+
// could never be tracked at all: a `BinaryExpression` whose LEFT is a
|
|
85
|
+
// `PropertyAccessExpression` was rejected outright (`owner-not-tracked`),
|
|
86
|
+
// and even resolving that symbol once would not have matched the DIFFERENT
|
|
87
|
+
// symbol object `this.m.set(...)` resolves to later. Declaration-node
|
|
88
|
+
// keying is what already lets the array census below track `state.probe`;
|
|
89
|
+
// extending it to `Map`/`Set` closes both problems with the same key.
|
|
90
|
+
const declNodeOf = (symbol) => symbol?.getDeclarations()?.[0] ?? null;
|
|
91
|
+
/** The declaration node backing a plain identifier or `x.prop` property access -- `null` for anything else. */
|
|
92
|
+
const ownerDeclOfExpr = (expr) => {
|
|
93
|
+
if (ts.isIdentifier(expr))
|
|
94
|
+
return declNodeOf(checker.getSymbolAtLocation(expr));
|
|
95
|
+
if (ts.isPropertyAccessExpression(expr))
|
|
96
|
+
return declNodeOf(checker.getSymbolAtLocation(expr.name));
|
|
97
|
+
return null;
|
|
98
|
+
};
|
|
99
|
+
/**
|
|
100
|
+
* The declaration this construction is bound to -- a variable's own name,
|
|
101
|
+
* a class field's own initializer, or the target of a plain `x = new
|
|
102
|
+
* WeakMap()` / `this.m = new WeakMap()` reassignment (identifier OR
|
|
103
|
+
* property access, via `ownerDeclOfExpr`). `null` for anything else
|
|
104
|
+
* (destructuring, an argument passed inline, ...): this module tracks USE
|
|
105
|
+
* SITES by declaration, so a construction with no trackable owner has
|
|
106
|
+
* nothing for a later `.get`/`.set` to be found against, and refuses
|
|
107
|
+
* rather than guessing at one.
|
|
108
|
+
*/
|
|
109
|
+
const ownerDeclOf = (node) => {
|
|
110
|
+
const parent = node.parent;
|
|
111
|
+
if (ts.isVariableDeclaration(parent) && parent.initializer === node && ts.isIdentifier(parent.name)) {
|
|
112
|
+
return declNodeOf(checker.getSymbolAtLocation(parent.name));
|
|
113
|
+
}
|
|
114
|
+
if (ts.isPropertyDeclaration(parent) && parent.initializer === node && ts.isIdentifier(parent.name)) {
|
|
115
|
+
return declNodeOf(checker.getSymbolAtLocation(parent.name));
|
|
116
|
+
}
|
|
117
|
+
if (ts.isBinaryExpression(parent) && parent.operatorToken.kind === ts.SyntaxKind.EqualsToken && parent.right === node) {
|
|
118
|
+
return ownerDeclOfExpr(parent.left);
|
|
119
|
+
}
|
|
120
|
+
return null;
|
|
121
|
+
};
|
|
122
|
+
/**
|
|
123
|
+
* Every declaration this owner's value is ALIASED into by direct identity
|
|
124
|
+
* -- `const b = a`, `b = a`, `o.p = a`, or `a` passed as a call argument
|
|
125
|
+
* reaching a callee's parameter slot -- so a write reaching the SAME
|
|
126
|
+
* reference through a different name is evidence for this owner too, not a
|
|
127
|
+
* different, unrelated cell.
|
|
128
|
+
*
|
|
129
|
+
* Follows exactly the edges that carry a value's whole identity (`flow`'s
|
|
130
|
+
* `whole`-slot writes only -- never the paired `member` write
|
|
131
|
+
* `property-assignment`/`index-assignment` also record for the RECEIVER,
|
|
132
|
+
* which states something about one of the receiver's members, not that the
|
|
133
|
+
* receiver itself became this reference), transitively, via
|
|
134
|
+
* `flowsFromDeclaration` -- the reverse edge `flow` already states for
|
|
135
|
+
* every write, so this is a graph walk over data the shared index already
|
|
136
|
+
* computed, not a second walk of the program.
|
|
137
|
+
*/
|
|
138
|
+
const ALIAS_EDGES = new Set([
|
|
139
|
+
'declaration-initializer',
|
|
140
|
+
'identifier-assignment',
|
|
141
|
+
'property-assignment',
|
|
142
|
+
'index-assignment',
|
|
143
|
+
'call-argument'
|
|
144
|
+
]);
|
|
145
|
+
const aliasClosureOf = (owner) => {
|
|
146
|
+
const seen = new Set([owner]);
|
|
147
|
+
const queue = [owner];
|
|
148
|
+
while (queue.length > 0) {
|
|
149
|
+
const current = queue.shift();
|
|
150
|
+
for (const write of flow.flowsFromDeclaration(current)) {
|
|
151
|
+
if (write.slot !== 'whole' || !ALIAS_EDGES.has(write.edge))
|
|
152
|
+
continue;
|
|
153
|
+
const target = write.target.declaration;
|
|
154
|
+
if (target && !seen.has(target)) {
|
|
155
|
+
seen.add(target);
|
|
156
|
+
queue.push(target);
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
return seen;
|
|
161
|
+
};
|
|
162
|
+
/**
|
|
163
|
+
* Render a refusal's subject -- the declaration or construction site a
|
|
164
|
+
* human (or a later tool) can find and inspect, not a re-derivable index.
|
|
165
|
+
* A tracked owner is always a `VariableDeclaration`/`PropertyDeclaration`/
|
|
166
|
+
* `PropertyAssignment`, all of which name themselves with a plain
|
|
167
|
+
* identifier; anything without one (a bare `new X()` this module could not
|
|
168
|
+
* attach to a declaration at all) falls back to its own source text.
|
|
169
|
+
*/
|
|
170
|
+
const describeOwner = (node) => {
|
|
171
|
+
const sourceFile = node.getSourceFile();
|
|
172
|
+
const line = sourceFile.getLineAndCharacterOfPosition(node.getStart(sourceFile)).line + 1;
|
|
173
|
+
const name = node.name;
|
|
174
|
+
const label = name && (ts.isIdentifier(name) || ts.isPrivateIdentifier(name)) ? name.text : node.getText(sourceFile);
|
|
175
|
+
return `${label} (${sourceFile.fileName}:${line})`;
|
|
176
|
+
};
|
|
177
|
+
const censusRefusals = [];
|
|
178
|
+
// Pass 1: every candidate `new X()`, grouped by owning declaration.
|
|
179
|
+
const byOwner = new Map();
|
|
180
|
+
const nodeOwner = new Map();
|
|
181
|
+
const nodeRefusal = new Map();
|
|
182
|
+
const collectConstructions = (node) => {
|
|
183
|
+
// Mirrors `value-flow.ts`'s own `visit` guard exactly (same `reachable`,
|
|
184
|
+
// same predicate): a class member reachability has pruned as dead --
|
|
185
|
+
// never dispatched by symbol (a static) or by key (an instance member) in
|
|
186
|
+
// live code -- contributes no write evidence to `flow` at all, by design
|
|
187
|
+
// ("excluded bodies cannot contribute callers or writes to the live
|
|
188
|
+
// program's typing evidence"). Before this guard, THIS walk had no such
|
|
189
|
+
// exclusion: it kept collecting a bare `new Map()`/`new Set()` inside a
|
|
190
|
+
// pruned method as a live candidate needing evidence, while `flow` -- the
|
|
191
|
+
// only source this module reads evidence from -- had already discarded
|
|
192
|
+
// every write inside that same body. The two walks disagreeing about what
|
|
193
|
+
// "the program" contains turned a dead body into a GUARANTEED refusal for
|
|
194
|
+
// every collection literal in it, not a measured one.
|
|
195
|
+
if (reachable.memberIsPruned(node))
|
|
196
|
+
return;
|
|
197
|
+
if (ts.isNewExpression(node)) {
|
|
198
|
+
const family = realConstructorFamily(node);
|
|
199
|
+
if (family && bareConstruction(node)) {
|
|
200
|
+
const owner = ownerDeclOf(node);
|
|
201
|
+
if (!owner) {
|
|
202
|
+
nodeRefusal.set(node, 'owner-not-tracked');
|
|
203
|
+
censusRefusals.push(censusRefusal('collection', 'owner-not-tracked', `bare \`new ${node.expression.getText(node.getSourceFile())}()\` is not bound to a trackable declaration -- not a plain variable/field initializer, and not a reassignment through one`, describeOwner(node)));
|
|
204
|
+
}
|
|
205
|
+
else {
|
|
206
|
+
nodeOwner.set(node, owner);
|
|
207
|
+
const existing = byOwner.get(owner);
|
|
208
|
+
if (!existing)
|
|
209
|
+
byOwner.set(owner, { family, nodes: [node] });
|
|
210
|
+
else if (existing.family !== family) {
|
|
211
|
+
nodeRefusal.set(node, 'family-disagreement');
|
|
212
|
+
censusRefusals.push(censusRefusal('collection', 'family-disagreement', `this declaration already holds a \`${existing.family}\`; this \`new ${node.expression.getText(node.getSourceFile())}()\` assigns a disagreeing \`${family}\` to the same declaration`, describeOwner(owner)));
|
|
213
|
+
}
|
|
214
|
+
else
|
|
215
|
+
existing.nodes.push(node);
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
ts.forEachChild(node, collectConstructions);
|
|
220
|
+
};
|
|
221
|
+
for (const file of files)
|
|
222
|
+
forEachReachableStatement(reachable, file, collectConstructions);
|
|
223
|
+
/** The checker's own answer, falling back to the composed parameter census -- the SAME `known ?? resolve` rule every other census here applies. */
|
|
224
|
+
const argumentType = (expr) => {
|
|
225
|
+
const own = checker.getTypeAtLocation(expr);
|
|
226
|
+
return isUnusableEvidence(own) ? parameters.typeAt(expr) : own;
|
|
227
|
+
};
|
|
228
|
+
// Pass 2: every `.get`/`.set`/`.has`/`.delete`/`.add` KEY/VALUE write that
|
|
229
|
+
// reaches one of the tracked collections above OR any cell in its alias
|
|
230
|
+
// closure -- read from `flow` rather than re-walked, so a receiver spelled
|
|
231
|
+
// `this.cache.set(...)`, `a.b.set(...)`, or reached only through a
|
|
232
|
+
// parameter the collection was passed to is evidence exactly like
|
|
233
|
+
// `m.set(...)` is: `flow`'s own `collection-key`/`collection-value` edges
|
|
234
|
+
// never restricted themselves to an identifier receiver in the first
|
|
235
|
+
// place, only this module's old re-derivation did.
|
|
236
|
+
const boundKey = new Map();
|
|
237
|
+
const boundValue = new Map();
|
|
238
|
+
const ownerRefusal = new Map();
|
|
239
|
+
const valueRefusal = new Map();
|
|
240
|
+
/** The `.set` value arguments of a collection refused `value-unresolved`, for `CollectionTypeArguments.valueEvidence`. */
|
|
241
|
+
const unresolvedValueArgs = new Map();
|
|
242
|
+
for (const [owner, entry] of byOwner) {
|
|
243
|
+
if (entry.nodes.some((node) => nodeRefusal.has(node))) {
|
|
244
|
+
ownerRefusal.set(owner, 'family-disagreement');
|
|
245
|
+
censusRefusals.push(censusRefusal('collection', 'family-disagreement', `at least one \`new\` assigned to this declaration disagreed on collection family with another (\`${entry.family}\` vs. a differing family)`, describeOwner(owner)));
|
|
246
|
+
continue;
|
|
247
|
+
}
|
|
248
|
+
const keyArgs = [];
|
|
249
|
+
const valueArgs = [];
|
|
250
|
+
for (const decl of aliasClosureOf(owner)) {
|
|
251
|
+
for (const write of flow.writesToDeclaration(decl)) {
|
|
252
|
+
if (write.edge === 'collection-key' && write.value)
|
|
253
|
+
keyArgs.push(write.value);
|
|
254
|
+
else if (write.edge === 'collection-value' && write.value)
|
|
255
|
+
valueArgs.push(write.value);
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
// K and V are INDEPENDENT questions about one storage, and a `continue`
|
|
259
|
+
// here answered neither because the first had no answer. three's
|
|
260
|
+
// `WebGLProperties` is the case that costs: `properties.set( object, map )`
|
|
261
|
+
// keys a `WeakMap` by an untyped parameter, so K is `key-unresolved` --
|
|
262
|
+
// while V is the 47-member bag the whole renderer reads back out of it,
|
|
263
|
+
// fully determined by that very same call. Every refusal below is a
|
|
264
|
+
// statement about K alone, and the checker's own (defaulted, workable) key
|
|
265
|
+
// argument survives each one exactly as it did when the whole collection
|
|
266
|
+
// was refused: `overriddenCollectionShape` keeps `typeArguments[0]`
|
|
267
|
+
// untouched when this census binds no key.
|
|
268
|
+
const key = (() => {
|
|
269
|
+
if (keyArgs.length === 0) {
|
|
270
|
+
ownerRefusal.set(owner, 'no-key-uses');
|
|
271
|
+
censusRefusals.push(censusRefusal('collection', 'no-key-uses', 'no `.get`/`.set`/`.has`/`.delete`/`.add` call with a key argument was observed reaching this collection (or any of its aliases)', describeOwner(owner)));
|
|
272
|
+
return null;
|
|
273
|
+
}
|
|
274
|
+
const keyTypes = [];
|
|
275
|
+
for (const arg of keyArgs) {
|
|
276
|
+
const type = argumentType(arg);
|
|
277
|
+
if (!type) {
|
|
278
|
+
ownerRefusal.set(owner, 'key-unresolved');
|
|
279
|
+
censusRefusals.push(censusRefusal('collection', 'key-unresolved', `the key argument \`${arg.getText(arg.getSourceFile())}\` could not be typed (the checker's own answer was unusable and the composed parameter census had nothing to add)`, describeOwner(owner)));
|
|
280
|
+
return null;
|
|
281
|
+
}
|
|
282
|
+
keyTypes.push(type);
|
|
283
|
+
}
|
|
284
|
+
const joined = widestOf(checker, keyTypes);
|
|
285
|
+
if (!joined) {
|
|
286
|
+
ownerRefusal.set(owner, 'keys-disagree');
|
|
287
|
+
censusRefusals.push(censusRefusal('collection', 'keys-disagree', `the key arguments observed across this collection's calls do not join to one type: ${keyTypes.map((type) => checker.typeToString(type)).join(', ')}`, describeOwner(owner)));
|
|
288
|
+
return null;
|
|
289
|
+
}
|
|
290
|
+
// A `WeakMap`/`WeakSet` key must stay a REFERENCE -- ECMA-262 24.3/24.4
|
|
291
|
+
// admit only objects (and unregistered symbols) as weak keys, and
|
|
292
|
+
// `representation/collections.ts`'s `deriveKeyedCollection` refuses a
|
|
293
|
+
// weak key that lacks one, by design (a `WeakMap<number, T>` has no
|
|
294
|
+
// correct lowering, ever). Joining evidence across every `.set`/`.get`
|
|
295
|
+
// call the ordinary `widestOf` way is correct for `map`/`set` -- pure
|
|
296
|
+
// structural equality never asks about pointers -- but for the weak
|
|
297
|
+
// families it can join two or more UNRELATED class keys into a `T1 | T2`
|
|
298
|
+
// union, or widen a nullable receiver into `T | null`: both are still
|
|
299
|
+
// perfectly good TypeScript types, and both lower to a carrier
|
|
300
|
+
// (`tagged-union`, `optional(...)`) with no single pointer to compare,
|
|
301
|
+
// which the checker in `collections.ts` then refuses outright -- turning
|
|
302
|
+
// a WORKING (boxed, dynamically-keyed) WeakMap into a hard `unresolved`
|
|
303
|
+
// refusal. `WeakMap<object, V>`'s own DEFAULT (bound to nothing) already
|
|
304
|
+
// compiles today via `dynamic`'s admitted reference identity
|
|
305
|
+
// (`hasReferenceIdentity`'s own comment) -- this module must not narrow
|
|
306
|
+
// that into something WORSE than what it is replacing. `isUnion()` is the
|
|
307
|
+
// cheap, correct proxy at this layer for "does not reduce to one
|
|
308
|
+
// reference-bearing shape": every case this census has actually observed
|
|
309
|
+
// failing downstream (a tagged union of classes, an `optional(T, null)`)
|
|
310
|
+
// is a TS union, and a single class/interface/object type -- the only
|
|
311
|
+
// shape this runtime's weak families can pointer-compare -- never is one.
|
|
312
|
+
if ((entry.family === 'weak-map' || entry.family === 'weak-set') && joined.isUnion()) {
|
|
313
|
+
ownerRefusal.set(owner, 'weak-key-not-reference');
|
|
314
|
+
censusRefusals.push(censusRefusal('collection', 'weak-key-not-reference', `the joined key type \`${checker.typeToString(joined)}\` does not reduce to one reference-bearing shape, but a \`${entry.family}\` key must stay an object (ECMA-262 24.3/24.4)`, describeOwner(owner)));
|
|
315
|
+
return null;
|
|
316
|
+
}
|
|
317
|
+
return joined;
|
|
318
|
+
})();
|
|
319
|
+
if (key)
|
|
320
|
+
boundKey.set(owner, key);
|
|
321
|
+
if (entry.family !== 'map' && entry.family !== 'weak-map')
|
|
322
|
+
continue;
|
|
323
|
+
if (valueArgs.length === 0) {
|
|
324
|
+
valueRefusal.set(owner, 'no-value-uses');
|
|
325
|
+
censusRefusals.push(censusRefusal('collection', 'no-value-uses', 'no `.set` call with a value argument was observed reaching this collection (or any of its aliases)', describeOwner(owner)));
|
|
326
|
+
continue;
|
|
327
|
+
}
|
|
328
|
+
const valueTypes = [];
|
|
329
|
+
let everyValue = true;
|
|
330
|
+
for (const arg of valueArgs) {
|
|
331
|
+
const type = argumentType(arg);
|
|
332
|
+
if (!type) {
|
|
333
|
+
everyValue = false;
|
|
334
|
+
break;
|
|
335
|
+
}
|
|
336
|
+
valueTypes.push(type);
|
|
337
|
+
}
|
|
338
|
+
if (!everyValue) {
|
|
339
|
+
valueRefusal.set(owner, 'value-unresolved');
|
|
340
|
+
// The one refusal a later layer can lift -- see `valueEvidence`. The
|
|
341
|
+
// expressions are published whole rather than the ones that failed,
|
|
342
|
+
// because the resolver downstream must agree about ALL of them or
|
|
343
|
+
// answer nothing: a value slot half-derived from this census and half
|
|
344
|
+
// from the checker would be a second authority over one storage.
|
|
345
|
+
unresolvedValueArgs.set(owner, valueArgs);
|
|
346
|
+
censusRefusals.push(censusRefusal('collection', 'value-unresolved', "at least one `.set` value argument on this collection could not be typed (the checker's own answer was unusable and the composed parameter census had nothing to add) -- left open for structural-array-element.ts's bag resolution", describeOwner(owner)));
|
|
347
|
+
continue;
|
|
348
|
+
}
|
|
349
|
+
const value = widestOf(checker, valueTypes);
|
|
350
|
+
if (!value) {
|
|
351
|
+
valueRefusal.set(owner, 'values-disagree');
|
|
352
|
+
censusRefusals.push(censusRefusal('collection', 'values-disagree', `the \`.set\` value arguments observed do not join to one type: ${valueTypes.map((type) => checker.typeToString(type)).join(', ')}`, describeOwner(owner)));
|
|
353
|
+
continue;
|
|
354
|
+
}
|
|
355
|
+
boundValue.set(owner, value);
|
|
356
|
+
}
|
|
357
|
+
// --- Array element census -------------------------------------------
|
|
358
|
+
//
|
|
359
|
+
// An empty array literal with no contextual type is `never[]` -- TypeScript
|
|
360
|
+
// states nothing about what it will hold, correctly, because nothing in
|
|
361
|
+
// the literal itself says. For a plain `let`/`const` binding
|
|
362
|
+
// (`structural-layout-type.ts`'s `settleEvolving`/`boundSymbolOf`), the
|
|
363
|
+
// checker's OWN flow analysis settles this by re-asking at the binding's
|
|
364
|
+
// last reachable reference in the same file -- `let arr = []; ...
|
|
365
|
+
// arr.push(x); return arr` answers `number[]` there, and that is a BETTER
|
|
366
|
+
// answer than anything this module could derive, because it is
|
|
367
|
+
// flow-sensitive within the function. This module must not fight that: a
|
|
368
|
+
// candidate whose parent is exactly that shape (a `VariableDeclaration`
|
|
369
|
+
// with a plain identifier name, initialized directly by the literal) is
|
|
370
|
+
// left alone entirely, uncounted, so as never to second-guess an answer
|
|
371
|
+
// TypeScript already gets right.
|
|
372
|
+
//
|
|
373
|
+
// What TypeScript's evolving-array machinery does NOT reach is a literal
|
|
374
|
+
// that is not itself a variable's own initializer -- most concretely, a
|
|
375
|
+
// property of an object literal (`const state = { probe: [] }`). A
|
|
376
|
+
// property has no flow node of its own; `state.probe` is a
|
|
377
|
+
// `PropertyAccessExpression` at every read, never the plain identifier
|
|
378
|
+
// reference evolving-array settling requires, so the checker reports
|
|
379
|
+
// `never[]` at `state.probe.push(...)` forever, even though the property
|
|
380
|
+
// holds nine real `Vector3` instances by the time any of that code runs.
|
|
381
|
+
// That mismatched `never` is not inert: a downstream rule reasoning about
|
|
382
|
+
// reachability from a `never`-typed operand can and did treat code that
|
|
383
|
+
// runs every frame as dead (see the module-level history this fix
|
|
384
|
+
// responds to). Removing the false `never` at its source is the only fix
|
|
385
|
+
// that cannot be undone by some future consumer trusting the certificate.
|
|
386
|
+
//
|
|
387
|
+
// The tracking problem is harder than the `Map`/`Set` case above: a
|
|
388
|
+
// property is not held by one persistent variable `ownerSymbolOf` can
|
|
389
|
+
// resolve identically at every reference. Empirically (verified against
|
|
390
|
+
// this exact `WebGLLights.js` shape before writing this), `checker.
|
|
391
|
+
// getSymbolAtLocation` on a property name returns a DIFFERENT `ts.Symbol`
|
|
392
|
+
// object at the declaration than at each later `.prop` access -- late-bound
|
|
393
|
+
// per lookup, not one persistent identity the way a variable's symbol is.
|
|
394
|
+
// What IS stable across all of them is the symbol's OWN declaration node:
|
|
395
|
+
// `sym.getDeclarations()?.[0]` returns the same `PropertyAssignment` AST
|
|
396
|
+
// node (`probe: []` itself) every time, at the declaration and at every
|
|
397
|
+
// later `.probe` access. So ownership here is tracked by DECLARATION NODE,
|
|
398
|
+
// not by symbol object identity -- a strictly more general key that would
|
|
399
|
+
// also work for the variable case, but the variable case already has its
|
|
400
|
+
// own proven-working, declaration-keyed tracking above (`declNodeOf`/
|
|
401
|
+
// `ownerDeclOfExpr`, defined once, near the top of this function, and
|
|
402
|
+
// reused here) and is left untouched.
|
|
403
|
+
const isUnstatedEmptyArrayLiteral = (node) => {
|
|
404
|
+
if (!ts.isArrayLiteralExpression(node) || node.elements.length > 0)
|
|
405
|
+
return false;
|
|
406
|
+
const type = checker.getTypeAtLocation(node);
|
|
407
|
+
if (!checker.isArrayType(type))
|
|
408
|
+
return false;
|
|
409
|
+
const [element] = checker.getTypeArguments(type);
|
|
410
|
+
if (element === undefined || (element.flags & (ts.TypeFlags.Never | ts.TypeFlags.Any)) === 0)
|
|
411
|
+
return false;
|
|
412
|
+
// A contextual array type is a statement made by the surrounding
|
|
413
|
+
// annotation/signature. In particular, an explicit `any[]` remains a
|
|
414
|
+
// genuine dynamic boundary; only the checker-created never/any fallback
|
|
415
|
+
// of an uncontextualized `[]` is evidence-free storage this census may
|
|
416
|
+
// replace from its writes.
|
|
417
|
+
return checker.getContextualType(node) === undefined;
|
|
418
|
+
};
|
|
419
|
+
/**
|
|
420
|
+
* The owning declaration node for a candidate empty array literal, or `null`
|
|
421
|
+
* when it is not trackable at all.
|
|
422
|
+
*
|
|
423
|
+
* A plain variable's own initializer USED to be excluded here and left
|
|
424
|
+
* entirely to `settleEvolving` -- TypeScript's own flow-sensitive narrowing
|
|
425
|
+
* of an unannotated `let`/`const arr = []`. That measurement (binds 130 more
|
|
426
|
+
* arrays, boxed count unchanged) was taken against a gate that only counted
|
|
427
|
+
* a TOP-LEVEL `dynamic` carrier: `array-object{element: dynamic}` was
|
|
428
|
+
* invisible to it, so "unchanged" meant nothing about whether the element
|
|
429
|
+
* type was actually right.
|
|
430
|
+
*
|
|
431
|
+
* It is not always right. `settleEvolving`'s narrowing is flow-sensitive
|
|
432
|
+
* WITHIN one function; when the only pushes/writes to the array happen
|
|
433
|
+
* inside a NESTED function that closes over the binding (three.js's
|
|
434
|
+
* `PolyhedronGeometry` builds `const vertexBuffer = []` in a constructor and
|
|
435
|
+
* fills it only from a sibling nested `function subdivideFace(...)` it
|
|
436
|
+
* calls), the checker cannot narrow across that boundary and every outer
|
|
437
|
+
* read widens to `any[]` -- worse than `never[]`, because
|
|
438
|
+
* `structural-array-element.ts`'s own read guard used to only fire for a
|
|
439
|
+
* `never` element, so an `any[]`-widened read fell straight through to the
|
|
440
|
+
* `dynamic` element this whole census exists to avoid.
|
|
441
|
+
*
|
|
442
|
+
* Admission is based on the allocation stating no element type. Once its
|
|
443
|
+
* complete write set is known, every alias must use that storage element,
|
|
444
|
+
* including an earlier checker read narrowed before publication elsewhere.
|
|
445
|
+
*/
|
|
446
|
+
const arrayOwnerDeclOf = (node) => {
|
|
447
|
+
const parent = node.parent;
|
|
448
|
+
if (ts.isVariableDeclaration(parent) && parent.initializer === node && ts.isIdentifier(parent.name)) {
|
|
449
|
+
return declNodeOf(checker.getSymbolAtLocation(parent.name));
|
|
450
|
+
}
|
|
451
|
+
if (ts.isPropertyAssignment(parent) && parent.initializer === node && ts.isIdentifier(parent.name)) {
|
|
452
|
+
return declNodeOf(checker.getSymbolAtLocation(parent.name));
|
|
453
|
+
}
|
|
454
|
+
if (ts.isBinaryExpression(parent) && parent.operatorToken.kind === ts.SyntaxKind.EqualsToken && parent.right === node) {
|
|
455
|
+
return ownerDeclOfExpr(parent.left);
|
|
456
|
+
}
|
|
457
|
+
return null;
|
|
458
|
+
};
|
|
459
|
+
// Pass 3: every candidate empty array literal, grouped by owning declaration node.
|
|
460
|
+
const arraysByOwner = new Map();
|
|
461
|
+
const arrayNodeOwner = new Map();
|
|
462
|
+
const arrayNodeRefusal = new Map();
|
|
463
|
+
const collectArrayLiterals = (node) => {
|
|
464
|
+
// See the identical guard in `collectConstructions` above: this walk and
|
|
465
|
+
// `flow`'s own must agree on what counts as live code, or a member
|
|
466
|
+
// reachability has pruned as dead becomes a GUARANTEED `array:no-writes`
|
|
467
|
+
// for every empty-array candidate inside it -- not because the array is
|
|
468
|
+
// genuinely never written, but because the one place this census reads
|
|
469
|
+
// writes from (`flow`) was never asked to look inside a body it had
|
|
470
|
+
// already excluded. MEASURED on the three.js app: `AnimationClip.js`'s `parse`,
|
|
471
|
+
// `toJSON`, `CreateFromMorphTargetSequence` (named by symbol, never
|
|
472
|
+
// dispatched under that exact name anywhere reachable) and `clone`
|
|
473
|
+
// (opened by key, but not by this program's own `.clone()` call shapes)
|
|
474
|
+
// each push into a local array this way -- four false `no-writes`
|
|
475
|
+
// refusals from one missing exclusion, not four different defects.
|
|
476
|
+
if (reachable.memberIsPruned(node))
|
|
477
|
+
return;
|
|
478
|
+
if (isUnstatedEmptyArrayLiteral(node)) {
|
|
479
|
+
const owner = arrayOwnerDeclOf(node);
|
|
480
|
+
if (owner) {
|
|
481
|
+
arrayNodeOwner.set(node, owner);
|
|
482
|
+
const existing = arraysByOwner.get(owner);
|
|
483
|
+
if (existing)
|
|
484
|
+
existing.push(node);
|
|
485
|
+
else
|
|
486
|
+
arraysByOwner.set(owner, [node]);
|
|
487
|
+
}
|
|
488
|
+
// No `else` refusal here for the `settleEvolving`-owned or genuinely
|
|
489
|
+
// untrackable shapes: those are not this module's candidates at all,
|
|
490
|
+
// the same way a `new WeakMap()` passed inline as a call argument
|
|
491
|
+
// (rather than bound to a name) is invisible to the census above
|
|
492
|
+
// rather than counted as a refusal.
|
|
493
|
+
}
|
|
494
|
+
ts.forEachChild(node, collectArrayLiterals);
|
|
495
|
+
};
|
|
496
|
+
for (const file of files)
|
|
497
|
+
forEachReachableStatement(reachable, file, collectArrayLiterals);
|
|
498
|
+
// Pass 4: every `.push`/`.unshift`/`.fill` call and every genuine INDEX
|
|
499
|
+
// (non-literal-key) assignment reaching one of the tracked array literals
|
|
500
|
+
// above OR any cell in its alias closure -- read from `flow`'s
|
|
501
|
+
// `array-append`/`array-fill`/`index-assignment` edges rather than
|
|
502
|
+
// re-walked. This is what closes the alias case for arrays: `const helper
|
|
503
|
+
// = []; fill(helper)` where `fill`'s own body does `arr.push(x)` on its
|
|
504
|
+
// PARAMETER now composes, because `aliasClosureOf` follows the
|
|
505
|
+
// `call-argument` edge from `helper`'s declaration to that parameter's,
|
|
506
|
+
// and `flow` already recorded the parameter's own `array-append` writes.
|
|
507
|
+
// All three edge kinds feed the SAME join: this module does not prefer one
|
|
508
|
+
// kind of evidence over another, it requires every observed element value
|
|
509
|
+
// to agree, exactly as the key-argument census above does for
|
|
510
|
+
// `Map`/`Set`/`WeakMap`/`WeakSet`.
|
|
511
|
+
const boundElement = new Map();
|
|
512
|
+
const ownerArrayRefusal = new Map();
|
|
513
|
+
// Two allocations that reach the same held reference slot also share its
|
|
514
|
+
// physical element ABI. Join their whole alias component, rather than
|
|
515
|
+
// publishing incompatible answers according to which owner was visited last.
|
|
516
|
+
const arrayRoots = new Map();
|
|
517
|
+
const rootOf = (node) => {
|
|
518
|
+
const parent = arrayRoots.get(node);
|
|
519
|
+
if (!parent || parent === node)
|
|
520
|
+
return node;
|
|
521
|
+
const root = rootOf(parent);
|
|
522
|
+
arrayRoots.set(node, root);
|
|
523
|
+
return root;
|
|
524
|
+
};
|
|
525
|
+
for (const owner of arraysByOwner.keys()) {
|
|
526
|
+
for (const alias of aliasClosureOf(owner)) {
|
|
527
|
+
const ownerRoot = rootOf(owner);
|
|
528
|
+
arrayRoots.set(rootOf(alias), ownerRoot);
|
|
529
|
+
if (!arrayRoots.has(ownerRoot))
|
|
530
|
+
arrayRoots.set(ownerRoot, ownerRoot);
|
|
531
|
+
}
|
|
532
|
+
}
|
|
533
|
+
const arrayComponents = new Map();
|
|
534
|
+
for (const alias of arrayRoots.keys()) {
|
|
535
|
+
const root = rootOf(alias);
|
|
536
|
+
const component = arrayComponents.get(root) ?? new Set();
|
|
537
|
+
component.add(alias);
|
|
538
|
+
arrayComponents.set(root, component);
|
|
539
|
+
}
|
|
540
|
+
for (const [owner, aliases] of arrayComponents) {
|
|
541
|
+
const evidence = [];
|
|
542
|
+
for (const decl of aliases) {
|
|
543
|
+
for (const write of flow.writesToDeclaration(decl)) {
|
|
544
|
+
if ((write.edge === 'array-append' || write.edge === 'array-fill') && write.value)
|
|
545
|
+
evidence.push(write.value);
|
|
546
|
+
else if (write.edge === 'index-assignment' && write.slot === 'element' && write.value)
|
|
547
|
+
evidence.push(write.value);
|
|
548
|
+
}
|
|
549
|
+
}
|
|
550
|
+
if (evidence.length === 0) {
|
|
551
|
+
for (const alias of aliases)
|
|
552
|
+
ownerArrayRefusal.set(alias, 'array:no-writes');
|
|
553
|
+
censusRefusals.push(censusRefusal('collection', 'array-no-writes', 'no `.push`/`.unshift`/`.fill` call or index-assignment was observed writing an element into this empty array literal (or any of its aliases)', describeOwner(owner)));
|
|
554
|
+
continue;
|
|
555
|
+
}
|
|
556
|
+
const elementTypes = [];
|
|
557
|
+
// The refusal below names the OFFENDING WRITE, the same way the
|
|
558
|
+
// key-argument refusal above names its argument. A refusal that says only
|
|
559
|
+
// "at least one element" sends the reader back to re-derive which one of
|
|
560
|
+
// forty-eight `array.push(...)` sites it was -- and three's
|
|
561
|
+
// `getProgramCacheKey` has exactly that many, spread across three
|
|
562
|
+
// functions and reached through an alias closure, so the owner line alone
|
|
563
|
+
// does not locate it.
|
|
564
|
+
let unresolved = null;
|
|
565
|
+
for (const expr of evidence) {
|
|
566
|
+
const type = argumentType(expr);
|
|
567
|
+
if (!type) {
|
|
568
|
+
unresolved = expr;
|
|
569
|
+
break;
|
|
570
|
+
}
|
|
571
|
+
elementTypes.push(type);
|
|
572
|
+
}
|
|
573
|
+
if (unresolved) {
|
|
574
|
+
for (const alias of aliases)
|
|
575
|
+
ownerArrayRefusal.set(alias, 'array:element-unresolved');
|
|
576
|
+
const site = unresolved.getSourceFile();
|
|
577
|
+
censusRefusals.push(censusRefusal('collection', 'array-element-unresolved', `the element write \`${unresolved.getText(site)}\` (${site.fileName}:${site.getLineAndCharacterOfPosition(unresolved.getStart(site)).line + 1}) ` +
|
|
578
|
+
"could not be typed (the checker's own answer was unusable and the composed parameter census had nothing to add)", describeOwner(owner)));
|
|
579
|
+
continue;
|
|
580
|
+
}
|
|
581
|
+
// `joinOfWrites`, not bare `widestOf`: THE SAME WRITE-SET JOIN a cell's
|
|
582
|
+
// writes get, and for the same reason. `normals.push( 0, 0, 1 )` in
|
|
583
|
+
// three's `PlaneGeometry`/`CircleGeometry`/`RingGeometry` states three
|
|
584
|
+
// LITERAL types, none of which covers another, so `widestOf` alone
|
|
585
|
+
// refused `array:elements-disagree` -- while the array's READS were
|
|
586
|
+
// typed `number[]` by TypeScript's own evolving-array widening. Two
|
|
587
|
+
// authorities over one storage, surfacing as an unsatisfiable
|
|
588
|
+
// `binding-read-conversion:array-object(undefined)->array-object(scalar(
|
|
589
|
+
// number))` at every read. A literal argument's type is a fact about the
|
|
590
|
+
// CALL, not about the storage it lands in -- the same rule
|
|
591
|
+
// `parameter-bindings.ts` states at its own call sites and
|
|
592
|
+
// `local-bindings.ts`/`field-bindings.ts` get from this very function.
|
|
593
|
+
//
|
|
594
|
+
// And when no single type covers the writes, the SAME second question
|
|
595
|
+
// every sibling census asks: is the disagreement itself the answer?
|
|
596
|
+
// `var xs = []; xs.push(1); xs.push('a')` holds a `string | number`, and
|
|
597
|
+
// the checker's own evolving-array widening says so at every reference it
|
|
598
|
+
// can settle -- while this census alone refused `array:elements-disagree`,
|
|
599
|
+
// which sent the storage AND every `push` slot to the box for a program
|
|
600
|
+
// that declared nothing dynamic. `disjointUnionTypeOf` is that question
|
|
601
|
+
// answered as the `ts.Type` this census's contract carries, built to be
|
|
602
|
+
// the checker's own settled union object (see its comment for why the
|
|
603
|
+
// two must be identical rather than merely alike).
|
|
604
|
+
const element = joinOfWrites(checker, elementTypes) ?? disjointUnionTypeOf(checker, elementTypes);
|
|
605
|
+
if (!element) {
|
|
606
|
+
for (const alias of aliases)
|
|
607
|
+
ownerArrayRefusal.set(alias, 'array:elements-disagree');
|
|
608
|
+
censusRefusals.push(censusRefusal('collection', 'array-elements-disagree', `the element values written to this array do not join to one type and are not a sound disjoint union: ${elementTypes.map((type) => checker.typeToString(type)).join(', ')}`, describeOwner(owner)));
|
|
609
|
+
continue;
|
|
610
|
+
}
|
|
611
|
+
for (const alias of aliases)
|
|
612
|
+
boundElement.set(alias, element);
|
|
613
|
+
}
|
|
614
|
+
for (const [node, owner] of arrayNodeOwner) {
|
|
615
|
+
const reason = ownerArrayRefusal.get(owner);
|
|
616
|
+
if (reason)
|
|
617
|
+
arrayNodeRefusal.set(node, reason);
|
|
618
|
+
}
|
|
619
|
+
/**
|
|
620
|
+
* One owner's answer, or `null` when this census learned nothing about it.
|
|
621
|
+
*
|
|
622
|
+
* Shared by all three accessors so they cannot drift: an owner whose KEY was
|
|
623
|
+
* refused but whose VALUE resolved is still an answer, and it was three
|
|
624
|
+
* separate `if (!key) return null`s that made it look like nothing.
|
|
625
|
+
*/
|
|
626
|
+
const boundArgumentsFor = (owner) => {
|
|
627
|
+
const key = boundKey.get(owner) ?? null;
|
|
628
|
+
const value = boundValue.get(owner) ?? null;
|
|
629
|
+
const valueEvidence = unresolvedValueArgs.get(owner) ?? [];
|
|
630
|
+
if (key === null && value === null && valueEvidence.length === 0)
|
|
631
|
+
return null;
|
|
632
|
+
return { key, value, valueEvidence };
|
|
633
|
+
};
|
|
634
|
+
return {
|
|
635
|
+
typeArgumentsAt: (node) => {
|
|
636
|
+
const owner = nodeOwner.get(node);
|
|
637
|
+
if (!owner)
|
|
638
|
+
return null;
|
|
639
|
+
return boundArgumentsFor(owner);
|
|
640
|
+
},
|
|
641
|
+
boundCount: boundKey.size,
|
|
642
|
+
refusals: censusRefusals,
|
|
643
|
+
refusalOf: (node) => {
|
|
644
|
+
const direct = nodeRefusal.get(node);
|
|
645
|
+
if (direct)
|
|
646
|
+
return direct;
|
|
647
|
+
const owner = nodeOwner.get(node);
|
|
648
|
+
return owner ? (ownerRefusal.get(owner) ?? null) : null;
|
|
649
|
+
},
|
|
650
|
+
arrayElementAt: (node) => {
|
|
651
|
+
const owner = arrayNodeOwner.get(node);
|
|
652
|
+
if (!owner)
|
|
653
|
+
return null;
|
|
654
|
+
return boundElement.get(owner) ?? null;
|
|
655
|
+
},
|
|
656
|
+
arrayRefusalOf: (node) => arrayNodeRefusal.get(node) ?? null,
|
|
657
|
+
arrayElementForRead: (expression) => {
|
|
658
|
+
const owner = ownerDeclOfExpr(expression);
|
|
659
|
+
return owner ? (boundElement.get(owner) ?? null) : null;
|
|
660
|
+
},
|
|
661
|
+
arrayElementForOwner: (declaration) => boundElement.get(declaration) ?? null,
|
|
662
|
+
arrayRefusalForOwner: (declaration) => ownerArrayRefusal.get(declaration) ?? null,
|
|
663
|
+
arrayRefusalForRead: (expression) => {
|
|
664
|
+
const owner = ownerDeclOfExpr(expression);
|
|
665
|
+
return owner ? (ownerArrayRefusal.get(owner) ?? null) : null;
|
|
666
|
+
},
|
|
667
|
+
typeArgumentsForOwner: (declaration) => {
|
|
668
|
+
return boundArgumentsFor(declaration);
|
|
669
|
+
},
|
|
670
|
+
typeArgumentsForRead: (expression) => {
|
|
671
|
+
const owner = ownerDeclOfExpr(expression);
|
|
672
|
+
if (!owner)
|
|
673
|
+
return null;
|
|
674
|
+
return boundArgumentsFor(owner);
|
|
675
|
+
}
|
|
676
|
+
};
|
|
677
|
+
};
|