Skip to content

Commit b68bc8b

Browse files
hrsh7ththomasfaingnaert
authored andcommitted
Highlight active parameter in signatureHelp (#497)
* Highlight active parameter in signatureHelp * Support `[number, number]` form of parameter label. * Support parameter's documentation. * Fix extracting parameter label
1 parent e748025 commit b68bc8b

File tree

1 file changed

+61
-2
lines changed

1 file changed

+61
-2
lines changed

autoload/lsp/ui/vim/signature_help.vim

Lines changed: 61 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -38,11 +38,43 @@ function! s:handle_signature_help(server, data) abort
3838
endif
3939

4040
if !empty(a:data['response']['result']) && !empty(a:data['response']['result']['signatures'])
41-
let l:signature = a:data['response']['result']['signatures'][0]
42-
let l:contents = [l:signature['label']]
41+
" Get current signature.
42+
let l:signatures = get(a:data['response']['result'], 'signatures', [])
43+
let l:signature_index = get(a:data['response']['result'], 'activeSignature', 0)
44+
let l:signature = get(l:signatures, l:signature_index, {})
45+
if empty(l:signature)
46+
return
47+
endif
48+
49+
" Signature label.
50+
let l:label = l:signature['label']
51+
52+
" Mark current parameter.
53+
if has_key(a:data['response']['result'], 'activeParameter')
54+
let l:parameters = get(l:signature, 'parameters', [])
55+
let l:parameter_index = a:data['response']['result']['activeParameter']
56+
let l:parameter = get(l:parameters, l:parameter_index, {})
57+
let l:parameter_label = s:get_parameter_label(l:signature, l:parameter)
58+
if !empty(l:parameter_label)
59+
let l:label = substitute(l:label, '\V\(' . escape(l:parameter_label, '\/?') . '\)', '`\1`', 'g')
60+
endif
61+
endif
62+
63+
let l:contents = [l:label]
64+
65+
if exists('l:parameter')
66+
let l:parameter_doc = s:get_parameter_doc(l:parameter)
67+
if !empty(l:parameter_doc)
68+
call add(l:contents, '')
69+
call add(l:contents, l:parameter_doc)
70+
call add(l:contents, '')
71+
endif
72+
endif
73+
4374
if has_key(l:signature, 'documentation')
4475
call add(l:contents, l:signature['documentation'])
4576
endif
77+
4678
call lsp#ui#vim#output#preview(a:server, l:contents, {'statusline': ' LSP SignatureHelp'})
4779
return
4880
else
@@ -51,6 +83,33 @@ function! s:handle_signature_help(server, data) abort
5183
endif
5284
endfunction
5385

86+
function! s:get_parameter_label(signature, parameter) abort
87+
if has_key(a:parameter, 'label')
88+
if type(a:parameter['label']) == v:t_list
89+
let l:string_range = a:parameter['label']
90+
return strcharpart(
91+
\ a:signature['label'],
92+
\ l:string_range[0],
93+
\ l:string_range[1] - l:string_range[0])
94+
endif
95+
return a:parameter['label']
96+
endif
97+
return ''
98+
endfunction
99+
100+
function! s:get_parameter_doc(parameter) abort
101+
if !has_key(a:parameter, 'documentation')
102+
return ''
103+
endif
104+
105+
if type(a:parameter['documentation']) == v:t_dict
106+
let l:doc = copy(a:parameter['documentation'])
107+
let l:doc['value'] = printf('***%s*** - %s', a:parameter['label'], l:doc['value'])
108+
return l:doc
109+
endif
110+
return printf('***%s*** - %s', a:parameter['label'], l:doc)
111+
endfunction
112+
54113
function! s:insert_char_pre() abort
55114
let l:buf = bufnr('%')
56115
for l:server_name in lsp#get_whitelisted_servers(l:buf)

0 commit comments

Comments
 (0)