From 91631435ca9f5b7e05c087d20c17d9cbae36a04e Mon Sep 17 00:00:00 2001 From: Andrew Branch Date: Mon, 28 Mar 2022 10:51:18 -0700 Subject: [PATCH 1/3] Fix newline inserted in empty block at end of formatting range --- src/services/formatting/formatting.ts | 13 +++++++------ src/services/utilities.ts | 10 ++++++---- .../server/formatOnOpenCurlyBraceIndentation.ts | 13 +++++++++++++ 3 files changed, 26 insertions(+), 10 deletions(-) create mode 100644 tests/cases/fourslash/server/formatOnOpenCurlyBraceIndentation.ts diff --git a/src/services/formatting/formatting.ts b/src/services/formatting/formatting.ts index 3b68b44063e62..8060145ef026f 100644 --- a/src/services/formatting/formatting.ts +++ b/src/services/formatting/formatting.ts @@ -439,20 +439,21 @@ namespace ts.formatting { } if (previousRange! && formattingScanner.getStartPos() >= originalRange.end) { - const token = + const tokenInfo = formattingScanner.isOnEOF() ? formattingScanner.readEOFTokenRange() : formattingScanner.isOnToken() ? formattingScanner.readTokenInfo(enclosingNode).token : undefined; - if (token) { + if (tokenInfo) { + const parent = findPrecedingToken(tokenInfo.end, sourceFile, enclosingNode) || previousParent!; processPair( - token, - sourceFile.getLineAndCharacterOfPosition(token.pos).line, - enclosingNode, + tokenInfo, + sourceFile.getLineAndCharacterOfPosition(tokenInfo.pos).line, + parent, previousRange, previousRangeStartLine!, previousParent!, - enclosingNode, + parent, /*dynamicIndentation*/ undefined); } } diff --git a/src/services/utilities.ts b/src/services/utilities.ts index 88836f59c3428..e2101de2a7ba3 100644 --- a/src/services/utilities.ts +++ b/src/services/utilities.ts @@ -1256,8 +1256,10 @@ namespace ts { * Finds the rightmost token satisfying `token.end <= position`, * excluding `JsxText` tokens containing only whitespace. */ - export function findPrecedingToken(position: number, sourceFile: SourceFile, startNode?: Node, excludeJsdoc?: boolean): Node | undefined { - const result = find(startNode || sourceFile); + export function findPrecedingToken(position: number, sourceFile: SourceFileLike, startNode: Node, excludeJsdoc?: boolean): Node | undefined; + export function findPrecedingToken(position: number, sourceFile: SourceFile, startNode?: Node, excludeJsdoc?: boolean): Node | undefined; + export function findPrecedingToken(position: number, sourceFile: SourceFileLike, startNode?: Node, excludeJsdoc?: boolean): Node | undefined { + const result = find(startNode! || sourceFile); Debug.assert(!(result && isWhiteSpaceOnlyJsxText(result))); return result; @@ -1322,7 +1324,7 @@ namespace ts { return isToken(n) && !isWhiteSpaceOnlyJsxText(n); } - function findRightmostToken(n: Node, sourceFile: SourceFile): Node | undefined { + function findRightmostToken(n: Node, sourceFile: SourceFileLike): Node | undefined { if (isNonWhitespaceToken(n)) { return n; } @@ -1339,7 +1341,7 @@ namespace ts { /** * Finds the rightmost child to the left of `children[exclusiveStartPosition]` which is a non-all-whitespace token or has constituent tokens. */ - function findRightmostChildNodeWithTokens(children: Node[], exclusiveStartPosition: number, sourceFile: SourceFile, parentKind: SyntaxKind): Node | undefined { + function findRightmostChildNodeWithTokens(children: Node[], exclusiveStartPosition: number, sourceFile: SourceFileLike, parentKind: SyntaxKind): Node | undefined { for (let i = exclusiveStartPosition - 1; i >= 0; i--) { const child = children[i]; diff --git a/tests/cases/fourslash/server/formatOnOpenCurlyBraceIndentation.ts b/tests/cases/fourslash/server/formatOnOpenCurlyBraceIndentation.ts new file mode 100644 index 0000000000000..6141f2886de37 --- /dev/null +++ b/tests/cases/fourslash/server/formatOnOpenCurlyBraceIndentation.ts @@ -0,0 +1,13 @@ +/// + +//// if (foo) { +//// if (bar) {/**/} +//// } + +goTo.marker(""); +format.onType("", "{"); +// format.document(); +verify.currentFileContentIs( +`if (foo) { + if (bar) { } +}`); From 79b600aaa3b47519e924bb22f036894f1307500a Mon Sep 17 00:00:00 2001 From: Andrew Branch Date: Mon, 28 Mar 2022 10:53:33 -0700 Subject: [PATCH 2/3] Clean up --- src/services/utilities.ts | 2 +- ...dentation.ts => formatOnTypeOpenCurlyWithBraceCompletion.ts} | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) rename tests/cases/fourslash/server/{formatOnOpenCurlyBraceIndentation.ts => formatOnTypeOpenCurlyWithBraceCompletion.ts} (89%) diff --git a/src/services/utilities.ts b/src/services/utilities.ts index e2101de2a7ba3..e20f049ab8366 100644 --- a/src/services/utilities.ts +++ b/src/services/utilities.ts @@ -1259,7 +1259,7 @@ namespace ts { export function findPrecedingToken(position: number, sourceFile: SourceFileLike, startNode: Node, excludeJsdoc?: boolean): Node | undefined; export function findPrecedingToken(position: number, sourceFile: SourceFile, startNode?: Node, excludeJsdoc?: boolean): Node | undefined; export function findPrecedingToken(position: number, sourceFile: SourceFileLike, startNode?: Node, excludeJsdoc?: boolean): Node | undefined { - const result = find(startNode! || sourceFile); + const result = find((startNode || sourceFile) as Node); Debug.assert(!(result && isWhiteSpaceOnlyJsxText(result))); return result; diff --git a/tests/cases/fourslash/server/formatOnOpenCurlyBraceIndentation.ts b/tests/cases/fourslash/server/formatOnTypeOpenCurlyWithBraceCompletion.ts similarity index 89% rename from tests/cases/fourslash/server/formatOnOpenCurlyBraceIndentation.ts rename to tests/cases/fourslash/server/formatOnTypeOpenCurlyWithBraceCompletion.ts index 6141f2886de37..dceda9e98fcb0 100644 --- a/tests/cases/fourslash/server/formatOnOpenCurlyBraceIndentation.ts +++ b/tests/cases/fourslash/server/formatOnTypeOpenCurlyWithBraceCompletion.ts @@ -6,7 +6,6 @@ goTo.marker(""); format.onType("", "{"); -// format.document(); verify.currentFileContentIs( `if (foo) { if (bar) { } From 19ef6b67c5df52690514c2a9a3ee253d69c77934 Mon Sep 17 00:00:00 2001 From: Andrew Branch Date: Mon, 28 Mar 2022 11:10:47 -0700 Subject: [PATCH 3/3] Fix refactoring mistake --- src/services/formatting/formatting.ts | 2 +- .../{server => }/formatOnTypeOpenCurlyWithBraceCompletion.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) rename tests/cases/fourslash/{server => }/formatOnTypeOpenCurlyWithBraceCompletion.ts (79%) diff --git a/src/services/formatting/formatting.ts b/src/services/formatting/formatting.ts index 8060145ef026f..5a9948cd35f72 100644 --- a/src/services/formatting/formatting.ts +++ b/src/services/formatting/formatting.ts @@ -445,7 +445,7 @@ namespace ts.formatting { undefined; if (tokenInfo) { - const parent = findPrecedingToken(tokenInfo.end, sourceFile, enclosingNode) || previousParent!; + const parent = findPrecedingToken(tokenInfo.end, sourceFile, enclosingNode)?.parent || previousParent!; processPair( tokenInfo, sourceFile.getLineAndCharacterOfPosition(tokenInfo.pos).line, diff --git a/tests/cases/fourslash/server/formatOnTypeOpenCurlyWithBraceCompletion.ts b/tests/cases/fourslash/formatOnTypeOpenCurlyWithBraceCompletion.ts similarity index 79% rename from tests/cases/fourslash/server/formatOnTypeOpenCurlyWithBraceCompletion.ts rename to tests/cases/fourslash/formatOnTypeOpenCurlyWithBraceCompletion.ts index dceda9e98fcb0..b303b1ea62d6d 100644 --- a/tests/cases/fourslash/server/formatOnTypeOpenCurlyWithBraceCompletion.ts +++ b/tests/cases/fourslash/formatOnTypeOpenCurlyWithBraceCompletion.ts @@ -1,4 +1,4 @@ -/// +/// //// if (foo) { //// if (bar) {/**/}