Skip to content

Commit 7bdeaa8

Browse files
committed
fix missing type parameters
1 parent 302c0fc commit 7bdeaa8

File tree

2 files changed

+64
-1
lines changed

2 files changed

+64
-1
lines changed

src/services/codefixes/helpers.ts

+8-1
Original file line numberDiff line numberDiff line change
@@ -376,6 +376,7 @@ namespace ts.codefix {
376376
let maxArgsSignature = signatures[0];
377377
let minArgumentCount = signatures[0].minArgumentCount;
378378
let someSigHasRestParameter = false;
379+
let maxTypeArgsSignature = signatures[0];
379380
for (const sig of signatures) {
380381
minArgumentCount = Math.min(sig.minArgumentCount, minArgumentCount);
381382
if (signatureHasRestParameter(sig)) {
@@ -384,6 +385,9 @@ namespace ts.codefix {
384385
if (sig.parameters.length >= maxArgsSignature.parameters.length && (!signatureHasRestParameter(sig) || signatureHasRestParameter(maxArgsSignature))) {
385386
maxArgsSignature = sig;
386387
}
388+
if (sig.typeParameters && (!maxTypeArgsSignature.typeParameters || sig.typeParameters.length > maxTypeArgsSignature.typeParameters.length)) {
389+
maxTypeArgsSignature = sig;
390+
}
387391
}
388392
const maxNonRestArgs = maxArgsSignature.parameters.length - (signatureHasRestParameter(maxArgsSignature) ? 1 : 0);
389393
const maxArgsParameterSymbolNames = maxArgsSignature.parameters.map(symbol => symbol.name);
@@ -402,11 +406,14 @@ namespace ts.codefix {
402406
parameters.push(restParameter);
403407
}
404408

409+
const typeParameters = maxTypeArgsSignature.typeParameters?.map(typeParam =>
410+
factory.createTypeParameterDeclaration(typeParam.symbol.getName()));
411+
405412
return createStubbedMethod(
406413
modifiers,
407414
name,
408415
optional,
409-
/*typeParameters*/ undefined,
416+
typeParameters,
410417
parameters,
411418
getReturnTypeFromSignatures(signatures, checker, context, enclosingDeclaration),
412419
quotePreference,
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
/// <reference path="fourslash.ts" />
2+
3+
// @Filename: a.ts
4+
// @newline: LF
5+
// Case: generic methods
6+
////abstract class A {
7+
//// abstract M<T>(x: number): number;
8+
//// abstract M<T>(x: string): string;
9+
//// N<T>(x: string): void {
10+
//// return;
11+
//// }
12+
////}
13+
////
14+
////class B extends A {
15+
//// /*a*/
16+
////}
17+
18+
19+
verify.completions({
20+
marker: "a",
21+
isNewIdentifierLocation: true,
22+
preferences: {
23+
includeCompletionsWithInsertText: true,
24+
includeCompletionsWithSnippetText: false,
25+
},
26+
includes: [
27+
{
28+
name: "M",
29+
sortText: completion.SortText.LocationPriority,
30+
replacementSpan: {
31+
fileName: "",
32+
pos: 0,
33+
end: 0,
34+
},
35+
insertText:
36+
`M<T>(x: number): number;
37+
M<T>(x: string): string;
38+
M<T>(x: any): string | number {
39+
}
40+
`,
41+
},
42+
{
43+
name: "N",
44+
sortText: completion.SortText.LocationPriority,
45+
replacementSpan: {
46+
fileName: "",
47+
pos: 0,
48+
end: 0,
49+
},
50+
insertText:
51+
`N<T>(x: string): void {
52+
}
53+
`,
54+
},
55+
],
56+
});

0 commit comments

Comments
 (0)