From f850298f70785b94f0a99af97faaa4cc5402a0bd Mon Sep 17 00:00:00 2001 From: "Oleksandr T." Date: Sat, 17 Aug 2024 01:17:58 +0300 Subject: [PATCH] fix(59558): Implement Interface Quick Fix generates duplicate declarations (#59563) --- src/services/codefixes/helpers.ts | 3 ++ ...mplementInterfaceWithAmbientSignatures1.ts | 32 +++++++++++++++++++ ...mplementInterfaceWithAmbientSignatures2.ts | 19 +++++++++++ ...mplementInterfaceWithAmbientSignatures3.ts | 19 +++++++++++ 4 files changed, 73 insertions(+) create mode 100644 tests/cases/fourslash/codeFixClassImplementInterfaceWithAmbientSignatures1.ts create mode 100644 tests/cases/fourslash/codeFixClassImplementInterfaceWithAmbientSignatures2.ts create mode 100644 tests/cases/fourslash/codeFixClassImplementInterfaceWithAmbientSignatures3.ts diff --git a/src/services/codefixes/helpers.ts b/src/services/codefixes/helpers.ts index f4a29c3751d..656f3dce112 100644 --- a/src/services/codefixes/helpers.ts +++ b/src/services/codefixes/helpers.ts @@ -301,6 +301,9 @@ export function addNewNodeForMemberSymbol( } for (const signature of signatures) { + if (signature.declaration && (signature.declaration.flags & NodeFlags.Ambient)) { + continue; + } // Ensure nodes are fresh so they can have different positions when going through formatting. outputMethod(quotePreference, signature, modifiers, createName(declarationName)); } diff --git a/tests/cases/fourslash/codeFixClassImplementInterfaceWithAmbientSignatures1.ts b/tests/cases/fourslash/codeFixClassImplementInterfaceWithAmbientSignatures1.ts new file mode 100644 index 00000000000..695ccc3b99e --- /dev/null +++ b/tests/cases/fourslash/codeFixClassImplementInterfaceWithAmbientSignatures1.ts @@ -0,0 +1,32 @@ +/// + +// @lib: esnext +// @target: esnext + +// @Filename: /node_modules/@types/node/globals.d.ts +////export {}; +////declare global { +//// interface SymbolConstructor { +//// readonly dispose: unique symbol; +//// } +//// interface Disposable { +//// [Symbol.dispose](): void; +//// } +////} + +// @Filename: /node_modules/@types/node/index.d.ts +/////// + +// @Filename: a.ts +////class Foo implements Disposable {} + +goTo.file("a.ts"); +verify.codeFix({ + description: "Implement interface 'Disposable'", + newFileContent: +`class Foo implements Disposable { + [Symbol.dispose](): void { + throw new Error("Method not implemented."); + } +}` +}); diff --git a/tests/cases/fourslash/codeFixClassImplementInterfaceWithAmbientSignatures2.ts b/tests/cases/fourslash/codeFixClassImplementInterfaceWithAmbientSignatures2.ts new file mode 100644 index 00000000000..0ae34b6e4a2 --- /dev/null +++ b/tests/cases/fourslash/codeFixClassImplementInterfaceWithAmbientSignatures2.ts @@ -0,0 +1,19 @@ +/// + +////declare class A { +//// method(): void; +////} +////class B implements A {} + +verify.codeFix({ + description: "Implement interface 'A'", + newFileContent: +`declare class A { + method(): void; +} +class B implements A { + method(): void { + throw new Error("Method not implemented."); + } +}` +}); diff --git a/tests/cases/fourslash/codeFixClassImplementInterfaceWithAmbientSignatures3.ts b/tests/cases/fourslash/codeFixClassImplementInterfaceWithAmbientSignatures3.ts new file mode 100644 index 00000000000..42fbc81db17 --- /dev/null +++ b/tests/cases/fourslash/codeFixClassImplementInterfaceWithAmbientSignatures3.ts @@ -0,0 +1,19 @@ +/// + +////declare abstract class A { +//// abstract method(): void; +////} +////class B implements A {} + +verify.codeFix({ + description: "Implement interface 'A'", + newFileContent: +`declare abstract class A { + abstract method(): void; +} +class B implements A { + method(): void { + throw new Error("Method not implemented."); + } +}` +});