@@ -252,29 +252,66 @@ module ts.SignatureHelp {
252
252
var items = map ( candidates , candidateSignature => {
253
253
var parameters = candidateSignature . parameters ;
254
254
var parameterHelpItems = parameters . length === 0 ? emptyArray : map ( parameters , p => {
255
- var display = p . name ;
255
+ var displayParts : SymbolDisplayPart [ ] = [ ] ;
256
+
256
257
if ( candidateSignature . hasRestParameter && parameters [ parameters . length - 1 ] === p ) {
257
- display = "..." + display ;
258
+ displayParts . push ( new SymbolDisplayPart ( tokenToString ( SyntaxKind . DotDotDotToken ) , SymbolDisplayPartKind . punctuation , undefined ) ) ;
258
259
}
260
+
261
+ displayParts . push ( new SymbolDisplayPart ( p . name , SymbolDisplayPartKind . parameterName , p ) ) ;
262
+
259
263
var isOptional = ! ! ( p . valueDeclaration . flags & NodeFlags . QuestionMark ) ;
260
264
if ( isOptional ) {
261
- display += "?" ;
265
+ displayParts . push ( new SymbolDisplayPart ( tokenToString ( SyntaxKind . QuestionToken ) , SymbolDisplayPartKind . punctuation , undefined ) ) ;
262
266
}
263
- display += ": " + typeInfoResolver . typeToString ( typeInfoResolver . getTypeOfSymbol ( p ) , argumentListOrTypeArgumentList ) ;
264
- return new SignatureHelpParameter ( p . name , "" , display , isOptional ) ;
267
+
268
+ displayParts . push ( new SymbolDisplayPart ( tokenToString ( SyntaxKind . ColonToken ) , SymbolDisplayPartKind . punctuation , undefined ) ) ;
269
+ displayParts . push ( new SymbolDisplayPart ( " " , SymbolDisplayPartKind . space , undefined ) ) ;
270
+
271
+ var typeParts = typeInfoResolver . typeToDisplayParts ( typeInfoResolver . getTypeOfSymbol ( p ) , argumentListOrTypeArgumentList ) ;
272
+ displayParts . push . apply ( displayParts , typeParts ) ;
273
+
274
+ return new SignatureHelpParameter ( p . name , getSymbolDocumentationDisplayParts ( p ) , displayParts , isOptional ) ;
265
275
} ) ;
276
+
266
277
var callTargetNode = ( < CallExpression > argumentListOrTypeArgumentList . parent ) . func ;
267
278
var callTargetSymbol = typeInfoResolver . getSymbolInfo ( callTargetNode ) ;
268
- var signatureName = callTargetSymbol ? typeInfoResolver . symbolToString ( callTargetSymbol , /*enclosingDeclaration*/ undefined , /*meaning*/ undefined ) : "" ;
269
- var prefix = signatureName ;
279
+
280
+ var prefixParts = callTargetSymbol ? typeInfoResolver . symbolToDisplayParts ( callTargetSymbol , /*enclosingDeclaration*/ undefined , /*meaning*/ undefined ) : [ ] ;
281
+
282
+ var separatorParts = [
283
+ new SymbolDisplayPart ( tokenToString ( SyntaxKind . CommaToken ) , SymbolDisplayPartKind . punctuation , undefined ) ,
284
+ new SymbolDisplayPart ( " " , SymbolDisplayPartKind . space , undefined )
285
+ ] ;
286
+
270
287
// TODO(jfreeman): Constraints?
271
288
if ( candidateSignature . typeParameters && candidateSignature . typeParameters . length ) {
272
- prefix += "<" + map ( candidateSignature . typeParameters , tp => tp . symbol . name ) . join ( ", " ) + ">" ;
289
+ prefixParts . push ( new SymbolDisplayPart ( tokenToString ( SyntaxKind . LessThanToken ) , SymbolDisplayPartKind . punctuation , undefined ) ) ;
290
+
291
+ for ( var i = 0 , n = candidateSignature . typeParameters . length ; i < n ; i ++ ) {
292
+ if ( i ) {
293
+ prefixParts . push . apply ( prefixParts , separatorParts ) ;
294
+ }
295
+
296
+ var tp = candidateSignature . typeParameters [ i ] . symbol ;
297
+ prefixParts . push ( new SymbolDisplayPart ( tp . name , SymbolDisplayPartKind . typeParameterName , tp ) ) ;
298
+ }
299
+
300
+ prefixParts . push ( new SymbolDisplayPart ( tokenToString ( SyntaxKind . GreaterThanToken ) , SymbolDisplayPartKind . punctuation , undefined ) ) ;
273
301
}
274
- prefix += "(" ;
275
- var suffix = "): " + typeInfoResolver . typeToString ( candidateSignature . getReturnType ( ) , argumentListOrTypeArgumentList ) ;
276
- return new SignatureHelpItem ( candidateSignature . hasRestParameter , prefix , suffix , ", " , parameterHelpItems , "" ) ;
302
+
303
+ prefixParts . push ( new SymbolDisplayPart ( tokenToString ( SyntaxKind . OpenParenToken ) , SymbolDisplayPartKind . punctuation , undefined ) ) ;
304
+
305
+ var suffixParts = [ new SymbolDisplayPart ( tokenToString ( SyntaxKind . CloseParenToken ) , SymbolDisplayPartKind . punctuation , undefined ) ] ;
306
+ suffixParts . push ( new SymbolDisplayPart ( tokenToString ( SyntaxKind . ColonToken ) , SymbolDisplayPartKind . punctuation , undefined ) ) ;
307
+ suffixParts . push ( new SymbolDisplayPart ( " " , SymbolDisplayPartKind . space , undefined ) ) ;
308
+
309
+ var typeParts = typeInfoResolver . typeToDisplayParts ( candidateSignature . getReturnType ( ) , argumentListOrTypeArgumentList ) ;
310
+ suffixParts . push . apply ( suffixParts , typeParts ) ;
311
+
312
+ return new SignatureHelpItem ( candidateSignature . hasRestParameter , prefixParts , suffixParts , separatorParts , parameterHelpItems , null ) ;
277
313
} ) ;
314
+
278
315
var selectedItemIndex = candidates . indexOf ( bestSignature ) ;
279
316
if ( selectedItemIndex < 0 ) {
280
317
selectedItemIndex = 0 ;
@@ -339,11 +376,11 @@ module ts.SignatureHelp {
339
376
// by 2 to exclude commas. Use bit shifting in order to take the floor of the division.
340
377
var argumentIndex = indexOfNodeContainingPosition < 0 ? argumentCount - 1 : indexOfNodeContainingPosition >> 1 ;
341
378
return new SignatureHelpState ( argumentIndex , argumentCount ) ;
342
- }
343
-
344
- function getChildListThatStartsWithOpenerToken ( parent : Node , openerToken : Node , sourceFile : SourceFile ) : Node {
379
+ }
380
+
381
+ function getChildListThatStartsWithOpenerToken ( parent : Node , openerToken : Node , sourceFile : SourceFile ) : Node {
345
382
var children = parent . getChildren ( sourceFile ) ;
346
383
var indexOfOpenerToken = children . indexOf ( openerToken ) ;
347
- return children [ indexOfOpenerToken + 1 ] ;
384
+ return children [ indexOfOpenerToken + 1 ] ;
348
385
}
349
386
}
0 commit comments