diff --git a/extensions/typescript-language-features/src/features/quickFix.ts b/extensions/typescript-language-features/src/features/quickFix.ts index 41d384027fc9e..57b6a2f0f4691 100644 --- a/extensions/typescript-language-features/src/features/quickFix.ts +++ b/extensions/typescript-language-features/src/features/quickFix.ts @@ -355,6 +355,7 @@ const preferredFixes = new Map { assert.strictEqual(fixes![1].title, `Remove unused declaration for: 'Foo'`); }); + test('Should prioritize implement abstract class over remove unused #101486', async () => { + const testDocumentUri = workspaceFile('foo.ts'); + const editor = await createTestEditor(testDocumentUri, + `export abstract class Foo { abstract foo(): number; }`, + `class ConcreteFoo extends Foo { }`, + ); + + await wait(3000); + + const fixes = await vscode.commands.executeCommand('vscode.executeCodeActionProvider', + testDocumentUri, + editor.document.lineAt(1).range + ); + + assert.strictEqual(fixes?.length, 2); + assert.strictEqual(fixes![0].title, `Implement inherited abstract class`); + assert.strictEqual(fixes![1].title, `Remove unused declaration for: 'ConcreteFoo'`); + }); + test('Add all missing imports should come after other add import fixes #98613', async () => { await createTestEditor(workspaceFile('foo.ts'), `export const foo = 1;`); @@ -152,6 +170,6 @@ suite('TypeScript Quick Fix', () => { function workspaceFile(fileName: string) { - return vscode.Uri.file(join(vscode.workspace.rootPath!, fileName)); + return vscode.Uri.joinPath(vscode.workspace.workspaceFolders![0].uri, fileName); } diff --git a/extensions/typescript-language-features/src/utils/fixNames.ts b/extensions/typescript-language-features/src/utils/fixNames.ts index 0bda0c3bd90e9..98e47f0ebb2bb 100644 --- a/extensions/typescript-language-features/src/utils/fixNames.ts +++ b/extensions/typescript-language-features/src/utils/fixNames.ts @@ -8,6 +8,7 @@ export const constructorForDerivedNeedSuperCall = 'constructorForDerivedNeedSupe export const extendsInterfaceBecomesImplements = 'extendsInterfaceBecomesImplements'; export const awaitInSyncFunction = 'fixAwaitInSyncFunction'; export const classIncorrectlyImplementsInterface = 'fixClassIncorrectlyImplementsInterface'; +export const classDoesntImplementInheritedAbstractMember = 'fixClassDoesntImplementInheritedAbstractMember'; export const unreachableCode = 'fixUnreachableCode'; export const unusedIdentifier = 'unusedIdentifier'; export const forgottenThisPropertyAccess = 'forgottenThisPropertyAccess';