mirror of
				https://github.com/neovim/neovim.git
				synced 2025-11-04 01:34:25 +00: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:
		
				
					committed by
					
						
						GitHub
					
				
			
			
				
	
			
			
			
						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
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user