mirror of
https://github.com/dense-analysis/ale.git
synced 2025-12-06 12:44:23 +08:00
Change logic so ALE's LSP implementation and the Neovim LSP client retrieve the language_id for language clients at roughly the same time via the same means. This makes ALE inform the language server what the language for the language is for clients.
177 lines
5.0 KiB
Plaintext
177 lines
5.0 KiB
Plaintext
Before:
|
|
runtime autoload/ale/lsp.vim
|
|
|
|
let g:message_list = []
|
|
|
|
function! MarkAllConnectionsInitialized() abort
|
|
for l:conn in values(ale#lsp#GetConnections())
|
|
let l:conn.initialized = 1
|
|
endfor
|
|
endfunction
|
|
|
|
function! MarkDocumentOpened() abort
|
|
for l:conn in values(ale#lsp#GetConnections())
|
|
let l:conn.open_documents[bufnr('')] = 1
|
|
endfor
|
|
endfunction
|
|
|
|
function! ale#lsp#Send(conn_id, message) abort
|
|
let l:connections = ale#lsp#GetConnections()
|
|
|
|
if !l:connections[a:conn_id].initialized
|
|
throw 'LSP server not initialized yet!'
|
|
endif
|
|
|
|
call add(g:message_list, [a:conn_id] + a:message)
|
|
endfunction
|
|
|
|
call ale#lsp#ResetConnections()
|
|
|
|
After:
|
|
unlet! g:message_list
|
|
delfunction MarkAllConnectionsInitialized
|
|
delfunction MarkDocumentOpened
|
|
|
|
call ale#lsp#ResetConnections()
|
|
|
|
runtime autoload/ale/lsp.vim
|
|
|
|
Execute(No errors should be thrown if the connection is not initialized):
|
|
call ale#lsp#Register('command', '/foo', '', {})
|
|
call MarkDocumentOpened()
|
|
|
|
call ale#engine#Cleanup(bufnr(''))
|
|
AssertEqual [], g:message_list
|
|
|
|
Execute(No messages should be sent if the document wasn't opened):
|
|
call ale#lsp#Register('command', '/foo', '', {})
|
|
call MarkAllConnectionsInitialized()
|
|
|
|
call ale#engine#Cleanup(bufnr(''))
|
|
AssertEqual [], g:message_list
|
|
|
|
Execute(A message should be sent if the document was opened):
|
|
call ale#lsp#Register('command', '/foo', 'lang', {})
|
|
call MarkAllConnectionsInitialized()
|
|
|
|
call ale#lsp#OpenDocument('command:/foo', bufnr(''))
|
|
call ale#engine#Cleanup(bufnr(''))
|
|
" We should only send the message once.
|
|
call ale#engine#Cleanup(bufnr(''))
|
|
|
|
AssertEqual
|
|
\ [
|
|
\ ['command:/foo', 1, 'textDocument/didOpen', {
|
|
\ 'textDocument': {
|
|
\ 'uri': ale#path#ToFileURI(expand('%:p')),
|
|
\ 'version': g:ale_lsp_next_version_id - 1,
|
|
\ 'languageId': 'lang',
|
|
\ 'text': "\n",
|
|
\ },
|
|
\ }],
|
|
\ ['command:/foo', 1, 'textDocument/didClose', {
|
|
\ 'textDocument': {
|
|
\ 'uri': ale#path#ToFileURI(expand('%:p')),
|
|
\ },
|
|
\ }],
|
|
\ ],
|
|
\ g:message_list
|
|
|
|
Execute(A message should be sent if the document was opened for tsserver):
|
|
call ale#lsp#Register('command', '/foo', 'lang', {})
|
|
call ale#lsp#MarkConnectionAsTsserver('command:/foo')
|
|
|
|
call ale#lsp#OpenDocument('command:/foo', bufnr(''))
|
|
call ale#engine#Cleanup(bufnr(''))
|
|
" We should only send the message once.
|
|
call ale#engine#Cleanup(bufnr(''))
|
|
|
|
AssertEqual
|
|
\ [
|
|
\ ['command:/foo', 1, 'ts@open', {'file': expand('%:p')}],
|
|
\ ['command:/foo', 1, 'ts@close', {'file': expand('%:p')}],
|
|
\ ],
|
|
\ g:message_list
|
|
|
|
Execute(Re-opening and closing the documents should work):
|
|
call ale#lsp#Register('command', '/foo', 'lang', {})
|
|
call MarkAllConnectionsInitialized()
|
|
|
|
call ale#lsp#OpenDocument('command:/foo', bufnr(''))
|
|
call ale#engine#Cleanup(bufnr(''))
|
|
call ale#lsp#OpenDocument('command:/foo', bufnr(''))
|
|
call ale#engine#Cleanup(bufnr(''))
|
|
|
|
AssertEqual
|
|
\ [
|
|
\ ['command:/foo', 1, 'textDocument/didOpen', {
|
|
\ 'textDocument': {
|
|
\ 'uri': ale#path#ToFileURI(expand('%:p')),
|
|
\ 'version': g:ale_lsp_next_version_id - 2,
|
|
\ 'languageId': 'lang',
|
|
\ 'text': "\n",
|
|
\ },
|
|
\ }],
|
|
\ ['command:/foo', 1, 'textDocument/didClose', {
|
|
\ 'textDocument': {
|
|
\ 'uri': ale#path#ToFileURI(expand('%:p')),
|
|
\ },
|
|
\ }],
|
|
\ ['command:/foo', 1, 'textDocument/didOpen', {
|
|
\ 'textDocument': {
|
|
\ 'uri': ale#path#ToFileURI(expand('%:p')),
|
|
\ 'version': g:ale_lsp_next_version_id - 1,
|
|
\ 'languageId': 'lang',
|
|
\ 'text': "\n",
|
|
\ },
|
|
\ }],
|
|
\ ['command:/foo', 1, 'textDocument/didClose', {
|
|
\ 'textDocument': {
|
|
\ 'uri': ale#path#ToFileURI(expand('%:p')),
|
|
\ },
|
|
\ }],
|
|
\ ],
|
|
\ g:message_list
|
|
|
|
Execute(Messages for closing documents should be sent to each server):
|
|
call ale#lsp#Register('command', '/foo', 'lang', {})
|
|
call ale#lsp#Register('command', '/bar', 'lang', {})
|
|
call MarkAllConnectionsInitialized()
|
|
|
|
call ale#lsp#OpenDocument('command:/foo', bufnr(''))
|
|
call ale#lsp#OpenDocument('command:/bar', bufnr(''))
|
|
call ale#engine#Cleanup(bufnr(''))
|
|
" We should only send the message once.
|
|
call ale#engine#Cleanup(bufnr(''))
|
|
|
|
AssertEqual
|
|
\ [
|
|
\ ['command:/foo', 1, 'textDocument/didOpen', {
|
|
\ 'textDocument': {
|
|
\ 'uri': ale#path#ToFileURI(expand('%:p')),
|
|
\ 'version': g:ale_lsp_next_version_id - 2,
|
|
\ 'languageId': 'lang',
|
|
\ 'text': "\n",
|
|
\ },
|
|
\ }],
|
|
\ ['command:/bar', 1, 'textDocument/didOpen', {
|
|
\ 'textDocument': {
|
|
\ 'uri': ale#path#ToFileURI(expand('%:p')),
|
|
\ 'version': g:ale_lsp_next_version_id - 1,
|
|
\ 'languageId': 'lang',
|
|
\ 'text': "\n",
|
|
\ },
|
|
\ }],
|
|
\ ['command:/bar', 1, 'textDocument/didClose', {
|
|
\ 'textDocument': {
|
|
\ 'uri': ale#path#ToFileURI(expand('%:p')),
|
|
\ },
|
|
\ }],
|
|
\ ['command:/foo', 1, 'textDocument/didClose', {
|
|
\ 'textDocument': {
|
|
\ 'uri': ale#path#ToFileURI(expand('%:p')),
|
|
\ },
|
|
\ }],
|
|
\ ],
|
|
\ g:message_list
|