@@ -617,10 +617,81 @@ class SuggestAdapter implements modes.ISuggestSupport {
617617 }
618618}
619619
620+ class ParameterHintsAdapter implements modes . IParameterHintsSupport {
621+
622+ private _documents : PluginHostModelService ;
623+ private _provider : vscode . SignatureHelpProvider ;
624+
625+ constructor ( documents : PluginHostModelService , provider : vscode . SignatureHelpProvider ) {
626+ this . _documents = documents ;
627+ this . _provider = provider ;
628+ }
629+
630+ getParameterHints ( resource : URI , position : IPosition , triggerCharacter ?: string ) : TPromise < modes . IParameterHints > {
631+
632+ const doc = this . _documents . getDocument ( resource ) ;
633+ const pos = TypeConverters . toPosition ( position ) ;
634+
635+ return asWinJsPromise ( token => this . _provider . provideSignatureHelp ( doc , pos , token ) ) . then ( value => {
636+ if ( value instanceof SignatureHelp ) {
637+ return ParameterHintsAdapter . _convertSignatureHelp ( value ) ;
638+ }
639+ } ) ;
640+ }
641+
642+ private static _convertSignatureHelp ( signatureHelp : SignatureHelp ) : modes . IParameterHints {
643+
644+ let result : modes . IParameterHints = {
645+ currentSignature : signatureHelp . activeSignature ,
646+ currentParameter : signatureHelp . activeParameter ,
647+ signatures : [ ]
648+ }
649+
650+ for ( let signature of signatureHelp . signatures ) {
651+
652+ let signatureItem : modes . ISignature = {
653+ label : signature . label ,
654+ documentation : signature . documentation ,
655+ parameters : [ ]
656+ } ;
657+
658+ let idx = 0 ;
659+ for ( let parameter of signature . parameters ) {
660+
661+ let parameterItem : modes . IParameter = {
662+ label : parameter . label ,
663+ documentation : parameter . documentation ,
664+ } ;
665+
666+ signatureItem . parameters . push ( parameterItem ) ;
667+ idx = signature . label . indexOf ( parameter . label , idx ) ;
668+
669+ if ( idx >= 0 ) {
670+ parameterItem . signatureLabelOffset = idx ;
671+ idx += parameter . label . length ;
672+ parameterItem . signatureLabelEnd = idx ;
673+ }
674+ }
675+
676+ result . signatures . push ( signatureItem ) ;
677+ }
678+
679+ return result ;
680+ }
681+
682+ getParameterHintsTriggerCharacters ( ) : string [ ] {
683+ throw new Error ( 'illegal state' ) ;
684+ }
685+
686+ shouldTriggerParameterHints ( context : modes . ILineContext , offset : number ) : boolean {
687+ throw new Error ( 'illegal state' ) ;
688+ }
689+ }
690+
620691type Adapter = OutlineAdapter | CodeLensAdapter | DeclarationAdapter | ExtraInfoAdapter
621692 | OccurrencesAdapter | ReferenceAdapter | QuickFixAdapter | DocumentFormattingAdapter
622693 | RangeFormattingAdapter | OnTypeFormattingAdapter | NavigateTypeAdapter | RenameAdapter
623- | SuggestAdapter ;
694+ | SuggestAdapter | ParameterHintsAdapter ;
624695
625696@Remotable . PluginHostContext ( 'ExtHostLanguageFeatures' )
626697export class ExtHostLanguageFeatures {
@@ -833,6 +904,19 @@ export class ExtHostLanguageFeatures {
833904 $getSuggestionDetails ( handle : number , resource : URI , position : IPosition , suggestion : modes . ISuggestion ) : TPromise < modes . ISuggestion > {
834905 return this . _withAdapter ( handle , SuggestAdapter , adapter => adapter . getSuggestionDetails ( resource , position , suggestion ) ) ;
835906 }
907+
908+ // --- parameter hints
909+
910+ registerSignatureHelpProvider ( selector : vscode . DocumentSelector , provider : vscode . SignatureHelpProvider , triggerCharacters : string [ ] ) : vscode . Disposable {
911+ const handle = this . _nextHandle ( ) ;
912+ this . _adapter [ handle ] = new ParameterHintsAdapter ( this . _documents , provider ) ;
913+ this . _proxy . $registerParameterHintsSupport ( handle , selector , triggerCharacters ) ;
914+ return this . _createDisposable ( handle ) ;
915+ }
916+
917+ $getParameterHints ( handle : number , resource : URI , position : IPosition , triggerCharacter ?: string ) : TPromise < modes . IParameterHints > {
918+ return this . _withAdapter ( handle , ParameterHintsAdapter , adapter => adapter . getParameterHints ( resource , position , triggerCharacter ) ) ;
919+ }
836920}
837921
838922@Remotable . MainContext ( 'MainThreadLanguageFeatures' )
@@ -1030,4 +1114,21 @@ export class MainThreadLanguageFeatures {
10301114 } ) ;
10311115 return undefined ;
10321116 }
1117+
1118+ // --- parameter hints
1119+
1120+ $registerParameterHintsSupport ( handle : number , selector : vscode . DocumentSelector , triggerCharacter : string [ ] ) : TPromise < any > {
1121+ this . _registrations [ handle ] = ParameterHintsRegistry . register ( selector , < modes . IParameterHintsSupport > {
1122+ getParameterHints : ( resource : URI , position : IPosition , triggerCharacter ?: string ) : TPromise < modes . IParameterHints > => {
1123+ return this . _proxy . $getParameterHints ( handle , resource , position , triggerCharacter ) ;
1124+ } ,
1125+ getParameterHintsTriggerCharacters ( ) : string [ ] {
1126+ return triggerCharacter ;
1127+ } ,
1128+ shouldTriggerParameterHints ( context : modes . ILineContext , offset : number ) : boolean {
1129+ return true ;
1130+ }
1131+ } ) ;
1132+ return undefined ;
1133+ }
10331134}
0 commit comments