diff --git a/src/services/codefixes/helpers.ts b/src/services/codefixes/helpers.ts
index 76fb8ba5574df..9a65e73cf955f 100644
--- a/src/services/codefixes/helpers.ts
+++ b/src/services/codefixes/helpers.ts
@@ -376,6 +376,7 @@ namespace ts.codefix {
let maxArgsSignature = signatures[0];
let minArgumentCount = signatures[0].minArgumentCount;
let someSigHasRestParameter = false;
+ let maxTypeArgsSignature = signatures[0];
for (const sig of signatures) {
minArgumentCount = Math.min(sig.minArgumentCount, minArgumentCount);
if (signatureHasRestParameter(sig)) {
@@ -384,6 +385,9 @@ namespace ts.codefix {
if (sig.parameters.length >= maxArgsSignature.parameters.length && (!signatureHasRestParameter(sig) || signatureHasRestParameter(maxArgsSignature))) {
maxArgsSignature = sig;
}
+ if (sig.typeParameters && (!maxTypeArgsSignature.typeParameters || sig.typeParameters.length > maxTypeArgsSignature.typeParameters.length)) {
+ maxTypeArgsSignature = sig;
+ }
}
const maxNonRestArgs = maxArgsSignature.parameters.length - (signatureHasRestParameter(maxArgsSignature) ? 1 : 0);
const maxArgsParameterSymbolNames = maxArgsSignature.parameters.map(symbol => symbol.name);
@@ -402,11 +406,14 @@ namespace ts.codefix {
parameters.push(restParameter);
}
+ const typeParameters = maxTypeArgsSignature.typeParameters?.map(typeParam =>
+ factory.createTypeParameterDeclaration(typeParam.symbol.getName()));
+
return createStubbedMethod(
modifiers,
name,
optional,
- /*typeParameters*/ undefined,
+ typeParameters,
parameters,
getReturnTypeFromSignatures(signatures, checker, context, enclosingDeclaration),
quotePreference,
diff --git a/tests/cases/fourslash/completionsOverridingMethod7.ts b/tests/cases/fourslash/completionsOverridingMethod7.ts
new file mode 100644
index 0000000000000..7cfbe394d8d71
--- /dev/null
+++ b/tests/cases/fourslash/completionsOverridingMethod7.ts
@@ -0,0 +1,56 @@
+///
+
+// @Filename: a.ts
+// @newline: LF
+// Case: generic methods
+////abstract class A {
+//// abstract M(x: number): number;
+//// abstract M(x: string): string;
+//// N(x: string): void {
+//// return;
+//// }
+////}
+////
+////class B extends A {
+//// /*a*/
+////}
+
+
+verify.completions({
+ marker: "a",
+ isNewIdentifierLocation: true,
+ preferences: {
+ includeCompletionsWithInsertText: true,
+ includeCompletionsWithSnippetText: false,
+ },
+ includes: [
+ {
+ name: "M",
+ sortText: completion.SortText.LocationPriority,
+ replacementSpan: {
+ fileName: "",
+ pos: 0,
+ end: 0,
+ },
+ insertText:
+`M(x: number): number;
+M(x: string): string;
+M(x: any): string | number {
+}
+`,
+ },
+ {
+ name: "N",
+ sortText: completion.SortText.LocationPriority,
+ replacementSpan: {
+ fileName: "",
+ pos: 0,
+ end: 0,
+ },
+ insertText:
+`N(x: string): void {
+}
+`,
+ },
+ ],
+});