All patches and comments are welcome. Please squash your changes to logical
commits before using git-format-patch and git-send-email to
patches@git.madduck.net.
If you'd read over the Git project's submission guidelines and adhered to them,
I'd be especially grateful.
1 " https://microsoft.github.io/language-server-protocol/specifications/specification-current/#progress
6 function! lsp#internal#work_done_progress#_enable() abort
7 if !g:lsp_work_done_progress_enabled | return | endif
9 if s:enabled | return | endif
11 let s:progress_ui = []
13 let s:Dispose = lsp#callbag#pipe(
15 \ lsp#callbag#filter({x->has_key(x, 'response') && has_key(x['response'], 'method')
16 \ && x['response']['method'] ==# '$/progress' && has_key(x['response'], 'params')
17 \ && has_key(x['response']['params'], 'value') && type(x['response']['params']['value']) == type({})}),
18 \ lsp#callbag#subscribe({'next': {x->s:handle_work_done_progress(x['server'], x['response'])}})
22 function! s:handle_work_done_progress(server, response) abort
23 let l:value = a:response['params']['value']
24 let l:token = a:response['params']['token']
32 if l:value['kind'] ==# 'end'
33 let l:new['message'] = ''
34 let l:new['percentage'] = 100
35 call filter(s:progress_ui, {_, x->x['token'] !=# l:token || x['server'] !=# a:server})
36 elseif l:value['kind'] ==# 'begin'
37 let l:new['title'] = l:value['title']
38 call filter(s:progress_ui, {_, x->x['token'] !=# l:token || x['server'] !=# a:server})
39 call insert(s:progress_ui, l:new)
40 elseif l:value['kind'] ==# 'report'
41 let l:new['message'] = get(l:value, 'message', '')
42 if has_key(l:value, 'percentage')
43 " l:value['percentage'] is uinteger in specification.
44 " But some implementation return float. (e.g. clangd11)
46 let l:new['percentage'] = float2nr(l:value['percentage'] + 0.5)
48 let l:idx = match(s:progress_ui, l:token)
49 let l:new['title'] = s:progress_ui[l:idx]['title']
50 call filter(s:progress_ui, {_, x->x['token'] !=# l:token || x['server'] !=# a:server})
51 call insert(s:progress_ui, l:new)
53 doautocmd <nomodeline> User lsp_progress_updated
56 function! lsp#internal#work_done_progress#_disable() abort
57 if !s:enabled | return | endif
59 if exists('s:Dispose')
65 let s:progress_ui = []
68 function! lsp#internal#work_done_progress#get_progress() abort