diff --git a/src/harness/fourslash.ts b/src/harness/fourslash.ts index c7f455bd75365..ad81ace4d5310 100644 --- a/src/harness/fourslash.ts +++ b/src/harness/fourslash.ts @@ -2108,7 +2108,7 @@ namespace FourSlash { * Because codefixes are only applied on the working file, it is unsafe * to apply this more than once (consider a refactoring across files). */ - public verifyRangeAfterCodeFix(expectedText: string, errorCode?: number) { + public verifyRangeAfterCodeFix(expectedText: string, errorCode?: number, includeWhiteSpace?: boolean) { const ranges = this.getRanges(); if (ranges.length !== 1) { this.raiseError("Exactly one range should be specified in the testfile."); @@ -2120,7 +2120,11 @@ namespace FourSlash { const actualText = this.rangeText(ranges[0]); - if (this.removeWhitespace(actualText) !== this.removeWhitespace(expectedText)) { + const result = includeWhiteSpace + ? actualText === expectedText + : this.removeWhitespace(actualText) === this.removeWhitespace(expectedText) + + if (!result) { this.raiseError(`Actual text doesn't match expected text. Actual:\n'${actualText}'\nExpected:\n'${expectedText}'`); } } @@ -3509,8 +3513,8 @@ namespace FourSlashInterface { this.DocCommentTemplate(/*expectedText*/ undefined, /*expectedOffset*/ undefined, /*empty*/ true); } - public rangeAfterCodeFix(expectedText: string, errorCode?: number): void { - this.state.verifyRangeAfterCodeFix(expectedText, errorCode); + public rangeAfterCodeFix(expectedText: string, errorCode?: number, includeWhiteSpace?: boolean): void { + this.state.verifyRangeAfterCodeFix(expectedText, errorCode, includeWhiteSpace); } public importFixAtPosition(expectedTextArray: string[], errorCode?: number): void { diff --git a/src/services/codefixes/unusedIdentifierFixes.ts b/src/services/codefixes/unusedIdentifierFixes.ts index 0ca01a81eb176..3e74f81d8aa03 100644 --- a/src/services/codefixes/unusedIdentifierFixes.ts +++ b/src/services/codefixes/unusedIdentifierFixes.ts @@ -150,7 +150,20 @@ namespace ts.codefix { } function createCodeFixToRemoveNode(node: Node) { - return createCodeFix("", node.getStart(), node.getWidth()); + let end = node.getEnd(); + const endCharCode = sourceFile.text.charCodeAt(end); + const afterEndCharCode = sourceFile.text.charCodeAt(end + 1); + if (isLineBreak(endCharCode)) { + end += 1; + } + // in the case of CR LF, you could have two consecutive new line characters for one new line. + // this needs to be differenciated from two LF LF chars that actually mean two new lines. + if (isLineBreak(afterEndCharCode) && endCharCode !== afterEndCharCode) { + end += 1; + } + + const start = node.getStart(); + return createCodeFix("", start, end - start); } function findFirstNonSpaceCharPosStarting(start: number) { diff --git a/tests/cases/fourslash/fourslash.ts b/tests/cases/fourslash/fourslash.ts index c613204f53951..661d7cba6a495 100644 --- a/tests/cases/fourslash/fourslash.ts +++ b/tests/cases/fourslash/fourslash.ts @@ -225,7 +225,7 @@ declare namespace FourSlashInterface { noMatchingBracePositionInCurrentFile(bracePosition: number): void; DocCommentTemplate(expectedText: string, expectedOffset: number, empty?: boolean): void; noDocCommentTemplate(): void; - rangeAfterCodeFix(expectedText: string, errorCode?: number): void; + rangeAfterCodeFix(expectedText: string, errorCode?: number, includeWhiteSpace?: boolean): void; importFixAtPosition(expectedTextArray: string[], errorCode?: number): void; navigationBar(json: any): void; diff --git a/tests/cases/fourslash/unusedImports2FS.ts b/tests/cases/fourslash/unusedImports2FS.ts index d2062fc49583c..5387569336247 100644 --- a/tests/cases/fourslash/unusedImports2FS.ts +++ b/tests/cases/fourslash/unusedImports2FS.ts @@ -2,8 +2,8 @@ // @noUnusedLocals: true // @Filename: file2.ts -//// [|import {Calculator} from "./file1" -//// import {test} from "./file1"|] +//// [|import {test} from "./file1" +//// import {Calculator} from "./file1"|] //// var x = new Calculator(); //// x.handleChar(); @@ -16,4 +16,4 @@ //// //// } -verify.rangeAfterCodeFix(`import {Calculator} from "./file1"`); +verify.rangeAfterCodeFix(`import {Calculator} from "./file1"`, /*errorCode*/ undefined, /*includeWhiteSpace*/ true); diff --git a/tests/cases/fourslash/unusedVariableInForLoop7FS.ts b/tests/cases/fourslash/unusedVariableInForLoop7FS.ts index fa862594ff98b..5aa3251c0b450 100644 --- a/tests/cases/fourslash/unusedVariableInForLoop7FS.ts +++ b/tests/cases/fourslash/unusedVariableInForLoop7FS.ts @@ -4,9 +4,9 @@ //// function f1 () { //// for (const elem of ["a", "b", "c"]) { //// elem; -//// [|var x = 20;|] -//// } +//// [|var x = 20; +//// }|] ////} //// -verify.rangeAfterCodeFix(""); +verify.rangeAfterCodeFix("}"); diff --git a/tests/cases/fourslash/unusedVariableInModule1.ts b/tests/cases/fourslash/unusedVariableInModule1.ts index 85ca41952cc5d..e9fe9515e6d8d 100644 --- a/tests/cases/fourslash/unusedVariableInModule1.ts +++ b/tests/cases/fourslash/unusedVariableInModule1.ts @@ -3,7 +3,7 @@ // @noUnusedLocals: true // @noUnusedParameters: true //// export {} -//// [|var x: string;|] -//// export var y: string; +//// [|var x: string; +//// export var y: string;|] -verify.rangeAfterCodeFix(""); +verify.rangeAfterCodeFix("export var y: string;"); diff --git a/tests/cases/fourslash/unusedVariableInModule3.ts b/tests/cases/fourslash/unusedVariableInModule3.ts index 428d234c164b4..0185b89e3a634 100644 --- a/tests/cases/fourslash/unusedVariableInModule3.ts +++ b/tests/cases/fourslash/unusedVariableInModule3.ts @@ -3,7 +3,7 @@ // @noUnusedLocals: true // @noUnusedParameters: true //// export {} -//// [|var x = function f1() {}|] -//// export var y: string; +//// [|var x = function f1() {} +//// export var y: string;|] -verify.rangeAfterCodeFix(""); +verify.rangeAfterCodeFix("export var y: string;");