@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,1157 @@
|
|
|
1
|
+
import { anyKeyedWriteTypes, prototypeMutatedConstructorTypes, proxyFallbackTypes } from './dynamic-fallback.js';
|
|
2
|
+
import ts from 'typescript';
|
|
3
|
+
import { structuralShapeKey } from './model/structural-types.js';
|
|
4
|
+
import { resolveHostMethod } from './host-methods.js';
|
|
5
|
+
import { componentId, positionKeyOfDeclaration, positionKeyOfNode, regionId } from '../identity/ids.js';
|
|
6
|
+
import { createStructuralTypeTable } from './model/structural-type-table.js';
|
|
7
|
+
import { censusProgram } from './normalize/census.js';
|
|
8
|
+
import { createIdentityTable, rootSpecialization } from './normalize/identities.js';
|
|
9
|
+
import { gatingEdges } from './normalize/gating.js';
|
|
10
|
+
import { normalizeProgram } from './normalize/normalize.js';
|
|
11
|
+
import { createEvaluationOrdinals, createOrdinalCounter } from './normalize/producers/mint.js';
|
|
12
|
+
import { intrinsicPropertyCallOf } from './normalize/intrinsic-property-call.js';
|
|
13
|
+
import { createStructuralMapper } from './normalize/structural.js';
|
|
14
|
+
import { censusDeclaredMembers } from './normalize/structural-declarations.js';
|
|
15
|
+
import { bodyReadsThis } from './normalize/structural-receiver.js';
|
|
16
|
+
import { censusInstantiations } from './normalize/instantiation.js';
|
|
17
|
+
import { censusSpecializations } from './normalize/specialization.js';
|
|
18
|
+
import { censusAbsentGlobals, platformDeclarationTest } from './normalize/absent-globals.js';
|
|
19
|
+
import { censusDeadTypeofGuards } from './normalize/dead-typeof-guards.js';
|
|
20
|
+
import { censusArgumentsObjects } from './normalize/arguments-objects.js';
|
|
21
|
+
import { censusUnresolvableNames } from './normalize/unresolvable-names.js';
|
|
22
|
+
import { censusGlobalHostMutations } from './normalize/global-host-mutations.js';
|
|
23
|
+
import { HostMutationTaint } from './normalize/host-mutation-keys.js';
|
|
24
|
+
import { createCensusComputedKeysOf } from './normalize/host-mutation-computed-keys.js';
|
|
25
|
+
import { closedCallableAuthorityOf } from './normalize/flow/callable-reach.js';
|
|
26
|
+
import { attachDeferredIntrinsicProtocolLedger, createDeferredIntrinsicProtocolLedger, failedIntrinsicProtocolRequirements, intrinsicProtocolRequirementKind } from './normalize/deferred-intrinsic-protocols.js';
|
|
27
|
+
import { prototypeKeyQuerySignature } from './normalize/host-mutation-keys.js';
|
|
28
|
+
import { explainIntrinsicProtocolFailure } from './normalize/intrinsic-prototype.js';
|
|
29
|
+
import { isAmbientDeclaration } from './ambient.js';
|
|
30
|
+
import { createReassignedBindingCensus } from './normalize/reassigned-bindings.js';
|
|
31
|
+
import { createCommonJsRequireCensus } from './normalize/commonjs-require.js';
|
|
32
|
+
import { censusCommonJsModuleRecords } from './normalize/commonjs-module-record.js';
|
|
33
|
+
import { censusNamespacePaths } from './normalize/namespace-paths.js';
|
|
34
|
+
import { numericIndexAbsenceProven, closedLiteralMemberAbsenceProven } from './normalize/derived-expression-type.js';
|
|
35
|
+
import { censusParameterBindings, emptyParameterBindingCensus, indexParameterBindingProgram } from './normalize/parameter-bindings.js';
|
|
36
|
+
import { composeReturnBindings } from './normalize/return-bindings.js';
|
|
37
|
+
import { withLocalBindings } from './normalize/local-bindings.js';
|
|
38
|
+
import { withFieldBindings } from './normalize/field-bindings.js';
|
|
39
|
+
import { censusCollectionBindings } from './normalize/collection-bindings.js';
|
|
40
|
+
import { censusObjectBagBindings, emptyObjectBagCensus } from './normalize/object-bag-bindings.js';
|
|
41
|
+
import { indexValueFlow } from './normalize/flow/value-flow.js';
|
|
42
|
+
import { attachClosedScriptScope, attachStatedModuleSet } from './normalize/flow/targets.js';
|
|
43
|
+
import { censusRefusalCounts } from './normalize/census-refusal.js';
|
|
44
|
+
import { createCellPolicyRegistry, defaultCellEvidencePolicies, buildCellFactsTable, publishCellFacts } from './normalize/cells/index.js';
|
|
45
|
+
import { settleBindingCensus } from './normalize/binding-fixpoint.js';
|
|
46
|
+
import { withJsDocTypeNames } from './normalize/jsdoc-type-names.js';
|
|
47
|
+
import { censusReachability, moduleEvaluationOrder, nodeIsReachable } from './normalize/reachability.js';
|
|
48
|
+
import { createProgram, defaultCompilerOptions } from './program.js';
|
|
49
|
+
import { createFrontendTiming } from './frontend-timing.js';
|
|
50
|
+
import { classHeritageOf } from './class-heritage.js';
|
|
51
|
+
import { constructorSlotSubclassesOf } from './constructor-slot-subclasses.js';
|
|
52
|
+
import { prototypeReparentingsOf } from './prototype-reparenting.js';
|
|
53
|
+
import { uninstantiableClassesOf } from './uninstantiable-classes.js';
|
|
54
|
+
import { interfaceImplementorsOf } from './interface-implementors.js';
|
|
55
|
+
import { interfaceFamiliesOf } from './interface-families.js';
|
|
56
|
+
import { ambientHostBindings, bindStandardClasses, dateDeclarationOf, stringObjectDeclarationOf, errorDeclarationsOf, functionDeclarationOf, generatorDeclarationOf, asyncGeneratorDeclarationOf, mapIteratorDeclarationOf, hostProtocolBindings, keyedCollectionDeclarationsOf, promiseDeclarationOf, regexpDeclarationsOf, standardBufferDeclarationsOf, typedArrayDeclarationsOf, typedArrayInstanceInterfaceNames, wellKnownSymbolDeclarationsOf } from './host-protocols.js';
|
|
57
|
+
/**
|
|
58
|
+
* The synthetic component every pre-graph diagnostic belongs to.
|
|
59
|
+
*
|
|
60
|
+
* A checker error happens before any authority component exists, so it cannot
|
|
61
|
+
* name a real one. Inventing a plausible-looking component id instead would let
|
|
62
|
+
* a reader join these rows against the graph and get an answer that is wrong.
|
|
63
|
+
*/
|
|
64
|
+
const checkerComponent = componentId('op|checker|reference|0');
|
|
65
|
+
/**
|
|
66
|
+
* Checker errors the reachability walk relies on being reported wherever they
|
|
67
|
+
* occur. `reachability.ts` drops a statement whose only possible effect is a
|
|
68
|
+
* temporal-dead-zone throw because TypeScript reports a same-file use before
|
|
69
|
+
* declaration; a pruned statement carrying one of these would otherwise lose
|
|
70
|
+
* the throw silently.
|
|
71
|
+
*/
|
|
72
|
+
const reachabilityPremiseDiagnosticCodes = new Set([2448, 2449, 2450, 2454, 2474]);
|
|
73
|
+
/** The innermost node of `file` whose span holds `position`. */
|
|
74
|
+
const nodeAtPosition = (file, position) => {
|
|
75
|
+
let current = file;
|
|
76
|
+
for (;;) {
|
|
77
|
+
const inner = ts.forEachChild(current, (child) => child.getStart(file) <= position && position < child.getEnd() ? child : undefined);
|
|
78
|
+
if (!inner)
|
|
79
|
+
return current;
|
|
80
|
+
current = inner;
|
|
81
|
+
}
|
|
82
|
+
};
|
|
83
|
+
/**
|
|
84
|
+
* Whether a checker error sits in code the program never runs.
|
|
85
|
+
*
|
|
86
|
+
* A package compiled from source is type-checked against the dependency
|
|
87
|
+
* versions this build resolved, not the ones its authors built with:
|
|
88
|
+
* `@hono/node-server`'s `upgradeWebSocket` handler assigns an object literal
|
|
89
|
+
* to hono's `WSContext`, whose newer source declares `#init`. The handler is
|
|
90
|
+
* pruned (`reachability.ts`, a closure factory nothing reads) and none of its
|
|
91
|
+
* types reach the compiled program, so its error describes nothing this
|
|
92
|
+
* compiler emits. A syntax error is never waived, and neither is anything
|
|
93
|
+
* outside a compiled source file or among the premises above.
|
|
94
|
+
*/
|
|
95
|
+
const diagnosticIsInPrunedCode = (diagnostic, reachable, compiledFiles, syntactic) => {
|
|
96
|
+
const file = diagnostic.file;
|
|
97
|
+
if (!file || diagnostic.start === undefined || syntactic.has(diagnostic) || !compiledFiles.has(file))
|
|
98
|
+
return false;
|
|
99
|
+
if (reachabilityPremiseDiagnosticCodes.has(diagnostic.code))
|
|
100
|
+
return false;
|
|
101
|
+
return !nodeIsReachable(reachable, nodeAtPosition(file, diagnostic.start));
|
|
102
|
+
};
|
|
103
|
+
const translateDiagnostic = (diagnostic, ordinal) => {
|
|
104
|
+
const file = diagnostic.file;
|
|
105
|
+
const position = file && diagnostic.start !== undefined ? file.getLineAndCharacterOfPosition(diagnostic.start) : null;
|
|
106
|
+
return {
|
|
107
|
+
id: `checker/${diagnostic.code}/${ordinal}`,
|
|
108
|
+
component: checkerComponent,
|
|
109
|
+
operation: null,
|
|
110
|
+
missingPrimitive: null,
|
|
111
|
+
message: ts.flattenDiagnosticMessageText(diagnostic.messageText, ' '),
|
|
112
|
+
// Display only: this location never decides whether anything compiles.
|
|
113
|
+
location: file && position ? { file: file.fileName, line: position.line + 1, column: position.character + 1 } : null
|
|
114
|
+
};
|
|
115
|
+
};
|
|
116
|
+
/**
|
|
117
|
+
* The declaration identities an installed host denied.
|
|
118
|
+
*
|
|
119
|
+
* The projection places a cell for every ambient declaration the frontend's own
|
|
120
|
+
* census reached, and turns each into an `extern`. A name a host has said it
|
|
121
|
+
* does not provide still needs a cell -- a program that reads it must read
|
|
122
|
+
* something -- but it must not be an `extern`, because no object file defines
|
|
123
|
+
* it. This is the set that tells the two apart, derived from the one census
|
|
124
|
+
* that also answers the value's TYPE, so a cell cannot be external in one place
|
|
125
|
+
* and absent in another. See `absent-globals.ts`.
|
|
126
|
+
*/
|
|
127
|
+
/**
|
|
128
|
+
* Whether every file in this build evaluates strict regardless of its own
|
|
129
|
+
* syntax. `alwaysStrict` -- implied by `strict` -- is the whole answer: it makes
|
|
130
|
+
* tsc parse each file in strict mode and write a `'use strict'` prologue into
|
|
131
|
+
* the emitted output, so node runs it strict whether it is a Module or a Script.
|
|
132
|
+
*
|
|
133
|
+
* The `module` setting is NOT this fact, though it stood here as one. `module:
|
|
134
|
+
* ESNext` says how a MODULE is emitted; it does not make a file with no import
|
|
135
|
+
* and no export into a module, and such a file is a Script and sloppy unless
|
|
136
|
+
* something else says otherwise. Reading the module setting here answered
|
|
137
|
+
* "strict" for every script in an ESM build and "sloppy" for every file in a
|
|
138
|
+
* `module: CommonJS` build that set `strict: true` -- wrong in both directions.
|
|
139
|
+
* The per-file half (external module, `'use strict'` prologue, class body) is
|
|
140
|
+
* `isStrictContext`'s, and it already had it.
|
|
141
|
+
*/
|
|
142
|
+
const buildIsAlwaysStrict = (options) => options.alwaysStrict ?? options.strict ?? false;
|
|
143
|
+
const absentBindingIds = (absent, identities) => {
|
|
144
|
+
const denied = new Set();
|
|
145
|
+
for (const declaration of absent.declarations)
|
|
146
|
+
denied.add(identities.declarationIdOf(declaration));
|
|
147
|
+
return denied;
|
|
148
|
+
};
|
|
149
|
+
/**
|
|
150
|
+
* Whether reachable, non-declaration code spells any of `names` -- the
|
|
151
|
+
* `hostFunctions` of a host whose programs take the census wildcard
|
|
152
|
+
* (`FrontendInput.hostFunctionsRefusingObjectPrototypeAbsenceProofs`). The
|
|
153
|
+
* built-in plugins are installed for every compile, so the host's statement
|
|
154
|
+
* alone would refuse the proofs for programs that never touch it; naming one
|
|
155
|
+
* of its functions is what makes a program that host's. A name suffices: the
|
|
156
|
+
* host owns those spellings, and the emitter treats a call by name as a call
|
|
157
|
+
* into it.
|
|
158
|
+
*/
|
|
159
|
+
const reachableCodeNamesAny = (files, reachable, names) => {
|
|
160
|
+
if (names.size === 0)
|
|
161
|
+
return false;
|
|
162
|
+
const visit = (node) => (ts.isIdentifier(node) && names.has(node.text)) || ts.forEachChild(node, visit) === true;
|
|
163
|
+
return files.some((file) => !file.isDeclarationFile && reachable.statementsOf(file).some(visit));
|
|
164
|
+
};
|
|
165
|
+
export const runFrontend = (input) => {
|
|
166
|
+
const timing = createFrontendTiming('phases');
|
|
167
|
+
const compiled = createProgram({
|
|
168
|
+
...(input.packageSources ? { packageSources: input.packageSources } : {}),
|
|
169
|
+
...(input.declarationModules ? { declarationModules: input.declarationModules } : {}),
|
|
170
|
+
rootFileNames: input.rootFileNames,
|
|
171
|
+
options: input.javaScriptSources
|
|
172
|
+
? // `maxNodeModuleJsDepth` alongside `allowJs` for the reason `program.ts`'s
|
|
173
|
+
// `javaScriptAdmission` states: its default is `0`, which refuses a vendor
|
|
174
|
+
// `.js` body one `node_modules` hop out from the compiled roots -- which is
|
|
175
|
+
// where every one of them is. The corpus's own generated projects have
|
|
176
|
+
// carried both for the same reason.
|
|
177
|
+
{ ...defaultCompilerOptions, allowJs: true, checkJs: true, maxNodeModuleJsDepth: 100 }
|
|
178
|
+
: defaultCompilerOptions,
|
|
179
|
+
dynamicFallback: input.dynamicFallback ?? false,
|
|
180
|
+
projectFileName: input.projectFileName ?? null,
|
|
181
|
+
...(input.sourceOverlay ? { sourceOverlay: input.sourceOverlay } : {}),
|
|
182
|
+
...(input.moduleResolution ? { moduleResolution: input.moduleResolution } : {}),
|
|
183
|
+
commonJsGlobals: input.commonJsGlobals ?? new Map(),
|
|
184
|
+
commonJsBuiltinModules: input.commonJsBuiltinModules ?? new Map(),
|
|
185
|
+
commonJsBuiltinModuleSources: input.commonJsBuiltinModuleSources ?? new Map(),
|
|
186
|
+
hostMethodBindings: input.hostMethodBindings ?? new Map(),
|
|
187
|
+
...(input.statedModuleSet ? { statedModuleSet: true } : {}),
|
|
188
|
+
...(input.closedScriptScope ? { closedScriptScope: true } : {}),
|
|
189
|
+
sourceTransforms: input.sourceTransforms ?? []
|
|
190
|
+
});
|
|
191
|
+
timing.mark('program-and-diagnostics');
|
|
192
|
+
const hostMethodBindings = input.hostMethodBindings ?? new Map();
|
|
193
|
+
const table = createStructuralTypeTable();
|
|
194
|
+
// What this compilation reaches from its own entry points, decided once and
|
|
195
|
+
// read by every whole-program walk below. A project's file set is not its
|
|
196
|
+
// module graph -- `include` names what a typechecker should see, and an
|
|
197
|
+
// application's behaviour is what its entries import -- so a census that
|
|
198
|
+
// walked the file set compiled a different program than the one that runs.
|
|
199
|
+
// See `reachability.ts` for what it refuses to prune and why; nothing here
|
|
200
|
+
// changes what a type *means*, only which declarations are censused.
|
|
201
|
+
const reachable = censusReachability({
|
|
202
|
+
checker: compiled.checker,
|
|
203
|
+
files: compiled.sourceFiles,
|
|
204
|
+
// A CommonJS module is not an ESM entry: it runs only from its record's
|
|
205
|
+
// `require`, so it must not join `moduleEvaluationOrder`. Its body still
|
|
206
|
+
// has to be censused and lowered for that record to invoke, which is why
|
|
207
|
+
// the Program boundary supplies these static targets separately.
|
|
208
|
+
entries: [...compiled.entryFiles, ...compiled.commonJsSourceFiles],
|
|
209
|
+
...(input.hostReachedMemberKeys ? { hostReachedMemberKeys: input.hostReachedMemberKeys } : {})
|
|
210
|
+
});
|
|
211
|
+
// Instantiations are censused before anything is normalized, because the
|
|
212
|
+
// answer is whole-program: which type a generic is instantiated at is decided
|
|
213
|
+
// by every call site together, and a walk that learned it as it went would
|
|
214
|
+
// give the first body it reached a different answer than the last.
|
|
215
|
+
timing.mark('reachability');
|
|
216
|
+
const instantiations = censusInstantiations(compiled.checker, compiled.sourceFiles, reachable);
|
|
217
|
+
// Before the mapper, because the mapper is the one authority that answers a
|
|
218
|
+
// node's type and this contradicts the checker at some of those nodes.
|
|
219
|
+
// Which property accesses are source-namespace paths and which are
|
|
220
|
+
// namespace-qualified members: a checker question asked once, read by the
|
|
221
|
+
// census's family rule and by `citeExpressionResult`'s prediction of it.
|
|
222
|
+
// See `normalize/namespace-paths.ts`.
|
|
223
|
+
const namespacePaths = censusNamespacePaths(compiled.checker);
|
|
224
|
+
const specializations = censusSpecializations(compiled.checker, compiled.sourceFiles, reachable, namespacePaths);
|
|
225
|
+
timing.mark('instantiations-and-specializations');
|
|
226
|
+
// Whole-program for the same reason instantiations are: which type an
|
|
227
|
+
// unannotated parameter holds is decided by every call site together, and a
|
|
228
|
+
// walk that learned it as it went would give the first body it reached a
|
|
229
|
+
// different answer than the last. See `parameter-bindings.ts`.
|
|
230
|
+
// Composed with the RETURN census, in that order: a return type is resolved
|
|
231
|
+
// from expressions whose identifiers may be parameters this census bound, so
|
|
232
|
+
// the parameter answers must be settled before the return walk consults them.
|
|
233
|
+
// The reverse edge -- a bound return re-opening a parameter's own fixpoint --
|
|
234
|
+
// is not taken here; `parameter-bindings.ts` runs its own looser return
|
|
235
|
+
// resolution inside that fixpoint already, so what this adds is the strict
|
|
236
|
+
// reading (recursion detected, disagreement refused, `as` casts stopped at),
|
|
237
|
+
// not a first one. See `return-bindings.ts`.
|
|
238
|
+
// Composed a third time, with the LOCAL-BINDING census: an unannotated
|
|
239
|
+
// `let`/`var` cell with no initializer, filled in later by exactly the
|
|
240
|
+
// writes the program makes to it. See `local-bindings.ts`'s own header
|
|
241
|
+
// comment for why this needs to run after (and be given) the settled
|
|
242
|
+
// parameter+return census rather than reopening either fixpoint.
|
|
243
|
+
//
|
|
244
|
+
// Run TWICE. `censusParameterBindings` used to be the one census with no
|
|
245
|
+
// upstream at all -- `withReturnBindings`/`withLocalBindings` compose OVER
|
|
246
|
+
// its output, but nothing ever composed back INTO it, so a call site's
|
|
247
|
+
// argument was typed only from the checker's own evidence and this
|
|
248
|
+
// parameter census's own internal fixpoint. A parameter whose call sites
|
|
249
|
+
// pass an expression the RETURN or LOCAL census alone can type (`state`,
|
|
250
|
+
// `extensions`, `m.elements`) stayed `any` forever, because by the time
|
|
251
|
+
// those censuses learned it, the parameter census had already finished.
|
|
252
|
+
//
|
|
253
|
+
// A second round, given the first round's fully composed census as its
|
|
254
|
+
// `upstream`, closes that gap: `parameter-bindings.ts`'s `known()` now
|
|
255
|
+
// tries `upstream.typeAt(node)` wherever the checker's own answer is
|
|
256
|
+
// unusable, ahead of its own machinery reconstructing one. See the commit
|
|
257
|
+
// this landed in for the measured effect on the three.js app and the
|
|
258
|
+
// check for whether a third round moves anything further.
|
|
259
|
+
//
|
|
260
|
+
// `withFieldBindings` sits LAST in each round, where its own header says it
|
|
261
|
+
// belongs. A class field is the fourth storage position with no annotation
|
|
262
|
+
// and a knowable answer, and it was the one still unread: three.js writes
|
|
263
|
+
// `this.image`, `this.format`, `this.colorSpace` in a constructor and never
|
|
264
|
+
// types them, so every `texture.format` read is `any` and every parameter
|
|
265
|
+
// that receives one inherits it. That is what the boxed carriers in
|
|
266
|
+
// `WebGLTextures.js` (4435) and `WebGLRenderer.js` (3982) are made of -- not
|
|
267
|
+
// thousands of independent decisions, but one unread position cascading
|
|
268
|
+
// through reads and member accesses (14349 `Identifier`, 6836
|
|
269
|
+
// `PropertyAccessExpression` across the three.js app).
|
|
270
|
+
// `withJsDocTypeNames` sits OUTERMOST, so a type the program STATED outranks
|
|
271
|
+
// one inferred from an observed sample of call sites -- the same precedence a
|
|
272
|
+
// TS annotation already has, which stops the call-site census outright. It is
|
|
273
|
+
// last in the chain and first to answer.
|
|
274
|
+
//
|
|
275
|
+
// The RETURN census built inside the final round is kept, not rebuilt.
|
|
276
|
+
// `producers/invocations.ts` reads a call's result through this composed
|
|
277
|
+
// view and has to state the same call's CALLEE return from the same
|
|
278
|
+
// authority; asking a second census would let the two settle differently.
|
|
279
|
+
// See `composeReturnBindings`.
|
|
280
|
+
// The array/collection census, FOR THIS ROUND -- computed from the PRIOR
|
|
281
|
+
// round's settled parameter view (`upstream`; empty on round one, since
|
|
282
|
+
// nothing is settled yet) and handed to every census the round runs below,
|
|
283
|
+
// not only to `createStructuralMapper` after the whole fixpoint has
|
|
284
|
+
// already finished with it. This closes the gap `hCALL`'s investigation
|
|
285
|
+
// traced end to end: `findLightProbeGrid( volumes, object )`
|
|
286
|
+
// (`WebGLRenderer.js`) returns `volumes[ 0 ]`, where `volumes`'s real
|
|
287
|
+
// evidence is a module-scope `const lightProbeGridArray = []` filled by
|
|
288
|
+
// `.push` elsewhere -- exactly what this census exists to type, and
|
|
289
|
+
// exactly the shape `return-bindings.ts` (and, the same way,
|
|
290
|
+
// `local-bindings.ts`/`field-bindings.ts`) could not reach before, because
|
|
291
|
+
// this census ran only once, after the whole fixpoint had already
|
|
292
|
+
// settled. See those modules' own `collections` parameter.
|
|
293
|
+
//
|
|
294
|
+
// Kept OUTSIDE `compose` (rather than recomputed after the loop below from
|
|
295
|
+
// the fully-settled `parameters`) so the FINAL round's instance -- the one
|
|
296
|
+
// every census in that round actually asked -- is the SAME instance
|
|
297
|
+
// `createStructuralMapper` is built from below. A fresh third computation
|
|
298
|
+
// over `parameters` would answer some nodes MORE precisely (round two's
|
|
299
|
+
// own improvements would be visible to it) but would then disagree with
|
|
300
|
+
// what round two's own return/local/field censuses actually consulted
|
|
301
|
+
// while producing `parameters` in the first place -- two authorities over
|
|
302
|
+
// one question, which this compiler treats as a defect wherever it is
|
|
303
|
+
// found elsewhere and must not introduce here.
|
|
304
|
+
// Beside the collection census, for the same reason and on the same terms:
|
|
305
|
+
// the LAST round's bag census, so the structural mapper reads the identical
|
|
306
|
+
// instance the round-two return/local censuses consulted while they produced
|
|
307
|
+
// `parameters`.
|
|
308
|
+
// One shared discovery walk per inference view, consumed by the binding
|
|
309
|
+
// domains. Syntax stays fixed; receiver protocols can become known as the
|
|
310
|
+
// prior census improves, so the index is refreshed inside `compose`.
|
|
311
|
+
/**
|
|
312
|
+
* The round's census answer for an expression the CHECKER types `any` --
|
|
313
|
+
* `indexValueFlow`'s one census-dependent input, and the reason the index is
|
|
314
|
+
* now built per round rather than once.
|
|
315
|
+
*
|
|
316
|
+
* A `.push`/`.set`/`.fill` receiver is admitted by its TYPE
|
|
317
|
+
* (`isArrayReceiver` and friends), so a receiver nothing has typed yet
|
|
318
|
+
* records no write at all: three's `WebGLShaderCache` fills
|
|
319
|
+
* `materialShaders` and `WebGLPrograms` fills its `array` through receivers
|
|
320
|
+
* the checker cannot type, and every element they hold sat at a push this
|
|
321
|
+
* index did not state. 170 such receivers on the three.js app.
|
|
322
|
+
*
|
|
323
|
+
* `any`/`unknown` is filtered here rather than in the index so that a census
|
|
324
|
+
* answer no better than the checker's cannot displace it.
|
|
325
|
+
*/
|
|
326
|
+
const censusTypeVia = (upstream) => (expression) => {
|
|
327
|
+
const stated = upstream.typeAt(expression);
|
|
328
|
+
if (!stated || (stated.flags & (ts.TypeFlags.Any | ts.TypeFlags.Unknown)) !== 0)
|
|
329
|
+
return null;
|
|
330
|
+
return stated;
|
|
331
|
+
};
|
|
332
|
+
// Round one has no census, so its index is byte-identical to the single one
|
|
333
|
+
// this replaced; the last round's is what `bags` below reads, since that
|
|
334
|
+
// census is composed against the settled `parameters` and must see the same
|
|
335
|
+
// write edges the census that settled it saw.
|
|
336
|
+
const intrinsicProtocols = createDeferredIntrinsicProtocolLedger({
|
|
337
|
+
refuseObjectPrototypeAbsenceProofs: reachableCodeNamesAny(compiled.sourceFiles, reachable, input.hostFunctionsRefusingObjectPrototypeAbsenceProofs ?? new Set())
|
|
338
|
+
});
|
|
339
|
+
const buildIsStrict = buildIsAlwaysStrict(compiled.program.getCompilerOptions());
|
|
340
|
+
const baseValueFlow = indexValueFlow(compiled.checker, compiled.sourceFiles, reachable, undefined, undefined, undefined, buildIsStrict);
|
|
341
|
+
attachDeferredIntrinsicProtocolLedger(baseValueFlow, intrinsicProtocols);
|
|
342
|
+
// Only a caller that compiled a module graph has stated what the
|
|
343
|
+
// application IS; without it `exportIsUnimported` answers false everywhere.
|
|
344
|
+
const statedModules = input.statedModuleSet
|
|
345
|
+
? { files: compiled.sourceFiles, entries: [...compiled.entryFiles, ...compiled.commonJsSourceFiles], reachable }
|
|
346
|
+
: null;
|
|
347
|
+
if (statedModules)
|
|
348
|
+
attachStatedModuleSet(baseValueFlow, statedModules);
|
|
349
|
+
const scriptScope = input.closedScriptScope
|
|
350
|
+
? {
|
|
351
|
+
files: new Set(compiled.sourceFiles.filter((file) => !file.isDeclarationFile && !ts.isExternalModule(file) && !compiled.commonJsSourceFiles.includes(file)))
|
|
352
|
+
}
|
|
353
|
+
: null;
|
|
354
|
+
if (scriptScope)
|
|
355
|
+
attachClosedScriptScope(baseValueFlow, scriptScope);
|
|
356
|
+
// The whole program, declarations included: the census authenticates the
|
|
357
|
+
// wrapper names against the host's declaration file, and handed only the
|
|
358
|
+
// implementation files it found no wrapper to authenticate against, so no
|
|
359
|
+
// module ever proved its record (`nativeRecord` was never set).
|
|
360
|
+
const commonJsModuleRecords = censusCommonJsModuleRecords(compiled.checker, compiled.program.getSourceFiles(), input.commonJsGlobals ?? new Map(), compiled.runtimeModuleTargetOf, compiled.sourceFileOf);
|
|
361
|
+
// This index retains syntax and checker facts from the initial flow view.
|
|
362
|
+
// Unlike receiver protocol recognition in `valueFlow`, those do not change
|
|
363
|
+
// between inference rounds. Parameter call attribution may still improve
|
|
364
|
+
// within each round without rediscovering its syntactic inputs.
|
|
365
|
+
// Discovery belongs to one census: inference and reference citation consume
|
|
366
|
+
// the same lexical frames and never enumerate arguments uses independently.
|
|
367
|
+
const argumentsObjects = censusArgumentsObjects(compiled.checker, compiled.sourceFiles);
|
|
368
|
+
const parameterIndex = indexParameterBindingProgram(compiled.checker, compiled.sourceFiles, reachable, baseValueFlow, argumentsObjects);
|
|
369
|
+
const compose = (upstream) => {
|
|
370
|
+
// Round one has no census to refine the index with, and
|
|
371
|
+
// `GEA_FLOW_CENSUS_OFF` pins every round to that same base -- which is what
|
|
372
|
+
// makes the flag's arm comparable with the one it measures against.
|
|
373
|
+
// Rebuilt every round on purpose: reusing the previous round's index when
|
|
374
|
+
// the census answers it consulted are unchanged was tried and measured on
|
|
375
|
+
// the three.js app (2026-09-14) -- no round ever qualified, because the answers
|
|
376
|
+
// move until the very round that settles, and holding the previous index
|
|
377
|
+
// alive across the boundary raised the peak from 7 GB to 11 GB.
|
|
378
|
+
const valueFlow = upstream && !process.env['GEA_FLOW_CENSUS_OFF']
|
|
379
|
+
? indexValueFlow(compiled.checker, compiled.sourceFiles, reachable, censusTypeVia(upstream), upstream.callDeclarationAt, upstream.callTargetsAt, buildIsStrict, upstream.explicitThisAt)
|
|
380
|
+
: baseValueFlow;
|
|
381
|
+
attachDeferredIntrinsicProtocolLedger(valueFlow, intrinsicProtocols);
|
|
382
|
+
if (statedModules)
|
|
383
|
+
attachStatedModuleSet(valueFlow, statedModules);
|
|
384
|
+
if (scriptScope)
|
|
385
|
+
attachClosedScriptScope(valueFlow, scriptScope);
|
|
386
|
+
const collectionsThisRound = censusCollectionBindings(compiled.checker, compiled.sourceFiles, reachable, upstream ?? emptyParameterBindingCensus, valueFlow);
|
|
387
|
+
// MOVED INSIDE the fixpoint, exactly as `collections` was, and the long
|
|
388
|
+
// comment that used to sit below this loop explaining why it could not be
|
|
389
|
+
// was WRONG. It argued that a bag's answer is an `ObjectBagShape` with no
|
|
390
|
+
// `ts.Type` form, so no `ts.Type`-shaped resolver could ever consume one.
|
|
391
|
+
// True of the SHAPE and false of the SLOTS: a member's and an index's
|
|
392
|
+
// observed types are plain `ts.Type`s (`ObjectBagShape.members` and
|
|
393
|
+
// `.index` hold them), which is what `slotTypeAt` hands back.
|
|
394
|
+
//
|
|
395
|
+
// The refusal that bought: three's `WebGLExtensions` caches every
|
|
396
|
+
// extension in a `{}` and reads it straight back, so
|
|
397
|
+
// `return extensions[ name ]` refused as `return-index-signature-absent`
|
|
398
|
+
// while this census had already typed the index from the very next line's
|
|
399
|
+
// `extensions[ name ] = extension`. Everything downstream of
|
|
400
|
+
// `extensions.get( ... )` -- `WebGLUtils.convert`'s `extension`, the
|
|
401
|
+
// largest single boxed declaration in the three.js build -- was dynamic
|
|
402
|
+
// behind that one refusal.
|
|
403
|
+
const bagsThisRound = process.env['GEA_BAG_OFF']
|
|
404
|
+
? emptyObjectBagCensus
|
|
405
|
+
: censusObjectBagBindings(compiled.checker, compiled.sourceFiles, reachable, upstream ?? emptyParameterBindingCensus, valueFlow);
|
|
406
|
+
const returnStage = composeReturnBindings(compiled.checker, compiled.sourceFiles, reachable, censusParameterBindings(compiled.checker, compiled.sourceFiles, reachable, upstream,
|
|
407
|
+
// `GEA_PARAM_INDEX_OFF` hands the census no index, so it builds its
|
|
408
|
+
// own -- which is what every round used to do. Kept the way
|
|
409
|
+
// `GEA_BAG_OFF` and `GEA_FLOW_CENSUS_OFF` are kept: the arms of the
|
|
410
|
+
// measurement that justified this have to stay runnable from one
|
|
411
|
+
// build, or the next person cannot check the claim.
|
|
412
|
+
process.env['GEA_PARAM_INDEX_OFF'] ? undefined : parameterIndex, valueFlow), collectionsThisRound, valueFlow, bagsThisRound);
|
|
413
|
+
const parameters = withJsDocTypeNames(compiled.checker, compiled.sourceFiles, reachable, withFieldBindings(compiled.checker, compiled.sourceFiles, reachable, withLocalBindings(compiled.checker, compiled.sourceFiles, reachable, returnStage.view, collectionsThisRound, valueFlow, bagsThisRound, upstream, commonJsModuleRecords), collectionsThisRound, valueFlow));
|
|
414
|
+
return { parameters, facts: { returns: returnStage.returns, collections: collectionsThisRound, bags: bagsThisRound, valueFlow } };
|
|
415
|
+
};
|
|
416
|
+
/**
|
|
417
|
+
* What the CHECKER answers, at one line of the TRANSFORMED source.
|
|
418
|
+
*
|
|
419
|
+
* `GEA_TYPE_AT=<file substring>#<line>` prints every identifier and member
|
|
420
|
+
* access on that line with its type and the file:line of each declaration
|
|
421
|
+
* its symbol resolves to; `GEA_SRC_SPAN=<from>-<to>` beside it prints the
|
|
422
|
+
* transformed text itself.
|
|
423
|
+
*
|
|
424
|
+
* Both halves are load-bearing and neither is available anywhere else. The
|
|
425
|
+
* source transforms (`declaration-overlay-transform.ts`,
|
|
426
|
+
* `subclass-member-overlay-transform.ts`, `this-constructor-source-transform.ts`)
|
|
427
|
+
* REWRITE the text every census then reads, so a line number from a compass
|
|
428
|
+
* names a position in a file that exists only in memory, and the type at it
|
|
429
|
+
* is not the type the same line has on disk. The DECLARATION list is what
|
|
430
|
+
* turns a wrong type into a located defect: `Object3D.parent` reading back
|
|
431
|
+
* `boolean | undefined` says nothing until the symbol is seen resolving to
|
|
432
|
+
* `EventDispatcher.js`, at which point the whole class of defect
|
|
433
|
+
* (a synthesized field on a base shadowing every declarer's own `@type`) is
|
|
434
|
+
* visible at once. Two commits came out of exactly that.
|
|
435
|
+
*/
|
|
436
|
+
if (process.env['GEA_TYPE_AT']) {
|
|
437
|
+
const [want, lineText] = String(process.env['GEA_TYPE_AT']).split('#');
|
|
438
|
+
const wantLine = Number(lineText);
|
|
439
|
+
for (const file of compiled.sourceFiles) {
|
|
440
|
+
if (!file.fileName.includes(String(want)))
|
|
441
|
+
continue;
|
|
442
|
+
if (process.env['GEA_SRC_SPAN']) {
|
|
443
|
+
const [a, b] = String(process.env['GEA_SRC_SPAN']).split('-').map(Number);
|
|
444
|
+
const lines = file.getFullText().split('\n');
|
|
445
|
+
for (let i = (a ?? 1) - 1; i < Math.min(b ?? 0, lines.length); i++)
|
|
446
|
+
process.stderr.write(`[SRC] ${i + 1}| ${lines[i]}\n`);
|
|
447
|
+
}
|
|
448
|
+
const visit = (node) => {
|
|
449
|
+
const line = file.getLineAndCharacterOfPosition(node.getStart()).line + 1;
|
|
450
|
+
if (line === wantLine && (ts.isIdentifier(node) || ts.isPropertyAccessExpression(node))) {
|
|
451
|
+
const sym = compiled.checker.getSymbolAtLocation(node);
|
|
452
|
+
const decls = (sym?.declarations ?? [])
|
|
453
|
+
.map((d) => {
|
|
454
|
+
const f = d.getSourceFile();
|
|
455
|
+
return `${f.fileName.split('/').slice(-2).join('/')}:${f.getLineAndCharacterOfPosition(d.getStart()).line + 1}`;
|
|
456
|
+
})
|
|
457
|
+
.join(',');
|
|
458
|
+
process.stderr.write(`[TYPE] ${line} ${ts.SyntaxKind[node.kind]} ${node.getText().slice(0, 40)} :: ${compiled.checker.typeToString(compiled.checker.getTypeAtLocation(node))} @[${decls}]\n`);
|
|
459
|
+
}
|
|
460
|
+
ts.forEachChild(node, visit);
|
|
461
|
+
};
|
|
462
|
+
visit(file);
|
|
463
|
+
}
|
|
464
|
+
}
|
|
465
|
+
// A round is settled only when its actual input queries retain their answers.
|
|
466
|
+
// A stable count alone can hide changed carriers or a same-size swap of cells.
|
|
467
|
+
const settled = settleBindingCensus(compose);
|
|
468
|
+
timing.mark('binding-fixpoint');
|
|
469
|
+
if (process.env['GEA_ROUNDS_DEBUG'])
|
|
470
|
+
process.stderr.write(`[ROUNDS] ${settled.round} rounds, boundCount ${settled.parameters.boundCount}\n`);
|
|
471
|
+
const parameters = settled.parameters;
|
|
472
|
+
// Every one of these is the SETTLING round's own instance, which is what the
|
|
473
|
+
// snapshot exists to guarantee: the structural mapper below and the censuses
|
|
474
|
+
// that produced `parameters` are looking at the identical answers.
|
|
475
|
+
const { collections, bags, valueFlow } = settled.facts;
|
|
476
|
+
// The census belonging to the round `parameters` is, which is the one
|
|
477
|
+
// `types` (and therefore every `typeAt`) answers from.
|
|
478
|
+
const returns = settled.facts.returns;
|
|
479
|
+
const absent = censusAbsentGlobals(compiled.checker, compiled.sourceFiles, input.absentGlobals ?? new Set(), platformDeclarationTest(compiled.program), namespacePaths);
|
|
480
|
+
// Beside `argumentsObjects`, and for the identical reason: the reference
|
|
481
|
+
// producer publishes an unresolvable name's value and `citeExpressionResult`
|
|
482
|
+
// predicts it, so both must read one census rather than ask the checker
|
|
483
|
+
// twice. See `unresolvable-names.ts`.
|
|
484
|
+
const unresolvableNames = censusUnresolvableNames(compiled.checker, compiled.sourceFiles);
|
|
485
|
+
const identities = createIdentityTable(compiled.program, compiled.checker, specializations);
|
|
486
|
+
const prototypeReparentings = prototypeReparentingsOf(compiled.checker, identities, compiled.sourceFiles);
|
|
487
|
+
// Beside `absent` and `identities`, the two facts this rests on: which host
|
|
488
|
+
// globals are declared absent, and how to name the AST positions the answer
|
|
489
|
+
// covers. See `dead-typeof-guards.ts` for why this cannot be derived from
|
|
490
|
+
// any type -- a structural `never` here would collapse to the same id as a
|
|
491
|
+
// TypeScript inference's own `never`, so the proof has to come from the
|
|
492
|
+
// guard's own shape and the host's own statement instead.
|
|
493
|
+
const deadTypeofGuards = censusDeadTypeofGuards(compiled.sourceFiles, absent, identities);
|
|
494
|
+
// The array/collection census now runs INSIDE the fixpoint above (see
|
|
495
|
+
// `compose`'s own comment) rather than once more here over the settled
|
|
496
|
+
// parameter census. `settled.facts.collections` already IS the instance computed
|
|
497
|
+
// from round one's settled view and consulted by round two's own
|
|
498
|
+
// parameter/return/local/field censuses while they produced `parameters`
|
|
499
|
+
// -- reusing it rather than recomputing keeps the mapper and the fixpoint's
|
|
500
|
+
// own censuses looking at the identical answer for the identical question.
|
|
501
|
+
// On the three.js app it binds 10 collections and 40 empty array literals whose
|
|
502
|
+
// element type TypeScript inferred as `never`, same totals as the
|
|
503
|
+
// once-recomputed version -- the round-two view this reuses already had
|
|
504
|
+
// round one's settled parameter census as its own upstream, which is the
|
|
505
|
+
// same evidence a fresh recomputation over `parameters` would have added.
|
|
506
|
+
// Beside `collections`, and now on the same terms: the instance the LAST
|
|
507
|
+
// round of `compose` computed and handed to that round's own return and
|
|
508
|
+
// local censuses. An open property bag (`{}` filled a property at a time) is
|
|
509
|
+
// a storage position the checker types as the EMPTY object, so every write
|
|
510
|
+
// to it is a write the type does not have and every touch boxes. See
|
|
511
|
+
// `object-bag-bindings.ts`.
|
|
512
|
+
//
|
|
513
|
+
// Reusing rather than recomputing is the same two-authorities argument
|
|
514
|
+
// `collections` above states: a fresh census over the fully settled
|
|
515
|
+
// `parameters` would answer some nodes more precisely than the one those
|
|
516
|
+
// censuses actually consulted, and the mapper would then disagree with the
|
|
517
|
+
// view that produced the bindings it is mapping.
|
|
518
|
+
if (process.env['GEA_BINDING_DEBUG']) {
|
|
519
|
+
process.stderr.write(`[BINDINGS] bound=${parameters.boundCount} refusals=${JSON.stringify([...censusRefusalCounts(parameters.refusals)])}\n`);
|
|
520
|
+
process.stderr.write(parameters.debugReport?.() ?? '');
|
|
521
|
+
}
|
|
522
|
+
if (process.env['GEA_BAG_DEBUG']) {
|
|
523
|
+
process.stderr.write(`[BAG] bound=${bags.boundCount} refusals=${JSON.stringify([...censusRefusalCounts(bags.refusals)])}\n`);
|
|
524
|
+
process.stderr.write(bags.debugReport());
|
|
525
|
+
}
|
|
526
|
+
// The CENSUS half of `GEA_TYPE_AT`: what the settled binding census answers
|
|
527
|
+
// for the same nodes the checker half printed above. A store the emitter
|
|
528
|
+
// refuses names a carrier the checker's `[TYPE]` line does not show -- a
|
|
529
|
+
// `typeof`-narrowed `string` read that reaches the field as a number is a
|
|
530
|
+
// disagreement between these two lines, and only seeing both locates it.
|
|
531
|
+
if (process.env['GEA_TYPE_AT']) {
|
|
532
|
+
const [want, lineText] = String(process.env['GEA_TYPE_AT']).split('#');
|
|
533
|
+
const wantLine = Number(lineText);
|
|
534
|
+
for (const file of compiled.sourceFiles) {
|
|
535
|
+
if (!file.fileName.includes(String(want)))
|
|
536
|
+
continue;
|
|
537
|
+
const visit = (node) => {
|
|
538
|
+
const line = file.getLineAndCharacterOfPosition(node.getStart()).line + 1;
|
|
539
|
+
if (line === wantLine && (ts.isIdentifier(node) || ts.isPropertyAccessExpression(node) || ts.isVariableDeclaration(node))) {
|
|
540
|
+
const answer = parameters.typeAt(node);
|
|
541
|
+
const stated = parameters.statedTypeAt(node);
|
|
542
|
+
const arms = parameters.unionArmsAt(node);
|
|
543
|
+
process.stderr.write(`[CENSUS] ${line} ${ts.SyntaxKind[node.kind]} ${node.getText().slice(0, 40)} :: ` +
|
|
544
|
+
`${answer ? compiled.checker.typeToString(answer) : '(null)'} stated=${stated ? compiled.checker.typeToString(stated) : '-'}` +
|
|
545
|
+
`${arms ? ` arms=[${arms.map((arm) => compiled.checker.typeToString(arm)).join(' | ')}]` : ''}\n`);
|
|
546
|
+
}
|
|
547
|
+
ts.forEachChild(node, visit);
|
|
548
|
+
};
|
|
549
|
+
visit(file);
|
|
550
|
+
}
|
|
551
|
+
}
|
|
552
|
+
// Before the mapper, which lays every family member out as the one layout
|
|
553
|
+
// this census names -- see `interface-families.ts`.
|
|
554
|
+
const interfaceFamilies = interfaceFamiliesOf(compiled.checker, identities, compiled.sourceFiles);
|
|
555
|
+
if (process.env['GEA_FAMILY_DEBUG']) {
|
|
556
|
+
for (const family of interfaceFamilies.families) {
|
|
557
|
+
process.stderr.write(`[FAMILY] ${family.key}: ${family.members.map((member) => member.name.text).join(' ')}\n`);
|
|
558
|
+
}
|
|
559
|
+
}
|
|
560
|
+
// Descriptor input facts become usable only after the existing mutation
|
|
561
|
+
// census seals this shared set. Its rawTypeAt input bypasses structural
|
|
562
|
+
// descriptor inference, so this introduces no inference cycle.
|
|
563
|
+
const globalHostMutationTaint = new HostMutationTaint();
|
|
564
|
+
let hostMutationFactsSealed = false;
|
|
565
|
+
const intrinsicPropertyContext = {
|
|
566
|
+
checker: compiled.checker,
|
|
567
|
+
identities,
|
|
568
|
+
isStandardLibraryDeclaration: (declaration) => compiled.program.isSourceFileDefaultLibrary(declaration.getSourceFile()),
|
|
569
|
+
globalHostMutationTaint
|
|
570
|
+
};
|
|
571
|
+
const types = createStructuralMapper(compiled.checker, identities, table, instantiations, specializations, parameters, absent, collections, bags, valueFlow, interfaceFamilies, commonJsModuleRecords, censusDeclaredMembers(compiled.checker, compiled.sourceFiles, identities, (body) => bodyReadsThis(body), reachable), (call) => hostMutationFactsSealed && intrinsicPropertyCallOf(intrinsicPropertyContext, call, call.expression) === 'getOwnPropertyDescriptor');
|
|
572
|
+
// The frontend's evidence-policy tables: built from the same
|
|
573
|
+
// `identities`/`valueFlow`/`reachable` the fixpoint above already settled,
|
|
574
|
+
// right after `types` exists so the agreement instrument can ask the
|
|
575
|
+
// mapper's own `typeAt`/`typeOf` for the SAME declarations while both are
|
|
576
|
+
// still in scope -- nowhere else in this function has both at once without
|
|
577
|
+
// recomputing one of them. Additive only: nothing here reads from or writes
|
|
578
|
+
// into `parameters`/`returns`/`collections`/`bags`, and nothing downstream
|
|
579
|
+
// reads `cellFacts` back, so this cannot change what any of those censuses,
|
|
580
|
+
// or `types` itself, answer.
|
|
581
|
+
const cellFacts = publishCellFacts(buildCellFactsTable(identities, valueFlow, compiled.sourceFiles, createCellPolicyRegistry(defaultCellEvidencePolicies(compiled.checker, reachable, bags.identity))), types,
|
|
582
|
+
// Only when asked -- see `cells/agreement.ts` for why an unasked `typeAt`
|
|
583
|
+
// renumbers the emitted C++.
|
|
584
|
+
Boolean(process.env['GEA_CELL_FACTS_AGREEMENT']));
|
|
585
|
+
if (process.env['GEA_CELL_FACTS_DEBUG']) {
|
|
586
|
+
process.stderr.write(`[CELLS] declarations=${cellFacts.table.all.length} twoOwner=${cellFacts.table.twoOwnerClaims.length} ` +
|
|
587
|
+
`refusals=${cellFacts.table.refusals.length} agreement=${JSON.stringify(cellFacts.agreement)}\n`);
|
|
588
|
+
}
|
|
589
|
+
// The STRUCTURAL half of `GEA_TYPE_AT`: the mapper's own answer, which is
|
|
590
|
+
// what every producer publishes -- a `[CENSUS]` union-arms line and a
|
|
591
|
+
// `[STRUCT]` line that disagree locate a reduction between the two.
|
|
592
|
+
if (process.env['GEA_TYPE_AT']) {
|
|
593
|
+
const [want, lineText] = String(process.env['GEA_TYPE_AT']).split('#');
|
|
594
|
+
const wantLine = Number(lineText);
|
|
595
|
+
for (const file of compiled.sourceFiles) {
|
|
596
|
+
if (!file.fileName.includes(String(want)))
|
|
597
|
+
continue;
|
|
598
|
+
const visit = (node) => {
|
|
599
|
+
const line = file.getLineAndCharacterOfPosition(node.getStart()).line + 1;
|
|
600
|
+
if (line === wantLine && (ts.isIdentifier(node) || ts.isPropertyAccessExpression(node))) {
|
|
601
|
+
let shape = '(throws)';
|
|
602
|
+
try {
|
|
603
|
+
shape = structuralShapeKey(table.get(types.typeAt(node)).shape);
|
|
604
|
+
}
|
|
605
|
+
catch { }
|
|
606
|
+
process.stderr.write(`[STRUCT] ${line} ${ts.SyntaxKind[node.kind]} ${node.getText().slice(0, 40)} :: ${shape.slice(0, 600)}\n`);
|
|
607
|
+
}
|
|
608
|
+
ts.forEachChild(node, visit);
|
|
609
|
+
};
|
|
610
|
+
visit(file);
|
|
611
|
+
}
|
|
612
|
+
}
|
|
613
|
+
const prototypeFallback = input.dynamicFallback
|
|
614
|
+
? prototypeMutatedConstructorTypes(compiled.sourceFiles, compiled.checker, types, identities)
|
|
615
|
+
: { types: new Set(), callables: new Set() };
|
|
616
|
+
const dynamicFallbackTypes = input.dynamicFallback
|
|
617
|
+
? new Set([...proxyFallbackTypes(compiled.sourceFiles, compiled.checker, types), ...prototypeFallback.types])
|
|
618
|
+
: new Set();
|
|
619
|
+
const dynamicWrittenTypes = anyKeyedWriteTypes(compiled.sourceFiles, compiled.checker, types);
|
|
620
|
+
const census = censusProgram(compiled.sourceFiles, identities, reachable, specializations, namespacePaths);
|
|
621
|
+
// Before normalization, not after: the table seals when the graph does, and a
|
|
622
|
+
// census that interns a type it is the first to ask about would be asking a
|
|
623
|
+
// sealed table to grow. The types are the same either way -- interning is
|
|
624
|
+
// idempotent and the element producer asks for exactly these -- so the only
|
|
625
|
+
// thing the order decides is whether this runs against a table that can still
|
|
626
|
+
// answer.
|
|
627
|
+
//
|
|
628
|
+
// Also before `context` is built (not after, as this used to run): a
|
|
629
|
+
// producer -- `calleeAwareTypeAt`, `producers/shared.ts` -- reads this same
|
|
630
|
+
// census through `context.hostProtocols` to tell whether a call's callee is
|
|
631
|
+
// a bound declaration before deciding whether to read back the checker's
|
|
632
|
+
// resolved-signature type or the plain one, so the map has to already exist
|
|
633
|
+
// (even if still empty) when the `context` object below captures a
|
|
634
|
+
// reference to it. Population still happens right after, and because
|
|
635
|
+
// `context.hostProtocols` holds the SAME map instance -- never a copy --
|
|
636
|
+
// every producer sees it fully populated by the time `normalizeProgram`
|
|
637
|
+
// actually calls any of them.
|
|
638
|
+
const hosts = {
|
|
639
|
+
protocols: new Map(),
|
|
640
|
+
externals: new Map(),
|
|
641
|
+
externalFiles: new Map(),
|
|
642
|
+
namespaceRoots: new Map(),
|
|
643
|
+
standardLibrary: new Set(),
|
|
644
|
+
commonJsBindings: new Map(),
|
|
645
|
+
commonJsProvenanceFailures: new Set(),
|
|
646
|
+
hostSingletonBindings: new Set(),
|
|
647
|
+
hostNamespaceBindings: new Set()
|
|
648
|
+
};
|
|
649
|
+
// Resolved before `context` is built, unlike the two host censuses above:
|
|
650
|
+
// this one is a pure name lookup with no walk to populate it, so it can be
|
|
651
|
+
// complete up front rather than shared-by-reference and filled in after.
|
|
652
|
+
// One authority, two readers -- `derive.ts`'s carrier policy (through
|
|
653
|
+
// `compiler.ts`) and the iteration producers below, which have to agree
|
|
654
|
+
// about which sources take the native-cursor path.
|
|
655
|
+
const keyedCollections = keyedCollectionDeclarationsOf(compiled.checker, identities, compiled.sourceFiles);
|
|
656
|
+
// The same shape of fact as `keyedCollections`, with the same two readers
|
|
657
|
+
// that must agree: `derive.ts`'s `GeneratorDeclarationPolicy` (through
|
|
658
|
+
// `compiler.ts`) decides that a `Generator<T, ...>` IS the cursor carrier,
|
|
659
|
+
// and `producers/shared.ts`'s `isNativeIterableGeneratorType` decides that a
|
|
660
|
+
// `for`-`of` over one skips the `@@iterator` lookup. Resolving it twice would
|
|
661
|
+
// let one side take the fast path for a declaration the other did not
|
|
662
|
+
// recognise.
|
|
663
|
+
const generatorDeclarationEarly = generatorDeclarationOf(compiled.checker, identities, compiled.sourceFiles);
|
|
664
|
+
const asyncGeneratorDeclarationEarly = asyncGeneratorDeclarationOf(compiled.checker, identities, compiled.sourceFiles);
|
|
665
|
+
const mapIteratorDeclarationEarly = mapIteratorDeclarationOf(compiled.checker, identities, compiled.sourceFiles);
|
|
666
|
+
const standardBuffers = standardBufferDeclarationsOf(compiled.checker, identities, compiled.sourceFiles);
|
|
667
|
+
const wellKnownSymbols = wellKnownSymbolDeclarationsOf(compiled.checker, identities, compiled.sourceFiles);
|
|
668
|
+
// A computed write key narrowed to a proven finite set -- three's
|
|
669
|
+
// `this[ key ] = newValue` in `Material.setValues`/`Texture.setValues`. Built
|
|
670
|
+
// once and shared by BOTH readers that must agree it proves the same thing:
|
|
671
|
+
// the global-host-mutation census below (which narrows a WRITE's taint) and
|
|
672
|
+
// `computedKeyTextsOf` a few lines down (which narrows a `get`/`set`
|
|
673
|
+
// operation's REFLECTION demand, `ir/reflection-demand.ts`).
|
|
674
|
+
// `GEA_HOST_CENSUS_KEY_SETS_OFF` keeps every computed key unknown for both.
|
|
675
|
+
const computedKeysOf = process.env['GEA_HOST_CENSUS_KEY_SETS_OFF']
|
|
676
|
+
? undefined
|
|
677
|
+
: createCensusComputedKeysOf(compiled.checker, valueFlow, closedCallableAuthorityOf(compiled.checker, valueFlow, (expression) => types.rawTypeAt(expression), (declaration) => argumentsObjects.usesByOwner.get(declaration)));
|
|
678
|
+
// `Object.prototype`'s own declaration identity, resolved once: the anchor
|
|
679
|
+
// `computedKeyTextsOf` below checks the for-in arm's "Object.prototype
|
|
680
|
+
// carries no enumerable key" assumption against -- the same identity
|
|
681
|
+
// `global-host-mutations.ts`'s own `objectPrototypeKeysOf` resolves.
|
|
682
|
+
const objectPrototypeDeclaration = (() => {
|
|
683
|
+
const anchor = compiled.sourceFiles[0];
|
|
684
|
+
const objectSymbol = anchor ? compiled.checker.resolveName('Object', anchor, ts.SymbolFlags.Value, false) : undefined;
|
|
685
|
+
const prototype = objectSymbol && anchor ? compiled.checker.getTypeOfSymbolAtLocation(objectSymbol, anchor).getProperty('prototype') : undefined;
|
|
686
|
+
return prototype ? identities.symbolDeclarationId(prototype) : null;
|
|
687
|
+
})();
|
|
688
|
+
// Memoized by node identity: this is a whole-program proof
|
|
689
|
+
// (`computed-key-set.ts`), and `keyOf` in `producers/properties.ts` asks
|
|
690
|
+
// this hook once per element-access candidate across every specialization
|
|
691
|
+
// copy that reaches it -- an unmemoized re-proof per copy is exactly the
|
|
692
|
+
// mistake that once turned a 32s compile into 746s (see
|
|
693
|
+
// `geatsc-escape-proof-needs-memoized-predicates` in project memory).
|
|
694
|
+
const provenKeyTextsCache = new Map();
|
|
695
|
+
/**
|
|
696
|
+
* `ProducerContext.computedKeyTextsOf` -- see that field's own comment for
|
|
697
|
+
* the contract. `computedKeysOf` above proves a TENTATIVE key set under
|
|
698
|
+
* intrinsic assumptions it cannot discharge by itself
|
|
699
|
+
* (`createCensusComputedKeysOf`'s own header explains why); this is what
|
|
700
|
+
* actually discharges them, against the FINAL sealed
|
|
701
|
+
* `globalHostMutationTaint` -- never the mid-fixed-point state the mutation
|
|
702
|
+
* census below iterates through on its way there. Guarded on
|
|
703
|
+
* `hostMutationFactsSealed` (false until the call below completes) so a
|
|
704
|
+
* caller that somehow reached this before sealing gets the same "not
|
|
705
|
+
* proven" answer a refused proof gives, never a stale one built on an
|
|
706
|
+
* incomplete census.
|
|
707
|
+
*/
|
|
708
|
+
const computedKeyTextsOf = (key) => {
|
|
709
|
+
if (!hostMutationFactsSealed)
|
|
710
|
+
return null;
|
|
711
|
+
const cached = provenKeyTextsCache.get(key);
|
|
712
|
+
if (cached !== undefined)
|
|
713
|
+
return cached;
|
|
714
|
+
const compute = () => {
|
|
715
|
+
if (!computedKeysOf)
|
|
716
|
+
return null;
|
|
717
|
+
const answer = computedKeysOf(key);
|
|
718
|
+
if (!answer)
|
|
719
|
+
return null;
|
|
720
|
+
// Whatever the proof leaned on `Object.keys`/the Array iteration
|
|
721
|
+
// protocol staying intact: checked against the sealed census exactly as
|
|
722
|
+
// `censusGlobalHostMutations`'s own final check does (see that file's
|
|
723
|
+
// `assumptionFailed`), never assumed because the proof assumed it.
|
|
724
|
+
if (answer.requirements.length > 0 && failedIntrinsicProtocolRequirements(intrinsicPropertyContext, answer.requirements).length > 0) {
|
|
725
|
+
return null;
|
|
726
|
+
}
|
|
727
|
+
const keys = new Set(answer.keys);
|
|
728
|
+
if (answer.inheritsObjectPrototypeKeys) {
|
|
729
|
+
const surface = globalHostMutationTaint.surfaceKeys;
|
|
730
|
+
// `every`/`numeric` on the surface or on Object.prototype's own
|
|
731
|
+
// record means the for-in arm's "Object.prototype carries no
|
|
732
|
+
// enumerable key" assumption did NOT survive: some write this
|
|
733
|
+
// program made could put any name (or an unbounded numeric one) on
|
|
734
|
+
// Object.prototype -- exactly the "may have grown an arbitrary
|
|
735
|
+
// property" case this whole mechanism exists to rule out. Refuse
|
|
736
|
+
// rather than publish a set the language does not actually bound.
|
|
737
|
+
if (globalHostMutationTaint.has('*') || surface.every || surface.numeric)
|
|
738
|
+
return null;
|
|
739
|
+
const own = objectPrototypeDeclaration === null ? undefined : globalHostMutationTaint.keysOf(objectPrototypeDeclaration);
|
|
740
|
+
if (own?.every || own?.numeric)
|
|
741
|
+
return null;
|
|
742
|
+
for (const name of surface.names)
|
|
743
|
+
keys.add(name);
|
|
744
|
+
for (const name of own?.names ?? [])
|
|
745
|
+
keys.add(name);
|
|
746
|
+
}
|
|
747
|
+
return [...keys];
|
|
748
|
+
};
|
|
749
|
+
const result = compute();
|
|
750
|
+
provenKeyTextsCache.set(key, result);
|
|
751
|
+
return result;
|
|
752
|
+
};
|
|
753
|
+
const context = {
|
|
754
|
+
isStandardLibraryDeclaration: (declaration) => compiled.program.isSourceFileDefaultLibrary(declaration.getSourceFile()),
|
|
755
|
+
hostMethodOf: (node) => resolveHostMethod(compiled.checker, hostMethodBindings, node),
|
|
756
|
+
computedKeyTextsOf,
|
|
757
|
+
numericIndexAbsenceProvenAt: (receiver, key) => {
|
|
758
|
+
if (!hostMutationFactsSealed)
|
|
759
|
+
return false;
|
|
760
|
+
const proof = intrinsicProtocols.capture(() => numericIndexAbsenceProven(compiled.checker, valueFlow, compiled.checker.getNonNullableType(types.rawTypeAt(receiver)), types.rawTypeAt(key)));
|
|
761
|
+
// Inference records provisional obligations; operation production runs
|
|
762
|
+
// after the shared mutation census has sealed and discharges them now.
|
|
763
|
+
return proof.value && failedIntrinsicProtocolRequirements(intrinsicPropertyContext, proof.requirements).length === 0;
|
|
764
|
+
},
|
|
765
|
+
closedLiteralMemberAbsenceProvenAt: (receiver, name) => {
|
|
766
|
+
if (!hostMutationFactsSealed)
|
|
767
|
+
return false;
|
|
768
|
+
const proof = intrinsicProtocols.capture(() => closedLiteralMemberAbsenceProven(compiled.checker, valueFlow, compiled.checker.getNonNullableType(types.rawTypeAt(receiver)), name, receiver));
|
|
769
|
+
// Same rule as `numericIndexAbsenceProvenAt`: the proof is provisional
|
|
770
|
+
// until the shared mutation census seals, and is discharged against it
|
|
771
|
+
// here rather than assumed from its own inference-time capture.
|
|
772
|
+
return proof.value && failedIntrinsicProtocolRequirements(intrinsicPropertyContext, proof.requirements).length === 0;
|
|
773
|
+
},
|
|
774
|
+
checker: compiled.checker,
|
|
775
|
+
identities,
|
|
776
|
+
types,
|
|
777
|
+
// Read from the build. Every module setting except `None`/`CommonJS`
|
|
778
|
+
// compiles ES modules, and an ES module is strict whole -- so this is a
|
|
779
|
+
// fact about the build, not about any one file's syntax.
|
|
780
|
+
buildIsStrict,
|
|
781
|
+
table,
|
|
782
|
+
ordinals: createOrdinalCounter(),
|
|
783
|
+
evaluationOrdinals: createEvaluationOrdinals(),
|
|
784
|
+
// Overridden per candidate below (`path: candidate.specialization`) --
|
|
785
|
+
// `rootSpecialization` here is only to satisfy the type on this shared
|
|
786
|
+
// base object, which is never read from directly as a producer context.
|
|
787
|
+
path: rootSpecialization,
|
|
788
|
+
specializations,
|
|
789
|
+
hostProtocols: hosts.protocols,
|
|
790
|
+
hostSingletonBindings: hosts.hostSingletonBindings,
|
|
791
|
+
hostNamespaceBindings: hosts.hostNamespaceBindings,
|
|
792
|
+
globalHostMutationTaint,
|
|
793
|
+
prototypeReparentings,
|
|
794
|
+
dynamicFallbackTypes,
|
|
795
|
+
commonJsBindings: hosts.commonJsBindings,
|
|
796
|
+
commonJsProvenanceFailures: hosts.commonJsProvenanceFailures,
|
|
797
|
+
commonJsRequire: createCommonJsRequireCensus(compiled.checker, compiled.program.getSourceFiles(), input.commonJsGlobals ?? new Map()),
|
|
798
|
+
commonJsModuleRecords,
|
|
799
|
+
builtinModuleNameOf: (specifier) => input.commonJsBuiltinModules?.get(specifier) ?? null,
|
|
800
|
+
builtinModuleSourceOf: (name) => input.commonJsBuiltinModuleSources?.get(name) ?? null,
|
|
801
|
+
runtimeModuleTargetOf: compiled.runtimeModuleTargetOf,
|
|
802
|
+
sourceFileOf: compiled.sourceFileOf,
|
|
803
|
+
absentGlobals: absent,
|
|
804
|
+
argumentsObjects,
|
|
805
|
+
unresolvableNames,
|
|
806
|
+
reassignedBindings: createReassignedBindingCensus(compiled.checker, valueFlow),
|
|
807
|
+
namespacePaths,
|
|
808
|
+
keyedCollections,
|
|
809
|
+
collections,
|
|
810
|
+
bags,
|
|
811
|
+
parameters,
|
|
812
|
+
generatorDeclaration: generatorDeclarationEarly,
|
|
813
|
+
asyncGeneratorDeclaration: asyncGeneratorDeclarationEarly,
|
|
814
|
+
mapIteratorDeclaration: mapIteratorDeclarationEarly,
|
|
815
|
+
...(returns ? { returns } : {})
|
|
816
|
+
};
|
|
817
|
+
const hostInput = {
|
|
818
|
+
checker: compiled.checker,
|
|
819
|
+
identities,
|
|
820
|
+
files: compiled.sourceFiles,
|
|
821
|
+
census: census.candidates,
|
|
822
|
+
types,
|
|
823
|
+
table,
|
|
824
|
+
nativeTypes: input.nativeTypes ?? new Map(),
|
|
825
|
+
nativeTypesByDeclaration: input.nativeTypesByDeclaration ?? new Map(),
|
|
826
|
+
hostSingletonDeclarations: input.hostSingletonDeclarations ?? new Map(),
|
|
827
|
+
hostNamespaceRoots: input.hostNamespaceRoots ?? new Set(),
|
|
828
|
+
hostNamespaceRootDeclarations: input.hostNamespaceRootDeclarations ?? [],
|
|
829
|
+
hostNamespacePaths: input.hostNamespacePaths ?? new Set(),
|
|
830
|
+
hostNamespaceRootTypes: input.hostNamespaceRootTypes ?? new Map(),
|
|
831
|
+
commonJsGlobals: input.commonJsGlobals ?? new Map(),
|
|
832
|
+
commonJsDeclarationFiles: [
|
|
833
|
+
...new Set([...(input.commonJsGlobals ?? new Map()).values()].flatMap((entry) => {
|
|
834
|
+
const file = compiled.sourceFileOf(entry.declarationFileName);
|
|
835
|
+
return file ? [file] : [];
|
|
836
|
+
}))
|
|
837
|
+
],
|
|
838
|
+
namespacePaths,
|
|
839
|
+
isIntrinsicGlobalThis: unresolvableNames.isIntrinsicGlobalThis
|
|
840
|
+
};
|
|
841
|
+
const typedArrayElements = new Map();
|
|
842
|
+
hostProtocolBindings(hostInput, hosts);
|
|
843
|
+
ambientHostBindings(hostInput, hosts, typedArrayElements);
|
|
844
|
+
// The nine typed-array INSTANCE interfaces, resolved by name and unioned
|
|
845
|
+
// over whatever the seed walk above already found. Unconditional, because a
|
|
846
|
+
// program can hold a typed array without ever naming one -- see
|
|
847
|
+
// `typedArrayDeclarationsOf`. The two agree wherever both answer; this one
|
|
848
|
+
// also answers where the walk has no seed.
|
|
849
|
+
for (const [declaration, domain] of typedArrayDeclarationsOf(compiled.checker, identities, compiled.sourceFiles, compiled.program, input.hostTypedArrayDeclarations ?? [])) {
|
|
850
|
+
typedArrayElements.set(declaration, domain);
|
|
851
|
+
}
|
|
852
|
+
// After the ambient census, deliberately: a standard-library class the
|
|
853
|
+
// census already bound weakly (as a structural body, or as a protocol with
|
|
854
|
+
// no carrier) must end up on the backend's own carrier, not beside it. See
|
|
855
|
+
// `bindStandardClasses`.
|
|
856
|
+
bindStandardClasses(hostInput, hosts, input.standardClasses ?? new Set());
|
|
857
|
+
const hostGlobalBindings = new Set([...hosts.hostSingletonBindings, ...hosts.hostNamespaceBindings]);
|
|
858
|
+
// The mutation census must see the exact identities whose representation
|
|
859
|
+
// policy carries them outside `globalThis`: typed-array instances and native
|
|
860
|
+
// host handles. Passing identities, rather than spelling names in the
|
|
861
|
+
// census, keeps a caller declaration or merged ambient symbol from acquiring
|
|
862
|
+
// this proof.
|
|
863
|
+
const nativeReceiverDeclarations = new Set(typedArrayElements.keys());
|
|
864
|
+
for (const [declaration, binding] of hosts.protocols)
|
|
865
|
+
if (binding.native !== null)
|
|
866
|
+
nativeReceiverDeclarations.add(declaration);
|
|
867
|
+
const nativeReceiverSymbols = new Set();
|
|
868
|
+
const nativeConstructorSymbols = new Set();
|
|
869
|
+
// `bindStandardClasses` publishes the carrier policy, while the mutation
|
|
870
|
+
// census needs the checker's instance identity at each call result. Resolve
|
|
871
|
+
// that identity again from the policy's own names so an unmentioned class is
|
|
872
|
+
// still proven (and a caller declaration with the same spelling is not).
|
|
873
|
+
const receiverAnchor = compiled.sourceFiles[0];
|
|
874
|
+
if (receiverAnchor) {
|
|
875
|
+
for (const name of [...typedArrayInstanceInterfaceNames, ...(input.standardClasses ?? [])]) {
|
|
876
|
+
const symbol = compiled.checker.resolveName(name, receiverAnchor, ts.SymbolFlags.Interface, false);
|
|
877
|
+
const typedArray = typedArrayInstanceInterfaceNames.includes(name);
|
|
878
|
+
if (!symbol ||
|
|
879
|
+
(!typedArray &&
|
|
880
|
+
(!symbol.declarations?.length || !symbol.declarations.every((declaration) => declaration.getSourceFile().hasNoDefaultLib)))) {
|
|
881
|
+
continue;
|
|
882
|
+
}
|
|
883
|
+
nativeReceiverSymbols.add(symbol);
|
|
884
|
+
const declaration = identities.symbolDeclarationId(symbol, receiverAnchor);
|
|
885
|
+
if (declaration)
|
|
886
|
+
nativeReceiverDeclarations.add(declaration);
|
|
887
|
+
}
|
|
888
|
+
}
|
|
889
|
+
const standardClassNames = input.standardClasses ?? new Set();
|
|
890
|
+
const admitNativeConstructor = (constructor, location) => {
|
|
891
|
+
const valueDeclaration = constructor?.valueDeclaration;
|
|
892
|
+
if (!constructor || !valueDeclaration || !isAmbientDeclaration(valueDeclaration))
|
|
893
|
+
return;
|
|
894
|
+
nativeConstructorSymbols.add(constructor);
|
|
895
|
+
const constructorType = compiled.checker.getTypeOfSymbolAtLocation(constructor, location);
|
|
896
|
+
for (const signature of compiled.checker.getSignaturesOfType(constructorType, ts.SignatureKind.Construct)) {
|
|
897
|
+
const result = compiled.checker.getReturnTypeOfSignature(signature);
|
|
898
|
+
const symbol = result.aliasSymbol ?? result.getSymbol();
|
|
899
|
+
if (!symbol)
|
|
900
|
+
continue;
|
|
901
|
+
nativeReceiverSymbols.add(symbol);
|
|
902
|
+
const declaration = identities.symbolDeclarationId(symbol, location);
|
|
903
|
+
if (declaration)
|
|
904
|
+
nativeReceiverDeclarations.add(declaration);
|
|
905
|
+
}
|
|
906
|
+
};
|
|
907
|
+
const executableSourceFiles = new Set(compiled.sourceFiles);
|
|
908
|
+
for (const file of compiled.program.getSourceFiles()) {
|
|
909
|
+
if (executableSourceFiles.has(file)) {
|
|
910
|
+
for (const name of standardClassNames) {
|
|
911
|
+
admitNativeConstructor(compiled.checker.resolveName(name, file, ts.SymbolFlags.Value, false), file);
|
|
912
|
+
}
|
|
913
|
+
}
|
|
914
|
+
const visitNativeConstructorDeclaration = (node) => {
|
|
915
|
+
// A declaration-bound host class states its constructor identity as
|
|
916
|
+
// well as its instance carrier. Reading only standardClasses here left
|
|
917
|
+
// `new HostView()` opaque even though hosts.protocols had already sealed
|
|
918
|
+
// that very class as native. Do not admit a structurally compatible
|
|
919
|
+
// constructor signature: the ambient class declaration must be the one
|
|
920
|
+
// the host bound.
|
|
921
|
+
if (ts.isClassDeclaration(node) && node.name && isAmbientDeclaration(node)) {
|
|
922
|
+
const symbol = compiled.checker.getSymbolAtLocation(node.name);
|
|
923
|
+
const declaration = symbol ? identities.symbolDeclarationId(symbol, node.name) : null;
|
|
924
|
+
const binding = declaration === null ? undefined : hosts.protocols.get(declaration);
|
|
925
|
+
if (binding && binding.native !== null)
|
|
926
|
+
admitNativeConstructor(symbol, node.name);
|
|
927
|
+
}
|
|
928
|
+
if (executableSourceFiles.has(file) &&
|
|
929
|
+
ts.isVariableDeclaration(node) &&
|
|
930
|
+
ts.isIdentifier(node.name) &&
|
|
931
|
+
standardClassNames.has(node.name.text) &&
|
|
932
|
+
isAmbientDeclaration(node)) {
|
|
933
|
+
admitNativeConstructor(compiled.checker.getSymbolAtLocation(node.name), node.name);
|
|
934
|
+
}
|
|
935
|
+
ts.forEachChild(node, visitNativeConstructorDeclaration);
|
|
936
|
+
};
|
|
937
|
+
visitNativeConstructorDeclaration(file);
|
|
938
|
+
}
|
|
939
|
+
// `absorb`, not a copy of the set: the census's per-key facts are not in
|
|
940
|
+
// its legacy set view, and dropping them would lose writes.
|
|
941
|
+
globalHostMutationTaint.absorb(censusGlobalHostMutations(compiled.checker, identities, compiled.sourceFiles, unresolvableNames, hostGlobalBindings, valueFlow, reachable, nativeReceiverDeclarations, nativeReceiverSymbols, nativeConstructorSymbols, types.rawTypeAt, compiled.program.getSourceFiles().filter((file) => file.isDeclarationFile),
|
|
942
|
+
// The one shared instance built above, alongside `computedKeyTextsOf` --
|
|
943
|
+
// `GEA_HOST_CENSUS_KEY_SETS_OFF` keeps every computed key unknown for
|
|
944
|
+
// both readers.
|
|
945
|
+
computedKeysOf));
|
|
946
|
+
hostMutationFactsSealed = true;
|
|
947
|
+
const failedIntrinsicRequirements = failedIntrinsicProtocolRequirements(intrinsicPropertyContext, intrinsicProtocols.requirements());
|
|
948
|
+
// `GEA_LEDGER_DEBUG=1` pairs with the publish-time `[LEDGER]` lines
|
|
949
|
+
// `createDeferredIntrinsicProtocolLedger`'s `replace` prints for every scope:
|
|
950
|
+
// those name WHERE an obligation was raised, and this names WHY the final
|
|
951
|
+
// sealed census refused each one that is still standing at this, the only
|
|
952
|
+
// point the compiler itself asks -- the same `failedIntrinsicProtocolRequirements`
|
|
953
|
+
// call the certification gate uses, so nothing here can disagree with the
|
|
954
|
+
// real answer; it only narrates it.
|
|
955
|
+
if (process.env['GEA_LEDGER_DEBUG'] !== undefined) {
|
|
956
|
+
const clauses = new Map();
|
|
957
|
+
for (const requirement of failedIntrinsicRequirements) {
|
|
958
|
+
const query = requirement.member !== undefined ? 'all' : (requirement.prototypeKeys ?? 'all');
|
|
959
|
+
const why = requirement.member !== undefined
|
|
960
|
+
? intrinsicPropertyContext.globalHostMutationTaint.has('*')
|
|
961
|
+
? '*'
|
|
962
|
+
: 'member'
|
|
963
|
+
: explainIntrinsicProtocolFailure(intrinsicPropertyContext, requirement.intrinsic, requirement.location, query);
|
|
964
|
+
clauses.set(why, (clauses.get(why) ?? 0) + 1);
|
|
965
|
+
const file = requirement.location.getSourceFile();
|
|
966
|
+
const line = file.getLineAndCharacterOfPosition(requirement.location.getStart(file)).line + 1;
|
|
967
|
+
console.error(`[LEDGER-FAILED] ${requirement.intrinsic}${requirement.member !== undefined ? `.${requirement.member}` : ''} ${intrinsicProtocolRequirementKind(requirement) ?? 'whole'} why=${why} ${file.fileName.split('/').pop()}:${line}`);
|
|
968
|
+
}
|
|
969
|
+
console.error(`[LEDGER-SUMMARY] failed=${failedIntrinsicRequirements.length} clauses=${[...clauses].map(([clause, count]) => `${clause}:${count}`).join(',')}`);
|
|
970
|
+
}
|
|
971
|
+
const intrinsicProtocolDiagnostics = failedIntrinsicRequirements.map((requirement, ordinal) => {
|
|
972
|
+
const file = requirement.location.getSourceFile();
|
|
973
|
+
const position = file.getLineAndCharacterOfPosition(requirement.location.getStart(file));
|
|
974
|
+
return {
|
|
975
|
+
id: `intrinsic-protocol/${requirement.intrinsic}/${ordinal}`,
|
|
976
|
+
component: checkerComponent,
|
|
977
|
+
operation: null,
|
|
978
|
+
missingPrimitive: null,
|
|
979
|
+
// Names the exact obligation: a per-key requirement fails only when the
|
|
980
|
+
// census recorded one of those keys, a whole-prototype one under any
|
|
981
|
+
// unattributed key write at all -- which of the two is what to fix.
|
|
982
|
+
message: `Inferred callable closure requires the intrinsic ${requirement.intrinsic}${requirement.member === undefined
|
|
983
|
+
? requirement.prototypeKeys
|
|
984
|
+
? ` prototype keys [${prototypeKeyQuerySignature(requirement.prototypeKeys)}]`
|
|
985
|
+
: ' prototype (whole)'
|
|
986
|
+
: `.${requirement.member}`} to remain intact; the final host mutation census did not prove that requirement.`,
|
|
987
|
+
location: { file: file.fileName, line: position.line + 1, column: position.character + 1 }
|
|
988
|
+
};
|
|
989
|
+
});
|
|
990
|
+
const promiseDeclaration = promiseDeclarationOf(compiled.checker, identities, compiled.sourceFiles);
|
|
991
|
+
const dateDeclaration = dateDeclarationOf(compiled.checker, identities, compiled.sourceFiles);
|
|
992
|
+
const stringObjectDeclaration = stringObjectDeclarationOf(compiled.checker, identities, compiled.sourceFiles);
|
|
993
|
+
const errorDeclarations = errorDeclarationsOf(compiled.checker, identities, compiled.sourceFiles);
|
|
994
|
+
const functionDeclaration = functionDeclarationOf(compiled.checker, identities, compiled.sourceFiles);
|
|
995
|
+
const classHeritage = classHeritageOf(compiled.checker, identities, compiled.sourceFiles, prototypeReparentings.baseOf);
|
|
996
|
+
const constructorSlotSubclasses = constructorSlotSubclassesOf(compiled.checker, identities, compiled.sourceFiles, classHeritage);
|
|
997
|
+
const uninstantiableClasses = uninstantiableClassesOf(compiled.checker, identities, compiled.sourceFiles);
|
|
998
|
+
const interfaceImplementors = interfaceImplementorsOf(compiled.checker, identities, compiled.sourceFiles);
|
|
999
|
+
const generatorDeclaration = generatorDeclarationEarly;
|
|
1000
|
+
const asyncGeneratorDeclaration = asyncGeneratorDeclarationEarly;
|
|
1001
|
+
const mapIteratorDeclaration = mapIteratorDeclarationEarly;
|
|
1002
|
+
// Resolved the same way and for the same reason as `keyedCollections` above.
|
|
1003
|
+
const regexpDeclarations = regexpDeclarationsOf(compiled.checker, identities, compiled.sourceFiles);
|
|
1004
|
+
timing.mark('structural-and-host-censuses');
|
|
1005
|
+
const normalized = normalizeProgram({
|
|
1006
|
+
census,
|
|
1007
|
+
types: table,
|
|
1008
|
+
// One producer set per monomorphized copy, differing only in which mapper
|
|
1009
|
+
// view they ask. Everything else -- the checker, the identity table, both
|
|
1010
|
+
// ordinal counters -- is the one shared context, because those answer
|
|
1011
|
+
// whole-program questions that a copy must not fork.
|
|
1012
|
+
producers: (candidate) => input.producers({
|
|
1013
|
+
...context,
|
|
1014
|
+
identities: identities.forSpecialization(candidate.specialization),
|
|
1015
|
+
types: types.forSpecialization(candidate.specialization),
|
|
1016
|
+
path: candidate.specialization
|
|
1017
|
+
}),
|
|
1018
|
+
// Which copy a candidate belongs to, owner included -- the identity table's
|
|
1019
|
+
// own answer, so the producer cache, the identity views and the structural
|
|
1020
|
+
// mappers all agree on what "the same copy" means.
|
|
1021
|
+
copyKey: (candidate) => identities.copyKeyOf(candidate.specialization),
|
|
1022
|
+
gates: (operations) => gatingEdges({
|
|
1023
|
+
files: compiled.sourceFiles,
|
|
1024
|
+
identities,
|
|
1025
|
+
operations,
|
|
1026
|
+
reachable,
|
|
1027
|
+
specializations,
|
|
1028
|
+
argumentsObjects,
|
|
1029
|
+
unresolvableNames,
|
|
1030
|
+
namespacePaths
|
|
1031
|
+
})
|
|
1032
|
+
});
|
|
1033
|
+
timing.mark('normalization');
|
|
1034
|
+
timing.report();
|
|
1035
|
+
// See `FrontendResult.locationOfNode`. Lazy, because a compilation that
|
|
1036
|
+
// reports nothing must not pay for a whole-program walk to name nodes
|
|
1037
|
+
// nobody asked about.
|
|
1038
|
+
//
|
|
1039
|
+
// Keyed by `positionKeyOfNode` -- file and ordinal, kind and monomorphization
|
|
1040
|
+
// suffix both dropped -- rather than by the raw NodeId text. A monomorphized
|
|
1041
|
+
// copy has no source text of its own (the position key already names the
|
|
1042
|
+
// root it was cut from, so no separate `withoutSpecialization` fallback
|
|
1043
|
+
// lookup is needed), and dropping kind is what lets `locationOfDeclaration`
|
|
1044
|
+
// resolve a DeclarationId -- which never carries one -- through this SAME
|
|
1045
|
+
// index instead of a second one built to answer the identical question in a
|
|
1046
|
+
// different identity currency.
|
|
1047
|
+
let nodesByPosition = null;
|
|
1048
|
+
const positionIndex = () => {
|
|
1049
|
+
if (nodesByPosition === null) {
|
|
1050
|
+
const index = new Map();
|
|
1051
|
+
for (const file of compiled.sourceFiles) {
|
|
1052
|
+
if (file.isDeclarationFile)
|
|
1053
|
+
continue;
|
|
1054
|
+
const walk = (current) => {
|
|
1055
|
+
let key = null;
|
|
1056
|
+
try {
|
|
1057
|
+
key = positionKeyOfNode(identities.nodeIdOf(current));
|
|
1058
|
+
}
|
|
1059
|
+
catch {
|
|
1060
|
+
key = null;
|
|
1061
|
+
}
|
|
1062
|
+
if (key !== null && !index.has(key))
|
|
1063
|
+
index.set(key, current);
|
|
1064
|
+
ts.forEachChild(current, walk);
|
|
1065
|
+
};
|
|
1066
|
+
walk(file);
|
|
1067
|
+
}
|
|
1068
|
+
nodesByPosition = index;
|
|
1069
|
+
}
|
|
1070
|
+
return nodesByPosition;
|
|
1071
|
+
};
|
|
1072
|
+
const sourceNodeOf = (node) => positionIndex().get(positionKeyOfNode(node)) ?? null;
|
|
1073
|
+
const sourceNodeOfDeclaration = (declaration) => positionIndex().get(positionKeyOfDeclaration(declaration)) ?? null;
|
|
1074
|
+
const locationOfFound = (found) => {
|
|
1075
|
+
if (!found)
|
|
1076
|
+
return null;
|
|
1077
|
+
const file = found.getSourceFile();
|
|
1078
|
+
const { line, character } = file.getLineAndCharacterOfPosition(found.getStart());
|
|
1079
|
+
return { file: file.fileName, line: line + 1, column: character + 1 };
|
|
1080
|
+
};
|
|
1081
|
+
const locationOfNode = (node) => locationOfFound(sourceNodeOf(node));
|
|
1082
|
+
const textOfNode = (node) => sourceNodeOf(node)?.getText() ?? null;
|
|
1083
|
+
/** `locationOfNode`'s twin for a DeclarationId -- see `FrontendResult.locationOfDeclaration`. */
|
|
1084
|
+
const locationOfDeclaration = (declaration) => locationOfFound(sourceNodeOfDeclaration(declaration));
|
|
1085
|
+
return {
|
|
1086
|
+
dynamicFallbackTypes,
|
|
1087
|
+
dynamicWrittenTypes,
|
|
1088
|
+
dynamicFallbackCallables: prototypeFallback.callables,
|
|
1089
|
+
graph: normalized.graph,
|
|
1090
|
+
sourcePreparations: compiled.sourcePreparations,
|
|
1091
|
+
hostProtocols: hosts.protocols,
|
|
1092
|
+
wellKnownSymbols,
|
|
1093
|
+
externalBindings: hosts.externals,
|
|
1094
|
+
commonJsBindings: hosts.commonJsBindings,
|
|
1095
|
+
hostSingletonBindings: hosts.hostSingletonBindings,
|
|
1096
|
+
hostNamespaceBindings: hosts.hostNamespaceBindings,
|
|
1097
|
+
absentBindings: absentBindingIds(absent, identities),
|
|
1098
|
+
deadTypeofGuards,
|
|
1099
|
+
locationOfNode,
|
|
1100
|
+
locationOfDeclaration,
|
|
1101
|
+
textOfNode,
|
|
1102
|
+
externalBindingFiles: hosts.externalFiles,
|
|
1103
|
+
standardLibraryBindings: hosts.standardLibrary,
|
|
1104
|
+
// The module bodies the graph actually has, in evaluation order. A file the
|
|
1105
|
+
// reachability walk pruned whole, or one whose top level censused nothing,
|
|
1106
|
+
// has no region -- and a name in this list that no region answers would be
|
|
1107
|
+
// a call to a function nothing defines.
|
|
1108
|
+
moduleOrder: moduleEvaluationOrder({ checker: compiled.checker, files: compiled.sourceFiles, entries: compiled.entryFiles })
|
|
1109
|
+
.map((file) => regionId(identities.nodeIdOf(file), 'module-body'))
|
|
1110
|
+
.filter((region) => normalized.graph.regions.has(region)),
|
|
1111
|
+
sourceFileNames: identities.sourceFileNames,
|
|
1112
|
+
typedArrayElements,
|
|
1113
|
+
promiseDeclaration,
|
|
1114
|
+
dateDeclaration,
|
|
1115
|
+
stringObjectDeclaration,
|
|
1116
|
+
errorDeclarations,
|
|
1117
|
+
functionDeclaration,
|
|
1118
|
+
classHeritage,
|
|
1119
|
+
constructorSlotSubclasses,
|
|
1120
|
+
uninstantiableClasses,
|
|
1121
|
+
interfaceImplementors,
|
|
1122
|
+
generatorDeclaration,
|
|
1123
|
+
asyncGeneratorDeclaration,
|
|
1124
|
+
mapIteratorDeclaration,
|
|
1125
|
+
keyedCollections,
|
|
1126
|
+
regexpDeclarations,
|
|
1127
|
+
standardBuffers,
|
|
1128
|
+
hostNamespaceRoots: hosts.namespaceRoots,
|
|
1129
|
+
checkerDiagnostics: (() => {
|
|
1130
|
+
const compiledFiles = new Set(compiled.sourceFiles);
|
|
1131
|
+
const syntactic = new Set(compiled.program.getSyntacticDiagnostics());
|
|
1132
|
+
return compiled.diagnostics
|
|
1133
|
+
.filter((diagnostic) => !diagnosticIsInPrunedCode(diagnostic, reachable, compiledFiles, syntactic))
|
|
1134
|
+
.map(translateDiagnostic);
|
|
1135
|
+
})(),
|
|
1136
|
+
intrinsicProtocolDiagnostics,
|
|
1137
|
+
uninstalledFamilies: normalized.uninstalledFamilies,
|
|
1138
|
+
// `parameters` is the COMPOSED census: `composeReturnBindings`,
|
|
1139
|
+
// `withLocalBindings`, `withFieldBindings` and `withJsDocTypeNames` each
|
|
1140
|
+
// concatenate their own refusals onto their upstream's, so this one list
|
|
1141
|
+
// already carries five censuses. The old string prefixes (`return:`,
|
|
1142
|
+
// `local:`, `field:`) are gone -- a `CensusRefusal`'s key is namespaced by
|
|
1143
|
+
// its domain already, and a prefix applied by the WRAPPER was the layer
|
|
1144
|
+
// above naming a refusal the layer below had raised.
|
|
1145
|
+
// `collections` and `bags` are not in that chain and keep their own.
|
|
1146
|
+
censusAccounting: new Map([
|
|
1147
|
+
['bindings', { bound: parameters.boundCount, refusals: censusRefusalCounts(parameters.refusals) }],
|
|
1148
|
+
['collections', { bound: collections.boundCount, refusals: censusRefusalCounts(collections.refusals) }],
|
|
1149
|
+
['bags', { bound: bags.boundCount, refusals: censusRefusalCounts(bags.refusals) }]
|
|
1150
|
+
]),
|
|
1151
|
+
censusRefusals: [...parameters.refusals, ...collections.refusals, ...bags.refusals],
|
|
1152
|
+
cellFacts,
|
|
1153
|
+
structuralDisagreements: types.structuralDisagreements,
|
|
1154
|
+
structuralFormViolations: types.structuralFormViolations,
|
|
1155
|
+
classCopies: types.classCopies()
|
|
1156
|
+
};
|
|
1157
|
+
};
|