fix missing type parameters

This commit is contained in:
Gabriela Araujo Britto 2021-10-25 17:54:03 -07:00
parent 302c0fc736
commit 7bdeaa86da
2 changed files with 64 additions and 1 deletions

View file

@ -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,

View file

@ -0,0 +1,56 @@
/// <reference path="fourslash.ts" />
// @Filename: a.ts
// @newline: LF
// Case: generic methods
////abstract class A {
//// abstract M<T>(x: number): number;
//// abstract M<T>(x: string): string;
//// N<T>(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<T>(x: number): number;
M<T>(x: string): string;
M<T>(x: any): string | number {
}
`,
},
{
name: "N",
sortText: completion.SortText.LocationPriority,
replacementSpan: {
fileName: "",
pos: 0,
end: 0,
},
insertText:
`N<T>(x: string): void {
}
`,
},
],
});