Skip to content

Commit 5c3717e

Browse files
committed
Add tests
1 parent 90bd388 commit 5c3717e

9 files changed

+72
-14
lines changed

src/compiler/checker.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -3865,7 +3865,7 @@ namespace ts {
38653865
}
38663866
if (type.flags & TypeFlags.TypeParameter || objectFlags & ObjectFlags.ClassOrInterface) {
38673867
if (type.flags & TypeFlags.TypeParameter && contains(context.inferTypeParameters, type)) {
3868-
context.approximateLength += (symbolName(type.symbol).length + 6);
3868+
context.approximateLength += 6 + (type.symbol ? symbolName(type.symbol).length : 1);
38693869
return createInferTypeNode(typeParameterToDeclarationWithConstraint(type as TypeParameter, context, /*constraintNode*/ undefined));
38703870
}
38713871
if (context.flags & NodeBuilderFlags.GenerateNamesForShadowedTypeParams &&
@@ -4801,7 +4801,7 @@ namespace ts {
48014801
return cached;
48024802
}
48034803
}
4804-
let result = symbolToName(type.symbol, context, SymbolFlags.Type, /*expectsIdentifier*/ true);
4804+
let result = type.symbol ? symbolToName(type.symbol, context, SymbolFlags.Type, /*expectsIdentifier*/ true) : createIdentifier("?");
48054805
if (!(result.kind & SyntaxKind.Identifier)) {
48064806
return createIdentifier("(Missing type parameter)");
48074807
}

tests/baselines/reference/asyncArrowFunctionCapturesThis_es2017.types

+3-3
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,9 @@ class C {
66
>method : () => void
77

88
var fn = async () => await this;
9-
>fn : () => Promise<this>
10-
>async () => await this : () => Promise<this>
11-
>await this : this
9+
>fn : () => Promise<this extends undefined ? this : this extends PromiseLike<infer ?> ? ? : this>
10+
>async () => await this : () => Promise<this extends undefined ? this : this extends PromiseLike<infer ?> ? ? : this>
11+
>await this : this extends undefined ? this : this extends PromiseLike<infer ?> ? ? : this
1212
>this : this
1313
}
1414
}

tests/baselines/reference/asyncArrowFunctionCapturesThis_es5.types

+3-3
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,9 @@ class C {
66
>method : () => void
77

88
var fn = async () => await this;
9-
>fn : () => Promise<this>
10-
>async () => await this : () => Promise<this>
11-
>await this : this
9+
>fn : () => Promise<this extends undefined ? this : this extends PromiseLike<infer ?> ? ? : this>
10+
>async () => await this : () => Promise<this extends undefined ? this : this extends PromiseLike<infer ?> ? ? : this>
11+
>await this : this extends undefined ? this : this extends PromiseLike<infer ?> ? ? : this
1212
>this : this
1313
}
1414
}

tests/baselines/reference/asyncArrowFunctionCapturesThis_es6.types

+3-3
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,9 @@ class C {
66
>method : () => void
77

88
var fn = async () => await this;
9-
>fn : () => Promise<this>
10-
>async () => await this : () => Promise<this>
11-
>await this : this
9+
>fn : () => Promise<this extends undefined ? this : this extends PromiseLike<infer ?> ? ? : this>
10+
>async () => await this : () => Promise<this extends undefined ? this : this extends PromiseLike<infer ?> ? ? : this>
11+
>await this : this extends undefined ? this : this extends PromiseLike<infer ?> ? ? : this
1212
>this : this
1313
}
1414
}

tests/baselines/reference/asyncFunctionReturnType.js

+16-1
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,15 @@ async function fGenericIndexedTypeForPromiseOfKProp<TObj extends Obj, K extends
7373

7474
async function fGenericIndexedTypeForExplicitPromiseOfKProp<TObj extends Obj, K extends keyof TObj>(obj: TObj, key: K): Promise<TObj[K]> {
7575
return Promise.resolve<TObj[K]>(obj[key]);
76-
}
76+
}
77+
78+
// #27711
79+
80+
async function fGeneric<T>(x: T) {
81+
return x;
82+
}
83+
const expected: Promise<number> = fGeneric(undefined as Promise<number>);
84+
7785

