diff --git a/src/services/suggestionDiagnostics.ts b/src/services/suggestionDiagnostics.ts index a80bd58c6d7d8..09607d8ab8a00 100644 --- a/src/services/suggestionDiagnostics.ts +++ b/src/services/suggestionDiagnostics.ts @@ -156,7 +156,18 @@ namespace ts { } function isPromiseHandler(node: Node): node is CallExpression { - return isCallExpression(node) && (hasPropertyAccessExpressionWithName(node, "then") || hasPropertyAccessExpressionWithName(node, "catch")); + return isCallExpression(node) && ( + hasPropertyAccessExpressionWithName(node, "then") && hasSupportedNumberOfArguments(node) || + hasPropertyAccessExpressionWithName(node, "catch")); + } + + function hasSupportedNumberOfArguments(node: CallExpression) { + if (node.arguments.length > 2) return false; + if (node.arguments.length < 2) return true; + return some(node.arguments, arg => { + return arg.kind === SyntaxKind.NullKeyword || + isIdentifier(arg) && arg.text === "undefined"; + }); } // should be kept up to date with getTransformationBody in convertToAsyncFunction.ts diff --git a/src/testRunner/unittests/services/convertToAsyncFunction.ts b/src/testRunner/unittests/services/convertToAsyncFunction.ts index 2a36231607561..999e1580a98c3 100644 --- a/src/testRunner/unittests/services/convertToAsyncFunction.ts +++ b/src/testRunner/unittests/services/convertToAsyncFunction.ts @@ -558,13 +558,13 @@ function [#|f|]():void{ } ` ); - _testConvertToAsyncFunction("convertToAsyncFunction_Rej", ` + _testConvertToAsyncFunctionFailed("convertToAsyncFunction_Rej", ` function [#|f|]():Promise { return fetch('https://typescriptlang.org').then(result => { console.log(result); }, rejection => { console.log("rejected:", rejection); }); } ` ); - _testConvertToAsyncFunction("convertToAsyncFunction_RejRef", ` + _testConvertToAsyncFunctionFailed("convertToAsyncFunction_RejRef", ` function [#|f|]():Promise { return fetch('https://typescriptlang.org').then(res, rej); } @@ -576,7 +576,7 @@ function rej(err){ } ` ); - _testConvertToAsyncFunction("convertToAsyncFunction_RejNoBrackets", ` + _testConvertToAsyncFunctionFailed("convertToAsyncFunction_RejNoBrackets", ` function [#|f|]():Promise { return fetch('https://typescriptlang.org').then(result => console.log(result), rejection => console.log("rejected:", rejection)); } @@ -1238,7 +1238,7 @@ function [#|f|]() { } `); - _testConvertToAsyncFunction("convertToAsyncFunction_ResRejNoArgsArrow", ` + _testConvertToAsyncFunctionFailed("convertToAsyncFunction_ResRejNoArgsArrow", ` function [#|f|]() { return Promise.resolve().then(() => 1, () => "a"); } @@ -1436,5 +1436,10 @@ function [#|get|]() { .catch>(() => ({ success: false })); } `); + + _testConvertToAsyncFunctionFailed("convertToAsyncFunction_threeArguments", ` +function [#|f|]() { + return Promise.resolve().then(undefined, undefined, () => 1); +}`); }); } diff --git a/tests/baselines/reference/convertToAsyncFunction/convertToAsyncFunction_Rej.ts b/tests/baselines/reference/convertToAsyncFunction/convertToAsyncFunction_Rej.ts deleted file mode 100644 index bf3ee9c420cd6..0000000000000 --- a/tests/baselines/reference/convertToAsyncFunction/convertToAsyncFunction_Rej.ts +++ /dev/null @@ -1,17 +0,0 @@ -// ==ORIGINAL== - -function /*[#|*/f/*|]*/():Promise { - return fetch('https://typescriptlang.org').then(result => { console.log(result); }, rejection => { console.log("rejected:", rejection); }); -} - -// ==ASYNC FUNCTION::Convert to async function== - -async function f():Promise { - try { - const result = await fetch('https://typescriptlang.org'); - console.log(result); - } - catch (rejection) { - console.log("rejected:", rejection); - } -} diff --git a/tests/baselines/reference/convertToAsyncFunction/convertToAsyncFunction_RejNoBrackets.ts b/tests/baselines/reference/convertToAsyncFunction/convertToAsyncFunction_RejNoBrackets.ts deleted file mode 100644 index 8169745f5bde9..0000000000000 --- a/tests/baselines/reference/convertToAsyncFunction/convertToAsyncFunction_RejNoBrackets.ts +++ /dev/null @@ -1,17 +0,0 @@ -// ==ORIGINAL== - -function /*[#|*/f/*|]*/():Promise { - return fetch('https://typescriptlang.org').then(result => console.log(result), rejection => console.log("rejected:", rejection)); -} - -// ==ASYNC FUNCTION::Convert to async function== - -async function f():Promise { - try { - const result = await fetch('https://typescriptlang.org'); - return console.log(result); - } - catch (rejection) { - return console.log("rejected:", rejection); - } -} diff --git a/tests/baselines/reference/convertToAsyncFunction/convertToAsyncFunction_RejRef.ts b/tests/baselines/reference/convertToAsyncFunction/convertToAsyncFunction_RejRef.ts deleted file mode 100644 index 77fadff7ee993..0000000000000 --- a/tests/baselines/reference/convertToAsyncFunction/convertToAsyncFunction_RejRef.ts +++ /dev/null @@ -1,29 +0,0 @@ -// ==ORIGINAL== - -function /*[#|*/f/*|]*/():Promise { - return fetch('https://typescriptlang.org').then(res, rej); -} -function res(result){ - console.log(result); -} -function rej(err){ - console.log(err); -} - -// ==ASYNC FUNCTION::Convert to async function== - -async function f():Promise { - try { - const result = await fetch('https://typescriptlang.org'); - return res(result); - } - catch (err) { - return rej(err); - } -} -function res(result){ - console.log(result); -} -function rej(err){ - console.log(err); -} diff --git a/tests/baselines/reference/convertToAsyncFunction/convertToAsyncFunction_ResRejNoArgsArrow.js b/tests/baselines/reference/convertToAsyncFunction/convertToAsyncFunction_ResRejNoArgsArrow.js deleted file mode 100644 index 0b4a430f5058f..0000000000000 --- a/tests/baselines/reference/convertToAsyncFunction/convertToAsyncFunction_ResRejNoArgsArrow.js +++ /dev/null @@ -1,17 +0,0 @@ -// ==ORIGINAL== - - function /*[#|*/f/*|]*/() { - return Promise.resolve().then(() => 1, () => "a"); - } - -// ==ASYNC FUNCTION::Convert to async function== - - async function f() { - try { - await Promise.resolve(); - return 1; - } - catch (e) { - return "a"; - } - } diff --git a/tests/baselines/reference/convertToAsyncFunction/convertToAsyncFunction_ResRejNoArgsArrow.ts b/tests/baselines/reference/convertToAsyncFunction/convertToAsyncFunction_ResRejNoArgsArrow.ts deleted file mode 100644 index 0b4a430f5058f..0000000000000 --- a/tests/baselines/reference/convertToAsyncFunction/convertToAsyncFunction_ResRejNoArgsArrow.ts +++ /dev/null @@ -1,17 +0,0 @@ -// ==ORIGINAL== - - function /*[#|*/f/*|]*/() { - return Promise.resolve().then(() => 1, () => "a"); - } - -// ==ASYNC FUNCTION::Convert to async function== - - async function f() { - try { - await Promise.resolve(); - return 1; - } - catch (e) { - return "a"; - } - }