From 6d46850172885a58eb31143086318b546170b7d7 Mon Sep 17 00:00:00 2001 From: Anders Hejlsberg Date: Thu, 15 Aug 2019 10:02:39 -0700 Subject: [PATCH] Accept new baselines --- .../reference/unionTypeInference.errors.txt | 17 +++++ .../baselines/reference/unionTypeInference.js | 61 ++++++++++++------ .../reference/unionTypeInference.symbols | 64 ++++++++++++++++++- .../reference/unionTypeInference.types | 51 +++++++++++++++ 4 files changed, 173 insertions(+), 20 deletions(-) diff --git a/tests/baselines/reference/unionTypeInference.errors.txt b/tests/baselines/reference/unionTypeInference.errors.txt index f28f32f3373..5534b8a175d 100644 --- a/tests/baselines/reference/unionTypeInference.errors.txt +++ b/tests/baselines/reference/unionTypeInference.errors.txt @@ -58,4 +58,21 @@ tests/cases/conformance/types/typeRelationships/typeInference/unionTypeInference declare function bar(x: T, y: string | T): T; const y = bar(1, 2); + + // Repro from #32752 + + const containsPromises: unique symbol = Symbol(); + + type DeepPromised = + { [containsPromises]?: true } & + { [TKey in keyof T]: T[TKey] | DeepPromised | Promise> }; + + async function fun(deepPromised: DeepPromised) { + const deepPromisedWithIndexer: DeepPromised<{ [name: string]: {} | null | undefined }> = deepPromised; + for (const value of Object.values(deepPromisedWithIndexer)) { + const awaitedValue = await value; + if (awaitedValue) + await fun(awaitedValue); + } + } \ No newline at end of file diff --git a/tests/baselines/reference/unionTypeInference.js b/tests/baselines/reference/unionTypeInference.js index e41872eb4d4..c26e4241cb5 100644 --- a/tests/baselines/reference/unionTypeInference.js +++ b/tests/baselines/reference/unionTypeInference.js @@ -50,29 +50,54 @@ foo(x); declare function bar(x: T, y: string | T): T; const y = bar(1, 2); + +// Repro from #32752 + +const containsPromises: unique symbol = Symbol(); + +type DeepPromised = + { [containsPromises]?: true } & + { [TKey in keyof T]: T[TKey] | DeepPromised | Promise> }; + +async function fun(deepPromised: DeepPromised) { + const deepPromisedWithIndexer: DeepPromised<{ [name: string]: {} | null | undefined }> = deepPromised; + for (const value of Object.values(deepPromisedWithIndexer)) { + const awaitedValue = await value; + if (awaitedValue) + await fun(awaitedValue); + } +} //// [unionTypeInference.js] -"use strict"; -exports.__esModule = true; -var a1 = f1(1, 2); // 1 | 2 -var a2 = f1(1, "hello"); // 1 -var a3 = f1(1, sn); // number -var a4 = f1(undefined, "abc"); // undefined -var a5 = f1("foo", "bar"); // "foo" -var a6 = f1(true, false); // boolean -var a7 = f1("hello", 1); // Error +const a1 = f1(1, 2); // 1 | 2 +const a2 = f1(1, "hello"); // 1 +const a3 = f1(1, sn); // number +const a4 = f1(undefined, "abc"); // undefined +const a5 = f1("foo", "bar"); // "foo" +const a6 = f1(true, false); // boolean +const a7 = f1("hello", 1); // Error var b1 = f2(["string", true]); // boolean -var c1 = f3(5); // 5 -var c2 = f3(sn); // number -var c3 = f3(true); // true -var c4 = f3(b); // true -var c5 = f3("abc"); // never -var d1 = f4("abc"); -var d2 = f4(s); -var d3 = f4(42); // Error +const c1 = f3(5); // 5 +const c2 = f3(sn); // number +const c3 = f3(true); // true +const c4 = f3(b); // true +const c5 = f3("abc"); // never +const d1 = f4("abc"); +const d2 = f4(s); +const d3 = f4(42); // Error function qux(p1, p2) { p1 = p2; } foo(x); -var y = bar(1, 2); +const y = bar(1, 2); +// Repro from #32752 +const containsPromises = Symbol(); +async function fun(deepPromised) { + const deepPromisedWithIndexer = deepPromised; + for (const value of Object.values(deepPromisedWithIndexer)) { + const awaitedValue = await value; + if (awaitedValue) + await fun(awaitedValue); + } +} diff --git a/tests/baselines/reference/unionTypeInference.symbols b/tests/baselines/reference/unionTypeInference.symbols index 0d0bf6ae9be..65377783184 100644 --- a/tests/baselines/reference/unionTypeInference.symbols +++ b/tests/baselines/reference/unionTypeInference.symbols @@ -163,12 +163,12 @@ declare function foo(x: T | Promise): void; >T : Symbol(T, Decl(unionTypeInference.ts, 45, 21)) >x : Symbol(x, Decl(unionTypeInference.ts, 45, 24)) >T : Symbol(T, Decl(unionTypeInference.ts, 45, 21)) ->Promise : Symbol(Promise, Decl(lib.es5.d.ts, --, --)) +>Promise : Symbol(Promise, Decl(lib.es5.d.ts, --, --), Decl(lib.es2015.iterable.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.symbol.wellknown.d.ts, --, --), Decl(lib.es2018.promise.d.ts, --, --)) >T : Symbol(T, Decl(unionTypeInference.ts, 45, 21)) declare let x: false | Promise; >x : Symbol(x, Decl(unionTypeInference.ts, 46, 11)) ->Promise : Symbol(Promise, Decl(lib.es5.d.ts, --, --)) +>Promise : Symbol(Promise, Decl(lib.es5.d.ts, --, --), Decl(lib.es2015.iterable.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.symbol.wellknown.d.ts, --, --), Decl(lib.es2018.promise.d.ts, --, --)) foo(x); >foo : Symbol(foo, Decl(unionTypeInference.ts, 41, 1)) @@ -187,3 +187,63 @@ const y = bar(1, 2); >y : Symbol(y, Decl(unionTypeInference.ts, 50, 5)) >bar : Symbol(bar, Decl(unionTypeInference.ts, 47, 7)) +// Repro from #32752 + +const containsPromises: unique symbol = Symbol(); +>containsPromises : Symbol(containsPromises, Decl(unionTypeInference.ts, 54, 5)) +>Symbol : Symbol(Symbol, Decl(lib.es5.d.ts, --, --), Decl(lib.es2015.symbol.d.ts, --, --), Decl(lib.es2015.symbol.wellknown.d.ts, --, --), Decl(lib.es2019.symbol.d.ts, --, --)) + +type DeepPromised = +>DeepPromised : Symbol(DeepPromised, Decl(unionTypeInference.ts, 54, 49)) +>T : Symbol(T, Decl(unionTypeInference.ts, 56, 18)) + + { [containsPromises]?: true } & +>[containsPromises] : Symbol([containsPromises], Decl(unionTypeInference.ts, 57, 5)) +>containsPromises : Symbol(containsPromises, Decl(unionTypeInference.ts, 54, 5)) + + { [TKey in keyof T]: T[TKey] | DeepPromised | Promise> }; +>TKey : Symbol(TKey, Decl(unionTypeInference.ts, 58, 7)) +>T : Symbol(T, Decl(unionTypeInference.ts, 56, 18)) +>T : Symbol(T, Decl(unionTypeInference.ts, 56, 18)) +>TKey : Symbol(TKey, Decl(unionTypeInference.ts, 58, 7)) +>DeepPromised : Symbol(DeepPromised, Decl(unionTypeInference.ts, 54, 49)) +>T : Symbol(T, Decl(unionTypeInference.ts, 56, 18)) +>TKey : Symbol(TKey, Decl(unionTypeInference.ts, 58, 7)) +>Promise : Symbol(Promise, Decl(lib.es5.d.ts, --, --), Decl(lib.es2015.iterable.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.symbol.wellknown.d.ts, --, --), Decl(lib.es2018.promise.d.ts, --, --)) +>DeepPromised : Symbol(DeepPromised, Decl(unionTypeInference.ts, 54, 49)) +>T : Symbol(T, Decl(unionTypeInference.ts, 56, 18)) +>TKey : Symbol(TKey, Decl(unionTypeInference.ts, 58, 7)) + +async function fun(deepPromised: DeepPromised) { +>fun : Symbol(fun, Decl(unionTypeInference.ts, 58, 92)) +>T : Symbol(T, Decl(unionTypeInference.ts, 60, 19)) +>deepPromised : Symbol(deepPromised, Decl(unionTypeInference.ts, 60, 22)) +>DeepPromised : Symbol(DeepPromised, Decl(unionTypeInference.ts, 54, 49)) +>T : Symbol(T, Decl(unionTypeInference.ts, 60, 19)) + + const deepPromisedWithIndexer: DeepPromised<{ [name: string]: {} | null | undefined }> = deepPromised; +>deepPromisedWithIndexer : Symbol(deepPromisedWithIndexer, Decl(unionTypeInference.ts, 61, 9)) +>DeepPromised : Symbol(DeepPromised, Decl(unionTypeInference.ts, 54, 49)) +>name : Symbol(name, Decl(unionTypeInference.ts, 61, 51)) +>deepPromised : Symbol(deepPromised, Decl(unionTypeInference.ts, 60, 22)) + + for (const value of Object.values(deepPromisedWithIndexer)) { +>value : Symbol(value, Decl(unionTypeInference.ts, 62, 14)) +>Object.values : Symbol(ObjectConstructor.values, Decl(lib.es2017.object.d.ts, --, --), Decl(lib.es2017.object.d.ts, --, --)) +>Object : Symbol(Object, Decl(lib.es5.d.ts, --, --), Decl(lib.es5.d.ts, --, --)) +>values : Symbol(ObjectConstructor.values, Decl(lib.es2017.object.d.ts, --, --), Decl(lib.es2017.object.d.ts, --, --)) +>deepPromisedWithIndexer : Symbol(deepPromisedWithIndexer, Decl(unionTypeInference.ts, 61, 9)) + + const awaitedValue = await value; +>awaitedValue : Symbol(awaitedValue, Decl(unionTypeInference.ts, 63, 13)) +>value : Symbol(value, Decl(unionTypeInference.ts, 62, 14)) + + if (awaitedValue) +>awaitedValue : Symbol(awaitedValue, Decl(unionTypeInference.ts, 63, 13)) + + await fun(awaitedValue); +>fun : Symbol(fun, Decl(unionTypeInference.ts, 58, 92)) +>awaitedValue : Symbol(awaitedValue, Decl(unionTypeInference.ts, 63, 13)) + } +} + diff --git a/tests/baselines/reference/unionTypeInference.types b/tests/baselines/reference/unionTypeInference.types index 304bbcd33ec..6cd2baec6ba 100644 --- a/tests/baselines/reference/unionTypeInference.types +++ b/tests/baselines/reference/unionTypeInference.types @@ -185,3 +185,54 @@ const y = bar(1, 2); >1 : 1 >2 : 2 +// Repro from #32752 + +const containsPromises: unique symbol = Symbol(); +>containsPromises : unique symbol +>Symbol() : unique symbol +>Symbol : SymbolConstructor + +type DeepPromised = +>DeepPromised : DeepPromised + + { [containsPromises]?: true } & +>[containsPromises] : true | undefined +>containsPromises : unique symbol +>true : true + + { [TKey in keyof T]: T[TKey] | DeepPromised | Promise> }; + +async function fun(deepPromised: DeepPromised) { +>fun : (deepPromised: DeepPromised) => Promise +>deepPromised : DeepPromised + + const deepPromisedWithIndexer: DeepPromised<{ [name: string]: {} | null | undefined }> = deepPromised; +>deepPromisedWithIndexer : DeepPromised<{ [name: string]: {} | null | undefined; }> +>name : string +>null : null +>deepPromised : DeepPromised + + for (const value of Object.values(deepPromisedWithIndexer)) { +>value : {} | ({ [containsPromises]?: true | undefined; } & {}) | Promise<{ [containsPromises]?: true | undefined; } & {}> | null | undefined +>Object.values(deepPromisedWithIndexer) : ({} | ({ [containsPromises]?: true | undefined; } & {}) | Promise<{ [containsPromises]?: true | undefined; } & {}> | null | undefined)[] +>Object.values : { (o: { [s: string]: T; } | ArrayLike): T[]; (o: {}): any[]; } +>Object : ObjectConstructor +>values : { (o: { [s: string]: T; } | ArrayLike): T[]; (o: {}): any[]; } +>deepPromisedWithIndexer : DeepPromised<{ [name: string]: {} | null | undefined; }> + + const awaitedValue = await value; +>awaitedValue : {} | ({ [containsPromises]?: true | undefined; } & {}) | null | undefined +>await value : {} | ({ [containsPromises]?: true | undefined; } & {}) | null | undefined +>value : {} | ({ [containsPromises]?: true | undefined; } & {}) | Promise<{ [containsPromises]?: true | undefined; } & {}> | null | undefined + + if (awaitedValue) +>awaitedValue : {} | ({ [containsPromises]?: true | undefined; } & {}) | null | undefined + + await fun(awaitedValue); +>await fun(awaitedValue) : void +>fun(awaitedValue) : Promise +>fun : (deepPromised: DeepPromised) => Promise +>awaitedValue : {} | ({ [containsPromises]?: true | undefined; } & {}) + } +} +