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.
2 call ale#test#SetDirectory('/testplugin/test')
3 call ale#test#SetFilename('dummy.txt')
5 Save g:ale_default_navigation
7 let g:old_filename = expand('%:p')
10 let g:message_list = []
11 let g:preview_called = 0
14 let g:capability_checked = ''
15 let g:conn_id = v:null
16 let g:InitCallback = v:null
17 let g:ale_default_navigation = 'buffer'
19 runtime autoload/ale/lsp_linter.vim
20 runtime autoload/ale/lsp.vim
21 runtime autoload/ale/util.vim
22 runtime autoload/ale/preview.vim
24 function! ale#lsp_linter#StartLSP(buffer, linter, Callback) abort
25 let g:conn_id = ale#lsp#Register('executable', '/foo/bar', '', {})
26 call ale#lsp#MarkDocumentAsOpen(g:conn_id, a:buffer)
28 if a:linter.lsp is# 'tsserver'
29 call ale#lsp#MarkConnectionAsTsserver(g:conn_id)
33 \ 'command': 'foobar',
35 \ 'connection_id': g:conn_id,
36 \ 'project_root': '/foo/bar',
39 let g:InitCallback = {-> ale#lsp_linter#OnInit(a:linter, l:details, a:Callback)}
42 function! ale#lsp#HasCapability(conn_id, capability) abort
43 let g:capability_checked = a:capability
48 function! ale#lsp#RegisterCallback(conn_id, callback) abort
49 let g:Callback = a:callback
52 function! ale#lsp#Send(conn_id, message) abort
53 call add(g:message_list, a:message)
58 function! ale#util#Execute(expr) abort
59 call add(g:expr_list, a:expr)
62 function! ale#preview#ShowSelection(item_list, options) abort
63 let g:preview_called = 1
64 let g:item_list = a:item_list
65 let g:options = a:options
67 call ale#preview#SetLastSelection(a:item_list, a:options)
73 if g:conn_id isnot v:null
74 call ale#lsp#RemoveConnectionWithID(g:conn_id)
77 call ale#references#SetMap({})
78 call ale#test#RestoreDirectory()
79 call ale#linter#Reset()
81 unlet! g:capability_checked
91 unlet! g:preview_called
93 runtime autoload/ale/lsp_linter.vim
94 runtime autoload/ale/lsp.vim
95 runtime autoload/ale/util.vim
96 runtime autoload/ale/preview.vim
98 Execute(Other messages for the tsserver handler should be ignored):
99 call ale#references#HandleTSServerResponse(1, {'command': 'foo'})
101 Execute(Failed reference responses should be handled correctly):
102 call ale#references#SetMap({3: {}})
103 call ale#references#HandleTSServerResponse(
105 \ {'command': 'references', 'request_seq': 3}
107 AssertEqual {}, ale#references#GetMap()
109 Given typescript(Some typescript file):
114 Execute(Results should be shown for tsserver responses):
115 " We should remember these options when we repeat the selection.
116 call ale#references#SetMap(
121 \ 'use_relative_paths': 1,
125 call ale#references#HandleTSServerResponse(1, {
126 \ 'command': 'references',
130 \ 'symbolStartOffset': 9,
133 \ 'file': '/foo/bar/app.ts',
134 \ 'isWriteAccess': v:true,
135 \ 'lineText': 'import {doSomething} from ''./whatever''',
136 \ 'end': {'offset': 24, 'line': 9},
137 \ 'start': {'offset': 9, 'line': 9},
138 \ 'isDefinition': v:true,
141 \ 'file': '/foo/bar/app.ts',
142 \ 'isWriteAccess': v:false,
143 \ 'lineText': ' doSomething()',
144 \ 'end': {'offset': 18, 'line': 804},
145 \ 'start': {'offset': 3, 'line': 804},
146 \ 'isDefinition': v:false,
149 \ 'file': '/foo/bar/other/app.ts',
150 \ 'isWriteAccess': v:false,
151 \ 'lineText': ' doSomething()',
152 \ 'end': {'offset': 18, 'line': 51},
153 \ 'start': {'offset': 3, 'line': 51},
154 \ 'isDefinition': v:false,
157 \ 'symbolDisplayString': 'import doSomething',
158 \ 'symbolName': 'doSomething()',
164 \ {'filename': '/foo/bar/app.ts', 'column': 9, 'line': 9, 'match': 'import {doSomething} from ''./whatever'''},
165 \ {'filename': '/foo/bar/app.ts', 'column': 3, 'line': 804, 'match': 'doSomething()'},
166 \ {'filename': '/foo/bar/other/app.ts', 'column': 3, 'line': 51, 'match': 'doSomething()'},
169 AssertEqual {}, ale#references#GetMap()
171 " We should be able to repeat selections with ALERepeatSelection
177 \ {'filename': '/foo/bar/app.ts', 'column': 9, 'line': 9, 'match': 'import {doSomething} from ''./whatever'''},
178 \ {'filename': '/foo/bar/app.ts', 'column': 3, 'line': 804, 'match': 'doSomething()'},
179 \ {'filename': '/foo/bar/other/app.ts', 'column': 3, 'line': 51, 'match': 'doSomething()'},
182 AssertEqual {}, ale#references#GetMap()
186 \ 'use_relative_paths': 1,
190 Execute(Results should be put to quickfix for tsserver responses):
191 call ale#references#SetMap(
195 \ 'open_in': 'quickfix',
199 call ale#references#HandleTSServerResponse(1, {
200 \ 'command': 'references',
204 \ 'symbolStartOffset': 9,
207 \ 'file': '/foo/bar/app.ts',
208 \ 'isWriteAccess': v:true,
209 \ 'lineText': 'import {doSomething} from ''./whatever''',
210 \ 'end': {'offset': 24, 'line': 9},
211 \ 'start': {'offset': 9, 'line': 9},
212 \ 'isDefinition': v:true,
215 \ 'file': '/foo/bar/app.ts',
216 \ 'isWriteAccess': v:false,
217 \ 'lineText': ' doSomething()',
218 \ 'end': {'offset': 18, 'line': 804},
219 \ 'start': {'offset': 3, 'line': 804},
220 \ 'isDefinition': v:false,
223 \ 'file': '/foo/bar/other/app.ts',
224 \ 'isWriteAccess': v:false,
225 \ 'lineText': ' doSomething()',
226 \ 'end': {'offset': 18, 'line': 51},
227 \ 'start': {'offset': 3, 'line': 51},
228 \ 'isDefinition': v:false,
231 \ 'symbolDisplayString': 'import doSomething',
232 \ 'symbolName': 'doSomething()',
239 AssertEqual {}, ale#references#GetMap()
241 Execute(The preview window should not be opened for empty tsserver responses):
242 call ale#references#SetMap({3: {}})
243 call ale#references#HandleTSServerResponse(1, {
244 \ 'command': 'references',
248 \ 'symbolStartOffset': 9,
251 \ 'symbolDisplayString': 'import doSomething',
252 \ 'symbolName': 'doSomething()',
256 Assert !g:preview_called
257 AssertEqual {}, ale#references#GetMap()
258 AssertEqual ['echom ''No references found.'''], g:expr_list
260 Execute(tsserver reference requests should be sent):
261 call ale#linter#Reset()
263 runtime ale_linters/typescript/tsserver.vim
264 call setpos('.', [bufnr(''), 2, 5, 0])
268 " We shouldn't register the callback yet.
269 AssertEqual '''''', string(g:Callback)
271 AssertEqual type(function('type')), type(g:InitCallback)
272 call g:InitCallback()
274 AssertEqual 'references', g:capability_checked
276 \ 'function(''ale#references#HandleTSServerResponse'')',
280 \ ale#lsp#tsserver_message#Change(bufnr('')),
281 \ [0, 'ts@references', {'file': expand('%:p'), 'line': 2, 'offset': 5}]
284 AssertEqual {'42': {'open_in': 'current-buffer', 'use_relative_paths': 0}}, ale#references#GetMap()
286 Execute('-relative' argument should enable 'use_relative_paths' in HandleTSServerResponse):
287 runtime ale_linters/typescript/tsserver.vim
288 call setpos('.', [bufnr(''), 2, 5, 0])
290 ALEFindReferences -relative
292 call g:InitCallback()
294 AssertEqual {'42': {'open_in': 'current-buffer', 'use_relative_paths': 1}}, ale#references#GetMap()
296 Execute(`-tab` should display results in tabs):
297 runtime ale_linters/typescript/tsserver.vim
298 call setpos('.', [bufnr(''), 2, 5, 0])
300 ALEFindReferences -tab
302 call g:InitCallback()
304 AssertEqual {'42': {'open_in': 'tab', 'use_relative_paths': 0}}, ale#references#GetMap()
306 Execute(The default navigation type should be used):
307 runtime ale_linters/typescript/tsserver.vim
308 call setpos('.', [bufnr(''), 2, 5, 0])
310 let g:ale_default_navigation = 'tab'
313 call g:InitCallback()
315 AssertEqual {'42': {'open_in': 'tab', 'use_relative_paths': 0}}, ale#references#GetMap()
317 Execute(`-split` should display results in splits):
318 runtime ale_linters/typescript/tsserver.vim
319 call setpos('.', [bufnr(''), 2, 5, 0])
321 ALEFindReferences -split
323 call g:InitCallback()
325 AssertEqual {'42': {'open_in': 'split', 'use_relative_paths': 0}}, ale#references#GetMap()
327 Execute(`-vsplit` should display results in vsplits):
328 runtime ale_linters/typescript/tsserver.vim
329 call setpos('.', [bufnr(''), 2, 5, 0])
331 ALEFindReferences -vsplit
333 call g:InitCallback()
335 AssertEqual {'42': {'open_in': 'vsplit', 'use_relative_paths': 0}}, ale#references#GetMap()
337 Execute(`-quickfix` should display results in quickfix):
338 runtime ale_linters/typescript/tsserver.vim
339 call setpos('.', [bufnr(''), 2, 5, 0])
341 ALEFindReferences -quickfix
343 call g:InitCallback()
345 AssertEqual {'42': {'open_in': 'quickfix', 'use_relative_paths': 0}}, ale#references#GetMap()
347 Given python(Some Python file):
352 Execute(LSP reference responses should be handled):
353 call ale#references#SetMap({3: {}})
354 call ale#references#HandleLSPResponse(
360 \ 'uri': ale#path#ToFileURI(ale#path#Simplify(g:dir . '/completion_dummy_file')),
362 \ 'start': {'line': 2, 'character': 7},
366 \ 'uri': ale#path#ToFileURI(ale#path#Simplify(g:dir . '/other_file')),
368 \ 'start': {'line': 7, 'character': 15},
378 \ 'filename': ale#path#Simplify(g:dir . '/completion_dummy_file'),
383 \ 'filename': ale#path#Simplify(g:dir . '/other_file'),
389 AssertEqual {}, ale#references#GetMap()
391 Execute(LSP reference responses should be put to quickfix):
392 call ale#references#SetMap({3: { 'open_in': 'quickfix' }})
393 call ale#references#HandleLSPResponse(
399 \ 'uri': ale#path#ToFileURI(ale#path#Simplify(g:dir . '/completion_dummy_file')),
401 \ 'start': {'line': 2, 'character': 7},
405 \ 'uri': ale#path#ToFileURI(ale#path#Simplify(g:dir . '/other_file')),
407 \ 'start': {'line': 7, 'character': 15},
418 Execute(Preview windows should not be opened for empty LSP reference responses):
419 call ale#references#SetMap({3: {}})
420 call ale#references#HandleLSPResponse(1, {'id': 3, 'result': []})
422 Assert !g:preview_called
423 AssertEqual {}, ale#references#GetMap()
424 AssertEqual ['echom ''No references found.'''], g:expr_list
426 Execute(LSP reference responses with a null result should be handled):
427 call ale#references#SetMap({3: {}})
428 call ale#references#HandleLSPResponse(1, {'id': 3, 'result': v:null})
430 Assert !g:preview_called
431 AssertEqual {}, ale#references#GetMap()
432 AssertEqual ['echom ''No references found.'''], g:expr_list
434 Execute(LSP reference requests should be sent):
435 runtime ale_linters/python/pylsp.vim
436 let b:ale_linters = ['pylsp']
437 call setpos('.', [bufnr(''), 1, 5, 0])
441 " We shouldn't register the callback yet.
442 AssertEqual '''''', string(g:Callback)
444 AssertEqual type(function('type')), type(g:InitCallback)
445 call g:InitCallback()
447 AssertEqual 'references', g:capability_checked
449 \ 'function(''ale#references#HandleLSPResponse'')',
454 \ [1, 'textDocument/didChange', {
456 \ 'uri': ale#path#ToFileURI(expand('%:p')),
457 \ 'version': g:ale_lsp_next_version_id - 1,
459 \ 'contentChanges': [{'text': join(getline(1, '$'), "\n") . "\n"}]
461 \ [0, 'textDocument/references', {
462 \ 'textDocument': {'uri': ale#path#ToFileURI(expand('%:p'))},
463 \ 'position': {'line': 0, 'character': 2},
464 \ 'context': {'includeDeclaration': v:false},
469 AssertEqual {'42': {'open_in': 'current-buffer', 'use_relative_paths': 0}}, ale#references#GetMap()
471 Execute('-relative' argument should enable 'use_relative_paths' in HandleLSPResponse):
472 runtime ale_linters/python/pylsp.vim
473 let b:ale_linters = ['pylsp']
474 call setpos('.', [bufnr(''), 1, 5, 0])
476 ALEFindReferences -relative
478 call g:InitCallback()
480 AssertEqual {'42': {'open_in': 'current-buffer', 'use_relative_paths': 1}}, ale#references#GetMap()