@@ -293,33 +293,41 @@ module ts.SignatureHelp {
293
293
294
294
function createSignatureHelpItems ( candidates : Signature [ ] , bestSignature : Signature , argumentInfoOrTypeArgumentInfo : ListItemInfo ) : SignatureHelpItems {
295
295
var argumentListOrTypeArgumentList = argumentInfoOrTypeArgumentInfo . list ;
296
- var items : SignatureHelpItem [ ] = map ( candidates , candidateSignature => {
297
- var parameters = candidateSignature . parameters ;
298
- var parameterHelpItems : SignatureHelpParameter [ ] = parameters . length === 0 ? emptyArray : map ( parameters , p => {
299
- var displayParts = mapToDisplayParts ( writer =>
300
- typeInfoResolver . getSymbolDisplayBuilder ( ) . buildParameterDisplay ( p , writer , argumentListOrTypeArgumentList ) ) ;
301
-
302
- var isOptional = ! ! ( p . valueDeclaration . flags & NodeFlags . QuestionMark ) ;
303
-
304
- return {
305
- name : p . name ,
306
- documentation : p . getDocumentationComment ( ) ,
307
- displayParts : displayParts ,
308
- isOptional : isOptional
309
- } ;
310
- } ) ;
296
+ var parent = < CallExpression > argumentListOrTypeArgumentList . parent ;
297
+ var isTypeParameterHelp = parent . typeArguments && parent . typeArguments . pos === argumentListOrTypeArgumentList . pos ;
298
+ Debug . assert ( isTypeParameterHelp || parent . arguments . pos === argumentListOrTypeArgumentList . pos ) ;
311
299
312
- var callTargetNode = ( < CallExpression > argumentListOrTypeArgumentList . parent ) . func ;
313
- var callTargetSymbol = typeInfoResolver . getSymbolInfo ( callTargetNode ) ;
300
+ var callTargetNode = ( < CallExpression > argumentListOrTypeArgumentList . parent ) . func ;
301
+ var callTargetSymbol = typeInfoResolver . getSymbolInfo ( callTargetNode ) ;
302
+ var callTargetDisplayParts = callTargetSymbol && symbolToDisplayParts ( typeInfoResolver , callTargetSymbol , /*enclosingDeclaration*/ undefined , /*meaning*/ undefined ) ;
303
+ var items : SignatureHelpItem [ ] = map ( candidates , candidateSignature => {
304
+ var signatureHelpParameters : SignatureHelpParameter [ ] ;
305
+ var prefixParts : SymbolDisplayPart [ ] = [ ] ;
306
+ var suffixParts : SymbolDisplayPart [ ] = [ ] ;
314
307
315
- var prefixParts = callTargetSymbol ? symbolToDisplayParts ( typeInfoResolver , callTargetSymbol , /*enclosingDeclaration*/ undefined , /*meaning*/ undefined ) : [ ] ;
308
+ if ( callTargetDisplayParts ) {
309
+ prefixParts . push . apply ( prefixParts , callTargetDisplayParts ) ;
310
+ }
316
311
317
- var typeParameterParts = mapToDisplayParts ( writer =>
318
- typeInfoResolver . getSymbolDisplayBuilder ( ) . buildDisplayForTypeParametersAndDelimiters ( candidateSignature . typeParameters , writer , argumentListOrTypeArgumentList ) ) ;
319
- prefixParts . push . apply ( prefixParts , typeParameterParts ) ;
320
- prefixParts . push ( punctuationPart ( SyntaxKind . OpenParenToken ) ) ;
312
+ if ( isTypeParameterHelp ) {
313
+ prefixParts . push ( punctuationPart ( SyntaxKind . LessThanToken ) ) ;
314
+ var typeParameters = candidateSignature . typeParameters ;
315
+ signatureHelpParameters = typeParameters && typeParameters . length > 0 ? map ( typeParameters , createSignatureHelpParameterForTypeParameter ) : emptyArray ;
316
+ suffixParts . push ( punctuationPart ( SyntaxKind . GreaterThanToken ) ) ;
317
+ var parameterParts = mapToDisplayParts ( writer =>
318
+ typeInfoResolver . getSymbolDisplayBuilder ( ) . buildDisplayForParametersAndDelimiters ( candidateSignature . parameters , writer , argumentListOrTypeArgumentList ) ) ;
319
+ suffixParts . push . apply ( suffixParts , parameterParts ) ;
320
+ }
321
+ else {
322
+ var typeParameterParts = mapToDisplayParts ( writer =>
323
+ typeInfoResolver . getSymbolDisplayBuilder ( ) . buildDisplayForTypeParametersAndDelimiters ( candidateSignature . typeParameters , writer , argumentListOrTypeArgumentList ) ) ;
324
+ prefixParts . push . apply ( prefixParts , typeParameterParts ) ;
325
+ prefixParts . push ( punctuationPart ( SyntaxKind . OpenParenToken ) ) ;
326
+ var parameters = candidateSignature . parameters ;
327
+ signatureHelpParameters = parameters . length > 0 ? map ( parameters , createSignatureHelpParameterForParameter ) : emptyArray ;
328
+ suffixParts . push ( punctuationPart ( SyntaxKind . CloseParenToken ) ) ;
329
+ }
321
330
322
- var suffixParts = [ punctuationPart ( SyntaxKind . CloseParenToken ) ] ;
323
331
var returnTypeParts = mapToDisplayParts ( writer =>
324
332
typeInfoResolver . getSymbolDisplayBuilder ( ) . buildReturnTypeDisplay ( candidateSignature , writer , argumentListOrTypeArgumentList ) ) ;
325
333
suffixParts . push . apply ( suffixParts , returnTypeParts ) ;
@@ -329,7 +337,7 @@ module ts.SignatureHelp {
329
337
prefixDisplayParts : prefixParts ,
330
338
suffixDisplayParts : suffixParts ,
331
339
separatorDisplayParts : [ punctuationPart ( SyntaxKind . CommaToken ) , spacePart ( ) ] ,
332
- parameters : parameterHelpItems ,
340
+ parameters : signatureHelpParameters ,
333
341
documentation : candidateSignature . getDocumentationComment ( )
334
342
} ;
335
343
} ) ;
@@ -375,6 +383,32 @@ module ts.SignatureHelp {
375
383
argumentIndex : argumentIndex ,
376
384
argumentCount : argumentCount
377
385
} ;
386
+
387
+ function createSignatureHelpParameterForParameter ( parameter : Symbol ) : SignatureHelpParameter {
388
+ var displayParts = mapToDisplayParts ( writer =>
389
+ typeInfoResolver . getSymbolDisplayBuilder ( ) . buildParameterDisplay ( parameter , writer , argumentListOrTypeArgumentList ) ) ;
390
+
391
+ var isOptional = ! ! ( parameter . valueDeclaration . flags & NodeFlags . QuestionMark ) ;
392
+
393
+ return {
394
+ name : parameter . name ,
395
+ documentation : parameter . getDocumentationComment ( ) ,
396
+ displayParts : displayParts ,
397
+ isOptional : isOptional
398
+ } ;
399
+ }
400
+
401
+ function createSignatureHelpParameterForTypeParameter ( typeParameter : TypeParameter ) : SignatureHelpParameter {
402
+ var displayParts = mapToDisplayParts ( writer =>
403
+ typeInfoResolver . getSymbolDisplayBuilder ( ) . buildTypeParameterDisplay ( typeParameter , writer , argumentListOrTypeArgumentList ) ) ;
404
+
405
+ return {
406
+ name : typeParameter . symbol . name ,
407
+ documentation : emptyArray ,
408
+ displayParts : displayParts ,
409
+ isOptional : false
410
+ } ;
411
+ }
378
412
}
379
413
}
380
414
}
0 commit comments