@scriptc/compiler 0.4.2 → 0.4.3
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/ambient/scriptc-node-fallback.d.ts +397 -37
- package/dist/backend/cycle-analysis.d.ts +4 -1
- package/dist/backend/cycle-analysis.js +6 -4
- package/dist/backend/cycle-analysis.js.map +1 -1
- package/dist/backend/cycle-analysis.test.js +55 -0
- package/dist/backend/cycle-analysis.test.js.map +1 -1
- package/dist/backend/cycle-mutability.d.ts +7 -0
- package/dist/backend/cycle-mutability.js +19 -1
- package/dist/backend/cycle-mutability.js.map +1 -1
- package/dist/backend/executable-features.js +2 -0
- package/dist/backend/executable-features.js.map +1 -1
- package/dist/backend/immutability.d.ts +6 -3
- package/dist/backend/immutability.js +33 -29
- package/dist/backend/immutability.js.map +1 -1
- package/dist/backend/library-pack.js +1 -0
- package/dist/backend/library-pack.js.map +1 -1
- package/dist/backend/llvm/alloc.d.ts +16 -1
- package/dist/backend/llvm/alloc.js +54 -4
- package/dist/backend/llvm/alloc.js.map +1 -1
- package/dist/backend/llvm/appended-array-literals.d.ts +2 -1
- package/dist/backend/llvm/appended-array-literals.js +44 -36
- package/dist/backend/llvm/appended-array-literals.js.map +1 -1
- package/dist/backend/llvm/appended-array-literals.test.js +4 -3
- package/dist/backend/llvm/appended-array-literals.test.js.map +1 -1
- package/dist/backend/llvm/array-search.d.ts +4 -3
- package/dist/backend/llvm/array-search.js +21 -9
- package/dist/backend/llvm/array-search.js.map +1 -1
- package/dist/backend/llvm/blocks.d.ts +1 -1
- package/dist/backend/llvm/blocks.js +2 -2
- package/dist/backend/llvm/blocks.js.map +1 -1
- package/dist/backend/llvm/byte-windows.js +2 -0
- package/dist/backend/llvm/byte-windows.js.map +1 -1
- package/dist/backend/llvm/bytes-alias.d.ts +6 -1
- package/dist/backend/llvm/bytes-alias.js +8 -2
- package/dist/backend/llvm/bytes-alias.js.map +1 -1
- package/dist/backend/llvm/bytes-loop-versions.d.ts +47 -5
- package/dist/backend/llvm/bytes-loop-versions.js +473 -32
- package/dist/backend/llvm/bytes-loop-versions.js.map +1 -1
- package/dist/backend/llvm/bytes-loop-versions.test.js +258 -2
- package/dist/backend/llvm/bytes-loop-versions.test.js.map +1 -1
- package/dist/backend/llvm/checked-value-lifetimes.js +2 -0
- package/dist/backend/llvm/checked-value-lifetimes.js.map +1 -1
- package/dist/backend/llvm/classes.d.ts +7 -5
- package/dist/backend/llvm/classes.js +44 -20
- package/dist/backend/llvm/classes.js.map +1 -1
- package/dist/backend/llvm/classes.test.js +167 -7
- package/dist/backend/llvm/classes.test.js.map +1 -1
- package/dist/backend/llvm/common.d.ts +9 -3
- package/dist/backend/llvm/common.js +9 -3
- package/dist/backend/llvm/common.js.map +1 -1
- package/dist/backend/llvm/constant-callbacks.d.ts +2 -1
- package/dist/backend/llvm/constant-callbacks.js +83 -52
- package/dist/backend/llvm/constant-callbacks.js.map +1 -1
- package/dist/backend/llvm/counted-loops.d.ts +7 -0
- package/dist/backend/llvm/counted-loops.js +18 -0
- package/dist/backend/llvm/counted-loops.js.map +1 -1
- package/dist/backend/llvm/dense-array-access.d.ts +39 -8
- package/dist/backend/llvm/dense-array-access.js +222 -52
- package/dist/backend/llvm/dense-array-access.js.map +1 -1
- package/dist/backend/llvm/dense-array-access.test.js +36 -0
- package/dist/backend/llvm/dense-array-access.test.js.map +1 -1
- package/dist/backend/llvm/dense-array-loops.d.ts +17 -1
- package/dist/backend/llvm/dense-array-loops.js +194 -5
- package/dist/backend/llvm/dense-array-loops.js.map +1 -1
- package/dist/backend/llvm/dense-array-loops.test.js +90 -1
- package/dist/backend/llvm/dense-array-loops.test.js.map +1 -1
- package/dist/backend/llvm/dyn-handle-tags.test.js +6 -1
- package/dist/backend/llvm/dyn-handle-tags.test.js.map +1 -1
- package/dist/backend/llvm/dyn.d.ts +26 -0
- package/dist/backend/llvm/dyn.js +352 -61
- package/dist/backend/llvm/dyn.js.map +1 -1
- package/dist/backend/llvm/emit-function.js +11 -20
- package/dist/backend/llvm/emit-function.js.map +1 -1
- package/dist/backend/llvm/emit-journal.d.ts +93 -0
- package/dist/backend/llvm/emit-journal.js +170 -0
- package/dist/backend/llvm/emit-journal.js.map +1 -0
- package/dist/backend/llvm/emit-module.js +195 -27
- package/dist/backend/llvm/emit-module.js.map +1 -1
- package/dist/backend/llvm/emit-statements.d.ts +0 -4
- package/dist/backend/llvm/emit-statements.js +268 -84
- package/dist/backend/llvm/emit-statements.js.map +1 -1
- package/dist/backend/llvm/emitter-state.d.ts +7 -0
- package/dist/backend/llvm/emitter-state.js +14 -0
- package/dist/backend/llvm/emitter-state.js.map +1 -0
- package/dist/backend/llvm/emitter.d.ts +176 -37
- package/dist/backend/llvm/emitter.js +724 -85
- package/dist/backend/llvm/emitter.js.map +1 -1
- package/dist/backend/llvm/emitter.test.js +54 -5
- package/dist/backend/llvm/emitter.test.js.map +1 -1
- package/dist/backend/llvm/expr-bytes.js +34 -12
- package/dist/backend/llvm/expr-bytes.js.map +1 -1
- package/dist/backend/llvm/expr-callbacks.js +47 -0
- package/dist/backend/llvm/expr-callbacks.js.map +1 -1
- package/dist/backend/llvm/expr-calls.js +28 -14
- package/dist/backend/llvm/expr-calls.js.map +1 -1
- package/dist/backend/llvm/expr-containers.d.ts +14 -2
- package/dist/backend/llvm/expr-containers.js +129 -37
- package/dist/backend/llvm/expr-containers.js.map +1 -1
- package/dist/backend/llvm/expr-context.d.ts +14 -0
- package/dist/backend/llvm/expr-dynamic.js +18 -11
- package/dist/backend/llvm/expr-dynamic.js.map +1 -1
- package/dist/backend/llvm/expr-primitives.js +100 -28
- package/dist/backend/llvm/expr-primitives.js.map +1 -1
- package/dist/backend/llvm/expr-primitives.test.js +11 -6
- package/dist/backend/llvm/expr-primitives.test.js.map +1 -1
- package/dist/backend/llvm/expr-records.d.ts +12 -0
- package/dist/backend/llvm/expr-records.js +106 -0
- package/dist/backend/llvm/expr-records.js.map +1 -1
- package/dist/backend/llvm/expr-stream-bridges.d.ts +2 -2
- package/dist/backend/llvm/expr-stream-bridges.js +194 -65
- package/dist/backend/llvm/expr-stream-bridges.js.map +1 -1
- package/dist/backend/llvm/expr-stream-bridges.test.js +1 -1
- package/dist/backend/llvm/expr-stream-bridges.test.js.map +1 -1
- package/dist/backend/llvm/expr-stream-callbacks.d.ts +2 -2
- package/dist/backend/llvm/expr-stream-callbacks.js +74 -20
- package/dist/backend/llvm/expr-stream-callbacks.js.map +1 -1
- package/dist/backend/llvm/int32-kind-loops.d.ts +39 -0
- package/dist/backend/llvm/int32-kind-loops.js +106 -0
- package/dist/backend/llvm/int32-kind-loops.js.map +1 -0
- package/dist/backend/llvm/integer-or-nan-indexes.test.d.ts +1 -0
- package/dist/backend/llvm/integer-or-nan-indexes.test.js +118 -0
- package/dist/backend/llvm/integer-or-nan-indexes.test.js.map +1 -0
- package/dist/backend/llvm/integer-values.d.ts +20 -1
- package/dist/backend/llvm/integer-values.js +71 -0
- package/dist/backend/llvm/integer-values.js.map +1 -1
- package/dist/backend/llvm/js-ic.d.ts +1 -1
- package/dist/backend/llvm/js-ic.js +1 -1
- package/dist/backend/llvm/js-ic.js.map +1 -1
- package/dist/backend/llvm/key-orders.d.ts +7 -0
- package/dist/backend/llvm/key-orders.js +33 -0
- package/dist/backend/llvm/key-orders.js.map +1 -0
- package/dist/backend/llvm/lib-connect.js +4 -0
- package/dist/backend/llvm/lib-connect.js.map +1 -1
- package/dist/backend/llvm/lib-datagram.js +11 -0
- package/dist/backend/llvm/lib-datagram.js.map +1 -1
- package/dist/backend/llvm/lib-dispatch.js +80 -2
- package/dist/backend/llvm/lib-dispatch.js.map +1 -1
- package/dist/backend/llvm/lib-filesystem.js +4 -4
- package/dist/backend/llvm/lib-filesystem.js.map +1 -1
- package/dist/backend/llvm/lib-http2.js +4 -0
- package/dist/backend/llvm/lib-http2.js.map +1 -1
- package/dist/backend/llvm/lib-lookup.js +16 -6
- package/dist/backend/llvm/lib-lookup.js.map +1 -1
- package/dist/backend/llvm/lib-shared.js +73 -2
- package/dist/backend/llvm/lib-shared.js.map +1 -1
- package/dist/backend/llvm/lib-stream.js +35 -5
- package/dist/backend/llvm/lib-stream.js.map +1 -1
- package/dist/backend/llvm/local-array-reads.js +115 -19
- package/dist/backend/llvm/local-array-reads.js.map +1 -1
- package/dist/backend/llvm/local-array-reads.test.js +14 -0
- package/dist/backend/llvm/local-array-reads.test.js.map +1 -1
- package/dist/backend/llvm/loop-state.d.ts +33 -0
- package/dist/backend/llvm/loop-state.js +42 -0
- package/dist/backend/llvm/loop-state.js.map +1 -0
- package/dist/backend/llvm/map-number-lookup.d.ts +26 -8
- package/dist/backend/llvm/map-number-lookup.js +91 -31
- package/dist/backend/llvm/map-number-lookup.js.map +1 -1
- package/dist/backend/llvm/map-number-lookup.test.js +55 -0
- package/dist/backend/llvm/map-number-lookup.test.js.map +1 -1
- package/dist/backend/llvm/map-read-lifetimes.js +4 -2
- package/dist/backend/llvm/map-read-lifetimes.js.map +1 -1
- package/dist/backend/llvm/nullable-unions.d.ts +2 -1
- package/dist/backend/llvm/nullable-unions.js +15 -3
- package/dist/backend/llvm/nullable-unions.js.map +1 -1
- package/dist/backend/llvm/publish.d.ts +10 -0
- package/dist/backend/llvm/publish.js +12 -0
- package/dist/backend/llvm/publish.js.map +1 -1
- package/dist/backend/llvm/receivers.js +6 -1
- package/dist/backend/llvm/receivers.js.map +1 -1
- package/dist/backend/llvm/record-results.d.ts +1 -9
- package/dist/backend/llvm/record-results.js +2 -11
- package/dist/backend/llvm/record-results.js.map +1 -1
- package/dist/backend/llvm/reference-writes.d.ts +7 -2
- package/dist/backend/llvm/reference-writes.js +89 -72
- package/dist/backend/llvm/reference-writes.js.map +1 -1
- package/dist/backend/llvm/running-extrema.d.ts +11 -0
- package/dist/backend/llvm/running-extrema.js +115 -0
- package/dist/backend/llvm/running-extrema.js.map +1 -0
- package/dist/backend/llvm/running-extrema.test.d.ts +1 -0
- package/dist/backend/llvm/running-extrema.test.js +89 -0
- package/dist/backend/llvm/running-extrema.test.js.map +1 -0
- package/dist/backend/llvm/shapes.d.ts +71 -15
- package/dist/backend/llvm/shapes.js +222 -33
- package/dist/backend/llvm/shapes.js.map +1 -1
- package/dist/backend/llvm/shapes.test.js +53 -7
- package/dist/backend/llvm/shapes.test.js.map +1 -1
- package/dist/backend/llvm/speculative-integers.d.ts +6 -0
- package/dist/backend/llvm/speculative-integers.js +2 -2
- package/dist/backend/llvm/speculative-integers.js.map +1 -1
- package/dist/backend/llvm/stack-objects.d.ts +3 -2
- package/dist/backend/llvm/stack-objects.js +5 -2
- package/dist/backend/llvm/stack-objects.js.map +1 -1
- package/dist/backend/llvm/string-reads.d.ts +12 -0
- package/dist/backend/llvm/string-reads.js +44 -0
- package/dist/backend/llvm/string-reads.js.map +1 -1
- package/dist/backend/llvm/walk-borrows.d.ts +3 -0
- package/dist/backend/llvm/walk-borrows.js +46 -41
- package/dist/backend/llvm/walk-borrows.js.map +1 -1
- package/dist/backend/llvm/walkers.d.ts +3 -0
- package/dist/backend/llvm/walkers.js +88 -65
- package/dist/backend/llvm/walkers.js.map +1 -1
- package/dist/backend/llvm/wrapping-sums.d.ts +16 -1
- package/dist/backend/llvm/wrapping-sums.js +126 -0
- package/dist/backend/llvm/wrapping-sums.js.map +1 -1
- package/dist/backend/may-throw.d.ts +8 -10
- package/dist/backend/may-throw.js +14 -10
- package/dist/backend/may-throw.js.map +1 -1
- package/dist/backend/native/contracts.d.ts +5 -0
- package/dist/backend/native/executable.js +7 -0
- package/dist/backend/native/executable.js.map +1 -1
- package/dist/backend/native/runtime-inputs.d.ts +1 -1
- package/dist/backend/native/runtime-inputs.js +1 -0
- package/dist/backend/native/runtime-inputs.js.map +1 -1
- package/dist/backend/native-link-info-core.d.ts +4 -0
- package/dist/backend/native-link-info-core.js.map +1 -1
- package/dist/backend/publication.d.ts +12 -1
- package/dist/backend/publication.js +37 -14
- package/dist/backend/publication.js.map +1 -1
- package/dist/backend/publication.test.js +30 -0
- package/dist/backend/publication.test.js.map +1 -1
- package/dist/backend/result-slots.d.ts +16 -0
- package/dist/backend/result-slots.js +23 -0
- package/dist/backend/result-slots.js.map +1 -0
- package/dist/backend/runtime-abi.d.ts +2 -2
- package/dist/backend/runtime-abi.js +2 -2
- package/dist/backend/runtime-pack-core.d.ts +1 -0
- package/dist/backend/runtime-pack-core.js +1 -0
- package/dist/backend/runtime-pack-core.js.map +1 -1
- package/dist/backend/runtime-pack-targets.test.js +2 -1
- package/dist/backend/runtime-pack-targets.test.js.map +1 -1
- package/dist/backend/runtime-pack.test.js +2 -1
- package/dist/backend/runtime-pack.test.js.map +1 -1
- package/dist/backend/stack-observations.d.ts +2 -1
- package/dist/backend/stack-observations.js +67 -42
- package/dist/backend/stack-observations.js.map +1 -1
- package/dist/backend/target-diagnostics.js +5 -3
- package/dist/backend/target-diagnostics.js.map +1 -1
- package/dist/backend/warm-cache.js +1 -0
- package/dist/backend/warm-cache.js.map +1 -1
- package/dist/cli/usage.d.ts +1 -1
- package/dist/cli/usage.js +3 -3
- package/dist/compat/fetch-profile.js +1 -1
- package/dist/compat/fetch-profile.js.map +1 -1
- package/dist/contracts/check.js +4 -3
- package/dist/contracts/check.js.map +1 -1
- package/dist/contracts/int32-elements.js +10 -2
- package/dist/contracts/int32-elements.js.map +1 -1
- package/dist/coverage/report.js +12 -3
- package/dist/coverage/report.js.map +1 -1
- package/dist/diagnostics/diagnostic.d.ts +4 -0
- package/dist/diagnostics/diagnostic.js.map +1 -1
- package/dist/diagnostics/envelope.d.ts +3 -0
- package/dist/diagnostics/envelope.js +1 -0
- package/dist/diagnostics/envelope.js.map +1 -1
- package/dist/executable/executable-cache.d.ts +2 -0
- package/dist/executable/executable-cache.js +1 -0
- package/dist/executable/executable-cache.js.map +1 -1
- package/dist/executable/executable-cache.test.js +1 -0
- package/dist/executable/executable-cache.test.js.map +1 -1
- package/dist/frontend/decl-projection.d.ts +41 -0
- package/dist/frontend/decl-projection.js +854 -0
- package/dist/frontend/decl-projection.js.map +1 -0
- package/dist/frontend/decl-projection.test.d.ts +1 -0
- package/dist/frontend/decl-projection.test.js +30 -0
- package/dist/frontend/decl-projection.test.js.map +1 -0
- package/dist/frontend/dts-paths.d.ts +15 -0
- package/dist/frontend/dts-paths.js +25 -0
- package/dist/frontend/dts-paths.js.map +1 -1
- package/dist/frontend/input-tracker.d.ts +6 -0
- package/dist/frontend/input-tracker.js +51 -28
- package/dist/frontend/input-tracker.js.map +1 -1
- package/dist/frontend/input-tracker.test.js +19 -0
- package/dist/frontend/input-tracker.test.js.map +1 -1
- package/dist/frontend/lowering/array-values.js +100 -2
- package/dist/frontend/lowering/array-values.js.map +1 -1
- package/dist/frontend/lowering/builtins/child-process-methods.js +46 -15
- package/dist/frontend/lowering/builtins/child-process-methods.js.map +1 -1
- package/dist/frontend/lowering/builtins/child-process.js +13 -2
- package/dist/frontend/lowering/builtins/child-process.js.map +1 -1
- package/dist/frontend/lowering/builtins/crypto.js +84 -9
- package/dist/frontend/lowering/builtins/crypto.js.map +1 -1
- package/dist/frontend/lowering/builtins/global-namespace-keys.d.ts +3 -0
- package/dist/frontend/lowering/builtins/global-namespace-keys.js +122 -0
- package/dist/frontend/lowering/builtins/global-namespace-keys.js.map +1 -0
- package/dist/frontend/lowering/builtins/numbers.js +9 -1
- package/dist/frontend/lowering/builtins/numbers.js.map +1 -1
- package/dist/frontend/lowering/builtins/promises.d.ts +6 -0
- package/dist/frontend/lowering/builtins/promises.js +88 -2
- package/dist/frontend/lowering/builtins/promises.js.map +1 -1
- package/dist/frontend/lowering/builtins/readline.d.ts +5 -1
- package/dist/frontend/lowering/builtins/readline.js +35 -3
- package/dist/frontend/lowering/builtins/readline.js.map +1 -1
- package/dist/frontend/lowering/builtins/url.js +24 -1
- package/dist/frontend/lowering/builtins/url.js.map +1 -1
- package/dist/frontend/lowering/builtins/webassembly.js +6 -3
- package/dist/frontend/lowering/builtins/webassembly.js.map +1 -1
- package/dist/frontend/lowering/class-callbacks.d.ts +5 -2
- package/dist/frontend/lowering/class-callbacks.js +82 -12
- package/dist/frontend/lowering/class-callbacks.js.map +1 -1
- package/dist/frontend/lowering/class-construction.d.ts +4 -1
- package/dist/frontend/lowering/class-construction.js +17 -3
- package/dist/frontend/lowering/class-construction.js.map +1 -1
- package/dist/frontend/lowering/class-dynamic-dispatch.d.ts +39 -2
- package/dist/frontend/lowering/class-dynamic-dispatch.js +766 -108
- package/dist/frontend/lowering/class-dynamic-dispatch.js.map +1 -1
- package/dist/frontend/lowering/class-dynamic-dispatch.test.js +47 -0
- package/dist/frontend/lowering/class-dynamic-dispatch.test.js.map +1 -1
- package/dist/frontend/lowering/class-iterables.d.ts +2 -1
- package/dist/frontend/lowering/class-iterables.js +9 -1
- package/dist/frontend/lowering/class-iterables.js.map +1 -1
- package/dist/frontend/lowering/class-method-mutations.js +32 -9
- package/dist/frontend/lowering/class-method-mutations.js.map +1 -1
- package/dist/frontend/lowering/class-prototypes.js +31 -2
- package/dist/frontend/lowering/class-prototypes.js.map +1 -1
- package/dist/frontend/lowering/class-runtime-statics.d.ts +9 -3
- package/dist/frontend/lowering/class-runtime-statics.js +29 -4
- package/dist/frontend/lowering/class-runtime-statics.js.map +1 -1
- package/dist/frontend/lowering/coercions/structural-plans.js +48 -1
- package/dist/frontend/lowering/coercions/structural-plans.js.map +1 -1
- package/dist/frontend/lowering/coercions/structural.js +91 -1
- package/dist/frontend/lowering/coercions/structural.js.map +1 -1
- package/dist/frontend/lowering/containers/array-callback-call.js +2 -2
- package/dist/frontend/lowering/containers/array-callback-call.js.map +1 -1
- package/dist/frontend/lowering/containers/array-callbacks.js +338 -18
- package/dist/frontend/lowering/containers/array-callbacks.js.map +1 -1
- package/dist/frontend/lowering/containers/array-concat.js +10 -0
- package/dist/frontend/lowering/containers/array-concat.js.map +1 -1
- package/dist/frontend/lowering/containers/array-methods.js +15 -0
- package/dist/frontend/lowering/containers/array-methods.js.map +1 -1
- package/dist/frontend/lowering/containers/array-pipelines.js +19 -8
- package/dist/frontend/lowering/containers/array-pipelines.js.map +1 -1
- package/dist/frontend/lowering/containers/bytes.js +2 -1
- package/dist/frontend/lowering/containers/bytes.js.map +1 -1
- package/dist/frontend/lowering/containers/callback-arguments.js +3 -0
- package/dist/frontend/lowering/containers/callback-arguments.js.map +1 -1
- package/dist/frontend/lowering/containers/collection-methods.js +7 -2
- package/dist/frontend/lowering/containers/collection-methods.js.map +1 -1
- package/dist/frontend/lowering/containers/filter-predicates.d.ts +6 -0
- package/dist/frontend/lowering/containers/filter-predicates.js +205 -0
- package/dist/frontend/lowering/containers/filter-predicates.js.map +1 -0
- package/dist/frontend/lowering/containers/indexed-objects.d.ts +0 -12
- package/dist/frontend/lowering/containers/indexed-objects.js +46 -7
- package/dist/frontend/lowering/containers/indexed-objects.js.map +1 -1
- package/dist/frontend/lowering/containers/string-and-regexp.js +55 -9
- package/dist/frontend/lowering/containers/string-and-regexp.js.map +1 -1
- package/dist/frontend/lowering/containers/string-replacement.js +43 -19
- package/dist/frontend/lowering/containers/string-replacement.js.map +1 -1
- package/dist/frontend/lowering/dispatch-sites.js +15 -1
- package/dist/frontend/lowering/dispatch-sites.js.map +1 -1
- package/dist/frontend/lowering/divergences.js +9 -1
- package/dist/frontend/lowering/divergences.js.map +1 -1
- package/dist/frontend/lowering/error-methods.js +47 -2
- package/dist/frontend/lowering/error-methods.js.map +1 -1
- package/dist/frontend/lowering/expressions/array-literals.js +47 -0
- package/dist/frontend/lowering/expressions/array-literals.js.map +1 -1
- package/dist/frontend/lowering/expressions/binary.js +36 -2
- package/dist/frontend/lowering/expressions/binary.js.map +1 -1
- package/dist/frontend/lowering/expressions/element-access.js +90 -13
- package/dist/frontend/lowering/expressions/element-access.js.map +1 -1
- package/dist/frontend/lowering/expressions/identifiers.js +33 -4
- package/dist/frontend/lowering/expressions/identifiers.js.map +1 -1
- package/dist/frontend/lowering/expressions/narrowing.js +95 -1
- package/dist/frontend/lowering/expressions/narrowing.js.map +1 -1
- package/dist/frontend/lowering/expressions/nullish-assignment.js +3 -1
- package/dist/frontend/lowering/expressions/nullish-assignment.js.map +1 -1
- package/dist/frontend/lowering/expressions/object-literals.d.ts +10 -0
- package/dist/frontend/lowering/expressions/object-literals.js +138 -51
- package/dist/frontend/lowering/expressions/object-literals.js.map +1 -1
- package/dist/frontend/lowering/expressions/optional-chains.js +12 -0
- package/dist/frontend/lowering/expressions/optional-chains.js.map +1 -1
- package/dist/frontend/lowering/expressions/property-access.js +113 -11
- package/dist/frontend/lowering/expressions/property-access.js.map +1 -1
- package/dist/frontend/lowering/expressions/relational.js +212 -33
- package/dist/frontend/lowering/expressions/relational.js.map +1 -1
- package/dist/frontend/lowering/expressions/union-fields.js +4 -0
- package/dist/frontend/lowering/expressions/union-fields.js.map +1 -1
- package/dist/frontend/lowering/expressions/updates.js +22 -3
- package/dist/frontend/lowering/expressions/updates.js.map +1 -1
- package/dist/frontend/lowering/frozen-records.d.ts +28 -0
- package/dist/frontend/lowering/frozen-records.js +322 -0
- package/dist/frontend/lowering/frozen-records.js.map +1 -0
- package/dist/frontend/lowering/function-returns.js +49 -0
- package/dist/frontend/lowering/function-returns.js.map +1 -1
- package/dist/frontend/lowering/generic-functions.js +7 -2
- package/dist/frontend/lowering/generic-functions.js.map +1 -1
- package/dist/frontend/lowering/iterable-values.d.ts +49 -0
- package/dist/frontend/lowering/iterable-values.js +297 -0
- package/dist/frontend/lowering/iterable-values.js.map +1 -0
- package/dist/frontend/lowering/iterator-adapters.js +186 -1
- package/dist/frontend/lowering/iterator-adapters.js.map +1 -1
- package/dist/frontend/lowering/js-class-fields.d.ts +8 -0
- package/dist/frontend/lowering/js-class-fields.js +45 -10
- package/dist/frontend/lowering/js-class-fields.js.map +1 -1
- package/dist/frontend/lowering/key-order-witness.d.ts +18 -3
- package/dist/frontend/lowering/key-order-witness.js +770 -22
- package/dist/frontend/lowering/key-order-witness.js.map +1 -1
- package/dist/frontend/lowering/key-order-witness.test.js +428 -8
- package/dist/frontend/lowering/key-order-witness.test.js.map +1 -1
- package/dist/frontend/lowering/lower-async-iteration.js +4 -1
- package/dist/frontend/lowering/lower-async-iteration.js.map +1 -1
- package/dist/frontend/lowering/lower-calls.d.ts +7 -0
- package/dist/frontend/lowering/lower-calls.js +443 -41
- package/dist/frontend/lowering/lower-calls.js.map +1 -1
- package/dist/frontend/lowering/lower-classes.d.ts +11 -2
- package/dist/frontend/lowering/lower-classes.js +302 -22
- package/dist/frontend/lowering/lower-classes.js.map +1 -1
- package/dist/frontend/lowering/lower-dgram.js +3 -1
- package/dist/frontend/lowering/lower-dgram.js.map +1 -1
- package/dist/frontend/lowering/lower-exprs.js +10 -2
- package/dist/frontend/lowering/lower-exprs.js.map +1 -1
- package/dist/frontend/lowering/lower-functions.d.ts +11 -0
- package/dist/frontend/lowering/lower-functions.js +83 -0
- package/dist/frontend/lowering/lower-functions.js.map +1 -1
- package/dist/frontend/lowering/lower-generators.js +41 -31
- package/dist/frontend/lowering/lower-generators.js.map +1 -1
- package/dist/frontend/lowering/lower-global-value.js +6 -3
- package/dist/frontend/lowering/lower-global-value.js.map +1 -1
- package/dist/frontend/lowering/lower-inspect.js +18 -6
- package/dist/frontend/lowering/lower-inspect.js.map +1 -1
- package/dist/frontend/lowering/lower-modules.js +32 -0
- package/dist/frontend/lowering/lower-modules.js.map +1 -1
- package/dist/frontend/lowering/lower-namespaces.js +5 -1
- package/dist/frontend/lowering/lower-namespaces.js.map +1 -1
- package/dist/frontend/lowering/lower-server.js +2 -2
- package/dist/frontend/lowering/lower-server.js.map +1 -1
- package/dist/frontend/lowering/lower-stdlib.d.ts +5 -0
- package/dist/frontend/lowering/lower-stdlib.js +30 -0
- package/dist/frontend/lowering/lower-stdlib.js.map +1 -1
- package/dist/frontend/lowering/lower-stmts.d.ts +23 -0
- package/dist/frontend/lowering/lower-stmts.js +454 -48
- package/dist/frontend/lowering/lower-stmts.js.map +1 -1
- package/dist/frontend/lowering/lower-stream.d.ts +20 -2
- package/dist/frontend/lowering/lower-stream.js +1483 -156
- package/dist/frontend/lowering/lower-stream.js.map +1 -1
- package/dist/frontend/lowering/lowerer.d.ts +77 -6
- package/dist/frontend/lowering/lowerer.js +313 -29
- package/dist/frontend/lowering/lowerer.js.map +1 -1
- package/dist/frontend/lowering/module-namespace-elements.d.ts +11 -1
- package/dist/frontend/lowering/module-namespace-elements.js +82 -5
- package/dist/frontend/lowering/module-namespace-elements.js.map +1 -1
- package/dist/frontend/lowering/new-target.d.ts +12 -0
- package/dist/frontend/lowering/new-target.js +280 -0
- package/dist/frontend/lowering/new-target.js.map +1 -0
- package/dist/frontend/lowering/surfaces.d.ts +3 -0
- package/dist/frontend/lowering/surfaces.js +18 -6
- package/dist/frontend/lowering/surfaces.js.map +1 -1
- package/dist/frontend/lowering/undefined-index.d.ts +27 -0
- package/dist/frontend/lowering/undefined-index.js +82 -0
- package/dist/frontend/lowering/undefined-index.js.map +1 -0
- package/dist/frontend/lowering/var-hoisting.js +29 -13
- package/dist/frontend/lowering/var-hoisting.js.map +1 -1
- package/dist/frontend/lowering/width-lift.d.ts +18 -0
- package/dist/frontend/npm-static-bundled-chunks.js +9 -11
- package/dist/frontend/npm-static-bundled-chunks.js.map +1 -1
- package/dist/frontend/npm-static-bundled-chunks.test.js +6 -5
- package/dist/frontend/npm-static-bundled-chunks.test.js.map +1 -1
- package/dist/frontend/npm-static-rewrite-syntax.js +9 -1
- package/dist/frontend/npm-static-rewrite-syntax.js.map +1 -1
- package/dist/frontend/npm-static.js +4 -20
- package/dist/frontend/npm-static.js.map +1 -1
- package/dist/frontend/package-shims.d.ts +3 -0
- package/dist/frontend/package-shims.js +71 -8
- package/dist/frontend/package-shims.js.map +1 -1
- package/dist/frontend/pipeline.js +18 -10
- package/dist/frontend/pipeline.js.map +1 -1
- package/dist/frontend/process-fork.d.ts +25 -0
- package/dist/frontend/process-fork.js +2 -0
- package/dist/frontend/process-fork.js.map +1 -0
- package/dist/frontend/program.d.ts +8 -1
- package/dist/frontend/program.js +484 -69
- package/dist/frontend/program.js.map +1 -1
- package/dist/frontend/program.test.js +43 -3
- package/dist/frontend/program.test.js.map +1 -1
- package/dist/frontend/token-equivalence.d.ts +3 -0
- package/dist/frontend/token-equivalence.js +409 -0
- package/dist/frontend/token-equivalence.js.map +1 -0
- package/dist/frontend/token-equivalence.test.d.ts +1 -0
- package/dist/frontend/token-equivalence.test.js +67 -0
- package/dist/frontend/token-equivalence.test.js.map +1 -0
- package/dist/frontend/ts7/ast-node.d.ts +22 -0
- package/dist/frontend/ts7/ast-node.js +1048 -103
- package/dist/frontend/ts7/ast-node.js.map +1 -1
- package/dist/frontend/ts7/ast-node.test.js +24 -0
- package/dist/frontend/ts7/ast-node.test.js.map +1 -1
- package/dist/frontend/ts7/ast-wire.d.ts +4 -3
- package/dist/frontend/ts7/ast-wire.js +34 -24
- package/dist/frontend/ts7/ast-wire.js.map +1 -1
- package/dist/frontend/ts7/ast-wire.test.js +23 -0
- package/dist/frontend/ts7/ast-wire.test.js.map +1 -1
- package/dist/frontend/ts7/checker-backend.d.ts +3 -4
- package/dist/frontend/ts7/checker-backend.js +2 -2
- package/dist/frontend/ts7/checker-backend.js.map +1 -1
- package/dist/frontend/ts7/checker-backend.test.js +5 -9
- package/dist/frontend/ts7/checker-backend.test.js.map +1 -1
- package/dist/frontend/ts7/checker.d.ts +4 -0
- package/dist/frontend/ts7/checker.js +7 -0
- package/dist/frontend/ts7/checker.js.map +1 -1
- package/dist/frontend/ts7/lib-diagnostics.d.ts +24 -0
- package/dist/frontend/ts7/lib-diagnostics.js +307 -0
- package/dist/frontend/ts7/lib-diagnostics.js.map +1 -0
- package/dist/frontend/ts7/lib-diagnostics.test.d.ts +1 -0
- package/dist/frontend/ts7/lib-diagnostics.test.js +199 -0
- package/dist/frontend/ts7/lib-diagnostics.test.js.map +1 -0
- package/dist/frontend/ts7/program-host.d.ts +7 -0
- package/dist/frontend/ts7/program-host.js +25 -2
- package/dist/frontend/ts7/program-host.js.map +1 -1
- package/dist/frontend/ts7/session.d.ts +14 -1
- package/dist/frontend/ts7/session.js +22 -0
- package/dist/frontend/ts7/session.js.map +1 -1
- package/dist/frontend/type-mapper.d.ts +13 -1
- package/dist/frontend/type-mapper.js +191 -11
- package/dist/frontend/type-mapper.js.map +1 -1
- package/dist/index.d.ts +0 -5
- package/dist/index.js +34 -4
- package/dist/index.js.map +1 -1
- package/dist/ir/analysis.js +5 -3
- package/dist/ir/analysis.js.map +1 -1
- package/dist/ir/array-length-stability.d.ts +4 -0
- package/dist/ir/array-length-stability.js +19 -6
- package/dist/ir/array-length-stability.js.map +1 -1
- package/dist/ir/array-length-stability.test.js +24 -0
- package/dist/ir/array-length-stability.test.js.map +1 -1
- package/dist/ir/builtin-effects.d.ts +7 -0
- package/dist/ir/builtin-effects.js +52 -0
- package/dist/ir/builtin-effects.js.map +1 -1
- package/dist/ir/builtin-signatures.d.ts +6 -4
- package/dist/ir/builtin-signatures.js +166 -13
- package/dist/ir/builtin-signatures.js.map +1 -1
- package/dist/ir/callback-specialization.d.ts +2 -1
- package/dist/ir/callback-specialization.js +23 -18
- package/dist/ir/callback-specialization.js.map +1 -1
- package/dist/ir/char-unit-locals.d.ts +19 -0
- package/dist/ir/char-unit-locals.js +185 -0
- package/dist/ir/char-unit-locals.js.map +1 -0
- package/dist/ir/char-unit-locals.test.d.ts +1 -0
- package/dist/ir/char-unit-locals.test.js +94 -0
- package/dist/ir/char-unit-locals.test.js.map +1 -0
- package/dist/ir/final-fields.d.ts +2 -1
- package/dist/ir/final-fields.js +14 -16
- package/dist/ir/final-fields.js.map +1 -1
- package/dist/ir/function-references.d.ts +2 -0
- package/dist/ir/function-references.js +2 -0
- package/dist/ir/function-references.js.map +1 -1
- package/dist/ir/function-references.test.js +3 -0
- package/dist/ir/function-references.test.js.map +1 -1
- package/dist/ir/initializer-bindings.d.ts +2 -1
- package/dist/ir/initializer-bindings.js +27 -20
- package/dist/ir/initializer-bindings.js.map +1 -1
- package/dist/ir/int32-arrays.d.ts +108 -0
- package/dist/ir/int32-arrays.js +831 -0
- package/dist/ir/int32-arrays.js.map +1 -0
- package/dist/ir/int32-slots.d.ts +24 -2
- package/dist/ir/int32-slots.js +259 -57
- package/dist/ir/int32-slots.js.map +1 -1
- package/dist/ir/integer-loops.d.ts +3 -3
- package/dist/ir/integer-loops.js +14 -6
- package/dist/ir/integer-loops.js.map +1 -1
- package/dist/ir/integer-loops.test.js +10 -0
- package/dist/ir/integer-loops.test.js.map +1 -1
- package/dist/ir/integer-ranges.d.ts +5 -0
- package/dist/ir/integer-ranges.js +125 -12
- package/dist/ir/integer-ranges.js.map +1 -1
- package/dist/ir/integer-ranges.test.js +30 -0
- package/dist/ir/integer-ranges.test.js.map +1 -1
- package/dist/ir/ir.d.ts +70 -7
- package/dist/ir/ir.js +58 -1
- package/dist/ir/ir.js.map +1 -1
- package/dist/ir/ir.test.js +21 -1
- package/dist/ir/ir.test.js.map +1 -1
- package/dist/ir/js-ic.d.ts +19 -2
- package/dist/ir/js-ic.js +95 -11
- package/dist/ir/js-ic.js.map +1 -1
- package/dist/ir/js-ic.test.js +188 -0
- package/dist/ir/js-ic.test.js.map +1 -1
- package/dist/ir/node-index.d.ts +57 -0
- package/dist/ir/node-index.js +215 -0
- package/dist/ir/node-index.js.map +1 -0
- package/dist/ir/paired-while-loops.d.ts +25 -0
- package/dist/ir/paired-while-loops.js +335 -0
- package/dist/ir/paired-while-loops.js.map +1 -0
- package/dist/ir/paired-while-loops.test.d.ts +1 -0
- package/dist/ir/paired-while-loops.test.js +163 -0
- package/dist/ir/paired-while-loops.test.js.map +1 -0
- package/dist/ir/parameter-versions.d.ts +25 -0
- package/dist/ir/parameter-versions.js +300 -0
- package/dist/ir/parameter-versions.js.map +1 -0
- package/dist/ir/runtime-features.d.ts +34 -13
- package/dist/ir/runtime-features.js +152 -38
- package/dist/ir/runtime-features.js.map +1 -1
- package/dist/ir/serialize.d.ts +12 -2
- package/dist/ir/serialize.js +16 -3
- package/dist/ir/serialize.js.map +1 -1
- package/dist/ir/serialize.test.js +17 -0
- package/dist/ir/serialize.test.js.map +1 -1
- package/dist/ir/traverse.js +18 -6
- package/dist/ir/traverse.js.map +1 -1
- package/dist/ir/validate.js +122 -36
- package/dist/ir/validate.js.map +1 -1
- package/dist/library/ir-policy.js +2 -0
- package/dist/library/ir-policy.js.map +1 -1
- package/dist/native/cache.d.ts +6 -1
- package/dist/native/cache.js +28 -5
- package/dist/native/cache.js.map +1 -1
- package/dist/native/cache.test.js +16 -2
- package/dist/native/cache.test.js.map +1 -1
- package/dist/native/cli.js +21 -1
- package/dist/native/cli.js.map +1 -1
- package/dist/native/compiler.js +8 -6
- package/dist/native/compiler.js.map +1 -1
- package/dist/native/executable-cache.d.ts +1 -1
- package/dist/native/executable-cache.js +2 -2
- package/dist/native/executable-cache.js.map +1 -1
- package/dist/native/prepare.d.ts +3 -1
- package/dist/native/prepare.js +119 -31
- package/dist/native/prepare.js.map +1 -1
- package/dist/native/prepare.test.js +78 -18
- package/dist/native/prepare.test.js.map +1 -1
- package/dist/native/sanitizer.test.js +2 -0
- package/dist/native/sanitizer.test.js.map +1 -1
- package/dist/native/text-file.d.ts +13 -3
- package/dist/native/text-file.js +63 -9
- package/dist/native/text-file.js.map +1 -1
- package/dist/native/text-file.test.d.ts +1 -0
- package/dist/native/text-file.test.js +49 -0
- package/dist/native/text-file.test.js.map +1 -0
- package/dist/native/toolchain.js +4 -4
- package/dist/native/toolchain.js.map +1 -1
- package/dist/native/toolchain.test.js +3 -3
- package/dist/native/toolchain.test.js.map +1 -1
- package/package.json +21 -21
- package/shims/chalk/v5.ts +688 -0
- package/shims/hono-node-server/v2.ts +645 -0
- package/shims/hot-shots/client.ts +1126 -0
- package/shims/hot-shots/v8-unix-dgram.ts +8 -0
- package/shims/hot-shots/v8.ts +8 -0
- package/surface-manifest.json +26 -4
|
@@ -0,0 +1,854 @@
|
|
|
1
|
+
/* The declaration-typed boundary's projection pass.
|
|
2
|
+
*
|
|
3
|
+
* An opted-in npm package compiles from its JavaScript, and the program the
|
|
4
|
+
* lowering compiles types it from that JavaScript: where the package's
|
|
5
|
+
* published declarations are richer (zod's `z.infer`), user code sees `any`.
|
|
6
|
+
* This pass asks the DECLARATION world (the same entry checked against the
|
|
7
|
+
* packages' declarations) for the types of those user-code positions. Where
|
|
8
|
+
* the declared type is pure data, it is printed as structural TypeScript into
|
|
9
|
+
* a generated global declaration file, and the user file is rewritten in the
|
|
10
|
+
* lowering world:
|
|
11
|
+
*
|
|
12
|
+
* - type positions that name package types (`z.infer<typeof S>`) name the
|
|
13
|
+
* projected alias instead;
|
|
14
|
+
* - package-produced expressions (`S.parse(x)`, `r.data`) are wrapped in
|
|
15
|
+
* `(<expr> as __scriptc_decl_N)`, the boundary cast;
|
|
16
|
+
* - untyped parameters of user callbacks the package calls gain the alias.
|
|
17
|
+
*
|
|
18
|
+
* The lowering world is then rebuilt from the rewritten text, so the
|
|
19
|
+
* checker's own inference carries the projected types through the rest of
|
|
20
|
+
* the user code, and the lowering sees an ordinary checked cast at each
|
|
21
|
+
* crossing (lowered with `adopt`, see narrowing.ts). No edit adds or removes
|
|
22
|
+
* a line break, so positions keep their lines. IR records are structural,
|
|
23
|
+
* so a printed type interns to the same shape as any equal type.
|
|
24
|
+
*
|
|
25
|
+
* Only programs whose user code has such positions are rewritten; every
|
|
26
|
+
* other program is untouched (the zero-cost rule). See
|
|
27
|
+
* scriptc-perf/results/design-decl-boundary/DESIGN.md. */
|
|
28
|
+
import * as ts from "./ts7/adapter.js";
|
|
29
|
+
/** Alias names of projected types start with this prefix; the lowering
|
|
30
|
+
* recognizes boundary casts and parameters by it. */
|
|
31
|
+
export const DECL_BOUNDARY_PREFIX = "__scriptc_decl_";
|
|
32
|
+
/** The generated declaration file's base name. */
|
|
33
|
+
export const DECL_BOUNDARY_FILE = "__scriptc_decl_boundary__.d.ts";
|
|
34
|
+
export function isDeclBoundaryFile(fileName) {
|
|
35
|
+
return fileName.split("\\").join("/").endsWith(`/${DECL_BOUNDARY_FILE}`);
|
|
36
|
+
}
|
|
37
|
+
export function isDeclBoundaryTypeName(name) {
|
|
38
|
+
return name.startsWith(DECL_BOUNDARY_PREFIX);
|
|
39
|
+
}
|
|
40
|
+
/** True for `T` in `x as T` / `(p: T) =>` when T names a projected alias. */
|
|
41
|
+
export function isDeclBoundaryTypeNode(node) {
|
|
42
|
+
return (node !== undefined &&
|
|
43
|
+
ts.isTypeReferenceNode(node) &&
|
|
44
|
+
ts.isIdentifier(node.typeName) &&
|
|
45
|
+
isDeclBoundaryTypeName(node.typeName.text) &&
|
|
46
|
+
node.typeArguments === undefined);
|
|
47
|
+
}
|
|
48
|
+
function isPackageDeclarationFile(sf) {
|
|
49
|
+
if (sf === undefined || !sf.isDeclarationFile)
|
|
50
|
+
return false;
|
|
51
|
+
const f = sf.fileName.split("\\").join("/");
|
|
52
|
+
// The TypeScript standard library ships inside node_modules too.
|
|
53
|
+
if (/(^|\/)lib(\.[\w.-]+)?\.d\.ts$/.test(f) || f.startsWith("bundled:"))
|
|
54
|
+
return false;
|
|
55
|
+
return (f.includes("/node_modules/") &&
|
|
56
|
+
!f.includes("/node_modules/@types/node/") &&
|
|
57
|
+
!f.includes("/node_modules/typescript/") &&
|
|
58
|
+
!f.includes("/node_modules/@typescript/"));
|
|
59
|
+
}
|
|
60
|
+
function declaredInPackage(symbol) {
|
|
61
|
+
if (symbol === undefined)
|
|
62
|
+
return false;
|
|
63
|
+
return symbol.declarations.some((d) => isPackageDeclarationFile(ts.getSourceFileOfNode(d)));
|
|
64
|
+
}
|
|
65
|
+
/** The parts of a call signature's declaration that pass-through detection
|
|
66
|
+
* reads, for the declaration kinds a resolved call signature has. */
|
|
67
|
+
function signatureParts(node) {
|
|
68
|
+
if (node === undefined)
|
|
69
|
+
return null;
|
|
70
|
+
if (ts.isFunctionTypeNode(node))
|
|
71
|
+
return {
|
|
72
|
+
typeParameters: node.typeParameters?.nodes ?? [],
|
|
73
|
+
parameters: node.parameters.nodes,
|
|
74
|
+
type: node.type,
|
|
75
|
+
};
|
|
76
|
+
if (ts.isFunctionDeclaration(node))
|
|
77
|
+
return {
|
|
78
|
+
typeParameters: node.typeParameters?.nodes ?? [],
|
|
79
|
+
parameters: node.parameters.nodes,
|
|
80
|
+
type: node.type,
|
|
81
|
+
};
|
|
82
|
+
if (ts.isMethodDeclaration(node))
|
|
83
|
+
return {
|
|
84
|
+
typeParameters: node.typeParameters?.nodes ?? [],
|
|
85
|
+
parameters: node.parameters.nodes,
|
|
86
|
+
type: node.type,
|
|
87
|
+
};
|
|
88
|
+
if (ts.isMethodSignatureDeclaration(node))
|
|
89
|
+
return {
|
|
90
|
+
typeParameters: node.typeParameters?.nodes ?? [],
|
|
91
|
+
parameters: node.parameters.nodes,
|
|
92
|
+
type: node.type,
|
|
93
|
+
};
|
|
94
|
+
if (ts.isCallSignatureDeclaration(node))
|
|
95
|
+
return {
|
|
96
|
+
typeParameters: node.typeParameters?.nodes ?? [],
|
|
97
|
+
parameters: node.parameters.nodes,
|
|
98
|
+
type: node.type,
|
|
99
|
+
};
|
|
100
|
+
return null;
|
|
101
|
+
}
|
|
102
|
+
/** A signature that returns one of its own type parameters which also types
|
|
103
|
+
* a parameter (`<T extends object>(obj: T) => T`) hands back the argument
|
|
104
|
+
* or something standing in for it, a proxy or a marked object, whose
|
|
105
|
+
* identity the package may track (Effect's `Equal.byReference`). Its result
|
|
106
|
+
* type comes from the caller's argument, not from data the package
|
|
107
|
+
* declares, so the boundary leaves it alone: converting it would build a
|
|
108
|
+
* separate native value. */
|
|
109
|
+
function passesArgumentThrough(declaration) {
|
|
110
|
+
const sig = signatureParts(declaration);
|
|
111
|
+
if (sig === null || sig.type === undefined || !ts.isTypeReferenceNode(sig.type))
|
|
112
|
+
return false;
|
|
113
|
+
const ret = sig.type;
|
|
114
|
+
if (!ts.isIdentifier(ret.typeName) || ret.typeArguments !== undefined)
|
|
115
|
+
return false;
|
|
116
|
+
const name = ret.typeName.text;
|
|
117
|
+
if (!sig.typeParameters.some((tp) => tp.name.text === name))
|
|
118
|
+
return false;
|
|
119
|
+
return sig.parameters.some((param) => param.type !== undefined &&
|
|
120
|
+
ts.isTypeReferenceNode(param.type) &&
|
|
121
|
+
ts.isIdentifier(param.type.typeName) &&
|
|
122
|
+
param.type.typeName.text === name);
|
|
123
|
+
}
|
|
124
|
+
function declaredInUserFile(symbol) {
|
|
125
|
+
if (symbol === undefined)
|
|
126
|
+
return false;
|
|
127
|
+
const decls = symbol.declarations;
|
|
128
|
+
return (decls.length > 0 &&
|
|
129
|
+
decls.every((d) => {
|
|
130
|
+
const sf = ts.getSourceFileOfNode(d);
|
|
131
|
+
return !sf.isDeclarationFile && !sf.fileName.split("\\").join("/").includes("/node_modules/");
|
|
132
|
+
}));
|
|
133
|
+
}
|
|
134
|
+
const ANYISH = ts.TypeFlags.Any | ts.TypeFlags.Unknown;
|
|
135
|
+
const READONLY_CHECK_FLAG = 8;
|
|
136
|
+
/** Prints declaration-world types as structural TypeScript, or answers null
|
|
137
|
+
* when a type is not pure data (DESIGN.md §4.3). */
|
|
138
|
+
class TypePrinter {
|
|
139
|
+
checker;
|
|
140
|
+
aliases = new Map();
|
|
141
|
+
declarations = [];
|
|
142
|
+
inProgress = new Map();
|
|
143
|
+
constructor(checker) {
|
|
144
|
+
this.checker = checker;
|
|
145
|
+
}
|
|
146
|
+
/** The alias naming a projectable type, or null. Top-level any/unknown
|
|
147
|
+
* never projects. */
|
|
148
|
+
project(type) {
|
|
149
|
+
if (type.flags & ANYISH)
|
|
150
|
+
return null;
|
|
151
|
+
const text = this.print(type, 0);
|
|
152
|
+
if (text === null || text === "unknown")
|
|
153
|
+
return null;
|
|
154
|
+
let name = this.aliases.get(text);
|
|
155
|
+
if (name === undefined) {
|
|
156
|
+
name = `${DECL_BOUNDARY_PREFIX}${this.aliases.size}`;
|
|
157
|
+
this.aliases.set(text, name);
|
|
158
|
+
this.declarations.push(`type ${name} = ${text};`);
|
|
159
|
+
}
|
|
160
|
+
return name;
|
|
161
|
+
}
|
|
162
|
+
print(type, depth) {
|
|
163
|
+
if (depth > 24)
|
|
164
|
+
return null;
|
|
165
|
+
const f = type.flags;
|
|
166
|
+
if (f & ANYISH)
|
|
167
|
+
return "unknown";
|
|
168
|
+
if (f & ts.TypeFlags.String)
|
|
169
|
+
return "string";
|
|
170
|
+
if (f & ts.TypeFlags.Number)
|
|
171
|
+
return "number";
|
|
172
|
+
if (f & ts.TypeFlags.Boolean)
|
|
173
|
+
return "boolean";
|
|
174
|
+
if (f & ts.TypeFlags.Null)
|
|
175
|
+
return "null";
|
|
176
|
+
if (f & ts.TypeFlags.Undefined)
|
|
177
|
+
return "undefined";
|
|
178
|
+
if (f & ts.TypeFlags.EnumLiteral || f & ts.TypeFlags.Enum)
|
|
179
|
+
return null;
|
|
180
|
+
if (f & ts.TypeFlags.BooleanLiteral)
|
|
181
|
+
return type.intrinsicName === "true" ? "true" : "false";
|
|
182
|
+
if (f & ts.TypeFlags.StringLiteral)
|
|
183
|
+
return JSON.stringify(String(type.value));
|
|
184
|
+
if (f & ts.TypeFlags.NumberLiteral) {
|
|
185
|
+
const v = Number(type.value);
|
|
186
|
+
return Number.isFinite(v) ? String(v) : null;
|
|
187
|
+
}
|
|
188
|
+
if (type.isUnionType()) {
|
|
189
|
+
const parts = [];
|
|
190
|
+
for (const arm of type.getTypes()) {
|
|
191
|
+
const p = this.print(arm, depth + 1);
|
|
192
|
+
if (p === null || p === "unknown")
|
|
193
|
+
return null;
|
|
194
|
+
if (!parts.includes(p))
|
|
195
|
+
parts.push(p);
|
|
196
|
+
}
|
|
197
|
+
// `true | false` reads better as boolean, and maps the same.
|
|
198
|
+
const t = parts.indexOf("true");
|
|
199
|
+
const fl = parts.indexOf("false");
|
|
200
|
+
if (t >= 0 && fl >= 0) {
|
|
201
|
+
parts.splice(Math.max(t, fl), 1);
|
|
202
|
+
parts.splice(Math.min(t, fl), 1, "boolean");
|
|
203
|
+
}
|
|
204
|
+
return parts.map((p) => (/=>/.test(p) ? `(${p})` : p)).join(" | ");
|
|
205
|
+
}
|
|
206
|
+
if (type.isIntersectionType()) {
|
|
207
|
+
// Brands: drop members that only carry unique-symbol keys.
|
|
208
|
+
const kept = type.getTypes().filter((m) => !this.isBrandOnly(m));
|
|
209
|
+
if (kept.length === 1)
|
|
210
|
+
return this.print(kept[0], depth + 1);
|
|
211
|
+
if (kept.length === 0)
|
|
212
|
+
return null;
|
|
213
|
+
if (!kept.every((m) => (m.flags & ts.TypeFlags.Object) !== 0))
|
|
214
|
+
return null;
|
|
215
|
+
return this.printObject(type, depth);
|
|
216
|
+
}
|
|
217
|
+
if (f & ts.TypeFlags.Object)
|
|
218
|
+
return this.printObject(type, depth);
|
|
219
|
+
return null;
|
|
220
|
+
}
|
|
221
|
+
isBrandOnly(type) {
|
|
222
|
+
if (!(type.flags & ts.TypeFlags.Object) || type.isIntersectionType())
|
|
223
|
+
return false;
|
|
224
|
+
const props = this.checker.getPropertiesOfType(type);
|
|
225
|
+
return props.length > 0 && props.every((p) => String(p.escapedName).startsWith("__@"));
|
|
226
|
+
}
|
|
227
|
+
/** Whether an interface type and every type it extends are declared in
|
|
228
|
+
* user files. */
|
|
229
|
+
userInterface(type, seen = new Set()) {
|
|
230
|
+
if (!declaredInUserFile(type.getSymbol()))
|
|
231
|
+
return false;
|
|
232
|
+
const target = type.isTypeReference() ? type.getTarget() : type;
|
|
233
|
+
if (target === undefined || !target.isClassOrInterface() || seen.has(target))
|
|
234
|
+
return true;
|
|
235
|
+
seen.add(target);
|
|
236
|
+
return this.checker.getBaseTypes(target).every((base) => this.userInterface(base, seen));
|
|
237
|
+
}
|
|
238
|
+
printObject(type, depth) {
|
|
239
|
+
const checker = this.checker;
|
|
240
|
+
if (checker.isArrayType(type)) {
|
|
241
|
+
const [elem] = checker.getTypeArguments(type);
|
|
242
|
+
if (elem === undefined)
|
|
243
|
+
return null;
|
|
244
|
+
const e = this.print(elem, depth + 1);
|
|
245
|
+
if (e === null)
|
|
246
|
+
return null;
|
|
247
|
+
const ro = type.getSymbol()?.escapedName === "ReadonlyArray" ? "readonly " : "";
|
|
248
|
+
return `${ro}(${e})[]`;
|
|
249
|
+
}
|
|
250
|
+
if (checker.isTupleType(type)) {
|
|
251
|
+
const target = type.getTarget() ?? type;
|
|
252
|
+
const flags = target.elementFlags ?? [];
|
|
253
|
+
if (flags.some((fl) => fl !== ts.ElementFlags.Required))
|
|
254
|
+
return null;
|
|
255
|
+
const elems = checker.getTypeArguments(type).slice(0, flags.length);
|
|
256
|
+
const out = [];
|
|
257
|
+
for (const e of elems) {
|
|
258
|
+
const p = this.print(e, depth + 1);
|
|
259
|
+
if (p === null)
|
|
260
|
+
return null;
|
|
261
|
+
out.push(p);
|
|
262
|
+
}
|
|
263
|
+
return `${target.readonly === true ? "readonly " : ""}[${out.join(", ")}]`;
|
|
264
|
+
}
|
|
265
|
+
const symbol = type.getSymbol();
|
|
266
|
+
if (symbol !== undefined) {
|
|
267
|
+
if (symbol.flags & (ts.SymbolFlags.Class | ts.SymbolFlags.Function | ts.SymbolFlags.Method))
|
|
268
|
+
return null;
|
|
269
|
+
// Interfaces: only user-declared ones describe plain data reliably
|
|
270
|
+
// (package and lib interfaces often describe class instances), and
|
|
271
|
+
// only when every interface they extend is user-declared too: a user
|
|
272
|
+
// interface extending a package one (effect's Request.Request)
|
|
273
|
+
// inherits members the package's own constructors create.
|
|
274
|
+
if (symbol.flags & ts.SymbolFlags.Interface && !this.userInterface(type))
|
|
275
|
+
return null;
|
|
276
|
+
}
|
|
277
|
+
if (checker.getCallSignatures(type).length > 0 ||
|
|
278
|
+
checker.getConstructSignatures(type).length > 0)
|
|
279
|
+
return null;
|
|
280
|
+
const memo = this.inProgress.get(type.id);
|
|
281
|
+
if (memo !== undefined) {
|
|
282
|
+
memo.name ??= `${DECL_BOUNDARY_PREFIX}r${type.id}`;
|
|
283
|
+
return memo.name;
|
|
284
|
+
}
|
|
285
|
+
const frame = { name: null };
|
|
286
|
+
this.inProgress.set(type.id, frame);
|
|
287
|
+
try {
|
|
288
|
+
const members = [];
|
|
289
|
+
let readonlyCount = 0;
|
|
290
|
+
const props = checker.getPropertiesOfType(type);
|
|
291
|
+
for (const prop of props) {
|
|
292
|
+
const key = String(prop.escapedName);
|
|
293
|
+
if (key.startsWith("__@"))
|
|
294
|
+
continue; // symbol-keyed (brands)
|
|
295
|
+
if (prop.flags &
|
|
296
|
+
(ts.SymbolFlags.Method | ts.SymbolFlags.GetAccessor | ts.SymbolFlags.SetAccessor))
|
|
297
|
+
return null;
|
|
298
|
+
const propType = checker.getTypeOfSymbol(prop);
|
|
299
|
+
const optional = (prop.flags & ts.SymbolFlags.Optional) !== 0;
|
|
300
|
+
let p = this.print(propType, depth + 1);
|
|
301
|
+
if (p === null)
|
|
302
|
+
return null;
|
|
303
|
+
const readonly = (prop.checkFlags & READONLY_CHECK_FLAG) !== 0 || hasReadonlyModifier(prop);
|
|
304
|
+
if (readonly)
|
|
305
|
+
readonlyCount++;
|
|
306
|
+
const name = /^[A-Za-z_$][\w$]*$/.test(key) ? key : JSON.stringify(key);
|
|
307
|
+
if (optional && !/\bundefined\b/.test(p))
|
|
308
|
+
p = `${p} | undefined`;
|
|
309
|
+
members.push(`${readonly ? "readonly " : ""}${name}${optional ? "?" : ""}: ${p}`);
|
|
310
|
+
}
|
|
311
|
+
for (const info of checker.getIndexInfosOfType(type)) {
|
|
312
|
+
if (!(info.keyType.flags & ts.TypeFlags.String))
|
|
313
|
+
return null;
|
|
314
|
+
const v = this.print(info.type, depth + 1);
|
|
315
|
+
if (v === null)
|
|
316
|
+
return null;
|
|
317
|
+
members.push(`[key: string]: ${v}`);
|
|
318
|
+
}
|
|
319
|
+
if (members.length === 0)
|
|
320
|
+
return null; // `{}` admits any non-nullish value
|
|
321
|
+
// All-readonly object types may describe frozen values (.readonly()).
|
|
322
|
+
if (props.length > 0 && readonlyCount === props.length)
|
|
323
|
+
return null;
|
|
324
|
+
const text = `{ ${members.join("; ")} }`;
|
|
325
|
+
if (frame.name !== null) {
|
|
326
|
+
this.declarations.push(`type ${frame.name} = ${text};`);
|
|
327
|
+
return frame.name;
|
|
328
|
+
}
|
|
329
|
+
return text;
|
|
330
|
+
}
|
|
331
|
+
finally {
|
|
332
|
+
this.inProgress.delete(type.id);
|
|
333
|
+
}
|
|
334
|
+
}
|
|
335
|
+
}
|
|
336
|
+
function hasReadonlyModifier(prop) {
|
|
337
|
+
return prop.declarations.some((d) => (ts.isPropertySignature(d) || ts.isPropertyDeclaration(d)) &&
|
|
338
|
+
(d.modifiers?.nodes ?? []).some((m) => m.kind === ts.SyntaxKind.ReadonlyKeyword));
|
|
339
|
+
}
|
|
340
|
+
/** Children of a node in source order (forEachChild order). */
|
|
341
|
+
function childrenOf(node) {
|
|
342
|
+
const out = [];
|
|
343
|
+
ts.forEachChild(node, (c) => {
|
|
344
|
+
out.push(c);
|
|
345
|
+
return undefined;
|
|
346
|
+
}, (list) => {
|
|
347
|
+
for (const c of list.nodes)
|
|
348
|
+
out.push(c);
|
|
349
|
+
return undefined;
|
|
350
|
+
});
|
|
351
|
+
return out;
|
|
352
|
+
}
|
|
353
|
+
function isWriteTarget(node) {
|
|
354
|
+
let child = node;
|
|
355
|
+
let parent = node.parent;
|
|
356
|
+
while (parent !== undefined && ts.isParenthesizedExpression(parent)) {
|
|
357
|
+
child = parent;
|
|
358
|
+
parent = parent.parent;
|
|
359
|
+
}
|
|
360
|
+
if (parent === undefined)
|
|
361
|
+
return false;
|
|
362
|
+
if (ts.isBinaryExpression(parent) && parent.left === child) {
|
|
363
|
+
const k = parent.operatorToken.kind;
|
|
364
|
+
return k >= ts.SyntaxKind.FirstAssignment && k <= ts.SyntaxKind.LastAssignment;
|
|
365
|
+
}
|
|
366
|
+
if (ts.isPrefixUnaryExpression(parent) || ts.isPostfixUnaryExpression(parent)) {
|
|
367
|
+
const op = parent.operator;
|
|
368
|
+
return op === ts.SyntaxKind.PlusPlusToken || op === ts.SyntaxKind.MinusMinusToken;
|
|
369
|
+
}
|
|
370
|
+
if (ts.isDeleteExpression(parent))
|
|
371
|
+
return true;
|
|
372
|
+
if (ts.isForOfStatement(parent) || ts.isForInStatement(parent))
|
|
373
|
+
return parent.initializer === child;
|
|
374
|
+
if (ts.isShorthandPropertyAssignment(parent))
|
|
375
|
+
return true;
|
|
376
|
+
if (ts.isArrayLiteralExpression(parent) ||
|
|
377
|
+
ts.isPropertyAssignment(parent) ||
|
|
378
|
+
ts.isSpreadElement(parent)) {
|
|
379
|
+
// Destructuring assignment targets: conservative, skip.
|
|
380
|
+
let up = parent;
|
|
381
|
+
while (up !== undefined &&
|
|
382
|
+
(ts.isArrayLiteralExpression(up) ||
|
|
383
|
+
ts.isObjectLiteralExpression(up) ||
|
|
384
|
+
ts.isPropertyAssignment(up) ||
|
|
385
|
+
ts.isSpreadElement(up)))
|
|
386
|
+
up = up.parent;
|
|
387
|
+
if (up !== undefined &&
|
|
388
|
+
ts.isBinaryExpression(up) &&
|
|
389
|
+
up.operatorToken.kind === ts.SyntaxKind.EqualsToken)
|
|
390
|
+
return true;
|
|
391
|
+
}
|
|
392
|
+
return false;
|
|
393
|
+
}
|
|
394
|
+
function inOptionalChain(node) {
|
|
395
|
+
const parent = node.parent;
|
|
396
|
+
if (parent === undefined)
|
|
397
|
+
return false;
|
|
398
|
+
if ((ts.isPropertyAccessExpression(parent) ||
|
|
399
|
+
ts.isElementAccessExpression(parent) ||
|
|
400
|
+
ts.isCallExpression(parent)) &&
|
|
401
|
+
parent.expression === node &&
|
|
402
|
+
(parent.questionDotToken !== undefined || (parent.flags & ts.NodeFlags.OptionalChain) !== 0))
|
|
403
|
+
return true;
|
|
404
|
+
return ((ts.isPropertyAccessExpression(node) ||
|
|
405
|
+
ts.isElementAccessExpression(node) ||
|
|
406
|
+
ts.isCallExpression(node)) &&
|
|
407
|
+
(node.flags & ts.NodeFlags.OptionalChain) !== 0);
|
|
408
|
+
}
|
|
409
|
+
function isCallee(node) {
|
|
410
|
+
const p = node.parent;
|
|
411
|
+
return (p !== undefined &&
|
|
412
|
+
(ts.isCallExpression(p) || ts.isNewExpression(p) || ts.isTaggedTemplateExpression(p)) &&
|
|
413
|
+
(ts.isTaggedTemplateExpression(p) ? p.tag === node : p.expression === node));
|
|
414
|
+
}
|
|
415
|
+
function inTypeContext(node) {
|
|
416
|
+
for (let p = node.parent; p !== undefined; p = p.parent) {
|
|
417
|
+
if (ts.isTypeNode(p) || ts.isTypeQueryNode(p))
|
|
418
|
+
return true;
|
|
419
|
+
if (ts.isExpressionWithTypeArguments(p) && p.parent && ts.isHeritageClause(p.parent))
|
|
420
|
+
return true;
|
|
421
|
+
if (ts.isStatement(p))
|
|
422
|
+
return false;
|
|
423
|
+
}
|
|
424
|
+
return false;
|
|
425
|
+
}
|
|
426
|
+
function unwrapTransparent(node) {
|
|
427
|
+
let e = node;
|
|
428
|
+
while (ts.isParenthesizedExpression(e) || ts.isNonNullExpression(e) || ts.isAwaitExpression(e))
|
|
429
|
+
e = e.expression;
|
|
430
|
+
return e;
|
|
431
|
+
}
|
|
432
|
+
/** Plans the projection for one program pair. Answers null when nothing
|
|
433
|
+
* in the user files projects (the program stays as it is). */
|
|
434
|
+
export function planDeclProjection(input) {
|
|
435
|
+
const jsChecker = input.jsProgram.getTypeChecker();
|
|
436
|
+
const declChecker = input.declProgram.getTypeChecker();
|
|
437
|
+
const printer = new TypePrinter(declChecker);
|
|
438
|
+
const plan = [];
|
|
439
|
+
const edits = new Map();
|
|
440
|
+
const typeAt = (checker, node) => {
|
|
441
|
+
try {
|
|
442
|
+
return checker.getTypeAtLocation(node);
|
|
443
|
+
}
|
|
444
|
+
catch {
|
|
445
|
+
return null;
|
|
446
|
+
}
|
|
447
|
+
};
|
|
448
|
+
const isAnyish = (t) => t !== null && (t.flags & ANYISH) !== 0;
|
|
449
|
+
const resolveAlias = (s) => {
|
|
450
|
+
if (s === undefined || !(s.flags & ts.SymbolFlags.Alias))
|
|
451
|
+
return s;
|
|
452
|
+
try {
|
|
453
|
+
return declChecker.getAliasedSymbol(s);
|
|
454
|
+
}
|
|
455
|
+
catch {
|
|
456
|
+
return s;
|
|
457
|
+
}
|
|
458
|
+
};
|
|
459
|
+
const declSymbol = (n) => {
|
|
460
|
+
try {
|
|
461
|
+
return resolveAlias(declChecker.getSymbolAtLocation(n));
|
|
462
|
+
}
|
|
463
|
+
catch {
|
|
464
|
+
return undefined;
|
|
465
|
+
}
|
|
466
|
+
};
|
|
467
|
+
const namesPackageSymbol = (node) => {
|
|
468
|
+
let found = false;
|
|
469
|
+
const visit = (n) => {
|
|
470
|
+
if (found)
|
|
471
|
+
return;
|
|
472
|
+
if (ts.isIdentifier(n) && declaredInPackage(declSymbol(n))) {
|
|
473
|
+
found = true;
|
|
474
|
+
return;
|
|
475
|
+
}
|
|
476
|
+
for (const c of childrenOf(n))
|
|
477
|
+
visit(c);
|
|
478
|
+
};
|
|
479
|
+
visit(node);
|
|
480
|
+
return found;
|
|
481
|
+
};
|
|
482
|
+
for (const file of input.userFiles) {
|
|
483
|
+
const jsSf = input.jsProgram.getSourceFile(file);
|
|
484
|
+
const declSf = input.declProgram.getSourceFile(file);
|
|
485
|
+
if (jsSf === undefined || declSf === undefined || jsSf.text !== declSf.text)
|
|
486
|
+
continue;
|
|
487
|
+
const fileEdits = [];
|
|
488
|
+
/** Candidate expressions (by js node) with their alias. */
|
|
489
|
+
const exprCandidates = new Map();
|
|
490
|
+
const exprOrder = [];
|
|
491
|
+
const considerType = (jsNode, declNode) => {
|
|
492
|
+
if (!ts.isTypeReferenceNode(jsNode) &&
|
|
493
|
+
!ts.isIndexedAccessTypeNode(jsNode) &&
|
|
494
|
+
!ts.isExpressionWithTypeArguments(jsNode))
|
|
495
|
+
return false;
|
|
496
|
+
if (ts.isExpressionWithTypeArguments(jsNode)) {
|
|
497
|
+
if (!jsNode.parent || !ts.isHeritageClause(jsNode.parent))
|
|
498
|
+
return false;
|
|
499
|
+
if (!jsNode.parent.parent || !ts.isInterfaceDeclaration(jsNode.parent.parent))
|
|
500
|
+
return false;
|
|
501
|
+
}
|
|
502
|
+
let jsType;
|
|
503
|
+
let declType;
|
|
504
|
+
try {
|
|
505
|
+
jsType = ts.isExpressionWithTypeArguments(jsNode)
|
|
506
|
+
? jsChecker.getTypeAtLocation(jsNode)
|
|
507
|
+
: jsChecker.getTypeFromTypeNode(jsNode);
|
|
508
|
+
declType = ts.isExpressionWithTypeArguments(declNode)
|
|
509
|
+
? declChecker.getTypeAtLocation(declNode)
|
|
510
|
+
: declChecker.getTypeFromTypeNode(declNode);
|
|
511
|
+
}
|
|
512
|
+
catch {
|
|
513
|
+
return false;
|
|
514
|
+
}
|
|
515
|
+
if (!isAnyish(jsType) || declType === null)
|
|
516
|
+
return false;
|
|
517
|
+
if (!namesPackageSymbol(declNode))
|
|
518
|
+
return false;
|
|
519
|
+
const alias = printer.project(declType);
|
|
520
|
+
if (alias === null)
|
|
521
|
+
return false;
|
|
522
|
+
const start = ts.tokenStartOfNode(jsNode);
|
|
523
|
+
fileEdits.push({ start, end: jsNode.end, text: alias });
|
|
524
|
+
plan.push(`${file}:${start}: type ${jsSf.text.slice(start, jsNode.end)} -> ${alias}`);
|
|
525
|
+
return true;
|
|
526
|
+
};
|
|
527
|
+
const considerExpr = (jsNode, declNode) => {
|
|
528
|
+
if (!ts.isExpression(jsNode))
|
|
529
|
+
return;
|
|
530
|
+
const isCall = ts.isCallExpression(jsNode) ||
|
|
531
|
+
ts.isNewExpression(jsNode) ||
|
|
532
|
+
ts.isTaggedTemplateExpression(jsNode);
|
|
533
|
+
const isAccess = ts.isPropertyAccessExpression(jsNode) || ts.isElementAccessExpression(jsNode);
|
|
534
|
+
const isAwait = ts.isAwaitExpression(jsNode);
|
|
535
|
+
if (!isCall && !isAccess && !isAwait && !ts.isIdentifier(jsNode))
|
|
536
|
+
return;
|
|
537
|
+
if (inTypeContext(jsNode) || isCallee(jsNode) || isWriteTarget(jsNode))
|
|
538
|
+
return;
|
|
539
|
+
if (inOptionalChain(jsNode))
|
|
540
|
+
return;
|
|
541
|
+
const parent = jsNode.parent;
|
|
542
|
+
if (parent !== undefined && ts.isExpressionStatement(parent))
|
|
543
|
+
return;
|
|
544
|
+
if (parent !== undefined &&
|
|
545
|
+
(ts.isImportSpecifier(parent) ||
|
|
546
|
+
ts.isImportClause(parent) ||
|
|
547
|
+
ts.isNamespaceImport(parent) ||
|
|
548
|
+
ts.isExportSpecifier(parent)))
|
|
549
|
+
return;
|
|
550
|
+
if (ts.isIdentifier(jsNode)) {
|
|
551
|
+
if (parent !== undefined && ts.isPropertyAccessExpression(parent) && parent.name === jsNode)
|
|
552
|
+
return;
|
|
553
|
+
}
|
|
554
|
+
const jsType = typeAt(jsChecker, jsNode);
|
|
555
|
+
if (!isAnyish(jsType))
|
|
556
|
+
return;
|
|
557
|
+
// Package-produced?
|
|
558
|
+
const d = declNode;
|
|
559
|
+
let produced = false;
|
|
560
|
+
if (ts.isCallExpression(d) || ts.isNewExpression(d)) {
|
|
561
|
+
const callee = d.expression;
|
|
562
|
+
const target = ts.isPropertyAccessExpression(callee) ? callee.name : callee;
|
|
563
|
+
let decl;
|
|
564
|
+
try {
|
|
565
|
+
decl = declChecker.getResolvedSignature(d)?.declaration;
|
|
566
|
+
}
|
|
567
|
+
catch {
|
|
568
|
+
decl = undefined;
|
|
569
|
+
}
|
|
570
|
+
produced =
|
|
571
|
+
(declaredInPackage(declSymbol(target)) ||
|
|
572
|
+
(decl !== undefined && isPackageDeclarationFile(ts.getSourceFileOfNode(decl)))) &&
|
|
573
|
+
!passesArgumentThrough(decl);
|
|
574
|
+
}
|
|
575
|
+
else if (ts.isTaggedTemplateExpression(d)) {
|
|
576
|
+
produced = declaredInPackage(declSymbol(d.tag));
|
|
577
|
+
}
|
|
578
|
+
else if (ts.isPropertyAccessExpression(d) || ts.isElementAccessExpression(d)) {
|
|
579
|
+
const recvDecl = typeAt(declChecker, d.expression);
|
|
580
|
+
const recvJs = typeAt(jsChecker, jsNode.expression);
|
|
581
|
+
const recvProjectable = recvDecl !== null && printer.project(recvDecl) !== null;
|
|
582
|
+
produced = !recvProjectable || (recvJs !== null && !isAnyish(recvJs));
|
|
583
|
+
}
|
|
584
|
+
else if (ts.isAwaitExpression(d)) {
|
|
585
|
+
const inner = unwrapTransparent(d.expression);
|
|
586
|
+
produced =
|
|
587
|
+
(ts.isCallExpression(inner) || ts.isPropertyAccessExpression(inner)) &&
|
|
588
|
+
(declaredInPackage(declSymbol(ts.isCallExpression(inner)
|
|
589
|
+
? ts.isPropertyAccessExpression(inner.expression)
|
|
590
|
+
? inner.expression.name
|
|
591
|
+
: inner.expression
|
|
592
|
+
: inner.name)) ||
|
|
593
|
+
isAnyish(typeAt(jsChecker, inner)));
|
|
594
|
+
}
|
|
595
|
+
else if (ts.isIdentifier(d)) {
|
|
596
|
+
const raw = (() => {
|
|
597
|
+
try {
|
|
598
|
+
return declChecker.getSymbolAtLocation(d);
|
|
599
|
+
}
|
|
600
|
+
catch {
|
|
601
|
+
return undefined;
|
|
602
|
+
}
|
|
603
|
+
})();
|
|
604
|
+
produced =
|
|
605
|
+
raw !== undefined &&
|
|
606
|
+
(raw.flags & ts.SymbolFlags.Alias) !== 0 &&
|
|
607
|
+
declaredInPackage(resolveAlias(raw));
|
|
608
|
+
}
|
|
609
|
+
if (!produced)
|
|
610
|
+
return;
|
|
611
|
+
// A consumer that takes anything needs no conversion.
|
|
612
|
+
try {
|
|
613
|
+
const ctx = declChecker.getContextualType(d);
|
|
614
|
+
if (ctx !== undefined && ctx.flags & ANYISH)
|
|
615
|
+
return;
|
|
616
|
+
}
|
|
617
|
+
catch {
|
|
618
|
+
// no contextual type
|
|
619
|
+
}
|
|
620
|
+
const declType = typeAt(declChecker, d);
|
|
621
|
+
if (declType === null)
|
|
622
|
+
return;
|
|
623
|
+
const alias = printer.project(declType);
|
|
624
|
+
if (alias === null)
|
|
625
|
+
return;
|
|
626
|
+
exprCandidates.set(jsNode, alias);
|
|
627
|
+
exprOrder.push(jsNode);
|
|
628
|
+
};
|
|
629
|
+
const annotated = new Set();
|
|
630
|
+
const considerParam = (jsNode, declNode) => {
|
|
631
|
+
if (!ts.isParameter(jsNode) || jsNode.type !== undefined || !ts.isIdentifier(jsNode.name))
|
|
632
|
+
return;
|
|
633
|
+
const fn = jsNode.parent;
|
|
634
|
+
if (fn === undefined || !(ts.isArrowFunction(fn) || ts.isFunctionExpression(fn)))
|
|
635
|
+
return;
|
|
636
|
+
if (jsNode.dotDotDotToken !== undefined)
|
|
637
|
+
return;
|
|
638
|
+
const jsType = typeAt(jsChecker, jsNode.name);
|
|
639
|
+
if (!isAnyish(jsType))
|
|
640
|
+
return;
|
|
641
|
+
const declType = typeAt(declChecker, declNode.name);
|
|
642
|
+
if (declType === null)
|
|
643
|
+
return;
|
|
644
|
+
// Only parameters the package's declarations type (a callback the
|
|
645
|
+
// package calls), not ones the user typed elsewhere.
|
|
646
|
+
try {
|
|
647
|
+
const ctxFn = declChecker.getContextualType(declNode.parent);
|
|
648
|
+
if (ctxFn === undefined)
|
|
649
|
+
return;
|
|
650
|
+
const sigs = declChecker.getCallSignatures(ctxFn);
|
|
651
|
+
if (!sigs.some((s) => s.declaration !== undefined &&
|
|
652
|
+
isPackageDeclarationFile(ts.getSourceFileOfNode(s.declaration))))
|
|
653
|
+
return;
|
|
654
|
+
}
|
|
655
|
+
catch {
|
|
656
|
+
return;
|
|
657
|
+
}
|
|
658
|
+
const alias = printer.project(declType);
|
|
659
|
+
if (alias === null)
|
|
660
|
+
return;
|
|
661
|
+
annotated.add(jsNode);
|
|
662
|
+
const name = jsNode.name;
|
|
663
|
+
const nameStart = ts.tokenStartOfNode(name);
|
|
664
|
+
const text = jsSf.text;
|
|
665
|
+
// `x => ...` or `async x => ...`: nothing but the modifiers comes
|
|
666
|
+
// before the parameter, which then needs parentheses for its type.
|
|
667
|
+
const head = ts.isArrowFunction(fn)
|
|
668
|
+
? ((ts.getModifiers(fn) ?? []).at(-1)?.end ?? ts.tokenStartOfNode(fn))
|
|
669
|
+
: nameStart;
|
|
670
|
+
const bareArrow = ts.isArrowFunction(fn) &&
|
|
671
|
+
fn.parameters.nodes.length === 1 &&
|
|
672
|
+
text.slice(head, nameStart).trim() === "";
|
|
673
|
+
const afterName = jsNode.questionToken !== undefined ? jsNode.questionToken.end : name.end;
|
|
674
|
+
if (bareArrow) {
|
|
675
|
+
fileEdits.push({ start: nameStart, end: nameStart, text: "(" });
|
|
676
|
+
fileEdits.push({ start: afterName, end: afterName, text: `: ${alias})` });
|
|
677
|
+
}
|
|
678
|
+
else {
|
|
679
|
+
fileEdits.push({ start: afterName, end: afterName, text: `: ${alias}` });
|
|
680
|
+
}
|
|
681
|
+
plan.push(`${file}:${nameStart}: parameter ${name.text}: ${alias}`);
|
|
682
|
+
};
|
|
683
|
+
const walk = (jsNode, declNode) => {
|
|
684
|
+
if (jsNode.kind !== declNode.kind)
|
|
685
|
+
return;
|
|
686
|
+
if (ts.isTypeNode(jsNode) || ts.isExpressionWithTypeArguments(jsNode)) {
|
|
687
|
+
if (considerType(jsNode, declNode))
|
|
688
|
+
return;
|
|
689
|
+
}
|
|
690
|
+
else {
|
|
691
|
+
considerParam(jsNode, declNode);
|
|
692
|
+
considerExpr(jsNode, declNode);
|
|
693
|
+
}
|
|
694
|
+
const a = childrenOf(jsNode);
|
|
695
|
+
const b = childrenOf(declNode);
|
|
696
|
+
if (a.length !== b.length)
|
|
697
|
+
return;
|
|
698
|
+
for (let i = 0; i < a.length; i++)
|
|
699
|
+
walk(a[i], b[i]);
|
|
700
|
+
};
|
|
701
|
+
walk(jsSf, declSf);
|
|
702
|
+
// Suppress candidates whose receiver chain another candidate types.
|
|
703
|
+
const symbolTyped = new Map();
|
|
704
|
+
const willBeTyped = (e, depth = 0) => {
|
|
705
|
+
if (depth > 32)
|
|
706
|
+
return false;
|
|
707
|
+
if (exprCandidates.has(e))
|
|
708
|
+
return true;
|
|
709
|
+
if (ts.isParenthesizedExpression(e) || ts.isNonNullExpression(e) || ts.isAwaitExpression(e))
|
|
710
|
+
return willBeTyped(e.expression, depth + 1);
|
|
711
|
+
if (ts.isAsExpression(e))
|
|
712
|
+
return false;
|
|
713
|
+
if (ts.isPropertyAccessExpression(e) || ts.isElementAccessExpression(e))
|
|
714
|
+
return willBeTyped(e.expression, depth + 1);
|
|
715
|
+
if (ts.isIdentifier(e)) {
|
|
716
|
+
let sym;
|
|
717
|
+
try {
|
|
718
|
+
sym = jsChecker.getSymbolAtLocation(e);
|
|
719
|
+
}
|
|
720
|
+
catch {
|
|
721
|
+
return false;
|
|
722
|
+
}
|
|
723
|
+
if (sym === undefined)
|
|
724
|
+
return false;
|
|
725
|
+
const known = symbolTyped.get(sym);
|
|
726
|
+
if (known !== undefined)
|
|
727
|
+
return known;
|
|
728
|
+
symbolTyped.set(sym, false);
|
|
729
|
+
let result = false;
|
|
730
|
+
const decls = sym.declarations;
|
|
731
|
+
if (decls.length === 1) {
|
|
732
|
+
const decl = decls[0];
|
|
733
|
+
if (ts.isVariableDeclaration(decl) &&
|
|
734
|
+
decl.initializer !== undefined &&
|
|
735
|
+
decl.type === undefined)
|
|
736
|
+
result = willBeTyped(decl.initializer, depth + 1);
|
|
737
|
+
else if (ts.isParameter(decl) && annotated.has(decl))
|
|
738
|
+
result = true;
|
|
739
|
+
else if (ts.isBindingElement(decl))
|
|
740
|
+
result = false;
|
|
741
|
+
}
|
|
742
|
+
symbolTyped.set(sym, result);
|
|
743
|
+
return result;
|
|
744
|
+
}
|
|
745
|
+
return false;
|
|
746
|
+
};
|
|
747
|
+
const receiverOf = (e) => {
|
|
748
|
+
if (ts.isPropertyAccessExpression(e) || ts.isElementAccessExpression(e))
|
|
749
|
+
return e.expression;
|
|
750
|
+
if (ts.isIdentifier(e))
|
|
751
|
+
return null;
|
|
752
|
+
return null;
|
|
753
|
+
};
|
|
754
|
+
const kept = [];
|
|
755
|
+
for (const e of exprOrder) {
|
|
756
|
+
const recv = receiverOf(e);
|
|
757
|
+
if (recv !== null && willBeTyped(recv))
|
|
758
|
+
continue;
|
|
759
|
+
// An identifier candidate that is a user binding never gets here
|
|
760
|
+
// (only package imports are candidates).
|
|
761
|
+
kept.push(e);
|
|
762
|
+
}
|
|
763
|
+
// Nested candidates: keep only the innermost (an outer one is typed by
|
|
764
|
+
// the inner wrap).
|
|
765
|
+
const keptSet = new Set(kept);
|
|
766
|
+
const containsKept = (outer) => {
|
|
767
|
+
let found = false;
|
|
768
|
+
const visit = (n) => {
|
|
769
|
+
if (found)
|
|
770
|
+
return;
|
|
771
|
+
for (const c of childrenOf(n)) {
|
|
772
|
+
if (keptSet.has(c)) {
|
|
773
|
+
found = true;
|
|
774
|
+
return;
|
|
775
|
+
}
|
|
776
|
+
visit(c);
|
|
777
|
+
}
|
|
778
|
+
};
|
|
779
|
+
visit(outer);
|
|
780
|
+
return found;
|
|
781
|
+
};
|
|
782
|
+
for (const e of kept) {
|
|
783
|
+
if (!ts.isAwaitExpression(e) &&
|
|
784
|
+
containsKept(e) &&
|
|
785
|
+
(ts.isPropertyAccessExpression(e) || ts.isElementAccessExpression(e))) {
|
|
786
|
+
// `a.b.c` with `a.b` wrapped: the outer access reads typed data.
|
|
787
|
+
const recv = receiverOf(e);
|
|
788
|
+
if (recv !== null &&
|
|
789
|
+
(keptSet.has(unwrapTransparent(recv)) || willBeTyped(recv)))
|
|
790
|
+
continue;
|
|
791
|
+
}
|
|
792
|
+
const alias = exprCandidates.get(e);
|
|
793
|
+
const start = ts.tokenStartOfNode(e);
|
|
794
|
+
const stmt = e.parent;
|
|
795
|
+
let prefix = "(";
|
|
796
|
+
// A statement that would start with `(` after a line without a
|
|
797
|
+
// semicolon continues the previous expression: guard it.
|
|
798
|
+
let up = e;
|
|
799
|
+
while (up?.parent !== undefined && !ts.isStatement(up.parent))
|
|
800
|
+
up = up.parent;
|
|
801
|
+
// Only a statement in a statement list can follow such a line; an
|
|
802
|
+
// unbraced body (`for (...) S.parse(x).run()`) follows its header,
|
|
803
|
+
// and a `;` there would become the body.
|
|
804
|
+
const list = up?.parent?.parent;
|
|
805
|
+
if (up?.parent !== undefined &&
|
|
806
|
+
ts.isExpressionStatement(up.parent) &&
|
|
807
|
+
ts.tokenStartOfNode(up.parent) === start &&
|
|
808
|
+
list !== undefined &&
|
|
809
|
+
(ts.isBlock(list) ||
|
|
810
|
+
ts.isSourceFile(list) ||
|
|
811
|
+
ts.isModuleBlock(list) ||
|
|
812
|
+
ts.isCaseClause(list) ||
|
|
813
|
+
ts.isDefaultClause(list)))
|
|
814
|
+
prefix = ";(";
|
|
815
|
+
void stmt;
|
|
816
|
+
fileEdits.push({ start, end: start, text: prefix });
|
|
817
|
+
// Closing parts at one position close inner wraps first.
|
|
818
|
+
fileEdits.push({ start: e.end, end: e.end, text: ` as ${alias})`, rank: -start });
|
|
819
|
+
plan.push(`${file}:${start}: cast ${jsSf.text.slice(start, Math.min(e.end, start + 60)).replace(/\s+/g, " ")} as ${alias}`);
|
|
820
|
+
}
|
|
821
|
+
if (fileEdits.length === 0)
|
|
822
|
+
continue;
|
|
823
|
+
edits.set(file, fileEdits);
|
|
824
|
+
}
|
|
825
|
+
if (edits.size === 0)
|
|
826
|
+
return null;
|
|
827
|
+
const files = new Map();
|
|
828
|
+
for (const [file, list] of edits) {
|
|
829
|
+
const sf = input.jsProgram.getSourceFile(file);
|
|
830
|
+
files.set(file, applyEdits(sf.text, list));
|
|
831
|
+
}
|
|
832
|
+
const declFile = `${input.outDir.split("\\").join("/")}/${DECL_BOUNDARY_FILE}`;
|
|
833
|
+
const declText = "// Generated by scriptc: types projected from npm package declarations.\n" +
|
|
834
|
+
printer.declarations.join("\n") +
|
|
835
|
+
"\n";
|
|
836
|
+
return { files, declFile, declText, plan };
|
|
837
|
+
}
|
|
838
|
+
/** Applies insertions and replacements; overlapping replacements keep the
|
|
839
|
+
* first. Insertions at one position keep their order. */
|
|
840
|
+
export function applyEdits(text, edits) {
|
|
841
|
+
const sorted = edits
|
|
842
|
+
.map((e, i) => ({ ...e, i }))
|
|
843
|
+
.sort((a, b) => a.start - b.start || a.end - b.end || (a.rank ?? 0) - (b.rank ?? 0) || a.i - b.i);
|
|
844
|
+
let out = "";
|
|
845
|
+
let at = 0;
|
|
846
|
+
for (const e of sorted) {
|
|
847
|
+
if (e.start < at)
|
|
848
|
+
continue; // overlaps an earlier replacement
|
|
849
|
+
out += text.slice(at, e.start) + e.text;
|
|
850
|
+
at = e.end;
|
|
851
|
+
}
|
|
852
|
+
return out + text.slice(at);
|
|
853
|
+
}
|
|
854
|
+
//# sourceMappingURL=decl-projection.js.map
|