@scriptc/compiler 0.4.3 → 0.4.5
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 +270 -72
- package/ambient/scriptc-overrides.d.ts +21 -0
- package/dist/backend/executable-features.js +3 -0
- package/dist/backend/executable-features.js.map +1 -1
- package/dist/backend/library-pack.js +2 -1
- package/dist/backend/library-pack.js.map +1 -1
- package/dist/backend/linker.js +11 -1
- package/dist/backend/linker.js.map +1 -1
- package/dist/backend/lld.d.ts +9 -0
- package/dist/backend/lld.js +48 -0
- package/dist/backend/lld.js.map +1 -0
- package/dist/backend/lld.test.d.ts +1 -0
- package/dist/backend/lld.test.js +53 -0
- package/dist/backend/lld.test.js.map +1 -0
- package/dist/backend/llvm/appended-array-literals.d.ts +11 -1
- package/dist/backend/llvm/appended-array-literals.js +29 -0
- package/dist/backend/llvm/appended-array-literals.js.map +1 -1
- package/dist/backend/llvm/blocks.js +10 -1
- package/dist/backend/llvm/blocks.js.map +1 -1
- package/dist/backend/llvm/bytes-alias.d.ts +13 -4
- package/dist/backend/llvm/bytes-alias.js +16 -5
- package/dist/backend/llvm/bytes-alias.js.map +1 -1
- package/dist/backend/llvm/bytes-bounds.d.ts +5 -1
- package/dist/backend/llvm/bytes-bounds.js +199 -2
- package/dist/backend/llvm/bytes-bounds.js.map +1 -1
- package/dist/backend/llvm/bytes-loop-versions.d.ts +45 -3
- package/dist/backend/llvm/bytes-loop-versions.js +244 -20
- package/dist/backend/llvm/bytes-loop-versions.js.map +1 -1
- package/dist/backend/llvm/bytes-loop-versions.test.js +18 -6
- package/dist/backend/llvm/bytes-loop-versions.test.js.map +1 -1
- package/dist/backend/llvm/call-lifetimes.d.ts +8 -2
- package/dist/backend/llvm/call-lifetimes.js +87 -18
- package/dist/backend/llvm/call-lifetimes.js.map +1 -1
- package/dist/backend/llvm/call-lifetimes.test.js +132 -0
- package/dist/backend/llvm/call-lifetimes.test.js.map +1 -1
- package/dist/backend/llvm/classes.d.ts +3 -2
- package/dist/backend/llvm/classes.js +4 -4
- package/dist/backend/llvm/classes.js.map +1 -1
- package/dist/backend/llvm/counted-loops.d.ts +14 -2
- package/dist/backend/llvm/counted-loops.js +54 -5
- package/dist/backend/llvm/counted-loops.js.map +1 -1
- package/dist/backend/llvm/debug-info.d.ts +42 -1
- package/dist/backend/llvm/debug-info.js +72 -6
- package/dist/backend/llvm/debug-info.js.map +1 -1
- package/dist/backend/llvm/dense-array-loops.js +2 -2
- package/dist/backend/llvm/dense-array-loops.js.map +1 -1
- package/dist/backend/llvm/dense-array-loops.test.js +1 -0
- package/dist/backend/llvm/dense-array-loops.test.js.map +1 -1
- package/dist/backend/llvm/dyn.d.ts +69 -8
- package/dist/backend/llvm/dyn.js +396 -49
- package/dist/backend/llvm/dyn.js.map +1 -1
- package/dist/backend/llvm/emit-function.js +30 -16
- package/dist/backend/llvm/emit-function.js.map +1 -1
- package/dist/backend/llvm/emit-journal.d.ts +8 -4
- package/dist/backend/llvm/emit-journal.js +75 -5
- package/dist/backend/llvm/emit-journal.js.map +1 -1
- package/dist/backend/llvm/emit-module.d.ts +4 -0
- package/dist/backend/llvm/emit-module.js +74 -29
- package/dist/backend/llvm/emit-module.js.map +1 -1
- package/dist/backend/llvm/emit-statements.js +297 -28
- package/dist/backend/llvm/emit-statements.js.map +1 -1
- package/dist/backend/llvm/emitter.d.ts +144 -13
- package/dist/backend/llvm/emitter.js +523 -92
- package/dist/backend/llvm/emitter.js.map +1 -1
- package/dist/backend/llvm/emitter.test.js +11 -2
- package/dist/backend/llvm/emitter.test.js.map +1 -1
- package/dist/backend/llvm/expr-async.js +11 -13
- package/dist/backend/llvm/expr-async.js.map +1 -1
- package/dist/backend/llvm/expr-bytes.d.ts +6 -4
- package/dist/backend/llvm/expr-bytes.js +45 -16
- package/dist/backend/llvm/expr-bytes.js.map +1 -1
- package/dist/backend/llvm/expr-calls.js +13 -11
- package/dist/backend/llvm/expr-calls.js.map +1 -1
- package/dist/backend/llvm/expr-containers.d.ts +11 -0
- package/dist/backend/llvm/expr-containers.js +101 -9
- package/dist/backend/llvm/expr-containers.js.map +1 -1
- package/dist/backend/llvm/expr-context.d.ts +3 -0
- package/dist/backend/llvm/expr-control.js +83 -0
- package/dist/backend/llvm/expr-control.js.map +1 -1
- package/dist/backend/llvm/expr-dynamic.d.ts +1 -1
- package/dist/backend/llvm/expr-dynamic.js +22 -4
- package/dist/backend/llvm/expr-dynamic.js.map +1 -1
- package/dist/backend/llvm/expr-primitives.js +121 -14
- package/dist/backend/llvm/expr-primitives.js.map +1 -1
- package/dist/backend/llvm/expr-stream-bridges.js +111 -26
- package/dist/backend/llvm/expr-stream-bridges.js.map +1 -1
- package/dist/backend/llvm/forked-analysis.d.ts +8 -0
- package/dist/backend/llvm/forked-analysis.js +43 -0
- package/dist/backend/llvm/forked-analysis.js.map +1 -0
- package/dist/backend/llvm/integer-values.d.ts +12 -0
- package/dist/backend/llvm/integer-values.js +69 -5
- package/dist/backend/llvm/integer-values.js.map +1 -1
- package/dist/backend/llvm/integer-views.d.ts +2 -1
- package/dist/backend/llvm/integer-views.js +12 -1
- package/dist/backend/llvm/integer-views.js.map +1 -1
- package/dist/backend/llvm/js-ic.d.ts +4 -0
- package/dist/backend/llvm/js-ic.js +133 -15
- package/dist/backend/llvm/js-ic.js.map +1 -1
- package/dist/backend/llvm/layouts.d.ts +1 -0
- package/dist/backend/llvm/layouts.js.map +1 -1
- package/dist/backend/llvm/lazy-captures.d.ts +6 -1
- package/dist/backend/llvm/lazy-captures.js +10 -5
- package/dist/backend/llvm/lazy-captures.js.map +1 -1
- package/dist/backend/llvm/lib-abi.d.ts +5 -0
- package/dist/backend/llvm/lib-abi.js +19 -0
- package/dist/backend/llvm/lib-abi.js.map +1 -1
- package/dist/backend/llvm/lib-dispatch.js +249 -33
- package/dist/backend/llvm/lib-dispatch.js.map +1 -1
- package/dist/backend/llvm/lib-filesystem.d.ts +10 -0
- package/dist/backend/llvm/lib-filesystem.js +32 -0
- package/dist/backend/llvm/lib-filesystem.js.map +1 -1
- package/dist/backend/llvm/lib-http2.js +2 -2
- package/dist/backend/llvm/lib-http2.js.map +1 -1
- package/dist/backend/llvm/lib-network.js +2 -0
- package/dist/backend/llvm/lib-network.js.map +1 -1
- package/dist/backend/llvm/lib-process.js +48 -1
- package/dist/backend/llvm/lib-process.js.map +1 -1
- package/dist/backend/llvm/lib-shared.js +64 -0
- package/dist/backend/llvm/lib-shared.js.map +1 -1
- package/dist/backend/llvm/lib-tls.js +28 -3
- package/dist/backend/llvm/lib-tls.js.map +1 -1
- package/dist/backend/llvm/local-union-storage.test.js +2 -1
- package/dist/backend/llvm/local-union-storage.test.js.map +1 -1
- package/dist/backend/llvm/loop-array-borrows.d.ts +4 -1
- package/dist/backend/llvm/loop-array-borrows.js +11 -5
- package/dist/backend/llvm/loop-array-borrows.js.map +1 -1
- package/dist/backend/llvm/map-entry-fusion.d.ts +5 -3
- package/dist/backend/llvm/map-entry-fusion.js +20 -11
- package/dist/backend/llvm/map-entry-fusion.js.map +1 -1
- package/dist/backend/llvm/map-entry-fusion.test.js +14 -6
- package/dist/backend/llvm/map-entry-fusion.test.js.map +1 -1
- package/dist/backend/llvm/map-number-lookup.d.ts +16 -6
- package/dist/backend/llvm/map-number-lookup.js +41 -9
- package/dist/backend/llvm/map-number-lookup.js.map +1 -1
- package/dist/backend/llvm/map-number-lookup.test.js +70 -2
- package/dist/backend/llvm/map-number-lookup.test.js.map +1 -1
- package/dist/backend/llvm/map-read-lifetimes.d.ts +25 -2
- package/dist/backend/llvm/map-read-lifetimes.js +136 -6
- package/dist/backend/llvm/map-read-lifetimes.js.map +1 -1
- package/dist/backend/llvm/map-read-lifetimes.test.js +8 -3
- package/dist/backend/llvm/map-read-lifetimes.test.js.map +1 -1
- package/dist/backend/llvm/nullable-unions.d.ts +5 -0
- package/dist/backend/llvm/nullable-unions.js +29 -2
- package/dist/backend/llvm/nullable-unions.js.map +1 -1
- package/dist/backend/llvm/nullable-unions.test.js +25 -1
- package/dist/backend/llvm/nullable-unions.test.js.map +1 -1
- package/dist/backend/llvm/publish.js +3 -3
- package/dist/backend/llvm/publish.js.map +1 -1
- package/dist/backend/llvm/record-union-keys.test.d.ts +1 -0
- package/dist/backend/llvm/record-union-keys.test.js +161 -0
- package/dist/backend/llvm/record-union-keys.test.js.map +1 -0
- package/dist/backend/llvm/reference-effects.js +3 -0
- package/dist/backend/llvm/reference-effects.js.map +1 -1
- package/dist/backend/llvm/serialized-ir-emission.test.js +2 -0
- package/dist/backend/llvm/serialized-ir-emission.test.js.map +1 -1
- package/dist/backend/llvm/shapes.d.ts +4 -5
- package/dist/backend/llvm/shapes.js +106 -58
- package/dist/backend/llvm/shapes.js.map +1 -1
- package/dist/backend/llvm/shapes.test.js +14 -2
- package/dist/backend/llvm/shapes.test.js.map +1 -1
- package/dist/backend/llvm/speculative-integers.d.ts +50 -3
- package/dist/backend/llvm/speculative-integers.js +411 -24
- package/dist/backend/llvm/speculative-integers.js.map +1 -1
- package/dist/backend/llvm/speculative-integers.test.js +103 -1
- package/dist/backend/llvm/speculative-integers.test.js.map +1 -1
- package/dist/backend/llvm/split.d.ts +10 -1
- package/dist/backend/llvm/split.js +243 -59
- package/dist/backend/llvm/split.js.map +1 -1
- package/dist/backend/llvm/split.test.js +92 -13
- package/dist/backend/llvm/split.test.js.map +1 -1
- package/dist/backend/llvm/stack-captures.js +1 -5
- package/dist/backend/llvm/stack-captures.js.map +1 -1
- package/dist/backend/llvm/stack-objects.test.js +3 -2
- package/dist/backend/llvm/stack-objects.test.js.map +1 -1
- package/dist/backend/llvm/string-lifetimes.test.js +1 -1
- package/dist/backend/llvm/string-lifetimes.test.js.map +1 -1
- package/dist/backend/llvm/string-reads.d.ts +13 -0
- package/dist/backend/llvm/string-reads.js +22 -0
- package/dist/backend/llvm/string-reads.js.map +1 -1
- package/dist/backend/llvm/string-slices.d.ts +36 -2
- package/dist/backend/llvm/string-slices.js +308 -12
- package/dist/backend/llvm/string-slices.js.map +1 -1
- package/dist/backend/llvm/string-slices.test.js +182 -3
- package/dist/backend/llvm/string-slices.test.js.map +1 -1
- package/dist/backend/llvm/string-unit-versions.d.ts +11 -0
- package/dist/backend/llvm/string-unit-versions.js +191 -0
- package/dist/backend/llvm/string-unit-versions.js.map +1 -0
- package/dist/backend/llvm/string-unit-versions.test.d.ts +1 -0
- package/dist/backend/llvm/string-unit-versions.test.js +117 -0
- package/dist/backend/llvm/string-unit-versions.test.js.map +1 -0
- package/dist/backend/llvm/test-boxed-unions.d.ts +5 -2
- package/dist/backend/llvm/test-boxed-unions.js +24 -8
- package/dist/backend/llvm/test-boxed-unions.js.map +1 -1
- package/dist/backend/llvm/union-repr.d.ts +4 -3
- package/dist/backend/llvm/union-repr.js +6 -5
- package/dist/backend/llvm/union-repr.js.map +1 -1
- package/dist/backend/llvm/unwind-abi.d.ts +52 -0
- package/dist/backend/llvm/unwind-abi.js +498 -0
- package/dist/backend/llvm/unwind-abi.js.map +1 -0
- package/dist/backend/llvm/unwind-abi.test.d.ts +1 -0
- package/dist/backend/llvm/unwind-abi.test.js +255 -0
- package/dist/backend/llvm/unwind-abi.test.js.map +1 -0
- package/dist/backend/llvm/walkers.js +13 -0
- package/dist/backend/llvm/walkers.js.map +1 -1
- package/dist/backend/llvm/wrapping-sums.d.ts +14 -10
- package/dist/backend/llvm/wrapping-sums.js +31 -14
- package/dist/backend/llvm/wrapping-sums.js.map +1 -1
- package/dist/backend/loop-polls.d.ts +6 -0
- package/dist/backend/loop-polls.js +24 -0
- package/dist/backend/loop-polls.js.map +1 -1
- package/dist/backend/may-throw.js +8 -8
- package/dist/backend/may-throw.js.map +1 -1
- package/dist/backend/native/contracts.d.ts +12 -2
- package/dist/backend/native/executable.js +48 -6
- package/dist/backend/native/executable.js.map +1 -1
- package/dist/backend/native/library.js +4 -3
- package/dist/backend/native/library.js.map +1 -1
- package/dist/backend/native/program-shards.d.ts +2 -2
- package/dist/backend/native/program-shards.js +2 -2
- package/dist/backend/native/program-shards.js.map +1 -1
- package/dist/backend/native/runtime-inputs.d.ts +1 -1
- package/dist/backend/native/runtime-inputs.js +4 -1
- package/dist/backend/native/runtime-inputs.js.map +1 -1
- package/dist/backend/native/vendor.d.ts +1 -1
- package/dist/backend/native/vendor.js +1 -1
- package/dist/backend/native/vendor.js.map +1 -1
- package/dist/backend/native-codegen-core.d.ts +5 -3
- package/dist/backend/native-codegen-core.js +13 -6
- package/dist/backend/native-codegen-core.js.map +1 -1
- package/dist/backend/native-codegen.d.ts +3 -1
- package/dist/backend/native-codegen.js +4 -3
- package/dist/backend/native-codegen.js.map +1 -1
- package/dist/backend/native-codegen.test.js +6 -4
- package/dist/backend/native-codegen.test.js.map +1 -1
- package/dist/backend/native-link-info-core.d.ts +8 -0
- package/dist/backend/native-link-info-core.js.map +1 -1
- package/dist/backend/native-profile.d.ts +14 -0
- package/dist/backend/native-profile.js +28 -0
- package/dist/backend/native-profile.js.map +1 -1
- package/dist/backend/native-profile.test.js +8 -1
- package/dist/backend/native-profile.test.js.map +1 -1
- package/dist/backend/native-toolchain.test.js +11 -11
- package/dist/backend/native-toolchain.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 +3 -1
- package/dist/backend/runtime-pack-core.js +2 -0
- package/dist/backend/runtime-pack-core.js.map +1 -1
- package/dist/backend/runtime-pack-native.d.ts +17 -5
- package/dist/backend/runtime-pack-native.js +186 -14
- package/dist/backend/runtime-pack-native.js.map +1 -1
- package/dist/backend/runtime-pack-native.test.js +160 -3
- package/dist/backend/runtime-pack-native.test.js.map +1 -1
- package/dist/backend/runtime-pack-targets.test.js +2 -1
- package/dist/backend/runtime-pack-targets.test.js.map +1 -1
- package/dist/backend/runtime-pack.test.js +2 -1
- package/dist/backend/runtime-pack.test.js.map +1 -1
- package/dist/backend/target-cpu.d.ts +26 -0
- package/dist/backend/target-cpu.js +98 -0
- package/dist/backend/target-cpu.js.map +1 -0
- package/dist/backend/target-cpu.test.d.ts +1 -0
- package/dist/backend/target-cpu.test.js +38 -0
- package/dist/backend/target-cpu.test.js.map +1 -0
- package/dist/backend/vendor-archives.d.ts +4 -1
- package/dist/backend/vendor-archives.js +78 -4
- package/dist/backend/vendor-archives.js.map +1 -1
- package/dist/backend/vendor-inputs.d.ts +3 -1
- package/dist/backend/vendor-inputs.js +3 -1
- package/dist/backend/vendor-inputs.js.map +1 -1
- package/dist/backend/warm-cache.js +1 -0
- package/dist/backend/warm-cache.js.map +1 -1
- package/dist/cli/command.js +98 -12
- package/dist/cli/command.js.map +1 -1
- package/dist/cli/usage.d.ts +25 -1
- package/dist/cli/usage.js +40 -3
- package/dist/cli/usage.js.map +1 -1
- package/dist/compat/fetch-profile.d.ts +15 -6
- package/dist/compat/fetch-profile.js +519 -498
- package/dist/compat/fetch-profile.js.map +1 -1
- package/dist/compile-types.d.ts +14 -0
- package/dist/contracts/int32-elements.js +2 -1
- package/dist/contracts/int32-elements.js.map +1 -1
- package/dist/coverage/report.d.ts +14 -3
- package/dist/coverage/report.js +216 -0
- package/dist/coverage/report.js.map +1 -1
- package/dist/coverage/surface-manifest.js +25 -25
- package/dist/coverage/surface-manifest.js.map +1 -1
- package/dist/coverage/verdict-cache.d.ts +2 -0
- package/dist/coverage/verdict-cache.js +10 -1
- package/dist/coverage/verdict-cache.js.map +1 -1
- package/dist/diagnostics/diagnostic.d.ts +19 -0
- package/dist/diagnostics/diagnostic.js +53 -2
- package/dist/diagnostics/diagnostic.js.map +1 -1
- package/dist/diagnostics/envelope.d.ts +54 -0
- package/dist/diagnostics/envelope.js +7 -1
- package/dist/diagnostics/envelope.js.map +1 -1
- package/dist/diagnostics/render.d.ts +7 -0
- package/dist/diagnostics/render.js +15 -4
- package/dist/diagnostics/render.js.map +1 -1
- package/dist/executable/executable-cache.d.ts +6 -0
- package/dist/executable/executable-cache.js +5 -0
- package/dist/executable/executable-cache.js.map +1 -1
- package/dist/executable/executable-cache.test.js +3 -0
- package/dist/executable/executable-cache.test.js.map +1 -1
- package/dist/executable/prepare.js +5 -1
- package/dist/executable/prepare.js.map +1 -1
- package/dist/frontend/analysis.js +26 -2
- package/dist/frontend/analysis.js.map +1 -1
- package/dist/frontend/decl-projection.js +105 -10
- package/dist/frontend/decl-projection.js.map +1 -1
- package/dist/frontend/fork-target.js +67 -1
- package/dist/frontend/fork-target.js.map +1 -1
- package/dist/frontend/fork-target.test.js +43 -0
- package/dist/frontend/fork-target.test.js.map +1 -1
- package/dist/frontend/input-tracker.d.ts +4 -1
- package/dist/frontend/input-tracker.js +42 -4
- package/dist/frontend/input-tracker.js.map +1 -1
- package/dist/frontend/input-tracker.test.js +45 -0
- package/dist/frontend/input-tracker.test.js.map +1 -1
- package/dist/frontend/lowering/abstract-equality.js +38 -1
- package/dist/frontend/lowering/abstract-equality.js.map +1 -1
- package/dist/frontend/lowering/argument-counts.d.ts +36 -0
- package/dist/frontend/lowering/argument-counts.js +201 -0
- package/dist/frontend/lowering/argument-counts.js.map +1 -0
- package/dist/frontend/lowering/array-values.d.ts +27 -0
- package/dist/frontend/lowering/array-values.js +112 -0
- package/dist/frontend/lowering/array-values.js.map +1 -1
- package/dist/frontend/lowering/binding-analysis.d.ts +3 -0
- package/dist/frontend/lowering/binding-analysis.js +9 -3
- package/dist/frontend/lowering/binding-analysis.js.map +1 -1
- package/dist/frontend/lowering/builtin-namespaces.d.ts +13 -0
- package/dist/frontend/lowering/builtin-namespaces.js +238 -0
- package/dist/frontend/lowering/builtin-namespaces.js.map +1 -0
- package/dist/frontend/lowering/builtins/async-context.d.ts +8 -2
- package/dist/frontend/lowering/builtins/async-context.js +62 -3
- package/dist/frontend/lowering/builtins/async-context.js.map +1 -1
- package/dist/frontend/lowering/builtins/compression.d.ts +4 -3
- package/dist/frontend/lowering/builtins/compression.js +86 -5
- package/dist/frontend/lowering/builtins/compression.js.map +1 -1
- package/dist/frontend/lowering/builtins/crypto.js +3 -1
- package/dist/frontend/lowering/builtins/crypto.js.map +1 -1
- package/dist/frontend/lowering/builtins/date-classes.js +17 -1
- package/dist/frontend/lowering/builtins/date-classes.js.map +1 -1
- package/dist/frontend/lowering/builtins/dates.d.ts +19 -5
- package/dist/frontend/lowering/builtins/dates.js +163 -9
- package/dist/frontend/lowering/builtins/dates.js.map +1 -1
- package/dist/frontend/lowering/builtins/filesystem-calls.js +29 -4
- package/dist/frontend/lowering/builtins/filesystem-calls.js.map +1 -1
- package/dist/frontend/lowering/builtins/fs-glob.js +6 -3
- package/dist/frontend/lowering/builtins/fs-glob.js.map +1 -1
- package/dist/frontend/lowering/builtins/fs-paths.d.ts +43 -5
- package/dist/frontend/lowering/builtins/fs-paths.js +245 -93
- package/dist/frontend/lowering/builtins/fs-paths.js.map +1 -1
- package/dist/frontend/lowering/builtins/fs-streams.d.ts +4 -0
- package/dist/frontend/lowering/builtins/fs-streams.js +24 -1
- package/dist/frontend/lowering/builtins/fs-streams.js.map +1 -1
- package/dist/frontend/lowering/builtins/json.d.ts +4 -1
- package/dist/frontend/lowering/builtins/json.js +9 -3
- package/dist/frontend/lowering/builtins/json.js.map +1 -1
- package/dist/frontend/lowering/builtins/module-bindings.d.ts +6 -0
- package/dist/frontend/lowering/builtins/module-bindings.js +23 -1
- package/dist/frontend/lowering/builtins/module-bindings.js.map +1 -1
- package/dist/frontend/lowering/builtins/module-calls.js +6 -3
- package/dist/frontend/lowering/builtins/module-calls.js.map +1 -1
- package/dist/frontend/lowering/builtins/module-resolution.d.ts +5 -0
- package/dist/frontend/lowering/builtins/module-resolution.js +95 -4
- package/dist/frontend/lowering/builtins/module-resolution.js.map +1 -1
- package/dist/frontend/lowering/builtins/promises.d.ts +1 -1
- package/dist/frontend/lowering/builtins/promises.js +293 -139
- package/dist/frontend/lowering/builtins/promises.js.map +1 -1
- package/dist/frontend/lowering/builtins/readline.d.ts +5 -1
- package/dist/frontend/lowering/builtins/readline.js +22 -11
- package/dist/frontend/lowering/builtins/readline.js.map +1 -1
- package/dist/frontend/lowering/builtins/reflection.d.ts +4 -1
- package/dist/frontend/lowering/builtins/reflection.js +41 -1
- package/dist/frontend/lowering/builtins/reflection.js.map +1 -1
- package/dist/frontend/lowering/builtins/text-codecs.js +31 -2
- package/dist/frontend/lowering/builtins/text-codecs.js.map +1 -1
- package/dist/frontend/lowering/builtins/webassembly.js +4 -1
- package/dist/frontend/lowering/builtins/webassembly.js.map +1 -1
- package/dist/frontend/lowering/builtins/x509.d.ts +33 -0
- package/dist/frontend/lowering/builtins/x509.js +431 -0
- package/dist/frontend/lowering/builtins/x509.js.map +1 -0
- package/dist/frontend/lowering/call-arguments.js +44 -0
- package/dist/frontend/lowering/call-arguments.js.map +1 -1
- package/dist/frontend/lowering/call-signatures.js +1 -2
- package/dist/frontend/lowering/call-signatures.js.map +1 -1
- package/dist/frontend/lowering/cjs-exports-object.js +1 -1
- package/dist/frontend/lowering/cjs-exports-object.js.map +1 -1
- package/dist/frontend/lowering/cjs-inline-require.d.ts +32 -0
- package/dist/frontend/lowering/cjs-inline-require.js +308 -5
- package/dist/frontend/lowering/cjs-inline-require.js.map +1 -1
- package/dist/frontend/lowering/class-attributes.d.ts +7 -0
- package/dist/frontend/lowering/class-attributes.js +52 -10
- package/dist/frontend/lowering/class-attributes.js.map +1 -1
- package/dist/frontend/lowering/class-dynamic-dispatch.d.ts +23 -0
- package/dist/frontend/lowering/class-dynamic-dispatch.js +288 -9
- package/dist/frontend/lowering/class-dynamic-dispatch.js.map +1 -1
- package/dist/frontend/lowering/class-method-mutations.js +97 -26
- package/dist/frontend/lowering/class-method-mutations.js.map +1 -1
- package/dist/frontend/lowering/class-method-values.js +71 -1
- package/dist/frontend/lowering/class-method-values.js.map +1 -1
- package/dist/frontend/lowering/class-protocols.d.ts +25 -0
- package/dist/frontend/lowering/class-protocols.js +183 -1
- package/dist/frontend/lowering/class-protocols.js.map +1 -1
- package/dist/frontend/lowering/class-prototypes.d.ts +8 -0
- package/dist/frontend/lowering/class-prototypes.js +83 -2
- package/dist/frontend/lowering/class-prototypes.js.map +1 -1
- package/dist/frontend/lowering/class-to-primitive.d.ts +5 -0
- package/dist/frontend/lowering/class-to-primitive.js +79 -7
- package/dist/frontend/lowering/class-to-primitive.js.map +1 -1
- package/dist/frontend/lowering/coercions/state.d.ts +1 -0
- package/dist/frontend/lowering/coercions/state.js.map +1 -1
- package/dist/frontend/lowering/coercions/structural.js +89 -10
- package/dist/frontend/lowering/coercions/structural.js.map +1 -1
- package/dist/frontend/lowering/coercions/unions.d.ts +4 -2
- package/dist/frontend/lowering/coercions/unions.js +13 -6
- package/dist/frontend/lowering/coercions/unions.js.map +1 -1
- package/dist/frontend/lowering/completion-callbacks.d.ts +4 -0
- package/dist/frontend/lowering/completion-callbacks.js +146 -0
- package/dist/frontend/lowering/completion-callbacks.js.map +1 -0
- package/dist/frontend/lowering/containers/array-callbacks.d.ts +5 -4
- package/dist/frontend/lowering/containers/array-callbacks.js +58 -21
- package/dist/frontend/lowering/containers/array-callbacks.js.map +1 -1
- package/dist/frontend/lowering/containers/array-construction.d.ts +4 -1
- package/dist/frontend/lowering/containers/array-construction.js +107 -9
- package/dist/frontend/lowering/containers/array-construction.js.map +1 -1
- package/dist/frontend/lowering/containers/array-methods.js +96 -8
- package/dist/frontend/lowering/containers/array-methods.js.map +1 -1
- package/dist/frontend/lowering/containers/array-pipelines.js +346 -77
- package/dist/frontend/lowering/containers/array-pipelines.js.map +1 -1
- package/dist/frontend/lowering/containers/bytes.d.ts +25 -17
- package/dist/frontend/lowering/containers/bytes.js +453 -45
- package/dist/frontend/lowering/containers/bytes.js.map +1 -1
- package/dist/frontend/lowering/containers/callback-arguments.js +11 -1
- package/dist/frontend/lowering/containers/callback-arguments.js.map +1 -1
- package/dist/frontend/lowering/containers/collection-methods.js +12 -0
- package/dist/frontend/lowering/containers/collection-methods.js.map +1 -1
- package/dist/frontend/lowering/containers/indexed-objects.js +73 -25
- package/dist/frontend/lowering/containers/indexed-objects.js.map +1 -1
- package/dist/frontend/lowering/containers/iterator-helpers.d.ts +4 -4
- package/dist/frontend/lowering/containers/iterator-helpers.js +8 -2
- package/dist/frontend/lowering/containers/iterator-helpers.js.map +1 -1
- package/dist/frontend/lowering/containers/replacer-params.d.ts +37 -0
- package/dist/frontend/lowering/containers/replacer-params.js +294 -0
- package/dist/frontend/lowering/containers/replacer-params.js.map +1 -0
- package/dist/frontend/lowering/containers/replacer-params.test.d.ts +1 -0
- package/dist/frontend/lowering/containers/replacer-params.test.js +61 -0
- package/dist/frontend/lowering/containers/replacer-params.test.js.map +1 -0
- package/dist/frontend/lowering/containers/string-and-regexp.js +2 -1
- package/dist/frontend/lowering/containers/string-and-regexp.js.map +1 -1
- package/dist/frontend/lowering/containers/string-replacement.js +7 -3
- package/dist/frontend/lowering/containers/string-replacement.js.map +1 -1
- package/dist/frontend/lowering/cycle-initialization.d.ts +4 -2
- package/dist/frontend/lowering/cycle-initialization.js +4 -1
- package/dist/frontend/lowering/cycle-initialization.js.map +1 -1
- package/dist/frontend/lowering/date-values.d.ts +14 -0
- package/dist/frontend/lowering/date-values.js +254 -0
- package/dist/frontend/lowering/date-values.js.map +1 -0
- package/dist/frontend/lowering/deferred-module-initializers.js +16 -8
- package/dist/frontend/lowering/deferred-module-initializers.js.map +1 -1
- package/dist/frontend/lowering/deferred-module-initializers.test.js +22 -6
- package/dist/frontend/lowering/deferred-module-initializers.test.js.map +1 -1
- package/dist/frontend/lowering/dispatch-sites.js +1 -0
- package/dist/frontend/lowering/dispatch-sites.js.map +1 -1
- package/dist/frontend/lowering/expressions/array-literals.d.ts +0 -8
- package/dist/frontend/lowering/expressions/array-literals.js +125 -26
- package/dist/frontend/lowering/expressions/array-literals.js.map +1 -1
- package/dist/frontend/lowering/expressions/binary.js +102 -26
- package/dist/frontend/lowering/expressions/binary.js.map +1 -1
- package/dist/frontend/lowering/expressions/element-access.js +129 -6
- package/dist/frontend/lowering/expressions/element-access.js.map +1 -1
- package/dist/frontend/lowering/expressions/identifiers.js +66 -4
- package/dist/frontend/lowering/expressions/identifiers.js.map +1 -1
- package/dist/frontend/lowering/expressions/narrowing.d.ts +2 -1
- package/dist/frontend/lowering/expressions/narrowing.js +8 -1
- package/dist/frontend/lowering/expressions/narrowing.js.map +1 -1
- package/dist/frontend/lowering/expressions/object-literals.js +8 -2
- package/dist/frontend/lowering/expressions/object-literals.js.map +1 -1
- package/dist/frontend/lowering/expressions/property-access.js +121 -34
- package/dist/frontend/lowering/expressions/property-access.js.map +1 -1
- package/dist/frontend/lowering/expressions/relational.js +76 -11
- package/dist/frontend/lowering/expressions/relational.js.map +1 -1
- package/dist/frontend/lowering/expressions/typeof.js +12 -1
- package/dist/frontend/lowering/expressions/typeof.js.map +1 -1
- package/dist/frontend/lowering/expressions/updates.js +37 -11
- package/dist/frontend/lowering/expressions/updates.js.map +1 -1
- package/dist/frontend/lowering/f64-handles.d.ts +8 -0
- package/dist/frontend/lowering/f64-handles.js +16 -0
- package/dist/frontend/lowering/f64-handles.js.map +1 -0
- package/dist/frontend/lowering/frozen-records.d.ts +5 -0
- package/dist/frontend/lowering/frozen-records.js +12 -4
- package/dist/frontend/lowering/frozen-records.js.map +1 -1
- package/dist/frontend/lowering/function-context.d.ts +3 -0
- package/dist/frontend/lowering/function-context.js.map +1 -1
- package/dist/frontend/lowering/function-returns.js +30 -0
- package/dist/frontend/lowering/function-returns.js.map +1 -1
- package/dist/frontend/lowering/generic-functions.js +17 -6
- package/dist/frontend/lowering/generic-functions.js.map +1 -1
- package/dist/frontend/lowering/indexed-unions.d.ts +54 -0
- package/dist/frontend/lowering/indexed-unions.js +401 -0
- package/dist/frontend/lowering/indexed-unions.js.map +1 -0
- package/dist/frontend/lowering/instantiation-path.d.ts +3 -2
- package/dist/frontend/lowering/instantiation-path.js.map +1 -1
- package/dist/frontend/lowering/instantiation-path.test.js +6 -4
- package/dist/frontend/lowering/instantiation-path.test.js.map +1 -1
- package/dist/frontend/lowering/iterator-adapters.d.ts +4 -2
- package/dist/frontend/lowering/iterator-adapters.js +26 -33
- package/dist/frontend/lowering/iterator-adapters.js.map +1 -1
- package/dist/frontend/lowering/js-collection-types.d.ts +11 -0
- package/dist/frontend/lowering/js-collection-types.js +490 -0
- package/dist/frontend/lowering/js-collection-types.js.map +1 -0
- package/dist/frontend/lowering/key-order-witness.js +210 -32
- package/dist/frontend/lowering/key-order-witness.js.map +1 -1
- package/dist/frontend/lowering/key-order-witness.test.js +104 -4
- package/dist/frontend/lowering/key-order-witness.test.js.map +1 -1
- package/dist/frontend/lowering/lib-boundary.js +2 -2
- package/dist/frontend/lowering/lib-boundary.js.map +1 -1
- package/dist/frontend/lowering/lower-assert.d.ts +14 -0
- package/dist/frontend/lowering/lower-assert.js +298 -29
- package/dist/frontend/lowering/lower-assert.js.map +1 -1
- package/dist/frontend/lowering/lower-builtin-values.js +3 -3
- package/dist/frontend/lowering/lower-builtin-values.js.map +1 -1
- package/dist/frontend/lowering/lower-calls.js +116 -10
- package/dist/frontend/lowering/lower-calls.js.map +1 -1
- package/dist/frontend/lowering/lower-classes.d.ts +59 -7
- package/dist/frontend/lowering/lower-classes.js +668 -222
- package/dist/frontend/lowering/lower-classes.js.map +1 -1
- package/dist/frontend/lowering/lower-console.js +2 -1
- package/dist/frontend/lowering/lower-console.js.map +1 -1
- package/dist/frontend/lowering/lower-exprs.d.ts +5 -0
- package/dist/frontend/lowering/lower-exprs.js +254 -3
- package/dist/frontend/lowering/lower-exprs.js.map +1 -1
- package/dist/frontend/lowering/lower-functions.js +7 -0
- package/dist/frontend/lowering/lower-functions.js.map +1 -1
- package/dist/frontend/lowering/lower-generators.js +5 -4
- package/dist/frontend/lowering/lower-generators.js.map +1 -1
- package/dist/frontend/lowering/lower-inspect.d.ts +1 -1
- package/dist/frontend/lowering/lower-inspect.js +299 -57
- package/dist/frontend/lowering/lower-inspect.js.map +1 -1
- package/dist/frontend/lowering/lower-modules.js +49 -22
- package/dist/frontend/lowering/lower-modules.js.map +1 -1
- package/dist/frontend/lowering/lower-namespaces.d.ts +3 -0
- package/dist/frontend/lowering/lower-namespaces.js +44 -1
- package/dist/frontend/lowering/lower-namespaces.js.map +1 -1
- package/dist/frontend/lowering/lower-node-module.js +1 -1
- package/dist/frontend/lowering/lower-node-module.js.map +1 -1
- package/dist/frontend/lowering/lower-server.js +126 -32
- package/dist/frontend/lowering/lower-server.js.map +1 -1
- package/dist/frontend/lowering/lower-stdlib.d.ts +4 -1
- package/dist/frontend/lowering/lower-stdlib.js +51 -37
- package/dist/frontend/lowering/lower-stdlib.js.map +1 -1
- package/dist/frontend/lowering/lower-stmts.js +393 -79
- package/dist/frontend/lowering/lower-stmts.js.map +1 -1
- package/dist/frontend/lowering/lower-stream.js +515 -121
- package/dist/frontend/lowering/lower-stream.js.map +1 -1
- package/dist/frontend/lowering/lowerer.d.ts +82 -12
- package/dist/frontend/lowering/lowerer.js +317 -44
- package/dist/frontend/lowering/lowerer.js.map +1 -1
- package/dist/frontend/lowering/lowerer.test.js +1 -1
- package/dist/frontend/lowering/lowerer.test.js.map +1 -1
- package/dist/frontend/lowering/module-namespace-elements.d.ts +13 -0
- package/dist/frontend/lowering/module-namespace-elements.js +118 -1
- package/dist/frontend/lowering/module-namespace-elements.js.map +1 -1
- package/dist/frontend/lowering/object-factory-new.d.ts +5 -0
- package/dist/frontend/lowering/object-factory-new.js +20 -6
- package/dist/frontend/lowering/object-factory-new.js.map +1 -1
- package/dist/frontend/lowering/overload-choice.d.ts +33 -0
- package/dist/frontend/lowering/overload-choice.js +190 -0
- package/dist/frontend/lowering/overload-choice.js.map +1 -0
- package/dist/frontend/lowering/private-brands.d.ts +5 -0
- package/dist/frontend/lowering/private-brands.js +39 -0
- package/dist/frontend/lowering/private-brands.js.map +1 -1
- package/dist/frontend/lowering/runtime-optional-elements.d.ts +6 -0
- package/dist/frontend/lowering/runtime-optional-elements.js +14 -3
- package/dist/frontend/lowering/runtime-optional-elements.js.map +1 -1
- package/dist/frontend/lowering/sanitize-class-types.js +2 -0
- package/dist/frontend/lowering/sanitize-class-types.js.map +1 -1
- package/dist/frontend/lowering/site-dependencies.d.ts +7 -2
- package/dist/frontend/lowering/site-dependencies.js +0 -15
- package/dist/frontend/lowering/site-dependencies.js.map +1 -1
- package/dist/frontend/lowering/site-dependencies.test.js +7 -5
- package/dist/frontend/lowering/site-dependencies.test.js.map +1 -1
- package/dist/frontend/lowering/string-index-bounds.d.ts +7 -4
- package/dist/frontend/lowering/string-index-bounds.js +21 -7
- package/dist/frontend/lowering/string-index-bounds.js.map +1 -1
- package/dist/frontend/lowering/surfaces.d.ts +12 -3
- package/dist/frontend/lowering/surfaces.js +1630 -1540
- package/dist/frontend/lowering/surfaces.js.map +1 -1
- package/dist/frontend/lowering/symbol-fields.d.ts +7 -0
- package/dist/frontend/lowering/symbol-fields.js +45 -2
- package/dist/frontend/lowering/symbol-fields.js.map +1 -1
- package/dist/frontend/lowering/union-narrow.d.ts +5 -2
- package/dist/frontend/lowering/union-narrow.js +6 -3
- package/dist/frontend/lowering/union-narrow.js.map +1 -1
- package/dist/frontend/lowering/union-narrow.test.js +10 -0
- package/dist/frontend/lowering/union-narrow.test.js.map +1 -1
- package/dist/frontend/npm-static-namespace-defaults.d.ts +6 -0
- package/dist/frontend/npm-static-namespace-defaults.js +163 -0
- package/dist/frontend/npm-static-namespace-defaults.js.map +1 -0
- package/dist/frontend/npm-static-namespace-defaults.test.d.ts +1 -0
- package/dist/frontend/npm-static-namespace-defaults.test.js +72 -0
- package/dist/frontend/npm-static-namespace-defaults.test.js.map +1 -0
- package/dist/frontend/npm-static-prune.js +152 -111
- package/dist/frontend/npm-static-prune.js.map +1 -1
- package/dist/frontend/npm-static.js +35 -32
- package/dist/frontend/npm-static.js.map +1 -1
- package/dist/frontend/package-shims.d.ts +7 -4
- package/dist/frontend/package-shims.js +39 -40
- package/dist/frontend/package-shims.js.map +1 -1
- package/dist/frontend/pipeline-native.d.ts +2 -2
- package/dist/frontend/pipeline-native.js +2 -2
- package/dist/frontend/pipeline-native.js.map +1 -1
- package/dist/frontend/pipeline.d.ts +19 -2
- package/dist/frontend/pipeline.js +103 -12
- package/dist/frontend/pipeline.js.map +1 -1
- package/dist/frontend/program-analysis.d.ts +7 -1
- package/dist/frontend/program-analysis.js +8 -0
- package/dist/frontend/program-analysis.js.map +1 -1
- package/dist/frontend/program.d.ts +28 -5
- package/dist/frontend/program.js +422 -76
- package/dist/frontend/program.js.map +1 -1
- package/dist/frontend/resolve.d.ts +2 -0
- package/dist/frontend/resolve.js +5 -0
- package/dist/frontend/resolve.js.map +1 -1
- package/dist/frontend/services.d.ts +3 -0
- package/dist/frontend/services.js +31 -4
- package/dist/frontend/services.js.map +1 -1
- package/dist/frontend/shape-inference/analyze.d.ts +93 -0
- package/dist/frontend/shape-inference/analyze.js +3138 -0
- package/dist/frontend/shape-inference/analyze.js.map +1 -0
- package/dist/frontend/shape-inference/constant-graphs.d.ts +54 -0
- package/dist/frontend/shape-inference/constant-graphs.js +357 -0
- package/dist/frontend/shape-inference/constant-graphs.js.map +1 -0
- package/dist/frontend/shape-inference/domain.d.ts +32 -0
- package/dist/frontend/shape-inference/domain.js +104 -0
- package/dist/frontend/shape-inference/domain.js.map +1 -0
- package/dist/frontend/shape-inference/index.d.ts +7 -0
- package/dist/frontend/shape-inference/index.js +19 -0
- package/dist/frontend/shape-inference/index.js.map +1 -0
- package/dist/frontend/shape-inference/report.d.ts +21 -0
- package/dist/frontend/shape-inference/report.js +348 -0
- package/dist/frontend/shape-inference/report.js.map +1 -0
- package/dist/frontend/token-equivalence.d.ts +6 -0
- package/dist/frontend/token-equivalence.js +66 -9
- package/dist/frontend/token-equivalence.js.map +1 -1
- package/dist/frontend/token-equivalence.test.js +33 -1
- package/dist/frontend/token-equivalence.test.js.map +1 -1
- package/dist/frontend/ts7/checker-features.d.ts +15 -0
- package/dist/frontend/ts7/checker-features.js +45 -0
- package/dist/frontend/ts7/checker-features.js.map +1 -0
- package/dist/frontend/ts7/checker-features.test.d.ts +1 -0
- package/dist/frontend/ts7/checker-features.test.js +40 -0
- package/dist/frontend/ts7/checker-features.test.js.map +1 -0
- package/dist/frontend/ts7/checker-server.d.ts +19 -0
- package/dist/frontend/ts7/checker-server.js +46 -0
- package/dist/frontend/ts7/checker-server.js.map +1 -0
- package/dist/frontend/ts7/checker-server.test.d.ts +1 -0
- package/dist/frontend/ts7/checker-server.test.js +38 -0
- package/dist/frontend/ts7/checker-server.test.js.map +1 -0
- package/dist/frontend/ts7/lib-diagnostics.js +39 -13
- package/dist/frontend/ts7/lib-diagnostics.js.map +1 -1
- package/dist/frontend/ts7/lib-diagnostics.test.js +40 -0
- package/dist/frontend/ts7/lib-diagnostics.test.js.map +1 -1
- package/dist/frontend/ts7/native-api.d.ts +1 -0
- package/dist/frontend/ts7/native-api.js +25 -2
- package/dist/frontend/ts7/native-api.js.map +1 -1
- package/dist/frontend/ts7/native-process.d.ts +9 -2
- package/dist/frontend/ts7/native-process.js +22 -4
- package/dist/frontend/ts7/native-process.js.map +1 -1
- package/dist/frontend/ts7/program-host.d.ts +11 -0
- package/dist/frontend/ts7/program-host.js +36 -22
- package/dist/frontend/ts7/program-host.js.map +1 -1
- package/dist/frontend/ts7/semantic-json.d.ts +9 -0
- package/dist/frontend/ts7/semantic-json.js +25 -5
- package/dist/frontend/ts7/semantic-json.js.map +1 -1
- package/dist/frontend/ts7/semantic-model.d.ts +3 -0
- package/dist/frontend/ts7/semantic-model.js +8 -1
- package/dist/frontend/ts7/semantic-model.js.map +1 -1
- package/dist/frontend/ts7/semantic-model.test.js +6 -1
- package/dist/frontend/ts7/semantic-model.test.js.map +1 -1
- package/dist/frontend/ts7/semantic-types.d.ts +1 -1
- package/dist/frontend/ts7/semantic-types.js +1 -1
- package/dist/frontend/ts7/semantic-types.js.map +1 -1
- package/dist/frontend/ts7/source-parser.js +3 -1
- package/dist/frontend/ts7/source-parser.js.map +1 -1
- package/dist/frontend/tsc-codes.js +10 -0
- package/dist/frontend/tsc-codes.js.map +1 -1
- package/dist/frontend/type-mapper.d.ts +18 -6
- package/dist/frontend/type-mapper.js +205 -44
- package/dist/frontend/type-mapper.js.map +1 -1
- package/dist/index.d.ts +44 -3
- package/dist/index.js +39 -8
- package/dist/index.js.map +1 -1
- package/dist/ir/builtin-effects.js +37 -0
- package/dist/ir/builtin-effects.js.map +1 -1
- package/dist/ir/builtin-signatures.d.ts +7 -2
- package/dist/ir/builtin-signatures.js +5104 -4894
- package/dist/ir/builtin-signatures.js.map +1 -1
- package/dist/ir/callback-specialization.d.ts +4 -2
- package/dist/ir/callback-specialization.js +24 -9
- package/dist/ir/callback-specialization.js.map +1 -1
- package/dist/ir/capture-values.js +4 -2
- package/dist/ir/capture-values.js.map +1 -1
- package/dist/ir/char-unit-locals.d.ts +12 -2
- package/dist/ir/char-unit-locals.js +400 -58
- package/dist/ir/char-unit-locals.js.map +1 -1
- package/dist/ir/char-unit-locals.test.js +111 -0
- package/dist/ir/char-unit-locals.test.js.map +1 -1
- package/dist/ir/constant-globals.js +18 -4
- package/dist/ir/constant-globals.js.map +1 -1
- package/dist/ir/expression-inlining.d.ts +15 -0
- package/dist/ir/expression-inlining.js +166 -0
- package/dist/ir/expression-inlining.js.map +1 -0
- package/dist/ir/expression-inlining.test.d.ts +1 -0
- package/dist/ir/expression-inlining.test.js +123 -0
- package/dist/ir/expression-inlining.test.js.map +1 -0
- package/dist/ir/function-references.js +2 -0
- package/dist/ir/function-references.js.map +1 -1
- package/dist/ir/function-references.test.js +6 -0
- package/dist/ir/function-references.test.js.map +1 -1
- package/dist/ir/int32-arrays.d.ts +27 -6
- package/dist/ir/int32-arrays.js +106 -18
- package/dist/ir/int32-arrays.js.map +1 -1
- package/dist/ir/int32-slots.d.ts +26 -1
- package/dist/ir/int32-slots.js +291 -5
- package/dist/ir/int32-slots.js.map +1 -1
- package/dist/ir/int32-slots.test.js +38 -0
- package/dist/ir/int32-slots.test.js.map +1 -1
- package/dist/ir/integer-loop-facts.d.ts +5 -0
- package/dist/ir/integer-loop-facts.js +90 -1
- package/dist/ir/integer-loop-facts.js.map +1 -1
- package/dist/ir/integer-loops.d.ts +14 -1
- package/dist/ir/integer-loops.js +107 -11
- package/dist/ir/integer-loops.js.map +1 -1
- package/dist/ir/integer-loops.test.js +70 -0
- package/dist/ir/integer-loops.test.js.map +1 -1
- package/dist/ir/integer-ranges.js +18 -2
- package/dist/ir/integer-ranges.js.map +1 -1
- package/dist/ir/integer-ranges.test.js +64 -4
- package/dist/ir/integer-ranges.test.js.map +1 -1
- package/dist/ir/ir.d.ts +63 -11
- package/dist/ir/ir.js +47 -7
- package/dist/ir/ir.js.map +1 -1
- package/dist/ir/ir.test.js +2 -1
- package/dist/ir/ir.test.js.map +1 -1
- package/dist/ir/js-ic.d.ts +10 -3
- package/dist/ir/js-ic.js +14 -2
- package/dist/ir/js-ic.js.map +1 -1
- package/dist/ir/js-ic.test.js +11 -0
- package/dist/ir/js-ic.test.js.map +1 -1
- package/dist/ir/node-index.d.ts +7 -0
- package/dist/ir/node-index.js +32 -0
- package/dist/ir/node-index.js.map +1 -1
- package/dist/ir/receiver-readers.d.ts +6 -1
- package/dist/ir/receiver-readers.js +53 -28
- package/dist/ir/receiver-readers.js.map +1 -1
- package/dist/ir/row-pairs.d.ts +15 -0
- package/dist/ir/row-pairs.js +373 -0
- package/dist/ir/row-pairs.js.map +1 -0
- package/dist/ir/row-pairs.test.d.ts +1 -0
- package/dist/ir/row-pairs.test.js +129 -0
- package/dist/ir/row-pairs.test.js.map +1 -0
- package/dist/ir/runtime-features.d.ts +17 -4
- package/dist/ir/runtime-features.js +94 -13
- package/dist/ir/runtime-features.js.map +1 -1
- package/dist/ir/scalar-records.d.ts +15 -0
- package/dist/ir/scalar-records.js +301 -1
- package/dist/ir/scalar-records.js.map +1 -1
- package/dist/ir/scalar-records.test.js +181 -1
- package/dist/ir/scalar-records.test.js.map +1 -1
- package/dist/ir/self-captures.js +8 -0
- package/dist/ir/self-captures.js.map +1 -1
- package/dist/ir/validate.js +78 -28
- package/dist/ir/validate.js.map +1 -1
- package/dist/library/fence-eval.js +4 -4
- package/dist/library/fence-eval.js.map +1 -1
- package/dist/library/ir-policy.js +5 -0
- package/dist/library/ir-policy.js.map +1 -1
- package/dist/library/library-cache.d.ts +1 -0
- package/dist/library/library-cache.js +1 -0
- package/dist/library/library-cache.js.map +1 -1
- package/dist/library/library-cache.test.js +13 -0
- package/dist/library/library-cache.test.js.map +1 -1
- package/dist/native/cache.d.ts +5 -1
- package/dist/native/cache.js +15 -3
- package/dist/native/cache.js.map +1 -1
- package/dist/native/cli.js +6 -0
- package/dist/native/cli.js.map +1 -1
- package/dist/native/compiler.d.ts +3 -0
- package/dist/native/compiler.js +72 -26
- package/dist/native/compiler.js.map +1 -1
- package/dist/native/compiler.test.js +87 -2
- package/dist/native/compiler.test.js.map +1 -1
- package/dist/native/executable-cache-open.test.d.ts +1 -0
- package/dist/native/executable-cache-open.test.js +80 -0
- package/dist/native/executable-cache-open.test.js.map +1 -0
- package/dist/native/executable-cache.d.ts +43 -3
- package/dist/native/executable-cache.js +177 -36
- package/dist/native/executable-cache.js.map +1 -1
- package/dist/native/executable-cache.test.js +103 -0
- package/dist/native/executable-cache.test.js.map +1 -1
- package/dist/native/prepare.d.ts +1 -1
- package/dist/native/prepare.js +49 -17
- package/dist/native/prepare.js.map +1 -1
- package/dist/native/prepare.test.js +69 -3
- package/dist/native/prepare.test.js.map +1 -1
- package/dist/native/sanitizer.d.ts +1 -1
- package/dist/native/sanitizer.js +17 -3
- package/dist/native/sanitizer.js.map +1 -1
- package/dist/native/sanitizer.test.js +4 -0
- package/dist/native/sanitizer.test.js.map +1 -1
- package/dist/node-islands/classify.d.ts +14 -0
- package/dist/node-islands/classify.js +114 -0
- package/dist/node-islands/classify.js.map +1 -0
- package/dist/node-islands/detect.d.ts +13 -0
- package/dist/node-islands/detect.js +805 -0
- package/dist/node-islands/detect.js.map +1 -0
- package/dist/node-islands/detect.test.d.ts +1 -0
- package/dist/node-islands/detect.test.js +136 -0
- package/dist/node-islands/detect.test.js.map +1 -0
- package/dist/node-islands/origin.d.ts +21 -0
- package/dist/node-islands/origin.js +60 -0
- package/dist/node-islands/origin.js.map +1 -0
- package/dist/node-islands/policy.d.ts +49 -0
- package/dist/node-islands/policy.js +130 -0
- package/dist/node-islands/policy.js.map +1 -0
- package/dist/node-islands/report.d.ts +22 -0
- package/dist/node-islands/report.js +326 -0
- package/dist/node-islands/report.js.map +1 -0
- package/dist/node-islands/report.test.d.ts +1 -0
- package/dist/node-islands/report.test.js +228 -0
- package/dist/node-islands/report.test.js.map +1 -0
- package/dist/node-islands/rules.d.ts +20 -0
- package/dist/node-islands/rules.js +91 -0
- package/dist/node-islands/rules.js.map +1 -0
- package/dist/node-islands/scan.d.ts +53 -0
- package/dist/node-islands/scan.js +104 -0
- package/dist/node-islands/scan.js.map +1 -0
- package/dist/node-islands/summary.d.ts +78 -0
- package/dist/node-islands/summary.js +26 -0
- package/dist/node-islands/summary.js.map +1 -0
- package/dist/project-config.d.ts +50 -0
- package/dist/project-config.js +372 -0
- package/dist/project-config.js.map +1 -0
- package/dist/project-config.test.d.ts +1 -0
- package/dist/project-config.test.js +154 -0
- package/dist/project-config.test.js.map +1 -0
- package/dist/wasm/discover.js +6 -31
- package/dist/wasm/discover.js.map +1 -1
- package/package.json +20 -20
- package/surface-manifest.json +21 -38
|
@@ -1,14 +1,15 @@
|
|
|
1
|
+
import { lowerAsyncLocalStorageOptions } from "./builtins/async-context.js";
|
|
1
2
|
import { DATE_TIME_FIELD, dateRootOf, dateSuperCall, isDatePrototypeMethod, lowerDateSuperMethodCall, } from "./builtins/date-classes.js";
|
|
2
3
|
import { predeclareForwardClass } from "./lower-stmts.js";
|
|
3
4
|
import { lowerDateStaticCall } from "./builtins/dates.js";
|
|
4
5
|
import { keyedHelperName } from "./stable-names.js";
|
|
5
6
|
import { lowerValueReturningConstructorNew } from "./js-dynamic-objects.js";
|
|
6
7
|
import { adaptPromiseExecutor } from "./promise-executor-adapter.js";
|
|
7
|
-
import { dynUndefinedExpr, nodeThrowExpr, varRef } from "../../ir/build.js";
|
|
8
|
+
import { dynUndefinedExpr, nodeThrowExpr, strLit, varRef } from "../../ir/build.js";
|
|
8
9
|
import { constructedFromValue, constructedValue, superIntoResultSlot, } from "./constructor-returns.js";
|
|
9
10
|
import { checkedIterableSpread } from "./checked-iterable-spread.js";
|
|
10
|
-
import { lowerReadlineUiNew } from "./builtins/readline.js";
|
|
11
|
-
import { builtinMemberRequireDecl } from "./builtins/module-bindings.js";
|
|
11
|
+
import { lowerReadlineInterfaceNew, lowerReadlineUiNew } from "./builtins/readline.js";
|
|
12
|
+
import { builtinMemberBindingTarget, builtinMemberRequireDecl, } from "./builtins/module-bindings.js";
|
|
12
13
|
import { checkedClassUnionAssertion } from "./class-assertions.js";
|
|
13
14
|
import { collectClassMethodMutations } from "./class-method-mutations.js";
|
|
14
15
|
import { InternalCompilerError } from "../../errors.js";
|
|
@@ -25,7 +26,7 @@ import { lowerZlibStreamNew, zlibClassName, zlibStreamModeOf } from "./builtins/
|
|
|
25
26
|
import { everyStmtList } from "../../ir/traverse.js";
|
|
26
27
|
import { builtinClassAliasOf, builtinClassRefOf, } from "./builtins/class-values.js";
|
|
27
28
|
import { inlineNamespaceRequireOf, lowerWithInlineRequireInit } from "./cjs-inline-require.js";
|
|
28
|
-
import { BOOL, canDynCheckTo, DATE_T, DYN, F64,
|
|
29
|
+
import { BOOL, BYTES_U8, canDynCheckTo, DATE_T, DYN, F64, RUNTIME_EMITTER_CLASS, RUNTIME_ERROR_CLASSES, RUNTIME_STREAM_CLASSES, STRING, classValueConstructor, UNDEFINED_T, VOID, arrayOf, isSupportedMapKey, isSupportedMapValue, isSupportedSetElem, isUnitType, typeEquals, } from "../../ir/ir.js";
|
|
29
30
|
import { genericCallInstance, implicitAnyParamSymbolsOf, implicitCallInstance, implicitMonoFile, genericLocalClassResult, } from "./generic-functions.js";
|
|
30
31
|
import { extendInstantiationPath, MAX_INSTANTIATION_RECURSION, } from "./instantiation-path.js";
|
|
31
32
|
import { appendImplicitUndefinedReturn, hasExplicitJsDocReturn } from "./function-returns.js";
|
|
@@ -33,20 +34,20 @@ import { bodyReadsArguments } from "../arguments-usage.js";
|
|
|
33
34
|
import { errorNameAfterField, errorViewFields } from "./error-name-order.js";
|
|
34
35
|
import { checkedJsDocumentedParameter, documentedParameter, generatorMeta, } from "./call-signatures.js";
|
|
35
36
|
import { omittedArgFor } from "./call-arguments.js";
|
|
36
|
-
import { checkerTypeDescription, isGenericCallableMemberType, jsOpenObjectType, typeKey, withUnitArm, } from "../type-mapper.js";
|
|
37
|
+
import { checkerTypeDescription, isGenericCallableMemberType, jsOpenObjectType, typeKey, withUnitArm, X509_DER_FIELD, X509_PUBLIC_KEY_FIELD, } from "../type-mapper.js";
|
|
37
38
|
import { canonicalBuiltinModule, cjsClassExprWholeExportOf, isCjsJsFile, isJsSourceFile, isModuleExportsAccess, locOf, requireSpecOf, } from "../program.js";
|
|
38
39
|
import { PoisonError, dynFallbackType, jsFuncNameOf, newFnCtx, own } from "./lowerer.js";
|
|
39
40
|
import { isAssertClassNew } from "./assert-instances.js";
|
|
40
41
|
import { isCjsRequireGlobal } from "./lower-node-module.js";
|
|
41
42
|
import { lowerArrayConstructor } from "./containers/array-construction.js";
|
|
43
|
+
import { initializedCollectionType } from "./js-collection-types.js";
|
|
42
44
|
import { lowerMapSeedNew, lowerSetSeedNew } from "./containers/collection-methods.js";
|
|
43
45
|
import { lowerObjectConstructor } from "./containers/indexed-objects.js";
|
|
44
|
-
import { knownBufEncoding,
|
|
45
|
-
import { isSafeToRepeat } from "./expressions/evaluation-safety.js";
|
|
46
|
+
import { knownBufEncoding, lowerBufferConstruct } from "./containers/bytes.js";
|
|
46
47
|
import { lowerSearchParamsNew } from "./builtins/url.js";
|
|
47
48
|
import { lowerTextCodecNew } from "./builtins/text-codecs.js";
|
|
48
49
|
import { lowerBroadcastChannelNew, lowerMessageChannelNew, lowerWorkerNew, } from "./builtins/workers.js";
|
|
49
|
-
import { unsupportedPackageValueDiag, unsupportedDiag, } from "../../diagnostics/diagnostic.js";
|
|
50
|
+
import { noLoweringDiag, unsupportedPackageValueDiag, unsupportedDiag, } from "../../diagnostics/diagnostic.js";
|
|
50
51
|
import { STREAM_API_MEMBERS, STREAM_PROP_MEMBERS, STREAM_COMPLETION_CALLBACK_INDEX, UNDERSCORE_METHODS, streamExtraCallbacks, lowerStreamNew, lowerStreamSuperCall, streamCtorShape, } from "./lower-stream.js";
|
|
51
52
|
import { builtinEventTargetBaseOf, eventTargetApiMembers, eventTargetApiMethod, eventTargetRootOf, eventTargetSuperCall, lowerEventTargetMethodCall, } from "./lower-event-target.js";
|
|
52
53
|
import { emitOverrideShapeReason, emitSpecSuperForward, emitterRooted, lowerEmitterSuperCall, } from "./lower-event-emitter.js";
|
|
@@ -63,11 +64,11 @@ import { accessorInterceptsBase, accessorNames, construction, constructionPrefix
|
|
|
63
64
|
import { lowerObjectFactoryNew } from "./object-factory-new.js";
|
|
64
65
|
import { tryLowerExpression } from "./expressions/try-lower-expression.js";
|
|
65
66
|
import { lowerInstanceConstructorNew } from "./class-instance-constructor.js";
|
|
66
|
-
import { classPrototypeData } from "./class-prototypes.js";
|
|
67
|
+
import { classPrototypeData, reflectClassPrototype } from "./class-prototypes.js";
|
|
67
68
|
import { constructionEscape } from "./construction-escapes.js";
|
|
68
69
|
import { checkedClassConstruction, checkedClassConstructionPacked } from "./class-construction.js";
|
|
69
70
|
import { initializeRuntimeStatics, hasRuntimeStatics } from "./class-runtime-statics.js";
|
|
70
|
-
import { reflectedClassStaticMethodValue } from "./class-method-values.js";
|
|
71
|
+
import { reflectedClassMethodValue, reflectedClassStaticMethodValue, } from "./class-method-values.js";
|
|
71
72
|
import { identifierReadSymbol } from "./surfaces.js";
|
|
72
73
|
export function returnsOnlyThis(member) {
|
|
73
74
|
const body = member.body;
|
|
@@ -891,7 +892,7 @@ function undefArmedFieldType(lowerer, p) {
|
|
|
891
892
|
const byKey = new Map();
|
|
892
893
|
const arms = mapped.kind === "union" ? (lowerer.unions.get(mapped.unionId)?.arms ?? []) : [mapped];
|
|
893
894
|
for (const a of arms) {
|
|
894
|
-
if (a.kind === "map" || a.kind === "regex" || a.kind === "
|
|
895
|
+
if (a.kind === "map" || a.kind === "regex" || a.kind === "generator") {
|
|
895
896
|
return null;
|
|
896
897
|
}
|
|
897
898
|
byKey.set(typeKey(a), a);
|
|
@@ -3042,7 +3043,6 @@ mixin) {
|
|
|
3042
3043
|
declared.kind !== "union" &&
|
|
3043
3044
|
declared.kind !== "dyn" &&
|
|
3044
3045
|
declared.kind !== "map" &&
|
|
3045
|
-
declared.kind !== "date" &&
|
|
3046
3046
|
declared.kind !== "generator" &&
|
|
3047
3047
|
declared.kind !== "void" &&
|
|
3048
3048
|
declared.kind !== "caught";
|
|
@@ -3432,6 +3432,11 @@ mixin) {
|
|
|
3432
3432
|
// INSTANTIATION prints its family's name — JS has one `Box`.
|
|
3433
3433
|
jsName: jsNameOverride ?? decl.name?.text ?? "",
|
|
3434
3434
|
...(base ? { base: base.def.name } : {}),
|
|
3435
|
+
...(decl.members.nodes.some((member) => ts.isPropertyDeclaration(member) &&
|
|
3436
|
+
!ts.isPrivateIdentifier(member.name) &&
|
|
3437
|
+
member.modifiers?.nodes.some((m) => m.kind === ts.SyntaxKind.StaticKeyword))
|
|
3438
|
+
? { ownStaticFields: true }
|
|
3439
|
+
: {}),
|
|
3435
3440
|
jsLength: ctor?.parameters?.nodes.findIndex((parameter) => parameter.initializer || parameter.dotDotDotToken) === -1
|
|
3436
3441
|
? ctor.parameters.nodes.length
|
|
3437
3442
|
: Math.max(0, ctor?.parameters?.nodes.findIndex((parameter) => parameter.initializer || parameter.dotDotDotToken) ?? 0),
|
|
@@ -4601,20 +4606,27 @@ export function lowerStaticFieldRead(lowerer, expr) {
|
|
|
4601
4606
|
return null;
|
|
4602
4607
|
if (expr.questionDotToken)
|
|
4603
4608
|
return null;
|
|
4604
|
-
|
|
4605
|
-
|
|
4606
|
-
exactClassOfReceiver(lowerer, expr.expression) === null)
|
|
4609
|
+
const info = staticReceiverClass(lowerer, expr.expression);
|
|
4610
|
+
if (!info)
|
|
4607
4611
|
return null;
|
|
4608
|
-
|
|
4609
|
-
|
|
4610
|
-
|
|
4612
|
+
return lowerClassStaticRead(lowerer, info, expr.name.text, expr.expression, expr);
|
|
4613
|
+
}
|
|
4614
|
+
/** The class a static member read through `receiver` reads exactly: the
|
|
4615
|
+
* class a name binds (directly, through a require binding, or through a
|
|
4616
|
+
* const alias), or null. */
|
|
4617
|
+
export function staticReceiverClass(lowerer, receiver) {
|
|
4618
|
+
if (!ts.isIdentifier(receiver) &&
|
|
4619
|
+
receiver.kind !== ts.SyntaxKind.ThisKeyword &&
|
|
4620
|
+
exactClassOfReceiver(lowerer, receiver) === null)
|
|
4621
|
+
return null;
|
|
4622
|
+
const symbol = ts.isIdentifier(receiver) ? lowerer.resolveValueSymbol(receiver) : null;
|
|
4611
4623
|
const info = (symbol ? lowerer.classBySymbol.get(symbol) : undefined) ??
|
|
4612
4624
|
// A require binding over `module.exports = class {…}` (the alias
|
|
4613
4625
|
// lands on the expression's own symbol): resolve/collect on demand,
|
|
4614
4626
|
// or `C.name` below would fall through to paths that answer for
|
|
4615
4627
|
// stdlib globals instead of this class.
|
|
4616
4628
|
propertyAssignedClassInfoOf(lowerer, symbol) ??
|
|
4617
|
-
exactClassOfReceiver(lowerer,
|
|
4629
|
+
exactClassOfReceiver(lowerer, receiver) ??
|
|
4618
4630
|
undefined;
|
|
4619
4631
|
if (!info)
|
|
4620
4632
|
return null;
|
|
@@ -4625,20 +4637,27 @@ export function lowerStaticFieldRead(lowerer, expr) {
|
|
|
4625
4637
|
// runtime value.
|
|
4626
4638
|
if (info.classDecorators?.valueGlobalId !== undefined)
|
|
4627
4639
|
return null;
|
|
4628
|
-
|
|
4629
|
-
|
|
4640
|
+
return info;
|
|
4641
|
+
}
|
|
4642
|
+
/** The static member `name` of `info` read through `receiver` (an exact
|
|
4643
|
+
* reference to the class, see staticReceiverClass): `C.name` for the
|
|
4644
|
+
* property access `site`, or a destructuring element over `C` whose
|
|
4645
|
+
* initializer is `site`. Null when the class has no such member. */
|
|
4646
|
+
export function lowerClassStaticRead(lowerer, info, name, receiver, site) {
|
|
4647
|
+
const loc = locOf(site);
|
|
4648
|
+
const found = findStaticOn(lowerer, info, name);
|
|
4630
4649
|
// A Date static read as a value through a class declared `extends Date`:
|
|
4631
4650
|
// the statics lower only as calls.
|
|
4632
4651
|
if (!found &&
|
|
4633
4652
|
dateRootOf(info) &&
|
|
4634
|
-
["now", "parse", "UTC"].includes(
|
|
4635
|
-
!(ts.isCallExpression(
|
|
4636
|
-
lowerer.noLowering(`Date.${
|
|
4653
|
+
["now", "parse", "UTC"].includes(name) &&
|
|
4654
|
+
!(ts.isCallExpression(site.parent) && site.parent.expression === site))
|
|
4655
|
+
lowerer.noLowering(`Date.${name} read through a class that extends Date`, site);
|
|
4637
4656
|
if (hasRuntimeStatics(info) && !found?.field)
|
|
4638
4657
|
return {
|
|
4639
4658
|
kind: "dynKeyGet",
|
|
4640
|
-
value: lowerer.coerceToExpected(classValueRef(lowerer, info,
|
|
4641
|
-
key: { kind: "strLit", value:
|
|
4659
|
+
value: lowerer.coerceToExpected(classValueRef(lowerer, info, receiver), DYN),
|
|
4660
|
+
key: { kind: "strLit", value: name, type: STRING, loc },
|
|
4642
4661
|
type: DYN,
|
|
4643
4662
|
loc,
|
|
4644
4663
|
};
|
|
@@ -4646,8 +4665,8 @@ export function lowerStaticFieldRead(lowerer, expr) {
|
|
|
4646
4665
|
// name: in JS the brand lives on that one constructor object, so
|
|
4647
4666
|
// `D.#s` (a subclass receiver) throws Node's TypeError instead of
|
|
4648
4667
|
// reaching up the chain — reported as SC1090 instead of resolved.
|
|
4649
|
-
if (found &&
|
|
4650
|
-
lowerer.unsupported("SC1090",
|
|
4668
|
+
if (found && name.startsWith("#") && found.declarer !== info) {
|
|
4669
|
+
lowerer.unsupported("SC1090", site, `reading the private static '${name}' through the subclass '${info.def.name.replace(/^%|^%m\d+\./, "")}' (JS brands the declaring class object alone — Node throws a TypeError here; spell the declaring class's name)`);
|
|
4651
4670
|
}
|
|
4652
4671
|
if (found?.field !== undefined) {
|
|
4653
4672
|
const value = {
|
|
@@ -4656,30 +4675,32 @@ export function lowerStaticFieldRead(lowerer, expr) {
|
|
|
4656
4675
|
type: found.field.type,
|
|
4657
4676
|
loc,
|
|
4658
4677
|
};
|
|
4659
|
-
return found.field.runtimeOptional
|
|
4678
|
+
return found.field.runtimeOptional || !ts.isPropertyAccessExpression(site)
|
|
4679
|
+
? value
|
|
4680
|
+
: lowerer.maybeNarrow(value, site);
|
|
4660
4681
|
}
|
|
4661
4682
|
if (found) {
|
|
4662
|
-
return staticMethodValue(lowerer, found.declarer,
|
|
4683
|
+
return staticMethodValue(lowerer, found.declarer, name, found.method, site, loc);
|
|
4663
4684
|
}
|
|
4664
4685
|
// A GENERIC static method as a VALUE: the pinned-value rule verbatim
|
|
4665
4686
|
// (lowerGenericFnValue) — a slot spelling one concrete signature names
|
|
4666
4687
|
// an instance, an unpinned reference fences by name.
|
|
4667
4688
|
{
|
|
4668
|
-
const gfound = findGenericStaticOn(lowerer, info,
|
|
4689
|
+
const gfound = findGenericStaticOn(lowerer, info, name);
|
|
4669
4690
|
if (gfound)
|
|
4670
|
-
return lowerer.lowerGenericFnValue(
|
|
4691
|
+
return lowerer.lowerGenericFnValue(site, gfound.info);
|
|
4671
4692
|
}
|
|
4672
4693
|
// `C.name` — the JS-observable class name, a compile-time constant on
|
|
4673
4694
|
// the direct spelling (tsc rejects user statics named `name`, so the
|
|
4674
4695
|
// chain above can never shadow it in TypeScript sources). A class of an
|
|
4675
4696
|
// import cycle reads it from its class object instead, whose reference
|
|
4676
4697
|
// checks the class's initialization (checkCycleBindingAccesses).
|
|
4677
|
-
if (
|
|
4698
|
+
if (name === "name" && info.def.jsName !== undefined) {
|
|
4678
4699
|
if (lowerer.classInitFlags.get(info.def.name)?.cycle === true)
|
|
4679
4700
|
return {
|
|
4680
4701
|
kind: "libCall",
|
|
4681
4702
|
fn: "class.name",
|
|
4682
|
-
args: [classValueRef(lowerer, info,
|
|
4703
|
+
args: [classValueRef(lowerer, info, receiver)],
|
|
4683
4704
|
type: STRING,
|
|
4684
4705
|
loc,
|
|
4685
4706
|
};
|
|
@@ -4688,26 +4709,26 @@ export function lowerStaticFieldRead(lowerer, expr) {
|
|
|
4688
4709
|
if (info.callableBase)
|
|
4689
4710
|
return {
|
|
4690
4711
|
kind: "dynKeyGet",
|
|
4691
|
-
value: lowerer.coerceToExpected(classValueRef(lowerer, info,
|
|
4692
|
-
key: { kind: "strLit", value:
|
|
4712
|
+
value: lowerer.coerceToExpected(classValueRef(lowerer, info, receiver), DYN),
|
|
4713
|
+
key: { kind: "strLit", value: name, type: STRING, loc },
|
|
4693
4714
|
type: DYN,
|
|
4694
4715
|
loc,
|
|
4695
4716
|
};
|
|
4696
|
-
const data = classStaticDataFor(lowerer, info,
|
|
4717
|
+
const data = classStaticDataFor(lowerer, info, name, loc);
|
|
4697
4718
|
if (data) {
|
|
4698
4719
|
const value = {
|
|
4699
4720
|
kind: "dynKeyGet",
|
|
4700
4721
|
value: data,
|
|
4701
|
-
key: { kind: "strLit", value:
|
|
4722
|
+
key: { kind: "strLit", value: name, type: STRING, loc },
|
|
4702
4723
|
type: DYN,
|
|
4703
4724
|
loc,
|
|
4704
4725
|
};
|
|
4705
4726
|
// JavaScript often assigns public statics after the class declaration.
|
|
4706
4727
|
// Their storage stays mutable and checked, while reads retain the
|
|
4707
4728
|
// checker's concrete type instead of losing the method receiver.
|
|
4708
|
-
const type = isJsSourceFile(ts.getSourceFileOfNode(
|
|
4729
|
+
const type = isJsSourceFile(ts.getSourceFileOfNode(site))
|
|
4709
4730
|
? null
|
|
4710
|
-
: lowerer.mapTypeOf(lowerer.typeOf(
|
|
4731
|
+
: lowerer.mapTypeOf(lowerer.typeOf(site));
|
|
4711
4732
|
return type ? lowerer.coerceToExpected(value, type) : value;
|
|
4712
4733
|
}
|
|
4713
4734
|
return null;
|
|
@@ -5454,7 +5475,7 @@ function staticCallOn(lowerer, call, access, info, throughValue) {
|
|
|
5454
5475
|
kind: "dynInvoke",
|
|
5455
5476
|
recv: lowerer.lowerExprExpecting(access.expression, DYN),
|
|
5456
5477
|
method: access.name.text,
|
|
5457
|
-
calleeName: access
|
|
5478
|
+
calleeName: ts.getTextOfNode(access),
|
|
5458
5479
|
args: call.arguments.nodes.map((argument) => lowerer.lowerExprExpecting(argument, DYN)),
|
|
5459
5480
|
type: DYN,
|
|
5460
5481
|
loc,
|
|
@@ -5757,8 +5778,8 @@ function capturesEnclosingScope(lowerer, member, classDecl) {
|
|
|
5757
5778
|
* reflection: the member a runtime lookup finds can then differ. */
|
|
5758
5779
|
function memberAssigned(lowerer, member, name) {
|
|
5759
5780
|
let found = false;
|
|
5760
|
-
for (const sf of lowerer.program.
|
|
5761
|
-
if (
|
|
5781
|
+
for (const sf of lowerer.program.getImplementationSourceFiles()) {
|
|
5782
|
+
if (found)
|
|
5762
5783
|
continue;
|
|
5763
5784
|
if (!sf.text.includes(name))
|
|
5764
5785
|
continue;
|
|
@@ -6808,14 +6829,23 @@ export function classMemberNameOf(lowerer, name) {
|
|
|
6808
6829
|
member === "asyncIterator" ||
|
|
6809
6830
|
member === "dispose" ||
|
|
6810
6831
|
member === "asyncDispose" ||
|
|
6811
|
-
member === "toPrimitive"
|
|
6832
|
+
member === "toPrimitive" ||
|
|
6833
|
+
// A toStringTag field keeps its symbol field name; its accessor and
|
|
6834
|
+
// method forms take the method slot name.
|
|
6835
|
+
(member === "toStringTag" && !ts.isPropertyDeclaration(name.parent))) {
|
|
6812
6836
|
return `sym:${member}`;
|
|
6813
6837
|
}
|
|
6814
6838
|
}
|
|
6815
6839
|
return (classSymbolKeyOf(lowerer, name.expression)?.fieldName ??
|
|
6816
6840
|
lowerer.foldedStringKeyOf(name.expression));
|
|
6817
6841
|
}
|
|
6818
|
-
|
|
6842
|
+
/** A return() result type that is always an object: IteratorClose after a
|
|
6843
|
+
* break throws a TypeError for any other result, which these desugars do
|
|
6844
|
+
* not model. */
|
|
6845
|
+
function objectResult(t) {
|
|
6846
|
+
return t.kind === "record" || t.kind === "object";
|
|
6847
|
+
}
|
|
6848
|
+
export function classIteratorOf(lowerer, t, options = {}) {
|
|
6819
6849
|
if (t.kind !== "object")
|
|
6820
6850
|
return null;
|
|
6821
6851
|
const info = lowerer.classes.get(t.className);
|
|
@@ -6825,19 +6855,48 @@ export function classIteratorOf(lowerer, t) {
|
|
|
6825
6855
|
if (!iter || iter.sig.params.length !== 0 || iter.sig.abstract === true)
|
|
6826
6856
|
return null;
|
|
6827
6857
|
const iterT = iter.sig.ret;
|
|
6828
|
-
|
|
6829
|
-
|
|
6830
|
-
|
|
6831
|
-
|
|
6832
|
-
|
|
6833
|
-
|
|
6834
|
-
|
|
6835
|
-
|
|
6836
|
-
|
|
6837
|
-
|
|
6838
|
-
|
|
6858
|
+
let resultT;
|
|
6859
|
+
let hasReturn;
|
|
6860
|
+
if (iterT.kind === "object") {
|
|
6861
|
+
const itInfo = lowerer.classes.get(iterT.className);
|
|
6862
|
+
if (!itInfo)
|
|
6863
|
+
return null;
|
|
6864
|
+
// IteratorClose honesty: a declared return() would be called by JS on
|
|
6865
|
+
// abrupt completion, so only a consumer that closes takes it; for-of
|
|
6866
|
+
// never calls throw(), the other consumers refuse it.
|
|
6867
|
+
const close = findMethodOn(lowerer, itInfo, "return");
|
|
6868
|
+
if (close &&
|
|
6869
|
+
(!options.close ||
|
|
6870
|
+
close.sig.abstract === true ||
|
|
6871
|
+
close.sig.params.length !== 0 ||
|
|
6872
|
+
!objectResult(close.sig.ret)))
|
|
6873
|
+
return null;
|
|
6874
|
+
if (findMethodOn(lowerer, itInfo, "throw") && !options.close)
|
|
6875
|
+
return null;
|
|
6876
|
+
const next = findMethodOn(lowerer, itInfo, "next");
|
|
6877
|
+
if (!next || next.sig.params.length !== 0 || next.sig.abstract === true)
|
|
6878
|
+
return null;
|
|
6879
|
+
resultT = next.sig.ret;
|
|
6880
|
+
hasReturn = !!close;
|
|
6881
|
+
}
|
|
6882
|
+
else if (iterT.kind === "record" && options.records) {
|
|
6883
|
+
const fields = lowerer.shapes.get(iterT.shapeId)?.fields;
|
|
6884
|
+
const next = fields?.find((f) => f.name === "next")?.type;
|
|
6885
|
+
if (!next || next.kind !== "func" || next.params.length !== 0 || next.rest)
|
|
6886
|
+
return null;
|
|
6887
|
+
const close = fields?.find((f) => f.name === "return")?.type;
|
|
6888
|
+
if (close &&
|
|
6889
|
+
(!options.close ||
|
|
6890
|
+
close.kind !== "func" ||
|
|
6891
|
+
close.params.length !== 0 ||
|
|
6892
|
+
close.rest ||
|
|
6893
|
+
!objectResult(close.ret)))
|
|
6894
|
+
return null;
|
|
6895
|
+
resultT = next.ret;
|
|
6896
|
+
hasReturn = close !== undefined;
|
|
6897
|
+
}
|
|
6898
|
+
else
|
|
6839
6899
|
return null;
|
|
6840
|
-
const resultT = next.sig.ret;
|
|
6841
6900
|
if (resultT.kind !== "record")
|
|
6842
6901
|
return null;
|
|
6843
6902
|
const shape = lowerer.shapes.get(resultT.shapeId);
|
|
@@ -6853,12 +6912,62 @@ export function classIteratorOf(lowerer, t) {
|
|
|
6853
6912
|
resultT,
|
|
6854
6913
|
valueT: value.type,
|
|
6855
6914
|
hasDone: done !== undefined,
|
|
6915
|
+
hasReturn,
|
|
6856
6916
|
};
|
|
6857
6917
|
}
|
|
6858
|
-
/** The `
|
|
6859
|
-
*
|
|
6860
|
-
|
|
6861
|
-
|
|
6918
|
+
/** The `next` an object-literal iterator's protocol calls, read once when
|
|
6919
|
+
* the iterator opens: JS keeps the `next` it reads then in the iterator
|
|
6920
|
+
* record, so a `next` the iterator assigns while it runs is not called.
|
|
6921
|
+
* Null for an iterator class, whose `next` is a method. */
|
|
6922
|
+
export function classIteratorNextRead(lowerer, cit, itRef, loc) {
|
|
6923
|
+
const iterT = cit.iterT;
|
|
6924
|
+
if (iterT.kind === "object")
|
|
6925
|
+
return null;
|
|
6926
|
+
const field = lowerer.shapes.get(iterT.shapeId).fields.find((f) => f.name === "next");
|
|
6927
|
+
return {
|
|
6928
|
+
kind: "recordGet",
|
|
6929
|
+
obj: itRef,
|
|
6930
|
+
shapeId: iterT.shapeId,
|
|
6931
|
+
field: "next",
|
|
6932
|
+
type: field.type,
|
|
6933
|
+
loc,
|
|
6934
|
+
};
|
|
6935
|
+
}
|
|
6936
|
+
/** The `it.next()` step of a class iterator: an ordinary (possibly
|
|
6937
|
+
* virtual) method call, or the call of `next`, the object-literal
|
|
6938
|
+
* iterator's `next` that classIteratorNextRead read when it opened. */
|
|
6939
|
+
export function classIteratorNextCall(lowerer, cit, itRef, next, loc) {
|
|
6940
|
+
if (next === null || next.type.kind !== "func")
|
|
6941
|
+
return classIteratorMethodCall(lowerer, cit, "next", itRef, loc);
|
|
6942
|
+
return { kind: "callValue", callee: next, args: [], type: next.type.ret, loc };
|
|
6943
|
+
}
|
|
6944
|
+
/** `it.next()` or `it.return()` of a class iterator: a (possibly virtual)
|
|
6945
|
+
* method call of an iterator class, or the call of an object-literal
|
|
6946
|
+
* iterator's function field. */
|
|
6947
|
+
export function classIteratorMethodCall(lowerer, cit, method, itRef, loc) {
|
|
6948
|
+
const iterT = cit.iterT;
|
|
6949
|
+
if (iterT.kind === "object") {
|
|
6950
|
+
const ret = method === "next"
|
|
6951
|
+
? cit.resultT
|
|
6952
|
+
: findMethodOn(lowerer, lowerer.classes.get(iterT.className), "return").sig.ret;
|
|
6953
|
+
return accessorCall(lowerer, iterT.className, method, itRef, [], ret, loc);
|
|
6954
|
+
}
|
|
6955
|
+
const field = lowerer.shapes.get(iterT.shapeId).fields.find((f) => f.name === method);
|
|
6956
|
+
const fnT = field.type;
|
|
6957
|
+
return {
|
|
6958
|
+
kind: "callValue",
|
|
6959
|
+
callee: {
|
|
6960
|
+
kind: "recordGet",
|
|
6961
|
+
obj: itRef,
|
|
6962
|
+
shapeId: iterT.shapeId,
|
|
6963
|
+
field: method,
|
|
6964
|
+
type: fnT,
|
|
6965
|
+
loc,
|
|
6966
|
+
},
|
|
6967
|
+
args: [],
|
|
6968
|
+
type: fnT.ret,
|
|
6969
|
+
loc,
|
|
6970
|
+
};
|
|
6862
6971
|
}
|
|
6863
6972
|
/** `recv[Symbol.iterator]()` as an ordinary method call. */
|
|
6864
6973
|
export function classIteratorOpenCall(lowerer, cit, recv, loc) {
|
|
@@ -6874,13 +6983,16 @@ export function classIteratorOpenCall(lowerer, cit, recv, loc) {
|
|
|
6874
6983
|
* when the value isn't a recognized class iterable or the element
|
|
6875
6984
|
* doesn't coerce — spread fences stay. */
|
|
6876
6985
|
export function classIteratorDrainCall(lowerer, src, loc, elemT) {
|
|
6877
|
-
|
|
6986
|
+
// A spread takes every value, so it never closes the iterator.
|
|
6987
|
+
const cit = classIteratorOf(lowerer, src.type, { records: true, close: true });
|
|
6878
6988
|
if (!cit)
|
|
6879
6989
|
return null;
|
|
6880
6990
|
const outElem = elemT ?? cit.valueT;
|
|
6881
6991
|
// Probe the element coercion purely: identical types, or an arm of a
|
|
6882
6992
|
// union destination (the wrap coerceToExpected applies below).
|
|
6883
|
-
|
|
6993
|
+
// A checked-dynamic value (`IteratorResult<T>`'s value is `T | any`)
|
|
6994
|
+
// converts to the destination element with a check.
|
|
6995
|
+
if (!typeEquals(outElem, cit.valueT) && cit.valueT.kind !== "dyn") {
|
|
6884
6996
|
if (outElem.kind !== "union" || lowerer.armTag(outElem.unionId, cit.valueT) < 0)
|
|
6885
6997
|
return null;
|
|
6886
6998
|
}
|
|
@@ -6893,6 +7005,8 @@ export function classIteratorDrainCall(lowerer, src, loc, elemT) {
|
|
|
6893
7005
|
const recvT = { kind: "object", className: cit.className };
|
|
6894
7006
|
const recvRef = { kind: "varRef", localId: "r.0", type: recvT, loc };
|
|
6895
7007
|
const itRef = { kind: "varRef", localId: "it.0", type: cit.iterT, loc };
|
|
7008
|
+
const nextRead = classIteratorNextRead(lowerer, cit, itRef, loc);
|
|
7009
|
+
const nextRef = nextRead ? varRef("next.0", nextRead.type, loc) : null;
|
|
6896
7010
|
const outRef = { kind: "varRef", localId: "out.0", type: outT, loc };
|
|
6897
7011
|
const resRef = { kind: "varRef", localId: "res.0", type: cit.resultT, loc };
|
|
6898
7012
|
const valueRead = {
|
|
@@ -6907,7 +7021,7 @@ export function classIteratorDrainCall(lowerer, src, loc, elemT) {
|
|
|
6907
7021
|
{
|
|
6908
7022
|
kind: "varDecl",
|
|
6909
7023
|
localId: "res.0",
|
|
6910
|
-
init: classIteratorNextCall(lowerer, cit, itRef, loc),
|
|
7024
|
+
init: classIteratorNextCall(lowerer, cit, itRef, nextRef, loc),
|
|
6911
7025
|
loc,
|
|
6912
7026
|
},
|
|
6913
7027
|
...(cit.hasDone
|
|
@@ -6948,6 +7062,7 @@ export function classIteratorDrainCall(lowerer, src, loc, elemT) {
|
|
|
6948
7062
|
locals: [
|
|
6949
7063
|
{ id: "r.0", name: "r", type: recvT, mutable: false },
|
|
6950
7064
|
{ id: "it.0", name: "it", type: cit.iterT, mutable: false },
|
|
7065
|
+
...(nextRead ? [{ id: "next.0", name: "next", type: nextRead.type, mutable: false }] : []),
|
|
6951
7066
|
{ id: "out.0", name: "out", type: outT, mutable: false },
|
|
6952
7067
|
{ id: "res.0", name: "res", type: cit.resultT, mutable: true },
|
|
6953
7068
|
],
|
|
@@ -6964,6 +7079,9 @@ export function classIteratorDrainCall(lowerer, src, loc, elemT) {
|
|
|
6964
7079
|
init: classIteratorOpenCall(lowerer, cit, recvRef, loc),
|
|
6965
7080
|
loc,
|
|
6966
7081
|
},
|
|
7082
|
+
...(nextRead
|
|
7083
|
+
? [{ kind: "varDecl", localId: "next.0", init: nextRead, loc }]
|
|
7084
|
+
: []),
|
|
6967
7085
|
{
|
|
6968
7086
|
kind: "while",
|
|
6969
7087
|
cond: { kind: "boolLit", value: true, type: BOOL, loc },
|
|
@@ -6993,7 +7111,7 @@ export function classIteratorDrainCall(lowerer, src, loc, elemT) {
|
|
|
6993
7111
|
* next() still yields): the drain loop keyed by the iterator class. */
|
|
6994
7112
|
export function classIteratorRestDrainCall(lowerer, cit, itVal, loc) {
|
|
6995
7113
|
const outT = arrayOf(cit.valueT);
|
|
6996
|
-
const key = `it:${cit.iterT.className}`;
|
|
7114
|
+
const key = `it:${cit.iterT.kind === "object" ? cit.iterT.className : typeKey(cit.iterT)}`;
|
|
6997
7115
|
let name = lowerer.iterDrainHelpers.get(key);
|
|
6998
7116
|
if (!name) {
|
|
6999
7117
|
name = keyedHelperName(lowerer, "%iter.drain", key);
|
|
@@ -7005,7 +7123,7 @@ export function classIteratorRestDrainCall(lowerer, cit, itVal, loc) {
|
|
|
7005
7123
|
{
|
|
7006
7124
|
kind: "varDecl",
|
|
7007
7125
|
localId: "res.0",
|
|
7008
|
-
init: classIteratorNextCall(lowerer, cit, itRef, loc),
|
|
7126
|
+
init: classIteratorNextCall(lowerer, cit, itRef, null, loc),
|
|
7009
7127
|
loc,
|
|
7010
7128
|
},
|
|
7011
7129
|
...(cit.hasDone
|
|
@@ -7907,22 +8025,51 @@ export function lowerSuperMethodCall(lowerer, call, access) {
|
|
|
7907
8025
|
lowerer.unsupported("SC1080", access);
|
|
7908
8026
|
const loc = locOf(call);
|
|
7909
8027
|
const thisRef = { kind: "varRef", localId: thisLocal.id, type: thisLocal.type, loc };
|
|
7910
|
-
|
|
7911
|
-
|
|
7912
|
-
|
|
7913
|
-
|
|
7914
|
-
|
|
7915
|
-
|
|
7916
|
-
|
|
7917
|
-
|
|
7918
|
-
|
|
7919
|
-
|
|
8028
|
+
// A method whose `this` is the call-site receiver (a JavaScript class's
|
|
8029
|
+
// receiver-independent method value, reflectedClassMethodValue) looks the
|
|
8030
|
+
// method up on the base class's complete prototype, as `super` reads
|
|
8031
|
+
// [[HomeObject]].[[Prototype]], and calls it with that receiver.
|
|
8032
|
+
const dynamicThis = thisRef.type.kind === "dyn";
|
|
8033
|
+
// While no code reads a prototype method by name (which could replace it),
|
|
8034
|
+
// that method is the declaring class's own: its receiver-independent value
|
|
8035
|
+
// is called directly. Reflecting the base's whole prototype instead would
|
|
8036
|
+
// put its members on the prototype chain of every subclass instance's
|
|
8037
|
+
// property bag, ahead of the subclasses' own compiled overrides.
|
|
8038
|
+
const declared = dynamicThis && !lowerer.prototypeMethodAccesses.has(access.name.text)
|
|
8039
|
+
? reflectedClassMethodValue(lowerer, found.declarer, access.name.text)
|
|
8040
|
+
: null;
|
|
8041
|
+
if (dynamicThis || lowerer.prototypeMethodAccesses.has(access.name.text)) {
|
|
8042
|
+
const prototype = declared
|
|
8043
|
+
? null
|
|
8044
|
+
: dynamicThis && cls.base.decl
|
|
8045
|
+
? reflectClassPrototype(lowerer, cls.base, loc, classValueRef(lowerer, cls.base, access))
|
|
8046
|
+
: classPrototypeData(lowerer, cls.base, loc);
|
|
8047
|
+
if (declared || prototype) {
|
|
8048
|
+
const callee = declared
|
|
8049
|
+
? lowerer.coerceToExpected(declared, DYN)
|
|
8050
|
+
: {
|
|
8051
|
+
kind: "dynKeyGet",
|
|
8052
|
+
value: prototype,
|
|
8053
|
+
key: { kind: "strLit", value: access.name.text, type: STRING, loc },
|
|
8054
|
+
type: DYN,
|
|
8055
|
+
loc,
|
|
8056
|
+
};
|
|
8057
|
+
// Spread arguments are spread into the dynamic call, as in a dynamic method call.
|
|
8058
|
+
const spreads = [];
|
|
8059
|
+
const args = call.arguments.nodes.map((arg, index) => {
|
|
8060
|
+
if (!ts.isSpreadElement(arg))
|
|
8061
|
+
return lowerer.lowerExprExpecting(arg, DYN);
|
|
8062
|
+
const spelling = ts.getTextOfNode(arg.expression);
|
|
8063
|
+
spreads.push({ arg: index, what: spelling });
|
|
8064
|
+
return checkedIterableSpread(lowerer, lowerer.lowerExpr(arg.expression), spelling, loc);
|
|
8065
|
+
});
|
|
7920
8066
|
const value = {
|
|
7921
8067
|
kind: "dynCall",
|
|
7922
8068
|
callee,
|
|
7923
8069
|
receiver: lowerer.coerceToExpected(thisRef, DYN),
|
|
7924
8070
|
calleeName: ts.getTextOfNode(access),
|
|
7925
|
-
args
|
|
8071
|
+
args,
|
|
8072
|
+
...(spreads.length > 0 ? { spreads } : {}),
|
|
7926
8073
|
type: DYN,
|
|
7927
8074
|
loc,
|
|
7928
8075
|
};
|
|
@@ -8240,6 +8387,59 @@ function assignedThisFieldType(lowerer, expr) {
|
|
|
8240
8387
|
}
|
|
8241
8388
|
return lowerer.currentClass?.fields.get(parent.left.name.text) ?? null;
|
|
8242
8389
|
}
|
|
8390
|
+
/** `new arr[i](args)` through a narrowed element read: an interned lifted
|
|
8391
|
+
* function takes the read and the completed arguments, which evaluate in
|
|
8392
|
+
* that order as call arguments, then runs the check and constructs. JS
|
|
8393
|
+
* evaluates the arguments before it checks that the callee constructs, and
|
|
8394
|
+
* the arguments stay in the one call, where a spread's argument pack lives
|
|
8395
|
+
* until every argument has read it. */
|
|
8396
|
+
function checkedElementConstruction(lowerer, info, narrowed, args, loc) {
|
|
8397
|
+
const type = { kind: "object", className: info.def.name };
|
|
8398
|
+
const key = `newChecked:${narrowed.check}:${info.def.name}:${args.map((a) => typeKey(a.type)).join(",")}`;
|
|
8399
|
+
let name = lowerer.valueHelpers.get(key);
|
|
8400
|
+
if (!name) {
|
|
8401
|
+
name = keyedHelperName(lowerer, "%new.checked", key);
|
|
8402
|
+
lowerer.valueHelpers.set(key, name);
|
|
8403
|
+
const params = [
|
|
8404
|
+
{ localId: "value", name: "value", type: narrowed.unionT },
|
|
8405
|
+
{ localId: "message", name: "message", type: STRING },
|
|
8406
|
+
...args.map((arg, i) => ({ localId: `arg.${i}`, name: `arg${i}`, type: arg.type })),
|
|
8407
|
+
];
|
|
8408
|
+
lowerer.liftedFns.push({
|
|
8409
|
+
name,
|
|
8410
|
+
params,
|
|
8411
|
+
returnType: type,
|
|
8412
|
+
locals: params.map((p) => ({ id: p.localId, name: p.name, type: p.type, mutable: false })),
|
|
8413
|
+
body: [
|
|
8414
|
+
{
|
|
8415
|
+
kind: "return",
|
|
8416
|
+
value: {
|
|
8417
|
+
kind: "newValue",
|
|
8418
|
+
callee: {
|
|
8419
|
+
kind: "call",
|
|
8420
|
+
callee: narrowed.check,
|
|
8421
|
+
args: [varRef("value", narrowed.unionT, loc), varRef("message", STRING, loc)],
|
|
8422
|
+
type: narrowed.calleeT,
|
|
8423
|
+
loc,
|
|
8424
|
+
},
|
|
8425
|
+
args: params.slice(2).map((p) => varRef(p.localId, p.type, loc)),
|
|
8426
|
+
type,
|
|
8427
|
+
loc,
|
|
8428
|
+
},
|
|
8429
|
+
loc,
|
|
8430
|
+
},
|
|
8431
|
+
],
|
|
8432
|
+
loc,
|
|
8433
|
+
});
|
|
8434
|
+
}
|
|
8435
|
+
return {
|
|
8436
|
+
kind: "call",
|
|
8437
|
+
callee: name,
|
|
8438
|
+
args: [narrowed.read, narrowed.message, ...args],
|
|
8439
|
+
type,
|
|
8440
|
+
loc,
|
|
8441
|
+
};
|
|
8442
|
+
}
|
|
8243
8443
|
/** Map, Set and the error classes construct in lowerNew's identifier
|
|
8244
8444
|
* branch, which a module member alias of one (`new mod.M()`) also takes. */
|
|
8245
8445
|
function isCollectionOrErrorClass(ref) {
|
|
@@ -8247,9 +8447,9 @@ function isCollectionOrErrorClass(ref) {
|
|
|
8247
8447
|
}
|
|
8248
8448
|
export function lowerNew(lowerer, expr) {
|
|
8249
8449
|
const loc = locOf(expr);
|
|
8250
|
-
//
|
|
8450
|
+
// The deprecated `new Buffer(...)` (containers/bytes.ts).
|
|
8251
8451
|
{
|
|
8252
|
-
const buffer =
|
|
8452
|
+
const buffer = lowerBufferConstruct(lowerer, expr);
|
|
8253
8453
|
if (buffer)
|
|
8254
8454
|
return buffer;
|
|
8255
8455
|
}
|
|
@@ -8277,7 +8477,7 @@ export function lowerNew(lowerer, expr) {
|
|
|
8277
8477
|
const worker = lowerWorkerNew(lowerer, expr);
|
|
8278
8478
|
if (worker)
|
|
8279
8479
|
return worker;
|
|
8280
|
-
const readlineUi = lowerReadlineUiNew(lowerer, expr);
|
|
8480
|
+
const readlineUi = lowerReadlineUiNew(lowerer, expr) ?? lowerReadlineInterfaceNew(lowerer, expr);
|
|
8281
8481
|
if (readlineUi)
|
|
8282
8482
|
return readlineUi;
|
|
8283
8483
|
const channel = lowerMessageChannelNew(lowerer, expr) ?? lowerBroadcastChannelNew(lowerer, expr);
|
|
@@ -8348,19 +8548,39 @@ export function lowerNew(lowerer, expr) {
|
|
|
8348
8548
|
lowerer.isStdlibGlobal(expr.expression.expression, "Intl")) {
|
|
8349
8549
|
const args = expr.arguments?.nodes ?? [];
|
|
8350
8550
|
const undefinedArg = (arg) => (lowerer.typeOf(arg).flags & ts.TypeFlags.Undefined) !== 0;
|
|
8351
|
-
|
|
8352
|
-
|
|
8353
|
-
|
|
8551
|
+
// A literal language tag: Unicode grapheme clusters have no locale
|
|
8552
|
+
// tailoring. Only tags of the form language[-script][-region] are
|
|
8553
|
+
// accepted; each is well-formed, so Node constructs the segmenter
|
|
8554
|
+
// without the RangeError a malformed tag throws.
|
|
8555
|
+
const literalLocale = (arg) => ts.isStringLiteralLike(arg) &&
|
|
8556
|
+
/^[A-Za-z]{2,3}(-[A-Za-z]{4})?(-([A-Za-z]{2}|[0-9]{3}))?$/.test(arg.text);
|
|
8557
|
+
if (args.length > 2 || (args[0] && !undefinedArg(args[0]) && !literalLocale(args[0]))) {
|
|
8558
|
+
lowerer.noLowering("Intl.Segmenter locale negotiation", expr, "omit the locale, pass undefined, or pass one language tag as a string literal");
|
|
8559
|
+
}
|
|
8560
|
+
// JavaScript dependencies may construct word and sentence segmenters
|
|
8561
|
+
// that they use only on some paths (pi-tui's shared word segmenter):
|
|
8562
|
+
// the construction compiles and their segment() throws SC2020.
|
|
8563
|
+
// TypeScript sources keep the build-time refusal.
|
|
8564
|
+
const granularities = isJsSourceFile(ts.getSourceFileOfNode(expr))
|
|
8565
|
+
? ["grapheme", "word", "sentence"]
|
|
8566
|
+
: ["grapheme"];
|
|
8354
8567
|
const options = args[1];
|
|
8355
|
-
|
|
8356
|
-
|
|
8357
|
-
|
|
8358
|
-
|
|
8359
|
-
|
|
8360
|
-
|
|
8361
|
-
|
|
8362
|
-
|
|
8363
|
-
|
|
8568
|
+
let granularity = "grapheme";
|
|
8569
|
+
if (options && !undefinedArg(options)) {
|
|
8570
|
+
// An object literal of `granularity` entries (none: the default; a
|
|
8571
|
+
// repeated key: the last one, as in JavaScript).
|
|
8572
|
+
if (!ts.isObjectLiteralExpression(options))
|
|
8573
|
+
lowerer.noLowering("Intl.Segmenter options", options, 'the native segmenter supports default options and { granularity: "grapheme" }; word and sentence segmentation remain unsupported');
|
|
8574
|
+
for (const property of options.properties.nodes) {
|
|
8575
|
+
if (!ts.isPropertyAssignment(property) ||
|
|
8576
|
+
!(ts.isIdentifier(property.name) || ts.isStringLiteral(property.name)) ||
|
|
8577
|
+
property.name.text !== "granularity" ||
|
|
8578
|
+
!ts.isStringLiteral(property.initializer) ||
|
|
8579
|
+
!granularities.includes(property.initializer.text)) {
|
|
8580
|
+
lowerer.noLowering("Intl.Segmenter options", options, 'the native segmenter supports default options and { granularity: "grapheme" }; word and sentence segmentation remain unsupported');
|
|
8581
|
+
}
|
|
8582
|
+
granularity = property.initializer.text;
|
|
8583
|
+
}
|
|
8364
8584
|
}
|
|
8365
8585
|
// Explicit undefined expressions can carry effects; retain argument order.
|
|
8366
8586
|
const stmts = args.map((arg) => {
|
|
@@ -8371,7 +8591,22 @@ export function lowerNew(lowerer, expr) {
|
|
|
8371
8591
|
loc: locOf(arg),
|
|
8372
8592
|
};
|
|
8373
8593
|
});
|
|
8374
|
-
|
|
8594
|
+
let result = { kind: "libCall", fn: "intl.segmenterNew", args: [], type: DYN, loc };
|
|
8595
|
+
// A word or sentence segmenter carries its segment() refusal, which
|
|
8596
|
+
// coverage lists as deferred to runtime.
|
|
8597
|
+
if (granularity !== "grapheme") {
|
|
8598
|
+
const surface = `Intl.Segmenter segmentation with granularity '${granularity}'`;
|
|
8599
|
+
lowerer.runtimeFences.push(noLoweringDiag(surface, loc, "only grapheme segmenters segment; word and sentence segmenters construct"));
|
|
8600
|
+
const line = ts.getLineAndCharacterOfPosition(ts.getSourceFileOfNode(expr), loc.start).line;
|
|
8601
|
+
const refusal = `${surface} is not supported yet [SC2020 at ${loc.file}:${line + 1}]`;
|
|
8602
|
+
result = {
|
|
8603
|
+
kind: "libCall",
|
|
8604
|
+
fn: "intl.segmenterRefusing",
|
|
8605
|
+
args: [strLit(refusal, loc)],
|
|
8606
|
+
type: DYN,
|
|
8607
|
+
loc,
|
|
8608
|
+
};
|
|
8609
|
+
}
|
|
8375
8610
|
return stmts.length ? { kind: "seqExpr", stmts, result, type: DYN, loc } : result;
|
|
8376
8611
|
}
|
|
8377
8612
|
// A package declaration without a compiled constructor cannot provide
|
|
@@ -8535,6 +8770,47 @@ export function lowerNew(lowerer, expr) {
|
|
|
8535
8770
|
if (agent)
|
|
8536
8771
|
return agent;
|
|
8537
8772
|
}
|
|
8773
|
+
// `new crypto.X509Certificate(data)` — the Dirent-style data record:
|
|
8774
|
+
// the certificate's lowered members (fingerprint — the SHA-1 of the
|
|
8775
|
+
// DER, uppercase colon-separated — plus the validFrom/validTo
|
|
8776
|
+
// validity window in Node's ASN1_TIME_print shape) compute AT
|
|
8777
|
+
// CONSTRUCTION, when Node parses too, so unparseable input throws
|
|
8778
|
+
// Node's exact PEM error here (ERR_OSSL_PEM_NO_START_LINE) and the
|
|
8779
|
+
// handle never exists. Both import forms (`crypto.X509Certificate`
|
|
8780
|
+
// through the namespace, named `X509Certificate`); Buffer input only
|
|
8781
|
+
// — the readFileSync idiom. mapType interns the matching record, so
|
|
8782
|
+
// locals and the composed member reads all flow. The data argument
|
|
8783
|
+
// feeds THREE field computations, so construction goes through an
|
|
8784
|
+
// interned helper whose parameter evaluates it exactly once.
|
|
8785
|
+
// It runs before the standard-library constructor fence below, which
|
|
8786
|
+
// also sees `const X = require("crypto").X509Certificate` as the
|
|
8787
|
+
// builtin class.
|
|
8788
|
+
{
|
|
8789
|
+
const callee = expr.expression;
|
|
8790
|
+
const isX509 = (ts.isPropertyAccessExpression(callee) &&
|
|
8791
|
+
callee.name.text === "X509Certificate" &&
|
|
8792
|
+
lowerer.builtinNamespaceModuleOf(callee.expression) === "crypto") ||
|
|
8793
|
+
(ts.isIdentifier(callee) &&
|
|
8794
|
+
(() => {
|
|
8795
|
+
const bi = lowerer.builtinImportOf(callee);
|
|
8796
|
+
return bi?.module === "crypto" && bi.member === "X509Certificate";
|
|
8797
|
+
})());
|
|
8798
|
+
if (isX509) {
|
|
8799
|
+
const args = expr.arguments?.nodes ?? [];
|
|
8800
|
+
if (args.length !== 1) {
|
|
8801
|
+
lowerer.noLowering("X509Certificate with this argument shape", expr, "the supported form is new X509Certificate(readFileSync(path))");
|
|
8802
|
+
}
|
|
8803
|
+
const data = lowerer.lowerExpr(args[0]);
|
|
8804
|
+
const isBytes = data.type.kind === "bytes" && data.type.elem === "u8";
|
|
8805
|
+
if (!isBytes && data.type.kind !== "string") {
|
|
8806
|
+
lowerer.noLowering(`X509Certificate over '${lowerer.fmt(data.type)}' data`, args[0], "pass the certificate Buffer or PEM string (an fs.readFileSync result)");
|
|
8807
|
+
}
|
|
8808
|
+
const t = lowerer.mapTypeOf(lowerer.typeOf(expr));
|
|
8809
|
+
if (t?.kind !== "record")
|
|
8810
|
+
lowerer.badType(expr, lowerer.typeOf(expr));
|
|
8811
|
+
return x509RecordCall(lowerer, data, t, loc);
|
|
8812
|
+
}
|
|
8813
|
+
}
|
|
8538
8814
|
if (ts.isIdentifier(expr.expression) ||
|
|
8539
8815
|
(ts.isPropertyAccessExpression(expr.expression) &&
|
|
8540
8816
|
ts.isIdentifier(expr.expression.name) &&
|
|
@@ -8547,7 +8823,9 @@ export function lowerNew(lowerer, expr) {
|
|
|
8547
8823
|
if (ts.isIdentifier(expr.expression))
|
|
8548
8824
|
fenceEarlyAliasUse(lowerer, expr.expression, expr);
|
|
8549
8825
|
const identifier = ts.isIdentifier(expr.expression) ? expr.expression : expr.expression.name;
|
|
8550
|
-
const
|
|
8826
|
+
// `const SD = require("string_decoder").StringDecoder; new SD()`
|
|
8827
|
+
// constructs the member, as a named import of it does.
|
|
8828
|
+
const symbol = builtinMemberBindingTarget(lowerer, ts.isIdentifier(identifier) ? lowerer.resolveValueSymbol(identifier) : null);
|
|
8551
8829
|
if (ts.isIdentifier(identifier) && lowerer.isStdlibGlobal(identifier, "Array")) {
|
|
8552
8830
|
return lowerArrayConstructor(lowerer, expr, expr.arguments?.nodes ?? []);
|
|
8553
8831
|
}
|
|
@@ -8825,8 +9103,31 @@ export function lowerNew(lowerer, expr) {
|
|
|
8825
9103
|
if (arg.type.kind === "string") {
|
|
8826
9104
|
return { kind: "libCall", fn: "date.newString", args: [arg], type: DATE_T, loc };
|
|
8827
9105
|
}
|
|
9106
|
+
// new Date(date): a new Date object with the same time value.
|
|
8828
9107
|
if (arg.type.kind === "date") {
|
|
8829
|
-
|
|
9108
|
+
const time = { kind: "libCall", fn: "date.getTime", args: [arg], type: F64, loc };
|
|
9109
|
+
return { kind: "libCall", fn: "date.newMs", args: [time], type: DATE_T, loc };
|
|
9110
|
+
}
|
|
9111
|
+
// A union (`Date | string | number`) or checked-dynamic value: the
|
|
9112
|
+
// runtime's constructor reads a Date's time value, parses a string
|
|
9113
|
+
// and converts anything else to a primitive and a number.
|
|
9114
|
+
if ((arg.type.kind === "union" || arg.type.kind === "dyn") &&
|
|
9115
|
+
lowerer.dynConvertible(arg.type)) {
|
|
9116
|
+
const value = {
|
|
9117
|
+
kind: "libCall",
|
|
9118
|
+
fn: "date.nativeNewValue",
|
|
9119
|
+
args: [
|
|
9120
|
+
{
|
|
9121
|
+
kind: "dynArrLit",
|
|
9122
|
+
elems: [lowerer.coerceToExpected(arg, DYN)],
|
|
9123
|
+
type: DYN,
|
|
9124
|
+
loc,
|
|
9125
|
+
},
|
|
9126
|
+
],
|
|
9127
|
+
type: DYN,
|
|
9128
|
+
loc,
|
|
9129
|
+
};
|
|
9130
|
+
return { kind: "libCall", fn: "date.checkedValue", args: [value], type: DATE_T, loc };
|
|
8830
9131
|
}
|
|
8831
9132
|
lowerer.noLowering(`new Date of '${lowerer.fmt(arg.type)}' values`, args[0], "pass milliseconds, a date string, or another Date value", symbol);
|
|
8832
9133
|
}
|
|
@@ -8952,7 +9253,12 @@ export function lowerNew(lowerer, expr) {
|
|
|
8952
9253
|
// expression). The CONTEXTUAL type carries the annotation — adopt
|
|
8953
9254
|
// it when it is a supported map. TS type arguments keep winning:
|
|
8954
9255
|
// their expression type already maps.
|
|
8955
|
-
|
|
9256
|
+
const inferred = initializedCollectionType(lowerer, expr);
|
|
9257
|
+
if (inferred) {
|
|
9258
|
+
tsType = inferred;
|
|
9259
|
+
mapped = lowerer.mapTypeOf(inferred);
|
|
9260
|
+
}
|
|
9261
|
+
else if (mapped?.kind !== "map" || contextualSeed) {
|
|
8956
9262
|
const ctx = lowerer.checker.getContextualType(expr);
|
|
8957
9263
|
const ctxMapped = ctx ? lowerer.mapTypeOf(ctx) : null;
|
|
8958
9264
|
if (ctx && ctxMapped?.kind === "map") {
|
|
@@ -9005,7 +9311,7 @@ export function lowerNew(lowerer, expr) {
|
|
|
9005
9311
|
if (targs[1]) {
|
|
9006
9312
|
lowerer.unsupported("SC1090", expr, `Map values of type '${lowerer.checker.typeToString(targs[1])}' ` +
|
|
9007
9313
|
`(Map values must be number, string, boolean, records, class instances, functions, ` +
|
|
9008
|
-
`typed arrays, arrays, promises, Maps, Sets, or supported unions and checked values)`);
|
|
9314
|
+
`typed arrays, arrays, promises, Dates, Maps, Sets, or supported unions and checked values)`);
|
|
9009
9315
|
}
|
|
9010
9316
|
lowerer.badType(expr, tsType);
|
|
9011
9317
|
}
|
|
@@ -9062,7 +9368,8 @@ export function lowerNew(lowerer, expr) {
|
|
|
9062
9368
|
// `new Set<T>()`: construct + bulk add from supported values,
|
|
9063
9369
|
// including live collection cursors. Duplicates collapse in insertion order.
|
|
9064
9370
|
if (ts.isIdentifier(identifier) && lowerer.isStdlibGlobal(identifier, "Set")) {
|
|
9065
|
-
const
|
|
9371
|
+
const inferred = initializedCollectionType(lowerer, expr);
|
|
9372
|
+
const tsType = inferred ?? lowerer.typeOf(expr);
|
|
9066
9373
|
let mapped = lowerer.mapTypeOf(tsType);
|
|
9067
9374
|
const fieldType = assignedThisFieldType(lowerer, expr);
|
|
9068
9375
|
if (mapped?.kind !== "set" && fieldType?.kind === "set")
|
|
@@ -9123,15 +9430,21 @@ export function lowerNew(lowerer, expr) {
|
|
|
9123
9430
|
lowerer.badType(expr, tsType);
|
|
9124
9431
|
}
|
|
9125
9432
|
// `new AsyncLocalStorage()` (node:async_hooks): a fresh store id —
|
|
9126
|
-
// an f64 handle (type-mapper.ts), the Channel story.
|
|
9127
|
-
// ({ defaultValue, name })
|
|
9433
|
+
// an f64 handle (type-mapper.ts), the Channel story. The options form
|
|
9434
|
+
// ({ defaultValue, name }) passes the options object as a dyn value.
|
|
9128
9435
|
if (symbol !== null &&
|
|
9129
9436
|
ts.symbolName(symbol) === "AsyncLocalStorage" &&
|
|
9130
9437
|
lowerer.isStdlibSymbol(symbol)) {
|
|
9131
|
-
|
|
9132
|
-
|
|
9133
|
-
|
|
9134
|
-
return {
|
|
9438
|
+
const options = expr.arguments?.nodes[0];
|
|
9439
|
+
if (options === undefined)
|
|
9440
|
+
return { kind: "libCall", fn: "als.new", args: [], type: F64, loc };
|
|
9441
|
+
return {
|
|
9442
|
+
kind: "libCall",
|
|
9443
|
+
fn: "als.newOptions",
|
|
9444
|
+
args: [lowerAsyncLocalStorageOptions(lowerer, options)],
|
|
9445
|
+
type: F64,
|
|
9446
|
+
loc,
|
|
9447
|
+
};
|
|
9135
9448
|
}
|
|
9136
9449
|
// `new Promise<T>((resolve) => ...)`: the ambient Promise constructor.
|
|
9137
9450
|
if (symbol !== null && ts.symbolName(symbol) === "Promise" && lowerer.isStdlibSymbol(symbol)) {
|
|
@@ -9201,38 +9514,6 @@ export function lowerNew(lowerer, expr) {
|
|
|
9201
9514
|
// families carry pointed hints: each states WHY no honest static
|
|
9202
9515
|
// lowering exists (or what to use instead).
|
|
9203
9516
|
if (lowerer.isStdlibSymbol(symbol ?? undefined)) {
|
|
9204
|
-
// The deprecated `new Buffer(string, encoding?)` ctor's string arm
|
|
9205
|
-
// with a NON-STRING first argument and a string second: Node
|
|
9206
|
-
// throws ERR_INVALID_ARG_TYPE synchronously (and DEP0005 never
|
|
9207
|
-
// fires on this throwing path, so the compiled silence matches).
|
|
9208
|
-
// Every other new Buffer form keeps the fence below — the
|
|
9209
|
-
// constructing forms would owe the deprecation warning.
|
|
9210
|
-
if (expr.expression.text === "Buffer" &&
|
|
9211
|
-
expr.arguments?.nodes.length === 2 &&
|
|
9212
|
-
!expr.arguments.nodes.some(ts.isSpreadElement) &&
|
|
9213
|
-
lowerer.mapTypeOf(lowerer.typeOf(expr.arguments.nodes[0]))?.kind !== "string" &&
|
|
9214
|
-
lowerer.mapTypeOf(lowerer.typeOf(expr.arguments.nodes[1]))?.kind === "string") {
|
|
9215
|
-
const first = lowerer.lowerExpr(expr.arguments.nodes[0]);
|
|
9216
|
-
if (first.kind === "unitLit" ||
|
|
9217
|
-
first.type.kind === "dyn" ||
|
|
9218
|
-
lowerer.dynConvertible(first.type)) {
|
|
9219
|
-
const got = first.type.kind === "dyn" ? first : { kind: "dynFrom", value: first, type: DYN, loc };
|
|
9220
|
-
// The encoding argument still evaluates in Node before the
|
|
9221
|
-
// throw only via the ctor body's later reads — it does NOT
|
|
9222
|
-
// observe it before throwing, so dropping it is exact for
|
|
9223
|
-
// effect-free operands; effectful ones keep the fence.
|
|
9224
|
-
const enc = lowerer.lowerExpr(expr.arguments.nodes[1]);
|
|
9225
|
-
if (enc.kind === "strLit" || isSafeToRepeat(enc)) {
|
|
9226
|
-
return {
|
|
9227
|
-
kind: "libCall",
|
|
9228
|
-
fn: "buffer.newStringFail",
|
|
9229
|
-
args: [got],
|
|
9230
|
-
type: bytesOf("u8"),
|
|
9231
|
-
loc,
|
|
9232
|
-
};
|
|
9233
|
-
}
|
|
9234
|
-
}
|
|
9235
|
-
}
|
|
9236
9517
|
const ctorHints = {
|
|
9237
9518
|
RegExp: "use a regex literal (/pattern/flags) — constructed regexes have no lowering",
|
|
9238
9519
|
String: "boxed wrapper objects have no lowering — use the string primitive (the box is only distinguishable via typeof/identity, which nothing here can honor)",
|
|
@@ -9247,79 +9528,6 @@ export function lowerNew(lowerer, expr) {
|
|
|
9247
9528
|
lowerer.noLowering(`new ${expr.expression.text}`, expr, ctorHints[ts.isIdentifier(expr.expression) ? expr.expression.text : expr.expression.name.text], symbol);
|
|
9248
9529
|
}
|
|
9249
9530
|
}
|
|
9250
|
-
// `new crypto.X509Certificate(data)` — the Dirent-style data record:
|
|
9251
|
-
// the certificate's lowered members (fingerprint — the SHA-1 of the
|
|
9252
|
-
// DER, uppercase colon-separated — plus the validFrom/validTo
|
|
9253
|
-
// validity window in Node's ASN1_TIME_print shape) compute AT
|
|
9254
|
-
// CONSTRUCTION, when Node parses too, so unparseable input throws
|
|
9255
|
-
// Node's exact PEM error here (ERR_OSSL_PEM_NO_START_LINE) and the
|
|
9256
|
-
// handle never exists. Both import forms (`crypto.X509Certificate`
|
|
9257
|
-
// through the namespace, named `X509Certificate`); Buffer input only
|
|
9258
|
-
// — the readFileSync idiom. mapType interns the matching record, so
|
|
9259
|
-
// locals and the composed member reads all flow. The data argument
|
|
9260
|
-
// feeds THREE field computations, so construction goes through an
|
|
9261
|
-
// interned helper whose parameter evaluates it exactly once.
|
|
9262
|
-
{
|
|
9263
|
-
const callee = expr.expression;
|
|
9264
|
-
const isX509 = (ts.isPropertyAccessExpression(callee) &&
|
|
9265
|
-
callee.name.text === "X509Certificate" &&
|
|
9266
|
-
lowerer.builtinNamespaceModuleOf(callee.expression) === "crypto") ||
|
|
9267
|
-
(ts.isIdentifier(callee) &&
|
|
9268
|
-
(() => {
|
|
9269
|
-
const bi = lowerer.builtinImportOf(callee);
|
|
9270
|
-
return bi?.module === "crypto" && bi.member === "X509Certificate";
|
|
9271
|
-
})());
|
|
9272
|
-
if (isX509) {
|
|
9273
|
-
const args = expr.arguments?.nodes ?? [];
|
|
9274
|
-
if (args.length !== 1) {
|
|
9275
|
-
lowerer.noLowering("X509Certificate with this argument shape", expr, "the supported form is new X509Certificate(readFileSync(path))");
|
|
9276
|
-
}
|
|
9277
|
-
const data = lowerer.lowerExpr(args[0]);
|
|
9278
|
-
const isBytes = data.type.kind === "bytes" && data.type.elem === "u8";
|
|
9279
|
-
if (!isBytes && data.type.kind !== "string") {
|
|
9280
|
-
lowerer.noLowering(`X509Certificate over '${lowerer.fmt(data.type)}' data`, args[0], "pass the certificate Buffer or PEM string (an fs.readFileSync result)");
|
|
9281
|
-
}
|
|
9282
|
-
const t = lowerer.mapTypeOf(lowerer.typeOf(expr));
|
|
9283
|
-
if (t?.kind !== "record")
|
|
9284
|
-
lowerer.badType(expr, lowerer.typeOf(expr));
|
|
9285
|
-
const key = `x509.record:${isBytes ? "bytes" : "str"}`;
|
|
9286
|
-
let helper = lowerer.valueHelpers.get(key);
|
|
9287
|
-
if (!helper) {
|
|
9288
|
-
helper = keyedHelperName(lowerer, "%x509.record", key);
|
|
9289
|
-
lowerer.valueHelpers.set(key, helper);
|
|
9290
|
-
const dataT = data.type;
|
|
9291
|
-
const dRef = { kind: "varRef", localId: "d.0", type: dataT, loc };
|
|
9292
|
-
const field = (name, fn) => ({
|
|
9293
|
-
name,
|
|
9294
|
-
value: { kind: "libCall", fn, args: [dRef], type: STRING, loc },
|
|
9295
|
-
});
|
|
9296
|
-
lowerer.liftedFns.push({
|
|
9297
|
-
name: helper,
|
|
9298
|
-
params: [{ localId: "d.0", name: "d", type: dataT }],
|
|
9299
|
-
returnType: t,
|
|
9300
|
-
locals: [{ id: "d.0", name: "d", type: dataT, mutable: false }],
|
|
9301
|
-
body: [
|
|
9302
|
-
{
|
|
9303
|
-
kind: "return",
|
|
9304
|
-
value: {
|
|
9305
|
-
kind: "recordLit",
|
|
9306
|
-
fields: [
|
|
9307
|
-
field("fingerprint", isBytes ? "crypto.x509Fingerprint" : "crypto.x509FingerprintStr"),
|
|
9308
|
-
field("validFrom", isBytes ? "crypto.x509ValidFrom" : "crypto.x509ValidFromStr"),
|
|
9309
|
-
field("validTo", isBytes ? "crypto.x509ValidTo" : "crypto.x509ValidToStr"),
|
|
9310
|
-
],
|
|
9311
|
-
type: t,
|
|
9312
|
-
loc,
|
|
9313
|
-
},
|
|
9314
|
-
loc,
|
|
9315
|
-
},
|
|
9316
|
-
],
|
|
9317
|
-
loc,
|
|
9318
|
-
});
|
|
9319
|
-
}
|
|
9320
|
-
return { kind: "call", callee: helper, args: [data], type: t, loc };
|
|
9321
|
-
}
|
|
9322
|
-
}
|
|
9323
9531
|
// `new X(...)` through a class VALUE (a classval-typed binding, array
|
|
9324
9532
|
// element, map read, param): the newValue dispatch through the class
|
|
9325
9533
|
// object's construct thunk. Arguments complete against the STATIC
|
|
@@ -9358,9 +9566,108 @@ export function lowerNew(lowerer, expr) {
|
|
|
9358
9566
|
if (info.generic) {
|
|
9359
9567
|
lowerer.unsupported("SC1090", expr, "constructing through a class value of an uninstantiated generic type (annotate the slot with a concrete instantiation — e.g. 'new (v: number) => Box<number>')");
|
|
9360
9568
|
}
|
|
9361
|
-
|
|
9569
|
+
let callee = lowerer.lowerExpr(expr.expression);
|
|
9362
9570
|
if (callee.type.kind === "dyn")
|
|
9363
9571
|
return lowerCheckedConstructor(lowerer, expr, callee);
|
|
9572
|
+
/** The union-typed element read a narrowing check guards, and the
|
|
9573
|
+
* check (`%new.callee`) that yields the class value or throws. */
|
|
9574
|
+
let narrowedCallee = null;
|
|
9575
|
+
// An array element read (`new T[0]()` over `[Dog, Animal]`, whose
|
|
9576
|
+
// checker type is the common base) keeps the undefined an index past
|
|
9577
|
+
// the end reads: the class value is narrowed out with a check, which
|
|
9578
|
+
// throws a TypeError for undefined.
|
|
9579
|
+
if (callee.type.kind === "union") {
|
|
9580
|
+
const arms = lowerer.unions.get(callee.type.unionId)?.arms ?? [];
|
|
9581
|
+
const classArms = arms.filter((arm) => arm.kind === "classval");
|
|
9582
|
+
if (classArms.length === 1 &&
|
|
9583
|
+
classArms[0].kind === "classval" &&
|
|
9584
|
+
classArms[0].className === calleeT.className &&
|
|
9585
|
+
arms.every((arm) => arm.kind === "classval" || arm.kind === "undefinedT")) {
|
|
9586
|
+
const unionT = callee.type;
|
|
9587
|
+
const helper = lowerer.narrowedArmHelper(unionT.unionId, calleeT, callee.loc);
|
|
9588
|
+
if (helper) {
|
|
9589
|
+
const loc = callee.loc;
|
|
9590
|
+
const name = `%new.callee:${unionT.unionId}`;
|
|
9591
|
+
if (!lowerer.liftedFns.some((fn) => fn.name === name)) {
|
|
9592
|
+
const undefinedTag = lowerer.armTag(unionT.unionId, UNDEFINED_T);
|
|
9593
|
+
const value = { kind: "varRef", localId: "value", type: unionT, loc };
|
|
9594
|
+
lowerer.liftedFns.push({
|
|
9595
|
+
name,
|
|
9596
|
+
params: [
|
|
9597
|
+
{ localId: "value", name: "value", type: unionT },
|
|
9598
|
+
{ localId: "message", name: "message", type: STRING },
|
|
9599
|
+
],
|
|
9600
|
+
locals: [
|
|
9601
|
+
{ id: "value", name: "value", type: unionT, mutable: false },
|
|
9602
|
+
{ id: "message", name: "message", type: STRING, mutable: false },
|
|
9603
|
+
],
|
|
9604
|
+
returnType: calleeT,
|
|
9605
|
+
body: [
|
|
9606
|
+
...(undefinedTag >= 0
|
|
9607
|
+
? [
|
|
9608
|
+
{
|
|
9609
|
+
kind: "if",
|
|
9610
|
+
cond: {
|
|
9611
|
+
kind: "unionIsTag",
|
|
9612
|
+
unionId: unionT.unionId,
|
|
9613
|
+
tag: undefinedTag,
|
|
9614
|
+
negated: false,
|
|
9615
|
+
value,
|
|
9616
|
+
type: BOOL,
|
|
9617
|
+
loc,
|
|
9618
|
+
},
|
|
9619
|
+
then: [
|
|
9620
|
+
{
|
|
9621
|
+
kind: "throw",
|
|
9622
|
+
value: {
|
|
9623
|
+
kind: "libCall",
|
|
9624
|
+
fn: "error.new",
|
|
9625
|
+
args: [{ kind: "varRef", localId: "message", type: STRING, loc }],
|
|
9626
|
+
type: { kind: "object", className: "%TypeError" },
|
|
9627
|
+
loc,
|
|
9628
|
+
},
|
|
9629
|
+
loc,
|
|
9630
|
+
},
|
|
9631
|
+
],
|
|
9632
|
+
else_: null,
|
|
9633
|
+
loc,
|
|
9634
|
+
},
|
|
9635
|
+
]
|
|
9636
|
+
: []),
|
|
9637
|
+
{
|
|
9638
|
+
kind: "return",
|
|
9639
|
+
value: lowerer.checkedNarrowCall(helper, value, calleeT, loc),
|
|
9640
|
+
loc,
|
|
9641
|
+
},
|
|
9642
|
+
],
|
|
9643
|
+
loc,
|
|
9644
|
+
});
|
|
9645
|
+
}
|
|
9646
|
+
// JavaScript evaluates the arguments before it checks that the
|
|
9647
|
+
// callee constructs, so the check runs at the construction
|
|
9648
|
+
// (checkedElementConstruction).
|
|
9649
|
+
narrowedCallee = {
|
|
9650
|
+
read: callee,
|
|
9651
|
+
check: name,
|
|
9652
|
+
unionT,
|
|
9653
|
+
calleeT,
|
|
9654
|
+
message: {
|
|
9655
|
+
kind: "strLit",
|
|
9656
|
+
value: `${expr.expression.getText()} is not a constructor`,
|
|
9657
|
+
type: STRING,
|
|
9658
|
+
loc,
|
|
9659
|
+
},
|
|
9660
|
+
};
|
|
9661
|
+
callee = {
|
|
9662
|
+
kind: "call",
|
|
9663
|
+
callee: name,
|
|
9664
|
+
args: [callee, narrowedCallee.message],
|
|
9665
|
+
type: calleeT,
|
|
9666
|
+
loc,
|
|
9667
|
+
};
|
|
9668
|
+
}
|
|
9669
|
+
}
|
|
9670
|
+
}
|
|
9364
9671
|
if (callee.type.kind !== "classval")
|
|
9365
9672
|
lowerer.badType(expr.expression, lowerer.typeOf(expr.expression));
|
|
9366
9673
|
lowerer.noteEdge(classValueConstructor(info.def).fn);
|
|
@@ -9386,13 +9693,15 @@ export function lowerNew(lowerer, expr) {
|
|
|
9386
9693
|
refuseInheritedBuiltinCtorArgs(lowerer, info, expr);
|
|
9387
9694
|
defineClassValueConstruct(lowerer, info);
|
|
9388
9695
|
const args = lowerer.completeArgs(expr.arguments?.nodes ?? [], classValueParams(info), loc, expr);
|
|
9389
|
-
const built = constructedFromValue(lowerer, info,
|
|
9390
|
-
|
|
9391
|
-
|
|
9392
|
-
|
|
9393
|
-
|
|
9394
|
-
|
|
9395
|
-
|
|
9696
|
+
const built = constructedFromValue(lowerer, info, narrowedCallee !== null
|
|
9697
|
+
? checkedElementConstruction(lowerer, info, narrowedCallee, args, loc)
|
|
9698
|
+
: {
|
|
9699
|
+
kind: "newValue",
|
|
9700
|
+
callee,
|
|
9701
|
+
args,
|
|
9702
|
+
type: { kind: "object", className: info.def.name },
|
|
9703
|
+
loc,
|
|
9704
|
+
}, expr);
|
|
9396
9705
|
// A runtime class slot widened from a union (`[Readable, Writable]`'s
|
|
9397
9706
|
// elements hold EventEmitter values): the checker types the result as
|
|
9398
9707
|
// the union of the arms' instances, which the checked class view
|
|
@@ -9527,14 +9836,149 @@ function genericFieldFnNodeOf(member) {
|
|
|
9527
9836
|
}
|
|
9528
9837
|
return null;
|
|
9529
9838
|
}
|
|
9839
|
+
/** The lifted `new crypto.X509Certificate(d)` constructor: raw decodes the
|
|
9840
|
+
* input once (Node's PEM error throws here), and every other field reads
|
|
9841
|
+
* raw. subjectAltName, infoAccess and signatureAlgorithm hold undefined
|
|
9842
|
+
* where the runtime answers "". */
|
|
9843
|
+
/** The X509Certificate record `t` built from `data`, a certificate Buffer
|
|
9844
|
+
* (PEM or DER) or PEM string, through the interned constructor helper.
|
|
9845
|
+
* `der` marks a Buffer known to hold a certificate's DER (a TLS socket's),
|
|
9846
|
+
* which is read without looking for PEM armor inside it. */
|
|
9847
|
+
export function x509RecordCall(lowerer, data, t, loc, der = false) {
|
|
9848
|
+
const isBytes = data.type.kind === "bytes" && data.type.elem === "u8";
|
|
9849
|
+
const key = `x509.record:${der ? "der" : isBytes ? "bytes" : "str"}`;
|
|
9850
|
+
let helper = lowerer.valueHelpers.get(key);
|
|
9851
|
+
if (!helper) {
|
|
9852
|
+
helper = keyedHelperName(lowerer, "%x509.record", key);
|
|
9853
|
+
lowerer.valueHelpers.set(key, helper);
|
|
9854
|
+
lowerer.liftedFns.push(x509RecordHelper(lowerer, helper, data.type, t, isBytes, der, loc));
|
|
9855
|
+
}
|
|
9856
|
+
return { kind: "call", callee: helper, args: [data], type: t, loc };
|
|
9857
|
+
}
|
|
9858
|
+
function x509RecordHelper(lowerer, name, dataT, t, isBytes, der, loc) {
|
|
9859
|
+
const shape = lowerer.shapes.get(t.shapeId);
|
|
9860
|
+
if (!shape)
|
|
9861
|
+
throw new InternalCompilerError("lowerer bug: X509Certificate shape unregistered");
|
|
9862
|
+
const raw = { kind: "varRef", localId: "raw.0", type: BYTES_U8, loc };
|
|
9863
|
+
const call = (fn, type) => ({
|
|
9864
|
+
kind: "libCall",
|
|
9865
|
+
fn,
|
|
9866
|
+
args: [raw],
|
|
9867
|
+
type,
|
|
9868
|
+
loc,
|
|
9869
|
+
});
|
|
9870
|
+
const locals = [
|
|
9871
|
+
{ id: "d.0", name: "d", type: dataT, mutable: false },
|
|
9872
|
+
{ id: "raw.0", name: "raw", type: BYTES_U8, mutable: false },
|
|
9873
|
+
];
|
|
9874
|
+
const decls = [
|
|
9875
|
+
{
|
|
9876
|
+
kind: "varDecl",
|
|
9877
|
+
localId: "raw.0",
|
|
9878
|
+
init: {
|
|
9879
|
+
kind: "libCall",
|
|
9880
|
+
fn: der ? "crypto.x509RawDer" : isBytes ? "crypto.x509Raw" : "crypto.x509RawStr",
|
|
9881
|
+
args: [{ kind: "varRef", localId: "d.0", type: dataT, loc }],
|
|
9882
|
+
type: BYTES_U8,
|
|
9883
|
+
loc,
|
|
9884
|
+
},
|
|
9885
|
+
loc,
|
|
9886
|
+
},
|
|
9887
|
+
];
|
|
9888
|
+
const validTime = (fn) => ({
|
|
9889
|
+
kind: "libCall",
|
|
9890
|
+
fn: "date.newString",
|
|
9891
|
+
args: [call(fn, STRING)],
|
|
9892
|
+
type: DATE_T,
|
|
9893
|
+
loc,
|
|
9894
|
+
});
|
|
9895
|
+
const values = {
|
|
9896
|
+
ca: () => call("crypto.x509Ca", BOOL),
|
|
9897
|
+
fingerprint: () => call("crypto.x509Fingerprint", STRING),
|
|
9898
|
+
fingerprint256: () => call("crypto.x509Fingerprint256", STRING),
|
|
9899
|
+
fingerprint512: () => call("crypto.x509Fingerprint512", STRING),
|
|
9900
|
+
subject: () => call("crypto.x509Subject", STRING),
|
|
9901
|
+
subjectAltName: (type) => optionalText("san", "crypto.x509SubjectAltName", type),
|
|
9902
|
+
infoAccess: (type) => optionalText("access", "crypto.x509InfoAccess", type),
|
|
9903
|
+
issuer: () => call("crypto.x509Issuer", STRING),
|
|
9904
|
+
raw: () => raw,
|
|
9905
|
+
serialNumber: () => call("crypto.x509SerialNumber", STRING),
|
|
9906
|
+
signatureAlgorithm: (type) => optionalText("sigalg", "crypto.x509SignatureAlgorithm", type),
|
|
9907
|
+
signatureAlgorithmOid: () => call("crypto.x509SignatureAlgorithmOid", STRING),
|
|
9908
|
+
validFrom: () => call("crypto.x509ValidFrom", STRING),
|
|
9909
|
+
validFromDate: () => validTime("crypto.x509ValidFrom"),
|
|
9910
|
+
validTo: () => call("crypto.x509ValidTo", STRING),
|
|
9911
|
+
validToDate: () => validTime("crypto.x509ValidTo"),
|
|
9912
|
+
[X509_PUBLIC_KEY_FIELD]: () => ({
|
|
9913
|
+
kind: "dynFrom",
|
|
9914
|
+
value: { kind: "unitLit", unit: "undefined", type: UNDEFINED_T, loc },
|
|
9915
|
+
type: DYN,
|
|
9916
|
+
loc,
|
|
9917
|
+
}),
|
|
9918
|
+
// A copy: writes into `raw` must not reach the methods.
|
|
9919
|
+
[X509_DER_FIELD]: () => call("crypto.x509RawDer", BYTES_U8),
|
|
9920
|
+
};
|
|
9921
|
+
/** A string | undefined field: the runtime's text, or undefined for "". */
|
|
9922
|
+
function optionalText(local, fn, type) {
|
|
9923
|
+
if (type.kind !== "union")
|
|
9924
|
+
throw new InternalCompilerError("lowerer bug: X509Certificate optional field type");
|
|
9925
|
+
const def = lowerer.unions.get(type.unionId);
|
|
9926
|
+
const stringTag = def ? def.arms.findIndex((a) => a.kind === "string") : -1;
|
|
9927
|
+
const undefinedTag = def ? def.arms.findIndex((a) => a.kind === "undefinedT") : -1;
|
|
9928
|
+
if (stringTag < 0 || undefinedTag < 0)
|
|
9929
|
+
throw new InternalCompilerError("lowerer bug: X509Certificate optional field arms");
|
|
9930
|
+
const id = `${local}.0`;
|
|
9931
|
+
locals.push({ id, name: local, type: STRING, mutable: false });
|
|
9932
|
+
decls.push({ kind: "varDecl", localId: id, init: call(fn, STRING), loc });
|
|
9933
|
+
const text = { kind: "varRef", localId: id, type: STRING, loc };
|
|
9934
|
+
return {
|
|
9935
|
+
kind: "ternary",
|
|
9936
|
+
cond: {
|
|
9937
|
+
kind: "strEq",
|
|
9938
|
+
negated: false,
|
|
9939
|
+
left: text,
|
|
9940
|
+
right: { kind: "strLit", value: "", type: STRING, loc },
|
|
9941
|
+
type: BOOL,
|
|
9942
|
+
loc,
|
|
9943
|
+
},
|
|
9944
|
+
then: {
|
|
9945
|
+
kind: "unionWrap",
|
|
9946
|
+
unionId: type.unionId,
|
|
9947
|
+
tag: undefinedTag,
|
|
9948
|
+
value: { kind: "unitLit", unit: "undefined", type: UNDEFINED_T, loc },
|
|
9949
|
+
type,
|
|
9950
|
+
loc,
|
|
9951
|
+
},
|
|
9952
|
+
else_: { kind: "unionWrap", unionId: type.unionId, tag: stringTag, value: text, type, loc },
|
|
9953
|
+
type,
|
|
9954
|
+
loc,
|
|
9955
|
+
};
|
|
9956
|
+
}
|
|
9957
|
+
const fields = shape.fields.map((f) => {
|
|
9958
|
+
const value = values[f.name];
|
|
9959
|
+
if (!value)
|
|
9960
|
+
throw new InternalCompilerError(`lowerer bug: X509Certificate field ${f.name}`);
|
|
9961
|
+
return { name: f.name, value: value(f.type) };
|
|
9962
|
+
});
|
|
9963
|
+
return {
|
|
9964
|
+
name,
|
|
9965
|
+
params: [{ localId: "d.0", name: "d", type: dataT }],
|
|
9966
|
+
returnType: t,
|
|
9967
|
+
locals,
|
|
9968
|
+
body: [...decls, { kind: "return", value: { kind: "recordLit", fields, type: t, loc }, loc }],
|
|
9969
|
+
loc,
|
|
9970
|
+
};
|
|
9971
|
+
}
|
|
9530
9972
|
/** Whether a JavaScript class's own binding is the target of
|
|
9531
|
-
* `Object.defineProperty`/`defineProperties`
|
|
9532
|
-
* (`Object.defineProperty(Definition, "name", { value })
|
|
9973
|
+
* `Object.defineProperty`/`defineProperties` or `Reflect.deleteProperty` in
|
|
9974
|
+
* its file (`Object.defineProperty(Definition, "name", { value })`,
|
|
9975
|
+
* `Reflect.deleteProperty(Response, "getResponseState")`): its constructor
|
|
9533
9976
|
* then needs a live own-property table. */
|
|
9534
9977
|
function definedThroughReflection(lowerer, decl) {
|
|
9535
9978
|
const name = decl.name;
|
|
9536
9979
|
const sf = ts.getSourceFileOfNode(decl);
|
|
9537
|
-
if (name === undefined ||
|
|
9980
|
+
if (name === undefined ||
|
|
9981
|
+
(!sf.text.includes("definePropert") && !sf.text.includes("deleteProperty")))
|
|
9538
9982
|
return false;
|
|
9539
9983
|
const symbol = lowerer.checker.getSymbolAtLocation(name);
|
|
9540
9984
|
if (symbol === undefined)
|
|
@@ -9545,9 +9989,11 @@ function definedThroughReflection(lowerer, decl) {
|
|
|
9545
9989
|
return "stop";
|
|
9546
9990
|
if (ts.isCallExpression(node) &&
|
|
9547
9991
|
ts.isPropertyAccessExpression(node.expression) &&
|
|
9548
|
-
(node.expression.name.text === "defineProperty" ||
|
|
9992
|
+
(((node.expression.name.text === "defineProperty" ||
|
|
9549
9993
|
node.expression.name.text === "defineProperties") &&
|
|
9550
|
-
|
|
9994
|
+
lowerer.stdlibGlobalMember(node.expression, "Object") !== null) ||
|
|
9995
|
+
(node.expression.name.text === "deleteProperty" &&
|
|
9996
|
+
lowerer.stdlibGlobalMember(node.expression, "Reflect") !== null))) {
|
|
9551
9997
|
const target = node.arguments.nodes[0];
|
|
9552
9998
|
if (target !== undefined &&
|
|
9553
9999
|
ts.isIdentifier(target) &&
|