@@ -540,15 +540,7 @@ namespace ts.SignatureHelp {
540
540
}
541
541
542
542
Debug . assert ( selectedItemIndex !== - 1 ) ; // If candidates is non-empty it should always include bestSignature. We check for an empty candidates before calling this function.
543
- const help = { items : flatMapToMutable ( items , identity ) , applicableSpan, selectedItemIndex, argumentIndex, argumentCount } ;
544
- const selected = help . items [ selectedItemIndex ] ;
545
- if ( selected . isVariadic ) {
546
- const firstRest = findIndex ( selected . parameters , p => ! ! p . isRest ) ;
547
- if ( firstRest > - 1 && help . argumentIndex > firstRest ) {
548
- help . argumentIndex = firstRest ;
549
- }
550
- }
551
- return help ;
543
+ return { items : flatMapToMutable ( items , identity ) , applicableSpan, selectedItemIndex, argumentIndex, argumentCount } ;
552
544
}
553
545
554
546
function createTypeHelpItems (
@@ -628,10 +620,12 @@ namespace ts.SignatureHelp {
628
620
printer . writeList ( ListFormat . TypeParameters , args , sourceFile , writer ) ;
629
621
}
630
622
} ) ;
631
- const lists = checker . getExpandedParameters ( candidateSignature ) ;
632
- return lists . map ( parameterList => {
623
+ const expansions = checker . getExpandedParameters ( candidateSignature ) ;
624
+ const hasNonTrailingRest = expansions . some ( e => e . some ( ( p , i ) => ( p as TransientSymbol ) . checkFlags & CheckFlags . RestParameter && i !== e . length - 1 ) ) ;
625
+ const hasTupleExpansion = expansions . length > 1 ;
626
+ return ( hasNonTrailingRest ? [ candidateSignature . parameters ] : expansions ) . map ( parameterList => {
633
627
return {
634
- isVariadic : isVariadic && ( lists . length === 1 || ! ! ( ( parameterList [ parameterList . length - 1 ] as TransientSymbol ) . checkFlags & CheckFlags . RestParameter ) ) ,
628
+ isVariadic : isVariadic && ( ! hasTupleExpansion || ! ! ( ( parameterList [ parameterList . length - 1 ] as TransientSymbol ) . checkFlags & CheckFlags . RestParameter ) ) ,
635
629
parameters : parameterList . map ( p => createSignatureHelpParameterForParameter ( p , checker , enclosingDeclaration , sourceFile , printer ) ) ,
636
630
prefix : [ ...typeParameterParts , punctuationPart ( SyntaxKind . OpenParenToken ) ] ,
637
631
suffix : [ punctuationPart ( SyntaxKind . CloseParenToken ) ]
@@ -645,15 +639,14 @@ namespace ts.SignatureHelp {
645
639
printer . writeNode ( EmitHint . Unspecified , param , sourceFile , writer ) ;
646
640
} ) ;
647
641
const isOptional = checker . isOptionalParameter ( parameter . valueDeclaration as ParameterDeclaration ) ;
648
- const isRest = ! ! ( ( parameter as TransientSymbol ) . checkFlags & CheckFlags . RestParameter ) ;
649
- return { name : parameter . name , documentation : parameter . getDocumentationComment ( checker ) , displayParts, isOptional, isRest } ;
642
+ return { name : parameter . name , documentation : parameter . getDocumentationComment ( checker ) , displayParts, isOptional } ;
650
643
}
651
644
652
645
function createSignatureHelpParameterForTypeParameter ( typeParameter : TypeParameter , checker : TypeChecker , enclosingDeclaration : Node , sourceFile : SourceFile , printer : Printer ) : SignatureHelpParameter {
653
646
const displayParts = mapToDisplayParts ( writer => {
654
647
const param = checker . typeParameterToDeclaration ( typeParameter , enclosingDeclaration , signatureHelpNodeBuilderFlags ) ! ;
655
648
printer . writeNode ( EmitHint . Unspecified , param , sourceFile , writer ) ;
656
649
} ) ;
657
- return { name : typeParameter . symbol . name , documentation : typeParameter . symbol . getDocumentationComment ( checker ) , displayParts, isOptional : false , isRest : false } ;
650
+ return { name : typeParameter . symbol . name , documentation : typeParameter . symbol . getDocumentationComment ( checker ) , displayParts, isOptional : false } ;
658
651
}
659
652
}
0 commit comments