7886
//// [asyncFunctionReturnType.js]
7987
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
@@ -172,3 +180,10 @@ function fGenericIndexedTypeForExplicitPromiseOfKProp(obj, key) {
172180
return Promise.resolve(obj[key]);
173181
});
174182
}
183+
// #27711
184+
function fGeneric(x) {
185+
return __awaiter(this, void 0, void 0, function* () {
186+
return x;
187+
});
188+
}
189+
const expected = fGeneric(undefined);

tests/baselines/reference/asyncFunctionReturnType.symbols

+19
Original file line numberDiff line numberDiff line change
@@ -285,3 +285,22 @@ async function fGenericIndexedTypeForExplicitPromiseOfKProp<TObj extends Obj, K
285285
>obj : Symbol(obj, Decl(asyncFunctionReturnType.ts, 72, 100))
286286
>key : Symbol(key, Decl(asyncFunctionReturnType.ts, 72, 110))
287287
}
288+
289+
// #27711
290+
291+
async function fGeneric<T>(x: T) {
292+
>fGeneric : Symbol(fGeneric, Decl(asyncFunctionReturnType.ts, 74, 1))
293+
>T : Symbol(T, Decl(asyncFunctionReturnType.ts, 78, 24))
294+
>x : Symbol(x, Decl(asyncFunctionReturnType.ts, 78, 27))
295+
>T : Symbol(T, Decl(asyncFunctionReturnType.ts, 78, 24))
296+
297+
return x;
298+
>x : Symbol(x, Decl(asyncFunctionReturnType.ts, 78, 27))
299+
}
300+
const expected: Promise<number> = fGeneric(undefined as Promise<number>);
301+
>expected : Symbol(expected, Decl(asyncFunctionReturnType.ts, 81, 5))
302+
>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, --, --))
303+
>fGeneric : Symbol(fGeneric, Decl(asyncFunctionReturnType.ts, 74, 1))
304+
>undefined : Symbol(undefined)
305+
>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, --, --))
306+

tests/baselines/reference/asyncFunctionReturnType.types

+17
Original file line numberDiff line numberDiff line change
@@ -220,3 +220,20 @@ async function fGenericIndexedTypeForExplicitPromiseOfKProp<TObj extends Obj, K
220220
>obj : TObj
221221
>key : K
222222
}
223+
224+
// #27711
225+
226+
async function fGeneric<T>(x: T) {
227+
>fGeneric : <T>(x: T) => Promise<T extends undefined ? T : T extends PromiseLike<infer ?> ? ? : T>
228+
>x : T
229+
230+
return x;
231+
>x : T
232+
}
233+
const expected: Promise<number> = fGeneric(undefined as Promise<number>);
234+
>expected : Promise<number>
235+
>fGeneric(undefined as Promise<number>) : Promise<number>
236+
>fGeneric : <T>(x: T) => Promise<T extends undefined ? T : T extends PromiseLike<infer ?> ? ? : T>
237+
>undefined as Promise<number> : Promise<number>
238+
>undefined : undefined
239+

tests/baselines/reference/forAwaitForUnion.types

+1-1
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ async function f<T>(source: Iterable<T> | AsyncIterable<T>) {
44
>source : Iterable<T> | AsyncIterable<T>
55

66
for await (const x of source) {
7-
>x : T
7+
>x : T | (T extends undefined ? T : T extends PromiseLike<infer ?> ? ? : T)
88
>source : Iterable<T> | AsyncIterable<T>
99
}
1010
}

tests/cases/compiler/asyncFunctionReturnType.ts

+8-1
Original file line numberDiff line numberDiff line change
@@ -73,4 +73,11 @@ async function fGenericIndexedTypeForPromiseOfKProp<TObj extends Obj, K extends
7373

7474
async function fGenericIndexedTypeForExplicitPromiseOfKProp<TObj extends Obj, K extends keyof TObj>(obj: TObj, key: K): Promise<TObj[K]> {
7575
return Promise.resolve<TObj[K]>(obj[key]);
76-
}
76+
}
77+
78+
// #27711
79+
80+
async function fGeneric<T>(x: T) {
81+
return x;
82+
}
83+
const expected: Promise<number> = fGeneric(undefined as Promise<number>);

0 commit comments

Comments
 (0)