From 790c03d7b00db0e10f7fa1905c4024b161b40430 Mon Sep 17 00:00:00 2001 From: Oleksandr T Date: Tue, 13 Dec 2022 01:28:03 +0200 Subject: [PATCH] fix(47954): Auto implementation of interface with a constructor prop causes error (#50709) * fix(47954): convert constructor property to computed name * handle more nodes with constructor name --- src/services/codefixes/helpers.ts | 3 +++ ...ClassImplementInterfaceConstructorName1.ts | 17 +++++++++++++++++ ...ClassImplementInterfaceConstructorName2.ts | 19 +++++++++++++++++++ 3 files changed, 39 insertions(+) create mode 100644 tests/cases/fourslash/codeFixClassImplementInterfaceConstructorName1.ts create mode 100644 tests/cases/fourslash/codeFixClassImplementInterfaceConstructorName2.ts diff --git a/src/services/codefixes/helpers.ts b/src/services/codefixes/helpers.ts index 1bc5bbb658c..8f85058cc63 100644 --- a/src/services/codefixes/helpers.ts +++ b/src/services/codefixes/helpers.ts @@ -305,6 +305,9 @@ export function addNewNodeForMemberSymbol( } function createName(node: PropertyName) { + if (isIdentifier(node) && node.escapedText === "constructor") { + return factory.createComputedPropertyName(factory.createStringLiteral(idText(node), quotePreference === QuotePreference.Single)); + } return getSynthesizedDeepClone(node, /*includeTrivia*/ false); } diff --git a/tests/cases/fourslash/codeFixClassImplementInterfaceConstructorName1.ts b/tests/cases/fourslash/codeFixClassImplementInterfaceConstructorName1.ts new file mode 100644 index 00000000000..7dd7f0413bf --- /dev/null +++ b/tests/cases/fourslash/codeFixClassImplementInterfaceConstructorName1.ts @@ -0,0 +1,17 @@ +/// + +////interface I { +//// constructor: number; +////} +////class C implements I {} + +verify.codeFix({ + description: "Implement interface 'I'", + newFileContent: +`interface I { + constructor: number; +} +class C implements I { + ["constructor"]: number; +}`, +}); diff --git a/tests/cases/fourslash/codeFixClassImplementInterfaceConstructorName2.ts b/tests/cases/fourslash/codeFixClassImplementInterfaceConstructorName2.ts new file mode 100644 index 00000000000..b90e2e34df4 --- /dev/null +++ b/tests/cases/fourslash/codeFixClassImplementInterfaceConstructorName2.ts @@ -0,0 +1,19 @@ +/// + +////interface I { +//// constructor(): number; +////} +////class C implements I {} + +verify.codeFix({ + description: "Implement interface 'I'", + newFileContent: +`interface I { + constructor(): number; +} +class C implements I { + ["constructor"](): number { + throw new Error("Method not implemented."); + } +}`, +});