mirror of
https://github.com/prabirshrestha/vim-lsp.git
synced 2025-12-14 20:35:59 +01:00
101 lines
3.2 KiB
VimL
101 lines
3.2 KiB
VimL
" vint: -ProhibitUnusedVariable
|
|
|
|
"
|
|
" @param option = {
|
|
" sync: v:true | v:false = Specify enable synchronous request.
|
|
" }
|
|
"
|
|
function! lsp#ui#vim#code_lens#do(option) abort
|
|
let l:sync = get(a:option, 'sync', v:false)
|
|
|
|
let l:server_names = filter(lsp#get_allowed_servers(), 'lsp#capabilities#has_code_lens_provider(v:val)')
|
|
if len(l:server_names) == 0
|
|
return lsp#utils#error('Code lens not supported for ' . &filetype)
|
|
endif
|
|
|
|
let l:ctx = {
|
|
\ 'count': len(l:server_names),
|
|
\ 'results': [],
|
|
\}
|
|
let l:bufnr = bufnr('%')
|
|
let l:command_id = lsp#_new_command()
|
|
for l:server_name in l:server_names
|
|
call lsp#send_request(l:server_name, {
|
|
\ 'method': 'textDocument/codeLens',
|
|
\ 'params': {
|
|
\ 'textDocument': lsp#get_text_document_identifier(),
|
|
\ },
|
|
\ 'sync': l:sync,
|
|
\ 'on_notification': function('s:handle_code_lens', [l:ctx, l:server_name, l:command_id, l:sync, l:bufnr]),
|
|
\ })
|
|
endfor
|
|
echo 'Retrieving code lenses ...'
|
|
endfunction
|
|
|
|
function! s:handle_code_lens(ctx, server_name, command_id, sync, bufnr, data) abort
|
|
" Ignore old request.
|
|
if a:command_id != lsp#_last_command()
|
|
return
|
|
endif
|
|
|
|
call add(a:ctx['results'], {
|
|
\ 'server_name': a:server_name,
|
|
\ 'data': a:data,
|
|
\})
|
|
let a:ctx['count'] -= 1
|
|
if a:ctx['count'] ># 0
|
|
return
|
|
endif
|
|
|
|
let l:total_code_lenses = []
|
|
for l:result in a:ctx['results']
|
|
let l:server_name = l:result['server_name']
|
|
let l:data = l:result['data']
|
|
" Check response error.
|
|
if lsp#client#is_error(l:data['response'])
|
|
call lsp#utils#error('Failed to CodeLens for ' . l:server_name . ': ' . lsp#client#error_message(l:data['response']))
|
|
continue
|
|
endif
|
|
|
|
" Check code lenses.
|
|
let l:code_lenses = l:data['response']['result']
|
|
if empty(l:code_lenses)
|
|
continue
|
|
endif
|
|
|
|
for l:code_lens in l:code_lenses
|
|
call add(l:total_code_lenses, {
|
|
\ 'server_name': l:server_name,
|
|
\ 'code_lens': l:code_lens,
|
|
\})
|
|
endfor
|
|
endfor
|
|
|
|
if len(l:total_code_lenses) == 0
|
|
echo 'No code lenses found'
|
|
return
|
|
endif
|
|
call lsp#log('s:handle_code_lens', l:total_code_lenses)
|
|
|
|
" Prompt to choose code lenses.
|
|
let l:index = inputlist(map(copy(l:total_code_lenses), { i, lens ->
|
|
\ printf('%s - [%s] %s', i + 1, lens['server_name'], lens['code_lens']['command']['title'])
|
|
\ }))
|
|
|
|
" Execute code lens.
|
|
if 0 < l:index && l:index <= len(l:total_code_lenses)
|
|
let l:selected = l:total_code_lenses[l:index - 1]
|
|
call s:handle_one_code_lens(l:selected['server_name'], a:sync, a:bufnr, l:selected['code_lens'])
|
|
endif
|
|
endfunction
|
|
|
|
function! s:handle_one_code_lens(server_name, sync, bufnr, code_lens) abort
|
|
call lsp#ui#vim#execute_command#_execute({
|
|
\ 'server_name': a:server_name,
|
|
\ 'command_name': get(a:code_lens['command'], 'command', ''),
|
|
\ 'command_args': get(a:code_lens['command'], 'arguments', v:null),
|
|
\ 'sync': a:sync,
|
|
\ 'bufnr': a:bufnr,
|
|
\ })
|
|
endfunction
|