@scriptc/compiler 0.3.6 → 0.4.1
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 +717 -55
- 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 +20 -0
- package/dist/backend/executable-features.js.map +1 -1
- package/dist/backend/immutability.test.js +1 -1
- package/dist/backend/library-pack.js +9 -0
- package/dist/backend/library-pack.js.map +1 -1
- package/dist/backend/link-plan-core.d.ts +2 -0
- package/dist/backend/link-plan-core.js +2 -0
- package/dist/backend/link-plan-core.js.map +1 -1
- package/dist/backend/link-plan.d.ts +1 -0
- package/dist/backend/link-plan.js +1 -0
- package/dist/backend/link-plan.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.js +3 -1
- package/dist/backend/llvm/array-search.js.map +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 +38 -1
- package/dist/backend/llvm/classes.js +185 -35
- package/dist/backend/llvm/classes.js.map +1 -1
- package/dist/backend/llvm/classes.test.js +79 -17
- package/dist/backend/llvm/classes.test.js.map +1 -1
- package/dist/backend/llvm/common.d.ts +21 -3
- package/dist/backend/llvm/common.js +51 -3
- 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 +15 -4
- package/dist/backend/llvm/dense-array-access.js +125 -44
- package/dist/backend/llvm/dense-array-access.js.map +1 -1
- package/dist/backend/llvm/dense-array-access.test.js +63 -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 +37 -4
- package/dist/backend/llvm/dyn.js +354 -183
- 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 +1193 -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 +1557 -0
- package/dist/backend/llvm/emit-module.js.map +1 -0
- package/dist/backend/llvm/emit-statements.d.ts +59 -0
- package/dist/backend/llvm/emit-statements.js +2041 -0
- package/dist/backend/llvm/emit-statements.js.map +1 -0
- package/dist/backend/llvm/emitter.d.ts +566 -291
- package/dist/backend/llvm/emitter.js +728 -4671
- 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 +87 -56
- 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 +45 -24
- 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 +113 -66
- package/dist/backend/llvm/expr-dynamic.js.map +1 -1
- package/dist/backend/llvm/expr-primitives.js +124 -28
- package/dist/backend/llvm/expr-primitives.js.map +1 -1
- package/dist/backend/llvm/expr-primitives.test.js +57 -2
- package/dist/backend/llvm/expr-primitives.test.js.map +1 -1
- 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 +65 -27
- 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.js +3 -3
- package/dist/backend/llvm/integer-clones.js.map +1 -1
- 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/js-ic.d.ts +18 -0
- package/dist/backend/llvm/js-ic.js +712 -0
- package/dist/backend/llvm/js-ic.js.map +1 -0
- 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 +616 -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 +94 -53
- 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 +209 -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 +42 -33
- package/dist/backend/llvm/local-array-reads.js.map +1 -1
- 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.d.ts +20 -4
- package/dist/backend/llvm/map-number-lookup.js +45 -9
- package/dist/backend/llvm/map-number-lookup.js.map +1 -1
- 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 +215 -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 +7 -0
- package/dist/backend/llvm/publish.js +50 -19
- 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 +10 -7
- package/dist/backend/llvm/regions.js.map +1 -1
- package/dist/backend/llvm/regions.test.js +8 -2
- package/dist/backend/llvm/regions.test.js.map +1 -1
- package/dist/backend/llvm/shapes.d.ts +74 -45
- package/dist/backend/llvm/shapes.js +289 -28
- 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/speculative-integers.d.ts +20 -1
- package/dist/backend/llvm/speculative-integers.js +94 -6
- package/dist/backend/llvm/speculative-integers.js.map +1 -1
- package/dist/backend/llvm/speculative-integers.test.js +55 -1
- package/dist/backend/llvm/speculative-integers.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-reads.d.ts +1 -1
- package/dist/backend/llvm/string-reads.js +4 -4
- package/dist/backend/llvm/string-reads.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 +111 -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 +12 -0
- package/dist/backend/mangle.js +18 -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 +57 -0
- package/dist/backend/native/executable.js +211 -139
- package/dist/backend/native/executable.js.map +1 -1
- package/dist/backend/native/library.js +2 -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-codegen.d.ts +6 -0
- package/dist/backend/native-codegen.js +19 -0
- package/dist/backend/native-codegen.js.map +1 -1
- package/dist/backend/native-codegen.test.js +27 -0
- package/dist/backend/native-codegen.test.js.map +1 -1
- package/dist/backend/native-link-info-core.d.ts +48 -0
- package/dist/backend/native-link-info-core.js.map +1 -1
- package/dist/backend/native-profile.d.ts +32 -0
- package/dist/backend/native-profile.js +39 -0
- package/dist/backend/native-profile.js.map +1 -0
- package/dist/backend/native-profile.test.d.ts +1 -0
- package/dist/backend/native-profile.test.js +58 -0
- package/dist/backend/native-profile.test.js.map +1 -0
- package/dist/backend/native-tools.d.ts +14 -0
- package/dist/backend/native-tools.js +13 -0
- package/dist/backend/native-tools.js.map +1 -1
- package/dist/backend/publication.test.js +1 -1
- package/dist/backend/runtime-abi.d.ts +2 -2
- package/dist/backend/runtime-abi.js +2 -2
- package/dist/backend/runtime-pack-core.d.ts +13 -1
- package/dist/backend/runtime-pack-core.js +14 -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 +9 -1
- package/dist/backend/runtime-pack-targets.test.js.map +1 -1
- package/dist/backend/runtime-pack.test.js +9 -1
- 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 +15 -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 +8 -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 +106 -4
- package/dist/cli/command.js.map +1 -1
- package/dist/cli/host.d.ts +3 -0
- package/dist/cli/output-options.d.ts +2 -0
- package/dist/cli/output-options.js +9 -0
- package/dist/cli/output-options.js.map +1 -1
- package/dist/cli/usage.d.ts +21 -1
- package/dist/cli/usage.js +43 -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 +22 -0
- package/dist/contracts/check.js +25 -8
- 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 +27 -0
- package/dist/executable/executable-cache.js +19 -1
- package/dist/executable/executable-cache.js.map +1 -1
- package/dist/executable/executable-cache.test.js +12 -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/arguments-usage.d.ts +8 -0
- package/dist/frontend/arguments-usage.js +98 -0
- package/dist/frontend/arguments-usage.js.map +1 -1
- package/dist/frontend/arguments-usage.test.d.ts +1 -0
- package/dist/frontend/arguments-usage.test.js +32 -0
- package/dist/frontend/arguments-usage.test.js.map +1 -0
- 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/builtin-package-aliases.d.ts +24 -0
- package/dist/frontend/builtin-package-aliases.js +133 -0
- package/dist/frontend/builtin-package-aliases.js.map +1 -0
- package/dist/frontend/builtin-package-aliases.test.d.ts +1 -0
- package/dist/frontend/builtin-package-aliases.test.js +48 -0
- package/dist/frontend/builtin-package-aliases.test.js.map +1 -0
- 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/dts-paths.d.ts +4 -0
- package/dist/frontend/dts-paths.js +9 -1
- package/dist/frontend/dts-paths.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 +31 -0
- package/dist/frontend/lowering/builtins/builtin-class-dyn.js +205 -0
- package/dist/frontend/lowering/builtins/builtin-class-dyn.js.map +1 -0
- package/dist/frontend/lowering/builtins/callable-aliases.js +17 -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 +22 -0
- package/dist/frontend/lowering/builtins/crypto.js +215 -38
- 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/ecdh.d.ts +10 -0
- package/dist/frontend/lowering/builtins/ecdh.js +208 -0
- package/dist/frontend/lowering/builtins/ecdh.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 +284 -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 +41 -1
- package/dist/frontend/lowering/builtins/process.js +505 -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 +40 -0
- package/dist/frontend/lowering/builtins/promisify-callback.js +338 -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 +42 -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 +79 -30
- package/dist/frontend/lowering/builtins/timers.js.map +1 -1
- package/dist/frontend/lowering/builtins/typed-array-members.d.ts +7 -0
- package/dist/frontend/lowering/builtins/typed-array-members.js +160 -0
- package/dist/frontend/lowering/builtins/typed-array-members.js.map +1 -0
- 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 +23 -1
- package/dist/frontend/lowering/call-signatures.js +379 -55
- 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 +561 -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 +1124 -90
- 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.d.ts +10 -0
- package/dist/frontend/lowering/class-protocols.js +76 -45
- 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 +86 -19
- 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 +264 -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/fresh-spread.d.ts +13 -0
- package/dist/frontend/lowering/coercions/fresh-spread.js +95 -0
- package/dist/frontend/lowering/coercions/fresh-spread.js.map +1 -0
- package/dist/frontend/lowering/coercions/function-adapters.d.ts +16 -2
- package/dist/frontend/lowering/coercions/function-adapters.js +239 -68
- 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 +17 -0
- package/dist/frontend/lowering/containers/array-callbacks.js +287 -118
- 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 +58 -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 +94 -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.d.ts +9 -0
- package/dist/frontend/lowering/containers/bytes.js +649 -113
- 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 +126 -28
- 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 +455 -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 +30 -10
- package/dist/frontend/lowering/cycle-initialization.js +191 -35
- 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 +723 -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 +2557 -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 +1804 -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 +52 -0
- package/dist/frontend/lowering/expressions/keyed-field-targets.js +307 -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 +1337 -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 +301 -86
- package/dist/frontend/lowering/expressions/object-literals.js.map +1 -1
- package/dist/frontend/lowering/expressions/optional-chains.d.ts +3 -2
- package/dist/frontend/lowering/expressions/optional-chains.js +103 -17
- package/dist/frontend/lowering/expressions/optional-chains.js.map +1 -1
- package/dist/frontend/lowering/expressions/property-access.d.ts +115 -0
- package/dist/frontend/lowering/expressions/property-access.js +3787 -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 +1724 -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 +551 -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-delegation.d.ts +8 -0
- package/dist/frontend/lowering/generator-delegation.js +191 -1
- package/dist/frontend/lowering/generator-delegation.js.map +1 -1
- 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 +43 -0
- package/dist/frontend/lowering/generic-functions.js +593 -118
- package/dist/frontend/lowering/generic-functions.js.map +1 -1
- package/dist/frontend/lowering/handle-properties.d.ts +24 -0
- package/dist/frontend/lowering/handle-properties.js +281 -0
- package/dist/frontend/lowering/handle-properties.js.map +1 -0
- 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/iterable-spelling.d.ts +7 -0
- package/dist/frontend/lowering/iterable-spelling.js +38 -0
- package/dist/frontend/lowering/iterable-spelling.js.map +1 -0
- 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-array-sort.d.ts +33 -15
- package/dist/frontend/lowering/lower-array-sort.js +117 -21
- package/dist/frontend/lowering/lower-array-sort.js.map +1 -1
- package/dist/frontend/lowering/lower-array-sort.test.js +93 -14
- package/dist/frontend/lowering/lower-array-sort.test.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 +33 -3
- package/dist/frontend/lowering/lower-builtin-values.js.map +1 -1
- package/dist/frontend/lowering/lower-calls.js +1404 -448
- package/dist/frontend/lowering/lower-calls.js.map +1 -1
- package/dist/frontend/lowering/lower-classes.d.ts +54 -3
- package/dist/frontend/lowering/lower-classes.js +1529 -472
- 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 +241 -21
- 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 +1509 -12486
- package/dist/frontend/lowering/lower-exprs.js.map +1 -1
- package/dist/frontend/lowering/lower-functions.js +72 -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 +39 -20
- 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 +900 -107
- 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.d.ts +11 -3
- package/dist/frontend/lowering/lower-modules.js +445 -94
- 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 +65 -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 +514 -101
- 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 +179 -118
- package/dist/frontend/lowering/lower-stdlib.js.map +1 -1
- package/dist/frontend/lowering/lower-stmts.d.ts +30 -7
- package/dist/frontend/lowering/lower-stmts.js +1950 -433
- 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 +96 -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 +424 -27
- package/dist/frontend/lowering/lowerer.js +2062 -310
- 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/rebindable-functions.d.ts +8 -0
- package/dist/frontend/lowering/rebindable-functions.js +54 -0
- package/dist/frontend/lowering/rebindable-functions.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/static-typeof.d.ts +26 -0
- package/dist/frontend/lowering/static-typeof.js +133 -0
- package/dist/frontend/lowering/static-typeof.js.map +1 -0
- 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 +13 -12
- 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 +282 -45
- 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/thenables.d.ts +16 -0
- package/dist/frontend/lowering/thenables.js +124 -0
- package/dist/frontend/lowering/thenables.js.map +1 -0
- 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-builtin-aliases.d.ts +8 -0
- package/dist/frontend/npm-static-builtin-aliases.js +65 -0
- package/dist/frontend/npm-static-builtin-aliases.js.map +1 -0
- package/dist/frontend/npm-static-bundled-chunks.d.ts +58 -0
- package/dist/frontend/npm-static-bundled-chunks.js +981 -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 +399 -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 +988 -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 +336 -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-enum-iife.d.ts +6 -0
- package/dist/frontend/npm-static-enum-iife.js +280 -0
- package/dist/frontend/npm-static-enum-iife.js.map +1 -0
- package/dist/frontend/npm-static-enum-iife.test.d.ts +1 -0
- package/dist/frontend/npm-static-enum-iife.test.js +116 -0
- package/dist/frontend/npm-static-enum-iife.test.js.map +1 -0
- 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 +25 -1
- package/dist/frontend/npm-static.js +212 -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/npm.js +13 -0
- package/dist/frontend/npm.js.map +1 -1
- package/dist/frontend/package-shims.d.ts +47 -0
- package/dist/frontend/package-shims.js +300 -0
- package/dist/frontend/package-shims.js.map +1 -0
- package/dist/frontend/pipeline.js +230 -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 +100 -2
- package/dist/frontend/program.js +1627 -262
- 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 +49 -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 +26 -1
- package/dist/frontend/services.js +59 -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 +10 -5
- package/dist/frontend/ts7/program-host.js +19 -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 +57 -24
- package/dist/frontend/ts7/semantic-model.js +114 -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 +30 -15
- 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 +2735 -723
- 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 +4 -1
- package/dist/index.js +87 -8
- 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 +31 -0
- package/dist/ir/array-length-stability.js +249 -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 +134 -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 +116 -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 +540 -29
- 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 +7 -0
- package/dist/ir/integer-loop-facts.js +103 -17
- 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 +13 -1
- package/dist/ir/integer-ranges.js +125 -26
- package/dist/ir/integer-ranges.js.map +1 -1
- package/dist/ir/integer-ranges.test.js +273 -2
- 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 +127 -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/js-ic.d.ts +52 -0
- package/dist/ir/js-ic.js +199 -0
- package/dist/ir/js-ic.js.map +1 -0
- package/dist/ir/js-ic.test.d.ts +1 -0
- package/dist/ir/js-ic.test.js +148 -0
- package/dist/ir/js-ic.test.js.map +1 -0
- package/dist/ir/jsval.d.ts +8 -0
- package/dist/ir/jsval.js +399 -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 +183 -33
- package/dist/ir/runtime-features.js +795 -422
- 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 +201 -150
- 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 +196 -76
- package/dist/ir/validate.js.map +1 -1
- package/dist/ir/validate.test.js +41 -11
- 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 +14 -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 +22 -0
- package/dist/native/cli.js.map +1 -1
- package/dist/native/compiler.js +35 -6
- package/dist/native/compiler.js.map +1 -1
- package/dist/native/compiler.test.js +2 -2
- package/dist/native/executable-cache.js +3 -0
- package/dist/native/executable-cache.js.map +1 -1
- package/dist/native/prepare.js +10 -0
- package/dist/native/prepare.js.map +1 -1
- package/dist/native/sanitizer.test.js +19 -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 +22 -20
- package/shims/fs-extra/core/api.ts +1192 -0
- package/shims/fs-extra/index.ts +9 -0
- package/shims/undici/core/agent.ts +163 -0
- package/shims/undici/core/api.ts +93 -0
- package/shims/undici/core/client.ts +1304 -0
- package/shims/undici/core/connector.ts +157 -0
- package/shims/undici/core/diagnostics-types.ts +68 -0
- package/shims/undici/core/diagnostics.ts +16 -0
- package/shims/undici/core/dispatcher.ts +574 -0
- package/shims/undici/core/errors-v5.ts +22 -0
- package/shims/undici/core/errors-v7.ts +25 -0
- package/shims/undici/core/errors.ts +255 -0
- package/shims/undici/core/fetch.ts +635 -0
- package/shims/undici/core/pool.ts +280 -0
- package/shims/undici/core/readable.ts +268 -0
- package/shims/undici/core/request.ts +313 -0
- package/shims/undici/core/timers.ts +80 -0
- package/shims/undici/core/types.ts +167 -0
- package/shims/undici/core/util.ts +67 -0
- package/shims/undici/v5.ts +119 -0
- package/shims/undici/v7.ts +119 -0
- package/surface-manifest.json +304 -22
|
@@ -0,0 +1,1804 @@
|
|
|
1
|
+
/* Element reads and writes (`a[i]`, `a[i] = v`), compound element updates, and keyed record reads. */
|
|
2
|
+
import * as ts from "../../ts7/adapter.js";
|
|
3
|
+
import { jsFuncNameOf, neverTaintedJsType } from "../lowerer.js";
|
|
4
|
+
import { BOOL, DYN, F64, NULL_T, STRING, UNDEFINED_T, VOID, canBoxFuncIntoDyn, canDynCheckTo, isDynTypedRefType, isUnitType, shapeHasAccessorSlots, typeEquals, } from "../../../ir/ir.js";
|
|
5
|
+
import { importMetaField, isImportMeta } from "../import-meta.js";
|
|
6
|
+
import { hasOptionalChainGuard, isOptionalChainTail } from "./optional-chains.js";
|
|
7
|
+
import { lowerEnumAccess } from "../lower-enums.js";
|
|
8
|
+
import { fenceNodeModuleMutation, lowerRequireCacheElement } from "../lower-node-module.js";
|
|
9
|
+
import { lowerModuleNamespaceElement } from "../module-namespace-elements.js";
|
|
10
|
+
import { stdlibGlobalNameOf } from "../surfaces.js";
|
|
11
|
+
import { globalSymbolKey } from "./global-symbols.js";
|
|
12
|
+
import { isJsSourceFile, locOf } from "../../program.js";
|
|
13
|
+
import { lowerGlobalValue } from "../lower-global-value.js";
|
|
14
|
+
import { expandoMemberRead } from "../lower-expando.js";
|
|
15
|
+
import { assertedElementKeepsUndefined, compoundUnsupported, concatOperand, dynCompoundValue, hasClassPayload, lowerDynMemberAssignment, lowerOptionalArrayIndexRead, lowerOptionalNumber, recordKeyResultOk, representedClassFieldTarget, runtimeOptionalElementKey, symbolFieldTarget, } from "../lower-exprs.js";
|
|
16
|
+
import { hasRuntimeStatics } from "../class-runtime-statics.js";
|
|
17
|
+
import { tryLowerExpression } from "./try-lower-expression.js";
|
|
18
|
+
import { classFieldTarget, lowerUnionKeyedRead } from "./property-access.js";
|
|
19
|
+
import { arrayNumberRead, arrayValueRead, arrayValueStore, arrayValueType, lowerSafeBytesRead, lowerSafeIndexRead, } from "../array-values.js";
|
|
20
|
+
import { lowerOptionalStringIndex, lowerUnionStringIndex } from "../string-index.js";
|
|
21
|
+
import { InternalCompilerError } from "../../../errors.js";
|
|
22
|
+
import { dynUndefinedExpr, nodeThrowExpr, numLit, strLit, varRef } from "../../../ir/build.js";
|
|
23
|
+
import { npmStaticPackageOfPath } from "../../npm-static.js";
|
|
24
|
+
import { isSafeToRepeat } from "./evaluation-safety.js";
|
|
25
|
+
import { lowerClassPrototypeComputedAssignment } from "../class-prototypes.js";
|
|
26
|
+
import { isClassCallback } from "../class-callbacks.js";
|
|
27
|
+
import { isKeyedFieldAccess } from "./keyed-field-targets.js";
|
|
28
|
+
import { lowerFieldCompoundValue } from "./updates.js";
|
|
29
|
+
/** `a[i]` reads. Only f64 indices into array receivers are modeled; JS
|
|
30
|
+
* string-key element access (`a["length"]`) and string indexing (`s[0]`
|
|
31
|
+
* typechecks against the lib's index signature; use .charAt) stay out. */
|
|
32
|
+
export function lowerElementAccess(lowerer, expr) {
|
|
33
|
+
if (isImportMeta(expr.expression)) {
|
|
34
|
+
const name = lowerer.foldedStringKeyOf(expr.argumentExpression);
|
|
35
|
+
if (name === null)
|
|
36
|
+
lowerer.unsupported("SC1090", expr, "import.meta with a runtime-computed key (use a statically-known metadata field)");
|
|
37
|
+
return importMetaField(lowerer, expr, name);
|
|
38
|
+
}
|
|
39
|
+
// `a?.[i]`: the guard lowers as an optional-chain step around the
|
|
40
|
+
// plain element read below.
|
|
41
|
+
if (expr.questionDotToken && !lowerer.chainHandled.has(expr)) {
|
|
42
|
+
return lowerer.lowerOptionalChain(expr);
|
|
43
|
+
}
|
|
44
|
+
// `a?.b[i]` — the tail of a chain whose token sits deeper: the whole
|
|
45
|
+
// tail short-circuits with the guard.
|
|
46
|
+
if (!expr.questionDotToken && isOptionalChainTail(lowerer, expr)) {
|
|
47
|
+
return lowerer.lowerOptionalChain(expr);
|
|
48
|
+
}
|
|
49
|
+
// Enum accesses in element clothing — `E["A"]` forward reads and
|
|
50
|
+
// `E[0]` reverse-mapping reads — fold to constants (lower-enums.ts),
|
|
51
|
+
// claimed before any receiver-kind dispatch can see the enum object.
|
|
52
|
+
{
|
|
53
|
+
const en = lowerEnumAccess(lowerer, expr);
|
|
54
|
+
if (en)
|
|
55
|
+
return en;
|
|
56
|
+
}
|
|
57
|
+
const cachedModule = lowerRequireCacheElement(lowerer, expr);
|
|
58
|
+
if (cachedModule)
|
|
59
|
+
return cachedModule;
|
|
60
|
+
const namespaceElement = lowerModuleNamespaceElement(lowerer, expr);
|
|
61
|
+
if (namespaceElement)
|
|
62
|
+
return namespaceElement;
|
|
63
|
+
// Native Web handles use the same supported surface for bracket and dot
|
|
64
|
+
// spellings. Fence a statically-known unsupported key before the generic
|
|
65
|
+
// checked-dynamic element-read path can turn it into a runtime missing
|
|
66
|
+
// member.
|
|
67
|
+
lowerer.fenceStaticAbortControllerMemberRead(expr);
|
|
68
|
+
lowerer.fenceStaticResponseMember(expr, "read");
|
|
69
|
+
lowerer.fenceStaticHeadersMember(expr, "read");
|
|
70
|
+
lowerer.fenceStaticReadableStreamMember(expr, "read");
|
|
71
|
+
// Computed global reads share the stored global object's custom
|
|
72
|
+
// properties. Symbol keys retain their identity-indexed store.
|
|
73
|
+
if (!expr.questionDotToken && stdlibGlobalNameOf(lowerer, expr.expression) === "globalThis") {
|
|
74
|
+
const symbol = globalSymbolKey(lowerer, expr.expression, expr.argumentExpression);
|
|
75
|
+
if (symbol)
|
|
76
|
+
return {
|
|
77
|
+
kind: "libCall",
|
|
78
|
+
fn: "dyn.globalSymbolGet",
|
|
79
|
+
args: [symbol],
|
|
80
|
+
type: DYN,
|
|
81
|
+
loc: locOf(expr),
|
|
82
|
+
};
|
|
83
|
+
const key = lowerer.lowerExpr(expr.argumentExpression);
|
|
84
|
+
const name = key.type.kind === "string"
|
|
85
|
+
? key
|
|
86
|
+
: {
|
|
87
|
+
kind: "libCall",
|
|
88
|
+
fn: "dyn.toStringCoerce",
|
|
89
|
+
args: [lowerer.coerceInto(expr.argumentExpression, key, DYN)],
|
|
90
|
+
type: STRING,
|
|
91
|
+
loc: locOf(expr),
|
|
92
|
+
};
|
|
93
|
+
return {
|
|
94
|
+
kind: "dynKeyGet",
|
|
95
|
+
value: lowerGlobalValue(lowerer, expr.expression),
|
|
96
|
+
key: name,
|
|
97
|
+
type: DYN,
|
|
98
|
+
loc: locOf(expr),
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
// `req.headers["x-name"]` — the computed twin of `req.headers.host`
|
|
102
|
+
// (the server spoke owns both; the envGet precedent).
|
|
103
|
+
{
|
|
104
|
+
const header = lowerer.lowerHttpHeadersElement(expr);
|
|
105
|
+
if (header)
|
|
106
|
+
return lowerer.maybeNarrow(header, expr);
|
|
107
|
+
}
|
|
108
|
+
// `process.env[expr]` — the computed twin of `process.env.NAME`; both
|
|
109
|
+
// lower to the ONE process.envGet intrinsic. The read narrows like any
|
|
110
|
+
// union-typed expression when the checker narrowed this occurrence.
|
|
111
|
+
if (lowerer.isProcessEnv(expr.expression)) {
|
|
112
|
+
const key = lowerEnvironmentKey(lowerer, expr.argumentExpression);
|
|
113
|
+
if (key.type.kind !== "string") {
|
|
114
|
+
lowerer.unsupported("SC1090", expr.argumentExpression, "indexing process.env with non-string keys");
|
|
115
|
+
}
|
|
116
|
+
const get = {
|
|
117
|
+
kind: "libCall",
|
|
118
|
+
fn: "process.envGet",
|
|
119
|
+
args: [key],
|
|
120
|
+
type: lowerer.envValueType(),
|
|
121
|
+
loc: locOf(expr),
|
|
122
|
+
};
|
|
123
|
+
return lowerer.maybeNarrow(get, expr);
|
|
124
|
+
}
|
|
125
|
+
// Expando function members in element clothing (`foo[strMem]`,
|
|
126
|
+
// `foo[_private]` where foo is a module-level function/callable const
|
|
127
|
+
// and the key folds or is a unique-symbol const): the member's module
|
|
128
|
+
// global — the dotted read's twin (lower-expando.ts).
|
|
129
|
+
{
|
|
130
|
+
const ex = expandoMemberRead(lowerer, expr);
|
|
131
|
+
if (ex)
|
|
132
|
+
return lowerer.maybeNarrow(ex, expr);
|
|
133
|
+
}
|
|
134
|
+
// Symbol-keyed property READS (`this[kLimit]`): when the key is a
|
|
135
|
+
// statically-resolvable symbol declared as a field of the receiver's
|
|
136
|
+
// class (classSymbolKeyOf — the countdown.js/OpenTUI idioms), the
|
|
137
|
+
// read IS an ordinary field read of the hidden slot. Every other
|
|
138
|
+
// symbol key stays fenced: record shapes, runtime-identity keys
|
|
139
|
+
// (symbol parameters, reassigned bindings), and keys no class declares
|
|
140
|
+
// — the layouts are compile-time field lists.
|
|
141
|
+
if (lowerer.mapTypeOf(lowerer.typeOf(expr.argumentExpression))?.kind === "symbol") {
|
|
142
|
+
const target = symbolFieldTarget(lowerer, expr);
|
|
143
|
+
if (target)
|
|
144
|
+
return lowerer.maybeNarrow(lowerer.fieldGetExpr(target, locOf(expr), expr), expr);
|
|
145
|
+
let receiver = lowerer.lowerExpr(expr.expression);
|
|
146
|
+
const classInfo = receiver.type.kind === "classval" ? lowerer.classes.get(receiver.type.className) : undefined;
|
|
147
|
+
if (receiver.type.kind === "func" ||
|
|
148
|
+
receiver.type.kind === "generator" ||
|
|
149
|
+
((receiver.type.kind === "array" ||
|
|
150
|
+
receiver.type.kind === "string" ||
|
|
151
|
+
receiver.type.kind === "bytes") &&
|
|
152
|
+
lowerer.dynConvertible(receiver.type)) ||
|
|
153
|
+
(receiver.type.kind === "object" && lowerer.dynConvertible(receiver.type)) ||
|
|
154
|
+
isDynTypedRefType(receiver.type) ||
|
|
155
|
+
(classInfo && (classInfo.callableBase || hasRuntimeStatics(classInfo))) ||
|
|
156
|
+
((receiver.type.kind === "map" || receiver.type.kind === "set") &&
|
|
157
|
+
lowerer.dynConvertible(receiver.type))) {
|
|
158
|
+
const fnName = jsFuncNameOf(expr.expression);
|
|
159
|
+
receiver = {
|
|
160
|
+
kind: "dynFrom",
|
|
161
|
+
value: receiver,
|
|
162
|
+
type: DYN,
|
|
163
|
+
loc: locOf(expr),
|
|
164
|
+
...(fnName !== null ? { fnName } : {}),
|
|
165
|
+
};
|
|
166
|
+
}
|
|
167
|
+
if (receiver.type.kind === "dyn") {
|
|
168
|
+
const key = lowerer.lowerExprExpecting(expr.argumentExpression, DYN);
|
|
169
|
+
return lowerer.maybeNarrow({ kind: "dynKeyGet", value: receiver, key, type: DYN, loc: locOf(expr) }, expr);
|
|
170
|
+
}
|
|
171
|
+
lowerer.unsupported("SC1090", expr, "symbol-keyed property access outside class fields keyed by a stable module-level literal Symbol()/Symbol.for() (other static shapes have no symbol-keyed storage)");
|
|
172
|
+
}
|
|
173
|
+
// A never-tainted JS receiver type (neverTaintedJsType — `cmd[1]` on
|
|
174
|
+
// `const cmd = ['pwd', []]`, whose binding lowered checked-dynamic)
|
|
175
|
+
// dispatches as unmapped so the dyn-receiver branch below reads
|
|
176
|
+
// through the checked-dynamic tree instead of dynChecking into never's f64 residue.
|
|
177
|
+
let receiverIr = neverTaintedJsType(lowerer, expr.expression, lowerer.typeOf(expr.expression))
|
|
178
|
+
? null
|
|
179
|
+
: lowerer.mapTypeOf(lowerer.typeOf(expr.expression));
|
|
180
|
+
if (isJsSourceFile(ts.getSourceFileOfNode(expr))) {
|
|
181
|
+
const receiver = tryLowerExpression(lowerer, expr.expression);
|
|
182
|
+
if (receiver?.type.kind === "dyn") {
|
|
183
|
+
const key = lowerer.lowerExprExpecting(expr.argumentExpression, DYN);
|
|
184
|
+
const optional = hasOptionalChainGuard(expr.expression, lowerer);
|
|
185
|
+
return lowerer.maybeNarrow({
|
|
186
|
+
kind: "dynKeyGet",
|
|
187
|
+
value: receiver,
|
|
188
|
+
key,
|
|
189
|
+
...(optional ? { optional: true } : {}),
|
|
190
|
+
type: DYN,
|
|
191
|
+
loc: locOf(expr),
|
|
192
|
+
}, expr);
|
|
193
|
+
}
|
|
194
|
+
if (receiver?.type.kind === "func" && lowerer.dynConvertible(receiver.type)) {
|
|
195
|
+
const loc = locOf(expr);
|
|
196
|
+
const fnName = jsFuncNameOf(expr.expression);
|
|
197
|
+
const boxed = {
|
|
198
|
+
kind: "dynFrom",
|
|
199
|
+
value: receiver,
|
|
200
|
+
type: DYN,
|
|
201
|
+
loc,
|
|
202
|
+
...(fnName !== null ? { fnName } : {}),
|
|
203
|
+
};
|
|
204
|
+
const key = lowerer.lowerExprExpecting(expr.argumentExpression, DYN);
|
|
205
|
+
return lowerer.maybeNarrow({ kind: "dynKeyGet", key, value: boxed, type: DYN, loc }, expr);
|
|
206
|
+
}
|
|
207
|
+
if (receiver?.type.kind === "array" || receiver?.type.kind === "bytes")
|
|
208
|
+
receiverIr = receiver.type;
|
|
209
|
+
if (receiver?.type.kind === "union") {
|
|
210
|
+
const present = lowerer.stripUndefinedArm(receiver.type);
|
|
211
|
+
if (present.kind === "array" || present.kind === "bytes")
|
|
212
|
+
receiverIr = present;
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
// A readonly tuple union under Array.isArray is checker-typed as an
|
|
216
|
+
// intersection with any[], whose structural mapping is not the tuple
|
|
217
|
+
// shape. maybeNarrow on the receiver uses the runtime tag proof to
|
|
218
|
+
// extract the one array-valued arm; dispatch element access from that
|
|
219
|
+
// lowered representation, like the existing any[] array-method path.
|
|
220
|
+
const checkerArray = lowerer.checkerArrayValue(expr.expression);
|
|
221
|
+
if (checkerArray)
|
|
222
|
+
receiverIr = checkerArray.type;
|
|
223
|
+
if (receiverIr?.kind === "object") {
|
|
224
|
+
const key = recordKeyLiteralText(expr.argumentExpression) ??
|
|
225
|
+
recordKeyTypeLiteralText(lowerer, expr.argumentExpression);
|
|
226
|
+
if (key !== null) {
|
|
227
|
+
const target = classFieldTarget(lowerer, expr.expression, receiverIr, key);
|
|
228
|
+
if (target)
|
|
229
|
+
return lowerer.maybeNarrow(lowerer.fieldGetExpr(target, locOf(expr), expr), expr);
|
|
230
|
+
}
|
|
231
|
+
if (receiverIr.className === "%Error" || isDynTypedRefType(receiverIr)) {
|
|
232
|
+
const receiver = lowerer.coerceToExpected(lowerer.lowerExpr(expr.expression), DYN);
|
|
233
|
+
const key = lowerer.lowerExprExpecting(expr.argumentExpression, DYN);
|
|
234
|
+
return lowerer.maybeNarrow({ kind: "dynKeyGet", value: receiver, key, type: DYN, loc: locOf(expr) }, expr);
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
// Typed-array element read `b[i]` — like arrayGet with a scalar
|
|
238
|
+
// result; any invalid index traps (the array discipline; JS would
|
|
239
|
+
// read undefined — divergence 4's policy).
|
|
240
|
+
if (receiverIr?.kind === "bytes") {
|
|
241
|
+
let recv = lowerer.lowerExpr(expr.expression);
|
|
242
|
+
if (recv.type.kind === "dyn")
|
|
243
|
+
recv = lowerer.coerceInto(expr.expression, recv, receiverIr);
|
|
244
|
+
if (recv.type.kind === "union" && lowerer.armTag(recv.type.unionId, UNDEFINED_T) >= 0) {
|
|
245
|
+
const present = lowerer.stripUndefinedArm(recv.type);
|
|
246
|
+
const helper = present.kind === "bytes"
|
|
247
|
+
? lowerer.narrowedArmHelper(recv.type.unionId, present, locOf(expr.expression))
|
|
248
|
+
: null;
|
|
249
|
+
recv = helper
|
|
250
|
+
? lowerer.checkedNarrowCall(helper, recv, present, locOf(expr.expression))
|
|
251
|
+
: lowerer.maybeNarrow(recv, expr.expression);
|
|
252
|
+
}
|
|
253
|
+
const index = lowerOptionalNumber(lowerer, lowerer.lowerExpr(expr.argumentExpression), locOf(expr.argumentExpression), expr.argumentExpression);
|
|
254
|
+
if (isJsSourceFile(ts.getSourceFileOfNode(expr)) && recv.type.kind === "bytes") {
|
|
255
|
+
return {
|
|
256
|
+
kind: "dynKeyGet",
|
|
257
|
+
value: lowerer.coerceInto(expr.expression, recv, DYN),
|
|
258
|
+
key: index.type.kind === "f64"
|
|
259
|
+
? { kind: "toString", operand: index, type: STRING, loc: locOf(expr) }
|
|
260
|
+
: index,
|
|
261
|
+
type: DYN,
|
|
262
|
+
loc: locOf(expr),
|
|
263
|
+
};
|
|
264
|
+
}
|
|
265
|
+
if (index.type.kind === "dyn" && recv.type.kind === "bytes") {
|
|
266
|
+
return {
|
|
267
|
+
kind: "dynKeyGet",
|
|
268
|
+
value: lowerer.coerceInto(expr.expression, recv, DYN),
|
|
269
|
+
key: index,
|
|
270
|
+
type: DYN,
|
|
271
|
+
loc: locOf(expr),
|
|
272
|
+
};
|
|
273
|
+
}
|
|
274
|
+
if (index.type.kind !== "f64") {
|
|
275
|
+
lowerer.unsupported("SC1090", expr.argumentExpression, "indexing with non-number keys");
|
|
276
|
+
}
|
|
277
|
+
// `t[i]!` asserts presence: the numeric element read (NaN when
|
|
278
|
+
// invalid). Every other read answers undefined for an invalid index,
|
|
279
|
+
// like Node.
|
|
280
|
+
// A read whose every consumer treats undefined like NaN (see
|
|
281
|
+
// nan-coded-reads.ts) is the same plain numeric read.
|
|
282
|
+
if ((ts.isNonNullExpression(expr.parent) && expr.parent.expression === expr) ||
|
|
283
|
+
lowerer.nanCodedReads?.isNumericRead(expr) === true) {
|
|
284
|
+
return {
|
|
285
|
+
kind: "bytesIntrinsic",
|
|
286
|
+
method: "get",
|
|
287
|
+
receiver: recv,
|
|
288
|
+
args: [index],
|
|
289
|
+
type: F64,
|
|
290
|
+
loc: locOf(expr),
|
|
291
|
+
invalidNaN: true,
|
|
292
|
+
};
|
|
293
|
+
}
|
|
294
|
+
return lowerSafeBytesRead(lowerer, recv, index, locOf(expr));
|
|
295
|
+
}
|
|
296
|
+
// Tuple element read `t[0]`: a positional-field read of the tuple's
|
|
297
|
+
// record shape — LITERAL indices only (the checker's per-index types
|
|
298
|
+
// are what make the read honest; a dynamic index over a heterogeneous
|
|
299
|
+
// shape has no single element type). Narrows like any field read.
|
|
300
|
+
if (receiverIr?.kind === "record") {
|
|
301
|
+
const shape = lowerer.shapes.get(receiverIr.shapeId);
|
|
302
|
+
if (shape?.tuple) {
|
|
303
|
+
let obj = lowerer.lowerExpr(expr.expression);
|
|
304
|
+
if (obj.type.kind === "dyn") {
|
|
305
|
+
// Object.entries over a checked value stores each pair in the
|
|
306
|
+
// dynamic tree even when the checker names a tuple type.
|
|
307
|
+
const key = lowerRecordPropertyKey(lowerer, lowerer.lowerExpr(expr.argumentExpression), expr.argumentExpression);
|
|
308
|
+
const optional = hasOptionalChainGuard(expr.expression, lowerer);
|
|
309
|
+
return lowerer.maybeNarrow({
|
|
310
|
+
kind: "dynKeyGet",
|
|
311
|
+
value: obj,
|
|
312
|
+
key,
|
|
313
|
+
...(optional ? { optional: true } : {}),
|
|
314
|
+
type: DYN,
|
|
315
|
+
loc: locOf(expr),
|
|
316
|
+
}, expr);
|
|
317
|
+
}
|
|
318
|
+
if (obj.type.kind === "union" && lowerer.armTag(obj.type.unionId, UNDEFINED_T) >= 0) {
|
|
319
|
+
// The checker sees the outer `arrays[i]` as a tuple when
|
|
320
|
+
// noUncheckedIndexedAccess is disabled, but the lowered read is
|
|
321
|
+
// still tuple | undefined. A nested tuple field must validate the
|
|
322
|
+
// outer tag before recordGet; an unchecked unionNarrow would let a
|
|
323
|
+
// missing outer element reach the record backend as a bad pointer.
|
|
324
|
+
const present = lowerer.stripUndefinedArm(obj.type);
|
|
325
|
+
const helper = present.kind === "record"
|
|
326
|
+
? lowerer.narrowedArmHelper(obj.type.unionId, present, locOf(expr.expression))
|
|
327
|
+
: null;
|
|
328
|
+
obj = helper
|
|
329
|
+
? lowerer.checkedNarrowCall(helper, obj, present, locOf(expr.expression))
|
|
330
|
+
: lowerer.maybeNarrow(obj, expr.expression);
|
|
331
|
+
}
|
|
332
|
+
const idx = tupleLiteralIndex(expr.argumentExpression);
|
|
333
|
+
if (idx === null) {
|
|
334
|
+
lowerer.unsupported("SC1090", expr.argumentExpression, "tuple indexing with a non-literal index (tuples are fixed-shape — use t[0], t[1], ...)");
|
|
335
|
+
}
|
|
336
|
+
const shapeId = obj.type.kind === "record" ? obj.type.shapeId : receiverIr.shapeId;
|
|
337
|
+
const actualShape = lowerer.shapes.get(shapeId) ?? shape;
|
|
338
|
+
const fieldType = actualShape.fields.find((f) => f.name === String(idx))?.type;
|
|
339
|
+
if (fieldType === undefined)
|
|
340
|
+
lowerer.badType(expr, lowerer.typeOf(expr)); // OOB smuggled past tsc
|
|
341
|
+
const get = {
|
|
342
|
+
kind: "recordGet",
|
|
343
|
+
obj,
|
|
344
|
+
shapeId,
|
|
345
|
+
field: String(idx),
|
|
346
|
+
type: fieldType,
|
|
347
|
+
loc: locOf(expr),
|
|
348
|
+
};
|
|
349
|
+
return lowerer.isRuntimeOptionalField(shapeId, String(idx))
|
|
350
|
+
? get
|
|
351
|
+
: lowerer.maybeNarrow(get, expr);
|
|
352
|
+
}
|
|
353
|
+
if (shape && !shape.tuple) {
|
|
354
|
+
return lowerer.lowerRecordKeyRead(expr, receiverIr.shapeId, shape);
|
|
355
|
+
}
|
|
356
|
+
}
|
|
357
|
+
// `pkg["k"]` / `scripts[name]` / `scopeMatch[1]` on a dyn receiver (a
|
|
358
|
+
// JSON.parse result): the dyn keyed read, exactly the dot form.
|
|
359
|
+
// NUMBER-typed indices convert through ToString first — JS property
|
|
360
|
+
// keys are strings, and the canonical number text answers array
|
|
361
|
+
// indices in the helper (fractions, negatives, and NaN read as
|
|
362
|
+
// absent keys, exactly JS). An UNMAPPABLE checker type takes the
|
|
363
|
+
// same path when the receiver LOWERS dyn
|
|
364
|
+
// (`pkg.workspaces.packages["0"]` — the lowering world types the
|
|
365
|
+
// unknown-rooted chain `any`); a non-dyn lowering falls through to
|
|
366
|
+
// the fences below (re-lowering is pure IR construction).
|
|
367
|
+
if (receiverIr?.kind === "dyn" || receiverIr?.kind === "union" || receiverIr === null) {
|
|
368
|
+
const obj = lowerer.lowerExpr(expr.expression);
|
|
369
|
+
// A generic mapped type can stay unresolved at this body use even
|
|
370
|
+
// though its instantiated parameter has a concrete record ABI.
|
|
371
|
+
// Dispatch from that stored shape, as the array fallback below does.
|
|
372
|
+
if (receiverIr === null && obj.type.kind === "record") {
|
|
373
|
+
const shape = lowerer.shapes.get(obj.type.shapeId);
|
|
374
|
+
const index = tupleLiteralIndex(expr.argumentExpression);
|
|
375
|
+
const field = shape?.tuple && index !== null
|
|
376
|
+
? shape.fields.find((field) => field.name === String(index))
|
|
377
|
+
: null;
|
|
378
|
+
if (field)
|
|
379
|
+
return lowerer.maybeNarrow({
|
|
380
|
+
kind: "recordGet",
|
|
381
|
+
obj,
|
|
382
|
+
shapeId: obj.type.shapeId,
|
|
383
|
+
field: field.name,
|
|
384
|
+
type: field.type,
|
|
385
|
+
loc: locOf(expr),
|
|
386
|
+
}, expr);
|
|
387
|
+
if (shape && !shape.tuple) {
|
|
388
|
+
return lowerer.lowerRecordKeyRead(expr, obj.type.shapeId, shape);
|
|
389
|
+
}
|
|
390
|
+
}
|
|
391
|
+
if (obj.type.kind === "dyn" ||
|
|
392
|
+
(obj.type.kind === "object" && obj.type.className === "%Error") ||
|
|
393
|
+
isDynTypedRefType(obj.type)) {
|
|
394
|
+
const rawKey = lowerer.lowerExpr(expr.argumentExpression);
|
|
395
|
+
// Number, bool, and DYN keys stringify (ToPropertyKey) — the
|
|
396
|
+
// dyn-keyed read `catchWarning[warning.name]` where the property
|
|
397
|
+
// chain itself lowered dyn.
|
|
398
|
+
const key = rawKey.type.kind === "dyn" ||
|
|
399
|
+
rawKey.type.kind === "symbol" ||
|
|
400
|
+
(rawKey.type.kind === "union" && lowerer.dynConvertible(rawKey.type))
|
|
401
|
+
? lowerer.coerceToExpected(rawKey, DYN)
|
|
402
|
+
: lowerRecordPropertyKey(lowerer, rawKey, expr.argumentExpression);
|
|
403
|
+
if (key.type.kind === "string" || key.type.kind === "dyn") {
|
|
404
|
+
const opt = hasOptionalChainGuard(expr.expression, lowerer);
|
|
405
|
+
return lowerer.maybeNarrow({
|
|
406
|
+
kind: "dynKeyGet",
|
|
407
|
+
key,
|
|
408
|
+
...(opt ? { optional: true } : {}),
|
|
409
|
+
value: lowerer.coerceToExpected(obj, DYN),
|
|
410
|
+
type: DYN,
|
|
411
|
+
loc: locOf(expr),
|
|
412
|
+
}, expr);
|
|
413
|
+
}
|
|
414
|
+
}
|
|
415
|
+
// A checker-`any` receiver that LOWERS to a static ARRAY
|
|
416
|
+
// (`pm.split("@")[0]` — the dyn-receiver string machinery answers
|
|
417
|
+
// string[]): the element read rides the ordinary array path on the
|
|
418
|
+
// lowered value (invalid indices trap, divergence 4's policy).
|
|
419
|
+
if (obj.type.kind === "array") {
|
|
420
|
+
const index = lowerer.lowerExpr(expr.argumentExpression);
|
|
421
|
+
if (index.type.kind === "f64") {
|
|
422
|
+
const safe = lowerSafeIndexRead(lowerer, obj, index, locOf(expr));
|
|
423
|
+
if (safe)
|
|
424
|
+
return safe;
|
|
425
|
+
return lowerer.maybeNarrow({ kind: "arrayGet", arr: obj, index, type: obj.type.elem, loc: locOf(expr) }, expr);
|
|
426
|
+
}
|
|
427
|
+
}
|
|
428
|
+
}
|
|
429
|
+
// `env[key]` on a UNION of record shapes (`ProcessEnv | Record<string,
|
|
430
|
+
// string>` — the env-bag parameter pattern): the per-arm keyed read,
|
|
431
|
+
// joined exactly like the dot form (lowerUnionProperty's keyed path).
|
|
432
|
+
if (receiverIr?.kind === "union") {
|
|
433
|
+
const value = lowerer.lowerExpr(expr.expression);
|
|
434
|
+
if (value.type.kind === "union") {
|
|
435
|
+
const key = lowerer.lowerExpr(expr.argumentExpression);
|
|
436
|
+
if (key.type.kind === "f64") {
|
|
437
|
+
const def = lowerer.unions.get(value.type.unionId);
|
|
438
|
+
const presentArms = def?.arms.filter((arm) => !isUnitType(arm)) ?? [];
|
|
439
|
+
if (presentArms.length === 1 && presentArms[0]?.kind === "string") {
|
|
440
|
+
const property = runtimeOptionalElementKey(expr.argumentExpression);
|
|
441
|
+
const receiver = property === null
|
|
442
|
+
? null
|
|
443
|
+
: lowerer.runtimeOptionalPropertyReceiver(expr.expression, value, STRING, property);
|
|
444
|
+
if (receiver !== null) {
|
|
445
|
+
return {
|
|
446
|
+
kind: "strIntrinsic",
|
|
447
|
+
method: "charAt",
|
|
448
|
+
receiver,
|
|
449
|
+
args: [key],
|
|
450
|
+
type: STRING,
|
|
451
|
+
loc: locOf(expr),
|
|
452
|
+
};
|
|
453
|
+
}
|
|
454
|
+
}
|
|
455
|
+
}
|
|
456
|
+
if (key.type.kind === "f64") {
|
|
457
|
+
const safe = lowerOptionalArrayIndexRead(lowerer, expr, value, key);
|
|
458
|
+
if (safe)
|
|
459
|
+
return safe;
|
|
460
|
+
}
|
|
461
|
+
if (key.type.kind === "string" || key.type.kind === "f64") {
|
|
462
|
+
const lit = ts.isStringLiteral(expr.argumentExpression)
|
|
463
|
+
? expr.argumentExpression.text
|
|
464
|
+
: null;
|
|
465
|
+
const keyed = lowerUnionKeyedRead(lowerer, expr, value.type.unionId, value, key, lit);
|
|
466
|
+
if (keyed)
|
|
467
|
+
return lowerer.maybeNarrow(keyed, expr);
|
|
468
|
+
}
|
|
469
|
+
}
|
|
470
|
+
}
|
|
471
|
+
if (receiverIr?.kind !== "array") {
|
|
472
|
+
{
|
|
473
|
+
const receiver = tryLowerExpression(lowerer, expr.expression);
|
|
474
|
+
if (receiver?.type.kind === "dyn" ||
|
|
475
|
+
(receiver &&
|
|
476
|
+
isJsSourceFile(ts.getSourceFileOfNode(expr)) &&
|
|
477
|
+
(receiver.type.kind === "union" || receiver.type.kind === "bytes") &&
|
|
478
|
+
lowerer.dynConvertible(receiver.type))) {
|
|
479
|
+
const key = lowerRecordPropertyKey(lowerer, lowerer.lowerExpr(expr.argumentExpression), expr.argumentExpression);
|
|
480
|
+
return lowerer.maybeNarrow({
|
|
481
|
+
kind: "dynKeyGet",
|
|
482
|
+
value: lowerer.coerceInto(expr.expression, receiver, DYN),
|
|
483
|
+
key,
|
|
484
|
+
type: DYN,
|
|
485
|
+
loc: locOf(expr),
|
|
486
|
+
}, expr);
|
|
487
|
+
}
|
|
488
|
+
if (receiver?.type.kind === "func" &&
|
|
489
|
+
canBoxFuncIntoDyn(receiver.type, (id) => lowerer.shapes.get(id), (id) => lowerer.unions.get(id))) {
|
|
490
|
+
const key = lowerRecordPropertyKey(lowerer, lowerer.lowerExpr(expr.argumentExpression), expr.argumentExpression);
|
|
491
|
+
if (key.type.kind === "string") {
|
|
492
|
+
const boxed = {
|
|
493
|
+
kind: "dynFrom",
|
|
494
|
+
value: receiver,
|
|
495
|
+
type: DYN,
|
|
496
|
+
loc: locOf(expr.expression),
|
|
497
|
+
};
|
|
498
|
+
return lowerer.maybeNarrow({ kind: "dynKeyGet", key, value: boxed, type: DYN, loc: locOf(expr) }, expr);
|
|
499
|
+
}
|
|
500
|
+
}
|
|
501
|
+
}
|
|
502
|
+
if (receiverIr?.kind === "string") {
|
|
503
|
+
// An indexed string property is absent for non-integer and missing
|
|
504
|
+
// indexes. charAt has different coercion and out-of-range semantics.
|
|
505
|
+
const recv = lowerer.lowerExpr(expr.expression);
|
|
506
|
+
const index = lowerOptionalNumber(lowerer, lowerer.lowerExpr(expr.argumentExpression), locOf(expr.argumentExpression), expr.argumentExpression);
|
|
507
|
+
if (index.type.kind === "f64" && recv.type.kind === "string") {
|
|
508
|
+
// A proven in-bounds integer index always names a code unit, where
|
|
509
|
+
// charAt and the property read agree.
|
|
510
|
+
if (lowerer.stringIndexBounds.inBounds(expr))
|
|
511
|
+
return {
|
|
512
|
+
kind: "strIntrinsic",
|
|
513
|
+
method: "charAt",
|
|
514
|
+
receiver: recv,
|
|
515
|
+
args: [index],
|
|
516
|
+
type: STRING,
|
|
517
|
+
loc: locOf(expr),
|
|
518
|
+
};
|
|
519
|
+
return lowerOptionalStringIndex(lowerer, recv, index, lowerer.withUndefinedArm(STRING), locOf(expr));
|
|
520
|
+
}
|
|
521
|
+
// The checker narrowed the receiver to string, but its stored value
|
|
522
|
+
// is still the union (an array-derived binding, a typeof guard).
|
|
523
|
+
if (index.type.kind === "f64") {
|
|
524
|
+
const read = lowerUnionStringIndex(lowerer, recv, index, expr.argumentExpression, lowerer.withUndefinedArm(STRING), locOf(expr));
|
|
525
|
+
if (read)
|
|
526
|
+
return read;
|
|
527
|
+
}
|
|
528
|
+
lowerer.unsupported("SC1090", expr, "string indexing with this index/result shape (expected a number index and a string or string | undefined result)");
|
|
529
|
+
}
|
|
530
|
+
lowerer.unsupported("SC1090", expr, "element access on non-array values");
|
|
531
|
+
}
|
|
532
|
+
let arr = lowerer.lowerExpr(expr.expression);
|
|
533
|
+
const runtimeOptionalSource = lowerer.runtimeOptionalSourceValue(expr.expression, arr);
|
|
534
|
+
if (runtimeOptionalSource?.kind === "varRef" &&
|
|
535
|
+
runtimeOptionalSource.type.kind === "union" &&
|
|
536
|
+
arr.type.kind === "array") {
|
|
537
|
+
// lowerer.lowerElementAccess has already recognized a captured
|
|
538
|
+
// array | undefined receiver and supplied its checked extraction as
|
|
539
|
+
// the expression override. Rebuild that check here so a missing
|
|
540
|
+
// receiver throws the member-access error Node exposes, rather than
|
|
541
|
+
// the generic target-union narrowing error. The stored receiver is a
|
|
542
|
+
// varRef, so both the tag test and extraction read the same value
|
|
543
|
+
// without repeating an effect.
|
|
544
|
+
const stored = runtimeOptionalSource;
|
|
545
|
+
if (stored.type.kind !== "union")
|
|
546
|
+
throw new InternalCompilerError("runtime-optional array source lost its union storage");
|
|
547
|
+
const unionId = stored.type.unionId;
|
|
548
|
+
const undefTag = lowerer.armTag(unionId, UNDEFINED_T);
|
|
549
|
+
const valueTag = lowerer.armTag(unionId, arr.type);
|
|
550
|
+
const property = runtimeOptionalElementKey(expr.argumentExpression);
|
|
551
|
+
if (undefTag >= 0 && valueTag >= 0 && property !== null) {
|
|
552
|
+
arr = {
|
|
553
|
+
kind: "ternary",
|
|
554
|
+
cond: {
|
|
555
|
+
kind: "unionIsTag",
|
|
556
|
+
unionId,
|
|
557
|
+
tag: undefTag,
|
|
558
|
+
negated: false,
|
|
559
|
+
value: stored,
|
|
560
|
+
type: BOOL,
|
|
561
|
+
loc: locOf(expr.expression),
|
|
562
|
+
},
|
|
563
|
+
then: nodeThrowExpr(1, "", `Cannot read properties of undefined (reading '${property}')`, arr.type, locOf(expr.expression)),
|
|
564
|
+
else_: {
|
|
565
|
+
kind: "unionNarrow",
|
|
566
|
+
unionId,
|
|
567
|
+
tag: valueTag,
|
|
568
|
+
value: stored,
|
|
569
|
+
type: arr.type,
|
|
570
|
+
loc: locOf(expr.expression),
|
|
571
|
+
},
|
|
572
|
+
type: arr.type,
|
|
573
|
+
loc: locOf(expr.expression),
|
|
574
|
+
};
|
|
575
|
+
}
|
|
576
|
+
}
|
|
577
|
+
if (arr.type.kind === "union" &&
|
|
578
|
+
lowerer.armTag(arr.type.unionId, UNDEFINED_T) >= 0 &&
|
|
579
|
+
receiverIr.kind === "array") {
|
|
580
|
+
// As with tuple receivers above, an unchecked outer read can be
|
|
581
|
+
// undefined even when the checker reports an array. Extract the
|
|
582
|
+
// present array arm with a runtime tag check before arrayGet or the
|
|
583
|
+
// safe indexed-read helper runs.
|
|
584
|
+
const present = lowerer.stripUndefinedArm(arr.type);
|
|
585
|
+
const helper = present.kind === "array"
|
|
586
|
+
? lowerer.narrowedArmHelper(arr.type.unionId, present, locOf(expr.expression))
|
|
587
|
+
: null;
|
|
588
|
+
arr = helper
|
|
589
|
+
? lowerer.checkedNarrowCall(helper, arr, present, locOf(expr.expression))
|
|
590
|
+
: lowerer.maybeNarrow(arr, expr.expression);
|
|
591
|
+
}
|
|
592
|
+
// The checker sees an array but the VALUE lowered checked-dynamic (a
|
|
593
|
+
// jsdoc-typed default export from a .js module — signature 14): the
|
|
594
|
+
// read rides the dynCheck boundary when the array shape is one the checked-dynamic tree
|
|
595
|
+
// can validate, and fences by name when it is not — an arrayGet over a
|
|
596
|
+
// dyn receiver is never emitted (the validator ICE).
|
|
597
|
+
if (arr.type.kind === "dyn") {
|
|
598
|
+
if (canDynCheckTo(receiverIr, (id) => lowerer.shapes.get(id), (id) => lowerer.unions.get(id))) {
|
|
599
|
+
arr = { kind: "dynCheck", value: arr, type: receiverIr, loc: locOf(expr) };
|
|
600
|
+
}
|
|
601
|
+
else {
|
|
602
|
+
lowerer.unsupported("SC1090", expr, `element access on checked-dynamic values with '${lowerer.fmt(receiverIr)}' elements`);
|
|
603
|
+
}
|
|
604
|
+
}
|
|
605
|
+
// Array reads can themselves supply an index. A missing numeric value
|
|
606
|
+
// is undefined, whose property lookup misses just like NaN; keep that
|
|
607
|
+
// value instead of rejecting a checker-number index with optional IR.
|
|
608
|
+
const index = lowerOptionalNumber(lowerer, lowerer.lowerExpr(expr.argumentExpression), locOf(expr.argumentExpression), expr.argumentExpression);
|
|
609
|
+
if (arr.type.kind === "array" &&
|
|
610
|
+
(index.type.kind === "dyn" ||
|
|
611
|
+
(isJsSourceFile(ts.getSourceFileOfNode(expr)) &&
|
|
612
|
+
index.type.kind !== "f64" &&
|
|
613
|
+
lowerer.dynConvertible(index.type)))) {
|
|
614
|
+
return {
|
|
615
|
+
kind: "dynKeyGet",
|
|
616
|
+
value: lowerer.coerceToExpected(arr, DYN),
|
|
617
|
+
key: index,
|
|
618
|
+
type: DYN,
|
|
619
|
+
loc: locOf(expr),
|
|
620
|
+
};
|
|
621
|
+
}
|
|
622
|
+
if (index.type.kind !== "f64") {
|
|
623
|
+
lowerer.unsupported("SC1090", expr.argumentExpression, "indexing with non-number keys");
|
|
624
|
+
}
|
|
625
|
+
// The LOWERED receiver's element type wins over the checker's when
|
|
626
|
+
// both are arrays: a spoke result can be more precise than the
|
|
627
|
+
// declared surface (emitter.listeners() answers the event's tuple
|
|
628
|
+
// signature where the .d.ts says Function[], which would flatten the
|
|
629
|
+
// element to a zero-parameter closure).
|
|
630
|
+
const elemT = arr.type.kind === "array" ? arr.type.elem : receiverIr.elem;
|
|
631
|
+
// Every ordinary array read is a JavaScript property read: an invalid
|
|
632
|
+
// index answers undefined, even when the checker was built without
|
|
633
|
+
// noUncheckedIndexedAccess. Keep the explicit optional union in the IR
|
|
634
|
+
// so it can flow through templates, locals, calls, returns, operators,
|
|
635
|
+
// and narrowing. The helper performs one length/proof check and then
|
|
636
|
+
// uses the dense getter for the proven-present path, so this does not
|
|
637
|
+
// change the storage representation or the low-level getter itself.
|
|
638
|
+
if (arr.type.kind === "array") {
|
|
639
|
+
// A non-null assertion is the explicit proven-present form. Preserve
|
|
640
|
+
// the dense getter's established bounds trap where the asserted value
|
|
641
|
+
// must be the element type (library ABI checks and the catchable
|
|
642
|
+
// RangeError contract for an out-of-bounds assert). Where undefined is
|
|
643
|
+
// representable, the assertion keeps JavaScript's unchecked read.
|
|
644
|
+
const provenPresent = ts.isNonNullExpression(expr.parent) &&
|
|
645
|
+
expr.parent.expression === expr &&
|
|
646
|
+
!assertedElementKeepsUndefined(lowerer, expr.parent);
|
|
647
|
+
if (provenPresent) {
|
|
648
|
+
return lowerer.maybeNarrow({ kind: "arrayGet", arr, index, type: elemT, loc: locOf(expr) }, expr);
|
|
649
|
+
}
|
|
650
|
+
const safe = lowerSafeIndexRead(lowerer, arr, index, locOf(expr));
|
|
651
|
+
if (safe)
|
|
652
|
+
return safe;
|
|
653
|
+
}
|
|
654
|
+
// --npm-static package files retain the original slice-specific route
|
|
655
|
+
// for compatibility with package-source inference.
|
|
656
|
+
if (arr.type.kind === "array" &&
|
|
657
|
+
arr.kind === "arrIntrinsic" &&
|
|
658
|
+
arr.method === "slice" &&
|
|
659
|
+
npmStaticPackageOfPath(ts.getSourceFileOfNode(expr).fileName) !== null) {
|
|
660
|
+
const safe = lowerSafeIndexRead(lowerer, arr, index, locOf(expr));
|
|
661
|
+
if (safe)
|
|
662
|
+
return safe;
|
|
663
|
+
}
|
|
664
|
+
// A union-element read narrows like an identifier when the checker has
|
|
665
|
+
// narrowed THIS occurrence (`if (a[0] !== undefined) use(a[0])` — tsc
|
|
666
|
+
// narrows literal-index element accesses).
|
|
667
|
+
return lowerer.maybeNarrow({ kind: "arrayGet", arr, index, type: elemT, loc: locOf(expr) }, expr);
|
|
668
|
+
}
|
|
669
|
+
function optionalRecordReceiver(lowerer, value, loc, allowNull = false) {
|
|
670
|
+
if (value.type.kind !== "union")
|
|
671
|
+
return null;
|
|
672
|
+
const unionId = value.type.unionId;
|
|
673
|
+
const arms = lowerer.unions.get(unionId)?.arms;
|
|
674
|
+
if (arms?.length !== 2)
|
|
675
|
+
return null;
|
|
676
|
+
let undefTag = lowerer.armTag(unionId, UNDEFINED_T);
|
|
677
|
+
let nullish = "undefined";
|
|
678
|
+
// A null-initialized slot assigned a record later (iconv-lite's
|
|
679
|
+
// `encodings = null` table, filled on first use): the checker narrows
|
|
680
|
+
// the read to the record, the storage keeps the null arm.
|
|
681
|
+
if (undefTag < 0 && allowNull) {
|
|
682
|
+
undefTag = lowerer.armTag(unionId, NULL_T);
|
|
683
|
+
nullish = "null";
|
|
684
|
+
}
|
|
685
|
+
if (undefTag < 0)
|
|
686
|
+
return null;
|
|
687
|
+
const record = arms[1 - undefTag];
|
|
688
|
+
if (record.kind !== "record")
|
|
689
|
+
return null;
|
|
690
|
+
const stmts = [];
|
|
691
|
+
const stable = stabilized(lowerer, value, "%recordReceiver", stmts);
|
|
692
|
+
const present = {
|
|
693
|
+
kind: "unionNarrow",
|
|
694
|
+
unionId,
|
|
695
|
+
tag: lowerer.armTag(unionId, record),
|
|
696
|
+
value: stable,
|
|
697
|
+
type: record,
|
|
698
|
+
loc,
|
|
699
|
+
};
|
|
700
|
+
return { stmts, stable, present, unionId, undefTag, nullish };
|
|
701
|
+
}
|
|
702
|
+
/** `value`, evaluated once at this point of `out`. */
|
|
703
|
+
function stabilized(lowerer, value, name, out) {
|
|
704
|
+
if (isSafeToRepeat(value))
|
|
705
|
+
return value;
|
|
706
|
+
const tmp = lowerer.declareHiddenLocal(name, value.type);
|
|
707
|
+
out.push({ kind: "varDecl", localId: tmp.id, init: value, loc: value.loc });
|
|
708
|
+
return varRef(tmp.id, value.type, value.loc);
|
|
709
|
+
}
|
|
710
|
+
function undefinedReceiver(receiver, loc) {
|
|
711
|
+
return {
|
|
712
|
+
kind: "unionIsTag",
|
|
713
|
+
unionId: receiver.unionId,
|
|
714
|
+
tag: receiver.undefTag,
|
|
715
|
+
negated: false,
|
|
716
|
+
value: receiver.stable,
|
|
717
|
+
type: BOOL,
|
|
718
|
+
loc,
|
|
719
|
+
};
|
|
720
|
+
}
|
|
721
|
+
/** Node's TypeError for a keyed read or write on an undefined (or null)
|
|
722
|
+
* receiver. */
|
|
723
|
+
function undefinedReceiverThrow(key, action, type, loc, nullish = "undefined") {
|
|
724
|
+
const head = `Cannot ${action} properties of ${nullish} (${action === "read" ? "reading" : "setting"} '`;
|
|
725
|
+
const message = {
|
|
726
|
+
kind: "strConcat",
|
|
727
|
+
left: {
|
|
728
|
+
kind: "strConcat",
|
|
729
|
+
left: { kind: "strLit", value: head, type: STRING, loc },
|
|
730
|
+
right: key,
|
|
731
|
+
type: STRING,
|
|
732
|
+
loc,
|
|
733
|
+
},
|
|
734
|
+
right: { kind: "strLit", value: "')", type: STRING, loc },
|
|
735
|
+
type: STRING,
|
|
736
|
+
loc,
|
|
737
|
+
};
|
|
738
|
+
return {
|
|
739
|
+
kind: "libCall",
|
|
740
|
+
fn: "error.nodeThrow",
|
|
741
|
+
args: [numLit(1, loc), { kind: "strLit", value: "", type: STRING, loc }, message],
|
|
742
|
+
type,
|
|
743
|
+
loc,
|
|
744
|
+
};
|
|
745
|
+
}
|
|
746
|
+
/** The receiver and key of a keyed access whose receiver can be undefined,
|
|
747
|
+
* evaluated in order into `stmts`, with the receiver's record arm and the
|
|
748
|
+
* key's property-name string. Null when the receiver is not optional. */
|
|
749
|
+
function guardedRecordAccess(lowerer, access, rawObj, allowNull = false) {
|
|
750
|
+
const receiver = optionalRecordReceiver(lowerer, rawObj, locOf(access.expression), allowNull);
|
|
751
|
+
if (!receiver)
|
|
752
|
+
return null;
|
|
753
|
+
const keyNode = access.argumentExpression;
|
|
754
|
+
const litKey = recordKeyLiteralText(keyNode) ?? recordKeyTypeLiteralText(lowerer, keyNode);
|
|
755
|
+
const key = litKey !== null
|
|
756
|
+
? { kind: "strLit", value: litKey, type: STRING, loc: locOf(keyNode) }
|
|
757
|
+
: stabilized(lowerer, lowerer.lowerExpr(keyNode), "%recordKey", receiver.stmts);
|
|
758
|
+
// A symbol key names no string property; its message spelling is not
|
|
759
|
+
// modeled.
|
|
760
|
+
const name = key.type.kind === "symbol"
|
|
761
|
+
? { kind: "strLit", value: "Symbol()", type: STRING, loc: locOf(keyNode) }
|
|
762
|
+
: lowerRecordPropertyKey(lowerer, key, keyNode);
|
|
763
|
+
return { receiver, key, name };
|
|
764
|
+
}
|
|
765
|
+
/** `nested[a][b] = v` where `nested[a]` can miss: the receiver, the key and
|
|
766
|
+
* the value evaluate in order, then an undefined receiver throws Node's
|
|
767
|
+
* TypeError and a present one takes the write. Only member and identifier
|
|
768
|
+
* receivers are probed, since a probe that finds no optional receiver
|
|
769
|
+
* lowers the receiver again. */
|
|
770
|
+
function lowerGuardedRecordWrite(lowerer, expr, target) {
|
|
771
|
+
let receiverNode = target.expression;
|
|
772
|
+
while (ts.isParenthesizedExpression(receiverNode))
|
|
773
|
+
receiverNode = receiverNode.expression;
|
|
774
|
+
if (lowerer.chainRecvByNode.has(target.expression) ||
|
|
775
|
+
!(ts.isElementAccessExpression(receiverNode) ||
|
|
776
|
+
ts.isPropertyAccessExpression(receiverNode) ||
|
|
777
|
+
ts.isIdentifier(receiverNode)))
|
|
778
|
+
return null;
|
|
779
|
+
const guarded = guardedRecordAccess(lowerer, target, lowerer.lowerExpr(target.expression));
|
|
780
|
+
if (!guarded)
|
|
781
|
+
return null;
|
|
782
|
+
const { receiver, key, name } = guarded;
|
|
783
|
+
const loc = locOf(expr);
|
|
784
|
+
const value = stabilized(lowerer, lowerer.lowerExpr(expr.right), "%recordValue", receiver.stmts);
|
|
785
|
+
const write = lowerer.withExpressionOverride(target.expression, receiver.present, () => lowerer.withExpressionOverride(target.argumentExpression, key, () => lowerer.withExpressionOverride(expr.right, value, () => lowerElementWrite(lowerer, expr))));
|
|
786
|
+
return {
|
|
787
|
+
kind: "block",
|
|
788
|
+
body: [
|
|
789
|
+
...receiver.stmts,
|
|
790
|
+
{
|
|
791
|
+
kind: "if",
|
|
792
|
+
cond: undefinedReceiver(receiver, loc),
|
|
793
|
+
then: [{ kind: "exprStmt", expr: undefinedReceiverThrow(name, "set", VOID, loc), loc }],
|
|
794
|
+
else_: [write],
|
|
795
|
+
loc,
|
|
796
|
+
},
|
|
797
|
+
],
|
|
798
|
+
loc,
|
|
799
|
+
};
|
|
800
|
+
}
|
|
801
|
+
/** `b[i] = v` where the checker's flow type of `b` is a typed array but
|
|
802
|
+
* its storage is wider. A hoisted JavaScript `var` (or a field written
|
|
803
|
+
* after construction) holds `bytes | undefined`: the receiver, index and
|
|
804
|
+
* value evaluate in order, then an undefined receiver throws Node's
|
|
805
|
+
* TypeError and a present one takes the typed store. Any other storage (a
|
|
806
|
+
* `var` later reassigned a string, a checked-dynamic value) takes the
|
|
807
|
+
* checked-dynamic store, which applies whatever value the receiver holds. */
|
|
808
|
+
function lowerWiderBytesWrite(lowerer, expr, target, recv) {
|
|
809
|
+
const loc = locOf(expr);
|
|
810
|
+
if (recv.type.kind === "union") {
|
|
811
|
+
const unionId = recv.type.unionId;
|
|
812
|
+
const arms = lowerer.unions.get(unionId)?.arms;
|
|
813
|
+
const undefTag = lowerer.armTag(unionId, UNDEFINED_T);
|
|
814
|
+
const bytes = arms?.length === 2 && undefTag >= 0 ? arms[1 - undefTag] : null;
|
|
815
|
+
const keyType = lowerer.mapTypeOf(lowerer.typeOf(target.argumentExpression));
|
|
816
|
+
const index = bytes?.kind === "bytes" && keyType?.kind === "f64"
|
|
817
|
+
? lowerer.lowerExpr(target.argumentExpression)
|
|
818
|
+
: null;
|
|
819
|
+
// An index stored wider than a number (a hoisted `var` counter) keeps
|
|
820
|
+
// the checked-dynamic store below, which converts the key exactly.
|
|
821
|
+
if (bytes?.kind === "bytes" && index?.type.kind === "f64") {
|
|
822
|
+
const stmts = [];
|
|
823
|
+
const stable = stabilized(lowerer, recv, "%bytesReceiver", stmts);
|
|
824
|
+
const key = stabilized(lowerer, index, "%bytesIndex", stmts);
|
|
825
|
+
const value = stabilized(lowerer, lowerer.lowerExprExpecting(expr.right, F64), "%bytesValue", stmts);
|
|
826
|
+
const name = lowerRecordPropertyKey(lowerer, key, target.argumentExpression);
|
|
827
|
+
const present = {
|
|
828
|
+
kind: "unionNarrow",
|
|
829
|
+
unionId,
|
|
830
|
+
tag: 1 - undefTag,
|
|
831
|
+
value: stable,
|
|
832
|
+
type: bytes,
|
|
833
|
+
loc,
|
|
834
|
+
};
|
|
835
|
+
return {
|
|
836
|
+
kind: "block",
|
|
837
|
+
body: [
|
|
838
|
+
...stmts,
|
|
839
|
+
{
|
|
840
|
+
kind: "if",
|
|
841
|
+
cond: {
|
|
842
|
+
kind: "unionIsTag",
|
|
843
|
+
unionId,
|
|
844
|
+
tag: undefTag,
|
|
845
|
+
negated: false,
|
|
846
|
+
value: stable,
|
|
847
|
+
type: BOOL,
|
|
848
|
+
loc,
|
|
849
|
+
},
|
|
850
|
+
then: [{ kind: "exprStmt", expr: undefinedReceiverThrow(name, "set", VOID, loc), loc }],
|
|
851
|
+
else_: [{ kind: "bytesSet", arr: present, index: key, value, loc }],
|
|
852
|
+
loc,
|
|
853
|
+
},
|
|
854
|
+
],
|
|
855
|
+
loc,
|
|
856
|
+
};
|
|
857
|
+
}
|
|
858
|
+
}
|
|
859
|
+
if (!lowerer.dynConvertible(recv.type)) {
|
|
860
|
+
lowerer.unsupported("SC1090", target.expression, `typed-array element writes through '${lowerer.fmt(recv.type)}' storage`);
|
|
861
|
+
}
|
|
862
|
+
return {
|
|
863
|
+
kind: "exprStmt",
|
|
864
|
+
expr: lowerDynMemberAssignment(lowerer, expr, lowerer.coerceInto(target.expression, recv, DYN)),
|
|
865
|
+
loc,
|
|
866
|
+
};
|
|
867
|
+
}
|
|
868
|
+
/** `r[k]` over a (non-tuple) record shape. A LITERAL key naming a declared
|
|
869
|
+
* field is the bracket spelling of field access (the ONLY spelling tsc
|
|
870
|
+
* permits for signature-declared fields under
|
|
871
|
+
* noPropertyAccessFromIndexSignature) — an ordinary recordGet. Everything
|
|
872
|
+
* else is a runtime-keyed read (recordKeyGet): declared fields answer
|
|
873
|
+
* first via an emitted string-switch, index-signature shapes fall through
|
|
874
|
+
* to the overflow map. The result type is the index signature's value type
|
|
875
|
+
* armed with undefined (dyn for `unknown`): a missing key reads undefined,
|
|
876
|
+
* as in JavaScript, whatever noUncheckedIndexedAccess says. Every declared
|
|
877
|
+
* field must be able to SURFACE as that type (equal, an arm of it, or —
|
|
878
|
+
* for dyn results — JSON-safe for the dyn conversion); shapes mixing in
|
|
879
|
+
* fields outside that stay fenced. Declared-only shapes support reads
|
|
880
|
+
* whose key type proves membership (tsc's keyof check): all fields must
|
|
881
|
+
* share the result type, and a smuggled miss traps. */
|
|
882
|
+
export function lowerRecordKeyRead(lowerer, expr, shapeId, shape, includeUndefined = false) {
|
|
883
|
+
const loc = locOf(expr);
|
|
884
|
+
const keyNode = expr.argumentExpression;
|
|
885
|
+
// Literal declared keys are plain field reads (narrowing included).
|
|
886
|
+
// NUMERIC literals are their canonical string spelling — JS object keys
|
|
887
|
+
// ARE strings (`r[1]` reads `r["1"]`), so `b[1]` hits a declared field
|
|
888
|
+
// named "1" (a mapped type over a numeric enum) exactly like `b["1"]`.
|
|
889
|
+
// A key IDENTIFIER whose type proves one literal (a literal-typed
|
|
890
|
+
// const, a keyof-constrained type parameter bound to a literal inside
|
|
891
|
+
// a generic instance) is the same static read — identifier evaluation
|
|
892
|
+
// is pure, so skipping it matches JS exactly.
|
|
893
|
+
const litKey = recordKeyLiteralText(keyNode) ?? recordKeyTypeLiteralText(lowerer, keyNode);
|
|
894
|
+
// An outer keyed read can leave the receiver undefined: evaluate the
|
|
895
|
+
// receiver and the key, then throw Node's TypeError or read the present
|
|
896
|
+
// record.
|
|
897
|
+
// The receiver lowers FIRST (both branches below read it, and JS
|
|
898
|
+
// evaluates the receiver before the key).
|
|
899
|
+
const obj = lowerer.lowerExpr(expr.expression);
|
|
900
|
+
{
|
|
901
|
+
// A null arm is guarded only for string and number keys: other keys
|
|
902
|
+
// already take the checked-dynamic read, which handles null itself.
|
|
903
|
+
// Only a receiver with a null arm asks about the key.
|
|
904
|
+
let allowNull = false;
|
|
905
|
+
if (obj.type.kind === "union" && lowerer.armTag(obj.type.unionId, NULL_T) >= 0) {
|
|
906
|
+
const keyType = litKey !== null ? STRING : lowerer.mapTypeOf(lowerer.typeOf(keyNode));
|
|
907
|
+
allowNull = keyType?.kind === "string" || keyType?.kind === "f64";
|
|
908
|
+
}
|
|
909
|
+
const guarded = guardedRecordAccess(lowerer, expr, obj, allowNull);
|
|
910
|
+
if (guarded) {
|
|
911
|
+
const { receiver, key, name } = guarded;
|
|
912
|
+
const read = lowerer.withExpressionOverride(expr.expression, receiver.present, () => litKey !== null
|
|
913
|
+
? lowerRecordKeyRead(lowerer, expr, shapeId, shape, includeUndefined)
|
|
914
|
+
: lowerer.withExpressionOverride(keyNode, key, () => lowerRecordKeyRead(lowerer, expr, shapeId, shape, includeUndefined)));
|
|
915
|
+
return {
|
|
916
|
+
kind: "seqExpr",
|
|
917
|
+
stmts: receiver.stmts,
|
|
918
|
+
result: {
|
|
919
|
+
kind: "ternary",
|
|
920
|
+
cond: undefinedReceiver(receiver, loc),
|
|
921
|
+
then: undefinedReceiverThrow(name, "read", read.type, loc, receiver.nullish),
|
|
922
|
+
else_: read,
|
|
923
|
+
type: read.type,
|
|
924
|
+
loc,
|
|
925
|
+
},
|
|
926
|
+
type: read.type,
|
|
927
|
+
loc,
|
|
928
|
+
};
|
|
929
|
+
}
|
|
930
|
+
}
|
|
931
|
+
// A record-mapped CHECKER type over a VALUE living in the checked-dynamic tree (a JS
|
|
932
|
+
// file-scope object-literal global): the checked-dynamic keyed read —
|
|
933
|
+
// dynKeyGet against the runtime keys (a missing key answers the checked-dynamic tree
|
|
934
|
+
// undefined, exactly JS); consumers validate (dynCheck) where a
|
|
935
|
+
// static type is required, the member-read discipline.
|
|
936
|
+
if (obj.type.kind === "dyn") {
|
|
937
|
+
let dk = litKey !== null
|
|
938
|
+
? { kind: "strLit", value: litKey, type: STRING, loc: locOf(keyNode) }
|
|
939
|
+
: lowerer.lowerExpr(keyNode);
|
|
940
|
+
// Number AND checked-dynamic keys ride the JS-exact formatter —
|
|
941
|
+
// property keys ARE strings (o[k] is o[String(k)] in JS), and a dyn
|
|
942
|
+
// key (agent.sockets[agent.getName(...)]) stringifies the same way.
|
|
943
|
+
if (dk.type.kind === "union" && lowerer.dynConvertible(dk.type))
|
|
944
|
+
dk = lowerer.coerceToExpected(dk, DYN);
|
|
945
|
+
if (dk.type.kind !== "symbol" && dk.type.kind !== "dyn")
|
|
946
|
+
dk = lowerRecordPropertyKey(lowerer, dk, keyNode);
|
|
947
|
+
if (dk.type.kind !== "string" && dk.type.kind !== "symbol" && dk.type.kind !== "dyn") {
|
|
948
|
+
lowerer.unsupported("SC1090", keyNode, "indexing records with non-string or non-number keys");
|
|
949
|
+
}
|
|
950
|
+
const read = { kind: "dynKeyGet", key: dk, value: obj, type: DYN, loc };
|
|
951
|
+
// Absence probes must keep the checked-dynamic undefined produced by
|
|
952
|
+
// a missing key. The ordinary read narrows to the checker's declared
|
|
953
|
+
// index value (and therefore validates it); ===/!==, ||, and ?? need
|
|
954
|
+
// to observe the missing value instead of throwing during that check.
|
|
955
|
+
return includeUndefined ? read : lowerer.maybeNarrow(read, expr);
|
|
956
|
+
}
|
|
957
|
+
if (litKey !== null) {
|
|
958
|
+
const nominal = representedClassFieldTarget(lowerer, expr.expression, litKey, obj);
|
|
959
|
+
if (nominal) {
|
|
960
|
+
const read = lowerer.fieldGetExpr(nominal, loc, expr);
|
|
961
|
+
return includeUndefined ? read : lowerer.maybeNarrow(read, expr);
|
|
962
|
+
}
|
|
963
|
+
}
|
|
964
|
+
if (hasClassPayload(lowerer, obj.type)) {
|
|
965
|
+
lowerer.unsupported("SC1090", expr, "computed property reads through structural views of class instances (use a declared literal key)");
|
|
966
|
+
}
|
|
967
|
+
// Predicates can strengthen optional fields without changing the
|
|
968
|
+
// receiver's stored layout. Use that layout for bracket reads just as
|
|
969
|
+
// fieldTarget does for the corresponding dot reads.
|
|
970
|
+
if (obj.type.kind === "record") {
|
|
971
|
+
const actualShape = lowerer.shapes.get(obj.type.shapeId);
|
|
972
|
+
if (!actualShape)
|
|
973
|
+
throw new InternalCompilerError("record receiver is missing its stored shape");
|
|
974
|
+
shapeId = obj.type.shapeId;
|
|
975
|
+
shape = actualShape;
|
|
976
|
+
}
|
|
977
|
+
if (litKey !== null) {
|
|
978
|
+
const field = shape.fields.find((f) => f.name === litKey);
|
|
979
|
+
if (field) {
|
|
980
|
+
const get = {
|
|
981
|
+
kind: "recordGet",
|
|
982
|
+
obj,
|
|
983
|
+
shapeId,
|
|
984
|
+
field: field.name,
|
|
985
|
+
type: field.type,
|
|
986
|
+
loc,
|
|
987
|
+
};
|
|
988
|
+
return lowerer.maybeNarrow(get, expr);
|
|
989
|
+
}
|
|
990
|
+
}
|
|
991
|
+
let key = litKey !== null
|
|
992
|
+
? { kind: "strLit", value: litKey, type: STRING, loc: locOf(keyNode) }
|
|
993
|
+
: lowerer.lowerExpr(keyNode);
|
|
994
|
+
// Optional string/number keys need ToPropertyKey, not a boxed copy of
|
|
995
|
+
// the receiver. Keep record reads on their native storage so nested
|
|
996
|
+
// references retain identity across index-signature reads.
|
|
997
|
+
if (key.type.kind === "union" &&
|
|
998
|
+
!lowerer.unions
|
|
999
|
+
.get(key.type.unionId)
|
|
1000
|
+
?.arms.some((arm) => arm.kind === "symbol" || arm.kind === "dyn")) {
|
|
1001
|
+
key = lowerRecordPropertyKey(lowerer, key, keyNode);
|
|
1002
|
+
}
|
|
1003
|
+
if ((key.type.kind === "symbol" || key.type.kind === "dyn" || key.type.kind === "union") &&
|
|
1004
|
+
lowerer.dynConvertible(key.type) &&
|
|
1005
|
+
lowerer.dynConvertible(obj.type)) {
|
|
1006
|
+
const read = {
|
|
1007
|
+
kind: "dynKeyGet",
|
|
1008
|
+
value: lowerer.coerceToExpected(obj, DYN),
|
|
1009
|
+
key: lowerer.coerceToExpected(key, DYN),
|
|
1010
|
+
type: DYN,
|
|
1011
|
+
loc,
|
|
1012
|
+
};
|
|
1013
|
+
return includeUndefined ? read : lowerer.maybeNarrow(read, expr);
|
|
1014
|
+
}
|
|
1015
|
+
// Runtime NUMBER keys ride the JS-exact formatter (o[n] is o[String(n)]
|
|
1016
|
+
// in JS — the number-keyed-signature access path).
|
|
1017
|
+
key = lowerRecordPropertyKey(lowerer, key, keyNode);
|
|
1018
|
+
if (key.type.kind !== "string") {
|
|
1019
|
+
lowerer.unsupported("SC1090", keyNode, "indexing records with non-string or non-number keys");
|
|
1020
|
+
}
|
|
1021
|
+
if (shape.fields.length === 0 && shape.indexValue === undefined) {
|
|
1022
|
+
const result = dynUndefinedExpr(loc);
|
|
1023
|
+
return {
|
|
1024
|
+
kind: "seqExpr",
|
|
1025
|
+
stmts: [
|
|
1026
|
+
{ kind: "exprStmt", expr: obj, loc },
|
|
1027
|
+
{ kind: "exprStmt", expr: key, loc },
|
|
1028
|
+
],
|
|
1029
|
+
result,
|
|
1030
|
+
type: DYN,
|
|
1031
|
+
loc,
|
|
1032
|
+
};
|
|
1033
|
+
}
|
|
1034
|
+
// The result type of the access — the index signature's value type
|
|
1035
|
+
// armed with undefined, or the declared fields' one common type on
|
|
1036
|
+
// signature-free shapes (tsc's keyof check proved membership; a
|
|
1037
|
+
// smuggled miss traps). On signature-free shapes the checker may have
|
|
1038
|
+
// NARROWED this occurrence (assignment CFA on literal keys) — maybeNarrow
|
|
1039
|
+
// bridges to the narrowed arm exactly like a field read.
|
|
1040
|
+
let declared = null;
|
|
1041
|
+
// An index-signature read is a JavaScript property read: a missing key
|
|
1042
|
+
// answers undefined even without noUncheckedIndexedAccess. The read keeps
|
|
1043
|
+
// that explicit optional union, as an ordinary array read does.
|
|
1044
|
+
let optionalRead = false;
|
|
1045
|
+
// A read whose every consumer treats undefined like NaN (see
|
|
1046
|
+
// nan-coded-reads.ts) is a plain number that is NaN for a missing key.
|
|
1047
|
+
const nanCoded = !includeUndefined &&
|
|
1048
|
+
shape.indexValue?.kind === "f64" &&
|
|
1049
|
+
lowerer.nanCodedReads?.isNumericRead(expr) === true;
|
|
1050
|
+
if (shape.indexValue) {
|
|
1051
|
+
declared = shape.indexValue;
|
|
1052
|
+
if (declared.kind !== "dyn" && !nanCoded) {
|
|
1053
|
+
declared = lowerer.withUndefinedArmOf(declared);
|
|
1054
|
+
if (!declared)
|
|
1055
|
+
lowerer.badType(expr, lowerer.typeOf(expr));
|
|
1056
|
+
optionalRead = true;
|
|
1057
|
+
}
|
|
1058
|
+
}
|
|
1059
|
+
else if (shape.fields.length > 0 &&
|
|
1060
|
+
shape.fields.every((f) => typeEquals(f.type, shape.fields[0].type))) {
|
|
1061
|
+
declared = shape.fields[0].type;
|
|
1062
|
+
}
|
|
1063
|
+
// Fields of different types answer a checked-dynamic value where nothing
|
|
1064
|
+
// typed the read: in JavaScript, and where the checker types it 'any'
|
|
1065
|
+
// (an object literal of a package's JavaScript indexed by a runtime key,
|
|
1066
|
+
// such as a numeric enum's reverse mapping).
|
|
1067
|
+
if (!declared &&
|
|
1068
|
+
(isJsSourceFile(ts.getSourceFileOfNode(expr)) ||
|
|
1069
|
+
(lowerer.typeOf(expr).flags & ts.TypeFlags.Any) !== 0) &&
|
|
1070
|
+
recordKeyResultOk(lowerer, shape, DYN))
|
|
1071
|
+
declared = DYN;
|
|
1072
|
+
if (!declared) {
|
|
1073
|
+
lowerer.unsupported("SC1090", expr, `dynamic keyed reads of '${lowerer.fmt({ kind: "record", shapeId })}' (the declared fields have no one common type)`);
|
|
1074
|
+
}
|
|
1075
|
+
// A LITERAL key naming no declared field can only hit the overflow:
|
|
1076
|
+
// the declared-field surfacing constraint doesn't apply.
|
|
1077
|
+
const overflowOnly = litKey !== null && !!shape.indexValue;
|
|
1078
|
+
if (!recordKeyResultOk(lowerer, overflowOnly ? { ...shape, fields: [] } : shape, declared)) {
|
|
1079
|
+
lowerer.unsupported("SC1090", expr, `dynamic keyed reads of '${lowerer.fmt({ kind: "record", shapeId })}' as '${lowerer.fmt(declared)}' (every declared field must be readable at that type)`);
|
|
1080
|
+
}
|
|
1081
|
+
const read = {
|
|
1082
|
+
kind: "recordKeyGet",
|
|
1083
|
+
obj,
|
|
1084
|
+
shapeId,
|
|
1085
|
+
key,
|
|
1086
|
+
...(overflowOnly ? { overflowOnly: true } : {}),
|
|
1087
|
+
...(nanCoded ? { missNaN: true } : {}),
|
|
1088
|
+
type: declared,
|
|
1089
|
+
loc,
|
|
1090
|
+
};
|
|
1091
|
+
if (nanCoded)
|
|
1092
|
+
return read;
|
|
1093
|
+
return includeUndefined || optionalRead ? read : lowerer.maybeNarrow(read, expr);
|
|
1094
|
+
}
|
|
1095
|
+
/** ToPropertyKey for represented record keys. Missing array-derived string
|
|
1096
|
+
* values remain real undefined values, whose JavaScript property spelling
|
|
1097
|
+
* is the string "undefined". */
|
|
1098
|
+
function lowerRecordPropertyKey(lowerer, key, node) {
|
|
1099
|
+
if (key.type.kind === "union" && lowerer.dynConvertible(key.type)) {
|
|
1100
|
+
return {
|
|
1101
|
+
kind: "libCall",
|
|
1102
|
+
fn: "dyn.toStringCoerce",
|
|
1103
|
+
args: [lowerer.coerceInto(node, key, DYN)],
|
|
1104
|
+
type: STRING,
|
|
1105
|
+
loc: key.loc,
|
|
1106
|
+
};
|
|
1107
|
+
}
|
|
1108
|
+
if (key.type.kind === "f64" ||
|
|
1109
|
+
key.type.kind === "bool" ||
|
|
1110
|
+
key.type.kind === "dyn" ||
|
|
1111
|
+
lowerer.runtimeOptionalWidening(key.type, STRING) !== null) {
|
|
1112
|
+
return lowerer.ensureString(key, node);
|
|
1113
|
+
}
|
|
1114
|
+
return key;
|
|
1115
|
+
}
|
|
1116
|
+
/** The compile-time string spelling of a record key literal: a string
|
|
1117
|
+
* literal's text, or a NON-NEGATIVE numeric literal's canonical JS
|
|
1118
|
+
* spelling (`1` → "1", `1e21` → "1e+21" — String(Number(text)), which is
|
|
1119
|
+
* exactly the key JS derives; negative/computed keys stay runtime
|
|
1120
|
+
* expressions and canonicalize through ensureString instead). Null for
|
|
1121
|
+
* everything else. */
|
|
1122
|
+
function recordKeyLiteralText(node) {
|
|
1123
|
+
if (ts.isStringLiteral(node))
|
|
1124
|
+
return node.text;
|
|
1125
|
+
if (ts.isNumericLiteral(node))
|
|
1126
|
+
return String(Number(node.text));
|
|
1127
|
+
return null;
|
|
1128
|
+
}
|
|
1129
|
+
/** The compile-time key an IDENTIFIER's TYPE proves: a key variable whose
|
|
1130
|
+
* (narrowed) type is one string/number literal — `const k: "a" = …; o[k]`,
|
|
1131
|
+
* and the generic-body form where k's type is a keyof-constrained
|
|
1132
|
+
* parameter bound to a literal (`pick(o, "a")`'s instance reads `o[k]`
|
|
1133
|
+
* with K = "a", resolved through typeParamTsBindings). Identifier reads
|
|
1134
|
+
* are pure, so the static field read may skip evaluating the key exactly
|
|
1135
|
+
* like a syntactic literal. Null anywhere the type keeps more than one
|
|
1136
|
+
* key. */
|
|
1137
|
+
function recordKeyTypeLiteralText(lowerer, node) {
|
|
1138
|
+
if (!ts.isIdentifier(node))
|
|
1139
|
+
return null;
|
|
1140
|
+
let t = lowerer.typeOf(node);
|
|
1141
|
+
if (t.flags & ts.TypeFlags.TypeParameter) {
|
|
1142
|
+
const bound = lowerer.typeParamTsResolver(t);
|
|
1143
|
+
if (!bound)
|
|
1144
|
+
return null;
|
|
1145
|
+
t = bound;
|
|
1146
|
+
}
|
|
1147
|
+
if (t.isStringLiteralType())
|
|
1148
|
+
return t.value;
|
|
1149
|
+
if (t.isNumberLiteralType()) {
|
|
1150
|
+
const n = t.value;
|
|
1151
|
+
return Number.isFinite(n) && n >= 0 ? String(n) : null;
|
|
1152
|
+
}
|
|
1153
|
+
return null;
|
|
1154
|
+
}
|
|
1155
|
+
/** The literal index of a tuple access, or null when the expression isn't
|
|
1156
|
+
* a non-negative integer literal (parentheses tolerated — tsc's own
|
|
1157
|
+
* literal-index typing accepts them). */
|
|
1158
|
+
function tupleLiteralIndex(node) {
|
|
1159
|
+
let e = node;
|
|
1160
|
+
while (ts.isParenthesizedExpression(e))
|
|
1161
|
+
e = e.expression;
|
|
1162
|
+
if (!ts.isNumericLiteral(e))
|
|
1163
|
+
return null;
|
|
1164
|
+
const n = Number(e.text);
|
|
1165
|
+
return Number.isInteger(n) && n >= 0 ? n : null;
|
|
1166
|
+
}
|
|
1167
|
+
export function lowerElementCompoundParts(lowerer, expr, op, statement) {
|
|
1168
|
+
const target = expr.left;
|
|
1169
|
+
fenceNodeModuleMutation(lowerer, target, "assignment");
|
|
1170
|
+
const loc = locOf(expr);
|
|
1171
|
+
// A record through a computed key (`totals[side] += n` with a literal
|
|
1172
|
+
// union key, `counts[name] += 1` on an index-signature record): the
|
|
1173
|
+
// member compound's receiver, key, old value, rhs, write sequence.
|
|
1174
|
+
if (isKeyedFieldAccess(lowerer, target))
|
|
1175
|
+
return { expr: lowerFieldCompoundValue(lowerer, target, op, expr.right, loc), stmts: null };
|
|
1176
|
+
const checked = lowerer.lowerExpr(target.expression);
|
|
1177
|
+
if (checked?.type.kind === "dyn" && isJsSourceFile(ts.getSourceFileOfNode(expr))) {
|
|
1178
|
+
const stmts = [];
|
|
1179
|
+
const save = (value, name) => {
|
|
1180
|
+
const local = lowerer.declareHiddenLocal(name, value.type);
|
|
1181
|
+
stmts.push({ kind: "varDecl", localId: local.id, init: value, loc });
|
|
1182
|
+
return varRef(local.id, value.type, loc);
|
|
1183
|
+
};
|
|
1184
|
+
const receiver = save(checked, "%compoundReceiver");
|
|
1185
|
+
const key = save(lowerer.lowerExprExpecting(target.argumentExpression, DYN), "%compoundKey");
|
|
1186
|
+
const old = save({ kind: "dynKeyGet", value: receiver, key, type: DYN, loc }, "%compoundOld");
|
|
1187
|
+
const rhs = lowerer.lowerExprExpecting(expr.right, DYN);
|
|
1188
|
+
const numeric = ["-", "*", "/", "%", "**"].includes(op);
|
|
1189
|
+
const value = save({
|
|
1190
|
+
kind: "libCall",
|
|
1191
|
+
fn: op === "+" ? "dyn.add" : numeric ? "dyn.arithmetic" : "dyn.bitwise",
|
|
1192
|
+
args: op === "+" ? [old, rhs] : [old, rhs, strLit(op, loc)],
|
|
1193
|
+
type: DYN,
|
|
1194
|
+
loc,
|
|
1195
|
+
}, "%compoundResult");
|
|
1196
|
+
stmts.push({
|
|
1197
|
+
kind: "exprStmt",
|
|
1198
|
+
expr: {
|
|
1199
|
+
kind: "libCall",
|
|
1200
|
+
fn: "dyn.keySetComputed",
|
|
1201
|
+
args: [receiver, key, value],
|
|
1202
|
+
type: VOID,
|
|
1203
|
+
loc,
|
|
1204
|
+
},
|
|
1205
|
+
loc,
|
|
1206
|
+
});
|
|
1207
|
+
return { expr: { kind: "seqExpr", stmts, result: value, type: DYN, loc }, stmts: null };
|
|
1208
|
+
}
|
|
1209
|
+
const receiverType = checked.type.kind === "array" || checked.type.kind === "bytes"
|
|
1210
|
+
? checked.type
|
|
1211
|
+
: lowerer.mapTypeOf(lowerer.typeOf(target.expression));
|
|
1212
|
+
if (receiverType?.kind !== "array" && receiverType?.kind !== "bytes") {
|
|
1213
|
+
lowerer.unsupported("SC1090", target, "compound assignment to non-array elements");
|
|
1214
|
+
}
|
|
1215
|
+
let receiver = checked;
|
|
1216
|
+
if (receiver.type.kind === "union" && lowerer.armTag(receiver.type.unionId, UNDEFINED_T) >= 0) {
|
|
1217
|
+
const present = lowerer.stripUndefinedArm(receiver.type);
|
|
1218
|
+
const helper = present.kind === receiverType.kind
|
|
1219
|
+
? lowerer.narrowedArmHelper(receiver.type.unionId, present, locOf(target.expression))
|
|
1220
|
+
: null;
|
|
1221
|
+
if (helper)
|
|
1222
|
+
receiver = lowerer.checkedNarrowCall(helper, receiver, present, locOf(target.expression));
|
|
1223
|
+
}
|
|
1224
|
+
if (receiver.type.kind !== receiverType.kind) {
|
|
1225
|
+
lowerer.unsupported("SC1090", target.expression, "compound assignment through a non-native array or byte view");
|
|
1226
|
+
}
|
|
1227
|
+
const index = lowerOptionalNumber(lowerer, lowerer.lowerExpr(target.argumentExpression), locOf(target.argumentExpression), target.argumentExpression);
|
|
1228
|
+
if (index.type.kind !== "f64")
|
|
1229
|
+
lowerer.unsupported("SC1090", target.argumentExpression, "indexing with non-number keys");
|
|
1230
|
+
const receiverLocal = lowerer.declareHiddenLocal("%compoundArray", receiver.type);
|
|
1231
|
+
const indexLocal = lowerer.declareHiddenLocal("%compoundIndex", F64);
|
|
1232
|
+
const receiverRef = () => varRef(receiverLocal.id, receiver.type, loc);
|
|
1233
|
+
const indexRef = () => varRef(indexLocal.id, F64, loc);
|
|
1234
|
+
const oldValue = receiver.type.kind === "array"
|
|
1235
|
+
? receiver.type.elem.kind === "f64"
|
|
1236
|
+
? // Every numeric operator applies ToNumber to the old value, so a
|
|
1237
|
+
// missing element is NaN without materializing `number | undefined`.
|
|
1238
|
+
arrayNumberRead(receiverRef(), indexRef(), locOf(target))
|
|
1239
|
+
: receiver.type.elem.kind === "string" && op === "+"
|
|
1240
|
+
? arrayStringOperand(receiverRef(), indexRef(), locOf(target))
|
|
1241
|
+
: arrayValueRead(lowerer, receiverRef(), indexRef(), receiver.type.elem, locOf(target))
|
|
1242
|
+
: {
|
|
1243
|
+
// An invalid index reads undefined in Node, which every numeric
|
|
1244
|
+
// compound operator turns into NaN; the write is then ignored.
|
|
1245
|
+
kind: "bytesIntrinsic",
|
|
1246
|
+
method: "get",
|
|
1247
|
+
receiver: receiverRef(),
|
|
1248
|
+
args: [indexRef()],
|
|
1249
|
+
type: F64,
|
|
1250
|
+
loc: locOf(target),
|
|
1251
|
+
invalidNaN: true,
|
|
1252
|
+
};
|
|
1253
|
+
const oldLocal = lowerer.declareHiddenLocal("%compoundOld", oldValue.type);
|
|
1254
|
+
const oldRef = () => varRef(oldLocal.id, oldValue.type, loc);
|
|
1255
|
+
const rhs = lowerer.lowerExpr(expr.right);
|
|
1256
|
+
const numericRhs = rhs.type.kind === "dyn" &&
|
|
1257
|
+
isJsSourceFile(ts.getSourceFileOfNode(expr)) &&
|
|
1258
|
+
receiver.type.kind === "bytes"
|
|
1259
|
+
? { kind: "libCall", fn: "dyn.toNumberCoerce", args: [rhs], type: F64, loc }
|
|
1260
|
+
: lowerOptionalNumber(lowerer, rhs, loc);
|
|
1261
|
+
const elementType = receiver.type.kind === "array" ? receiver.type.elem : F64;
|
|
1262
|
+
const valueType = elementType.kind === "union" && lowerer.armTag(elementType.unionId, UNDEFINED_T) >= 0
|
|
1263
|
+
? lowerer.stripUndefinedArm(elementType)
|
|
1264
|
+
: elementType;
|
|
1265
|
+
if (statement &&
|
|
1266
|
+
op === "+" &&
|
|
1267
|
+
receiver.type.kind === "array" &&
|
|
1268
|
+
receiver.type.elem.kind === "string") {
|
|
1269
|
+
// Receiver, index, old element (read inside the concat), rhs, write.
|
|
1270
|
+
const appended = {
|
|
1271
|
+
kind: "strConcat",
|
|
1272
|
+
left: oldValue,
|
|
1273
|
+
right: concatOperand(lowerer, rhs, expr.right),
|
|
1274
|
+
type: STRING,
|
|
1275
|
+
loc,
|
|
1276
|
+
};
|
|
1277
|
+
return {
|
|
1278
|
+
expr: null,
|
|
1279
|
+
stmts: [
|
|
1280
|
+
{ kind: "varDecl", localId: receiverLocal.id, init: receiver, loc },
|
|
1281
|
+
{ kind: "varDecl", localId: indexLocal.id, init: index, loc },
|
|
1282
|
+
{ kind: "arraySet", arr: receiverRef(), index: indexRef(), value: appended, loc },
|
|
1283
|
+
],
|
|
1284
|
+
};
|
|
1285
|
+
}
|
|
1286
|
+
let computed;
|
|
1287
|
+
if (op === "+" && valueType.kind === "string") {
|
|
1288
|
+
computed = {
|
|
1289
|
+
kind: "strConcat",
|
|
1290
|
+
left: lowerer.ensureString(oldRef(), target),
|
|
1291
|
+
right: concatOperand(lowerer, rhs, expr.right),
|
|
1292
|
+
type: STRING,
|
|
1293
|
+
loc,
|
|
1294
|
+
};
|
|
1295
|
+
}
|
|
1296
|
+
else if (valueType.kind === "f64" && numericRhs.type.kind === "f64") {
|
|
1297
|
+
computed = {
|
|
1298
|
+
kind: "bin",
|
|
1299
|
+
op,
|
|
1300
|
+
left: lowerOptionalNumber(lowerer, oldRef(), loc),
|
|
1301
|
+
right: numericRhs,
|
|
1302
|
+
type: F64,
|
|
1303
|
+
loc,
|
|
1304
|
+
};
|
|
1305
|
+
}
|
|
1306
|
+
else if (valueType.kind === "dyn" && isJsSourceFile(ts.getSourceFileOfNode(expr))) {
|
|
1307
|
+
const left = lowerer.coerceToExpected(oldRef(), DYN), right = lowerer.coerceToExpected(rhs, DYN);
|
|
1308
|
+
computed = dynCompoundValue(op, left, right, loc);
|
|
1309
|
+
}
|
|
1310
|
+
else if (rhs.type.kind === "dyn" &&
|
|
1311
|
+
receiver.type.kind === "array" &&
|
|
1312
|
+
lowerer.dynConvertible(oldValue.type) &&
|
|
1313
|
+
lowerer.dynConvertible(valueType)) {
|
|
1314
|
+
// An untyped right operand: the expanded `a[i] = a[i] op rhs`, checked
|
|
1315
|
+
// back into the element type.
|
|
1316
|
+
computed = lowerer.coerceInto(expr, dynCompoundValue(op, lowerer.coerceToExpected(oldRef(), DYN), lowerer.coerceToExpected(rhs, DYN), loc), valueType);
|
|
1317
|
+
}
|
|
1318
|
+
else {
|
|
1319
|
+
compoundUnsupported(lowerer, expr, op, oldValue.type, rhs.type);
|
|
1320
|
+
}
|
|
1321
|
+
const resultLocal = lowerer.declareHiddenLocal("%compoundResult", computed.type);
|
|
1322
|
+
const resultRef = () => varRef(resultLocal.id, computed.type, loc);
|
|
1323
|
+
const write = receiver.type.kind === "array"
|
|
1324
|
+
? arrayValueStore(lowerer, receiverRef(), indexRef(), resultRef(), receiver.type.elem, loc)
|
|
1325
|
+
: { kind: "bytesSet", arr: receiverRef(), index: indexRef(), value: resultRef(), loc };
|
|
1326
|
+
return {
|
|
1327
|
+
expr: {
|
|
1328
|
+
kind: "seqExpr",
|
|
1329
|
+
stmts: [
|
|
1330
|
+
{ kind: "varDecl", localId: receiverLocal.id, init: receiver, loc },
|
|
1331
|
+
{ kind: "varDecl", localId: indexLocal.id, init: index, loc },
|
|
1332
|
+
{ kind: "varDecl", localId: oldLocal.id, init: oldValue, loc },
|
|
1333
|
+
{ kind: "varDecl", localId: resultLocal.id, init: computed, loc },
|
|
1334
|
+
write,
|
|
1335
|
+
],
|
|
1336
|
+
result: resultRef(),
|
|
1337
|
+
type: computed.type,
|
|
1338
|
+
loc,
|
|
1339
|
+
},
|
|
1340
|
+
stmts: null,
|
|
1341
|
+
};
|
|
1342
|
+
}
|
|
1343
|
+
/** ToString of one stabilized `string[]` element read for `+=`: a missing
|
|
1344
|
+
* element concatenates as "undefined". */
|
|
1345
|
+
function arrayStringOperand(arr, index, loc) {
|
|
1346
|
+
return {
|
|
1347
|
+
kind: "ternary",
|
|
1348
|
+
cond: {
|
|
1349
|
+
kind: "bin",
|
|
1350
|
+
op: "===",
|
|
1351
|
+
left: { kind: "arrayState", arr, index, type: F64, loc },
|
|
1352
|
+
right: { kind: "numLit", value: 1, type: F64, loc },
|
|
1353
|
+
type: BOOL,
|
|
1354
|
+
loc,
|
|
1355
|
+
},
|
|
1356
|
+
then: { kind: "arrayGet", arr, index, type: STRING, loc },
|
|
1357
|
+
else_: strLit("undefined", loc),
|
|
1358
|
+
type: STRING,
|
|
1359
|
+
loc,
|
|
1360
|
+
};
|
|
1361
|
+
}
|
|
1362
|
+
export function lowerElementWrite(lowerer, expr) {
|
|
1363
|
+
const prototype = lowerClassPrototypeComputedAssignment(lowerer, expr);
|
|
1364
|
+
if (prototype)
|
|
1365
|
+
return { kind: "exprStmt", expr: prototype, loc: locOf(expr) };
|
|
1366
|
+
const target = expr.left;
|
|
1367
|
+
fenceNodeModuleMutation(lowerer, target, "assignment");
|
|
1368
|
+
const globalKey = globalSymbolKey(lowerer, target.expression, target.argumentExpression);
|
|
1369
|
+
if (globalKey) {
|
|
1370
|
+
const value = lowerer.lowerExprExpecting(expr.right, DYN);
|
|
1371
|
+
const loc = locOf(expr);
|
|
1372
|
+
return {
|
|
1373
|
+
kind: "exprStmt",
|
|
1374
|
+
expr: {
|
|
1375
|
+
kind: "libCall",
|
|
1376
|
+
fn: "dyn.globalSymbolSet",
|
|
1377
|
+
args: [globalKey, value],
|
|
1378
|
+
type: VOID,
|
|
1379
|
+
loc,
|
|
1380
|
+
},
|
|
1381
|
+
loc,
|
|
1382
|
+
};
|
|
1383
|
+
}
|
|
1384
|
+
// `process.env[key] = v` — the computed twin of the dotted env write:
|
|
1385
|
+
// setenv(3), string keys and string values only.
|
|
1386
|
+
if (lowerer.isProcessEnv(target.expression) && !target.questionDotToken) {
|
|
1387
|
+
const loc = locOf(expr);
|
|
1388
|
+
const key = lowerEnvironmentKey(lowerer, target.argumentExpression);
|
|
1389
|
+
if (key.type.kind !== "string") {
|
|
1390
|
+
lowerer.unsupported("SC1090", target.argumentExpression, "indexing process.env with non-string keys");
|
|
1391
|
+
}
|
|
1392
|
+
const value = lowerer.lowerExpr(expr.right);
|
|
1393
|
+
if (value.type.kind !== "string") {
|
|
1394
|
+
lowerer.unsupported("SC1090", expr.right, `assigning '${lowerer.fmt(value.type)}' values to process.env (env values are strings — convert first: \`\${v}\`)`);
|
|
1395
|
+
}
|
|
1396
|
+
return {
|
|
1397
|
+
kind: "exprStmt",
|
|
1398
|
+
expr: { kind: "libCall", fn: "process.envSet", args: [key, value], type: VOID, loc },
|
|
1399
|
+
loc,
|
|
1400
|
+
};
|
|
1401
|
+
}
|
|
1402
|
+
// Symbol-keyed property WRITES (`this[kLimit] = v`): the read path's
|
|
1403
|
+
// twin — a statically-resolvable unique-symbol key declared on the
|
|
1404
|
+
// receiver's class writes the hidden field slot; everything else keeps
|
|
1405
|
+
// the fence (static shapes have no symbol-keyed storage).
|
|
1406
|
+
if (lowerer.mapTypeOf(lowerer.typeOf(target.argumentExpression))?.kind === "symbol") {
|
|
1407
|
+
const fieldT = symbolFieldTarget(lowerer, target);
|
|
1408
|
+
if (fieldT) {
|
|
1409
|
+
const value = lowerer.lowerExprExpecting(expr.right, fieldT.fieldType);
|
|
1410
|
+
return lowerer.fieldSetStmt(fieldT, value, locOf(expr), target);
|
|
1411
|
+
}
|
|
1412
|
+
const receiver = lowerer.lowerExpr(target.expression);
|
|
1413
|
+
if (receiver.type.kind === "dyn")
|
|
1414
|
+
return {
|
|
1415
|
+
kind: "exprStmt",
|
|
1416
|
+
expr: lowerDynMemberAssignment(lowerer, expr, receiver),
|
|
1417
|
+
loc: locOf(expr),
|
|
1418
|
+
};
|
|
1419
|
+
if (isJsSourceFile(ts.getSourceFileOfNode(expr)) &&
|
|
1420
|
+
receiver.type.kind === "object" &&
|
|
1421
|
+
lowerer.dynConvertible(receiver.type)) {
|
|
1422
|
+
return {
|
|
1423
|
+
kind: "exprStmt",
|
|
1424
|
+
expr: lowerDynMemberAssignment(lowerer, expr, lowerer.coerceToExpected(receiver, DYN)),
|
|
1425
|
+
loc: locOf(expr),
|
|
1426
|
+
};
|
|
1427
|
+
}
|
|
1428
|
+
lowerer.unsupported("SC1090", target, "symbol-keyed property writes outside class fields keyed by a stable module-level literal Symbol()/Symbol.for() (other static shapes have no symbol-keyed storage)");
|
|
1429
|
+
}
|
|
1430
|
+
const checkedReceiver = tryLowerExpression(lowerer, target.expression);
|
|
1431
|
+
if (checkedReceiver?.type.kind === "dyn") {
|
|
1432
|
+
return {
|
|
1433
|
+
kind: "exprStmt",
|
|
1434
|
+
expr: lowerDynMemberAssignment(lowerer, expr, checkedReceiver),
|
|
1435
|
+
loc: locOf(expr),
|
|
1436
|
+
};
|
|
1437
|
+
}
|
|
1438
|
+
if (checkedReceiver?.type.kind === "object" && isJsSourceFile(ts.getSourceFileOfNode(expr))) {
|
|
1439
|
+
const info = lowerer.classes.get(checkedReceiver.type.className);
|
|
1440
|
+
const key = recordKeyLiteralText(target.argumentExpression) ??
|
|
1441
|
+
recordKeyTypeLiteralText(lowerer, target.argumentExpression);
|
|
1442
|
+
if (info && key !== null && isClassCallback(lowerer, info, key)) {
|
|
1443
|
+
const receiver = lowerer.coerceInto(target.expression, checkedReceiver, DYN);
|
|
1444
|
+
return {
|
|
1445
|
+
kind: "exprStmt",
|
|
1446
|
+
expr: lowerDynMemberAssignment(lowerer, expr, receiver),
|
|
1447
|
+
loc: locOf(expr),
|
|
1448
|
+
};
|
|
1449
|
+
}
|
|
1450
|
+
}
|
|
1451
|
+
let receiverIr = lowerer.mapTypeOf(lowerer.typeOf(target.expression));
|
|
1452
|
+
if (isJsSourceFile(ts.getSourceFileOfNode(expr)) && checkedReceiver) {
|
|
1453
|
+
const represented = checkedReceiver.type.kind === "union"
|
|
1454
|
+
? lowerer.stripUndefinedArm(checkedReceiver.type)
|
|
1455
|
+
: checkedReceiver.type;
|
|
1456
|
+
if (represented.kind === "array" || represented.kind === "bytes")
|
|
1457
|
+
receiverIr = represented;
|
|
1458
|
+
}
|
|
1459
|
+
if (receiverIr === null || receiverIr.kind === "dyn") {
|
|
1460
|
+
const receiver = tryLowerExpression(lowerer, target.expression);
|
|
1461
|
+
if (receiver?.type.kind === "array")
|
|
1462
|
+
receiverIr = receiver.type;
|
|
1463
|
+
}
|
|
1464
|
+
// A checked-dynamic receiver TYPE (`unknown[]` and the collapsed
|
|
1465
|
+
// `(string | object)[]` map to DYN wholesale now): the dyn keyed
|
|
1466
|
+
// write — dyn.keySet. Number keys canonicalize through the JS-exact
|
|
1467
|
+
// formatter; ARR receivers take canonical index keys as element
|
|
1468
|
+
// set/extend (undefined-hole padding, JS's length growth exactly),
|
|
1469
|
+
// OBJ receivers set the member, and the runtime throws Node's
|
|
1470
|
+
// TypeErrors on every other kind. Values convert into the checked-dynamic tree;
|
|
1471
|
+
// unconvertible ones fence per site (the dynFrom stance).
|
|
1472
|
+
if (receiverIr?.kind === "dyn") {
|
|
1473
|
+
const obj = lowerer.lowerExpr(target.expression);
|
|
1474
|
+
if (obj.type.kind === "dyn") {
|
|
1475
|
+
const loc = locOf(expr);
|
|
1476
|
+
const key = lowerRecordPropertyKey(lowerer, lowerer.lowerExpr(target.argumentExpression), target.argumentExpression);
|
|
1477
|
+
if (key.type.kind !== "string") {
|
|
1478
|
+
lowerer.unsupported("SC1090", target.argumentExpression, "indexing with non-string or non-number keys");
|
|
1479
|
+
}
|
|
1480
|
+
const value = lowerer.coerceToExpected(lowerer.lowerExpr(expr.right), DYN);
|
|
1481
|
+
if (value.type.kind !== "dyn") {
|
|
1482
|
+
lowerer.unsupported("SC1101", expr.right, `storing '${lowerer.fmt(value.type)}' values in a checked-dynamic array (the value cannot convert into the checked-dynamic tree)`);
|
|
1483
|
+
}
|
|
1484
|
+
return {
|
|
1485
|
+
kind: "exprStmt",
|
|
1486
|
+
expr: { kind: "libCall", fn: "dyn.keySet", args: [obj, key, value], type: VOID, loc },
|
|
1487
|
+
loc,
|
|
1488
|
+
};
|
|
1489
|
+
}
|
|
1490
|
+
}
|
|
1491
|
+
if (receiverIr?.kind === "object" || receiverIr?.kind === "record") {
|
|
1492
|
+
const key = recordKeyLiteralText(target.argumentExpression) ??
|
|
1493
|
+
recordKeyTypeLiteralText(lowerer, target.argumentExpression);
|
|
1494
|
+
if (key !== null) {
|
|
1495
|
+
const receiver = lowerer.lowerExpr(target.expression);
|
|
1496
|
+
const field = representedClassFieldTarget(lowerer, target.expression, key, receiver);
|
|
1497
|
+
if (field) {
|
|
1498
|
+
const value = lowerer.lowerExprExpecting(expr.right, field.fieldType);
|
|
1499
|
+
return lowerer.fieldSetStmt(field, value, locOf(expr), target);
|
|
1500
|
+
}
|
|
1501
|
+
if (hasClassPayload(lowerer, receiver.type)) {
|
|
1502
|
+
if (receiver.type.kind === "object" && receiver.type.className === "%Error") {
|
|
1503
|
+
return {
|
|
1504
|
+
kind: "exprStmt",
|
|
1505
|
+
expr: lowerDynMemberAssignment(lowerer, expr, lowerer.coerceInto(target.expression, receiver, DYN)),
|
|
1506
|
+
loc: locOf(expr),
|
|
1507
|
+
};
|
|
1508
|
+
}
|
|
1509
|
+
lowerer.unsupported("SC1090", target, "writing undeclared properties through structural views of class instances");
|
|
1510
|
+
}
|
|
1511
|
+
}
|
|
1512
|
+
}
|
|
1513
|
+
// Typed-array element write `b[i] = v` — bytesSet: the value is an f64
|
|
1514
|
+
// the runtime coerces JS-exactly; invalid indices are ignored.
|
|
1515
|
+
if (receiverIr?.kind === "bytes") {
|
|
1516
|
+
const recv = lowerer.lowerExpr(target.expression);
|
|
1517
|
+
// The checker's flow type is a typed array, but the storage is wider.
|
|
1518
|
+
if (recv.type.kind !== "bytes")
|
|
1519
|
+
return lowerWiderBytesWrite(lowerer, expr, target, recv);
|
|
1520
|
+
// An index the checker types as a number but whose storage may hold
|
|
1521
|
+
// undefined (a hole read) converts with ToNumber, as the reads do.
|
|
1522
|
+
const index = lowerOptionalNumber(lowerer, lowerer.lowerExpr(target.argumentExpression), locOf(target.argumentExpression), target.argumentExpression);
|
|
1523
|
+
if (index.type.kind === "dyn" && recv.type.kind === "bytes") {
|
|
1524
|
+
return {
|
|
1525
|
+
kind: "exprStmt",
|
|
1526
|
+
expr: lowerDynMemberAssignment(lowerer, expr, lowerer.coerceInto(target.expression, recv, DYN)),
|
|
1527
|
+
loc: locOf(expr),
|
|
1528
|
+
};
|
|
1529
|
+
}
|
|
1530
|
+
if (index.type.kind !== "f64") {
|
|
1531
|
+
lowerer.unsupported("SC1090", target.argumentExpression, "indexing with non-number keys");
|
|
1532
|
+
}
|
|
1533
|
+
const value = lowerer.lowerExprExpecting(expr.right, F64);
|
|
1534
|
+
return { kind: "bytesSet", arr: recv, index, value, loc: locOf(expr) };
|
|
1535
|
+
}
|
|
1536
|
+
// Tuple element write `t[0] = v`: a positional-field write (recordSet)
|
|
1537
|
+
// — literal indices only, like the read.
|
|
1538
|
+
if (receiverIr?.kind === "record") {
|
|
1539
|
+
const shape = lowerer.shapes.get(receiverIr.shapeId);
|
|
1540
|
+
if (shape) {
|
|
1541
|
+
const obj = lowerer.lowerExpr(target.expression);
|
|
1542
|
+
if (hasClassPayload(lowerer, obj.type)) {
|
|
1543
|
+
lowerer.unsupported("SC1090", target, "computed property writes through structural views of class instances (use a declared literal key)");
|
|
1544
|
+
}
|
|
1545
|
+
// A record-mapped CHECKER type over a VALUE living in the checked-dynamic tree (a
|
|
1546
|
+
// JS file-scope object-literal global): the checked-dynamic keyed
|
|
1547
|
+
// write — dyn.keySet (later writes win, insertion order; Node's
|
|
1548
|
+
// TypeErrors on non-object receivers), the value converting into
|
|
1549
|
+
// the checked-dynamic tree. Literal and runtime keys alike: the checked-dynamic tree's key set is
|
|
1550
|
+
// open, so no declared-field collision analysis applies.
|
|
1551
|
+
if (obj.type.kind === "dyn") {
|
|
1552
|
+
const loc = locOf(expr);
|
|
1553
|
+
const litKey = recordKeyLiteralText(target.argumentExpression);
|
|
1554
|
+
let key = litKey !== null
|
|
1555
|
+
? { kind: "strLit", value: litKey, type: STRING, loc: locOf(target.argumentExpression) }
|
|
1556
|
+
: lowerer.lowerExpr(target.argumentExpression);
|
|
1557
|
+
key = lowerRecordPropertyKey(lowerer, key, target.argumentExpression);
|
|
1558
|
+
if (key.type.kind !== "string") {
|
|
1559
|
+
lowerer.unsupported("SC1090", target.argumentExpression, "indexing records with non-string or non-number keys");
|
|
1560
|
+
}
|
|
1561
|
+
const value = lowerer.coerceToExpected(lowerer.lowerExpr(expr.right), DYN);
|
|
1562
|
+
if (value.type.kind !== "dyn") {
|
|
1563
|
+
lowerer.unsupported("SC1101", expr.right, `storing '${lowerer.fmt(value.type)}' values in a checked-dynamic object (the value cannot convert into the checked-dynamic tree)`);
|
|
1564
|
+
}
|
|
1565
|
+
return {
|
|
1566
|
+
kind: "exprStmt",
|
|
1567
|
+
expr: { kind: "libCall", fn: "dyn.keySet", args: [obj, key, value], type: VOID, loc },
|
|
1568
|
+
loc,
|
|
1569
|
+
};
|
|
1570
|
+
}
|
|
1571
|
+
}
|
|
1572
|
+
if (shape?.tuple) {
|
|
1573
|
+
const idx = tupleLiteralIndex(target.argumentExpression);
|
|
1574
|
+
if (idx === null) {
|
|
1575
|
+
lowerer.unsupported("SC1090", target.argumentExpression, "tuple indexing with a non-literal index (tuples are fixed-shape — use t[0], t[1], ...)");
|
|
1576
|
+
}
|
|
1577
|
+
const fieldType = shape.fields.find((f) => f.name === String(idx))?.type;
|
|
1578
|
+
if (fieldType === undefined)
|
|
1579
|
+
lowerer.badType(target, lowerer.typeOf(target));
|
|
1580
|
+
const obj = lowerer.lowerExpr(target.expression);
|
|
1581
|
+
const value = lowerer.lowerExprExpecting(expr.right, fieldType);
|
|
1582
|
+
return {
|
|
1583
|
+
kind: "recordSet",
|
|
1584
|
+
obj,
|
|
1585
|
+
shapeId: receiverIr.shapeId,
|
|
1586
|
+
field: String(idx),
|
|
1587
|
+
value,
|
|
1588
|
+
loc: locOf(expr),
|
|
1589
|
+
};
|
|
1590
|
+
}
|
|
1591
|
+
// Dynamic keyed write `r[k] = v` — index-signature shapes only (a
|
|
1592
|
+
// declared-only shape's writable key set is closed; spell the field).
|
|
1593
|
+
// A LITERAL declared key is the bracket spelling of a field write.
|
|
1594
|
+
// Values flow into the index-value slot (dyn slots convert, typed
|
|
1595
|
+
// slots coerce); declared-key collisions at runtime validate against
|
|
1596
|
+
// the field's type through the emitted helper (a mismatch throws the
|
|
1597
|
+
// catchable TypeError — SEMANTICS.md).
|
|
1598
|
+
if (shape && !shape.tuple) {
|
|
1599
|
+
const guarded = lowerGuardedRecordWrite(lowerer, expr, target);
|
|
1600
|
+
if (guarded)
|
|
1601
|
+
return guarded;
|
|
1602
|
+
// Literal keys — string literals AND numeric literals in their
|
|
1603
|
+
// canonical string spelling (`b[1] = v` writes field/key "1", JS's
|
|
1604
|
+
// own key derivation) — name declared fields directly. A key
|
|
1605
|
+
// IDENTIFIER whose TYPE proves one literal (a literal-typed const,
|
|
1606
|
+
// a keyof-constrained type parameter bound to a literal inside a
|
|
1607
|
+
// generic instance — `set(o, "a", v)`'s body writing `o[k] = v`)
|
|
1608
|
+
// is the same static field write.
|
|
1609
|
+
const litKey = recordKeyLiteralText(target.argumentExpression) ??
|
|
1610
|
+
recordKeyTypeLiteralText(lowerer, target.argumentExpression);
|
|
1611
|
+
if (litKey !== null) {
|
|
1612
|
+
const field = shape.fields.find((f) => f.name === litKey);
|
|
1613
|
+
if (field) {
|
|
1614
|
+
const obj = lowerer.lowerExpr(target.expression);
|
|
1615
|
+
const value = lowerer.lowerExprExpecting(expr.right, field.type);
|
|
1616
|
+
return {
|
|
1617
|
+
kind: "recordSet",
|
|
1618
|
+
obj,
|
|
1619
|
+
shapeId: receiverIr.shapeId,
|
|
1620
|
+
field: litKey,
|
|
1621
|
+
value,
|
|
1622
|
+
loc: locOf(expr),
|
|
1623
|
+
};
|
|
1624
|
+
}
|
|
1625
|
+
}
|
|
1626
|
+
if (!shape.indexValue) {
|
|
1627
|
+
// A SIGNATURE-FREE shape whose declared fields share ONE type
|
|
1628
|
+
// writes through the same per-shape dispatch (the mockable-clock
|
|
1629
|
+
// module shape: `mocked[functionality] = implementation` over a
|
|
1630
|
+
// table of same-signature closures). A key naming no declared
|
|
1631
|
+
// field throws the catchable TypeError — JS would ADD the
|
|
1632
|
+
// property, which a monomorphic struct cannot (the SEMANTICS.md
|
|
1633
|
+
// keyed-write-miss divergence). Mixed-type and accessor-carrying
|
|
1634
|
+
// shapes keep the fence.
|
|
1635
|
+
const common = shape.fields.length > 0 &&
|
|
1636
|
+
!shapeHasAccessorSlots(shape) &&
|
|
1637
|
+
shape.fields.every((f) => typeEquals(f.type, shape.fields[0].type))
|
|
1638
|
+
? shape.fields[0].type
|
|
1639
|
+
: null;
|
|
1640
|
+
if (!common) {
|
|
1641
|
+
lowerer.unsupported("SC1090", target, "dynamic keyed writes to records without an index signature (declared fields of ONE shared type dispatch by key — spell the field name otherwise)");
|
|
1642
|
+
}
|
|
1643
|
+
const obj = lowerer.lowerExpr(target.expression);
|
|
1644
|
+
let key = litKey !== null
|
|
1645
|
+
? { kind: "strLit", value: litKey, type: STRING, loc: locOf(target.argumentExpression) }
|
|
1646
|
+
: lowerer.lowerExpr(target.argumentExpression);
|
|
1647
|
+
// Runtime number/boolean/dyn keys stringify — ToPropertyKey,
|
|
1648
|
+
// exactly the index-signature path's rule.
|
|
1649
|
+
key = lowerRecordPropertyKey(lowerer, key, target.argumentExpression);
|
|
1650
|
+
if (key.type.kind !== "string") {
|
|
1651
|
+
lowerer.unsupported("SC1090", target.argumentExpression, "indexing records with non-string or non-number keys");
|
|
1652
|
+
}
|
|
1653
|
+
const value = lowerer.coerceInto(expr.right, lowerer.lowerExpr(expr.right), common);
|
|
1654
|
+
if (!typeEquals(value.type, common))
|
|
1655
|
+
lowerer.badType(expr.right, lowerer.typeOf(expr.right));
|
|
1656
|
+
return {
|
|
1657
|
+
kind: "recordKeySet",
|
|
1658
|
+
obj,
|
|
1659
|
+
shapeId: receiverIr.shapeId,
|
|
1660
|
+
key,
|
|
1661
|
+
value,
|
|
1662
|
+
loc: locOf(expr),
|
|
1663
|
+
};
|
|
1664
|
+
}
|
|
1665
|
+
// A LITERAL key naming no declared field is a pure overflow insert
|
|
1666
|
+
// — no collision to validate. Runtime keys must be able to collide
|
|
1667
|
+
// with every declared field: dyn slots validate through the
|
|
1668
|
+
// dynCheck walker (fields must be dyn-convertible — the same
|
|
1669
|
+
// convertibility the read needs); typed slots write through
|
|
1670
|
+
// directly, so every field must BE the index-value type.
|
|
1671
|
+
const overflowOnly = litKey !== null;
|
|
1672
|
+
const writable = overflowOnly ||
|
|
1673
|
+
(shape.indexValue.kind === "dyn"
|
|
1674
|
+
? shape.fields.every((f) => lowerer.dynConvertible(f.type))
|
|
1675
|
+
: shape.fields.every((f) => typeEquals(f.type, shape.indexValue)));
|
|
1676
|
+
if (!writable) {
|
|
1677
|
+
lowerer.unsupported("SC1090", target, `dynamic keyed writes to '${lowerer.fmt(receiverIr)}' (a declared field's type cannot take the index signature's value at runtime)`);
|
|
1678
|
+
}
|
|
1679
|
+
const obj = lowerer.lowerExpr(target.expression);
|
|
1680
|
+
let key = litKey !== null
|
|
1681
|
+
? {
|
|
1682
|
+
kind: "strLit",
|
|
1683
|
+
value: litKey,
|
|
1684
|
+
type: STRING,
|
|
1685
|
+
loc: locOf(target.argumentExpression),
|
|
1686
|
+
}
|
|
1687
|
+
: lowerer.lowerExpr(target.argumentExpression);
|
|
1688
|
+
// Runtime NUMBER keys canonicalize through the JS-exact formatter
|
|
1689
|
+
// (o[n] = v writes o[String(n)] — the number-keyed-signature path).
|
|
1690
|
+
key = lowerRecordPropertyKey(lowerer, key, target.argumentExpression);
|
|
1691
|
+
if (key.type.kind !== "string") {
|
|
1692
|
+
lowerer.unsupported("SC1090", target.argumentExpression, "indexing records with non-string or non-number keys");
|
|
1693
|
+
}
|
|
1694
|
+
const value = lowerer.intoIndexValueSlot(lowerer.lowerExpr(expr.right), shape.indexValue, expr.right);
|
|
1695
|
+
return {
|
|
1696
|
+
kind: "recordKeySet",
|
|
1697
|
+
obj,
|
|
1698
|
+
shapeId: receiverIr.shapeId,
|
|
1699
|
+
key,
|
|
1700
|
+
value,
|
|
1701
|
+
...(overflowOnly ? { overflowOnly: true } : {}),
|
|
1702
|
+
loc: locOf(expr),
|
|
1703
|
+
};
|
|
1704
|
+
}
|
|
1705
|
+
}
|
|
1706
|
+
// Keyed write `d[k] = v` on a CHECKED-DYNAMIC receiver (a JS `any`
|
|
1707
|
+
// dictionary — the Object.create(null) memo-table idiom writes
|
|
1708
|
+
// `result[key] = value`): dyn.keySet, exactly the record-mapped dyn
|
|
1709
|
+
// arm above — later writes win in insertion order, number keys
|
|
1710
|
+
// canonicalize through the JS-exact formatter (ToPropertyKey's string
|
|
1711
|
+
// side), index keys on dyn arrays set/extend elements, and non-object
|
|
1712
|
+
// receivers throw Node's TypeErrors at runtime. An unmapped checker type
|
|
1713
|
+
// probes the receiver's lowered representation: a dyn value takes the same
|
|
1714
|
+
// write, anything else falls through to the fences.
|
|
1715
|
+
if (receiverIr?.kind === "dyn" || receiverIr?.kind === "object" || receiverIr === null) {
|
|
1716
|
+
const obj = receiverIr !== null
|
|
1717
|
+
? lowerer.lowerExpr(target.expression)
|
|
1718
|
+
: tryLowerExpression(lowerer, target.expression);
|
|
1719
|
+
if (obj !== null &&
|
|
1720
|
+
(obj.type.kind === "dyn" ||
|
|
1721
|
+
(obj.type.kind === "object" && obj.type.className === "%Error") ||
|
|
1722
|
+
isDynTypedRefType(obj.type))) {
|
|
1723
|
+
const loc = locOf(expr);
|
|
1724
|
+
const litKey = recordKeyLiteralText(target.argumentExpression);
|
|
1725
|
+
let key = litKey !== null
|
|
1726
|
+
? { kind: "strLit", value: litKey, type: STRING, loc: locOf(target.argumentExpression) }
|
|
1727
|
+
: lowerer.lowerExpr(target.argumentExpression);
|
|
1728
|
+
key = lowerRecordPropertyKey(lowerer, key, target.argumentExpression);
|
|
1729
|
+
if (key.type.kind !== "string") {
|
|
1730
|
+
lowerer.unsupported("SC1090", target.argumentExpression, "indexing checked-dynamic values with non-string or non-number keys");
|
|
1731
|
+
}
|
|
1732
|
+
const value = lowerer.coerceToExpected(lowerer.lowerExpr(expr.right), DYN);
|
|
1733
|
+
if (value.type.kind !== "dyn") {
|
|
1734
|
+
lowerer.unsupported("SC1101", expr.right, `storing '${lowerer.fmt(value.type)}' values in a checked-dynamic object (the value cannot convert into the checked-dynamic tree)`);
|
|
1735
|
+
}
|
|
1736
|
+
return {
|
|
1737
|
+
kind: "exprStmt",
|
|
1738
|
+
expr: {
|
|
1739
|
+
kind: "libCall",
|
|
1740
|
+
fn: "dyn.keySet",
|
|
1741
|
+
args: [lowerer.coerceToExpected(obj, DYN), key, value],
|
|
1742
|
+
type: VOID,
|
|
1743
|
+
loc,
|
|
1744
|
+
},
|
|
1745
|
+
loc,
|
|
1746
|
+
};
|
|
1747
|
+
}
|
|
1748
|
+
}
|
|
1749
|
+
if (receiverIr?.kind !== "array") {
|
|
1750
|
+
lowerer.unsupported("SC1090", target, "assignment to non-array elements");
|
|
1751
|
+
}
|
|
1752
|
+
let arr = lowerer.lowerExpr(target.expression);
|
|
1753
|
+
if (arr.type.kind === "union" &&
|
|
1754
|
+
lowerer.armTag(arr.type.unionId, UNDEFINED_T) >= 0 &&
|
|
1755
|
+
receiverIr.kind === "array") {
|
|
1756
|
+
const present = lowerer.stripUndefinedArm(arr.type);
|
|
1757
|
+
const helper = present.kind === "array"
|
|
1758
|
+
? lowerer.narrowedArmHelper(arr.type.unionId, present, locOf(target.expression))
|
|
1759
|
+
: null;
|
|
1760
|
+
if (helper) {
|
|
1761
|
+
arr = lowerer.checkedNarrowCall(helper, arr, present, locOf(target.expression));
|
|
1762
|
+
}
|
|
1763
|
+
}
|
|
1764
|
+
if (arr.type.kind !== "array") {
|
|
1765
|
+
lowerer.unsupported("SC1090", target.expression, "assignment through a possibly missing nested array receiver");
|
|
1766
|
+
}
|
|
1767
|
+
const index = lowerOptionalNumber(lowerer, lowerer.lowerExpr(target.argumentExpression), locOf(target.argumentExpression), target.argumentExpression);
|
|
1768
|
+
if (index.type.kind === "dyn" && lowerer.dynConvertible(arr.type)) {
|
|
1769
|
+
return {
|
|
1770
|
+
kind: "exprStmt",
|
|
1771
|
+
expr: lowerDynMemberAssignment(lowerer, expr, lowerer.coerceInto(target.expression, arr, DYN)),
|
|
1772
|
+
loc: locOf(expr),
|
|
1773
|
+
};
|
|
1774
|
+
}
|
|
1775
|
+
if (index.type.kind !== "f64") {
|
|
1776
|
+
lowerer.unsupported("SC1090", target.argumentExpression, "indexing with non-number keys");
|
|
1777
|
+
}
|
|
1778
|
+
// Optional array reads carry the source array's payload type plus an
|
|
1779
|
+
// undefined arm. arrayValueStore turns that arm into the runtime's
|
|
1780
|
+
// UNDEFINED state while keeping number[]/string[] payload storage scalar.
|
|
1781
|
+
let literal = expr.right;
|
|
1782
|
+
while (ts.isParenthesizedExpression(literal) || ts.isSatisfiesExpression(literal))
|
|
1783
|
+
literal = literal.expression;
|
|
1784
|
+
const value = ts.isObjectLiteralExpression(literal) || ts.isArrayLiteralExpression(literal)
|
|
1785
|
+
? lowerer.lowerExprExpecting(literal, arr.type.elem)
|
|
1786
|
+
: lowerer.lowerExpr(expr.right);
|
|
1787
|
+
// Validate the payload before emitting a native store. A dormant JS
|
|
1788
|
+
// method can contradict its JSDoc element type; retain its call-time
|
|
1789
|
+
// refusal instead of leaving invalid IR in a newly reachable method.
|
|
1790
|
+
const expected = value.type.kind === "undefinedT" ||
|
|
1791
|
+
(value.type.kind === "union" && lowerer.armTag(value.type.unionId, UNDEFINED_T) >= 0)
|
|
1792
|
+
? arrayValueType(lowerer, arr.type.elem)
|
|
1793
|
+
: arr.type.elem;
|
|
1794
|
+
return arrayValueStore(lowerer, arr, index, lowerer.coerceInto(expr.right, value, expected), arr.type.elem, locOf(expr));
|
|
1795
|
+
}
|
|
1796
|
+
/** Environment property names use ToPrimitive with the string hint, so
|
|
1797
|
+
* checked objects must execute their own conversion hooks. */
|
|
1798
|
+
export function lowerEnvironmentKey(lowerer, node) {
|
|
1799
|
+
const key = lowerer.lowerExpr(node);
|
|
1800
|
+
if (key.type.kind === "dyn")
|
|
1801
|
+
return { kind: "libCall", fn: "dyn.toStringCoerce", args: [key], type: STRING, loc: key.loc };
|
|
1802
|
+
return lowerRecordPropertyKey(lowerer, key, node);
|
|
1803
|
+
}
|
|
1804
|
+
//# sourceMappingURL=element-access.js.map
|