@scriptc/compiler 0.2.5 → 0.2.7
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 +62 -48
- package/dist/backend/cycle-analysis.d.ts +21 -9
- package/dist/backend/cycle-analysis.js +139 -67
- package/dist/backend/cycle-analysis.js.map +1 -1
- package/dist/backend/cycle-analysis.test.js +283 -3
- package/dist/backend/cycle-analysis.test.js.map +1 -1
- package/dist/backend/cycle-mutability.d.ts +39 -0
- package/dist/backend/cycle-mutability.js +205 -0
- package/dist/backend/cycle-mutability.js.map +1 -0
- package/dist/backend/executable-features.js +1 -0
- package/dist/backend/executable-features.js.map +1 -1
- package/dist/backend/link-plan-core.d.ts +4 -1
- package/dist/backend/link-plan-core.js +16 -3
- package/dist/backend/link-plan-core.js.map +1 -1
- package/dist/backend/link-plan.d.ts +3 -1
- package/dist/backend/link-plan.js +3 -0
- package/dist/backend/link-plan.js.map +1 -1
- package/dist/backend/llvm/alloc.d.ts +40 -0
- package/dist/backend/llvm/alloc.js +205 -0
- package/dist/backend/llvm/alloc.js.map +1 -0
- package/dist/backend/llvm/alloc.test.d.ts +1 -0
- package/dist/backend/llvm/alloc.test.js +102 -0
- package/dist/backend/llvm/alloc.test.js.map +1 -0
- package/dist/backend/llvm/byte-numbers.js +32 -4
- package/dist/backend/llvm/byte-numbers.js.map +1 -1
- package/dist/backend/llvm/byte-windows.d.ts +31 -0
- package/dist/backend/llvm/byte-windows.js +334 -0
- package/dist/backend/llvm/byte-windows.js.map +1 -0
- package/dist/backend/llvm/byte-windows.test.d.ts +1 -0
- package/dist/backend/llvm/byte-windows.test.js +244 -0
- package/dist/backend/llvm/byte-windows.test.js.map +1 -0
- package/dist/backend/llvm/call-lifetimes.d.ts +17 -5
- package/dist/backend/llvm/call-lifetimes.js +58 -24
- package/dist/backend/llvm/call-lifetimes.js.map +1 -1
- package/dist/backend/llvm/call-lifetimes.test.js +170 -0
- package/dist/backend/llvm/call-lifetimes.test.js.map +1 -1
- package/dist/backend/llvm/classes.d.ts +18 -2
- package/dist/backend/llvm/classes.js +115 -41
- package/dist/backend/llvm/classes.js.map +1 -1
- package/dist/backend/llvm/classes.test.d.ts +1 -0
- package/dist/backend/llvm/classes.test.js +132 -0
- package/dist/backend/llvm/classes.test.js.map +1 -0
- package/dist/backend/llvm/common.d.ts +13 -0
- package/dist/backend/llvm/common.js +30 -0
- package/dist/backend/llvm/common.js.map +1 -1
- package/dist/backend/llvm/constant-callbacks.d.ts +27 -0
- package/dist/backend/llvm/constant-callbacks.js +450 -0
- package/dist/backend/llvm/constant-callbacks.js.map +1 -0
- package/dist/backend/llvm/constant-callbacks.test.d.ts +1 -0
- package/dist/backend/llvm/constant-callbacks.test.js +261 -0
- package/dist/backend/llvm/constant-callbacks.test.js.map +1 -0
- package/dist/backend/llvm/dense-array-access.d.ts +29 -0
- package/dist/backend/llvm/dense-array-access.js +335 -0
- package/dist/backend/llvm/dense-array-access.js.map +1 -0
- package/dist/backend/llvm/dense-array-access.test.d.ts +1 -0
- package/dist/backend/llvm/dense-array-access.test.js +149 -0
- package/dist/backend/llvm/dense-array-access.test.js.map +1 -0
- package/dist/backend/llvm/dyn.d.ts +35 -1
- package/dist/backend/llvm/dyn.js +196 -35
- package/dist/backend/llvm/dyn.js.map +1 -1
- package/dist/backend/llvm/emitter.d.ts +143 -4
- package/dist/backend/llvm/emitter.js +882 -136
- package/dist/backend/llvm/emitter.js.map +1 -1
- package/dist/backend/llvm/emitter.test.js +82 -14
- package/dist/backend/llvm/emitter.test.js.map +1 -1
- package/dist/backend/llvm/expr-async.js +58 -4
- package/dist/backend/llvm/expr-async.js.map +1 -1
- package/dist/backend/llvm/expr-async.test.d.ts +1 -0
- package/dist/backend/llvm/expr-async.test.js +62 -0
- package/dist/backend/llvm/expr-async.test.js.map +1 -0
- package/dist/backend/llvm/expr-bytes.js +11 -0
- package/dist/backend/llvm/expr-bytes.js.map +1 -1
- package/dist/backend/llvm/expr-calls.js +151 -25
- package/dist/backend/llvm/expr-calls.js.map +1 -1
- package/dist/backend/llvm/expr-containers.js +37 -14
- package/dist/backend/llvm/expr-containers.js.map +1 -1
- package/dist/backend/llvm/expr-control.js +92 -2
- package/dist/backend/llvm/expr-control.js.map +1 -1
- package/dist/backend/llvm/expr-dispatch.js +2 -0
- package/dist/backend/llvm/expr-dispatch.js.map +1 -1
- package/dist/backend/llvm/expr-dynamic.js +210 -28
- package/dist/backend/llvm/expr-dynamic.js.map +1 -1
- package/dist/backend/llvm/expr-primitives.d.ts +1 -1
- package/dist/backend/llvm/expr-primitives.js +58 -23
- package/dist/backend/llvm/expr-primitives.js.map +1 -1
- package/dist/backend/llvm/expr-primitives.test.js +1 -1
- package/dist/backend/llvm/expr-records.js +3 -3
- package/dist/backend/llvm/expr-records.js.map +1 -1
- package/dist/backend/llvm/expr-stream-bridges.js +59 -2
- package/dist/backend/llvm/expr-stream-bridges.js.map +1 -1
- package/dist/backend/llvm/expr-stream-bridges.test.js +1 -1
- package/dist/backend/llvm/integer-remainder.d.ts +18 -0
- package/dist/backend/llvm/integer-remainder.js +117 -0
- package/dist/backend/llvm/integer-remainder.js.map +1 -0
- package/dist/backend/llvm/layouts.d.ts +2 -1
- package/dist/backend/llvm/layouts.js +4 -3
- package/dist/backend/llvm/layouts.js.map +1 -1
- package/dist/backend/llvm/lazy-captures.d.ts +16 -0
- package/dist/backend/llvm/lazy-captures.js +96 -0
- package/dist/backend/llvm/lazy-captures.js.map +1 -0
- package/dist/backend/llvm/lazy-captures.test.d.ts +1 -0
- package/dist/backend/llvm/lazy-captures.test.js +78 -0
- package/dist/backend/llvm/lazy-captures.test.js.map +1 -0
- package/dist/backend/llvm/lib-abi.js +7 -0
- package/dist/backend/llvm/lib-abi.js.map +1 -1
- package/dist/backend/llvm/lib-dispatch.js +7 -22
- package/dist/backend/llvm/lib-dispatch.js.map +1 -1
- package/dist/backend/llvm/lib-filesystem.js +3 -4
- package/dist/backend/llvm/lib-filesystem.js.map +1 -1
- package/dist/backend/llvm/lib-shared.js +15 -0
- package/dist/backend/llvm/lib-shared.js.map +1 -1
- package/dist/backend/llvm/local-array-reads.d.ts +13 -3
- package/dist/backend/llvm/local-array-reads.js +159 -77
- package/dist/backend/llvm/local-array-reads.js.map +1 -1
- package/dist/backend/llvm/local-array-reads.test.js +105 -4
- package/dist/backend/llvm/local-array-reads.test.js.map +1 -1
- package/dist/backend/llvm/local-union-storage.d.ts +5 -1
- package/dist/backend/llvm/local-union-storage.js +48 -6
- package/dist/backend/llvm/local-union-storage.js.map +1 -1
- package/dist/backend/llvm/local-union-storage.test.js +91 -4
- package/dist/backend/llvm/local-union-storage.test.js.map +1 -1
- package/dist/backend/llvm/loop-array-borrows.d.ts +11 -0
- package/dist/backend/llvm/loop-array-borrows.js +70 -0
- package/dist/backend/llvm/loop-array-borrows.js.map +1 -0
- package/dist/backend/llvm/loop-array-borrows.test.d.ts +1 -0
- package/dist/backend/llvm/loop-array-borrows.test.js +145 -0
- package/dist/backend/llvm/loop-array-borrows.test.js.map +1 -0
- package/dist/backend/llvm/map-read-lifetimes.d.ts +5 -0
- package/dist/backend/llvm/map-read-lifetimes.js +20 -5
- package/dist/backend/llvm/map-read-lifetimes.js.map +1 -1
- package/dist/backend/llvm/map-read-lifetimes.test.js +1 -1
- package/dist/backend/llvm/nullable-fields.d.ts +28 -0
- package/dist/backend/llvm/nullable-fields.js +45 -0
- package/dist/backend/llvm/nullable-fields.js.map +1 -0
- package/dist/backend/llvm/nullable-fields.test.d.ts +1 -0
- package/dist/backend/llvm/nullable-fields.test.js +48 -0
- package/dist/backend/llvm/nullable-fields.test.js.map +1 -0
- package/dist/backend/llvm/reference-effects.d.ts +2 -1
- package/dist/backend/llvm/reference-effects.js +7 -0
- package/dist/backend/llvm/reference-effects.js.map +1 -1
- package/dist/backend/llvm/serialized-ir-emission.test.d.ts +1 -0
- package/dist/backend/llvm/serialized-ir-emission.test.js +52 -0
- package/dist/backend/llvm/serialized-ir-emission.test.js.map +1 -0
- package/dist/backend/llvm/shapes.d.ts +73 -3
- package/dist/backend/llvm/shapes.js +281 -34
- package/dist/backend/llvm/shapes.js.map +1 -1
- package/dist/backend/llvm/shapes.test.js +114 -5
- package/dist/backend/llvm/shapes.test.js.map +1 -1
- package/dist/backend/llvm/split-loops.d.ts +48 -0
- package/dist/backend/llvm/split-loops.js +183 -0
- package/dist/backend/llvm/split-loops.js.map +1 -0
- package/dist/backend/llvm/split.js +0 -7
- package/dist/backend/llvm/split.js.map +1 -1
- package/dist/backend/llvm/split.test.js +66 -2
- package/dist/backend/llvm/split.test.js.map +1 -1
- package/dist/backend/llvm/stack-callbacks.d.ts +14 -0
- package/dist/backend/llvm/stack-callbacks.js +72 -0
- package/dist/backend/llvm/stack-callbacks.js.map +1 -0
- package/dist/backend/llvm/stack-captures.d.ts +27 -0
- package/dist/backend/llvm/stack-captures.js +152 -0
- package/dist/backend/llvm/stack-captures.js.map +1 -0
- package/dist/backend/llvm/stack-unions.test.js +38 -1
- package/dist/backend/llvm/stack-unions.test.js.map +1 -1
- package/dist/backend/llvm/string-construction.test.js +1 -1
- package/dist/backend/llvm/string-key-hash.d.ts +8 -0
- package/dist/backend/llvm/string-key-hash.js +59 -0
- package/dist/backend/llvm/string-key-hash.js.map +1 -0
- package/dist/backend/llvm/string-key-hash.test.d.ts +1 -0
- package/dist/backend/llvm/string-key-hash.test.js +34 -0
- package/dist/backend/llvm/string-key-hash.test.js.map +1 -0
- package/dist/backend/llvm/string-lifetimes.test.js +48 -7
- package/dist/backend/llvm/string-lifetimes.test.js.map +1 -1
- package/dist/backend/llvm/string-slices.d.ts +20 -0
- package/dist/backend/llvm/string-slices.js +87 -0
- package/dist/backend/llvm/string-slices.js.map +1 -0
- package/dist/backend/llvm/string-slices.test.d.ts +1 -0
- package/dist/backend/llvm/string-slices.test.js +98 -0
- package/dist/backend/llvm/string-slices.test.js.map +1 -0
- package/dist/backend/llvm/switch-dispatch.js +1 -1
- package/dist/backend/llvm/switch-dispatch.js.map +1 -1
- package/dist/backend/llvm/switch-dispatch.test.js +2 -2
- package/dist/backend/llvm/switch-dispatch.test.js.map +1 -1
- package/dist/backend/llvm/walkers.d.ts +4 -14
- package/dist/backend/llvm/walkers.js +53 -311
- package/dist/backend/llvm/walkers.js.map +1 -1
- package/dist/backend/may-throw.js +4 -1
- package/dist/backend/may-throw.js.map +1 -1
- package/dist/backend/may-throw.test.js +1 -1
- package/dist/backend/native/cache-warm.d.ts +2 -1
- package/dist/backend/native/cache-warm.js.map +1 -1
- package/dist/backend/native/contracts.d.ts +5 -2
- package/dist/backend/native/contracts.js.map +1 -1
- package/dist/backend/native/executable.js +12 -4
- package/dist/backend/native/executable.js.map +1 -1
- package/dist/backend/native/runtime-inputs.d.ts +1 -1
- package/dist/backend/native/runtime-inputs.js +3 -0
- package/dist/backend/native/runtime-inputs.js.map +1 -1
- package/dist/backend/native-codegen-core.d.ts +7 -0
- package/dist/backend/native-codegen-core.js +21 -0
- package/dist/backend/native-codegen-core.js.map +1 -1
- package/dist/backend/native-codegen.d.ts +9 -0
- package/dist/backend/native-codegen.js +38 -18
- package/dist/backend/native-codegen.js.map +1 -1
- package/dist/backend/native-codegen.test.js +70 -2
- package/dist/backend/native-codegen.test.js.map +1 -1
- package/dist/backend/native-link-info-core.d.ts +4 -2
- package/dist/backend/native-link-info-core.js.map +1 -1
- package/dist/backend/native-link-info.d.ts +2 -1
- package/dist/backend/native-link-info.js.map +1 -1
- package/dist/backend/native-link-info.test.js +2 -2
- package/dist/backend/native-link-info.test.js.map +1 -1
- package/dist/backend/native-tools.d.ts +6 -2
- package/dist/backend/native-tools.js +6 -5
- package/dist/backend/native-tools.js.map +1 -1
- package/dist/backend/optimization.d.ts +25 -0
- package/dist/backend/optimization.js +21 -0
- package/dist/backend/optimization.js.map +1 -0
- package/dist/backend/optimization.test.d.ts +1 -0
- package/dist/backend/optimization.test.js +24 -0
- package/dist/backend/optimization.test.js.map +1 -0
- 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 +16 -4
- package/dist/backend/runtime-pack-core.js +31 -13
- package/dist/backend/runtime-pack-core.js.map +1 -1
- package/dist/backend/runtime-pack-native.d.ts +7 -3
- package/dist/backend/runtime-pack-native.js +0 -3
- package/dist/backend/runtime-pack-native.js.map +1 -1
- package/dist/backend/runtime-pack-targets.test.js +41 -4
- package/dist/backend/runtime-pack-targets.test.js.map +1 -1
- package/dist/backend/runtime-pack.d.ts +20 -2
- package/dist/backend/runtime-pack.js +23 -0
- package/dist/backend/runtime-pack.js.map +1 -1
- package/dist/backend/runtime-pack.test.js +125 -2
- package/dist/backend/runtime-pack.test.js.map +1 -1
- package/dist/backend/target-diagnostics.test.js +1 -1
- package/dist/backend/targets.d.ts +2 -1
- package/dist/backend/targets.js +1 -1
- package/dist/backend/targets.js.map +1 -1
- package/dist/cli/command.js +5 -4
- package/dist/cli/command.js.map +1 -1
- package/dist/cli/host.d.ts +2 -1
- package/dist/cli/usage.d.ts +1 -1
- package/dist/cli/usage.js +5 -2
- package/dist/cli/usage.js.map +1 -1
- package/dist/compile-types.d.ts +5 -2
- package/dist/diagnostics/diagnostic.js +10 -8
- package/dist/diagnostics/diagnostic.js.map +1 -1
- package/dist/executable/executable-cache.d.ts +3 -2
- package/dist/executable/executable-cache.js +8 -4
- package/dist/executable/executable-cache.js.map +1 -1
- package/dist/executable/executable-cache.test.js +35 -0
- package/dist/executable/executable-cache.test.js.map +1 -1
- package/dist/frontend/fork-target.d.ts +5 -0
- package/dist/frontend/fork-target.js +40 -8
- package/dist/frontend/fork-target.js.map +1 -1
- package/dist/frontend/fork-target.test.d.ts +1 -0
- package/dist/frontend/fork-target.test.js +59 -0
- package/dist/frontend/fork-target.test.js.map +1 -0
- package/dist/frontend/lowering/abstract-equality.js +5 -49
- package/dist/frontend/lowering/abstract-equality.js.map +1 -1
- package/dist/frontend/lowering/array-values.d.ts +23 -0
- package/dist/frontend/lowering/array-values.js +129 -0
- package/dist/frontend/lowering/array-values.js.map +1 -1
- package/dist/frontend/lowering/binding-analysis.js +2 -2
- package/dist/frontend/lowering/binding-analysis.js.map +1 -1
- package/dist/frontend/lowering/builtins/atomics.d.ts +2 -11
- package/dist/frontend/lowering/builtins/atomics.js +64 -28
- package/dist/frontend/lowering/builtins/atomics.js.map +1 -1
- package/dist/frontend/lowering/builtins/errors.js +17 -2
- package/dist/frontend/lowering/builtins/errors.js.map +1 -1
- package/dist/frontend/lowering/builtins/filesystem-calls.d.ts +3 -0
- package/dist/frontend/lowering/builtins/filesystem-calls.js +51 -4
- package/dist/frontend/lowering/builtins/filesystem-calls.js.map +1 -1
- package/dist/frontend/lowering/builtins/module-calls.js +6 -1
- package/dist/frontend/lowering/builtins/module-calls.js.map +1 -1
- package/dist/frontend/lowering/builtins/process.d.ts +6 -17
- package/dist/frontend/lowering/builtins/process.js +56 -29
- package/dist/frontend/lowering/builtins/process.js.map +1 -1
- package/dist/frontend/lowering/builtins/workers.d.ts +5 -0
- package/dist/frontend/lowering/builtins/workers.js +65 -0
- package/dist/frontend/lowering/builtins/workers.js.map +1 -0
- package/dist/frontend/lowering/caught-value-dispatch.d.ts +11 -0
- package/dist/frontend/lowering/caught-value-dispatch.js +87 -0
- package/dist/frontend/lowering/caught-value-dispatch.js.map +1 -0
- package/dist/frontend/lowering/class-assertions.d.ts +11 -0
- package/dist/frontend/lowering/class-assertions.js +104 -0
- package/dist/frontend/lowering/class-assertions.js.map +1 -0
- package/dist/frontend/lowering/class-callbacks.d.ts +3 -3
- package/dist/frontend/lowering/class-callbacks.js +18 -5
- package/dist/frontend/lowering/class-callbacks.js.map +1 -1
- package/dist/frontend/lowering/class-dynamic-dispatch.d.ts +1 -0
- package/dist/frontend/lowering/class-dynamic-dispatch.js +4 -1
- package/dist/frontend/lowering/class-dynamic-dispatch.js.map +1 -1
- package/dist/frontend/lowering/class-method-mutations.d.ts +5 -0
- package/dist/frontend/lowering/class-method-mutations.js +472 -0
- package/dist/frontend/lowering/class-method-mutations.js.map +1 -0
- package/dist/frontend/lowering/class-method-values.js +25 -5
- package/dist/frontend/lowering/class-method-values.js.map +1 -1
- package/dist/frontend/lowering/class-protocols.d.ts +17 -0
- package/dist/frontend/lowering/class-protocols.js +126 -0
- package/dist/frontend/lowering/class-protocols.js.map +1 -0
- package/dist/frontend/lowering/class-prototypes.js +8 -2
- package/dist/frontend/lowering/class-prototypes.js.map +1 -1
- package/dist/frontend/lowering/class-unions.d.ts +16 -0
- package/dist/frontend/lowering/class-unions.js +127 -0
- package/dist/frontend/lowering/class-unions.js.map +1 -0
- package/dist/frontend/lowering/coercions/builders.js +8 -1
- package/dist/frontend/lowering/coercions/builders.js.map +1 -1
- package/dist/frontend/lowering/coercions/function-adapters.js +2 -0
- package/dist/frontend/lowering/coercions/function-adapters.js.map +1 -1
- package/dist/frontend/lowering/coercions/identity.d.ts +7 -0
- package/dist/frontend/lowering/coercions/identity.js +26 -0
- package/dist/frontend/lowering/coercions/identity.js.map +1 -0
- package/dist/frontend/lowering/coercions/structural.js +9 -6
- package/dist/frontend/lowering/coercions/structural.js.map +1 -1
- package/dist/frontend/lowering/collection-narrowing.d.ts +6 -0
- package/dist/frontend/lowering/collection-narrowing.js +31 -0
- package/dist/frontend/lowering/collection-narrowing.js.map +1 -0
- package/dist/frontend/lowering/containers/array-callback-call.d.ts +7 -0
- package/dist/frontend/lowering/containers/array-callback-call.js +52 -0
- package/dist/frontend/lowering/containers/array-callback-call.js.map +1 -0
- package/dist/frontend/lowering/containers/array-callbacks.d.ts +8 -12
- package/dist/frontend/lowering/containers/array-callbacks.js +415 -136
- package/dist/frontend/lowering/containers/array-callbacks.js.map +1 -1
- package/dist/frontend/lowering/containers/array-concat.d.ts +7 -0
- package/dist/frontend/lowering/containers/array-concat.js +130 -0
- package/dist/frontend/lowering/containers/array-concat.js.map +1 -0
- package/dist/frontend/lowering/containers/array-construction.d.ts +2 -0
- package/dist/frontend/lowering/containers/array-construction.js +95 -3
- package/dist/frontend/lowering/containers/array-construction.js.map +1 -1
- package/dist/frontend/lowering/containers/array-methods.d.ts +1 -11
- package/dist/frontend/lowering/containers/array-methods.js +43 -132
- package/dist/frontend/lowering/containers/array-methods.js.map +1 -1
- package/dist/frontend/lowering/containers/bytes.js +12 -34
- package/dist/frontend/lowering/containers/bytes.js.map +1 -1
- package/dist/frontend/lowering/containers/collection-methods.js +10 -1
- package/dist/frontend/lowering/containers/collection-methods.js.map +1 -1
- package/dist/frontend/lowering/containers/indexed-objects.js +56 -70
- package/dist/frontend/lowering/containers/indexed-objects.js.map +1 -1
- package/dist/frontend/lowering/containers/string-and-regexp.js +22 -3
- package/dist/frontend/lowering/containers/string-and-regexp.js.map +1 -1
- package/dist/frontend/lowering/cycle-initialization.d.ts +41 -0
- package/dist/frontend/lowering/cycle-initialization.js +277 -0
- package/dist/frontend/lowering/cycle-initialization.js.map +1 -0
- package/dist/frontend/lowering/expressions/evaluation-safety.js +4 -0
- package/dist/frontend/lowering/expressions/evaluation-safety.js.map +1 -1
- package/dist/frontend/lowering/expressions/object-literals.js +140 -38
- package/dist/frontend/lowering/expressions/object-literals.js.map +1 -1
- package/dist/frontend/lowering/expressions/union-field-write.d.ts +4 -4
- package/dist/frontend/lowering/expressions/union-field-write.js +54 -44
- package/dist/frontend/lowering/expressions/union-field-write.js.map +1 -1
- package/dist/frontend/lowering/generic-functions.d.ts +2 -5
- package/dist/frontend/lowering/generic-functions.js +13 -10
- package/dist/frontend/lowering/generic-functions.js.map +1 -1
- package/dist/frontend/lowering/instantiation-path.d.ts +8 -0
- package/dist/frontend/lowering/instantiation-path.js +10 -0
- package/dist/frontend/lowering/instantiation-path.js.map +1 -0
- package/dist/frontend/lowering/instantiation-path.test.d.ts +1 -0
- package/dist/frontend/lowering/instantiation-path.test.js +23 -0
- package/dist/frontend/lowering/instantiation-path.test.js.map +1 -0
- package/dist/frontend/lowering/iterator-adapters.d.ts +20 -0
- package/dist/frontend/lowering/iterator-adapters.js +605 -0
- package/dist/frontend/lowering/iterator-adapters.js.map +1 -0
- package/dist/frontend/lowering/lower-array-sort.d.ts +1 -1
- package/dist/frontend/lowering/lower-array-sort.js +44 -5
- package/dist/frontend/lowering/lower-array-sort.js.map +1 -1
- package/dist/frontend/lowering/lower-array-sort.test.d.ts +1 -0
- package/dist/frontend/lowering/lower-array-sort.test.js +31 -0
- package/dist/frontend/lowering/lower-array-sort.test.js.map +1 -0
- package/dist/frontend/lowering/lower-assert.js +7 -0
- package/dist/frontend/lowering/lower-assert.js.map +1 -1
- package/dist/frontend/lowering/lower-builtin-values.js +12 -7
- package/dist/frontend/lowering/lower-builtin-values.js.map +1 -1
- package/dist/frontend/lowering/lower-calls.d.ts +3 -3
- package/dist/frontend/lowering/lower-calls.js +198 -124
- package/dist/frontend/lowering/lower-calls.js.map +1 -1
- package/dist/frontend/lowering/lower-classes.d.ts +7 -0
- package/dist/frontend/lowering/lower-classes.js +166 -96
- package/dist/frontend/lowering/lower-classes.js.map +1 -1
- package/dist/frontend/lowering/lower-event-emitter.js +1 -1
- package/dist/frontend/lowering/lower-event-emitter.js.map +1 -1
- package/dist/frontend/lowering/lower-exprs.d.ts +9 -2
- package/dist/frontend/lowering/lower-exprs.js +421 -167
- package/dist/frontend/lowering/lower-exprs.js.map +1 -1
- package/dist/frontend/lowering/lower-functions.d.ts +1 -1
- package/dist/frontend/lowering/lower-functions.js +33 -20
- package/dist/frontend/lowering/lower-functions.js.map +1 -1
- package/dist/frontend/lowering/lower-inspect.js +26 -2
- package/dist/frontend/lowering/lower-inspect.js.map +1 -1
- package/dist/frontend/lowering/lower-island.js +1 -1
- package/dist/frontend/lowering/lower-island.js.map +1 -1
- package/dist/frontend/lowering/lower-modules.d.ts +1 -0
- package/dist/frontend/lowering/lower-modules.js +54 -11
- package/dist/frontend/lowering/lower-modules.js.map +1 -1
- package/dist/frontend/lowering/lower-stmts.js +59 -69
- package/dist/frontend/lowering/lower-stmts.js.map +1 -1
- package/dist/frontend/lowering/lower-stream.js +1 -1
- package/dist/frontend/lowering/lower-stream.js.map +1 -1
- package/dist/frontend/lowering/lowerer.d.ts +50 -1
- package/dist/frontend/lowering/lowerer.js +333 -26
- package/dist/frontend/lowering/lowerer.js.map +1 -1
- package/dist/frontend/lowering/native-ffi.js +3 -1
- package/dist/frontend/lowering/native-ffi.js.map +1 -1
- package/dist/frontend/lowering/runtime-optional-provenance.d.ts +15 -0
- package/dist/frontend/lowering/runtime-optional-provenance.js +40 -0
- package/dist/frontend/lowering/runtime-optional-provenance.js.map +1 -0
- package/dist/frontend/lowering/sanitize-class-types.test.js +2 -2
- package/dist/frontend/lowering/split-consumers.d.ts +7 -0
- package/dist/frontend/lowering/split-consumers.js +64 -0
- package/dist/frontend/lowering/split-consumers.js.map +1 -0
- package/dist/frontend/lowering/strict-equality.d.ts +9 -0
- package/dist/frontend/lowering/strict-equality.js +116 -0
- package/dist/frontend/lowering/strict-equality.js.map +1 -0
- package/dist/frontend/lowering/surfaces.d.ts +3 -4
- package/dist/frontend/lowering/surfaces.js +38 -7
- package/dist/frontend/lowering/surfaces.js.map +1 -1
- package/dist/frontend/lowering/union-comparison.d.ts +5 -0
- package/dist/frontend/lowering/union-comparison.js +47 -0
- package/dist/frontend/lowering/union-comparison.js.map +1 -0
- package/dist/frontend/module-source-candidates.d.ts +10 -0
- package/dist/frontend/module-source-candidates.js +40 -0
- package/dist/frontend/module-source-candidates.js.map +1 -0
- package/dist/frontend/module-source-candidates.test.d.ts +1 -0
- package/dist/frontend/module-source-candidates.test.js +53 -0
- package/dist/frontend/module-source-candidates.test.js.map +1 -0
- package/dist/frontend/pipeline.js +2 -2
- package/dist/frontend/pipeline.js.map +1 -1
- package/dist/frontend/program-analysis.d.ts +2 -0
- package/dist/frontend/program-analysis.js +2 -0
- package/dist/frontend/program-analysis.js.map +1 -1
- package/dist/frontend/program.d.ts +38 -2
- package/dist/frontend/program.js +457 -88
- package/dist/frontend/program.js.map +1 -1
- package/dist/frontend/program.test.js +59 -6
- package/dist/frontend/program.test.js.map +1 -1
- package/dist/frontend/ts7/ast-node.js +6 -8
- package/dist/frontend/ts7/ast-node.js.map +1 -1
- package/dist/frontend/ts7/ast-node.test.js +42 -1
- package/dist/frontend/ts7/ast-node.test.js.map +1 -1
- package/dist/frontend/ts7/ast-wire.d.ts +4 -0
- package/dist/frontend/ts7/ast-wire.js +28 -0
- package/dist/frontend/ts7/ast-wire.js.map +1 -1
- package/dist/frontend/ts7/ast.d.ts +2 -1
- package/dist/frontend/ts7/ast.js +8 -4
- package/dist/frontend/ts7/ast.js.map +1 -1
- package/dist/frontend/ts7/checker.d.ts +8 -2
- package/dist/frontend/ts7/checker.js +41 -5
- package/dist/frontend/ts7/checker.js.map +1 -1
- package/dist/frontend/ts7/checker.test.js +42 -0
- package/dist/frontend/ts7/checker.test.js.map +1 -1
- package/dist/frontend/ts7/program-host.d.ts +7 -0
- package/dist/frontend/ts7/program-host.js +26 -2
- package/dist/frontend/ts7/program-host.js.map +1 -1
- package/dist/frontend/ts7/program-host.test.js +29 -0
- package/dist/frontend/ts7/program-host.test.js.map +1 -1
- package/dist/frontend/type-mapper.d.ts +4 -1
- package/dist/frontend/type-mapper.js +133 -16
- package/dist/frontend/type-mapper.js.map +1 -1
- package/dist/frontend/type-mapper.test.js +15 -3
- package/dist/frontend/type-mapper.test.js.map +1 -1
- package/dist/frontend/worker-target.d.ts +6 -0
- package/dist/frontend/worker-target.js +108 -0
- package/dist/frontend/worker-target.js.map +1 -0
- package/dist/frontend/worker-target.test.d.ts +1 -0
- package/dist/frontend/worker-target.test.js +71 -0
- package/dist/frontend/worker-target.test.js.map +1 -0
- package/dist/index.js +47 -14
- package/dist/index.js.map +1 -1
- package/dist/ir/analysis.d.ts +3 -1
- package/dist/ir/analysis.js +4 -0
- package/dist/ir/analysis.js.map +1 -1
- package/dist/ir/builtin-effects.js +12 -0
- package/dist/ir/builtin-effects.js.map +1 -1
- package/dist/ir/builtin-signatures.d.ts +1 -1
- package/dist/ir/builtin-signatures.js +15 -15
- package/dist/ir/builtin-signatures.js.map +1 -1
- package/dist/ir/constant-tables.test.js +1 -1
- package/dist/ir/initializer-bindings.test.js +1 -1
- package/dist/ir/ir.d.ts +85 -23
- package/dist/ir/ir.js +20 -6
- package/dist/ir/ir.js.map +1 -1
- package/dist/ir/numeric-call-specialization.d.ts +8 -0
- package/dist/ir/numeric-call-specialization.js +198 -0
- package/dist/ir/numeric-call-specialization.js.map +1 -0
- package/dist/ir/runtime-features.js +4 -3
- package/dist/ir/runtime-features.js.map +1 -1
- package/dist/ir/scalar-records.test.js +1 -1
- package/dist/ir/serialize.d.ts +1 -1
- package/dist/ir/serialize.js +3 -3
- package/dist/ir/serialize.js.map +1 -1
- package/dist/ir/traverse.js +8 -0
- package/dist/ir/traverse.js.map +1 -1
- package/dist/ir/validate.js +207 -43
- package/dist/ir/validate.js.map +1 -1
- package/dist/ir/validate.test.js +356 -8
- package/dist/ir/validate.test.js.map +1 -1
- package/dist/library/fence-eval.test.js +1 -1
- package/dist/library/int-infer.test.js +4 -4
- package/dist/library/ir-policy.js +2 -0
- package/dist/library/ir-policy.js.map +1 -1
- package/dist/library/library-cache.test.js +5 -5
- package/dist/library/library-profile.d.ts +2 -1
- package/dist/library/library-profile.js +4 -3
- package/dist/library/library-profile.js.map +1 -1
- package/dist/native/compiler.js +24 -11
- package/dist/native/compiler.js.map +1 -1
- package/dist/native/compiler.test.js +7 -3
- package/dist/native/compiler.test.js.map +1 -1
- package/dist/native/library.d.ts +2 -1
- package/dist/native/library.js.map +1 -1
- package/dist/native/prepare.js +29 -3
- package/dist/native/prepare.js.map +1 -1
- package/dist/native/sanitizer.d.ts +3 -2
- package/dist/native/sanitizer.js +3 -13
- package/dist/native/sanitizer.js.map +1 -1
- package/dist/native/sanitizer.test.js +1 -0
- package/dist/native/sanitizer.test.js.map +1 -1
- package/package.json +20 -20
- package/surface-manifest.json +37 -3
|
@@ -2,6 +2,7 @@ import * as ts from "../ts7/adapter.js";
|
|
|
2
2
|
import type { FnCtx, Lowerer } from "./lowerer.js";
|
|
3
3
|
import { type IrClassDef, type IrExpr, type IrFunction, type IrLocal, type IrStmt, type IrType, type SrcLoc } from "../../ir/ir.js";
|
|
4
4
|
import { type GenericFnInfo } from "./generic-functions.js";
|
|
5
|
+
import { type InstantiationPath } from "./instantiation-path.js";
|
|
5
6
|
import { type ParamShape } from "./call-signatures.js";
|
|
6
7
|
import { type ScrDiagnostic } from "../../diagnostics/diagnostic.js";
|
|
7
8
|
import { type EmitOverrideRec } from "./lower-event-emitter.js";
|
|
@@ -131,6 +132,8 @@ export interface ClassInfo {
|
|
|
131
132
|
* (forwarding the completed ABI values; defaults apply in the base). */
|
|
132
133
|
ctorParams: ParamShape[];
|
|
133
134
|
base: ClassInfo | null;
|
|
135
|
+
/** Family heritage resolves its type arguments separately for each instance. */
|
|
136
|
+
genericBase?: ts.ExpressionWithTypeArguments;
|
|
134
137
|
/** A module class may inherit a compiled ordinary JS constructor. Its
|
|
135
138
|
* callable and prototype are captured when the class declaration runs. */
|
|
136
139
|
callableBase?: {
|
|
@@ -161,6 +164,8 @@ export interface ClassInfo {
|
|
|
161
164
|
staticFields: {
|
|
162
165
|
name: string;
|
|
163
166
|
type: IrType;
|
|
167
|
+
/** Indexed sources can be absent despite the declared static type. */
|
|
168
|
+
runtimeOptional?: true;
|
|
164
169
|
initializer: ts.Expression;
|
|
165
170
|
globalId: string;
|
|
166
171
|
readonly: boolean;
|
|
@@ -214,6 +219,7 @@ export interface ClassInfo {
|
|
|
214
219
|
* counts statements toward coverage — re-instantiations re-visit the
|
|
215
220
|
* same source lines). */
|
|
216
221
|
genericInstance?: {
|
|
222
|
+
path: InstantiationPath;
|
|
217
223
|
family: ClassInfo;
|
|
218
224
|
bindings: Map<ts.Symbol, IrType>;
|
|
219
225
|
typeArgsText: string;
|
|
@@ -376,6 +382,7 @@ export declare function guaranteedDecorationThrow(lowerer: Lowerer, decl: ts.Cla
|
|
|
376
382
|
} | null;
|
|
377
383
|
export declare function collectClassShape(lowerer: Lowerer, decl: ts.ClassDeclaration): void;
|
|
378
384
|
export declare function collectClassShapeInner(lowerer: Lowerer, decl: ts.ClassLikeDeclaration, jsNameOverride?: string, inst?: {
|
|
385
|
+
path: InstantiationPath;
|
|
379
386
|
family: ClassInfo;
|
|
380
387
|
name: string;
|
|
381
388
|
bindings: Map<ts.Symbol, IrType>;
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { dynUndefinedExpr, nodeThrowExpr } from "../../ir/build.js";
|
|
2
|
+
import { collectClassMethodMutations } from "./class-method-mutations.js";
|
|
2
3
|
import { InternalCompilerError } from "../../errors.js";
|
|
3
4
|
/* Class lowering: shape collection over the single-inheritance graph
|
|
4
5
|
* (fields, methods, accessors, overrides), constructor/member lowering with
|
|
@@ -7,7 +8,8 @@ import { InternalCompilerError } from "../../errors.js";
|
|
|
7
8
|
* hierarchy registration. */
|
|
8
9
|
import * as ts from "../ts7/adapter.js";
|
|
9
10
|
import { BOOL, DATE_T, DYN, F64, bytesOf, JSVAL, RUNTIME_EMITTER_CLASS, RUNTIME_ERROR_CLASSES, RUNTIME_STREAM_CLASSES, STRING, UNDEFINED_T, VOID, arrayOf, isSupportedMapKey, isSupportedMapValue, isSupportedSetElem, isUnitType, typeEquals, } from "../../ir/ir.js";
|
|
10
|
-
import {
|
|
11
|
+
import { genericCallInstance, implicitAnyParamSymbolsOf, implicitCallInstance, implicitMonoFile, } from "./generic-functions.js";
|
|
12
|
+
import { extendInstantiationPath, MAX_INSTANTIATION_RECURSION, } from "./instantiation-path.js";
|
|
11
13
|
import { appendImplicitUndefinedReturn, hasExplicitJsDocReturn } from "./function-returns.js";
|
|
12
14
|
import { bodyReadsArguments } from "../arguments-usage.js";
|
|
13
15
|
import { generatorMeta } from "./call-signatures.js";
|
|
@@ -22,6 +24,7 @@ import { bufEncoding } from "./containers/bytes.js";
|
|
|
22
24
|
import { isSafeToRepeat } from "./expressions/evaluation-safety.js";
|
|
23
25
|
import { lowerSearchParamsNew } from "./builtins/url.js";
|
|
24
26
|
import { lowerTextCodecNew } from "./builtins/text-codecs.js";
|
|
27
|
+
import { lowerWorkerNew } from "./builtins/workers.js";
|
|
25
28
|
import { requiresDynamicPackageDiag, unsupportedDiag, } from "../../diagnostics/diagnostic.js";
|
|
26
29
|
import { STREAM_API_MEMBERS, STREAM_PROP_MEMBERS, UNDERSCORE_METHODS, lowerStreamNew, lowerStreamSuperCall, streamCtorShape, } from "./lower-stream.js";
|
|
27
30
|
import { emitOverrideShapeReason, emitSpecSuperForward, emitterRooted, lowerEmitterSuperCall, } from "./lower-event-emitter.js";
|
|
@@ -378,6 +381,10 @@ export function registerBuiltinErrorClasses(lowerer) {
|
|
|
378
381
|
{ name: "%nameEnumerable", type: BOOL },
|
|
379
382
|
{ name: "%stackFrames", type: STRING },
|
|
380
383
|
{ name: "%stack", type: STRING },
|
|
384
|
+
{ name: "%systemErrno", type: F64 },
|
|
385
|
+
{ name: "%systemCall", type: STRING },
|
|
386
|
+
{ name: "%systemPath", type: STRING },
|
|
387
|
+
{ name: "%systemDest", type: STRING },
|
|
381
388
|
],
|
|
382
389
|
loc,
|
|
383
390
|
},
|
|
@@ -949,7 +956,36 @@ export function guaranteedDecorationThrow(lowerer, decl) {
|
|
|
949
956
|
return null;
|
|
950
957
|
}
|
|
951
958
|
export function collectClassShape(lowerer, decl) {
|
|
952
|
-
|
|
959
|
+
if (lowerer.classes.has(lowerer.classNamer(decl)) ||
|
|
960
|
+
lowerer.collectingClassDeclarations.has(decl))
|
|
961
|
+
return;
|
|
962
|
+
lowerer.collectingClassDeclarations.add(decl);
|
|
963
|
+
try {
|
|
964
|
+
collectClassShapeDeferring(lowerer, decl);
|
|
965
|
+
}
|
|
966
|
+
finally {
|
|
967
|
+
lowerer.collectingClassDeclarations.delete(decl);
|
|
968
|
+
}
|
|
969
|
+
}
|
|
970
|
+
function collectClassShapeDeferring(lowerer, decl) {
|
|
971
|
+
const symbol = lowerer.collectDeferring(() => declSymbolOf(lowerer, decl), () => {
|
|
972
|
+
// A forward type reference can demand this class before collection
|
|
973
|
+
// reaches its earlier base declaration. Collect that dependency first;
|
|
974
|
+
// a later same-file base remains subject to the runtime order boundary.
|
|
975
|
+
const heritage = decl.heritageClauses?.find((clause) => clause.token === ts.SyntaxKind.ExtendsKeyword)?.types[0]?.expression;
|
|
976
|
+
const reference = heritage && ts.isPropertyAccessExpression(heritage) ? heritage.name : heritage;
|
|
977
|
+
const baseSymbol = reference && ts.isIdentifier(reference) ? lowerer.resolveValueSymbol(reference) : undefined;
|
|
978
|
+
const baseDeclaration = baseSymbol
|
|
979
|
+
? lowerer.checker.declarationsOf(baseSymbol).find(ts.isClassDeclaration)
|
|
980
|
+
: undefined;
|
|
981
|
+
if (baseDeclaration &&
|
|
982
|
+
!lowerer.isStdlibSymbol(baseSymbol ?? undefined) &&
|
|
983
|
+
!baseDeclaration.getSourceFile().isDeclarationFile &&
|
|
984
|
+
(baseDeclaration.getSourceFile() !== decl.getSourceFile() ||
|
|
985
|
+
baseDeclaration.getStart() < decl.getStart()))
|
|
986
|
+
lowerer.collectClassShape(baseDeclaration);
|
|
987
|
+
lowerer.collectClassShapeInner(decl);
|
|
988
|
+
});
|
|
953
989
|
// Typed receivers and module retention know the class only by its
|
|
954
990
|
// qualified IR name — index the deferral under it too.
|
|
955
991
|
if (symbol)
|
|
@@ -1212,18 +1248,16 @@ mixin) {
|
|
|
1212
1248
|
lowerer.unsupported("SC1090", decl, "generic class expressions");
|
|
1213
1249
|
}
|
|
1214
1250
|
const className = inst ? inst.name : mixin ? mixin.name : lowerer.classNamer(decl); // program-wide qualified name
|
|
1215
|
-
//
|
|
1216
|
-
//
|
|
1217
|
-
//
|
|
1218
|
-
// so the base's ClassInfo already exists here. An INSTANTIATION's
|
|
1219
|
-
// base is its family (whose base is the declared one) — the heritage
|
|
1220
|
-
// clause resolved when the family collected.
|
|
1251
|
+
// Collection follows module order for runtime heritage. Ordinary
|
|
1252
|
+
// instances use the family as their storage base; generic heritage
|
|
1253
|
+
// resolves a concrete base under each instance's type bindings.
|
|
1221
1254
|
const computedBase = lowerer.computedClassBases.get(lowerer.classNamer(decl));
|
|
1222
1255
|
let base = inst
|
|
1223
1256
|
? inst.family
|
|
1224
1257
|
: mixin
|
|
1225
1258
|
? mixin.base
|
|
1226
1259
|
: (computedBase?.classInfo ?? null);
|
|
1260
|
+
let genericBase;
|
|
1227
1261
|
let callableBase;
|
|
1228
1262
|
let factoryBaseExpression;
|
|
1229
1263
|
const adoptCallableBase = (expression) => {
|
|
@@ -1250,35 +1284,12 @@ mixin) {
|
|
|
1250
1284
|
};
|
|
1251
1285
|
return true;
|
|
1252
1286
|
};
|
|
1253
|
-
|
|
1254
|
-
|
|
1255
|
-
|
|
1256
|
-
|
|
1257
|
-
|
|
1258
|
-
|
|
1259
|
-
for (const tp of decl.typeParameters) {
|
|
1260
|
-
const s = lowerer.checker.getSymbolAtLocation(tp.name);
|
|
1261
|
-
if (s)
|
|
1262
|
-
tpSyms.add(s);
|
|
1263
|
-
}
|
|
1264
|
-
for (const clause of decl.heritageClauses) {
|
|
1265
|
-
if (clause.token !== ts.SyntaxKind.ExtendsKeyword)
|
|
1266
|
-
continue;
|
|
1267
|
-
for (const t of clause.types) {
|
|
1268
|
-
let mentions = false;
|
|
1269
|
-
ts.walkPreorder(t, (n) => {
|
|
1270
|
-
const s = ts.isIdentifier(n) ? lowerer.checker.getSymbolAtLocation(n) : undefined;
|
|
1271
|
-
if (s && tpSyms.has(s)) {
|
|
1272
|
-
mentions = true;
|
|
1273
|
-
return "stop";
|
|
1274
|
-
}
|
|
1275
|
-
return undefined;
|
|
1276
|
-
});
|
|
1277
|
-
if (mentions) {
|
|
1278
|
-
lowerer.unsupported("SC1090", t, "generic classes whose 'extends' clause mentions their own type parameters (each instantiation would need a different base)");
|
|
1279
|
-
}
|
|
1280
|
-
}
|
|
1281
|
-
}
|
|
1287
|
+
const ownGenericBase = inst?.family.genericBase;
|
|
1288
|
+
if (inst && ownGenericBase) {
|
|
1289
|
+
const mapped = lowerer.mapTypeOf(lowerer.checker.getTypeAtLocation(ownGenericBase));
|
|
1290
|
+
base = mapped?.kind === "object" ? (lowerer.classes.get(mapped.className) ?? null) : null;
|
|
1291
|
+
if (!base || base.generic)
|
|
1292
|
+
lowerer.unsupported("SC1090", ownGenericBase, "a generic base whose type arguments have no concrete layout");
|
|
1282
1293
|
}
|
|
1283
1294
|
for (const clause of inst || mixin || computedBase ? [] : (decl.heritageClauses ?? [])) {
|
|
1284
1295
|
// `implements` is pure type-world: tsc checked the conformance and
|
|
@@ -1288,6 +1299,22 @@ mixin) {
|
|
|
1288
1299
|
if (clause.token === ts.SyntaxKind.ImplementsKeyword)
|
|
1289
1300
|
continue;
|
|
1290
1301
|
const t = clause.types[0];
|
|
1302
|
+
if (familyMode && t) {
|
|
1303
|
+
const reference = ts.isPropertyAccessExpression(t.expression)
|
|
1304
|
+
? t.expression.name
|
|
1305
|
+
: t.expression;
|
|
1306
|
+
const symbol = ts.isIdentifier(reference)
|
|
1307
|
+
? lowerer.resolveValueSymbol(reference)
|
|
1308
|
+
: undefined;
|
|
1309
|
+
const familyBase = symbol ? lowerer.classBySymbol.get(symbol) : undefined;
|
|
1310
|
+
if (familyBase?.generic) {
|
|
1311
|
+
if (symbol && ts.isPropertyAccessExpression(t.expression))
|
|
1312
|
+
fenceEarlyNsMemberRef(lowerer, t.expression, symbol);
|
|
1313
|
+
base = familyBase;
|
|
1314
|
+
genericBase = t;
|
|
1315
|
+
continue;
|
|
1316
|
+
}
|
|
1317
|
+
}
|
|
1291
1318
|
// `extends events.EventEmitter` — the namespace-member spelling of
|
|
1292
1319
|
// the ambient emitter base resolves like the named import.
|
|
1293
1320
|
if (t && ts.isPropertyAccessExpression(t.expression) && ts.isIdentifier(t.expression.name)) {
|
|
@@ -1669,6 +1696,7 @@ mixin) {
|
|
|
1669
1696
|
lowerer.badType(member.name, lowerer.typeOf(member.name));
|
|
1670
1697
|
if (type.kind === "dyn" &&
|
|
1671
1698
|
!isJsSourceFile(member.getSourceFile()) &&
|
|
1699
|
+
!lowerer.classImplementedProtocol(lowerer.typeOf(member.name)) &&
|
|
1672
1700
|
(member.type !== undefined ||
|
|
1673
1701
|
(lowerer.typeOf(member.name).flags & ts.TypeFlags.Any) === 0)) {
|
|
1674
1702
|
lowerer.unsupported("SC1090", member.name, "'unknown'-typed static fields");
|
|
@@ -1860,8 +1888,8 @@ mixin) {
|
|
|
1860
1888
|
// declaration is an ordinary OWN field (tsc guarantees every
|
|
1861
1889
|
// instantiable subclass declares it and, under
|
|
1862
1890
|
// strictPropertyInitialization, initializes it). Reads through
|
|
1863
|
-
// ABSTRACT-typed receivers
|
|
1864
|
-
//
|
|
1891
|
+
// ABSTRACT-typed receivers resolve the concrete instance's
|
|
1892
|
+
// property through checked class dispatch.
|
|
1865
1893
|
if (modifiers?.some((m) => m.kind === ts.SyntaxKind.AbstractKeyword))
|
|
1866
1894
|
continue;
|
|
1867
1895
|
if (modifiers?.some((m) => m.kind === ts.SyntaxKind.AccessorKeyword)) {
|
|
@@ -1899,7 +1927,9 @@ mixin) {
|
|
|
1899
1927
|
: null;
|
|
1900
1928
|
if (!type ||
|
|
1901
1929
|
type.kind === "void" ||
|
|
1902
|
-
(type.kind === "dyn" &&
|
|
1930
|
+
(type.kind === "dyn" &&
|
|
1931
|
+
!isJsSourceFile(member.getSourceFile()) &&
|
|
1932
|
+
!lowerer.classImplementedProtocol(inferred)))
|
|
1903
1933
|
lowerer.badType(member, inferred);
|
|
1904
1934
|
if (isJsSourceFile(member.getSourceFile())) {
|
|
1905
1935
|
type = inheritedJsFieldType(lowerer, decl, fieldName, type);
|
|
@@ -2027,7 +2057,9 @@ mixin) {
|
|
|
2027
2057
|
// Bundled JS declares fields without annotations before assigning
|
|
2028
2058
|
// them in the constructor. Use the same native checked-dynamic
|
|
2029
2059
|
// storage as implicit constructor-assigned JS fields.
|
|
2030
|
-
if (type.kind === "dyn" &&
|
|
2060
|
+
if (type.kind === "dyn" &&
|
|
2061
|
+
!isJsSourceFile(member.getSourceFile()) &&
|
|
2062
|
+
!lowerer.classImplementedProtocol(lowerer.typeOf(member.name))) {
|
|
2031
2063
|
lowerer.unsupported("SC1090", member.name, "'unknown'-typed class fields");
|
|
2032
2064
|
}
|
|
2033
2065
|
const undefinedInitializer = type.kind === "dyn" && !member.initializer ? locOf(member) : undefined;
|
|
@@ -2155,7 +2187,7 @@ mixin) {
|
|
|
2155
2187
|
if (type.kind === "void")
|
|
2156
2188
|
lowerer.badType(p.name, lowerer.typeOf(p.name));
|
|
2157
2189
|
// The class-field dyn rule verbatim (KEEP NARROW).
|
|
2158
|
-
if (type.kind === "dyn") {
|
|
2190
|
+
if (type.kind === "dyn" && !lowerer.classImplementedProtocol(lowerer.typeOf(p))) {
|
|
2159
2191
|
lowerer.unsupported("SC1090", p.name, "'unknown'-typed class fields");
|
|
2160
2192
|
}
|
|
2161
2193
|
// `override x` (and any same-named inherited member) would
|
|
@@ -2207,15 +2239,12 @@ mixin) {
|
|
|
2207
2239
|
if (findGenericMethodOn(lowerer, base, mName)) {
|
|
2208
2240
|
lowerer.unsupported("SC1090", member.name, `overriding the inherited generic method '${mName}' with a non-generic method (generic methods dispatch statically and would never reach this override)`);
|
|
2209
2241
|
}
|
|
2210
|
-
// Abstract re-declarations keep the overridden ABI exactly,
|
|
2211
|
-
// like any override (a concrete implementation below must
|
|
2212
|
-
// agree with BOTH, which exactness makes one constraint).
|
|
2213
2242
|
const overridden = lowerer.findMethodOn(base, mName);
|
|
2214
2243
|
if (overridden &&
|
|
2215
2244
|
(overridden.sig.params.length !== shapes.length ||
|
|
2216
2245
|
!overridden.sig.params.every((p, i) => typeEquals(p.type, shapes[i].type)) ||
|
|
2217
|
-
!typeEquals(overridden.sig.ret, ret))) {
|
|
2218
|
-
lowerer.unsupported("SC1090", member.name, "overriding a method with a different signature (parameter
|
|
2246
|
+
!typeEquals(overridden.sig.ret, overrideReturnAbi(lowerer, ret, overridden.sig.ret, className, base)))) {
|
|
2247
|
+
lowerer.unsupported("SC1090", member.name, "overriding a method with a different signature (parameter types must match the base declaration exactly; returns may narrow to a subclass)");
|
|
2219
2248
|
}
|
|
2220
2249
|
methods.set(mName, { params: shapes, ret, abstract: true });
|
|
2221
2250
|
continue;
|
|
@@ -2336,11 +2365,12 @@ mixin) {
|
|
|
2336
2365
|
if (refined)
|
|
2337
2366
|
ft.ret = refined;
|
|
2338
2367
|
}
|
|
2339
|
-
// Overrides keep the
|
|
2368
|
+
// Overrides keep the inherited ABI signature. tsc's method
|
|
2340
2369
|
// bivariance would let a narrowed parameter type through, and a
|
|
2341
2370
|
// vtable-dispatched call could then hand the override a base
|
|
2342
2371
|
// instance it reads out-of-bounds fields from — exactness keeps
|
|
2343
|
-
// every slot sound
|
|
2372
|
+
// every parameter slot sound. Nominal covariant returns share the
|
|
2373
|
+
// base pointer ABI while retaining their declared result type. Comparing
|
|
2344
2374
|
// ABI types only (not modes) is deliberate: call sites complete
|
|
2345
2375
|
// against the STATIC receiver's shape, so `m(x?: number)` and
|
|
2346
2376
|
// `m(x: number | undefined)` interchange soundly in overrides.
|
|
@@ -2402,7 +2432,7 @@ mixin) {
|
|
|
2402
2432
|
member.asteriskToken === undefined &&
|
|
2403
2433
|
(overridden.sig.params.length !== shapes.length ||
|
|
2404
2434
|
!overridden.sig.params.every((p, i) => typeEquals(p.type, shapes[i].type)) ||
|
|
2405
|
-
!typeEquals(overridden.sig.ret, ft.ret))) {
|
|
2435
|
+
!typeEquals(overridden.sig.ret, overrideReturnAbi(lowerer, ft.ret, overridden.sig.ret, className, base)))) {
|
|
2406
2436
|
const fencedJsOverride = isJsSourceFile(member.getSourceFile()) &&
|
|
2407
2437
|
overridden.declarer.decl !== null &&
|
|
2408
2438
|
isJsSourceFile(overridden.declarer.decl.getSourceFile()) &&
|
|
@@ -2429,12 +2459,12 @@ mixin) {
|
|
|
2429
2459
|
});
|
|
2430
2460
|
methodEntryFences.set(mName, unsupportedDiag("SC1090", locOf(member.name), returnOnly
|
|
2431
2461
|
? `overriding method '${mName}' with a different return type (the native return type must match the base declaration exactly)`
|
|
2432
|
-
: `overriding method '${mName}' with a different signature (the native parameter
|
|
2462
|
+
: `overriding method '${mName}' with a different signature (the native parameter types must match the base declaration exactly; returns may narrow to a subclass)`));
|
|
2433
2463
|
shapes.splice(0, shapes.length, ...overridden.sig.params);
|
|
2434
2464
|
ft.ret = overridden.sig.ret;
|
|
2435
2465
|
}
|
|
2436
2466
|
else {
|
|
2437
|
-
lowerer.unsupported("SC1090", member.name, "overriding a method with a different signature (parameter
|
|
2467
|
+
lowerer.unsupported("SC1090", member.name, "overriding a method with a different signature (parameter types must match the base declaration exactly; returns may narrow to a subclass)");
|
|
2438
2468
|
}
|
|
2439
2469
|
}
|
|
2440
2470
|
const asyncMember = member.modifiers?.some((m) => m.kind === ts.SyntaxKind.AsyncKeyword) === true;
|
|
@@ -3015,6 +3045,7 @@ mixin) {
|
|
|
3015
3045
|
ctorParams,
|
|
3016
3046
|
...(paramProps.length > 0 ? { paramProps } : {}),
|
|
3017
3047
|
base,
|
|
3048
|
+
...(genericBase ? { genericBase } : {}),
|
|
3018
3049
|
...(callableBase ? { callableBase } : {}),
|
|
3019
3050
|
...(factoryBaseExpression ? { factoryBaseExpression } : {}),
|
|
3020
3051
|
subclasses: [],
|
|
@@ -3044,6 +3075,7 @@ mixin) {
|
|
|
3044
3075
|
}
|
|
3045
3076
|
if (inst) {
|
|
3046
3077
|
info.genericInstance = {
|
|
3078
|
+
path: inst.path,
|
|
3047
3079
|
family: inst.family,
|
|
3048
3080
|
bindings: inst.bindings,
|
|
3049
3081
|
typeArgsText: inst.typeArgsText,
|
|
@@ -3146,7 +3178,14 @@ mixin) {
|
|
|
3146
3178
|
* arguments, the instance cap, an uncollected family) make the whole
|
|
3147
3179
|
* reference unmappable — per-site diagnostics own the fence. */
|
|
3148
3180
|
export function genericClassInstanceType(lowerer, decl, ref, mapArgument) {
|
|
3149
|
-
|
|
3181
|
+
let gci = lowerer.genericClassByDecl.get(decl);
|
|
3182
|
+
if (!gci && ts.isClassDeclaration(decl)) {
|
|
3183
|
+
// A method signature can reference a generic class declared later in
|
|
3184
|
+
// the same module. Resolve its family now rather than freezing the
|
|
3185
|
+
// signature at the erased family layout for the rest of the build.
|
|
3186
|
+
lowerer.collectClassShape(decl);
|
|
3187
|
+
gci = lowerer.genericClassByDecl.get(decl);
|
|
3188
|
+
}
|
|
3150
3189
|
if (!gci) {
|
|
3151
3190
|
// The family never collected (a deferred/poisoned declaration): the
|
|
3152
3191
|
// pre-generics answer — the class's own name, unregistered, so dead
|
|
@@ -3203,12 +3242,12 @@ export function genericClassInstanceType(lowerer, decl, ref, mapArgument) {
|
|
|
3203
3242
|
lowerer.noteGenericClassInstanceDemand(existing.info);
|
|
3204
3243
|
return existing.poisoned ? null : { kind: "object", className: existing.name };
|
|
3205
3244
|
}
|
|
3206
|
-
//
|
|
3207
|
-
//
|
|
3208
|
-
|
|
3209
|
-
|
|
3210
|
-
|
|
3211
|
-
|
|
3245
|
+
// Recursive class fields and queued member bodies share the function
|
|
3246
|
+
// demand budget. Independent uses do not limit the family size.
|
|
3247
|
+
const path = extendInstantiationPath(lowerer.genericInstantiationPath, decl);
|
|
3248
|
+
if (!path) {
|
|
3249
|
+
lowerer.unsupported("SC1090", decl, `unbounded generic class instantiation ('${gci.baseName}' exceeded ${MAX_INSTANTIATION_RECURSION} recursive specializations on one demand path)`);
|
|
3250
|
+
}
|
|
3212
3251
|
const ordinal = gci.instances.size;
|
|
3213
3252
|
const name = `${gci.family.def.name}%${ordinal}`;
|
|
3214
3253
|
const entry = { name, info: null };
|
|
@@ -3219,10 +3258,13 @@ export function genericClassInstanceType(lowerer, decl, ref, mapArgument) {
|
|
|
3219
3258
|
const typeArgsText = `<${rendered.length > 80 ? rendered.slice(0, 77) + "..." : rendered}>`;
|
|
3220
3259
|
const prevBindings = lowerer.typeParamBindings;
|
|
3221
3260
|
const prevContext = lowerer.instantiationContext;
|
|
3261
|
+
const previousPath = lowerer.genericInstantiationPath;
|
|
3262
|
+
lowerer.genericInstantiationPath = path;
|
|
3222
3263
|
lowerer.typeParamBindings = bindings;
|
|
3223
3264
|
lowerer.instantiationContext = `instantiating class '${gci.baseName}' with ${typeArgsText}`;
|
|
3224
3265
|
try {
|
|
3225
3266
|
lowerer.collectClassShapeInner(decl, undefined, {
|
|
3267
|
+
path,
|
|
3226
3268
|
family: gci.family,
|
|
3227
3269
|
name,
|
|
3228
3270
|
bindings,
|
|
@@ -3241,6 +3283,7 @@ export function genericClassInstanceType(lowerer, decl, ref, mapArgument) {
|
|
|
3241
3283
|
finally {
|
|
3242
3284
|
lowerer.typeParamBindings = prevBindings;
|
|
3243
3285
|
lowerer.instantiationContext = prevContext;
|
|
3286
|
+
lowerer.genericInstantiationPath = previousPath;
|
|
3244
3287
|
}
|
|
3245
3288
|
const info = lowerer.classes.get(name);
|
|
3246
3289
|
if (!info) {
|
|
@@ -3290,6 +3333,8 @@ function withInstanceBindings(lowerer, info, fn) {
|
|
|
3290
3333
|
const prevBindings = lowerer.typeParamBindings;
|
|
3291
3334
|
const prevContext = lowerer.instantiationContext;
|
|
3292
3335
|
const prevSuppress = lowerer.suppressStats;
|
|
3336
|
+
const previousPath = lowerer.genericInstantiationPath;
|
|
3337
|
+
lowerer.genericInstantiationPath = gi.path;
|
|
3293
3338
|
lowerer.typeParamBindings = gi.bindings;
|
|
3294
3339
|
lowerer.instantiationContext = `instantiating class '${gi.family.generic?.baseName ?? info.def.jsName ?? ""}' with ${gi.typeArgsText}`;
|
|
3295
3340
|
lowerer.suppressStats = prevSuppress || gi.ordinal > 0;
|
|
@@ -3300,6 +3345,7 @@ function withInstanceBindings(lowerer, info, fn) {
|
|
|
3300
3345
|
lowerer.typeParamBindings = prevBindings;
|
|
3301
3346
|
lowerer.instantiationContext = prevContext;
|
|
3302
3347
|
lowerer.suppressStats = prevSuppress;
|
|
3348
|
+
lowerer.genericInstantiationPath = previousPath;
|
|
3303
3349
|
}
|
|
3304
3350
|
}
|
|
3305
3351
|
/** The `%init` statements for one class's static readonly fields AND
|
|
@@ -3896,7 +3942,13 @@ export function lowerStaticFieldRead(lowerer, expr) {
|
|
|
3896
3942
|
lowerer.unsupported("SC1090", expr, `reading the private static '${expr.name.text}' 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)`);
|
|
3897
3943
|
}
|
|
3898
3944
|
if (found?.field !== undefined) {
|
|
3899
|
-
|
|
3945
|
+
const value = {
|
|
3946
|
+
kind: "varRef",
|
|
3947
|
+
localId: found.field.globalId,
|
|
3948
|
+
type: found.field.type,
|
|
3949
|
+
loc,
|
|
3950
|
+
};
|
|
3951
|
+
return found.field.runtimeOptional ? value : lowerer.maybeNarrow(value, expr);
|
|
3900
3952
|
}
|
|
3901
3953
|
if (found) {
|
|
3902
3954
|
return staticMethodValue(lowerer, found.declarer, expr.name.text, found.method, expr, loc);
|
|
@@ -4420,6 +4472,19 @@ export function lowerStaticMethodCall(lowerer, call, access) {
|
|
|
4420
4472
|
if (info)
|
|
4421
4473
|
return staticCallOn(lowerer, call, access, info, false);
|
|
4422
4474
|
}
|
|
4475
|
+
// Namespace exports are immutable bindings to the same declaration as
|
|
4476
|
+
// named imports. Resolve them before asking for a constructor-value ABI:
|
|
4477
|
+
// a generic family has statics but no single constructor signature.
|
|
4478
|
+
if (ts.isPropertyAccessExpression(access.expression) && !access.expression.questionDotToken) {
|
|
4479
|
+
const member = nsMemberIdentOf(lowerer, access.expression);
|
|
4480
|
+
const symbol = member ? lowerer.resolveValueSymbol(member) : null;
|
|
4481
|
+
const info = symbol ? lowerer.classBySymbol.get(symbol) : undefined;
|
|
4482
|
+
if (info && info.classDecorators?.valueGlobalId === undefined) {
|
|
4483
|
+
if (symbol)
|
|
4484
|
+
fenceEarlyNsMemberRef(lowerer, access.expression, symbol);
|
|
4485
|
+
return staticCallOn(lowerer, call, access, info, false);
|
|
4486
|
+
}
|
|
4487
|
+
}
|
|
4423
4488
|
// `module.exports.describe()` in a module whose whole export IS a
|
|
4424
4489
|
// class expression: the receiver is exactly that class (the kept
|
|
4425
4490
|
// export assignment pins it) — the direct-name rules apply.
|
|
@@ -4696,7 +4761,13 @@ export function lowerClassValueProperty(lowerer, expr) {
|
|
|
4696
4761
|
lowerer.unsupported("SC1090", expr, `reading the static member '${member}' through a class value (a subclass of '${info.def.name.replace(/^%|^%m\d+\./, "")}' redeclares it, so the runtime class decides which declaration answers)`);
|
|
4697
4762
|
}
|
|
4698
4763
|
if (found.field !== undefined) {
|
|
4699
|
-
|
|
4764
|
+
const value = {
|
|
4765
|
+
kind: "varRef",
|
|
4766
|
+
localId: found.field.globalId,
|
|
4767
|
+
type: found.field.type,
|
|
4768
|
+
loc,
|
|
4769
|
+
};
|
|
4770
|
+
return found.field.runtimeOptional ? value : lowerer.maybeNarrow(value, expr);
|
|
4700
4771
|
}
|
|
4701
4772
|
return staticMethodValue(lowerer, found.declarer, member, found.method, expr, loc);
|
|
4702
4773
|
}
|
|
@@ -4714,6 +4785,20 @@ function abstractMemberSignature(lowerer, member) {
|
|
|
4714
4785
|
ret: lowerer.declaredReturnType(member, member.name),
|
|
4715
4786
|
};
|
|
4716
4787
|
}
|
|
4788
|
+
/** A nominal return subtype uses the same owned pointer as the inherited
|
|
4789
|
+
* return slot. The current class is still being collected, so consult its
|
|
4790
|
+
* already collected base chain before the complete class graph is available. */
|
|
4791
|
+
function overrideReturnAbi(lowerer, declared, inherited, className, base) {
|
|
4792
|
+
if (declared.kind !== "object" || inherited.kind !== "object")
|
|
4793
|
+
return declared;
|
|
4794
|
+
if (lowerer.isSubclassOf(declared.className, inherited.className) ||
|
|
4795
|
+
(declared.className === className &&
|
|
4796
|
+
base !== null &&
|
|
4797
|
+
(base.def.name === inherited.className ||
|
|
4798
|
+
lowerer.isSubclassOf(base.def.name, inherited.className))))
|
|
4799
|
+
return inherited;
|
|
4800
|
+
return declared;
|
|
4801
|
+
}
|
|
4717
4802
|
/** The nearest declaration of `name` at or above `info` — the method a
|
|
4718
4803
|
* receiver of that static class runs when nothing below overrides it. */
|
|
4719
4804
|
export function findMethodOn(lowerer, info, name) {
|
|
@@ -4726,9 +4811,15 @@ export function findMethodOn(lowerer, info, name) {
|
|
|
4726
4811
|
}
|
|
4727
4812
|
/** True when `sub` is a STRICT descendant of `sup` in the class graph. */
|
|
4728
4813
|
export function isSubclassOf(lowerer, sub, sup) {
|
|
4729
|
-
|
|
4730
|
-
|
|
4814
|
+
if (sub === sup)
|
|
4815
|
+
return false;
|
|
4816
|
+
for (let c = lowerer.classes.get(sub); c; c = c.base ?? undefined) {
|
|
4817
|
+
if (c.def.name === sup && c.def.name !== sub)
|
|
4731
4818
|
return true;
|
|
4819
|
+
for (let family = c.genericInstance?.family; family; family = family.base ?? undefined) {
|
|
4820
|
+
if (family.def.name === sup)
|
|
4821
|
+
return true;
|
|
4822
|
+
}
|
|
4732
4823
|
}
|
|
4733
4824
|
return false;
|
|
4734
4825
|
}
|
|
@@ -4871,34 +4962,7 @@ export function collectInheritedJsFieldWrites(lowerer, files) {
|
|
|
4871
4962
|
* hierarchy identifies the original declarations through aliases as well. */
|
|
4872
4963
|
export function collectVirtualJsMethods(lowerer, files) {
|
|
4873
4964
|
const families = [];
|
|
4874
|
-
|
|
4875
|
-
// Those slots need a callable ABI even when JavaScript would otherwise
|
|
4876
|
-
// specialize each call independently.
|
|
4877
|
-
for (const file of files)
|
|
4878
|
-
ts.walkPreorder(file, (node) => {
|
|
4879
|
-
if (!ts.isPropertyAccessExpression(node) && !ts.isElementAccessExpression(node))
|
|
4880
|
-
return;
|
|
4881
|
-
const name = ts.isPropertyAccessExpression(node)
|
|
4882
|
-
? node.name.text
|
|
4883
|
-
: ts.isStringLiteralLike(node.argumentExpression)
|
|
4884
|
-
? node.argumentExpression.text
|
|
4885
|
-
: null;
|
|
4886
|
-
if (name === null)
|
|
4887
|
-
return;
|
|
4888
|
-
const prototype = ts.isPropertyAccessExpression(node.expression) && node.expression.name.text === "prototype";
|
|
4889
|
-
const assigned = ts.isBinaryExpression(node.parent) &&
|
|
4890
|
-
node.parent.left === node &&
|
|
4891
|
-
node.parent.operatorToken.kind === ts.SyntaxKind.EqualsToken;
|
|
4892
|
-
const symbol = !assigned
|
|
4893
|
-
? undefined
|
|
4894
|
-
: ts.isPropertyAccessExpression(node)
|
|
4895
|
-
? lowerer.checker.getSymbolAtLocation(node.name)
|
|
4896
|
-
: lowerer.checker.getPropertyOfType(lowerer.typeOf(node.expression), name);
|
|
4897
|
-
if (prototype ||
|
|
4898
|
-
(symbol && lowerer.checker.declarationsOf(symbol).some(ts.isMethodDeclaration))) {
|
|
4899
|
-
lowerer.prototypeMethodAccesses.set(name, node);
|
|
4900
|
-
}
|
|
4901
|
-
});
|
|
4965
|
+
collectClassMethodMutations(lowerer, files);
|
|
4902
4966
|
const visit = (node) => {
|
|
4903
4967
|
if (ts.isClassDeclaration(node) || ts.isClassExpression(node)) {
|
|
4904
4968
|
const accessors = node.members.filter((member) => (ts.isGetAccessorDeclaration(member) || ts.isSetAccessorDeclaration(member)) &&
|
|
@@ -5065,7 +5129,7 @@ export function exactInstanceClassOf(lowerer, expr) {
|
|
|
5065
5129
|
* Const + direct `new` only — a reassignable binding or a produced
|
|
5066
5130
|
* value keeps today's record story and its fences. */
|
|
5067
5131
|
export function genericIfaceBindingKeepsClass(lowerer, decl, declaredType) {
|
|
5068
|
-
if (declaredType.kind !== "record")
|
|
5132
|
+
if (declaredType.kind !== "record" && declaredType.kind !== "dyn")
|
|
5069
5133
|
return false;
|
|
5070
5134
|
if (!ts.isIdentifier(decl.name) || decl.initializer === undefined || decl.type === undefined)
|
|
5071
5135
|
return false;
|
|
@@ -5076,13 +5140,16 @@ export function genericIfaceBindingKeepsClass(lowerer, decl, declaredType) {
|
|
|
5076
5140
|
init = init.expression;
|
|
5077
5141
|
if (!ts.isNewExpression(init))
|
|
5078
5142
|
return false;
|
|
5079
|
-
const shape = lowerer.shapes.get(declaredType.shapeId);
|
|
5080
|
-
if (!shape || shape.fields.length > 0 || shape.indexValue !== undefined || shape.tuple === true)
|
|
5081
|
-
return false;
|
|
5082
5143
|
const annT = lowerer.typeOf(decl.name);
|
|
5083
5144
|
const props = lowerer.checker.getPropertiesOfType(annT);
|
|
5084
5145
|
if (props.length === 0)
|
|
5085
5146
|
return false;
|
|
5147
|
+
if (declaredType.kind === "dyn")
|
|
5148
|
+
return (lowerer.classImplementedProtocol(annT) &&
|
|
5149
|
+
props.some((property) => isGenericCallableMemberType(lowerer.checker.getTypeOfSymbol(property), lowerer.checker)));
|
|
5150
|
+
const shape = lowerer.shapes.get(declaredType.shapeId);
|
|
5151
|
+
if (!shape || shape.fields.length > 0 || shape.indexValue !== undefined || shape.tuple === true)
|
|
5152
|
+
return false;
|
|
5086
5153
|
return props.every((p) => isGenericCallableMemberType(lowerer.checker.getTypeOfSymbol(p), lowerer.checker));
|
|
5087
5154
|
}
|
|
5088
5155
|
/** `recv.m<T>(args)` — a GENERIC method call, dispatched STATICALLY: the
|
|
@@ -6599,6 +6666,9 @@ function assignedThisFieldType(lowerer, expr) {
|
|
|
6599
6666
|
}
|
|
6600
6667
|
export function lowerNew(lowerer, expr) {
|
|
6601
6668
|
const loc = locOf(expr);
|
|
6669
|
+
const worker = lowerWorkerNew(lowerer, expr);
|
|
6670
|
+
if (worker)
|
|
6671
|
+
return worker;
|
|
6602
6672
|
let intlConstructor = expr.expression;
|
|
6603
6673
|
if (ts.isIdentifier(intlConstructor)) {
|
|
6604
6674
|
const symbol = lowerer.resolveValueSymbol(intlConstructor);
|
|
@@ -7205,7 +7275,7 @@ export function lowerNew(lowerer, expr) {
|
|
|
7205
7275
|
if (targs[1]) {
|
|
7206
7276
|
lowerer.unsupported("SC1090", expr, `Map values of type '${lowerer.checker.typeToString(targs[1])}' ` +
|
|
7207
7277
|
`(Map values must be number, string, boolean, records, class instances, ` +
|
|
7208
|
-
`arrays, promises, Maps, Sets, or unions
|
|
7278
|
+
`typed arrays, arrays, promises, Maps, Sets, or supported unions and checked values)`);
|
|
7209
7279
|
}
|
|
7210
7280
|
lowerer.badType(expr, tsType);
|
|
7211
7281
|
}
|