@@ -3483,32 +3483,43 @@ module ts {
3483
3483
function getSignatureHelpItems ( fileName : string , position : number ) : SignatureHelpItems {
3484
3484
// If node is an argument, returns its index in the argument list
3485
3485
// If not, returns -1
3486
- function getArgumentIndex ( node : Node ) : number {
3486
+ function getArgumentIndexInfo ( node : Node ) : ServicesSyntaxUtilities . ListItemInfo {
3487
3487
if ( node . parent . kind !== SyntaxKind . CallExpression && node . parent . kind !== SyntaxKind . NewExpression ) {
3488
- return - 1 ;
3488
+ return undefined ;
3489
3489
}
3490
3490
3491
3491
var parent = < CallExpression > node . parent ;
3492
3492
// Find out if 'node' is an argument, a type argument, or neither
3493
- // Treat the open paren / angle bracket of a call as the introduction of parameter slot 0
3494
3493
if ( node . kind === SyntaxKind . LessThanToken || node . kind === SyntaxKind . OpenParenToken ) {
3495
- return 0 ;
3494
+ // Find the list that starts right *after* the < or ( token
3495
+ var seenRelevantOpenerToken = false ;
3496
+ var list = forEach ( parent . getChildren ( ) , c => {
3497
+ if ( seenRelevantOpenerToken ) {
3498
+ Debug . assert ( c . kind === SyntaxKind . SyntaxList ) ;
3499
+ return c ;
3500
+ }
3501
+ if ( c . kind === node . kind /*node is the relevant opener token we are looking for*/ ) {
3502
+ seenRelevantOpenerToken = true ;
3503
+ }
3504
+ } ) ;
3505
+ Debug . assert ( list ) ;
3506
+ // Treat the open paren / angle bracket of a call as the introduction of parameter slot 0
3507
+ return {
3508
+ listItemIndex : 0 ,
3509
+ list : list
3510
+ } ;
3496
3511
}
3497
3512
3498
3513
if ( node . kind === SyntaxKind . GreaterThanToken
3499
3514
|| node . kind === SyntaxKind . CloseParenToken
3500
3515
|| node === parent . func ) {
3501
- return - 1 ;
3516
+ return undefined ;
3502
3517
}
3503
3518
3504
- return ServicesSyntaxUtilities . findListItemInfo ( node ) . listItemIndex ;
3519
+ return ServicesSyntaxUtilities . findListItemInfo ( node ) ;
3505
3520
}
3506
3521
3507
- function getSignatureHelpArgumentContext ( node : Node ) : {
3508
- argumentNode : Node ;
3509
- argumentIndex : number ;
3510
- isTypeArgument : boolean ;
3511
- } {
3522
+ function getSignatureHelpArgumentContext ( node : Node ) : ServicesSyntaxUtilities . ListItemInfo {
3512
3523
// We only want this node if it is a token and it strictly contains the current position.
3513
3524
// Otherwise we want the previous token
3514
3525
var isToken = node . kind < SyntaxKind . Missing ;
@@ -3526,13 +3537,9 @@ module ts {
3526
3537
return undefined ;
3527
3538
}
3528
3539
3529
- var index = getArgumentIndex ( n ) ;
3530
- if ( index >= 0 ) {
3531
- return {
3532
- argumentNode : n ,
3533
- argumentIndex : index ,
3534
- isTypeArgument : false
3535
- }
3540
+ var argumentInfo = getArgumentIndexInfo ( n ) ;
3541
+ if ( argumentInfo ) {
3542
+ return argumentInfo ;
3536
3543
}
3537
3544
3538
3545
@@ -3542,13 +3549,17 @@ module ts {
3542
3549
return undefined ;
3543
3550
}
3544
3551
3545
- function getSignatureHelpItemsFromCandidateInfo ( candidates : Signature [ ] , bestSignature : Signature ) : SignatureHelpItems {
3552
+ function getSignatureHelpItemsFromCandidateInfo ( candidates : Signature [ ] , bestSignature : Signature , argumentListOrTypeArgumentList : Node ) : SignatureHelpItems {
3546
3553
var items = map ( candidates , candidateSignature => {
3547
3554
return new SignatureHelpItem ( false , "" , "" , "" , new Array < SignatureHelpParameter > ( candidateSignature . parameters . length ) , "" ) ;
3548
3555
} ) ;
3549
3556
var selectedItemIndex = candidates . indexOf ( bestSignature ) ;
3550
- Debug . assert ( selectedItemIndex >= 0 ) ;
3551
- return new SignatureHelpItems ( items , undefined , selectedItemIndex ) ;
3557
+ if ( selectedItemIndex < 0 ) {
3558
+ selectedItemIndex = 0 ;
3559
+ }
3560
+
3561
+ var applicableSpan = new TypeScript . TextSpan ( argumentListOrTypeArgumentList . getFullStart ( ) , argumentListOrTypeArgumentList . end ) ;
3562
+ return new SignatureHelpItems ( items , applicableSpan , selectedItemIndex ) ;
3552
3563
}
3553
3564
3554
3565
synchronizeHostData ( ) ;
@@ -3561,11 +3572,11 @@ module ts {
3561
3572
// Semantic filtering of signature help
3562
3573
var signatureHelpContext = getSignatureHelpArgumentContext ( node ) ;
3563
3574
if ( signatureHelpContext ) {
3564
- var call = < CallExpression > signatureHelpContext . argumentNode . parent ;
3575
+ var call = < CallExpression > signatureHelpContext . list . parent ;
3565
3576
var candidates = < Signature [ ] > [ ] ;
3566
3577
var resolvedSignature = typeInfoResolver . getResolvedSignature ( call , candidates ) ;
3567
3578
return candidates . length
3568
- ? getSignatureHelpItemsFromCandidateInfo ( candidates , resolvedSignature )
3579
+ ? getSignatureHelpItemsFromCandidateInfo ( candidates , resolvedSignature , signatureHelpContext . list )
3569
3580
: undefined ;
3570
3581
}
3571
3582
0 commit comments