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 function! s:severity_of(diagnostic) abort
2 return get(a:diagnostic, 'severity', 1)
5 function! lsp#internal#diagnostics#movement#_next_error(...) abort
6 let l:diagnostics = filter(s:get_all_buffer_diagnostics(),
7 \ {_, diagnostic -> s:severity_of(diagnostic) ==# 1 })
8 let l:options = lsp#utils#parse_command_options(a:000)
9 call s:next_diagnostic(l:diagnostics, l:options)
12 function! lsp#internal#diagnostics#movement#_next_warning(...) abort
13 let l:diagnostics = filter(s:get_all_buffer_diagnostics(),
14 \ {_, diagnostic -> s:severity_of(diagnostic) ==# 2 })
15 let l:options = lsp#utils#parse_command_options(a:000)
16 call s:next_diagnostic(l:diagnostics, l:options)
19 function! lsp#internal#diagnostics#movement#_next_diagnostics(...) abort
20 let l:options = lsp#utils#parse_command_options(a:000)
21 call s:next_diagnostic(s:get_all_buffer_diagnostics(), l:options)
24 function! s:next_diagnostic(diagnostics, options) abort
25 if !len(a:diagnostics)
28 call sort(a:diagnostics, 's:compare_diagnostics')
31 if has_key(a:options, 'wrap')
32 let l:wrap = a:options['wrap']
35 let l:view = winsaveview()
38 for l:diagnostic in a:diagnostics
39 let [l:line, l:col] = lsp#utils#position#lsp_to_vim('%', l:diagnostic['range']['start'])
40 if l:line > l:view['lnum']
41 \ || (l:line == l:view['lnum'] && l:col > l:view['col'] + 1)
42 let l:next_line = l:line
43 let l:next_col = l:col - 1
53 let [l:next_line, l:next_col] = lsp#utils#position#lsp_to_vim('%', a:diagnostics[0]['range']['start'])
57 let l:view['lnum'] = l:next_line
58 let l:view['col'] = l:next_col
59 let l:view['topline'] = 1
60 let l:height = winheight(0)
61 let l:totalnum = line('$')
62 if l:totalnum > l:height
63 let l:half = l:height / 2
64 if l:totalnum - l:half < l:view['lnum']
65 let l:view['topline'] = l:totalnum - l:height + 1
67 let l:view['topline'] = l:view['lnum'] - l:half
70 call winrestview(l:view)
73 function! lsp#internal#diagnostics#movement#_previous_error(...) abort
74 let l:diagnostics = filter(s:get_all_buffer_diagnostics(),
75 \ {_, diagnostic -> s:severity_of(diagnostic) ==# 1 })
76 let l:options = lsp#utils#parse_command_options(a:000)
77 call s:previous_diagnostic(l:diagnostics, l:options)
80 function! lsp#internal#diagnostics#movement#_previous_warning(...) abort
81 let l:options = lsp#utils#parse_command_options(a:000)
82 let l:diagnostics = filter(s:get_all_buffer_diagnostics(),
83 \ {_, diagnostic -> s:severity_of(diagnostic) ==# 2 })
84 call s:previous_diagnostic(l:diagnostics, l:options)
87 function! lsp#internal#diagnostics#movement#_previous_diagnostics(...) abort
88 let l:options = lsp#utils#parse_command_options(a:000)
89 call s:previous_diagnostic(s:get_all_buffer_diagnostics(), l:options)
92 function! s:previous_diagnostic(diagnostics, options) abort
93 if !len(a:diagnostics)
96 call sort(a:diagnostics, 's:compare_diagnostics')
99 if has_key(a:options, 'wrap')
100 let l:wrap = a:options['wrap']
103 let l:view = winsaveview()
106 let l:index = len(a:diagnostics) - 1
108 let [l:line, l:col] = lsp#utils#position#lsp_to_vim('%', a:diagnostics[l:index]['range']['start'])
109 if l:line < l:view['lnum']
110 \ || (l:line == l:view['lnum'] && l:col < l:view['col'])
111 let l:next_line = l:line
112 let l:next_col = l:col - 1
115 let l:index = l:index - 1
123 let [l:next_line, l:next_col] = lsp#utils#position#lsp_to_vim('%', a:diagnostics[-1]['range']['start'])
127 let l:view['lnum'] = l:next_line
128 let l:view['col'] = l:next_col
129 let l:view['topline'] = 1
130 let l:height = winheight(0)
131 let l:totalnum = line('$')
132 if l:totalnum > l:height
133 let l:half = l:height / 2
134 if l:totalnum - l:half < l:view['lnum']
135 let l:view['topline'] = l:totalnum - l:height + 1
137 let l:view['topline'] = l:view['lnum'] - l:half
140 call winrestview(l:view)
143 function! s:get_diagnostics(uri) abort
144 if has_key(s:diagnostics, a:uri)
145 return [1, s:diagnostics[a:uri]]
148 " vim in windows always uses upper case for drive letter, so use lowercase in case lang server uses lowercase
149 " https://github.com/theia-ide/typescript-language-server/issues/23
150 let l:uri = substitute(a:uri, '^' . a:uri[:8], tolower(a:uri[:8]), '')
151 if has_key(s:diagnostics, l:uri)
152 return [1, s:diagnostics[l:uri]]
159 " Get diagnostics for the current buffer URI from all servers
160 function! s:get_all_buffer_diagnostics(...) abort
161 let l:server = get(a:000, 0, '')
163 let l:bufnr = bufnr('%')
164 let l:uri = lsp#utils#get_buffer_uri(l:bufnr)
166 if !lsp#internal#diagnostics#state#_is_enabled_for_buffer(l:bufnr)
170 let l:diagnostics_by_server = lsp#internal#diagnostics#state#_get_all_diagnostics_grouped_by_server_for_uri(l:uri)
171 let l:diagnostics = []
173 for l:item in values(l:diagnostics_by_server)
174 let l:diagnostics += lsp#utils#iteratable(l:item['params']['diagnostics'])
177 if has_key(l:diagnostics_by_server, l:server)
178 let l:diagnostics = lsp#utils#iteratable(l:diagnostics_by_server[l:server]['params']['diagnostics'])
185 function! s:compare_diagnostics(d1, d2) abort
186 let l:range1 = a:d1['range']
187 let l:line1 = l:range1['start']['line'] + 1
188 let l:col1 = l:range1['start']['character'] + 1
189 let l:range2 = a:d2['range']
190 let l:line2 = l:range2['start']['line'] + 1
191 let l:col2 = l:range2['start']['character'] + 1
193 if l:line1 == l:line2
194 return l:col1 == l:col2 ? 0 : l:col1 > l:col2 ? 1 : -1
196 return l:line1 > l:line2 ? 1 : -1