From 1dcf4ab32f2b42e0fc5b5b1a2cb75bf2665bd629 Mon Sep 17 00:00:00 2001 From: Anders Hejlsberg Date: Mon, 18 May 2020 20:14:57 -0700 Subject: [PATCH] Add regression test --- .../reference/circularContextualMappedType.js | 32 ++++++++++++ .../circularContextualMappedType.symbols | 51 +++++++++++++++++++ .../circularContextualMappedType.types | 50 ++++++++++++++++++ .../compiler/circularContextualMappedType.ts | 20 ++++++++ 4 files changed, 153 insertions(+) create mode 100644 tests/baselines/reference/circularContextualMappedType.js create mode 100644 tests/baselines/reference/circularContextualMappedType.symbols create mode 100644 tests/baselines/reference/circularContextualMappedType.types create mode 100644 tests/cases/compiler/circularContextualMappedType.ts diff --git a/tests/baselines/reference/circularContextualMappedType.js b/tests/baselines/reference/circularContextualMappedType.js new file mode 100644 index 00000000000..7bd989c843a --- /dev/null +++ b/tests/baselines/reference/circularContextualMappedType.js @@ -0,0 +1,32 @@ +//// [circularContextualMappedType.ts] +type Func = () => T; + +type Mapped = { [K in keyof T]: Func }; + +declare function reproduce(options: number): void; +declare function reproduce(options: Mapped): T + +reproduce({ + name: () => { return 123 } +}); + +reproduce({ + name() { return 123 } +}); + +reproduce({ + name: function () { return 123 } +}); + + +//// [circularContextualMappedType.js] +"use strict"; +reproduce({ + name: function () { return 123; } +}); +reproduce({ + name: function () { return 123; } +}); +reproduce({ + name: function () { return 123; } +}); diff --git a/tests/baselines/reference/circularContextualMappedType.symbols b/tests/baselines/reference/circularContextualMappedType.symbols new file mode 100644 index 00000000000..445906d48c1 --- /dev/null +++ b/tests/baselines/reference/circularContextualMappedType.symbols @@ -0,0 +1,51 @@ +=== tests/cases/compiler/circularContextualMappedType.ts === +type Func = () => T; +>Func : Symbol(Func, Decl(circularContextualMappedType.ts, 0, 0)) +>T : Symbol(T, Decl(circularContextualMappedType.ts, 0, 10)) +>T : Symbol(T, Decl(circularContextualMappedType.ts, 0, 10)) + +type Mapped = { [K in keyof T]: Func }; +>Mapped : Symbol(Mapped, Decl(circularContextualMappedType.ts, 0, 23)) +>T : Symbol(T, Decl(circularContextualMappedType.ts, 2, 12)) +>K : Symbol(K, Decl(circularContextualMappedType.ts, 2, 20)) +>T : Symbol(T, Decl(circularContextualMappedType.ts, 2, 12)) +>Func : Symbol(Func, Decl(circularContextualMappedType.ts, 0, 0)) +>T : Symbol(T, Decl(circularContextualMappedType.ts, 2, 12)) +>K : Symbol(K, Decl(circularContextualMappedType.ts, 2, 20)) + +declare function reproduce(options: number): void; +>reproduce : Symbol(reproduce, Decl(circularContextualMappedType.ts, 2, 48), Decl(circularContextualMappedType.ts, 4, 50)) +>options : Symbol(options, Decl(circularContextualMappedType.ts, 4, 27)) + +declare function reproduce(options: Mapped): T +>reproduce : Symbol(reproduce, Decl(circularContextualMappedType.ts, 2, 48), Decl(circularContextualMappedType.ts, 4, 50)) +>T : Symbol(T, Decl(circularContextualMappedType.ts, 5, 27)) +>options : Symbol(options, Decl(circularContextualMappedType.ts, 5, 30)) +>Mapped : Symbol(Mapped, Decl(circularContextualMappedType.ts, 0, 23)) +>T : Symbol(T, Decl(circularContextualMappedType.ts, 5, 27)) +>T : Symbol(T, Decl(circularContextualMappedType.ts, 5, 27)) + +reproduce({ +>reproduce : Symbol(reproduce, Decl(circularContextualMappedType.ts, 2, 48), Decl(circularContextualMappedType.ts, 4, 50)) + + name: () => { return 123 } +>name : Symbol(name, Decl(circularContextualMappedType.ts, 7, 11)) + +}); + +reproduce({ +>reproduce : Symbol(reproduce, Decl(circularContextualMappedType.ts, 2, 48), Decl(circularContextualMappedType.ts, 4, 50)) + + name() { return 123 } +>name : Symbol(name, Decl(circularContextualMappedType.ts, 11, 11)) + +}); + +reproduce({ +>reproduce : Symbol(reproduce, Decl(circularContextualMappedType.ts, 2, 48), Decl(circularContextualMappedType.ts, 4, 50)) + + name: function () { return 123 } +>name : Symbol(name, Decl(circularContextualMappedType.ts, 15, 11)) + +}); + diff --git a/tests/baselines/reference/circularContextualMappedType.types b/tests/baselines/reference/circularContextualMappedType.types new file mode 100644 index 00000000000..d9439215d28 --- /dev/null +++ b/tests/baselines/reference/circularContextualMappedType.types @@ -0,0 +1,50 @@ +=== tests/cases/compiler/circularContextualMappedType.ts === +type Func = () => T; +>Func : Func + +type Mapped = { [K in keyof T]: Func }; +>Mapped : Mapped + +declare function reproduce(options: number): void; +>reproduce : { (options: number): void; (options: Mapped): T; } +>options : number + +declare function reproduce(options: Mapped): T +>reproduce : { (options: number): void; (options: Mapped): T; } +>options : Mapped + +reproduce({ +>reproduce({ name: () => { return 123 }}) : { name: number; } +>reproduce : { (options: number): void; (options: Mapped): T; } +>{ name: () => { return 123 }} : { name: () => number; } + + name: () => { return 123 } +>name : () => number +>() => { return 123 } : () => number +>123 : 123 + +}); + +reproduce({ +>reproduce({ name() { return 123 }}) : { name: number; } +>reproduce : { (options: number): void; (options: Mapped): T; } +>{ name() { return 123 }} : { name(): number; } + + name() { return 123 } +>name : () => number +>123 : 123 + +}); + +reproduce({ +>reproduce({ name: function () { return 123 }}) : { name: number; } +>reproduce : { (options: number): void; (options: Mapped): T; } +>{ name: function () { return 123 }} : { name: () => number; } + + name: function () { return 123 } +>name : () => number +>function () { return 123 } : () => number +>123 : 123 + +}); + diff --git a/tests/cases/compiler/circularContextualMappedType.ts b/tests/cases/compiler/circularContextualMappedType.ts new file mode 100644 index 00000000000..4c982cd6fca --- /dev/null +++ b/tests/cases/compiler/circularContextualMappedType.ts @@ -0,0 +1,20 @@ +// @strict: true + +type Func = () => T; + +type Mapped = { [K in keyof T]: Func }; + +declare function reproduce(options: number): void; +declare function reproduce(options: Mapped): T + +reproduce({ + name: () => { return 123 } +}); + +reproduce({ + name() { return 123 } +}); + +reproduce({ + name: function () { return 123 } +});