@@ -432,7 +432,7 @@ export class ParameterHintsWidget implements IContentWidget, IDisposable {
432432 this . overloads . textContent = currentOverload ;
433433
434434 if ( activeParameter ) {
435- const labelToAnnounce = activeParameter . label ;
435+ const labelToAnnounce = this . getParameterLabel ( signature , this . hints . activeParameter ) ;
436436 // Select method gets called on every user type while parameter hints are visible.
437437 // We do not want to spam the user with same announcements, so we only announce if the current parameter changed.
438438
@@ -447,39 +447,41 @@ export class ParameterHintsWidget implements IContentWidget, IDisposable {
447447 }
448448
449449 private renderParameters ( parent : HTMLElement , signature : modes . SignatureInformation , currentParameter : number ) : void {
450- let end = signature . label . length ;
451- let idx = 0 ;
452- let element : HTMLSpanElement ;
453450
454- for ( let i = signature . parameters . length - 1 ; i >= 0 ; i -- ) {
455- const parameter = signature . parameters [ i ] ;
456- idx = signature . label . lastIndexOf ( parameter . label , end - 1 ) ;
451+ let [ start , end ] = this . getParameterLabelOffsets ( signature , currentParameter ) ;
457452
458- let signatureLabelOffset = 0 ;
459- let signatureLabelEnd = 0 ;
453+ let beforeSpan = document . createElement ( 'span' ) ;
454+ beforeSpan . textContent = signature . label . substring ( 0 , start ) ;
460455
461- if ( idx >= 0 ) {
462- signatureLabelOffset = idx ;
463- signatureLabelEnd = idx + parameter . label . length ;
464- }
456+ let paramSpan = document . createElement ( 'span' ) ;
457+ paramSpan . textContent = signature . label . substring ( start , end ) ;
458+ paramSpan . className = 'parameter active' ;
465459
466- // non parameter part
467- element = document . createElement ( 'span' ) ;
468- element . textContent = signature . label . substring ( signatureLabelEnd , end ) ;
469- dom . prepend ( parent , element ) ;
460+ let afterSpan = document . createElement ( 'span' ) ;
461+ afterSpan . textContent = signature . label . substring ( end ) ;
470462
471- // parameter part
472- element = document . createElement ( 'span' ) ;
473- element . className = `parameter ${ i === currentParameter ? 'active' : '' } ` ;
474- element . textContent = signature . label . substring ( signatureLabelOffset , signatureLabelEnd ) ;
475- dom . prepend ( parent , element ) ;
463+ dom . append ( parent , beforeSpan , paramSpan , afterSpan ) ;
464+ }
476465
477- end = signatureLabelOffset ;
466+ private getParameterLabel ( signature : modes . SignatureInformation , paramIdx : number ) : string {
467+ const param = signature . parameters [ paramIdx ] ;
468+ if ( typeof param . label === 'string' ) {
469+ return param . label ;
470+ } else {
471+ return signature . label . substring ( param . label [ 0 ] , param . label [ 1 ] ) ;
472+ }
473+ }
474+
475+ private getParameterLabelOffsets ( signature : modes . SignatureInformation , paramIdx : number ) : [ number , number ] {
476+ const param = signature . parameters [ paramIdx ] ;
477+ if ( Array . isArray ( param . label ) ) {
478+ return param . label ;
479+ } else {
480+ const idx = signature . label . lastIndexOf ( param . label ) ;
481+ return idx >= 0
482+ ? [ idx , idx + param . label . length ]
483+ : [ 0 , 0 ] ;
478484 }
479- // non parameter part
480- element = document . createElement ( 'span' ) ;
481- element . textContent = signature . label . substring ( 0 , end ) ;
482- dom . prepend ( parent , element ) ;
483485 }
484486
485487 // private select(position: number): void {
0 commit comments