From 7bdeaa86dae61822a8ee46c13a3680708c6928af Mon Sep 17 00:00:00 2001 From: Gabriela Araujo Britto Date: Mon, 25 Oct 2021 17:54:03 -0700 Subject: [PATCH] fix missing type parameters --- src/services/codefixes/helpers.ts | 9 ++- .../fourslash/completionsOverridingMethod7.ts | 56 +++++++++++++++++++ 2 files changed, 64 insertions(+), 1 deletion(-) create mode 100644 tests/cases/fourslash/completionsOverridingMethod7.ts diff --git a/src/services/codefixes/helpers.ts b/src/services/codefixes/helpers.ts index 76fb8ba557..9a65e73cf9 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 0000000000..7cfbe394d8 --- /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 { +} +`, + }, + ], +});