Files
vim-lsp-mirror/autoload/lsp/internal/document_hover/under_cursor.vim
2021-04-27 12:13:46 +09:00

54 lines
1.9 KiB
VimL

" https://microsoft.github.io/language-server-protocol/specification#textDocument_hover
" options - {
" server - 'server_name' " optional
" }
function! lsp#internal#document_hover#under_cursor#do(options) abort
let l:bufnr = bufnr('%')
if has_key(a:options, 'server')
let l:servers = [a:options['server']]
else
let l:servers = filter(lsp#get_allowed_servers(), 'lsp#capabilities#has_hover_provider(v:val)')
endif
if len(l:servers) == 0
let l:filetype = getbufvar(l:bufnr, '&filetype')
call lsp#utils#error('textDocument/hover not supported for ' . l:filetype)
return
endif
redraw | echo 'Retrieving hover ...'
call lsp#_new_command()
" TODO: ask user to select server for formatting if there are multiple servers
let l:request = {
\ 'method': 'textDocument/hover',
\ 'params': {
\ 'textDocument': lsp#get_text_document_identifier(),
\ 'position': lsp#get_position(),
\ },
\ }
call lsp#callbag#pipe(
\ lsp#callbag#fromList(l:servers),
\ lsp#callbag#flatMap({server->
\ lsp#request(server, l:request)
\ }),
\ lsp#callbag#tap({x->s:show_hover(x['server_name'], x['request'], x['response'])}),
\ lsp#callbag#takeUntil(lsp#callbag#pipe(
\ lsp#stream(),
\ lsp#callbag#filter({x->has_key(x, 'command')}),
\ )),
\ lsp#callbag#subscribe(),
\ )
endfunction
function! s:show_hover(server_name, request, response) abort
if !has_key(a:response, 'result') || empty(a:response['result']) ||
\ empty(a:response['result']['contents'])
call lsp#utils#error('No hover information found in server - ' . a:server_name)
return
endif
call lsp#ui#vim#output#preview(a:server_name, a:response['result']['contents'], {'statusline': ' LSP Hover'})
endfunction