Skip to content

Commit 5ca7983

Browse files
committed
Fix the code that checks for variadic signatures
This code looks strange, like there's a typo in it (eg, using `lists` in the `parameterList` loop, etc) -- so I also refactored it a bit to look more intentional. The new format makes it clearer that `lists` is checked once *outside* the loop, as well as the role of `hasEffectiveRestParameter`. The actual bug fix is checking `pList.length` in the new `isVariadic()`. Fixes 41059.
1 parent 6de6dae commit 5ca7983

File tree

2 files changed

+20
-9
lines changed

2 files changed

+20
-9
lines changed

src/services/signatureHelp.ts

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -624,7 +624,6 @@ namespace ts.SignatureHelp {
624624
}
625625

626626
function itemInfoForParameters(candidateSignature: Signature, checker: TypeChecker, enclosingDeclaration: Node, sourceFile: SourceFile): SignatureHelpItemInfo[] {
627-
const isVariadic = checker.hasEffectiveRestParameter(candidateSignature);
628627
const printer = createPrinter({ removeComments: true });
629628
const typeParameterParts = mapToDisplayParts(writer => {
630629
if (candidateSignature.typeParameters && candidateSignature.typeParameters.length) {
@@ -633,14 +632,16 @@ namespace ts.SignatureHelp {
633632
}
634633
});
635634
const lists = checker.getExpandedParameters(candidateSignature);
636-
return lists.map(parameterList => {
637-
return {
638-
isVariadic: isVariadic && (lists.length === 1 || !!((parameterList[parameterList.length - 1] as TransientSymbol).checkFlags & CheckFlags.RestParameter)),
639-
parameters: parameterList.map(p => createSignatureHelpParameterForParameter(p, checker, enclosingDeclaration, sourceFile, printer)),
640-
prefix: [...typeParameterParts, punctuationPart(SyntaxKind.OpenParenToken)],
641-
suffix: [punctuationPart(SyntaxKind.CloseParenToken)]
642-
};
643-
});
635+
const isVariadic: (parameterList: readonly Symbol[]) => boolean =
636+
!checker.hasEffectiveRestParameter(candidateSignature) ? _ => false
637+
: lists.length === 1 ? _ => true
638+
: pList => !!(pList.length && (pList[pList.length - 1] as TransientSymbol).checkFlags & CheckFlags.RestParameter);
639+
return lists.map(parameterList => ({
640+
isVariadic: isVariadic(parameterList),
641+
parameters: parameterList.map(p => createSignatureHelpParameterForParameter(p, checker, enclosingDeclaration, sourceFile, printer)),
642+
prefix: [...typeParameterParts, punctuationPart(SyntaxKind.OpenParenToken)],
643+
suffix: [punctuationPart(SyntaxKind.CloseParenToken)]
644+
}));
644645
}
645646

646647
function createSignatureHelpParameterForParameter(parameter: Symbol, checker: TypeChecker, enclosingDeclaration: Node, sourceFile: SourceFile, printer: Printer): SignatureHelpParameter {
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
/// <reference path="fourslash.ts" />
2+
3+
// @lib: esnext
4+
// @allowNonTsExtensions: true
5+
6+
// @Filename: Foo.js
7+
//// a.next(/**/);
8+
9+
goTo.marker();
10+
verify.signatureHelp({ overloadsCount: 2, text: "Generator.next(): IteratorResult<T, TReturn>" });

0 commit comments

Comments
 (0)