Skip to content

Commit 6afa880

Browse files
Merge pull request #27573 from uniqueiniquity/alwaysAwait
Always await expression of promise type in return position
2 parents 8474949 + 2ebd986 commit 6afa880

8 files changed

+54
-9
lines changed

src/services/codefixes/convertToAsyncFunction.ts

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -465,19 +465,19 @@ namespace ts.codefix {
465465
return innerCbBody;
466466
}
467467

468+
const type = transformer.checker.getTypeAtLocation(func);
469+
const returnType = getLastCallSignature(type, transformer.checker)!.getReturnType();
470+
const rightHandSide = getSynthesizedDeepClone(funcBody);
471+
const possiblyAwaitedRightHandSide = !!transformer.checker.getPromisedTypeOfPromise(returnType) ? createAwait(rightHandSide) : rightHandSide;
468472
if (!shouldReturn) {
469-
const type = transformer.checker.getTypeAtLocation(func);
470-
const returnType = getLastCallSignature(type, transformer.checker)!.getReturnType();
471-
const rightHandSide = getSynthesizedDeepClone(funcBody);
472-
const possiblyAwaitedRightHandSide = !!transformer.checker.getPromisedTypeOfPromise(returnType) ? createAwait(rightHandSide) : rightHandSide;
473473
const transformedStatement = createTransformedStatement(prevArgName, possiblyAwaitedRightHandSide, transformer);
474474
if (prevArgName) {
475475
prevArgName.types.push(returnType);
476476
}
477477
return transformedStatement;
478478
}
479479
else {
480-
return [createReturn(getSynthesizedDeepClone(funcBody))];
480+
return [createReturn(possiblyAwaitedRightHandSide)];
481481
}
482482
}
483483
}

src/testRunner/unittests/convertToAsyncFunction.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1236,6 +1236,13 @@ function [#|f|]() {
12361236
}
12371237
`);
12381238

1239+
_testConvertToAsyncFunction("convertToAsyncFunction_callbackReturnsRejectedPromiseInTryBlock", `
1240+
function [#|f|]() {
1241+
return Promise.resolve(1)
1242+
.then(x => Promise.reject(x))
1243+
.catch(err => console.log(err));
1244+
}
1245+
`);
12391246

12401247
_testConvertToAsyncFunction("convertToAsyncFunction_nestedPromises", `
12411248
function [#|f|]() {

tests/baselines/reference/convertToAsyncFunction/convertToAsyncFunction_callbackReturnsPromiseLastInChain.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,5 +8,5 @@ function /*[#|*/f/*|]*/() {
88

99
async function f() {
1010
const s = await fetch('https://typescriptlang.org');
11-
return Promise.resolve(s.statusText.length);
11+
return await Promise.resolve(s.statusText.length);
1212
}

tests/baselines/reference/convertToAsyncFunction/convertToAsyncFunction_callbackReturnsPromiseLastInChain.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,5 +8,5 @@ function /*[#|*/f/*|]*/() {
88

99
async function f() {
1010
const s = await fetch('https://typescriptlang.org');
11-
return Promise.resolve(s.statusText.length);
11+
return await Promise.resolve(s.statusText.length);
1212
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
// ==ORIGINAL==
2+
3+
function /*[#|*/f/*|]*/() {
4+
return Promise.resolve(1)
5+
.then(x => Promise.reject(x))
6+
.catch(err => console.log(err));
7+
}
8+
9+
// ==ASYNC FUNCTION::Convert to async function==
10+
11+
async function f() {
12+
try {
13+
const x = await Promise.resolve(1);
14+
return await Promise.reject(x);
15+
}
16+
catch (err) {
17+
return console.log(err);
18+
}
19+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
// ==ORIGINAL==
2+
3+
function /*[#|*/f/*|]*/() {
4+
return Promise.resolve(1)
5+
.then(x => Promise.reject(x))
6+
.catch(err => console.log(err));
7+
}
8+
9+
// ==ASYNC FUNCTION::Convert to async function==
10+
11+
async function f() {
12+
try {
13+
const x = await Promise.resolve(1);
14+
return await Promise.reject(x);
15+
}
16+
catch (err) {
17+
return console.log(err);
18+
}
19+
}

tests/baselines/reference/convertToAsyncFunction/convertToAsyncFunction_nestedPromises.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,5 +9,5 @@ function /*[#|*/f/*|]*/() {
99
async function f() {
1010
const x = await fetch('https://typescriptlang.org');
1111
const y = await Promise.resolve(3);
12-
return Promise.resolve(x.statusText.length + y);
12+
return await Promise.resolve(x.statusText.length + y);
1313
}

tests/baselines/reference/convertToAsyncFunction/convertToAsyncFunction_nestedPromises.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,5 +9,5 @@ function /*[#|*/f/*|]*/() {
99
async function f() {
1010
const x = await fetch('https://typescriptlang.org');
1111
const y = await Promise.resolve(3);
12-
return Promise.resolve(x.statusText.length + y);
12+
return await Promise.resolve(x.statusText.length + y);
1313
}

0 commit comments

Comments
 (0)