@scriptc/compiler 0.1.7 → 0.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/ambient/scriptc-node-fallback.d.ts +98 -39
- 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 +108 -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 +88 -30
- 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 +21 -2
- package/dist/backend/llvm/dyn.js +647 -251
- package/dist/backend/llvm/dyn.js.map +1 -1
- package/dist/backend/llvm/emitter.d.ts +596 -1
- package/dist/backend/llvm/emitter.js +769 -425
- 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 +2 -2
- package/dist/backend/llvm/expr-bytes.js +60 -31
- 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 +10 -6
- 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 +78 -81
- 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 +62 -31
- 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 +54 -7
- 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 +220 -131
- 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 +44 -19
- package/dist/backend/llvm/lib-process.js.map +1 -1
- package/dist/backend/llvm/lib-shared.js +162 -3
- 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 +42 -131
- 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 +12 -30
- package/dist/backend/native-toolchain.js +83 -233
- package/dist/backend/native-toolchain.js.map +1 -1
- package/dist/backend/native-toolchain.test.js +77 -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 +73 -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 +103 -34
- package/dist/backend/targets.js.map +1 -1
- package/dist/backend/targets.test.js +72 -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 +37 -7
- 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 +5 -10
- 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 +74 -0
- package/dist/frontend/lowering/class-callbacks.js.map +1 -0
- package/dist/frontend/lowering/class-construction.d.ts +12 -0
- package/dist/frontend/lowering/class-construction.js +156 -0
- package/dist/frontend/lowering/class-construction.js.map +1 -0
- package/dist/frontend/lowering/class-descriptors.d.ts +10 -0
- package/dist/frontend/lowering/class-descriptors.js +114 -0
- package/dist/frontend/lowering/class-descriptors.js.map +1 -0
- package/dist/frontend/lowering/class-dynamic-dispatch.d.ts +51 -0
- package/dist/frontend/lowering/class-dynamic-dispatch.js +1158 -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 +93 -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 +67 -0
- package/dist/frontend/lowering/class-instance-constructor.js.map +1 -0
- package/dist/frontend/lowering/class-method-values.d.ts +13 -0
- package/dist/frontend/lowering/class-method-values.js +235 -0
- package/dist/frontend/lowering/class-method-values.js.map +1 -0
- package/dist/frontend/lowering/class-prototypes.d.ts +19 -0
- package/dist/frontend/lowering/class-prototypes.js +242 -0
- package/dist/frontend/lowering/class-prototypes.js.map +1 -0
- package/dist/frontend/lowering/class-runtime-statics.d.ts +8 -0
- package/dist/frontend/lowering/class-runtime-statics.js +66 -0
- package/dist/frontend/lowering/class-runtime-statics.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 +208 -163
- 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 +58 -63
- 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 +14 -0
- package/dist/frontend/lowering/error-methods.js +177 -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 +51 -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 +132 -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 +509 -183
- package/dist/frontend/lowering/expressions/object-literals.js.map +1 -1
- package/dist/frontend/lowering/expressions/optional-chains.d.ts +3 -4
- package/dist/frontend/lowering/expressions/optional-chains.js +88 -24
- 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 +101 -0
- package/dist/frontend/lowering/function-context.js +109 -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 +11 -0
- package/dist/frontend/lowering/generator-dynamic-dispatch.js +143 -0
- package/dist/frontend/lowering/generator-dynamic-dispatch.js.map +1 -0
- package/dist/frontend/lowering/lib-boundary.d.ts +4 -1
- package/dist/frontend/lowering/lib-boundary.js +112 -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 +18 -0
- package/dist/frontend/lowering/lower-builtin-values.js +249 -0
- package/dist/frontend/lowering/lower-builtin-values.js.map +1 -0
- package/dist/frontend/lowering/lower-builtins.d.ts +33 -46
- package/dist/frontend/lowering/lower-builtins.js +676 -365
- package/dist/frontend/lowering/lower-builtins.js.map +1 -1
- package/dist/frontend/lowering/lower-calls.d.ts +28 -22
- package/dist/frontend/lowering/lower-calls.js +1660 -412
- package/dist/frontend/lowering/lower-calls.js.map +1 -1
- package/dist/frontend/lowering/lower-classes.d.ts +95 -57
- package/dist/frontend/lowering/lower-classes.js +1491 -404
- 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 +36 -32
- package/dist/frontend/lowering/lower-containers.js +925 -181
- 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 +3 -2
- 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 +37 -13
- package/dist/frontend/lowering/lower-exprs.js +2163 -863
- 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 +88 -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 +7 -8
- package/dist/frontend/lowering/lower-island.js +66 -33
- 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 +445 -39
- package/dist/frontend/lowering/lower-modules.js.map +1 -1
- package/dist/frontend/lowering/lower-modules.test.d.ts +1 -0
- package/dist/frontend/lowering/lower-modules.test.js +39 -0
- package/dist/frontend/lowering/lower-modules.test.js.map +1 -0
- 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 +17 -17
- package/dist/frontend/lowering/lower-stmts.js +855 -514
- 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 +20 -11
- 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 +140 -190
- package/dist/frontend/lowering/lowerer.js +1193 -712
- 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 +172 -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 +10 -3
- package/dist/frontend/lowering/surfaces.js +86 -37
- 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 +12 -0
- package/dist/frontend/lowering/text-decoder-encoding.js +82 -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 +121 -38
- package/dist/frontend/npm-static-prune.js.map +1 -1
- package/dist/frontend/npm-static-prune.test.js +9 -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 +39 -20
- package/dist/frontend/program.js +393 -189
- package/dist/frontend/program.js.map +1 -1
- package/dist/frontend/program.test.js +105 -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 +25 -18
- 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 +47 -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 +34 -18
- package/dist/frontend/type-mapper.js +552 -131
- package/dist/frontend/type-mapper.js.map +1 -1
- package/dist/frontend/type-mapper.test.js +146 -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 +23 -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 +334 -176
- package/dist/ir/ir.js +710 -903
- package/dist/ir/ir.js.map +1 -1
- package/dist/ir/ir.test.js +162 -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 +33 -14
- package/dist/ir/serialize.js.map +1 -1
- package/dist/ir/serialize.test.d.ts +1 -0
- package/dist/ir/serialize.test.js +57 -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 +2018 -1498
- package/dist/ir/validate.js.map +1 -1
- package/dist/ir/validate.test.js +536 -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 +137 -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 +94 -0
- package/dist/native/toolchain.js.map +1 -0
- package/dist/native/toolchain.test.d.ts +1 -0
- package/dist/native/toolchain.test.js +85 -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 +107 -98
- 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
|
@@ -1,15 +1,18 @@
|
|
|
1
|
+
import { pathModuleValue } from "../lower-builtin-values.js";
|
|
1
2
|
import { InternalCompilerError } from "../../../errors.js";
|
|
2
3
|
import * as ts from "../../ts7/adapter.js";
|
|
3
4
|
import { BOOL, DYN, F64, JSVAL, STRING, UNDEFINED_T, VOID, arrayOf, canDynCheckTo, isUnitType, shapeHasAccessorSlots, typeEquals, } from "../../../ir/ir.js";
|
|
4
5
|
import { isCjsExportTableLiteral, isJsSourceFile, locOf } from "../../program.js";
|
|
5
6
|
import { NARROW_FIRST } from "../surfaces.js";
|
|
6
7
|
import { recordShapeMismatchDiag } from "../../../diagnostics/diagnostic.js";
|
|
7
|
-
import { PoisonError, dynUndefinedExpr } from "../lowerer.js";
|
|
8
|
+
import { PoisonError, dynUndefinedExpr, neverTaintedJsType } from "../lowerer.js";
|
|
8
9
|
import { lowerIndexMergeHelper } from "../lower-containers.js";
|
|
9
|
-
import { isGenericCallableMemberType } from "../../type-mapper.js";
|
|
10
|
-
import { numLit, varRef } from "../../../ir/build.js";
|
|
10
|
+
import { isGenericCallableMemberType, jsOpenObjectType } from "../../type-mapper.js";
|
|
11
|
+
import { numLit, strLit, varRef } from "../../../ir/build.js";
|
|
11
12
|
import { isSafeToRepeat } from "./evaluation-safety.js";
|
|
12
13
|
import { tryLowerExpression } from "./try-lower-expression.js";
|
|
14
|
+
import { fenceSymbolFieldCopy } from "../symbol-fields.js";
|
|
15
|
+
import { planUnionRetag } from "../union-retag.js";
|
|
13
16
|
/** `{ a: 1, b: "x" }` → recordLit. The record type comes from the
|
|
14
17
|
* contextual type when tsc has one (annotated declarations, arguments,
|
|
15
18
|
* nested literals) and from the literal's own type otherwise — both intern
|
|
@@ -31,10 +34,11 @@ function settledDropNames(lowerer, tsType) {
|
|
|
31
34
|
!lowerer.checker.declarationsOf(sym).some((d) => ts.isInterfaceDeclaration(d) && lowerer.isStdlibFile(d.getSourceFile()))) {
|
|
32
35
|
continue;
|
|
33
36
|
}
|
|
34
|
-
if (sym.name === "PromiseFulfilledResult")
|
|
35
|
-
(names
|
|
36
|
-
|
|
37
|
-
|
|
37
|
+
if (sym.name === "PromiseFulfilledResult" || sym.name === "PromiseRejectedResult") {
|
|
38
|
+
if (names === null)
|
|
39
|
+
names = new Set();
|
|
40
|
+
names.add(sym.name === "PromiseFulfilledResult" ? "value" : "reason");
|
|
41
|
+
}
|
|
38
42
|
}
|
|
39
43
|
return names;
|
|
40
44
|
}
|
|
@@ -179,15 +183,30 @@ function propNameText(lowerer, name) {
|
|
|
179
183
|
* dyn's String() for dyn operands — `{ [field]: v }` where field is a
|
|
180
184
|
* checked-dynamic param). Values convert through the usual dyn boundary
|
|
181
185
|
* (dynFrom's domain, functions box); a value with no dyn representation
|
|
182
|
-
* fences per property. Spreads
|
|
183
|
-
* accessors
|
|
186
|
+
* fences per property. Spreads create own data properties in source order;
|
|
187
|
+
* accessors retain their captured getter and setter closures. */
|
|
184
188
|
export function lowerDynObjectLiteral(lowerer, expr, boxValue) {
|
|
185
189
|
const loc = locOf(expr);
|
|
186
190
|
let fields = [];
|
|
187
191
|
let acc = null;
|
|
192
|
+
let hasAccessors = false;
|
|
188
193
|
const flushFields = () => {
|
|
189
194
|
if (fields.length === 0)
|
|
190
195
|
return;
|
|
196
|
+
if (hasAccessors) {
|
|
197
|
+
for (const field of fields) {
|
|
198
|
+
const descriptor = { kind: "dynObjLit", type: DYN, loc, fields: [
|
|
199
|
+
{ key: { kind: "strLit", value: "value", type: STRING, loc }, value: field.value },
|
|
200
|
+
...["writable", "enumerable", "configurable"].map(name => ({
|
|
201
|
+
key: strLit(name, loc),
|
|
202
|
+
value: { kind: "dynFrom", value: { kind: "boolLit", value: true, type: BOOL, loc }, type: DYN, loc },
|
|
203
|
+
})),
|
|
204
|
+
] };
|
|
205
|
+
acc = { kind: "libCall", fn: "dyn.defineProperty", args: [acc, lowerer.coerceToExpected(field.key, DYN), descriptor], type: DYN, loc };
|
|
206
|
+
}
|
|
207
|
+
fields = [];
|
|
208
|
+
return;
|
|
209
|
+
}
|
|
191
210
|
const chunk = { kind: "dynObjLit", fields, type: DYN, loc };
|
|
192
211
|
acc = acc === null
|
|
193
212
|
? chunk
|
|
@@ -197,7 +216,11 @@ export function lowerDynObjectLiteral(lowerer, expr, boxValue) {
|
|
|
197
216
|
for (const prop of expr.properties) {
|
|
198
217
|
if (ts.isSpreadAssignment(prop)) {
|
|
199
218
|
flushFields();
|
|
200
|
-
const
|
|
219
|
+
const builtin = lowerer.builtinNamespaceModuleOf(prop.expression);
|
|
220
|
+
const raw = builtin === "path" || builtin === "path/posix" || builtin === "path/win32"
|
|
221
|
+
? pathModuleValue(lowerer, builtin === "path" ? "path/posix" : builtin, locOf(prop))
|
|
222
|
+
: lowerer.lowerExpr(prop.expression);
|
|
223
|
+
fenceSymbolFieldCopy(lowerer, prop.expression, raw.type);
|
|
201
224
|
const source = boxValue
|
|
202
225
|
? boxValue(prop.expression, raw)
|
|
203
226
|
: lowerer.coerceToExpected(raw, DYN);
|
|
@@ -205,14 +228,9 @@ export function lowerDynObjectLiteral(lowerer, expr, boxValue) {
|
|
|
205
228
|
lowerer.unsupported("SC1101", prop.expression, `spreading '${lowerer.fmt(source.type)}' into a checked-dynamic object literal`);
|
|
206
229
|
}
|
|
207
230
|
acc ??= { kind: "dynObjLit", fields: [], type: DYN, loc };
|
|
208
|
-
acc = { kind: "libCall", fn: "dyn.
|
|
231
|
+
acc = { kind: "libCall", fn: "dyn.copyDataProperties", args: [acc, source], type: DYN, loc: locOf(prop) };
|
|
209
232
|
continue;
|
|
210
233
|
}
|
|
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
234
|
const name = prop.name;
|
|
217
235
|
let key;
|
|
218
236
|
if (ts.isComputedPropertyName(name)) {
|
|
@@ -222,10 +240,14 @@ export function lowerDynObjectLiteral(lowerer, expr, boxValue) {
|
|
|
222
240
|
}
|
|
223
241
|
else {
|
|
224
242
|
let k = lowerer.lowerExpr(name.expression);
|
|
225
|
-
if (k.type.kind === "
|
|
243
|
+
if (k.type.kind === "symbol")
|
|
244
|
+
k = lowerer.coerceToExpected(k, DYN);
|
|
245
|
+
else if (k.type.kind === "dyn")
|
|
246
|
+
k = { kind: "libCall", fn: "dyn.propertyKey", args: [k], type: DYN, loc: locOf(name) };
|
|
247
|
+
else if (k.type.kind === "f64" || k.type.kind === "bool") {
|
|
226
248
|
k = { kind: "toString", operand: k, type: STRING, loc: locOf(name) };
|
|
227
249
|
}
|
|
228
|
-
if (k.type.kind !== "string") {
|
|
250
|
+
if (k.type.kind !== "string" && k.type.kind !== "dyn") {
|
|
229
251
|
lowerer.unsupported("SC1090", name, `'${lowerer.fmt(k.type)}'-typed computed property keys (string, number, boolean, and unknown keys stringify)`);
|
|
230
252
|
}
|
|
231
253
|
key = k;
|
|
@@ -240,6 +262,25 @@ export function lowerDynObjectLiteral(lowerer, expr, boxValue) {
|
|
|
240
262
|
else {
|
|
241
263
|
lowerer.unsupported("SC1090", prop, "non-identifier property names");
|
|
242
264
|
}
|
|
265
|
+
if (ts.isGetAccessorDeclaration(prop) || ts.isSetAccessorDeclaration(prop)) {
|
|
266
|
+
flushFields();
|
|
267
|
+
hasAccessors = true;
|
|
268
|
+
acc ??= { kind: "dynObjLit", fields: [], type: DYN, loc };
|
|
269
|
+
if (!isJsSourceFile(expr.getSourceFile()))
|
|
270
|
+
lowerer.rejectThisInObjectMethod(prop.body ?? prop);
|
|
271
|
+
const fn = lowerer.lowerLambda(prop);
|
|
272
|
+
const descriptor = {
|
|
273
|
+
kind: "dynObjLit", type: DYN, loc: locOf(prop), fields: [
|
|
274
|
+
{ key: { kind: "strLit", value: ts.isGetAccessorDeclaration(prop) ? "get" : "set", type: STRING, loc }, value: lowerer.coerceToExpected(fn, DYN) },
|
|
275
|
+
...["enumerable", "configurable"].map(name => ({
|
|
276
|
+
key: strLit(name, loc),
|
|
277
|
+
value: { kind: "dynFrom", value: { kind: "boolLit", value: true, type: BOOL, loc }, type: DYN, loc },
|
|
278
|
+
})),
|
|
279
|
+
],
|
|
280
|
+
};
|
|
281
|
+
acc = { kind: "libCall", fn: "dyn.defineProperty", args: [acc, lowerer.coerceToExpected(key, DYN), descriptor], type: DYN, loc };
|
|
282
|
+
continue;
|
|
283
|
+
}
|
|
243
284
|
const valueExpr = ts.isMethodDeclaration(prop)
|
|
244
285
|
? prop
|
|
245
286
|
: ts.isShorthandPropertyAssignment(prop)
|
|
@@ -252,8 +293,10 @@ export function lowerDynObjectLiteral(lowerer, expr, boxValue) {
|
|
|
252
293
|
const propDiagsBefore = lowerer.diags.length;
|
|
253
294
|
try {
|
|
254
295
|
const lowerValue = () => ts.isMethodDeclaration(prop)
|
|
255
|
-
? (lowerer.rejectThisInObjectMethod(prop.body ?? prop), lowerer.lowerLambda(prop))
|
|
256
|
-
:
|
|
296
|
+
? (isJsSourceFile(expr.getSourceFile()) ? lowerer.lowerLambda(prop) : (lowerer.rejectThisInObjectMethod(prop.body ?? prop), lowerer.lowerLambda(prop)))
|
|
297
|
+
: !boxValue && ts.isObjectLiteralExpression(valueExpr)
|
|
298
|
+
? lowerer.lowerExprExpecting(valueExpr, DYN)
|
|
299
|
+
: lowerer.lowerExpr(valueExpr);
|
|
257
300
|
raw =
|
|
258
301
|
fenceClosureProbe(lowerer, valueExpr, undefined, lowerValue) ??
|
|
259
302
|
lowerValue();
|
|
@@ -279,6 +322,11 @@ export function lowerDynObjectLiteral(lowerer, expr, boxValue) {
|
|
|
279
322
|
let v = boxValue
|
|
280
323
|
? boxValue(valueExpr, raw)
|
|
281
324
|
: lowerer.coerceToExpected(raw, DYN);
|
|
325
|
+
// A JS object's array-valued properties retain the same source array.
|
|
326
|
+
// Repeated references must compare equal and mutations remain shared.
|
|
327
|
+
if (!boxValue && isJsSourceFile(prop.getSourceFile()) && v.kind === "dynFrom" && v.value.type.kind === "array") {
|
|
328
|
+
v = { ...v, liveRef: true };
|
|
329
|
+
}
|
|
282
330
|
if (v.type.kind !== "dyn") {
|
|
283
331
|
const convDiagsBefore = lowerer.diags.length;
|
|
284
332
|
try {
|
|
@@ -307,7 +355,9 @@ export function lowerDynObjectLiteral(lowerer, expr, boxValue) {
|
|
|
307
355
|
fields.push({ key, value: v });
|
|
308
356
|
}
|
|
309
357
|
flushFields();
|
|
310
|
-
|
|
358
|
+
if (acc !== null)
|
|
359
|
+
return acc;
|
|
360
|
+
return { kind: "dynObjLit", fields: [], type: DYN, loc };
|
|
311
361
|
}
|
|
312
362
|
/** Spreading a source whose shape carries accessor slots: Node's copy
|
|
313
363
|
* invokes each getter exactly once in insertion order — even for keys a
|
|
@@ -319,6 +369,16 @@ function fenceAccessorSpreadSource(lowerer, prop, srcShape) {
|
|
|
319
369
|
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
370
|
}
|
|
321
371
|
}
|
|
372
|
+
/** Only definitely present later records replace earlier defaults. A
|
|
373
|
+
* callback binding may store undefined despite its checker annotation. */
|
|
374
|
+
function laterSpreadType(lowerer, expr) {
|
|
375
|
+
let source = expr;
|
|
376
|
+
while (ts.isParenthesizedExpression(source))
|
|
377
|
+
source = source.expression;
|
|
378
|
+
if (ts.isIdentifier(source))
|
|
379
|
+
return lowerer.lowerExpr(source).type;
|
|
380
|
+
return lowerer.mapTypeOf(lowerer.typeOf(source));
|
|
381
|
+
}
|
|
322
382
|
/** The JS trap-closure fallback for FUNCTION-VALUED object properties: a
|
|
323
383
|
* lambda whose body fails to lower inside a JS object literal becomes a
|
|
324
384
|
* closure of the field's exact func type whose body is the runtime fence —
|
|
@@ -379,33 +439,48 @@ function fenceClosureProbe(lowerer, node, slotType, attempt) {
|
|
|
379
439
|
* (excess-property freshness — tsc already enforced it), every arm field
|
|
380
440
|
* missing from the literal must be optional-flavored (an undefined-armed
|
|
381
441
|
* 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
|
-
*
|
|
442
|
+
* field's TypeScript type must fit the member's field type — literal against
|
|
443
|
+
* literal decides by VALUE (the discriminant), everything else through the
|
|
444
|
+
* checker. The chosen arm then directs construction of nested literals;
|
|
445
|
+
* probing their inferred IR layout too early can reject the right arm and
|
|
446
|
+
* select a smaller unrelated record that drops fields. Exactly ONE fitting arm
|
|
385
447
|
* answers it; zero or several answer null and the caller keeps its
|
|
386
|
-
* fences.
|
|
387
|
-
*
|
|
448
|
+
* fences. A spread uses the checker's resulting properties so overridden
|
|
449
|
+
* discriminants and narrowed recursive source arms keep their identity.
|
|
450
|
+
* Accessors, methods, and unfoldable computed keys keep their own paths. */
|
|
388
451
|
function literalUnionArmOf(lowerer, expr, tsType, recordArms) {
|
|
389
452
|
if (!tsType.isUnionType())
|
|
390
453
|
return null;
|
|
391
454
|
const props = [];
|
|
455
|
+
let hasSpread = false;
|
|
392
456
|
for (const p of expr.properties) {
|
|
393
457
|
if (ts.isPropertyAssignment(p) && !ts.isComputedPropertyName(p.name)) {
|
|
394
|
-
props.push({ name: propNameText(lowerer, p.name),
|
|
458
|
+
props.push({ name: propNameText(lowerer, p.name), type: lowerer.typeOf(p.initializer) });
|
|
395
459
|
}
|
|
396
460
|
else if (ts.isShorthandPropertyAssignment(p) && ts.isIdentifier(p.name)) {
|
|
397
|
-
props.push({ name: p.name.text,
|
|
461
|
+
props.push({ name: p.name.text, type: lowerer.typeOf(p.name) });
|
|
462
|
+
}
|
|
463
|
+
else if (ts.isSpreadAssignment(p)) {
|
|
464
|
+
hasSpread = true;
|
|
398
465
|
}
|
|
399
466
|
else {
|
|
400
467
|
return null;
|
|
401
468
|
}
|
|
402
469
|
}
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
470
|
+
if (hasSpread) {
|
|
471
|
+
const own = lowerer.typeOf(expr);
|
|
472
|
+
// Conditional/union spreads need runtime selection, not one guessed arm.
|
|
473
|
+
if (own.isUnionType())
|
|
474
|
+
return null;
|
|
475
|
+
props.length = 0;
|
|
476
|
+
for (const property of lowerer.checker.getPropertiesOfType(own)) {
|
|
477
|
+
props.push({ name: property.name, type: lowerer.checker.getTypeOfSymbol(property) });
|
|
478
|
+
}
|
|
479
|
+
}
|
|
480
|
+
/** Cheap literal discriminants avoid checker traffic for unrelated arms.
|
|
481
|
+
* Compound types need the checker's semantic assignability, including
|
|
482
|
+
* recursive unions, never intersections, and contextual empty arrays. */
|
|
406
483
|
const fits = (litT, ftT) => {
|
|
407
|
-
if (ftT.isUnionType())
|
|
408
|
-
return ts.constituentTypes(ftT).some((a) => fits(litT, a));
|
|
409
484
|
if (ftT.isStringLiteralType())
|
|
410
485
|
return litT.isStringLiteralType() && litT.value === ftT.value;
|
|
411
486
|
if (ftT.isNumberLiteralType())
|
|
@@ -417,13 +492,7 @@ function literalUnionArmOf(lowerer, expr, tsType, recordArms) {
|
|
|
417
492
|
return (litT.flags & ts.TypeFlags.Null) !== 0;
|
|
418
493
|
if (ftT.flags & ts.TypeFlags.Undefined)
|
|
419
494
|
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;
|
|
495
|
+
return lowerer.checker.isTypeAssignableTo(litT, ftT);
|
|
427
496
|
};
|
|
428
497
|
const armShapeIds = new Set(recordArms.map((a) => a.shapeId));
|
|
429
498
|
const candidates = new Set();
|
|
@@ -456,14 +525,14 @@ function literalUnionArmOf(lowerer, expr, tsType, recordArms) {
|
|
|
456
525
|
const sym = lowerer.checker.getPropertyOfType(member, p.name);
|
|
457
526
|
if (!sym)
|
|
458
527
|
return false;
|
|
459
|
-
return fits(
|
|
528
|
+
return fits(p.type, lowerer.checker.getTypeOfSymbol(sym));
|
|
460
529
|
});
|
|
461
530
|
if (fieldsFit)
|
|
462
531
|
candidates.add(mMapped.shapeId);
|
|
463
532
|
}
|
|
464
533
|
if (candidates.size !== 1)
|
|
465
534
|
return null;
|
|
466
|
-
const [only] = candidates;
|
|
535
|
+
const [only] = [...candidates];
|
|
467
536
|
return recordArms.find((a) => a.shapeId === only) ?? null;
|
|
468
537
|
}
|
|
469
538
|
/** Object spread treats nullish sources as empty. Preserve evaluation once,
|
|
@@ -499,8 +568,40 @@ function lowerOptionalIndexSpreadSource(lowerer, source, loc) {
|
|
|
499
568
|
};
|
|
500
569
|
return prefix.length === 0 ? selected : { kind: "seqExpr", stmts: prefix, result: selected, type: recordType, loc };
|
|
501
570
|
}
|
|
502
|
-
export function lowerObjectLiteral(lowerer, expr) {
|
|
571
|
+
export function lowerObjectLiteral(lowerer, expr, expected) {
|
|
572
|
+
// Unannotated JavaScript accumulator fields have no element contract.
|
|
573
|
+
// Preserve their checked arrays instead of assigning never[] a numeric ABI.
|
|
574
|
+
if (!expected && isJsSourceFile(expr.getSourceFile()) && expr.properties.some((prop) => ts.isPropertyAssignment(prop) && (ts.isArrayLiteralExpression(prop.initializer) &&
|
|
575
|
+
prop.initializer.elements.length === 0 || neverTaintedJsType(lowerer, prop.initializer, lowerer.typeOf(prop.initializer))))) {
|
|
576
|
+
return lowerDynObjectLiteral(lowerer, expr);
|
|
577
|
+
}
|
|
578
|
+
if (!expected && isJsSourceFile(expr.getSourceFile()) && expr.properties.some((prop) => ts.isPropertyAssignment(prop) && lowerer.mapTypeOf(lowerer.typeOf(prop.initializer))?.kind === "array" &&
|
|
579
|
+
tryLowerExpression(lowerer, prop.initializer)?.type.kind === "dyn")) {
|
|
580
|
+
return lowerDynObjectLiteral(lowerer, expr);
|
|
581
|
+
}
|
|
582
|
+
// JavaScript object methods/accessors carry a live receiver. Keep the
|
|
583
|
+
// literal in checked native storage instead of erasing its prototype ABI.
|
|
584
|
+
if (isJsSourceFile(expr.getSourceFile()) && (expr.properties.length === 0 || expr.properties.some((prop) => ts.isMethodDeclaration(prop) || ts.isGetAccessorDeclaration(prop) || ts.isSetAccessorDeclaration(prop)))) {
|
|
585
|
+
return lowerDynObjectLiteral(lowerer, expr);
|
|
586
|
+
}
|
|
503
587
|
const loc = locOf(expr);
|
|
588
|
+
// Module collection already chose checked storage for this JavaScript
|
|
589
|
+
// binding. Construct in that representation: an intermediate record would
|
|
590
|
+
// check nested aliases back into inferred shapes and lose their identity.
|
|
591
|
+
if (isJsSourceFile(expr.getSourceFile()) && ts.isVariableDeclaration(expr.parent) &&
|
|
592
|
+
expr.parent.initializer === expr && ts.isIdentifier(expr.parent.name) &&
|
|
593
|
+
lowerer.globalOf(expr.parent.name)?.type.kind === "dyn") {
|
|
594
|
+
return lowerDynObjectLiteral(lowerer, expr);
|
|
595
|
+
}
|
|
596
|
+
// A checked spread carries runtime symbol keys and receiver-sensitive
|
|
597
|
+
// methods absent from its inferred record shape. Copy the real properties.
|
|
598
|
+
if (!expected && isJsSourceFile(expr.getSourceFile()) && expr.properties.some((property) => ts.isSpreadAssignment(property) && (lowerer.builtinNamespaceModuleOf(property.expression)?.startsWith("path") ||
|
|
599
|
+
tryLowerExpression(lowerer, property.expression)?.type.kind === "dyn"))) {
|
|
600
|
+
return lowerDynObjectLiteral(lowerer, expr);
|
|
601
|
+
}
|
|
602
|
+
const unionClone = lowerUnionRecordClone(lowerer, expr);
|
|
603
|
+
if (unionClone !== null)
|
|
604
|
+
return unionClone;
|
|
504
605
|
// The RUNTIME-KEYED literal (JS): a computed key that doesn't fold to a
|
|
505
606
|
// compile-time string means the literal's shape is not a compile-time
|
|
506
607
|
// fact — no record shape can hold it. The whole literal builds as a dyn
|
|
@@ -511,7 +612,7 @@ export function lowerObjectLiteral(lowerer, expr) {
|
|
|
511
612
|
if (isJsSourceFile(expr.getSourceFile()) &&
|
|
512
613
|
expr.properties.some((p) => {
|
|
513
614
|
const n = ts.isSpreadAssignment(p) ? undefined : p.name;
|
|
514
|
-
return n !== undefined && ts.isComputedPropertyName(n)
|
|
615
|
+
return n !== undefined && ts.isComputedPropertyName(n);
|
|
515
616
|
})) {
|
|
516
617
|
return lowerDynObjectLiteral(lowerer, expr);
|
|
517
618
|
}
|
|
@@ -578,6 +679,17 @@ export function lowerObjectLiteral(lowerer, expr) {
|
|
|
578
679
|
lowerer.rejectThisInObjectMethod(prop.body ?? prop);
|
|
579
680
|
}
|
|
580
681
|
let tsType = lowerer.checker.getContextualType(expr) ?? lowerer.typeOf(expr);
|
|
682
|
+
// An inferred binding pattern supplies placeholders such as
|
|
683
|
+
// { nested: { value: any } }. Construct the literal's own fields so
|
|
684
|
+
// those placeholders do not erase instantiated generic storage.
|
|
685
|
+
if (!expected && ts.isVariableDeclaration(expr.parent) && !expr.parent.type &&
|
|
686
|
+
ts.isObjectBindingPattern(expr.parent.name) && expr.parent.initializer === expr) {
|
|
687
|
+
tsType = lowerer.typeOf(expr);
|
|
688
|
+
}
|
|
689
|
+
// `as never` supplies no construction layout. Keep the literal's own
|
|
690
|
+
// fields so an exhaustiveness witness cannot erase a reachable value.
|
|
691
|
+
if (lowerer.checker.isNeverType(tsType))
|
|
692
|
+
tsType = lowerer.typeOf(expr);
|
|
581
693
|
// `lit satisfies T` is TYPE-LEVEL only: the expression's checker type —
|
|
582
694
|
// and therefore the shape every downstream consumer sees — is the
|
|
583
695
|
// literal's OWN type (T still contextually types members, so inferred
|
|
@@ -609,6 +721,13 @@ export function lowerObjectLiteral(lowerer, expr) {
|
|
|
609
721
|
tsType = lowerer.checker.getAwaitedType(tsType) ?? tsType;
|
|
610
722
|
}
|
|
611
723
|
let mapped = lowerer.mapTypeOf(tsType);
|
|
724
|
+
// A checked-dynamic source has runtime keys even when later explicit
|
|
725
|
+
// fields make the literal's inferred type look like a fixed record.
|
|
726
|
+
// Keep a checked-dynamic destination in that representation so copying
|
|
727
|
+
// preserves keys, evaluation order, and fields overwritten afterwards.
|
|
728
|
+
if (mapped?.kind === "dyn" && expr.properties.some((p) => ts.isSpreadAssignment(p) && lowerer.mapTypeOf(lowerer.typeOf(p.expression))?.kind === "dyn")) {
|
|
729
|
+
return lowerDynObjectLiteral(lowerer, expr);
|
|
730
|
+
}
|
|
612
731
|
// A JavaScript call can contextually type an object literal as string even
|
|
613
732
|
// though the literal itself is a record. Keep its own shape so a caller
|
|
614
733
|
// performing ToString can convert it after the value is built.
|
|
@@ -675,7 +794,11 @@ export function lowerObjectLiteral(lowerer, expr) {
|
|
|
675
794
|
// gate DECLINED it (a project-declared typedef that absorbed to the
|
|
676
795
|
// island through checker-`any` field residue): the literal builds at
|
|
677
796
|
// its own type like every unmappable context.
|
|
678
|
-
|
|
797
|
+
// An index-signature literal can inherit a callable contextual type for
|
|
798
|
+
// a prototype-named DATA property (notably `toString`). Object literals
|
|
799
|
+
// have no call signature; construct their own data shape and let the
|
|
800
|
+
// surrounding assignment/assertion enforce the destination contract.
|
|
801
|
+
if (mapped === null || mapped.kind === "union" || mapped.kind === "dyn" || mapped.kind === "object" || mapped.kind === "jsval" || mapped.kind === "func") {
|
|
679
802
|
const ctxUnion = mapped?.kind === "union" ? mapped : null;
|
|
680
803
|
mapped = lowerer.mapTypeOf(lowerer.typeOf(expr)) ?? mapped;
|
|
681
804
|
// A literal whose own shape re-tags into NO arm of the contextual
|
|
@@ -697,7 +820,10 @@ export function lowerObjectLiteral(lowerer, expr) {
|
|
|
697
820
|
if (recordArms.length === 1) {
|
|
698
821
|
const armShape = lowerer.shapes.get(recordArms[0].shapeId);
|
|
699
822
|
if ((mapped?.kind !== "record" || mapped.shapeId !== recordArms[0].shapeId) &&
|
|
700
|
-
!armShape?.tuple
|
|
823
|
+
!armShape?.tuple &&
|
|
824
|
+
// `{} | undefined` supplies no layout for a populated options
|
|
825
|
+
// literal, just as a bare empty-record context supplies none.
|
|
826
|
+
(expr.properties.length === 0 || (armShape && (armShape.fields.length > 0 || armShape.indexValue)))) {
|
|
701
827
|
mapped = recordArms[0];
|
|
702
828
|
}
|
|
703
829
|
}
|
|
@@ -715,7 +841,11 @@ export function lowerObjectLiteral(lowerer, expr) {
|
|
|
715
841
|
// exactly ONE member fits, build AS that arm — its field types
|
|
716
842
|
// drive every property's coercion, exactly the single-record-arm
|
|
717
843
|
// rule above. Ambiguous literals keep the SC2003 fence.
|
|
718
|
-
|
|
844
|
+
// Recursive arms can have identical stored field layouts while
|
|
845
|
+
// retaining distinct nominal knots. An inferred spread shape can
|
|
846
|
+
// match the wrong knot, so consult discriminants even if that shape
|
|
847
|
+
// already appears in the union.
|
|
848
|
+
if (ownShapeId === null || !recordArms.some((a) => a.shapeId === ownShapeId) || expr.properties.some(ts.isSpreadAssignment)) {
|
|
719
849
|
const arm = literalUnionArmOf(lowerer, expr, tsType, recordArms);
|
|
720
850
|
if (arm)
|
|
721
851
|
mapped = arm;
|
|
@@ -767,13 +897,36 @@ export function lowerObjectLiteral(lowerer, expr) {
|
|
|
767
897
|
// descriptor records with `any` values) — builds as a dyn OBJECT:
|
|
768
898
|
// each field converts through the usual dyn boundary, and dynamic
|
|
769
899
|
// consumers ride the keyed-dyn paths. TypeScript keeps the fence.
|
|
770
|
-
if (
|
|
900
|
+
if (mapped?.kind === "dyn" || (!mapped && isJsSourceFile(expr.getSourceFile())) ||
|
|
901
|
+
(!expected && mapped && jsOpenObjectType(expr, mapped, lowerer.shapes, lowerer.unions).kind === "dyn")) {
|
|
771
902
|
return lowerDynObjectLiteral(lowerer, expr);
|
|
772
903
|
}
|
|
773
904
|
if (!mapped || mapped.kind !== "record")
|
|
774
905
|
lowerer.badType(expr, tsType);
|
|
775
906
|
let type = mapped;
|
|
907
|
+
// A fresh, plain literal can construct its fields directly for a known
|
|
908
|
+
// destination with the same field set. This matters for inferred
|
|
909
|
+
// conditional records: an empty array in one arm has no element layout
|
|
910
|
+
// until the join supplies it. Existing values still use width coercion;
|
|
911
|
+
// extra fields, spreads, accessors, and keyed shapes retain their paths.
|
|
912
|
+
if (expected && !isJsSourceFile(expr.getSourceFile()) &&
|
|
913
|
+
expr.properties.every((p) => ts.isPropertyAssignment(p) || ts.isShorthandPropertyAssignment(p))) {
|
|
914
|
+
const own = lowerer.shapes.get(type.shapeId);
|
|
915
|
+
const target = lowerer.shapes.get(expected.shapeId);
|
|
916
|
+
if (!own.tuple && !target.tuple && !own.indexValue && !target.indexValue &&
|
|
917
|
+
!shapeHasAccessorSlots(own) && !shapeHasAccessorSlots(target) &&
|
|
918
|
+
target.fields.every((field) => own.fields.some((candidate) => candidate.name === field.name) ||
|
|
919
|
+
field.type.kind === "union" && lowerer.armTag(field.type.unionId, UNDEFINED_T) >= 0) &&
|
|
920
|
+
own.fields.every((field) => target.fields.some((candidate) => candidate.name === field.name))) {
|
|
921
|
+
type = { kind: "record", shapeId: expected.shapeId };
|
|
922
|
+
}
|
|
923
|
+
}
|
|
776
924
|
let shape = lowerer.shapes.get(type.shapeId);
|
|
925
|
+
// JavaScript Dates carry native object identity in checked storage. An
|
|
926
|
+
// inferred scalar Date field would erase that identity before boxing.
|
|
927
|
+
if (isJsSourceFile(expr.getSourceFile()) && shape.fields.some((field) => field.type.kind === "date")) {
|
|
928
|
+
return lowerDynObjectLiteral(lowerer, expr);
|
|
929
|
+
}
|
|
777
930
|
// ACCESSOR properties, JS literals only (TS accessors fill the shape's
|
|
778
931
|
// %get:/%set: closure slots below): no record storage exists for them,
|
|
779
932
|
// so the literal's shape NARROWS to its plain fields (reads resolve
|
|
@@ -793,21 +946,20 @@ export function lowerObjectLiteral(lowerer, expr) {
|
|
|
793
946
|
}
|
|
794
947
|
const fieldTypes = new Map(shape.fields.map((f) => [f.name, f.type]));
|
|
795
948
|
// File-scope JavaScript object bindings live in the checked-dynamic tree
|
|
796
|
-
// to preserve open writes and identity.
|
|
797
|
-
// from
|
|
798
|
-
//
|
|
949
|
+
// to preserve open writes and identity. The checker can infer fields
|
|
950
|
+
// from later writes; those fields must remain absent when the literal
|
|
951
|
+
// is first evaluated.
|
|
799
952
|
const topLevelJsDecl = ts.isVariableDeclaration(expr.parent) &&
|
|
800
953
|
expr.parent.initializer === expr &&
|
|
801
|
-
ts.isVariableStatement(expr.parent
|
|
802
|
-
ts.isSourceFile(expr.parent
|
|
954
|
+
ts.isVariableStatement(expr.parent?.parent?.parent) &&
|
|
955
|
+
ts.isSourceFile(expr.parent?.parent?.parent?.parent);
|
|
803
956
|
const assignedProperties = expr.properties.filter((prop) => ts.isPropertyAssignment(prop) || ts.isShorthandPropertyAssignment(prop));
|
|
804
957
|
if (topLevelJsDecl && isJsSourceFile(expr.getSourceFile()) &&
|
|
805
958
|
assignedProperties.length === expr.properties.length) {
|
|
806
959
|
const provided = new Set(assignedProperties.map((prop) => propNameText(lowerer, prop.name)));
|
|
807
|
-
|
|
808
|
-
lowerer.armTag(field.type.unionId, UNDEFINED_T) >= 0);
|
|
809
|
-
if (omittedOptional)
|
|
960
|
+
if (shape.fields.some((field) => !provided.has(field.name))) {
|
|
810
961
|
return lowerDynObjectLiteral(lowerer, expr);
|
|
962
|
+
}
|
|
811
963
|
}
|
|
812
964
|
// The clone probe may lower the leading spread before declining (a
|
|
813
965
|
// static `as` cast can make the checker-visible shape match while its
|
|
@@ -982,15 +1134,10 @@ export function lowerObjectLiteral(lowerer, expr) {
|
|
|
982
1134
|
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
1135
|
}
|
|
984
1136
|
}
|
|
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).
|
|
1137
|
+
// A declared destination combining fixed records and runtime-keyed
|
|
1138
|
+
// sources needs both layouts. Apply each source before evaluating the
|
|
1139
|
+
// next expression, with checked overflow collisions and optional-field
|
|
1140
|
+
// completion. Extra runtime keys follow the declared-shape width policy.
|
|
994
1141
|
if (!shape.indexValue &&
|
|
995
1142
|
!shape.tuple &&
|
|
996
1143
|
shape.fields.length > 0 &&
|
|
@@ -998,7 +1145,7 @@ export function lowerObjectLiteral(lowerer, expr) {
|
|
|
998
1145
|
expr.properties.every((p) => ts.isSpreadAssignment(p) && !conditionalSpreadOf(p.expression)) &&
|
|
999
1146
|
expr.properties.some((p) => {
|
|
1000
1147
|
const t = lowerer.mapTypeOf(lowerer.typeOf(p.expression));
|
|
1001
|
-
return t?.kind === "record" && !!lowerer.shapes.get(t.shapeId)?.indexValue;
|
|
1148
|
+
return t?.kind === "dyn" || t?.kind === "record" && !!lowerer.shapes.get(t.shapeId)?.indexValue;
|
|
1002
1149
|
})) {
|
|
1003
1150
|
return lowerDeclaredSpreadMerge(lowerer, expr, type, shape, loc);
|
|
1004
1151
|
}
|
|
@@ -1010,6 +1157,16 @@ export function lowerObjectLiteral(lowerer, expr) {
|
|
|
1010
1157
|
throw new PoisonError();
|
|
1011
1158
|
};
|
|
1012
1159
|
const fields = [];
|
|
1160
|
+
const spreadStmts = [];
|
|
1161
|
+
const hasSpread = expr.properties.some(ts.isSpreadAssignment);
|
|
1162
|
+
const captured = new Set();
|
|
1163
|
+
const capture = (value) => {
|
|
1164
|
+
const local = lowerer.declareHiddenLocal("%spreadValue", value.type);
|
|
1165
|
+
spreadStmts.push({ kind: "varDecl", localId: local.id, init: value, loc: value.loc });
|
|
1166
|
+
const ref = varRef(local.id, value.type, value.loc);
|
|
1167
|
+
captured.add(ref);
|
|
1168
|
+
return ref;
|
|
1169
|
+
};
|
|
1013
1170
|
// Field names introduced by conditional spreads: their ternary carries
|
|
1014
1171
|
// the spread's whole evaluation (cond once, value lazily), so a LATER
|
|
1015
1172
|
// contributor overriding one would silently drop that evaluation —
|
|
@@ -1019,6 +1176,21 @@ export function lowerObjectLiteral(lowerer, expr) {
|
|
|
1019
1176
|
// member reads narrow away; see the catch in the property loop).
|
|
1020
1177
|
const droppedNames = new Set();
|
|
1021
1178
|
for (const prop of expr.properties) {
|
|
1179
|
+
// A later contributor can mutate an earlier source or overwrite a
|
|
1180
|
+
// value with effects. Snapshot pending fields at their source position,
|
|
1181
|
+
// before evaluating the next contributor, even if they are overwritten.
|
|
1182
|
+
if (hasSpread) {
|
|
1183
|
+
for (let i = 0; i < fields.length; i++) {
|
|
1184
|
+
const field = fields[i];
|
|
1185
|
+
if (field.drop) {
|
|
1186
|
+
spreadStmts.push({ kind: "exprStmt", expr: field.value, loc: field.value.loc });
|
|
1187
|
+
fields.splice(i--, 1);
|
|
1188
|
+
continue;
|
|
1189
|
+
}
|
|
1190
|
+
if (!captured.has(field.value))
|
|
1191
|
+
field.value = capture(field.value);
|
|
1192
|
+
}
|
|
1193
|
+
}
|
|
1022
1194
|
if (ts.isSpreadAssignment(prop)) {
|
|
1023
1195
|
const cs = conditionalSpreadOf(prop.expression);
|
|
1024
1196
|
if (cs && cs !== "unsupported") {
|
|
@@ -1035,7 +1207,7 @@ export function lowerObjectLiteral(lowerer, expr) {
|
|
|
1035
1207
|
if (shape.indexValue) {
|
|
1036
1208
|
lowerer.unsupported("SC1090", prop, "conditional spreads into index-signature keys (overflow entries model presence — write the key in an if statement instead)");
|
|
1037
1209
|
}
|
|
1038
|
-
|
|
1210
|
+
shapeMismatch(prop);
|
|
1039
1211
|
}
|
|
1040
1212
|
const absent = lowerer.wrappedUndefined(fieldType, locOf(prop));
|
|
1041
1213
|
if (!absent) {
|
|
@@ -1070,28 +1242,22 @@ export function lowerObjectLiteral(lowerer, expr) {
|
|
|
1070
1242
|
// shape. Every source field must land on the target shape with an
|
|
1071
1243
|
// equal type (a wider source would silently DROP fields JS keeps —
|
|
1072
1244
|
// 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
|
-
}
|
|
1245
|
+
// earlier ones (JS last-write-wins). Evaluate the source exactly
|
|
1246
|
+
// once, including empty sources and those whose fields are all
|
|
1247
|
+
// overridden. Field snapshots above preserve the copy order.
|
|
1086
1248
|
let srcNode = prop.expression;
|
|
1087
1249
|
while (ts.isParenthesizedExpression(srcNode))
|
|
1088
1250
|
srcNode = srcNode.expression;
|
|
1089
|
-
const srcLowered = prop === expr.properties[0] && leadingSpreadLowered !== null
|
|
1251
|
+
const srcLowered = capture(prop === expr.properties[0] && leadingSpreadLowered !== null
|
|
1090
1252
|
? leadingSpreadLowered
|
|
1091
|
-
:
|
|
1092
|
-
|
|
1093
|
-
|
|
1094
|
-
|
|
1253
|
+
: lowerer.lowerExpr(srcNode));
|
|
1254
|
+
// Array callbacks can receive a record-or-undefined ABI even when
|
|
1255
|
+
// TypeScript describes a required record. Select the copy strategy
|
|
1256
|
+
// from that stored representation so absent sources copy nothing.
|
|
1257
|
+
// Checked-dynamic bindings still use the checker's field contract.
|
|
1258
|
+
const srcType = srcLowered.type.kind === "dyn"
|
|
1259
|
+
? lowerer.mapTypeOf(lowerer.typeOf(srcNode))
|
|
1260
|
+
: srcLowered.type;
|
|
1095
1261
|
// `...options.installConfig` — a spread of `Partial<X> | undefined`
|
|
1096
1262
|
// (the optional-options merge idiom `{ ...DEFAULTS, ...overrides }`):
|
|
1097
1263
|
// JS spreads nothing for the unit arm and copies present keys
|
|
@@ -1108,9 +1274,6 @@ export function lowerObjectLiteral(lowerer, expr) {
|
|
|
1108
1274
|
!def.arms.every((a) => a.kind === "record" || isUnitType(a))) {
|
|
1109
1275
|
lowerer.unsupported("SC1090", prop, `object spread of '${lowerer.fmt(srcType)}' sources (only known record shapes spread — ${NARROW_FIRST})`);
|
|
1110
1276
|
}
|
|
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
1277
|
const recArm = recArms[0];
|
|
1115
1278
|
const recTag = def.arms.indexOf(recArm);
|
|
1116
1279
|
// A checked-dynamic VALUE under the union-mapped checker type
|
|
@@ -1133,7 +1296,7 @@ export function lowerObjectLiteral(lowerer, expr) {
|
|
|
1133
1296
|
if (ts.isSpreadAssignment(later)) {
|
|
1134
1297
|
if (conditionalSpreadOf(later.expression))
|
|
1135
1298
|
continue;
|
|
1136
|
-
const lt =
|
|
1299
|
+
const lt = laterSpreadType(lowerer, later.expression);
|
|
1137
1300
|
if (lt?.kind === "record") {
|
|
1138
1301
|
for (const lf of lowerer.shapes.get(lt.shapeId)?.fields ?? [])
|
|
1139
1302
|
laterNames.add(lf.name);
|
|
@@ -1234,9 +1397,6 @@ export function lowerObjectLiteral(lowerer, expr) {
|
|
|
1234
1397
|
if (srcType?.kind !== "record") {
|
|
1235
1398
|
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
1399
|
}
|
|
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
1400
|
const srcShape = lowerer.shapes.get(srcType.shapeId);
|
|
1241
1401
|
if (!srcShape)
|
|
1242
1402
|
throw new InternalCompilerError(`lowerer bug: spread of unknown shape ${srcType.shapeId}`);
|
|
@@ -1258,7 +1418,7 @@ export function lowerObjectLiteral(lowerer, expr) {
|
|
|
1258
1418
|
if (ts.isSpreadAssignment(later)) {
|
|
1259
1419
|
if (conditionalSpreadOf(later.expression))
|
|
1260
1420
|
continue;
|
|
1261
|
-
const lt =
|
|
1421
|
+
const lt = laterSpreadType(lowerer, later.expression);
|
|
1262
1422
|
if (lt?.kind === "record") {
|
|
1263
1423
|
for (const lf of lowerer.shapes.get(lt.shapeId)?.fields ?? [])
|
|
1264
1424
|
laterNames.add(lf.name);
|
|
@@ -1372,7 +1532,7 @@ export function lowerObjectLiteral(lowerer, expr) {
|
|
|
1372
1532
|
if (fieldTypes.has(name)) {
|
|
1373
1533
|
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
1534
|
}
|
|
1375
|
-
|
|
1535
|
+
shapeMismatch(prop);
|
|
1376
1536
|
}
|
|
1377
1537
|
const closure = lowerer.coerceInto(prop, lowerer.lowerLambda(prop), slotT);
|
|
1378
1538
|
if (!typeEquals(closure.type, slotT))
|
|
@@ -1396,7 +1556,7 @@ export function lowerObjectLiteral(lowerer, expr) {
|
|
|
1396
1556
|
// side effects; calls resolve statically against this declaration);
|
|
1397
1557
|
// a computed initializer would need its evaluation kept — fenced.
|
|
1398
1558
|
if (!fieldType && !ts.isSpreadAssignment(prop)) {
|
|
1399
|
-
const memberSym = prop.name
|
|
1559
|
+
const memberSym = prop.name ? lowerer.checker.getSymbolAtLocation(prop.name) : undefined;
|
|
1400
1560
|
const memberT = memberSym ? lowerer.checker.getTypeOfSymbol(memberSym) : undefined;
|
|
1401
1561
|
if (memberT && isGenericCallableMemberType(memberT, lowerer.checker)) {
|
|
1402
1562
|
const pureInit = (() => {
|
|
@@ -1436,7 +1596,7 @@ export function lowerObjectLiteral(lowerer, expr) {
|
|
|
1436
1596
|
}
|
|
1437
1597
|
continue;
|
|
1438
1598
|
}
|
|
1439
|
-
|
|
1599
|
+
shapeMismatch(prop);
|
|
1440
1600
|
}
|
|
1441
1601
|
let value;
|
|
1442
1602
|
let valueNode = prop;
|
|
@@ -1444,17 +1604,15 @@ export function lowerObjectLiteral(lowerer, expr) {
|
|
|
1444
1604
|
try {
|
|
1445
1605
|
if (ts.isPropertyAssignment(prop)) {
|
|
1446
1606
|
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.
|
|
1607
|
+
// Fresh construction gets the field's destination before lowering
|
|
1608
|
+
// nested arrays, records, or conditional branches. Existing values
|
|
1609
|
+
// retain their runtime representation until the field coercion.
|
|
1452
1610
|
let init = prop.initializer;
|
|
1453
|
-
while (ts.isParenthesizedExpression(init))
|
|
1611
|
+
while (ts.isParenthesizedExpression(init) || ts.isSatisfiesExpression(init))
|
|
1454
1612
|
init = init.expression;
|
|
1455
1613
|
value =
|
|
1456
1614
|
fenceClosureProbe(lowerer, prop.initializer, fieldType, () => lowerer.lowerExpr(prop.initializer)) ??
|
|
1457
|
-
(fieldType !== undefined && ts.isArrayLiteralExpression(init)
|
|
1615
|
+
(fieldType !== undefined && (ts.isArrayLiteralExpression(init) || ts.isObjectLiteralExpression(init) || ts.isConditionalExpression(init))
|
|
1458
1616
|
? lowerer.lowerExprExpecting(prop.initializer, fieldType)
|
|
1459
1617
|
: lowerer.lowerExpr(prop.initializer));
|
|
1460
1618
|
}
|
|
@@ -1466,7 +1624,7 @@ export function lowerObjectLiteral(lowerer, expr) {
|
|
|
1466
1624
|
fenceClosureProbe(lowerer, prop, fieldType, () => lowerer.lowerLambda(prop)) ?? lowerer.lowerLambda(prop);
|
|
1467
1625
|
}
|
|
1468
1626
|
else {
|
|
1469
|
-
lowerer.unsupported("SC1090", prop, `syntax '${ts.
|
|
1627
|
+
lowerer.unsupported("SC1090", prop, `syntax '${ts.syntaxKindName(prop.kind)}'`);
|
|
1470
1628
|
}
|
|
1471
1629
|
}
|
|
1472
1630
|
catch (err) {
|
|
@@ -1554,11 +1712,129 @@ export function lowerObjectLiteral(lowerer, expr) {
|
|
|
1554
1712
|
(f.type.kind === "dyn" ? dynUndefinedExpr(loc) : null) ??
|
|
1555
1713
|
absentHandle;
|
|
1556
1714
|
if (!absent)
|
|
1557
|
-
|
|
1715
|
+
shapeMismatch(expr); // only optional and 'unknown' fields may be omitted
|
|
1558
1716
|
fields.push({ name: f.name, value: absent });
|
|
1559
1717
|
}
|
|
1560
1718
|
}
|
|
1561
|
-
|
|
1719
|
+
const result = { kind: "recordLit", fields, type, loc };
|
|
1720
|
+
return spreadStmts.length === 0 ? result : { kind: "seqExpr", stmts: spreadStmts, result, type, loc };
|
|
1721
|
+
}
|
|
1722
|
+
/** A union of plain records can preserve its existing variant while
|
|
1723
|
+
* replacing shared fields. Dispatch before constructing the copy: only
|
|
1724
|
+
* the selected arm evaluates overrides, and recordClone snapshots fields
|
|
1725
|
+
* before an override can mutate the original. Nested references retain
|
|
1726
|
+
* their identity. Changing a discriminator or adding variant-specific
|
|
1727
|
+
* fields needs a different result layout and stays on the ordinary path. */
|
|
1728
|
+
function lowerUnionRecordClone(lowerer, expr) {
|
|
1729
|
+
if (isJsSourceFile(expr.getSourceFile()))
|
|
1730
|
+
return null;
|
|
1731
|
+
const spread = expr.properties[0];
|
|
1732
|
+
if (!spread || !ts.isSpreadAssignment(spread))
|
|
1733
|
+
return null;
|
|
1734
|
+
let sourceNode = spread.expression;
|
|
1735
|
+
while (ts.isParenthesizedExpression(sourceNode) || ts.isSatisfiesExpression(sourceNode))
|
|
1736
|
+
sourceNode = sourceNode.expression;
|
|
1737
|
+
// Conditional spreads construct optional keys, including the empty arm.
|
|
1738
|
+
// Their dedicated lowering owns that layout rather than a union clone.
|
|
1739
|
+
if (ts.isConditionalExpression(sourceNode))
|
|
1740
|
+
return null;
|
|
1741
|
+
const sourceType = lowerer.mapTypeOf(lowerer.typeOf(spread.expression));
|
|
1742
|
+
if (sourceType?.kind !== "union")
|
|
1743
|
+
return null;
|
|
1744
|
+
const def = lowerer.unions.get(sourceType.unionId);
|
|
1745
|
+
if (!def || def.arms.length < 2 || !def.arms.every((arm) => arm.kind === "record"))
|
|
1746
|
+
return null;
|
|
1747
|
+
const props = [];
|
|
1748
|
+
const names = [];
|
|
1749
|
+
for (const prop of expr.properties.slice(1)) {
|
|
1750
|
+
if ((!ts.isPropertyAssignment(prop) && !ts.isShorthandPropertyAssignment(prop)) ||
|
|
1751
|
+
(!ts.isIdentifier(prop.name) && !ts.isStringLiteral(prop.name)))
|
|
1752
|
+
return null;
|
|
1753
|
+
const name = prop.name.text;
|
|
1754
|
+
if (names.includes(name) || name === def.discriminant?.field || name === "__proto__")
|
|
1755
|
+
return null;
|
|
1756
|
+
props.push(prop);
|
|
1757
|
+
names.push(name);
|
|
1758
|
+
}
|
|
1759
|
+
for (const arm of def.arms) {
|
|
1760
|
+
if (arm.kind !== "record")
|
|
1761
|
+
return null;
|
|
1762
|
+
const shape = lowerer.shapes.get(arm.shapeId);
|
|
1763
|
+
if (!shape || shape.indexValue || shape.tuple || shapeHasAccessorSlots(shape) ||
|
|
1764
|
+
!names.every((name) => shape.fields.some((field) => field.name === name)))
|
|
1765
|
+
return null;
|
|
1766
|
+
for (let index = 0; index < props.length; index++) {
|
|
1767
|
+
const prop = props[index];
|
|
1768
|
+
const node = ts.isPropertyAssignment(prop) ? prop.initializer : prop.name;
|
|
1769
|
+
const valueType = lowerer.mapTypeOf(lowerer.typeOf(node));
|
|
1770
|
+
const fieldType = shape.fields.find((field) => field.name === names[index]).type;
|
|
1771
|
+
const lift = valueType ? lowerer.widthLiftPlan(valueType, fieldType) : null;
|
|
1772
|
+
// The inferred result must retain an override's own fields and
|
|
1773
|
+
// aliases. A structural copy into the source field's narrower shape
|
|
1774
|
+
// would silently reshape an unannotated spread expression.
|
|
1775
|
+
if (!lift)
|
|
1776
|
+
return null;
|
|
1777
|
+
if (lift.how === "retag" && valueType?.kind === "union" && fieldType.kind === "union") {
|
|
1778
|
+
const from = lowerer.unions.get(valueType.unionId);
|
|
1779
|
+
const to = lowerer.unions.get(fieldType.unionId);
|
|
1780
|
+
const plan = from && to ? planUnionRetag(from, to, (id) => lowerer.shapes.get(id), (source, target) => lowerer.widthLiftPlan(source, target)) : null;
|
|
1781
|
+
if (!plan || !plan.every((arm) => arm.kind === "direct"
|
|
1782
|
+
? arm.route.lift.how === "copy" || arm.route.lift.how === "upcast"
|
|
1783
|
+
: arm.kind === "discriminant" && arm.routes.every((route) => route.lift.how === "copy" || route.lift.how === "upcast")))
|
|
1784
|
+
return null;
|
|
1785
|
+
}
|
|
1786
|
+
else if (lift.how !== "copy" && lift.how !== "wrap" && lift.how !== "upcast")
|
|
1787
|
+
return null;
|
|
1788
|
+
}
|
|
1789
|
+
}
|
|
1790
|
+
let source = lowerer.lowerExpr(spread.expression);
|
|
1791
|
+
// Hidden runtime absence must never be mistaken for a record payload.
|
|
1792
|
+
// An earlier guard can remove that arm; an unguarded optional spread
|
|
1793
|
+
// still needs a destination able to represent the empty copy.
|
|
1794
|
+
if (!typeEquals(source.type, sourceType) && source.type.kind === "union" && ts.isIdentifier(spread.expression)) {
|
|
1795
|
+
const local = lowerer.resolveLocal(spread.expression);
|
|
1796
|
+
const symbol = lowerer.resolveValueSymbol(spread.expression);
|
|
1797
|
+
const captured = local?.boxed === true || symbol && lowerer.ctx.captureBySymbol.has(symbol);
|
|
1798
|
+
if (local && !captured && !lowerer.runtimeOptionalLocals.has(lowerer.runtimeOptionalRootOf(local))) {
|
|
1799
|
+
const helper = lowerer.narrowedRetagHelper(spread.expression, source.type.unionId, sourceType.unionId, source.loc);
|
|
1800
|
+
if (helper)
|
|
1801
|
+
source = { kind: "call", callee: helper, args: [source], type: sourceType, loc: source.loc };
|
|
1802
|
+
}
|
|
1803
|
+
}
|
|
1804
|
+
if (!typeEquals(source.type, sourceType)) {
|
|
1805
|
+
lowerer.unsupported("SC1090", spread, "a union record clone whose stored source still includes absence");
|
|
1806
|
+
}
|
|
1807
|
+
const loc = locOf(expr);
|
|
1808
|
+
const saved = lowerer.declareHiddenLocal("%unionClone", sourceType);
|
|
1809
|
+
const ref = varRef(saved.id, sourceType, loc);
|
|
1810
|
+
let result = null;
|
|
1811
|
+
for (let tag = def.arms.length - 1; tag >= 0; tag--) {
|
|
1812
|
+
const arm = def.arms[tag];
|
|
1813
|
+
if (arm.kind !== "record")
|
|
1814
|
+
throw new InternalCompilerError("union clone arm is not a record");
|
|
1815
|
+
const shape = lowerer.shapes.get(arm.shapeId);
|
|
1816
|
+
const overrides = [];
|
|
1817
|
+
for (let index = 0; index < props.length; index++) {
|
|
1818
|
+
const prop = props[index];
|
|
1819
|
+
const name = names[index];
|
|
1820
|
+
const fieldType = shape.fields.find((field) => field.name === name).type;
|
|
1821
|
+
const value = ts.isPropertyAssignment(prop)
|
|
1822
|
+
? lowerer.lowerExprExpecting(prop.initializer, fieldType)
|
|
1823
|
+
: lowerer.coerceInto(prop, lowerer.lowerShorthandValue(prop), fieldType);
|
|
1824
|
+
overrides.push({ name, value });
|
|
1825
|
+
}
|
|
1826
|
+
const clone = { kind: "recordClone",
|
|
1827
|
+
source: { kind: "unionNarrow", value: ref, unionId: sourceType.unionId, tag, type: arm, loc },
|
|
1828
|
+
overrides, type: arm, loc };
|
|
1829
|
+
const wrapped = { kind: "unionWrap", value: clone, unionId: sourceType.unionId, tag, type: sourceType, loc };
|
|
1830
|
+
result = result === null ? wrapped : {
|
|
1831
|
+
kind: "ternary", cond: { kind: "unionIsTag", value: ref, unionId: sourceType.unionId, tag, negated: false, type: BOOL, loc },
|
|
1832
|
+
then: wrapped, else_: result, type: sourceType, loc,
|
|
1833
|
+
};
|
|
1834
|
+
}
|
|
1835
|
+
if (result === null)
|
|
1836
|
+
throw new InternalCompilerError("union clone has no arms");
|
|
1837
|
+
return { kind: "seqExpr", stmts: [{ kind: "varDecl", localId: saved.id, init: source, loc }], result, type: sourceType, loc };
|
|
1562
1838
|
}
|
|
1563
1839
|
/** Parses the conditional-spread idiom `...(c ? { k: v, ... } : {})`
|
|
1564
1840
|
* (either orientation). Returns the condition, the non-empty arm's
|
|
@@ -1617,17 +1893,22 @@ export function conditionalSpreadOf(expr) {
|
|
|
1617
1893
|
* untyped copy would store the lie) — and a key naming NO declared field
|
|
1618
1894
|
* is DROPPED (the shape cannot represent it; Node keeps it invisibly —
|
|
1619
1895
|
* divergence 68). Later contributors overwrite earlier ones
|
|
1620
|
-
* (last-write-wins).
|
|
1896
|
+
* (last-write-wins). Fixed, hybrid, and pure index records may contribute. */
|
|
1621
1897
|
function lowerDeclaredSpreadMerge(lowerer, expr, type, shape, loc) {
|
|
1622
1898
|
const srcs = [];
|
|
1623
1899
|
for (const prop of expr.properties) {
|
|
1624
1900
|
const spread = prop; // caller-checked: all spreads
|
|
1625
1901
|
const value = lowerer.lowerExpr(spread.expression);
|
|
1902
|
+
if (value.type.kind === "dyn") {
|
|
1903
|
+
srcs.push({ value, shapeId: "dyn" });
|
|
1904
|
+
continue;
|
|
1905
|
+
}
|
|
1626
1906
|
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
|
|
1907
|
+
if (value.type.kind !== "record" || !srcShape || srcShape.tuple) {
|
|
1908
|
+
lowerer.unsupported("SC1090", prop, `object spread of '${lowerer.fmt(value.type)}' into '${lowerer.fmt(type)}' (only records spread into a declared shape)`);
|
|
1629
1909
|
}
|
|
1630
|
-
|
|
1910
|
+
fenceAccessorSpreadSource(lowerer, prop, srcShape);
|
|
1911
|
+
srcs.push({ value, shapeId: value.type.shapeId, shape: srcShape });
|
|
1631
1912
|
}
|
|
1632
1913
|
// Every target field must be optional: absent keys leave the undefined
|
|
1633
1914
|
// arm, exactly the unset-optional representation.
|
|
@@ -1690,75 +1971,109 @@ function lowerDeclaredSpreadMerge(lowerer, expr, type, shape, loc) {
|
|
|
1690
1971
|
}
|
|
1691
1972
|
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
1973
|
};
|
|
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,
|
|
1974
|
+
// Apply each source before evaluating the next expression. Passing all
|
|
1975
|
+
// sources as one helper's arguments would read an earlier record after a
|
|
1976
|
+
// later source factory mutated it, contrary to object spread evaluation.
|
|
1977
|
+
const out = lowerer.declareHiddenLocal("%declMerge", type);
|
|
1978
|
+
const outRef = varRef(out.id, type, loc);
|
|
1979
|
+
const stmts = [{
|
|
1980
|
+
kind: "varDecl", localId: out.id,
|
|
1981
|
+
init: { kind: "recordLit", fields: shape.fields.map((f) => ({ name: f.name, value: lowerer.wrappedUndefined(f.type, loc) })), type, loc },
|
|
1755
1982
|
loc,
|
|
1756
|
-
}
|
|
1757
|
-
|
|
1758
|
-
|
|
1759
|
-
lowerer.widthHelpers.
|
|
1983
|
+
}];
|
|
1984
|
+
for (const source of srcs) {
|
|
1985
|
+
const key = `declmerge-source:${type.shapeId}:${source.shapeId}`;
|
|
1986
|
+
let helper = lowerer.widthHelpers.get(key);
|
|
1987
|
+
if (!helper) {
|
|
1988
|
+
helper = `%rec.declmerge.${lowerer.widthHelpers.size}`;
|
|
1989
|
+
const sourceType = source.value.type;
|
|
1990
|
+
const destination = varRef("out.0", type, loc);
|
|
1991
|
+
const receiver = varRef("source.0", sourceType, loc);
|
|
1992
|
+
const locals = [
|
|
1993
|
+
{ id: "out.0", name: "out", type, mutable: false },
|
|
1994
|
+
{ id: "source.0", name: "source", type: sourceType, mutable: false },
|
|
1995
|
+
];
|
|
1996
|
+
const body = [];
|
|
1997
|
+
if (!source.shape) {
|
|
1998
|
+
// CopyDataProperties skips nullish sources, even when an erased
|
|
1999
|
+
// record view supplies the checker's apparent object type.
|
|
2000
|
+
body.push({
|
|
2001
|
+
kind: "if", cond: { kind: "dynTest", test: "nullish", value: receiver, type: BOOL, loc },
|
|
2002
|
+
then: [{ kind: "return", value: destination, loc }], else_: null, loc,
|
|
2003
|
+
});
|
|
2004
|
+
}
|
|
2005
|
+
for (const field of source.shape?.fields ?? []) {
|
|
2006
|
+
const target = shape.fields.find((candidate) => candidate.name === field.name);
|
|
2007
|
+
if (!target)
|
|
2008
|
+
continue; // The declared destination drops extra keys.
|
|
2009
|
+
const raw = { kind: "recordGet", obj: receiver, shapeId: source.shapeId, field: field.name, type: field.type, loc };
|
|
2010
|
+
const lift = lowerer.widthLiftPlan(field.type, target.type);
|
|
2011
|
+
if (!lift) {
|
|
2012
|
+
lowerer.unsupported("SC1090", expr, `object spread of field '${field.name}' from '${lowerer.fmt(field.type)}' into '${lowerer.fmt(target.type)}'`);
|
|
2013
|
+
}
|
|
2014
|
+
const write = {
|
|
2015
|
+
kind: "recordSet", obj: destination, shapeId: type.shapeId, field: field.name,
|
|
2016
|
+
value: lowerer.applyWidthLift(lift, raw, target.type, loc), loc,
|
|
2017
|
+
};
|
|
2018
|
+
// Optional declared fields use the established unset convention.
|
|
2019
|
+
// A dyn field, including a present undefined, is a real property;
|
|
2020
|
+
// its checked conversion runs and can overwrite an earlier value.
|
|
2021
|
+
const absent = field.type.kind === "union" ? lowerer.armTag(field.type.unionId, UNDEFINED_T) : -1;
|
|
2022
|
+
if (absent >= 0 && field.type.kind === "union") {
|
|
2023
|
+
body.push({ kind: "if", cond: {
|
|
2024
|
+
kind: "unionIsTag", unionId: field.type.unionId, tag: absent, negated: true, value: raw, type: BOOL, loc,
|
|
2025
|
+
}, then: [write], else_: null, loc });
|
|
2026
|
+
}
|
|
2027
|
+
else
|
|
2028
|
+
body.push(write);
|
|
2029
|
+
}
|
|
2030
|
+
const iv = source.shape ? source.shape.indexValue : DYN;
|
|
2031
|
+
if (iv) {
|
|
2032
|
+
const keysType = arrayOf(STRING);
|
|
2033
|
+
const keys = varRef("keys.0", keysType, loc);
|
|
2034
|
+
const index = varRef("index.0", F64, loc);
|
|
2035
|
+
const name = varRef("key.0", STRING, loc);
|
|
2036
|
+
const value = varRef("value.0", iv, loc);
|
|
2037
|
+
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 });
|
|
2038
|
+
const dispatch = shape.fields.reduceRight((rest, field) => {
|
|
2039
|
+
const write = (value) => ({ kind: "recordSet", obj: destination, shapeId: type.shapeId, field: field.name, value, loc });
|
|
2040
|
+
const converted = conv(iv, field, value);
|
|
2041
|
+
return [{
|
|
2042
|
+
kind: "if",
|
|
2043
|
+
cond: { kind: "strEq", negated: false, left: name, right: { kind: "strLit", value: field.name, type: STRING, loc }, type: BOOL, loc },
|
|
2044
|
+
then: "value" in converted ? [write(converted.value)] : converted.stmts(write),
|
|
2045
|
+
else_: rest.length > 0 ? rest : null, loc,
|
|
2046
|
+
}];
|
|
2047
|
+
}, []);
|
|
2048
|
+
body.push({ kind: "varDecl", localId: "keys.0", init: source.shape
|
|
2049
|
+
? { kind: "recordOvfKeys", obj: receiver, shapeId: source.shapeId, type: keysType, loc }
|
|
2050
|
+
: { kind: "dynCheck", value: { kind: "libCall", fn: "dyn.objKeys", args: [receiver], type: DYN, loc }, type: keysType, loc }, loc }, {
|
|
2051
|
+
kind: "for",
|
|
2052
|
+
init: { kind: "varDecl", localId: "index.0", init: numLit(0, loc), loc },
|
|
2053
|
+
cond: { kind: "bin", op: "<", left: index, right: { kind: "arrIntrinsic", method: "length", receiver: keys, args: [], type: F64, loc }, type: BOOL, loc },
|
|
2054
|
+
update: { kind: "assign", localId: "index.0", value: { kind: "bin", op: "+", left: index, right: numLit(1, loc), type: F64, loc }, loc },
|
|
2055
|
+
body: [
|
|
2056
|
+
{ kind: "varDecl", localId: "key.0", init: { kind: "arrayGet", arr: keys, index, type: STRING, loc }, loc },
|
|
2057
|
+
{ kind: "varDecl", localId: "value.0", init: source.shape
|
|
2058
|
+
? { kind: "recordKeyGet", obj: receiver, shapeId: source.shapeId, key: name, overflowOnly: true, type: iv, loc }
|
|
2059
|
+
: { kind: "dynKeyGet", value: receiver, key: name, type: DYN, loc }, loc },
|
|
2060
|
+
...dispatch,
|
|
2061
|
+
], loc,
|
|
2062
|
+
});
|
|
2063
|
+
}
|
|
2064
|
+
body.push({ kind: "return", value: destination, loc });
|
|
2065
|
+
lowerer.liftedFns.push({
|
|
2066
|
+
name: helper,
|
|
2067
|
+
params: [{ localId: "out.0", name: "out", type }, { localId: "source.0", name: "source", type: sourceType }],
|
|
2068
|
+
returnType: type, locals, body, loc,
|
|
2069
|
+
});
|
|
2070
|
+
// Publish only a fully checked helper: rejected conversions must not
|
|
2071
|
+
// leave an entry that a later literal could reuse without a body.
|
|
2072
|
+
lowerer.widthHelpers.set(key, helper);
|
|
2073
|
+
}
|
|
2074
|
+
stmts.push({ kind: "exprStmt", expr: { kind: "call", callee: helper, args: [outRef, source.value], type, loc }, loc });
|
|
1760
2075
|
}
|
|
1761
|
-
return { kind: "
|
|
2076
|
+
return { kind: "seqExpr", stmts, result: outRef, type, loc };
|
|
1762
2077
|
}
|
|
1763
2078
|
/** The value of a shorthand property (`{ x }`): the binding `x` refers to.
|
|
1764
2079
|
* The property name's own symbol is the PROPERTY, so resolution goes
|
|
@@ -1769,6 +2084,14 @@ export function lowerShorthandValue(lowerer, prop) {
|
|
|
1769
2084
|
const propName = prop.name;
|
|
1770
2085
|
const loc = locOf(propName);
|
|
1771
2086
|
const symbol = lowerer.checker.getShorthandAssignmentValueSymbol(prop);
|
|
2087
|
+
// Import identifiers in shorthand position carry the property's symbol,
|
|
2088
|
+
// so the ordinary identifier expression path cannot resolve them.
|
|
2089
|
+
const builtin = lowerer.builtinImportOf(propName);
|
|
2090
|
+
if (builtin) {
|
|
2091
|
+
const callable = lowerer.lowerBuiltinCallableValue(builtin, loc);
|
|
2092
|
+
if (callable)
|
|
2093
|
+
return callable;
|
|
2094
|
+
}
|
|
1772
2095
|
if (symbol) {
|
|
1773
2096
|
if (lowerer.ctx.selfSymbol === symbol) {
|
|
1774
2097
|
return { kind: "selfRef", type: lowerer.ctx.selfType, loc };
|
|
@@ -1786,7 +2109,7 @@ export function lowerShorthandValue(lowerer, prop) {
|
|
|
1786
2109
|
const sig = lowerer.fnSigsBySymbol.get(resolved);
|
|
1787
2110
|
const decl = lowerer.checker.declarationsOf(resolved)[0];
|
|
1788
2111
|
if (sig && decl && ts.isFunctionDeclaration(decl) &&
|
|
1789
|
-
(ts.isSourceFile(decl.parent) || lowerer.nsBlocks.get(decl.parent) === "flattened")) {
|
|
2112
|
+
(ts.isSourceFile(decl.parent) || (decl.parent !== undefined && lowerer.nsBlocks.get(decl.parent) === "flattened"))) {
|
|
1790
2113
|
lowerer.noteEdge(sig.name);
|
|
1791
2114
|
const funcType = {
|
|
1792
2115
|
kind: "func",
|
|
@@ -1797,17 +2120,20 @@ export function lowerShorthandValue(lowerer, prop) {
|
|
|
1797
2120
|
lowerer.requireExactArityValue(prop, propName, sig.params, funcType);
|
|
1798
2121
|
return { kind: "closure", fnName: sig.name, captures: [], type: funcType, loc };
|
|
1799
2122
|
}
|
|
1800
|
-
|
|
2123
|
+
const generic = lowerer.genericFnsBySymbol.get(resolved);
|
|
2124
|
+
if (generic?.implicitParams)
|
|
2125
|
+
return lowerer.lowerGenericFnValue(propName, generic);
|
|
2126
|
+
if (generic) {
|
|
1801
2127
|
lowerer.unsupported("SC1090", prop, `generic functions as values (call '${propName.text}' directly)`);
|
|
1802
2128
|
}
|
|
1803
2129
|
}
|
|
1804
2130
|
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
2131
|
}
|
|
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). */
|
|
2132
|
+
/** Rejects the method's own receiver, including lexical captures in
|
|
2133
|
+
* arrows. Nested ordinary functions bind their own ambient receiver. */
|
|
1810
2134
|
export function rejectThisInObjectMethod(lowerer, node) {
|
|
2135
|
+
if (ts.isFunctionExpression(node) || ts.isFunctionDeclaration(node) || ts.isMethodDeclaration(node) || ts.isAccessor(node))
|
|
2136
|
+
return;
|
|
1811
2137
|
if (node.kind === ts.SyntaxKind.ThisKeyword) {
|
|
1812
2138
|
lowerer.unsupported("SC1090", node, "references to 'this' in object literal methods");
|
|
1813
2139
|
}
|