From 93451e8dd98c705f1ef9bcb7b2ae606e18badfb1 Mon Sep 17 00:00:00 2001 From: Oleksandr T Date: Fri, 19 Apr 2024 21:28:00 +0300 Subject: [PATCH] fix(57497): "Remove unused declaration" does not work on overloaded function declarations (#57517) --- src/services/codefixes/fixUnusedIdentifier.ts | 14 ++++++++++++++ .../codeFixUnusedIdentifier_overloads.ts | 19 +++++++++++++++++++ 2 files changed, 33 insertions(+) create mode 100644 tests/cases/fourslash/codeFixUnusedIdentifier_overloads.ts diff --git a/src/services/codefixes/fixUnusedIdentifier.ts b/src/services/codefixes/fixUnusedIdentifier.ts index 44f7dec2607..9e3677d3e23 100644 --- a/src/services/codefixes/fixUnusedIdentifier.ts +++ b/src/services/codefixes/fixUnusedIdentifier.ts @@ -27,6 +27,7 @@ import { isComputedPropertyName, isDeclarationWithTypeParameterChildren, isExpressionStatement, + isFunctionDeclaration, isIdentifier, isImportClause, isImportDeclaration, @@ -129,6 +130,10 @@ registerCodeFix({ ]; } + if (isIdentifier(token) && isFunctionDeclaration(token.parent)) { + return [createDeleteFix(textChanges.ChangeTracker.with(context, t => deleteFunctionLikeDeclaration(t, sourceFile, token.parent as FunctionLikeDeclaration)), [Diagnostics.Remove_unused_declaration_for_Colon_0, token.getText(sourceFile)])]; + } + const result: CodeFixAction[] = []; if (token.kind === SyntaxKind.InferKeyword) { const changes = textChanges.ChangeTracker.with(context, t => changeInferToUnknown(t, sourceFile, token)); @@ -431,3 +436,12 @@ function mayDeleteExpression(node: Node) { return ((isBinaryExpression(node.parent) && node.parent.left === node) || ((isPostfixUnaryExpression(node.parent) || isPrefixUnaryExpression(node.parent)) && node.parent.operand === node)) && isExpressionStatement(node.parent.parent); } + +function deleteFunctionLikeDeclaration(changes: textChanges.ChangeTracker, sourceFile: SourceFile, node: FunctionLikeDeclaration) { + const declarations = node.symbol.declarations; + if (declarations) { + for (const declaration of declarations) { + changes.delete(sourceFile, declaration); + } + } +} diff --git a/tests/cases/fourslash/codeFixUnusedIdentifier_overloads.ts b/tests/cases/fourslash/codeFixUnusedIdentifier_overloads.ts new file mode 100644 index 00000000000..60ac6db6f08 --- /dev/null +++ b/tests/cases/fourslash/codeFixUnusedIdentifier_overloads.ts @@ -0,0 +1,19 @@ +/// + +// @noUnusedLocals: true + +////function foo(): number; +////function foo(x: number, y: number): number; +////function foo(x?: number, y?: number): number { +//// return 1234; +////} +//// +////export {} + +verify.codeFix({ + index: 0, + description: "Remove unused declaration for: 'foo'", + newFileContent: +` +export {}`, +});