@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,1125 @@
|
|
|
1
|
+
import ts from 'typescript';
|
|
2
|
+
import { inheritedAccessorOfAssignment } from '../inherited-accessor.js';
|
|
3
|
+
import { annotationStatesNothing, containsUnstatedPosition, derivedExpressionType, disjointUnionMembersOf, exactEmptyObjectLiteralType, indexedTypeOf, explicitThisCallReturnType, overloadInvariantReturnTypeAt, joinOfWrites, jsDocTypeStatesNothing, literalMemberNameOf, narrowsOnlyUnstatedPositions, memberTypeOf, objectAssignTargetType, unwrapExplicitThisCall } from './derived-expression-type.js';
|
|
4
|
+
import { carriesUnsubstitutedGeneric, emptyParameterBindingCensus } from './parameter-bindings.js';
|
|
5
|
+
import { emptyCollectionBindingCensus } from './collection-bindings.js';
|
|
6
|
+
import { classFamilyMemberReadTypeOf } from './flow/class-family-member-read.js';
|
|
7
|
+
import { forEachReachableStatement } from './reachability.js';
|
|
8
|
+
import { censusRefusal } from './census-refusal.js';
|
|
9
|
+
/** A census that binds nothing, for callers that state no program. */
|
|
10
|
+
export const emptyFieldBindingCensus = {
|
|
11
|
+
typeAt: () => null,
|
|
12
|
+
unionArmsAt: () => null,
|
|
13
|
+
statedTypeAt: () => null,
|
|
14
|
+
boundCount: 0,
|
|
15
|
+
refusals: [],
|
|
16
|
+
refusalOf: () => null
|
|
17
|
+
};
|
|
18
|
+
const WIDENED = process.env['GEA_FLOW_WIDE'] === '1';
|
|
19
|
+
const isAnyType = (type) => (type.flags & ts.TypeFlags.Any) !== 0;
|
|
20
|
+
/** Duplicated from `parameter-bindings.ts` (not exported there): `any`/`void`/`never` say nothing about storage. */
|
|
21
|
+
const isUnusableEvidence = (type) => (type.flags & (ts.TypeFlags.Any | ts.TypeFlags.Void | ts.TypeFlags.Never)) !== 0;
|
|
22
|
+
/**
|
|
23
|
+
* `never[]` (or `readonly never[]`) -- TypeScript's own answer for `this.x =
|
|
24
|
+
* [];` with no contextual type to narrow it, and no more a fact about the
|
|
25
|
+
* program than the empty object type `{}` is; `annotationStatesNothing`
|
|
26
|
+
* already carries that reasoning for `{}` (see its own comment) but never
|
|
27
|
+
* asked the array-shaped version of the same question, so a field whose only
|
|
28
|
+
* whole-value write is a bare `[]` was read as REAL evidence -- bound to
|
|
29
|
+
* `never[]`, a type nothing can ever be assigned into or read out of, in
|
|
30
|
+
* front of every other write the program plainly makes to it (a `.push`, a
|
|
31
|
+
* computed-index write) elsewhere in the class. Same test
|
|
32
|
+
* `object-bag-bindings.ts`'s `statesNothing` already applies to a bag's own
|
|
33
|
+
* candidacy, asked here of a FIELD's write evidence instead.
|
|
34
|
+
*
|
|
35
|
+
* `any[]` and `unknown[]` are the same statement, and the test asked only the
|
|
36
|
+
* `never` half. `isUnusableEvidence` already refuses a bare `any` because it
|
|
37
|
+
* says nothing about what a slot holds; an array OF `any` says nothing about
|
|
38
|
+
* what its elements hold, and the only difference is one level of nesting.
|
|
39
|
+
* three's `Texture.mipmaps` is the measured case: `@type {Array<Object>}`,
|
|
40
|
+
* where the global `Object` INTERFACE is collapsed to `any` by
|
|
41
|
+
* `structural.ts`'s `isGlobalObjectInterface` for the same reason
|
|
42
|
+
* `annotationStatesNothing` refuses it bare -- so the annotation arrives here
|
|
43
|
+
* as `any[]`, read as REAL evidence, and the field's write set (which the
|
|
44
|
+
* program plainly fills with real mip records) was never consulted at all.
|
|
45
|
+
*/
|
|
46
|
+
const isVacuousArrayType = (checker, type) => {
|
|
47
|
+
if (!checker.isArrayType(type))
|
|
48
|
+
return false;
|
|
49
|
+
const [element] = checker.getTypeArguments(type);
|
|
50
|
+
return element !== undefined && (element.flags & (ts.TypeFlags.Never | ts.TypeFlags.Any | ts.TypeFlags.Unknown)) !== 0;
|
|
51
|
+
};
|
|
52
|
+
// The constructor allocates a fresh anonymous checker type. Intern by its
|
|
53
|
+
// complete inputs so repeated inference rounds publish the same fact identity.
|
|
54
|
+
const dictionaryTypes = new WeakMap();
|
|
55
|
+
const dictionaryTypeOf = (checker, valueType) => {
|
|
56
|
+
const cached = dictionaryTypes.get(checker)?.get(valueType);
|
|
57
|
+
if (cached)
|
|
58
|
+
return cached;
|
|
59
|
+
const constructing = checker;
|
|
60
|
+
if (typeof constructing.createIndexInfo !== 'function' || typeof constructing.createAnonymousType !== 'function')
|
|
61
|
+
return null;
|
|
62
|
+
const indexInfo = constructing.createIndexInfo(checker.getStringType(), valueType, false);
|
|
63
|
+
const dictionary = constructing.createAnonymousType(undefined, new Map(), [], [], [indexInfo]);
|
|
64
|
+
if (!dictionary || checker.getIndexInfosOfType(dictionary).length === 0)
|
|
65
|
+
return null;
|
|
66
|
+
let cache = dictionaryTypes.get(checker);
|
|
67
|
+
if (!cache) {
|
|
68
|
+
cache = new Map();
|
|
69
|
+
dictionaryTypes.set(checker, cache);
|
|
70
|
+
}
|
|
71
|
+
cache.set(valueType, dictionary);
|
|
72
|
+
return dictionary;
|
|
73
|
+
};
|
|
74
|
+
/** `type | null | undefined`, joining ONLY the nullish members of `nullish` -- a real `undefined`/`null` write the field's own whole-value evidence made is a FACT this module must not drop just because a separate pool of evidence (a write made THROUGH the field) answered its shape. */
|
|
75
|
+
const withNullish = (checker, type, nullish) => {
|
|
76
|
+
if (nullish.length === 0)
|
|
77
|
+
return type;
|
|
78
|
+
const constructing = checker;
|
|
79
|
+
if (typeof constructing.getUnionType !== 'function')
|
|
80
|
+
return null;
|
|
81
|
+
return constructing.getUnionType([type, ...nullish]);
|
|
82
|
+
};
|
|
83
|
+
/** A plain `x.field = expr` assignment -- what TypeScript's JS-class inference leaves in `declarations` for a field the program never declares. */
|
|
84
|
+
const isAssignmentDeclaration = (declaration) => ts.isBinaryExpression(declaration) && declaration.operatorToken.kind === ts.SyntaxKind.EqualsToken;
|
|
85
|
+
/**
|
|
86
|
+
* Whether a declaration is ambient (`declare class C { x }`, or anything
|
|
87
|
+
* nested inside a `declare module`) -- the same test `local-bindings.ts`
|
|
88
|
+
* applies to a cell, for the same reason: a host owns that storage, so its
|
|
89
|
+
* type is a host-boundary capability question and never this module's to
|
|
90
|
+
* answer.
|
|
91
|
+
*/
|
|
92
|
+
const isAmbientDeclaration = (node) => {
|
|
93
|
+
if ((ts.getCombinedModifierFlags(node) & ts.ModifierFlags.Ambient) !== 0)
|
|
94
|
+
return true;
|
|
95
|
+
for (let current = node.parent; current; current = current.parent) {
|
|
96
|
+
if (ts.isModuleDeclaration(current) && (ts.getCombinedModifierFlags(current) & ts.ModifierFlags.Ambient) !== 0)
|
|
97
|
+
return true;
|
|
98
|
+
}
|
|
99
|
+
return false;
|
|
100
|
+
};
|
|
101
|
+
/**
|
|
102
|
+
* A `PropertyDeclaration` that states storage and nothing else: `aspect;`.
|
|
103
|
+
* No annotation, no initializer and no JSDoc `@type` -- each of which is the
|
|
104
|
+
* program stating an answer this module must not contradict -- and not
|
|
105
|
+
* ambient, and not in a `.d.ts`. See the module doc comment's "The second
|
|
106
|
+
* shape".
|
|
107
|
+
*
|
|
108
|
+
* A JSDoc tag that resolves to NOTHING is not a statement, which is why the
|
|
109
|
+
* test is `jsDocTypeStatesNothing` rather than the tag's mere presence --
|
|
110
|
+
* the same distinction `local-bindings.ts`'s own `isCandidate` draws, and for
|
|
111
|
+
* the same reason: the checker degrades a tag naming an unbindable type to
|
|
112
|
+
* `any`, so reading presence alone excludes a field the program described
|
|
113
|
+
* and then records it as declared-dynamic.
|
|
114
|
+
*/
|
|
115
|
+
const isBareFieldDeclaration = (checker, declaration) => {
|
|
116
|
+
if (!ts.isPropertyDeclaration(declaration))
|
|
117
|
+
return false;
|
|
118
|
+
if (declaration.type || declaration.initializer)
|
|
119
|
+
return false;
|
|
120
|
+
if (declaration.getSourceFile().isDeclarationFile)
|
|
121
|
+
return false;
|
|
122
|
+
const jsDocType = ts.getJSDocType(declaration);
|
|
123
|
+
if (jsDocType && !jsDocTypeStatesNothing(checker, jsDocType))
|
|
124
|
+
return false;
|
|
125
|
+
return !isAmbientDeclaration(declaration);
|
|
126
|
+
};
|
|
127
|
+
/**
|
|
128
|
+
* A field the program DID type, whose statement is still only an UPPER BOUND
|
|
129
|
+
* -- the FIELD form of `parameter-bindings.ts`'s `statedUpperBound`, and the
|
|
130
|
+
* same question about the same kind of storage: an annotation with an
|
|
131
|
+
* `any`/`unknown`/bare-`Function` position somewhere inside it, satisfied at
|
|
132
|
+
* every position it constrains by what the program actually writes there.
|
|
133
|
+
*
|
|
134
|
+
* hono's `HonoRequest` is the measured case, and it is why this exists at all.
|
|
135
|
+
* Its constructor parameter `matchResult: Result<[unknown, RouterRoute]>` is
|
|
136
|
+
* already narrowed to the concrete `Result<[H, RouterRoute]>` its only caller
|
|
137
|
+
* passes, by exactly the parameter rule above. The FIELD it is stored into,
|
|
138
|
+
* `#matchResult: Result<[unknown, RouterRoute]>`, kept the annotation -- so
|
|
139
|
+
* the cell held the stated type while its one writer held the narrowed one,
|
|
140
|
+
* and the store between them asked the backend to reconcile two `Result`
|
|
141
|
+
* carriers. That reconciliation rebuilds two arrays, and an array rebuild is
|
|
142
|
+
* a COPY of an array the caller still holds, so it is not renderable at all:
|
|
143
|
+
* the carriers have to be made to AGREE here rather than converted there.
|
|
144
|
+
*
|
|
145
|
+
* An INITIALIZED field is excluded: the initializer is a write, and this
|
|
146
|
+
* module's write discovery reads property-assignment edges, not initializers,
|
|
147
|
+
* so joining without it would answer from a strict subset of the evidence.
|
|
148
|
+
* An OPTIONAL field's statement is `T | undefined` whatever the annotation
|
|
149
|
+
* spells, for the same reason a defaulted parameter's is.
|
|
150
|
+
*/
|
|
151
|
+
const statedUpperBoundOfField = (checker, declaration) => {
|
|
152
|
+
if (!ts.isPropertyDeclaration(declaration))
|
|
153
|
+
return null;
|
|
154
|
+
if (!declaration.type || declaration.initializer)
|
|
155
|
+
return null;
|
|
156
|
+
if (declaration.getSourceFile().isDeclarationFile)
|
|
157
|
+
return null;
|
|
158
|
+
if (isAmbientDeclaration(declaration))
|
|
159
|
+
return null;
|
|
160
|
+
const declared = checker.getTypeFromTypeNode(declaration.type);
|
|
161
|
+
// A whole annotation that states nothing is `isBareFieldDeclaration`'s
|
|
162
|
+
// business one shape over, not an upper bound to narrow within.
|
|
163
|
+
if (annotationStatesNothing(checker, declaration.type, declared))
|
|
164
|
+
return null;
|
|
165
|
+
if (isUnusableEvidence(declared))
|
|
166
|
+
return null;
|
|
167
|
+
if (!containsUnstatedPosition(checker, declaration.type, declared))
|
|
168
|
+
return null;
|
|
169
|
+
return declaration.questionToken ? checker.getNullableType(declared, ts.TypeFlags.Undefined) : declared;
|
|
170
|
+
};
|
|
171
|
+
/**
|
|
172
|
+
* The INTERFACE a field's annotation names, when it names exactly one.
|
|
173
|
+
*
|
|
174
|
+
* JavaScript has no interfaces. An `interface` annotation states what may be
|
|
175
|
+
* READ out of a slot; it never says what the slot physically holds, because
|
|
176
|
+
* nothing in the language ever constructs one. What the slot holds is whatever
|
|
177
|
+
* the program writes into it -- and when every write is an instance of one
|
|
178
|
+
* class, that class IS the storage.
|
|
179
|
+
*
|
|
180
|
+
* hono is the measured case and it is not a boxing question, it is a
|
|
181
|
+
* CORRECTNESS one. `HonoBase.router` is annotated `Router<[H, RouterRoute]>`,
|
|
182
|
+
* an interface whose members are `name`, `add` and `match`; the constructor
|
|
183
|
+
* writes `new PatternRouter()` and nothing else ever writes it. Carried as the
|
|
184
|
+
* interface, the field became a struct with two `gea::CallableObject` members
|
|
185
|
+
* that nothing could fill (a class's methods are free functions taking the
|
|
186
|
+
* instance, not storage), the class instance would not assign into it at all,
|
|
187
|
+
* and -- worse than either -- `PatternRouter.add`/`.match` were never reached
|
|
188
|
+
* through the class, so the census never walked them and NO BODY FOR EITHER
|
|
189
|
+
* WAS EMITTED. The program compiled its router away.
|
|
190
|
+
*
|
|
191
|
+
* Deliberately narrower than `statedUpperBoundOfField` above, which asks
|
|
192
|
+
* whether an annotation left a position UNSTATED and narrows within it. This
|
|
193
|
+
* asks a different question -- whether the annotation names a shape rather
|
|
194
|
+
* than a thing -- so the answer is held to a different test in `resolveSymbol`:
|
|
195
|
+
* the join must be a CLASS, and assignable to the interface. Anything else
|
|
196
|
+
* (two classes, an object literal, a plain type) refuses and leaves the field
|
|
197
|
+
* exactly as it is.
|
|
198
|
+
*/
|
|
199
|
+
const interfaceAnnotationOfField = (checker, declaration) => {
|
|
200
|
+
if (!ts.isPropertyDeclaration(declaration))
|
|
201
|
+
return null;
|
|
202
|
+
if (!declaration.type || declaration.initializer || declaration.questionToken)
|
|
203
|
+
return null;
|
|
204
|
+
if (declaration.getSourceFile().isDeclarationFile)
|
|
205
|
+
return null;
|
|
206
|
+
if (isAmbientDeclaration(declaration))
|
|
207
|
+
return null;
|
|
208
|
+
const declared = checker.getTypeFromTypeNode(declaration.type);
|
|
209
|
+
if (isUnusableEvidence(declared))
|
|
210
|
+
return null;
|
|
211
|
+
const declarations = declared.getSymbol()?.declarations;
|
|
212
|
+
const sole = declarations && declarations.length === 1 ? declarations[0] : undefined;
|
|
213
|
+
return sole && ts.isInterfaceDeclaration(sole) ? declared : null;
|
|
214
|
+
};
|
|
215
|
+
/** The interface annotation of the field `symbol` declares -- `null` unless it has exactly one declaration and that declaration names one. */
|
|
216
|
+
const interfaceBoundOfSymbol = (checker, symbol) => {
|
|
217
|
+
const declarations = symbol.declarations;
|
|
218
|
+
const sole = declarations && declarations.length === 1 ? declarations[0] : undefined;
|
|
219
|
+
return sole ? interfaceAnnotationOfField(checker, sole) : null;
|
|
220
|
+
};
|
|
221
|
+
/** Whether a type is a CLASS INSTANCE -- a thing the program constructs, as opposed to a shape it describes. */
|
|
222
|
+
const isClassInstanceType = (type) => {
|
|
223
|
+
const symbol = type.getSymbol();
|
|
224
|
+
if (!symbol || (symbol.flags & ts.SymbolFlags.Class) === 0)
|
|
225
|
+
return false;
|
|
226
|
+
const declaration = symbol.valueDeclaration;
|
|
227
|
+
return declaration !== undefined && ts.isClassLike(declaration);
|
|
228
|
+
};
|
|
229
|
+
/** The stated upper bound of the field `symbol` declares, with the declaration that states it -- `narrowsOnlyUnstatedPositions` needs the node as its anchor. `null` unless `symbol` has exactly one declaration and it is one; see `statedUpperBoundOfField`. */
|
|
230
|
+
const statedBoundOfSymbol = (checker, symbol) => {
|
|
231
|
+
const declarations = symbol.declarations;
|
|
232
|
+
const sole = declarations && declarations.length === 1 ? declarations[0] : undefined;
|
|
233
|
+
if (!sole)
|
|
234
|
+
return null;
|
|
235
|
+
const bound = statedUpperBoundOfField(checker, sole);
|
|
236
|
+
return bound ? { declaration: sole, bound } : null;
|
|
237
|
+
};
|
|
238
|
+
/**
|
|
239
|
+
* An assignment declaration (`this.x = expr;`) carrying its OWN JSDoc
|
|
240
|
+
* `@type` tag that states the slot's storage COMPLETELY -- not vacuous
|
|
241
|
+
* itself (`annotationStatesNothing`) and with no unstated position anywhere
|
|
242
|
+
* inside it (`containsUnstatedPosition`).
|
|
243
|
+
*
|
|
244
|
+
* TypeScript's JS-class inference builds an assignment-only field's
|
|
245
|
+
* declaration list from every `this.x = expr` alone, so `isCandidateSymbol`'s
|
|
246
|
+
* first shape ("the whole list is assignments") used to admit one as a
|
|
247
|
+
* fully-UNANNOTATED field regardless of a JSDoc comment sitting directly
|
|
248
|
+
* above the assignment -- even though `ts.getJSDocType` reads that comment
|
|
249
|
+
* from a `BinaryExpression` exactly as it does from a `PropertyDeclaration`,
|
|
250
|
+
* and the checker's own `getTypeOfSymbolAtLocation` already uses it for the
|
|
251
|
+
* symbol's type: three's `/** @type {Array<Plane>} *\/ this.clippingPlanes =
|
|
252
|
+
* [];` types the SYMBOL `Plane[]`, in full, from the tag alone. A
|
|
253
|
+
* `PropertyDeclaration` this fully stated is excluded from candidacy
|
|
254
|
+
* entirely -- this module's own doc below says why ("an annotated ... field
|
|
255
|
+
* ... means the program DID state something ... this module defers") -- but
|
|
256
|
+
* an assignment declaration carrying the identical statement was never asked
|
|
257
|
+
* the question.
|
|
258
|
+
*
|
|
259
|
+
* Left a CANDIDATE, this manufactures a refusal STRICTLY WORSE than doing
|
|
260
|
+
* nothing: `compute`'s `PropertyAccessExpression` case returns whatever
|
|
261
|
+
* `resolveSymbol` answers the instant `isCandidateSymbol` is true, never
|
|
262
|
+
* falling through to `propertyTypeOf`/`memberTypeOf` -- the ordinary
|
|
263
|
+
* checker-backed lookup that would have read the JSDoc-informed `Plane[]`
|
|
264
|
+
* directly. So a field the program fully described boxed every read of it,
|
|
265
|
+
* for want of a check a sibling shape (`isBareFieldDeclaration`) already
|
|
266
|
+
* makes for the OTHER declaration kind. Measured on the three.js app:
|
|
267
|
+
* `WebGLRenderer.clippingPlanes` and `UniformsGroup.uniforms`, each written
|
|
268
|
+
* once as an empty literal the evolving-array checker calls `never[]`
|
|
269
|
+
* (correctly silent as evidence -- see `resolveSymbol`'s `write-unresolved`)
|
|
270
|
+
* and annotated `Array<Plane>`/`Array<Uniform>` directly above that one
|
|
271
|
+
* write: fully concrete container types the program already committed to,
|
|
272
|
+
* refused here for want of ever reading the annotation.
|
|
273
|
+
*
|
|
274
|
+
* Deliberately narrower than "any JSDoc-typed assignment": `Array<Object>`
|
|
275
|
+
* (three's `updateRanges`/`coefficients`, same shape, same single silent
|
|
276
|
+
* write) has an UNSTATED position (`Object` states nothing on its own,
|
|
277
|
+
* `containsUnstatedPosition` agrees) and stays a candidate, unaffected by
|
|
278
|
+
* this check -- narrowing that kind of annotation from write evidence is the
|
|
279
|
+
* THIRD shape's job (`statedUpperBoundOfField`), not this one's, and a field
|
|
280
|
+
* whose only write is silent still has no evidence to narrow with, so it
|
|
281
|
+
* keeps refusing exactly as before rather than being declared "fully
|
|
282
|
+
* described" when the annotation itself says otherwise.
|
|
283
|
+
*/
|
|
284
|
+
const assignmentStatesCompleteJsDocType = (checker, declaration) => {
|
|
285
|
+
if (!ts.isBinaryExpression(declaration))
|
|
286
|
+
return false;
|
|
287
|
+
const jsDocType = ts.getJSDocType(declaration);
|
|
288
|
+
if (!jsDocType)
|
|
289
|
+
return false;
|
|
290
|
+
const declared = checker.getTypeFromTypeNode(jsDocType);
|
|
291
|
+
if (isUnusableEvidence(declared))
|
|
292
|
+
return false;
|
|
293
|
+
if (annotationStatesNothing(checker, declaration, declared))
|
|
294
|
+
return false;
|
|
295
|
+
return !containsUnstatedPosition(checker, declaration, declared);
|
|
296
|
+
};
|
|
297
|
+
/**
|
|
298
|
+
* Whether `symbol` is one of the two shapes this module types: a property
|
|
299
|
+
* whose ENTIRE declaration list is plain `x.field = expr` assignments (no
|
|
300
|
+
* declaration at all -- TypeScript's own JS-class inference), or one declared
|
|
301
|
+
* exactly once as a BARE `field;` (storage stated, type not).
|
|
302
|
+
*
|
|
303
|
+
* Anything else -- an accessor, an annotated/initialized/JSDoc-typed field, a
|
|
304
|
+
* mixed list pairing an assignment with a real declaration -- means the
|
|
305
|
+
* program DID state something, or another authority already answers it, and
|
|
306
|
+
* this module defers.
|
|
307
|
+
*/
|
|
308
|
+
const isCandidateSymbol = (checker, symbol) => {
|
|
309
|
+
if (inheritedAccessorOfAssignment(checker, symbol))
|
|
310
|
+
return false;
|
|
311
|
+
const declarations = symbol.declarations;
|
|
312
|
+
if (!declarations || declarations.length === 0)
|
|
313
|
+
return false;
|
|
314
|
+
if (declarations.every(isAssignmentDeclaration)) {
|
|
315
|
+
// A SOLE assignment whose own JSDoc tag already states its storage
|
|
316
|
+
// completely defers to the checker's (JSDoc-informed) answer instead of
|
|
317
|
+
// becoming a candidate that could only ever refuse -- see
|
|
318
|
+
// `assignmentStatesCompleteJsDocType`. A multi-declaration symbol (a
|
|
319
|
+
// subclass also writes it) is unaffected: agreeing that ONE declaration
|
|
320
|
+
// is fully stated says nothing about whether the OTHERS are, so this
|
|
321
|
+
// stays conservative and only fires where `statedBoundOfSymbol` and
|
|
322
|
+
// friends already require a sole declaration.
|
|
323
|
+
const sole = declarations.length === 1 ? declarations[0] : undefined;
|
|
324
|
+
return sole === undefined || !assignmentStatesCompleteJsDocType(checker, sole);
|
|
325
|
+
}
|
|
326
|
+
const sole = declarations.length === 1 ? declarations[0] : undefined;
|
|
327
|
+
if (sole === undefined)
|
|
328
|
+
return false;
|
|
329
|
+
// The third shape: an annotated field whose statement is only an upper
|
|
330
|
+
// bound. Admitted as a candidate here and held to that statement in
|
|
331
|
+
// `resolveSymbol`, which refuses it unless every write narrows the
|
|
332
|
+
// annotation only where the annotation said nothing.
|
|
333
|
+
// The fourth shape: an annotation that names an INTERFACE. See
|
|
334
|
+
// `interfaceAnnotationOfField` for why that is a description of the slot's
|
|
335
|
+
// readers rather than a statement of what it holds.
|
|
336
|
+
return (isBareFieldDeclaration(checker, sole) ||
|
|
337
|
+
statedUpperBoundOfField(checker, sole) !== null ||
|
|
338
|
+
interfaceAnnotationOfField(checker, sole) !== null);
|
|
339
|
+
};
|
|
340
|
+
/**
|
|
341
|
+
* Whole-program census of what every unannotated, assignment-only class
|
|
342
|
+
* field holds, once every write to it agrees.
|
|
343
|
+
*
|
|
344
|
+
* `parameters` is the already-settled, composed census this runs on top of
|
|
345
|
+
* (parameters + returns + locals, in whatever order `frontend.ts` composed
|
|
346
|
+
* them) -- asked first at every identifier, exactly as `local-bindings.ts`
|
|
347
|
+
* asks it first. This module never reopens that fixpoint; it only adds what
|
|
348
|
+
* none of those authorities could answer because the chain passed through a
|
|
349
|
+
* field with no declaration of its own.
|
|
350
|
+
*/
|
|
351
|
+
export const censusFieldBindings = (checker, files, reachable, parameters = emptyParameterBindingCensus,
|
|
352
|
+
/** The same-round array census -- see `return-bindings.ts`'s identical parameter for why, and `frontend.ts`'s `compose`. */
|
|
353
|
+
collections = emptyCollectionBindingCensus,
|
|
354
|
+
/**
|
|
355
|
+
* The whole-program value-flow index -- the ONE walk that states where every
|
|
356
|
+
* write is. This module's own write discovery reads its edges from it rather
|
|
357
|
+
* than re-deriving them; see `flow/model.ts`.
|
|
358
|
+
*/
|
|
359
|
+
flow) => {
|
|
360
|
+
const bound = new Map();
|
|
361
|
+
/** The synthesized union arms for a field whose writes disagree but disjointly -- see `resolveSymbol`. */
|
|
362
|
+
const unionArms = new Map();
|
|
363
|
+
/** The subset of `bound` that came from a STATED annotation -- see `statedTypeAt`. */
|
|
364
|
+
const statedBindings = new Map();
|
|
365
|
+
const refusalOf = new Map();
|
|
366
|
+
const resolvingSymbols = new Set();
|
|
367
|
+
/** Whether resolution is in the relaxed retry phase, where a silent write is an absence rather than a veto. See `resolveSymbol`. */
|
|
368
|
+
let lenientPhase = false;
|
|
369
|
+
/**
|
|
370
|
+
* Every write this module treats as EVIDENCE about a field's own storage,
|
|
371
|
+
* read from the shared value-flow index rather than re-derived by a private
|
|
372
|
+
* walk of this module's own.
|
|
373
|
+
*
|
|
374
|
+
* This is an EDGE-SOURCE swap, not a policy change. `property-assignment`
|
|
375
|
+
* with a `whole` slot is exactly the `x.field = expr` shape the private walk
|
|
376
|
+
* this replaced looked for, resolved by the identical
|
|
377
|
+
* `checker.getSymbolAtLocation` call at the identical node -- see
|
|
378
|
+
* `FlowTarget`, which records BOTH property-symbol resolutions precisely so
|
|
379
|
+
* a swap like this one cannot silently change which symbol a write lands on.
|
|
380
|
+
*
|
|
381
|
+
* What the swap ADDS is the edges the private walk never had:
|
|
382
|
+
*
|
|
383
|
+
* - `index-assignment` at a `whole` slot -- `o[ 'field' ] = v`, a named
|
|
384
|
+
* member spelled with brackets. `literalMemberNameOf` already draws this
|
|
385
|
+
* partition on the READ side in every census here; the write side asked a
|
|
386
|
+
* narrower question purely because each census wrote its own walk.
|
|
387
|
+
* - `logical-assignment` -- `this.field ??= v`. The slot ends up holding
|
|
388
|
+
* either its previous contents, which every other write already describes,
|
|
389
|
+
* or `v`. So `v` is ordinary write evidence, and joining it is the same
|
|
390
|
+
* rule applied to a write the old walk could not see.
|
|
391
|
+
* - `destructuring-default` -- `({ x: this.a = v } = o)`, the same argument.
|
|
392
|
+
*
|
|
393
|
+
* A write with no VALUE is deliberately excluded: a compound assignment, a
|
|
394
|
+
* `delete`, an iteration binding and a plain destructuring target all state
|
|
395
|
+
* that the slot EXISTS and nothing about what it holds. Admitting them would
|
|
396
|
+
* feed the join a write it cannot type, which this module's own strict phase
|
|
397
|
+
* reads as a veto -- turning a bound field into a refused one, which is the
|
|
398
|
+
* one direction adding evidence must never move.
|
|
399
|
+
*/
|
|
400
|
+
const isFieldEvidence = (write) => write.slot === 'whole' &&
|
|
401
|
+
write.value !== null &&
|
|
402
|
+
(write.edge === 'property-assignment' ||
|
|
403
|
+
(WIDENED && (write.edge === 'index-assignment' || write.edge === 'logical-assignment' || write.edge === 'destructuring-default')));
|
|
404
|
+
/**
|
|
405
|
+
* Every expression written into `symbol`'s storage. For a field with no
|
|
406
|
+
* declaration these are its declarations' own right-hand sides; for a bare
|
|
407
|
+
* `field;` they are the indexed writes. Deduplicated by node, because the
|
|
408
|
+
* two sources overlap exactly on the first shape.
|
|
409
|
+
*/
|
|
410
|
+
const writesOf = (symbol) => {
|
|
411
|
+
const writes = new Set();
|
|
412
|
+
for (const declaration of symbol.declarations ?? []) {
|
|
413
|
+
if (ts.isBinaryExpression(declaration))
|
|
414
|
+
writes.add(declaration.right);
|
|
415
|
+
}
|
|
416
|
+
for (const write of flow.writesToSymbol(symbol))
|
|
417
|
+
if (isFieldEvidence(write) && write.value)
|
|
418
|
+
writes.add(write.value);
|
|
419
|
+
return [...writes];
|
|
420
|
+
};
|
|
421
|
+
/**
|
|
422
|
+
* The checker's own answer at this node, when it says something usable.
|
|
423
|
+
*
|
|
424
|
+
* `annotationStatesNothing` is part of the test, not just
|
|
425
|
+
* `isUnusableEvidence`, and the difference is the single measured root of
|
|
426
|
+
* the vacuous-receiver family: three.js writes `@type {?Object}` above
|
|
427
|
+
* `this.view = null;`, the checker dutifully types the SYMBOL
|
|
428
|
+
* `Object | null`, and `Object` -- which states nothing about what the
|
|
429
|
+
* value holds -- is not `any`, so it read as real evidence. Worse than
|
|
430
|
+
* slipping through, it DOMINATES a `widestOf` join, because every type is
|
|
431
|
+
* assignable to `Object`: the one vacuous write out-voted the real record
|
|
432
|
+
* the program also wrote, `this.view` answered `Object | null`, and all 23
|
|
433
|
+
* member reads off it boxed. The layout resolver has asked
|
|
434
|
+
* `annotationStatesNothing` of the checker's answer since the two-
|
|
435
|
+
* authorities split it records; this census asking only half the question
|
|
436
|
+
* was drift, now closed.
|
|
437
|
+
*/
|
|
438
|
+
const known = (node) => {
|
|
439
|
+
const type = objectAssignTargetType(checker, node) ?? checker.getTypeAtLocation(node);
|
|
440
|
+
return isUnusableEvidence(type) || annotationStatesNothing(checker, node, type) || isVacuousArrayType(checker, type) ? null : type;
|
|
441
|
+
};
|
|
442
|
+
/**
|
|
443
|
+
* `this.bag[k] = v` and `this.bag.p = v`, read as ONE primitive: a bind
|
|
444
|
+
* whose reference's base resolves to `symbol`, with the slot being
|
|
445
|
+
* named or not. Read by `FlowSlotKind` alone -- `member`/`element` -- never
|
|
446
|
+
* by which edge kind produced it, so this stays correct regardless of
|
|
447
|
+
* which syntax (or, per the index's own roadmap, which call whose callee
|
|
448
|
+
* write-through the graph resolves) the write arrives as; `member`/
|
|
449
|
+
* `element` are the two REFERENCE shapes the language actually has, not a
|
|
450
|
+
* list of syntax forms this module enumerates.
|
|
451
|
+
*
|
|
452
|
+
* Evidence, never an answer: `dictionaryShapeOf` below is the one place
|
|
453
|
+
* this becomes a type, and only for the narrow shape it can answer
|
|
454
|
+
* soundly (every shape write UNNAMED). A field that also gets NAMED writes
|
|
455
|
+
* through it needs a real member symbol table to represent, which is a
|
|
456
|
+
* further extension this does not attempt.
|
|
457
|
+
*/
|
|
458
|
+
const shapeWritesOf = (symbol) => flow.writesToSymbol(symbol).filter((write) => (write.slot === 'member' || write.slot === 'element') && write.value !== null);
|
|
459
|
+
/**
|
|
460
|
+
* A field's shape read from writes made THROUGH it elsewhere in the
|
|
461
|
+
* program -- `this.morphTargetDictionary[ name ] = m` reached from a
|
|
462
|
+
* different method than the one that creates `morphTargetDictionary`,
|
|
463
|
+
* three separate times in three unrelated classes (`Line`/`Mesh`/`Points`)
|
|
464
|
+
* -- rather than from an `x.field = expr` write to the field itself.
|
|
465
|
+
* `field-bindings.ts`'s own write-set collection (`writesOf`) only ever
|
|
466
|
+
* looks at writes to the field's OWN whole value; a computed-index write
|
|
467
|
+
* made through it names no member of `field`'s own declaration list at
|
|
468
|
+
* all, so this is genuinely separate evidence, gathered and joined the
|
|
469
|
+
* same way (`known ?? resolveExpr`, then `joinOfWrites`) and refusing on
|
|
470
|
+
* the same terms (silence vetoes in the strict phase, joins what remains
|
|
471
|
+
* once the lenient retry allows it).
|
|
472
|
+
*
|
|
473
|
+
* Deliberately narrow: answered ONLY when every shape write is UNNAMED
|
|
474
|
+
* (`element` slot) -- a plain index signature, `{ [k: string]: V }`, over
|
|
475
|
+
* the join of every value ever written that way. A field that ALSO
|
|
476
|
+
* receives a NAMED (`member`-slot) write refuses here rather than guess at
|
|
477
|
+
* a mixed record-with-index shape; see `dictionaryTypeOf`'s own comment
|
|
478
|
+
* for why building one soundly needs more than this module has today.
|
|
479
|
+
*/
|
|
480
|
+
/**
|
|
481
|
+
* `wholeValueTypes` is whatever this symbol's OWN `x.field = expr` writes
|
|
482
|
+
* already typed before this fallback ran (e.g. a real `this.field =
|
|
483
|
+
* undefined;` write elsewhere in the same class) -- evidence this module
|
|
484
|
+
* must not silently drop just because it did not, by itself, settle the
|
|
485
|
+
* field's shape. Folded in only when EVERY one of them is nullish: a
|
|
486
|
+
* genuine non-nullish disagreement (some other write states a real,
|
|
487
|
+
* different shape) is a fact this fallback is not sound to override, so it
|
|
488
|
+
* refuses rather than guess which answer wins.
|
|
489
|
+
*/
|
|
490
|
+
const dictionaryShapeOf = (symbol, wholeValueTypes) => {
|
|
491
|
+
if (wholeValueTypes.some((type) => (type.flags & (ts.TypeFlags.Null | ts.TypeFlags.Undefined)) === 0))
|
|
492
|
+
return null;
|
|
493
|
+
const writes = shapeWritesOf(symbol);
|
|
494
|
+
if (writes.length === 0 || writes.some((write) => write.slot === 'member'))
|
|
495
|
+
return null;
|
|
496
|
+
const types = [];
|
|
497
|
+
let silent = 0;
|
|
498
|
+
for (const write of writes) {
|
|
499
|
+
const value = write.value;
|
|
500
|
+
const type = known(value) ?? resolveExpr(value);
|
|
501
|
+
if (type)
|
|
502
|
+
types.push(type);
|
|
503
|
+
else
|
|
504
|
+
silent += 1;
|
|
505
|
+
}
|
|
506
|
+
if (types.length === 0 || (silent > 0 && !lenientPhase))
|
|
507
|
+
return null;
|
|
508
|
+
const joined = joinOfWrites(checker, types);
|
|
509
|
+
const dictionary = joined ? dictionaryTypeOf(checker, joined) : null;
|
|
510
|
+
return dictionary ? withNullish(checker, dictionary, wholeValueTypes) : null;
|
|
511
|
+
};
|
|
512
|
+
/** Whether the checker's raw answer at a write is a REAL fact refusing storage (`void`/`never`), as opposed to silence. */
|
|
513
|
+
const statesNoStorage = (node) => (checker.getTypeAtLocation(node).flags & (ts.TypeFlags.Void | ts.TypeFlags.Never)) !== 0;
|
|
514
|
+
/** Node-level memo/cycle-guard for the general resolver below. */
|
|
515
|
+
const nodeMemo = new Map();
|
|
516
|
+
const nodeResolving = new Set();
|
|
517
|
+
// The closed-family fallback is the parameter census's own rule, asked the
|
|
518
|
+
// same way -- see `flow/class-family-member-read.ts`.
|
|
519
|
+
const propertyTypeOf = (receiver, name, at) => memberTypeOf(checker, receiver, name, at, flow) ?? classFamilyMemberReadTypeOf(checker, flow, receiver, name, parameters);
|
|
520
|
+
/** The member symbol a census-resolved receiver declares under `name` -- the symbol a read through an `any` receiver could not name itself. */
|
|
521
|
+
const memberSymbolOf = (receiver, name) => checker.getPropertyOfType(checker.getNonNullableType(receiver), name) ?? null;
|
|
522
|
+
/** The expression a literal member was written with -- `{ depth: depthBuffer }` or shorthand `{ depthBuffer }` -- or `null` for any other declaration kind. */
|
|
523
|
+
const literalMemberInitializerOf = (member) => {
|
|
524
|
+
const declaration = member?.valueDeclaration;
|
|
525
|
+
if (!declaration)
|
|
526
|
+
return null;
|
|
527
|
+
if (ts.isPropertyAssignment(declaration))
|
|
528
|
+
return declaration.initializer;
|
|
529
|
+
if (ts.isShorthandPropertyAssignment(declaration))
|
|
530
|
+
return declaration.name;
|
|
531
|
+
return null;
|
|
532
|
+
};
|
|
533
|
+
/**
|
|
534
|
+
* The `value` initializer of an `Object.defineProperty(this, name, { value })`
|
|
535
|
+
* in the receiver class's constructor -- or `null` when no constructor of the
|
|
536
|
+
* class or its bases defines `name` that way.
|
|
537
|
+
*
|
|
538
|
+
* With `checkJs` off the checker declares NO member for a descriptor-defined
|
|
539
|
+
* field, so a read of it names no symbol and `memberSymbolOf` answers
|
|
540
|
+
* nothing; the class LAYOUT, which consumes the define-own-property
|
|
541
|
+
* operation, carries the field natively all the same. Three's `LOD` defines
|
|
542
|
+
* `levels` exactly this way (`define-property-source-transform.ts` lowers
|
|
543
|
+
* the `defineProperties` map to one call per key, binding the receiver and
|
|
544
|
+
* each descriptor to a `const` first), and every `this.levels` read fell to
|
|
545
|
+
* the checker's `any`, so `levels[ i ].hysteresis` reached a `*` as a box.
|
|
546
|
+
* The receiver may be `this` or a `const` alias of it, and the descriptor an
|
|
547
|
+
* object literal or a `const` bound to one: both are the shapes the
|
|
548
|
+
* transform emits.
|
|
549
|
+
*/
|
|
550
|
+
const descriptorDefinedInitializerOf = (receiver, name) => {
|
|
551
|
+
const constInitializerOf = (expression) => {
|
|
552
|
+
if (!ts.isIdentifier(expression))
|
|
553
|
+
return null;
|
|
554
|
+
const declaration = checker.getSymbolAtLocation(expression)?.valueDeclaration;
|
|
555
|
+
if (!declaration || !ts.isVariableDeclaration(declaration) || !declaration.initializer)
|
|
556
|
+
return null;
|
|
557
|
+
if (!(ts.getCombinedNodeFlags(declaration) & ts.NodeFlags.Const))
|
|
558
|
+
return null;
|
|
559
|
+
return declaration.initializer;
|
|
560
|
+
};
|
|
561
|
+
const isThisReceiver = (expression) => expression.kind === ts.SyntaxKind.ThisKeyword || constInitializerOf(expression)?.kind === ts.SyntaxKind.ThisKeyword;
|
|
562
|
+
const descriptorLiteralOf = (expression) => {
|
|
563
|
+
if (ts.isObjectLiteralExpression(expression))
|
|
564
|
+
return expression;
|
|
565
|
+
const bound = constInitializerOf(expression);
|
|
566
|
+
return bound && ts.isObjectLiteralExpression(bound) ? bound : null;
|
|
567
|
+
};
|
|
568
|
+
const seen = new Set();
|
|
569
|
+
let current = checker.getNonNullableType(receiver);
|
|
570
|
+
while (current && !seen.has(current)) {
|
|
571
|
+
seen.add(current);
|
|
572
|
+
const declaration = current.getSymbol()?.valueDeclaration;
|
|
573
|
+
if (!declaration || !ts.isClassLike(declaration))
|
|
574
|
+
return null;
|
|
575
|
+
const constructor = declaration.members.find(ts.isConstructorDeclaration);
|
|
576
|
+
let found = null;
|
|
577
|
+
const visit = (node) => {
|
|
578
|
+
if (found || ts.isFunctionLike(node))
|
|
579
|
+
return;
|
|
580
|
+
if (ts.isCallExpression(node) &&
|
|
581
|
+
ts.isPropertyAccessExpression(node.expression) &&
|
|
582
|
+
ts.isIdentifier(node.expression.expression) &&
|
|
583
|
+
node.expression.expression.text === 'Object' &&
|
|
584
|
+
node.expression.name.text === 'defineProperty' &&
|
|
585
|
+
node.arguments.length === 3) {
|
|
586
|
+
const [target, key, descriptor] = node.arguments;
|
|
587
|
+
if (target && key && descriptor && ts.isStringLiteralLike(key) && key.text === name && isThisReceiver(target)) {
|
|
588
|
+
const literal = descriptorLiteralOf(descriptor);
|
|
589
|
+
const value = literal?.properties.find((property) => ts.isPropertyAssignment(property) &&
|
|
590
|
+
(ts.isIdentifier(property.name) || ts.isStringLiteral(property.name)) &&
|
|
591
|
+
property.name.text === 'value');
|
|
592
|
+
if (value) {
|
|
593
|
+
found = value.initializer;
|
|
594
|
+
return;
|
|
595
|
+
}
|
|
596
|
+
}
|
|
597
|
+
}
|
|
598
|
+
ts.forEachChild(node, visit);
|
|
599
|
+
};
|
|
600
|
+
if (constructor?.body)
|
|
601
|
+
visit(constructor.body);
|
|
602
|
+
if (found)
|
|
603
|
+
return found;
|
|
604
|
+
const bases = checker.getBaseTypes(current);
|
|
605
|
+
current = bases.length === 1 && bases[0] ? bases[0] : null;
|
|
606
|
+
}
|
|
607
|
+
return null;
|
|
608
|
+
};
|
|
609
|
+
/**
|
|
610
|
+
* The two arms of a NAMED read through a string index signature --
|
|
611
|
+
* `uniforms.dfgLUT` on three's `NativeUniforms = Record<string,
|
|
612
|
+
* NativeUniformSlot>` -- or `null` when the receiver declares the member (or
|
|
613
|
+
* nothing at all).
|
|
614
|
+
*
|
|
615
|
+
* Such a read names no property symbol, so `memberSymbolOf` and
|
|
616
|
+
* `propertyTypeOf` both answered nothing and every `uniforms.X.value = v`
|
|
617
|
+
* store in `WebGLRenderer.setProgram` boxed the slot to write through
|
|
618
|
+
* `reflectSet`. Answering the index signature's value type ALONE is the
|
|
619
|
+
* other failure: `m_uniforms.dfgLUT !== undefined` then folded to `true`
|
|
620
|
+
* and a phong material's uniforms, which have no `dfgLUT`, dereferenced the
|
|
621
|
+
* null slot. The read is the value OR absence, which is the same
|
|
622
|
+
* synthesized-union channel a field's disagreeing write set already
|
|
623
|
+
* publishes through (`unionArmsAt`): a lone dictionary read stays a
|
|
624
|
+
* per-key optional, and the comparison stays a real comparison.
|
|
625
|
+
*/
|
|
626
|
+
const indexMemberArmsAt = (node) => {
|
|
627
|
+
if (checker.getSymbolAtLocation(node))
|
|
628
|
+
return null;
|
|
629
|
+
const receiver = receiverTypeOf(node.expression);
|
|
630
|
+
if (!receiver)
|
|
631
|
+
return null;
|
|
632
|
+
const object = checker.getNonNullableType(receiver);
|
|
633
|
+
if ((object.flags & (ts.TypeFlags.Any | ts.TypeFlags.Unknown)) !== 0)
|
|
634
|
+
return null;
|
|
635
|
+
if (checker.getPropertyOfType(object, node.name.text))
|
|
636
|
+
return null;
|
|
637
|
+
const indexed = checker.getIndexInfoOfType(object, ts.IndexKind.String)?.type;
|
|
638
|
+
if (!indexed || (indexed.flags & (ts.TypeFlags.Any | ts.TypeFlags.Unknown)) !== 0)
|
|
639
|
+
return null;
|
|
640
|
+
// Flat, like every other arm list this channel publishes: a declared
|
|
641
|
+
// `Array<...> | undefined` value contributes its own members, and the
|
|
642
|
+
// read's absence is the one `undefined` arm.
|
|
643
|
+
const members = indexed.isUnion() ? indexed.types : [indexed];
|
|
644
|
+
const present = members.filter((member) => (member.flags & ts.TypeFlags.Undefined) === 0);
|
|
645
|
+
return present.length === 0 ? null : [...present, checker.getUndefinedType()];
|
|
646
|
+
};
|
|
647
|
+
/** The census's type for a receiver expression: its resolved type, or the PRESENT arm of an index-signature read the union channel answers -- absence is the read's own guard, not the member lookup's. */
|
|
648
|
+
const receiverTypeOf = (expression) => {
|
|
649
|
+
const resolved = knownOrResolve(expression);
|
|
650
|
+
if (resolved)
|
|
651
|
+
return resolved;
|
|
652
|
+
const unwrapped = unwrapParens(expression);
|
|
653
|
+
if (!ts.isPropertyAccessExpression(unwrapped))
|
|
654
|
+
return null;
|
|
655
|
+
const arms = indexMemberArmsAt(unwrapped);
|
|
656
|
+
return arms?.find((arm) => (arm.flags & ts.TypeFlags.Undefined) === 0) ?? null;
|
|
657
|
+
};
|
|
658
|
+
/** `getSymbolAtLocation` for a member read, falling back to the census-resolved receiver's own member when the checker names none. */
|
|
659
|
+
const memberSymbolAt = (node) => {
|
|
660
|
+
const named = checker.getSymbolAtLocation(node);
|
|
661
|
+
if (named)
|
|
662
|
+
return named;
|
|
663
|
+
const receiver = knownOrResolve(node.expression);
|
|
664
|
+
return receiver ? memberSymbolOf(receiver, node.name.text) : null;
|
|
665
|
+
};
|
|
666
|
+
const attribute = (symbol, reason) => {
|
|
667
|
+
if (!refusalOf.has(symbol))
|
|
668
|
+
refusalOf.set(symbol, reason);
|
|
669
|
+
return null;
|
|
670
|
+
};
|
|
671
|
+
/**
|
|
672
|
+
* `symbol`'s own resolved type -- the join of every write to it -- or
|
|
673
|
+
* `null` when this module refuses it. Memoized in `bound`; cycle-guarded
|
|
674
|
+
* by `resolvingSymbols` so a field whose write reads itself (or another
|
|
675
|
+
* field/cell whose write reads this one) refuses instead of looping.
|
|
676
|
+
*/
|
|
677
|
+
const resolveSymbol = (symbol) => {
|
|
678
|
+
const already = bound.get(symbol);
|
|
679
|
+
if (already)
|
|
680
|
+
return already;
|
|
681
|
+
if (unionArms.has(symbol))
|
|
682
|
+
return null;
|
|
683
|
+
if (!isCandidateSymbol(checker, symbol))
|
|
684
|
+
return null;
|
|
685
|
+
if (refusalOf.has(symbol))
|
|
686
|
+
return null;
|
|
687
|
+
if (resolvingSymbols.has(symbol))
|
|
688
|
+
return null;
|
|
689
|
+
resolvingSymbols.add(symbol);
|
|
690
|
+
const stated = statedBoundOfSymbol(checker, symbol);
|
|
691
|
+
let result = null;
|
|
692
|
+
const writes = writesOf(symbol);
|
|
693
|
+
const types = [];
|
|
694
|
+
let silent = 0;
|
|
695
|
+
let refused = null;
|
|
696
|
+
for (const write of writes) {
|
|
697
|
+
// A STATED CELL THE UPSTREAM CENSUS NARROWED OUTRANKS THE CHECKER at
|
|
698
|
+
// this write. `known` asks the checker first everywhere else, which is
|
|
699
|
+
// right when the checker's answer is the last word about the value --
|
|
700
|
+
// and wrong for exactly the value whose own cell was narrowed WITHIN a
|
|
701
|
+
// statement the checker still reports in full. hono's
|
|
702
|
+
// `this.#matchResult = matchResult` is the measured case: the parameter
|
|
703
|
+
// census already bound `matchResult` to the concrete
|
|
704
|
+
// `Result<[H, RouterRoute]>` its only caller passes, while the checker
|
|
705
|
+
// keeps answering the annotation's `Result<[unknown, RouterRoute]>`, so
|
|
706
|
+
// reading the checker here typed the FIELD as the upper bound and left
|
|
707
|
+
// the store between two disagreeing carriers -- the same
|
|
708
|
+
// two-authorities split every census here exists to close, one hop
|
|
709
|
+
// downstream. `statedTypeAt` answers only where such a narrowing was
|
|
710
|
+
// admitted, so this changes nothing anywhere else.
|
|
711
|
+
// An EMPTY literal the program writes is a fresh object with zero
|
|
712
|
+
// members, not the vacuous `{}` annotation `known` rightly discards --
|
|
713
|
+
// the same holder `parameter-bindings.ts`/`local-bindings.ts` already
|
|
714
|
+
// read it as (`exactEmptyObjectLiteralType`). three's
|
|
715
|
+
// `/** @type {Object} */ this.userData = {};` is the measured case:
|
|
716
|
+
// with that write silent, every class's `userData` fell back to the
|
|
717
|
+
// annotation's `any` and boxed the empty object it only ever holds.
|
|
718
|
+
const type = parameters.statedTypeAt(write) ?? exactEmptyObjectLiteralType(checker, write) ?? known(write) ?? resolveExpr(write);
|
|
719
|
+
if (type)
|
|
720
|
+
types.push(type);
|
|
721
|
+
// A write typed `void`/`never` is a real fact stating the storage holds
|
|
722
|
+
// nothing a program can use -- a veto in both phases, exactly as
|
|
723
|
+
// `parameter-bindings.ts` keeps `call-passes-no-argument` firing in its
|
|
724
|
+
// own relaxed phase. Only a write nobody could type at all is SILENCE.
|
|
725
|
+
else if (statesNoStorage(write)) {
|
|
726
|
+
refused = 'write-states-no-storage';
|
|
727
|
+
break;
|
|
728
|
+
}
|
|
729
|
+
else
|
|
730
|
+
silent += 1;
|
|
731
|
+
}
|
|
732
|
+
// A bare `field;` nothing ever writes says nothing about its storage --
|
|
733
|
+
// distinct from a disagreement, and left exactly as the checker has it.
|
|
734
|
+
if (writes.length === 0)
|
|
735
|
+
attribute(symbol, 'no-writes');
|
|
736
|
+
else if (refused)
|
|
737
|
+
attribute(symbol, refused);
|
|
738
|
+
// EVIDENCE EXHAUSTED -- the same rule, the same order, as
|
|
739
|
+
// `parameter-bindings.ts`'s `skipSilentSites` phase: a write that states
|
|
740
|
+
// nothing is not a write that disagrees. In the strict phase one silent
|
|
741
|
+
// write still refuses the whole field; the relaxed retry (below, run only
|
|
742
|
+
// over fields the strict pass could not bind) joins the writes that DO
|
|
743
|
+
// speak. `writes-disagree` still fires over what remains, and a field
|
|
744
|
+
// whose every write is silent refuses exactly as before. Measured shape:
|
|
745
|
+
// `Vector3`'s `x`/`y`/`z` carry 34 writes each, 33 typed `number` and one
|
|
746
|
+
// (`this.x = e[ 12 ]`, `e` unannotated) silent -- 759 reads boxed by a
|
|
747
|
+
// veto that read no fact.
|
|
748
|
+
else if (silent > 0 && (!lenientPhase || types.length === 0))
|
|
749
|
+
attribute(symbol, 'write-unresolved');
|
|
750
|
+
else {
|
|
751
|
+
const joined = joinOfWrites(checker, types);
|
|
752
|
+
if (joined)
|
|
753
|
+
result = joined;
|
|
754
|
+
else {
|
|
755
|
+
// The join found no single covering type. Before refusing, ask
|
|
756
|
+
// whether the disagreement is itself a sound answer -- see
|
|
757
|
+
// `disjointUnionMembersOf`'s own comment for what "sound" means.
|
|
758
|
+
const arms = disjointUnionMembersOf(checker, types);
|
|
759
|
+
if (arms)
|
|
760
|
+
unionArms.set(symbol, arms);
|
|
761
|
+
else
|
|
762
|
+
attribute(symbol, 'writes-disagree');
|
|
763
|
+
}
|
|
764
|
+
}
|
|
765
|
+
// A field's OWN writes settled on NOTHING -- no `x.field = expr` at all,
|
|
766
|
+
// or every one silent. Before leaving it there, ask whether the program
|
|
767
|
+
// instead writes THROUGH it: `dictionaryShapeOf` reads exactly that,
|
|
768
|
+
// uniformly by slot rather than by syntax (see its own comment). Tried
|
|
769
|
+
// only here, as a fallback -- a field whose own writes already answered
|
|
770
|
+
// something (bound, union-armed, or refused for a REAL reason such as
|
|
771
|
+
// `write-states-no-storage`/`writes-disagree`) keeps that answer.
|
|
772
|
+
// A STATED field is held to its statement, exactly as
|
|
773
|
+
// `parameter-bindings.ts` holds a stated parameter to its own: the join
|
|
774
|
+
// has to be assignable to the annotation (the floor -- a write the
|
|
775
|
+
// annotation forbids is not what this field holds, whatever the writes
|
|
776
|
+
// say) AND to differ from it only where the annotation said nothing. A
|
|
777
|
+
// synthesized disjoint union is refused outright: those arms are a member
|
|
778
|
+
// LIST for `table.intern`, never a `ts.Type` the statement can be tested
|
|
779
|
+
// against, so there is nothing to hold it to.
|
|
780
|
+
// See `interfaceAnnotationOfField`: an `interface` annotation describes a
|
|
781
|
+
// slot's readers, never its storage, so a join that settles on ONE CLASS
|
|
782
|
+
// satisfying it is what the slot holds -- including where the annotation
|
|
783
|
+
// ALSO left a position unstated, which is the ordinary case for a generic
|
|
784
|
+
// interface and would otherwise be refused below as narrowing a stated
|
|
785
|
+
// position (the class is a different nominal type, not a filled hole).
|
|
786
|
+
const declaredInterface = interfaceBoundOfSymbol(checker, symbol);
|
|
787
|
+
const classSatisfiesInterface = declaredInterface !== null &&
|
|
788
|
+
result !== null &&
|
|
789
|
+
!unionArms.has(symbol) &&
|
|
790
|
+
isClassInstanceType(result) &&
|
|
791
|
+
checker.isTypeAssignableTo(result, declaredInterface);
|
|
792
|
+
if (declaredInterface !== null && !classSatisfiesInterface && !stated) {
|
|
793
|
+
if (unionArms.has(symbol)) {
|
|
794
|
+
unionArms.delete(symbol);
|
|
795
|
+
attribute(symbol, 'interface-field-synthesized-union');
|
|
796
|
+
}
|
|
797
|
+
else if (result) {
|
|
798
|
+
result = null;
|
|
799
|
+
attribute(symbol, 'interface-field-write-is-not-a-satisfying-class');
|
|
800
|
+
}
|
|
801
|
+
}
|
|
802
|
+
if (classSatisfiesInterface && result)
|
|
803
|
+
statedBindings.set(symbol, result);
|
|
804
|
+
if (stated && !classSatisfiesInterface) {
|
|
805
|
+
if (unionArms.has(symbol)) {
|
|
806
|
+
unionArms.delete(symbol);
|
|
807
|
+
attribute(symbol, 'stated-field-synthesized-union');
|
|
808
|
+
}
|
|
809
|
+
else if (result && carriesUnsubstitutedGeneric(checker, result)) {
|
|
810
|
+
result = null;
|
|
811
|
+
attribute(symbol, 'stated-field-open-generic');
|
|
812
|
+
}
|
|
813
|
+
else if (result && !checker.isTypeAssignableTo(result, stated.bound)) {
|
|
814
|
+
result = null;
|
|
815
|
+
attribute(symbol, 'stated-field-write-not-assignable');
|
|
816
|
+
}
|
|
817
|
+
else if (result && !narrowsOnlyUnstatedPositions(checker, stated.declaration, stated.bound, result)) {
|
|
818
|
+
result = null;
|
|
819
|
+
attribute(symbol, 'stated-field-narrows-a-stated-position');
|
|
820
|
+
}
|
|
821
|
+
if (result)
|
|
822
|
+
statedBindings.set(symbol, result);
|
|
823
|
+
}
|
|
824
|
+
// A stated field takes no dictionary fallback: the program described the
|
|
825
|
+
// storage, so "the program writes THROUGH it" is not a reading of an
|
|
826
|
+
// absence any more -- it is a second opinion about a slot that already
|
|
827
|
+
// has one.
|
|
828
|
+
if (!result && !stated && !unionArms.has(symbol)) {
|
|
829
|
+
const reason = refusalOf.get(symbol);
|
|
830
|
+
if (reason === 'no-writes' || reason === 'write-unresolved') {
|
|
831
|
+
const shape = dictionaryShapeOf(symbol, types);
|
|
832
|
+
if (shape) {
|
|
833
|
+
result = shape;
|
|
834
|
+
refusalOf.delete(symbol);
|
|
835
|
+
}
|
|
836
|
+
}
|
|
837
|
+
}
|
|
838
|
+
resolvingSymbols.delete(symbol);
|
|
839
|
+
if (result)
|
|
840
|
+
bound.set(symbol, result);
|
|
841
|
+
return result;
|
|
842
|
+
};
|
|
843
|
+
const unwrapParens = (node) => {
|
|
844
|
+
let current = node;
|
|
845
|
+
while (ts.isParenthesizedExpression(current))
|
|
846
|
+
current = current.expression;
|
|
847
|
+
return current;
|
|
848
|
+
};
|
|
849
|
+
/** Preserve upstream receiver evidence before deriving a field answer. Casts remain explicit boundaries. */
|
|
850
|
+
const knownOrResolve = (node) => {
|
|
851
|
+
const unwrapped = unwrapParens(node);
|
|
852
|
+
if (ts.isAsExpression(unwrapped) || ts.isTypeAssertionExpression(unwrapped))
|
|
853
|
+
return known(unwrapped);
|
|
854
|
+
return known(node) ?? parameters.typeAt(node) ?? resolveExpr(node);
|
|
855
|
+
};
|
|
856
|
+
/**
|
|
857
|
+
* The general walk. A property access checks whether ITS OWN symbol is a
|
|
858
|
+
* field candidate first -- a write's left-hand side and a read are the
|
|
859
|
+
* SAME symbol, so both answer from the SAME `resolveSymbol` computation --
|
|
860
|
+
* and only falls to the ordinary receiver-typed property lookup when it is
|
|
861
|
+
* not. Every other node kind recurses through the SAME upstream-first rule
|
|
862
|
+
* at its own operands, so a chain like `this.view.enabled` resolves once
|
|
863
|
+
* `view` does, regardless of which layer actually answered it.
|
|
864
|
+
*/
|
|
865
|
+
const compute = (node) => {
|
|
866
|
+
if (ts.isParenthesizedExpression(node) ||
|
|
867
|
+
ts.isAsExpression(node) ||
|
|
868
|
+
ts.isNonNullExpression(node) ||
|
|
869
|
+
ts.isTypeAssertionExpression(node)) {
|
|
870
|
+
return knownOrResolve(node.expression);
|
|
871
|
+
}
|
|
872
|
+
// A bare `field;` declaration is a node a downstream producer can publish
|
|
873
|
+
// a carrier from, so it MUST answer identically to every read of the same
|
|
874
|
+
// slot -- both from this one `resolveSymbol` computation. Answering reads
|
|
875
|
+
// while leaving the declaration to the checker's `any` is precisely the
|
|
876
|
+
// two-authorities-on-one-storage-location split that manufactures
|
|
877
|
+
// `binding-read-conversion` obligations; see `local-bindings.ts`'s header,
|
|
878
|
+
// which mirrors this hop for a `VariableDeclaration`.
|
|
879
|
+
if (ts.isPropertyDeclaration(node)) {
|
|
880
|
+
const declared = checker.getSymbolAtLocation(node.name);
|
|
881
|
+
return declared ? resolveSymbol(declared) : null;
|
|
882
|
+
}
|
|
883
|
+
if (ts.isPropertyAccessExpression(node)) {
|
|
884
|
+
const symbol = checker.getSymbolAtLocation(node);
|
|
885
|
+
if (symbol && isCandidateSymbol(checker, symbol))
|
|
886
|
+
return resolveSymbol(symbol);
|
|
887
|
+
const receiver = receiverTypeOf(node.expression);
|
|
888
|
+
if (!receiver)
|
|
889
|
+
return null;
|
|
890
|
+
// A named read through an index signature is answered as a union by
|
|
891
|
+
// `unionArmsAt` (see `indexMemberArmsAt`); a single type here would
|
|
892
|
+
// state presence the receiver never declared.
|
|
893
|
+
if (indexMemberArmsAt(node))
|
|
894
|
+
return null;
|
|
895
|
+
// An `any` receiver names no symbol,
|
|
896
|
+
// so the checker cannot say which field this read names -- but the
|
|
897
|
+
// census just resolved the receiver, and THAT type does. Look the member
|
|
898
|
+
// up on it and answer from this census's own write-set join, exactly as
|
|
899
|
+
// a read the checker could attribute is answered above. Without this
|
|
900
|
+
// hop the read fell to `propertyTypeOf`, which reads the checker's
|
|
901
|
+
// `any` for the field and refuses, so the census had typed the field
|
|
902
|
+
// AND the receiver and still boxed the read between them: three's
|
|
903
|
+
// `WebGLShadowMap( renderer, ... )` binds `renderer` from its one call
|
|
904
|
+
// site, `renderer.state` resolved to the typed struct field in the
|
|
905
|
+
// emitted C++, and `const _state = renderer.state` was laid out
|
|
906
|
+
// `gea::Value` from the checker's `any` -- every `_state.setBlending()`
|
|
907
|
+
// then went through dynamic lookup and threw on the first frame.
|
|
908
|
+
const member = symbol ? null : memberSymbolOf(receiver, node.name.text);
|
|
909
|
+
if (member && isCandidateSymbol(checker, member))
|
|
910
|
+
return resolveSymbol(member);
|
|
911
|
+
const typed = propertyTypeOf(receiver, node.name.text, node);
|
|
912
|
+
if (typed)
|
|
913
|
+
return typed;
|
|
914
|
+
// An OBJECT-LITERAL member the checker types `any` still has the one
|
|
915
|
+
// expression that filled it. Three's `WebGLState` returns
|
|
916
|
+
// `{ buffers: { depth: depthBuffer, ... } }` where `depthBuffer` is
|
|
917
|
+
// `new DepthBuffer()` -- `new` on a JS factory with no construct
|
|
918
|
+
// signature, `any` to the checker, a typed record to this census (the
|
|
919
|
+
// parameter census reads the factory's return). The literal's LAYOUT was
|
|
920
|
+
// already derived from that initializer, so the struct carries `depth`
|
|
921
|
+
// natively; a READ answered `null` here instead, and the emitter then
|
|
922
|
+
// boxed the native callable field to call it dynamically -- which threw
|
|
923
|
+
// on the first frame of the app's shadow pass. Answer the read from the
|
|
924
|
+
// same initializer the layout came from.
|
|
925
|
+
const filled = literalMemberInitializerOf(member ?? memberSymbolOf(receiver, node.name.text)) ??
|
|
926
|
+
descriptorDefinedInitializerOf(receiver, node.name.text);
|
|
927
|
+
return filled ? knownOrResolve(filled) : null;
|
|
928
|
+
}
|
|
929
|
+
if (ts.isElementAccessExpression(node) && node.argumentExpression) {
|
|
930
|
+
const receiver = knownOrResolve(node.expression);
|
|
931
|
+
if (!receiver)
|
|
932
|
+
return collections.arrayElementForRead(node.expression);
|
|
933
|
+
// A literal key is a named member spelled with brackets; any other key
|
|
934
|
+
// is answered by the receiver's index signature, and by nothing else.
|
|
935
|
+
const name = literalMemberNameOf(node);
|
|
936
|
+
if (name !== null)
|
|
937
|
+
return propertyTypeOf(receiver, name, node);
|
|
938
|
+
const key = knownOrResolve(node.argumentExpression);
|
|
939
|
+
if (!key)
|
|
940
|
+
return null;
|
|
941
|
+
// See `return-bindings.ts`'s identical fallback: a resolved receiver
|
|
942
|
+
// with no index signature of its own is still answerable from the
|
|
943
|
+
// array census's own push/write evidence.
|
|
944
|
+
return indexedTypeOf(checker, receiver, key, node, flow, parameters) ?? collections.arrayElementForRead(node.expression);
|
|
945
|
+
}
|
|
946
|
+
if (ts.isIdentifier(node))
|
|
947
|
+
return parameters.typeAt(node);
|
|
948
|
+
if (ts.isCallExpression(node) || ts.isNewExpression(node)) {
|
|
949
|
+
const upstream = parameters.typeAt(node);
|
|
950
|
+
if (upstream)
|
|
951
|
+
return upstream;
|
|
952
|
+
const invariant = overloadInvariantReturnTypeAt(checker, node, knownOrResolve);
|
|
953
|
+
if (invariant)
|
|
954
|
+
return invariant;
|
|
955
|
+
const callee = knownOrResolve(node.expression);
|
|
956
|
+
if (!callee)
|
|
957
|
+
return null;
|
|
958
|
+
const constructed = ts.isNewExpression(node) ? callee.getConstructSignatures() : [];
|
|
959
|
+
const signatures = constructed.length > 0 ? constructed : callee.getCallSignatures();
|
|
960
|
+
if (signatures.length !== 1)
|
|
961
|
+
return null;
|
|
962
|
+
const signature = signatures[0];
|
|
963
|
+
const unwrapped = ts.isCallExpression(node) ? unwrapExplicitThisCall(checker, node) : null;
|
|
964
|
+
const returned = explicitThisCallReturnType(signature, unwrapped ? knownOrResolve(unwrapped.callee) : null);
|
|
965
|
+
if ((returned.flags & (ts.TypeFlags.Void | ts.TypeFlags.Never)) !== 0)
|
|
966
|
+
return null;
|
|
967
|
+
return isAnyType(returned) ? null : returned;
|
|
968
|
+
}
|
|
969
|
+
if (ts.isBinaryExpression(node) && node.operatorToken.kind === ts.SyntaxKind.EqualsToken)
|
|
970
|
+
return knownOrResolve(node.right);
|
|
971
|
+
if (ts.isConditionalExpression(node) || ts.isBinaryExpression(node) || ts.isTemplateExpression(node)) {
|
|
972
|
+
return derivedExpressionType(checker, node, (operand) => knownOrResolve(operand));
|
|
973
|
+
}
|
|
974
|
+
return null;
|
|
975
|
+
};
|
|
976
|
+
const resolveExpr = (node) => {
|
|
977
|
+
const cached = nodeMemo.get(node);
|
|
978
|
+
if (cached !== undefined)
|
|
979
|
+
return cached;
|
|
980
|
+
if (nodeResolving.has(node))
|
|
981
|
+
return null;
|
|
982
|
+
nodeResolving.add(node);
|
|
983
|
+
const answer = compute(node);
|
|
984
|
+
nodeResolving.delete(node);
|
|
985
|
+
nodeMemo.set(node, answer);
|
|
986
|
+
return answer;
|
|
987
|
+
};
|
|
988
|
+
// Enumerate every candidate SYMBOL up front, from every `x.field = expr`
|
|
989
|
+
// write's left-hand side, so `boundCount`/`refusals` reflect the whole
|
|
990
|
+
// program rather than only the nodes some other pass happened to query.
|
|
991
|
+
const candidateSymbols = new Set();
|
|
992
|
+
const visit = (node) => {
|
|
993
|
+
if (ts.isBinaryExpression(node) && node.operatorToken.kind === ts.SyntaxKind.EqualsToken && ts.isPropertyAccessExpression(node.left)) {
|
|
994
|
+
const symbol = checker.getSymbolAtLocation(node.left);
|
|
995
|
+
if (symbol && isCandidateSymbol(checker, symbol))
|
|
996
|
+
candidateSymbols.add(symbol);
|
|
997
|
+
}
|
|
998
|
+
// A bare `field;` is a candidate whether or not anything writes it -- one
|
|
999
|
+
// nothing writes must be REFUSED rather than absent, or `refusals` stops
|
|
1000
|
+
// describing the program.
|
|
1001
|
+
if (ts.isPropertyDeclaration(node)) {
|
|
1002
|
+
const declared = checker.getSymbolAtLocation(node.name);
|
|
1003
|
+
if (declared && isCandidateSymbol(checker, declared))
|
|
1004
|
+
candidateSymbols.add(declared);
|
|
1005
|
+
}
|
|
1006
|
+
ts.forEachChild(node, visit);
|
|
1007
|
+
};
|
|
1008
|
+
for (const file of files)
|
|
1009
|
+
forEachReachableStatement(reachable, file, visit);
|
|
1010
|
+
for (const symbol of candidateSymbols)
|
|
1011
|
+
resolveSymbol(symbol);
|
|
1012
|
+
// The relaxed phase, run only once the strict pass has settled -- so every
|
|
1013
|
+
// field the strict rule can bind is bound from ALL its writes before any
|
|
1014
|
+
// field is bound from a subset. Rounds repeat because a field bound from
|
|
1015
|
+
// surviving evidence is itself evidence for another field's writes; the
|
|
1016
|
+
// node memo is cleared each round because its cached nulls are answers to
|
|
1017
|
+
// the smaller view. Terminates because bindings are only ever added.
|
|
1018
|
+
lenientPhase = true;
|
|
1019
|
+
for (;;) {
|
|
1020
|
+
const retry = [...candidateSymbols].filter((symbol) => !bound.has(symbol) && refusalOf.get(symbol) === 'write-unresolved');
|
|
1021
|
+
if (retry.length === 0)
|
|
1022
|
+
break;
|
|
1023
|
+
for (const symbol of retry)
|
|
1024
|
+
refusalOf.delete(symbol);
|
|
1025
|
+
nodeMemo.clear();
|
|
1026
|
+
const before = bound.size;
|
|
1027
|
+
for (const symbol of retry)
|
|
1028
|
+
resolveSymbol(symbol);
|
|
1029
|
+
if (bound.size === before)
|
|
1030
|
+
break;
|
|
1031
|
+
}
|
|
1032
|
+
/**
|
|
1033
|
+
* A refusal's `owner` for a field SYMBOL: its own name and where the
|
|
1034
|
+
* program first declares/writes it -- the same rendering
|
|
1035
|
+
* `local-bindings.ts`'s `ownerOfDeclaration` uses for a `VariableDeclaration`,
|
|
1036
|
+
* asked of a symbol whose "declaration" is often a bare `x.field = expr`
|
|
1037
|
+
* assignment rather than a real declaration node, which is why the name
|
|
1038
|
+
* comes from `checker.symbolToString` (works for either shape) rather than
|
|
1039
|
+
* from a `.name` a `BinaryExpression` declaration does not have.
|
|
1040
|
+
*/
|
|
1041
|
+
const ownerOfSymbol = (symbol) => {
|
|
1042
|
+
const declaration = symbol.declarations?.[0];
|
|
1043
|
+
if (!declaration)
|
|
1044
|
+
return checker.symbolToString(symbol);
|
|
1045
|
+
const file = declaration.getSourceFile();
|
|
1046
|
+
const line = file.getLineAndCharacterOfPosition(declaration.getStart()).line + 1;
|
|
1047
|
+
return `${checker.symbolToString(symbol)} (${file.fileName}:${line})`;
|
|
1048
|
+
};
|
|
1049
|
+
// `root` is the same stable, hand-written reason string this census always
|
|
1050
|
+
// keyed its old count map by (`no-writes`, `write-unresolved`,
|
|
1051
|
+
// `writes-disagree`, one of the `stated-field-*`/`interface-field-*`
|
|
1052
|
+
// family, ...) -- never node text or a type spelling, so it is already the
|
|
1053
|
+
// ROOT `census-refusal.ts` asks for. `owner` is the new fact: the symbol's
|
|
1054
|
+
// own name and source location, the one thing a count could never say.
|
|
1055
|
+
const refusals = [];
|
|
1056
|
+
for (const symbol of candidateSymbols) {
|
|
1057
|
+
if (bound.has(symbol) || unionArms.has(symbol))
|
|
1058
|
+
continue;
|
|
1059
|
+
const root = refusalOf.get(symbol) ?? 'unresolved';
|
|
1060
|
+
refusals.push(censusRefusal('field', root, root, ownerOfSymbol(symbol)));
|
|
1061
|
+
}
|
|
1062
|
+
/** The union-arms mirror of `compute`'s two symbol-resolving node shapes -- a leaf lookup, not a walk: a synthesized union is never itself an operand another expression resolves through. */
|
|
1063
|
+
const unionArmsAt = (node) => {
|
|
1064
|
+
if (ts.isPropertyDeclaration(node)) {
|
|
1065
|
+
const declared = checker.getSymbolAtLocation(node.name);
|
|
1066
|
+
return declared ? (unionArms.get(declared) ?? null) : null;
|
|
1067
|
+
}
|
|
1068
|
+
if (ts.isPropertyAccessExpression(node)) {
|
|
1069
|
+
const symbol = memberSymbolAt(node);
|
|
1070
|
+
if (symbol)
|
|
1071
|
+
return unionArms.get(symbol) ?? null;
|
|
1072
|
+
return indexMemberArmsAt(node);
|
|
1073
|
+
}
|
|
1074
|
+
return null;
|
|
1075
|
+
};
|
|
1076
|
+
/** The `unionArmsAt` shape asked of `statedBindings` -- the same two symbol-resolving node kinds, a leaf lookup rather than a walk. */
|
|
1077
|
+
const statedTypeAt = (node) => {
|
|
1078
|
+
if (statedBindings.size === 0)
|
|
1079
|
+
return null;
|
|
1080
|
+
const symbol = ts.isPropertyDeclaration(node)
|
|
1081
|
+
? checker.getSymbolAtLocation(node.name)
|
|
1082
|
+
: ts.isPropertyAccessExpression(node)
|
|
1083
|
+
? memberSymbolAt(node)
|
|
1084
|
+
: ts.isElementAccessExpression(node)
|
|
1085
|
+
? checker.getSymbolAtLocation(node)
|
|
1086
|
+
: undefined;
|
|
1087
|
+
return symbol ? (statedBindings.get(symbol) ?? null) : null;
|
|
1088
|
+
};
|
|
1089
|
+
return {
|
|
1090
|
+
typeAt: (node) => resolveExpr(node),
|
|
1091
|
+
unionArmsAt,
|
|
1092
|
+
statedTypeAt,
|
|
1093
|
+
boundCount: bound.size + unionArms.size,
|
|
1094
|
+
refusals,
|
|
1095
|
+
refusalOf: (symbol) => refusalOf.get(symbol) ?? null
|
|
1096
|
+
};
|
|
1097
|
+
};
|
|
1098
|
+
/**
|
|
1099
|
+
* A `ParameterBindingCensus`-shaped view answering from BOTH: `parameters`'s
|
|
1100
|
+
* own answer first, this census's otherwise -- composed exactly as
|
|
1101
|
+
* `local-bindings.ts`'s own `withLocalBindings` is, and meant to sit
|
|
1102
|
+
* immediately after it in `frontend.ts`:
|
|
1103
|
+
*
|
|
1104
|
+
* const parameters = withFieldBindings(checker, files, withLocalBindings(checker, files, withReturnBindings(...)))
|
|
1105
|
+
*/
|
|
1106
|
+
export const withFieldBindings = (checker, files, reachable, parameters, collections = emptyCollectionBindingCensus, flow) => {
|
|
1107
|
+
const fields = censusFieldBindings(checker, files, reachable, parameters, collections, flow);
|
|
1108
|
+
// `ParameterBindingCensus.refusals` is itself a `readonly CensusRefusal[]`
|
|
1109
|
+
// now (`parameter-bindings.ts`'s own conversion), so composing the two
|
|
1110
|
+
// lists is a plain concatenation -- no reason-string prefixing, no count
|
|
1111
|
+
// merge, and nothing to disagree about. `censusRefusal('field', ...)`
|
|
1112
|
+
// already namespaces every key as `census:field:<root>`, distinct from
|
|
1113
|
+
// `parameters`' own `census:parameter:<root>`/`census:local:<root>`/etc.
|
|
1114
|
+
// keys by construction, so nothing here can collide the way the old
|
|
1115
|
+
// `field:${reason}` string concatenation existed to prevent.
|
|
1116
|
+
const refusals = [...parameters.refusals, ...fields.refusals];
|
|
1117
|
+
return {
|
|
1118
|
+
...parameters,
|
|
1119
|
+
typeAt: (node) => parameters.typeAt(node) ?? fields.typeAt(node),
|
|
1120
|
+
statedTypeAt: (node) => parameters.statedTypeAt(node) ?? fields.statedTypeAt(node),
|
|
1121
|
+
unionArmsAt: (node) => parameters.unionArmsAt(node) ?? fields.unionArmsAt(node),
|
|
1122
|
+
boundCount: parameters.boundCount + fields.boundCount,
|
|
1123
|
+
refusals
|
|
1124
|
+
};
|
|
1125
|
+
};
|