@scriptc/compiler 0.1.7 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/ambient/scriptc-node-fallback.d.ts +73 -24
- package/ambient/scriptc-overrides.d.ts +10 -6
- package/ambient/scriptc.d.ts +15 -0
- package/dist/backend/build-cache.d.ts +1 -3
- package/dist/backend/build-cache.js +3 -22
- package/dist/backend/build-cache.js.map +1 -1
- package/dist/backend/cache-root.d.ts +3 -0
- package/dist/backend/cache-root.js +23 -0
- package/dist/backend/cache-root.js.map +1 -0
- package/dist/backend/cycle-analysis.d.ts +15 -0
- package/dist/backend/cycle-analysis.js +107 -0
- package/dist/backend/cycle-analysis.js.map +1 -0
- package/dist/backend/cycle-analysis.test.js +124 -0
- package/dist/backend/cycle-analysis.test.js.map +1 -0
- package/dist/backend/executable-features.d.ts +4 -0
- package/dist/backend/executable-features.js +42 -0
- package/dist/backend/executable-features.js.map +1 -0
- package/dist/backend/external-c.d.ts +5 -27
- package/dist/backend/external-c.js +5 -40
- package/dist/backend/external-c.js.map +1 -1
- package/dist/backend/ffi-callbacks.d.ts +2 -3
- package/dist/backend/ffi-callbacks.js +2 -3
- package/dist/backend/ffi-callbacks.js.map +1 -1
- package/dist/backend/library-identity-markers.d.ts +4 -9
- package/dist/backend/library-identity-markers.js +11 -49
- package/dist/backend/library-identity-markers.js.map +1 -1
- package/dist/backend/library-pack.d.ts +5 -0
- package/dist/backend/library-pack.js +123 -0
- package/dist/backend/library-pack.js.map +1 -0
- package/dist/backend/link-plan-core.d.ts +20 -0
- package/dist/backend/link-plan-core.js +18 -0
- package/dist/backend/link-plan-core.js.map +1 -0
- package/dist/backend/link-plan.d.ts +1 -1
- package/dist/backend/link-plan.js +16 -17
- package/dist/backend/link-plan.js.map +1 -1
- package/dist/backend/link-trace.d.ts +2 -0
- package/dist/backend/link-trace.js +24 -0
- package/dist/backend/link-trace.js.map +1 -0
- package/dist/backend/linker.js +1 -1
- package/dist/backend/linker.js.map +1 -1
- package/dist/backend/literals.d.ts +9 -0
- package/dist/backend/literals.js +35 -0
- package/dist/backend/literals.js.map +1 -0
- package/dist/backend/literals.test.d.ts +1 -0
- package/dist/backend/literals.test.js +53 -0
- package/dist/backend/literals.test.js.map +1 -0
- package/dist/backend/llvm/blocks.d.ts +2 -0
- package/dist/backend/llvm/blocks.js +9 -4
- package/dist/backend/llvm/blocks.js.map +1 -1
- package/dist/backend/llvm/blocks.test.d.ts +1 -0
- package/dist/backend/llvm/blocks.test.js +91 -0
- package/dist/backend/llvm/blocks.test.js.map +1 -0
- package/dist/backend/llvm/classes.d.ts +14 -8
- package/dist/backend/llvm/classes.js +70 -28
- package/dist/backend/llvm/classes.js.map +1 -1
- package/dist/backend/llvm/common.d.ts +5 -1
- package/dist/backend/llvm/common.js +45 -4
- package/dist/backend/llvm/common.js.map +1 -1
- package/dist/backend/llvm/debug-info.js +2 -7
- package/dist/backend/llvm/debug-info.js.map +1 -1
- package/dist/backend/llvm/debug-info.test.d.ts +1 -0
- package/dist/backend/llvm/debug-info.test.js +110 -0
- package/dist/backend/llvm/debug-info.test.js.map +1 -0
- package/dist/backend/llvm/dyn.d.ts +16 -2
- package/dist/backend/llvm/dyn.js +494 -165
- package/dist/backend/llvm/dyn.js.map +1 -1
- package/dist/backend/llvm/emitter.d.ts +596 -1
- package/dist/backend/llvm/emitter.js +695 -410
- package/dist/backend/llvm/emitter.js.map +1 -1
- package/dist/backend/llvm/emitter.test.d.ts +1 -0
- package/dist/backend/llvm/emitter.test.js +179 -0
- package/dist/backend/llvm/emitter.test.js.map +1 -0
- package/dist/backend/llvm/expr-async.js +23 -14
- package/dist/backend/llvm/expr-async.js.map +1 -1
- package/dist/backend/llvm/expr-bytes.d.ts +1 -1
- package/dist/backend/llvm/expr-bytes.js +32 -14
- package/dist/backend/llvm/expr-bytes.js.map +1 -1
- package/dist/backend/llvm/expr-callbacks.d.ts +1 -1
- package/dist/backend/llvm/expr-callbacks.js +25 -22
- package/dist/backend/llvm/expr-callbacks.js.map +1 -1
- package/dist/backend/llvm/expr-calls.js +136 -35
- package/dist/backend/llvm/expr-calls.js.map +1 -1
- package/dist/backend/llvm/expr-containers.d.ts +1 -1
- package/dist/backend/llvm/expr-containers.js +43 -14
- package/dist/backend/llvm/expr-containers.js.map +1 -1
- package/dist/backend/llvm/expr-context.d.ts +5 -260
- package/dist/backend/llvm/expr-control.js +9 -5
- package/dist/backend/llvm/expr-control.js.map +1 -1
- package/dist/backend/llvm/expr-dispatch.d.ts +1 -1
- package/dist/backend/llvm/expr-dispatch.js +2 -0
- package/dist/backend/llvm/expr-dispatch.js.map +1 -1
- package/dist/backend/llvm/expr-dynamic.js +62 -74
- package/dist/backend/llvm/expr-dynamic.js.map +1 -1
- package/dist/backend/llvm/expr-island.d.ts +1 -1
- package/dist/backend/llvm/expr-island.js +11 -7
- package/dist/backend/llvm/expr-island.js.map +1 -1
- package/dist/backend/llvm/expr-primitives.d.ts +1 -1
- package/dist/backend/llvm/expr-primitives.js +51 -30
- package/dist/backend/llvm/expr-primitives.js.map +1 -1
- package/dist/backend/llvm/expr-primitives.test.js +1 -1
- package/dist/backend/llvm/expr-records.d.ts +5 -1
- package/dist/backend/llvm/expr-records.js +43 -4
- package/dist/backend/llvm/expr-records.js.map +1 -1
- package/dist/backend/llvm/expr-stream-bridges.d.ts +4 -4
- package/dist/backend/llvm/expr-stream-bridges.js +102 -121
- package/dist/backend/llvm/expr-stream-bridges.js.map +1 -1
- package/dist/backend/llvm/expr-stream-bridges.test.d.ts +1 -0
- package/dist/backend/llvm/expr-stream-bridges.test.js +55 -0
- package/dist/backend/llvm/expr-stream-bridges.test.js.map +1 -0
- package/dist/backend/llvm/expr-stream-callbacks.d.ts +1 -1
- package/dist/backend/llvm/expr-stream-callbacks.js +12 -12
- package/dist/backend/llvm/expr-stream-callbacks.js.map +1 -1
- package/dist/backend/llvm/layouts.d.ts +19 -0
- package/dist/backend/llvm/layouts.js +12 -0
- package/dist/backend/llvm/layouts.js.map +1 -0
- package/dist/backend/llvm/lib-abi.d.ts +19 -0
- package/dist/backend/llvm/lib-abi.js +82 -0
- package/dist/backend/llvm/lib-abi.js.map +1 -0
- package/dist/backend/llvm/lib-connect.d.ts +2 -0
- package/dist/backend/llvm/lib-connect.js +51 -0
- package/dist/backend/llvm/lib-connect.js.map +1 -0
- package/dist/backend/llvm/lib-datagram.d.ts +2 -0
- package/dist/backend/llvm/lib-datagram.js +135 -0
- package/dist/backend/llvm/lib-datagram.js.map +1 -0
- package/dist/backend/llvm/lib-dispatch.js +50 -6
- package/dist/backend/llvm/lib-dispatch.js.map +1 -1
- package/dist/backend/llvm/lib-filesystem.js +30 -18
- package/dist/backend/llvm/lib-filesystem.js.map +1 -1
- package/dist/backend/llvm/lib-http2.d.ts +2 -0
- package/dist/backend/llvm/lib-http2.js +215 -0
- package/dist/backend/llvm/lib-http2.js.map +1 -0
- package/dist/backend/llvm/lib-lookup.d.ts +2 -0
- package/dist/backend/llvm/lib-lookup.js +39 -0
- package/dist/backend/llvm/lib-lookup.js.map +1 -0
- package/dist/backend/llvm/lib-network.js +25 -2
- package/dist/backend/llvm/lib-network.js.map +1 -1
- package/dist/backend/llvm/lib-process.js +21 -16
- package/dist/backend/llvm/lib-process.js.map +1 -1
- package/dist/backend/llvm/lib-shared.js +117 -1
- package/dist/backend/llvm/lib-shared.js.map +1 -1
- package/dist/backend/llvm/lib-stream.js +3 -2
- package/dist/backend/llvm/lib-stream.js.map +1 -1
- package/dist/backend/llvm/lib-test.d.ts +2 -0
- package/dist/backend/llvm/lib-test.js +34 -0
- package/dist/backend/llvm/lib-test.js.map +1 -0
- package/dist/backend/llvm/lib-tls.d.ts +2 -0
- package/dist/backend/llvm/lib-tls.js +82 -0
- package/dist/backend/llvm/lib-tls.js.map +1 -0
- package/dist/backend/llvm/shapes.d.ts +10 -9
- package/dist/backend/llvm/shapes.js +35 -130
- package/dist/backend/llvm/shapes.js.map +1 -1
- package/dist/backend/llvm/unsupported.d.ts +1 -0
- package/dist/backend/llvm/unsupported.js +1 -2
- package/dist/backend/llvm/unsupported.js.map +1 -1
- package/dist/backend/llvm/walkers.js +1 -7
- package/dist/backend/llvm/walkers.js.map +1 -1
- package/dist/backend/mangle.d.ts +2 -2
- package/dist/backend/mangle.js +16 -5
- package/dist/backend/mangle.js.map +1 -1
- package/dist/backend/{c/may-throw.d.ts → may-throw.d.ts} +1 -1
- package/dist/backend/{c/may-throw.js → may-throw.js} +51 -46
- package/dist/backend/may-throw.js.map +1 -0
- package/dist/backend/may-throw.test.d.ts +1 -0
- package/dist/backend/may-throw.test.js +58 -0
- package/dist/backend/may-throw.test.js.map +1 -0
- package/dist/backend/native-codegen-core.d.ts +22 -0
- package/dist/backend/native-codegen-core.js +44 -0
- package/dist/backend/native-codegen-core.js.map +1 -0
- package/dist/backend/native-codegen.d.ts +3 -19
- package/dist/backend/native-codegen.js +5 -44
- package/dist/backend/native-codegen.js.map +1 -1
- package/dist/backend/native-codegen.test.js +2 -2
- package/dist/backend/native-codegen.test.js.map +1 -1
- package/dist/backend/native-link-info-core.d.ts +94 -0
- package/dist/backend/native-link-info-core.js +62 -0
- package/dist/backend/native-link-info-core.js.map +1 -0
- package/dist/backend/native-link-info.d.ts +3 -88
- package/dist/backend/native-link-info.js +12 -243
- package/dist/backend/native-link-info.js.map +1 -1
- package/dist/backend/native-link-info.test.js +41 -146
- package/dist/backend/native-link-info.test.js.map +1 -1
- package/dist/backend/native-toolchain.d.ts +10 -25
- package/dist/backend/native-toolchain.js +31 -211
- package/dist/backend/native-toolchain.js.map +1 -1
- package/dist/backend/native-toolchain.test.js +5 -5
- package/dist/backend/native-toolchain.test.js.map +1 -1
- package/dist/backend/native-tools.d.ts +24 -0
- package/dist/backend/native-tools.js +33 -0
- package/dist/backend/native-tools.js.map +1 -0
- package/dist/backend/object-localize.js +19 -8
- package/dist/backend/object-localize.js.map +1 -1
- package/dist/backend/object-localize.test.js +22 -0
- package/dist/backend/object-localize.test.js.map +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 +101 -0
- package/dist/backend/runtime-pack-core.js +172 -0
- package/dist/backend/runtime-pack-core.js.map +1 -0
- package/dist/backend/runtime-pack-native.d.ts +21 -0
- package/dist/backend/runtime-pack-native.js +70 -0
- package/dist/backend/runtime-pack-native.js.map +1 -0
- package/dist/backend/runtime-pack-targets.test.js +1 -1
- package/dist/backend/runtime-pack.d.ts +3 -83
- package/dist/backend/runtime-pack.js +8 -151
- package/dist/backend/runtime-pack.js.map +1 -1
- package/dist/backend/runtime-pack.test.js +24 -1
- package/dist/backend/runtime-pack.test.js.map +1 -1
- package/dist/backend/target-diagnostics.d.ts +22 -0
- package/dist/backend/target-diagnostics.js +108 -0
- package/dist/backend/target-diagnostics.js.map +1 -0
- package/dist/backend/target-platform.d.ts +15 -0
- package/dist/backend/target-platform.js +72 -0
- package/dist/backend/target-platform.js.map +1 -0
- package/dist/backend/targets.d.ts +13 -4
- package/dist/backend/targets.js +95 -30
- package/dist/backend/targets.js.map +1 -1
- package/dist/backend/targets.test.js +65 -4
- package/dist/backend/targets.test.js.map +1 -1
- package/dist/backend/toolchain-environment.d.ts +6 -0
- package/dist/backend/toolchain-environment.js +99 -0
- package/dist/backend/toolchain-environment.js.map +1 -0
- package/dist/backend/vendor-archives.d.ts +1 -9
- package/dist/backend/vendor-archives.js +2 -9
- package/dist/backend/vendor-archives.js.map +1 -1
- package/dist/backend/vendor-inputs.d.ts +9 -0
- package/dist/backend/vendor-inputs.js +10 -0
- package/dist/backend/vendor-inputs.js.map +1 -0
- package/dist/backend/warm-cache.d.ts +3 -0
- package/dist/backend/warm-cache.js +41 -0
- package/dist/backend/warm-cache.js.map +1 -0
- package/dist/cli/command.d.ts +3 -0
- package/dist/cli/command.js +328 -0
- package/dist/cli/command.js.map +1 -0
- package/dist/cli/host.d.ts +24 -0
- package/dist/cli/host.js +2 -0
- package/dist/cli/host.js.map +1 -0
- package/dist/cli/output-options.d.ts +26 -0
- package/dist/cli/output-options.js +60 -0
- package/dist/cli/output-options.js.map +1 -0
- package/dist/cli/paths.d.ts +12 -0
- package/dist/cli/paths.js +42 -0
- package/dist/cli/paths.js.map +1 -0
- package/dist/cli/usage.d.ts +74 -0
- package/dist/cli/usage.js +86 -0
- package/dist/cli/usage.js.map +1 -0
- package/dist/cli/wasi-paths.d.ts +8 -0
- package/dist/cli/wasi-paths.js +41 -0
- package/dist/cli/wasi-paths.js.map +1 -0
- package/dist/cli/wasi-runner.d.ts +2 -0
- package/dist/cli/wasi-runner.js +28 -0
- package/dist/cli/wasi-runner.js.map +1 -0
- package/dist/compat/fetch-profile.js +3 -3
- package/dist/compat/fetch-profile.js.map +1 -1
- package/dist/compile-types.d.ts +162 -0
- package/dist/compile-types.js +2 -0
- package/dist/compile-types.js.map +1 -0
- package/dist/coverage/report.js +11 -5
- package/dist/coverage/report.js.map +1 -1
- package/dist/coverage/surface-manifest.js +5 -2
- package/dist/coverage/surface-manifest.js.map +1 -1
- package/dist/diagnostics/diagnostic.js +3 -3
- package/dist/diagnostics/diagnostic.js.map +1 -1
- package/dist/executable/executable-cache.d.ts +3 -4
- package/dist/executable/executable-cache.js +5 -6
- package/dist/executable/executable-cache.js.map +1 -1
- package/dist/executable/executable-cache.test.js +16 -17
- package/dist/executable/executable-cache.test.js.map +1 -1
- package/dist/executable/prepare.d.ts +14 -0
- package/dist/executable/prepare.js +66 -0
- package/dist/executable/prepare.js.map +1 -0
- package/dist/ffi/ffi-manifest.d.ts +11 -4
- package/dist/ffi/ffi-manifest.js +170 -58
- package/dist/ffi/ffi-manifest.js.map +1 -1
- package/dist/ffi/ffi-manifest.test.d.ts +1 -0
- package/dist/ffi/ffi-manifest.test.js +111 -0
- package/dist/ffi/ffi-manifest.test.js.map +1 -0
- package/dist/format-integer.d.ts +3 -0
- package/dist/format-integer.js +14 -0
- package/dist/format-integer.js.map +1 -0
- package/dist/frontend/analysis.d.ts +5 -0
- package/dist/frontend/analysis.js +88 -0
- package/dist/frontend/analysis.js.map +1 -0
- package/dist/frontend/arguments-usage.d.ts +1 -3
- package/dist/frontend/arguments-usage.js.map +1 -1
- package/dist/frontend/builtin-modules.d.ts +1 -1
- package/dist/frontend/builtin-modules.js +1 -1
- package/dist/frontend/builtin-modules.js.map +1 -1
- package/dist/frontend/cjs-lexer.d.ts +4 -25
- package/dist/frontend/cjs-lexer.js +6 -806
- package/dist/frontend/cjs-lexer.js.map +1 -1
- package/dist/frontend/cjs-resolve.d.ts +5 -0
- package/dist/frontend/cjs-resolve.js +429 -0
- package/dist/frontend/cjs-resolve.js.map +1 -0
- package/dist/frontend/cjs-syntax.d.ts +26 -0
- package/dist/frontend/cjs-syntax.js +806 -0
- package/dist/frontend/cjs-syntax.js.map +1 -0
- package/dist/frontend/comptime-node.d.ts +4 -0
- package/dist/frontend/comptime-node.js +16 -0
- package/dist/frontend/comptime-node.js.map +1 -0
- package/dist/frontend/comptime-node.test.d.ts +1 -0
- package/dist/frontend/comptime-node.test.js +37 -0
- package/dist/frontend/comptime-node.test.js.map +1 -0
- package/dist/frontend/dts-paths.d.ts +3 -4
- package/dist/frontend/dts-paths.js +15 -8
- package/dist/frontend/dts-paths.js.map +1 -1
- package/dist/frontend/fork-target.js +2 -2
- package/dist/frontend/fork-target.js.map +1 -1
- package/dist/frontend/helper-tokens.d.ts +1 -0
- package/dist/frontend/helper-tokens.js +147 -0
- package/dist/frontend/helper-tokens.js.map +1 -0
- package/dist/frontend/helper-tokens.test.d.ts +1 -0
- package/dist/frontend/helper-tokens.test.js +35 -0
- package/dist/frontend/helper-tokens.test.js.map +1 -0
- package/dist/frontend/inferred-js-diagnostics.d.ts +5 -0
- package/dist/frontend/inferred-js-diagnostics.js +69 -0
- package/dist/frontend/inferred-js-diagnostics.js.map +1 -0
- package/dist/frontend/inferred-js-diagnostics.test.d.ts +1 -0
- package/dist/frontend/inferred-js-diagnostics.test.js +58 -0
- package/dist/frontend/inferred-js-diagnostics.test.js.map +1 -0
- package/dist/frontend/input-tracker.d.ts +5 -2
- package/dist/frontend/input-tracker.js +24 -3
- package/dist/frontend/input-tracker.js.map +1 -1
- package/dist/frontend/input-tracker.test.js +23 -0
- package/dist/frontend/input-tracker.test.js.map +1 -1
- package/dist/frontend/lib-contract.js +32 -24
- package/dist/frontend/lib-contract.js.map +1 -1
- package/dist/frontend/literal-values.d.ts +4 -0
- package/dist/frontend/literal-values.js +21 -0
- package/dist/frontend/literal-values.js.map +1 -0
- package/dist/frontend/literal-values.test.d.ts +1 -0
- package/dist/frontend/literal-values.test.js +91 -0
- package/dist/frontend/literal-values.test.js.map +1 -0
- package/dist/frontend/lowering/abstract-equality.d.ts +1 -1
- package/dist/frontend/lowering/abstract-equality.js +3 -0
- package/dist/frontend/lowering/abstract-equality.js.map +1 -1
- package/dist/frontend/lowering/array-indexed-mutation.js +11 -6
- package/dist/frontend/lowering/array-indexed-mutation.js.map +1 -1
- package/dist/frontend/lowering/array-values.d.ts +4 -1
- package/dist/frontend/lowering/array-values.js +43 -1
- package/dist/frontend/lowering/array-values.js.map +1 -1
- package/dist/frontend/lowering/callback-arg.js +1 -0
- package/dist/frontend/lowering/callback-arg.js.map +1 -1
- package/dist/frontend/lowering/class-callbacks.d.ts +12 -0
- package/dist/frontend/lowering/class-callbacks.js +63 -0
- package/dist/frontend/lowering/class-callbacks.js.map +1 -0
- package/dist/frontend/lowering/class-descriptors.d.ts +9 -0
- package/dist/frontend/lowering/class-descriptors.js +73 -0
- package/dist/frontend/lowering/class-descriptors.js.map +1 -0
- package/dist/frontend/lowering/class-dynamic-dispatch.d.ts +41 -0
- package/dist/frontend/lowering/class-dynamic-dispatch.js +803 -0
- package/dist/frontend/lowering/class-dynamic-dispatch.js.map +1 -0
- package/dist/frontend/lowering/class-dynamic-dispatch.test.d.ts +1 -0
- package/dist/frontend/lowering/class-dynamic-dispatch.test.js +92 -0
- package/dist/frontend/lowering/class-dynamic-dispatch.test.js.map +1 -0
- package/dist/frontend/lowering/class-instance-constructor.d.ts +7 -0
- package/dist/frontend/lowering/class-instance-constructor.js +64 -0
- package/dist/frontend/lowering/class-instance-constructor.js.map +1 -0
- package/dist/frontend/lowering/class-method-values.d.ts +10 -0
- package/dist/frontend/lowering/class-method-values.js +170 -0
- package/dist/frontend/lowering/class-method-values.js.map +1 -0
- package/dist/frontend/lowering/class-prototypes.d.ts +16 -0
- package/dist/frontend/lowering/class-prototypes.js +134 -0
- package/dist/frontend/lowering/class-prototypes.js.map +1 -0
- package/dist/frontend/lowering/class-static-data.d.ts +6 -0
- package/dist/frontend/lowering/class-static-data.js +56 -0
- package/dist/frontend/lowering/class-static-data.js.map +1 -0
- package/dist/frontend/lowering/containers/buffer-numeric-methods.d.ts +4 -0
- package/dist/frontend/lowering/containers/buffer-numeric-methods.js +26 -0
- package/dist/frontend/lowering/containers/buffer-numeric-methods.js.map +1 -0
- package/dist/frontend/lowering/containers/bytes.d.ts +11 -7
- package/dist/frontend/lowering/containers/bytes.js +164 -155
- package/dist/frontend/lowering/containers/bytes.js.map +1 -1
- package/dist/frontend/lowering/containers/string-and-regexp.d.ts +2 -2
- package/dist/frontend/lowering/containers/string-and-regexp.js +39 -16
- package/dist/frontend/lowering/containers/string-and-regexp.js.map +1 -1
- package/dist/frontend/lowering/containers/string-replacement.d.ts +7 -0
- package/dist/frontend/lowering/containers/string-replacement.js +217 -0
- package/dist/frontend/lowering/containers/string-replacement.js.map +1 -0
- package/dist/frontend/lowering/error-methods.d.ts +11 -0
- package/dist/frontend/lowering/error-methods.js +78 -0
- package/dist/frontend/lowering/error-methods.js.map +1 -0
- package/dist/frontend/lowering/expressions/global-symbols.d.ts +6 -0
- package/dist/frontend/lowering/expressions/global-symbols.js +11 -0
- package/dist/frontend/lowering/expressions/global-symbols.js.map +1 -0
- package/dist/frontend/lowering/expressions/native-proxy.d.ts +7 -0
- package/dist/frontend/lowering/expressions/native-proxy.js +49 -0
- package/dist/frontend/lowering/expressions/native-proxy.js.map +1 -0
- package/dist/frontend/lowering/expressions/nullish-assignment.d.ts +6 -0
- package/dist/frontend/lowering/expressions/nullish-assignment.js +124 -0
- package/dist/frontend/lowering/expressions/nullish-assignment.js.map +1 -0
- package/dist/frontend/lowering/expressions/object-literals.d.ts +8 -8
- package/dist/frontend/lowering/expressions/object-literals.js +473 -178
- package/dist/frontend/lowering/expressions/object-literals.js.map +1 -1
- package/dist/frontend/lowering/expressions/optional-chains.js +20 -8
- package/dist/frontend/lowering/expressions/optional-chains.js.map +1 -1
- package/dist/frontend/lowering/expressions/try-lower-expression.js +1 -0
- package/dist/frontend/lowering/expressions/try-lower-expression.js.map +1 -1
- package/dist/frontend/lowering/expressions/union-field-write.d.ts +8 -0
- package/dist/frontend/lowering/expressions/union-field-write.js +71 -0
- package/dist/frontend/lowering/expressions/union-field-write.js.map +1 -0
- package/dist/frontend/lowering/function-context.d.ts +93 -0
- package/dist/frontend/lowering/function-context.js +103 -0
- package/dist/frontend/lowering/function-context.js.map +1 -0
- package/dist/frontend/lowering/generator-delegation.d.ts +7 -0
- package/dist/frontend/lowering/generator-delegation.js +85 -0
- package/dist/frontend/lowering/generator-delegation.js.map +1 -0
- package/dist/frontend/lowering/generator-dynamic-dispatch.d.ts +10 -0
- package/dist/frontend/lowering/generator-dynamic-dispatch.js +105 -0
- package/dist/frontend/lowering/generator-dynamic-dispatch.js.map +1 -0
- package/dist/frontend/lowering/lib-boundary.d.ts +2 -1
- package/dist/frontend/lowering/lib-boundary.js +59 -20
- package/dist/frontend/lowering/lib-boundary.js.map +1 -1
- package/dist/frontend/lowering/lib-boundary.test.d.ts +1 -0
- package/dist/frontend/lowering/lib-boundary.test.js +45 -0
- package/dist/frontend/lowering/lib-boundary.test.js.map +1 -0
- package/dist/frontend/lowering/lower-array-sort.d.ts +1 -1
- package/dist/frontend/lowering/lower-assert.d.ts +1 -1
- package/dist/frontend/lowering/lower-assert.js.map +1 -1
- package/dist/frontend/lowering/lower-async-iteration.d.ts +1 -1
- package/dist/frontend/lowering/lower-async-iteration.js.map +1 -1
- package/dist/frontend/lowering/lower-builtin-values.d.ts +12 -0
- package/dist/frontend/lowering/lower-builtin-values.js +139 -0
- package/dist/frontend/lowering/lower-builtin-values.js.map +1 -0
- package/dist/frontend/lowering/lower-builtins.d.ts +27 -41
- package/dist/frontend/lowering/lower-builtins.js +539 -343
- package/dist/frontend/lowering/lower-builtins.js.map +1 -1
- package/dist/frontend/lowering/lower-calls.d.ts +20 -17
- package/dist/frontend/lowering/lower-calls.js +1236 -353
- package/dist/frontend/lowering/lower-calls.js.map +1 -1
- package/dist/frontend/lowering/lower-classes.d.ts +83 -45
- package/dist/frontend/lowering/lower-classes.js +952 -339
- package/dist/frontend/lowering/lower-classes.js.map +1 -1
- package/dist/frontend/lowering/lower-comptime.d.ts +1 -1
- package/dist/frontend/lowering/lower-comptime.js +23 -32
- package/dist/frontend/lowering/lower-comptime.js.map +1 -1
- package/dist/frontend/lowering/lower-containers.d.ts +27 -32
- package/dist/frontend/lowering/lower-containers.js +796 -151
- package/dist/frontend/lowering/lower-containers.js.map +1 -1
- package/dist/frontend/lowering/lower-dgram.d.ts +1 -1
- package/dist/frontend/lowering/lower-dgram.js.map +1 -1
- package/dist/frontend/lowering/lower-enums.d.ts +1 -1
- package/dist/frontend/lowering/lower-enums.js.map +1 -1
- package/dist/frontend/lowering/lower-event-emitter.d.ts +30 -1
- package/dist/frontend/lowering/lower-event-emitter.js +58 -26
- package/dist/frontend/lowering/lower-event-emitter.js.map +1 -1
- package/dist/frontend/lowering/lower-expando.d.ts +7 -1
- package/dist/frontend/lowering/lower-expando.js +14 -6
- package/dist/frontend/lowering/lower-expando.js.map +1 -1
- package/dist/frontend/lowering/lower-exprs.d.ts +35 -11
- package/dist/frontend/lowering/lower-exprs.js +1674 -779
- package/dist/frontend/lowering/lower-exprs.js.map +1 -1
- package/dist/frontend/lowering/lower-generators.d.ts +2 -5
- package/dist/frontend/lowering/lower-generators.js +77 -46
- package/dist/frontend/lowering/lower-generators.js.map +1 -1
- package/dist/frontend/lowering/lower-global-value.d.ts +7 -0
- package/dist/frontend/lowering/lower-global-value.js +17 -0
- package/dist/frontend/lowering/lower-global-value.js.map +1 -0
- package/dist/frontend/lowering/lower-inspect.d.ts +1 -1
- package/dist/frontend/lowering/lower-inspect.js +17 -8
- package/dist/frontend/lowering/lower-inspect.js.map +1 -1
- package/dist/frontend/lowering/lower-island.d.ts +5 -8
- package/dist/frontend/lowering/lower-island.js +34 -23
- package/dist/frontend/lowering/lower-island.js.map +1 -1
- package/dist/frontend/lowering/lower-mixins.d.ts +2 -2
- package/dist/frontend/lowering/lower-mixins.js +5 -3
- package/dist/frontend/lowering/lower-mixins.js.map +1 -1
- package/dist/frontend/lowering/lower-modules.d.ts +1 -1
- package/dist/frontend/lowering/lower-modules.js +233 -30
- package/dist/frontend/lowering/lower-modules.js.map +1 -1
- package/dist/frontend/lowering/lower-namespaces.d.ts +1 -1
- package/dist/frontend/lowering/lower-namespaces.js.map +1 -1
- package/dist/frontend/lowering/lower-node-module.d.ts +1 -1
- package/dist/frontend/lowering/lower-node-module.js +13 -10
- package/dist/frontend/lowering/lower-node-module.js.map +1 -1
- package/dist/frontend/lowering/lower-server.d.ts +1 -1
- package/dist/frontend/lowering/lower-server.js +6 -10
- package/dist/frontend/lowering/lower-server.js.map +1 -1
- package/dist/frontend/lowering/lower-stmts.d.ts +10 -14
- package/dist/frontend/lowering/lower-stmts.js +728 -496
- package/dist/frontend/lowering/lower-stmts.js.map +1 -1
- package/dist/frontend/lowering/lower-stream.d.ts +1 -1
- package/dist/frontend/lowering/lower-stream.js +19 -10
- package/dist/frontend/lowering/lower-stream.js.map +1 -1
- package/dist/frontend/lowering/lower-test.d.ts +1 -1
- package/dist/frontend/lowering/lower-test.js.map +1 -1
- package/dist/frontend/lowering/lower-url.d.ts +6 -0
- package/dist/frontend/lowering/lower-url.js +77 -0
- package/dist/frontend/lowering/lower-url.js.map +1 -0
- package/dist/frontend/lowering/lowerer.d.ts +113 -189
- package/dist/frontend/lowering/lowerer.js +1031 -672
- package/dist/frontend/lowering/lowerer.js.map +1 -1
- package/dist/frontend/lowering/lowerer.test.d.ts +1 -0
- package/dist/frontend/lowering/lowerer.test.js +26 -0
- package/dist/frontend/lowering/lowerer.test.js.map +1 -0
- package/dist/frontend/lowering/native-ffi.d.ts +5 -0
- package/dist/frontend/lowering/native-ffi.js +40 -0
- package/dist/frontend/lowering/native-ffi.js.map +1 -0
- package/dist/frontend/lowering/object-enumeration-receiver.d.ts +7 -0
- package/dist/frontend/lowering/object-enumeration-receiver.js +33 -0
- package/dist/frontend/lowering/object-enumeration-receiver.js.map +1 -0
- package/dist/frontend/lowering/object-factory-new.d.ts +8 -0
- package/dist/frontend/lowering/object-factory-new.js +68 -0
- package/dist/frontend/lowering/object-factory-new.js.map +1 -0
- package/dist/frontend/lowering/optional-arguments.js +6 -1
- package/dist/frontend/lowering/optional-arguments.js.map +1 -1
- package/dist/frontend/lowering/pairs-snapshot.js +2 -1
- package/dist/frontend/lowering/pairs-snapshot.js.map +1 -1
- package/dist/frontend/lowering/runtime-optional-locals.d.ts +14 -0
- package/dist/frontend/lowering/runtime-optional-locals.js +41 -0
- package/dist/frontend/lowering/runtime-optional-locals.js.map +1 -0
- package/dist/frontend/lowering/runtime-optional-locals.test.d.ts +1 -0
- package/dist/frontend/lowering/runtime-optional-locals.test.js +85 -0
- package/dist/frontend/lowering/runtime-optional-locals.test.js.map +1 -0
- package/dist/frontend/lowering/sanitize-class-types.d.ts +8 -0
- package/dist/frontend/lowering/sanitize-class-types.js +79 -0
- package/dist/frontend/lowering/sanitize-class-types.js.map +1 -0
- package/dist/frontend/lowering/sanitize-class-types.test.d.ts +1 -0
- package/dist/frontend/lowering/sanitize-class-types.test.js +60 -0
- package/dist/frontend/lowering/sanitize-class-types.test.js.map +1 -0
- package/dist/frontend/lowering/static-this.d.ts +5 -1
- package/dist/frontend/lowering/static-this.js +28 -2
- package/dist/frontend/lowering/static-this.js.map +1 -1
- package/dist/frontend/lowering/string-index.d.ts +7 -0
- package/dist/frontend/lowering/string-index.js +39 -0
- package/dist/frontend/lowering/string-index.js.map +1 -0
- package/dist/frontend/lowering/surfaces.d.ts +8 -3
- package/dist/frontend/lowering/surfaces.js +61 -29
- package/dist/frontend/lowering/surfaces.js.map +1 -1
- package/dist/frontend/lowering/symbol-fields.d.ts +22 -0
- package/dist/frontend/lowering/symbol-fields.js +183 -0
- package/dist/frontend/lowering/symbol-fields.js.map +1 -0
- package/dist/frontend/lowering/symbol-methods.d.ts +7 -0
- package/dist/frontend/lowering/symbol-methods.js +30 -0
- package/dist/frontend/lowering/symbol-methods.js.map +1 -0
- package/dist/frontend/lowering/text-decoder-encoding.d.ts +10 -0
- package/dist/frontend/lowering/text-decoder-encoding.js +77 -0
- package/dist/frontend/lowering/text-decoder-encoding.js.map +1 -0
- package/dist/frontend/lowering/text-decoder-encoding.test.d.ts +1 -0
- package/dist/frontend/lowering/text-decoder-encoding.test.js +38 -0
- package/dist/frontend/lowering/text-decoder-encoding.test.js.map +1 -0
- package/dist/frontend/lowering/union-narrow.d.ts +9 -0
- package/dist/frontend/lowering/union-narrow.js +59 -0
- package/dist/frontend/lowering/union-narrow.js.map +1 -0
- package/dist/frontend/lowering/union-narrow.test.d.ts +1 -0
- package/dist/frontend/lowering/union-narrow.test.js +72 -0
- package/dist/frontend/lowering/union-narrow.test.js.map +1 -0
- package/dist/frontend/lowering/union-retag.d.ts +43 -0
- package/dist/frontend/lowering/union-retag.js +259 -0
- package/dist/frontend/lowering/union-retag.js.map +1 -0
- package/dist/frontend/lowering/union-retag.test.d.ts +1 -0
- package/dist/frontend/lowering/union-retag.test.js +405 -0
- package/dist/frontend/lowering/union-retag.test.js.map +1 -0
- package/dist/frontend/lowering/unregistered-class-types.d.ts +14 -0
- package/dist/frontend/lowering/unregistered-class-types.js +94 -0
- package/dist/frontend/lowering/unregistered-class-types.js.map +1 -0
- package/dist/frontend/lowering/unregistered-class-types.test.d.ts +1 -0
- package/dist/frontend/lowering/unregistered-class-types.test.js +65 -0
- package/dist/frontend/lowering/unregistered-class-types.test.js.map +1 -0
- package/dist/frontend/lowering/width-lift.d.ts +40 -0
- package/dist/frontend/lowering/width-lift.js +2 -0
- package/dist/frontend/lowering/width-lift.js.map +1 -0
- package/dist/frontend/module-syntax.d.ts +58 -0
- package/dist/frontend/module-syntax.js +123 -0
- package/dist/frontend/module-syntax.js.map +1 -0
- package/dist/frontend/module-syntax.test.d.ts +1 -0
- package/dist/frontend/module-syntax.test.js +78 -0
- package/dist/frontend/module-syntax.test.js.map +1 -0
- package/dist/frontend/npm-fetch-analysis.d.ts +17 -0
- package/dist/frontend/npm-fetch-analysis.js +100 -0
- package/dist/frontend/npm-fetch-analysis.js.map +1 -0
- package/dist/frontend/npm-fetch-analysis.test.d.ts +1 -0
- package/dist/frontend/npm-fetch-analysis.test.js +107 -0
- package/dist/frontend/npm-fetch-analysis.test.js.map +1 -0
- package/dist/frontend/npm-fetch-node.d.ts +2 -0
- package/dist/frontend/npm-fetch-node.js +12 -0
- package/dist/frontend/npm-fetch-node.js.map +1 -0
- package/dist/frontend/npm-fetch-syntax.d.ts +6 -0
- package/dist/frontend/npm-fetch-syntax.js +207 -0
- package/dist/frontend/npm-fetch-syntax.js.map +1 -0
- package/dist/frontend/npm-node.d.ts +10 -0
- package/dist/frontend/npm-node.js +14 -0
- package/dist/frontend/npm-node.js.map +1 -0
- package/dist/frontend/npm-static-bundled-cjs.d.ts +8 -0
- package/dist/frontend/npm-static-bundled-cjs.js +236 -0
- package/dist/frontend/npm-static-bundled-cjs.js.map +1 -0
- package/dist/frontend/npm-static-bundled-cjs.test.d.ts +1 -0
- package/dist/frontend/npm-static-bundled-cjs.test.js +69 -0
- package/dist/frontend/npm-static-bundled-cjs.test.js.map +1 -0
- package/dist/frontend/npm-static-declaration-syntax.d.ts +57 -0
- package/dist/frontend/npm-static-declaration-syntax.js +944 -0
- package/dist/frontend/npm-static-declaration-syntax.js.map +1 -0
- package/dist/frontend/npm-static-declarations.d.ts +11 -39
- package/dist/frontend/npm-static-declarations.js +22 -561
- package/dist/frontend/npm-static-declarations.js.map +1 -1
- package/dist/frontend/npm-static-declarations.test.js +245 -6
- package/dist/frontend/npm-static-declarations.test.js.map +1 -1
- package/dist/frontend/npm-static-prune.d.ts +1 -1
- package/dist/frontend/npm-static-prune.js +5 -4
- package/dist/frontend/npm-static-prune.js.map +1 -1
- package/dist/frontend/npm-static-prune.test.js +1 -1
- package/dist/frontend/npm-static-prune.test.js.map +1 -1
- package/dist/frontend/npm-static-rewrite-host.d.ts +4 -0
- package/dist/frontend/npm-static-rewrite-host.js +179 -0
- package/dist/frontend/npm-static-rewrite-host.js.map +1 -0
- package/dist/frontend/npm-static-rewrite-syntax.d.ts +16 -0
- package/dist/frontend/npm-static-rewrite-syntax.js +905 -0
- package/dist/frontend/npm-static-rewrite-syntax.js.map +1 -0
- package/dist/frontend/npm-static-rewrite.d.ts +0 -5
- package/dist/frontend/npm-static-rewrite.js +2 -1079
- package/dist/frontend/npm-static-rewrite.js.map +1 -1
- package/dist/frontend/npm-static-subtyping.d.ts +5 -0
- package/dist/frontend/npm-static-subtyping.js +55 -0
- package/dist/frontend/npm-static-subtyping.js.map +1 -0
- package/dist/frontend/npm-static-subtyping.test.d.ts +1 -0
- package/dist/frontend/npm-static-subtyping.test.js +58 -0
- package/dist/frontend/npm-static-subtyping.test.js.map +1 -0
- package/dist/frontend/npm-static.d.ts +7 -15
- package/dist/frontend/npm-static.js +19 -28
- package/dist/frontend/npm-static.js.map +1 -1
- package/dist/frontend/npm.d.ts +8 -69
- package/dist/frontend/npm.js +21 -361
- package/dist/frontend/npm.js.map +1 -1
- package/dist/frontend/npm.test.js +2 -2
- package/dist/frontend/npm.test.js.map +1 -1
- package/dist/frontend/pipeline-native.d.ts +6 -0
- package/dist/frontend/pipeline-native.js +32 -0
- package/dist/frontend/pipeline-native.js.map +1 -0
- package/dist/frontend/pipeline.d.ts +54 -0
- package/dist/frontend/pipeline.js +382 -0
- package/dist/frontend/pipeline.js.map +1 -0
- package/dist/frontend/pipeline.test.d.ts +1 -0
- package/dist/frontend/pipeline.test.js +77 -0
- package/dist/frontend/pipeline.test.js.map +1 -0
- package/dist/frontend/program-analysis.d.ts +10 -0
- package/dist/frontend/program-analysis.js +14 -0
- package/dist/frontend/program-analysis.js.map +1 -0
- package/dist/frontend/program-node.d.ts +9 -0
- package/dist/frontend/program-node.js +48 -0
- package/dist/frontend/program-node.js.map +1 -0
- package/dist/frontend/program.d.ts +38 -19
- package/dist/frontend/program.js +344 -169
- package/dist/frontend/program.js.map +1 -1
- package/dist/frontend/program.test.js +87 -2
- package/dist/frontend/program.test.js.map +1 -1
- package/dist/frontend/provenance-core.d.ts +9 -0
- package/dist/frontend/provenance-core.js +435 -0
- package/dist/frontend/provenance-core.js.map +1 -0
- package/dist/frontend/provenance.d.ts +0 -4
- package/dist/frontend/provenance.js +4 -459
- package/dist/frontend/provenance.js.map +1 -1
- package/dist/frontend/resolve.d.ts +3 -1
- package/dist/frontend/resolve.js +6 -3
- package/dist/frontend/resolve.js.map +1 -1
- package/dist/frontend/runtime-resolve.d.ts +4 -3
- package/dist/frontend/runtime-resolve.js +22 -18
- package/dist/frontend/runtime-resolve.js.map +1 -1
- package/dist/frontend/runtime-resolve.test.js +53 -0
- package/dist/frontend/runtime-resolve.test.js.map +1 -1
- package/dist/frontend/services-node.d.ts +5 -0
- package/dist/frontend/services-node.js +19 -0
- package/dist/frontend/services-node.js.map +1 -0
- package/dist/frontend/services-node.test.d.ts +1 -0
- package/dist/frontend/services-node.test.js +70 -0
- package/dist/frontend/services-node.test.js.map +1 -0
- package/dist/frontend/services.d.ts +44 -0
- package/dist/frontend/services.js +90 -0
- package/dist/frontend/services.js.map +1 -0
- package/dist/frontend/services.test.d.ts +1 -0
- package/dist/frontend/services.test.js +174 -0
- package/dist/frontend/services.test.js.map +1 -0
- package/dist/frontend/ts7/adapter.d.ts +3 -3
- package/dist/frontend/ts7/adapter.js +14 -31
- package/dist/frontend/ts7/adapter.js.map +1 -1
- package/dist/frontend/ts7/api.d.ts +16 -0
- package/dist/frontend/ts7/api.js +24 -0
- package/dist/frontend/ts7/api.js.map +1 -0
- package/dist/frontend/ts7/ast-bytes.d.ts +31 -0
- package/dist/frontend/ts7/ast-bytes.js +137 -0
- package/dist/frontend/ts7/ast-bytes.js.map +1 -0
- package/dist/frontend/ts7/ast-bytes.test.d.ts +1 -0
- package/dist/frontend/ts7/ast-bytes.test.js +73 -0
- package/dist/frontend/ts7/ast-bytes.test.js.map +1 -0
- package/dist/frontend/ts7/ast-guards.generated.d.ts +353 -0
- package/dist/frontend/ts7/ast-guards.generated.js +1951 -0
- package/dist/frontend/ts7/ast-guards.generated.js.map +1 -0
- package/dist/frontend/ts7/ast-guards.test.d.ts +1 -0
- package/dist/frontend/ts7/ast-guards.test.js +43 -0
- package/dist/frontend/ts7/ast-guards.test.js.map +1 -0
- package/dist/frontend/ts7/ast-node.d.ts +194 -0
- package/dist/frontend/ts7/ast-node.js +448 -0
- package/dist/frontend/ts7/ast-node.js.map +1 -0
- package/dist/frontend/ts7/ast-node.test.d.ts +1 -0
- package/dist/frontend/ts7/ast-node.test.js +266 -0
- package/dist/frontend/ts7/ast-node.test.js.map +1 -0
- package/dist/frontend/ts7/ast-schema.generated.d.ts +503 -0
- package/dist/frontend/ts7/ast-schema.generated.js +1446 -0
- package/dist/frontend/ts7/ast-schema.generated.js.map +1 -0
- package/dist/frontend/ts7/ast-text.d.ts +6 -0
- package/dist/frontend/ts7/ast-text.js +124 -0
- package/dist/frontend/ts7/ast-text.js.map +1 -0
- package/dist/frontend/ts7/ast-text.test.d.ts +1 -0
- package/dist/frontend/ts7/ast-text.test.js +38 -0
- package/dist/frontend/ts7/ast-text.test.js.map +1 -0
- package/dist/frontend/ts7/ast-tokens.generated.d.ts +2 -0
- package/dist/frontend/ts7/ast-tokens.generated.js +155 -0
- package/dist/frontend/ts7/ast-tokens.generated.js.map +1 -0
- package/dist/frontend/ts7/ast-types.d.ts +42 -0
- package/dist/frontend/ts7/ast-types.generated.d.ts +1615 -0
- package/dist/frontend/ts7/ast-types.generated.js +5 -0
- package/dist/frontend/ts7/ast-types.generated.js.map +1 -0
- package/dist/frontend/ts7/ast-types.js +3 -0
- package/dist/frontend/ts7/ast-types.js.map +1 -0
- package/dist/frontend/ts7/ast-wire.d.ts +58 -0
- package/dist/frontend/ts7/ast-wire.js +267 -0
- package/dist/frontend/ts7/ast-wire.js.map +1 -0
- package/dist/frontend/ts7/ast-wire.test.d.ts +1 -0
- package/dist/frontend/ts7/ast-wire.test.js +151 -0
- package/dist/frontend/ts7/ast-wire.test.js.map +1 -0
- package/dist/frontend/ts7/ast.d.ts +14 -14
- package/dist/frontend/ts7/ast.js +21 -15
- package/dist/frontend/ts7/ast.js.map +1 -1
- package/dist/frontend/ts7/census-check.js +1 -0
- package/dist/frontend/ts7/census-check.js.map +1 -1
- package/dist/frontend/ts7/checker-cache.d.ts +48 -0
- package/dist/frontend/ts7/checker-cache.js +92 -0
- package/dist/frontend/ts7/checker-cache.js.map +1 -0
- package/dist/frontend/ts7/checker.d.ts +19 -46
- package/dist/frontend/ts7/checker.js +231 -161
- package/dist/frontend/ts7/checker.js.map +1 -1
- package/dist/frontend/ts7/checker.test.d.ts +1 -0
- package/dist/frontend/ts7/checker.test.js +335 -0
- package/dist/frontend/ts7/checker.test.js.map +1 -0
- package/dist/frontend/ts7/enums.d.ts +4 -27
- package/dist/frontend/ts7/enums.generated.d.ts +878 -0
- package/dist/frontend/ts7/enums.generated.js +1313 -0
- package/dist/frontend/ts7/enums.generated.js.map +1 -0
- package/dist/frontend/ts7/enums.js +4 -45
- package/dist/frontend/ts7/enums.js.map +1 -1
- package/dist/frontend/ts7/enums.test.d.ts +1 -0
- package/dist/frontend/ts7/enums.test.js +48 -0
- package/dist/frontend/ts7/enums.test.js.map +1 -0
- package/dist/frontend/ts7/native-api.d.ts +10 -0
- package/dist/frontend/ts7/native-api.js +10 -0
- package/dist/frontend/ts7/native-api.js.map +1 -0
- package/dist/frontend/ts7/native-host.d.ts +2 -0
- package/dist/frontend/ts7/native-host.js +11 -0
- package/dist/frontend/ts7/native-host.js.map +1 -0
- package/dist/frontend/ts7/native-process.d.ts +14 -0
- package/dist/frontend/ts7/native-process.js +62 -0
- package/dist/frontend/ts7/native-process.js.map +1 -0
- package/dist/frontend/ts7/program-adapter.d.ts +10 -98
- package/dist/frontend/ts7/program-adapter.js +16 -310
- package/dist/frontend/ts7/program-adapter.js.map +1 -1
- package/dist/frontend/ts7/program-host.d.ts +115 -0
- package/dist/frontend/ts7/program-host.js +347 -0
- package/dist/frontend/ts7/program-host.js.map +1 -0
- package/dist/frontend/ts7/program-host.test.d.ts +1 -0
- package/dist/frontend/ts7/program-host.test.js +207 -0
- package/dist/frontend/ts7/program-host.test.js.map +1 -0
- package/dist/frontend/ts7/rpc-api.d.ts +12 -0
- package/dist/frontend/ts7/rpc-api.js +23 -0
- package/dist/frontend/ts7/rpc-api.js.map +1 -0
- package/dist/frontend/ts7/rpc-client.d.ts +27 -0
- package/dist/frontend/ts7/rpc-client.js +102 -0
- package/dist/frontend/ts7/rpc-client.js.map +1 -0
- package/dist/frontend/ts7/rpc-client.test.d.ts +1 -0
- package/dist/frontend/ts7/rpc-client.test.js +133 -0
- package/dist/frontend/ts7/rpc-client.test.js.map +1 -0
- package/dist/frontend/ts7/rpc-filesystem.d.ts +16 -0
- package/dist/frontend/ts7/rpc-filesystem.js +42 -0
- package/dist/frontend/ts7/rpc-filesystem.js.map +1 -0
- package/dist/frontend/ts7/rpc-filesystem.test.d.ts +1 -0
- package/dist/frontend/ts7/rpc-filesystem.test.js +89 -0
- package/dist/frontend/ts7/rpc-filesystem.test.js.map +1 -0
- package/dist/frontend/ts7/rpc-process.d.ts +2 -0
- package/dist/frontend/ts7/rpc-process.js +148 -0
- package/dist/frontend/ts7/rpc-process.js.map +1 -0
- package/dist/frontend/ts7/rpc-process.test.d.ts +1 -0
- package/dist/frontend/ts7/rpc-process.test.js +29 -0
- package/dist/frontend/ts7/rpc-process.test.js.map +1 -0
- package/dist/frontend/ts7/rpc-wire.d.ts +46 -0
- package/dist/frontend/ts7/rpc-wire.js +195 -0
- package/dist/frontend/ts7/rpc-wire.js.map +1 -0
- package/dist/frontend/ts7/rpc-wire.test.d.ts +1 -0
- package/dist/frontend/ts7/rpc-wire.test.js +168 -0
- package/dist/frontend/ts7/rpc-wire.test.js.map +1 -0
- package/dist/frontend/ts7/semantic-checker.d.ts +137 -0
- package/dist/frontend/ts7/semantic-checker.js +221 -0
- package/dist/frontend/ts7/semantic-checker.js.map +1 -0
- package/dist/frontend/ts7/semantic-checker.test.d.ts +1 -0
- package/dist/frontend/ts7/semantic-checker.test.js +119 -0
- package/dist/frontend/ts7/semantic-checker.test.js.map +1 -0
- package/dist/frontend/ts7/semantic-json.d.ts +5 -0
- package/dist/frontend/ts7/semantic-json.js +52 -0
- package/dist/frontend/ts7/semantic-json.js.map +1 -0
- package/dist/frontend/ts7/semantic-json.test.d.ts +1 -0
- package/dist/frontend/ts7/semantic-json.test.js +42 -0
- package/dist/frontend/ts7/semantic-json.test.js.map +1 -0
- package/dist/frontend/ts7/semantic-model.d.ts +222 -0
- package/dist/frontend/ts7/semantic-model.js +423 -0
- package/dist/frontend/ts7/semantic-model.js.map +1 -0
- package/dist/frontend/ts7/semantic-model.test.d.ts +1 -0
- package/dist/frontend/ts7/semantic-model.test.js +322 -0
- package/dist/frontend/ts7/semantic-model.test.js.map +1 -0
- package/dist/frontend/ts7/semantic-schema.generated.d.ts +283 -0
- package/dist/frontend/ts7/semantic-schema.generated.js +222 -0
- package/dist/frontend/ts7/semantic-schema.generated.js.map +1 -0
- package/dist/frontend/ts7/semantic-types.d.ts +5 -0
- package/dist/frontend/ts7/semantic-types.js +2 -0
- package/dist/frontend/ts7/semantic-types.js.map +1 -0
- package/dist/frontend/ts7/session-cache.d.ts +17 -0
- package/dist/frontend/ts7/session-cache.js +97 -0
- package/dist/frontend/ts7/session-cache.js.map +1 -0
- package/dist/frontend/ts7/session-cache.test.d.ts +1 -0
- package/dist/frontend/ts7/session-cache.test.js +87 -0
- package/dist/frontend/ts7/session-cache.test.js.map +1 -0
- package/dist/frontend/ts7/session-path.d.ts +18 -0
- package/dist/frontend/ts7/session-path.js +203 -0
- package/dist/frontend/ts7/session-path.js.map +1 -0
- package/dist/frontend/ts7/session-path.test.d.ts +1 -0
- package/dist/frontend/ts7/session-path.test.js +34 -0
- package/dist/frontend/ts7/session-path.test.js.map +1 -0
- package/dist/frontend/ts7/session-schema.generated.d.ts +167 -0
- package/dist/frontend/ts7/session-schema.generated.js +5 -0
- package/dist/frontend/ts7/session-schema.generated.js.map +1 -0
- package/dist/frontend/ts7/session-timing.d.ts +50 -0
- package/dist/frontend/ts7/session-timing.js +61 -0
- package/dist/frontend/ts7/session-timing.js.map +1 -0
- package/dist/frontend/ts7/session-timing.test.d.ts +1 -0
- package/dist/frontend/ts7/session-timing.test.js +52 -0
- package/dist/frontend/ts7/session-timing.test.js.map +1 -0
- package/dist/frontend/ts7/session.d.ts +105 -0
- package/dist/frontend/ts7/session.js +233 -0
- package/dist/frontend/ts7/session.js.map +1 -0
- package/dist/frontend/ts7/session.test.d.ts +1 -0
- package/dist/frontend/ts7/session.test.js +215 -0
- package/dist/frontend/ts7/session.test.js.map +1 -0
- package/dist/frontend/ts7/source-parser-node.d.ts +6 -0
- package/dist/frontend/ts7/source-parser-node.js +15 -0
- package/dist/frontend/ts7/source-parser-node.js.map +1 -0
- package/dist/frontend/ts7/source-parser.d.ts +25 -0
- package/dist/frontend/ts7/source-parser.js +96 -0
- package/dist/frontend/ts7/source-parser.js.map +1 -0
- package/dist/frontend/ts7/source-parser.test.d.ts +1 -0
- package/dist/frontend/ts7/source-parser.test.js +151 -0
- package/dist/frontend/ts7/source-parser.test.js.map +1 -0
- package/dist/frontend/ts7/syntax.d.ts +3 -0
- package/dist/frontend/ts7/syntax.js +4 -0
- package/dist/frontend/ts7/syntax.js.map +1 -0
- package/dist/frontend/tsc-codes.js +3 -0
- package/dist/frontend/tsc-codes.js.map +1 -1
- package/dist/frontend/type-mapper.d.ts +25 -17
- package/dist/frontend/type-mapper.js +465 -121
- package/dist/frontend/type-mapper.js.map +1 -1
- package/dist/frontend/type-mapper.test.js +123 -2
- package/dist/frontend/type-mapper.test.js.map +1 -1
- package/dist/frontend/union-discriminants.d.ts +16 -0
- package/dist/frontend/union-discriminants.js +98 -0
- package/dist/frontend/union-discriminants.js.map +1 -0
- package/dist/frontend/union-discriminants.test.d.ts +1 -0
- package/dist/frontend/union-discriminants.test.js +182 -0
- package/dist/frontend/union-discriminants.test.js.map +1 -0
- package/dist/index.d.ts +7 -198
- package/dist/index.js +369 -1572
- package/dist/index.js.map +1 -1
- package/dist/ir/analysis.d.ts +16 -4
- package/dist/ir/analysis.js +21 -4
- package/dist/ir/analysis.js.map +1 -1
- package/dist/ir/analysis.test.js +15 -2
- package/dist/ir/analysis.test.js.map +1 -1
- package/dist/ir/constant-tables.js +67 -49
- package/dist/ir/constant-tables.js.map +1 -1
- package/dist/ir/constant-tables.test.js +1 -1
- package/dist/ir/control-flow.d.ts +6 -0
- package/dist/ir/control-flow.js +142 -0
- package/dist/ir/control-flow.js.map +1 -0
- package/dist/ir/control-flow.test.d.ts +1 -0
- package/dist/ir/control-flow.test.js +113 -0
- package/dist/ir/control-flow.test.js.map +1 -0
- package/dist/ir/integer-loops.js +7 -18
- package/dist/ir/integer-loops.js.map +1 -1
- package/dist/ir/integer-ranges.js +53 -27
- package/dist/ir/integer-ranges.js.map +1 -1
- package/dist/ir/ir.d.ts +291 -152
- package/dist/ir/ir.js +588 -881
- package/dist/ir/ir.js.map +1 -1
- package/dist/ir/ir.test.js +127 -1
- package/dist/ir/ir.test.js.map +1 -1
- package/dist/ir/scalar-records.js +165 -134
- package/dist/ir/scalar-records.js.map +1 -1
- package/dist/ir/scalar-records.test.js +1 -1
- package/dist/ir/serialize.d.ts +4 -2
- package/dist/ir/serialize.js +19 -12
- package/dist/ir/serialize.js.map +1 -1
- package/dist/ir/serialize.test.d.ts +1 -0
- package/dist/ir/serialize.test.js +53 -0
- package/dist/ir/serialize.test.js.map +1 -0
- package/dist/ir/traverse.d.ts +41 -0
- package/dist/ir/traverse.js +660 -0
- package/dist/ir/traverse.js.map +1 -0
- package/dist/ir/traverse.test.d.ts +1 -0
- package/dist/ir/traverse.test.js +242 -0
- package/dist/ir/traverse.test.js.map +1 -0
- package/dist/ir/validate.js +1942 -1491
- package/dist/ir/validate.js.map +1 -1
- package/dist/ir/validate.test.js +476 -2
- package/dist/ir/validate.test.js.map +1 -1
- package/dist/library/cache-primitives.d.ts +2 -3
- package/dist/library/cache-primitives.js +4 -6
- package/dist/library/cache-primitives.js.map +1 -1
- package/dist/library/fence-eval.js +2 -2
- package/dist/library/fence-eval.js.map +1 -1
- package/dist/library/int-infer.js +7 -6
- package/dist/library/int-infer.js.map +1 -1
- package/dist/library/int-infer.test.js +4 -4
- package/dist/library/library-cache.d.ts +3 -2
- package/dist/library/library-cache.js +5 -17
- package/dist/library/library-cache.js.map +1 -1
- package/dist/library/library-cache.test.js +54 -41
- package/dist/library/library-cache.test.js.map +1 -1
- package/dist/library/library-profile.d.ts +3 -1
- package/dist/library/library-profile.js +15 -6
- package/dist/library/library-profile.js.map +1 -1
- package/dist/library/prepare.d.ts +15 -0
- package/dist/library/prepare.js +584 -0
- package/dist/library/prepare.js.map +1 -0
- package/dist/library/semantic-source.d.ts +1 -1
- package/dist/library/semantic-source.js +8 -6
- package/dist/library/semantic-source.js.map +1 -1
- package/dist/library/sidecar-validate.js +4 -4
- package/dist/library/sidecar-validate.js.map +1 -1
- package/dist/library/sidecar.d.ts +2 -0
- package/dist/library/sidecar.js +10 -3
- package/dist/library/sidecar.js.map +1 -1
- package/dist/native/cache.d.ts +11 -0
- package/dist/native/cache.js +113 -0
- package/dist/native/cache.js.map +1 -0
- package/dist/native/cache.test.d.ts +1 -0
- package/dist/native/cache.test.js +66 -0
- package/dist/native/cache.test.js.map +1 -0
- package/dist/native/cli.d.ts +1 -0
- package/dist/native/cli.js +112 -0
- package/dist/native/cli.js.map +1 -0
- package/dist/native/compiler.d.ts +15 -0
- package/dist/native/compiler.js +336 -0
- package/dist/native/compiler.js.map +1 -0
- package/dist/native/compiler.test.d.ts +1 -0
- package/dist/native/compiler.test.js +174 -0
- package/dist/native/compiler.test.js.map +1 -0
- package/dist/native/comptime.d.ts +5 -0
- package/dist/native/comptime.js +73 -0
- package/dist/native/comptime.js.map +1 -0
- package/dist/native/comptime.test.d.ts +1 -0
- package/dist/native/comptime.test.js +65 -0
- package/dist/native/comptime.test.js.map +1 -0
- package/dist/native/executable-cache.d.ts +26 -0
- package/dist/native/executable-cache.js +228 -0
- package/dist/native/executable-cache.js.map +1 -0
- package/dist/native/executable-cache.test.d.ts +1 -0
- package/dist/native/executable-cache.test.js +151 -0
- package/dist/native/executable-cache.test.js.map +1 -0
- package/dist/native/file-identity.d.ts +4 -0
- package/dist/native/file-identity.js +14 -0
- package/dist/native/file-identity.js.map +1 -0
- package/dist/native/file-identity.test.d.ts +1 -0
- package/dist/native/file-identity.test.js +43 -0
- package/dist/native/file-identity.test.js.map +1 -0
- package/dist/native/library.d.ts +22 -0
- package/dist/native/library.js +83 -0
- package/dist/native/library.js.map +1 -0
- package/dist/native/prepare.d.ts +21 -0
- package/dist/native/prepare.js +174 -0
- package/dist/native/prepare.js.map +1 -0
- package/dist/native/prepare.test.d.ts +1 -0
- package/dist/native/prepare.test.js +70 -0
- package/dist/native/prepare.test.js.map +1 -0
- package/dist/native/sanitizer.d.ts +11 -0
- package/dist/native/sanitizer.js +135 -0
- package/dist/native/sanitizer.js.map +1 -0
- package/dist/native/sanitizer.test.d.ts +1 -0
- package/dist/native/sanitizer.test.js +58 -0
- package/dist/native/sanitizer.test.js.map +1 -0
- package/dist/native/task.d.ts +4 -0
- package/dist/native/task.js +16 -0
- package/dist/native/task.js.map +1 -0
- package/dist/native/task.test.d.ts +1 -0
- package/dist/native/task.test.js +17 -0
- package/dist/native/task.test.js.map +1 -0
- package/dist/native/toolchain.d.ts +45 -0
- package/dist/native/toolchain.js +74 -0
- package/dist/native/toolchain.js.map +1 -0
- package/dist/native/toolchain.test.d.ts +1 -0
- package/dist/native/toolchain.test.js +33 -0
- package/dist/native/toolchain.test.js.map +1 -0
- package/dist/startup-cache.d.ts +1 -1
- package/dist/startup-cache.js +2 -5
- package/dist/startup-cache.js.map +1 -1
- package/dist/timing.d.ts +4 -0
- package/dist/timing.js +19 -0
- package/dist/timing.js.map +1 -0
- package/dist/wasi-paths.js +10 -7
- package/dist/wasi-paths.js.map +1 -1
- package/package.json +28 -19
- package/surface-manifest.json +52 -18
- package/dist/backend/c/async.d.ts +0 -171
- package/dist/backend/c/async.js +0 -1317
- package/dist/backend/c/async.js.map +0 -1
- package/dist/backend/c/c-emitter.d.ts +0 -536
- package/dist/backend/c/c-emitter.js +0 -1932
- package/dist/backend/c/c-emitter.js.map +0 -1
- package/dist/backend/c/exprs.d.ts +0 -15
- package/dist/backend/c/exprs.js +0 -8847
- package/dist/backend/c/exprs.js.map +0 -1
- package/dist/backend/c/island.d.ts +0 -45
- package/dist/backend/c/island.js +0 -281
- package/dist/backend/c/island.js.map +0 -1
- package/dist/backend/c/may-throw.js.map +0 -1
- package/dist/backend/c/shapes.d.ts +0 -142
- package/dist/backend/c/shapes.js +0 -603
- package/dist/backend/c/shapes.js.map +0 -1
- package/dist/backend/c/stmts.d.ts +0 -76
- package/dist/backend/c/stmts.js +0 -1108
- package/dist/backend/c/stmts.js.map +0 -1
- package/dist/backend/c/types.d.ts +0 -71
- package/dist/backend/c/types.js +0 -459
- package/dist/backend/c/types.js.map +0 -1
- package/dist/backend/c/types.test.js +0 -32
- package/dist/backend/c/types.test.js.map +0 -1
- package/dist/backend/c/walkers.d.ts +0 -134
- package/dist/backend/c/walkers.js +0 -1772
- package/dist/backend/c/walkers.js.map +0 -1
- /package/dist/backend/{c/types.test.d.ts → cycle-analysis.test.d.ts} +0 -0
|
@@ -7,9 +7,11 @@ import { recordShapeMismatchDiag } from "../../../diagnostics/diagnostic.js";
|
|
|
7
7
|
import { PoisonError, dynUndefinedExpr } from "../lowerer.js";
|
|
8
8
|
import { lowerIndexMergeHelper } from "../lower-containers.js";
|
|
9
9
|
import { isGenericCallableMemberType } from "../../type-mapper.js";
|
|
10
|
-
import { numLit, varRef } from "../../../ir/build.js";
|
|
10
|
+
import { numLit, strLit, varRef } from "../../../ir/build.js";
|
|
11
11
|
import { isSafeToRepeat } from "./evaluation-safety.js";
|
|
12
12
|
import { tryLowerExpression } from "./try-lower-expression.js";
|
|
13
|
+
import { fenceSymbolFieldCopy } from "../symbol-fields.js";
|
|
14
|
+
import { planUnionRetag } from "../union-retag.js";
|
|
13
15
|
/** `{ a: 1, b: "x" }` → recordLit. The record type comes from the
|
|
14
16
|
* contextual type when tsc has one (annotated declarations, arguments,
|
|
15
17
|
* nested literals) and from the literal's own type otherwise — both intern
|
|
@@ -31,10 +33,11 @@ function settledDropNames(lowerer, tsType) {
|
|
|
31
33
|
!lowerer.checker.declarationsOf(sym).some((d) => ts.isInterfaceDeclaration(d) && lowerer.isStdlibFile(d.getSourceFile()))) {
|
|
32
34
|
continue;
|
|
33
35
|
}
|
|
34
|
-
if (sym.name === "PromiseFulfilledResult")
|
|
35
|
-
(names
|
|
36
|
-
|
|
37
|
-
|
|
36
|
+
if (sym.name === "PromiseFulfilledResult" || sym.name === "PromiseRejectedResult") {
|
|
37
|
+
if (names === null)
|
|
38
|
+
names = new Set();
|
|
39
|
+
names.add(sym.name === "PromiseFulfilledResult" ? "value" : "reason");
|
|
40
|
+
}
|
|
38
41
|
}
|
|
39
42
|
return names;
|
|
40
43
|
}
|
|
@@ -179,15 +182,30 @@ function propNameText(lowerer, name) {
|
|
|
179
182
|
* dyn's String() for dyn operands — `{ [field]: v }` where field is a
|
|
180
183
|
* checked-dynamic param). Values convert through the usual dyn boundary
|
|
181
184
|
* (dynFrom's domain, functions box); a value with no dyn representation
|
|
182
|
-
* fences per property. Spreads
|
|
183
|
-
* accessors
|
|
185
|
+
* fences per property. Spreads create own data properties in source order;
|
|
186
|
+
* accessors retain their captured getter and setter closures. */
|
|
184
187
|
export function lowerDynObjectLiteral(lowerer, expr, boxValue) {
|
|
185
188
|
const loc = locOf(expr);
|
|
186
189
|
let fields = [];
|
|
187
190
|
let acc = null;
|
|
191
|
+
let hasAccessors = false;
|
|
188
192
|
const flushFields = () => {
|
|
189
193
|
if (fields.length === 0)
|
|
190
194
|
return;
|
|
195
|
+
if (hasAccessors) {
|
|
196
|
+
for (const field of fields) {
|
|
197
|
+
const descriptor = { kind: "dynObjLit", type: DYN, loc, fields: [
|
|
198
|
+
{ key: { kind: "strLit", value: "value", type: STRING, loc }, value: field.value },
|
|
199
|
+
...["writable", "enumerable", "configurable"].map(name => ({
|
|
200
|
+
key: strLit(name, loc),
|
|
201
|
+
value: { kind: "dynFrom", value: { kind: "boolLit", value: true, type: BOOL, loc }, type: DYN, loc },
|
|
202
|
+
})),
|
|
203
|
+
] };
|
|
204
|
+
acc = { kind: "libCall", fn: "dyn.defineProperty", args: [acc, lowerer.coerceToExpected(field.key, DYN), descriptor], type: DYN, loc };
|
|
205
|
+
}
|
|
206
|
+
fields = [];
|
|
207
|
+
return;
|
|
208
|
+
}
|
|
191
209
|
const chunk = { kind: "dynObjLit", fields, type: DYN, loc };
|
|
192
210
|
acc = acc === null
|
|
193
211
|
? chunk
|
|
@@ -198,6 +216,7 @@ export function lowerDynObjectLiteral(lowerer, expr, boxValue) {
|
|
|
198
216
|
if (ts.isSpreadAssignment(prop)) {
|
|
199
217
|
flushFields();
|
|
200
218
|
const raw = lowerer.lowerExpr(prop.expression);
|
|
219
|
+
fenceSymbolFieldCopy(lowerer, prop.expression, raw.type);
|
|
201
220
|
const source = boxValue
|
|
202
221
|
? boxValue(prop.expression, raw)
|
|
203
222
|
: lowerer.coerceToExpected(raw, DYN);
|
|
@@ -205,14 +224,9 @@ export function lowerDynObjectLiteral(lowerer, expr, boxValue) {
|
|
|
205
224
|
lowerer.unsupported("SC1101", prop.expression, `spreading '${lowerer.fmt(source.type)}' into a checked-dynamic object literal`);
|
|
206
225
|
}
|
|
207
226
|
acc ??= { kind: "dynObjLit", fields: [], type: DYN, loc };
|
|
208
|
-
acc = { kind: "libCall", fn: "dyn.
|
|
227
|
+
acc = { kind: "libCall", fn: "dyn.copyDataProperties", args: [acc, source], type: DYN, loc: locOf(prop) };
|
|
209
228
|
continue;
|
|
210
229
|
}
|
|
211
|
-
if (!ts.isPropertyAssignment(prop) &&
|
|
212
|
-
!ts.isShorthandPropertyAssignment(prop) &&
|
|
213
|
-
!ts.isMethodDeclaration(prop)) {
|
|
214
|
-
lowerer.unsupported("SC1090", prop, "accessors in a runtime-keyed (computed-key) object literal");
|
|
215
|
-
}
|
|
216
230
|
const name = prop.name;
|
|
217
231
|
let key;
|
|
218
232
|
if (ts.isComputedPropertyName(name)) {
|
|
@@ -222,10 +236,14 @@ export function lowerDynObjectLiteral(lowerer, expr, boxValue) {
|
|
|
222
236
|
}
|
|
223
237
|
else {
|
|
224
238
|
let k = lowerer.lowerExpr(name.expression);
|
|
225
|
-
if (k.type.kind === "
|
|
239
|
+
if (k.type.kind === "symbol")
|
|
240
|
+
k = lowerer.coerceToExpected(k, DYN);
|
|
241
|
+
else if (k.type.kind === "dyn")
|
|
242
|
+
k = { kind: "libCall", fn: "dyn.propertyKey", args: [k], type: DYN, loc: locOf(name) };
|
|
243
|
+
else if (k.type.kind === "f64" || k.type.kind === "bool") {
|
|
226
244
|
k = { kind: "toString", operand: k, type: STRING, loc: locOf(name) };
|
|
227
245
|
}
|
|
228
|
-
if (k.type.kind !== "string") {
|
|
246
|
+
if (k.type.kind !== "string" && k.type.kind !== "dyn") {
|
|
229
247
|
lowerer.unsupported("SC1090", name, `'${lowerer.fmt(k.type)}'-typed computed property keys (string, number, boolean, and unknown keys stringify)`);
|
|
230
248
|
}
|
|
231
249
|
key = k;
|
|
@@ -240,6 +258,25 @@ export function lowerDynObjectLiteral(lowerer, expr, boxValue) {
|
|
|
240
258
|
else {
|
|
241
259
|
lowerer.unsupported("SC1090", prop, "non-identifier property names");
|
|
242
260
|
}
|
|
261
|
+
if (ts.isGetAccessorDeclaration(prop) || ts.isSetAccessorDeclaration(prop)) {
|
|
262
|
+
flushFields();
|
|
263
|
+
hasAccessors = true;
|
|
264
|
+
acc ??= { kind: "dynObjLit", fields: [], type: DYN, loc };
|
|
265
|
+
if (!isJsSourceFile(expr.getSourceFile()))
|
|
266
|
+
lowerer.rejectThisInObjectMethod(prop.body ?? prop);
|
|
267
|
+
const fn = lowerer.lowerLambda(prop);
|
|
268
|
+
const descriptor = {
|
|
269
|
+
kind: "dynObjLit", type: DYN, loc: locOf(prop), fields: [
|
|
270
|
+
{ key: { kind: "strLit", value: ts.isGetAccessorDeclaration(prop) ? "get" : "set", type: STRING, loc }, value: lowerer.coerceToExpected(fn, DYN) },
|
|
271
|
+
...["enumerable", "configurable"].map(name => ({
|
|
272
|
+
key: strLit(name, loc),
|
|
273
|
+
value: { kind: "dynFrom", value: { kind: "boolLit", value: true, type: BOOL, loc }, type: DYN, loc },
|
|
274
|
+
})),
|
|
275
|
+
],
|
|
276
|
+
};
|
|
277
|
+
acc = { kind: "libCall", fn: "dyn.defineProperty", args: [acc, lowerer.coerceToExpected(key, DYN), descriptor], type: DYN, loc };
|
|
278
|
+
continue;
|
|
279
|
+
}
|
|
243
280
|
const valueExpr = ts.isMethodDeclaration(prop)
|
|
244
281
|
? prop
|
|
245
282
|
: ts.isShorthandPropertyAssignment(prop)
|
|
@@ -252,8 +289,10 @@ export function lowerDynObjectLiteral(lowerer, expr, boxValue) {
|
|
|
252
289
|
const propDiagsBefore = lowerer.diags.length;
|
|
253
290
|
try {
|
|
254
291
|
const lowerValue = () => ts.isMethodDeclaration(prop)
|
|
255
|
-
? (lowerer.rejectThisInObjectMethod(prop.body ?? prop), lowerer.lowerLambda(prop))
|
|
256
|
-
:
|
|
292
|
+
? (isJsSourceFile(expr.getSourceFile()) ? lowerer.lowerLambda(prop) : (lowerer.rejectThisInObjectMethod(prop.body ?? prop), lowerer.lowerLambda(prop)))
|
|
293
|
+
: !boxValue && ts.isObjectLiteralExpression(valueExpr)
|
|
294
|
+
? lowerer.lowerExprExpecting(valueExpr, DYN)
|
|
295
|
+
: lowerer.lowerExpr(valueExpr);
|
|
257
296
|
raw =
|
|
258
297
|
fenceClosureProbe(lowerer, valueExpr, undefined, lowerValue) ??
|
|
259
298
|
lowerValue();
|
|
@@ -279,6 +318,11 @@ export function lowerDynObjectLiteral(lowerer, expr, boxValue) {
|
|
|
279
318
|
let v = boxValue
|
|
280
319
|
? boxValue(valueExpr, raw)
|
|
281
320
|
: lowerer.coerceToExpected(raw, DYN);
|
|
321
|
+
// A JS object's array-valued properties retain the same source array.
|
|
322
|
+
// Repeated references must compare equal and mutations remain shared.
|
|
323
|
+
if (!boxValue && isJsSourceFile(prop.getSourceFile()) && v.kind === "dynFrom" && v.value.type.kind === "array") {
|
|
324
|
+
v = { ...v, liveRef: true };
|
|
325
|
+
}
|
|
282
326
|
if (v.type.kind !== "dyn") {
|
|
283
327
|
const convDiagsBefore = lowerer.diags.length;
|
|
284
328
|
try {
|
|
@@ -307,7 +351,9 @@ export function lowerDynObjectLiteral(lowerer, expr, boxValue) {
|
|
|
307
351
|
fields.push({ key, value: v });
|
|
308
352
|
}
|
|
309
353
|
flushFields();
|
|
310
|
-
|
|
354
|
+
if (acc !== null)
|
|
355
|
+
return acc;
|
|
356
|
+
return { kind: "dynObjLit", fields: [], type: DYN, loc };
|
|
311
357
|
}
|
|
312
358
|
/** Spreading a source whose shape carries accessor slots: Node's copy
|
|
313
359
|
* invokes each getter exactly once in insertion order — even for keys a
|
|
@@ -319,6 +365,16 @@ function fenceAccessorSpreadSource(lowerer, prop, srcShape) {
|
|
|
319
365
|
lowerer.unsupported("SC1090", prop, "object spread of sources carrying get/set accessor properties (Node invokes each getter once during the copy — the field-copy desugar cannot model the calls; bind the reads to consts first)");
|
|
320
366
|
}
|
|
321
367
|
}
|
|
368
|
+
/** Only definitely present later records replace earlier defaults. A
|
|
369
|
+
* callback binding may store undefined despite its checker annotation. */
|
|
370
|
+
function laterSpreadType(lowerer, expr) {
|
|
371
|
+
let source = expr;
|
|
372
|
+
while (ts.isParenthesizedExpression(source))
|
|
373
|
+
source = source.expression;
|
|
374
|
+
if (ts.isIdentifier(source))
|
|
375
|
+
return lowerer.lowerExpr(source).type;
|
|
376
|
+
return lowerer.mapTypeOf(lowerer.typeOf(source));
|
|
377
|
+
}
|
|
322
378
|
/** The JS trap-closure fallback for FUNCTION-VALUED object properties: a
|
|
323
379
|
* lambda whose body fails to lower inside a JS object literal becomes a
|
|
324
380
|
* closure of the field's exact func type whose body is the runtime fence —
|
|
@@ -379,33 +435,48 @@ function fenceClosureProbe(lowerer, node, slotType, attempt) {
|
|
|
379
435
|
* (excess-property freshness — tsc already enforced it), every arm field
|
|
380
436
|
* missing from the literal must be optional-flavored (an undefined-armed
|
|
381
437
|
* union, or a dyn slot — the absent-completion rule), and each present
|
|
382
|
-
* field's
|
|
383
|
-
* literal decides by VALUE (the discriminant), everything else
|
|
384
|
-
*
|
|
438
|
+
* field's TypeScript type must fit the member's field type — literal against
|
|
439
|
+
* literal decides by VALUE (the discriminant), everything else through the
|
|
440
|
+
* checker. The chosen arm then directs construction of nested literals;
|
|
441
|
+
* probing their inferred IR layout too early can reject the right arm and
|
|
442
|
+
* select a smaller unrelated record that drops fields. Exactly ONE fitting arm
|
|
385
443
|
* answers it; zero or several answer null and the caller keeps its
|
|
386
|
-
* fences.
|
|
387
|
-
*
|
|
444
|
+
* fences. A spread uses the checker's resulting properties so overridden
|
|
445
|
+
* discriminants and narrowed recursive source arms keep their identity.
|
|
446
|
+
* Accessors, methods, and unfoldable computed keys keep their own paths. */
|
|
388
447
|
function literalUnionArmOf(lowerer, expr, tsType, recordArms) {
|
|
389
448
|
if (!tsType.isUnionType())
|
|
390
449
|
return null;
|
|
391
450
|
const props = [];
|
|
451
|
+
let hasSpread = false;
|
|
392
452
|
for (const p of expr.properties) {
|
|
393
453
|
if (ts.isPropertyAssignment(p) && !ts.isComputedPropertyName(p.name)) {
|
|
394
|
-
props.push({ name: propNameText(lowerer, p.name),
|
|
454
|
+
props.push({ name: propNameText(lowerer, p.name), type: lowerer.typeOf(p.initializer) });
|
|
395
455
|
}
|
|
396
456
|
else if (ts.isShorthandPropertyAssignment(p) && ts.isIdentifier(p.name)) {
|
|
397
|
-
props.push({ name: p.name.text,
|
|
457
|
+
props.push({ name: p.name.text, type: lowerer.typeOf(p.name) });
|
|
458
|
+
}
|
|
459
|
+
else if (ts.isSpreadAssignment(p)) {
|
|
460
|
+
hasSpread = true;
|
|
398
461
|
}
|
|
399
462
|
else {
|
|
400
463
|
return null;
|
|
401
464
|
}
|
|
402
465
|
}
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
466
|
+
if (hasSpread) {
|
|
467
|
+
const own = lowerer.typeOf(expr);
|
|
468
|
+
// Conditional/union spreads need runtime selection, not one guessed arm.
|
|
469
|
+
if (own.isUnionType())
|
|
470
|
+
return null;
|
|
471
|
+
props.length = 0;
|
|
472
|
+
for (const property of lowerer.checker.getPropertiesOfType(own)) {
|
|
473
|
+
props.push({ name: property.name, type: lowerer.checker.getTypeOfSymbol(property) });
|
|
474
|
+
}
|
|
475
|
+
}
|
|
476
|
+
/** Cheap literal discriminants avoid checker traffic for unrelated arms.
|
|
477
|
+
* Compound types need the checker's semantic assignability, including
|
|
478
|
+
* recursive unions, never intersections, and contextual empty arrays. */
|
|
406
479
|
const fits = (litT, ftT) => {
|
|
407
|
-
if (ftT.isUnionType())
|
|
408
|
-
return ts.constituentTypes(ftT).some((a) => fits(litT, a));
|
|
409
480
|
if (ftT.isStringLiteralType())
|
|
410
481
|
return litT.isStringLiteralType() && litT.value === ftT.value;
|
|
411
482
|
if (ftT.isNumberLiteralType())
|
|
@@ -417,13 +488,7 @@ function literalUnionArmOf(lowerer, expr, tsType, recordArms) {
|
|
|
417
488
|
return (litT.flags & ts.TypeFlags.Null) !== 0;
|
|
418
489
|
if (ftT.flags & ts.TypeFlags.Undefined)
|
|
419
490
|
return (litT.flags & ts.TypeFlags.Undefined) !== 0;
|
|
420
|
-
|
|
421
|
-
return false;
|
|
422
|
-
const li = lowerer.mapTypeOf(lowerer.checker.getBaseTypeOfLiteralType(litT));
|
|
423
|
-
const fi = lowerer.mapTypeOf(ftT);
|
|
424
|
-
if (!li || !fi)
|
|
425
|
-
return false;
|
|
426
|
-
return typeEquals(li, fi) || lowerer.widthLiftPlan(li, fi) !== null;
|
|
491
|
+
return lowerer.checker.isTypeAssignableTo(litT, ftT);
|
|
427
492
|
};
|
|
428
493
|
const armShapeIds = new Set(recordArms.map((a) => a.shapeId));
|
|
429
494
|
const candidates = new Set();
|
|
@@ -456,14 +521,14 @@ function literalUnionArmOf(lowerer, expr, tsType, recordArms) {
|
|
|
456
521
|
const sym = lowerer.checker.getPropertyOfType(member, p.name);
|
|
457
522
|
if (!sym)
|
|
458
523
|
return false;
|
|
459
|
-
return fits(
|
|
524
|
+
return fits(p.type, lowerer.checker.getTypeOfSymbol(sym));
|
|
460
525
|
});
|
|
461
526
|
if (fieldsFit)
|
|
462
527
|
candidates.add(mMapped.shapeId);
|
|
463
528
|
}
|
|
464
529
|
if (candidates.size !== 1)
|
|
465
530
|
return null;
|
|
466
|
-
const [only] = candidates;
|
|
531
|
+
const [only] = [...candidates];
|
|
467
532
|
return recordArms.find((a) => a.shapeId === only) ?? null;
|
|
468
533
|
}
|
|
469
534
|
/** Object spread treats nullish sources as empty. Preserve evaluation once,
|
|
@@ -499,8 +564,24 @@ function lowerOptionalIndexSpreadSource(lowerer, source, loc) {
|
|
|
499
564
|
};
|
|
500
565
|
return prefix.length === 0 ? selected : { kind: "seqExpr", stmts: prefix, result: selected, type: recordType, loc };
|
|
501
566
|
}
|
|
502
|
-
export function lowerObjectLiteral(lowerer, expr) {
|
|
567
|
+
export function lowerObjectLiteral(lowerer, expr, expected) {
|
|
503
568
|
const loc = locOf(expr);
|
|
569
|
+
// Module collection already chose checked storage for this JavaScript
|
|
570
|
+
// binding. Construct in that representation: an intermediate record would
|
|
571
|
+
// check nested aliases back into inferred shapes and lose their identity.
|
|
572
|
+
if (isJsSourceFile(expr.getSourceFile()) && ts.isVariableDeclaration(expr.parent) &&
|
|
573
|
+
expr.parent.initializer === expr && ts.isIdentifier(expr.parent.name) &&
|
|
574
|
+
lowerer.globalOf(expr.parent.name)?.type.kind === "dyn") {
|
|
575
|
+
return lowerDynObjectLiteral(lowerer, expr);
|
|
576
|
+
}
|
|
577
|
+
// A checked spread carries runtime symbol keys and receiver-sensitive
|
|
578
|
+
// methods absent from its inferred record shape. Copy the real properties.
|
|
579
|
+
if (!expected && isJsSourceFile(expr.getSourceFile()) && expr.properties.some((property) => ts.isSpreadAssignment(property) && tryLowerExpression(lowerer, property.expression)?.type.kind === "dyn")) {
|
|
580
|
+
return lowerDynObjectLiteral(lowerer, expr);
|
|
581
|
+
}
|
|
582
|
+
const unionClone = lowerUnionRecordClone(lowerer, expr);
|
|
583
|
+
if (unionClone !== null)
|
|
584
|
+
return unionClone;
|
|
504
585
|
// The RUNTIME-KEYED literal (JS): a computed key that doesn't fold to a
|
|
505
586
|
// compile-time string means the literal's shape is not a compile-time
|
|
506
587
|
// fact — no record shape can hold it. The whole literal builds as a dyn
|
|
@@ -578,6 +659,10 @@ export function lowerObjectLiteral(lowerer, expr) {
|
|
|
578
659
|
lowerer.rejectThisInObjectMethod(prop.body ?? prop);
|
|
579
660
|
}
|
|
580
661
|
let tsType = lowerer.checker.getContextualType(expr) ?? lowerer.typeOf(expr);
|
|
662
|
+
// `as never` supplies no construction layout. Keep the literal's own
|
|
663
|
+
// fields so an exhaustiveness witness cannot erase a reachable value.
|
|
664
|
+
if (lowerer.checker.isNeverType(tsType))
|
|
665
|
+
tsType = lowerer.typeOf(expr);
|
|
581
666
|
// `lit satisfies T` is TYPE-LEVEL only: the expression's checker type —
|
|
582
667
|
// and therefore the shape every downstream consumer sees — is the
|
|
583
668
|
// literal's OWN type (T still contextually types members, so inferred
|
|
@@ -609,6 +694,13 @@ export function lowerObjectLiteral(lowerer, expr) {
|
|
|
609
694
|
tsType = lowerer.checker.getAwaitedType(tsType) ?? tsType;
|
|
610
695
|
}
|
|
611
696
|
let mapped = lowerer.mapTypeOf(tsType);
|
|
697
|
+
// A checked-dynamic source has runtime keys even when later explicit
|
|
698
|
+
// fields make the literal's inferred type look like a fixed record.
|
|
699
|
+
// Keep a checked-dynamic destination in that representation so copying
|
|
700
|
+
// preserves keys, evaluation order, and fields overwritten afterwards.
|
|
701
|
+
if (mapped?.kind === "dyn" && expr.properties.some((p) => ts.isSpreadAssignment(p) && lowerer.mapTypeOf(lowerer.typeOf(p.expression))?.kind === "dyn")) {
|
|
702
|
+
return lowerDynObjectLiteral(lowerer, expr);
|
|
703
|
+
}
|
|
612
704
|
// A JavaScript call can contextually type an object literal as string even
|
|
613
705
|
// though the literal itself is a record. Keep its own shape so a caller
|
|
614
706
|
// performing ToString can convert it after the value is built.
|
|
@@ -675,7 +767,11 @@ export function lowerObjectLiteral(lowerer, expr) {
|
|
|
675
767
|
// gate DECLINED it (a project-declared typedef that absorbed to the
|
|
676
768
|
// island through checker-`any` field residue): the literal builds at
|
|
677
769
|
// its own type like every unmappable context.
|
|
678
|
-
|
|
770
|
+
// An index-signature literal can inherit a callable contextual type for
|
|
771
|
+
// a prototype-named DATA property (notably `toString`). Object literals
|
|
772
|
+
// have no call signature; construct their own data shape and let the
|
|
773
|
+
// surrounding assignment/assertion enforce the destination contract.
|
|
774
|
+
if (mapped === null || mapped.kind === "union" || mapped.kind === "dyn" || mapped.kind === "object" || mapped.kind === "jsval" || mapped.kind === "func") {
|
|
679
775
|
const ctxUnion = mapped?.kind === "union" ? mapped : null;
|
|
680
776
|
mapped = lowerer.mapTypeOf(lowerer.typeOf(expr)) ?? mapped;
|
|
681
777
|
// A literal whose own shape re-tags into NO arm of the contextual
|
|
@@ -697,7 +793,10 @@ export function lowerObjectLiteral(lowerer, expr) {
|
|
|
697
793
|
if (recordArms.length === 1) {
|
|
698
794
|
const armShape = lowerer.shapes.get(recordArms[0].shapeId);
|
|
699
795
|
if ((mapped?.kind !== "record" || mapped.shapeId !== recordArms[0].shapeId) &&
|
|
700
|
-
!armShape?.tuple
|
|
796
|
+
!armShape?.tuple &&
|
|
797
|
+
// `{} | undefined` supplies no layout for a populated options
|
|
798
|
+
// literal, just as a bare empty-record context supplies none.
|
|
799
|
+
(expr.properties.length === 0 || (armShape && (armShape.fields.length > 0 || armShape.indexValue)))) {
|
|
701
800
|
mapped = recordArms[0];
|
|
702
801
|
}
|
|
703
802
|
}
|
|
@@ -715,7 +814,11 @@ export function lowerObjectLiteral(lowerer, expr) {
|
|
|
715
814
|
// exactly ONE member fits, build AS that arm — its field types
|
|
716
815
|
// drive every property's coercion, exactly the single-record-arm
|
|
717
816
|
// rule above. Ambiguous literals keep the SC2003 fence.
|
|
718
|
-
|
|
817
|
+
// Recursive arms can have identical stored field layouts while
|
|
818
|
+
// retaining distinct nominal knots. An inferred spread shape can
|
|
819
|
+
// match the wrong knot, so consult discriminants even if that shape
|
|
820
|
+
// already appears in the union.
|
|
821
|
+
if (ownShapeId === null || !recordArms.some((a) => a.shapeId === ownShapeId) || expr.properties.some(ts.isSpreadAssignment)) {
|
|
719
822
|
const arm = literalUnionArmOf(lowerer, expr, tsType, recordArms);
|
|
720
823
|
if (arm)
|
|
721
824
|
mapped = arm;
|
|
@@ -767,13 +870,35 @@ export function lowerObjectLiteral(lowerer, expr) {
|
|
|
767
870
|
// descriptor records with `any` values) — builds as a dyn OBJECT:
|
|
768
871
|
// each field converts through the usual dyn boundary, and dynamic
|
|
769
872
|
// consumers ride the keyed-dyn paths. TypeScript keeps the fence.
|
|
770
|
-
if (
|
|
873
|
+
if (mapped?.kind === "dyn" || (!mapped && isJsSourceFile(expr.getSourceFile()))) {
|
|
771
874
|
return lowerDynObjectLiteral(lowerer, expr);
|
|
772
875
|
}
|
|
773
876
|
if (!mapped || mapped.kind !== "record")
|
|
774
877
|
lowerer.badType(expr, tsType);
|
|
775
878
|
let type = mapped;
|
|
879
|
+
// A fresh, plain literal can construct its fields directly for a known
|
|
880
|
+
// destination with the same field set. This matters for inferred
|
|
881
|
+
// conditional records: an empty array in one arm has no element layout
|
|
882
|
+
// until the join supplies it. Existing values still use width coercion;
|
|
883
|
+
// extra fields, spreads, accessors, and keyed shapes retain their paths.
|
|
884
|
+
if (expected && !isJsSourceFile(expr.getSourceFile()) &&
|
|
885
|
+
expr.properties.every((p) => ts.isPropertyAssignment(p) || ts.isShorthandPropertyAssignment(p))) {
|
|
886
|
+
const own = lowerer.shapes.get(type.shapeId);
|
|
887
|
+
const target = lowerer.shapes.get(expected.shapeId);
|
|
888
|
+
if (!own.tuple && !target.tuple && !own.indexValue && !target.indexValue &&
|
|
889
|
+
!shapeHasAccessorSlots(own) && !shapeHasAccessorSlots(target) &&
|
|
890
|
+
target.fields.every((field) => own.fields.some((candidate) => candidate.name === field.name) ||
|
|
891
|
+
field.type.kind === "union" && lowerer.armTag(field.type.unionId, UNDEFINED_T) >= 0) &&
|
|
892
|
+
own.fields.every((field) => target.fields.some((candidate) => candidate.name === field.name))) {
|
|
893
|
+
type = { kind: "record", shapeId: expected.shapeId };
|
|
894
|
+
}
|
|
895
|
+
}
|
|
776
896
|
let shape = lowerer.shapes.get(type.shapeId);
|
|
897
|
+
// JavaScript Dates carry native object identity in checked storage. An
|
|
898
|
+
// inferred scalar Date field would erase that identity before boxing.
|
|
899
|
+
if (isJsSourceFile(expr.getSourceFile()) && shape.fields.some((field) => field.type.kind === "date")) {
|
|
900
|
+
return lowerDynObjectLiteral(lowerer, expr);
|
|
901
|
+
}
|
|
777
902
|
// ACCESSOR properties, JS literals only (TS accessors fill the shape's
|
|
778
903
|
// %get:/%set: closure slots below): no record storage exists for them,
|
|
779
904
|
// so the literal's shape NARROWS to its plain fields (reads resolve
|
|
@@ -793,21 +918,20 @@ export function lowerObjectLiteral(lowerer, expr) {
|
|
|
793
918
|
}
|
|
794
919
|
const fieldTypes = new Map(shape.fields.map((f) => [f.name, f.type]));
|
|
795
920
|
// File-scope JavaScript object bindings live in the checked-dynamic tree
|
|
796
|
-
// to preserve open writes and identity.
|
|
797
|
-
// from
|
|
798
|
-
//
|
|
921
|
+
// to preserve open writes and identity. The checker can infer fields
|
|
922
|
+
// from later writes; those fields must remain absent when the literal
|
|
923
|
+
// is first evaluated.
|
|
799
924
|
const topLevelJsDecl = ts.isVariableDeclaration(expr.parent) &&
|
|
800
925
|
expr.parent.initializer === expr &&
|
|
801
|
-
ts.isVariableStatement(expr.parent
|
|
802
|
-
ts.isSourceFile(expr.parent
|
|
926
|
+
ts.isVariableStatement(expr.parent?.parent?.parent) &&
|
|
927
|
+
ts.isSourceFile(expr.parent?.parent?.parent?.parent);
|
|
803
928
|
const assignedProperties = expr.properties.filter((prop) => ts.isPropertyAssignment(prop) || ts.isShorthandPropertyAssignment(prop));
|
|
804
929
|
if (topLevelJsDecl && isJsSourceFile(expr.getSourceFile()) &&
|
|
805
930
|
assignedProperties.length === expr.properties.length) {
|
|
806
931
|
const provided = new Set(assignedProperties.map((prop) => propNameText(lowerer, prop.name)));
|
|
807
|
-
|
|
808
|
-
lowerer.armTag(field.type.unionId, UNDEFINED_T) >= 0);
|
|
809
|
-
if (omittedOptional)
|
|
932
|
+
if (shape.fields.some((field) => !provided.has(field.name))) {
|
|
810
933
|
return lowerDynObjectLiteral(lowerer, expr);
|
|
934
|
+
}
|
|
811
935
|
}
|
|
812
936
|
// The clone probe may lower the leading spread before declining (a
|
|
813
937
|
// static `as` cast can make the checker-visible shape match while its
|
|
@@ -982,15 +1106,10 @@ export function lowerObjectLiteral(lowerer, expr) {
|
|
|
982
1106
|
lowerer.unsupported("SC1090", prop.name, "computed property keys (compile-time-known keys fold — a pure expression whose checker type is one string or number literal: consts, enum members, quoted keys, templates of those — `{ [MARKER]: v }`; runtime string keys write through an index-signature target; symbol keys stay out)");
|
|
983
1107
|
}
|
|
984
1108
|
}
|
|
985
|
-
// A
|
|
986
|
-
//
|
|
987
|
-
//
|
|
988
|
-
//
|
|
989
|
-
// lowers as ONE interned merge-helper call — sources evaluate once each
|
|
990
|
-
// in source order (the call's argument order — computed sources
|
|
991
|
-
// included, no re-read), contributors apply in order with per-key
|
|
992
|
-
// dispatch onto the declared fields (JS last-write-wins). Divergence 68
|
|
993
|
-
// has the runtime rules (validated collisions, extra keys dropped).
|
|
1109
|
+
// A declared destination combining fixed records and runtime-keyed
|
|
1110
|
+
// sources needs both layouts. Apply each source before evaluating the
|
|
1111
|
+
// next expression, with checked overflow collisions and optional-field
|
|
1112
|
+
// completion. Extra runtime keys follow the declared-shape width policy.
|
|
994
1113
|
if (!shape.indexValue &&
|
|
995
1114
|
!shape.tuple &&
|
|
996
1115
|
shape.fields.length > 0 &&
|
|
@@ -998,7 +1117,7 @@ export function lowerObjectLiteral(lowerer, expr) {
|
|
|
998
1117
|
expr.properties.every((p) => ts.isSpreadAssignment(p) && !conditionalSpreadOf(p.expression)) &&
|
|
999
1118
|
expr.properties.some((p) => {
|
|
1000
1119
|
const t = lowerer.mapTypeOf(lowerer.typeOf(p.expression));
|
|
1001
|
-
return t?.kind === "record" && !!lowerer.shapes.get(t.shapeId)?.indexValue;
|
|
1120
|
+
return t?.kind === "dyn" || t?.kind === "record" && !!lowerer.shapes.get(t.shapeId)?.indexValue;
|
|
1002
1121
|
})) {
|
|
1003
1122
|
return lowerDeclaredSpreadMerge(lowerer, expr, type, shape, loc);
|
|
1004
1123
|
}
|
|
@@ -1010,6 +1129,16 @@ export function lowerObjectLiteral(lowerer, expr) {
|
|
|
1010
1129
|
throw new PoisonError();
|
|
1011
1130
|
};
|
|
1012
1131
|
const fields = [];
|
|
1132
|
+
const spreadStmts = [];
|
|
1133
|
+
const hasSpread = expr.properties.some(ts.isSpreadAssignment);
|
|
1134
|
+
const captured = new Set();
|
|
1135
|
+
const capture = (value) => {
|
|
1136
|
+
const local = lowerer.declareHiddenLocal("%spreadValue", value.type);
|
|
1137
|
+
spreadStmts.push({ kind: "varDecl", localId: local.id, init: value, loc: value.loc });
|
|
1138
|
+
const ref = varRef(local.id, value.type, value.loc);
|
|
1139
|
+
captured.add(ref);
|
|
1140
|
+
return ref;
|
|
1141
|
+
};
|
|
1013
1142
|
// Field names introduced by conditional spreads: their ternary carries
|
|
1014
1143
|
// the spread's whole evaluation (cond once, value lazily), so a LATER
|
|
1015
1144
|
// contributor overriding one would silently drop that evaluation —
|
|
@@ -1019,6 +1148,21 @@ export function lowerObjectLiteral(lowerer, expr) {
|
|
|
1019
1148
|
// member reads narrow away; see the catch in the property loop).
|
|
1020
1149
|
const droppedNames = new Set();
|
|
1021
1150
|
for (const prop of expr.properties) {
|
|
1151
|
+
// A later contributor can mutate an earlier source or overwrite a
|
|
1152
|
+
// value with effects. Snapshot pending fields at their source position,
|
|
1153
|
+
// before evaluating the next contributor, even if they are overwritten.
|
|
1154
|
+
if (hasSpread) {
|
|
1155
|
+
for (let i = 0; i < fields.length; i++) {
|
|
1156
|
+
const field = fields[i];
|
|
1157
|
+
if (field.drop) {
|
|
1158
|
+
spreadStmts.push({ kind: "exprStmt", expr: field.value, loc: field.value.loc });
|
|
1159
|
+
fields.splice(i--, 1);
|
|
1160
|
+
continue;
|
|
1161
|
+
}
|
|
1162
|
+
if (!captured.has(field.value))
|
|
1163
|
+
field.value = capture(field.value);
|
|
1164
|
+
}
|
|
1165
|
+
}
|
|
1022
1166
|
if (ts.isSpreadAssignment(prop)) {
|
|
1023
1167
|
const cs = conditionalSpreadOf(prop.expression);
|
|
1024
1168
|
if (cs && cs !== "unsupported") {
|
|
@@ -1035,7 +1179,7 @@ export function lowerObjectLiteral(lowerer, expr) {
|
|
|
1035
1179
|
if (shape.indexValue) {
|
|
1036
1180
|
lowerer.unsupported("SC1090", prop, "conditional spreads into index-signature keys (overflow entries model presence — write the key in an if statement instead)");
|
|
1037
1181
|
}
|
|
1038
|
-
|
|
1182
|
+
shapeMismatch(prop);
|
|
1039
1183
|
}
|
|
1040
1184
|
const absent = lowerer.wrappedUndefined(fieldType, locOf(prop));
|
|
1041
1185
|
if (!absent) {
|
|
@@ -1070,28 +1214,22 @@ export function lowerObjectLiteral(lowerer, expr) {
|
|
|
1070
1214
|
// shape. Every source field must land on the target shape with an
|
|
1071
1215
|
// equal type (a wider source would silently DROP fields JS keeps —
|
|
1072
1216
|
// the width fence, same as literals). Later contributors override
|
|
1073
|
-
// earlier ones (JS last-write-wins
|
|
1074
|
-
//
|
|
1075
|
-
//
|
|
1076
|
-
// re-emittable pure read, sharing one lowered node per field.
|
|
1077
|
-
// The desugar's one-entry-per-name list reads spread fields
|
|
1078
|
-
// EAGERLY at the spread's position, so an explicit property
|
|
1079
|
-
// BEFORE a spread would need JS's overwrite — order-fenced (the
|
|
1080
|
-
// index-signature merge path above takes any order).
|
|
1081
|
-
if (expr.properties
|
|
1082
|
-
.slice(0, expr.properties.indexOf(prop))
|
|
1083
|
-
.some((p) => !ts.isSpreadAssignment(p))) {
|
|
1084
|
-
lowerer.unsupported("SC1090", prop, "object spread after explicit properties (spreads must come first — a later spread would overwrite them with JS semantics the desugar does not model)");
|
|
1085
|
-
}
|
|
1217
|
+
// earlier ones (JS last-write-wins). Evaluate the source exactly
|
|
1218
|
+
// once, including empty sources and those whose fields are all
|
|
1219
|
+
// overridden. Field snapshots above preserve the copy order.
|
|
1086
1220
|
let srcNode = prop.expression;
|
|
1087
1221
|
while (ts.isParenthesizedExpression(srcNode))
|
|
1088
1222
|
srcNode = srcNode.expression;
|
|
1089
|
-
const srcLowered = prop === expr.properties[0] && leadingSpreadLowered !== null
|
|
1223
|
+
const srcLowered = capture(prop === expr.properties[0] && leadingSpreadLowered !== null
|
|
1090
1224
|
? leadingSpreadLowered
|
|
1091
|
-
:
|
|
1092
|
-
|
|
1093
|
-
|
|
1094
|
-
|
|
1225
|
+
: lowerer.lowerExpr(srcNode));
|
|
1226
|
+
// Array callbacks can receive a record-or-undefined ABI even when
|
|
1227
|
+
// TypeScript describes a required record. Select the copy strategy
|
|
1228
|
+
// from that stored representation so absent sources copy nothing.
|
|
1229
|
+
// Checked-dynamic bindings still use the checker's field contract.
|
|
1230
|
+
const srcType = srcLowered.type.kind === "dyn"
|
|
1231
|
+
? lowerer.mapTypeOf(lowerer.typeOf(srcNode))
|
|
1232
|
+
: srcLowered.type;
|
|
1095
1233
|
// `...options.installConfig` — a spread of `Partial<X> | undefined`
|
|
1096
1234
|
// (the optional-options merge idiom `{ ...DEFAULTS, ...overrides }`):
|
|
1097
1235
|
// JS spreads nothing for the unit arm and copies present keys
|
|
@@ -1108,9 +1246,6 @@ export function lowerObjectLiteral(lowerer, expr) {
|
|
|
1108
1246
|
!def.arms.every((a) => a.kind === "record" || isUnitType(a))) {
|
|
1109
1247
|
lowerer.unsupported("SC1090", prop, `object spread of '${lowerer.fmt(srcType)}' sources (only known record shapes spread — ${NARROW_FIRST})`);
|
|
1110
1248
|
}
|
|
1111
|
-
if (srcLowered && !isSafeToRepeat(srcLowered)) {
|
|
1112
|
-
lowerer.unsupported("SC1090", prop, "object spread of computed sources (the field copies re-read the source — bind it to a const first)");
|
|
1113
|
-
}
|
|
1114
1249
|
const recArm = recArms[0];
|
|
1115
1250
|
const recTag = def.arms.indexOf(recArm);
|
|
1116
1251
|
// A checked-dynamic VALUE under the union-mapped checker type
|
|
@@ -1133,7 +1268,7 @@ export function lowerObjectLiteral(lowerer, expr) {
|
|
|
1133
1268
|
if (ts.isSpreadAssignment(later)) {
|
|
1134
1269
|
if (conditionalSpreadOf(later.expression))
|
|
1135
1270
|
continue;
|
|
1136
|
-
const lt =
|
|
1271
|
+
const lt = laterSpreadType(lowerer, later.expression);
|
|
1137
1272
|
if (lt?.kind === "record") {
|
|
1138
1273
|
for (const lf of lowerer.shapes.get(lt.shapeId)?.fields ?? [])
|
|
1139
1274
|
laterNames.add(lf.name);
|
|
@@ -1234,9 +1369,6 @@ export function lowerObjectLiteral(lowerer, expr) {
|
|
|
1234
1369
|
if (srcType?.kind !== "record") {
|
|
1235
1370
|
lowerer.unsupported("SC1090", prop, `object spread of '${srcType ? lowerer.fmt(srcType) : lowerer.checker.typeToString(lowerer.typeOf(srcNode))}' sources (only known record shapes spread — ${NARROW_FIRST})`);
|
|
1236
1371
|
}
|
|
1237
|
-
if (srcLowered && !isSafeToRepeat(srcLowered)) {
|
|
1238
|
-
lowerer.unsupported("SC1090", prop, "object spread of computed sources (the field copies re-read the source — bind it to a const first)");
|
|
1239
|
-
}
|
|
1240
1372
|
const srcShape = lowerer.shapes.get(srcType.shapeId);
|
|
1241
1373
|
if (!srcShape)
|
|
1242
1374
|
throw new InternalCompilerError(`lowerer bug: spread of unknown shape ${srcType.shapeId}`);
|
|
@@ -1258,7 +1390,7 @@ export function lowerObjectLiteral(lowerer, expr) {
|
|
|
1258
1390
|
if (ts.isSpreadAssignment(later)) {
|
|
1259
1391
|
if (conditionalSpreadOf(later.expression))
|
|
1260
1392
|
continue;
|
|
1261
|
-
const lt =
|
|
1393
|
+
const lt = laterSpreadType(lowerer, later.expression);
|
|
1262
1394
|
if (lt?.kind === "record") {
|
|
1263
1395
|
for (const lf of lowerer.shapes.get(lt.shapeId)?.fields ?? [])
|
|
1264
1396
|
laterNames.add(lf.name);
|
|
@@ -1372,7 +1504,7 @@ export function lowerObjectLiteral(lowerer, expr) {
|
|
|
1372
1504
|
if (fieldTypes.has(name)) {
|
|
1373
1505
|
lowerer.unsupported("SC1090", prop, `a get/set accessor satisfying the data property '${name}' of '${lowerer.fmt(type)}' (the record slot stores a plain value — Node would keep the accessor live through this type)`);
|
|
1374
1506
|
}
|
|
1375
|
-
|
|
1507
|
+
shapeMismatch(prop);
|
|
1376
1508
|
}
|
|
1377
1509
|
const closure = lowerer.coerceInto(prop, lowerer.lowerLambda(prop), slotT);
|
|
1378
1510
|
if (!typeEquals(closure.type, slotT))
|
|
@@ -1396,7 +1528,7 @@ export function lowerObjectLiteral(lowerer, expr) {
|
|
|
1396
1528
|
// side effects; calls resolve statically against this declaration);
|
|
1397
1529
|
// a computed initializer would need its evaluation kept — fenced.
|
|
1398
1530
|
if (!fieldType && !ts.isSpreadAssignment(prop)) {
|
|
1399
|
-
const memberSym = prop.name
|
|
1531
|
+
const memberSym = prop.name ? lowerer.checker.getSymbolAtLocation(prop.name) : undefined;
|
|
1400
1532
|
const memberT = memberSym ? lowerer.checker.getTypeOfSymbol(memberSym) : undefined;
|
|
1401
1533
|
if (memberT && isGenericCallableMemberType(memberT, lowerer.checker)) {
|
|
1402
1534
|
const pureInit = (() => {
|
|
@@ -1436,7 +1568,7 @@ export function lowerObjectLiteral(lowerer, expr) {
|
|
|
1436
1568
|
}
|
|
1437
1569
|
continue;
|
|
1438
1570
|
}
|
|
1439
|
-
|
|
1571
|
+
shapeMismatch(prop);
|
|
1440
1572
|
}
|
|
1441
1573
|
let value;
|
|
1442
1574
|
let valueNode = prop;
|
|
@@ -1444,17 +1576,15 @@ export function lowerObjectLiteral(lowerer, expr) {
|
|
|
1444
1576
|
try {
|
|
1445
1577
|
if (ts.isPropertyAssignment(prop)) {
|
|
1446
1578
|
valueNode = prop.initializer;
|
|
1447
|
-
//
|
|
1448
|
-
//
|
|
1449
|
-
//
|
|
1450
|
-
// the option-table `default: [{ value: [] }]` shape), where the
|
|
1451
|
-
// bare lowering would take the JS dyn fallback and fence.
|
|
1579
|
+
// Fresh construction gets the field's destination before lowering
|
|
1580
|
+
// nested arrays, records, or conditional branches. Existing values
|
|
1581
|
+
// retain their runtime representation until the field coercion.
|
|
1452
1582
|
let init = prop.initializer;
|
|
1453
|
-
while (ts.isParenthesizedExpression(init))
|
|
1583
|
+
while (ts.isParenthesizedExpression(init) || ts.isSatisfiesExpression(init))
|
|
1454
1584
|
init = init.expression;
|
|
1455
1585
|
value =
|
|
1456
1586
|
fenceClosureProbe(lowerer, prop.initializer, fieldType, () => lowerer.lowerExpr(prop.initializer)) ??
|
|
1457
|
-
(fieldType !== undefined && ts.isArrayLiteralExpression(init)
|
|
1587
|
+
(fieldType !== undefined && (ts.isArrayLiteralExpression(init) || ts.isObjectLiteralExpression(init) || ts.isConditionalExpression(init))
|
|
1458
1588
|
? lowerer.lowerExprExpecting(prop.initializer, fieldType)
|
|
1459
1589
|
: lowerer.lowerExpr(prop.initializer));
|
|
1460
1590
|
}
|
|
@@ -1466,7 +1596,7 @@ export function lowerObjectLiteral(lowerer, expr) {
|
|
|
1466
1596
|
fenceClosureProbe(lowerer, prop, fieldType, () => lowerer.lowerLambda(prop)) ?? lowerer.lowerLambda(prop);
|
|
1467
1597
|
}
|
|
1468
1598
|
else {
|
|
1469
|
-
lowerer.unsupported("SC1090", prop, `syntax '${ts.
|
|
1599
|
+
lowerer.unsupported("SC1090", prop, `syntax '${ts.syntaxKindName(prop.kind)}'`);
|
|
1470
1600
|
}
|
|
1471
1601
|
}
|
|
1472
1602
|
catch (err) {
|
|
@@ -1554,11 +1684,129 @@ export function lowerObjectLiteral(lowerer, expr) {
|
|
|
1554
1684
|
(f.type.kind === "dyn" ? dynUndefinedExpr(loc) : null) ??
|
|
1555
1685
|
absentHandle;
|
|
1556
1686
|
if (!absent)
|
|
1557
|
-
|
|
1687
|
+
shapeMismatch(expr); // only optional and 'unknown' fields may be omitted
|
|
1558
1688
|
fields.push({ name: f.name, value: absent });
|
|
1559
1689
|
}
|
|
1560
1690
|
}
|
|
1561
|
-
|
|
1691
|
+
const result = { kind: "recordLit", fields, type, loc };
|
|
1692
|
+
return spreadStmts.length === 0 ? result : { kind: "seqExpr", stmts: spreadStmts, result, type, loc };
|
|
1693
|
+
}
|
|
1694
|
+
/** A union of plain records can preserve its existing variant while
|
|
1695
|
+
* replacing shared fields. Dispatch before constructing the copy: only
|
|
1696
|
+
* the selected arm evaluates overrides, and recordClone snapshots fields
|
|
1697
|
+
* before an override can mutate the original. Nested references retain
|
|
1698
|
+
* their identity. Changing a discriminator or adding variant-specific
|
|
1699
|
+
* fields needs a different result layout and stays on the ordinary path. */
|
|
1700
|
+
function lowerUnionRecordClone(lowerer, expr) {
|
|
1701
|
+
if (isJsSourceFile(expr.getSourceFile()))
|
|
1702
|
+
return null;
|
|
1703
|
+
const spread = expr.properties[0];
|
|
1704
|
+
if (!spread || !ts.isSpreadAssignment(spread))
|
|
1705
|
+
return null;
|
|
1706
|
+
let sourceNode = spread.expression;
|
|
1707
|
+
while (ts.isParenthesizedExpression(sourceNode) || ts.isSatisfiesExpression(sourceNode))
|
|
1708
|
+
sourceNode = sourceNode.expression;
|
|
1709
|
+
// Conditional spreads construct optional keys, including the empty arm.
|
|
1710
|
+
// Their dedicated lowering owns that layout rather than a union clone.
|
|
1711
|
+
if (ts.isConditionalExpression(sourceNode))
|
|
1712
|
+
return null;
|
|
1713
|
+
const sourceType = lowerer.mapTypeOf(lowerer.typeOf(spread.expression));
|
|
1714
|
+
if (sourceType?.kind !== "union")
|
|
1715
|
+
return null;
|
|
1716
|
+
const def = lowerer.unions.get(sourceType.unionId);
|
|
1717
|
+
if (!def || def.arms.length < 2 || !def.arms.every((arm) => arm.kind === "record"))
|
|
1718
|
+
return null;
|
|
1719
|
+
const props = [];
|
|
1720
|
+
const names = [];
|
|
1721
|
+
for (const prop of expr.properties.slice(1)) {
|
|
1722
|
+
if ((!ts.isPropertyAssignment(prop) && !ts.isShorthandPropertyAssignment(prop)) ||
|
|
1723
|
+
(!ts.isIdentifier(prop.name) && !ts.isStringLiteral(prop.name)))
|
|
1724
|
+
return null;
|
|
1725
|
+
const name = prop.name.text;
|
|
1726
|
+
if (names.includes(name) || name === def.discriminant?.field || name === "__proto__")
|
|
1727
|
+
return null;
|
|
1728
|
+
props.push(prop);
|
|
1729
|
+
names.push(name);
|
|
1730
|
+
}
|
|
1731
|
+
for (const arm of def.arms) {
|
|
1732
|
+
if (arm.kind !== "record")
|
|
1733
|
+
return null;
|
|
1734
|
+
const shape = lowerer.shapes.get(arm.shapeId);
|
|
1735
|
+
if (!shape || shape.indexValue || shape.tuple || shapeHasAccessorSlots(shape) ||
|
|
1736
|
+
!names.every((name) => shape.fields.some((field) => field.name === name)))
|
|
1737
|
+
return null;
|
|
1738
|
+
for (let index = 0; index < props.length; index++) {
|
|
1739
|
+
const prop = props[index];
|
|
1740
|
+
const node = ts.isPropertyAssignment(prop) ? prop.initializer : prop.name;
|
|
1741
|
+
const valueType = lowerer.mapTypeOf(lowerer.typeOf(node));
|
|
1742
|
+
const fieldType = shape.fields.find((field) => field.name === names[index]).type;
|
|
1743
|
+
const lift = valueType ? lowerer.widthLiftPlan(valueType, fieldType) : null;
|
|
1744
|
+
// The inferred result must retain an override's own fields and
|
|
1745
|
+
// aliases. A structural copy into the source field's narrower shape
|
|
1746
|
+
// would silently reshape an unannotated spread expression.
|
|
1747
|
+
if (!lift)
|
|
1748
|
+
return null;
|
|
1749
|
+
if (lift.how === "retag" && valueType?.kind === "union" && fieldType.kind === "union") {
|
|
1750
|
+
const from = lowerer.unions.get(valueType.unionId);
|
|
1751
|
+
const to = lowerer.unions.get(fieldType.unionId);
|
|
1752
|
+
const plan = from && to ? planUnionRetag(from, to, (id) => lowerer.shapes.get(id), (source, target) => lowerer.widthLiftPlan(source, target)) : null;
|
|
1753
|
+
if (!plan || !plan.every((arm) => arm.kind === "direct"
|
|
1754
|
+
? arm.route.lift.how === "copy" || arm.route.lift.how === "upcast"
|
|
1755
|
+
: arm.kind === "discriminant" && arm.routes.every((route) => route.lift.how === "copy" || route.lift.how === "upcast")))
|
|
1756
|
+
return null;
|
|
1757
|
+
}
|
|
1758
|
+
else if (lift.how !== "copy" && lift.how !== "wrap" && lift.how !== "upcast")
|
|
1759
|
+
return null;
|
|
1760
|
+
}
|
|
1761
|
+
}
|
|
1762
|
+
let source = lowerer.lowerExpr(spread.expression);
|
|
1763
|
+
// Hidden runtime absence must never be mistaken for a record payload.
|
|
1764
|
+
// An earlier guard can remove that arm; an unguarded optional spread
|
|
1765
|
+
// still needs a destination able to represent the empty copy.
|
|
1766
|
+
if (!typeEquals(source.type, sourceType) && source.type.kind === "union" && ts.isIdentifier(spread.expression)) {
|
|
1767
|
+
const local = lowerer.resolveLocal(spread.expression);
|
|
1768
|
+
const symbol = lowerer.resolveValueSymbol(spread.expression);
|
|
1769
|
+
const captured = local?.boxed === true || symbol && lowerer.ctx.captureBySymbol.has(symbol);
|
|
1770
|
+
if (local && !captured && !lowerer.runtimeOptionalLocals.has(lowerer.runtimeOptionalRootOf(local))) {
|
|
1771
|
+
const helper = lowerer.narrowedRetagHelper(spread.expression, source.type.unionId, sourceType.unionId, source.loc);
|
|
1772
|
+
if (helper)
|
|
1773
|
+
source = { kind: "call", callee: helper, args: [source], type: sourceType, loc: source.loc };
|
|
1774
|
+
}
|
|
1775
|
+
}
|
|
1776
|
+
if (!typeEquals(source.type, sourceType)) {
|
|
1777
|
+
lowerer.unsupported("SC1090", spread, "a union record clone whose stored source still includes absence");
|
|
1778
|
+
}
|
|
1779
|
+
const loc = locOf(expr);
|
|
1780
|
+
const saved = lowerer.declareHiddenLocal("%unionClone", sourceType);
|
|
1781
|
+
const ref = varRef(saved.id, sourceType, loc);
|
|
1782
|
+
let result = null;
|
|
1783
|
+
for (let tag = def.arms.length - 1; tag >= 0; tag--) {
|
|
1784
|
+
const arm = def.arms[tag];
|
|
1785
|
+
if (arm.kind !== "record")
|
|
1786
|
+
throw new InternalCompilerError("union clone arm is not a record");
|
|
1787
|
+
const shape = lowerer.shapes.get(arm.shapeId);
|
|
1788
|
+
const overrides = [];
|
|
1789
|
+
for (let index = 0; index < props.length; index++) {
|
|
1790
|
+
const prop = props[index];
|
|
1791
|
+
const name = names[index];
|
|
1792
|
+
const fieldType = shape.fields.find((field) => field.name === name).type;
|
|
1793
|
+
const value = ts.isPropertyAssignment(prop)
|
|
1794
|
+
? lowerer.lowerExprExpecting(prop.initializer, fieldType)
|
|
1795
|
+
: lowerer.coerceInto(prop, lowerer.lowerShorthandValue(prop), fieldType);
|
|
1796
|
+
overrides.push({ name, value });
|
|
1797
|
+
}
|
|
1798
|
+
const clone = { kind: "recordClone",
|
|
1799
|
+
source: { kind: "unionNarrow", value: ref, unionId: sourceType.unionId, tag, type: arm, loc },
|
|
1800
|
+
overrides, type: arm, loc };
|
|
1801
|
+
const wrapped = { kind: "unionWrap", value: clone, unionId: sourceType.unionId, tag, type: sourceType, loc };
|
|
1802
|
+
result = result === null ? wrapped : {
|
|
1803
|
+
kind: "ternary", cond: { kind: "unionIsTag", value: ref, unionId: sourceType.unionId, tag, negated: false, type: BOOL, loc },
|
|
1804
|
+
then: wrapped, else_: result, type: sourceType, loc,
|
|
1805
|
+
};
|
|
1806
|
+
}
|
|
1807
|
+
if (result === null)
|
|
1808
|
+
throw new InternalCompilerError("union clone has no arms");
|
|
1809
|
+
return { kind: "seqExpr", stmts: [{ kind: "varDecl", localId: saved.id, init: source, loc }], result, type: sourceType, loc };
|
|
1562
1810
|
}
|
|
1563
1811
|
/** Parses the conditional-spread idiom `...(c ? { k: v, ... } : {})`
|
|
1564
1812
|
* (either orientation). Returns the condition, the non-empty arm's
|
|
@@ -1617,17 +1865,22 @@ export function conditionalSpreadOf(expr) {
|
|
|
1617
1865
|
* untyped copy would store the lie) — and a key naming NO declared field
|
|
1618
1866
|
* is DROPPED (the shape cannot represent it; Node keeps it invisibly —
|
|
1619
1867
|
* divergence 68). Later contributors overwrite earlier ones
|
|
1620
|
-
* (last-write-wins).
|
|
1868
|
+
* (last-write-wins). Fixed, hybrid, and pure index records may contribute. */
|
|
1621
1869
|
function lowerDeclaredSpreadMerge(lowerer, expr, type, shape, loc) {
|
|
1622
1870
|
const srcs = [];
|
|
1623
1871
|
for (const prop of expr.properties) {
|
|
1624
1872
|
const spread = prop; // caller-checked: all spreads
|
|
1625
1873
|
const value = lowerer.lowerExpr(spread.expression);
|
|
1874
|
+
if (value.type.kind === "dyn") {
|
|
1875
|
+
srcs.push({ value, shapeId: "dyn" });
|
|
1876
|
+
continue;
|
|
1877
|
+
}
|
|
1626
1878
|
const srcShape = value.type.kind === "record" ? lowerer.shapes.get(value.type.shapeId) : undefined;
|
|
1627
|
-
if (value.type.kind !== "record" || !srcShape
|
|
1628
|
-
lowerer.unsupported("SC1090", prop, `object spread of '${lowerer.fmt(value.type)}' into '${lowerer.fmt(type)}' (only
|
|
1879
|
+
if (value.type.kind !== "record" || !srcShape || srcShape.tuple) {
|
|
1880
|
+
lowerer.unsupported("SC1090", prop, `object spread of '${lowerer.fmt(value.type)}' into '${lowerer.fmt(type)}' (only records spread into a declared shape)`);
|
|
1629
1881
|
}
|
|
1630
|
-
|
|
1882
|
+
fenceAccessorSpreadSource(lowerer, prop, srcShape);
|
|
1883
|
+
srcs.push({ value, shapeId: value.type.shapeId, shape: srcShape });
|
|
1631
1884
|
}
|
|
1632
1885
|
// Every target field must be optional: absent keys leave the undefined
|
|
1633
1886
|
// arm, exactly the unset-optional representation.
|
|
@@ -1690,75 +1943,109 @@ function lowerDeclaredSpreadMerge(lowerer, expr, type, shape, loc) {
|
|
|
1690
1943
|
}
|
|
1691
1944
|
lowerer.unsupported("SC1090", expr, `object spread into '${lowerer.fmt(type)}' where the source's '${lowerer.fmt(iv)}' values cannot reach the '${lowerer.fmt(f.type)}' field '${f.name}' (the value slot must be the field type, 'unknown', or a union covering the field's arms)`);
|
|
1692
1945
|
};
|
|
1693
|
-
|
|
1694
|
-
|
|
1695
|
-
|
|
1696
|
-
|
|
1697
|
-
|
|
1698
|
-
|
|
1699
|
-
|
|
1700
|
-
|
|
1701
|
-
locals.push({ id: `s${j}.0`, name: `s${j}`, type: s.value.type, mutable: true });
|
|
1702
|
-
return { localId: `s${j}.0`, name: `s${j}`, type: s.value.type };
|
|
1703
|
-
});
|
|
1704
|
-
const body = [
|
|
1705
|
-
{
|
|
1706
|
-
kind: "varDecl",
|
|
1707
|
-
localId: "out.0",
|
|
1708
|
-
init: {
|
|
1709
|
-
kind: "recordLit",
|
|
1710
|
-
fields: shape.fields.map((f) => ({ name: f.name, value: lowerer.wrappedUndefined(f.type, loc) })),
|
|
1711
|
-
type,
|
|
1712
|
-
loc,
|
|
1713
|
-
},
|
|
1714
|
-
loc,
|
|
1715
|
-
},
|
|
1716
|
-
];
|
|
1717
|
-
srcs.forEach((s, j) => {
|
|
1718
|
-
const sRef = varRef(`s${j}.0`, s.value.type, loc);
|
|
1719
|
-
const kRef = varRef(`k${j}.0`, STRING, loc);
|
|
1720
|
-
const vRef = varRef(`v${j}.0`, s.iv, loc);
|
|
1721
|
-
locals.push({ id: `ks${j}.0`, name: `ks${j}`, type: ksT, mutable: false }, { id: `i${j}.0`, name: `i${j}`, type: F64, mutable: true }, { id: `k${j}.0`, name: `k${j}`, type: STRING, mutable: false }, { id: `v${j}.0`, name: `v${j}`, type: s.iv, mutable: false });
|
|
1722
|
-
// Per-key dispatch: if (k === "a") { write a } else if ... else drop.
|
|
1723
|
-
const dispatch = shape.fields.reduceRight((rest, f) => {
|
|
1724
|
-
const write = (value) => ({ kind: "recordSet", obj: outRef, shapeId: type.shapeId, field: f.name, value, loc });
|
|
1725
|
-
const c = conv(s.iv, f, vRef);
|
|
1726
|
-
const thenBody = "value" in c ? [write(c.value)] : c.stmts(write);
|
|
1727
|
-
return [{
|
|
1728
|
-
kind: "if",
|
|
1729
|
-
cond: { kind: "strEq", negated: false, left: kRef, right: { kind: "strLit", value: f.name, type: STRING, loc }, type: BOOL, loc },
|
|
1730
|
-
then: thenBody,
|
|
1731
|
-
else_: rest.length > 0 ? rest : null,
|
|
1732
|
-
loc,
|
|
1733
|
-
}];
|
|
1734
|
-
}, []);
|
|
1735
|
-
body.push({ kind: "varDecl", localId: `ks${j}.0`, init: { kind: "recordOvfKeys", obj: sRef, shapeId: s.shapeId, type: ksT, loc }, loc }, {
|
|
1736
|
-
kind: "for",
|
|
1737
|
-
init: { kind: "varDecl", localId: `i${j}.0`, init: numLit(0, loc), loc },
|
|
1738
|
-
cond: { kind: "bin", op: "<", left: varRef(`i${j}.0`, F64, loc), right: { kind: "arrIntrinsic", method: "length", receiver: varRef(`ks${j}.0`, ksT, loc), args: [], type: F64, loc }, type: BOOL, loc },
|
|
1739
|
-
update: { kind: "assign", localId: `i${j}.0`, value: { kind: "bin", op: "+", left: varRef(`i${j}.0`, F64, loc), right: numLit(1, loc), type: F64, loc }, loc },
|
|
1740
|
-
body: [
|
|
1741
|
-
{ kind: "varDecl", localId: `k${j}.0`, init: { kind: "arrayGet", arr: varRef(`ks${j}.0`, ksT, loc), index: varRef(`i${j}.0`, F64, loc), type: STRING, loc }, loc },
|
|
1742
|
-
{ kind: "varDecl", localId: `v${j}.0`, init: { kind: "recordKeyGet", obj: sRef, shapeId: s.shapeId, key: kRef, overflowOnly: true, type: s.iv, loc }, loc },
|
|
1743
|
-
...dispatch,
|
|
1744
|
-
],
|
|
1745
|
-
loc,
|
|
1746
|
-
});
|
|
1747
|
-
});
|
|
1748
|
-
body.push({ kind: "return", value: outRef, loc });
|
|
1749
|
-
lowerer.liftedFns.push({
|
|
1750
|
-
name: helper,
|
|
1751
|
-
params,
|
|
1752
|
-
returnType: type,
|
|
1753
|
-
locals,
|
|
1754
|
-
body,
|
|
1946
|
+
// Apply each source before evaluating the next expression. Passing all
|
|
1947
|
+
// sources as one helper's arguments would read an earlier record after a
|
|
1948
|
+
// later source factory mutated it, contrary to object spread evaluation.
|
|
1949
|
+
const out = lowerer.declareHiddenLocal("%declMerge", type);
|
|
1950
|
+
const outRef = varRef(out.id, type, loc);
|
|
1951
|
+
const stmts = [{
|
|
1952
|
+
kind: "varDecl", localId: out.id,
|
|
1953
|
+
init: { kind: "recordLit", fields: shape.fields.map((f) => ({ name: f.name, value: lowerer.wrappedUndefined(f.type, loc) })), type, loc },
|
|
1755
1954
|
loc,
|
|
1756
|
-
}
|
|
1757
|
-
|
|
1758
|
-
|
|
1759
|
-
lowerer.widthHelpers.
|
|
1955
|
+
}];
|
|
1956
|
+
for (const source of srcs) {
|
|
1957
|
+
const key = `declmerge-source:${type.shapeId}:${source.shapeId}`;
|
|
1958
|
+
let helper = lowerer.widthHelpers.get(key);
|
|
1959
|
+
if (!helper) {
|
|
1960
|
+
helper = `%rec.declmerge.${lowerer.widthHelpers.size}`;
|
|
1961
|
+
const sourceType = source.value.type;
|
|
1962
|
+
const destination = varRef("out.0", type, loc);
|
|
1963
|
+
const receiver = varRef("source.0", sourceType, loc);
|
|
1964
|
+
const locals = [
|
|
1965
|
+
{ id: "out.0", name: "out", type, mutable: false },
|
|
1966
|
+
{ id: "source.0", name: "source", type: sourceType, mutable: false },
|
|
1967
|
+
];
|
|
1968
|
+
const body = [];
|
|
1969
|
+
if (!source.shape) {
|
|
1970
|
+
// CopyDataProperties skips nullish sources, even when an erased
|
|
1971
|
+
// record view supplies the checker's apparent object type.
|
|
1972
|
+
body.push({
|
|
1973
|
+
kind: "if", cond: { kind: "dynTest", test: "nullish", value: receiver, type: BOOL, loc },
|
|
1974
|
+
then: [{ kind: "return", value: destination, loc }], else_: null, loc,
|
|
1975
|
+
});
|
|
1976
|
+
}
|
|
1977
|
+
for (const field of source.shape?.fields ?? []) {
|
|
1978
|
+
const target = shape.fields.find((candidate) => candidate.name === field.name);
|
|
1979
|
+
if (!target)
|
|
1980
|
+
continue; // The declared destination drops extra keys.
|
|
1981
|
+
const raw = { kind: "recordGet", obj: receiver, shapeId: source.shapeId, field: field.name, type: field.type, loc };
|
|
1982
|
+
const lift = lowerer.widthLiftPlan(field.type, target.type);
|
|
1983
|
+
if (!lift) {
|
|
1984
|
+
lowerer.unsupported("SC1090", expr, `object spread of field '${field.name}' from '${lowerer.fmt(field.type)}' into '${lowerer.fmt(target.type)}'`);
|
|
1985
|
+
}
|
|
1986
|
+
const write = {
|
|
1987
|
+
kind: "recordSet", obj: destination, shapeId: type.shapeId, field: field.name,
|
|
1988
|
+
value: lowerer.applyWidthLift(lift, raw, target.type, loc), loc,
|
|
1989
|
+
};
|
|
1990
|
+
// Optional declared fields use the established unset convention.
|
|
1991
|
+
// A dyn field, including a present undefined, is a real property;
|
|
1992
|
+
// its checked conversion runs and can overwrite an earlier value.
|
|
1993
|
+
const absent = field.type.kind === "union" ? lowerer.armTag(field.type.unionId, UNDEFINED_T) : -1;
|
|
1994
|
+
if (absent >= 0 && field.type.kind === "union") {
|
|
1995
|
+
body.push({ kind: "if", cond: {
|
|
1996
|
+
kind: "unionIsTag", unionId: field.type.unionId, tag: absent, negated: true, value: raw, type: BOOL, loc,
|
|
1997
|
+
}, then: [write], else_: null, loc });
|
|
1998
|
+
}
|
|
1999
|
+
else
|
|
2000
|
+
body.push(write);
|
|
2001
|
+
}
|
|
2002
|
+
const iv = source.shape ? source.shape.indexValue : DYN;
|
|
2003
|
+
if (iv) {
|
|
2004
|
+
const keysType = arrayOf(STRING);
|
|
2005
|
+
const keys = varRef("keys.0", keysType, loc);
|
|
2006
|
+
const index = varRef("index.0", F64, loc);
|
|
2007
|
+
const name = varRef("key.0", STRING, loc);
|
|
2008
|
+
const value = varRef("value.0", iv, loc);
|
|
2009
|
+
locals.push({ id: "keys.0", name: "keys", type: keysType, mutable: false }, { id: "index.0", name: "index", type: F64, mutable: true }, { id: "key.0", name: "key", type: STRING, mutable: false }, { id: "value.0", name: "value", type: iv, mutable: false });
|
|
2010
|
+
const dispatch = shape.fields.reduceRight((rest, field) => {
|
|
2011
|
+
const write = (value) => ({ kind: "recordSet", obj: destination, shapeId: type.shapeId, field: field.name, value, loc });
|
|
2012
|
+
const converted = conv(iv, field, value);
|
|
2013
|
+
return [{
|
|
2014
|
+
kind: "if",
|
|
2015
|
+
cond: { kind: "strEq", negated: false, left: name, right: { kind: "strLit", value: field.name, type: STRING, loc }, type: BOOL, loc },
|
|
2016
|
+
then: "value" in converted ? [write(converted.value)] : converted.stmts(write),
|
|
2017
|
+
else_: rest.length > 0 ? rest : null, loc,
|
|
2018
|
+
}];
|
|
2019
|
+
}, []);
|
|
2020
|
+
body.push({ kind: "varDecl", localId: "keys.0", init: source.shape
|
|
2021
|
+
? { kind: "recordOvfKeys", obj: receiver, shapeId: source.shapeId, type: keysType, loc }
|
|
2022
|
+
: { kind: "dynCheck", value: { kind: "libCall", fn: "dyn.objKeys", args: [receiver], type: DYN, loc }, type: keysType, loc }, loc }, {
|
|
2023
|
+
kind: "for",
|
|
2024
|
+
init: { kind: "varDecl", localId: "index.0", init: numLit(0, loc), loc },
|
|
2025
|
+
cond: { kind: "bin", op: "<", left: index, right: { kind: "arrIntrinsic", method: "length", receiver: keys, args: [], type: F64, loc }, type: BOOL, loc },
|
|
2026
|
+
update: { kind: "assign", localId: "index.0", value: { kind: "bin", op: "+", left: index, right: numLit(1, loc), type: F64, loc }, loc },
|
|
2027
|
+
body: [
|
|
2028
|
+
{ kind: "varDecl", localId: "key.0", init: { kind: "arrayGet", arr: keys, index, type: STRING, loc }, loc },
|
|
2029
|
+
{ kind: "varDecl", localId: "value.0", init: source.shape
|
|
2030
|
+
? { kind: "recordKeyGet", obj: receiver, shapeId: source.shapeId, key: name, overflowOnly: true, type: iv, loc }
|
|
2031
|
+
: { kind: "dynKeyGet", value: receiver, key: name, type: DYN, loc }, loc },
|
|
2032
|
+
...dispatch,
|
|
2033
|
+
], loc,
|
|
2034
|
+
});
|
|
2035
|
+
}
|
|
2036
|
+
body.push({ kind: "return", value: destination, loc });
|
|
2037
|
+
lowerer.liftedFns.push({
|
|
2038
|
+
name: helper,
|
|
2039
|
+
params: [{ localId: "out.0", name: "out", type }, { localId: "source.0", name: "source", type: sourceType }],
|
|
2040
|
+
returnType: type, locals, body, loc,
|
|
2041
|
+
});
|
|
2042
|
+
// Publish only a fully checked helper: rejected conversions must not
|
|
2043
|
+
// leave an entry that a later literal could reuse without a body.
|
|
2044
|
+
lowerer.widthHelpers.set(key, helper);
|
|
2045
|
+
}
|
|
2046
|
+
stmts.push({ kind: "exprStmt", expr: { kind: "call", callee: helper, args: [outRef, source.value], type, loc }, loc });
|
|
1760
2047
|
}
|
|
1761
|
-
return { kind: "
|
|
2048
|
+
return { kind: "seqExpr", stmts, result: outRef, type, loc };
|
|
1762
2049
|
}
|
|
1763
2050
|
/** The value of a shorthand property (`{ x }`): the binding `x` refers to.
|
|
1764
2051
|
* The property name's own symbol is the PROPERTY, so resolution goes
|
|
@@ -1769,6 +2056,14 @@ export function lowerShorthandValue(lowerer, prop) {
|
|
|
1769
2056
|
const propName = prop.name;
|
|
1770
2057
|
const loc = locOf(propName);
|
|
1771
2058
|
const symbol = lowerer.checker.getShorthandAssignmentValueSymbol(prop);
|
|
2059
|
+
// Import identifiers in shorthand position carry the property's symbol,
|
|
2060
|
+
// so the ordinary identifier expression path cannot resolve them.
|
|
2061
|
+
const builtin = lowerer.builtinImportOf(propName);
|
|
2062
|
+
if (builtin) {
|
|
2063
|
+
const callable = lowerer.lowerBuiltinCallableValue(builtin, loc);
|
|
2064
|
+
if (callable)
|
|
2065
|
+
return callable;
|
|
2066
|
+
}
|
|
1772
2067
|
if (symbol) {
|
|
1773
2068
|
if (lowerer.ctx.selfSymbol === symbol) {
|
|
1774
2069
|
return { kind: "selfRef", type: lowerer.ctx.selfType, loc };
|
|
@@ -1786,7 +2081,7 @@ export function lowerShorthandValue(lowerer, prop) {
|
|
|
1786
2081
|
const sig = lowerer.fnSigsBySymbol.get(resolved);
|
|
1787
2082
|
const decl = lowerer.checker.declarationsOf(resolved)[0];
|
|
1788
2083
|
if (sig && decl && ts.isFunctionDeclaration(decl) &&
|
|
1789
|
-
(ts.isSourceFile(decl.parent) || lowerer.nsBlocks.get(decl.parent) === "flattened")) {
|
|
2084
|
+
(ts.isSourceFile(decl.parent) || (decl.parent !== undefined && lowerer.nsBlocks.get(decl.parent) === "flattened"))) {
|
|
1790
2085
|
lowerer.noteEdge(sig.name);
|
|
1791
2086
|
const funcType = {
|
|
1792
2087
|
kind: "func",
|
|
@@ -1803,11 +2098,11 @@ export function lowerShorthandValue(lowerer, prop) {
|
|
|
1803
2098
|
}
|
|
1804
2099
|
lowerer.rejectUnresolvedSymbol(symbol ? (symbol.flags & ts.SymbolFlags.Alias ? lowerer.checker.getAliasedSymbol(symbol) : symbol) : null, propName.text, prop, `the reference to '${propName.text}' (a binding form with no lowering)`);
|
|
1805
2100
|
}
|
|
1806
|
-
/** Rejects
|
|
1807
|
-
*
|
|
1808
|
-
* expressions reset it, but their bare `this` is already a tsc error
|
|
1809
|
-
* under noImplicitThis, so over-rejecting them here changes nothing). */
|
|
2101
|
+
/** Rejects the method's own receiver, including lexical captures in
|
|
2102
|
+
* arrows. Nested ordinary functions bind their own ambient receiver. */
|
|
1810
2103
|
export function rejectThisInObjectMethod(lowerer, node) {
|
|
2104
|
+
if (ts.isFunctionExpression(node) || ts.isFunctionDeclaration(node) || ts.isMethodDeclaration(node) || ts.isAccessor(node))
|
|
2105
|
+
return;
|
|
1811
2106
|
if (node.kind === ts.SyntaxKind.ThisKeyword) {
|
|
1812
2107
|
lowerer.unsupported("SC1090", node, "references to 'this' in object literal methods");
|
|
1813
2108
|
}
|