]> git.madduck.net Git - etc/vim.git/blob - .vim/bundle/vim-lsp/autoload/lsp/internal/work_done_progress.vim

madduck's git repository

Every one of the projects in this repository is available at the canonical URL git://git.madduck.net/madduck/pub/<projectpath> — see each project's metadata for the exact URL.

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.

SSH access, as well as push access can be individually arranged.

If you use my repositories frequently, consider adding the following snippet to ~/.gitconfig and using the third clone URL listed for each project:

[url "git://git.madduck.net/madduck/"]
  insteadOf = madduck:

Merge commit 'a39f715c13be3352193ffd9c5b7536b8786eff64' as '.vim/bundle/vim-lsp'
[etc/vim.git] / .vim / bundle / vim-lsp / autoload / lsp / internal / work_done_progress.vim
1 " https://microsoft.github.io/language-server-protocol/specifications/specification-current/#progress
2
3 let s:progress_ui = []
4 let s:enabled = 0
5
6 function! lsp#internal#work_done_progress#_enable() abort
7     if !g:lsp_work_done_progress_enabled | return | endif
8
9     if s:enabled | return | endif
10     let s:enabled = 1
11     let s:progress_ui = []
12
13     let s:Dispose = lsp#callbag#pipe(
14           \ lsp#stream(),
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'])}})
19           \ )
20 endfunction
21
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']
25     let l:new = {
26       \ 'server': a:server,
27       \ 'token': l:token,
28       \ 'title': '',
29       \ 'message': '',
30       \ }
31
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)
45             " So we round it.
46             let l:new['percentage'] = float2nr(l:value['percentage'] + 0.5)
47         endif
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)
52     endif
53     doautocmd <nomodeline> User lsp_progress_updated
54 endfunction
55
56 function! lsp#internal#work_done_progress#_disable() abort
57     if !s:enabled | return | endif
58
59     if exists('s:Dispose')
60         call s:Dispose()
61         unlet s:Dispose
62     endif
63
64     let s:enabled = 0
65     let s:progress_ui = []
66 endfunction
67
68 function! lsp#internal#work_done_progress#get_progress() abort
69     return s:progress_ui
70 endfunction