From c64a8743e81462178513b501534cd8aeb3a2d42d Mon Sep 17 00:00:00 2001 From: kingwl Date: Sun, 20 Jan 2019 01:00:33 +0800 Subject: [PATCH] rescan in formatter if followed unary literal --- src/compiler/scanner.ts | 12 ++++++++++++ src/services/formatting/formattingScanner.ts | 11 ++++++++++- tests/baselines/reference/api/tsserverlibrary.d.ts | 1 + tests/baselines/reference/api/typescript.d.ts | 1 + .../cases/fourslash/codeFixInferFromFunctionUsage.ts | 12 ++++++++++++ 5 files changed, 36 insertions(+), 1 deletion(-) create mode 100644 tests/cases/fourslash/codeFixInferFromFunctionUsage.ts diff --git a/src/compiler/scanner.ts b/src/compiler/scanner.ts index d59be9758656c..3e1bba7844006 100644 --- a/src/compiler/scanner.ts +++ b/src/compiler/scanner.ts @@ -31,6 +31,7 @@ namespace ts { scanJsxIdentifier(): SyntaxKind; scanJsxAttributeValue(): SyntaxKind; reScanJsxToken(): JsxTokenSyntaxKind; + reScanNumericLiteral(): SyntaxKind; scanJsxToken(): JsxTokenSyntaxKind; scanJSDocToken(): JsDocSyntaxKind; scan(): SyntaxKind; @@ -874,6 +875,7 @@ namespace ts { scanJsxIdentifier, scanJsxAttributeValue, reScanJsxToken, + reScanNumericLiteral, scanJsxToken, scanJSDocToken, scan, @@ -1939,6 +1941,16 @@ namespace ts { return token = scanJsxToken(); } + function reScanNumericLiteral(): SyntaxKind { + if ((token === SyntaxKind.MinusToken || token === SyntaxKind.PlusToken) && lookAhead(() => scan() === SyntaxKind.NumericLiteral && scan() !== SyntaxKind.ColonToken)) { + const lastTokenPos = tokenPos; + scan(); + startPos = lastTokenPos; + return SyntaxKind.NumericLiteral; + } + return token; + } + function scanJsxToken(): JsxTokenSyntaxKind { startPos = tokenPos = pos; diff --git a/src/services/formatting/formattingScanner.ts b/src/services/formatting/formattingScanner.ts index 2787f90af03a5..f267a38e0ce14 100644 --- a/src/services/formatting/formattingScanner.ts +++ b/src/services/formatting/formattingScanner.ts @@ -19,6 +19,7 @@ namespace ts.formatting { RescanTemplateToken, RescanJsxIdentifier, RescanJsxText, + RescanNumericLiteral } export function getFormattingScanner(text: string, languageVariant: LanguageVariant, startPos: number, endPos: number, cb: (scanner: FormattingScanner) => T): T { @@ -116,6 +117,10 @@ namespace ts.formatting { return false; } + function shouldRescanNumericLiteral(node: Node): boolean { + return node.kind === SyntaxKind.NumericLiteral; + } + function shouldRescanJsxText(node: Node): boolean { return node.kind === SyntaxKind.JsxText; } @@ -149,7 +154,9 @@ namespace ts.formatting { ? ScanAction.RescanJsxIdentifier : shouldRescanJsxText(n) ? ScanAction.RescanJsxText - : ScanAction.Scan; + : shouldRescanNumericLiteral(n) + ? ScanAction.RescanNumericLiteral + : ScanAction.Scan; if (lastTokenInfo && expectedScanAction === lastScanAction) { // readTokenInfo was called before with the same expected scan action. @@ -241,6 +248,8 @@ namespace ts.formatting { case ScanAction.RescanJsxText: lastScanAction = ScanAction.RescanJsxText; return scanner.reScanJsxToken(); + case ScanAction.RescanNumericLiteral: + return scanner.reScanNumericLiteral(); case ScanAction.Scan: break; default: diff --git a/tests/baselines/reference/api/tsserverlibrary.d.ts b/tests/baselines/reference/api/tsserverlibrary.d.ts index f71dbc9aa504e..174c81767a5ff 100644 --- a/tests/baselines/reference/api/tsserverlibrary.d.ts +++ b/tests/baselines/reference/api/tsserverlibrary.d.ts @@ -3097,6 +3097,7 @@ declare namespace ts { scanJsxIdentifier(): SyntaxKind; scanJsxAttributeValue(): SyntaxKind; reScanJsxToken(): JsxTokenSyntaxKind; + reScanNumericLiteral(): SyntaxKind; scanJsxToken(): JsxTokenSyntaxKind; scanJSDocToken(): JsDocSyntaxKind; scan(): SyntaxKind; diff --git a/tests/baselines/reference/api/typescript.d.ts b/tests/baselines/reference/api/typescript.d.ts index 03f24988ed355..0ef289407c112 100644 --- a/tests/baselines/reference/api/typescript.d.ts +++ b/tests/baselines/reference/api/typescript.d.ts @@ -3097,6 +3097,7 @@ declare namespace ts { scanJsxIdentifier(): SyntaxKind; scanJsxAttributeValue(): SyntaxKind; reScanJsxToken(): JsxTokenSyntaxKind; + reScanNumericLiteral(): SyntaxKind; scanJsxToken(): JsxTokenSyntaxKind; scanJSDocToken(): JsDocSyntaxKind; scan(): SyntaxKind; diff --git a/tests/cases/fourslash/codeFixInferFromFunctionUsage.ts b/tests/cases/fourslash/codeFixInferFromFunctionUsage.ts new file mode 100644 index 0000000000000..dd6c2026961dd --- /dev/null +++ b/tests/cases/fourslash/codeFixInferFromFunctionUsage.ts @@ -0,0 +1,12 @@ +/// + +// @noImplicitAny: true +////function wrap( [| arr |] ) { +//// arr.sort(function (a: number, b: number) { return a < b ? -1 : 1 }) +//// } + +verify.rangeAfterCodeFix( + "arr: { sort: (arg0: (a: number, b: number) => 1 | -1) => void; }", + /*includeWhiteSpace*/ undefined, + /*errorCode*/ undefined, 0 +); \ No newline at end of file