From a839523729352976c5a7ddac843dbfbb4967335c Mon Sep 17 00:00:00 2001 From: Oleksandr T Date: Wed, 26 Oct 2022 21:48:46 +0300 Subject: [PATCH 1/4] fix(51301): keep the line break after removing the unused identifier --- src/services/textChanges.ts | 16 +++++++++- ...odeFixUnusedIdentifier_importSpecifier1.ts | 23 ++++++++++++++ ...odeFixUnusedIdentifier_importSpecifier2.ts | 31 +++++++++++++++++++ ...odeFixUnusedIdentifier_importSpecifier3.ts | 23 ++++++++++++++ 4 files changed, 92 insertions(+), 1 deletion(-) create mode 100644 tests/cases/fourslash/codeFixUnusedIdentifier_importSpecifier1.ts create mode 100644 tests/cases/fourslash/codeFixUnusedIdentifier_importSpecifier2.ts create mode 100644 tests/cases/fourslash/codeFixUnusedIdentifier_importSpecifier3.ts diff --git a/src/services/textChanges.ts b/src/services/textChanges.ts index 59f22c8a9fbe0..d139aab303cc5 100644 --- a/src/services/textChanges.ts +++ b/src/services/textChanges.ts @@ -993,6 +993,19 @@ namespace ts.textChanges { return skipTrivia(sourceFile.text, getAdjustedStartPosition(sourceFile, node, { leadingTriviaOption: LeadingTriviaOption.IncludeAll }), /*stopAfterLineBreak*/ false, /*stopAtComments*/ true); } + function endPositionToDeleteNodeInList(sourceFile: SourceFile, node: Node, nextNode: Node): number { + const end = startPositionToDeleteNodeInList(sourceFile, nextNode); + if (positionsAreOnSameLine(getAdjustedEndPosition(sourceFile, node, {}), end, sourceFile)) { + return end; + } + const token = findPrecedingToken(nextNode.getStart(sourceFile), sourceFile); + if (token) { + const pos = skipTrivia(sourceFile.text, token.getEnd(), /*stopAfterLineBreak*/ true, /*stopAtComments*/ true); + return isLineBreak(sourceFile.text.charCodeAt(pos - 1)) ? pos - 1 : pos; + } + return end; + } + function getClassOrObjectBraceEnds(cls: ClassLikeDeclaration | InterfaceDeclaration | ObjectLiteralExpression, sourceFile: SourceFile): [number | undefined, number | undefined] { const open = findChildOfKind(cls, SyntaxKind.OpenBraceToken, sourceFile); const close = findChildOfKind(cls, SyntaxKind.CloseBraceToken, sourceFile); @@ -1589,9 +1602,10 @@ namespace ts.textChanges { // That's handled in the end by `finishTrailingCommaAfterDeletingNodesInList`. Debug.assert(!deletedNodesInLists.has(node), "Deleting a node twice"); deletedNodesInLists.add(node); + changes.deleteRange(sourceFile, { pos: startPositionToDeleteNodeInList(sourceFile, node), - end: index === containingList.length - 1 ? getAdjustedEndPosition(sourceFile, node, {}) : startPositionToDeleteNodeInList(sourceFile, containingList[index + 1]), + end: index === containingList.length - 1 ? getAdjustedEndPosition(sourceFile, node, {}) : endPositionToDeleteNodeInList(sourceFile, node, containingList[index + 1]), }); } } diff --git a/tests/cases/fourslash/codeFixUnusedIdentifier_importSpecifier1.ts b/tests/cases/fourslash/codeFixUnusedIdentifier_importSpecifier1.ts new file mode 100644 index 0000000000000..af365fdd993cb --- /dev/null +++ b/tests/cases/fourslash/codeFixUnusedIdentifier_importSpecifier1.ts @@ -0,0 +1,23 @@ +/// + +// @noUnusedLocals: true +////[|import { +//// a, b, c, d, +//// e, f, +////} from "fs";|] +//// +////a; +////b; +////c; +////e; +////f; + +verify.codeFix({ + index: 0, + description: "Remove unused declaration for: 'd'", + newRangeContent: +`import { + a, b, c, + e, f, +} from "fs";` +}); diff --git a/tests/cases/fourslash/codeFixUnusedIdentifier_importSpecifier2.ts b/tests/cases/fourslash/codeFixUnusedIdentifier_importSpecifier2.ts new file mode 100644 index 0000000000000..bcb9c40dd7a92 --- /dev/null +++ b/tests/cases/fourslash/codeFixUnusedIdentifier_importSpecifier2.ts @@ -0,0 +1,31 @@ +/// + +// @noUnusedLocals: true +////[|import { +//// a, b, c, d, +//// +//// +//// +//// +//// e, f, +////} from "fs";|] +//// +////a; +////b; +////c; +////e; +////f; + +verify.codeFix({ + index: 0, + description: "Remove unused declaration for: 'd'", + newRangeContent: +`import { + a, b, c, + + + + + e, f, +} from "fs";` +}); diff --git a/tests/cases/fourslash/codeFixUnusedIdentifier_importSpecifier3.ts b/tests/cases/fourslash/codeFixUnusedIdentifier_importSpecifier3.ts new file mode 100644 index 0000000000000..0fb9a2fe99643 --- /dev/null +++ b/tests/cases/fourslash/codeFixUnusedIdentifier_importSpecifier3.ts @@ -0,0 +1,23 @@ +/// + +// @noUnusedLocals: true +////[|import { +//// a, b, c, d, /** comment related to e */ +//// e, f, +////} from "fs";|] +//// +////a; +////b; +////c; +////e; +////f; + +verify.codeFix({ + index: 0, + description: "Remove unused declaration for: 'd'", + newRangeContent: +`import { + a, b, c, /** comment related to e */ + e, f, +} from "fs";` +}); From f8b2acd414d463ad442b870ee3b9b00c8dc303cc Mon Sep 17 00:00:00 2001 From: Oleksandr T Date: Wed, 26 Oct 2022 22:41:35 +0300 Subject: [PATCH 2/4] preserve line breaks in import specifiers --- src/services/textChanges.ts | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/services/textChanges.ts b/src/services/textChanges.ts index d139aab303cc5..95dce4bd7789c 100644 --- a/src/services/textChanges.ts +++ b/src/services/textChanges.ts @@ -993,9 +993,9 @@ namespace ts.textChanges { return skipTrivia(sourceFile.text, getAdjustedStartPosition(sourceFile, node, { leadingTriviaOption: LeadingTriviaOption.IncludeAll }), /*stopAfterLineBreak*/ false, /*stopAtComments*/ true); } - function endPositionToDeleteNodeInList(sourceFile: SourceFile, node: Node, nextNode: Node): number { + function endPositionToDeleteNodeInList(sourceFile: SourceFile, node: Node, nextNode: Node, preserveLineBreak: boolean): number { const end = startPositionToDeleteNodeInList(sourceFile, nextNode); - if (positionsAreOnSameLine(getAdjustedEndPosition(sourceFile, node, {}), end, sourceFile)) { + if (!preserveLineBreak || positionsAreOnSameLine(getAdjustedEndPosition(sourceFile, node, {}), end, sourceFile)) { return end; } const token = findPrecedingToken(nextNode.getStart(sourceFile), sourceFile); @@ -1471,7 +1471,7 @@ namespace ts.textChanges { deleteImportBinding(changes, sourceFile, namedImports); } else { - deleteNodeInList(changes, deletedNodesInLists, sourceFile, node); + deleteNodeInList(changes, deletedNodesInLists, sourceFile, node, /*preserveLineBreak*/ true); } break; @@ -1589,7 +1589,7 @@ namespace ts.textChanges { changes.deleteRange(sourceFile, { pos: startPosition, end: endPosition }); } - function deleteNodeInList(changes: ChangeTracker, deletedNodesInLists: Set, sourceFile: SourceFile, node: Node): void { + function deleteNodeInList(changes: ChangeTracker, deletedNodesInLists: Set, sourceFile: SourceFile, node: Node, preserveLineBreak = false): void { const containingList = Debug.checkDefined(formatting.SmartIndenter.getContainingList(node, sourceFile)); const index = indexOfNode(containingList, node); Debug.assert(index !== -1); @@ -1605,7 +1605,7 @@ namespace ts.textChanges { changes.deleteRange(sourceFile, { pos: startPositionToDeleteNodeInList(sourceFile, node), - end: index === containingList.length - 1 ? getAdjustedEndPosition(sourceFile, node, {}) : endPositionToDeleteNodeInList(sourceFile, node, containingList[index + 1]), + end: index === containingList.length - 1 ? getAdjustedEndPosition(sourceFile, node, {}) : endPositionToDeleteNodeInList(sourceFile, node, containingList[index + 1], preserveLineBreak), }); } } From b16fd1d990cd80541162c15ee17da2299d6a7509 Mon Sep 17 00:00:00 2001 From: Oleksandr T Date: Thu, 27 Oct 2022 16:37:29 +0300 Subject: [PATCH 3/4] preserve line breaks in parameters and destructuring elements --- src/services/textChanges.ts | 22 ++++++++++----- ...usedIdentifier_destructuring_elements1.ts} | 0 ...nusedIdentifier_destructuring_elements2.ts | 22 +++++++++++++++ ...nusedIdentifier_destructuring_elements3.ts | 26 ++++++++++++++++++ ...nusedIdentifier_destructuring_elements4.ts | 22 +++++++++++++++ ...nusedIdentifier_destructuring_elements5.ts | 23 ++++++++++++++++ ...nusedIdentifier_destructuring_elements6.ts | 25 +++++++++++++++++ ...odeFixUnusedIdentifier_importSpecifier4.ts | 21 +++++++++++++++ ...odeFixUnusedIdentifier_importSpecifier5.ts | 25 +++++++++++++++++ ... => codeFixUnusedIdentifier_parameter1.ts} | 0 .../codeFixUnusedIdentifier_parameter2.ts | 22 +++++++++++++++ .../codeFixUnusedIdentifier_parameter3.ts | 26 ++++++++++++++++++ .../codeFixUnusedIdentifier_parameter4.ts | 22 +++++++++++++++ .../codeFixUnusedIdentifier_parameter5.ts | 23 ++++++++++++++++ .../codeFixUnusedIdentifier_parameter6.ts | 27 +++++++++++++++++++ 15 files changed, 299 insertions(+), 7 deletions(-) rename tests/cases/fourslash/{codeFixUnusedIdentifier_destructuring_elements.ts => codeFixUnusedIdentifier_destructuring_elements1.ts} (100%) create mode 100644 tests/cases/fourslash/codeFixUnusedIdentifier_destructuring_elements2.ts create mode 100644 tests/cases/fourslash/codeFixUnusedIdentifier_destructuring_elements3.ts create mode 100644 tests/cases/fourslash/codeFixUnusedIdentifier_destructuring_elements4.ts create mode 100644 tests/cases/fourslash/codeFixUnusedIdentifier_destructuring_elements5.ts create mode 100644 tests/cases/fourslash/codeFixUnusedIdentifier_destructuring_elements6.ts create mode 100644 tests/cases/fourslash/codeFixUnusedIdentifier_importSpecifier4.ts create mode 100644 tests/cases/fourslash/codeFixUnusedIdentifier_importSpecifier5.ts rename tests/cases/fourslash/{codeFixUnusedIdentifier_parameter.ts => codeFixUnusedIdentifier_parameter1.ts} (100%) create mode 100644 tests/cases/fourslash/codeFixUnusedIdentifier_parameter2.ts create mode 100644 tests/cases/fourslash/codeFixUnusedIdentifier_parameter3.ts create mode 100644 tests/cases/fourslash/codeFixUnusedIdentifier_parameter4.ts create mode 100644 tests/cases/fourslash/codeFixUnusedIdentifier_parameter5.ts create mode 100644 tests/cases/fourslash/codeFixUnusedIdentifier_parameter6.ts diff --git a/src/services/textChanges.ts b/src/services/textChanges.ts index 95dce4bd7789c..ba2209bb15254 100644 --- a/src/services/textChanges.ts +++ b/src/services/textChanges.ts @@ -993,15 +993,23 @@ namespace ts.textChanges { return skipTrivia(sourceFile.text, getAdjustedStartPosition(sourceFile, node, { leadingTriviaOption: LeadingTriviaOption.IncludeAll }), /*stopAfterLineBreak*/ false, /*stopAtComments*/ true); } - function endPositionToDeleteNodeInList(sourceFile: SourceFile, node: Node, nextNode: Node, preserveLineBreak: boolean): number { + function endPositionToDeleteNodeInList(sourceFile: SourceFile, node: Node, prevNode: Node | undefined, nextNode: Node, preserveLineBreak: boolean): number { const end = startPositionToDeleteNodeInList(sourceFile, nextNode); if (!preserveLineBreak || positionsAreOnSameLine(getAdjustedEndPosition(sourceFile, node, {}), end, sourceFile)) { return end; } const token = findPrecedingToken(nextNode.getStart(sourceFile), sourceFile); - if (token) { - const pos = skipTrivia(sourceFile.text, token.getEnd(), /*stopAfterLineBreak*/ true, /*stopAtComments*/ true); - return isLineBreak(sourceFile.text.charCodeAt(pos - 1)) ? pos - 1 : pos; + if (prevNode && isSeparator(node, token)) { + const prevToken = findPrecedingToken(node.getStart(sourceFile), sourceFile); + if (isSeparator(prevNode, prevToken)) { + const pos = skipTrivia(sourceFile.text, token.getEnd(), /*stopAfterLineBreak*/ true, /*stopAtComments*/ true); + if (positionsAreOnSameLine(prevToken.getStart(sourceFile), token.getStart(sourceFile), sourceFile)) { + return isLineBreak(sourceFile.text.charCodeAt(pos - 1)) ? pos - 1 : pos; + } + if (isLineBreak(sourceFile.text.charCodeAt(pos))) { + return pos; + } + } } return end; } @@ -1432,7 +1440,7 @@ namespace ts.textChanges { changes.replaceNodeWithText(sourceFile, node, "()"); } else { - deleteNodeInList(changes, deletedNodesInLists, sourceFile, node); + deleteNodeInList(changes, deletedNodesInLists, sourceFile, node, /*preserveLineBreak*/ true); } break; } @@ -1453,7 +1461,7 @@ namespace ts.textChanges { deleteNode(changes, sourceFile, node); } else { - deleteNodeInList(changes, deletedNodesInLists, sourceFile, node); + deleteNodeInList(changes, deletedNodesInLists, sourceFile, node, /*preserveLineBreak*/ true); } break; @@ -1605,7 +1613,7 @@ namespace ts.textChanges { changes.deleteRange(sourceFile, { pos: startPositionToDeleteNodeInList(sourceFile, node), - end: index === containingList.length - 1 ? getAdjustedEndPosition(sourceFile, node, {}) : endPositionToDeleteNodeInList(sourceFile, node, containingList[index + 1], preserveLineBreak), + end: index === containingList.length - 1 ? getAdjustedEndPosition(sourceFile, node, {}) : endPositionToDeleteNodeInList(sourceFile, node, containingList[index - 1], containingList[index + 1], preserveLineBreak), }); } } diff --git a/tests/cases/fourslash/codeFixUnusedIdentifier_destructuring_elements.ts b/tests/cases/fourslash/codeFixUnusedIdentifier_destructuring_elements1.ts similarity index 100% rename from tests/cases/fourslash/codeFixUnusedIdentifier_destructuring_elements.ts rename to tests/cases/fourslash/codeFixUnusedIdentifier_destructuring_elements1.ts diff --git a/tests/cases/fourslash/codeFixUnusedIdentifier_destructuring_elements2.ts b/tests/cases/fourslash/codeFixUnusedIdentifier_destructuring_elements2.ts new file mode 100644 index 0000000000000..e04ea447ffbcb --- /dev/null +++ b/tests/cases/fourslash/codeFixUnusedIdentifier_destructuring_elements2.ts @@ -0,0 +1,22 @@ +/// + +// @noUnusedLocals: true +// @noUnusedParameters: true + +////[|function f({ +//// a, b, +//// c, +////}: any)|] { +//// a; +//// c; +////} + +verify.codeFix({ + index: 0, + description: "Remove unused declaration for: 'b'", + newRangeContent: +`function f({ + a, + c, +}: any)` +}); diff --git a/tests/cases/fourslash/codeFixUnusedIdentifier_destructuring_elements3.ts b/tests/cases/fourslash/codeFixUnusedIdentifier_destructuring_elements3.ts new file mode 100644 index 0000000000000..99260954eb81d --- /dev/null +++ b/tests/cases/fourslash/codeFixUnusedIdentifier_destructuring_elements3.ts @@ -0,0 +1,26 @@ +/// + +// @noUnusedLocals: true +// @noUnusedParameters: true + +////[|function f({ +//// a, b, +//// +//// +//// c, +////}: any)|] { +//// a; +//// c; +////} + +verify.codeFix({ + index: 0, + description: "Remove unused declaration for: 'b'", + newRangeContent: +`function f({ + a, + + + c, +}: any)` +}); diff --git a/tests/cases/fourslash/codeFixUnusedIdentifier_destructuring_elements4.ts b/tests/cases/fourslash/codeFixUnusedIdentifier_destructuring_elements4.ts new file mode 100644 index 0000000000000..5f6ea4ee6fb46 --- /dev/null +++ b/tests/cases/fourslash/codeFixUnusedIdentifier_destructuring_elements4.ts @@ -0,0 +1,22 @@ +/// + +// @noUnusedLocals: true +// @noUnusedParameters: true + +////[|function f({ +//// a, b, /* comment related to c */ +//// c, +////}: any)|] { +//// a; +//// c; +////} + +verify.codeFix({ + index: 0, + description: "Remove unused declaration for: 'b'", + newRangeContent: +`function f({ + a, /* comment related to c */ + c, +}: any)` +}); diff --git a/tests/cases/fourslash/codeFixUnusedIdentifier_destructuring_elements5.ts b/tests/cases/fourslash/codeFixUnusedIdentifier_destructuring_elements5.ts new file mode 100644 index 0000000000000..cf7adbb5eba81 --- /dev/null +++ b/tests/cases/fourslash/codeFixUnusedIdentifier_destructuring_elements5.ts @@ -0,0 +1,23 @@ +/// + +// @noUnusedLocals: true +// @noUnusedParameters: true + +////[|function f({ +//// a, +//// b, +//// c, +////}: any)|] { +//// b; +//// c; +////} + +verify.codeFix({ + index: 0, + description: "Remove unused declaration for: 'a'", + newRangeContent: +`function f({ + b, + c, +}: any)` +}); diff --git a/tests/cases/fourslash/codeFixUnusedIdentifier_destructuring_elements6.ts b/tests/cases/fourslash/codeFixUnusedIdentifier_destructuring_elements6.ts new file mode 100644 index 0000000000000..a3c7023f953dc --- /dev/null +++ b/tests/cases/fourslash/codeFixUnusedIdentifier_destructuring_elements6.ts @@ -0,0 +1,25 @@ +/// + +// @noUnusedLocals: true +// @noUnusedParameters: true + +////[|function f({ +//// a, +//// b, +//// +//// c, +////}: any)|] { +//// a; +//// c; +////} + +verify.codeFix({ + index: 0, + description: "Remove unused declaration for: 'b'", + newRangeContent: +`function f({ + a, + + c, +}: any)` +}); diff --git a/tests/cases/fourslash/codeFixUnusedIdentifier_importSpecifier4.ts b/tests/cases/fourslash/codeFixUnusedIdentifier_importSpecifier4.ts new file mode 100644 index 0000000000000..925a016d90d2e --- /dev/null +++ b/tests/cases/fourslash/codeFixUnusedIdentifier_importSpecifier4.ts @@ -0,0 +1,21 @@ +/// + +// @noUnusedLocals: true +////[|import { +//// a, +//// b, +//// c, +////} from "fs";|] +//// +////a; +////c; + +verify.codeFix({ + index: 0, + description: "Remove unused declaration for: 'b'", + newRangeContent: +`import { + a, + c, +} from "fs";` +}); diff --git a/tests/cases/fourslash/codeFixUnusedIdentifier_importSpecifier5.ts b/tests/cases/fourslash/codeFixUnusedIdentifier_importSpecifier5.ts new file mode 100644 index 0000000000000..75c9c73eb3ee8 --- /dev/null +++ b/tests/cases/fourslash/codeFixUnusedIdentifier_importSpecifier5.ts @@ -0,0 +1,25 @@ +/// + +// @noUnusedLocals: true +////[|import { +//// a, +//// b, +//// +//// +//// c, +////} from "fs";|] +//// +////a; +////c; + +verify.codeFix({ + index: 0, + description: "Remove unused declaration for: 'b'", + newRangeContent: +`import { + a, + + + c, +} from "fs";` +}); diff --git a/tests/cases/fourslash/codeFixUnusedIdentifier_parameter.ts b/tests/cases/fourslash/codeFixUnusedIdentifier_parameter1.ts similarity index 100% rename from tests/cases/fourslash/codeFixUnusedIdentifier_parameter.ts rename to tests/cases/fourslash/codeFixUnusedIdentifier_parameter1.ts diff --git a/tests/cases/fourslash/codeFixUnusedIdentifier_parameter2.ts b/tests/cases/fourslash/codeFixUnusedIdentifier_parameter2.ts new file mode 100644 index 0000000000000..84af6f69bb62e --- /dev/null +++ b/tests/cases/fourslash/codeFixUnusedIdentifier_parameter2.ts @@ -0,0 +1,22 @@ +/// + +// @noUnusedLocals: true +// @noUnusedParameters: true + +////[|function f( +//// a: number, b: number, +//// c: number, +////)|] { +//// a; +//// c; +////} + +verify.codeFix({ + index: 0, + description: "Remove unused declaration for: 'b'", + newRangeContent: +`function f( + a: number, + c: number, +)` +}); diff --git a/tests/cases/fourslash/codeFixUnusedIdentifier_parameter3.ts b/tests/cases/fourslash/codeFixUnusedIdentifier_parameter3.ts new file mode 100644 index 0000000000000..a4078ccc6a54a --- /dev/null +++ b/tests/cases/fourslash/codeFixUnusedIdentifier_parameter3.ts @@ -0,0 +1,26 @@ +/// + +// @noUnusedLocals: true +// @noUnusedParameters: true + +////[|function f( +//// a: number, b: number, +//// +//// // comment +//// c: number, +////)|] { +//// a; +//// c; +////} + +verify.codeFix({ + index: 0, + description: "Remove unused declaration for: 'b'", + newRangeContent: +`function f( + a: number, + + // comment + c: number, +)` +}); diff --git a/tests/cases/fourslash/codeFixUnusedIdentifier_parameter4.ts b/tests/cases/fourslash/codeFixUnusedIdentifier_parameter4.ts new file mode 100644 index 0000000000000..12514358f2ab1 --- /dev/null +++ b/tests/cases/fourslash/codeFixUnusedIdentifier_parameter4.ts @@ -0,0 +1,22 @@ +/// + +// @noUnusedLocals: true +// @noUnusedParameters: true + +////[|function f( +//// a: number, b: number, /* comment related to c */ +//// c: number, +////)|] { +//// a; +//// c; +////} + +verify.codeFix({ + index: 0, + description: "Remove unused declaration for: 'b'", + newRangeContent: +`function f( + a: number, /* comment related to c */ + c: number, +)` +}); diff --git a/tests/cases/fourslash/codeFixUnusedIdentifier_parameter5.ts b/tests/cases/fourslash/codeFixUnusedIdentifier_parameter5.ts new file mode 100644 index 0000000000000..25b513dcc0dee --- /dev/null +++ b/tests/cases/fourslash/codeFixUnusedIdentifier_parameter5.ts @@ -0,0 +1,23 @@ +/// + +// @noUnusedLocals: true +// @noUnusedParameters: true + +////[|function f( +//// a: number, +//// b: number, +//// c: number, +////)|] { +//// b; +//// c; +////} + +verify.codeFix({ + index: 0, + description: "Remove unused declaration for: 'a'", + newRangeContent: +`function f( + b: number, + c: number, +)` +}); diff --git a/tests/cases/fourslash/codeFixUnusedIdentifier_parameter6.ts b/tests/cases/fourslash/codeFixUnusedIdentifier_parameter6.ts new file mode 100644 index 0000000000000..c676935936bad --- /dev/null +++ b/tests/cases/fourslash/codeFixUnusedIdentifier_parameter6.ts @@ -0,0 +1,27 @@ +/// + +// @noUnusedLocals: true +// @noUnusedParameters: true + +////[|function f( +//// a: number, +//// b: number, +//// +//// +//// c: number, +////)|] { +//// a; +//// c; +////} + +verify.codeFix({ + index: 0, + description: "Remove unused declaration for: 'b'", + newRangeContent: +`function f( + a: number, + + + c: number, +)` +}); From aa5a888b23a8fc35bf6ec2a246f564d244aea6bb Mon Sep 17 00:00:00 2001 From: Oleksandr T Date: Thu, 27 Oct 2022 22:04:45 +0300 Subject: [PATCH 4/4] remove preserveLineBreak option --- src/services/textChanges.ts | 16 ++++++------- .../codeFixUnusedIdentifier_typeParameter1.ts | 19 +++++++++++++++ .../codeFixUnusedIdentifier_typeParameter2.ts | 23 ++++++++++++++++++ .../codeFixUnusedIdentifier_typeParameter3.ts | 19 +++++++++++++++ .../codeFixUnusedIdentifier_typeParameter4.ts | 20 ++++++++++++++++ .../codeFixUnusedIdentifier_typeParameter5.ts | 24 +++++++++++++++++++ 6 files changed, 113 insertions(+), 8 deletions(-) create mode 100644 tests/cases/fourslash/codeFixUnusedIdentifier_typeParameter1.ts create mode 100644 tests/cases/fourslash/codeFixUnusedIdentifier_typeParameter2.ts create mode 100644 tests/cases/fourslash/codeFixUnusedIdentifier_typeParameter3.ts create mode 100644 tests/cases/fourslash/codeFixUnusedIdentifier_typeParameter4.ts create mode 100644 tests/cases/fourslash/codeFixUnusedIdentifier_typeParameter5.ts diff --git a/src/services/textChanges.ts b/src/services/textChanges.ts index ba2209bb15254..23f15afe8f8ef 100644 --- a/src/services/textChanges.ts +++ b/src/services/textChanges.ts @@ -993,13 +993,13 @@ namespace ts.textChanges { return skipTrivia(sourceFile.text, getAdjustedStartPosition(sourceFile, node, { leadingTriviaOption: LeadingTriviaOption.IncludeAll }), /*stopAfterLineBreak*/ false, /*stopAtComments*/ true); } - function endPositionToDeleteNodeInList(sourceFile: SourceFile, node: Node, prevNode: Node | undefined, nextNode: Node, preserveLineBreak: boolean): number { + function endPositionToDeleteNodeInList(sourceFile: SourceFile, node: Node, prevNode: Node | undefined, nextNode: Node): number { const end = startPositionToDeleteNodeInList(sourceFile, nextNode); - if (!preserveLineBreak || positionsAreOnSameLine(getAdjustedEndPosition(sourceFile, node, {}), end, sourceFile)) { + if (prevNode === undefined || positionsAreOnSameLine(getAdjustedEndPosition(sourceFile, node, {}), end, sourceFile)) { return end; } const token = findPrecedingToken(nextNode.getStart(sourceFile), sourceFile); - if (prevNode && isSeparator(node, token)) { + if (isSeparator(node, token)) { const prevToken = findPrecedingToken(node.getStart(sourceFile), sourceFile); if (isSeparator(prevNode, prevToken)) { const pos = skipTrivia(sourceFile.text, token.getEnd(), /*stopAfterLineBreak*/ true, /*stopAtComments*/ true); @@ -1440,7 +1440,7 @@ namespace ts.textChanges { changes.replaceNodeWithText(sourceFile, node, "()"); } else { - deleteNodeInList(changes, deletedNodesInLists, sourceFile, node, /*preserveLineBreak*/ true); + deleteNodeInList(changes, deletedNodesInLists, sourceFile, node); } break; } @@ -1461,7 +1461,7 @@ namespace ts.textChanges { deleteNode(changes, sourceFile, node); } else { - deleteNodeInList(changes, deletedNodesInLists, sourceFile, node, /*preserveLineBreak*/ true); + deleteNodeInList(changes, deletedNodesInLists, sourceFile, node); } break; @@ -1479,7 +1479,7 @@ namespace ts.textChanges { deleteImportBinding(changes, sourceFile, namedImports); } else { - deleteNodeInList(changes, deletedNodesInLists, sourceFile, node, /*preserveLineBreak*/ true); + deleteNodeInList(changes, deletedNodesInLists, sourceFile, node); } break; @@ -1597,7 +1597,7 @@ namespace ts.textChanges { changes.deleteRange(sourceFile, { pos: startPosition, end: endPosition }); } - function deleteNodeInList(changes: ChangeTracker, deletedNodesInLists: Set, sourceFile: SourceFile, node: Node, preserveLineBreak = false): void { + function deleteNodeInList(changes: ChangeTracker, deletedNodesInLists: Set, sourceFile: SourceFile, node: Node): void { const containingList = Debug.checkDefined(formatting.SmartIndenter.getContainingList(node, sourceFile)); const index = indexOfNode(containingList, node); Debug.assert(index !== -1); @@ -1613,7 +1613,7 @@ namespace ts.textChanges { changes.deleteRange(sourceFile, { pos: startPositionToDeleteNodeInList(sourceFile, node), - end: index === containingList.length - 1 ? getAdjustedEndPosition(sourceFile, node, {}) : endPositionToDeleteNodeInList(sourceFile, node, containingList[index - 1], containingList[index + 1], preserveLineBreak), + end: index === containingList.length - 1 ? getAdjustedEndPosition(sourceFile, node, {}) : endPositionToDeleteNodeInList(sourceFile, node, containingList[index - 1], containingList[index + 1]), }); } } diff --git a/tests/cases/fourslash/codeFixUnusedIdentifier_typeParameter1.ts b/tests/cases/fourslash/codeFixUnusedIdentifier_typeParameter1.ts new file mode 100644 index 0000000000000..4ea7dad3a4ac3 --- /dev/null +++ b/tests/cases/fourslash/codeFixUnusedIdentifier_typeParameter1.ts @@ -0,0 +1,19 @@ +/// + +// @noUnusedLocals: true +// @noUnusedParameters: true + +////function f< +//// T1, T2, +//// T3, +////>(a: T1, b: T3) {} + +verify.codeFix({ + index: 0, + description: "Remove unused declaration for: 'T2'", + newFileContent: +`function f< + T1, + T3, +>(a: T1, b: T3) {}` +}); diff --git a/tests/cases/fourslash/codeFixUnusedIdentifier_typeParameter2.ts b/tests/cases/fourslash/codeFixUnusedIdentifier_typeParameter2.ts new file mode 100644 index 0000000000000..4bacbca4a9248 --- /dev/null +++ b/tests/cases/fourslash/codeFixUnusedIdentifier_typeParameter2.ts @@ -0,0 +1,23 @@ +/// + +// @noUnusedLocals: true +// @noUnusedParameters: true + +////function f< +//// T1, T2, +//// +//// +//// T3, +////>(a: T1, b: T3) {} + +verify.codeFix({ + index: 0, + description: "Remove unused declaration for: 'T2'", + newFileContent: +`function f< + T1, + + + T3, +>(a: T1, b: T3) {}` +}); diff --git a/tests/cases/fourslash/codeFixUnusedIdentifier_typeParameter3.ts b/tests/cases/fourslash/codeFixUnusedIdentifier_typeParameter3.ts new file mode 100644 index 0000000000000..f2349a3630591 --- /dev/null +++ b/tests/cases/fourslash/codeFixUnusedIdentifier_typeParameter3.ts @@ -0,0 +1,19 @@ +/// + +// @noUnusedLocals: true +// @noUnusedParameters: true + +////function f< +//// T1, T2, /** comment related to T3 */ +//// T3, +////>(a: T1, b: T3) {} + +verify.codeFix({ + index: 0, + description: "Remove unused declaration for: 'T2'", + newFileContent: +`function f< + T1, /** comment related to T3 */ + T3, +>(a: T1, b: T3) {}` +}); diff --git a/tests/cases/fourslash/codeFixUnusedIdentifier_typeParameter4.ts b/tests/cases/fourslash/codeFixUnusedIdentifier_typeParameter4.ts new file mode 100644 index 0000000000000..79e0e5fc78c35 --- /dev/null +++ b/tests/cases/fourslash/codeFixUnusedIdentifier_typeParameter4.ts @@ -0,0 +1,20 @@ +/// + +// @noUnusedLocals: true +// @noUnusedParameters: true + +////function f< +//// T1, +//// T2, +//// T3, +////>(a: T1, b: T3) {} + +verify.codeFix({ + index: 0, + description: "Remove unused declaration for: 'T2'", + newFileContent: +`function f< + T1, + T3, +>(a: T1, b: T3) {}` +}); diff --git a/tests/cases/fourslash/codeFixUnusedIdentifier_typeParameter5.ts b/tests/cases/fourslash/codeFixUnusedIdentifier_typeParameter5.ts new file mode 100644 index 0000000000000..0bdbf1bccdb22 --- /dev/null +++ b/tests/cases/fourslash/codeFixUnusedIdentifier_typeParameter5.ts @@ -0,0 +1,24 @@ +/// + +// @noUnusedLocals: true +// @noUnusedParameters: true + +////function f< +//// T1, +//// T2, +//// +//// +//// T3, +////>(a: T1, b: T3) {} + +verify.codeFix({ + index: 0, + description: "Remove unused declaration for: 'T2'", + newFileContent: +`function f< + T1, + + + T3, +>(a: T1, b: T3) {}` +});