@scriptc/compiler 0.3.6 → 0.4.0
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 +682 -50
- package/ambient/scriptc.d.ts +134 -0
- package/dist/backend/cycle-analysis.d.ts +1 -1
- package/dist/backend/cycle-analysis.js +1 -0
- package/dist/backend/cycle-analysis.js.map +1 -1
- package/dist/backend/cycle-analysis.test.js +13 -1
- package/dist/backend/cycle-analysis.test.js.map +1 -1
- package/dist/backend/cycle-mutability.js +16 -5
- package/dist/backend/cycle-mutability.js.map +1 -1
- package/dist/backend/executable-features.js +13 -0
- package/dist/backend/executable-features.js.map +1 -1
- package/dist/backend/immutability.test.js +1 -1
- package/dist/backend/library-pack.js +6 -0
- package/dist/backend/library-pack.js.map +1 -1
- package/dist/backend/llvm/alloc.d.ts +41 -4
- package/dist/backend/llvm/alloc.js +138 -7
- package/dist/backend/llvm/alloc.js.map +1 -1
- package/dist/backend/llvm/alloc.test.js +30 -1
- package/dist/backend/llvm/alloc.test.js.map +1 -1
- package/dist/backend/llvm/appended-array-literals.test.js +1 -1
- package/dist/backend/llvm/array-search.test.js +1 -1
- package/dist/backend/llvm/blocks.d.ts +8 -0
- package/dist/backend/llvm/blocks.js +43 -1
- package/dist/backend/llvm/blocks.js.map +1 -1
- package/dist/backend/llvm/blocks.test.js +22 -1
- package/dist/backend/llvm/blocks.test.js.map +1 -1
- package/dist/backend/llvm/byte-numbers.js +15 -5
- package/dist/backend/llvm/byte-numbers.js.map +1 -1
- package/dist/backend/llvm/bytes-alias.d.ts +14 -0
- package/dist/backend/llvm/bytes-alias.js +20 -0
- package/dist/backend/llvm/bytes-alias.js.map +1 -0
- package/dist/backend/llvm/bytes-loop-versions.d.ts +86 -0
- package/dist/backend/llvm/bytes-loop-versions.js +506 -0
- package/dist/backend/llvm/bytes-loop-versions.js.map +1 -0
- package/dist/backend/llvm/bytes-loop-versions.test.d.ts +1 -0
- package/dist/backend/llvm/bytes-loop-versions.test.js +244 -0
- package/dist/backend/llvm/bytes-loop-versions.test.js.map +1 -0
- package/dist/backend/llvm/call-lifetimes.js +50 -1
- package/dist/backend/llvm/call-lifetimes.js.map +1 -1
- package/dist/backend/llvm/call-lifetimes.test.js +34 -0
- package/dist/backend/llvm/call-lifetimes.test.js.map +1 -1
- package/dist/backend/llvm/checked-narrows.test.js +1 -1
- package/dist/backend/llvm/checked-value-lifetimes.js +4 -1
- package/dist/backend/llvm/checked-value-lifetimes.js.map +1 -1
- package/dist/backend/llvm/classes.d.ts +11 -0
- package/dist/backend/llvm/classes.js +71 -14
- package/dist/backend/llvm/classes.js.map +1 -1
- package/dist/backend/llvm/classes.test.js +58 -8
- package/dist/backend/llvm/classes.test.js.map +1 -1
- package/dist/backend/llvm/common.js +1 -0
- package/dist/backend/llvm/common.js.map +1 -1
- package/dist/backend/llvm/constant-callbacks.d.ts +5 -1
- package/dist/backend/llvm/constant-callbacks.js +55 -12
- package/dist/backend/llvm/constant-callbacks.js.map +1 -1
- package/dist/backend/llvm/constant-callbacks.test.js +88 -1
- package/dist/backend/llvm/constant-callbacks.test.js.map +1 -1
- package/dist/backend/llvm/counted-loops.d.ts +4 -0
- package/dist/backend/llvm/counted-loops.js +37 -0
- package/dist/backend/llvm/counted-loops.js.map +1 -1
- package/dist/backend/llvm/dense-array-access.d.ts +12 -3
- package/dist/backend/llvm/dense-array-access.js +72 -14
- package/dist/backend/llvm/dense-array-access.js.map +1 -1
- package/dist/backend/llvm/dense-array-access.test.js +59 -3
- package/dist/backend/llvm/dense-array-access.test.js.map +1 -1
- package/dist/backend/llvm/dense-array-loops.d.ts +51 -0
- package/dist/backend/llvm/dense-array-loops.js +162 -0
- package/dist/backend/llvm/dense-array-loops.js.map +1 -0
- package/dist/backend/llvm/dense-array-loops.test.d.ts +1 -0
- package/dist/backend/llvm/dense-array-loops.test.js +128 -0
- package/dist/backend/llvm/dense-array-loops.test.js.map +1 -0
- package/dist/backend/llvm/dyn-handle-tags.test.d.ts +1 -0
- package/dist/backend/llvm/dyn-handle-tags.test.js +38 -0
- package/dist/backend/llvm/dyn-handle-tags.test.js.map +1 -0
- package/dist/backend/llvm/dyn.d.ts +28 -4
- package/dist/backend/llvm/dyn.js +293 -178
- package/dist/backend/llvm/dyn.js.map +1 -1
- package/dist/backend/llvm/emit-function.d.ts +64 -0
- package/dist/backend/llvm/emit-function.js +1190 -0
- package/dist/backend/llvm/emit-function.js.map +1 -0
- package/dist/backend/llvm/emit-module.d.ts +24 -0
- package/dist/backend/llvm/emit-module.js +1535 -0
- package/dist/backend/llvm/emit-module.js.map +1 -0
- package/dist/backend/llvm/emit-statements.d.ts +58 -0
- package/dist/backend/llvm/emit-statements.js +1964 -0
- package/dist/backend/llvm/emit-statements.js.map +1 -0
- package/dist/backend/llvm/emitter.d.ts +547 -283
- package/dist/backend/llvm/emitter.js +689 -4643
- package/dist/backend/llvm/emitter.js.map +1 -1
- package/dist/backend/llvm/emitter.test.js +57 -3
- package/dist/backend/llvm/emitter.test.js.map +1 -1
- package/dist/backend/llvm/expr-async.js +73 -46
- package/dist/backend/llvm/expr-async.js.map +1 -1
- package/dist/backend/llvm/expr-async.test.js +1 -1
- package/dist/backend/llvm/expr-bytes.d.ts +2 -0
- package/dist/backend/llvm/expr-bytes.js +76 -29
- package/dist/backend/llvm/expr-bytes.js.map +1 -1
- package/dist/backend/llvm/expr-callbacks.d.ts +6 -2
- package/dist/backend/llvm/expr-callbacks.js +48 -11
- package/dist/backend/llvm/expr-callbacks.js.map +1 -1
- package/dist/backend/llvm/expr-calls.d.ts +1 -1
- package/dist/backend/llvm/expr-calls.js +71 -53
- package/dist/backend/llvm/expr-calls.js.map +1 -1
- package/dist/backend/llvm/expr-calls.test.js +1 -1
- package/dist/backend/llvm/expr-containers.js +39 -15
- package/dist/backend/llvm/expr-containers.js.map +1 -1
- package/dist/backend/llvm/expr-control.js +16 -16
- package/dist/backend/llvm/expr-control.js.map +1 -1
- package/dist/backend/llvm/expr-dynamic.d.ts +3 -0
- package/dist/backend/llvm/expr-dynamic.js +67 -62
- package/dist/backend/llvm/expr-dynamic.js.map +1 -1
- package/dist/backend/llvm/expr-primitives.js +121 -25
- package/dist/backend/llvm/expr-primitives.js.map +1 -1
- package/dist/backend/llvm/expr-primitives.test.js +2 -2
- package/dist/backend/llvm/expr-records.d.ts +1 -1
- package/dist/backend/llvm/expr-records.js +32 -11
- package/dist/backend/llvm/expr-records.js.map +1 -1
- package/dist/backend/llvm/expr-stream-bridges.js +54 -12
- package/dist/backend/llvm/expr-stream-bridges.js.map +1 -1
- package/dist/backend/llvm/expr-stream-bridges.test.js +2 -2
- package/dist/backend/llvm/expr-stream-callbacks.js +22 -1
- package/dist/backend/llvm/expr-stream-callbacks.js.map +1 -1
- package/dist/backend/llvm/int32-abi.test.js +2 -2
- package/dist/backend/llvm/integer-clones.test.js +3 -3
- package/dist/backend/llvm/integer-remainder.d.ts +34 -13
- package/dist/backend/llvm/integer-remainder.js +156 -22
- package/dist/backend/llvm/integer-remainder.js.map +1 -1
- package/dist/backend/llvm/intern-tables.test.js +1 -1
- package/dist/backend/llvm/jsval-encoding.d.ts +21 -0
- package/dist/backend/llvm/jsval-encoding.js +20 -0
- package/dist/backend/llvm/jsval-encoding.js.map +1 -0
- package/dist/backend/llvm/jsval.d.ts +12 -0
- package/dist/backend/llvm/jsval.js +488 -0
- package/dist/backend/llvm/jsval.js.map +1 -0
- package/dist/backend/llvm/lazy-captures.d.ts +12 -2
- package/dist/backend/llvm/lazy-captures.js +39 -17
- package/dist/backend/llvm/lazy-captures.js.map +1 -1
- package/dist/backend/llvm/lib-abi.js +1 -1
- package/dist/backend/llvm/lib-abi.js.map +1 -1
- package/dist/backend/llvm/lib-connect.js +1 -1
- package/dist/backend/llvm/lib-connect.js.map +1 -1
- package/dist/backend/llvm/lib-datagram.js +14 -8
- package/dist/backend/llvm/lib-datagram.js.map +1 -1
- package/dist/backend/llvm/lib-dispatch.js +189 -23
- package/dist/backend/llvm/lib-dispatch.js.map +1 -1
- package/dist/backend/llvm/lib-filesystem.js +42 -13
- package/dist/backend/llvm/lib-filesystem.js.map +1 -1
- package/dist/backend/llvm/lib-http2.js +3 -3
- package/dist/backend/llvm/lib-http2.js.map +1 -1
- package/dist/backend/llvm/lib-lookup.js +2 -2
- package/dist/backend/llvm/lib-lookup.js.map +1 -1
- package/dist/backend/llvm/lib-network.js +56 -22
- package/dist/backend/llvm/lib-network.js.map +1 -1
- package/dist/backend/llvm/lib-process.js +90 -50
- package/dist/backend/llvm/lib-process.js.map +1 -1
- package/dist/backend/llvm/lib-shared.d.ts +12 -0
- package/dist/backend/llvm/lib-shared.js +187 -6
- package/dist/backend/llvm/lib-shared.js.map +1 -1
- package/dist/backend/llvm/lib-stream.js +46 -16
- package/dist/backend/llvm/lib-stream.js.map +1 -1
- package/dist/backend/llvm/lib-test.js +43 -7
- package/dist/backend/llvm/lib-test.js.map +1 -1
- package/dist/backend/llvm/lib-tls.js +4 -9
- package/dist/backend/llvm/lib-tls.js.map +1 -1
- package/dist/backend/llvm/local-array-reads.js +2 -2
- package/dist/backend/llvm/local-array-reads.test.js +1 -1
- package/dist/backend/llvm/local-extents.d.ts +19 -0
- package/dist/backend/llvm/local-extents.js +169 -0
- package/dist/backend/llvm/local-extents.js.map +1 -0
- package/dist/backend/llvm/local-extents.test.d.ts +1 -0
- package/dist/backend/llvm/local-extents.test.js +92 -0
- package/dist/backend/llvm/local-extents.test.js.map +1 -0
- package/dist/backend/llvm/local-union-storage.js +7 -7
- package/dist/backend/llvm/local-union-storage.js.map +1 -1
- package/dist/backend/llvm/local-union-storage.test.js +2 -2
- package/dist/backend/llvm/map-entry-fusion.test.js +1 -1
- package/dist/backend/llvm/map-number-lookup.js +2 -2
- package/dist/backend/llvm/map-number-lookup.test.js +2 -2
- package/dist/backend/llvm/map-read-lifetimes.test.js +2 -2
- package/dist/backend/llvm/narrow-guards.d.ts +38 -0
- package/dist/backend/llvm/narrow-guards.js +151 -0
- package/dist/backend/llvm/narrow-guards.js.map +1 -0
- package/dist/backend/llvm/nullable-unions.d.ts +64 -6
- package/dist/backend/llvm/nullable-unions.js +103 -6
- package/dist/backend/llvm/nullable-unions.js.map +1 -1
- package/dist/backend/llvm/nullable-unions.test.d.ts +1 -0
- package/dist/backend/llvm/nullable-unions.test.js +65 -0
- package/dist/backend/llvm/nullable-unions.test.js.map +1 -0
- package/dist/backend/llvm/publish.d.ts +4 -0
- package/dist/backend/llvm/publish.js +14 -2
- package/dist/backend/llvm/publish.js.map +1 -1
- package/dist/backend/llvm/publish.test.js +1 -1
- package/dist/backend/llvm/receivers.d.ts +31 -0
- package/dist/backend/llvm/receivers.js +395 -0
- package/dist/backend/llvm/receivers.js.map +1 -0
- package/dist/backend/llvm/record-results.d.ts +12 -1
- package/dist/backend/llvm/record-results.js +64 -4
- package/dist/backend/llvm/record-results.js.map +1 -1
- package/dist/backend/llvm/reference-effects.js +9 -0
- package/dist/backend/llvm/reference-effects.js.map +1 -1
- package/dist/backend/llvm/reference-writes.d.ts +4 -0
- package/dist/backend/llvm/reference-writes.js +142 -6
- package/dist/backend/llvm/reference-writes.js.map +1 -1
- package/dist/backend/llvm/reference-writes.test.d.ts +1 -0
- package/dist/backend/llvm/reference-writes.test.js +88 -0
- package/dist/backend/llvm/reference-writes.test.js.map +1 -0
- package/dist/backend/llvm/regex-matchers.d.ts +8 -0
- package/dist/backend/llvm/regex-matchers.js +33 -0
- package/dist/backend/llvm/regex-matchers.js.map +1 -1
- package/dist/backend/llvm/regex-matchers.test.js +23 -1
- package/dist/backend/llvm/regex-matchers.test.js.map +1 -1
- package/dist/backend/llvm/regions.d.ts +1 -1
- package/dist/backend/llvm/regions.js +9 -6
- package/dist/backend/llvm/regions.js.map +1 -1
- package/dist/backend/llvm/regions.test.js +1 -1
- package/dist/backend/llvm/shapes.d.ts +66 -43
- package/dist/backend/llvm/shapes.js +280 -21
- package/dist/backend/llvm/shapes.js.map +1 -1
- package/dist/backend/llvm/shapes.test.js +37 -3
- package/dist/backend/llvm/shapes.test.js.map +1 -1
- package/dist/backend/llvm/split-loops.js +2 -2
- package/dist/backend/llvm/split-loops.js.map +1 -1
- package/dist/backend/llvm/stack-objects.d.ts +26 -6
- package/dist/backend/llvm/stack-objects.js +133 -10
- package/dist/backend/llvm/stack-objects.js.map +1 -1
- package/dist/backend/llvm/stack-objects.test.js +55 -1
- package/dist/backend/llvm/stack-objects.test.js.map +1 -1
- package/dist/backend/llvm/stack-unions.test.js +1 -1
- package/dist/backend/llvm/string-construction.test.js +1 -1
- package/dist/backend/llvm/string-lifetimes.test.js +15 -14
- package/dist/backend/llvm/string-lifetimes.test.js.map +1 -1
- package/dist/backend/llvm/string-slices.d.ts +25 -0
- package/dist/backend/llvm/string-slices.js +207 -1
- package/dist/backend/llvm/string-slices.js.map +1 -1
- package/dist/backend/llvm/string-slices.test.js +139 -2
- package/dist/backend/llvm/string-slices.test.js.map +1 -1
- package/dist/backend/llvm/switch-dispatch.test.js +2 -2
- package/dist/backend/llvm/thread-slots.d.ts +5 -0
- package/dist/backend/llvm/thread-slots.js +142 -0
- package/dist/backend/llvm/thread-slots.js.map +1 -0
- package/dist/backend/llvm/thread-slots.test.d.ts +1 -0
- package/dist/backend/llvm/thread-slots.test.js +110 -0
- package/dist/backend/llvm/thread-slots.test.js.map +1 -0
- package/dist/backend/llvm/union-repr.d.ts +7 -7
- package/dist/backend/llvm/union-repr.js +18 -2
- package/dist/backend/llvm/union-repr.js.map +1 -1
- package/dist/backend/llvm/union-retype.test.js +17 -3
- package/dist/backend/llvm/union-retype.test.js.map +1 -1
- package/dist/backend/llvm/walkers.d.ts +2 -2
- package/dist/backend/llvm/walkers.js +51 -26
- package/dist/backend/llvm/walkers.js.map +1 -1
- package/dist/backend/llvm/wasm-modules.d.ts +16 -0
- package/dist/backend/llvm/wasm-modules.js +66 -0
- package/dist/backend/llvm/wasm-modules.js.map +1 -0
- package/dist/backend/llvm/wrapping-sums.d.ts +7 -0
- package/dist/backend/llvm/wrapping-sums.js +11 -3
- package/dist/backend/llvm/wrapping-sums.js.map +1 -1
- package/dist/backend/mangle.d.ts +7 -0
- package/dist/backend/mangle.js +11 -0
- package/dist/backend/mangle.js.map +1 -1
- package/dist/backend/may-throw.d.ts +3 -0
- package/dist/backend/may-throw.js +4 -2
- package/dist/backend/may-throw.js.map +1 -1
- package/dist/backend/may-throw.test.js +1 -1
- package/dist/backend/native/contracts.d.ts +37 -0
- package/dist/backend/native/executable.js +192 -137
- package/dist/backend/native/executable.js.map +1 -1
- package/dist/backend/native/library.js +1 -0
- package/dist/backend/native/library.js.map +1 -1
- package/dist/backend/native/runtime-inputs.d.ts +1 -1
- package/dist/backend/native/runtime-inputs.js +1 -0
- package/dist/backend/native/runtime-inputs.js.map +1 -1
- package/dist/backend/native-link-info-core.d.ts +30 -0
- package/dist/backend/native-link-info-core.js.map +1 -1
- package/dist/backend/publication.test.js +1 -1
- package/dist/backend/runtime-pack-core.d.ts +9 -1
- package/dist/backend/runtime-pack-core.js +10 -1
- package/dist/backend/runtime-pack-core.js.map +1 -1
- package/dist/backend/runtime-pack-native.js +1 -1
- package/dist/backend/runtime-pack-native.js.map +1 -1
- package/dist/backend/runtime-pack-native.test.d.ts +1 -0
- package/dist/backend/runtime-pack-native.test.js +31 -0
- package/dist/backend/runtime-pack-native.test.js.map +1 -0
- package/dist/backend/runtime-pack-targets.test.js +5 -0
- package/dist/backend/runtime-pack-targets.test.js.map +1 -1
- package/dist/backend/runtime-pack.test.js +5 -0
- package/dist/backend/runtime-pack.test.js.map +1 -1
- package/dist/backend/stack-observations.d.ts +22 -0
- package/dist/backend/stack-observations.js +382 -0
- package/dist/backend/stack-observations.js.map +1 -0
- package/dist/backend/stack-observations.test.d.ts +1 -0
- package/dist/backend/stack-observations.test.js +233 -0
- package/dist/backend/stack-observations.test.js.map +1 -0
- package/dist/backend/target-diagnostics.js +8 -0
- package/dist/backend/target-diagnostics.js.map +1 -1
- package/dist/backend/target-diagnostics.test.js +1 -1
- package/dist/backend/warm-cache.js +5 -0
- package/dist/backend/warm-cache.js.map +1 -1
- package/dist/backend/young-nursery.d.ts +7 -0
- package/dist/backend/young-nursery.js +10 -0
- package/dist/backend/young-nursery.js.map +1 -0
- package/dist/cli/command.js +44 -4
- package/dist/cli/command.js.map +1 -1
- package/dist/cli/usage.d.ts +11 -1
- package/dist/cli/usage.js +20 -1
- package/dist/cli/usage.js.map +1 -1
- package/dist/compat/fetch-profile.js +10 -1
- package/dist/compat/fetch-profile.js.map +1 -1
- package/dist/compile-types.d.ts +13 -0
- package/dist/contracts/check.js +24 -6
- package/dist/contracts/check.js.map +1 -1
- package/dist/contracts/int32-elements.d.ts +115 -0
- package/dist/contracts/int32-elements.js +1179 -0
- package/dist/contracts/int32-elements.js.map +1 -0
- package/dist/coverage/report.d.ts +16 -0
- package/dist/coverage/report.js +182 -1
- package/dist/coverage/report.js.map +1 -1
- package/dist/coverage/surface-manifest.js +16 -3
- package/dist/coverage/surface-manifest.js.map +1 -1
- package/dist/coverage/verdict-cache.d.ts +2 -0
- package/dist/coverage/verdict-cache.js +12 -0
- package/dist/coverage/verdict-cache.js.map +1 -1
- package/dist/coverage/verdict-cache.test.js +2 -1
- package/dist/coverage/verdict-cache.test.js.map +1 -1
- package/dist/diagnostics/diagnostic.d.ts +10 -6
- package/dist/diagnostics/diagnostic.js +29 -21
- package/dist/diagnostics/diagnostic.js.map +1 -1
- package/dist/diagnostics/envelope.d.ts +39 -2
- package/dist/diagnostics/envelope.js.map +1 -1
- package/dist/diagnostics/render.d.ts +7 -0
- package/dist/diagnostics/render.js +50 -13
- package/dist/diagnostics/render.js.map +1 -1
- package/dist/diagnostics/render.test.d.ts +1 -0
- package/dist/diagnostics/render.test.js +49 -0
- package/dist/diagnostics/render.test.js.map +1 -0
- package/dist/executable/executable-cache.d.ts +17 -0
- package/dist/executable/executable-cache.js +13 -1
- package/dist/executable/executable-cache.js.map +1 -1
- package/dist/executable/executable-cache.test.js +7 -1
- package/dist/executable/executable-cache.test.js.map +1 -1
- package/dist/executable/prepare.js +2 -1
- package/dist/executable/prepare.js.map +1 -1
- package/dist/frontend/analysis.js +6 -1
- package/dist/frontend/analysis.js.map +1 -1
- package/dist/frontend/builtin-modules.d.ts +16 -2
- package/dist/frontend/builtin-modules.js +40 -7
- package/dist/frontend/builtin-modules.js.map +1 -1
- package/dist/frontend/cjs-syntax.js +52 -51
- package/dist/frontend/cjs-syntax.js.map +1 -1
- package/dist/frontend/contract-types.d.ts +3 -0
- package/dist/frontend/contract-types.js +36 -7
- package/dist/frontend/contract-types.js.map +1 -1
- package/dist/frontend/experimental-import.d.ts +5 -1
- package/dist/frontend/experimental-import.js +26 -7
- package/dist/frontend/experimental-import.js.map +1 -1
- package/dist/frontend/fork-target.js +20 -22
- package/dist/frontend/fork-target.js.map +1 -1
- package/dist/frontend/fork-target.test.js +2 -1
- package/dist/frontend/fork-target.test.js.map +1 -1
- package/dist/frontend/function-completion.js +6 -6
- package/dist/frontend/function-completion.js.map +1 -1
- package/dist/frontend/helper-tokens.js +15 -3
- package/dist/frontend/helper-tokens.js.map +1 -1
- package/dist/frontend/helper-tokens.test.js +7 -1
- package/dist/frontend/helper-tokens.test.js.map +1 -1
- package/dist/frontend/inferred-js-diagnostics.js +14 -17
- package/dist/frontend/inferred-js-diagnostics.js.map +1 -1
- package/dist/frontend/input-tracker.d.ts +3 -0
- package/dist/frontend/input-tracker.js +32 -3
- package/dist/frontend/input-tracker.js.map +1 -1
- package/dist/frontend/lib-contract.js +36 -32
- package/dist/frontend/lib-contract.js.map +1 -1
- package/dist/frontend/lib-exports.js +3 -3
- package/dist/frontend/lib-exports.js.map +1 -1
- package/dist/frontend/lowering/array-values.d.ts +8 -3
- package/dist/frontend/lowering/array-values.js +60 -11
- package/dist/frontend/lowering/array-values.js.map +1 -1
- package/dist/frontend/lowering/assert-instances.js +4 -4
- package/dist/frontend/lowering/assert-instances.js.map +1 -1
- package/dist/frontend/lowering/assertion-identity.d.ts +12 -0
- package/dist/frontend/lowering/assertion-identity.js +70 -0
- package/dist/frontend/lowering/assertion-identity.js.map +1 -0
- package/dist/frontend/lowering/assertion-members.d.ts +28 -0
- package/dist/frontend/lowering/assertion-members.js +185 -0
- package/dist/frontend/lowering/assertion-members.js.map +1 -0
- package/dist/frontend/lowering/binding-analysis.js +27 -20
- package/dist/frontend/lowering/binding-analysis.js.map +1 -1
- package/dist/frontend/lowering/builtin-calls.js +63 -5
- package/dist/frontend/lowering/builtin-calls.js.map +1 -1
- package/dist/frontend/lowering/builtin-function-fences.d.ts +14 -0
- package/dist/frontend/lowering/builtin-function-fences.js +42 -0
- package/dist/frontend/lowering/builtin-function-fences.js.map +1 -0
- package/dist/frontend/lowering/builtins/arguments.js +1 -1
- package/dist/frontend/lowering/builtins/arguments.js.map +1 -1
- package/dist/frontend/lowering/builtins/async-context.js +53 -52
- package/dist/frontend/lowering/builtins/async-context.js.map +1 -1
- package/dist/frontend/lowering/builtins/atomics.js +6 -6
- package/dist/frontend/lowering/builtins/atomics.js.map +1 -1
- package/dist/frontend/lowering/builtins/blob.js +8 -6
- package/dist/frontend/lowering/builtins/blob.js.map +1 -1
- package/dist/frontend/lowering/builtins/builtin-class-dyn.d.ts +23 -0
- package/dist/frontend/lowering/builtins/builtin-class-dyn.js +156 -0
- package/dist/frontend/lowering/builtins/builtin-class-dyn.js.map +1 -0
- package/dist/frontend/lowering/builtins/callable-aliases.js +16 -5
- package/dist/frontend/lowering/builtins/callable-aliases.js.map +1 -1
- package/dist/frontend/lowering/builtins/child-process-async.js +7 -7
- package/dist/frontend/lowering/builtins/child-process-async.js.map +1 -1
- package/dist/frontend/lowering/builtins/child-process-methods.d.ts +6 -4
- package/dist/frontend/lowering/builtins/child-process-methods.js +310 -57
- package/dist/frontend/lowering/builtins/child-process-methods.js.map +1 -1
- package/dist/frontend/lowering/builtins/child-process-sync.js +16 -10
- package/dist/frontend/lowering/builtins/child-process-sync.js.map +1 -1
- package/dist/frontend/lowering/builtins/child-process.d.ts +6 -4
- package/dist/frontend/lowering/builtins/child-process.js +85 -61
- package/dist/frontend/lowering/builtins/child-process.js.map +1 -1
- package/dist/frontend/lowering/builtins/class-values.d.ts +60 -0
- package/dist/frontend/lowering/builtins/class-values.js +226 -0
- package/dist/frontend/lowering/builtins/class-values.js.map +1 -0
- package/dist/frontend/lowering/builtins/compression.d.ts +9 -0
- package/dist/frontend/lowering/builtins/compression.js +107 -44
- package/dist/frontend/lowering/builtins/compression.js.map +1 -1
- package/dist/frontend/lowering/builtins/constants.d.ts +9 -1
- package/dist/frontend/lowering/builtins/constants.js +28 -7
- package/dist/frontend/lowering/builtins/constants.js.map +1 -1
- package/dist/frontend/lowering/builtins/crypto.d.ts +19 -0
- package/dist/frontend/lowering/builtins/crypto.js +211 -37
- package/dist/frontend/lowering/builtins/crypto.js.map +1 -1
- package/dist/frontend/lowering/builtins/dates.d.ts +7 -1
- package/dist/frontend/lowering/builtins/dates.js +92 -16
- package/dist/frontend/lowering/builtins/dates.js.map +1 -1
- package/dist/frontend/lowering/builtins/disposable-stack.d.ts +18 -0
- package/dist/frontend/lowering/builtins/disposable-stack.js +137 -0
- package/dist/frontend/lowering/builtins/disposable-stack.js.map +1 -0
- package/dist/frontend/lowering/builtins/environment.js +3 -3
- package/dist/frontend/lowering/builtins/environment.js.map +1 -1
- package/dist/frontend/lowering/builtins/errors.d.ts +14 -10
- package/dist/frontend/lowering/builtins/errors.js +169 -3
- package/dist/frontend/lowering/builtins/errors.js.map +1 -1
- package/dist/frontend/lowering/builtins/filesystem-calls.js +128 -116
- package/dist/frontend/lowering/builtins/filesystem-calls.js.map +1 -1
- package/dist/frontend/lowering/builtins/filesystem.js +77 -77
- package/dist/frontend/lowering/builtins/filesystem.js.map +1 -1
- package/dist/frontend/lowering/builtins/fs-glob.js +3 -3
- package/dist/frontend/lowering/builtins/fs-glob.js.map +1 -1
- package/dist/frontend/lowering/builtins/fs-streams.js +10 -11
- package/dist/frontend/lowering/builtins/fs-streams.js.map +1 -1
- package/dist/frontend/lowering/builtins/ipc.js +45 -8
- package/dist/frontend/lowering/builtins/ipc.js.map +1 -1
- package/dist/frontend/lowering/builtins/json.js +232 -24
- package/dist/frontend/lowering/builtins/json.js.map +1 -1
- package/dist/frontend/lowering/builtins/key-object.js +4 -4
- package/dist/frontend/lowering/builtins/key-object.js.map +1 -1
- package/dist/frontend/lowering/builtins/module-bindings.d.ts +8 -0
- package/dist/frontend/lowering/builtins/module-bindings.js +71 -22
- package/dist/frontend/lowering/builtins/module-bindings.js.map +1 -1
- package/dist/frontend/lowering/builtins/module-calls.js +55 -44
- package/dist/frontend/lowering/builtins/module-calls.js.map +1 -1
- package/dist/frontend/lowering/builtins/module-resolution.d.ts +4 -3
- package/dist/frontend/lowering/builtins/module-resolution.js +24 -23
- package/dist/frontend/lowering/builtins/module-resolution.js.map +1 -1
- package/dist/frontend/lowering/builtins/navigator.d.ts +13 -0
- package/dist/frontend/lowering/builtins/navigator.js +40 -0
- package/dist/frontend/lowering/builtins/navigator.js.map +1 -0
- package/dist/frontend/lowering/builtins/net-address.d.ts +19 -0
- package/dist/frontend/lowering/builtins/net-address.js +156 -0
- package/dist/frontend/lowering/builtins/net-address.js.map +1 -0
- package/dist/frontend/lowering/builtins/numbers.js +25 -9
- package/dist/frontend/lowering/builtins/numbers.js.map +1 -1
- package/dist/frontend/lowering/builtins/operating-system.d.ts +4 -0
- package/dist/frontend/lowering/builtins/operating-system.js +25 -12
- package/dist/frontend/lowering/builtins/operating-system.js.map +1 -1
- package/dist/frontend/lowering/builtins/performance.d.ts +12 -0
- package/dist/frontend/lowering/builtins/performance.js +259 -8
- package/dist/frontend/lowering/builtins/performance.js.map +1 -1
- package/dist/frontend/lowering/builtins/process.d.ts +32 -1
- package/dist/frontend/lowering/builtins/process.js +461 -99
- package/dist/frontend/lowering/builtins/process.js.map +1 -1
- package/dist/frontend/lowering/builtins/promises.d.ts +5 -1
- package/dist/frontend/lowering/builtins/promises.js +326 -43
- package/dist/frontend/lowering/builtins/promises.js.map +1 -1
- package/dist/frontend/lowering/builtins/promisify-callback.d.ts +37 -0
- package/dist/frontend/lowering/builtins/promisify-callback.js +320 -0
- package/dist/frontend/lowering/builtins/promisify-callback.js.map +1 -0
- package/dist/frontend/lowering/builtins/properties.js +37 -1
- package/dist/frontend/lowering/builtins/properties.js.map +1 -1
- package/dist/frontend/lowering/builtins/querystring.js +14 -14
- package/dist/frontend/lowering/builtins/querystring.js.map +1 -1
- package/dist/frontend/lowering/builtins/readline.d.ts +12 -2
- package/dist/frontend/lowering/builtins/readline.js +136 -39
- package/dist/frontend/lowering/builtins/readline.js.map +1 -1
- package/dist/frontend/lowering/builtins/receiver-types.js +3 -5
- package/dist/frontend/lowering/builtins/receiver-types.js.map +1 -1
- package/dist/frontend/lowering/builtins/reflection.js +16 -14
- package/dist/frontend/lowering/builtins/reflection.js.map +1 -1
- package/dist/frontend/lowering/builtins/runtime-constructor.d.ts +26 -0
- package/dist/frontend/lowering/builtins/runtime-constructor.js +165 -0
- package/dist/frontend/lowering/builtins/runtime-constructor.js.map +1 -0
- package/dist/frontend/lowering/builtins/strings.js +101 -12
- package/dist/frontend/lowering/builtins/strings.js.map +1 -1
- package/dist/frontend/lowering/builtins/text-codecs.js +41 -38
- package/dist/frontend/lowering/builtins/text-codecs.js.map +1 -1
- package/dist/frontend/lowering/builtins/timers.js +75 -30
- package/dist/frontend/lowering/builtins/timers.js.map +1 -1
- package/dist/frontend/lowering/builtins/url.d.ts +3 -0
- package/dist/frontend/lowering/builtins/url.js +120 -17
- package/dist/frontend/lowering/builtins/url.js.map +1 -1
- package/dist/frontend/lowering/builtins/util-types.js +20 -4
- package/dist/frontend/lowering/builtins/util-types.js.map +1 -1
- package/dist/frontend/lowering/builtins/v8.d.ts +11 -0
- package/dist/frontend/lowering/builtins/v8.js +105 -0
- package/dist/frontend/lowering/builtins/v8.js.map +1 -0
- package/dist/frontend/lowering/builtins/webassembly.d.ts +33 -0
- package/dist/frontend/lowering/builtins/webassembly.js +388 -0
- package/dist/frontend/lowering/builtins/webassembly.js.map +1 -0
- package/dist/frontend/lowering/builtins/webcrypto.d.ts +20 -0
- package/dist/frontend/lowering/builtins/webcrypto.js +112 -0
- package/dist/frontend/lowering/builtins/webcrypto.js.map +1 -0
- package/dist/frontend/lowering/builtins/workers.d.ts +12 -0
- package/dist/frontend/lowering/builtins/workers.js +193 -8
- package/dist/frontend/lowering/builtins/workers.js.map +1 -1
- package/dist/frontend/lowering/call-arguments.js +69 -14
- package/dist/frontend/lowering/call-arguments.js.map +1 -1
- package/dist/frontend/lowering/call-signatures.d.ts +19 -1
- package/dist/frontend/lowering/call-signatures.js +254 -47
- package/dist/frontend/lowering/call-signatures.js.map +1 -1
- package/dist/frontend/lowering/checked-promise-all.d.ts +3 -0
- package/dist/frontend/lowering/checked-promise-all.js +1 -1
- package/dist/frontend/lowering/checked-promise-all.js.map +1 -1
- package/dist/frontend/lowering/cjs-exports-object.d.ts +53 -0
- package/dist/frontend/lowering/cjs-exports-object.js +528 -0
- package/dist/frontend/lowering/cjs-exports-object.js.map +1 -0
- package/dist/frontend/lowering/cjs-inline-require.d.ts +86 -0
- package/dist/frontend/lowering/cjs-inline-require.js +314 -0
- package/dist/frontend/lowering/cjs-inline-require.js.map +1 -0
- package/dist/frontend/lowering/cjs-tsc-interop.d.ts +28 -0
- package/dist/frontend/lowering/cjs-tsc-interop.js +208 -0
- package/dist/frontend/lowering/cjs-tsc-interop.js.map +1 -0
- package/dist/frontend/lowering/class-attributes.d.ts +19 -0
- package/dist/frontend/lowering/class-attributes.js +378 -0
- package/dist/frontend/lowering/class-attributes.js.map +1 -0
- package/dist/frontend/lowering/class-callbacks.d.ts +3 -1
- package/dist/frontend/lowering/class-callbacks.js +21 -10
- package/dist/frontend/lowering/class-callbacks.js.map +1 -1
- package/dist/frontend/lowering/class-construction.js +49 -4
- package/dist/frontend/lowering/class-construction.js.map +1 -1
- package/dist/frontend/lowering/class-descriptors.d.ts +2 -0
- package/dist/frontend/lowering/class-descriptors.js +8 -8
- package/dist/frontend/lowering/class-descriptors.js.map +1 -1
- package/dist/frontend/lowering/class-dynamic-dispatch.d.ts +64 -0
- package/dist/frontend/lowering/class-dynamic-dispatch.js +1115 -89
- package/dist/frontend/lowering/class-dynamic-dispatch.js.map +1 -1
- package/dist/frontend/lowering/class-instance-constructor.js +1 -1
- package/dist/frontend/lowering/class-instance-constructor.js.map +1 -1
- package/dist/frontend/lowering/class-iterables.d.ts +11 -0
- package/dist/frontend/lowering/class-iterables.js +31 -0
- package/dist/frontend/lowering/class-iterables.js.map +1 -0
- package/dist/frontend/lowering/class-method-mutations.js +73 -35
- package/dist/frontend/lowering/class-method-mutations.js.map +1 -1
- package/dist/frontend/lowering/class-method-values.js +56 -10
- package/dist/frontend/lowering/class-method-values.js.map +1 -1
- package/dist/frontend/lowering/class-protocol-dispatch.js +24 -22
- package/dist/frontend/lowering/class-protocol-dispatch.js.map +1 -1
- package/dist/frontend/lowering/class-protocols.js +25 -44
- package/dist/frontend/lowering/class-protocols.js.map +1 -1
- package/dist/frontend/lowering/class-prototypes.d.ts +6 -0
- package/dist/frontend/lowering/class-prototypes.js +80 -18
- package/dist/frontend/lowering/class-prototypes.js.map +1 -1
- package/dist/frontend/lowering/class-runtime-statics.js +1 -1
- package/dist/frontend/lowering/class-runtime-statics.js.map +1 -1
- package/dist/frontend/lowering/class-static-data.js +2 -2
- package/dist/frontend/lowering/class-static-data.js.map +1 -1
- package/dist/frontend/lowering/class-to-primitive.d.ts +25 -0
- package/dist/frontend/lowering/class-to-primitive.js +261 -0
- package/dist/frontend/lowering/class-to-primitive.js.map +1 -0
- package/dist/frontend/lowering/class-unions.d.ts +25 -0
- package/dist/frontend/lowering/class-unions.js +102 -1
- package/dist/frontend/lowering/class-unions.js.map +1 -1
- package/dist/frontend/lowering/code-generation.d.ts +14 -0
- package/dist/frontend/lowering/code-generation.js +127 -0
- package/dist/frontend/lowering/code-generation.js.map +1 -0
- package/dist/frontend/lowering/coercions/function-adapters.d.ts +16 -2
- package/dist/frontend/lowering/coercions/function-adapters.js +145 -3
- package/dist/frontend/lowering/coercions/function-adapters.js.map +1 -1
- package/dist/frontend/lowering/coercions/structural-plans.js +25 -3
- package/dist/frontend/lowering/coercions/structural-plans.js.map +1 -1
- package/dist/frontend/lowering/coercions/structural.js +35 -3
- package/dist/frontend/lowering/coercions/structural.js.map +1 -1
- package/dist/frontend/lowering/coercions/unions.d.ts +15 -0
- package/dist/frontend/lowering/coercions/unions.js +57 -1
- package/dist/frontend/lowering/coercions/unions.js.map +1 -1
- package/dist/frontend/lowering/collection-ingestion.js +2 -2
- package/dist/frontend/lowering/collection-ingestion.js.map +1 -1
- package/dist/frontend/lowering/collection-narrowing.js +2 -4
- package/dist/frontend/lowering/collection-narrowing.js.map +1 -1
- package/dist/frontend/lowering/construction-escapes.js +8 -8
- package/dist/frontend/lowering/construction-escapes.js.map +1 -1
- package/dist/frontend/lowering/construction-escapes.test.js +4 -4
- package/dist/frontend/lowering/construction-escapes.test.js.map +1 -1
- package/dist/frontend/lowering/constructor-returns.d.ts +61 -0
- package/dist/frontend/lowering/constructor-returns.js +477 -0
- package/dist/frontend/lowering/constructor-returns.js.map +1 -0
- package/dist/frontend/lowering/containers/array-callback-call.js +1 -1
- package/dist/frontend/lowering/containers/array-callback-call.js.map +1 -1
- package/dist/frontend/lowering/containers/array-callbacks.d.ts +9 -0
- package/dist/frontend/lowering/containers/array-callbacks.js +266 -100
- package/dist/frontend/lowering/containers/array-callbacks.js.map +1 -1
- package/dist/frontend/lowering/containers/array-concat.js +1 -1
- package/dist/frontend/lowering/containers/array-concat.js.map +1 -1
- package/dist/frontend/lowering/containers/array-construction.d.ts +0 -1
- package/dist/frontend/lowering/containers/array-construction.js +51 -13
- package/dist/frontend/lowering/containers/array-construction.js.map +1 -1
- package/dist/frontend/lowering/containers/array-from-async.d.ts +6 -5
- package/dist/frontend/lowering/containers/array-from-async.js +159 -14
- package/dist/frontend/lowering/containers/array-from-async.js.map +1 -1
- package/dist/frontend/lowering/containers/array-methods.js +89 -77
- package/dist/frontend/lowering/containers/array-methods.js.map +1 -1
- package/dist/frontend/lowering/containers/array-pipelines.js +1 -0
- package/dist/frontend/lowering/containers/array-pipelines.js.map +1 -1
- package/dist/frontend/lowering/containers/bytes.js +161 -101
- package/dist/frontend/lowering/containers/bytes.js.map +1 -1
- package/dist/frontend/lowering/containers/callback-arguments.d.ts +9 -1
- package/dist/frontend/lowering/containers/callback-arguments.js +55 -5
- package/dist/frontend/lowering/containers/callback-arguments.js.map +1 -1
- package/dist/frontend/lowering/containers/collection-grouping.d.ts +7 -8
- package/dist/frontend/lowering/containers/collection-grouping.js +217 -26
- package/dist/frontend/lowering/containers/collection-grouping.js.map +1 -1
- package/dist/frontend/lowering/containers/collection-methods.js +54 -25
- package/dist/frontend/lowering/containers/collection-methods.js.map +1 -1
- package/dist/frontend/lowering/containers/dynamic-receivers.js +1 -1
- package/dist/frontend/lowering/containers/dynamic-receivers.js.map +1 -1
- package/dist/frontend/lowering/containers/exec-result-uses.js +2 -2
- package/dist/frontend/lowering/containers/exec-result-uses.js.map +1 -1
- package/dist/frontend/lowering/containers/for-of.d.ts +6 -0
- package/dist/frontend/lowering/containers/for-of.js +19 -19
- package/dist/frontend/lowering/containers/for-of.js.map +1 -1
- package/dist/frontend/lowering/containers/indexed-objects.js +142 -57
- package/dist/frontend/lowering/containers/indexed-objects.js.map +1 -1
- package/dist/frontend/lowering/containers/iterator-helpers.d.ts +53 -4
- package/dist/frontend/lowering/containers/iterator-helpers.js +1581 -462
- package/dist/frontend/lowering/containers/iterator-helpers.js.map +1 -1
- package/dist/frontend/lowering/containers/match-row-uses.d.ts +17 -0
- package/dist/frontend/lowering/containers/match-row-uses.js +264 -0
- package/dist/frontend/lowering/containers/match-row-uses.js.map +1 -0
- package/dist/frontend/lowering/containers/string-and-regexp.d.ts +14 -0
- package/dist/frontend/lowering/containers/string-and-regexp.js +419 -30
- package/dist/frontend/lowering/containers/string-and-regexp.js.map +1 -1
- package/dist/frontend/lowering/containers/string-replacement.js +1 -1
- package/dist/frontend/lowering/containers/string-replacement.js.map +1 -1
- package/dist/frontend/lowering/cycle-initialization.d.ts +4 -0
- package/dist/frontend/lowering/cycle-initialization.js +39 -0
- package/dist/frontend/lowering/cycle-initialization.js.map +1 -1
- package/dist/frontend/lowering/deferred-module-initializers.js +47 -43
- package/dist/frontend/lowering/deferred-module-initializers.js.map +1 -1
- package/dist/frontend/lowering/devirtualize.d.ts +1 -1
- package/dist/frontend/lowering/devirtualize.js +27 -7
- package/dist/frontend/lowering/devirtualize.js.map +1 -1
- package/dist/frontend/lowering/divergences.d.ts +0 -5
- package/dist/frontend/lowering/divergences.js +62 -125
- package/dist/frontend/lowering/divergences.js.map +1 -1
- package/dist/frontend/lowering/dyn-streams.d.ts +25 -0
- package/dist/frontend/lowering/dyn-streams.js +257 -0
- package/dist/frontend/lowering/dyn-streams.js.map +1 -0
- package/dist/frontend/lowering/error-methods.js +4 -1
- package/dist/frontend/lowering/error-methods.js.map +1 -1
- package/dist/frontend/lowering/error-name-order.d.ts +19 -0
- package/dist/frontend/lowering/error-name-order.js +93 -0
- package/dist/frontend/lowering/error-name-order.js.map +1 -0
- package/dist/frontend/lowering/expressions/array-literals.d.ts +21 -0
- package/dist/frontend/lowering/expressions/array-literals.js +703 -0
- package/dist/frontend/lowering/expressions/array-literals.js.map +1 -0
- package/dist/frontend/lowering/expressions/binary.d.ts +35 -0
- package/dist/frontend/lowering/expressions/binary.js +2483 -0
- package/dist/frontend/lowering/expressions/binary.js.map +1 -0
- package/dist/frontend/lowering/expressions/element-access.d.ts +31 -0
- package/dist/frontend/lowering/expressions/element-access.js +1797 -0
- package/dist/frontend/lowering/expressions/element-access.js.map +1 -0
- package/dist/frontend/lowering/expressions/evaluation-safety.js +4 -3
- package/dist/frontend/lowering/expressions/evaluation-safety.js.map +1 -1
- package/dist/frontend/lowering/expressions/hosted-narrowing.d.ts +38 -0
- package/dist/frontend/lowering/expressions/hosted-narrowing.js +160 -0
- package/dist/frontend/lowering/expressions/hosted-narrowing.js.map +1 -0
- package/dist/frontend/lowering/expressions/identifiers.d.ts +4 -0
- package/dist/frontend/lowering/expressions/identifiers.js +830 -0
- package/dist/frontend/lowering/expressions/identifiers.js.map +1 -0
- package/dist/frontend/lowering/expressions/keyed-field-targets.d.ts +40 -0
- package/dist/frontend/lowering/expressions/keyed-field-targets.js +226 -0
- package/dist/frontend/lowering/expressions/keyed-field-targets.js.map +1 -0
- package/dist/frontend/lowering/expressions/narrowing.d.ts +37 -0
- package/dist/frontend/lowering/expressions/narrowing.js +1322 -0
- package/dist/frontend/lowering/expressions/narrowing.js.map +1 -0
- package/dist/frontend/lowering/expressions/native-proxy.js +4 -4
- package/dist/frontend/lowering/expressions/native-proxy.js.map +1 -1
- package/dist/frontend/lowering/expressions/nullish-assignment.js +45 -0
- 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 +253 -85
- package/dist/frontend/lowering/expressions/object-literals.js.map +1 -1
- package/dist/frontend/lowering/expressions/optional-chains.d.ts +2 -1
- package/dist/frontend/lowering/expressions/optional-chains.js +91 -14
- package/dist/frontend/lowering/expressions/optional-chains.js.map +1 -1
- package/dist/frontend/lowering/expressions/property-access.d.ts +110 -0
- package/dist/frontend/lowering/expressions/property-access.js +3544 -0
- package/dist/frontend/lowering/expressions/property-access.js.map +1 -0
- package/dist/frontend/lowering/expressions/relational.d.ts +28 -0
- package/dist/frontend/lowering/expressions/relational.js +1679 -0
- package/dist/frontend/lowering/expressions/relational.js.map +1 -0
- package/dist/frontend/lowering/expressions/typeof.d.ts +22 -0
- package/dist/frontend/lowering/expressions/typeof.js +538 -0
- package/dist/frontend/lowering/expressions/typeof.js.map +1 -0
- package/dist/frontend/lowering/expressions/union-fields.js +1 -1
- package/dist/frontend/lowering/expressions/union-fields.js.map +1 -1
- package/dist/frontend/lowering/expressions/updates.d.ts +21 -0
- package/dist/frontend/lowering/expressions/updates.js +780 -0
- package/dist/frontend/lowering/expressions/updates.js.map +1 -0
- package/dist/frontend/lowering/function-context.d.ts +10 -0
- package/dist/frontend/lowering/function-context.js +11 -1
- package/dist/frontend/lowering/function-context.js.map +1 -1
- package/dist/frontend/lowering/function-returns.js +52 -28
- package/dist/frontend/lowering/function-returns.js.map +1 -1
- package/dist/frontend/lowering/general-streams.d.ts +25 -0
- package/dist/frontend/lowering/general-streams.js +108 -0
- package/dist/frontend/lowering/general-streams.js.map +1 -0
- package/dist/frontend/lowering/generator-dynamic-dispatch.d.ts +7 -0
- package/dist/frontend/lowering/generator-dynamic-dispatch.js +172 -69
- package/dist/frontend/lowering/generator-dynamic-dispatch.js.map +1 -1
- package/dist/frontend/lowering/generic-functions.d.ts +39 -0
- package/dist/frontend/lowering/generic-functions.js +393 -75
- package/dist/frontend/lowering/generic-functions.js.map +1 -1
- package/dist/frontend/lowering/import-meta.js +2 -2
- package/dist/frontend/lowering/import-meta.js.map +1 -1
- package/dist/frontend/lowering/intern-tables.js +10 -9
- package/dist/frontend/lowering/intern-tables.js.map +1 -1
- package/dist/frontend/lowering/iterator-adapters.d.ts +19 -0
- package/dist/frontend/lowering/iterator-adapters.js +331 -3
- package/dist/frontend/lowering/iterator-adapters.js.map +1 -1
- package/dist/frontend/lowering/js-class-fields.d.ts +28 -0
- package/dist/frontend/lowering/js-class-fields.js +170 -0
- package/dist/frontend/lowering/js-class-fields.js.map +1 -0
- package/dist/frontend/lowering/js-dynamic-objects.d.ts +15 -0
- package/dist/frontend/lowering/js-dynamic-objects.js +299 -0
- package/dist/frontend/lowering/js-dynamic-objects.js.map +1 -0
- package/dist/frontend/lowering/js-dynamic-objects.test.d.ts +1 -0
- package/dist/frontend/lowering/js-dynamic-objects.test.js +35 -0
- package/dist/frontend/lowering/js-dynamic-objects.test.js.map +1 -0
- package/dist/frontend/lowering/json-require.d.ts +22 -0
- package/dist/frontend/lowering/json-require.js +131 -0
- package/dist/frontend/lowering/json-require.js.map +1 -0
- package/dist/frontend/lowering/key-order-witness.d.ts +44 -0
- package/dist/frontend/lowering/key-order-witness.js +641 -0
- package/dist/frontend/lowering/key-order-witness.js.map +1 -0
- package/dist/frontend/lowering/key-order-witness.test.d.ts +1 -0
- package/dist/frontend/lowering/key-order-witness.test.js +239 -0
- package/dist/frontend/lowering/key-order-witness.test.js.map +1 -0
- package/dist/frontend/lowering/lifetime-regions.js +7 -7
- package/dist/frontend/lowering/lifetime-regions.js.map +1 -1
- package/dist/frontend/lowering/lower-assert.js +61 -60
- package/dist/frontend/lowering/lower-assert.js.map +1 -1
- package/dist/frontend/lowering/lower-async-iteration.d.ts +10 -1
- package/dist/frontend/lowering/lower-async-iteration.js +34 -6
- package/dist/frontend/lowering/lower-async-iteration.js.map +1 -1
- package/dist/frontend/lowering/lower-builtin-values.d.ts +5 -0
- package/dist/frontend/lowering/lower-builtin-values.js +32 -3
- package/dist/frontend/lowering/lower-builtin-values.js.map +1 -1
- package/dist/frontend/lowering/lower-calls.js +1239 -442
- package/dist/frontend/lowering/lower-calls.js.map +1 -1
- package/dist/frontend/lowering/lower-classes.d.ts +50 -3
- package/dist/frontend/lowering/lower-classes.js +1473 -468
- package/dist/frontend/lowering/lower-classes.js.map +1 -1
- package/dist/frontend/lowering/lower-comptime.d.ts +4 -2
- package/dist/frontend/lowering/lower-comptime.js +111 -13
- package/dist/frontend/lowering/lower-comptime.js.map +1 -1
- package/dist/frontend/lowering/lower-console.js +13 -11
- package/dist/frontend/lowering/lower-console.js.map +1 -1
- package/dist/frontend/lowering/lower-dgram.d.ts +10 -0
- package/dist/frontend/lowering/lower-dgram.js +179 -8
- package/dist/frontend/lowering/lower-dgram.js.map +1 -1
- package/dist/frontend/lowering/lower-enums.js +113 -14
- package/dist/frontend/lowering/lower-enums.js.map +1 -1
- package/dist/frontend/lowering/lower-event-emitter.d.ts +16 -7
- package/dist/frontend/lowering/lower-event-emitter.js +258 -70
- package/dist/frontend/lowering/lower-event-emitter.js.map +1 -1
- package/dist/frontend/lowering/lower-event-target.js +2 -2
- package/dist/frontend/lowering/lower-event-target.js.map +1 -1
- package/dist/frontend/lowering/lower-expando.js +17 -13
- package/dist/frontend/lowering/lower-expando.js.map +1 -1
- package/dist/frontend/lowering/lower-exprs.d.ts +188 -186
- package/dist/frontend/lowering/lower-exprs.js +1481 -12489
- package/dist/frontend/lowering/lower-exprs.js.map +1 -1
- package/dist/frontend/lowering/lower-functions.js +68 -22
- package/dist/frontend/lowering/lower-functions.js.map +1 -1
- package/dist/frontend/lowering/lower-generators.d.ts +6 -0
- package/dist/frontend/lowering/lower-generators.js +29 -16
- package/dist/frontend/lowering/lower-generators.js.map +1 -1
- package/dist/frontend/lowering/lower-global-value.js +5 -1
- package/dist/frontend/lowering/lower-global-value.js.map +1 -1
- package/dist/frontend/lowering/lower-inspect.js +331 -96
- package/dist/frontend/lowering/lower-inspect.js.map +1 -1
- package/dist/frontend/lowering/lower-mixins.js +23 -20
- package/dist/frontend/lowering/lower-mixins.js.map +1 -1
- package/dist/frontend/lowering/lower-mock.d.ts +8 -1
- package/dist/frontend/lowering/lower-mock.js +185 -18
- package/dist/frontend/lowering/lower-mock.js.map +1 -1
- package/dist/frontend/lowering/lower-modules.js +267 -61
- package/dist/frontend/lowering/lower-modules.js.map +1 -1
- package/dist/frontend/lowering/lower-namespaces.d.ts +6 -0
- package/dist/frontend/lowering/lower-namespaces.js +45 -33
- package/dist/frontend/lowering/lower-namespaces.js.map +1 -1
- package/dist/frontend/lowering/lower-node-module.d.ts +16 -0
- package/dist/frontend/lowering/lower-node-module.js +147 -14
- package/dist/frontend/lowering/lower-node-module.js.map +1 -1
- package/dist/frontend/lowering/lower-server.d.ts +6 -6
- package/dist/frontend/lowering/lower-server.js +488 -100
- package/dist/frontend/lowering/lower-server.js.map +1 -1
- package/dist/frontend/lowering/lower-stdlib.d.ts +4 -0
- package/dist/frontend/lowering/lower-stdlib.js +151 -109
- package/dist/frontend/lowering/lower-stdlib.js.map +1 -1
- package/dist/frontend/lowering/lower-stmts.d.ts +28 -2
- package/dist/frontend/lowering/lower-stmts.js +1541 -391
- package/dist/frontend/lowering/lower-stmts.js.map +1 -1
- package/dist/frontend/lowering/lower-stream.d.ts +3 -0
- package/dist/frontend/lowering/lower-stream.js +398 -56
- package/dist/frontend/lowering/lower-stream.js.map +1 -1
- package/dist/frontend/lowering/lower-test.d.ts +3 -0
- package/dist/frontend/lowering/lower-test.js +437 -62
- package/dist/frontend/lowering/lower-test.js.map +1 -1
- package/dist/frontend/lowering/lower-timers.js +80 -32
- package/dist/frontend/lowering/lower-timers.js.map +1 -1
- package/dist/frontend/lowering/lower-url.js +1 -1
- package/dist/frontend/lowering/lower-url.js.map +1 -1
- package/dist/frontend/lowering/lowerer.d.ts +399 -26
- package/dist/frontend/lowering/lowerer.js +1910 -305
- package/dist/frontend/lowering/lowerer.js.map +1 -1
- package/dist/frontend/lowering/lowerer.test.js +10 -4
- package/dist/frontend/lowering/lowerer.test.js.map +1 -1
- package/dist/frontend/lowering/maybe-promise.d.ts +46 -0
- package/dist/frontend/lowering/maybe-promise.js +249 -0
- package/dist/frontend/lowering/maybe-promise.js.map +1 -0
- package/dist/frontend/lowering/module-member-this.d.ts +3 -0
- package/dist/frontend/lowering/module-member-this.js +262 -0
- package/dist/frontend/lowering/module-member-this.js.map +1 -0
- package/dist/frontend/lowering/module-namespace-elements.js +1 -1
- package/dist/frontend/lowering/module-namespace-elements.js.map +1 -1
- package/dist/frontend/lowering/nan-coded-reads.d.ts +3 -0
- package/dist/frontend/lowering/nan-coded-reads.js +45 -32
- package/dist/frontend/lowering/nan-coded-reads.js.map +1 -1
- package/dist/frontend/lowering/narrowing-stability.d.ts +18 -3
- package/dist/frontend/lowering/narrowing-stability.js +104 -32
- package/dist/frontend/lowering/narrowing-stability.js.map +1 -1
- package/dist/frontend/lowering/native-ffi.js +11 -11
- package/dist/frontend/lowering/native-ffi.js.map +1 -1
- package/dist/frontend/lowering/object-factory-new.js +6 -8
- package/dist/frontend/lowering/object-factory-new.js.map +1 -1
- package/dist/frontend/lowering/private-brands.d.ts +46 -0
- package/dist/frontend/lowering/private-brands.js +265 -0
- package/dist/frontend/lowering/private-brands.js.map +1 -0
- package/dist/frontend/lowering/promise-executor-adapter.d.ts +11 -0
- package/dist/frontend/lowering/promise-executor-adapter.js +87 -0
- package/dist/frontend/lowering/promise-executor-adapter.js.map +1 -0
- package/dist/frontend/lowering/require-initialization.d.ts +32 -0
- package/dist/frontend/lowering/require-initialization.js +246 -0
- package/dist/frontend/lowering/require-initialization.js.map +1 -0
- package/dist/frontend/lowering/runtime-optional-bounds.js +7 -7
- package/dist/frontend/lowering/runtime-optional-bounds.js.map +1 -1
- package/dist/frontend/lowering/runtime-optional-elements.js +12 -12
- package/dist/frontend/lowering/runtime-optional-elements.js.map +1 -1
- package/dist/frontend/lowering/runtime-optional-guards.js +10 -10
- package/dist/frontend/lowering/runtime-optional-guards.js.map +1 -1
- package/dist/frontend/lowering/runtime-optional-guards.test.js +1 -1
- package/dist/frontend/lowering/runtime-optional-guards.test.js.map +1 -1
- package/dist/frontend/lowering/runtime-optional-ownership.js +10 -9
- package/dist/frontend/lowering/runtime-optional-ownership.js.map +1 -1
- package/dist/frontend/lowering/runtime-optional-provenance.js +2 -2
- package/dist/frontend/lowering/runtime-optional-provenance.js.map +1 -1
- package/dist/frontend/lowering/runtime-optional-records.d.ts +35 -0
- package/dist/frontend/lowering/runtime-optional-records.js +205 -32
- package/dist/frontend/lowering/runtime-optional-records.js.map +1 -1
- package/dist/frontend/lowering/runtime-optional-records.test.js +19 -1
- package/dist/frontend/lowering/runtime-optional-records.test.js.map +1 -1
- package/dist/frontend/lowering/sanitize-class-types.test.js +2 -2
- package/dist/frontend/lowering/split-consumers.js +4 -4
- package/dist/frontend/lowering/split-consumers.js.map +1 -1
- package/dist/frontend/lowering/static-function-names.d.ts +28 -0
- package/dist/frontend/lowering/static-function-names.js +212 -0
- package/dist/frontend/lowering/static-function-names.js.map +1 -0
- package/dist/frontend/lowering/static-this.js +6 -6
- package/dist/frontend/lowering/static-this.js.map +1 -1
- package/dist/frontend/lowering/strict-mode.d.ts +5 -0
- package/dist/frontend/lowering/strict-mode.js +31 -0
- package/dist/frontend/lowering/strict-mode.js.map +1 -0
- package/dist/frontend/lowering/string-index-bounds.js +10 -10
- package/dist/frontend/lowering/string-index-bounds.js.map +1 -1
- package/dist/frontend/lowering/string-index.d.ts +12 -0
- package/dist/frontend/lowering/string-index.js +72 -1
- package/dist/frontend/lowering/string-index.js.map +1 -1
- package/dist/frontend/lowering/surfaces.d.ts +12 -3
- package/dist/frontend/lowering/surfaces.js +252 -41
- package/dist/frontend/lowering/surfaces.js.map +1 -1
- package/dist/frontend/lowering/symbol-fields.d.ts +7 -0
- package/dist/frontend/lowering/symbol-fields.js +204 -36
- package/dist/frontend/lowering/symbol-fields.js.map +1 -1
- package/dist/frontend/lowering/symbol-methods.d.ts +2 -1
- package/dist/frontend/lowering/symbol-methods.js +24 -6
- package/dist/frontend/lowering/symbol-methods.js.map +1 -1
- package/dist/frontend/lowering/thread-slots.d.ts +13 -0
- package/dist/frontend/lowering/thread-slots.js +208 -0
- package/dist/frontend/lowering/thread-slots.js.map +1 -0
- package/dist/frontend/lowering/typed-arguments.d.ts +74 -0
- package/dist/frontend/lowering/typed-arguments.js +472 -0
- package/dist/frontend/lowering/typed-arguments.js.map +1 -0
- package/dist/frontend/lowering/union-retag.d.ts +8 -0
- package/dist/frontend/lowering/union-retag.js +27 -0
- package/dist/frontend/lowering/union-retag.js.map +1 -1
- package/dist/frontend/lowering/union-retag.test.js +24 -1
- package/dist/frontend/lowering/union-retag.test.js.map +1 -1
- package/dist/frontend/lowering/var-hoisting.js +6 -6
- package/dist/frontend/lowering/var-hoisting.js.map +1 -1
- package/dist/frontend/lowering/width-lift.d.ts +4 -0
- package/dist/frontend/mock-shapes.js +13 -6
- package/dist/frontend/mock-shapes.js.map +1 -1
- package/dist/frontend/module-source-candidates.js +1 -1
- package/dist/frontend/module-source-candidates.js.map +1 -1
- package/dist/frontend/module-source-candidates.test.js +2 -1
- package/dist/frontend/module-source-candidates.test.js.map +1 -1
- package/dist/frontend/module-syntax.js +8 -8
- package/dist/frontend/module-syntax.js.map +1 -1
- package/dist/frontend/npm-static-bundled-chunks.d.ts +51 -0
- package/dist/frontend/npm-static-bundled-chunks.js +810 -0
- package/dist/frontend/npm-static-bundled-chunks.js.map +1 -0
- package/dist/frontend/npm-static-bundled-chunks.test.d.ts +1 -0
- package/dist/frontend/npm-static-bundled-chunks.test.js +287 -0
- package/dist/frontend/npm-static-bundled-chunks.test.js.map +1 -0
- package/dist/frontend/npm-static-bundled-cjs.js +24 -23
- package/dist/frontend/npm-static-bundled-cjs.js.map +1 -1
- package/dist/frontend/npm-static-bundled-esm.d.ts +9 -0
- package/dist/frontend/npm-static-bundled-esm.js +768 -0
- package/dist/frontend/npm-static-bundled-esm.js.map +1 -0
- package/dist/frontend/npm-static-bundled-esm.test.d.ts +1 -0
- package/dist/frontend/npm-static-bundled-esm.test.js +207 -0
- package/dist/frontend/npm-static-bundled-esm.test.js.map +1 -0
- package/dist/frontend/npm-static-cjs-exports-alias.d.ts +2 -0
- package/dist/frontend/npm-static-cjs-exports-alias.js +186 -0
- package/dist/frontend/npm-static-cjs-exports-alias.js.map +1 -0
- package/dist/frontend/npm-static-cjs-exports-alias.test.d.ts +1 -0
- package/dist/frontend/npm-static-cjs-exports-alias.test.js +73 -0
- package/dist/frontend/npm-static-cjs-exports-alias.test.js.map +1 -0
- package/dist/frontend/npm-static-cjs-exports-var.d.ts +2 -0
- package/dist/frontend/npm-static-cjs-exports-var.js +236 -0
- package/dist/frontend/npm-static-cjs-exports-var.js.map +1 -0
- package/dist/frontend/npm-static-declaration-syntax.js +102 -101
- package/dist/frontend/npm-static-declaration-syntax.js.map +1 -1
- package/dist/frontend/npm-static-prune.js +36 -24
- package/dist/frontend/npm-static-prune.js.map +1 -1
- package/dist/frontend/npm-static-rewrite-host.d.ts +4 -1
- package/dist/frontend/npm-static-rewrite-host.js +14 -3
- package/dist/frontend/npm-static-rewrite-host.js.map +1 -1
- package/dist/frontend/npm-static-rewrite-syntax.d.ts +19 -0
- package/dist/frontend/npm-static-rewrite-syntax.js +274 -101
- package/dist/frontend/npm-static-rewrite-syntax.js.map +1 -1
- package/dist/frontend/npm-static-subtyping.js +7 -9
- package/dist/frontend/npm-static-subtyping.js.map +1 -1
- package/dist/frontend/npm-static.d.ts +17 -1
- package/dist/frontend/npm-static.js +167 -16
- package/dist/frontend/npm-static.js.map +1 -1
- package/dist/frontend/npm-static.test.js +22 -1
- package/dist/frontend/npm-static.test.js.map +1 -1
- package/dist/frontend/pipeline.js +164 -26
- package/dist/frontend/pipeline.js.map +1 -1
- package/dist/frontend/pipeline.test.js +22 -1
- package/dist/frontend/pipeline.test.js.map +1 -1
- package/dist/frontend/program-analysis.d.ts +6 -1
- package/dist/frontend/program-analysis.js +7 -0
- package/dist/frontend/program-analysis.js.map +1 -1
- package/dist/frontend/program.d.ts +92 -2
- package/dist/frontend/program.js +1557 -255
- package/dist/frontend/program.js.map +1 -1
- package/dist/frontend/program.test.js +76 -6
- package/dist/frontend/program.test.js.map +1 -1
- package/dist/frontend/resolve.js +36 -2
- package/dist/frontend/resolve.js.map +1 -1
- package/dist/frontend/resolve.test.js +49 -0
- package/dist/frontend/resolve.test.js.map +1 -1
- package/dist/frontend/services.d.ts +20 -1
- package/dist/frontend/services.js +40 -3
- package/dist/frontend/services.js.map +1 -1
- package/dist/frontend/services.test.js +2 -1
- package/dist/frontend/services.test.js.map +1 -1
- package/dist/frontend/threads-import.js +1 -1
- package/dist/frontend/threads-import.js.map +1 -1
- package/dist/frontend/tier-analysis.d.ts +71 -0
- package/dist/frontend/tier-analysis.js +522 -0
- package/dist/frontend/tier-analysis.js.map +1 -0
- package/dist/frontend/ts7/api-conformance.d.ts +234 -0
- package/dist/frontend/ts7/api-conformance.js +7 -0
- package/dist/frontend/ts7/api-conformance.js.map +1 -0
- package/dist/frontend/ts7/ast-guards.generated.js +2 -1
- package/dist/frontend/ts7/ast-guards.generated.js.map +1 -1
- package/dist/frontend/ts7/ast-node.d.ts +47 -25
- package/dist/frontend/ts7/ast-node.js +64 -18
- package/dist/frontend/ts7/ast-node.js.map +1 -1
- package/dist/frontend/ts7/ast-node.test.js +36 -12
- package/dist/frontend/ts7/ast-node.test.js.map +1 -1
- package/dist/frontend/ts7/ast-types.d.ts +10 -3
- package/dist/frontend/ts7/ast-types.generated.d.ts +39 -39
- package/dist/frontend/ts7/ast.d.ts +1 -0
- package/dist/frontend/ts7/ast.js +3 -2
- package/dist/frontend/ts7/ast.js.map +1 -1
- package/dist/frontend/ts7/checker-backend.d.ts +23 -0
- package/dist/frontend/ts7/checker-backend.js +88 -0
- package/dist/frontend/ts7/checker-backend.js.map +1 -0
- package/dist/frontend/ts7/checker-backend.test.d.ts +1 -0
- package/dist/frontend/ts7/checker-backend.test.js +63 -0
- package/dist/frontend/ts7/checker-backend.test.js.map +1 -0
- package/dist/frontend/ts7/checker-cache.d.ts +0 -3
- package/dist/frontend/ts7/checker-cache.js +0 -6
- package/dist/frontend/ts7/checker-cache.js.map +1 -1
- package/dist/frontend/ts7/checker.d.ts +18 -11
- package/dist/frontend/ts7/checker.js +42 -55
- package/dist/frontend/ts7/checker.js.map +1 -1
- package/dist/frontend/ts7/checker.test.js +10 -7
- package/dist/frontend/ts7/checker.test.js.map +1 -1
- package/dist/frontend/ts7/diagnostic.d.ts +19 -0
- package/dist/frontend/ts7/diagnostic.js +22 -0
- package/dist/frontend/ts7/diagnostic.js.map +1 -0
- package/dist/frontend/ts7/node-functions.d.ts +8 -0
- package/dist/frontend/ts7/node-functions.js +18 -0
- package/dist/frontend/ts7/node-functions.js.map +1 -0
- package/dist/frontend/ts7/program-host.d.ts +5 -1
- package/dist/frontend/ts7/program-host.js +12 -0
- package/dist/frontend/ts7/program-host.js.map +1 -1
- package/dist/frontend/ts7/rpc-api.d.ts +5 -1
- package/dist/frontend/ts7/rpc-api.js +8 -1
- package/dist/frontend/ts7/rpc-api.js.map +1 -1
- package/dist/frontend/ts7/semantic-checker.d.ts +13 -6
- package/dist/frontend/ts7/semantic-checker.js +26 -8
- package/dist/frontend/ts7/semantic-checker.js.map +1 -1
- package/dist/frontend/ts7/semantic-checker.test.js +12 -9
- package/dist/frontend/ts7/semantic-checker.test.js.map +1 -1
- package/dist/frontend/ts7/semantic-model.d.ts +54 -24
- package/dist/frontend/ts7/semantic-model.js +88 -16
- package/dist/frontend/ts7/semantic-model.js.map +1 -1
- package/dist/frontend/ts7/semantic-model.test.js +4 -4
- package/dist/frontend/ts7/semantic-model.test.js.map +1 -1
- package/dist/frontend/ts7/semantic-types.d.ts +7 -3
- 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 +11 -11
- package/dist/frontend/ts7/session.js +8 -5
- package/dist/frontend/ts7/session.js.map +1 -1
- package/dist/frontend/ts7/session.test.js +9 -5
- package/dist/frontend/ts7/session.test.js.map +1 -1
- package/dist/frontend/ts7/source-parser.d.ts +6 -2
- package/dist/frontend/ts7/source-parser.js +24 -3
- package/dist/frontend/ts7/source-parser.js.map +1 -1
- package/dist/frontend/ts7/source-parser.test.js +38 -17
- package/dist/frontend/ts7/source-parser.test.js.map +1 -1
- package/dist/frontend/type-mapper.d.ts +122 -2
- package/dist/frontend/type-mapper.js +2545 -719
- package/dist/frontend/type-mapper.js.map +1 -1
- package/dist/frontend/type-only-imports.d.ts +28 -0
- package/dist/frontend/type-only-imports.js +122 -0
- package/dist/frontend/type-only-imports.js.map +1 -0
- package/dist/frontend/worker-target.js +8 -8
- package/dist/frontend/worker-target.js.map +1 -1
- package/dist/index.d.ts +3 -1
- package/dist/index.js +29 -2
- package/dist/index.js.map +1 -1
- package/dist/ir/analysis.js +4 -2
- package/dist/ir/analysis.js.map +1 -1
- package/dist/ir/api.d.ts +1 -1
- package/dist/ir/api.js +1 -1
- package/dist/ir/api.js.map +1 -1
- package/dist/ir/array-length-stability.d.ts +30 -0
- package/dist/ir/array-length-stability.js +236 -0
- package/dist/ir/array-length-stability.js.map +1 -0
- package/dist/ir/array-length-stability.test.d.ts +1 -0
- package/dist/ir/array-length-stability.test.js +113 -0
- package/dist/ir/array-length-stability.test.js.map +1 -0
- package/dist/ir/build.d.ts +2 -2
- package/dist/ir/build.js +1 -1
- package/dist/ir/build.js.map +1 -1
- package/dist/ir/builtin-effects.js +103 -0
- package/dist/ir/builtin-effects.js.map +1 -1
- package/dist/ir/builtin-signatures.d.ts +1 -1
- package/dist/ir/builtin-signatures.js +494 -25
- package/dist/ir/builtin-signatures.js.map +1 -1
- package/dist/ir/byte-numbers.js +3 -0
- package/dist/ir/byte-numbers.js.map +1 -1
- package/dist/ir/callback-specialization.d.ts +37 -0
- package/dist/ir/callback-specialization.js +459 -0
- package/dist/ir/callback-specialization.js.map +1 -0
- package/dist/ir/callback-specialization.test.d.ts +1 -0
- package/dist/ir/callback-specialization.test.js +208 -0
- package/dist/ir/callback-specialization.test.js.map +1 -0
- package/dist/ir/capture-values.d.ts +0 -1
- package/dist/ir/capture-values.js +51 -40
- package/dist/ir/capture-values.js.map +1 -1
- package/dist/ir/constant-globals.test.js +1 -1
- package/dist/ir/constant-tables.test.js +1 -1
- package/dist/ir/field-values.test.js +1 -1
- package/dist/ir/final-fields.test.js +1 -1
- package/dist/ir/function-references.test.js +9 -1
- package/dist/ir/function-references.test.js.map +1 -1
- package/dist/ir/init-only-globals.test.js +1 -1
- package/dist/ir/initializer-bindings.test.js +1 -1
- package/dist/ir/int32-slots.d.ts +14 -0
- package/dist/ir/int32-slots.js +97 -14
- package/dist/ir/int32-slots.js.map +1 -1
- package/dist/ir/int32-slots.test.js +1 -1
- package/dist/ir/integer-loop-facts.d.ts +2 -0
- package/dist/ir/integer-loop-facts.js +24 -3
- package/dist/ir/integer-loop-facts.js.map +1 -1
- package/dist/ir/integer-loops.d.ts +1 -1
- package/dist/ir/integer-loops.js +39 -9
- package/dist/ir/integer-loops.js.map +1 -1
- package/dist/ir/integer-loops.test.js +104 -0
- package/dist/ir/integer-loops.test.js.map +1 -1
- package/dist/ir/integer-ranges.d.ts +3 -0
- package/dist/ir/integer-ranges.js +3 -1
- package/dist/ir/integer-ranges.js.map +1 -1
- package/dist/ir/integer-ranges.test.js +82 -1
- package/dist/ir/integer-ranges.test.js.map +1 -1
- package/dist/ir/intrinsic-signatures.js +6 -0
- package/dist/ir/intrinsic-signatures.js.map +1 -1
- package/dist/ir/ir.d.ts +221 -58
- package/dist/ir/ir.js +119 -12
- package/dist/ir/ir.js.map +1 -1
- package/dist/ir/ir.test.js +10 -0
- package/dist/ir/ir.test.js.map +1 -1
- package/dist/ir/jsval.d.ts +8 -0
- package/dist/ir/jsval.js +365 -0
- package/dist/ir/jsval.js.map +1 -0
- package/dist/ir/jsval.test.d.ts +1 -0
- package/dist/ir/jsval.test.js +239 -0
- package/dist/ir/jsval.test.js.map +1 -0
- package/dist/ir/runtime-features.d.ts +148 -33
- package/dist/ir/runtime-features.js +629 -386
- package/dist/ir/runtime-features.js.map +1 -1
- package/dist/ir/scalar-records.test.js +1 -1
- package/dist/ir/self-captures.d.ts +33 -0
- package/dist/ir/self-captures.js +245 -0
- package/dist/ir/self-captures.js.map +1 -0
- package/dist/ir/self-captures.test.d.ts +1 -0
- package/dist/ir/self-captures.test.js +135 -0
- package/dist/ir/self-captures.test.js.map +1 -0
- package/dist/ir/serialize.d.ts +1 -1
- package/dist/ir/serialize.js +7 -4
- package/dist/ir/serialize.js.map +1 -1
- package/dist/ir/tiers.d.ts +26 -0
- package/dist/ir/tiers.js +101 -0
- package/dist/ir/tiers.js.map +1 -0
- package/dist/ir/tiers.test.d.ts +1 -0
- package/dist/ir/tiers.test.js +140 -0
- package/dist/ir/tiers.test.js.map +1 -0
- package/dist/ir/traverse.js +103 -94
- package/dist/ir/traverse.js.map +1 -1
- package/dist/ir/traverse.test.js +33 -30
- package/dist/ir/traverse.test.js.map +1 -1
- package/dist/ir/unshare.js +65 -3
- package/dist/ir/unshare.js.map +1 -1
- package/dist/ir/unshare.test.js +1 -1
- package/dist/ir/validate.js +175 -68
- package/dist/ir/validate.js.map +1 -1
- package/dist/ir/validate.test.js +26 -9
- package/dist/ir/validate.test.js.map +1 -1
- package/dist/library/fence-eval.test.js +1 -1
- package/dist/library/int-infer.test.js +4 -4
- package/dist/library/ir-policy.js +13 -0
- package/dist/library/ir-policy.js.map +1 -1
- package/dist/library/library-cache.d.ts +1 -0
- package/dist/library/library-cache.js.map +1 -1
- package/dist/library/library-cache.test.js +5 -5
- package/dist/library/library-profile.d.ts +4 -4
- package/dist/library/library-profile.js +35 -7
- package/dist/library/library-profile.js.map +1 -1
- package/dist/library/prepare.js +13 -1
- package/dist/library/prepare.js.map +1 -1
- package/dist/native/cli.js +5 -0
- package/dist/native/cli.js.map +1 -1
- package/dist/native/compiler.js +2 -2
- package/dist/native/compiler.js.map +1 -1
- package/dist/native/compiler.test.js +2 -2
- package/dist/native/prepare.js +7 -0
- package/dist/native/prepare.js.map +1 -1
- package/dist/native/sanitizer.test.js +12 -0
- package/dist/native/sanitizer.test.js.map +1 -1
- package/dist/native/toolchain.d.ts +2 -0
- package/dist/native/toolchain.js +10 -1
- package/dist/native/toolchain.js.map +1 -1
- package/dist/native/toolchain.test.js +39 -1
- package/dist/native/toolchain.test.js.map +1 -1
- package/dist/startup-cache.d.ts +1 -0
- package/dist/startup-cache.js +1 -0
- package/dist/startup-cache.js.map +1 -1
- package/dist/wasm/base64.d.ts +5 -0
- package/dist/wasm/base64.js +62 -0
- package/dist/wasm/base64.js.map +1 -0
- package/dist/wasm/binary.d.ts +36 -0
- package/dist/wasm/binary.js +1976 -0
- package/dist/wasm/binary.js.map +1 -0
- package/dist/wasm/binary.test.d.ts +1 -0
- package/dist/wasm/binary.test.js +190 -0
- package/dist/wasm/binary.test.js.map +1 -0
- package/dist/wasm/discover.d.ts +38 -0
- package/dist/wasm/discover.js +377 -0
- package/dist/wasm/discover.js.map +1 -0
- package/dist/wasm/discover.test.d.ts +1 -0
- package/dist/wasm/discover.test.js +24 -0
- package/dist/wasm/discover.test.js.map +1 -0
- package/dist/wasm/module.d.ts +151 -0
- package/dist/wasm/module.js +575 -0
- package/dist/wasm/module.js.map +1 -0
- package/dist/wasm/translate.d.ts +48 -0
- package/dist/wasm/translate.js +2129 -0
- package/dist/wasm/translate.js.map +1 -0
- package/dist/wasm/translate.test.d.ts +1 -0
- package/dist/wasm/translate.test.js +207 -0
- package/dist/wasm/translate.test.js.map +1 -0
- package/package.json +21 -20
- package/surface-manifest.json +303 -19
|
@@ -0,0 +1,1322 @@
|
|
|
1
|
+
/* Type narrowing of lowered values, conditional and as-expressions, and runtime-optional receiver reads. */
|
|
2
|
+
import * as ts from "../../ts7/adapter.js";
|
|
3
|
+
import { dynFallbackType } from "../lowerer.js";
|
|
4
|
+
import { BOOL, CAUGHT, DYN, DYN_HANDLE_KINDS, NULL_T, UNDEFINED_T, arrayOf, canAdaptDynFuncTo, canDynCheckTo, isDynTypedRefType, isUnitType, shapeHasAccessorSlots, typeEquals, } from "../../../ir/ir.js";
|
|
5
|
+
import { isJsSourceFile, locOf } from "../../program.js";
|
|
6
|
+
import { hasRuntimeStatics } from "../class-runtime-statics.js";
|
|
7
|
+
import { jsBindingHasOpenWrites } from "../lower-stmts.js";
|
|
8
|
+
import { narrowClassUnion, narrowStoredClassValue, structuralNarrowing } from "../class-unions.js";
|
|
9
|
+
import { checkedClassAssertion, checkedClassUnionAssertion } from "../class-assertions.js";
|
|
10
|
+
import { isOptionalProcessStreamProperty } from "../builtins/process.js";
|
|
11
|
+
import { requestGeneralStreamSurface } from "../general-streams.js";
|
|
12
|
+
import { literalValues } from "../../literal-values.js";
|
|
13
|
+
import { literalUnionArm } from "../../union-discriminants.js";
|
|
14
|
+
import { checkedArmExtraction } from "../coercions/unions.js";
|
|
15
|
+
import { hostedStorageView, hostsAll } from "./hosted-narrowing.js";
|
|
16
|
+
import { nodeThrowExpr, varRef } from "../../../ir/build.js";
|
|
17
|
+
import { InternalCompilerError } from "../../../errors.js";
|
|
18
|
+
import { hasClassPayload, runtimeOptionalAssertionErases, runtimeOptionalLocalOf, runtimeOptionalUseOf, } from "../lower-exprs.js";
|
|
19
|
+
import { isConstAssertionTypeNode, unitOnlyUnion } from "../../type-mapper.js";
|
|
20
|
+
import { assertsGlobalObject, extractionCopiesReference } from "../assertion-identity.js";
|
|
21
|
+
/** `c ? a : b`. An explicit destination constructs each branch at that
|
|
22
|
+
* layout before joining it. Without one, retain the expression's inferred
|
|
23
|
+
* type and the contextual/sibling rules below. */
|
|
24
|
+
export function lowerTernary(lowerer, expr, expected) {
|
|
25
|
+
const loc = locOf(expr);
|
|
26
|
+
// `Array.isArray(x) ? x : [x]` over a `T | readonly T[]` union: tsc
|
|
27
|
+
// narrows the TRUE branch to `any[]` (maybeNarrow's isArray bridge
|
|
28
|
+
// rides that) but leaves the FALSE branch wide — a readonly array
|
|
29
|
+
// is not assignable to `any[]`, so the arm never subtracts. The
|
|
30
|
+
// RUNTIME tag test proves the remaining arm exactly, so the false
|
|
31
|
+
// arm's reads of x narrow to the union's one non-array checker
|
|
32
|
+
// constituent (the certs configuredTlds shape). Nested functions
|
|
33
|
+
// stay out (they run later, when the proof is stale — tsc's own
|
|
34
|
+
// invalidation rule).
|
|
35
|
+
const falseArmNarrows = [];
|
|
36
|
+
let falseArmNarrowType = null;
|
|
37
|
+
{
|
|
38
|
+
let c = expr.condition;
|
|
39
|
+
while (ts.isParenthesizedExpression(c))
|
|
40
|
+
c = c.expression;
|
|
41
|
+
if (ts.isCallExpression(c) &&
|
|
42
|
+
ts.isPropertyAccessExpression(c.expression) &&
|
|
43
|
+
c.arguments.nodes.length === 1 &&
|
|
44
|
+
ts.isIdentifier(c.arguments.nodes[0]) &&
|
|
45
|
+
lowerer.stdlibGlobalMember(c.expression, "Array") === "isArray") {
|
|
46
|
+
const argIdent = c.arguments.nodes[0];
|
|
47
|
+
const sym = lowerer.resolveValueSymbol(argIdent);
|
|
48
|
+
const t = lowerer.checker.getTypeAtLocation(argIdent);
|
|
49
|
+
const constituents = t.isUnionType() ? ts.constituentTypes(t) : [];
|
|
50
|
+
const nonArray = constituents.filter((a) => !lowerer.checker.isArrayType(a) && !lowerer.checker.isTupleType(a));
|
|
51
|
+
const mapped = lowerer.mapTypeOf(t);
|
|
52
|
+
const armCount = mapped?.kind === "union" ? lowerer.arrayValueTags(mapped.unionId).length : 0;
|
|
53
|
+
if (sym && nonArray.length === 1 && armCount === 1) {
|
|
54
|
+
falseArmNarrowType = nonArray[0];
|
|
55
|
+
const collect = (n) => {
|
|
56
|
+
if (ts.isFunctionLike(n))
|
|
57
|
+
return;
|
|
58
|
+
if (ts.isIdentifier(n) &&
|
|
59
|
+
lowerer.resolveValueSymbol(n) === sym &&
|
|
60
|
+
!lowerer.chainNarrowedType.has(n)) {
|
|
61
|
+
falseArmNarrows.push(n);
|
|
62
|
+
}
|
|
63
|
+
ts.forEachChild(n, collect);
|
|
64
|
+
};
|
|
65
|
+
collect(expr.whenFalse);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
for (const n of falseArmNarrows)
|
|
70
|
+
lowerer.chainNarrowedType.set(n, falseArmNarrowType);
|
|
71
|
+
try {
|
|
72
|
+
const cond = lowerer.lowerCondition(expr.condition);
|
|
73
|
+
// A condition the LOWERING proved constant (typeof-dyn against a
|
|
74
|
+
// kind no dyn box can hold — the bigint/symbol/function fold): only
|
|
75
|
+
// the taken arm exists at runtime, so only it lowers — which is
|
|
76
|
+
// exactly what lets a dual-mode arm with no static lowering (bigint
|
|
77
|
+
// literals) sit untaken in compiled JS. A boolLit carries no
|
|
78
|
+
// effects, so dropping the condition read loses nothing.
|
|
79
|
+
if (cond.kind === "boolLit") {
|
|
80
|
+
return lowerer.lowerExprExpecting(cond.value ? expr.whenTrue : expr.whenFalse, expected);
|
|
81
|
+
}
|
|
82
|
+
if (expected) {
|
|
83
|
+
// Construct fresh literals in their actual destination. Joining
|
|
84
|
+
// inferred layouts first can erase the literal discriminator or
|
|
85
|
+
// choose an empty array's uninhabited element representation.
|
|
86
|
+
// Runtime-optional proofs apply only within the selected true arm.
|
|
87
|
+
const then = withRuntimeOptionalNarrowed(lowerer, runtimeOptionalTrueIds(lowerer, expr.condition), () => lowerer.lowerExprExpecting(expr.whenTrue, expected));
|
|
88
|
+
const else_ = lowerer.lowerExprExpecting(expr.whenFalse, expected);
|
|
89
|
+
return { kind: "ternary", cond, then, else_, type: expected, loc };
|
|
90
|
+
}
|
|
91
|
+
const ctxTs = lowerer.checker.getContextualType(expr);
|
|
92
|
+
const ctxMapped = ctxTs ? lowerer.mapTypeOf(ctxTs) : null;
|
|
93
|
+
// Array-literal arms build directly as the slot's array type when
|
|
94
|
+
// the ternary sits under an ARRAY context (tsc accepts each arm
|
|
95
|
+
// covariantly — `[stdin]` types string[] against an
|
|
96
|
+
// (Uint8Array | string)[] slot — but a tagged element representation
|
|
97
|
+
// must be BUILT as the slot's element type, the same rule element
|
|
98
|
+
// expressions follow inside every array literal). And an EMPTY
|
|
99
|
+
// array-literal arm with no usable type of its own (tsc infers
|
|
100
|
+
// `never[]`; no mappable contextual type reaches into the arm — the
|
|
101
|
+
// conditional-spread idiom `[...(c ? [x] : [])]`) adopts the SIBLING
|
|
102
|
+
// arm's array type: the ternary twin of the union-slot rule in
|
|
103
|
+
// lowerArrayLiteral, and just as unambiguous — tsc already typed the
|
|
104
|
+
// whole ternary by the filled arm alone. Both arms empty stays
|
|
105
|
+
// fenced (no element type exists anywhere).
|
|
106
|
+
const ctxArray = ctxMapped?.kind === "array" ? ctxMapped : null;
|
|
107
|
+
const armLiteral = (e) => {
|
|
108
|
+
let x = e;
|
|
109
|
+
while (ts.isParenthesizedExpression(x))
|
|
110
|
+
x = x.expression;
|
|
111
|
+
return ts.isArrayLiteralExpression(x) ? x : null;
|
|
112
|
+
};
|
|
113
|
+
const emptyUntypedArrayArm = (e) => {
|
|
114
|
+
const lit = armLiteral(e);
|
|
115
|
+
if (!lit || lit.elements.nodes.length !== 0)
|
|
116
|
+
return false;
|
|
117
|
+
const t = lowerer.checker.getContextualType(lit) ?? lowerer.typeOf(lit);
|
|
118
|
+
if (!lowerer.mapTypeOf(t))
|
|
119
|
+
return true;
|
|
120
|
+
// never[] MAPS (the f64 representation for the uninhabited) but
|
|
121
|
+
// carries no element information — an empty literal typed that way
|
|
122
|
+
// still adopts the sibling arm's array type, tsc's own reading.
|
|
123
|
+
if (lowerer.checker.isArrayType(t)) {
|
|
124
|
+
const elem = lowerer.checker.getTypeArguments(t)[0];
|
|
125
|
+
if (elem !== undefined && elem.flags & ts.TypeFlags.Never)
|
|
126
|
+
return true;
|
|
127
|
+
}
|
|
128
|
+
return false;
|
|
129
|
+
};
|
|
130
|
+
// Inferred signature tables often join a populated argument array
|
|
131
|
+
// with nested empty-array branches. Carry the whole record layout
|
|
132
|
+
// through those branches before constructing their fresh fields.
|
|
133
|
+
const ownJoin = lowerer.mapTypeOf(lowerer.typeOf(expr));
|
|
134
|
+
const recordJoin = ctxMapped?.kind === "record" ? ctxMapped : ownJoin?.kind === "record" ? ownJoin : undefined;
|
|
135
|
+
const lowerArm = (e, siblingType) => {
|
|
136
|
+
let fresh = e;
|
|
137
|
+
while (ts.isParenthesizedExpression(fresh))
|
|
138
|
+
fresh = fresh.expression;
|
|
139
|
+
if (recordJoin && ts.isConditionalExpression(fresh))
|
|
140
|
+
return lowerTernary(lowerer, fresh, recordJoin);
|
|
141
|
+
if (recordJoin && ts.isObjectLiteralExpression(fresh)) {
|
|
142
|
+
return lowerer.lowerObjectLiteral(fresh, recordJoin);
|
|
143
|
+
}
|
|
144
|
+
const lit = armLiteral(e);
|
|
145
|
+
if (lit && ctxArray)
|
|
146
|
+
return lowerer.lowerArrayLiteral(lit, ctxArray);
|
|
147
|
+
if (lit && siblingType?.kind === "array") {
|
|
148
|
+
if (emptyUntypedArrayArm(e)) {
|
|
149
|
+
return { kind: "arrayLit", elems: [], type: siblingType, loc: locOf(lit) };
|
|
150
|
+
}
|
|
151
|
+
// A FILLED literal arm whose own element type is a UNION
|
|
152
|
+
// carrying the sibling's element as an arm (`Array.isArray(x) ?
|
|
153
|
+
// x : [x]` — the false arm's x checker-types as the whole union
|
|
154
|
+
// even though the runtime tag proved the non-array arm): build
|
|
155
|
+
// as the sibling's array type — each element coerces into the
|
|
156
|
+
// sibling element or fences on its own.
|
|
157
|
+
const ownT = lowerer.mapTypeOf(lowerer.typeOf(lit));
|
|
158
|
+
if (ownT?.kind === "array" &&
|
|
159
|
+
ownT.elem.kind === "union" &&
|
|
160
|
+
siblingType.elem.kind !== "union" &&
|
|
161
|
+
lowerer.armTag(ownT.elem.unionId, siblingType.elem) >= 0) {
|
|
162
|
+
return lowerer.lowerArrayLiteral(lit, siblingType);
|
|
163
|
+
}
|
|
164
|
+
// A FILLED literal arm whose own array type has NO lift into the
|
|
165
|
+
// sibling's (`isWindows ? ['cmd.exe', ['/d']] : ['pwd', []]` —
|
|
166
|
+
// the empty nested literal types never[], whose f64-element
|
|
167
|
+
// representation re-tags into nothing): the generic path could
|
|
168
|
+
// only fence the whole ternary, so build AS the sibling type —
|
|
169
|
+
// each element coerces into the sibling's element slot or fences
|
|
170
|
+
// on its own, and a nested empty literal adopts the slot's array
|
|
171
|
+
// arm (the union-slot rule). tsc already accepted the arm
|
|
172
|
+
// covariantly against the join, so a fitting literal is exactly
|
|
173
|
+
// the value the checker typed.
|
|
174
|
+
if (ownT?.kind === "array" &&
|
|
175
|
+
!typeEquals(ownT, siblingType) &&
|
|
176
|
+
lowerer.widthLiftPlan(ownT, siblingType) === null) {
|
|
177
|
+
return lowerer.lowerArrayLiteral(lit, siblingType);
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
return lowerer.lowerExpr(e);
|
|
181
|
+
};
|
|
182
|
+
// Lower the filled arm first so an empty arm can adopt its type.
|
|
183
|
+
// When the checker's OWN join for the ternary maps to an ARRAY,
|
|
184
|
+
// literal arms build against it directly (tsc collapses the arms'
|
|
185
|
+
// covariant array types into one — `c ? ['sh', []] : ['cmd', ['/d']]`
|
|
186
|
+
// joins as (string | string[])[] whichever arm nests the empty
|
|
187
|
+
// literal), so neither arm's uninhabited never[] reading decides.
|
|
188
|
+
const ownArrayJoin = (() => {
|
|
189
|
+
const m = lowerer.mapTypeOf(lowerer.typeOf(expr));
|
|
190
|
+
return m?.kind === "array" ? m : null;
|
|
191
|
+
})();
|
|
192
|
+
let thenRaw;
|
|
193
|
+
let elseRaw;
|
|
194
|
+
const runtimeTrueIds = runtimeOptionalTrueIds(lowerer, expr.condition);
|
|
195
|
+
const lowerTrueArm = () => withRuntimeOptionalNarrowed(lowerer, runtimeTrueIds, () => lowerArm(expr.whenTrue, ownArrayJoin ?? undefined));
|
|
196
|
+
if (!ctxArray && emptyUntypedArrayArm(expr.whenTrue) && !emptyUntypedArrayArm(expr.whenFalse)) {
|
|
197
|
+
elseRaw = lowerer.lowerExpr(expr.whenFalse);
|
|
198
|
+
thenRaw = withRuntimeOptionalNarrowed(lowerer, runtimeTrueIds, () => lowerArm(expr.whenTrue, elseRaw.type.kind === "dyn" && ownArrayJoin ? ownArrayJoin : elseRaw.type));
|
|
199
|
+
}
|
|
200
|
+
else {
|
|
201
|
+
thenRaw = lowerTrueArm();
|
|
202
|
+
// A checked-dynamic producer (Object.entries(...).filter(...))
|
|
203
|
+
// can still have a precise checker array type. Empty literal arms
|
|
204
|
+
// must adopt that element layout before the checked array boundary.
|
|
205
|
+
elseRaw = lowerArm(expr.whenFalse, thenRaw.type.kind === "dyn" && ownArrayJoin ? ownArrayJoin : thenRaw.type);
|
|
206
|
+
}
|
|
207
|
+
// The ternary's IR type is normally the checker's own: it collapses
|
|
208
|
+
// same-kind literal unions ("a" | "b" → string) and forms tagged
|
|
209
|
+
// unions for mixed arms that map (`c ? okRec : errRec`); anything
|
|
210
|
+
// left unmappable gets the type fence (badType) here. A record/union CONTEXTUAL type
|
|
211
|
+
// takes over exactly when the own type can't carry the value —
|
|
212
|
+
// unmappable, or a DIFFERENT union (branch literals omitting
|
|
213
|
+
// DIFFERENT optional subsets make the own type a union of the
|
|
214
|
+
// narrower fresh shapes, and a union-typed slot can sub-union the
|
|
215
|
+
// same way; neither has a runtime re-tag, while tsc guarantees each
|
|
216
|
+
// branch is assignable to the context). A base-CLASS context absorbs
|
|
217
|
+
// the same case: branches producing different subclasses make the
|
|
218
|
+
// own type a class union (`c ? new Dog() : new Bird()` against an
|
|
219
|
+
// Animal slot), while each branch upcasts into the context fine. A
|
|
220
|
+
// collapsed own type must WIN over a wider contextual union
|
|
221
|
+
// (`console.log(c ? "yes" : "no")` stays string against the ambient
|
|
222
|
+
// string | number | boolean parameter), and an 'unknown'/'any'
|
|
223
|
+
// context never absorbs the ternary (`JSON.stringify(c ? 1 : 2)`
|
|
224
|
+
// stays f64-typed). Arms that AGREE on an array type decide it
|
|
225
|
+
// themselves (a context- or sibling-built literal arm can carry a
|
|
226
|
+
// tagged element type the checker's own type doesn't spell).
|
|
227
|
+
const own = lowerer.mapTypeOf(lowerer.typeOf(expr));
|
|
228
|
+
const useCtx = (ctxMapped?.kind === "record" ||
|
|
229
|
+
ctxMapped?.kind === "union" ||
|
|
230
|
+
ctxMapped?.kind === "object") &&
|
|
231
|
+
(own === null ||
|
|
232
|
+
(own.kind === "union" &&
|
|
233
|
+
!typeEquals(own, ctxMapped) &&
|
|
234
|
+
!lowerer.inLogicalLeftPosition(expr)));
|
|
235
|
+
// Mixed dyn/unit arms under an unmappable own type (`typeof pkg.name
|
|
236
|
+
// === "string" ? pkg.name : null` — the lowering world types the
|
|
237
|
+
// unknown-receiver read `any`, which a static build cannot hold):
|
|
238
|
+
// dyn represents null and undefined directly, so the ternary stays
|
|
239
|
+
// dyn — a unit arm converts to the dyn unit value (the dynFrom form
|
|
240
|
+
// the index-signature lowerings already use). A FRESH literal arm
|
|
241
|
+
// (`... ? pkg.scripts : {}` — the default-object idiom) converts the
|
|
242
|
+
// same way when it is JSON-safe: nothing else aliases a literal, so
|
|
243
|
+
// the dyn copy is unobservable.
|
|
244
|
+
const dynish = (e) => e.type.kind === "dyn" ||
|
|
245
|
+
e.kind === "unitLit" ||
|
|
246
|
+
((e.kind === "recordLit" || e.kind === "arrayLit") && lowerer.dynConvertible(e.type));
|
|
247
|
+
const dynJoin = own === null &&
|
|
248
|
+
!(useCtx && ctxMapped) &&
|
|
249
|
+
dynish(thenRaw) &&
|
|
250
|
+
dynish(elseRaw) &&
|
|
251
|
+
(thenRaw.type.kind === "dyn" || elseRaw.type.kind === "dyn");
|
|
252
|
+
// A checker-`any` ternary whose lowered arms are STATIC (`rawName ?
|
|
253
|
+
// rawName.replace(...) : null` — the dyn-receiver string machinery
|
|
254
|
+
// answers a static string): the checker's `any` carries no shape,
|
|
255
|
+
// but the arms do — equal arms take their shared type, a unit arm
|
|
256
|
+
// joins the other arm as its null/undefined-armed union. Gated on
|
|
257
|
+
// genuine `any` so every other unmappable keeps its own diagnostic.
|
|
258
|
+
let anyJoin = null;
|
|
259
|
+
if (own === null &&
|
|
260
|
+
!dynJoin &&
|
|
261
|
+
!(useCtx && ctxMapped) &&
|
|
262
|
+
(lowerer.typeOf(expr).flags & ts.TypeFlags.Any) !== 0) {
|
|
263
|
+
const a = thenRaw.type;
|
|
264
|
+
const b = elseRaw.type;
|
|
265
|
+
const staticArm = (t) => t.kind !== "dyn" && t.kind !== "caught" && t.kind !== "void";
|
|
266
|
+
if (staticArm(a) && staticArm(b)) {
|
|
267
|
+
if (typeEquals(a, b)) {
|
|
268
|
+
anyJoin = a;
|
|
269
|
+
}
|
|
270
|
+
else if (isUnitType(a) !== isUnitType(b)) {
|
|
271
|
+
const unit = isUnitType(a) ? a : b;
|
|
272
|
+
const val = isUnitType(a) ? b : a;
|
|
273
|
+
const arms = val.kind === "union" ? (lowerer.unions.get(val.unionId)?.arms ?? null) : [val];
|
|
274
|
+
if (arms && !arms.some((x) => typeEquals(x, unit))) {
|
|
275
|
+
anyJoin = { kind: "union", unionId: lowerer.unions.intern([...arms, unit]) };
|
|
276
|
+
}
|
|
277
|
+
else if (arms) {
|
|
278
|
+
anyJoin = val; // the unit is already an arm
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
}
|
|
282
|
+
}
|
|
283
|
+
// JavaScript function selection preserves the chosen closure's full
|
|
284
|
+
// call ABI. A checker join can erase a rest/arguments pack even though
|
|
285
|
+
// a later call supplies additional observable arguments.
|
|
286
|
+
const callableJoin = isJsSourceFile(ts.getSourceFileOfNode(expr)) &&
|
|
287
|
+
thenRaw.type.kind === "func" &&
|
|
288
|
+
elseRaw.type.kind === "func" &&
|
|
289
|
+
!typeEquals(thenRaw.type, elseRaw.type) &&
|
|
290
|
+
lowerer.dynConvertible(thenRaw.type) &&
|
|
291
|
+
lowerer.dynConvertible(elseRaw.type);
|
|
292
|
+
// JavaScript inference can discard an initially-undefined field from
|
|
293
|
+
// a conditional's type even after that field acquired other values.
|
|
294
|
+
// A checked arm must retain its actual representation at the join.
|
|
295
|
+
const checkedJsJoin = isJsSourceFile(ts.getSourceFileOfNode(expr)) &&
|
|
296
|
+
(thenRaw.type.kind === "dyn" || elseRaw.type.kind === "dyn") &&
|
|
297
|
+
lowerer.dynConvertible(thenRaw.type) &&
|
|
298
|
+
lowerer.dynConvertible(elseRaw.type);
|
|
299
|
+
const type = callableJoin || checkedJsJoin
|
|
300
|
+
? DYN
|
|
301
|
+
: thenRaw.type.kind === "array" && typeEquals(thenRaw.type, elseRaw.type)
|
|
302
|
+
? thenRaw.type
|
|
303
|
+
: dynJoin
|
|
304
|
+
? DYN
|
|
305
|
+
: (anyJoin ?? (useCtx && ctxMapped ? ctxMapped : lowerer.irTypeOf(expr)));
|
|
306
|
+
// Each arm flows into the ternary's type through the slot-coercion
|
|
307
|
+
// path: union arms wrap, dyn slots reject the non-dyn arm with
|
|
308
|
+
// SC1101, mismatched record shapes get SC2002; coerceInto is
|
|
309
|
+
// inert when the types already agree.
|
|
310
|
+
const intoDyn = (e) => e.type.kind === "dyn" ? e : { kind: "dynFrom", value: e, type: DYN, loc: e.loc };
|
|
311
|
+
const then = dynJoin ? intoDyn(thenRaw) : lowerer.coerceInto(expr.whenTrue, thenRaw, type);
|
|
312
|
+
const else_ = dynJoin ? intoDyn(elseRaw) : lowerer.coerceInto(expr.whenFalse, elseRaw, type);
|
|
313
|
+
if (then.type.kind !== type.kind || else_.type.kind !== type.kind) {
|
|
314
|
+
lowerer.badType(expr, lowerer.typeOf(expr));
|
|
315
|
+
}
|
|
316
|
+
return { kind: "ternary", cond, then, else_, type, loc };
|
|
317
|
+
}
|
|
318
|
+
finally {
|
|
319
|
+
for (const n of falseArmNarrows)
|
|
320
|
+
lowerer.chainNarrowedType.delete(n);
|
|
321
|
+
}
|
|
322
|
+
}
|
|
323
|
+
/** Checker-driven union narrowing. tsc's control-flow analysis narrows a
|
|
324
|
+
* union-typed reference at use sites (`if (r.kind === "ok") { ...r... }`
|
|
325
|
+
* types `r` as the ok-arm inside the branch); the IR value is still the
|
|
326
|
+
* tagged union, so the read is bridged with a `unionNarrow` extracting
|
|
327
|
+
* the arm's payload. The extraction relies on tsc having proven the tag;
|
|
328
|
+
* backends verify it once and trap on a mismatch, so a wrong proof stops
|
|
329
|
+
* the program instead of reading another arm. A checker type that maps to
|
|
330
|
+
* the same union (unnarrowed use), to a SUB-union (partial narrowing —
|
|
331
|
+
* unrepresentable without a re-tag), or to nothing (`never` in an
|
|
332
|
+
* exhaustive default) leaves the expression union-typed. */
|
|
333
|
+
export function maybeNarrow(lowerer, expr, node) {
|
|
334
|
+
if ((expr.type.kind === "union" || expr.type.kind === "dyn") &&
|
|
335
|
+
isJsSourceFile(ts.getSourceFileOfNode(node)) &&
|
|
336
|
+
ts.isPropertyAccessExpression(node)) {
|
|
337
|
+
const symbol = lowerer.checker.getSymbolAtLocation(node.name);
|
|
338
|
+
if (symbol &&
|
|
339
|
+
symbol.declarations.some((decl) => ts.isPropertyDeclaration(decl) &&
|
|
340
|
+
!decl.initializer &&
|
|
341
|
+
!decl.type &&
|
|
342
|
+
isJsSourceFile(ts.getSourceFileOfNode(decl)))) {
|
|
343
|
+
// Inference describes later writes, not the initial undefined.
|
|
344
|
+
// A use that requires the inferred type must validate the value.
|
|
345
|
+
return expr.type.kind === "dyn"
|
|
346
|
+
? expr
|
|
347
|
+
: { kind: "dynFrom", value: expr, type: DYN, loc: expr.loc };
|
|
348
|
+
}
|
|
349
|
+
}
|
|
350
|
+
// A dyn read tsc narrowed to a SCALAR (a typeof test proved the kind):
|
|
351
|
+
// bridge with a VALIDATED extraction — dynCheck, the checked-cast
|
|
352
|
+
// machinery — rather than a trusted one. After the guard the check
|
|
353
|
+
// never fires; a read smuggled past it throws a catchable TypeError
|
|
354
|
+
// instead of misreading the payload (the dyn boundary's usual stance).
|
|
355
|
+
// Object/array narrowings stay dyn-typed and keep their fences.
|
|
356
|
+
if (expr.type.kind === "dyn") {
|
|
357
|
+
// An inferred JS member's storage may be deliberately wider than its
|
|
358
|
+
// declaration (prototype-selected buffers, null-initialized scratch
|
|
359
|
+
// objects). Extract at the consuming operation, not at the read.
|
|
360
|
+
if (isJsSourceFile(ts.getSourceFileOfNode(node)) && ts.isPropertyAccessExpression(node)) {
|
|
361
|
+
const receiver = lowerer.mapTypeOf(lowerer.typeOf(node.expression));
|
|
362
|
+
if (receiver?.kind === "object") {
|
|
363
|
+
const info = lowerer.classes.get(receiver.className);
|
|
364
|
+
if (info?.fields.get(node.name.text)?.kind === "dyn" ||
|
|
365
|
+
lowerer.findMethodOn(info ?? null, `get:${node.name.text}`)?.sig.ret.kind === "dyn")
|
|
366
|
+
return expr;
|
|
367
|
+
}
|
|
368
|
+
if (receiver?.kind === "classval") {
|
|
369
|
+
const info = lowerer.classes.get(receiver.className);
|
|
370
|
+
if (info && hasRuntimeStatics(info))
|
|
371
|
+
return expr;
|
|
372
|
+
}
|
|
373
|
+
}
|
|
374
|
+
if (isJsSourceFile(ts.getSourceFileOfNode(node)) &&
|
|
375
|
+
(ts.isPropertyAccessExpression(node) || ts.isElementAccessExpression(node))) {
|
|
376
|
+
let receiver = node.expression;
|
|
377
|
+
while (ts.isPropertyAccessExpression(receiver) ||
|
|
378
|
+
ts.isElementAccessExpression(receiver) ||
|
|
379
|
+
ts.isParenthesizedExpression(receiver)) {
|
|
380
|
+
if (ts.isPropertyAccessExpression(receiver)) {
|
|
381
|
+
const owner = lowerer.mapTypeOf(lowerer.typeOf(receiver.expression));
|
|
382
|
+
if (owner?.kind === "object" &&
|
|
383
|
+
lowerer.classes.get(owner.className)?.fields.get(receiver.name.text)?.kind === "dyn")
|
|
384
|
+
return expr;
|
|
385
|
+
}
|
|
386
|
+
receiver = receiver.expression;
|
|
387
|
+
}
|
|
388
|
+
if (receiver.kind === ts.SyntaxKind.ThisKeyword && lowerer.resolveThis()?.type.kind === "dyn")
|
|
389
|
+
return expr;
|
|
390
|
+
if (ts.isIdentifier(receiver)) {
|
|
391
|
+
const stored = lowerer.peekLocal(receiver)?.type ?? lowerer.globalOf(receiver)?.type;
|
|
392
|
+
if (stored?.kind === "dyn")
|
|
393
|
+
return expr;
|
|
394
|
+
const symbol = lowerer.resolveValueSymbol(receiver);
|
|
395
|
+
const bound = symbol && lowerer.implicitParamTypes?.get(symbol);
|
|
396
|
+
if (bound && lowerer.mapTypeOf(bound)?.kind === "dyn")
|
|
397
|
+
return expr;
|
|
398
|
+
}
|
|
399
|
+
}
|
|
400
|
+
if (isJsSourceFile(ts.getSourceFileOfNode(node)) && ts.isIdentifier(node)) {
|
|
401
|
+
const symbol = lowerer.resolveValueSymbol(node);
|
|
402
|
+
if (symbol &&
|
|
403
|
+
symbol.declarations.some((decl) => ts.isParameter(decl) &&
|
|
404
|
+
ts.isMethodDeclaration(decl.parent) &&
|
|
405
|
+
lowerer.checkedVirtualJsMethods.has(decl.parent)))
|
|
406
|
+
return expr;
|
|
407
|
+
if (symbol &&
|
|
408
|
+
symbol.declarations.some((decl) => ts.isParameter(decl) && ts.isConstructorDeclaration(decl.parent)))
|
|
409
|
+
return expr;
|
|
410
|
+
if (symbol &&
|
|
411
|
+
symbol.declarations.some((decl) => ts.isVariableDeclaration(decl) && jsBindingHasOpenWrites(lowerer, decl)))
|
|
412
|
+
return expr;
|
|
413
|
+
if (symbol &&
|
|
414
|
+
symbol.declarations.some((decl) => ts.isParameter(decl) &&
|
|
415
|
+
decl.initializer &&
|
|
416
|
+
!decl.type &&
|
|
417
|
+
!/@(?:param|type)\b/.test(ts
|
|
418
|
+
.getSourceFileOfNode(decl)
|
|
419
|
+
.text.slice(decl.parent?.pos ?? decl.pos, ts.tokenStartOfNode(decl)))))
|
|
420
|
+
return expr;
|
|
421
|
+
if (symbol &&
|
|
422
|
+
symbol.declarations.some((decl) => {
|
|
423
|
+
if (!ts.isParameter(decl) || decl.type)
|
|
424
|
+
return false;
|
|
425
|
+
const fn = decl.parent;
|
|
426
|
+
if (!ts.isFunctionExpression(fn) && !ts.isArrowFunction(fn))
|
|
427
|
+
return false;
|
|
428
|
+
const assignment = fn.parent;
|
|
429
|
+
return (ts.isBinaryExpression(assignment) &&
|
|
430
|
+
assignment.right === fn &&
|
|
431
|
+
ts.isPropertyAccessExpression(assignment.left) &&
|
|
432
|
+
assignment.left.name.text === "write" &&
|
|
433
|
+
lowerer.isStdlibMember(assignment.left));
|
|
434
|
+
}))
|
|
435
|
+
return expr;
|
|
436
|
+
}
|
|
437
|
+
// Node's TTY declarations promise booleans/numbers even when a pipe
|
|
438
|
+
// has no such property. Preserve the checked read for JS capability
|
|
439
|
+
// probes instead of treating a declaration as a runtime type guard.
|
|
440
|
+
if (isJsSourceFile(ts.getSourceFileOfNode(node)) &&
|
|
441
|
+
ts.isPropertyAccessExpression(node) &&
|
|
442
|
+
["isTTY", "columns", "rows"].includes(node.name.text) &&
|
|
443
|
+
lowerer.isStdlibMember(node))
|
|
444
|
+
return expr;
|
|
445
|
+
// A null-initialized JS field can later receive an object even when
|
|
446
|
+
// checker flow calls its non-null branch never. The live checked
|
|
447
|
+
// value remains authoritative; never is not a numeric guard.
|
|
448
|
+
if (isJsSourceFile(ts.getSourceFileOfNode(node)) &&
|
|
449
|
+
(lowerer.typeOf(node).flags & ts.TypeFlags.Never) !== 0)
|
|
450
|
+
return expr;
|
|
451
|
+
const narrowed = lowerer.mapTypeOf(lowerer.typeOf(node));
|
|
452
|
+
if (narrowed &&
|
|
453
|
+
(narrowed.kind === "f64" ||
|
|
454
|
+
narrowed.kind === "bool" ||
|
|
455
|
+
narrowed.kind === "string" ||
|
|
456
|
+
narrowed.kind === "bigint")) {
|
|
457
|
+
return { kind: "dynCheck", value: expr, type: narrowed, loc: expr.loc };
|
|
458
|
+
}
|
|
459
|
+
// An instanceof narrow retains the native view after validating its
|
|
460
|
+
// exact element kind. Buffer also matches Uint8Array.
|
|
461
|
+
if (narrowed?.kind === "bytes" || narrowed?.kind === "url") {
|
|
462
|
+
return { kind: "dynCheck", value: expr, type: narrowed, loc: expr.loc };
|
|
463
|
+
}
|
|
464
|
+
// An `instanceof Error` narrow: the checked-dynamic tree's error encoding rebuilds a
|
|
465
|
+
// fresh %Error (name/message/code from the marker object — a COPY,
|
|
466
|
+
// the unknown boundary's stance; SEMANTICS.md 67), validated like
|
|
467
|
+
// every dyn extraction.
|
|
468
|
+
if (narrowed?.kind === "object" && narrowed.className === "%Error") {
|
|
469
|
+
return { kind: "dynCheck", value: expr, type: narrowed, loc: expr.loc };
|
|
470
|
+
}
|
|
471
|
+
return expr;
|
|
472
|
+
}
|
|
473
|
+
// instanceof narrowing for classes: tsc types this USE as a subclass of
|
|
474
|
+
// the IR value's class (only a dynamic instanceof test narrows a class
|
|
475
|
+
// type), so the read bridges with a static downcast that backends verify
|
|
476
|
+
// at run time, like the union bridge below.
|
|
477
|
+
if (expr.type.kind === "object") {
|
|
478
|
+
const narrowed = lowerer.mapTypeOf(lowerer.typeOf(node));
|
|
479
|
+
if (narrowed?.kind === "union") {
|
|
480
|
+
const union = narrowClassUnion(lowerer, expr, narrowed);
|
|
481
|
+
if (union)
|
|
482
|
+
return union;
|
|
483
|
+
}
|
|
484
|
+
if (narrowed?.kind === "object" &&
|
|
485
|
+
narrowed.className !== expr.type.className &&
|
|
486
|
+
lowerer.isSubclassOf(narrowed.className, expr.type.className)) {
|
|
487
|
+
const reduced = structuralNarrowing(lowerer, node, expr.type.className, narrowed);
|
|
488
|
+
const union = reduced ? narrowClassUnion(lowerer, expr, reduced) : null;
|
|
489
|
+
if (union)
|
|
490
|
+
return union;
|
|
491
|
+
if (lowerer.narrowing.untrusted(node, narrowed)) {
|
|
492
|
+
const checked = checkedClassAssertion(lowerer, expr, narrowed, expr.loc);
|
|
493
|
+
if (checked)
|
|
494
|
+
return checked;
|
|
495
|
+
}
|
|
496
|
+
return { kind: "downcast", value: expr, type: narrowed, loc: expr.loc };
|
|
497
|
+
}
|
|
498
|
+
return expr;
|
|
499
|
+
}
|
|
500
|
+
if (expr.type.kind !== "union")
|
|
501
|
+
return expr;
|
|
502
|
+
if (ts.isPropertyAccessExpression(node) && isOptionalProcessStreamProperty(lowerer, node))
|
|
503
|
+
return expr;
|
|
504
|
+
// Represented fields and index values can include undefined even when
|
|
505
|
+
// checker inference or lib.d.ts declares strings (RegExp captures).
|
|
506
|
+
// Only a declaration that represents the optional arm can provide a
|
|
507
|
+
// trustworthy flow narrowing; otherwise consumers must check it.
|
|
508
|
+
if ((expr.kind === "recordGet" || expr.kind === "recordKeyGet") &&
|
|
509
|
+
(ts.isPropertyAccessExpression(node) || ts.isElementAccessExpression(node))) {
|
|
510
|
+
// The read itself rules out a null or undefined receiver, which a
|
|
511
|
+
// JavaScript receiver such as `m.groups` still declares.
|
|
512
|
+
const receiver = lowerer.mapTypeOf(lowerer.checker.getNonNullableType(lowerer.typeOf(node.expression)));
|
|
513
|
+
const shape = receiver?.kind === "record" ? lowerer.shapes.get(receiver.shapeId) : undefined;
|
|
514
|
+
const declared = expr.kind === "recordGet"
|
|
515
|
+
? shape?.fields.find((field) => field.name === expr.field)?.type
|
|
516
|
+
: shape?.indexValue;
|
|
517
|
+
if (lowerer.armTag(expr.type.unionId, UNDEFINED_T) >= 0 &&
|
|
518
|
+
declared &&
|
|
519
|
+
!(declared.kind === "union" && lowerer.armTag(declared.unionId, UNDEFINED_T) >= 0))
|
|
520
|
+
return expr;
|
|
521
|
+
// The same for a field holding a Date's toJSON() result, whose null
|
|
522
|
+
// the declared string does not represent.
|
|
523
|
+
if (expr.kind === "recordGet" &&
|
|
524
|
+
lowerer.isRuntimeOptionalField(expr.shapeId, expr.field) &&
|
|
525
|
+
lowerer.armTag(expr.type.unionId, NULL_T) >= 0 &&
|
|
526
|
+
declared &&
|
|
527
|
+
!(declared.kind === "union" && lowerer.armTag(declared.unionId, NULL_T) >= 0))
|
|
528
|
+
return expr;
|
|
529
|
+
}
|
|
530
|
+
if (ts.isIdentifier(node)) {
|
|
531
|
+
const symbol = lowerer.resolveValueSymbol(node);
|
|
532
|
+
if (symbol && lowerer.unstableSwitchBindings.has(symbol))
|
|
533
|
+
return expr;
|
|
534
|
+
// A binding initialized by a Date's toJSON() can hold null where the
|
|
535
|
+
// checker says string; consumers check it.
|
|
536
|
+
if (symbol && lowerer.dateJsonBindings.has(symbol))
|
|
537
|
+
return expr;
|
|
538
|
+
}
|
|
539
|
+
if (ts.isPropertyAccessExpression(node) &&
|
|
540
|
+
getterResultHoldsUndeclaredUndefined(lowerer, node, expr))
|
|
541
|
+
return expr;
|
|
542
|
+
const narrowedTs = lowerer.typeOf(node);
|
|
543
|
+
const narrowed = lowerer.mapTypeOf(narrowedTs);
|
|
544
|
+
// `Array.isArray(u)` on a union with one readonly array/tuple arm: the
|
|
545
|
+
// lib predicate narrows to `any[]`, possibly intersected with another
|
|
546
|
+
// type. That mapping may be a checked value or a synthetic record, but
|
|
547
|
+
// the tag test proved the union's one array-valued arm, so bridge to it
|
|
548
|
+
// with the same trusted unionNarrow the mapped case below builds.
|
|
549
|
+
if (lowerer.checkerAnyArrayType(narrowedTs)) {
|
|
550
|
+
const def = lowerer.unions.get(expr.type.unionId);
|
|
551
|
+
const arrayTags = lowerer.arrayValueTags(expr.type.unionId);
|
|
552
|
+
if (arrayTags.length === 1) {
|
|
553
|
+
const arm = def.arms[arrayTags[0]];
|
|
554
|
+
const checked = checkedStaleArm(lowerer, node, expr, arrayTags[0], arm);
|
|
555
|
+
if (checked)
|
|
556
|
+
return checked;
|
|
557
|
+
return {
|
|
558
|
+
kind: "unionNarrow",
|
|
559
|
+
unionId: expr.type.unionId,
|
|
560
|
+
tag: arrayTags[0],
|
|
561
|
+
value: expr,
|
|
562
|
+
type: arm,
|
|
563
|
+
loc: expr.loc,
|
|
564
|
+
};
|
|
565
|
+
}
|
|
566
|
+
}
|
|
567
|
+
// A narrowing that refines record arms with an intersection keeps the
|
|
568
|
+
// stored layout: view the value as the stored arms that can hold it.
|
|
569
|
+
if (narrowed?.kind === "union") {
|
|
570
|
+
const hosted = hostedStorageView(lowerer, expr, narrowed, expr.loc);
|
|
571
|
+
if (hosted)
|
|
572
|
+
return hosted;
|
|
573
|
+
}
|
|
574
|
+
// A checker type narrowed to a UNIT arm (the `=== undefined` branch)
|
|
575
|
+
// also stays union-typed: a unit arm has no payload to extract, and
|
|
576
|
+
// nothing useful reads such a value anyway. (Standalone undefined maps
|
|
577
|
+
// to void and standalone null to nothing, so the isUnitType guard is
|
|
578
|
+
// defensive.)
|
|
579
|
+
if (!narrowed || narrowed.kind === "union" || narrowed.kind === "void" || isUnitType(narrowed)) {
|
|
580
|
+
return expr;
|
|
581
|
+
}
|
|
582
|
+
const tag = lowerer.armTag(expr.type.unionId, narrowed);
|
|
583
|
+
if (tag < 0 &&
|
|
584
|
+
narrowed.kind === "record" &&
|
|
585
|
+
!lowerer.unions.get(expr.type.unionId)?.discriminant) {
|
|
586
|
+
const hosted = hostedStorageView(lowerer, expr, narrowed, expr.loc);
|
|
587
|
+
if (hosted)
|
|
588
|
+
return hosted;
|
|
589
|
+
}
|
|
590
|
+
if (tag < 0) {
|
|
591
|
+
// The checker may refine fields inside a discriminated record too.
|
|
592
|
+
// That creates a different mapped shape, but does not change the
|
|
593
|
+
// stored payload layout. A required literal discriminator proves
|
|
594
|
+
// which original arm to read; retain all of that arm's field types.
|
|
595
|
+
const def = lowerer.unions.get(expr.type.unionId);
|
|
596
|
+
if (narrowed.kind === "record" && def?.discriminant) {
|
|
597
|
+
const property = lowerer.checker.getPropertyOfType(narrowedTs, def.discriminant.field);
|
|
598
|
+
if (property &&
|
|
599
|
+
!(property.flags &
|
|
600
|
+
(ts.SymbolFlags.Optional | ts.SymbolFlags.GetAccessor | ts.SymbolFlags.SetAccessor))) {
|
|
601
|
+
const values = literalValues(lowerer.checker.getTypeOfSymbol(property));
|
|
602
|
+
const arm = values && literalUnionArm(def, values, (id) => lowerer.shapes.get(id));
|
|
603
|
+
if (arm) {
|
|
604
|
+
const checked = checkedStaleArm(lowerer, node, expr, lowerer.armTag(expr.type.unionId, arm), arm);
|
|
605
|
+
if (checked)
|
|
606
|
+
return checked;
|
|
607
|
+
return {
|
|
608
|
+
kind: "unionNarrow",
|
|
609
|
+
unionId: expr.type.unionId,
|
|
610
|
+
tag: lowerer.armTag(expr.type.unionId, arm),
|
|
611
|
+
value: expr,
|
|
612
|
+
type: arm,
|
|
613
|
+
loc: expr.loc,
|
|
614
|
+
};
|
|
615
|
+
}
|
|
616
|
+
}
|
|
617
|
+
}
|
|
618
|
+
// A base-class arm can narrow to a subclass after instanceof. The
|
|
619
|
+
// payload retains its base-class tag even when the union also has
|
|
620
|
+
// records or other classes. Require one unambiguous containing arm.
|
|
621
|
+
const arms = lowerer.unions.get(expr.type.unionId)?.arms ?? [];
|
|
622
|
+
const valueTag = narrowed.kind === "object"
|
|
623
|
+
? arms.findIndex((arm) => arm.kind === "object" && lowerer.isSubclassOf(narrowed.className, arm.className))
|
|
624
|
+
: -1;
|
|
625
|
+
const valueType = arms[valueTag];
|
|
626
|
+
if (narrowed.kind === "object" &&
|
|
627
|
+
valueType?.kind === "object" &&
|
|
628
|
+
arms.every((arm, i) => i === valueTag ||
|
|
629
|
+
arm.kind !== "object" ||
|
|
630
|
+
!lowerer.isSubclassOf(narrowed.className, arm.className)) &&
|
|
631
|
+
lowerer.isSubclassOf(narrowed.className, valueType.className)) {
|
|
632
|
+
const checked = checkedStaleArm(lowerer, node, expr, valueTag, valueType, narrowed);
|
|
633
|
+
if (checked) {
|
|
634
|
+
return checkedClassAssertion(lowerer, checked, narrowed, expr.loc) ?? checked;
|
|
635
|
+
}
|
|
636
|
+
return {
|
|
637
|
+
kind: "downcast",
|
|
638
|
+
value: {
|
|
639
|
+
kind: "unionNarrow",
|
|
640
|
+
unionId: expr.type.unionId,
|
|
641
|
+
tag: valueTag,
|
|
642
|
+
value: expr,
|
|
643
|
+
type: valueType,
|
|
644
|
+
loc: expr.loc,
|
|
645
|
+
},
|
|
646
|
+
type: narrowed,
|
|
647
|
+
loc: expr.loc,
|
|
648
|
+
};
|
|
649
|
+
}
|
|
650
|
+
return expr;
|
|
651
|
+
}
|
|
652
|
+
const checked = checkedStaleArm(lowerer, node, expr, tag, narrowed);
|
|
653
|
+
if (checked)
|
|
654
|
+
return checked;
|
|
655
|
+
return {
|
|
656
|
+
kind: "unionNarrow",
|
|
657
|
+
unionId: expr.type.unionId,
|
|
658
|
+
tag,
|
|
659
|
+
value: expr,
|
|
660
|
+
type: narrowed,
|
|
661
|
+
loc: expr.loc,
|
|
662
|
+
};
|
|
663
|
+
}
|
|
664
|
+
/** A getter read whose runtime result can be undefined (an unchecked
|
|
665
|
+
* element read in its body, or in another member of its override family)
|
|
666
|
+
* although its declared type cannot. The checker's type for the read is
|
|
667
|
+
* then no narrowing proof, so the read keeps the getter's result. */
|
|
668
|
+
function getterResultHoldsUndeclaredUndefined(lowerer, node, expr) {
|
|
669
|
+
if (expr.type.kind !== "union" || lowerer.armTag(expr.type.unionId, UNDEFINED_T) < 0)
|
|
670
|
+
return false;
|
|
671
|
+
const getter = (expr.kind === "virtualCall" && expr.method.startsWith("get:")) ||
|
|
672
|
+
(expr.kind === "call" && expr.callee.includes(".get:"));
|
|
673
|
+
if (!getter)
|
|
674
|
+
return false;
|
|
675
|
+
const symbol = lowerer.checker.getSymbolAtLocation(node.name);
|
|
676
|
+
if (!symbol || (symbol.flags & ts.SymbolFlags.GetAccessor) === 0)
|
|
677
|
+
return false;
|
|
678
|
+
const declared = lowerer.checker.getTypeOfSymbol(symbol);
|
|
679
|
+
const holdsUndefined = (type) => (type.flags &
|
|
680
|
+
(ts.TypeFlags.Undefined | ts.TypeFlags.Void | ts.TypeFlags.Any | ts.TypeFlags.Unknown)) !==
|
|
681
|
+
0;
|
|
682
|
+
return !(holdsUndefined(declared) ||
|
|
683
|
+
(declared.isUnionType() && ts.constituentTypes(declared).some(holdsUndefined)));
|
|
684
|
+
}
|
|
685
|
+
/** The checked form of maybeNarrow's arm extraction for a narrowing the
|
|
686
|
+
* checker may hold past code that replaced the value (a call clearing the
|
|
687
|
+
* property; see NarrowingStability). Every other arm throws the TypeError
|
|
688
|
+
* Node raises for the operation consuming the read (`Cannot read
|
|
689
|
+
* properties of undefined (reading 'x')`, `o.f is not a function`), or the
|
|
690
|
+
* stranded-value TypeError where Node would carry the value on. Null when
|
|
691
|
+
* the narrowing is provably current. `narrowed` is the checker's type when
|
|
692
|
+
* it refines the arm (a subclass view). */
|
|
693
|
+
function checkedStaleArm(lowerer, node, value, tag, arm, narrowed = arm) {
|
|
694
|
+
if (value.type.kind !== "union" || tag < 0)
|
|
695
|
+
return null;
|
|
696
|
+
if (!lowerer.narrowing.untrusted(node, narrowed))
|
|
697
|
+
return null;
|
|
698
|
+
const inPlace = checkedArmExtraction(lowerer, value, tag, arm, (found) => staleReadMessage(node, found));
|
|
699
|
+
if (inPlace)
|
|
700
|
+
return inPlace;
|
|
701
|
+
const helper = lowerer.narrowedArmHelper(value.type.unionId, arm, value.loc);
|
|
702
|
+
return helper ? lowerer.checkedNarrowCall(helper, value, arm, value.loc) : null;
|
|
703
|
+
}
|
|
704
|
+
/** V8's spelling of a callee in "is not a function": a string-literal
|
|
705
|
+
* element key reads as a property name (`o["a"]` is `o.a`), other keys
|
|
706
|
+
* keep their brackets. */
|
|
707
|
+
export function v8CalleeText(node) {
|
|
708
|
+
if (ts.isElementAccessExpression(node)) {
|
|
709
|
+
const key = node.argumentExpression;
|
|
710
|
+
const object = v8CalleeText(node.expression);
|
|
711
|
+
return ts.isStringLiteral(key) || ts.isNoSubstitutionTemplateLiteral(key)
|
|
712
|
+
? `${object}.${key.text}`
|
|
713
|
+
: `${object}[${ts.getTextOfNode(key)}]`;
|
|
714
|
+
}
|
|
715
|
+
if (ts.isPropertyAccessExpression(node) && !node.questionDotToken)
|
|
716
|
+
return `${v8CalleeText(node.expression)}.${node.name.text}`;
|
|
717
|
+
return ts.getTextOfNode(node);
|
|
718
|
+
}
|
|
719
|
+
/** Node's TypeError for the operation consuming `node` when it holds a
|
|
720
|
+
* value of type `found`, or null where Node would not throw. */
|
|
721
|
+
function staleReadMessage(node, found) {
|
|
722
|
+
let child = node;
|
|
723
|
+
let parent = node.parent;
|
|
724
|
+
while (ts.isParenthesizedExpression(parent)) {
|
|
725
|
+
child = parent;
|
|
726
|
+
parent = parent.parent;
|
|
727
|
+
}
|
|
728
|
+
if (ts.isCallExpression(parent) && parent.expression === child && !parent.questionDotToken) {
|
|
729
|
+
return found.kind === "func" ? null : `${v8CalleeText(node)} is not a function`;
|
|
730
|
+
}
|
|
731
|
+
const unit = found.kind === "undefinedT" ? "undefined" : found.kind === "nullT" ? "null" : null;
|
|
732
|
+
if (unit === null)
|
|
733
|
+
return null;
|
|
734
|
+
if (!(ts.isPropertyAccessExpression(parent) || ts.isElementAccessExpression(parent)) ||
|
|
735
|
+
parent.expression !== child ||
|
|
736
|
+
parent.questionDotToken)
|
|
737
|
+
return null;
|
|
738
|
+
let key = null;
|
|
739
|
+
if (ts.isPropertyAccessExpression(parent))
|
|
740
|
+
key = parent.name.text;
|
|
741
|
+
else if (ts.isStringLiteral(parent.argumentExpression))
|
|
742
|
+
key = parent.argumentExpression.text;
|
|
743
|
+
else if (ts.isNumericLiteral(parent.argumentExpression))
|
|
744
|
+
key = String(Number(parent.argumentExpression.text));
|
|
745
|
+
if (key === null)
|
|
746
|
+
return null;
|
|
747
|
+
const store = parent.parent;
|
|
748
|
+
return ts.isBinaryExpression(store) &&
|
|
749
|
+
store.left === parent &&
|
|
750
|
+
store.operatorToken.kind === ts.SyntaxKind.EqualsToken
|
|
751
|
+
? `Cannot set properties of ${unit} (setting '${key}')`
|
|
752
|
+
: `Cannot read properties of ${unit} (reading '${key}')`;
|
|
753
|
+
}
|
|
754
|
+
/** A runtime-optional slot can be assigned while a truthy guard is in
|
|
755
|
+
* force. TypeScript then types a direct member receiver as the plain arm,
|
|
756
|
+
* even though an OOB-safe assignment may have restored undefined. Check
|
|
757
|
+
* that hidden arm and throw the member-read TypeError Node would produce. */
|
|
758
|
+
export function runtimeOptionalReceiverRead(lowerer, expr, local, property, loc) {
|
|
759
|
+
if (local.type.kind !== "union") {
|
|
760
|
+
lowerer.runtimeOptionalLocals.delete(local);
|
|
761
|
+
lowerer.runtimeOptionalStorageLocals.delete(local);
|
|
762
|
+
return varRef(local.id, local.type, loc);
|
|
763
|
+
}
|
|
764
|
+
// A non-null/type assertion around the receiver carries the useful
|
|
765
|
+
// checker narrowing on the wrapper rather than on the identifier token
|
|
766
|
+
// itself (`gg!.day`). Follow only erased wrappers; the member/call node
|
|
767
|
+
// still receives the checked extraction built below.
|
|
768
|
+
let narrowedNode = expr;
|
|
769
|
+
while ((ts.isParenthesizedExpression(narrowedNode.parent) ||
|
|
770
|
+
ts.isAssertionExpression(narrowedNode.parent) ||
|
|
771
|
+
ts.isSatisfiesExpression(narrowedNode.parent) ||
|
|
772
|
+
ts.isNonNullExpression(narrowedNode.parent)) &&
|
|
773
|
+
narrowedNode.parent.expression === narrowedNode) {
|
|
774
|
+
narrowedNode = narrowedNode.parent;
|
|
775
|
+
}
|
|
776
|
+
const narrowed = lowerer.mapTypeOf(lowerer.typeOf(narrowedNode));
|
|
777
|
+
if (!narrowed || isUnitType(narrowed)) {
|
|
778
|
+
lowerer.unsupported("SC1090", expr, "a runtime-optional capture whose narrowed value type is not representable");
|
|
779
|
+
}
|
|
780
|
+
if (narrowed.kind === "union") {
|
|
781
|
+
const classView = narrowStoredClassValue(lowerer, varRef(local.id, local.type, loc), narrowed);
|
|
782
|
+
if (classView)
|
|
783
|
+
return classView;
|
|
784
|
+
// The checker may keep the receiver at the storage union unchanged
|
|
785
|
+
// (`string | undefined` on a JS `.match()` call). There is no
|
|
786
|
+
// sub-union to re-tag: preserve the value for the downstream
|
|
787
|
+
// nullable-receiver lowering, which performs the member-specific
|
|
788
|
+
// checked extraction. Refusing here deferred the whole statement to
|
|
789
|
+
// a runtime fence before that lowering could run.
|
|
790
|
+
if (typeEquals(local.type, narrowed)) {
|
|
791
|
+
return varRef(local.id, local.type, loc);
|
|
792
|
+
}
|
|
793
|
+
// A captured array element can itself be a union of records (for
|
|
794
|
+
// example Circle | Square). The optional storage union has one extra
|
|
795
|
+
// undefined arm; re-tag it to the checker-narrowed value union with a
|
|
796
|
+
// checked trap for that arm, then let union property lowering inspect
|
|
797
|
+
// the surviving record arms.
|
|
798
|
+
const helper = lowerer.narrowedRetagHelper(narrowedNode, local.type.unionId, narrowed.unionId, loc);
|
|
799
|
+
if (!helper) {
|
|
800
|
+
// Intersection-refined record arms read through their stored
|
|
801
|
+
// layout (the predicate `r is Route & { path: string }`).
|
|
802
|
+
const hosted = hostedStorageView(lowerer, varRef(local.id, local.type, loc), narrowed, loc);
|
|
803
|
+
if (hosted)
|
|
804
|
+
return hosted;
|
|
805
|
+
lowerer.unsupported("SC1090", expr, "a runtime-optional capture whose narrowed union is not representable");
|
|
806
|
+
}
|
|
807
|
+
return {
|
|
808
|
+
kind: "call",
|
|
809
|
+
callee: helper,
|
|
810
|
+
args: [varRef(local.id, local.type, loc)],
|
|
811
|
+
type: narrowed,
|
|
812
|
+
loc,
|
|
813
|
+
};
|
|
814
|
+
}
|
|
815
|
+
if (narrowed.kind === "object") {
|
|
816
|
+
const view = checkedClassAssertion(lowerer, varRef(local.id, local.type, loc), narrowed, loc);
|
|
817
|
+
// Preserve the member-specific missing-value error on the two-arm
|
|
818
|
+
// path below; mixed storage also needs to validate its concrete class.
|
|
819
|
+
if (view && (lowerer.unions.get(local.type.unionId)?.arms.length ?? 0) > 2)
|
|
820
|
+
return view;
|
|
821
|
+
}
|
|
822
|
+
if (narrowed.kind === "record" && lowerer.armTag(local.type.unionId, narrowed) < 0) {
|
|
823
|
+
const hosted = hostedStorageView(lowerer, varRef(local.id, local.type, loc), narrowed, loc);
|
|
824
|
+
if (hosted)
|
|
825
|
+
return hosted;
|
|
826
|
+
}
|
|
827
|
+
const undefTag = lowerer.armTag(local.type.unionId, UNDEFINED_T);
|
|
828
|
+
const def = lowerer.unions.get(local.type.unionId);
|
|
829
|
+
if (!def || undefTag < 0)
|
|
830
|
+
throw new InternalCompilerError("runtime-optional local is missing its undefined arm");
|
|
831
|
+
if (def.arms.length !== 2) {
|
|
832
|
+
// The checker may narrow a runtime-optional capture to one arm of a
|
|
833
|
+
// value union (`Circle | Square | undefined` -> `Circle`). The
|
|
834
|
+
// two-arm fast path below cannot extract that arm safely: a later
|
|
835
|
+
// array mutation can leave any of the stored tags in the slot. Use
|
|
836
|
+
// the checked helper so every other arm, including undefined, remains
|
|
837
|
+
// a catchable TypeError rather than an unchecked payload read.
|
|
838
|
+
const helper = lowerer.narrowedArmHelper(local.type.unionId, narrowed, loc);
|
|
839
|
+
if (!helper) {
|
|
840
|
+
lowerer.unsupported("SC1090", expr, "a direct read from a runtime-optional capture with multiple value arms");
|
|
841
|
+
}
|
|
842
|
+
return lowerer.checkedNarrowCall(helper, varRef(local.id, local.type, loc), narrowed, loc);
|
|
843
|
+
}
|
|
844
|
+
// A predicate can strengthen a record's fields or narrow a base class
|
|
845
|
+
// to a subclass without changing the slot's stored value arm. Extract
|
|
846
|
+
// that actual arm first: record reads need its original field layout,
|
|
847
|
+
// and class reads apply the ordinary downcast bridge afterward.
|
|
848
|
+
const valueTag = undefTag === 0 ? 1 : 0;
|
|
849
|
+
const valueType = def.arms[valueTag];
|
|
850
|
+
if (!valueType || isUnitType(valueType)) {
|
|
851
|
+
lowerer.unsupported("SC1090", expr, "a runtime-optional receiver without a representable value arm");
|
|
852
|
+
}
|
|
853
|
+
const message = property === null
|
|
854
|
+
? `${expr.text} is not a function`
|
|
855
|
+
: `Cannot read properties of undefined (reading '${property}')`;
|
|
856
|
+
return lowerer.maybeNarrow({
|
|
857
|
+
kind: "ternary",
|
|
858
|
+
cond: {
|
|
859
|
+
kind: "unionIsTag",
|
|
860
|
+
unionId: local.type.unionId,
|
|
861
|
+
tag: undefTag,
|
|
862
|
+
negated: false,
|
|
863
|
+
value: varRef(local.id, local.type, loc),
|
|
864
|
+
type: BOOL,
|
|
865
|
+
loc,
|
|
866
|
+
},
|
|
867
|
+
then: nodeThrowExpr(1, "", message, valueType, loc),
|
|
868
|
+
else_: {
|
|
869
|
+
kind: "unionNarrow",
|
|
870
|
+
unionId: local.type.unionId,
|
|
871
|
+
tag: valueTag,
|
|
872
|
+
value: varRef(local.id, local.type, loc),
|
|
873
|
+
type: valueType,
|
|
874
|
+
loc,
|
|
875
|
+
},
|
|
876
|
+
type: valueType,
|
|
877
|
+
loc,
|
|
878
|
+
}, narrowedNode);
|
|
879
|
+
}
|
|
880
|
+
export function runtimeOptionalTrueIds(lowerer, node) {
|
|
881
|
+
return runtimeOptionalGuardIds(lowerer, node, true);
|
|
882
|
+
}
|
|
883
|
+
/** Presence proved by one outcome of a boolean guard. Negation flips
|
|
884
|
+
* the outcome; all operands of a true AND or false OR have that outcome.
|
|
885
|
+
* Assignments invalidate a syntactic proof even when checker types hide
|
|
886
|
+
* the undefined produced by an out-of-bounds read. */
|
|
887
|
+
export function runtimeOptionalGuardIds(lowerer, node, truthy) {
|
|
888
|
+
const candidates = [];
|
|
889
|
+
const collect = (expr, outcome) => {
|
|
890
|
+
if (ts.isParenthesizedExpression(expr))
|
|
891
|
+
return collect(expr.expression, outcome);
|
|
892
|
+
if (ts.isPrefixUnaryExpression(expr) && expr.operator === ts.SyntaxKind.ExclamationToken) {
|
|
893
|
+
return collect(expr.operand, outcome === null ? null : !outcome);
|
|
894
|
+
}
|
|
895
|
+
if (ts.isBinaryExpression(expr) &&
|
|
896
|
+
((outcome === true && expr.operatorToken.kind === ts.SyntaxKind.AmpersandAmpersandToken) ||
|
|
897
|
+
(outcome === false && expr.operatorToken.kind === ts.SyntaxKind.BarBarToken))) {
|
|
898
|
+
collect(expr.left, outcome);
|
|
899
|
+
collect(expr.right, outcome);
|
|
900
|
+
}
|
|
901
|
+
else if (ts.isPropertyAccessExpression(expr) && !expr.questionDotToken) {
|
|
902
|
+
// A completed ordinary member read checked its receiver even if
|
|
903
|
+
// the property's value was falsy. Optional chains make no such
|
|
904
|
+
// promise, and calls/captures retain their separate checked ABI.
|
|
905
|
+
const local = runtimeOptionalLocalOf(lowerer, expr.expression);
|
|
906
|
+
if (local !== null)
|
|
907
|
+
candidates.push(local);
|
|
908
|
+
else if (ts.isPropertyAccessExpression(expr.expression))
|
|
909
|
+
collect(expr.expression, outcome);
|
|
910
|
+
}
|
|
911
|
+
else if (ts.isBinaryExpression(expr) &&
|
|
912
|
+
expr.operatorToken.kind !== ts.SyntaxKind.AmpersandAmpersandToken &&
|
|
913
|
+
expr.operatorToken.kind !== ts.SyntaxKind.BarBarToken &&
|
|
914
|
+
expr.operatorToken.kind !== ts.SyntaxKind.QuestionQuestionToken) {
|
|
915
|
+
// Both operands of a comparison/arithmetic operator are evaluated.
|
|
916
|
+
// Only member reads prove presence; bare identifiers need truth.
|
|
917
|
+
const member = (operand) => {
|
|
918
|
+
while (ts.isParenthesizedExpression(operand))
|
|
919
|
+
operand = operand.expression;
|
|
920
|
+
if (ts.isPropertyAccessExpression(operand))
|
|
921
|
+
collect(operand, outcome);
|
|
922
|
+
};
|
|
923
|
+
member(expr.left);
|
|
924
|
+
member(expr.right);
|
|
925
|
+
const op = expr.operatorToken.kind;
|
|
926
|
+
const equal = op === ts.SyntaxKind.EqualsEqualsEqualsToken || op === ts.SyntaxKind.EqualsEqualsToken;
|
|
927
|
+
const unequal = op === ts.SyntaxKind.ExclamationEqualsEqualsToken ||
|
|
928
|
+
op === ts.SyntaxKind.ExclamationEqualsToken;
|
|
929
|
+
if ((equal && outcome === false) || (unequal && outcome === true)) {
|
|
930
|
+
const present = (value, unit) => {
|
|
931
|
+
while (ts.isParenthesizedExpression(unit))
|
|
932
|
+
unit = unit.expression;
|
|
933
|
+
const excludesUndefined = (ts.isIdentifier(unit) &&
|
|
934
|
+
unit.text === "undefined" &&
|
|
935
|
+
(lowerer.typeOf(unit).flags & ts.TypeFlags.Undefined) !== 0) ||
|
|
936
|
+
(unit.kind === ts.SyntaxKind.NullKeyword &&
|
|
937
|
+
(op === ts.SyntaxKind.EqualsEqualsToken ||
|
|
938
|
+
op === ts.SyntaxKind.ExclamationEqualsToken));
|
|
939
|
+
if (excludesUndefined) {
|
|
940
|
+
const local = runtimeOptionalLocalOf(lowerer, value);
|
|
941
|
+
if (local !== null)
|
|
942
|
+
candidates.push(local);
|
|
943
|
+
}
|
|
944
|
+
};
|
|
945
|
+
present(expr.left, expr.right);
|
|
946
|
+
present(expr.right, expr.left);
|
|
947
|
+
}
|
|
948
|
+
}
|
|
949
|
+
else if (outcome) {
|
|
950
|
+
const local = runtimeOptionalLocalOf(lowerer, expr);
|
|
951
|
+
if (local !== null)
|
|
952
|
+
candidates.push(local);
|
|
953
|
+
}
|
|
954
|
+
};
|
|
955
|
+
collect(node, truthy);
|
|
956
|
+
if (candidates.length === 0)
|
|
957
|
+
return candidates;
|
|
958
|
+
const assigned = new Set();
|
|
959
|
+
const visit = (part) => {
|
|
960
|
+
if (ts.isFunctionLike(part))
|
|
961
|
+
return;
|
|
962
|
+
let target = null;
|
|
963
|
+
if (ts.isBinaryExpression(part) &&
|
|
964
|
+
part.operatorToken.kind >= ts.SyntaxKind.FirstAssignment &&
|
|
965
|
+
part.operatorToken.kind <= ts.SyntaxKind.LastAssignment)
|
|
966
|
+
target = part.left;
|
|
967
|
+
if ((ts.isPrefixUnaryExpression(part) || ts.isPostfixUnaryExpression(part)) &&
|
|
968
|
+
(part.operator === ts.SyntaxKind.PlusPlusToken ||
|
|
969
|
+
part.operator === ts.SyntaxKind.MinusMinusToken))
|
|
970
|
+
target = part.operand;
|
|
971
|
+
if (target !== null) {
|
|
972
|
+
// Destructuring assignments can contain several identifiers.
|
|
973
|
+
const mark = (name) => {
|
|
974
|
+
if (ts.isIdentifier(name)) {
|
|
975
|
+
const local = lowerer.resolveLocal(name);
|
|
976
|
+
if (local)
|
|
977
|
+
assigned.add(lowerer.runtimeOptionalRootOf(local));
|
|
978
|
+
}
|
|
979
|
+
ts.forEachChild(name, mark);
|
|
980
|
+
};
|
|
981
|
+
mark(target);
|
|
982
|
+
}
|
|
983
|
+
ts.forEachChild(part, visit);
|
|
984
|
+
};
|
|
985
|
+
visit(node);
|
|
986
|
+
return candidates.filter((local) => !assigned.has(lowerer.runtimeOptionalRootOf(local)));
|
|
987
|
+
}
|
|
988
|
+
export function withRuntimeOptionalNarrowed(lowerer, locals, fn) {
|
|
989
|
+
if (locals.length === 0)
|
|
990
|
+
return fn();
|
|
991
|
+
for (const local of locals)
|
|
992
|
+
lowerer.runtimeOptionalLocals.delete(lowerer.runtimeOptionalRootOf(local));
|
|
993
|
+
try {
|
|
994
|
+
return fn();
|
|
995
|
+
}
|
|
996
|
+
finally {
|
|
997
|
+
for (const local of locals)
|
|
998
|
+
lowerer.runtimeOptionalLocals.add(lowerer.runtimeOptionalRootOf(local));
|
|
999
|
+
}
|
|
1000
|
+
}
|
|
1001
|
+
/** `x as T`. Non-dyn inner values ordinarily erase; a record assertion
|
|
1002
|
+
* changing monomorphic shape rebuilds through the established width-copy
|
|
1003
|
+
* path so its represented value agrees with its asserted type.
|
|
1004
|
+
* A dyn ('unknown') inner value makes this THE dynamic boundary:
|
|
1005
|
+
* - `as unknown` (dyn → dyn) stays erasure;
|
|
1006
|
+
* - dyn → a JSON-representable target type T compiles to `dynCheck`, a
|
|
1007
|
+
* runtime validation that builds the typed value or THROWS a catchable
|
|
1008
|
+
* TypeError-flavored error (JS `as` never checks — the headline
|
|
1009
|
+
* documented divergence: a lying cast throws instead of corrupting
|
|
1010
|
+
* memory);
|
|
1011
|
+
* - dyn → anything else (closures, class instances, void) is rejected:
|
|
1012
|
+
* those types cannot be found inside a JSON dyn. */
|
|
1013
|
+
/** A class instance, or a union of class instances and unit arms (a
|
|
1014
|
+
* runtime-optional binding such as `const node = stack.pop()!`). */
|
|
1015
|
+
function classInstanceOrAbsent(lowerer, type) {
|
|
1016
|
+
if (type.kind === "object")
|
|
1017
|
+
return true;
|
|
1018
|
+
if (type.kind !== "union")
|
|
1019
|
+
return false;
|
|
1020
|
+
const arms = lowerer.unions.get(type.unionId)?.arms ?? [];
|
|
1021
|
+
return (arms.some((arm) => arm.kind === "object") &&
|
|
1022
|
+
arms.every((arm) => arm.kind === "object" || isUnitType(arm)));
|
|
1023
|
+
}
|
|
1024
|
+
/** `Object.fromEntries(...) as T` with T a declared record (the generic
|
|
1025
|
+
* `transform<T extends Record<string, unknown>>(t: T): T` idiom): the
|
|
1026
|
+
* entries build a pure index-signature record, which has no layout in
|
|
1027
|
+
* common with T's struct. Node keeps the object itself, with exactly the
|
|
1028
|
+
* keys and the order the entries gave it. The result of fromEntries is a
|
|
1029
|
+
* fresh object nothing else references, so the checked-dynamic bridge,
|
|
1030
|
+
* which keeps keys and their order the same way `JSON.parse(text) as T`
|
|
1031
|
+
* does, cannot be told apart from the original object; a value outside
|
|
1032
|
+
* T throws the catchable TypeError of every checked cast. The entries'
|
|
1033
|
+
* values must be scalars or checked-dynamic values, which the bridge
|
|
1034
|
+
* passes by value or by identity; native arrays and records would be
|
|
1035
|
+
* copied. Other sources may be aliased, where a rebuilt object would sever
|
|
1036
|
+
* mutation, so they keep the exact-shape fence. */
|
|
1037
|
+
function freshEntriesRecordAssertion(lowerer, expr, inner, target) {
|
|
1038
|
+
if (inner.type.kind !== "record" || target?.kind !== "record")
|
|
1039
|
+
return null;
|
|
1040
|
+
const source = lowerer.shapes.get(inner.type.shapeId);
|
|
1041
|
+
const dest = lowerer.shapes.get(target.shapeId);
|
|
1042
|
+
if (!source?.indexValue || source.tuple || source.fields.length > 0)
|
|
1043
|
+
return null;
|
|
1044
|
+
if (!dest || dest.tuple || dest.indexValue || shapeHasAccessorSlots(dest))
|
|
1045
|
+
return null;
|
|
1046
|
+
// Native arrays and records in the entries would be copied on the way
|
|
1047
|
+
// through the checked-dynamic bridge, severing their identity: only
|
|
1048
|
+
// slots of scalars or checked-dynamic values pass.
|
|
1049
|
+
if (extractionCopiesReference(lowerer, source.indexValue))
|
|
1050
|
+
return null;
|
|
1051
|
+
let operand = expr.expression;
|
|
1052
|
+
while (ts.isParenthesizedExpression(operand))
|
|
1053
|
+
operand = operand.expression;
|
|
1054
|
+
if (!ts.isCallExpression(operand) ||
|
|
1055
|
+
!ts.isPropertyAccessExpression(operand.expression) ||
|
|
1056
|
+
operand.expression.name.text !== "fromEntries" ||
|
|
1057
|
+
!lowerer.isStdlibGlobal(operand.expression.expression, "Object"))
|
|
1058
|
+
return null;
|
|
1059
|
+
if (!lowerer.dynConvertible(inner.type))
|
|
1060
|
+
return null;
|
|
1061
|
+
if (!canDynCheckTo(target, (id) => lowerer.shapes.get(id), (id) => lowerer.unions.get(id)))
|
|
1062
|
+
return null;
|
|
1063
|
+
const loc = locOf(expr);
|
|
1064
|
+
return { kind: "dynCheck", value: lowerer.coerceToExpected(inner, DYN), type: target, loc };
|
|
1065
|
+
}
|
|
1066
|
+
/** `e as T` and the old-style assertion `<T>e` — one node shape (both
|
|
1067
|
+
* carry `.type` and `.expression`), one lowering. */
|
|
1068
|
+
export function lowerAsExpression(lowerer, expr) {
|
|
1069
|
+
// `[] as const` — tsgo panics computing the expression's `readonly []`
|
|
1070
|
+
// type (the facade's fence answers `any`), but the syntax pins the
|
|
1071
|
+
// value exactly: the empty tuple, ridden as the unit-element array
|
|
1072
|
+
// (mapType's empty-tuple rule). Lower it directly; enclosing slots
|
|
1073
|
+
// coerce like any other empty-array source.
|
|
1074
|
+
if (ts.isAsExpression(expr) &&
|
|
1075
|
+
isConstAssertionTypeNode(expr.type) &&
|
|
1076
|
+
ts.isArrayLiteralExpression(expr.expression) &&
|
|
1077
|
+
expr.expression.elements.nodes.length === 0) {
|
|
1078
|
+
return {
|
|
1079
|
+
kind: "arrayLit",
|
|
1080
|
+
elems: [],
|
|
1081
|
+
type: arrayOf(unitOnlyUnion(lowerer.unions)),
|
|
1082
|
+
loc: locOf(expr),
|
|
1083
|
+
};
|
|
1084
|
+
}
|
|
1085
|
+
// `e as C` on a CATCH BINDING (`(err as Error).message`): the checked
|
|
1086
|
+
// extraction — an instanceof match extracts the payload, anything else
|
|
1087
|
+
// throws the catchable TypeError (dynCheck's trust-but-verify stance,
|
|
1088
|
+
// extended to exception payloads). Intercepts BEFORE lowerExpr — the
|
|
1089
|
+
// raw read would hit caughtRead's narrowness fence.
|
|
1090
|
+
const caughtLocal = lowerer.caughtLocalOf(expr.expression);
|
|
1091
|
+
if (caughtLocal) {
|
|
1092
|
+
const loc = locOf(expr);
|
|
1093
|
+
const targetTs = lowerer.checker.getTypeFromTypeNode(expr.type);
|
|
1094
|
+
const target = lowerer.mapTypeOf(targetTs);
|
|
1095
|
+
if (target?.kind === "object") {
|
|
1096
|
+
const info = lowerer.classes.get(target.className);
|
|
1097
|
+
if (info && lowerer.inHierarchy(info)) {
|
|
1098
|
+
return {
|
|
1099
|
+
kind: "caughtCheck",
|
|
1100
|
+
value: { kind: "varRef", localId: caughtLocal.id, type: CAUGHT, loc },
|
|
1101
|
+
className: target.className,
|
|
1102
|
+
type: target,
|
|
1103
|
+
loc,
|
|
1104
|
+
};
|
|
1105
|
+
}
|
|
1106
|
+
}
|
|
1107
|
+
// Structural assertions use the ordinary checked dynamic bridge. It
|
|
1108
|
+
// retains primitive values and native class identity before validating
|
|
1109
|
+
// the requested shape; an assertion does not bypass runtime checks.
|
|
1110
|
+
const narrowed = lowerer.mapTypeOf(lowerer.typeOf(expr.expression));
|
|
1111
|
+
const bridged = (narrowed &&
|
|
1112
|
+
(narrowed.kind === "f64" ||
|
|
1113
|
+
narrowed.kind === "bool" ||
|
|
1114
|
+
narrowed.kind === "string" ||
|
|
1115
|
+
narrowed.kind === "object" ||
|
|
1116
|
+
narrowed.kind === "dyn")) ||
|
|
1117
|
+
// `catch (e: any)`: the binding reads as its checked-dynamic value.
|
|
1118
|
+
(narrowed === null && (lowerer.typeOf(expr.expression).flags & ts.TypeFlags.Any) !== 0);
|
|
1119
|
+
if (!bridged)
|
|
1120
|
+
lowerer.unsupported("SC1063", expr);
|
|
1121
|
+
}
|
|
1122
|
+
const inner = lowerer.lowerExpr(expr.expression);
|
|
1123
|
+
const use = runtimeOptionalUseOf(expr);
|
|
1124
|
+
if (inner.type.kind === "union" && runtimeOptionalAssertionErases(lowerer, expr, inner, use))
|
|
1125
|
+
return inner;
|
|
1126
|
+
if (inner.type.kind !== "dyn") {
|
|
1127
|
+
const targetTs0 = lowerer.checker.getTypeFromTypeNode(expr.type);
|
|
1128
|
+
const target = lowerer.mapTypeOf(targetTs0);
|
|
1129
|
+
if (target?.kind === "object") {
|
|
1130
|
+
const asserted = checkedClassAssertion(lowerer, inner, target, locOf(expr));
|
|
1131
|
+
if (asserted)
|
|
1132
|
+
return asserted;
|
|
1133
|
+
}
|
|
1134
|
+
// Unknown-only record views use the checked-dynamic representation.
|
|
1135
|
+
// A native record asserted to such a view still denotes the original
|
|
1136
|
+
// object. Box a live reference instead of erasing the assertion and
|
|
1137
|
+
// handing native storage to a checked-dynamic property operation.
|
|
1138
|
+
if (target?.kind === "dyn" && (targetTs0.flags & ts.TypeFlags.Object) !== 0) {
|
|
1139
|
+
// A class instance asserted to a class-backed protocol view (a type
|
|
1140
|
+
// class instances flow into): the same identity-keeping box an
|
|
1141
|
+
// implicit flow into the view uses. A runtime-optional binding of a
|
|
1142
|
+
// class (`const node = stack.pop()!`) boxes the same way, and its
|
|
1143
|
+
// undefined arm stays undefined, as in Node.
|
|
1144
|
+
if (classInstanceOrAbsent(lowerer, inner.type) && lowerer.classImplementedProtocol(targetTs0))
|
|
1145
|
+
return lowerer.coerceInto(expr, inner, DYN);
|
|
1146
|
+
const sourceShape = inner.type.kind === "record" ? lowerer.shapes.get(inner.type.shapeId) : undefined;
|
|
1147
|
+
if (hasClassPayload(lowerer, inner.type) ||
|
|
1148
|
+
(sourceShape && shapeHasAccessorSlots(sourceShape))) {
|
|
1149
|
+
lowerer.unsupported("SC1090", expr, "opaque structural views of classes or accessor records (name the property's concrete type to retain native accessor dispatch)");
|
|
1150
|
+
}
|
|
1151
|
+
const boxed = lowerer.coerceInto(expr, inner, DYN);
|
|
1152
|
+
// Only references box live; a scalar or unit source (`value as
|
|
1153
|
+
// unknown as View`) is an ordinary snapshot.
|
|
1154
|
+
const seen = new Set();
|
|
1155
|
+
const live = (type) => {
|
|
1156
|
+
if (type.kind === "record" ||
|
|
1157
|
+
type.kind === "array" ||
|
|
1158
|
+
type.kind === "bytes" ||
|
|
1159
|
+
isDynTypedRefType(type))
|
|
1160
|
+
return true;
|
|
1161
|
+
if (type.kind !== "union" || seen.has(type.unionId))
|
|
1162
|
+
return false;
|
|
1163
|
+
seen.add(type.unionId);
|
|
1164
|
+
return lowerer.unions.get(type.unionId)?.arms.some(live) ?? false;
|
|
1165
|
+
};
|
|
1166
|
+
return boxed.kind === "dynFrom" && live(boxed.value.type)
|
|
1167
|
+
? { ...boxed, liveRef: true }
|
|
1168
|
+
: boxed;
|
|
1169
|
+
}
|
|
1170
|
+
// Collection assertions are interface views only: their backing
|
|
1171
|
+
// value must already have the same native key/element/value layout.
|
|
1172
|
+
// Erasing a mock or a different instantiation here would let member
|
|
1173
|
+
// lowering interpret a record (or another ABI) as a native handle.
|
|
1174
|
+
if (target?.kind === "map" || target?.kind === "set") {
|
|
1175
|
+
return lowerer.coerceInto(expr, inner, target);
|
|
1176
|
+
}
|
|
1177
|
+
// A class-derived interface still names the class's native layout.
|
|
1178
|
+
// An assertion must not let a structural mock acquire that layout;
|
|
1179
|
+
// unions retain their checked extraction below, and real instances
|
|
1180
|
+
// keep the ordinary class narrowing path.
|
|
1181
|
+
if (target?.kind === "object" && inner.type.kind !== "object" && inner.type.kind !== "union") {
|
|
1182
|
+
return lowerer.coerceInto(expr, inner, target);
|
|
1183
|
+
}
|
|
1184
|
+
if (target?.kind === "object" &&
|
|
1185
|
+
inner.type.kind === "object" &&
|
|
1186
|
+
!typeEquals(target, inner.type) &&
|
|
1187
|
+
!lowerer.isSubclassOf(inner.type.className, target.className) &&
|
|
1188
|
+
!lowerer.isSubclassOf(target.className, inner.type.className)) {
|
|
1189
|
+
return lowerer.coerceInto(expr, inner, target);
|
|
1190
|
+
}
|
|
1191
|
+
const rebuilt = freshEntriesRecordAssertion(lowerer, expr, inner, target);
|
|
1192
|
+
if (rebuilt)
|
|
1193
|
+
return rebuilt;
|
|
1194
|
+
// `job as Job & { startedAt: number }` on a record: the asserted
|
|
1195
|
+
// record refines the stored one, so the assertion keeps the object
|
|
1196
|
+
// (a width copy would sever writes through the asserted view).
|
|
1197
|
+
if (inner.type.kind === "record" && target && hostsAll(lowerer, inner.type, target)) {
|
|
1198
|
+
return inner;
|
|
1199
|
+
}
|
|
1200
|
+
// Static assertions normally erase, but record layouts are
|
|
1201
|
+
// monomorphic: a consumer selected from the asserted shape must see
|
|
1202
|
+
// that shape physically. Reuse the ordinary slot coercion so plain
|
|
1203
|
+
// widths and index-signature captures share their established copy
|
|
1204
|
+
// semantics (and unsupported pairs report SC2002 at this assertion).
|
|
1205
|
+
if (inner.type.kind === "record" &&
|
|
1206
|
+
target?.kind === "record" &&
|
|
1207
|
+
inner.type.shapeId !== target.shapeId) {
|
|
1208
|
+
return lowerer.coerceInto(expr, inner, target);
|
|
1209
|
+
}
|
|
1210
|
+
// `u as Arm` on a UNION value is `u!`'s spelling with a named arm
|
|
1211
|
+
// (`req.headers[h] as string`): the CHECKED single-arm extraction —
|
|
1212
|
+
// the asserted arm's payload comes out, any other arm throws the
|
|
1213
|
+
// catchable TypeError (divergence 38's lying-assertion stance; an
|
|
1214
|
+
// erasure would just move the failure to the next typed slot as an
|
|
1215
|
+
// opaque union-mismatch fence). Sub-union targets and same-type
|
|
1216
|
+
// casts keep the historic erasure.
|
|
1217
|
+
if (inner.type.kind === "union") {
|
|
1218
|
+
if (target && target.kind !== "union" && !typeEquals(target, inner.type)) {
|
|
1219
|
+
const helper = lowerer.narrowedArmHelper(inner.type.unionId, target, locOf(expr));
|
|
1220
|
+
if (helper) {
|
|
1221
|
+
return lowerer.checkedNarrowCall(helper, inner, target, locOf(expr));
|
|
1222
|
+
}
|
|
1223
|
+
}
|
|
1224
|
+
// An intersection refining the stored record arms keeps the value
|
|
1225
|
+
// (hosted-narrowing.ts): the stored arms that can hold it.
|
|
1226
|
+
if (target && (target.kind === "union" || target.kind === "record")) {
|
|
1227
|
+
const hosted = hostedStorageView(lowerer, inner, target, locOf(expr));
|
|
1228
|
+
if (hosted)
|
|
1229
|
+
return hosted;
|
|
1230
|
+
}
|
|
1231
|
+
}
|
|
1232
|
+
// `node.parent as Sub | undefined`: a union target whose class arm is
|
|
1233
|
+
// narrower than the stored class gets the same checked class view as
|
|
1234
|
+
// `node.parent as Sub`; the other arms keep their identical tags.
|
|
1235
|
+
if (target?.kind === "union" &&
|
|
1236
|
+
(inner.type.kind === "union" || inner.type.kind === "object") &&
|
|
1237
|
+
!typeEquals(target, inner.type)) {
|
|
1238
|
+
const asserted = checkedClassUnionAssertion(lowerer, inner, target, locOf(expr));
|
|
1239
|
+
if (asserted)
|
|
1240
|
+
return asserted;
|
|
1241
|
+
}
|
|
1242
|
+
return inner; // erasure, unchanged
|
|
1243
|
+
}
|
|
1244
|
+
// `value as never` is the escape hatch that makes an unknown value fit
|
|
1245
|
+
// any slot (`tagSuccess(value as never)`). No value has type never, so
|
|
1246
|
+
// checking against its placeholder layout would reject every value.
|
|
1247
|
+
// Erase it instead: the consuming slot applies the same validated
|
|
1248
|
+
// extraction an unknown value gets wherever the checker admits it.
|
|
1249
|
+
if (expr.type.kind === ts.SyntaxKind.NeverKeyword)
|
|
1250
|
+
return inner;
|
|
1251
|
+
const targetTs = lowerer.checker.getTypeFromTypeNode(expr.type);
|
|
1252
|
+
const target = lowerer.mapTypeOf(targetTs) ?? dynFallbackType(lowerer, expr.type, targetTs);
|
|
1253
|
+
if (!target)
|
|
1254
|
+
lowerer.badType(expr.type, targetTs);
|
|
1255
|
+
if (target.kind === "dyn")
|
|
1256
|
+
return inner; // `as unknown`: erasure
|
|
1257
|
+
// An all-`unknown`-fields record target (`err as { code?: unknown }`
|
|
1258
|
+
// — the errno-probing idiom): there is nothing to validate (every
|
|
1259
|
+
// field is unknown, exactly what the dyn value already answers) and
|
|
1260
|
+
// nothing to build — the cast is pure typing, so it ERASES and the
|
|
1261
|
+
// reads ride the dyn keyed read.
|
|
1262
|
+
if (target.kind === "record") {
|
|
1263
|
+
const shape = lowerer.shapes.get(target.shapeId);
|
|
1264
|
+
if (shape &&
|
|
1265
|
+
!shape.tuple &&
|
|
1266
|
+
shape.fields.every((f) => f.type.kind === "dyn") &&
|
|
1267
|
+
(!shape.indexValue || shape.indexValue.kind === "dyn")) {
|
|
1268
|
+
return inner;
|
|
1269
|
+
}
|
|
1270
|
+
}
|
|
1271
|
+
// The global object: the checked extraction would build a separate
|
|
1272
|
+
// value, so the assertion keeps the object and its member operations
|
|
1273
|
+
// reach it (assertion-identity.ts).
|
|
1274
|
+
if (extractionCopiesReference(lowerer, target) && assertsGlobalObject(lowerer, expr))
|
|
1275
|
+
return inner;
|
|
1276
|
+
if (target.kind === "void" ||
|
|
1277
|
+
!canDynCheckTo(target, (id) => lowerer.shapes.get(id), (id) => lowerer.unions.get(id))) {
|
|
1278
|
+
// Bare undefined-armed targets pass when every OTHER arm is
|
|
1279
|
+
// JSON-safe: the checked-dynamic tree holds a first-class undefined value now
|
|
1280
|
+
// (index-signature overflow reads produce it for missing keys), and
|
|
1281
|
+
// the undefined arm matches exactly it — `p[key] as string |
|
|
1282
|
+
// undefined` is the missing-key idiom. Parsed JSON still never
|
|
1283
|
+
// contains undefined, so casts over parse results keep failing on
|
|
1284
|
+
// non-string values with the usual path-annotated TypeError.
|
|
1285
|
+
if (target.kind === "union" && lowerer.dynConvertible(target)) {
|
|
1286
|
+
return { kind: "dynCheck", value: inner, type: target, loc: locOf(expr) };
|
|
1287
|
+
}
|
|
1288
|
+
// Uint8Array targets: the checked-dynamic tree carries a bytes kind now (converted
|
|
1289
|
+
// stdin chunks) — the extraction validates the kind and copies out.
|
|
1290
|
+
if (target.kind === "bytes" && target.elem === "u8") {
|
|
1291
|
+
return { kind: "dynCheck", value: inner, type: target, loc: locOf(expr) };
|
|
1292
|
+
}
|
|
1293
|
+
// Class instances round-trip only through compiler-owned typed
|
|
1294
|
+
// references. Plain JSON objects fail the runtime class-brand check;
|
|
1295
|
+
// exact capsules unwrap the original object by identity.
|
|
1296
|
+
if (isDynTypedRefType(target)) {
|
|
1297
|
+
return { kind: "dynCheck", value: inner, type: target, loc: locOf(expr) };
|
|
1298
|
+
}
|
|
1299
|
+
// ADAPTABLE function targets (`u as (x: number) => number` — the
|
|
1300
|
+
// checked-dynamic function boundary): kind check, then exact unwrap
|
|
1301
|
+
// or the per-target adapter shim. Non-adaptable signatures keep the
|
|
1302
|
+
// fence below.
|
|
1303
|
+
if (target.kind === "func" &&
|
|
1304
|
+
canAdaptDynFuncTo(target, (id) => lowerer.shapes.get(id), (id) => lowerer.unions.get(id))) {
|
|
1305
|
+
return { kind: "dynCheck", value: inner, type: target, loc: locOf(expr) };
|
|
1306
|
+
}
|
|
1307
|
+
// Runtime HANDLE targets (`u as IncomingMessage` — a boxed handle
|
|
1308
|
+
// coming back out of an untyped wrapper): a tag-checked reference
|
|
1309
|
+
// unwrap, identity preserved (DYN_HANDLE_KINDS).
|
|
1310
|
+
if (DYN_HANDLE_KINDS.has(target.kind)) {
|
|
1311
|
+
return { kind: "dynCheck", value: inner, type: target, loc: locOf(expr) };
|
|
1312
|
+
}
|
|
1313
|
+
// `value as NodeJS.ReadableStream`: the general stream classes take
|
|
1314
|
+
// the checked cast (general-streams.ts).
|
|
1315
|
+
requestGeneralStreamSurface(lowerer, expr);
|
|
1316
|
+
lowerer.unsupported("SC1090", expr, `a checked cast of 'unknown' to '${target.kind === "void" ? "void" : lowerer.fmt(target)}' ` +
|
|
1317
|
+
`(a dynamic value can only be validated against JSON-representable types: ` +
|
|
1318
|
+
`number, string, boolean, records, arrays, and unions of those)`);
|
|
1319
|
+
}
|
|
1320
|
+
return { kind: "dynCheck", value: inner, type: target, loc: locOf(expr) };
|
|
1321
|
+
}
|
|
1322
|
+
//# sourceMappingURL=narrowing.js.map
|