From a4b5870a521bfac6902c14ca9b256ee90f0d932d Mon Sep 17 00:00:00 2001 From: Andy Date: Fri, 22 Sep 2017 09:39:46 -0700 Subject: [PATCH] Cleanups in formattingScanner.ts (#18599) * Cleanups in formattingScanner.ts * Move switch statement to function * Fix assertions --- src/services/formatting/formattingScanner.ts | 121 +++++++++---------- 1 file changed, 55 insertions(+), 66 deletions(-) diff --git a/src/services/formatting/formattingScanner.ts b/src/services/formatting/formattingScanner.ts index d69fb141ba1..f126327fa06 100644 --- a/src/services/formatting/formattingScanner.ts +++ b/src/services/formatting/formattingScanner.ts @@ -53,28 +53,19 @@ namespace ts.formatting { return res; function advance(): void { - Debug.assert(scanner !== undefined, "Scanner should be present"); - lastTokenInfo = undefined; const isStarted = scanner.getStartPos() !== startPos; if (isStarted) { - if (trailingTrivia) { - Debug.assert(trailingTrivia.length !== 0); - wasNewLine = lastOrUndefined(trailingTrivia).kind === SyntaxKind.NewLineTrivia; - } - else { - wasNewLine = false; - } + wasNewLine = trailingTrivia && lastOrUndefined(trailingTrivia)!.kind === SyntaxKind.NewLineTrivia; + } + else { + scanner.scan(); } leadingTrivia = undefined; trailingTrivia = undefined; - if (!isStarted) { - scanner.scan(); - } - let pos = scanner.getStartPos(); // Read leading trivia and token @@ -94,25 +85,20 @@ namespace ts.formatting { pos = scanner.getStartPos(); - if (!leadingTrivia) { - leadingTrivia = []; - } - leadingTrivia.push(item); + leadingTrivia = append(leadingTrivia, item); } savedPos = scanner.getStartPos(); } function shouldRescanGreaterThanToken(node: Node): boolean { - if (node) { - switch (node.kind) { - case SyntaxKind.GreaterThanEqualsToken: - case SyntaxKind.GreaterThanGreaterThanEqualsToken: - case SyntaxKind.GreaterThanGreaterThanGreaterThanEqualsToken: - case SyntaxKind.GreaterThanGreaterThanGreaterThanToken: - case SyntaxKind.GreaterThanGreaterThanToken: - return true; - } + switch (node.kind) { + case SyntaxKind.GreaterThanEqualsToken: + case SyntaxKind.GreaterThanGreaterThanEqualsToken: + case SyntaxKind.GreaterThanGreaterThanGreaterThanEqualsToken: + case SyntaxKind.GreaterThanGreaterThanGreaterThanToken: + case SyntaxKind.GreaterThanGreaterThanToken: + return true; } return false; @@ -134,7 +120,7 @@ namespace ts.formatting { } function shouldRescanJsxText(node: Node): boolean { - return node && node.kind === SyntaxKind.JsxText; + return node.kind === SyntaxKind.JsxText; } function shouldRescanSlashToken(container: Node): boolean { @@ -151,16 +137,7 @@ namespace ts.formatting { } function readTokenInfo(n: Node): TokenInfo { - Debug.assert(scanner !== undefined); - - if (!isOnToken()) { - // scanner is not on the token (either advance was not called yet or scanner is already past the end position) - return { - leadingTrivia, - trailingTrivia: undefined, - token: undefined - }; - } + Debug.assert(isOnToken()); // normally scanner returns the smallest available token // check the kind of context node to determine if scanner should have more greedy behavior and consume more text. @@ -194,33 +171,7 @@ namespace ts.formatting { scanner.scan(); } - let currentToken = scanner.getToken(); - - if (expectedScanAction === ScanAction.RescanGreaterThanToken && currentToken === SyntaxKind.GreaterThanToken) { - currentToken = scanner.reScanGreaterToken(); - Debug.assert(n.kind === currentToken); - lastScanAction = ScanAction.RescanGreaterThanToken; - } - else if (expectedScanAction === ScanAction.RescanSlashToken && startsWithSlashToken(currentToken)) { - currentToken = scanner.reScanSlashToken(); - Debug.assert(n.kind === currentToken); - lastScanAction = ScanAction.RescanSlashToken; - } - else if (expectedScanAction === ScanAction.RescanTemplateToken && currentToken === SyntaxKind.CloseBraceToken) { - currentToken = scanner.reScanTemplateToken(); - lastScanAction = ScanAction.RescanTemplateToken; - } - else if (expectedScanAction === ScanAction.RescanJsxIdentifier) { - currentToken = scanner.scanJsxIdentifier(); - lastScanAction = ScanAction.RescanJsxIdentifier; - } - else if (expectedScanAction === ScanAction.RescanJsxText) { - currentToken = scanner.reScanJsxToken(); - lastScanAction = ScanAction.RescanJsxText; - } - else { - lastScanAction = ScanAction.Scan; - } + let currentToken = getNextToken(n, expectedScanAction); const token: TextRangeWithKind = { pos: scanner.getStartPos(), @@ -261,9 +212,47 @@ namespace ts.formatting { return fixTokenKind(lastTokenInfo, n); } - function isOnToken(): boolean { - Debug.assert(scanner !== undefined); + function getNextToken(n: Node, expectedScanAction: ScanAction): SyntaxKind { + const token = scanner.getToken(); + lastScanAction = ScanAction.Scan; + switch (expectedScanAction) { + case ScanAction.RescanGreaterThanToken: + if (token === SyntaxKind.GreaterThanToken) { + lastScanAction = ScanAction.RescanGreaterThanToken; + const newToken = scanner.reScanGreaterToken(); + Debug.assert(n.kind === newToken); + return newToken; + } + break; + case ScanAction.RescanSlashToken: + if (startsWithSlashToken(token)) { + lastScanAction = ScanAction.RescanSlashToken; + const newToken = scanner.reScanSlashToken(); + Debug.assert(n.kind === newToken); + return newToken; + } + break; + case ScanAction.RescanTemplateToken: + if (token === SyntaxKind.CloseBraceToken) { + lastScanAction = ScanAction.RescanTemplateToken; + return scanner.reScanTemplateToken(); + } + break; + case ScanAction.RescanJsxIdentifier: + lastScanAction = ScanAction.RescanJsxIdentifier; + return scanner.scanJsxIdentifier(); + case ScanAction.RescanJsxText: + lastScanAction = ScanAction.RescanJsxText; + return scanner.reScanJsxToken(); + case ScanAction.Scan: + break; + default: + Debug.assertNever(expectedScanAction); + } + return token; + } + function isOnToken(): boolean { const current = lastTokenInfo ? lastTokenInfo.token.kind : scanner.getToken(); const startPos = lastTokenInfo ? lastTokenInfo.token.pos : scanner.getStartPos(); return startPos < endPos && current !== SyntaxKind.EndOfFileToken && !isTrivia(current);