Skip to content

Commit

Permalink
Cherry-pick PR #48463 into release-4.6 (#48477)
Browse files Browse the repository at this point in the history
Component commits:
9163143 Fix newline inserted in empty block at end of formatting range

79b600a Clean up

19ef6b6 Fix refactoring mistake

Co-authored-by: Andrew Branch <andrew@wheream.io>
  • Loading branch information
typescript-bot and andrewbranch committed Mar 29, 2022
1 parent 2bed482 commit fbc2b67
Show file tree
Hide file tree
Showing 3 changed files with 25 additions and 10 deletions.
13 changes: 7 additions & 6 deletions src/services/formatting/formatting.ts
Expand Up @@ -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)?.parent || previousParent!;
processPair(
token,
sourceFile.getLineAndCharacterOfPosition(token.pos).line,
enclosingNode,
tokenInfo,
sourceFile.getLineAndCharacterOfPosition(tokenInfo.pos).line,
parent,
previousRange,
previousRangeStartLine!,
previousParent!,
enclosingNode,
parent,
/*dynamicIndentation*/ undefined);
}
}
Expand Down
10 changes: 6 additions & 4 deletions src/services/utilities.ts
Expand Up @@ -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) as Node);
Debug.assert(!(result && isWhiteSpaceOnlyJsxText(result)));
return result;

Expand Down Expand Up @@ -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;
}
Expand All @@ -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];

Expand Down
12 changes: 12 additions & 0 deletions tests/cases/fourslash/formatOnTypeOpenCurlyWithBraceCompletion.ts
@@ -0,0 +1,12 @@
/// <reference path="fourslash.ts"/>

//// if (foo) {
//// if (bar) {/**/}
//// }

goTo.marker("");
format.onType("", "{");
verify.currentFileContentIs(
`if (foo) {
if (bar) { }
}`);

0 comments on commit fbc2b67

Please sign in to comment.