@scriptc/compiler 0.4.2 → 0.4.4
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 +470 -66
- 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 +479 -32
- package/dist/backend/llvm/bytes-loop-versions.js.map +1 -1
- package/dist/backend/llvm/bytes-loop-versions.test.js +263 -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/debug-info.js +2 -5
- package/dist/backend/llvm/debug-info.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 +30 -0
- package/dist/backend/llvm/dyn.js +373 -70
- package/dist/backend/llvm/dyn.js.map +1 -1
- package/dist/backend/llvm/emit-function.js +13 -28
- 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 +211 -33
- 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 +186 -37
- package/dist/backend/llvm/emitter.js +733 -90
- package/dist/backend/llvm/emitter.js.map +1 -1
- package/dist/backend/llvm/emitter.test.js +65 -7
- package/dist/backend/llvm/emitter.test.js.map +1 -1
- package/dist/backend/llvm/expr-async.js +11 -13
- package/dist/backend/llvm/expr-async.js.map +1 -1
- package/dist/backend/llvm/expr-bytes.js +48 -20
- 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 +143 -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 +119 -38
- 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 +210 -69
- 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 +25 -1
- package/dist/backend/llvm/integer-values.js +95 -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 +213 -5
- 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-process.js +37 -1
- package/dist/backend/llvm/lib-process.js.map +1 -1
- package/dist/backend/llvm/lib-shared.js +94 -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 +15 -3
- 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-effects.js +3 -0
- package/dist/backend/llvm/reference-effects.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 +224 -40
- 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-captures.js +1 -5
- package/dist/backend/llvm/stack-captures.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/union-repr.d.ts +4 -3
- package/dist/backend/llvm/union-repr.js +6 -5
- package/dist/backend/llvm/union-repr.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 +101 -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-codegen-core.d.ts +5 -3
- package/dist/backend/native-codegen-core.js +13 -6
- package/dist/backend/native-codegen-core.js.map +1 -1
- package/dist/backend/native-codegen.test.js +6 -4
- package/dist/backend/native-codegen.test.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-cpu.d.ts +26 -0
- package/dist/backend/target-cpu.js +98 -0
- package/dist/backend/target-cpu.js.map +1 -0
- package/dist/backend/target-cpu.test.d.ts +1 -0
- package/dist/backend/target-cpu.test.js +38 -0
- package/dist/backend/target-cpu.test.js.map +1 -0
- 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/command.js +20 -1
- package/dist/cli/command.js.map +1 -1
- package/dist/cli/usage.d.ts +4 -1
- package/dist/cli/usage.js +10 -3
- package/dist/cli/usage.js.map +1 -1
- package/dist/compat/fetch-profile.js +1 -1
- package/dist/compat/fetch-profile.js.map +1 -1
- package/dist/compile-types.d.ts +7 -0
- 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 +1 -1
- 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 +5 -0
- package/dist/executable/executable-cache.js +5 -0
- package/dist/executable/executable-cache.js.map +1 -1
- package/dist/executable/executable-cache.test.js +3 -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 +949 -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/async-context.d.ts +8 -2
- package/dist/frontend/lowering/builtins/async-context.js +62 -3
- package/dist/frontend/lowering/builtins/async-context.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 +87 -10
- package/dist/frontend/lowering/builtins/crypto.js.map +1 -1
- package/dist/frontend/lowering/builtins/dates.js +4 -1
- package/dist/frontend/lowering/builtins/dates.js.map +1 -1
- package/dist/frontend/lowering/builtins/filesystem-calls.js +3 -3
- package/dist/frontend/lowering/builtins/filesystem-calls.js.map +1 -1
- package/dist/frontend/lowering/builtins/fs-glob.js +6 -3
- package/dist/frontend/lowering/builtins/fs-glob.js.map +1 -1
- package/dist/frontend/lowering/builtins/fs-paths.d.ts +43 -5
- package/dist/frontend/lowering/builtins/fs-paths.js +245 -93
- package/dist/frontend/lowering/builtins/fs-paths.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/module-calls.js +6 -3
- package/dist/frontend/lowering/builtins/module-calls.js.map +1 -1
- 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 +7 -1
- package/dist/frontend/lowering/builtins/promises.js +236 -139
- 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/call-signatures.js +0 -1
- package/dist/frontend/lowering/call-signatures.js.map +1 -1
- package/dist/frontend/lowering/cjs-exports-object.js +1 -1
- package/dist/frontend/lowering/cjs-exports-object.js.map +1 -1
- package/dist/frontend/lowering/cjs-inline-require.d.ts +32 -0
- package/dist/frontend/lowering/cjs-inline-require.js +307 -4
- package/dist/frontend/lowering/cjs-inline-require.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 +49 -2
- package/dist/frontend/lowering/class-dynamic-dispatch.js +880 -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 +83 -24
- package/dist/frontend/lowering/class-method-mutations.js.map +1 -1
- package/dist/frontend/lowering/class-protocols.d.ts +25 -0
- package/dist/frontend/lowering/class-protocols.js +183 -1
- package/dist/frontend/lowering/class-protocols.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/completion-callbacks.d.ts +4 -0
- package/dist/frontend/lowering/completion-callbacks.js +146 -0
- package/dist/frontend/lowering/completion-callbacks.js.map +1 -0
- 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.d.ts +5 -4
- package/dist/frontend/lowering/containers/array-callbacks.js +345 -24
- 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-construction.js +5 -0
- package/dist/frontend/lowering/containers/array-construction.js.map +1 -1
- package/dist/frontend/lowering/containers/array-methods.js +26 -3
- 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.d.ts +25 -17
- package/dist/frontend/lowering/containers/bytes.js +455 -46
- 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/date-values.d.ts +11 -0
- package/dist/frontend/lowering/date-values.js +207 -0
- package/dist/frontend/lowering/date-values.js.map +1 -0
- 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 +53 -0
- package/dist/frontend/lowering/expressions/array-literals.js.map +1 -1
- package/dist/frontend/lowering/expressions/binary.js +100 -28
- package/dist/frontend/lowering/expressions/binary.js.map +1 -1
- package/dist/frontend/lowering/expressions/element-access.js +169 -13
- package/dist/frontend/lowering/expressions/element-access.js.map +1 -1
- package/dist/frontend/lowering/expressions/identifiers.js +64 -5
- 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 +168 -10
- 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/typeof.js +6 -0
- package/dist/frontend/lowering/expressions/typeof.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 +39 -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 +64 -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/indexed-unions.d.ts +54 -0
- package/dist/frontend/lowering/indexed-unions.js +401 -0
- package/dist/frontend/lowering/indexed-unions.js.map +1 -0
- 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 +974 -48
- package/dist/frontend/lowering/key-order-witness.js.map +1 -1
- package/dist/frontend/lowering/key-order-witness.test.js +530 -10
- package/dist/frontend/lowering/key-order-witness.test.js.map +1 -1
- package/dist/frontend/lowering/lower-assert.js +15 -3
- package/dist/frontend/lowering/lower-assert.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 +462 -44
- 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 +324 -69
- 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 +215 -3
- 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 +42 -32
- 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.d.ts +1 -1
- package/dist/frontend/lowering/lower-inspect.js +53 -17
- package/dist/frontend/lowering/lower-inspect.js.map +1 -1
- package/dist/frontend/lowering/lower-modules.js +53 -5
- 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 +553 -81
- 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 +107 -8
- package/dist/frontend/lowering/lowerer.js +381 -36
- 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/object-factory-new.d.ts +5 -0
- package/dist/frontend/lowering/object-factory-new.js +20 -6
- package/dist/frontend/lowering/object-factory-new.js.map +1 -1
- package/dist/frontend/lowering/overload-choice.d.ts +33 -0
- package/dist/frontend/lowering/overload-choice.js +190 -0
- package/dist/frontend/lowering/overload-choice.js.map +1 -0
- package/dist/frontend/lowering/surfaces.d.ts +3 -0
- package/dist/frontend/lowering/surfaces.js +73 -8
- 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 +19 -11
- 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-analysis.d.ts +5 -1
- package/dist/frontend/program-analysis.js +5 -0
- package/dist/frontend/program-analysis.js.map +1 -1
- package/dist/frontend/program.d.ts +21 -6
- package/dist/frontend/program.js +681 -83
- 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/semantic-model.d.ts +3 -0
- package/dist/frontend/ts7/semantic-model.js +5 -0
- package/dist/frontend/ts7/semantic-model.js.map +1 -1
- package/dist/frontend/ts7/semantic-model.test.js +6 -1
- package/dist/frontend/ts7/semantic-model.test.js.map +1 -1
- package/dist/frontend/ts7/semantic-types.d.ts +1 -1
- package/dist/frontend/ts7/semantic-types.js +1 -1
- package/dist/frontend/ts7/semantic-types.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 +229 -20
- package/dist/frontend/type-mapper.js.map +1 -1
- package/dist/index.d.ts +0 -5
- package/dist/index.js +46 -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 +60 -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 +222 -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 +266 -57
- package/dist/ir/int32-slots.js.map +1 -1
- package/dist/ir/int32-slots.test.js +33 -0
- package/dist/ir/int32-slots.test.js.map +1 -1
- package/dist/ir/integer-loops.d.ts +3 -3
- package/dist/ir/integer-loops.js +28 -10
- 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 +83 -10
- package/dist/ir/ir.js +77 -6
- package/dist/ir/ir.js.map +1 -1
- package/dist/ir/ir.test.js +23 -2
- package/dist/ir/ir.test.js.map +1 -1
- package/dist/ir/js-ic.d.ts +4 -0
- package/dist/ir/js-ic.js +17 -1
- package/dist/ir/js-ic.js.map +1 -1
- package/dist/ir/js-ic.test.js +46 -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 +177 -39
- 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 +167 -40
- package/dist/ir/validate.js.map +1 -1
- package/dist/library/ir-policy.js +3 -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 +4 -2
- package/dist/native/prepare.js +130 -32
- package/dist/native/prepare.js.map +1 -1
- package/dist/native/prepare.test.js +96 -20
- 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 +27 -7
|
@@ -0,0 +1,949 @@
|
|
|
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
|
+
/** While set, printing registers no recursive alias (projectable()). */
|
|
144
|
+
dry = false;
|
|
145
|
+
constructor(checker) {
|
|
146
|
+
this.checker = checker;
|
|
147
|
+
}
|
|
148
|
+
/** Whether a type projects, without naming it in the generated file. */
|
|
149
|
+
projectable(type) {
|
|
150
|
+
if (type.flags & ANYISH)
|
|
151
|
+
return false;
|
|
152
|
+
const was = this.dry;
|
|
153
|
+
this.dry = true;
|
|
154
|
+
try {
|
|
155
|
+
const text = this.print(type, 0);
|
|
156
|
+
return text !== null && text !== "unknown";
|
|
157
|
+
}
|
|
158
|
+
finally {
|
|
159
|
+
this.dry = was;
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
/** The alias naming a projectable type, or null. Top-level any/unknown
|
|
163
|
+
* never projects. */
|
|
164
|
+
project(type) {
|
|
165
|
+
if (type.flags & ANYISH)
|
|
166
|
+
return null;
|
|
167
|
+
const text = this.print(type, 0);
|
|
168
|
+
if (text === null || text === "unknown")
|
|
169
|
+
return null;
|
|
170
|
+
let name = this.aliases.get(text);
|
|
171
|
+
if (name === undefined) {
|
|
172
|
+
name = `${DECL_BOUNDARY_PREFIX}${this.aliases.size}`;
|
|
173
|
+
this.aliases.set(text, name);
|
|
174
|
+
this.declarations.push(`type ${name} = ${text};`);
|
|
175
|
+
}
|
|
176
|
+
return name;
|
|
177
|
+
}
|
|
178
|
+
print(type, depth) {
|
|
179
|
+
if (depth > 24)
|
|
180
|
+
return null;
|
|
181
|
+
const f = type.flags;
|
|
182
|
+
if (f & ANYISH)
|
|
183
|
+
return "unknown";
|
|
184
|
+
if (f & ts.TypeFlags.String)
|
|
185
|
+
return "string";
|
|
186
|
+
if (f & ts.TypeFlags.Number)
|
|
187
|
+
return "number";
|
|
188
|
+
if (f & ts.TypeFlags.Boolean)
|
|
189
|
+
return "boolean";
|
|
190
|
+
if (f & ts.TypeFlags.Null)
|
|
191
|
+
return "null";
|
|
192
|
+
if (f & ts.TypeFlags.Undefined)
|
|
193
|
+
return "undefined";
|
|
194
|
+
if (f & ts.TypeFlags.EnumLiteral || f & ts.TypeFlags.Enum)
|
|
195
|
+
return null;
|
|
196
|
+
// A boolean literal type carries its value (`intrinsicName` is not
|
|
197
|
+
// set for it by every checker facade).
|
|
198
|
+
if (f & ts.TypeFlags.BooleanLiteral)
|
|
199
|
+
return type.value === true || type.intrinsicName === "true"
|
|
200
|
+
? "true"
|
|
201
|
+
: "false";
|
|
202
|
+
if (f & ts.TypeFlags.StringLiteral)
|
|
203
|
+
return JSON.stringify(String(type.value));
|
|
204
|
+
if (f & ts.TypeFlags.NumberLiteral) {
|
|
205
|
+
const v = Number(type.value);
|
|
206
|
+
return Number.isFinite(v) ? String(v) : null;
|
|
207
|
+
}
|
|
208
|
+
if (type.isUnionType()) {
|
|
209
|
+
const parts = [];
|
|
210
|
+
for (const arm of type.getTypes()) {
|
|
211
|
+
const p = this.print(arm, depth + 1);
|
|
212
|
+
if (p === null || p === "unknown")
|
|
213
|
+
return null;
|
|
214
|
+
if (!parts.includes(p))
|
|
215
|
+
parts.push(p);
|
|
216
|
+
}
|
|
217
|
+
// `true | false` reads better as boolean, and maps the same.
|
|
218
|
+
const t = parts.indexOf("true");
|
|
219
|
+
const fl = parts.indexOf("false");
|
|
220
|
+
if (t >= 0 && fl >= 0) {
|
|
221
|
+
parts.splice(Math.max(t, fl), 1);
|
|
222
|
+
parts.splice(Math.min(t, fl), 1, "boolean");
|
|
223
|
+
}
|
|
224
|
+
return parts.map((p) => (/=>/.test(p) ? `(${p})` : p)).join(" | ");
|
|
225
|
+
}
|
|
226
|
+
if (type.isIntersectionType()) {
|
|
227
|
+
// Brands: drop members that only carry unique-symbol keys.
|
|
228
|
+
const kept = type.getTypes().filter((m) => !this.isBrandOnly(m));
|
|
229
|
+
if (kept.length === 1)
|
|
230
|
+
return this.print(kept[0], depth + 1);
|
|
231
|
+
if (kept.length === 0)
|
|
232
|
+
return null;
|
|
233
|
+
if (!kept.every((m) => (m.flags & ts.TypeFlags.Object) !== 0))
|
|
234
|
+
return null;
|
|
235
|
+
return this.printObject(type, depth);
|
|
236
|
+
}
|
|
237
|
+
if (f & ts.TypeFlags.Object)
|
|
238
|
+
return this.printObject(type, depth);
|
|
239
|
+
return null;
|
|
240
|
+
}
|
|
241
|
+
isBrandOnly(type) {
|
|
242
|
+
if (!(type.flags & ts.TypeFlags.Object) || type.isIntersectionType())
|
|
243
|
+
return false;
|
|
244
|
+
const props = this.checker.getPropertiesOfType(type);
|
|
245
|
+
return props.length > 0 && props.every((p) => String(p.escapedName).startsWith("__@"));
|
|
246
|
+
}
|
|
247
|
+
/** Whether an interface type and every type it extends are declared in
|
|
248
|
+
* user files. */
|
|
249
|
+
userInterface(type, seen = new Set()) {
|
|
250
|
+
if (!declaredInUserFile(type.getSymbol()))
|
|
251
|
+
return false;
|
|
252
|
+
const target = type.isTypeReference() ? type.getTarget() : type;
|
|
253
|
+
if (target === undefined || !target.isClassOrInterface() || seen.has(target))
|
|
254
|
+
return true;
|
|
255
|
+
seen.add(target);
|
|
256
|
+
return this.checker.getBaseTypes(target).every((base) => this.userInterface(base, seen));
|
|
257
|
+
}
|
|
258
|
+
printObject(type, depth) {
|
|
259
|
+
const checker = this.checker;
|
|
260
|
+
if (checker.isArrayType(type)) {
|
|
261
|
+
const [elem] = checker.getTypeArguments(type);
|
|
262
|
+
if (elem === undefined)
|
|
263
|
+
return null;
|
|
264
|
+
const e = this.print(elem, depth + 1);
|
|
265
|
+
if (e === null)
|
|
266
|
+
return null;
|
|
267
|
+
const ro = type.getSymbol()?.escapedName === "ReadonlyArray" ? "readonly " : "";
|
|
268
|
+
return `${ro}(${e})[]`;
|
|
269
|
+
}
|
|
270
|
+
if (checker.isTupleType(type)) {
|
|
271
|
+
const target = type.getTarget() ?? type;
|
|
272
|
+
const flags = target.elementFlags ?? [];
|
|
273
|
+
if (flags.some((fl) => fl !== ts.ElementFlags.Required))
|
|
274
|
+
return null;
|
|
275
|
+
const elems = checker.getTypeArguments(type).slice(0, flags.length);
|
|
276
|
+
const out = [];
|
|
277
|
+
for (const e of elems) {
|
|
278
|
+
const p = this.print(e, depth + 1);
|
|
279
|
+
if (p === null)
|
|
280
|
+
return null;
|
|
281
|
+
out.push(p);
|
|
282
|
+
}
|
|
283
|
+
return `${target.readonly === true ? "readonly " : ""}[${out.join(", ")}]`;
|
|
284
|
+
}
|
|
285
|
+
const symbol = type.getSymbol();
|
|
286
|
+
if (symbol !== undefined) {
|
|
287
|
+
if (symbol.flags & (ts.SymbolFlags.Class | ts.SymbolFlags.Function | ts.SymbolFlags.Method))
|
|
288
|
+
return null;
|
|
289
|
+
// Interfaces: only user-declared ones describe plain data reliably
|
|
290
|
+
// (package and lib interfaces often describe class instances), and
|
|
291
|
+
// only when every interface they extend is user-declared too: a user
|
|
292
|
+
// interface extending a package one (effect's Request.Request)
|
|
293
|
+
// inherits members the package's own constructors create.
|
|
294
|
+
if (symbol.flags & ts.SymbolFlags.Interface && !this.userInterface(type))
|
|
295
|
+
return null;
|
|
296
|
+
}
|
|
297
|
+
if (checker.getCallSignatures(type).length > 0 ||
|
|
298
|
+
checker.getConstructSignatures(type).length > 0)
|
|
299
|
+
return null;
|
|
300
|
+
const memo = this.inProgress.get(type.id);
|
|
301
|
+
if (memo !== undefined) {
|
|
302
|
+
memo.name ??= `${DECL_BOUNDARY_PREFIX}r${type.id}`;
|
|
303
|
+
return memo.name;
|
|
304
|
+
}
|
|
305
|
+
const frame = { name: null };
|
|
306
|
+
this.inProgress.set(type.id, frame);
|
|
307
|
+
try {
|
|
308
|
+
const members = [];
|
|
309
|
+
let readonlyCount = 0;
|
|
310
|
+
const props = checker.getPropertiesOfType(type);
|
|
311
|
+
for (const prop of props) {
|
|
312
|
+
const key = String(prop.escapedName);
|
|
313
|
+
if (key.startsWith("__@"))
|
|
314
|
+
continue; // symbol-keyed (brands)
|
|
315
|
+
if (prop.flags &
|
|
316
|
+
(ts.SymbolFlags.Method | ts.SymbolFlags.GetAccessor | ts.SymbolFlags.SetAccessor))
|
|
317
|
+
return null;
|
|
318
|
+
const propType = checker.getTypeOfSymbol(prop);
|
|
319
|
+
const optional = (prop.flags & ts.SymbolFlags.Optional) !== 0;
|
|
320
|
+
let p = this.print(propType, depth + 1);
|
|
321
|
+
if (p === null)
|
|
322
|
+
return null;
|
|
323
|
+
const readonly = (prop.checkFlags & READONLY_CHECK_FLAG) !== 0 || hasReadonlyModifier(prop);
|
|
324
|
+
if (readonly)
|
|
325
|
+
readonlyCount++;
|
|
326
|
+
const name = /^[A-Za-z_$][\w$]*$/.test(key) ? key : JSON.stringify(key);
|
|
327
|
+
if (optional && !/\bundefined\b/.test(p))
|
|
328
|
+
p = `${p} | undefined`;
|
|
329
|
+
members.push(`${readonly ? "readonly " : ""}${name}${optional ? "?" : ""}: ${p}`);
|
|
330
|
+
}
|
|
331
|
+
for (const info of checker.getIndexInfosOfType(type)) {
|
|
332
|
+
if (!(info.keyType.flags & ts.TypeFlags.String))
|
|
333
|
+
return null;
|
|
334
|
+
const v = this.print(info.type, depth + 1);
|
|
335
|
+
if (v === null)
|
|
336
|
+
return null;
|
|
337
|
+
members.push(`[key: string]: ${v}`);
|
|
338
|
+
}
|
|
339
|
+
if (members.length === 0)
|
|
340
|
+
return null; // `{}` admits any non-nullish value
|
|
341
|
+
// All-readonly object types may describe frozen values (.readonly()).
|
|
342
|
+
if (props.length > 0 && readonlyCount === props.length)
|
|
343
|
+
return null;
|
|
344
|
+
const text = `{ ${members.join("; ")} }`;
|
|
345
|
+
if (frame.name !== null) {
|
|
346
|
+
if (!this.dry)
|
|
347
|
+
this.declarations.push(`type ${frame.name} = ${text};`);
|
|
348
|
+
return frame.name;
|
|
349
|
+
}
|
|
350
|
+
return text;
|
|
351
|
+
}
|
|
352
|
+
finally {
|
|
353
|
+
this.inProgress.delete(type.id);
|
|
354
|
+
}
|
|
355
|
+
}
|
|
356
|
+
}
|
|
357
|
+
function hasReadonlyModifier(prop) {
|
|
358
|
+
return prop.declarations.some((d) => (ts.isPropertySignature(d) || ts.isPropertyDeclaration(d)) &&
|
|
359
|
+
(d.modifiers?.nodes ?? []).some((m) => m.kind === ts.SyntaxKind.ReadonlyKeyword));
|
|
360
|
+
}
|
|
361
|
+
/** Children of a node in source order (forEachChild order). */
|
|
362
|
+
function childrenOf(node) {
|
|
363
|
+
const out = [];
|
|
364
|
+
ts.forEachChild(node, (c) => {
|
|
365
|
+
out.push(c);
|
|
366
|
+
return undefined;
|
|
367
|
+
}, (list) => {
|
|
368
|
+
for (const c of list.nodes)
|
|
369
|
+
out.push(c);
|
|
370
|
+
return undefined;
|
|
371
|
+
});
|
|
372
|
+
return out;
|
|
373
|
+
}
|
|
374
|
+
function isWriteTarget(node) {
|
|
375
|
+
let child = node;
|
|
376
|
+
let parent = node.parent;
|
|
377
|
+
while (parent !== undefined && ts.isParenthesizedExpression(parent)) {
|
|
378
|
+
child = parent;
|
|
379
|
+
parent = parent.parent;
|
|
380
|
+
}
|
|
381
|
+
if (parent === undefined)
|
|
382
|
+
return false;
|
|
383
|
+
if (ts.isBinaryExpression(parent) && parent.left === child) {
|
|
384
|
+
const k = parent.operatorToken.kind;
|
|
385
|
+
return k >= ts.SyntaxKind.FirstAssignment && k <= ts.SyntaxKind.LastAssignment;
|
|
386
|
+
}
|
|
387
|
+
if (ts.isPrefixUnaryExpression(parent) || ts.isPostfixUnaryExpression(parent)) {
|
|
388
|
+
const op = parent.operator;
|
|
389
|
+
return op === ts.SyntaxKind.PlusPlusToken || op === ts.SyntaxKind.MinusMinusToken;
|
|
390
|
+
}
|
|
391
|
+
if (ts.isDeleteExpression(parent))
|
|
392
|
+
return true;
|
|
393
|
+
if (ts.isForOfStatement(parent) || ts.isForInStatement(parent))
|
|
394
|
+
return parent.initializer === child;
|
|
395
|
+
if (ts.isShorthandPropertyAssignment(parent))
|
|
396
|
+
return true;
|
|
397
|
+
if (ts.isArrayLiteralExpression(parent) ||
|
|
398
|
+
ts.isPropertyAssignment(parent) ||
|
|
399
|
+
ts.isSpreadElement(parent)) {
|
|
400
|
+
// Destructuring assignment targets: conservative, skip.
|
|
401
|
+
let up = parent;
|
|
402
|
+
while (up !== undefined &&
|
|
403
|
+
(ts.isArrayLiteralExpression(up) ||
|
|
404
|
+
ts.isObjectLiteralExpression(up) ||
|
|
405
|
+
ts.isPropertyAssignment(up) ||
|
|
406
|
+
ts.isSpreadElement(up)))
|
|
407
|
+
up = up.parent;
|
|
408
|
+
if (up !== undefined &&
|
|
409
|
+
ts.isBinaryExpression(up) &&
|
|
410
|
+
up.operatorToken.kind === ts.SyntaxKind.EqualsToken)
|
|
411
|
+
return true;
|
|
412
|
+
}
|
|
413
|
+
return false;
|
|
414
|
+
}
|
|
415
|
+
function inOptionalChain(node) {
|
|
416
|
+
const parent = node.parent;
|
|
417
|
+
if (parent === undefined)
|
|
418
|
+
return false;
|
|
419
|
+
if ((ts.isPropertyAccessExpression(parent) ||
|
|
420
|
+
ts.isElementAccessExpression(parent) ||
|
|
421
|
+
ts.isCallExpression(parent)) &&
|
|
422
|
+
parent.expression === node &&
|
|
423
|
+
(parent.questionDotToken !== undefined || (parent.flags & ts.NodeFlags.OptionalChain) !== 0))
|
|
424
|
+
return true;
|
|
425
|
+
return ((ts.isPropertyAccessExpression(node) ||
|
|
426
|
+
ts.isElementAccessExpression(node) ||
|
|
427
|
+
ts.isCallExpression(node)) &&
|
|
428
|
+
(node.flags & ts.NodeFlags.OptionalChain) !== 0);
|
|
429
|
+
}
|
|
430
|
+
function isCallee(node) {
|
|
431
|
+
const p = node.parent;
|
|
432
|
+
return (p !== undefined &&
|
|
433
|
+
(ts.isCallExpression(p) || ts.isNewExpression(p) || ts.isTaggedTemplateExpression(p)) &&
|
|
434
|
+
(ts.isTaggedTemplateExpression(p) ? p.tag === node : p.expression === node));
|
|
435
|
+
}
|
|
436
|
+
function inTypeContext(node) {
|
|
437
|
+
for (let p = node.parent; p !== undefined; p = p.parent) {
|
|
438
|
+
if (ts.isTypeNode(p) || ts.isTypeQueryNode(p))
|
|
439
|
+
return true;
|
|
440
|
+
if (ts.isExpressionWithTypeArguments(p) && p.parent && ts.isHeritageClause(p.parent))
|
|
441
|
+
return true;
|
|
442
|
+
if (ts.isStatement(p))
|
|
443
|
+
return false;
|
|
444
|
+
}
|
|
445
|
+
return false;
|
|
446
|
+
}
|
|
447
|
+
function unwrapTransparent(node) {
|
|
448
|
+
let e = node;
|
|
449
|
+
while (ts.isParenthesizedExpression(e) || ts.isNonNullExpression(e) || ts.isAwaitExpression(e))
|
|
450
|
+
e = e.expression;
|
|
451
|
+
return e;
|
|
452
|
+
}
|
|
453
|
+
/** Plans the projection for one program pair. Answers null when nothing
|
|
454
|
+
* in the user files projects (the program stays as it is). */
|
|
455
|
+
export function planDeclProjection(input) {
|
|
456
|
+
const jsChecker = input.jsProgram.getTypeChecker();
|
|
457
|
+
const declChecker = input.declProgram.getTypeChecker();
|
|
458
|
+
const printer = new TypePrinter(declChecker);
|
|
459
|
+
const plan = [];
|
|
460
|
+
const edits = new Map();
|
|
461
|
+
const typeAt = (checker, node) => {
|
|
462
|
+
try {
|
|
463
|
+
return checker.getTypeAtLocation(node);
|
|
464
|
+
}
|
|
465
|
+
catch {
|
|
466
|
+
return null;
|
|
467
|
+
}
|
|
468
|
+
};
|
|
469
|
+
const isAnyish = (t) => t !== null && (t.flags & ANYISH) !== 0;
|
|
470
|
+
const resolveAlias = (s) => {
|
|
471
|
+
if (s === undefined || !(s.flags & ts.SymbolFlags.Alias))
|
|
472
|
+
return s;
|
|
473
|
+
try {
|
|
474
|
+
return declChecker.getAliasedSymbol(s);
|
|
475
|
+
}
|
|
476
|
+
catch {
|
|
477
|
+
return s;
|
|
478
|
+
}
|
|
479
|
+
};
|
|
480
|
+
const declSymbol = (n) => {
|
|
481
|
+
try {
|
|
482
|
+
return resolveAlias(declChecker.getSymbolAtLocation(n));
|
|
483
|
+
}
|
|
484
|
+
catch {
|
|
485
|
+
return undefined;
|
|
486
|
+
}
|
|
487
|
+
};
|
|
488
|
+
const namesPackageSymbol = (node) => {
|
|
489
|
+
let found = false;
|
|
490
|
+
const visit = (n) => {
|
|
491
|
+
if (found)
|
|
492
|
+
return;
|
|
493
|
+
if (ts.isIdentifier(n) && declaredInPackage(declSymbol(n))) {
|
|
494
|
+
found = true;
|
|
495
|
+
return;
|
|
496
|
+
}
|
|
497
|
+
for (const c of childrenOf(n))
|
|
498
|
+
visit(c);
|
|
499
|
+
};
|
|
500
|
+
visit(node);
|
|
501
|
+
return found;
|
|
502
|
+
};
|
|
503
|
+
for (const file of input.userFiles) {
|
|
504
|
+
const jsSf = input.jsProgram.getSourceFile(file);
|
|
505
|
+
const declSf = input.declProgram.getSourceFile(file);
|
|
506
|
+
if (jsSf === undefined || declSf === undefined || jsSf.text !== declSf.text)
|
|
507
|
+
continue;
|
|
508
|
+
const fileEdits = [];
|
|
509
|
+
/** Candidate expressions (by js node) with their declared type, named
|
|
510
|
+
* only for the casts that survive suppression. */
|
|
511
|
+
const exprCandidates = new Map();
|
|
512
|
+
const exprOrder = [];
|
|
513
|
+
/** Reads whose projectable receiver the JavaScript world types `any`:
|
|
514
|
+
* kept only when nothing types the receiver. */
|
|
515
|
+
const deferred = new Set();
|
|
516
|
+
/** Package calls whose declared type does not project. */
|
|
517
|
+
const unprojected = new Set();
|
|
518
|
+
/** The declaration-world twin of every walked node. */
|
|
519
|
+
const twins = new Map();
|
|
520
|
+
const considerType = (jsNode, declNode) => {
|
|
521
|
+
if (!ts.isTypeReferenceNode(jsNode) &&
|
|
522
|
+
!ts.isIndexedAccessTypeNode(jsNode) &&
|
|
523
|
+
!ts.isExpressionWithTypeArguments(jsNode))
|
|
524
|
+
return false;
|
|
525
|
+
if (ts.isExpressionWithTypeArguments(jsNode)) {
|
|
526
|
+
if (!jsNode.parent || !ts.isHeritageClause(jsNode.parent))
|
|
527
|
+
return false;
|
|
528
|
+
if (!jsNode.parent.parent || !ts.isInterfaceDeclaration(jsNode.parent.parent))
|
|
529
|
+
return false;
|
|
530
|
+
}
|
|
531
|
+
let jsType;
|
|
532
|
+
let declType;
|
|
533
|
+
try {
|
|
534
|
+
jsType = ts.isExpressionWithTypeArguments(jsNode)
|
|
535
|
+
? jsChecker.getTypeAtLocation(jsNode)
|
|
536
|
+
: jsChecker.getTypeFromTypeNode(jsNode);
|
|
537
|
+
declType = ts.isExpressionWithTypeArguments(declNode)
|
|
538
|
+
? declChecker.getTypeAtLocation(declNode)
|
|
539
|
+
: declChecker.getTypeFromTypeNode(declNode);
|
|
540
|
+
}
|
|
541
|
+
catch {
|
|
542
|
+
return false;
|
|
543
|
+
}
|
|
544
|
+
if (!isAnyish(jsType) || declType === null)
|
|
545
|
+
return false;
|
|
546
|
+
if (!namesPackageSymbol(declNode))
|
|
547
|
+
return false;
|
|
548
|
+
const alias = printer.project(declType);
|
|
549
|
+
if (alias === null)
|
|
550
|
+
return false;
|
|
551
|
+
const start = ts.tokenStartOfNode(jsNode);
|
|
552
|
+
fileEdits.push({ start, end: jsNode.end, text: alias });
|
|
553
|
+
plan.push(`${file}:${start}: type ${jsSf.text.slice(start, jsNode.end)} -> ${alias}`);
|
|
554
|
+
return true;
|
|
555
|
+
};
|
|
556
|
+
const considerExpr = (jsNode, declNode) => {
|
|
557
|
+
if (!ts.isExpression(jsNode))
|
|
558
|
+
return;
|
|
559
|
+
const isCall = ts.isCallExpression(jsNode) ||
|
|
560
|
+
ts.isNewExpression(jsNode) ||
|
|
561
|
+
ts.isTaggedTemplateExpression(jsNode);
|
|
562
|
+
const isAccess = ts.isPropertyAccessExpression(jsNode) || ts.isElementAccessExpression(jsNode);
|
|
563
|
+
const isAwait = ts.isAwaitExpression(jsNode);
|
|
564
|
+
if (!isCall && !isAccess && !isAwait && !ts.isIdentifier(jsNode))
|
|
565
|
+
return;
|
|
566
|
+
if (inTypeContext(jsNode) || isCallee(jsNode) || isWriteTarget(jsNode))
|
|
567
|
+
return;
|
|
568
|
+
if (inOptionalChain(jsNode))
|
|
569
|
+
return;
|
|
570
|
+
const parent = jsNode.parent;
|
|
571
|
+
if (parent !== undefined && ts.isExpressionStatement(parent))
|
|
572
|
+
return;
|
|
573
|
+
if (parent !== undefined &&
|
|
574
|
+
(ts.isImportSpecifier(parent) ||
|
|
575
|
+
ts.isImportClause(parent) ||
|
|
576
|
+
ts.isNamespaceImport(parent) ||
|
|
577
|
+
ts.isExportSpecifier(parent)))
|
|
578
|
+
return;
|
|
579
|
+
if (ts.isIdentifier(jsNode)) {
|
|
580
|
+
if (parent !== undefined && ts.isPropertyAccessExpression(parent) && parent.name === jsNode)
|
|
581
|
+
return;
|
|
582
|
+
}
|
|
583
|
+
const jsType = typeAt(jsChecker, jsNode);
|
|
584
|
+
if (!isAnyish(jsType))
|
|
585
|
+
return;
|
|
586
|
+
// Package-produced?
|
|
587
|
+
const d = declNode;
|
|
588
|
+
let produced = false;
|
|
589
|
+
if (ts.isCallExpression(d) || ts.isNewExpression(d)) {
|
|
590
|
+
const callee = d.expression;
|
|
591
|
+
const target = ts.isPropertyAccessExpression(callee) ? callee.name : callee;
|
|
592
|
+
let decl;
|
|
593
|
+
try {
|
|
594
|
+
decl = declChecker.getResolvedSignature(d)?.declaration;
|
|
595
|
+
}
|
|
596
|
+
catch {
|
|
597
|
+
decl = undefined;
|
|
598
|
+
}
|
|
599
|
+
produced =
|
|
600
|
+
(declaredInPackage(declSymbol(target)) ||
|
|
601
|
+
(decl !== undefined && isPackageDeclarationFile(ts.getSourceFileOfNode(decl)))) &&
|
|
602
|
+
!passesArgumentThrough(decl);
|
|
603
|
+
}
|
|
604
|
+
else if (ts.isTaggedTemplateExpression(d)) {
|
|
605
|
+
produced = declaredInPackage(declSymbol(d.tag));
|
|
606
|
+
}
|
|
607
|
+
else if (ts.isPropertyAccessExpression(d) || ts.isElementAccessExpression(d)) {
|
|
608
|
+
const recvDecl = typeAt(declChecker, d.expression);
|
|
609
|
+
const recvJs = typeAt(jsChecker, jsNode.expression);
|
|
610
|
+
const recvProjectable = recvDecl !== null && printer.projectable(recvDecl);
|
|
611
|
+
produced = !recvProjectable || (recvJs !== null && !isAnyish(recvJs));
|
|
612
|
+
// A projectable receiver the JavaScript world types `any` is
|
|
613
|
+
// usually typed by another candidate. One that is a package value
|
|
614
|
+
// nothing projects stays `any`, such as a safeParse result narrowed
|
|
615
|
+
// to its success arm (the whole result is not data: its error arm
|
|
616
|
+
// is a class): the read crosses here instead, if the suppression
|
|
617
|
+
// below confirms the receiver stays untyped.
|
|
618
|
+
if (!produced) {
|
|
619
|
+
produced = true;
|
|
620
|
+
deferred.add(jsNode);
|
|
621
|
+
}
|
|
622
|
+
}
|
|
623
|
+
else if (ts.isAwaitExpression(d)) {
|
|
624
|
+
const inner = unwrapTransparent(d.expression);
|
|
625
|
+
produced =
|
|
626
|
+
(ts.isCallExpression(inner) || ts.isPropertyAccessExpression(inner)) &&
|
|
627
|
+
(declaredInPackage(declSymbol(ts.isCallExpression(inner)
|
|
628
|
+
? ts.isPropertyAccessExpression(inner.expression)
|
|
629
|
+
? inner.expression.name
|
|
630
|
+
: inner.expression
|
|
631
|
+
: inner.name)) ||
|
|
632
|
+
isAnyish(typeAt(jsChecker, inner)));
|
|
633
|
+
}
|
|
634
|
+
else if (ts.isIdentifier(d)) {
|
|
635
|
+
const raw = (() => {
|
|
636
|
+
try {
|
|
637
|
+
return declChecker.getSymbolAtLocation(d);
|
|
638
|
+
}
|
|
639
|
+
catch {
|
|
640
|
+
return undefined;
|
|
641
|
+
}
|
|
642
|
+
})();
|
|
643
|
+
produced =
|
|
644
|
+
raw !== undefined &&
|
|
645
|
+
(raw.flags & ts.SymbolFlags.Alias) !== 0 &&
|
|
646
|
+
declaredInPackage(resolveAlias(raw));
|
|
647
|
+
}
|
|
648
|
+
if (!produced)
|
|
649
|
+
return;
|
|
650
|
+
if (isCall && !deferred.has(jsNode)) {
|
|
651
|
+
// Recorded before the contextual-type test below: a package value
|
|
652
|
+
// whose type does not project stays `any` wherever it flows.
|
|
653
|
+
const t = typeAt(declChecker, d);
|
|
654
|
+
if (t === null || !printer.projectable(t))
|
|
655
|
+
unprojected.add(jsNode);
|
|
656
|
+
}
|
|
657
|
+
// A consumer that takes anything needs no conversion.
|
|
658
|
+
try {
|
|
659
|
+
const ctx = declChecker.getContextualType(d);
|
|
660
|
+
if (ctx !== undefined && ctx.flags & ANYISH)
|
|
661
|
+
return;
|
|
662
|
+
}
|
|
663
|
+
catch {
|
|
664
|
+
// no contextual type
|
|
665
|
+
}
|
|
666
|
+
const declType = typeAt(declChecker, d);
|
|
667
|
+
if (declType === null || !printer.projectable(declType))
|
|
668
|
+
return;
|
|
669
|
+
exprCandidates.set(jsNode, declType);
|
|
670
|
+
exprOrder.push(jsNode);
|
|
671
|
+
};
|
|
672
|
+
const annotated = new Set();
|
|
673
|
+
const considerParam = (jsNode, declNode) => {
|
|
674
|
+
if (!ts.isParameter(jsNode) || jsNode.type !== undefined || !ts.isIdentifier(jsNode.name))
|
|
675
|
+
return;
|
|
676
|
+
const fn = jsNode.parent;
|
|
677
|
+
if (fn === undefined || !(ts.isArrowFunction(fn) || ts.isFunctionExpression(fn)))
|
|
678
|
+
return;
|
|
679
|
+
if (jsNode.dotDotDotToken !== undefined)
|
|
680
|
+
return;
|
|
681
|
+
const jsType = typeAt(jsChecker, jsNode.name);
|
|
682
|
+
if (!isAnyish(jsType))
|
|
683
|
+
return;
|
|
684
|
+
const declType = typeAt(declChecker, declNode.name);
|
|
685
|
+
if (declType === null)
|
|
686
|
+
return;
|
|
687
|
+
// Only parameters the package's declarations type (a callback the
|
|
688
|
+
// package calls), not ones the user typed elsewhere.
|
|
689
|
+
try {
|
|
690
|
+
const ctxFn = declChecker.getContextualType(declNode.parent);
|
|
691
|
+
if (ctxFn === undefined)
|
|
692
|
+
return;
|
|
693
|
+
const sigs = declChecker.getCallSignatures(ctxFn);
|
|
694
|
+
if (!sigs.some((s) => s.declaration !== undefined &&
|
|
695
|
+
isPackageDeclarationFile(ts.getSourceFileOfNode(s.declaration))))
|
|
696
|
+
return;
|
|
697
|
+
}
|
|
698
|
+
catch {
|
|
699
|
+
return;
|
|
700
|
+
}
|
|
701
|
+
const alias = printer.project(declType);
|
|
702
|
+
if (alias === null)
|
|
703
|
+
return;
|
|
704
|
+
annotated.add(jsNode);
|
|
705
|
+
const name = jsNode.name;
|
|
706
|
+
const nameStart = ts.tokenStartOfNode(name);
|
|
707
|
+
const text = jsSf.text;
|
|
708
|
+
// `x => ...` or `async x => ...`: nothing but the modifiers comes
|
|
709
|
+
// before the parameter, which then needs parentheses for its type.
|
|
710
|
+
const head = ts.isArrowFunction(fn)
|
|
711
|
+
? ((ts.getModifiers(fn) ?? []).at(-1)?.end ?? ts.tokenStartOfNode(fn))
|
|
712
|
+
: nameStart;
|
|
713
|
+
const bareArrow = ts.isArrowFunction(fn) &&
|
|
714
|
+
fn.parameters.nodes.length === 1 &&
|
|
715
|
+
text.slice(head, nameStart).trim() === "";
|
|
716
|
+
const afterName = jsNode.questionToken !== undefined ? jsNode.questionToken.end : name.end;
|
|
717
|
+
if (bareArrow) {
|
|
718
|
+
fileEdits.push({ start: nameStart, end: nameStart, text: "(" });
|
|
719
|
+
fileEdits.push({ start: afterName, end: afterName, text: `: ${alias})` });
|
|
720
|
+
}
|
|
721
|
+
else {
|
|
722
|
+
fileEdits.push({ start: afterName, end: afterName, text: `: ${alias}` });
|
|
723
|
+
}
|
|
724
|
+
plan.push(`${file}:${nameStart}: parameter ${name.text}: ${alias}`);
|
|
725
|
+
};
|
|
726
|
+
const walk = (jsNode, declNode) => {
|
|
727
|
+
if (jsNode.kind !== declNode.kind)
|
|
728
|
+
return;
|
|
729
|
+
twins.set(jsNode, declNode);
|
|
730
|
+
if (ts.isTypeNode(jsNode) || ts.isExpressionWithTypeArguments(jsNode)) {
|
|
731
|
+
if (considerType(jsNode, declNode))
|
|
732
|
+
return;
|
|
733
|
+
}
|
|
734
|
+
else {
|
|
735
|
+
considerParam(jsNode, declNode);
|
|
736
|
+
considerExpr(jsNode, declNode);
|
|
737
|
+
}
|
|
738
|
+
const a = childrenOf(jsNode);
|
|
739
|
+
const b = childrenOf(declNode);
|
|
740
|
+
if (a.length !== b.length)
|
|
741
|
+
return;
|
|
742
|
+
for (let i = 0; i < a.length; i++)
|
|
743
|
+
walk(a[i], b[i]);
|
|
744
|
+
};
|
|
745
|
+
walk(jsSf, declSf);
|
|
746
|
+
// Suppress candidates whose receiver chain another candidate types.
|
|
747
|
+
const symbolTyped = new Map();
|
|
748
|
+
const willBeTyped = (e, depth = 0) => {
|
|
749
|
+
if (depth > 32)
|
|
750
|
+
return false;
|
|
751
|
+
if (exprCandidates.has(e))
|
|
752
|
+
return true;
|
|
753
|
+
if (ts.isParenthesizedExpression(e) || ts.isNonNullExpression(e) || ts.isAwaitExpression(e))
|
|
754
|
+
return willBeTyped(e.expression, depth + 1);
|
|
755
|
+
if (ts.isAsExpression(e))
|
|
756
|
+
return false;
|
|
757
|
+
if (ts.isPropertyAccessExpression(e) || ts.isElementAccessExpression(e))
|
|
758
|
+
return willBeTyped(e.expression, depth + 1);
|
|
759
|
+
if (ts.isIdentifier(e)) {
|
|
760
|
+
let sym;
|
|
761
|
+
try {
|
|
762
|
+
sym = jsChecker.getSymbolAtLocation(e);
|
|
763
|
+
}
|
|
764
|
+
catch {
|
|
765
|
+
return false;
|
|
766
|
+
}
|
|
767
|
+
if (sym === undefined)
|
|
768
|
+
return false;
|
|
769
|
+
const known = symbolTyped.get(sym);
|
|
770
|
+
if (known !== undefined)
|
|
771
|
+
return known;
|
|
772
|
+
symbolTyped.set(sym, false);
|
|
773
|
+
let result = false;
|
|
774
|
+
const decls = sym.declarations;
|
|
775
|
+
if (decls.length === 1) {
|
|
776
|
+
const decl = decls[0];
|
|
777
|
+
if (ts.isVariableDeclaration(decl) &&
|
|
778
|
+
decl.initializer !== undefined &&
|
|
779
|
+
decl.type === undefined)
|
|
780
|
+
result = willBeTyped(decl.initializer, depth + 1);
|
|
781
|
+
else if (ts.isParameter(decl) && annotated.has(decl))
|
|
782
|
+
result = true;
|
|
783
|
+
else if (ts.isBindingElement(decl))
|
|
784
|
+
result = false;
|
|
785
|
+
else if ((ts.isVariableDeclaration(decl) || ts.isParameter(decl)) &&
|
|
786
|
+
decl.type !== undefined)
|
|
787
|
+
result = annotationWillBeTyped(decl.type);
|
|
788
|
+
}
|
|
789
|
+
symbolTyped.set(sym, result);
|
|
790
|
+
return result;
|
|
791
|
+
}
|
|
792
|
+
return false;
|
|
793
|
+
};
|
|
794
|
+
/** An annotation in this file whose declaration-world type projects:
|
|
795
|
+
* after the rewrite it names the projected structure (a package type
|
|
796
|
+
* is replaced by its alias, a user alias of one has its right-hand
|
|
797
|
+
* side replaced). */
|
|
798
|
+
const annotationWillBeTyped = (type) => {
|
|
799
|
+
const twin = twins.get(type);
|
|
800
|
+
if (twin === undefined)
|
|
801
|
+
return false;
|
|
802
|
+
let declType;
|
|
803
|
+
try {
|
|
804
|
+
declType = declChecker.getTypeFromTypeNode(twin);
|
|
805
|
+
}
|
|
806
|
+
catch {
|
|
807
|
+
return false;
|
|
808
|
+
}
|
|
809
|
+
return declType !== null && printer.projectable(declType);
|
|
810
|
+
};
|
|
811
|
+
const receiverOf = (e) => {
|
|
812
|
+
if (ts.isPropertyAccessExpression(e) || ts.isElementAccessExpression(e))
|
|
813
|
+
return e.expression;
|
|
814
|
+
if (ts.isIdentifier(e))
|
|
815
|
+
return null;
|
|
816
|
+
return null;
|
|
817
|
+
};
|
|
818
|
+
const kept = [];
|
|
819
|
+
/** A receiver that stays `any` after the rewrite: a package call whose
|
|
820
|
+
* type does not project, or a user const bound to one. */
|
|
821
|
+
const staysUntyped = (e) => {
|
|
822
|
+
const u = unwrapTransparent(e);
|
|
823
|
+
if (unprojected.has(u))
|
|
824
|
+
return true;
|
|
825
|
+
if (!ts.isIdentifier(u))
|
|
826
|
+
return false;
|
|
827
|
+
let sym;
|
|
828
|
+
try {
|
|
829
|
+
sym = jsChecker.getSymbolAtLocation(u);
|
|
830
|
+
}
|
|
831
|
+
catch {
|
|
832
|
+
return false;
|
|
833
|
+
}
|
|
834
|
+
const decls = sym?.declarations ?? [];
|
|
835
|
+
if (decls.length !== 1)
|
|
836
|
+
return false;
|
|
837
|
+
const decl = decls[0];
|
|
838
|
+
return (ts.isVariableDeclaration(decl) &&
|
|
839
|
+
decl.type === undefined &&
|
|
840
|
+
decl.initializer !== undefined &&
|
|
841
|
+
decl.parent !== undefined &&
|
|
842
|
+
ts.isVariableDeclarationList(decl.parent) &&
|
|
843
|
+
(decl.parent.flags & ts.NodeFlags.Const) !== 0 &&
|
|
844
|
+
unprojected.has(unwrapTransparent(decl.initializer)));
|
|
845
|
+
};
|
|
846
|
+
for (const e of exprOrder) {
|
|
847
|
+
const recv = receiverOf(e);
|
|
848
|
+
if (recv !== null && willBeTyped(recv))
|
|
849
|
+
continue;
|
|
850
|
+
if (deferred.has(e) && (recv === null || !staysUntyped(recv)))
|
|
851
|
+
continue;
|
|
852
|
+
// An identifier candidate that is a user binding never gets here
|
|
853
|
+
// (only package imports are candidates).
|
|
854
|
+
kept.push(e);
|
|
855
|
+
}
|
|
856
|
+
// Nested candidates: keep only the innermost (an outer one is typed by
|
|
857
|
+
// the inner wrap).
|
|
858
|
+
const keptSet = new Set(kept);
|
|
859
|
+
const containsKept = (outer) => {
|
|
860
|
+
let found = false;
|
|
861
|
+
const visit = (n) => {
|
|
862
|
+
if (found)
|
|
863
|
+
return;
|
|
864
|
+
for (const c of childrenOf(n)) {
|
|
865
|
+
if (keptSet.has(c)) {
|
|
866
|
+
found = true;
|
|
867
|
+
return;
|
|
868
|
+
}
|
|
869
|
+
visit(c);
|
|
870
|
+
}
|
|
871
|
+
};
|
|
872
|
+
visit(outer);
|
|
873
|
+
return found;
|
|
874
|
+
};
|
|
875
|
+
for (const e of kept) {
|
|
876
|
+
if (!ts.isAwaitExpression(e) &&
|
|
877
|
+
containsKept(e) &&
|
|
878
|
+
(ts.isPropertyAccessExpression(e) || ts.isElementAccessExpression(e))) {
|
|
879
|
+
// `a.b.c` with `a.b` wrapped: the outer access reads typed data.
|
|
880
|
+
const recv = receiverOf(e);
|
|
881
|
+
if (recv !== null &&
|
|
882
|
+
(keptSet.has(unwrapTransparent(recv)) || willBeTyped(recv)))
|
|
883
|
+
continue;
|
|
884
|
+
}
|
|
885
|
+
const alias = printer.project(exprCandidates.get(e));
|
|
886
|
+
if (alias === null)
|
|
887
|
+
continue;
|
|
888
|
+
const start = ts.tokenStartOfNode(e);
|
|
889
|
+
const stmt = e.parent;
|
|
890
|
+
let prefix = "(";
|
|
891
|
+
// A statement that would start with `(` after a line without a
|
|
892
|
+
// semicolon continues the previous expression: guard it.
|
|
893
|
+
let up = e;
|
|
894
|
+
while (up?.parent !== undefined && !ts.isStatement(up.parent))
|
|
895
|
+
up = up.parent;
|
|
896
|
+
// Only a statement in a statement list can follow such a line; an
|
|
897
|
+
// unbraced body (`for (...) S.parse(x).run()`) follows its header,
|
|
898
|
+
// and a `;` there would become the body.
|
|
899
|
+
const list = up?.parent?.parent;
|
|
900
|
+
if (up?.parent !== undefined &&
|
|
901
|
+
ts.isExpressionStatement(up.parent) &&
|
|
902
|
+
ts.tokenStartOfNode(up.parent) === start &&
|
|
903
|
+
list !== undefined &&
|
|
904
|
+
(ts.isBlock(list) ||
|
|
905
|
+
ts.isSourceFile(list) ||
|
|
906
|
+
ts.isModuleBlock(list) ||
|
|
907
|
+
ts.isCaseClause(list) ||
|
|
908
|
+
ts.isDefaultClause(list)))
|
|
909
|
+
prefix = ";(";
|
|
910
|
+
void stmt;
|
|
911
|
+
fileEdits.push({ start, end: start, text: prefix });
|
|
912
|
+
// Closing parts at one position close inner wraps first.
|
|
913
|
+
fileEdits.push({ start: e.end, end: e.end, text: ` as ${alias})`, rank: -start });
|
|
914
|
+
plan.push(`${file}:${start}: cast ${jsSf.text.slice(start, Math.min(e.end, start + 60)).replace(/\s+/g, " ")} as ${alias}`);
|
|
915
|
+
}
|
|
916
|
+
if (fileEdits.length === 0)
|
|
917
|
+
continue;
|
|
918
|
+
edits.set(file, fileEdits);
|
|
919
|
+
}
|
|
920
|
+
if (edits.size === 0)
|
|
921
|
+
return null;
|
|
922
|
+
const files = new Map();
|
|
923
|
+
for (const [file, list] of edits) {
|
|
924
|
+
const sf = input.jsProgram.getSourceFile(file);
|
|
925
|
+
files.set(file, applyEdits(sf.text, list));
|
|
926
|
+
}
|
|
927
|
+
const declFile = `${input.outDir.split("\\").join("/")}/${DECL_BOUNDARY_FILE}`;
|
|
928
|
+
const declText = "// Generated by scriptc: types projected from npm package declarations.\n" +
|
|
929
|
+
printer.declarations.join("\n") +
|
|
930
|
+
"\n";
|
|
931
|
+
return { files, declFile, declText, plan };
|
|
932
|
+
}
|
|
933
|
+
/** Applies insertions and replacements; overlapping replacements keep the
|
|
934
|
+
* first. Insertions at one position keep their order. */
|
|
935
|
+
export function applyEdits(text, edits) {
|
|
936
|
+
const sorted = edits
|
|
937
|
+
.map((e, i) => ({ ...e, i }))
|
|
938
|
+
.sort((a, b) => a.start - b.start || a.end - b.end || (a.rank ?? 0) - (b.rank ?? 0) || a.i - b.i);
|
|
939
|
+
let out = "";
|
|
940
|
+
let at = 0;
|
|
941
|
+
for (const e of sorted) {
|
|
942
|
+
if (e.start < at)
|
|
943
|
+
continue; // overlaps an earlier replacement
|
|
944
|
+
out += text.slice(at, e.start) + e.text;
|
|
945
|
+
at = e.end;
|
|
946
|
+
}
|
|
947
|
+
return out + text.slice(at);
|
|
948
|
+
}
|
|
949
|
+
//# sourceMappingURL=decl-projection.js.map
|