diff --git a/runtime/lua/vim/lsp/rpc.lua b/runtime/lua/vim/lsp/rpc.lua index 49d125826b..5026a132f5 100644 --- a/runtime/lua/vim/lsp/rpc.lua +++ b/runtime/lua/vim/lsp/rpc.lua @@ -1,6 +1,6 @@ local log = require('vim.lsp.log') local protocol = require('vim.lsp.protocol') -local lsp_transport = require('vim.lsp._transport') +local vim_transport = require('vim.net._transport') local strbuffer = require('vim._core.stringbuffer') local validate = vim.validate @@ -263,7 +263,7 @@ end --- @field private message_index integer --- @field private message_callbacks table dict of message_id to callback --- @field private notify_reply_callbacks table dict of message_id to callback ---- @field private transport vim.lsp.rpc.Transport +--- @field private transport vim.Transport --- @field private dispatchers vim.lsp.rpc.Dispatchers --- --- See [vim.lsp.rpc.request()] @@ -281,7 +281,7 @@ local Client = {} ---@package ---@param dispatchers vim.lsp.rpc.Dispatchers ----@param transport vim.lsp.rpc.Transport +---@param transport vim.Transport ---@return vim.lsp.rpc.Client function Client.new(dispatchers, transport) local result = { @@ -636,13 +636,13 @@ function M.connect(host_or_path, port) dispatchers = merge_dispatchers(dispatchers) - local transport = lsp_transport.TransportConnect.new(host_or_path, port) + local transport = vim_transport.TransportConnect.new(host_or_path, port) return Client.new(dispatchers, transport) end end --- Additional context for the LSP server process. ---- @class vim.lsp.rpc.ExtraSpawnParams +--- @class vim.transport.ExtraSpawnParams --- @inlinedoc --- @field cwd? string Working directory for the LSP server process --- @field detached? boolean Detach the LSP server process from the current process @@ -654,7 +654,7 @@ end --- --- @param cmd string[] Command to start the LSP server. --- @param dispatchers? vim.lsp.rpc.Dispatchers ---- @param extra_spawn_params? vim.lsp.rpc.ExtraSpawnParams +--- @param extra_spawn_params? vim.transport.ExtraSpawnParams --- @return vim.lsp.rpc.Client function M.start(cmd, dispatchers, extra_spawn_params) log.info('Starting RPC client', { cmd = cmd, extra = extra_spawn_params }) @@ -664,7 +664,7 @@ function M.start(cmd, dispatchers, extra_spawn_params) dispatchers = merge_dispatchers(dispatchers) - local transport = lsp_transport.TransportRun.new(cmd, extra_spawn_params) + local transport = vim_transport.TransportRun.new(cmd, extra_spawn_params) return Client.new(dispatchers, transport) end diff --git a/runtime/lua/vim/lsp/_transport.lua b/runtime/lua/vim/net/_transport.lua similarity index 74% rename from runtime/lua/vim/lsp/_transport.lua rename to runtime/lua/vim/net/_transport.lua index 94691392f4..b39462ad8c 100644 --- a/runtime/lua/vim/lsp/_transport.lua +++ b/runtime/lua/vim/net/_transport.lua @@ -3,23 +3,21 @@ local log = require('vim.lsp.log') --- Interface for transport implementations. --- ---- @class (private) vim.lsp.rpc.Transport ---- @field listen fun(self: vim.lsp.rpc.Transport, on_read: fun(err: any, data: string), on_exit: fun(code: integer, signal: integer)) ---- @field write fun(self: vim.lsp.rpc.Transport, msg: string) ---- @field is_closing fun(self: vim.lsp.rpc.Transport): boolean ---- @field terminate fun(self: vim.lsp.rpc.Transport) +--- @class (private, exact) vim.Transport +--- @field listen fun(self: vim.Transport, on_read: fun(err: any, data: string), on_exit: fun(code: integer, signal: integer)) +--- @field write fun(self: vim.Transport, msg: string) +--- @field is_closing fun(self: vim.Transport): boolean +--- @field terminate fun(self: vim.Transport) --- Transport backed by newly spawned process using `vim.system()`. --- ---- @class (private) vim.lsp.rpc.Transport.Run : vim.lsp.rpc.Transport ---- @field cmd string[] Command to start the LSP server. ---- @field extra_spawn_params? vim.lsp.rpc.ExtraSpawnParams ---- @field sysobj? vim.SystemObj +--- @class (private, exact) vim.TransportRun : vim.Transport +--- @field private cmd string[] Command to start the process. +--- @field private extra_spawn_params? vim.transport.ExtraSpawnParams +--- @field private sysobj? vim.SystemObj +--- @field new fun(cmd: string[], extra_spawn_params?: vim.transport.ExtraSpawnParams): vim.TransportRun local TransportRun = {} ---- @param cmd string[] Command to start the LSP server. ---- @param extra_spawn_params? vim.lsp.rpc.ExtraSpawnParams ---- @return vim.lsp.rpc.Transport.Run function TransportRun.new(cmd, extra_spawn_params) return setmetatable({ cmd = cmd, @@ -32,7 +30,7 @@ end function TransportRun:listen(on_read, on_exit) local function on_stderr(_, chunk) if chunk then - log.error('rpc', self.cmd[1], 'stderr', chunk) + log.error('transport', self.cmd[1], 'stderr', chunk) end end @@ -64,10 +62,10 @@ function TransportRun:listen(on_read, on_exit) if not ok then ---@cast sysobj_or_err string local err = sysobj_or_err local sfx = err:match('ENOENT') - and '. The language server is either not installed, missing from PATH, or not executable.' + and '. The command is either not installed, missing from PATH, or not executable.' or string.format(' with error message: %s', err) - error(('Spawning language server with cmd: `%s` failed%s'):format(vim.inspect(self.cmd), sfx)) + error(('Spawning process with cmd: `%s` failed%s'):format(vim.inspect(self.cmd), sfx)) end ---@cast sysobj_or_err vim.SystemObj self.sysobj = sysobj_or_err @@ -91,29 +89,27 @@ end --- Transport backed by an existing `uv.uv_pipe_t` or `uv.uv_tcp_t` connection. --- ---- @class (private) vim.lsp.rpc.Transport.Connect : vim.lsp.rpc.Transport ---- @field host_or_path string ---- @field port? integer ---- @field handle? uv.uv_pipe_t|uv.uv_tcp_t +--- @class (private, exact) vim.TransportConnect : vim.Transport +--- @field private host_or_path string +--- @field private port? integer +--- @field private handle? uv.uv_pipe_t|uv.uv_tcp_t --- Connect returns a PublicClient synchronously so the caller --- can immediately send messages before the connection is established. --- These messages are buffered in `msgbuf`. ---- @field connected boolean ---- @field closing boolean ---- @field msgbuf vim.Ringbuf ---- @field on_exit? fun(code: integer, signal: integer) +--- @field private connected boolean +--- @field private closing boolean +--- @field private msgbuf vim.Ringbuf +--- @field private on_exit? fun(code: integer, signal: integer) +--- @field new fun(host_or_path: string, port?: integer): vim.TransportConnect local TransportConnect = {} ---- @param host_or_path string ---- @param port? integer ---- @return vim.lsp.rpc.Transport.Connect function TransportConnect.new(host_or_path, port) return setmetatable({ host_or_path = host_or_path, port = port, connected = false, -- size should be enough because the client can't really do anything until initialization is done - -- which required a response from the server - implying the connection got established + -- which required a response from the process - implying the connection got established msgbuf = vim.ringbuf(10), closing = false, }, { __index = TransportConnect })