Skip to content

Commit 8d66d55

Browse files
Improved argument description for parameters originating from tuples that were extracted from functions. (ie mapped functions)
1 parent c37254e commit 8d66d55

File tree

4 files changed

+69
-2
lines changed

4 files changed

+69
-2
lines changed

src/compiler/checker.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -112,6 +112,7 @@ namespace ts {
112112
getMergedSymbol,
113113
getDiagnostics,
114114
getGlobalDiagnostics,
115+
getExpandedParameters,
115116
getTypeOfSymbolAtLocation: (symbol, location) => {
116117
location = getParseTreeNode(location);
117118
return location ? getTypeOfSymbolAtLocation(symbol, location) : errorType;

src/compiler/types.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3032,6 +3032,7 @@ namespace ts {
30323032
/* @internal */
30333033
getPromisedTypeOfPromise(promise: Type, errorNode?: Node): Type | undefined;
30343034
getReturnTypeOfSignature(signature: Signature): Type;
3035+
/* @internal */ getExpandedParameters(sig: Signature): ReadonlyArray<Symbol>;
30353036
/**
30363037
* Gets the type of a parameter at a given position in a signature.
30373038
* Returns `any` if the index is not valid.

src/services/signatureHelp.ts

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -566,15 +566,24 @@ namespace ts.SignatureHelp {
566566
}
567567

568568
function itemInfoForParameters(candidateSignature: Signature, checker: TypeChecker, enclosingDeclaration: Node, sourceFile: SourceFile): SignatureHelpItemInfo {
569-
const isVariadic = candidateSignature.hasRestParameter;
569+
let isVariadic = candidateSignature.hasRestParameter;
570570
const printer = createPrinter({ removeComments: true });
571571
const typeParameterParts = mapToDisplayParts(writer => {
572572
if (candidateSignature.typeParameters && candidateSignature.typeParameters.length) {
573573
const args = createNodeArray(candidateSignature.typeParameters.map(p => checker.typeParameterToDeclaration(p, enclosingDeclaration)!));
574574
printer.writeList(ListFormat.TypeParameters, args, sourceFile, writer);
575575
}
576576
});
577-
const parameters = candidateSignature.parameters.map(p => createSignatureHelpParameterForParameter(p, checker, enclosingDeclaration, sourceFile, printer));
577+
578+
const expandedParameters = checker.getExpandedParameters(candidateSignature);
579+
const parameters = expandedParameters.map(p => createSignatureHelpParameterForParameter(p, checker, enclosingDeclaration, sourceFile, printer));
580+
581+
// If parameters are not the same as the expanded parameters, we need to reevaluate whether this a variadic signature based on the last parameter
582+
if (expandedParameters !== candidateSignature.parameters) {
583+
const restCandidate = lastOrUndefined(expandedParameters);
584+
isVariadic = !!restCandidate && !!(getCheckFlags(restCandidate) & CheckFlags.RestParameter);
585+
}
586+
578587
return { isVariadic, parameters, prefix: [...typeParameterParts, punctuationPart(SyntaxKind.OpenParenToken)], suffix: [punctuationPart(SyntaxKind.CloseParenToken)] };
579588
}
580589

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
/// <reference path='fourslash.ts'/>
2+
3+
4+
//// function fnTest(str: string, num: number) { }
5+
//// declare function wrap<A extends any[], R>(fn: (...a: A) => R) : (...a: A) => R;
6+
//// var fnWrapped = wrap(fnTest);
7+
//// fnWrapped/*3*/(/*1*/'', /*2*/5);
8+
//// function fnTestVariadic (str: string, ...num: number[]) { }
9+
//// var fnVariadicWrapped = wrap(fnTestVariadic);
10+
//// fnVariadicWrapped/*4*/(/*5*/'', /*6*/5);
11+
//// function fnNoParams () { }
12+
//// var fnNoParamsWrapped = wrap(fnNoParams);
13+
//// fnNoParamsWrapped/*7*/(/*8*/);
14+
15+
verify.quickInfoAt("3", "var fnWrapped: (str: string, num: number) => void");
16+
verify.signatureHelp(
17+
{
18+
marker: "1",
19+
text: "fnWrapped(str: string, num: number): void",
20+
parameterCount: 2,
21+
parameterName: "str",
22+
parameterSpan: "str: string",
23+
},
24+
{
25+
marker: "2",
26+
parameterName: "num",
27+
parameterSpan: "num: number",
28+
},
29+
);
30+
31+
verify.quickInfoAt("4", "var fnVariadicWrapped: (str: string, ...num: number[]) => void");
32+
verify.signatureHelp(
33+
{
34+
marker: "5",
35+
text: "fnVariadicWrapped(str: string, ...num: number[]): void",
36+
parameterCount: 2,
37+
parameterName: "str",
38+
parameterSpan: "str: string",
39+
isVariadic: true,
40+
},
41+
{
42+
marker: "6",
43+
parameterName: "num",
44+
parameterSpan: "...num: number[]",
45+
isVariadic: true,
46+
},
47+
);
48+
49+
verify.quickInfoAt("7", "var fnNoParamsWrapped: () => void");
50+
verify.signatureHelp(
51+
{
52+
marker: "8",
53+
text: "fnNoParamsWrapped(): void",
54+
parameterCount: 0,
55+
}
56+
);

0 commit comments

Comments
 (0)