mirror of
https://github.com/dense-analysis/ale.git
synced 2025-12-06 12:44:23 +08:00
Supply language_id values to Neovim LSP API
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.
This commit is contained in:
@@ -205,7 +205,10 @@ endfunction
|
||||
function! ale#assert#LSPLanguage(expected_language) abort
|
||||
let l:buffer = bufnr('')
|
||||
let l:linter = s:GetLinter()
|
||||
let l:language = ale#linter#GetLanguage(l:buffer, l:linter)
|
||||
let l:Language = l:linter.language
|
||||
let l:language = type(l:Language) is v:t_func
|
||||
\ ? l:Language(l:buffer)
|
||||
\ : l:Language
|
||||
|
||||
AssertEqual a:expected_language, l:language
|
||||
endfunction
|
||||
|
||||
@@ -446,9 +446,3 @@ function! ale#linter#GetAddress(buffer, linter) abort
|
||||
|
||||
return type(l:Address) is v:t_func ? l:Address(a:buffer) : l:Address
|
||||
endfunction
|
||||
|
||||
function! ale#linter#GetLanguage(buffer, linter) abort
|
||||
let l:Language = a:linter.language
|
||||
|
||||
return type(l:Language) is v:t_func ? l:Language(a:buffer) : l:Language
|
||||
endfunction
|
||||
|
||||
@@ -5,9 +5,10 @@
|
||||
let s:connections = get(s:, 'connections', {})
|
||||
let g:ale_lsp_next_message_id = 1
|
||||
|
||||
" Given an id, which can be an executable or address, and a project path,
|
||||
" Given an id, which can be an executable or address, a project path,
|
||||
" and a language string or (bufnr) -> string function
|
||||
" create a new connection if needed. Return a unique ID for the connection.
|
||||
function! ale#lsp#Register(executable_or_address, project, init_options) abort
|
||||
function! ale#lsp#Register(executable_or_address, project, language, init_options) abort
|
||||
let l:conn_id = a:executable_or_address . ':' . a:project
|
||||
|
||||
if !has_key(s:connections, l:conn_id)
|
||||
@@ -28,6 +29,7 @@ function! ale#lsp#Register(executable_or_address, project, init_options) abort
|
||||
\ 'is_tsserver': 0,
|
||||
\ 'data': '',
|
||||
\ 'root': a:project,
|
||||
\ 'language': a:language,
|
||||
\ 'open_documents': {},
|
||||
\ 'initialized': 0,
|
||||
\ 'init_request_id': 0,
|
||||
@@ -677,9 +679,20 @@ function! ale#lsp#Send(conn_id, message) abort
|
||||
return l:id == 0 ? -1 : l:id
|
||||
endfunction
|
||||
|
||||
function! ale#lsp#GetLanguage(conn_id, buffer) abort
|
||||
let l:conn = get(s:connections, a:conn_id, {})
|
||||
let l:Language = get(l:conn, 'language')
|
||||
|
||||
if empty(l:Language)
|
||||
return getbufvar(a:buffer, '&filetype')
|
||||
endif
|
||||
|
||||
return type(l:Language) is v:t_func ? l:Language(a:buffer) : l:Language
|
||||
endfunction
|
||||
|
||||
" Notify LSP servers or tsserver if a document is opened, if needed.
|
||||
" If a document is opened, 1 will be returned, otherwise 0 will be returned.
|
||||
function! ale#lsp#OpenDocument(conn_id, buffer, language_id) abort
|
||||
function! ale#lsp#OpenDocument(conn_id, buffer) abort
|
||||
let l:conn = get(s:connections, a:conn_id, {})
|
||||
let l:opened = 0
|
||||
|
||||
@@ -693,7 +706,8 @@ function! ale#lsp#OpenDocument(conn_id, buffer, language_id) abort
|
||||
\ 'client_id': l:conn.client_id,
|
||||
\})
|
||||
else
|
||||
let l:message = ale#lsp#message#DidOpen(a:buffer, a:language_id)
|
||||
let l:language_id = ale#lsp#GetLanguage(a:conn_id, a:buffer)
|
||||
let l:message = ale#lsp#message#DidOpen(a:buffer, l:language_id)
|
||||
call ale#lsp#Send(a:conn_id, l:message)
|
||||
endif
|
||||
|
||||
|
||||
@@ -306,11 +306,10 @@ function! ale#lsp_linter#OnInit(linter, details, Callback) abort
|
||||
let l:command = a:details.command
|
||||
|
||||
let l:config = ale#lsp_linter#GetConfig(l:buffer, a:linter)
|
||||
let l:language_id = ale#linter#GetLanguage(l:buffer, a:linter)
|
||||
|
||||
call ale#lsp#UpdateConfig(l:conn_id, l:buffer, l:config)
|
||||
|
||||
if ale#lsp#OpenDocument(l:conn_id, l:buffer, l:language_id)
|
||||
if ale#lsp#OpenDocument(l:conn_id, l:buffer)
|
||||
if g:ale_history_enabled && !empty(l:command)
|
||||
call ale#history#Add(l:buffer, 'started', l:conn_id, l:command)
|
||||
endif
|
||||
@@ -357,11 +356,21 @@ function! s:StartLSP(options, address, executable, command) abort
|
||||
let l:init_options = ale#lsp_linter#GetOptions(l:buffer, l:linter)
|
||||
|
||||
if l:linter.lsp is# 'socket'
|
||||
let l:conn_id = ale#lsp#Register(a:address, l:root, l:init_options)
|
||||
let l:conn_id = ale#lsp#Register(
|
||||
\ a:address,
|
||||
\ l:root,
|
||||
\ l:linter.language,
|
||||
\ l:init_options
|
||||
\)
|
||||
let l:ready = ale#lsp#ConnectToAddress(l:conn_id, a:address)
|
||||
let l:command = ''
|
||||
else
|
||||
let l:conn_id = ale#lsp#Register(a:executable, l:root, l:init_options)
|
||||
let l:conn_id = ale#lsp#Register(
|
||||
\ a:executable,
|
||||
\ l:root,
|
||||
\ l:linter.language,
|
||||
\ l:init_options
|
||||
\)
|
||||
|
||||
" tsserver behaves differently, so tell the LSP API that it is tsserver.
|
||||
if l:linter.lsp is# 'tsserver'
|
||||
|
||||
Reference in New Issue
Block a user