From 0f41b7a390fab5590157dbe8ac4c7a23f5b845ae Mon Sep 17 00:00:00 2001 From: Oleksandr T Date: Thu, 2 Feb 2023 23:03:52 +0200 Subject: [PATCH] fix(52418): "Convert to named function" breaks on concise return of async function (#52434) --- .../convertArrowFunctionOrFunctionExpression.ts | 2 ++ ...ionOrFunctionExpression_InnerAsyncFunction1.ts | 15 +++++++++++++++ ...ionOrFunctionExpression_InnerAsyncFunction2.ts | 15 +++++++++++++++ ...ionOrFunctionExpression_InnerAsyncFunction3.ts | 15 +++++++++++++++ 4 files changed, 47 insertions(+) create mode 100644 tests/cases/fourslash/refactorConvertArrowFunctionOrFunctionExpression_InnerAsyncFunction1.ts create mode 100644 tests/cases/fourslash/refactorConvertArrowFunctionOrFunctionExpression_InnerAsyncFunction2.ts create mode 100644 tests/cases/fourslash/refactorConvertArrowFunctionOrFunctionExpression_InnerAsyncFunction3.ts diff --git a/src/services/refactors/convertArrowFunctionOrFunctionExpression.ts b/src/services/refactors/convertArrowFunctionOrFunctionExpression.ts index f631f1387e2..fdef2e48f2e 100644 --- a/src/services/refactors/convertArrowFunctionOrFunctionExpression.ts +++ b/src/services/refactors/convertArrowFunctionOrFunctionExpression.ts @@ -41,6 +41,7 @@ import { RefactorContext, RefactorEditInfo, ReturnStatement, + setTextRange, SourceFile, Statement, suppressLeadingAndTrailingTrivia, @@ -237,6 +238,7 @@ function convertToBlock(body: ConciseBody): Block { if (isExpression(body)) { const returnStatement = factory.createReturnStatement(body); const file = body.getSourceFile(); + setTextRange(returnStatement, body); suppressLeadingAndTrailingTrivia(returnStatement); copyTrailingAsLeadingComments(body, returnStatement, file, /* commentKind */ undefined, /* hasTrailingNewLine */ true); return factory.createBlock([returnStatement], /* multiLine */ true); diff --git a/tests/cases/fourslash/refactorConvertArrowFunctionOrFunctionExpression_InnerAsyncFunction1.ts b/tests/cases/fourslash/refactorConvertArrowFunctionOrFunctionExpression_InnerAsyncFunction1.ts new file mode 100644 index 00000000000..c377ad8c41f --- /dev/null +++ b/tests/cases/fourslash/refactorConvertArrowFunctionOrFunctionExpression_InnerAsyncFunction1.ts @@ -0,0 +1,15 @@ +/// + +/////*a*/const fn = () => +//// async () => { };/*b*/ + +goTo.select("a", "b"); +edit.applyRefactor({ + refactorName: "Convert arrow function or function expression", + actionName: "Convert to named function", + actionDescription: "Convert to named function", + newContent: +`function fn() { + return async () => { }; +}`, +}); diff --git a/tests/cases/fourslash/refactorConvertArrowFunctionOrFunctionExpression_InnerAsyncFunction2.ts b/tests/cases/fourslash/refactorConvertArrowFunctionOrFunctionExpression_InnerAsyncFunction2.ts new file mode 100644 index 00000000000..1bbe283e4d5 --- /dev/null +++ b/tests/cases/fourslash/refactorConvertArrowFunctionOrFunctionExpression_InnerAsyncFunction2.ts @@ -0,0 +1,15 @@ +/// + +/////*a*/const fn = () => +//// async function() { }/*b*/ + +goTo.select("a", "b"); +edit.applyRefactor({ + refactorName: "Convert arrow function or function expression", + actionName: "Convert to named function", + actionDescription: "Convert to named function", + newContent: +`function fn() { + return async function() { }; +}`, +}); diff --git a/tests/cases/fourslash/refactorConvertArrowFunctionOrFunctionExpression_InnerAsyncFunction3.ts b/tests/cases/fourslash/refactorConvertArrowFunctionOrFunctionExpression_InnerAsyncFunction3.ts new file mode 100644 index 00000000000..23ff02bbc29 --- /dev/null +++ b/tests/cases/fourslash/refactorConvertArrowFunctionOrFunctionExpression_InnerAsyncFunction3.ts @@ -0,0 +1,15 @@ +/// + +/////*a*/const fn = () => +//// async function*() { }/*b*/ + +goTo.select("a", "b"); +edit.applyRefactor({ + refactorName: "Convert arrow function or function expression", + actionName: "Convert to named function", + actionDescription: "Convert to named function", + newContent: +`function fn() { + return async function*() { }; +}`, +});