From cae4bc5e83b38e724a13a3f8d86920b7c167a757 Mon Sep 17 00:00:00 2001 From: Andy Date: Thu, 25 Jan 2018 17:48:22 -0800 Subject: [PATCH] Move createTextChange to services/utilities.ts (#21416) * Move createTextChange to services/utilities.ts * Use separate functions instead of overloads --- src/services/codefixes/disableJsDiagnostics.ts | 18 +++++------------- src/services/codefixes/fixJSDocTypes.ts | 2 +- src/services/codefixes/inferFromUsage.ts | 2 +- src/services/formatting/formatting.ts | 8 ++------ src/services/textChanges.ts | 5 +---- src/services/utilities.ts | 8 ++++++++ 6 files changed, 18 insertions(+), 25 deletions(-) diff --git a/src/services/codefixes/disableJsDiagnostics.ts b/src/services/codefixes/disableJsDiagnostics.ts index 3bcbf886df8..091ee07a9cc 100644 --- a/src/services/codefixes/disableJsDiagnostics.ts +++ b/src/services/codefixes/disableJsDiagnostics.ts @@ -24,13 +24,9 @@ namespace ts.codefix { }, { description: getLocaleSpecificMessage(Diagnostics.Disable_checking_for_this_file), - changes: [createFileTextChanges(sourceFile.fileName, [{ - span: { - start: sourceFile.checkJsDirective ? sourceFile.checkJsDirective.pos : 0, - length: sourceFile.checkJsDirective ? sourceFile.checkJsDirective.end - sourceFile.checkJsDirective.pos : 0 - }, - newText: `// @ts-nocheck${newLineCharacter}` - }])], + changes: [createFileTextChanges(sourceFile.fileName, [ + createTextChange(sourceFile.checkJsDirective ? createTextSpanFromBounds(sourceFile.checkJsDirective.pos, sourceFile.checkJsDirective.end) : createTextSpan(0, 0), `// @ts-nocheck${newLineCharacter}`), + ])], // fixId unnecessary because adding `// @ts-nocheck` even once will ignore every error in the file. fixId: undefined, }]; @@ -62,15 +58,11 @@ namespace ts.codefix { const token = getTouchingToken(sourceFile, startPosition, /*includeJsDocComment*/ false); const tokenLeadingComments = getLeadingCommentRangesOfNode(token, sourceFile); if (!tokenLeadingComments || !tokenLeadingComments.length || tokenLeadingComments[0].pos >= startPosition) { - return { lineNumber, change: createTextChange(startPosition, 0, `// @ts-ignore${newLineCharacter}`) }; + return { lineNumber, change: createTextChangeFromStartLength(startPosition, 0, `// @ts-ignore${newLineCharacter}`) }; } } // If all fails, add an extra new line immediately before the error span. - return { lineNumber, change: createTextChange(position, 0, `${position === startPosition ? "" : newLineCharacter}// @ts-ignore${newLineCharacter}`) }; - } - - function createTextChange(start: number, length: number, newText: string): TextChange { - return { span: { start, length }, newText }; + return { lineNumber, change: createTextChangeFromStartLength(position, 0, `${position === startPosition ? "" : newLineCharacter}// @ts-ignore${newLineCharacter}`) }; } } diff --git a/src/services/codefixes/fixJSDocTypes.ts b/src/services/codefixes/fixJSDocTypes.ts index 8c43ed0cc7f..3158e90ce96 100644 --- a/src/services/codefixes/fixJSDocTypes.ts +++ b/src/services/codefixes/fixJSDocTypes.ts @@ -50,7 +50,7 @@ namespace ts.codefix { } function createChange(declaration: TypeNode, sourceFile: SourceFile, newText: string): TextChange { - return { span: createTextSpanFromBounds(declaration.getStart(sourceFile), declaration.getEnd()), newText }; + return createTextChange(createTextSpanFromNode(declaration, sourceFile), newText); } function typeString(type: Type, checker: TypeChecker): string { diff --git a/src/services/codefixes/inferFromUsage.ts b/src/services/codefixes/inferFromUsage.ts index 6f6b2f3c61e..2f3dae01acf 100644 --- a/src/services/codefixes/inferFromUsage.ts +++ b/src/services/codefixes/inferFromUsage.ts @@ -191,7 +191,7 @@ namespace ts.codefix { function makeChange(declaration: Declaration, start: number, type: Type | undefined, program: Program): TextChange | undefined { const typeString = type && typeToString(type, declaration, program.getTypeChecker()); - return typeString === undefined ? undefined : { span: createTextSpan(start, 0), newText: `: ${typeString}` }; + return typeString === undefined ? undefined : createTextChangeFromStartLength(start, 0, `: ${typeString}`); } function getReferences(token: PropertyName | Token, sourceFile: SourceFile, program: Program, cancellationToken: CancellationToken): Identifier[] { diff --git a/src/services/formatting/formatting.ts b/src/services/formatting/formatting.ts index 818e2815944..22446a98ce2 100644 --- a/src/services/formatting/formatting.ts +++ b/src/services/formatting/formatting.ts @@ -1078,19 +1078,15 @@ namespace ts.formatting { trimTrailingWhitespacesForLines(startLine, endLine + 1, previousRange); } - function newTextChange(start: number, len: number, newText: string): TextChange { - return { span: createTextSpan(start, len), newText }; - } - function recordDelete(start: number, len: number) { if (len) { - edits.push(newTextChange(start, len, "")); + edits.push(createTextChangeFromStartLength(start, len, "")); } } function recordReplace(start: number, len: number, newText: string) { if (len || newText) { - edits.push(newTextChange(start, len, newText)); + edits.push(createTextChangeFromStartLength(start, len, newText)); } } diff --git a/src/services/textChanges.ts b/src/services/textChanges.ts index 3674cd31b97..83b434aac7d 100644 --- a/src/services/textChanges.ts +++ b/src/services/textChanges.ts @@ -620,10 +620,7 @@ namespace ts.textChanges { const sourceFile = changesInFile[0].sourceFile; const fileTextChanges: FileTextChanges = { fileName: sourceFile.fileName, textChanges: [] }; for (const c of ChangeTracker.normalize(changesInFile)) { - fileTextChanges.textChanges.push({ - span: this.computeSpan(c, sourceFile), - newText: this.computeNewText(c, sourceFile) - }); + fileTextChanges.textChanges.push(createTextChange(this.computeSpan(c, sourceFile), this.computeNewText(c, sourceFile))); } fileChangesList.push(fileTextChanges); }); diff --git a/src/services/utilities.ts b/src/services/utilities.ts index c724fa5643d..e30fd8cfe2d 100644 --- a/src/services/utilities.ts +++ b/src/services/utilities.ts @@ -1067,6 +1067,14 @@ namespace ts { return createTextSpanFromBounds(range.pos, range.end); } + export function createTextChangeFromStartLength(start: number, length: number, newText: string): TextChange { + return createTextChange(createTextSpan(start, length), newText); + } + + export function createTextChange(span: TextSpan, newText: string): TextChange { + return { span, newText }; + } + export const typeKeywords: ReadonlyArray = [ SyntaxKind.AnyKeyword, SyntaxKind.BooleanKeyword,