mirror of
https://github.com/neovim/neovim.git
synced 2024-12-19 18:55:14 -07:00
feat(lsp): use uv_spawn to check if server executable (#16430)
Previously, the built-in language server client checked if the first argument of cmd was executable via vim.fn.executable. This ignores PATH injected via cmd_env. Instead, we now start the client via uv.spawn, and handle the failure mode, reporting the error back to the user. Co-authored-by: Mathias Fußenegger <mfussenegger@users.noreply.github.com>
This commit is contained in:
parent
6ea5e80393
commit
1a60580925
@ -790,6 +790,9 @@ function lsp.start_client(config)
|
||||
env = config.cmd_env;
|
||||
})
|
||||
|
||||
-- Return nil if client fails to start
|
||||
if not rpc then return end
|
||||
|
||||
local client = {
|
||||
id = client_id;
|
||||
name = name;
|
||||
|
@ -264,8 +264,6 @@ local function start(cmd, cmd_args, dispatchers, extra_spawn_params)
|
||||
|
||||
if extra_spawn_params and extra_spawn_params.cwd then
|
||||
assert(is_dir(extra_spawn_params.cwd), "cwd must be a directory")
|
||||
elseif not (vim.fn.executable(cmd) == 1) then
|
||||
error(string.format("The given command %q is not executable.", cmd))
|
||||
end
|
||||
if dispatchers then
|
||||
local user_dispatchers = dispatchers
|
||||
@ -325,7 +323,14 @@ local function start(cmd, cmd_args, dispatchers, extra_spawn_params)
|
||||
end
|
||||
handle, pid = uv.spawn(cmd, spawn_params, onexit)
|
||||
if handle == nil then
|
||||
error(string.format("start `%s` failed: %s", cmd, pid))
|
||||
local msg = string.format("Spawning language server with cmd: `%s` failed", cmd)
|
||||
if string.match(pid, "ENOENT") then
|
||||
msg = msg .. ". The language server is either not installed, missing from PATH, or not executable."
|
||||
else
|
||||
msg = msg .. string.format(" with error message: %s", pid)
|
||||
end
|
||||
vim.notify(msg, vim.log.levels.ERROR)
|
||||
return
|
||||
end
|
||||
end
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user