@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
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
import { lowerTupleAliasDecl, stripTypeWrappers } from "./typed-arguments.js";
|
|
2
|
+
import { allBytesArms, indexedUnionArms, lowerIndexedUnionMember, lowerIndexedUnionNumberRead, lowerIndexedUnionRead, } from "./indexed-unions.js";
|
|
2
3
|
import { declaredMemberOf, isPromisePrototypeRead } from "./expressions/property-access.js";
|
|
3
4
|
import { hostsAll } from "./expressions/hosted-narrowing.js";
|
|
4
5
|
import { requestGeneralStreamSurface } from "./general-streams.js";
|
|
5
|
-
import { lowerForAwaitDynStream } from "./dyn-streams.js";
|
|
6
|
+
import { lowerForAwaitDynStream, nodeStreamInterfaceSide } from "./dyn-streams.js";
|
|
6
7
|
import { lowerForAwaitValueStream } from "./builtins/hash-stream.js";
|
|
7
8
|
import { lowerChildPropertyWrite } from "./handle-properties.js";
|
|
8
9
|
import { matchAllRowsReadByElements, storedMatchAllRowsReadByElements, } from "./containers/match-row-uses.js";
|
|
@@ -22,23 +23,26 @@ import { InternalCompilerError } from "../../errors.js";
|
|
|
22
23
|
* flow (if/while/for/for-of/do, switch, try/catch, abrupt completions),
|
|
23
24
|
* explicit resource management, and blocked-binding poisoning. */
|
|
24
25
|
import * as ts from "../ts7/adapter.js";
|
|
26
|
+
import { lowerOptionalIndex } from "./undefined-index.js";
|
|
25
27
|
import { processDataMemberValue, programReadsExitCode } from "./builtins/process.js";
|
|
26
28
|
import { requireInitFlagStmt } from "./require-initialization.js";
|
|
27
29
|
import { isJsonRequireDecl } from "./json-require.js";
|
|
30
|
+
import { isTimeValueDateDeclaration } from "./date-values.js";
|
|
28
31
|
import { bindingSource } from "../binding-source.js";
|
|
29
32
|
import { lowerConstructorReturn } from "./constructor-returns.js";
|
|
30
|
-
import { cjsExportValueByName, cjsNamespaceDestructureOf, cjsTableMethodEntry, inlineProgramRequireOf, requireNestedPatternsOf, } from "./cjs-inline-require.js";
|
|
33
|
+
import { cjsExportValueByName, cjsNamespaceDestructureOf, cjsTableMethodEntry, inlineProgramRequireOf, requireNestedPatternsOf, splitRequireAssignmentOf, splitRequireBindingOf, splitRequireBindingOfIdent, splitRequireEarlyReadOf, wholeExportSymbolOfModule, } from "./cjs-inline-require.js";
|
|
31
34
|
import { cjsExportMemberWriteGlobalOf, isCjsExportsIdentifier, isCjsModuleExports, isFreshExportsReset, } from "./cjs-exports-object.js";
|
|
32
35
|
import { isDeadTscHelperDecl, tscInteropBindingOfDecl } from "./cjs-tsc-interop.js";
|
|
33
36
|
import { arrayValueRead, arrayValueStore, arrayValueType, unionArrayValueRead, lowerSafeIndexRead, } from "./array-values.js";
|
|
34
37
|
import { lowerForAwaitGenerator, lowerForOfGenerator, lowerYieldStarStatement, } from "./lower-generators.js";
|
|
35
38
|
import { classAsyncGeneratorIterator, lowerForAwaitBuiltin } from "./lower-async-iteration.js";
|
|
36
|
-
import { BOOL, BYTES_U8, CAUGHT, DYN, F64, STRING, UNDEFINED_T, VOID, arrayOf, isDynTypedRefType, isUnitType, shapeHasAccessorSlots, typeEquals, } from "../../ir/ir.js";
|
|
39
|
+
import { BOOL, BYTES_U8, CAUGHT, DATE_T, DYN, F64, SEARCH_PARAMS_T, STRING, UNDEFINED_T, VOID, arrayOf, isDynTypedRefType, isUnitType, shapeHasAccessorSlots, typeEquals, } from "../../ir/ir.js";
|
|
37
40
|
import { PoisonError, boundIdentifiersOf, dynFallbackType, neverTaintedJsType, staticImportNamespaceType, } from "./lowerer.js";
|
|
38
41
|
import { enforceLibBoundary, lowerSurplusCalls } from "./lib-boundary.js";
|
|
39
42
|
import { cjsExportAssignmentOf, cjsExportChainOf, cjsVoidInitPreambleReals, cjsExportDiscardReason, cjsExportTargetLiteral, isCjsJsFile, isEsModuleStamp, isJsSourceFile, locOf, requireEarlyReference, requireSpecOf, } from "../program.js";
|
|
40
43
|
import { isStrictCode } from "./strict-mode.js";
|
|
41
|
-
import {
|
|
44
|
+
import { markSloppyRecordWrites } from "./frozen-records.js";
|
|
45
|
+
import { COMPOUND_ASSIGN_OPS, STR_METHODS, NARROW_FIRST, UNSUPPORTED_STMT, isStdlibMember, sideEffectFreeOptionValue, stdlibGlobalAliasDecl, stdlibGlobalAliasNameOf, bufferNamespaceMember, stdlibGlobalNameOf, } from "./surfaces.js";
|
|
42
46
|
import { isNativeBuiltinValueInitializer } from "./lower-builtin-values.js";
|
|
43
47
|
import { isProvenanceSourceFile } from "../provenance-registry.js";
|
|
44
48
|
import { ambientUndefVarRootOf, lowerImportEquals, nsUndefRead, nsWritableTarget, trapDeclRootOf, } from "./lower-namespaces.js";
|
|
@@ -59,7 +63,7 @@ import { objectFactorySignature } from "./object-factory-new.js";
|
|
|
59
63
|
import { isClassCallback, lowerClassCallbackAssign } from "./class-callbacks.js";
|
|
60
64
|
import { classForInHasKey, classPropertiesHelper } from "./class-dynamic-dispatch.js";
|
|
61
65
|
import { genericIfaceBindingKeepsClass, superConditionLead } from "./lower-classes.js";
|
|
62
|
-
import { lowerStreamUnderscoreAssign, streamClassAliasDecl } from "./lower-stream.js";
|
|
66
|
+
import { lowerStreamUnderscoreAssign, streamClassAliasDecl, streamSidesOf, } from "./lower-stream.js";
|
|
63
67
|
import { staticAssertInstanceDecl } from "./assert-instances.js";
|
|
64
68
|
import { lowerHttpResPropertyAssignment, lowerHttpServerTimeoutAssignment, lowerNetServerMaxConnectionsAssignment, lowerServerCloseOverrideAssignment, } from "./lower-server.js";
|
|
65
69
|
import { lowerUrlAssignment } from "./builtins/url.js";
|
|
@@ -70,7 +74,7 @@ import { lowerNodeModuleCall } from "./builtins/module-resolution.js";
|
|
|
70
74
|
import { registerBuiltinCallableAlias } from "./builtins/callable-aliases.js";
|
|
71
75
|
import { builtinClassAliasOwnsNoSlot, registerBuiltinClassAlias } from "./builtins/class-values.js";
|
|
72
76
|
import { lowerEnumDeclaration } from "./lower-enums.js";
|
|
73
|
-
import { abstractPropertyDeclOf, aliasTypeofNarrows, isMatchSliceType, lowerAbsenceProbe, lowerCompoundValueToTarget, lowerElementCompoundStatement, lowerIncDec, lowerIncDecTarget,
|
|
77
|
+
import { abstractPropertyDeclOf, aliasTypeofNarrows, isMatchSliceType, lowerAbsenceProbe, lowerCompoundValueToTarget, lowerElementCompoundStatement, lowerIncDec, lowerIncDecTarget, lowerGroupsProjection, matchResultNamedGroupsOf, runtimeOptionalGuardIds, runtimeOptionalTrueIds, symbolFieldInfo, withRuntimeOptionalNarrowed, } from "./lower-exprs.js";
|
|
74
78
|
import { globalSymbolKey } from "./expressions/global-symbols.js";
|
|
75
79
|
import { identifiersNamed } from "./identifier-uses.js";
|
|
76
80
|
import { lowerShortCircuitAssignment } from "./expressions/nullish-assignment.js";
|
|
@@ -89,6 +93,7 @@ import { npmStaticPackageOfPath } from "../npm-static.js";
|
|
|
89
93
|
import { fenceNodeModuleMutation } from "./lower-node-module.js";
|
|
90
94
|
import { fencePerfEntryKeyWalk } from "./builtins/performance.js";
|
|
91
95
|
import { classGeneratorIterable } from "./class-iterables.js";
|
|
96
|
+
import { iterableUnionOf, lowerForOfIterable } from "./iterable-values.js";
|
|
92
97
|
/** An opted package's directly-returned empty array may take the function's
|
|
93
98
|
* explicit static return element type. This is the common JS accumulator
|
|
94
99
|
* shape (`const result = []; result.push(value); return result`) and is
|
|
@@ -808,6 +813,46 @@ export function predeclareForwardCapture(lowerer, symbol) {
|
|
|
808
813
|
}
|
|
809
814
|
return false;
|
|
810
815
|
}
|
|
816
|
+
/** The CLASS-DECLARATION twin of predeclareForwardCapture: a function
|
|
817
|
+
* hoisted above a local `class D` (`function make() { return new D(); }`
|
|
818
|
+
* reached through an earlier function) captures the class binding, which
|
|
819
|
+
* is in its temporal dead zone until the class statement runs. The class
|
|
820
|
+
* cannot be collected yet (its heritage may name bindings declared between
|
|
821
|
+
* here and the statement), so the binding is pre-declared as a TDZ box
|
|
822
|
+
* holding the class as a checked-dynamic constructor; the class statement
|
|
823
|
+
* later initializes it, and every reference reads it from there. */
|
|
824
|
+
export function predeclareForwardClass(lowerer, symbol) {
|
|
825
|
+
const decl = symbol.valueDeclaration;
|
|
826
|
+
if (!decl || !ts.isClassDeclaration(decl) || decl.name === undefined)
|
|
827
|
+
return false;
|
|
828
|
+
if (!isJsSourceFile(ts.getSourceFileOfNode(decl)))
|
|
829
|
+
return false;
|
|
830
|
+
for (let i = lowerer.activeStmtLists.length - 1; i >= 0; i--) {
|
|
831
|
+
const entry = lowerer.activeStmtLists[i];
|
|
832
|
+
const idx = entry.stmts.indexOf(decl);
|
|
833
|
+
if (idx < 0)
|
|
834
|
+
continue;
|
|
835
|
+
if (idx < entry.index || entry.ctx === lowerer.ctx || entry.ctx.tdzPredeclared.has(symbol))
|
|
836
|
+
return false;
|
|
837
|
+
const name = decl.name.text;
|
|
838
|
+
const count = entry.ctx.localCounters.get(name) ?? 0;
|
|
839
|
+
entry.ctx.localCounters.set(name, count + 1);
|
|
840
|
+
const local = {
|
|
841
|
+
id: `${name}.${count}`,
|
|
842
|
+
name,
|
|
843
|
+
type: DYN,
|
|
844
|
+
mutable: false,
|
|
845
|
+
boxed: true,
|
|
846
|
+
tdz: true,
|
|
847
|
+
};
|
|
848
|
+
entry.ctx.locals.push(local);
|
|
849
|
+
entry.frame.set(symbol, local);
|
|
850
|
+
entry.out.push({ kind: "varDecl", localId: local.id, init: null, loc: locOf(decl) });
|
|
851
|
+
entry.ctx.tdzPredeclared.set(symbol, local);
|
|
852
|
+
return true;
|
|
853
|
+
}
|
|
854
|
+
return false;
|
|
855
|
+
}
|
|
811
856
|
/** The FUNCTION-DECLARATION twin of predeclareForwardCapture: JS hoists a
|
|
812
857
|
* nested `function f() {}` to scope entry — the binding is LIVE from the
|
|
813
858
|
* first statement, so a reference lexically above the declaration in the
|
|
@@ -999,6 +1044,32 @@ function lowerJsVarFromExisting(lowerer, decl, symbol) {
|
|
|
999
1044
|
loc: locOf(decl),
|
|
1000
1045
|
};
|
|
1001
1046
|
}
|
|
1047
|
+
/** Whether a JavaScript declaration's object value changes shape after its
|
|
1048
|
+
* initializer (jsOpenObjectType, jsObjectBindingExpands) or carries
|
|
1049
|
+
* methods, so only the checked-dynamic representation holds it.
|
|
1050
|
+
* `inferred` is the declaration's mapped checker type. */
|
|
1051
|
+
function jsDeclarationExpandsObject(lowerer, decl, inferred) {
|
|
1052
|
+
const arms = inferred?.kind === "union"
|
|
1053
|
+
? (lowerer.unions.get(inferred.unionId)?.arms ?? [])
|
|
1054
|
+
: inferred
|
|
1055
|
+
? [inferred]
|
|
1056
|
+
: [];
|
|
1057
|
+
return ((!decl.type &&
|
|
1058
|
+
!hasJsTypeAnnotation(decl) &&
|
|
1059
|
+
inferred !== null &&
|
|
1060
|
+
jsOpenObjectType(decl, inferred, lowerer.shapes, lowerer.unions).kind === "dyn") ||
|
|
1061
|
+
arms.some((arm) => arm.kind === "record" && jsObjectBindingExpands(lowerer, decl, arm)) ||
|
|
1062
|
+
(isJsSourceFile(ts.getSourceFileOfNode(decl)) &&
|
|
1063
|
+
!decl.type &&
|
|
1064
|
+
!hasJsTypeAnnotation(decl) &&
|
|
1065
|
+
decl.initializer !== undefined &&
|
|
1066
|
+
ts.isObjectLiteralExpression(decl.initializer) &&
|
|
1067
|
+
decl.initializer.properties.nodes.some((property) => ts.isMethodDeclaration(property) ||
|
|
1068
|
+
ts.isAccessor(property) ||
|
|
1069
|
+
(ts.isPropertyAssignment(property) &&
|
|
1070
|
+
(ts.isFunctionExpression(property.initializer) ||
|
|
1071
|
+
ts.isArrowFunction(property.initializer))))));
|
|
1072
|
+
}
|
|
1002
1073
|
/** The `var` symbol's function-scoped binding TYPE — the declared type at
|
|
1003
1074
|
* the binding name, with the JS-source fallbacks every mutable binding
|
|
1004
1075
|
* takes (an empty-object-literal type is checked-dynamic because tsc
|
|
@@ -1030,6 +1101,17 @@ function varBindingType(lowerer, nameNode) {
|
|
|
1030
1101
|
}
|
|
1031
1102
|
if (!type || type.kind === "void")
|
|
1032
1103
|
return null;
|
|
1104
|
+
// A JavaScript `var` holds whatever its writes store, as a `let` does:
|
|
1105
|
+
// the checker types it by its initializer and checks no later write
|
|
1106
|
+
// (`var fraction = 0;`, later `fraction = match[7].slice(0, 3)`), and an
|
|
1107
|
+
// object it holds may gain members (`mark.snippet = snippet(mark)`).
|
|
1108
|
+
if (type.kind !== "dyn" &&
|
|
1109
|
+
ts.isVariableDeclaration(nameNode.parent) &&
|
|
1110
|
+
nameNode.parent.name === nameNode &&
|
|
1111
|
+
isJsSourceFile(ts.getSourceFileOfNode(nameNode)) &&
|
|
1112
|
+
(jsBindingHasOpenWrites(lowerer, nameNode.parent) ||
|
|
1113
|
+
jsDeclarationExpandsObject(lowerer, nameNode.parent, type)))
|
|
1114
|
+
return DYN;
|
|
1033
1115
|
// A binding readable before its first store holds undefined until then.
|
|
1034
1116
|
return lowerer.runtimeOptionalBindingType(nameNode, type);
|
|
1035
1117
|
}
|
|
@@ -1299,8 +1381,24 @@ export function lowerStmt(lowerer, stmt) {
|
|
|
1299
1381
|
if (!stmt.name)
|
|
1300
1382
|
lowerer.unsupported("SC1090", stmt, "anonymous local class declarations");
|
|
1301
1383
|
const info = lowerer.lowerClassExpressionInfo(stmt);
|
|
1384
|
+
// An earlier hoisted function captured the class: its TDZ box exists.
|
|
1385
|
+
const symbol = lowerer.checker.getSymbolAtLocation(stmt.name);
|
|
1386
|
+
const pre = symbol ? lowerer.ctx.tdzPredeclared.get(symbol) : undefined;
|
|
1387
|
+
if (pre) {
|
|
1388
|
+
lowerer.ctx.tdzPredeclared.delete(symbol);
|
|
1389
|
+
const value = lowerer.coerceToExpected(lowerer.lowerClassExpression(stmt), DYN);
|
|
1390
|
+
return { kind: "assign", localId: pre.id, value, initializes: true, loc: locOf(stmt) };
|
|
1391
|
+
}
|
|
1302
1392
|
const type = { kind: "classval", className: info.def.name };
|
|
1303
1393
|
const local = lowerer.declareLocal(stmt.name, stmt.name.text, type, true);
|
|
1394
|
+
// Static members of a function-local class run while the class value is
|
|
1395
|
+
// built and may read the class by name: the class value assigns the
|
|
1396
|
+
// binding before them.
|
|
1397
|
+
if (info.localClass && (info.runtimeStatics || info.runtimePrototypeMembers))
|
|
1398
|
+
return [
|
|
1399
|
+
{ kind: "varDecl", localId: local.id, init: null, loc: locOf(stmt) },
|
|
1400
|
+
{ kind: "exprStmt", expr: lowerer.lowerClassExpression(stmt, local), loc: locOf(stmt) },
|
|
1401
|
+
];
|
|
1304
1402
|
const init = lowerer.lowerClassExpression(stmt);
|
|
1305
1403
|
return { kind: "varDecl", localId: local.id, init, loc: locOf(stmt) };
|
|
1306
1404
|
}
|
|
@@ -1566,6 +1664,19 @@ export function lowerVarStatement(lowerer, stmt) {
|
|
|
1566
1664
|
});
|
|
1567
1665
|
}
|
|
1568
1666
|
function lowerVarDeclarator(lowerer, stmt, decl, isConst, isLet) {
|
|
1667
|
+
// `var m; m = require("./x")`: the declaration is alias plumbing; the
|
|
1668
|
+
// assignment owns the module's run-once %init (cjs-inline-require.ts).
|
|
1669
|
+
// A read that code before the assignment can reach keeps Node's hoisted
|
|
1670
|
+
// `undefined` divergence visible at build time, like a var require
|
|
1671
|
+
// declaration below runnable code.
|
|
1672
|
+
const split = splitRequireBindingOf(lowerer, decl);
|
|
1673
|
+
if (split !== null) {
|
|
1674
|
+
const early = splitRequireEarlyReadOf(lowerer, split);
|
|
1675
|
+
if (early !== null) {
|
|
1676
|
+
lowerer.unsupported("SC1013", early, `var require() binding '${decl.name.text}' below code that can reach it (Node reads undefined before the require runs, which is not modeled — assign the require above the code that can run first)`);
|
|
1677
|
+
}
|
|
1678
|
+
return [];
|
|
1679
|
+
}
|
|
1569
1680
|
// The canonical ESM bridge to a compiled program module. Like a
|
|
1570
1681
|
// top-level CommonJS require declaration, the binding is alias
|
|
1571
1682
|
// plumbing while the dependency evaluates at this statement's
|
|
@@ -2718,6 +2829,18 @@ export function lowerBindingPattern(lowerer, pattern, srcRef, srcType, isLet, ou
|
|
|
2718
2829
|
lowerModuleNamespacePattern(lowerer, pattern, nsSource, isLet, out);
|
|
2719
2830
|
return;
|
|
2720
2831
|
}
|
|
2832
|
+
if (srcType.kind === "url") {
|
|
2833
|
+
lowerUrlObjectPattern(lowerer, pattern, srcRef, isLet, out);
|
|
2834
|
+
return;
|
|
2835
|
+
}
|
|
2836
|
+
if (srcType.kind === "union" &&
|
|
2837
|
+
!isJsSourceFile(ts.getSourceFileOfNode(pattern)) &&
|
|
2838
|
+
lowerer.unions
|
|
2839
|
+
.get(srcType.unionId)
|
|
2840
|
+
?.arms.every((arm) => arm.kind === "record" || arm.kind === "object")) {
|
|
2841
|
+
lowerUnionObjectPattern(lowerer, pattern, srcRef, srcType, isLet, out);
|
|
2842
|
+
return;
|
|
2843
|
+
}
|
|
2721
2844
|
if (srcType.kind !== "record") {
|
|
2722
2845
|
lowerer.unsupported("SC1031", pattern, srcType.kind === "object"
|
|
2723
2846
|
? "object destructuring of class instances (read the fields directly — accessors make the desugar observable)"
|
|
@@ -2900,7 +3023,10 @@ function patternSourceValue(lowerer, value, arrayPattern, out, loc, spelling) {
|
|
|
2900
3023
|
if (!arms ||
|
|
2901
3024
|
!present?.length ||
|
|
2902
3025
|
present.length === arms.length ||
|
|
2903
|
-
(present.length > 1 &&
|
|
3026
|
+
(present.length > 1 &&
|
|
3027
|
+
!(arrayPattern
|
|
3028
|
+
? present.every((arm) => arm.kind === "array")
|
|
3029
|
+
: present.every((arm) => arm.kind === "record" || arm.kind === "object"))))
|
|
2904
3030
|
return value;
|
|
2905
3031
|
for (const [tag, arm] of arms.entries()) {
|
|
2906
3032
|
if (!isUnitType(arm))
|
|
@@ -2994,6 +3120,122 @@ function lowerModuleNamespacePattern(lowerer, pattern, source, isLet, out) {
|
|
|
2994
3120
|
lowerer.bindPatternTarget(el.name, value, isLet, out);
|
|
2995
3121
|
}
|
|
2996
3122
|
}
|
|
3123
|
+
/** The URL getters an object pattern reads (`const { protocol, hostname }
|
|
3124
|
+
* = new URL(text)`), each a read of the URL's current serialization. */
|
|
3125
|
+
const URL_PATTERN_GETTERS = {
|
|
3126
|
+
href: "url.href",
|
|
3127
|
+
origin: "url.origin",
|
|
3128
|
+
protocol: "url.protocol",
|
|
3129
|
+
username: "url.username",
|
|
3130
|
+
password: "url.password",
|
|
3131
|
+
host: "url.host",
|
|
3132
|
+
hostname: "url.hostname",
|
|
3133
|
+
port: "url.port",
|
|
3134
|
+
pathname: "url.pathname",
|
|
3135
|
+
search: "url.search",
|
|
3136
|
+
hash: "url.hash",
|
|
3137
|
+
};
|
|
3138
|
+
/** An object pattern over a URL: each element reads its getter in pattern
|
|
3139
|
+
* order, as `url.name` does; `searchParams` binds the URL's live view.
|
|
3140
|
+
* Methods and rest elements stay fenced. */
|
|
3141
|
+
function lowerUrlObjectPattern(lowerer, pattern, srcRef, isLet, out) {
|
|
3142
|
+
for (const el of pattern.elements.nodes) {
|
|
3143
|
+
if (el.name === undefined)
|
|
3144
|
+
continue;
|
|
3145
|
+
if (el.dotDotDotToken) {
|
|
3146
|
+
lowerer.unsupported("SC1031", el, "rest bindings over URL sources (a URL's properties are prototype getters, which rest elements do not copy)");
|
|
3147
|
+
}
|
|
3148
|
+
const prop = el.propertyName ?? el.name;
|
|
3149
|
+
const propName = ts.isIdentifier(prop) ||
|
|
3150
|
+
ts.isComputedPropertyName(prop) ||
|
|
3151
|
+
ts.isStringLiteralLike(prop) ||
|
|
3152
|
+
ts.isNumericLiteral(prop)
|
|
3153
|
+
? patternKeyNameOf(lowerer, prop)
|
|
3154
|
+
: null;
|
|
3155
|
+
const loc = locOf(el);
|
|
3156
|
+
let value;
|
|
3157
|
+
if (propName !== null && Object.hasOwn(URL_PATTERN_GETTERS, propName)) {
|
|
3158
|
+
value = {
|
|
3159
|
+
kind: "libCall",
|
|
3160
|
+
fn: URL_PATTERN_GETTERS[propName],
|
|
3161
|
+
args: [srcRef()],
|
|
3162
|
+
type: STRING,
|
|
3163
|
+
loc,
|
|
3164
|
+
};
|
|
3165
|
+
}
|
|
3166
|
+
else if (propName === "searchParams") {
|
|
3167
|
+
value = {
|
|
3168
|
+
kind: "libCall",
|
|
3169
|
+
fn: "url.searchParams",
|
|
3170
|
+
args: [srcRef()],
|
|
3171
|
+
type: SEARCH_PARAMS_T,
|
|
3172
|
+
loc,
|
|
3173
|
+
};
|
|
3174
|
+
}
|
|
3175
|
+
else {
|
|
3176
|
+
lowerer.unsupported("SC1031", el, propName === null
|
|
3177
|
+
? "destructuring with computed keys that do not fold to one property name"
|
|
3178
|
+
: `destructuring '${propName}' from a URL (${Object.keys(URL_PATTERN_GETTERS).join(", ")} and searchParams are the supported URL properties)`);
|
|
3179
|
+
}
|
|
3180
|
+
if (el.initializer)
|
|
3181
|
+
value = applyBindingDefault(lowerer, el, value);
|
|
3182
|
+
lowerer.bindPatternTarget(el.name, value, isLet, out);
|
|
3183
|
+
}
|
|
3184
|
+
}
|
|
3185
|
+
/** An object pattern over a union of records and class instances
|
|
3186
|
+
* (`function f({ kind, path }: Add | Remove)`): each element reads a data
|
|
3187
|
+
* field every arm declares with one type, through the runtime tag, as
|
|
3188
|
+
* `value.field` does. Rest elements and fields the arms type differently
|
|
3189
|
+
* stay fenced. */
|
|
3190
|
+
function lowerUnionObjectPattern(lowerer, pattern, srcRef, srcType, isLet, out) {
|
|
3191
|
+
const arms = lowerer.unions.get(srcType.unionId)?.arms ?? [];
|
|
3192
|
+
for (const el of pattern.elements.nodes) {
|
|
3193
|
+
if (el.name === undefined)
|
|
3194
|
+
continue;
|
|
3195
|
+
if (el.dotDotDotToken) {
|
|
3196
|
+
lowerer.unsupported("SC1031", el, `rest bindings over union sources (${NARROW_FIRST})`);
|
|
3197
|
+
}
|
|
3198
|
+
const prop = el.propertyName ?? el.name;
|
|
3199
|
+
const propName = ts.isIdentifier(prop) ||
|
|
3200
|
+
ts.isComputedPropertyName(prop) ||
|
|
3201
|
+
ts.isStringLiteralLike(prop) ||
|
|
3202
|
+
ts.isNumericLiteral(prop)
|
|
3203
|
+
? patternKeyNameOf(lowerer, prop)
|
|
3204
|
+
: null;
|
|
3205
|
+
if (propName === null) {
|
|
3206
|
+
lowerer.unsupported("SC1031", el, "destructuring with computed keys that do not fold to one property name");
|
|
3207
|
+
}
|
|
3208
|
+
let common = null;
|
|
3209
|
+
for (const arm of arms) {
|
|
3210
|
+
let ft;
|
|
3211
|
+
if (arm.kind === "record") {
|
|
3212
|
+
ft = lowerer.shapes.get(arm.shapeId)?.fields.find((f) => f.name === propName)?.type;
|
|
3213
|
+
}
|
|
3214
|
+
else if (arm.kind === "object") {
|
|
3215
|
+
ft = lowerer.classes.get(arm.className)?.fields.get(propName);
|
|
3216
|
+
}
|
|
3217
|
+
if (!ft || ft.kind === "void" || isUnitType(ft) || (common && !typeEquals(common, ft))) {
|
|
3218
|
+
common = null;
|
|
3219
|
+
break;
|
|
3220
|
+
}
|
|
3221
|
+
common = ft;
|
|
3222
|
+
}
|
|
3223
|
+
if (common === null) {
|
|
3224
|
+
lowerer.unsupported("SC1031", el, `destructuring '${propName}' from a union whose arms type it differently (every arm must be a record or class with a same-typed field '${propName}' — ${NARROW_FIRST})`);
|
|
3225
|
+
}
|
|
3226
|
+
let value = {
|
|
3227
|
+
kind: "unionDisc",
|
|
3228
|
+
unionId: srcType.unionId,
|
|
3229
|
+
field: propName,
|
|
3230
|
+
value: srcRef(),
|
|
3231
|
+
type: common,
|
|
3232
|
+
loc: locOf(el),
|
|
3233
|
+
};
|
|
3234
|
+
if (el.initializer)
|
|
3235
|
+
value = applyBindingDefault(lowerer, el, value);
|
|
3236
|
+
lowerer.bindPatternTarget(el.name, value, isLet, out);
|
|
3237
|
+
}
|
|
3238
|
+
}
|
|
2997
3239
|
/** Whether a pattern's first element has a computed key that does not
|
|
2998
3240
|
* fold to one property name, so the key evaluates at run time. */
|
|
2999
3241
|
function startsWithRuntimeKey(lowerer, pattern) {
|
|
@@ -3881,11 +4123,15 @@ export function bindPatternTarget(lowerer, name, value, isLet, out, allowDynObje
|
|
|
3881
4123
|
}
|
|
3882
4124
|
// Preserve checked-value pattern bindings when the inferred type
|
|
3883
4125
|
// cannot represent them without a refusal or an alias-breaking copy.
|
|
4126
|
+
// A name destructured from a container of an evolving array
|
|
4127
|
+
// (evolvingArrayHold) may hold the array, which the checker types by
|
|
4128
|
+
// the elements written before it.
|
|
3884
4129
|
const dynStays = value.type.kind === "dyn" &&
|
|
3885
|
-
(() => {
|
|
4130
|
+
((() => {
|
|
3886
4131
|
const mapped = lowerer.mapTypeOf(lowerer.typeOf(name));
|
|
3887
4132
|
return mapped === null || jsBindingKeepsCheckedObject(lowerer, name, mapped);
|
|
3888
|
-
})()
|
|
4133
|
+
})() ||
|
|
4134
|
+
readsHeldEvolvingArray(lowerer, name));
|
|
3889
4135
|
let type = dynStays
|
|
3890
4136
|
? DYN
|
|
3891
4137
|
: (lowerer.runtimeOptionalBindingType(name, lowerer.irTypeOf(name)) ??
|
|
@@ -3969,9 +4215,10 @@ export function lowerVarDeclList(lowerer, list) {
|
|
|
3969
4215
|
* `never[]` or `any[]` and each later read by the elements written before
|
|
3970
4216
|
* it, and reads inside closures as the unsettled array. When every read
|
|
3971
4217
|
* with a settled element type maps to the same array type, the binding has
|
|
3972
|
-
* that type. When reads disagree
|
|
3973
|
-
*
|
|
3974
|
-
*
|
|
4218
|
+
* that type. When reads disagree, a write (`xs.push(v)`, `xs.unshift(v)`,
|
|
4219
|
+
* `xs.push(...values)`, `xs[i] = v`) stores a value that type's element does
|
|
4220
|
+
* not hold, or the binding is reassigned, it is checked-dynamic, as the same
|
|
4221
|
+
* binding is at module scope. Null for other bindings. */
|
|
3975
4222
|
function evolvingArrayType(lowerer, decl) {
|
|
3976
4223
|
if (!ts.isIdentifier(decl.name) || decl.initializer === undefined)
|
|
3977
4224
|
return null;
|
|
@@ -3999,13 +4246,19 @@ function evolvingArrayType(lowerer, decl) {
|
|
|
3999
4246
|
};
|
|
4000
4247
|
const scope = owner(decl);
|
|
4001
4248
|
let result = null;
|
|
4249
|
+
// The values the binding's writes store, checked against the element
|
|
4250
|
+
// type once the reads settle it.
|
|
4251
|
+
const written = [];
|
|
4002
4252
|
// The file's identifiers are indexed by name once (identifiersNamed), so
|
|
4003
|
-
// each binding resolves only the uses spelled like it.
|
|
4253
|
+
// each binding resolves only the uses spelled like it. A shorthand
|
|
4254
|
+
// property (`{ xs }`) is a use too.
|
|
4004
4255
|
for (const node of identifiersNamed(lowerer, ts.getSourceFileOfNode(decl), decl.name.text)) {
|
|
4005
4256
|
if (node === decl.name ||
|
|
4006
4257
|
node.pos < scope.pos ||
|
|
4007
4258
|
node.end > scope.end ||
|
|
4008
|
-
|
|
4259
|
+
(ts.isShorthandPropertyAssignment(node.parent) && node.parent.name === node
|
|
4260
|
+
? lowerer.checker.getShorthandAssignmentValueSymbol(node.parent)
|
|
4261
|
+
: lowerer.checker.getSymbolAtLocation(node)) !== symbol)
|
|
4009
4262
|
continue;
|
|
4010
4263
|
let target = node;
|
|
4011
4264
|
while (ts.isParenthesizedExpression(target.parent))
|
|
@@ -4017,6 +4270,18 @@ function evolvingArrayType(lowerer, decl) {
|
|
|
4017
4270
|
parent.operatorToken.kind <= ts.SyntaxKind.LastAssignment;
|
|
4018
4271
|
if (reassigned)
|
|
4019
4272
|
return DYN;
|
|
4273
|
+
if (ts.isPropertyAccessExpression(parent) &&
|
|
4274
|
+
parent.expression === target &&
|
|
4275
|
+
(parent.name.text === "push" || parent.name.text === "unshift") &&
|
|
4276
|
+
ts.isCallExpression(parent.parent) &&
|
|
4277
|
+
parent.parent.expression === parent)
|
|
4278
|
+
written.push(...parent.parent.arguments.nodes);
|
|
4279
|
+
else if (ts.isElementAccessExpression(parent) &&
|
|
4280
|
+
parent.expression === target &&
|
|
4281
|
+
ts.isBinaryExpression(parent.parent) &&
|
|
4282
|
+
parent.parent.left === parent &&
|
|
4283
|
+
parent.parent.operatorToken.kind === ts.SyntaxKind.EqualsToken)
|
|
4284
|
+
written.push(parent.parent.right);
|
|
4020
4285
|
const t = lowerer.typeOf(node);
|
|
4021
4286
|
if (unsettled(t))
|
|
4022
4287
|
continue;
|
|
@@ -4025,7 +4290,132 @@ function evolvingArrayType(lowerer, decl) {
|
|
|
4025
4290
|
return DYN;
|
|
4026
4291
|
result = mapped;
|
|
4027
4292
|
}
|
|
4028
|
-
|
|
4293
|
+
if (result === null || result.kind !== "array")
|
|
4294
|
+
return DYN;
|
|
4295
|
+
// The element types a write stores: its value's, or for a spread
|
|
4296
|
+
// (`xs.push(...values)`) the source array's element or tuple's elements.
|
|
4297
|
+
// Another spread source stores elements this check cannot see.
|
|
4298
|
+
const storedTypes = (value) => {
|
|
4299
|
+
if (!ts.isSpreadElement(value))
|
|
4300
|
+
return [lowerer.typeOf(value)];
|
|
4301
|
+
const source = lowerer.typeOf(value.expression);
|
|
4302
|
+
if (lowerer.checker.isArrayType(source) || lowerer.checker.isTupleType(source))
|
|
4303
|
+
return [...lowerer.checker.getTypeArguments(source)];
|
|
4304
|
+
return null;
|
|
4305
|
+
};
|
|
4306
|
+
for (const value of written) {
|
|
4307
|
+
const stored = storedTypes(value);
|
|
4308
|
+
if (stored === null)
|
|
4309
|
+
return DYN;
|
|
4310
|
+
for (const type of stored) {
|
|
4311
|
+
const t = lowerer.mapTypeOf(lowerer.checker.getBaseTypeOfLiteralType(type));
|
|
4312
|
+
if (!t || (!typeEquals(t, result.elem) && lowerer.widthLiftPlan(t, result.elem) === null))
|
|
4313
|
+
return DYN;
|
|
4314
|
+
}
|
|
4315
|
+
}
|
|
4316
|
+
return result;
|
|
4317
|
+
}
|
|
4318
|
+
/** How a TypeScript expression holds an evolving array binding whose reads
|
|
4319
|
+
* disagree (evolvingArrayType answers checked-dynamic): "evolving" for the
|
|
4320
|
+
* binding itself, "alias" for an unannotated binding initialized with it or
|
|
4321
|
+
* with an alias of it (`const alias = xs`), and "container" for an object or
|
|
4322
|
+
* array literal with it as a property, element or spread source at any
|
|
4323
|
+
* depth (`{ items: xs }`, `[xs]`), an unannotated binding initialized with
|
|
4324
|
+
* or destructured from such a literal, and a property or element read of a
|
|
4325
|
+
* container (`box.items`). The checker types an alias or container by the
|
|
4326
|
+
* elements written before it was taken, but it holds the same array. Null
|
|
4327
|
+
* for other expressions. */
|
|
4328
|
+
function evolvingArrayHold(lowerer, expr, depth = 0) {
|
|
4329
|
+
while (ts.isParenthesizedExpression(expr))
|
|
4330
|
+
expr = expr.expression;
|
|
4331
|
+
if (depth >= 8)
|
|
4332
|
+
return null;
|
|
4333
|
+
const binding = (symbol) => {
|
|
4334
|
+
const source = symbol?.valueDeclaration;
|
|
4335
|
+
// A name destructured from a container (`const { items } = box`) may
|
|
4336
|
+
// be the array or another container.
|
|
4337
|
+
if (source !== undefined && ts.isBindingElement(source) && ts.isIdentifier(source.name)) {
|
|
4338
|
+
const host = hostVariableDeclarationOf(source.name);
|
|
4339
|
+
return host !== null &&
|
|
4340
|
+
!host.type &&
|
|
4341
|
+
host.initializer !== undefined &&
|
|
4342
|
+
evolvingArrayHold(lowerer, host.initializer, depth + 1) === "container"
|
|
4343
|
+
? "container"
|
|
4344
|
+
: null;
|
|
4345
|
+
}
|
|
4346
|
+
if (source === undefined || !ts.isVariableDeclaration(source) || source.type)
|
|
4347
|
+
return null;
|
|
4348
|
+
const evolved = evolvingArrayType(lowerer, source);
|
|
4349
|
+
if (evolved !== null)
|
|
4350
|
+
return evolved.kind === "dyn" ? "evolving" : null;
|
|
4351
|
+
if (source.initializer === undefined)
|
|
4352
|
+
return null;
|
|
4353
|
+
const held = evolvingArrayHold(lowerer, source.initializer, depth + 1);
|
|
4354
|
+
return held === "evolving" ? "alias" : held;
|
|
4355
|
+
};
|
|
4356
|
+
if (ts.isIdentifier(expr))
|
|
4357
|
+
return binding(lowerer.checker.getSymbolAtLocation(expr));
|
|
4358
|
+
if (ts.isPropertyAccessExpression(expr) || ts.isElementAccessExpression(expr))
|
|
4359
|
+
return evolvingArrayHold(lowerer, expr.expression, depth + 1) === "container"
|
|
4360
|
+
? "container"
|
|
4361
|
+
: null;
|
|
4362
|
+
// A spread of the array itself (`{ ...xs }`, `[...xs]`) copies its
|
|
4363
|
+
// elements, as in Node; a spread of a container copies its references.
|
|
4364
|
+
if (ts.isObjectLiteralExpression(expr)) {
|
|
4365
|
+
for (const property of expr.properties.nodes) {
|
|
4366
|
+
const held = ts.isPropertyAssignment(property)
|
|
4367
|
+
? evolvingArrayHold(lowerer, property.initializer, depth + 1)
|
|
4368
|
+
: ts.isShorthandPropertyAssignment(property)
|
|
4369
|
+
? binding(lowerer.checker.getShorthandAssignmentValueSymbol(property))
|
|
4370
|
+
: ts.isSpreadAssignment(property) &&
|
|
4371
|
+
evolvingArrayHold(lowerer, property.expression, depth + 1) === "container"
|
|
4372
|
+
? "container"
|
|
4373
|
+
: null;
|
|
4374
|
+
if (held !== null)
|
|
4375
|
+
return "container";
|
|
4376
|
+
}
|
|
4377
|
+
return null;
|
|
4378
|
+
}
|
|
4379
|
+
if (ts.isArrayLiteralExpression(expr)) {
|
|
4380
|
+
for (const element of expr.elements.nodes) {
|
|
4381
|
+
const held = ts.isSpreadElement(element)
|
|
4382
|
+
? evolvingArrayHold(lowerer, element.expression, depth + 1) === "container"
|
|
4383
|
+
? "container"
|
|
4384
|
+
: null
|
|
4385
|
+
: evolvingArrayHold(lowerer, element, depth + 1);
|
|
4386
|
+
if (held !== null)
|
|
4387
|
+
return "container";
|
|
4388
|
+
}
|
|
4389
|
+
}
|
|
4390
|
+
return null;
|
|
4391
|
+
}
|
|
4392
|
+
/** Whether a TypeScript expression is an alias or container of an evolving
|
|
4393
|
+
* array binding whose reads disagree (evolvingArrayHold). Its value is
|
|
4394
|
+
* checked-dynamic, and the checker's type for it lists only the elements
|
|
4395
|
+
* written before it was taken, so element reads through it stay
|
|
4396
|
+
* checked-dynamic instead of checking against that type. */
|
|
4397
|
+
export function readsHeldEvolvingArray(lowerer, expr) {
|
|
4398
|
+
if (isJsSourceFile(ts.getSourceFileOfNode(expr)))
|
|
4399
|
+
return false;
|
|
4400
|
+
const held = evolvingArrayHold(lowerer, expr);
|
|
4401
|
+
return held === "alias" || held === "container";
|
|
4402
|
+
}
|
|
4403
|
+
/** Whether a TypeScript object or array literal holds an evolving array
|
|
4404
|
+
* binding whose reads disagree (evolvingArrayHold), so it builds as a
|
|
4405
|
+
* checked-dynamic literal that keeps the array. */
|
|
4406
|
+
export function holdsEvolvingArray(lowerer, expr) {
|
|
4407
|
+
if (isJsSourceFile(ts.getSourceFileOfNode(expr)))
|
|
4408
|
+
return false;
|
|
4409
|
+
return evolvingArrayHold(lowerer, expr) === "container";
|
|
4410
|
+
}
|
|
4411
|
+
/** An unannotated binding initialized with an evolving array binding whose
|
|
4412
|
+
* reads disagree, or with an alias or container of one (evolvingArrayHold):
|
|
4413
|
+
* it takes the array's checked-dynamic type, so it sees the later writes.
|
|
4414
|
+
* Null for other bindings. */
|
|
4415
|
+
function evolvingArrayHolderType(lowerer, decl) {
|
|
4416
|
+
if (decl.initializer === undefined)
|
|
4417
|
+
return null;
|
|
4418
|
+
return evolvingArrayHold(lowerer, decl.initializer) === null ? null : DYN;
|
|
4029
4419
|
}
|
|
4030
4420
|
/** A single static type for an initializer-less JavaScript `let` whose
|
|
4031
4421
|
* later plain writes all agree. An evolving JS local reads as `undefined`
|
|
@@ -4160,6 +4550,15 @@ export function lowerVarDecl(lowerer, decl, isLet) {
|
|
|
4160
4550
|
if (alias)
|
|
4161
4551
|
return alias;
|
|
4162
4552
|
}
|
|
4553
|
+
// A Date local whose identity no use observes stores its time value.
|
|
4554
|
+
if (isTimeValueDateDeclaration(lowerer, decl)) {
|
|
4555
|
+
const loc = locOf(decl);
|
|
4556
|
+
const date = lowerer.lowerExprExpecting(decl.initializer, DATE_T);
|
|
4557
|
+
const local = lowerer.declareLocal(decl.name, decl.name.text, F64, isLet);
|
|
4558
|
+
lowerer.timeValueDateLocals.add(local);
|
|
4559
|
+
const init = { kind: "libCall", fn: "date.getTime", args: [date], type: F64, loc };
|
|
4560
|
+
return { kind: "varDecl", localId: local.id, init, loc };
|
|
4561
|
+
}
|
|
4163
4562
|
// A NULLISH generic binding (`const i: I<A & B> = null as any` — the
|
|
4164
4563
|
// declared type has no mapping, the value is provably null/undefined
|
|
4165
4564
|
// forever): no storage exists; reads know the value (member reads and
|
|
@@ -4488,20 +4887,7 @@ export function lowerVarDecl(lowerer, decl, isLet) {
|
|
|
4488
4887
|
: inferredObjectType
|
|
4489
4888
|
? [inferredObjectType]
|
|
4490
4889
|
: [];
|
|
4491
|
-
const expandsObject = (
|
|
4492
|
-
!hasJsTypeAnnotation(decl) &&
|
|
4493
|
-
inferredObjectType !== null &&
|
|
4494
|
-
jsOpenObjectType(decl, inferredObjectType, lowerer.shapes, lowerer.unions).kind === "dyn") ||
|
|
4495
|
-
inferredObjectArms.some((arm) => arm.kind === "record" && jsObjectBindingExpands(lowerer, decl, arm)) ||
|
|
4496
|
-
(isJsSourceFile(ts.getSourceFileOfNode(decl)) &&
|
|
4497
|
-
!decl.type &&
|
|
4498
|
-
!hasJsTypeAnnotation(decl) &&
|
|
4499
|
-
ts.isObjectLiteralExpression(decl.initializer) &&
|
|
4500
|
-
decl.initializer.properties.nodes.some((property) => ts.isMethodDeclaration(property) ||
|
|
4501
|
-
ts.isAccessor(property) ||
|
|
4502
|
-
(ts.isPropertyAssignment(property) &&
|
|
4503
|
-
(ts.isFunctionExpression(property.initializer) ||
|
|
4504
|
-
ts.isArrowFunction(property.initializer)))));
|
|
4890
|
+
const expandsObject = jsDeclarationExpandsObject(lowerer, decl, inferredObjectType);
|
|
4505
4891
|
let init;
|
|
4506
4892
|
try {
|
|
4507
4893
|
init =
|
|
@@ -4666,7 +5052,7 @@ export function lowerVarDecl(lowerer, decl, isLet) {
|
|
|
4666
5052
|
if (returnedEmptyArrayType === null &&
|
|
4667
5053
|
!decl.type &&
|
|
4668
5054
|
!isJsSourceFile(ts.getSourceFileOfNode(decl))) {
|
|
4669
|
-
const evolved = evolvingArrayType(lowerer, decl);
|
|
5055
|
+
const evolved = evolvingArrayType(lowerer, decl) ?? evolvingArrayHolderType(lowerer, decl);
|
|
4670
5056
|
if (evolved !== null) {
|
|
4671
5057
|
type = evolved;
|
|
4672
5058
|
init = lowerer.lowerExprExpecting(decl.initializer, evolved);
|
|
@@ -5143,17 +5529,12 @@ export function hasJsTypeAnnotation(decl) {
|
|
|
5143
5529
|
return (!!statement &&
|
|
5144
5530
|
/@type\b/.test(ts.getSourceFileOfNode(decl).text.slice(statement.pos, ts.tokenStartOfNode(decl))));
|
|
5145
5531
|
}
|
|
5146
|
-
/**
|
|
5147
|
-
*
|
|
5148
|
-
|
|
5149
|
-
|
|
5150
|
-
decl.type ||
|
|
5151
|
-
hasJsTypeAnnotation(decl) ||
|
|
5152
|
-
!ts.isIdentifier(decl.name))
|
|
5153
|
-
return false;
|
|
5154
|
-
const symbol = lowerer.resolveValueSymbol(decl.name);
|
|
5532
|
+
/** The assignments to a declaration's binding in its function (or file),
|
|
5533
|
+
* `=` and compound alike. Null when the name has no symbol. */
|
|
5534
|
+
function jsBindingWrites(lowerer, decl, name) {
|
|
5535
|
+
const symbol = lowerer.resolveValueSymbol(name);
|
|
5155
5536
|
if (!symbol)
|
|
5156
|
-
return
|
|
5537
|
+
return null;
|
|
5157
5538
|
let owner = decl;
|
|
5158
5539
|
while (owner.parent && !ts.isFunctionLike(owner) && !ts.isSourceFile(owner))
|
|
5159
5540
|
owner = owner.parent;
|
|
@@ -5175,9 +5556,41 @@ export function jsBindingHasOpenWrites(lowerer, decl) {
|
|
|
5175
5556
|
writes = indexed;
|
|
5176
5557
|
lowerer.jsBindingWritesByOwner.set(owner, writes);
|
|
5177
5558
|
}
|
|
5178
|
-
|
|
5559
|
+
return (writes.get(name.text) ?? []).filter((node) => lowerer.resolveValueSymbol(node.left) === symbol);
|
|
5560
|
+
}
|
|
5561
|
+
/** Whether a JavaScript binding always holds a string: the checker types it
|
|
5562
|
+
* as one, and every write appends to it (`result += part`), which yields a
|
|
5563
|
+
* string whatever the part is. */
|
|
5564
|
+
export function jsBindingAppendsOnly(lowerer, decl) {
|
|
5565
|
+
if (!ts.isIdentifier(decl.name))
|
|
5566
|
+
return false;
|
|
5567
|
+
if (lowerer.mapTypeOf(lowerer.typeOf(decl.name))?.kind !== "string")
|
|
5568
|
+
return false;
|
|
5569
|
+
const writes = jsBindingWrites(lowerer, decl, decl.name);
|
|
5570
|
+
return (writes !== null &&
|
|
5571
|
+
writes.every((node) => node.operatorToken.kind === ts.SyntaxKind.PlusEqualsToken));
|
|
5572
|
+
}
|
|
5573
|
+
/** Inferred JS scalar initializers do not constrain later writes through
|
|
5574
|
+
* an any-valued callback. Keep those bindings open, including captured writes. */
|
|
5575
|
+
export function jsBindingHasOpenWrites(lowerer, decl) {
|
|
5576
|
+
if (!isJsSourceFile(ts.getSourceFileOfNode(decl)) ||
|
|
5577
|
+
decl.type ||
|
|
5578
|
+
hasJsTypeAnnotation(decl) ||
|
|
5579
|
+
!ts.isIdentifier(decl.name))
|
|
5580
|
+
return false;
|
|
5581
|
+
const candidates = jsBindingWrites(lowerer, decl, decl.name);
|
|
5582
|
+
if (candidates === null)
|
|
5583
|
+
return false;
|
|
5179
5584
|
if (candidates.some((node) => (lowerer.typeOf(node.right).flags & (ts.TypeFlags.Any | ts.TypeFlags.Unknown)) !== 0))
|
|
5180
5585
|
return true;
|
|
5586
|
+
// A `+=` of a string turns a number or boolean binding into a string
|
|
5587
|
+
// (`n += "px"`); the checker keeps the declared type.
|
|
5588
|
+
if (candidates.some((node) => node.operatorToken.kind === ts.SyntaxKind.PlusEqualsToken &&
|
|
5589
|
+
(lowerer.typeOf(node.right).flags & ts.TypeFlags.StringLike) !== 0)) {
|
|
5590
|
+
const declared = lowerer.mapTypeOf(lowerer.typeOf(decl.name));
|
|
5591
|
+
if (declared?.kind === "f64" || declared?.kind === "bool")
|
|
5592
|
+
return true;
|
|
5593
|
+
}
|
|
5181
5594
|
// A write that can store null or undefined into a binding the checker
|
|
5182
5595
|
// types as a primitive (`offset = match[3] || null`): JavaScript files
|
|
5183
5596
|
// are checked without strict null checks, so the declared type does not
|
|
@@ -5444,7 +5857,7 @@ function lowerDynSwitch(lowerer, stmt, disc, labels) {
|
|
|
5444
5857
|
loc: locOf(expression),
|
|
5445
5858
|
};
|
|
5446
5859
|
}
|
|
5447
|
-
if (
|
|
5860
|
+
if (!lowerer.dynConvertible(test.type)) {
|
|
5448
5861
|
lowerer.unsupported("SC1100", expression, "switch case values that cannot compare strictly with 'unknown'");
|
|
5449
5862
|
}
|
|
5450
5863
|
return {
|
|
@@ -5700,7 +6113,7 @@ function lowerDeleteStatement(lowerer, expr) {
|
|
|
5700
6113
|
if (obj.type.kind === "record") {
|
|
5701
6114
|
const shape = lowerer.shapes.get(obj.type.shapeId);
|
|
5702
6115
|
if (shape?.indexValue && shape.fields.length === 0 && !shape.tuple) {
|
|
5703
|
-
return { kind: "recordKeyDelete", obj, shapeId: obj.type.shapeId, key: lowerKey(), loc };
|
|
6116
|
+
return markSloppyRecordWrites(lowerer, { kind: "recordKeyDelete", obj, shapeId: obj.type.shapeId, key: lowerKey(), loc }, expr);
|
|
5704
6117
|
}
|
|
5705
6118
|
// `delete r.f` of a declared OPTIONAL field (undefined-armed slot)
|
|
5706
6119
|
// writes the field's ABSENT state: a monomorphic shape cannot remove
|
|
@@ -5720,14 +6133,14 @@ function lowerDeleteStatement(lowerer, expr) {
|
|
|
5720
6133
|
if (field) {
|
|
5721
6134
|
const absent = lowerer.absentFieldValue(field.type, loc);
|
|
5722
6135
|
if (absent) {
|
|
5723
|
-
return {
|
|
6136
|
+
return markSloppyRecordWrites(lowerer, {
|
|
5724
6137
|
kind: "recordSet",
|
|
5725
6138
|
obj,
|
|
5726
6139
|
shapeId: obj.type.shapeId,
|
|
5727
6140
|
field: field.name,
|
|
5728
6141
|
value: absent,
|
|
5729
6142
|
loc,
|
|
5730
|
-
};
|
|
6143
|
+
}, expr, true);
|
|
5731
6144
|
}
|
|
5732
6145
|
}
|
|
5733
6146
|
if (shape?.indexValue) {
|
|
@@ -6022,6 +6435,22 @@ function lowerCjsSingleValueExport(lowerer, expr, loc) {
|
|
|
6022
6435
|
return lowerer.requireInitStmt(req.spec, req.call) ?? { kind: "block", body: [], loc };
|
|
6023
6436
|
}
|
|
6024
6437
|
if (ts.isIdentifier(rhs)) {
|
|
6438
|
+
const split = splitRequireBindingOfIdent(lowerer, rhs);
|
|
6439
|
+
if (split !== null) {
|
|
6440
|
+
if (wholeExportSymbolOfModule(lowerer, split.dep) === null) {
|
|
6441
|
+
lowerer.unsupported("SC1090", rhs, `the exports object of '${split.spec}' as a value (its exports compile to a static table: read require(${JSON.stringify(split.spec)}).member directly)`);
|
|
6442
|
+
}
|
|
6443
|
+
const root = lowerer.globalsByDeclNode.get(expr);
|
|
6444
|
+
if (root !== undefined) {
|
|
6445
|
+
return {
|
|
6446
|
+
kind: "assign",
|
|
6447
|
+
localId: root.id,
|
|
6448
|
+
value: lowerer.lowerExprExpecting(rhs, root.type),
|
|
6449
|
+
loc: locOf(rhs),
|
|
6450
|
+
};
|
|
6451
|
+
}
|
|
6452
|
+
return { kind: "block", body: [], loc };
|
|
6453
|
+
}
|
|
6025
6454
|
const sym = lowerer.resolveValueSymbol(rhs);
|
|
6026
6455
|
if (!sym)
|
|
6027
6456
|
return null;
|
|
@@ -6824,6 +7253,14 @@ export function lowerExprStatement(lowerer, expr) {
|
|
|
6824
7253
|
if (!ts.isIdentifier(expr.left)) {
|
|
6825
7254
|
lowerer.unsupported("SC1090", expr.left, "assignment to non-variables");
|
|
6826
7255
|
}
|
|
7256
|
+
const splitAssign = splitRequireAssignmentOf(lowerer, expr);
|
|
7257
|
+
if (splitAssign !== null) {
|
|
7258
|
+
return (lowerer.requireInitStmt(splitAssign.spec, splitAssign.call) ?? {
|
|
7259
|
+
kind: "block",
|
|
7260
|
+
body: [],
|
|
7261
|
+
loc: locOf(expr),
|
|
7262
|
+
});
|
|
7263
|
+
}
|
|
6827
7264
|
const target = lowerer.resolveWritable(expr.left);
|
|
6828
7265
|
if (!target)
|
|
6829
7266
|
lowerer.rejectUnresolved(expr.left, `assignment to '${expr.left.text}' (not a writable local or module global)`);
|
|
@@ -7109,7 +7546,9 @@ function destrSpellingOf(rhs) {
|
|
|
7109
7546
|
return base === null ? null : `${base}.${e.name.text}`;
|
|
7110
7547
|
}
|
|
7111
7548
|
// `table[key]` and `list[0]`; V8 prints a numeric key in its canonical
|
|
7112
|
-
// number form (`o[1.50]` reads "o[1.5]")
|
|
7549
|
+
// number form (`o[1.50]` reads "o[1.5]"), and a string key as a property
|
|
7550
|
+
// name with its text decoded (`o["a.b"]` and `o[\`a.b\`]` read "o.a.b").
|
|
7551
|
+
// The message is a C string, so a key holding NUL keeps the refusal.
|
|
7113
7552
|
if (ts.isElementAccessExpression(e) && !e.questionDotToken) {
|
|
7114
7553
|
const base = destrSpellingOf(e.expression);
|
|
7115
7554
|
const key = e.argumentExpression;
|
|
@@ -7119,6 +7558,9 @@ function destrSpellingOf(rhs) {
|
|
|
7119
7558
|
return `${base}[${key.text}]`;
|
|
7120
7559
|
if (ts.isNumericLiteral(key))
|
|
7121
7560
|
return `${base}[${String(Number(key.text))}]`;
|
|
7561
|
+
if ((ts.isStringLiteral(key) || ts.isNoSubstitutionTemplateLiteral(key)) &&
|
|
7562
|
+
!key.text.includes("\0"))
|
|
7563
|
+
return `${base}.${key.text}`;
|
|
7122
7564
|
return null;
|
|
7123
7565
|
}
|
|
7124
7566
|
if (ts.isCallExpression(e) && !e.questionDotToken) {
|
|
@@ -7671,7 +8113,7 @@ function lowerAssignTargetInto(lowerer, out, targetNode, blame, dflt, valueOf) {
|
|
|
7671
8113
|
if (arr.type.kind === "array") {
|
|
7672
8114
|
const recv = lowerer.declareHiddenLocal("%dtRecv", arr.type);
|
|
7673
8115
|
out.push({ kind: "varDecl", localId: recv.id, init: arr, loc });
|
|
7674
|
-
const index =
|
|
8116
|
+
const index = lowerOptionalIndex(lowerer, lowerer.lowerExpr(t.argumentExpression), locOf(t.argumentExpression), t.argumentExpression);
|
|
7675
8117
|
if (index.type.kind !== "f64") {
|
|
7676
8118
|
lowerer.unsupported("SC1090", t.argumentExpression, "indexing with non-number keys");
|
|
7677
8119
|
}
|
|
@@ -8060,6 +8502,16 @@ export function lowerForOf(lowerer, stmt) {
|
|
|
8060
8502
|
lowerer.stdlibGlobalMember(stmt.expression, "process") === "stdin") {
|
|
8061
8503
|
return lowerForAwaitStdin(lowerer, stmt);
|
|
8062
8504
|
}
|
|
8505
|
+
// NodeJS.WritableStream is what @types/node answers for pipeline()
|
|
8506
|
+
// with a function destination, whose value is a PassThrough.
|
|
8507
|
+
if (nodeStreamInterfaceSide(lowerer, lowerer.typeOf(stmt.expression)) === "w") {
|
|
8508
|
+
const mapped = lowerer.mapTypeOf(lowerer.typeOf(stmt.expression));
|
|
8509
|
+
const sides = mapped?.kind === "object"
|
|
8510
|
+
? streamSidesOf(lowerer, lowerer.classes.get(mapped.className))
|
|
8511
|
+
: null;
|
|
8512
|
+
if (sides !== "r" && sides !== "rw")
|
|
8513
|
+
lowerer.noLowering("for await over a NodeJS.WritableStream", stmt.expression, "type the stream as the readable class it is: pipeline() answers a PassThrough for a function destination (pipeline(...) as PassThrough, or a JSDoc @type)");
|
|
8514
|
+
}
|
|
8063
8515
|
// A checked-dynamic NodeJS.ReadableStream iterates its native stream,
|
|
8064
8516
|
// and a Hash, Hmac, Cipheriv or Decipheriv iterates its Transform.
|
|
8065
8517
|
const dynStream = lowerForAwaitDynStream(lowerer, stmt, () => lowerForAwaitBuiltin(lowerer, stmt)) ??
|
|
@@ -8232,6 +8684,11 @@ export function lowerForOf(lowerer, stmt) {
|
|
|
8232
8684
|
}
|
|
8233
8685
|
iterSrc ??= stmt.expression;
|
|
8234
8686
|
let iterable = lowerer.lowerExpr(iterSrc);
|
|
8687
|
+
{
|
|
8688
|
+
const iterableUnion = iterableUnionOf(lowerer, iterable.type);
|
|
8689
|
+
if (iterableUnion)
|
|
8690
|
+
return lowerForOfIterable(lowerer, stmt, iterable, iterableUnion, labels);
|
|
8691
|
+
}
|
|
8235
8692
|
let tupleSource = null;
|
|
8236
8693
|
// A nested loop receiver can be an OOB-safe array read from the outer
|
|
8237
8694
|
// loop (`for (const row of grid) for (const cell of row)`). The checker
|
|
@@ -8263,7 +8720,7 @@ export function lowerForOf(lowerer, stmt) {
|
|
|
8263
8720
|
loc: locOf(iterSrc),
|
|
8264
8721
|
};
|
|
8265
8722
|
}
|
|
8266
|
-
if (iterable.type.kind === "bytes") {
|
|
8723
|
+
if (iterable.type.kind === "bytes" || indexedUnionArms(lowerer, iterable.type)) {
|
|
8267
8724
|
return lowerForOfBytes(lowerer, stmt, iterable, labels);
|
|
8268
8725
|
}
|
|
8269
8726
|
if (iterable.type.kind !== "array") {
|
|
@@ -8838,40 +9295,53 @@ function lowerForOfStoredNumericIterator(lowerer, stmt, state, labels) {
|
|
|
8838
9295
|
lowerer.unsupported("SC1031", decl.name);
|
|
8839
9296
|
const loc = locOf(stmt);
|
|
8840
9297
|
const sourceT = state.sourceType;
|
|
8841
|
-
|
|
9298
|
+
// A union of typed arrays and number arrays (indexed-unions.ts) reads
|
|
9299
|
+
// through its arms' own length and element reads.
|
|
9300
|
+
const unionArms = indexedUnionArms(lowerer, sourceT);
|
|
9301
|
+
if (!((sourceT.kind === "array" && sourceT.elem.kind === "f64") ||
|
|
9302
|
+
sourceT.kind === "bytes" ||
|
|
9303
|
+
unionArms)) {
|
|
8842
9304
|
throw new InternalCompilerError("internal: retained numeric iterator has a non-numeric source");
|
|
8843
9305
|
}
|
|
8844
9306
|
const indexRef = () => varRef(state.indexLocalId, F64, loc);
|
|
8845
9307
|
const doneRef = () => varRef(state.doneLocalId, BOOL, loc);
|
|
8846
9308
|
const sourceRef = () => varRef(state.sourceLocalId, sourceT, loc);
|
|
8847
|
-
const sourceLength = () =>
|
|
8848
|
-
?
|
|
8849
|
-
|
|
8850
|
-
|
|
8851
|
-
|
|
8852
|
-
|
|
8853
|
-
|
|
8854
|
-
|
|
8855
|
-
|
|
8856
|
-
|
|
8857
|
-
|
|
8858
|
-
|
|
8859
|
-
|
|
8860
|
-
|
|
8861
|
-
|
|
8862
|
-
|
|
8863
|
-
|
|
8864
|
-
|
|
8865
|
-
|
|
8866
|
-
|
|
8867
|
-
|
|
8868
|
-
|
|
8869
|
-
|
|
8870
|
-
|
|
8871
|
-
|
|
8872
|
-
|
|
8873
|
-
|
|
8874
|
-
|
|
9309
|
+
const sourceLength = () => unionArms
|
|
9310
|
+
? lowerIndexedUnionMember(lowerer, sourceRef(), unionArms, "length", loc)
|
|
9311
|
+
: sourceT.kind === "array"
|
|
9312
|
+
? {
|
|
9313
|
+
kind: "arrIntrinsic",
|
|
9314
|
+
method: "length",
|
|
9315
|
+
receiver: sourceRef(),
|
|
9316
|
+
args: [],
|
|
9317
|
+
type: F64,
|
|
9318
|
+
loc,
|
|
9319
|
+
}
|
|
9320
|
+
: {
|
|
9321
|
+
kind: "bytesIntrinsic",
|
|
9322
|
+
method: "length",
|
|
9323
|
+
receiver: sourceRef(),
|
|
9324
|
+
args: [],
|
|
9325
|
+
type: F64,
|
|
9326
|
+
loc,
|
|
9327
|
+
};
|
|
9328
|
+
const valueT = sourceT.kind === "array" || (unionArms && !allBytesArms(unionArms))
|
|
9329
|
+
? arrayValueType(lowerer, F64)
|
|
9330
|
+
: F64;
|
|
9331
|
+
const sourceValue = () => unionArms
|
|
9332
|
+
? allBytesArms(unionArms)
|
|
9333
|
+
? lowerIndexedUnionNumberRead(lowerer, sourceRef(), unionArms, indexRef(), loc)
|
|
9334
|
+
: lowerIndexedUnionRead(lowerer, sourceRef(), unionArms, indexRef(), loc)
|
|
9335
|
+
: sourceT.kind === "array"
|
|
9336
|
+
? arrayValueRead(lowerer, sourceRef(), indexRef(), F64, loc)
|
|
9337
|
+
: {
|
|
9338
|
+
kind: "bytesIntrinsic",
|
|
9339
|
+
method: "get",
|
|
9340
|
+
receiver: sourceRef(),
|
|
9341
|
+
args: [indexRef()],
|
|
9342
|
+
type: F64,
|
|
9343
|
+
loc,
|
|
9344
|
+
};
|
|
8875
9345
|
const one = { kind: "numLit", value: 1, type: F64, loc };
|
|
8876
9346
|
lowerer.scopes.push(new Map());
|
|
8877
9347
|
try {
|
|
@@ -9890,11 +10360,13 @@ function lowerForIn(lowerer, stmt) {
|
|
|
9890
10360
|
loc,
|
|
9891
10361
|
});
|
|
9892
10362
|
const keys = objectIterOverIndexShape(lowerer, stmt.expression, "keys", receiver.type, rShape, recvRef(), keysT, loc);
|
|
10363
|
+
// The overflow map's hashed key set answers presence directly; a
|
|
10364
|
+
// fresh key list per visit would make the walk quadratic.
|
|
9893
10365
|
const guard = (kRef) => ({
|
|
9894
|
-
kind: "
|
|
9895
|
-
|
|
9896
|
-
|
|
9897
|
-
|
|
10366
|
+
kind: "recordOvfHas",
|
|
10367
|
+
obj: recvRef(),
|
|
10368
|
+
shapeId,
|
|
10369
|
+
key: kRef,
|
|
9898
10370
|
type: BOOL,
|
|
9899
10371
|
loc,
|
|
9900
10372
|
});
|