diff --git a/src/services/codefixes/convertToAsyncFunction.ts b/src/services/codefixes/convertToAsyncFunction.ts index f7234e57b2abd..676a5fb179556 100644 --- a/src/services/codefixes/convertToAsyncFunction.ts +++ b/src/services/codefixes/convertToAsyncFunction.ts @@ -465,11 +465,11 @@ namespace ts.codefix { return innerCbBody; } + const type = transformer.checker.getTypeAtLocation(func); + const returnType = getLastCallSignature(type, transformer.checker)!.getReturnType(); + const rightHandSide = getSynthesizedDeepClone(funcBody); + const possiblyAwaitedRightHandSide = !!transformer.checker.getPromisedTypeOfPromise(returnType) ? createAwait(rightHandSide) : rightHandSide; if (!shouldReturn) { - const type = transformer.checker.getTypeAtLocation(func); - const returnType = getLastCallSignature(type, transformer.checker)!.getReturnType(); - const rightHandSide = getSynthesizedDeepClone(funcBody); - const possiblyAwaitedRightHandSide = !!transformer.checker.getPromisedTypeOfPromise(returnType) ? createAwait(rightHandSide) : rightHandSide; const transformedStatement = createTransformedStatement(prevArgName, possiblyAwaitedRightHandSide, transformer); if (prevArgName) { prevArgName.types.push(returnType); @@ -477,7 +477,7 @@ namespace ts.codefix { return transformedStatement; } else { - return [createReturn(getSynthesizedDeepClone(funcBody))]; + return [createReturn(possiblyAwaitedRightHandSide)]; } } } diff --git a/src/testRunner/unittests/convertToAsyncFunction.ts b/src/testRunner/unittests/convertToAsyncFunction.ts index 34316036858ae..21c6a29f8e43c 100644 --- a/src/testRunner/unittests/convertToAsyncFunction.ts +++ b/src/testRunner/unittests/convertToAsyncFunction.ts @@ -1236,6 +1236,13 @@ function [#|f|]() { } `); + _testConvertToAsyncFunction("convertToAsyncFunction_callbackReturnsRejectedPromiseInTryBlock", ` +function [#|f|]() { + return Promise.resolve(1) + .then(x => Promise.reject(x)) + .catch(err => console.log(err)); +} +`); _testConvertToAsyncFunction("convertToAsyncFunction_nestedPromises", ` function [#|f|]() { diff --git a/tests/baselines/reference/convertToAsyncFunction/convertToAsyncFunction_callbackReturnsPromiseLastInChain.js b/tests/baselines/reference/convertToAsyncFunction/convertToAsyncFunction_callbackReturnsPromiseLastInChain.js index 09f98a62649e2..7dba356a1d5d2 100644 --- a/tests/baselines/reference/convertToAsyncFunction/convertToAsyncFunction_callbackReturnsPromiseLastInChain.js +++ b/tests/baselines/reference/convertToAsyncFunction/convertToAsyncFunction_callbackReturnsPromiseLastInChain.js @@ -8,5 +8,5 @@ function /*[#|*/f/*|]*/() { async function f() { const s = await fetch('https://typescriptlang.org'); - return Promise.resolve(s.statusText.length); + return await Promise.resolve(s.statusText.length); } diff --git a/tests/baselines/reference/convertToAsyncFunction/convertToAsyncFunction_callbackReturnsPromiseLastInChain.ts b/tests/baselines/reference/convertToAsyncFunction/convertToAsyncFunction_callbackReturnsPromiseLastInChain.ts index 09f98a62649e2..7dba356a1d5d2 100644 --- a/tests/baselines/reference/convertToAsyncFunction/convertToAsyncFunction_callbackReturnsPromiseLastInChain.ts +++ b/tests/baselines/reference/convertToAsyncFunction/convertToAsyncFunction_callbackReturnsPromiseLastInChain.ts @@ -8,5 +8,5 @@ function /*[#|*/f/*|]*/() { async function f() { const s = await fetch('https://typescriptlang.org'); - return Promise.resolve(s.statusText.length); + return await Promise.resolve(s.statusText.length); } diff --git a/tests/baselines/reference/convertToAsyncFunction/convertToAsyncFunction_callbackReturnsRejectedPromiseInTryBlock.js b/tests/baselines/reference/convertToAsyncFunction/convertToAsyncFunction_callbackReturnsRejectedPromiseInTryBlock.js new file mode 100644 index 0000000000000..2cfd6ba951e1e --- /dev/null +++ b/tests/baselines/reference/convertToAsyncFunction/convertToAsyncFunction_callbackReturnsRejectedPromiseInTryBlock.js @@ -0,0 +1,19 @@ +// ==ORIGINAL== + +function /*[#|*/f/*|]*/() { + return Promise.resolve(1) + .then(x => Promise.reject(x)) + .catch(err => console.log(err)); +} + +// ==ASYNC FUNCTION::Convert to async function== + +async function f() { + try { + const x = await Promise.resolve(1); + return await Promise.reject(x); + } + catch (err) { + return console.log(err); + } +} diff --git a/tests/baselines/reference/convertToAsyncFunction/convertToAsyncFunction_callbackReturnsRejectedPromiseInTryBlock.ts b/tests/baselines/reference/convertToAsyncFunction/convertToAsyncFunction_callbackReturnsRejectedPromiseInTryBlock.ts new file mode 100644 index 0000000000000..2cfd6ba951e1e --- /dev/null +++ b/tests/baselines/reference/convertToAsyncFunction/convertToAsyncFunction_callbackReturnsRejectedPromiseInTryBlock.ts @@ -0,0 +1,19 @@ +// ==ORIGINAL== + +function /*[#|*/f/*|]*/() { + return Promise.resolve(1) + .then(x => Promise.reject(x)) + .catch(err => console.log(err)); +} + +// ==ASYNC FUNCTION::Convert to async function== + +async function f() { + try { + const x = await Promise.resolve(1); + return await Promise.reject(x); + } + catch (err) { + return console.log(err); + } +} diff --git a/tests/baselines/reference/convertToAsyncFunction/convertToAsyncFunction_nestedPromises.js b/tests/baselines/reference/convertToAsyncFunction/convertToAsyncFunction_nestedPromises.js index 3ce5c421c3d2c..337733bea7fae 100644 --- a/tests/baselines/reference/convertToAsyncFunction/convertToAsyncFunction_nestedPromises.js +++ b/tests/baselines/reference/convertToAsyncFunction/convertToAsyncFunction_nestedPromises.js @@ -9,5 +9,5 @@ function /*[#|*/f/*|]*/() { async function f() { const x = await fetch('https://typescriptlang.org'); const y = await Promise.resolve(3); - return Promise.resolve(x.statusText.length + y); + return await Promise.resolve(x.statusText.length + y); } diff --git a/tests/baselines/reference/convertToAsyncFunction/convertToAsyncFunction_nestedPromises.ts b/tests/baselines/reference/convertToAsyncFunction/convertToAsyncFunction_nestedPromises.ts index 3ce5c421c3d2c..337733bea7fae 100644 --- a/tests/baselines/reference/convertToAsyncFunction/convertToAsyncFunction_nestedPromises.ts +++ b/tests/baselines/reference/convertToAsyncFunction/convertToAsyncFunction_nestedPromises.ts @@ -9,5 +9,5 @@ function /*[#|*/f/*|]*/() { async function f() { const x = await fetch('https://typescriptlang.org'); const y = await Promise.resolve(3); - return Promise.resolve(x.statusText.length + y); + return await Promise.resolve(x.statusText.length + y); }