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:
w0rp
2025-03-18 14:05:58 +00:00
parent 4f4d68f153
commit 73b568b071
19 changed files with 65 additions and 41 deletions

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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'