mirror of
				https://github.com/neovim/neovim.git
				synced 2025-10-26 12:27:24 +00:00 
			
		
		
		
	feat(lsp): deprecate non-method client functions
Deprecated: - `client.request()` -> `client:request()` - `client.request_sync()` -> `client:request_sync()` - `client.notify()` -> `client:notify()` - `client.cancel_request()` -> `client:cancel_request()` - `client.stop()` -> `client:stop()` - `client.is_stopped()` `client:is_stopped()` - `client.supports_method()` -> `client:supports_method()` - `client.on_attach()` -> `client:on_attach()` Fixed docgen to link class fields to the full function doc.
This commit is contained in:
		 Lewis Russell
					Lewis Russell
				
			
				
					committed by
					
						 Lewis Russell
						Lewis Russell
					
				
			
			
				
	
			
			
			 Lewis Russell
						Lewis Russell
					
				
			
						parent
						
							f55c842ec7
						
					
				
				
					commit
					454ae672aa
				
			| @@ -56,6 +56,14 @@ LSP | |||||||
| 	No longer support client to server response handlers. Only server to | 	No longer support client to server response handlers. Only server to | ||||||
| 	client requests/notification handlers are supported. | 	client requests/notification handlers are supported. | ||||||
| • *vim.lsp.handlers.signature_help()*	Use |vim.lsp.buf.signature_help()| instead. | • *vim.lsp.handlers.signature_help()*	Use |vim.lsp.buf.signature_help()| instead. | ||||||
|  | • `client.request()`			Use |Client:request()| instead. | ||||||
|  | • `client.request_sync()`		Use |Client:request_sync()| instead. | ||||||
|  | • `client.notify()`			Use |Client:notify()| instead. | ||||||
|  | • `client.cancel_request()`		Use |Client:cancel_request()| instead. | ||||||
|  | • `client.stop()`			Use |Client:stop()| instead. | ||||||
|  | • `client.is_stopped()`			Use |Client:is_stopped()| instead. | ||||||
|  | • `client.supports_method()`		Use |Client:supports_method()| instead. | ||||||
|  | • `client.on_attach()`			Use |Client:on_attach()| instead. | ||||||
|  |  | ||||||
| ------------------------------------------------------------------------------ | ------------------------------------------------------------------------------ | ||||||
| DEPRECATED IN 0.10					*deprecated-0.10* | DEPRECATED IN 0.10					*deprecated-0.10* | ||||||
|   | |||||||
| @@ -972,54 +972,24 @@ Lua module: vim.lsp.client                                        *lsp-client* | |||||||
|       • {capabilities}          (`lsp.ClientCapabilities`) The capabilities |       • {capabilities}          (`lsp.ClientCapabilities`) The capabilities | ||||||
|                                 provided by the client (editor or tool) |                                 provided by the client (editor or tool) | ||||||
|       • {dynamic_capabilities}  (`lsp.DynamicCapabilities`) |       • {dynamic_capabilities}  (`lsp.DynamicCapabilities`) | ||||||
|       • {request}               (`fun(method: string, params: table?, handler: lsp.Handler?, bufnr: integer?): boolean, integer?`) |       • {request}               (`fun(self: vim.lsp.Client, method: string, params: table?, handler: lsp.Handler?, bufnr: integer?): boolean, integer?`) | ||||||
|                                 Sends a request to the server. This is a thin |                                 See |Client:request()|. | ||||||
|                                 wrapper around {client.rpc.request} with some |       • {request_sync}          (`fun(self: vim.lsp.Client, method: string, params: table, timeout_ms: integer?, bufnr: integer): {err: lsp.ResponseError?, result:any}?, string?`) | ||||||
|                                 additional checking. If {handler} is not |                                 See |Client:request_sync()|. | ||||||
|                                 specified and if there's no respective global |       • {notify}                (`fun(self: vim.lsp.Client, method: string, params: table?): boolean`) | ||||||
|                                 handler, then an error will occur. Returns: |                                 See |Client:notify()|. | ||||||
|                                 {status}, {client_id}?. {status} is a boolean |       • {cancel_request}        (`fun(self: vim.lsp.Client, id: integer): boolean`) | ||||||
|                                 indicating if the notification was successful. |                                 See |Client:cancel_request()|. | ||||||
|                                 If it is `false`, then it will always be |       • {stop}                  (`fun(self: vim.lsp.Client, force: boolean?)`) | ||||||
|                                 `false` (the client has shutdown). If {status} |                                 See |Client:stop()|. | ||||||
|                                 is `true`, the function returns {request_id} |       • {is_stopped}            (`fun(self: vim.lsp.Client): boolean`) See | ||||||
|                                 as the second result. You can use this with |                                 |Client:is_stopped()|. | ||||||
|                                 `client.cancel_request(request_id)` to cancel |  | ||||||
|                                 the request. |  | ||||||
|       • {request_sync}          (`fun(method: string, params: table?, timeout_ms: integer?, bufnr: integer): {err: lsp.ResponseError?, result:any}?, string?`) |  | ||||||
|                                 err # a dict |  | ||||||
|       • {notify}                (`fun(method: string, params: table?): boolean`) |  | ||||||
|                                 Sends a notification to an LSP server. |  | ||||||
|                                 Returns: a boolean to indicate if the |  | ||||||
|                                 notification was successful. If it is false, |  | ||||||
|                                 then it will always be false (the client has |  | ||||||
|                                 shutdown). |  | ||||||
|       • {cancel_request}        (`fun(id: integer): boolean`) Cancels a |  | ||||||
|                                 request with a given request id. Returns: same |  | ||||||
|                                 as `notify()`. |  | ||||||
|       • {stop}                  (`fun(force?: boolean)`) Stops a client, |  | ||||||
|                                 optionally with force. By default, it will |  | ||||||
|                                 just ask the server to shutdown without force. |  | ||||||
|                                 If you request to stop a client which has |  | ||||||
|                                 previously been requested to shutdown, it will |  | ||||||
|                                 automatically escalate and force shutdown. |  | ||||||
|       • {on_attach}             (`fun(bufnr: integer)`) Runs the on_attach |  | ||||||
|                                 function from the client's config if it was |  | ||||||
|                                 defined. Useful for buffer-local setup. |  | ||||||
|       • {supports_method}       (`fun(method: string, opts?: {bufnr: integer?}): boolean`) |  | ||||||
|                                 Checks if a client supports a given method. |  | ||||||
|                                 Always returns true for unknown off-spec |  | ||||||
|                                 methods. {opts} is a optional |  | ||||||
|                                 `{bufnr?: integer}` table. Some language |  | ||||||
|                                 server capabilities can be file specific. |  | ||||||
|       • {is_stopped}            (`fun(): boolean`) Checks whether a client is |  | ||||||
|                                 stopped. Returns: true if the client is fully |  | ||||||
|                                 stopped. |  | ||||||
|       • {exec_cmd}              (`fun(self: vim.lsp.Client, command: lsp.Command, context: {bufnr?: integer}?, handler: lsp.Handler?)`) |       • {exec_cmd}              (`fun(self: vim.lsp.Client, command: lsp.Command, context: {bufnr?: integer}?, handler: lsp.Handler?)`) | ||||||
|                                 Execute a lsp command, either via client |                                 See |Client:exec_cmd()|. | ||||||
|                                 command function (if available) or via |       • {on_attach}             (`fun(self: vim.lsp.Client, bufnr: integer)`) | ||||||
|                                 workspace/executeCommand (if supported by the |                                 See |Client:on_attach()|. | ||||||
|                                 server) |       • {supports_method}       (`fun(self: vim.lsp.Client, method: string, bufnr: integer?)`) | ||||||
|  |                                 See |Client:supports_method()|. | ||||||
|  |  | ||||||
| *vim.lsp.Client.Progress* | *vim.lsp.Client.Progress* | ||||||
|     Extends: |vim.Ringbuf| |     Extends: |vim.Ringbuf| | ||||||
| @@ -1150,6 +1120,18 @@ Lua module: vim.lsp.client                                        *lsp-client* | |||||||
|                               on initialization. |                               on initialization. | ||||||
|  |  | ||||||
|  |  | ||||||
|  | Client:cancel_request({id})                          *Client:cancel_request()* | ||||||
|  |     Cancels a request with a given request id. | ||||||
|  |  | ||||||
|  |     Parameters: ~ | ||||||
|  |       • {id}  (`integer`) id of request to cancel | ||||||
|  |  | ||||||
|  |     Return: ~ | ||||||
|  |         (`boolean`) status indicating if the notification was successful. | ||||||
|  |  | ||||||
|  |     See also: ~ | ||||||
|  |       • |Client:notify()| | ||||||
|  |  | ||||||
| Client:exec_cmd({command}, {context}, {handler})           *Client:exec_cmd()* | Client:exec_cmd({command}, {context}, {handler})           *Client:exec_cmd()* | ||||||
|     Execute a lsp command, either via client command function (if available) |     Execute a lsp command, either via client command function (if available) | ||||||
|     or via workspace/executeCommand (if supported by the server) |     or via workspace/executeCommand (if supported by the server) | ||||||
| @@ -1159,6 +1141,95 @@ Client:exec_cmd({command}, {context}, {handler})           *Client:exec_cmd()* | |||||||
|       • {context}  (`{bufnr?: integer}?`) |       • {context}  (`{bufnr?: integer}?`) | ||||||
|       • {handler}  (`lsp.Handler?`) only called if a server command |       • {handler}  (`lsp.Handler?`) only called if a server command | ||||||
|  |  | ||||||
|  | Client:is_stopped()                                      *Client:is_stopped()* | ||||||
|  |     Checks whether a client is stopped. | ||||||
|  |  | ||||||
|  |     Return: ~ | ||||||
|  |         (`boolean`) true if client is stopped or in the process of being | ||||||
|  |         stopped; false otherwise | ||||||
|  |  | ||||||
|  | Client:notify({method}, {params})                            *Client:notify()* | ||||||
|  |     Sends a notification to an LSP server. | ||||||
|  |  | ||||||
|  |     Parameters: ~ | ||||||
|  |       • {method}  (`string`) LSP method name. | ||||||
|  |       • {params}  (`table?`) LSP request params. | ||||||
|  |  | ||||||
|  |     Return: ~ | ||||||
|  |         (`boolean`) status indicating if the notification was successful. If | ||||||
|  |         it is false, then the client has shutdown. | ||||||
|  |  | ||||||
|  | Client:on_attach({bufnr})                                 *Client:on_attach()* | ||||||
|  |     Runs the on_attach function from the client's config if it was defined. | ||||||
|  |     Useful for buffer-local setup. | ||||||
|  |  | ||||||
|  |     Parameters: ~ | ||||||
|  |       • {bufnr}  (`integer`) Buffer number | ||||||
|  |  | ||||||
|  |                                                             *Client:request()* | ||||||
|  | Client:request({method}, {params}, {handler}, {bufnr}) | ||||||
|  |     Sends a request to the server. | ||||||
|  |  | ||||||
|  |     This is a thin wrapper around {client.rpc.request} with some additional | ||||||
|  |     checks for capabilities and handler availability. | ||||||
|  |  | ||||||
|  |     Parameters: ~ | ||||||
|  |       • {method}   (`string`) LSP method name. | ||||||
|  |       • {params}   (`table?`) LSP request params. | ||||||
|  |       • {handler}  (`lsp.Handler?`) Response |lsp-handler| for this method. | ||||||
|  |       • {bufnr}    (`integer?`) Buffer handle. 0 for current (default). | ||||||
|  |  | ||||||
|  |     Return (multiple): ~ | ||||||
|  |         (`boolean`) status indicates whether the request was successful. If it | ||||||
|  |         is `false`, then it will always be `false` (the client has shutdown). | ||||||
|  |         (`integer?`) request_id Can be used with |Client:cancel_request()|. | ||||||
|  |         `nil` is request failed. | ||||||
|  |  | ||||||
|  |     See also: ~ | ||||||
|  |       • |vim.lsp.buf_request_all()| | ||||||
|  |  | ||||||
|  |                                                        *Client:request_sync()* | ||||||
|  | Client:request_sync({method}, {params}, {timeout_ms}, {bufnr}) | ||||||
|  |     Sends a request to the server and synchronously waits for the response. | ||||||
|  |  | ||||||
|  |     This is a wrapper around |Client:request()| | ||||||
|  |  | ||||||
|  |     Parameters: ~ | ||||||
|  |       • {method}      (`string`) LSP method name. | ||||||
|  |       • {params}      (`table`) LSP request params. | ||||||
|  |       • {timeout_ms}  (`integer?`) Maximum time in milliseconds to wait for a | ||||||
|  |                       result. Defaults to 1000 | ||||||
|  |       • {bufnr}       (`integer`) Buffer handle (0 for current). | ||||||
|  |  | ||||||
|  |     Return (multiple): ~ | ||||||
|  |         (`{err: lsp.ResponseError?, result:any}?`) `result` and `err` from the | ||||||
|  |         |lsp-handler|. `nil` is the request was unsuccessful | ||||||
|  |         (`string?`) err On timeout, cancel or error, where `err` is a string | ||||||
|  |         describing the failure reason. | ||||||
|  |  | ||||||
|  |     See also: ~ | ||||||
|  |       • |vim.lsp.buf_request_sync()| | ||||||
|  |  | ||||||
|  | Client:stop({force})                                           *Client:stop()* | ||||||
|  |     Stops a client, optionally with force. | ||||||
|  |  | ||||||
|  |     By default, it will just request the server to shutdown without force. If | ||||||
|  |     you request to stop a client which has previously been requested to | ||||||
|  |     shutdown, it will automatically escalate and force shutdown. | ||||||
|  |  | ||||||
|  |     Parameters: ~ | ||||||
|  |       • {force}  (`boolean?`) | ||||||
|  |  | ||||||
|  | Client:supports_method({method}, {bufnr})           *Client:supports_method()* | ||||||
|  |     Checks if a client supports a given method. Always returns true for | ||||||
|  |     unknown off-spec methods. | ||||||
|  |  | ||||||
|  |     Note: Some language server capabilities can be file specific. | ||||||
|  |  | ||||||
|  |     Parameters: ~ | ||||||
|  |       • {method}  (`string`) | ||||||
|  |       • {bufnr}   (`integer?`) | ||||||
|  |  | ||||||
|  |  | ||||||
| ============================================================================== | ============================================================================== | ||||||
| Lua module: vim.lsp.buf                                              *lsp-buf* | Lua module: vim.lsp.buf                                              *lsp-buf* | ||||||
| @@ -1599,12 +1670,12 @@ get({filter})                                       *vim.lsp.inlay_hint.get()* | |||||||
|         local hint = vim.lsp.inlay_hint.get({ bufnr = 0 })[1] -- 0 for current buffer |         local hint = vim.lsp.inlay_hint.get({ bufnr = 0 })[1] -- 0 for current buffer | ||||||
|  |  | ||||||
|         local client = vim.lsp.get_client_by_id(hint.client_id) |         local client = vim.lsp.get_client_by_id(hint.client_id) | ||||||
|         local resp = client.request_sync('inlayHint/resolve', hint.inlay_hint, 100, 0) |         local resp = client:request_sync('inlayHint/resolve', hint.inlay_hint, 100, 0) | ||||||
|         local resolved_hint = assert(resp and resp.result, resp.err) |         local resolved_hint = assert(resp and resp.result, resp.err) | ||||||
|         vim.lsp.util.apply_text_edits(resolved_hint.textEdits, 0, client.encoding) |         vim.lsp.util.apply_text_edits(resolved_hint.textEdits, 0, client.encoding) | ||||||
|  |  | ||||||
|         location = resolved_hint.label[1].location |         location = resolved_hint.label[1].location | ||||||
|         client.request('textDocument/hover', { |         client:request('textDocument/hover', { | ||||||
|           textDocument = { uri = location.uri }, |           textDocument = { uri = location.uri }, | ||||||
|           position = location.range.start, |           position = location.range.start, | ||||||
|         }) |         }) | ||||||
|   | |||||||
| @@ -1937,12 +1937,10 @@ vim.show_pos({bufnr}, {row}, {col}, {filter})                 *vim.show_pos()* | |||||||
| *vim.Ringbuf* | *vim.Ringbuf* | ||||||
|  |  | ||||||
|     Fields: ~ |     Fields: ~ | ||||||
|       • {clear}  (`fun()`) Clear all items |       • {clear}  (`fun()`) See |Ringbuf:clear()|. | ||||||
|       • {push}   (`fun(item: T)`) Adds an item, overriding the oldest item if |       • {push}   (`fun(item: T)`) See |Ringbuf:push()|. | ||||||
|                  the buffer is full. |       • {pop}    (`fun(): T?`) See |Ringbuf:pop()|. | ||||||
|       • {pop}    (`fun(): T?`) Removes and returns the first unread item |       • {peek}   (`fun(): T?`) See |Ringbuf:peek()|. | ||||||
|       • {peek}   (`fun(): T?`) Returns the first unread item without removing |  | ||||||
|                  it |  | ||||||
|  |  | ||||||
|  |  | ||||||
| Ringbuf:clear()                                              *Ringbuf:clear()* | Ringbuf:clear()                                              *Ringbuf:clear()* | ||||||
|   | |||||||
| @@ -218,6 +218,7 @@ LSP | |||||||
| • The client now supports `'utf-8'` and `'utf-32'` position encodings. | • The client now supports `'utf-8'` and `'utf-32'` position encodings. | ||||||
| • |vim.lsp.buf.hover()| now highlights hover ranges using the | • |vim.lsp.buf.hover()| now highlights hover ranges using the | ||||||
|   |hl-LspReferenceTarget| highlight group. |   |hl-LspReferenceTarget| highlight group. | ||||||
|  | • Functions in |vim.lsp.Client| can now be called as methods. | ||||||
|  |  | ||||||
| LUA | LUA | ||||||
|  |  | ||||||
|   | |||||||
| @@ -349,17 +349,17 @@ end | |||||||
| ---@param bufnr integer | ---@param bufnr integer | ||||||
| function lsp._set_defaults(client, bufnr) | function lsp._set_defaults(client, bufnr) | ||||||
|   if |   if | ||||||
|     client.supports_method(ms.textDocument_definition) and is_empty_or_default(bufnr, 'tagfunc') |     client:supports_method(ms.textDocument_definition) and is_empty_or_default(bufnr, 'tagfunc') | ||||||
|   then |   then | ||||||
|     vim.bo[bufnr].tagfunc = 'v:lua.vim.lsp.tagfunc' |     vim.bo[bufnr].tagfunc = 'v:lua.vim.lsp.tagfunc' | ||||||
|   end |   end | ||||||
|   if |   if | ||||||
|     client.supports_method(ms.textDocument_completion) and is_empty_or_default(bufnr, 'omnifunc') |     client:supports_method(ms.textDocument_completion) and is_empty_or_default(bufnr, 'omnifunc') | ||||||
|   then |   then | ||||||
|     vim.bo[bufnr].omnifunc = 'v:lua.vim.lsp.omnifunc' |     vim.bo[bufnr].omnifunc = 'v:lua.vim.lsp.omnifunc' | ||||||
|   end |   end | ||||||
|   if |   if | ||||||
|     client.supports_method(ms.textDocument_rangeFormatting) |     client:supports_method(ms.textDocument_rangeFormatting) | ||||||
|     and is_empty_or_default(bufnr, 'formatprg') |     and is_empty_or_default(bufnr, 'formatprg') | ||||||
|     and is_empty_or_default(bufnr, 'formatexpr') |     and is_empty_or_default(bufnr, 'formatexpr') | ||||||
|   then |   then | ||||||
| @@ -367,14 +367,14 @@ function lsp._set_defaults(client, bufnr) | |||||||
|   end |   end | ||||||
|   vim._with({ buf = bufnr }, function() |   vim._with({ buf = bufnr }, function() | ||||||
|     if |     if | ||||||
|       client.supports_method(ms.textDocument_hover) |       client:supports_method(ms.textDocument_hover) | ||||||
|       and is_empty_or_default(bufnr, 'keywordprg') |       and is_empty_or_default(bufnr, 'keywordprg') | ||||||
|       and vim.fn.maparg('K', 'n', false, false) == '' |       and vim.fn.maparg('K', 'n', false, false) == '' | ||||||
|     then |     then | ||||||
|       vim.keymap.set('n', 'K', vim.lsp.buf.hover, { buffer = bufnr, desc = 'vim.lsp.buf.hover()' }) |       vim.keymap.set('n', 'K', vim.lsp.buf.hover, { buffer = bufnr, desc = 'vim.lsp.buf.hover()' }) | ||||||
|     end |     end | ||||||
|   end) |   end) | ||||||
|   if client.supports_method(ms.textDocument_diagnostic) then |   if client:supports_method(ms.textDocument_diagnostic) then | ||||||
|     lsp.diagnostic._enable(bufnr) |     lsp.diagnostic._enable(bufnr) | ||||||
|   end |   end | ||||||
| end | end | ||||||
| @@ -485,12 +485,12 @@ local function text_document_did_save_handler(bufnr) | |||||||
|     local name = api.nvim_buf_get_name(bufnr) |     local name = api.nvim_buf_get_name(bufnr) | ||||||
|     local old_name = changetracking._get_and_set_name(client, bufnr, name) |     local old_name = changetracking._get_and_set_name(client, bufnr, name) | ||||||
|     if old_name and name ~= old_name then |     if old_name and name ~= old_name then | ||||||
|       client.notify(ms.textDocument_didClose, { |       client:notify(ms.textDocument_didClose, { | ||||||
|         textDocument = { |         textDocument = { | ||||||
|           uri = vim.uri_from_fname(old_name), |           uri = vim.uri_from_fname(old_name), | ||||||
|         }, |         }, | ||||||
|       }) |       }) | ||||||
|       client.notify(ms.textDocument_didOpen, { |       client:notify(ms.textDocument_didOpen, { | ||||||
|         textDocument = { |         textDocument = { | ||||||
|           version = 0, |           version = 0, | ||||||
|           uri = uri, |           uri = uri, | ||||||
| @@ -506,7 +506,7 @@ local function text_document_did_save_handler(bufnr) | |||||||
|       if type(save_capability) == 'table' and save_capability.includeText then |       if type(save_capability) == 'table' and save_capability.includeText then | ||||||
|         included_text = text(bufnr) |         included_text = text(bufnr) | ||||||
|       end |       end | ||||||
|       client.notify(ms.textDocument_didSave, { |       client:notify(ms.textDocument_didSave, { | ||||||
|         textDocument = { |         textDocument = { | ||||||
|           uri = uri, |           uri = uri, | ||||||
|         }, |         }, | ||||||
| @@ -527,10 +527,10 @@ local function buf_detach_client(bufnr, client) | |||||||
|  |  | ||||||
|   changetracking.reset_buf(client, bufnr) |   changetracking.reset_buf(client, bufnr) | ||||||
|  |  | ||||||
|   if client.supports_method(ms.textDocument_didClose) then |   if client:supports_method(ms.textDocument_didClose) then | ||||||
|     local uri = vim.uri_from_bufnr(bufnr) |     local uri = vim.uri_from_bufnr(bufnr) | ||||||
|     local params = { textDocument = { uri = uri } } |     local params = { textDocument = { uri = uri } } | ||||||
|     client.notify(ms.textDocument_didClose, params) |     client:notify(ms.textDocument_didClose, params) | ||||||
|   end |   end | ||||||
|  |  | ||||||
|   client.attached_buffers[bufnr] = nil |   client.attached_buffers[bufnr] = nil | ||||||
| @@ -564,12 +564,12 @@ local function buf_attach(bufnr) | |||||||
|           }, |           }, | ||||||
|           reason = protocol.TextDocumentSaveReason.Manual, ---@type integer |           reason = protocol.TextDocumentSaveReason.Manual, ---@type integer | ||||||
|         } |         } | ||||||
|         if client.supports_method(ms.textDocument_willSave) then |         if client:supports_method(ms.textDocument_willSave) then | ||||||
|           client.notify(ms.textDocument_willSave, params) |           client:notify(ms.textDocument_willSave, params) | ||||||
|         end |         end | ||||||
|         if client.supports_method(ms.textDocument_willSaveWaitUntil) then |         if client:supports_method(ms.textDocument_willSaveWaitUntil) then | ||||||
|           local result, err = |           local result, err = | ||||||
|             client.request_sync(ms.textDocument_willSaveWaitUntil, params, 1000, ctx.buf) |             client:request_sync(ms.textDocument_willSaveWaitUntil, params, 1000, ctx.buf) | ||||||
|           if result and result.result then |           if result and result.result then | ||||||
|             util.apply_text_edits(result.result, ctx.buf, client.offset_encoding) |             util.apply_text_edits(result.result, ctx.buf, client.offset_encoding) | ||||||
|           elseif err then |           elseif err then | ||||||
| @@ -603,8 +603,8 @@ local function buf_attach(bufnr) | |||||||
|       local params = { textDocument = { uri = uri } } |       local params = { textDocument = { uri = uri } } | ||||||
|       for _, client in ipairs(clients) do |       for _, client in ipairs(clients) do | ||||||
|         changetracking.reset_buf(client, bufnr) |         changetracking.reset_buf(client, bufnr) | ||||||
|         if client.supports_method(ms.textDocument_didClose) then |         if client:supports_method(ms.textDocument_didClose) then | ||||||
|           client.notify(ms.textDocument_didClose, params) |           client:notify(ms.textDocument_didClose, params) | ||||||
|         end |         end | ||||||
|       end |       end | ||||||
|       for _, client in ipairs(clients) do |       for _, client in ipairs(clients) do | ||||||
| @@ -662,7 +662,7 @@ function lsp.buf_attach_client(bufnr, client_id) | |||||||
|   -- Send didOpen for the client if it is initialized. If it isn't initialized |   -- Send didOpen for the client if it is initialized. If it isn't initialized | ||||||
|   -- then it will send didOpen on initialize. |   -- then it will send didOpen on initialize. | ||||||
|   if client.initialized then |   if client.initialized then | ||||||
|     client:_on_attach(bufnr) |     client:on_attach(bufnr) | ||||||
|   end |   end | ||||||
|   return true |   return true | ||||||
| end | end | ||||||
| @@ -740,13 +740,13 @@ function lsp.stop_client(client_id, force) | |||||||
|   for _, id in ipairs(ids) do |   for _, id in ipairs(ids) do | ||||||
|     if type(id) == 'table' then |     if type(id) == 'table' then | ||||||
|       if id.stop then |       if id.stop then | ||||||
|         id.stop(force) |         id:stop(force) | ||||||
|       end |       end | ||||||
|     else |     else | ||||||
|       --- @cast id -vim.lsp.Client |       --- @cast id -vim.lsp.Client | ||||||
|       local client = all_clients[id] |       local client = all_clients[id] | ||||||
|       if client then |       if client then | ||||||
|         client.stop(force) |         client:stop(force) | ||||||
|       end |       end | ||||||
|     end |     end | ||||||
|   end |   end | ||||||
| @@ -790,7 +790,7 @@ function lsp.get_clients(filter) | |||||||
|       and (filter.id == nil or client.id == filter.id) |       and (filter.id == nil or client.id == filter.id) | ||||||
|       and (filter.bufnr == nil or client.attached_buffers[bufnr]) |       and (filter.bufnr == nil or client.attached_buffers[bufnr]) | ||||||
|       and (filter.name == nil or client.name == filter.name) |       and (filter.name == nil or client.name == filter.name) | ||||||
|       and (filter.method == nil or client.supports_method(filter.method, { bufnr = filter.bufnr })) |       and (filter.method == nil or client:supports_method(filter.method, filter.bufnr)) | ||||||
|       and (filter._uninitialized or client.initialized) |       and (filter._uninitialized or client.initialized) | ||||||
|     then |     then | ||||||
|       clients[#clients + 1] = client |       clients[#clients + 1] = client | ||||||
| @@ -812,7 +812,7 @@ api.nvim_create_autocmd('VimLeavePre', { | |||||||
|     local active_clients = lsp.get_clients() |     local active_clients = lsp.get_clients() | ||||||
|     log.info('exit_handler', active_clients) |     log.info('exit_handler', active_clients) | ||||||
|     for _, client in pairs(all_clients) do |     for _, client in pairs(all_clients) do | ||||||
|       client.stop() |       client:stop() | ||||||
|     end |     end | ||||||
|  |  | ||||||
|     local timeouts = {} --- @type table<integer,integer> |     local timeouts = {} --- @type table<integer,integer> | ||||||
| @@ -847,7 +847,7 @@ api.nvim_create_autocmd('VimLeavePre', { | |||||||
|       if not vim.wait(max_timeout, check_clients_closed, poll_time) then |       if not vim.wait(max_timeout, check_clients_closed, poll_time) then | ||||||
|         for client_id, client in pairs(active_clients) do |         for client_id, client in pairs(active_clients) do | ||||||
|           if timeouts[client_id] ~= nil then |           if timeouts[client_id] ~= nil then | ||||||
|             client.stop(true) |             client:stop(true) | ||||||
|           end |           end | ||||||
|         end |         end | ||||||
|       end |       end | ||||||
| @@ -883,11 +883,11 @@ function lsp.buf_request(bufnr, method, params, handler, on_unsupported) | |||||||
|   local clients = lsp.get_clients({ bufnr = bufnr }) |   local clients = lsp.get_clients({ bufnr = bufnr }) | ||||||
|   local client_request_ids = {} --- @type table<integer,integer> |   local client_request_ids = {} --- @type table<integer,integer> | ||||||
|   for _, client in ipairs(clients) do |   for _, client in ipairs(clients) do | ||||||
|     if client.supports_method(method, { bufnr = bufnr }) then |     if client:supports_method(method, bufnr) then | ||||||
|       method_supported = true |       method_supported = true | ||||||
|  |  | ||||||
|       local cparams = type(params) == 'function' and params(client, bufnr) or params --[[@as table?]] |       local cparams = type(params) == 'function' and params(client, bufnr) or params --[[@as table?]] | ||||||
|       local request_success, request_id = client.request(method, cparams, handler, bufnr) |       local request_success, request_id = client:request(method, cparams, handler, bufnr) | ||||||
|       -- This could only fail if the client shut down in the time since we looked |       -- This could only fail if the client shut down in the time since we looked | ||||||
|       -- it up and we did the request, which should be rare. |       -- it up and we did the request, which should be rare. | ||||||
|       if request_success then |       if request_success then | ||||||
| @@ -910,7 +910,7 @@ function lsp.buf_request(bufnr, method, params, handler, on_unsupported) | |||||||
|   local function _cancel_all_requests() |   local function _cancel_all_requests() | ||||||
|     for client_id, request_id in pairs(client_request_ids) do |     for client_id, request_id in pairs(client_request_ids) do | ||||||
|       local client = all_clients[client_id] |       local client = all_clients[client_id] | ||||||
|       client.cancel_request(request_id) |       client:cancel_request(request_id) | ||||||
|     end |     end | ||||||
|   end |   end | ||||||
|  |  | ||||||
| @@ -1049,7 +1049,7 @@ function lsp.formatexpr(opts) | |||||||
|   end |   end | ||||||
|   local bufnr = api.nvim_get_current_buf() |   local bufnr = api.nvim_get_current_buf() | ||||||
|   for _, client in pairs(lsp.get_clients({ bufnr = bufnr })) do |   for _, client in pairs(lsp.get_clients({ bufnr = bufnr })) do | ||||||
|     if client.supports_method(ms.textDocument_rangeFormatting) then |     if client:supports_method(ms.textDocument_rangeFormatting) then | ||||||
|       local params = util.make_formatting_params() |       local params = util.make_formatting_params() | ||||||
|       local end_line = vim.fn.getline(end_lnum) --[[@as string]] |       local end_line = vim.fn.getline(end_lnum) --[[@as string]] | ||||||
|       local end_col = vim.str_utfindex(end_line, client.offset_encoding) |       local end_col = vim.str_utfindex(end_line, client.offset_encoding) | ||||||
| @@ -1065,7 +1065,7 @@ function lsp.formatexpr(opts) | |||||||
|         }, |         }, | ||||||
|       } |       } | ||||||
|       local response = |       local response = | ||||||
|         client.request_sync(ms.textDocument_rangeFormatting, params, timeout_ms, bufnr) |         client:request_sync(ms.textDocument_rangeFormatting, params, timeout_ms, bufnr) | ||||||
|       if response and response.result then |       if response and response.result then | ||||||
|         lsp.util.apply_text_edits(response.result, bufnr, client.offset_encoding) |         lsp.util.apply_text_edits(response.result, bufnr, client.offset_encoding) | ||||||
|         return 0 |         return 0 | ||||||
|   | |||||||
| @@ -40,7 +40,7 @@ local M = {} | |||||||
| --- @class vim.lsp.CTGroupState | --- @class vim.lsp.CTGroupState | ||||||
| --- @field buffers table<integer,vim.lsp.CTBufferState> | --- @field buffers table<integer,vim.lsp.CTBufferState> | ||||||
| --- @field debounce integer debounce duration in ms | --- @field debounce integer debounce duration in ms | ||||||
| --- @field clients table<integer, table> clients using this state. {client_id, client} | --- @field clients table<integer, vim.lsp.Client> clients using this state. {client_id, client} | ||||||
|  |  | ||||||
| ---@param group vim.lsp.CTGroup | ---@param group vim.lsp.CTGroup | ||||||
| ---@return string | ---@return string | ||||||
| @@ -273,8 +273,8 @@ local function send_changes(bufnr, sync_kind, state, buf_state) | |||||||
|   end |   end | ||||||
|   local uri = vim.uri_from_bufnr(bufnr) |   local uri = vim.uri_from_bufnr(bufnr) | ||||||
|   for _, client in pairs(state.clients) do |   for _, client in pairs(state.clients) do | ||||||
|     if not client.is_stopped() and vim.lsp.buf_is_attached(bufnr, client.id) then |     if not client:is_stopped() and vim.lsp.buf_is_attached(bufnr, client.id) then | ||||||
|       client.notify(protocol.Methods.textDocument_didChange, { |       client:notify(protocol.Methods.textDocument_didChange, { | ||||||
|         textDocument = { |         textDocument = { | ||||||
|           uri = uri, |           uri = uri, | ||||||
|           version = util.buf_versions[bufnr], |           version = util.buf_versions[bufnr], | ||||||
|   | |||||||
| @@ -59,7 +59,7 @@ local function query_definition(pattern) | |||||||
|       remaining = remaining - 1 |       remaining = remaining - 1 | ||||||
|     end |     end | ||||||
|     local params = util.make_position_params(win, client.offset_encoding) |     local params = util.make_position_params(win, client.offset_encoding) | ||||||
|     client.request(ms.textDocument_definition, params, on_response, bufnr) |     client:request(ms.textDocument_definition, params, on_response, bufnr) | ||||||
|   end |   end | ||||||
|   vim.wait(1000, function() |   vim.wait(1000, function() | ||||||
|     return remaining == 0 |     return remaining == 0 | ||||||
|   | |||||||
| @@ -116,7 +116,7 @@ function M.register(reg, client_id) | |||||||
|               local params = { |               local params = { | ||||||
|                 changes = change_queues[client_id], |                 changes = change_queues[client_id], | ||||||
|               } |               } | ||||||
|               client.notify(ms.workspace_didChangeWatchedFiles, params) |               client:notify(ms.workspace_didChangeWatchedFiles, params) | ||||||
|               queue_timers[client_id] = nil |               queue_timers[client_id] = nil | ||||||
|               change_queues[client_id] = nil |               change_queues[client_id] = nil | ||||||
|               change_cache[client_id] = nil |               change_cache[client_id] = nil | ||||||
|   | |||||||
| @@ -232,7 +232,7 @@ local function get_locations(method, opts) | |||||||
|   end |   end | ||||||
|   for _, client in ipairs(clients) do |   for _, client in ipairs(clients) do | ||||||
|     local params = util.make_position_params(win, client.offset_encoding) |     local params = util.make_position_params(win, client.offset_encoding) | ||||||
|     client.request(method, params, function(_, result) |     client:request(method, params, function(_, result) | ||||||
|       on_response(_, result, client) |       on_response(_, result, client) | ||||||
|     end) |     end) | ||||||
|   end |   end | ||||||
| @@ -568,12 +568,14 @@ function M.format(opts) | |||||||
|   end |   end | ||||||
|  |  | ||||||
|   if opts.async then |   if opts.async then | ||||||
|  |     --- @param idx integer | ||||||
|  |     --- @param client vim.lsp.Client | ||||||
|     local function do_format(idx, client) |     local function do_format(idx, client) | ||||||
|       if not client then |       if not client then | ||||||
|         return |         return | ||||||
|       end |       end | ||||||
|       local params = set_range(client, util.make_formatting_params(opts.formatting_options)) |       local params = set_range(client, util.make_formatting_params(opts.formatting_options)) | ||||||
|       client.request(method, params, function(...) |       client:request(method, params, function(...) | ||||||
|         local handler = client.handlers[method] or lsp.handlers[method] |         local handler = client.handlers[method] or lsp.handlers[method] | ||||||
|         handler(...) |         handler(...) | ||||||
|         do_format(next(clients, idx)) |         do_format(next(clients, idx)) | ||||||
| @@ -584,7 +586,7 @@ function M.format(opts) | |||||||
|     local timeout_ms = opts.timeout_ms or 1000 |     local timeout_ms = opts.timeout_ms or 1000 | ||||||
|     for _, client in pairs(clients) do |     for _, client in pairs(clients) do | ||||||
|       local params = set_range(client, util.make_formatting_params(opts.formatting_options)) |       local params = set_range(client, util.make_formatting_params(opts.formatting_options)) | ||||||
|       local result, err = client.request_sync(method, params, timeout_ms, bufnr) |       local result, err = client:request_sync(method, params, timeout_ms, bufnr) | ||||||
|       if result and result.result then |       if result and result.result then | ||||||
|         util.apply_text_edits(result.result, bufnr, client.offset_encoding) |         util.apply_text_edits(result.result, bufnr, client.offset_encoding) | ||||||
|       elseif err then |       elseif err then | ||||||
| @@ -648,6 +650,8 @@ function M.rename(new_name, opts) | |||||||
|     )[1] |     )[1] | ||||||
|   end |   end | ||||||
|  |  | ||||||
|  |   --- @param idx integer | ||||||
|  |   --- @param client? vim.lsp.Client | ||||||
|   local function try_use_client(idx, client) |   local function try_use_client(idx, client) | ||||||
|     if not client then |     if not client then | ||||||
|       return |       return | ||||||
| @@ -659,15 +663,15 @@ function M.rename(new_name, opts) | |||||||
|       params.newName = name |       params.newName = name | ||||||
|       local handler = client.handlers[ms.textDocument_rename] |       local handler = client.handlers[ms.textDocument_rename] | ||||||
|         or lsp.handlers[ms.textDocument_rename] |         or lsp.handlers[ms.textDocument_rename] | ||||||
|       client.request(ms.textDocument_rename, params, function(...) |       client:request(ms.textDocument_rename, params, function(...) | ||||||
|         handler(...) |         handler(...) | ||||||
|         try_use_client(next(clients, idx)) |         try_use_client(next(clients, idx)) | ||||||
|       end, bufnr) |       end, bufnr) | ||||||
|     end |     end | ||||||
|  |  | ||||||
|     if client.supports_method(ms.textDocument_prepareRename) then |     if client:supports_method(ms.textDocument_prepareRename) then | ||||||
|       local params = util.make_position_params(win, client.offset_encoding) |       local params = util.make_position_params(win, client.offset_encoding) | ||||||
|       client.request(ms.textDocument_prepareRename, params, function(err, result) |       client:request(ms.textDocument_prepareRename, params, function(err, result) | ||||||
|         if err or result == nil then |         if err or result == nil then | ||||||
|           if next(clients, idx) then |           if next(clients, idx) then | ||||||
|             try_use_client(next(clients, idx)) |             try_use_client(next(clients, idx)) | ||||||
| @@ -706,7 +710,7 @@ function M.rename(new_name, opts) | |||||||
|       end, bufnr) |       end, bufnr) | ||||||
|     else |     else | ||||||
|       assert( |       assert( | ||||||
|         client.supports_method(ms.textDocument_rename), |         client:supports_method(ms.textDocument_rename), | ||||||
|         'Client must support textDocument/rename' |         'Client must support textDocument/rename' | ||||||
|       ) |       ) | ||||||
|       if new_name then |       if new_name then | ||||||
| @@ -781,7 +785,7 @@ function M.references(context, opts) | |||||||
|     params.context = context or { |     params.context = context or { | ||||||
|       includeDeclaration = true, |       includeDeclaration = true, | ||||||
|     } |     } | ||||||
|     client.request(ms.textDocument_references, params, function(_, result) |     client:request(ms.textDocument_references, params, function(_, result) | ||||||
|       local items = util.locations_to_items(result or {}, client.offset_encoding) |       local items = util.locations_to_items(result or {}, client.offset_encoding) | ||||||
|       vim.list_extend(all_items, items) |       vim.list_extend(all_items, items) | ||||||
|       remaining = remaining - 1 |       remaining = remaining - 1 | ||||||
| @@ -813,7 +817,7 @@ local function request_with_id(client_id, method, params, handler, bufnr) | |||||||
|     ) |     ) | ||||||
|     return |     return | ||||||
|   end |   end | ||||||
|   client.request(method, params, handler, bufnr) |   client:request(method, params, handler, bufnr) | ||||||
| end | end | ||||||
|  |  | ||||||
| --- @param item lsp.TypeHierarchyItem|lsp.CallHierarchyItem | --- @param item lsp.TypeHierarchyItem|lsp.CallHierarchyItem | ||||||
| @@ -880,7 +884,7 @@ local function hierarchy(method) | |||||||
|   for _, client in ipairs(clients) do |   for _, client in ipairs(clients) do | ||||||
|     local params = util.make_position_params(win, client.offset_encoding) |     local params = util.make_position_params(win, client.offset_encoding) | ||||||
|     --- @param result lsp.CallHierarchyItem[]|lsp.TypeHierarchyItem[]? |     --- @param result lsp.CallHierarchyItem[]|lsp.TypeHierarchyItem[]? | ||||||
|     client.request(prepare_method, params, function(err, result, ctx) |     client:request(prepare_method, params, function(err, result, ctx) | ||||||
|       if err then |       if err then | ||||||
|         vim.notify(err.message, vim.log.levels.WARN) |         vim.notify(err.message, vim.log.levels.WARN) | ||||||
|       elseif result then |       elseif result then | ||||||
| @@ -1131,8 +1135,8 @@ local function on_code_action_results(results, opts) | |||||||
|     local action = choice.action |     local action = choice.action | ||||||
|     local bufnr = assert(choice.ctx.bufnr, 'Must have buffer number') |     local bufnr = assert(choice.ctx.bufnr, 'Must have buffer number') | ||||||
|  |  | ||||||
|     if not action.edit and client.supports_method(ms.codeAction_resolve) then |     if not action.edit and client:supports_method(ms.codeAction_resolve) then | ||||||
|       client.request(ms.codeAction_resolve, action, function(err, resolved_action) |       client:request(ms.codeAction_resolve, action, function(err, resolved_action) | ||||||
|         if err then |         if err then | ||||||
|           if action.command then |           if action.command then | ||||||
|             apply_action(action, client, choice.ctx) |             apply_action(action, client, choice.ctx) | ||||||
| @@ -1253,7 +1257,7 @@ function M.code_action(opts) | |||||||
|       }) |       }) | ||||||
|     end |     end | ||||||
|  |  | ||||||
|     client.request(ms.textDocument_codeAction, params, on_result, bufnr) |     client:request(ms.textDocument_codeAction, params, on_result, bufnr) | ||||||
|   end |   end | ||||||
| end | end | ||||||
|  |  | ||||||
|   | |||||||
| @@ -219,70 +219,28 @@ local validate = vim.validate | |||||||
| --- @field private registrations table<string,lsp.Registration[]> | --- @field private registrations table<string,lsp.Registration[]> | ||||||
| --- @field dynamic_capabilities lsp.DynamicCapabilities | --- @field dynamic_capabilities lsp.DynamicCapabilities | ||||||
| --- | --- | ||||||
| --- Sends a request to the server. |  | ||||||
| --- This is a thin wrapper around {client.rpc.request} with some additional |  | ||||||
| --- checking. |  | ||||||
| --- If {handler} is not specified and if there's no respective global |  | ||||||
| --- handler, then an error will occur. |  | ||||||
| --- Returns: {status}, {client_id}?. {status} is a boolean indicating if |  | ||||||
| --- the notification was successful. If it is `false`, then it will always |  | ||||||
| --- be `false` (the client has shutdown). |  | ||||||
| --- If {status} is `true`, the function returns {request_id} as the second |  | ||||||
| --- result. You can use this with `client.cancel_request(request_id)` to cancel |  | ||||||
| --- the request. |  | ||||||
| --- @field request fun(method: string, params: table?, handler: lsp.Handler?, bufnr: integer?): boolean, integer? |  | ||||||
| --- |  | ||||||
| --- Sends a request to the server and synchronously waits for the response. |  | ||||||
| --- This is a wrapper around {client.request} |  | ||||||
| --- Returns: { err=err, result=result }, a dict, where `err` and `result` |  | ||||||
| --- come from the |lsp-handler|. On timeout, cancel or error, returns `(nil, |  | ||||||
| --- err)` where `err` is a string describing the failure reason. If the request |  | ||||||
| --- was unsuccessful returns `nil`. |  | ||||||
| --- @field request_sync fun(method: string, params: table?, timeout_ms: integer?, bufnr: integer): {err: lsp.ResponseError|nil, result:any}|nil, string|nil err # a dict |  | ||||||
| --- |  | ||||||
| --- Sends a notification to an LSP server. |  | ||||||
| --- Returns: a boolean to indicate if the notification was successful. If |  | ||||||
| --- it is false, then it will always be false (the client has shutdown). |  | ||||||
| --- @field notify fun(method: string, params: table?): boolean |  | ||||||
| --- |  | ||||||
| --- Cancels a request with a given request id. |  | ||||||
| --- Returns: same as `notify()`. |  | ||||||
| --- @field cancel_request fun(id: integer): boolean |  | ||||||
| --- |  | ||||||
| --- Stops a client, optionally with force. |  | ||||||
| --- By default, it will just ask the server to shutdown without force. |  | ||||||
| --- If you request to stop a client which has previously been requested to |  | ||||||
| --- shutdown, it will automatically escalate and force shutdown. |  | ||||||
| --- @field stop fun(force?: boolean) |  | ||||||
| --- |  | ||||||
| --- Runs the on_attach function from the client's config if it was defined. |  | ||||||
| --- Useful for buffer-local setup. |  | ||||||
| --- @field on_attach fun(bufnr: integer) |  | ||||||
| --- |  | ||||||
| --- @field private _before_init_cb? vim.lsp.client.before_init_cb | --- @field private _before_init_cb? vim.lsp.client.before_init_cb | ||||||
| --- @field private _on_attach_cbs vim.lsp.client.on_attach_cb[] | --- @field private _on_attach_cbs vim.lsp.client.on_attach_cb[] | ||||||
| --- @field private _on_init_cbs vim.lsp.client.on_init_cb[] | --- @field private _on_init_cbs vim.lsp.client.on_init_cb[] | ||||||
| --- @field private _on_exit_cbs vim.lsp.client.on_exit_cb[] | --- @field private _on_exit_cbs vim.lsp.client.on_exit_cb[] | ||||||
| --- @field private _on_error_cb? fun(code: integer, err: string) | --- @field private _on_error_cb? fun(code: integer, err: string) | ||||||
| --- |  | ||||||
| --- Checks if a client supports a given method. |  | ||||||
| --- Always returns true for unknown off-spec methods. |  | ||||||
| --- {opts} is a optional `{bufnr?: integer}` table. |  | ||||||
| --- Some language server capabilities can be file specific. |  | ||||||
| --- @field supports_method fun(method: string, opts?: {bufnr: integer?}): boolean |  | ||||||
| --- |  | ||||||
| --- Checks whether a client is stopped. |  | ||||||
| --- Returns: true if the client is fully stopped. |  | ||||||
| --- @field is_stopped fun(): boolean |  | ||||||
| local Client = {} | local Client = {} | ||||||
| Client.__index = Client | Client.__index = Client | ||||||
|  |  | ||||||
| --- @param cls table | --- @param obj table<string,any> | ||||||
| --- @param meth any | --- @param cls table<string,function> | ||||||
| --- @return function | --- @param name string | ||||||
| local function method_wrapper(cls, meth) | local function method_wrapper(obj, cls, name) | ||||||
|   return function(...) |   local meth = assert(cls[name]) | ||||||
|     return meth(cls, ...) |   obj[name] = function(...) | ||||||
|  |     local arg = select(1, ...) | ||||||
|  |     if arg and getmetatable(arg) == cls then | ||||||
|  |       -- First argument is self, call meth directly | ||||||
|  |       return meth(...) | ||||||
|  |     end | ||||||
|  |     vim.deprecate('client.' .. name, 'client:' .. name, '0.13') | ||||||
|  |     -- First argument is not self, insert it | ||||||
|  |     return meth(obj, ...) | ||||||
|   end |   end | ||||||
| end | end | ||||||
|  |  | ||||||
| @@ -499,24 +457,23 @@ function Client.create(config) | |||||||
|     end, |     end, | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   self.request = method_wrapper(self, Client._request) |  | ||||||
|   self.request_sync = method_wrapper(self, Client._request_sync) |  | ||||||
|   self.notify = method_wrapper(self, Client._notify) |  | ||||||
|   self.cancel_request = method_wrapper(self, Client._cancel_request) |  | ||||||
|   self.stop = method_wrapper(self, Client._stop) |  | ||||||
|   self.is_stopped = method_wrapper(self, Client._is_stopped) |  | ||||||
|   self.on_attach = method_wrapper(self, Client._on_attach) |  | ||||||
|   self.supports_method = method_wrapper(self, Client._supports_method) |  | ||||||
|  |  | ||||||
|   --- @type table<string|integer, string> title of unfinished progress sequences by token |   --- @type table<string|integer, string> title of unfinished progress sequences by token | ||||||
|   self.progress.pending = {} |   self.progress.pending = {} | ||||||
|  |  | ||||||
|   --- @type vim.lsp.rpc.Dispatchers |   --- @type vim.lsp.rpc.Dispatchers | ||||||
|   local dispatchers = { |   local dispatchers = { | ||||||
|     notification = method_wrapper(self, Client._notification), |     notification = function(...) | ||||||
|     server_request = method_wrapper(self, Client._server_request), |       return self:_notification(...) | ||||||
|     on_error = method_wrapper(self, Client._on_error), |     end, | ||||||
|     on_exit = method_wrapper(self, Client._on_exit), |     server_request = function(...) | ||||||
|  |       return self:_server_request(...) | ||||||
|  |     end, | ||||||
|  |     on_error = function(...) | ||||||
|  |       return self:_on_error(...) | ||||||
|  |     end, | ||||||
|  |     on_exit = function(...) | ||||||
|  |       return self:_on_exit(...) | ||||||
|  |     end, | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   -- Start the RPC client. |   -- Start the RPC client. | ||||||
| @@ -533,6 +490,15 @@ function Client.create(config) | |||||||
|  |  | ||||||
|   setmetatable(self, Client) |   setmetatable(self, Client) | ||||||
|  |  | ||||||
|  |   method_wrapper(self, Client, 'request') | ||||||
|  |   method_wrapper(self, Client, 'request_sync') | ||||||
|  |   method_wrapper(self, Client, 'notify') | ||||||
|  |   method_wrapper(self, Client, 'cancel_request') | ||||||
|  |   method_wrapper(self, Client, 'stop') | ||||||
|  |   method_wrapper(self, Client, 'is_stopped') | ||||||
|  |   method_wrapper(self, Client, 'on_attach') | ||||||
|  |   method_wrapper(self, Client, 'supports_method') | ||||||
|  |  | ||||||
|   return self |   return self | ||||||
| end | end | ||||||
|  |  | ||||||
| @@ -616,7 +582,7 @@ function Client:initialize() | |||||||
|     end |     end | ||||||
|  |  | ||||||
|     if next(self.settings) then |     if next(self.settings) then | ||||||
|       self:_notify(ms.workspace_didChangeConfiguration, { settings = self.settings }) |       self:notify(ms.workspace_didChangeConfiguration, { settings = self.settings }) | ||||||
|     end |     end | ||||||
|  |  | ||||||
|     -- If server is being restarted, make sure to re-attach to any previously attached buffers. |     -- If server is being restarted, make sure to re-attach to any previously attached buffers. | ||||||
| @@ -628,7 +594,7 @@ function Client:initialize() | |||||||
|     for buf in pairs(reattach_bufs) do |     for buf in pairs(reattach_bufs) do | ||||||
|       -- The buffer may have been detached in the on_init callback. |       -- The buffer may have been detached in the on_init callback. | ||||||
|       if self.attached_buffers[buf] then |       if self.attached_buffers[buf] then | ||||||
|         self:_on_attach(buf) |         self:on_attach(buf) | ||||||
|       end |       end | ||||||
|     end |     end | ||||||
|  |  | ||||||
| @@ -645,14 +611,14 @@ end | |||||||
| --- Returns the default handler if the user hasn't set a custom one. | --- Returns the default handler if the user hasn't set a custom one. | ||||||
| --- | --- | ||||||
| --- @param method (string) LSP method name | --- @param method (string) LSP method name | ||||||
| --- @return lsp.Handler|nil handler for the given method, if defined, or the default from |vim.lsp.handlers| | --- @return lsp.Handler? handler for the given method, if defined, or the default from |vim.lsp.handlers| | ||||||
| function Client:_resolve_handler(method) | function Client:_resolve_handler(method) | ||||||
|   return self.handlers[method] or lsp.handlers[method] |   return self.handlers[method] or lsp.handlers[method] | ||||||
| end | end | ||||||
|  |  | ||||||
| --- Returns the buffer number for the given {bufnr}. | --- Returns the buffer number for the given {bufnr}. | ||||||
| --- | --- | ||||||
| --- @param bufnr (integer|nil) Buffer number to resolve. Defaults to current buffer | --- @param bufnr integer? Buffer number to resolve. Defaults to current buffer | ||||||
| --- @return integer bufnr | --- @return integer bufnr | ||||||
| local function resolve_bufnr(bufnr) | local function resolve_bufnr(bufnr) | ||||||
|   validate('bufnr', bufnr, 'number', true) |   validate('bufnr', bufnr, 'number', true) | ||||||
| @@ -662,7 +628,6 @@ local function resolve_bufnr(bufnr) | |||||||
|   return bufnr |   return bufnr | ||||||
| end | end | ||||||
|  |  | ||||||
| --- @private |  | ||||||
| --- Sends a request to the server. | --- Sends a request to the server. | ||||||
| --- | --- | ||||||
| --- This is a thin wrapper around {client.rpc.request} with some additional | --- This is a thin wrapper around {client.rpc.request} with some additional | ||||||
| @@ -671,15 +636,14 @@ end | |||||||
| --- @param method string LSP method name. | --- @param method string LSP method name. | ||||||
| --- @param params? table LSP request params. | --- @param params? table LSP request params. | ||||||
| --- @param handler? lsp.Handler Response |lsp-handler| for this method. | --- @param handler? lsp.Handler Response |lsp-handler| for this method. | ||||||
| --- @param bufnr integer Buffer handle (0 for current). | --- @param bufnr? integer Buffer handle. 0 for current (default). | ||||||
| --- @return boolean status, integer? request_id {status} is a bool indicating | --- @return boolean status indicates whether the request was successful. | ||||||
| --- whether the request was successful. If it is `false`, then it will | ---     If it is `false`, then it will always be `false` (the client has shutdown). | ||||||
| --- always be `false` (the client has shutdown). If it was | --- @return integer? request_id Can be used with |Client:cancel_request()|. | ||||||
| --- successful, then it will return {request_id} as the | ---                             `nil` is request failed. | ||||||
| --- second result. You can use this with `client.cancel_request(request_id)` |  | ||||||
| --- to cancel the-request. | --- to cancel the-request. | ||||||
| --- @see |vim.lsp.buf_request_all()| | --- @see |vim.lsp.buf_request_all()| | ||||||
| function Client:_request(method, params, handler, bufnr) | function Client:request(method, params, handler, bufnr) | ||||||
|   if not handler then |   if not handler then | ||||||
|     handler = assert( |     handler = assert( | ||||||
|       self:_resolve_handler(method), |       self:_resolve_handler(method), | ||||||
| @@ -688,8 +652,8 @@ function Client:_request(method, params, handler, bufnr) | |||||||
|   end |   end | ||||||
|   -- Ensure pending didChange notifications are sent so that the server doesn't operate on a stale state |   -- Ensure pending didChange notifications are sent so that the server doesn't operate on a stale state | ||||||
|   changetracking.flush(self, bufnr) |   changetracking.flush(self, bufnr) | ||||||
|   local version = lsp.util.buf_versions[bufnr] |  | ||||||
|   bufnr = resolve_bufnr(bufnr) |   bufnr = resolve_bufnr(bufnr) | ||||||
|  |   local version = lsp.util.buf_versions[bufnr] | ||||||
|   log.debug(self._log_prefix, 'client.request', self.id, method, params, handler, bufnr) |   log.debug(self._log_prefix, 'client.request', self.id, method, params, handler, bufnr) | ||||||
|   local success, request_id = self.rpc.request(method, params, function(err, result) |   local success, request_id = self.rpc.request(method, params, function(err, result) | ||||||
|     local context = { |     local context = { | ||||||
| @@ -743,29 +707,27 @@ local function err_message(...) | |||||||
|   end |   end | ||||||
| end | end | ||||||
|  |  | ||||||
| --- @private |  | ||||||
| --- Sends a request to the server and synchronously waits for the response. | --- Sends a request to the server and synchronously waits for the response. | ||||||
| --- | --- | ||||||
| --- This is a wrapper around {client.request} | --- This is a wrapper around |Client:request()| | ||||||
| --- | --- | ||||||
| --- @param method (string) LSP method name. | --- @param method string LSP method name. | ||||||
| --- @param params (table) LSP request params. | --- @param params table LSP request params. | ||||||
| --- @param timeout_ms (integer|nil) Maximum time in milliseconds to wait for | --- @param timeout_ms integer? Maximum time in milliseconds to wait for | ||||||
| ---                                a result. Defaults to 1000 | ---                                a result. Defaults to 1000 | ||||||
| --- @param bufnr (integer) Buffer handle (0 for current). | --- @param bufnr integer Buffer handle (0 for current). | ||||||
| --- @return {err: lsp.ResponseError|nil, result:any}|nil, string|nil err # a dict, where | --- @return {err: lsp.ResponseError?, result:any}? `result` and `err` from the |lsp-handler|. | ||||||
| --- `err` and `result` come from the |lsp-handler|. | ---                 `nil` is the request was unsuccessful | ||||||
| --- On timeout, cancel or error, returns `(nil, err)` where `err` is a | --- @return string? err On timeout, cancel or error, where `err` is a | ||||||
| --- string describing the failure reason. If the request was unsuccessful | ---                 string describing the failure reason. | ||||||
| --- returns `nil`. |  | ||||||
| --- @see |vim.lsp.buf_request_sync()| | --- @see |vim.lsp.buf_request_sync()| | ||||||
| function Client:_request_sync(method, params, timeout_ms, bufnr) | function Client:request_sync(method, params, timeout_ms, bufnr) | ||||||
|   local request_result = nil |   local request_result = nil | ||||||
|   local function _sync_handler(err, result) |   local function _sync_handler(err, result) | ||||||
|     request_result = { err = err, result = result } |     request_result = { err = err, result = result } | ||||||
|   end |   end | ||||||
|  |  | ||||||
|   local success, request_id = self:_request(method, params, _sync_handler, bufnr) |   local success, request_id = self:request(method, params, _sync_handler, bufnr) | ||||||
|   if not success then |   if not success then | ||||||
|     return nil |     return nil | ||||||
|   end |   end | ||||||
| @@ -776,22 +738,20 @@ function Client:_request_sync(method, params, timeout_ms, bufnr) | |||||||
|  |  | ||||||
|   if not wait_result then |   if not wait_result then | ||||||
|     if request_id then |     if request_id then | ||||||
|       self:_cancel_request(request_id) |       self:cancel_request(request_id) | ||||||
|     end |     end | ||||||
|     return nil, wait_result_reason[reason] |     return nil, wait_result_reason[reason] | ||||||
|   end |   end | ||||||
|   return request_result |   return request_result | ||||||
| end | end | ||||||
|  |  | ||||||
| --- @package |  | ||||||
| --- Sends a notification to an LSP server. | --- Sends a notification to an LSP server. | ||||||
| --- | --- | ||||||
| --- @param method string LSP method name. | --- @param method string LSP method name. | ||||||
| --- @param params table|nil LSP request params. | --- @param params table? LSP request params. | ||||||
| --- @return boolean status true if the notification was successful. | --- @return boolean status indicating if the notification was successful. | ||||||
| --- If it is false, then it will always be false | ---                        If it is false, then the client has shutdown. | ||||||
| --- (the client has shutdown). | function Client:notify(method, params) | ||||||
| function Client:_notify(method, params) |  | ||||||
|   if method ~= ms.textDocument_didChange then |   if method ~= ms.textDocument_didChange then | ||||||
|     changetracking.flush(self) |     changetracking.flush(self) | ||||||
|   end |   end | ||||||
| @@ -814,13 +774,12 @@ function Client:_notify(method, params) | |||||||
|   return client_active |   return client_active | ||||||
| end | end | ||||||
|  |  | ||||||
| --- @private |  | ||||||
| --- Cancels a request with a given request id. | --- Cancels a request with a given request id. | ||||||
| --- | --- | ||||||
| --- @param id (integer) id of request to cancel | --- @param id integer id of request to cancel | ||||||
| --- @return boolean status true if notification was successful. false otherwise | --- @return boolean status indicating if the notification was successful. | ||||||
| --- @see |vim.lsp.client.notify()| | --- @see |Client:notify()| | ||||||
| function Client:_cancel_request(id) | function Client:cancel_request(id) | ||||||
|   validate('id', id, 'number') |   validate('id', id, 'number') | ||||||
|   local request = self.requests[id] |   local request = self.requests[id] | ||||||
|   if request and request.type == 'pending' then |   if request and request.type == 'pending' then | ||||||
| @@ -834,15 +793,14 @@ function Client:_cancel_request(id) | |||||||
|   return self.rpc.notify(ms.dollar_cancelRequest, { id = id }) |   return self.rpc.notify(ms.dollar_cancelRequest, { id = id }) | ||||||
| end | end | ||||||
|  |  | ||||||
| --- @private |  | ||||||
| --- Stops a client, optionally with force. | --- Stops a client, optionally with force. | ||||||
| --- | --- | ||||||
| --- By default, it will just ask the - server to shutdown without force. If | --- By default, it will just request the server to shutdown without force. If | ||||||
| --- you request to stop a client which has previously been requested to | --- you request to stop a client which has previously been requested to | ||||||
| --- shutdown, it will automatically escalate and force shutdown. | --- shutdown, it will automatically escalate and force shutdown. | ||||||
| --- | --- | ||||||
| --- @param force boolean|nil | --- @param force? boolean | ||||||
| function Client:_stop(force) | function Client:stop(force) | ||||||
|   local rpc = self.rpc |   local rpc = self.rpc | ||||||
|  |  | ||||||
|   if rpc.is_closing() then |   if rpc.is_closing() then | ||||||
| @@ -966,12 +924,11 @@ function Client:_get_registration(method, bufnr) | |||||||
|   end |   end | ||||||
| end | end | ||||||
|  |  | ||||||
| --- @private |  | ||||||
| --- Checks whether a client is stopped. | --- Checks whether a client is stopped. | ||||||
| --- | --- | ||||||
| --- @return boolean # true if client is stopped or in the process of being | --- @return boolean # true if client is stopped or in the process of being | ||||||
| --- stopped; false otherwise | --- stopped; false otherwise | ||||||
| function Client:_is_stopped() | function Client:is_stopped() | ||||||
|   return self.rpc.is_closing() |   return self.rpc.is_closing() | ||||||
| end | end | ||||||
|  |  | ||||||
| @@ -1013,7 +970,7 @@ function Client:exec_cmd(command, context, handler) | |||||||
|     command = cmdname, |     command = cmdname, | ||||||
|     arguments = command.arguments, |     arguments = command.arguments, | ||||||
|   } |   } | ||||||
|   self.request(ms.workspace_executeCommand, params, handler, context.bufnr) |   self:request(ms.workspace_executeCommand, params, handler, context.bufnr) | ||||||
| end | end | ||||||
|  |  | ||||||
| --- Default handler for the 'textDocument/didOpen' LSP notification. | --- Default handler for the 'textDocument/didOpen' LSP notification. | ||||||
| @@ -1021,14 +978,14 @@ end | |||||||
| --- @param bufnr integer Number of the buffer, or 0 for current | --- @param bufnr integer Number of the buffer, or 0 for current | ||||||
| function Client:_text_document_did_open_handler(bufnr) | function Client:_text_document_did_open_handler(bufnr) | ||||||
|   changetracking.init(self, bufnr) |   changetracking.init(self, bufnr) | ||||||
|   if not self.supports_method(ms.textDocument_didOpen) then |   if not self:supports_method(ms.textDocument_didOpen) then | ||||||
|     return |     return | ||||||
|   end |   end | ||||||
|   if not api.nvim_buf_is_loaded(bufnr) then |   if not api.nvim_buf_is_loaded(bufnr) then | ||||||
|     return |     return | ||||||
|   end |   end | ||||||
|  |  | ||||||
|   self.notify(ms.textDocument_didOpen, { |   self:notify(ms.textDocument_didOpen, { | ||||||
|     textDocument = { |     textDocument = { | ||||||
|       version = lsp.util.buf_versions[bufnr], |       version = lsp.util.buf_versions[bufnr], | ||||||
|       uri = vim.uri_from_bufnr(bufnr), |       uri = vim.uri_from_bufnr(bufnr), | ||||||
| @@ -1049,8 +1006,9 @@ function Client:_text_document_did_open_handler(bufnr) | |||||||
| end | end | ||||||
|  |  | ||||||
| --- Runs the on_attach function from the client's config if it was defined. | --- Runs the on_attach function from the client's config if it was defined. | ||||||
|  | --- Useful for buffer-local setup. | ||||||
| --- @param bufnr integer Buffer number | --- @param bufnr integer Buffer number | ||||||
| function Client:_on_attach(bufnr) | function Client:on_attach(bufnr) | ||||||
|   self:_text_document_did_open_handler(bufnr) |   self:_text_document_did_open_handler(bufnr) | ||||||
|  |  | ||||||
|   lsp._set_defaults(self, bufnr) |   lsp._set_defaults(self, bufnr) | ||||||
| @@ -1085,10 +1043,18 @@ function Client:write_error(code, err) | |||||||
|   err_message(self._log_prefix, ': Error ', client_error, ': ', vim.inspect(err)) |   err_message(self._log_prefix, ': Error ', client_error, ': ', vim.inspect(err)) | ||||||
| end | end | ||||||
|  |  | ||||||
| --- @private | --- Checks if a client supports a given method. | ||||||
|  | --- Always returns true for unknown off-spec methods. | ||||||
|  | --- | ||||||
|  | --- Note: Some language server capabilities can be file specific. | ||||||
| --- @param method string | --- @param method string | ||||||
| --- @param opts? {bufnr: integer?} | --- @param bufnr? integer | ||||||
| function Client:_supports_method(method, opts) | function Client:supports_method(method, bufnr) | ||||||
|  |   -- Deprecated form | ||||||
|  |   if type(bufnr) == 'table' then | ||||||
|  |     --- @diagnostic disable-next-line:no-unknown | ||||||
|  |     bufnr = bufnr.bufnr | ||||||
|  |   end | ||||||
|   local required_capability = lsp._request_name_to_capability[method] |   local required_capability = lsp._request_name_to_capability[method] | ||||||
|   -- if we don't know about the method, assume that the client supports it. |   -- if we don't know about the method, assume that the client supports it. | ||||||
|   if not required_capability then |   if not required_capability then | ||||||
| @@ -1101,12 +1067,12 @@ function Client:_supports_method(method, opts) | |||||||
|   local rmethod = lsp._resolve_to_request[method] |   local rmethod = lsp._resolve_to_request[method] | ||||||
|   if rmethod then |   if rmethod then | ||||||
|     if self:_supports_registration(rmethod) then |     if self:_supports_registration(rmethod) then | ||||||
|       local reg = self:_get_registration(rmethod, opts and opts.bufnr) |       local reg = self:_get_registration(rmethod, bufnr) | ||||||
|       return vim.tbl_get(reg or {}, 'registerOptions', 'resolveProvider') or false |       return vim.tbl_get(reg or {}, 'registerOptions', 'resolveProvider') or false | ||||||
|     end |     end | ||||||
|   else |   else | ||||||
|     if self:_supports_registration(method) then |     if self:_supports_registration(method) then | ||||||
|       return self:_get_registration(method, opts and opts.bufnr) ~= nil |       return self:_get_registration(method, bufnr) ~= nil | ||||||
|     end |     end | ||||||
|   end |   end | ||||||
|   return false |   return false | ||||||
| @@ -1207,7 +1173,7 @@ function Client:_add_workspace_folder(dir) | |||||||
|  |  | ||||||
|   local wf = assert(get_workspace_folders(dir)) |   local wf = assert(get_workspace_folders(dir)) | ||||||
|  |  | ||||||
|   self:_notify(ms.workspace_didChangeWorkspaceFolders, { |   self:notify(ms.workspace_didChangeWorkspaceFolders, { | ||||||
|     event = { added = wf, removed = {} }, |     event = { added = wf, removed = {} }, | ||||||
|   }) |   }) | ||||||
|  |  | ||||||
| @@ -1222,7 +1188,7 @@ end | |||||||
| function Client:_remove_workspace_folder(dir) | function Client:_remove_workspace_folder(dir) | ||||||
|   local wf = assert(get_workspace_folders(dir)) |   local wf = assert(get_workspace_folders(dir)) | ||||||
|  |  | ||||||
|   self:_notify(ms.workspace_didChangeWorkspaceFolders, { |   self:notify(ms.workspace_didChangeWorkspaceFolders, { | ||||||
|     event = { added = {}, removed = wf }, |     event = { added = {}, removed = wf }, | ||||||
|   }) |   }) | ||||||
|  |  | ||||||
|   | |||||||
| @@ -231,7 +231,7 @@ local function resolve_lenses(lenses, bufnr, client_id, callback) | |||||||
|       countdown() |       countdown() | ||||||
|     else |     else | ||||||
|       assert(client) |       assert(client) | ||||||
|       client.request(ms.codeLens_resolve, lens, function(_, result) |       client:request(ms.codeLens_resolve, lens, function(_, result) | ||||||
|         if api.nvim_buf_is_loaded(bufnr) and result and result.command then |         if api.nvim_buf_is_loaded(bufnr) and result and result.command then | ||||||
|           lens.command = result.command |           lens.command = result.command | ||||||
|           -- Eager display to have some sort of incremental feedback |           -- Eager display to have some sort of incremental feedback | ||||||
|   | |||||||
| @@ -404,7 +404,7 @@ local function request(clients, bufnr, win, callback) | |||||||
|   for _, client in pairs(clients) do |   for _, client in pairs(clients) do | ||||||
|     local client_id = client.id |     local client_id = client.id | ||||||
|     local params = lsp.util.make_position_params(win, client.offset_encoding) |     local params = lsp.util.make_position_params(win, client.offset_encoding) | ||||||
|     local ok, request_id = client.request(ms.textDocument_completion, params, function(err, result) |     local ok, request_id = client:request(ms.textDocument_completion, params, function(err, result) | ||||||
|       responses[client_id] = { err = err, result = result } |       responses[client_id] = { err = err, result = result } | ||||||
|       remaining_requests = remaining_requests - 1 |       remaining_requests = remaining_requests - 1 | ||||||
|       if remaining_requests == 0 then |       if remaining_requests == 0 then | ||||||
| @@ -421,7 +421,7 @@ local function request(clients, bufnr, win, callback) | |||||||
|     for client_id, request_id in pairs(request_ids) do |     for client_id, request_id in pairs(request_ids) do | ||||||
|       local client = lsp.get_client_by_id(client_id) |       local client = lsp.get_client_by_id(client_id) | ||||||
|       if client then |       if client then | ||||||
|         client.cancel_request(request_id) |         client:cancel_request(request_id) | ||||||
|       end |       end | ||||||
|     end |     end | ||||||
|   end |   end | ||||||
| @@ -582,7 +582,7 @@ local function on_complete_done() | |||||||
|     local changedtick = vim.b[bufnr].changedtick |     local changedtick = vim.b[bufnr].changedtick | ||||||
|  |  | ||||||
|     --- @param result lsp.CompletionItem |     --- @param result lsp.CompletionItem | ||||||
|     client.request(ms.completionItem_resolve, completion_item, function(err, result) |     client:request(ms.completionItem_resolve, completion_item, function(err, result) | ||||||
|       if changedtick ~= vim.b[bufnr].changedtick then |       if changedtick ~= vim.b[bufnr].changedtick then | ||||||
|         return |         return | ||||||
|       end |       end | ||||||
|   | |||||||
| @@ -122,12 +122,12 @@ end | |||||||
| --- local hint = vim.lsp.inlay_hint.get({ bufnr = 0 })[1] -- 0 for current buffer | --- local hint = vim.lsp.inlay_hint.get({ bufnr = 0 })[1] -- 0 for current buffer | ||||||
| --- | --- | ||||||
| --- local client = vim.lsp.get_client_by_id(hint.client_id) | --- local client = vim.lsp.get_client_by_id(hint.client_id) | ||||||
| --- local resp = client.request_sync('inlayHint/resolve', hint.inlay_hint, 100, 0) | --- local resp = client:request_sync('inlayHint/resolve', hint.inlay_hint, 100, 0) | ||||||
| --- local resolved_hint = assert(resp and resp.result, resp.err) | --- local resolved_hint = assert(resp and resp.result, resp.err) | ||||||
| --- vim.lsp.util.apply_text_edits(resolved_hint.textEdits, 0, client.encoding) | --- vim.lsp.util.apply_text_edits(resolved_hint.textEdits, 0, client.encoding) | ||||||
| --- | --- | ||||||
| --- location = resolved_hint.label[1].location | --- location = resolved_hint.label[1].location | ||||||
| --- client.request('textDocument/hover', { | --- client:request('textDocument/hover', { | ||||||
| ---   textDocument = { uri = location.uri }, | ---   textDocument = { uri = location.uri }, | ||||||
| ---   position = location.range.start, | ---   position = location.range.start, | ||||||
| --- }) | --- }) | ||||||
|   | |||||||
| @@ -273,7 +273,7 @@ function STHighlighter:send_request() | |||||||
|     if client and current_result.version ~= version and active_request.version ~= version then |     if client and current_result.version ~= version and active_request.version ~= version then | ||||||
|       -- cancel stale in-flight request |       -- cancel stale in-flight request | ||||||
|       if active_request.request_id then |       if active_request.request_id then | ||||||
|         client.cancel_request(active_request.request_id) |         client:cancel_request(active_request.request_id) | ||||||
|         active_request = {} |         active_request = {} | ||||||
|         state.active_request = active_request |         state.active_request = active_request | ||||||
|       end |       end | ||||||
| @@ -288,7 +288,7 @@ function STHighlighter:send_request() | |||||||
|         method = method .. '/delta' |         method = method .. '/delta' | ||||||
|         params.previousResultId = current_result.result_id |         params.previousResultId = current_result.result_id | ||||||
|       end |       end | ||||||
|       local success, request_id = client.request(method, params, function(err, response, ctx) |       local success, request_id = client:request(method, params, function(err, response, ctx) | ||||||
|         -- look client up again using ctx.client_id instead of using a captured |         -- look client up again using ctx.client_id instead of using a captured | ||||||
|         -- client object |         -- client object | ||||||
|         local c = vim.lsp.get_client_by_id(ctx.client_id) |         local c = vim.lsp.get_client_by_id(ctx.client_id) | ||||||
| @@ -519,7 +519,7 @@ function STHighlighter:reset() | |||||||
|     if state.active_request.request_id then |     if state.active_request.request_id then | ||||||
|       local client = vim.lsp.get_client_by_id(client_id) |       local client = vim.lsp.get_client_by_id(client_id) | ||||||
|       assert(client) |       assert(client) | ||||||
|       client.cancel_request(state.active_request.request_id) |       client:cancel_request(state.active_request.request_id) | ||||||
|       state.active_request = {} |       state.active_request = {} | ||||||
|     end |     end | ||||||
|   end |   end | ||||||
| @@ -547,7 +547,7 @@ function STHighlighter:mark_dirty(client_id) | |||||||
|   if state.active_request.request_id then |   if state.active_request.request_id then | ||||||
|     local client = vim.lsp.get_client_by_id(client_id) |     local client = vim.lsp.get_client_by_id(client_id) | ||||||
|     assert(client) |     assert(client) | ||||||
|     client.cancel_request(state.active_request.request_id) |     client:cancel_request(state.active_request.request_id) | ||||||
|     state.active_request = {} |     state.active_request = {} | ||||||
|   end |   end | ||||||
| end | end | ||||||
|   | |||||||
| @@ -2122,7 +2122,7 @@ function M._refresh(method, opts) | |||||||
|         local first = vim.fn.line('w0', window) |         local first = vim.fn.line('w0', window) | ||||||
|         local last = vim.fn.line('w$', window) |         local last = vim.fn.line('w$', window) | ||||||
|         for _, client in ipairs(clients) do |         for _, client in ipairs(clients) do | ||||||
|           client.request(method, { |           client:request(method, { | ||||||
|             textDocument = textDocument, |             textDocument = textDocument, | ||||||
|             range = make_line_range_params(bufnr, first - 1, last - 1, client.offset_encoding), |             range = make_line_range_params(bufnr, first - 1, last - 1, client.offset_encoding), | ||||||
|           }, nil, bufnr) |           }, nil, bufnr) | ||||||
| @@ -2131,7 +2131,7 @@ function M._refresh(method, opts) | |||||||
|     end |     end | ||||||
|   else |   else | ||||||
|     for _, client in ipairs(clients) do |     for _, client in ipairs(clients) do | ||||||
|       client.request(method, { |       client:request(method, { | ||||||
|         textDocument = textDocument, |         textDocument = textDocument, | ||||||
|         range = make_line_range_params( |         range = make_line_range_params( | ||||||
|           bufnr, |           bufnr, | ||||||
|   | |||||||
| @@ -538,7 +538,8 @@ end | |||||||
| --- @param generics? table<string,string> | --- @param generics? table<string,string> | ||||||
| --- @param classes? table<string,nvim.luacats.parser.class> | --- @param classes? table<string,nvim.luacats.parser.class> | ||||||
| --- @param exclude_types? true | --- @param exclude_types? true | ||||||
| local function render_fields_or_params(xs, generics, classes, exclude_types) | --- @param cfg nvim.gen_vimdoc.Config | ||||||
|  | local function render_fields_or_params(xs, generics, classes, exclude_types, cfg) | ||||||
|   local ret = {} --- @type string[] |   local ret = {} --- @type string[] | ||||||
|  |  | ||||||
|   xs = vim.tbl_filter(should_render_field_or_param, xs) |   xs = vim.tbl_filter(should_render_field_or_param, xs) | ||||||
| @@ -558,7 +559,9 @@ local function render_fields_or_params(xs, generics, classes, exclude_types) | |||||||
|     p.desc = pdesc |     p.desc = pdesc | ||||||
|  |  | ||||||
|     inline_type(p, classes) |     inline_type(p, classes) | ||||||
|     local nm, ty, desc = p.name, p.type, p.desc |     local nm, ty = p.name, p.type | ||||||
|  |  | ||||||
|  |     local desc = p.classvar and string.format('See |%s|.', cfg.fn_helptag_fmt(p)) or p.desc | ||||||
|  |  | ||||||
|     local fnm = p.kind == 'operator' and fmt('op(%s)', nm) or fmt_field_name(nm) |     local fnm = p.kind == 'operator' and fmt('op(%s)', nm) or fmt_field_name(nm) | ||||||
|     local pnm = fmt('      • %-' .. indent .. 's', fnm) |     local pnm = fmt('      • %-' .. indent .. 's', fnm) | ||||||
| @@ -591,7 +594,8 @@ end | |||||||
|  |  | ||||||
| --- @param class nvim.luacats.parser.class | --- @param class nvim.luacats.parser.class | ||||||
| --- @param classes table<string,nvim.luacats.parser.class> | --- @param classes table<string,nvim.luacats.parser.class> | ||||||
| local function render_class(class, classes) | --- @param cfg nvim.gen_vimdoc.Config | ||||||
|  | local function render_class(class, classes, cfg) | ||||||
|   if class.access or class.nodoc or class.inlinedoc then |   if class.access or class.nodoc or class.inlinedoc then | ||||||
|     return |     return | ||||||
|   end |   end | ||||||
| @@ -610,7 +614,7 @@ local function render_class(class, classes) | |||||||
|     table.insert(ret, md_to_vimdoc(class.desc, INDENTATION, INDENTATION, TEXT_WIDTH)) |     table.insert(ret, md_to_vimdoc(class.desc, INDENTATION, INDENTATION, TEXT_WIDTH)) | ||||||
|   end |   end | ||||||
|  |  | ||||||
|   local fields_txt = render_fields_or_params(class.fields, nil, classes) |   local fields_txt = render_fields_or_params(class.fields, nil, classes, nil, cfg) | ||||||
|   if not fields_txt:match('^%s*$') then |   if not fields_txt:match('^%s*$') then | ||||||
|     table.insert(ret, '\n    Fields: ~\n') |     table.insert(ret, '\n    Fields: ~\n') | ||||||
|     table.insert(ret, fields_txt) |     table.insert(ret, fields_txt) | ||||||
| @@ -621,11 +625,12 @@ local function render_class(class, classes) | |||||||
| end | end | ||||||
|  |  | ||||||
| --- @param classes table<string,nvim.luacats.parser.class> | --- @param classes table<string,nvim.luacats.parser.class> | ||||||
| local function render_classes(classes) | --- @param cfg nvim.gen_vimdoc.Config | ||||||
|  | local function render_classes(classes, cfg) | ||||||
|   local ret = {} --- @type string[] |   local ret = {} --- @type string[] | ||||||
|  |  | ||||||
|   for _, class in vim.spairs(classes) do |   for _, class in vim.spairs(classes) do | ||||||
|     ret[#ret + 1] = render_class(class, classes) |     ret[#ret + 1] = render_class(class, classes, cfg) | ||||||
|   end |   end | ||||||
|  |  | ||||||
|   return table.concat(ret) |   return table.concat(ret) | ||||||
| @@ -656,10 +661,6 @@ local function render_fun_header(fun, cfg) | |||||||
|  |  | ||||||
|   local proto = fun.table and nm or nm .. '(' .. table.concat(args, ', ') .. ')' |   local proto = fun.table and nm or nm .. '(' .. table.concat(args, ', ') .. ')' | ||||||
|  |  | ||||||
|   if not cfg.fn_helptag_fmt then |  | ||||||
|     cfg.fn_helptag_fmt = fn_helptag_fmt_common |  | ||||||
|   end |  | ||||||
|  |  | ||||||
|   local tag = '*' .. cfg.fn_helptag_fmt(fun) .. '*' |   local tag = '*' .. cfg.fn_helptag_fmt(fun) .. '*' | ||||||
|  |  | ||||||
|   if #proto + #tag > TEXT_WIDTH - 8 then |   if #proto + #tag > TEXT_WIDTH - 8 then | ||||||
| @@ -774,7 +775,8 @@ local function render_fun(fun, classes, cfg) | |||||||
|   end |   end | ||||||
|  |  | ||||||
|   if fun.params and #fun.params > 0 then |   if fun.params and #fun.params > 0 then | ||||||
|     local param_txt = render_fields_or_params(fun.params, fun.generics, classes, cfg.exclude_types) |     local param_txt = | ||||||
|  |       render_fields_or_params(fun.params, fun.generics, classes, cfg.exclude_types, cfg) | ||||||
|     if not param_txt:match('^%s*$') then |     if not param_txt:match('^%s*$') then | ||||||
|       table.insert(ret, '\n    Parameters: ~\n') |       table.insert(ret, '\n    Parameters: ~\n') | ||||||
|       ret[#ret + 1] = param_txt |       ret[#ret + 1] = param_txt | ||||||
| @@ -957,6 +959,7 @@ end | |||||||
|  |  | ||||||
| --- @param cfg nvim.gen_vimdoc.Config | --- @param cfg nvim.gen_vimdoc.Config | ||||||
| local function gen_target(cfg) | local function gen_target(cfg) | ||||||
|  |   cfg.fn_helptag_fmt = cfg.fn_helptag_fmt or fn_helptag_fmt_common | ||||||
|   print('Target:', cfg.filename) |   print('Target:', cfg.filename) | ||||||
|   local sections = {} --- @type table<string,nvim.gen_vimdoc.Section> |   local sections = {} --- @type table<string,nvim.gen_vimdoc.Section> | ||||||
|  |  | ||||||
| @@ -987,7 +990,7 @@ local function gen_target(cfg) | |||||||
|     print('    Processing file:', f) |     print('    Processing file:', f) | ||||||
|     local funs_txt = render_funs(funs, all_classes, cfg) |     local funs_txt = render_funs(funs, all_classes, cfg) | ||||||
|     if next(classes) then |     if next(classes) then | ||||||
|       local classes_txt = render_classes(classes) |       local classes_txt = render_classes(classes, cfg) | ||||||
|       if vim.trim(classes_txt) ~= '' then |       if vim.trim(classes_txt) ~= '' then | ||||||
|         funs_txt = classes_txt .. '\n' .. funs_txt |         funs_txt = classes_txt .. '\n' .. funs_txt | ||||||
|       end |       end | ||||||
|   | |||||||
| @@ -1,9 +1,6 @@ | |||||||
| local luacats_grammar = require('scripts.luacats_grammar') | local luacats_grammar = require('scripts.luacats_grammar') | ||||||
|  |  | ||||||
| --- @class nvim.luacats.parser.param | --- @class nvim.luacats.parser.param : nvim.luacats.Param | ||||||
| --- @field name string |  | ||||||
| --- @field type string |  | ||||||
| --- @field desc string |  | ||||||
|  |  | ||||||
| --- @class nvim.luacats.parser.return | --- @class nvim.luacats.parser.return | ||||||
| --- @field name string | --- @field name string | ||||||
| @@ -41,21 +38,14 @@ local luacats_grammar = require('scripts.luacats_grammar') | |||||||
| --- @field notes? nvim.luacats.parser.note[] | --- @field notes? nvim.luacats.parser.note[] | ||||||
| --- @field see? nvim.luacats.parser.note[] | --- @field see? nvim.luacats.parser.note[] | ||||||
|  |  | ||||||
| --- @class nvim.luacats.parser.field | --- @class nvim.luacats.parser.field : nvim.luacats.Field | ||||||
| --- @field name string | --- @field classvar? string | ||||||
| --- @field type string |  | ||||||
| --- @field desc string |  | ||||||
| --- @field access? 'private'|'package'|'protected' |  | ||||||
| --- @field nodoc? true | --- @field nodoc? true | ||||||
|  |  | ||||||
| --- @class nvim.luacats.parser.class | --- @class nvim.luacats.parser.class : nvim.luacats.Class | ||||||
| --- @field kind 'class' | --- @field desc? string | ||||||
| --- @field parent? string |  | ||||||
| --- @field name string |  | ||||||
| --- @field desc string |  | ||||||
| --- @field nodoc? true | --- @field nodoc? true | ||||||
| --- @field inlinedoc? true | --- @field inlinedoc? true | ||||||
| --- @field access? 'private'|'package'|'protected' |  | ||||||
| --- @field fields nvim.luacats.parser.field[] | --- @field fields nvim.luacats.parser.field[] | ||||||
| --- @field notes? string[] | --- @field notes? string[] | ||||||
|  |  | ||||||
| @@ -332,7 +322,10 @@ local function process_lua_line(line, state, classes, classvars, has_indent) | |||||||
|         end |         end | ||||||
|  |  | ||||||
|         -- Add method as the field to the class |         -- Add method as the field to the class | ||||||
|         table.insert(classes[class].fields, fun2field(cur_obj)) |         local cls = classes[class] | ||||||
|  |         local field = fun2field(cur_obj) | ||||||
|  |         field.classvar = cur_obj.classvar | ||||||
|  |         table.insert(cls.fields, field) | ||||||
|         return |         return | ||||||
|       end |       end | ||||||
|  |  | ||||||
|   | |||||||
| @@ -182,16 +182,17 @@ function M.test_rpc_server(config) | |||||||
|     ) |     ) | ||||||
|   end |   end | ||||||
|   local client = setmetatable({}, { |   local client = setmetatable({}, { | ||||||
|     __index = function(_, name) |     __index = function(t, name) | ||||||
|       -- Workaround for not being able to yield() inside __index for Lua 5.1 :( |       -- Workaround for not being able to yield() inside __index for Lua 5.1 :( | ||||||
|       -- Otherwise I would just return the value here. |       -- Otherwise I would just return the value here. | ||||||
|       return function(...) |       return function(arg1, ...) | ||||||
|  |         local ismethod = arg1 == t | ||||||
|         return exec_lua(function(...) |         return exec_lua(function(...) | ||||||
|           if type(_G.TEST_RPC_CLIENT[name]) == 'function' then |           local client = _G.TEST_RPC_CLIENT | ||||||
|             return _G.TEST_RPC_CLIENT[name](...) |           if type(client[name]) == 'function' then | ||||||
|           else |             return client[name](ismethod and client or arg1, ...) | ||||||
|             return _G.TEST_RPC_CLIENT[name] |  | ||||||
|           end |           end | ||||||
|  |           return client[name] | ||||||
|         end, ...) |         end, ...) | ||||||
|       end |       end | ||||||
|     end, |     end, | ||||||
|   | |||||||
| @@ -232,7 +232,7 @@ describe('LSP', function() | |||||||
|           -- client is a dummy object which will queue up commands to be run |           -- client is a dummy object which will queue up commands to be run | ||||||
|           -- once the server initializes. It can't accept lua callbacks or |           -- once the server initializes. It can't accept lua callbacks or | ||||||
|           -- other types that may be unserializable for now. |           -- other types that may be unserializable for now. | ||||||
|           client.stop() |           client:stop() | ||||||
|         end, |         end, | ||||||
|         -- If the program timed out, then code will be nil. |         -- If the program timed out, then code will be nil. | ||||||
|         on_exit = function(code, signal) |         on_exit = function(code, signal) | ||||||
| @@ -254,8 +254,8 @@ describe('LSP', function() | |||||||
|       test_rpc_server { |       test_rpc_server { | ||||||
|         test_name = 'basic_init', |         test_name = 'basic_init', | ||||||
|         on_init = function(client) |         on_init = function(client) | ||||||
|           client.notify('test') |           client:notify('test') | ||||||
|           client.stop() |           client:stop() | ||||||
|         end, |         end, | ||||||
|         on_exit = function(code, signal) |         on_exit = function(code, signal) | ||||||
|           eq(101, code, 'exit code') -- See fake-lsp-server.lua |           eq(101, code, 'exit code') -- See fake-lsp-server.lua | ||||||
| @@ -275,7 +275,7 @@ describe('LSP', function() | |||||||
|       test_rpc_server({ |       test_rpc_server({ | ||||||
|         test_name = 'basic_init_did_change_configuration', |         test_name = 'basic_init_did_change_configuration', | ||||||
|         on_init = function(client, _) |         on_init = function(client, _) | ||||||
|           client.stop() |           client:stop() | ||||||
|         end, |         end, | ||||||
|         on_exit = function(code, signal) |         on_exit = function(code, signal) | ||||||
|           eq(0, code, 'exit code') |           eq(0, code, 'exit code') | ||||||
| @@ -333,9 +333,9 @@ describe('LSP', function() | |||||||
|         test_name = 'basic_init', |         test_name = 'basic_init', | ||||||
|         on_init = function(client) |         on_init = function(client) | ||||||
|           eq(0, client.server_capabilities().textDocumentSync.change) |           eq(0, client.server_capabilities().textDocumentSync.change) | ||||||
|           client.request('shutdown') |           client:request('shutdown') | ||||||
|           client.notify('exit') |           client:notify('exit') | ||||||
|           client.stop() |           client:stop() | ||||||
|         end, |         end, | ||||||
|         on_exit = function(code, signal) |         on_exit = function(code, signal) | ||||||
|           eq(0, code, 'exit code') |           eq(0, code, 'exit code') | ||||||
| @@ -377,7 +377,7 @@ describe('LSP', function() | |||||||
|         end, |         end, | ||||||
|         on_init = function(_client) |         on_init = function(_client) | ||||||
|           client = _client |           client = _client | ||||||
|           client.notify('finish') |           client:notify('finish') | ||||||
|         end, |         end, | ||||||
|         on_exit = function(code, signal) |         on_exit = function(code, signal) | ||||||
|           eq(0, code, 'exit code') |           eq(0, code, 'exit code') | ||||||
| @@ -395,7 +395,7 @@ describe('LSP', function() | |||||||
|                 return vim.lsp.buf_is_attached(_G.BUFFER, _G.TEST_RPC_CLIENT_ID) |                 return vim.lsp.buf_is_attached(_G.BUFFER, _G.TEST_RPC_CLIENT_ID) | ||||||
|               end) |               end) | ||||||
|             ) |             ) | ||||||
|             client.stop() |             client:stop() | ||||||
|           end |           end | ||||||
|         end, |         end, | ||||||
|       } |       } | ||||||
| @@ -430,7 +430,7 @@ describe('LSP', function() | |||||||
|               return vim.lsp.buf_attach_client(_G.BUFFER, _G.TEST_RPC_CLIENT_ID) |               return vim.lsp.buf_attach_client(_G.BUFFER, _G.TEST_RPC_CLIENT_ID) | ||||||
|             end) |             end) | ||||||
|           ) |           ) | ||||||
|           client.notify('finish') |           client:notify('finish') | ||||||
|         end, |         end, | ||||||
|         on_handler = function(_, _, ctx) |         on_handler = function(_, _, ctx) | ||||||
|           if ctx.method == 'finish' then |           if ctx.method == 'finish' then | ||||||
| @@ -439,7 +439,7 @@ describe('LSP', function() | |||||||
|               return vim.lsp.buf_detach_client(_G.BUFFER, _G.TEST_RPC_CLIENT_ID) |               return vim.lsp.buf_detach_client(_G.BUFFER, _G.TEST_RPC_CLIENT_ID) | ||||||
|             end) |             end) | ||||||
|             eq('basic_init', api.nvim_get_var('lsp_detached')) |             eq('basic_init', api.nvim_get_var('lsp_detached')) | ||||||
|             client.stop() |             client:stop() | ||||||
|           end |           end | ||||||
|         end, |         end, | ||||||
|       } |       } | ||||||
| @@ -472,7 +472,7 @@ describe('LSP', function() | |||||||
|                 return keymap.callback == vim.lsp.buf.hover |                 return keymap.callback == vim.lsp.buf.hover | ||||||
|               end) |               end) | ||||||
|             ) |             ) | ||||||
|             client.stop() |             client:stop() | ||||||
|           end |           end | ||||||
|         end, |         end, | ||||||
|         on_exit = function(_, _) |         on_exit = function(_, _) | ||||||
| @@ -524,7 +524,7 @@ describe('LSP', function() | |||||||
|             eq('v:lua.vim.lsp.tagfunc', get_buf_option('tagfunc', BUFFER_1)) |             eq('v:lua.vim.lsp.tagfunc', get_buf_option('tagfunc', BUFFER_1)) | ||||||
|             eq('v:lua.vim.lsp.omnifunc', get_buf_option('omnifunc', BUFFER_2)) |             eq('v:lua.vim.lsp.omnifunc', get_buf_option('omnifunc', BUFFER_2)) | ||||||
|             eq('v:lua.vim.lsp.formatexpr()', get_buf_option('formatexpr', BUFFER_2)) |             eq('v:lua.vim.lsp.formatexpr()', get_buf_option('formatexpr', BUFFER_2)) | ||||||
|             client.stop() |             client:stop() | ||||||
|           end |           end | ||||||
|         end, |         end, | ||||||
|         on_exit = function(_, _) |         on_exit = function(_, _) | ||||||
| @@ -554,7 +554,7 @@ describe('LSP', function() | |||||||
|             eq('tfu', get_buf_option('tagfunc')) |             eq('tfu', get_buf_option('tagfunc')) | ||||||
|             eq('ofu', get_buf_option('omnifunc')) |             eq('ofu', get_buf_option('omnifunc')) | ||||||
|             eq('fex', get_buf_option('formatexpr')) |             eq('fex', get_buf_option('formatexpr')) | ||||||
|             client.stop() |             client:stop() | ||||||
|           end |           end | ||||||
|         end, |         end, | ||||||
|         on_exit = function(_, _) |         on_exit = function(_, _) | ||||||
| @@ -711,10 +711,10 @@ describe('LSP', function() | |||||||
|               ctx.method, |               ctx.method, | ||||||
|               result |               result | ||||||
|             ) |             ) | ||||||
|             client.notify('workspace/configuration', server_result) |             client:notify('workspace/configuration', server_result) | ||||||
|           end |           end | ||||||
|           if ctx.method == 'shutdown' then |           if ctx.method == 'shutdown' then | ||||||
|             client.stop() |             client:stop() | ||||||
|           end |           end | ||||||
|         end, |         end, | ||||||
|       } |       } | ||||||
| @@ -756,7 +756,7 @@ describe('LSP', function() | |||||||
|       test_rpc_server { |       test_rpc_server { | ||||||
|         test_name = 'basic_check_capabilities', |         test_name = 'basic_check_capabilities', | ||||||
|         on_init = function(client) |         on_init = function(client) | ||||||
|           client.stop() |           client:stop() | ||||||
|           local full_kind = exec_lua(function() |           local full_kind = exec_lua(function() | ||||||
|             return require 'vim.lsp.protocol'.TextDocumentSyncKind.Full |             return require 'vim.lsp.protocol'.TextDocumentSyncKind.Full | ||||||
|           end) |           end) | ||||||
| @@ -798,7 +798,7 @@ describe('LSP', function() | |||||||
|               vim.api.nvim_exec_autocmds('BufWritePost', { buffer = _G.BUFFER, modeline = false }) |               vim.api.nvim_exec_autocmds('BufWritePost', { buffer = _G.BUFFER, modeline = false }) | ||||||
|             end) |             end) | ||||||
|           else |           else | ||||||
|             client.stop() |             client:stop() | ||||||
|           end |           end | ||||||
|         end, |         end, | ||||||
|       } |       } | ||||||
| @@ -898,7 +898,7 @@ describe('LSP', function() | |||||||
|               end) |               end) | ||||||
|             end) |             end) | ||||||
|           else |           else | ||||||
|             client.stop() |             client:stop() | ||||||
|           end |           end | ||||||
|         end, |         end, | ||||||
|       }) |       }) | ||||||
| @@ -929,20 +929,20 @@ describe('LSP', function() | |||||||
|               vim.api.nvim_exec_autocmds('BufWritePost', { buffer = _G.BUFFER, modeline = false }) |               vim.api.nvim_exec_autocmds('BufWritePost', { buffer = _G.BUFFER, modeline = false }) | ||||||
|             end) |             end) | ||||||
|           else |           else | ||||||
|             client.stop() |             client:stop() | ||||||
|           end |           end | ||||||
|         end, |         end, | ||||||
|       } |       } | ||||||
|     end) |     end) | ||||||
|  |  | ||||||
|     it('client.supports_methods() should validate capabilities', function() |     it('client:supports_methods() should validate capabilities', function() | ||||||
|       local expected_handlers = { |       local expected_handlers = { | ||||||
|         { NIL, {}, { method = 'shutdown', client_id = 1 } }, |         { NIL, {}, { method = 'shutdown', client_id = 1 } }, | ||||||
|       } |       } | ||||||
|       test_rpc_server { |       test_rpc_server { | ||||||
|         test_name = 'capabilities_for_client_supports_method', |         test_name = 'capabilities_for_client_supports_method', | ||||||
|         on_init = function(client) |         on_init = function(client) | ||||||
|           client.stop() |           client:stop() | ||||||
|           local expected_sync_capabilities = { |           local expected_sync_capabilities = { | ||||||
|             change = 1, |             change = 1, | ||||||
|             openClose = true, |             openClose = true, | ||||||
| @@ -958,11 +958,11 @@ describe('LSP', function() | |||||||
|           eq(true, client.server_capabilities().codeLensProvider.resolveProvider) |           eq(true, client.server_capabilities().codeLensProvider.resolveProvider) | ||||||
|  |  | ||||||
|           -- known methods for resolved capabilities |           -- known methods for resolved capabilities | ||||||
|           eq(true, client.supports_method('textDocument/hover')) |           eq(true, client:supports_method('textDocument/hover')) | ||||||
|           eq(false, client.supports_method('textDocument/definition')) |           eq(false, client:supports_method('textDocument/definition')) | ||||||
|  |  | ||||||
|           -- unknown methods are assumed to be supported. |           -- unknown methods are assumed to be supported. | ||||||
|           eq(true, client.supports_method('unknown-method')) |           eq(true, client:supports_method('unknown-method')) | ||||||
|         end, |         end, | ||||||
|         on_exit = function(code, signal) |         on_exit = function(code, signal) | ||||||
|           eq(0, code, 'exit code') |           eq(0, code, 'exit code') | ||||||
| @@ -989,7 +989,7 @@ describe('LSP', function() | |||||||
|           end) |           end) | ||||||
|         end, |         end, | ||||||
|         on_init = function(client) |         on_init = function(client) | ||||||
|           client.stop() |           client:stop() | ||||||
|           exec_lua(function() |           exec_lua(function() | ||||||
|             vim.lsp.buf.type_definition() |             vim.lsp.buf.type_definition() | ||||||
|           end) |           end) | ||||||
| @@ -1018,7 +1018,7 @@ describe('LSP', function() | |||||||
|             end) |             end) | ||||||
|           end, |           end, | ||||||
|           on_init = function(client) |           on_init = function(client) | ||||||
|             client.stop() |             client:stop() | ||||||
|             exec_lua(function() |             exec_lua(function() | ||||||
|               vim.lsp.buf.type_definition() |               vim.lsp.buf.type_definition() | ||||||
|             end) |             end) | ||||||
| @@ -1042,7 +1042,7 @@ describe('LSP', function() | |||||||
|       test_rpc_server { |       test_rpc_server { | ||||||
|         test_name = 'check_forward_request_cancelled', |         test_name = 'check_forward_request_cancelled', | ||||||
|         on_init = function(_client) |         on_init = function(_client) | ||||||
|           _client.request('error_code_test') |           _client:request('error_code_test') | ||||||
|           client = _client |           client = _client | ||||||
|         end, |         end, | ||||||
|         on_exit = function(code, signal) |         on_exit = function(code, signal) | ||||||
| @@ -1053,7 +1053,7 @@ describe('LSP', function() | |||||||
|         on_handler = function(err, _, ctx) |         on_handler = function(err, _, ctx) | ||||||
|           eq(table.remove(expected_handlers), { err, {}, ctx }, 'expected handler') |           eq(table.remove(expected_handlers), { err, {}, ctx }, 'expected handler') | ||||||
|           if ctx.method == 'finish' then |           if ctx.method == 'finish' then | ||||||
|             client.stop() |             client:stop() | ||||||
|           end |           end | ||||||
|         end, |         end, | ||||||
|       } |       } | ||||||
| @@ -1072,7 +1072,7 @@ describe('LSP', function() | |||||||
|       test_rpc_server { |       test_rpc_server { | ||||||
|         test_name = 'check_forward_content_modified', |         test_name = 'check_forward_content_modified', | ||||||
|         on_init = function(_client) |         on_init = function(_client) | ||||||
|           _client.request('error_code_test') |           _client:request('error_code_test') | ||||||
|           client = _client |           client = _client | ||||||
|         end, |         end, | ||||||
|         on_exit = function(code, signal) |         on_exit = function(code, signal) | ||||||
| @@ -1084,10 +1084,10 @@ describe('LSP', function() | |||||||
|           eq(table.remove(expected_handlers), { err, _, ctx }, 'expected handler') |           eq(table.remove(expected_handlers), { err, _, ctx }, 'expected handler') | ||||||
|           -- if ctx.method == 'error_code_test' then client.notify("finish") end |           -- if ctx.method == 'error_code_test' then client.notify("finish") end | ||||||
|           if ctx.method ~= 'finish' then |           if ctx.method ~= 'finish' then | ||||||
|             client.notify('finish') |             client:notify('finish') | ||||||
|           end |           end | ||||||
|           if ctx.method == 'finish' then |           if ctx.method == 'finish' then | ||||||
|             client.stop() |             client:stop() | ||||||
|           end |           end | ||||||
|         end, |         end, | ||||||
|       } |       } | ||||||
| @@ -1103,13 +1103,13 @@ describe('LSP', function() | |||||||
|         test_name = 'check_pending_request_tracked', |         test_name = 'check_pending_request_tracked', | ||||||
|         on_init = function(_client) |         on_init = function(_client) | ||||||
|           client = _client |           client = _client | ||||||
|           client.request('slow_request') |           client:request('slow_request') | ||||||
|           local request = exec_lua(function() |           local request = exec_lua(function() | ||||||
|             return _G.TEST_RPC_CLIENT.requests[2] |             return _G.TEST_RPC_CLIENT.requests[2] | ||||||
|           end) |           end) | ||||||
|           eq('slow_request', request.method) |           eq('slow_request', request.method) | ||||||
|           eq('pending', request.type) |           eq('pending', request.type) | ||||||
|           client.notify('release') |           client:notify('release') | ||||||
|         end, |         end, | ||||||
|         on_exit = function(code, signal) |         on_exit = function(code, signal) | ||||||
|           eq(0, code, 'exit code') |           eq(0, code, 'exit code') | ||||||
| @@ -1123,10 +1123,10 @@ describe('LSP', function() | |||||||
|               return _G.TEST_RPC_CLIENT.requests[2] |               return _G.TEST_RPC_CLIENT.requests[2] | ||||||
|             end) |             end) | ||||||
|             eq(nil, request) |             eq(nil, request) | ||||||
|             client.notify('finish') |             client:notify('finish') | ||||||
|           end |           end | ||||||
|           if ctx.method == 'finish' then |           if ctx.method == 'finish' then | ||||||
|             client.stop() |             client:stop() | ||||||
|           end |           end | ||||||
|         end, |         end, | ||||||
|       } |       } | ||||||
| @@ -1141,14 +1141,14 @@ describe('LSP', function() | |||||||
|         test_name = 'check_cancel_request_tracked', |         test_name = 'check_cancel_request_tracked', | ||||||
|         on_init = function(_client) |         on_init = function(_client) | ||||||
|           client = _client |           client = _client | ||||||
|           client.request('slow_request') |           client:request('slow_request') | ||||||
|           client.cancel_request(2) |           client:cancel_request(2) | ||||||
|           local request = exec_lua(function() |           local request = exec_lua(function() | ||||||
|             return _G.TEST_RPC_CLIENT.requests[2] |             return _G.TEST_RPC_CLIENT.requests[2] | ||||||
|           end) |           end) | ||||||
|           eq('slow_request', request.method) |           eq('slow_request', request.method) | ||||||
|           eq('cancel', request.type) |           eq('cancel', request.type) | ||||||
|           client.notify('release') |           client:notify('release') | ||||||
|         end, |         end, | ||||||
|         on_exit = function(code, signal) |         on_exit = function(code, signal) | ||||||
|           eq(0, code, 'exit code') |           eq(0, code, 'exit code') | ||||||
| @@ -1162,7 +1162,7 @@ describe('LSP', function() | |||||||
|           end) |           end) | ||||||
|           eq(nil, request) |           eq(nil, request) | ||||||
|           if ctx.method == 'finish' then |           if ctx.method == 'finish' then | ||||||
|             client.stop() |             client:stop() | ||||||
|           end |           end | ||||||
|         end, |         end, | ||||||
|       } |       } | ||||||
| @@ -1178,19 +1178,19 @@ describe('LSP', function() | |||||||
|         test_name = 'check_tracked_requests_cleared', |         test_name = 'check_tracked_requests_cleared', | ||||||
|         on_init = function(_client) |         on_init = function(_client) | ||||||
|           client = _client |           client = _client | ||||||
|           client.request('slow_request') |           client:request('slow_request') | ||||||
|           local request = exec_lua(function() |           local request = exec_lua(function() | ||||||
|             return _G.TEST_RPC_CLIENT.requests[2] |             return _G.TEST_RPC_CLIENT.requests[2] | ||||||
|           end) |           end) | ||||||
|           eq('slow_request', request.method) |           eq('slow_request', request.method) | ||||||
|           eq('pending', request.type) |           eq('pending', request.type) | ||||||
|           client.cancel_request(2) |           client:cancel_request(2) | ||||||
|           request = exec_lua(function() |           request = exec_lua(function() | ||||||
|             return _G.TEST_RPC_CLIENT.requests[2] |             return _G.TEST_RPC_CLIENT.requests[2] | ||||||
|           end) |           end) | ||||||
|           eq('slow_request', request.method) |           eq('slow_request', request.method) | ||||||
|           eq('cancel', request.type) |           eq('cancel', request.type) | ||||||
|           client.notify('release') |           client:notify('release') | ||||||
|         end, |         end, | ||||||
|         on_exit = function(code, signal) |         on_exit = function(code, signal) | ||||||
|           eq(0, code, 'exit code') |           eq(0, code, 'exit code') | ||||||
| @@ -1204,10 +1204,10 @@ describe('LSP', function() | |||||||
|               return _G.TEST_RPC_CLIENT.requests[2] |               return _G.TEST_RPC_CLIENT.requests[2] | ||||||
|             end) |             end) | ||||||
|             eq(nil, request) |             eq(nil, request) | ||||||
|             client.notify('finish') |             client:notify('finish') | ||||||
|           end |           end | ||||||
|           if ctx.method == 'finish' then |           if ctx.method == 'finish' then | ||||||
|             client.stop() |             client:stop() | ||||||
|           end |           end | ||||||
|         end, |         end, | ||||||
|       } |       } | ||||||
| @@ -1225,11 +1225,11 @@ describe('LSP', function() | |||||||
|           command('let g:requests = 0') |           command('let g:requests = 0') | ||||||
|           command('autocmd LspRequest * let g:requests+=1') |           command('autocmd LspRequest * let g:requests+=1') | ||||||
|           client = _client |           client = _client | ||||||
|           client.request('slow_request') |           client:request('slow_request') | ||||||
|           eq(1, eval('g:requests')) |           eq(1, eval('g:requests')) | ||||||
|           client.cancel_request(2) |           client:cancel_request(2) | ||||||
|           eq(2, eval('g:requests')) |           eq(2, eval('g:requests')) | ||||||
|           client.notify('release') |           client:notify('release') | ||||||
|         end, |         end, | ||||||
|         on_exit = function(code, signal) |         on_exit = function(code, signal) | ||||||
|           eq(0, code, 'exit code') |           eq(0, code, 'exit code') | ||||||
| @@ -1240,10 +1240,10 @@ describe('LSP', function() | |||||||
|         on_handler = function(err, _, ctx) |         on_handler = function(err, _, ctx) | ||||||
|           eq(table.remove(expected_handlers), { err, {}, ctx }, 'expected handler') |           eq(table.remove(expected_handlers), { err, {}, ctx }, 'expected handler') | ||||||
|           if ctx.method == 'slow_request' then |           if ctx.method == 'slow_request' then | ||||||
|             client.notify('finish') |             client:notify('finish') | ||||||
|           end |           end | ||||||
|           if ctx.method == 'finish' then |           if ctx.method == 'finish' then | ||||||
|             client.stop() |             client:stop() | ||||||
|           end |           end | ||||||
|         end, |         end, | ||||||
|       } |       } | ||||||
| @@ -1277,7 +1277,7 @@ describe('LSP', function() | |||||||
|           end) |           end) | ||||||
|           eq(full_kind, client.server_capabilities().textDocumentSync.change) |           eq(full_kind, client.server_capabilities().textDocumentSync.change) | ||||||
|           eq(true, client.server_capabilities().textDocumentSync.openClose) |           eq(true, client.server_capabilities().textDocumentSync.openClose) | ||||||
|           client.notify('finish') |           client:notify('finish') | ||||||
|         end, |         end, | ||||||
|         on_exit = function(code, signal) |         on_exit = function(code, signal) | ||||||
|           eq(0, code, 'exit code') |           eq(0, code, 'exit code') | ||||||
| @@ -1286,7 +1286,7 @@ describe('LSP', function() | |||||||
|         on_handler = function(err, result, ctx) |         on_handler = function(err, result, ctx) | ||||||
|           eq(table.remove(expected_handlers), { err, result, ctx }, 'expected handler') |           eq(table.remove(expected_handlers), { err, result, ctx }, 'expected handler') | ||||||
|           if ctx.method == 'finish' then |           if ctx.method == 'finish' then | ||||||
|             client.stop() |             client:stop() | ||||||
|           end |           end | ||||||
|         end, |         end, | ||||||
|       } |       } | ||||||
| @@ -1333,11 +1333,11 @@ describe('LSP', function() | |||||||
|         end, |         end, | ||||||
|         on_handler = function(err, result, ctx) |         on_handler = function(err, result, ctx) | ||||||
|           if ctx.method == 'start' then |           if ctx.method == 'start' then | ||||||
|             client.notify('finish') |             client:notify('finish') | ||||||
|           end |           end | ||||||
|           eq(table.remove(expected_handlers), { err, result, ctx }, 'expected handler') |           eq(table.remove(expected_handlers), { err, result, ctx }, 'expected handler') | ||||||
|           if ctx.method == 'finish' then |           if ctx.method == 'finish' then | ||||||
|             client.stop() |             client:stop() | ||||||
|           end |           end | ||||||
|         end, |         end, | ||||||
|       } |       } | ||||||
| @@ -1378,11 +1378,11 @@ describe('LSP', function() | |||||||
|         end, |         end, | ||||||
|         on_handler = function(err, result, ctx) |         on_handler = function(err, result, ctx) | ||||||
|           if ctx.method == 'start' then |           if ctx.method == 'start' then | ||||||
|             client.notify('finish') |             client:notify('finish') | ||||||
|           end |           end | ||||||
|           eq(table.remove(expected_handlers), { err, result, ctx }, 'expected handler') |           eq(table.remove(expected_handlers), { err, result, ctx }, 'expected handler') | ||||||
|           if ctx.method == 'finish' then |           if ctx.method == 'finish' then | ||||||
|             client.stop() |             client:stop() | ||||||
|           end |           end | ||||||
|         end, |         end, | ||||||
|       } |       } | ||||||
| @@ -1428,11 +1428,11 @@ describe('LSP', function() | |||||||
|                 'boop', |                 'boop', | ||||||
|               }) |               }) | ||||||
|             end) |             end) | ||||||
|             client.notify('finish') |             client:notify('finish') | ||||||
|           end |           end | ||||||
|           eq(table.remove(expected_handlers), { err, result, ctx }, 'expected handler') |           eq(table.remove(expected_handlers), { err, result, ctx }, 'expected handler') | ||||||
|           if ctx.method == 'finish' then |           if ctx.method == 'finish' then | ||||||
|             client.stop() |             client:stop() | ||||||
|           end |           end | ||||||
|         end, |         end, | ||||||
|       } |       } | ||||||
| @@ -1479,11 +1479,11 @@ describe('LSP', function() | |||||||
|                 'boop', |                 'boop', | ||||||
|               }) |               }) | ||||||
|             end) |             end) | ||||||
|             client.notify('finish') |             client:notify('finish') | ||||||
|           end |           end | ||||||
|           eq(table.remove(expected_handlers), { err, result, ctx }, 'expected handler') |           eq(table.remove(expected_handlers), { err, result, ctx }, 'expected handler') | ||||||
|           if ctx.method == 'finish' then |           if ctx.method == 'finish' then | ||||||
|             client.stop() |             client:stop() | ||||||
|           end |           end | ||||||
|         end, |         end, | ||||||
|       } |       } | ||||||
| @@ -1529,7 +1529,7 @@ describe('LSP', function() | |||||||
|         end, |         end, | ||||||
|         on_init = function(_client) |         on_init = function(_client) | ||||||
|           client = _client |           client = _client | ||||||
|           eq(true, client.supports_method('textDocument/inlayHint')) |           eq(true, client:supports_method('textDocument/inlayHint')) | ||||||
|           exec_lua(function() |           exec_lua(function() | ||||||
|             assert(vim.lsp.buf_attach_client(_G.BUFFER, _G.TEST_RPC_CLIENT_ID)) |             assert(vim.lsp.buf_attach_client(_G.BUFFER, _G.TEST_RPC_CLIENT_ID)) | ||||||
|           end) |           end) | ||||||
| @@ -1545,11 +1545,11 @@ describe('LSP', function() | |||||||
|             end) |             end) | ||||||
|           end |           end | ||||||
|           if ctx.method == 'textDocument/inlayHint' then |           if ctx.method == 'textDocument/inlayHint' then | ||||||
|             client.notify('finish') |             client:notify('finish') | ||||||
|           end |           end | ||||||
|           eq(table.remove(expected_handlers), { err, result, ctx }, 'expected handler') |           eq(table.remove(expected_handlers), { err, result, ctx }, 'expected handler') | ||||||
|           if ctx.method == 'finish' then |           if ctx.method == 'finish' then | ||||||
|             client.stop() |             client:stop() | ||||||
|           end |           end | ||||||
|         end, |         end, | ||||||
|       } |       } | ||||||
| @@ -1598,11 +1598,11 @@ describe('LSP', function() | |||||||
|                 '123boop', |                 '123boop', | ||||||
|               }) |               }) | ||||||
|             end) |             end) | ||||||
|             client.notify('finish') |             client:notify('finish') | ||||||
|           end |           end | ||||||
|           eq(table.remove(expected_handlers), { err, result, ctx }, 'expected handler') |           eq(table.remove(expected_handlers), { err, result, ctx }, 'expected handler') | ||||||
|           if ctx.method == 'finish' then |           if ctx.method == 'finish' then | ||||||
|             client.stop() |             client:stop() | ||||||
|           end |           end | ||||||
|         end, |         end, | ||||||
|       } |       } | ||||||
| @@ -1652,11 +1652,11 @@ describe('LSP', function() | |||||||
|                 '123boop', |                 '123boop', | ||||||
|               }) |               }) | ||||||
|             end) |             end) | ||||||
|             client.notify('finish') |             client:notify('finish') | ||||||
|           end |           end | ||||||
|           eq(table.remove(expected_handlers), { err, result, ctx }, 'expected handler') |           eq(table.remove(expected_handlers), { err, result, ctx }, 'expected handler') | ||||||
|           if ctx.method == 'finish' then |           if ctx.method == 'finish' then | ||||||
|             client.stop() |             client:stop() | ||||||
|           end |           end | ||||||
|         end, |         end, | ||||||
|       } |       } | ||||||
| @@ -1699,11 +1699,11 @@ describe('LSP', function() | |||||||
|         on_handler = function(err, result, ctx) |         on_handler = function(err, result, ctx) | ||||||
|           if ctx.method == 'start' then |           if ctx.method == 'start' then | ||||||
|             n.command('normal! 1Go') |             n.command('normal! 1Go') | ||||||
|             client.notify('finish') |             client:notify('finish') | ||||||
|           end |           end | ||||||
|           eq(table.remove(expected_handlers), { err, result, ctx }, 'expected handler') |           eq(table.remove(expected_handlers), { err, result, ctx }, 'expected handler') | ||||||
|           if ctx.method == 'finish' then |           if ctx.method == 'finish' then | ||||||
|             client.stop() |             client:stop() | ||||||
|           end |           end | ||||||
|         end, |         end, | ||||||
|       } |       } | ||||||
| @@ -1752,11 +1752,11 @@ describe('LSP', function() | |||||||
|                 'boop', |                 'boop', | ||||||
|               }) |               }) | ||||||
|             end) |             end) | ||||||
|             client.notify('finish') |             client:notify('finish') | ||||||
|           end |           end | ||||||
|           eq(table.remove(expected_handlers), { err, result, ctx }, 'expected handler') |           eq(table.remove(expected_handlers), { err, result, ctx }, 'expected handler') | ||||||
|           if ctx.method == 'finish' then |           if ctx.method == 'finish' then | ||||||
|             client.stop() |             client:stop() | ||||||
|           end |           end | ||||||
|         end, |         end, | ||||||
|       } |       } | ||||||
| @@ -1806,11 +1806,11 @@ describe('LSP', function() | |||||||
|               }) |               }) | ||||||
|               vim.api.nvim_command(_G.BUFFER .. 'bwipeout') |               vim.api.nvim_command(_G.BUFFER .. 'bwipeout') | ||||||
|             end) |             end) | ||||||
|             client.notify('finish') |             client:notify('finish') | ||||||
|           end |           end | ||||||
|           eq(table.remove(expected_handlers), { err, result, ctx }, 'expected handler') |           eq(table.remove(expected_handlers), { err, result, ctx }, 'expected handler') | ||||||
|           if ctx.method == 'finish' then |           if ctx.method == 'finish' then | ||||||
|             client.stop() |             client:stop() | ||||||
|           end |           end | ||||||
|         end, |         end, | ||||||
|       } |       } | ||||||
| @@ -1830,7 +1830,7 @@ describe('LSP', function() | |||||||
|         on_setup = function() end, |         on_setup = function() end, | ||||||
|         on_init = function(_client) |         on_init = function(_client) | ||||||
|           client = _client |           client = _client | ||||||
|           client.stop(true) |           client:stop(true) | ||||||
|         end, |         end, | ||||||
|         on_exit = function(code, signal) |         on_exit = function(code, signal) | ||||||
|           eq(0, code, 'exit code') |           eq(0, code, 'exit code') | ||||||
| @@ -1882,7 +1882,7 @@ describe('LSP', function() | |||||||
|         on_handler = function(err, result, ctx) |         on_handler = function(err, result, ctx) | ||||||
|           eq(table.remove(expected_handlers), { err, result, ctx }, 'expected handler') |           eq(table.remove(expected_handlers), { err, result, ctx }, 'expected handler') | ||||||
|           if ctx.method == 'finish' then |           if ctx.method == 'finish' then | ||||||
|             client.stop() |             client:stop() | ||||||
|           end |           end | ||||||
|         end, |         end, | ||||||
|       } |       } | ||||||
| @@ -2348,7 +2348,7 @@ describe('LSP', function() | |||||||
|       test_rpc_server { |       test_rpc_server { | ||||||
|         test_name = 'basic_init', |         test_name = 'basic_init', | ||||||
|         on_init = function(client, _) |         on_init = function(client, _) | ||||||
|           client.stop() |           client:stop() | ||||||
|         end, |         end, | ||||||
|         -- If the program timed out, then code will be nil. |         -- If the program timed out, then code will be nil. | ||||||
|         on_exit = function(code, signal) |         on_exit = function(code, signal) | ||||||
| @@ -4284,7 +4284,7 @@ describe('LSP', function() | |||||||
|                   end) |                   end) | ||||||
|                 ) |                 ) | ||||||
|               end |               end | ||||||
|               client.stop() |               client:stop() | ||||||
|             end |             end | ||||||
|           end, |           end, | ||||||
|         } |         } | ||||||
| @@ -4331,7 +4331,7 @@ describe('LSP', function() | |||||||
|                 return type(vim.lsp.commands['dummy2']) |                 return type(vim.lsp.commands['dummy2']) | ||||||
|               end) |               end) | ||||||
|             ) |             ) | ||||||
|             client.stop() |             client:stop() | ||||||
|           end |           end | ||||||
|         end, |         end, | ||||||
|       } |       } | ||||||
| @@ -4372,7 +4372,7 @@ describe('LSP', function() | |||||||
|               vim.lsp.buf.code_action() |               vim.lsp.buf.code_action() | ||||||
|             end) |             end) | ||||||
|           elseif ctx.method == 'shutdown' then |           elseif ctx.method == 'shutdown' then | ||||||
|             client.stop() |             client:stop() | ||||||
|           end |           end | ||||||
|         end, |         end, | ||||||
|       }) |       }) | ||||||
| @@ -4447,7 +4447,7 @@ describe('LSP', function() | |||||||
|                 return type(vim.lsp.commands['executed_type_annotate']) |                 return type(vim.lsp.commands['executed_type_annotate']) | ||||||
|               end) |               end) | ||||||
|             ) |             ) | ||||||
|             client.stop() |             client:stop() | ||||||
|           end |           end | ||||||
|         end, |         end, | ||||||
|       } |       } | ||||||
| @@ -4564,7 +4564,7 @@ describe('LSP', function() | |||||||
|             end) |             end) | ||||||
|             eq({ command = 'Dummy', title = 'Lens1' }, cmd) |             eq({ command = 'Dummy', title = 'Lens1' }, cmd) | ||||||
|           elseif ctx.method == 'shutdown' then |           elseif ctx.method == 'shutdown' then | ||||||
|             client.stop() |             client:stop() | ||||||
|           end |           end | ||||||
|         end, |         end, | ||||||
|       } |       } | ||||||
| @@ -4653,7 +4653,7 @@ describe('LSP', function() | |||||||
|             end) |             end) | ||||||
|             eq({ command = 'Dummy', title = 'Lens2' }, response) |             eq({ command = 'Dummy', title = 'Lens2' }, response) | ||||||
|           elseif ctx.method == 'shutdown' then |           elseif ctx.method == 'shutdown' then | ||||||
|             client.stop() |             client:stop() | ||||||
|           end |           end | ||||||
|         end, |         end, | ||||||
|       } |       } | ||||||
| @@ -4762,7 +4762,7 @@ describe('LSP', function() | |||||||
|             return notify_msg |             return notify_msg | ||||||
|           end) |           end) | ||||||
|           eq('[LSP] Format request failed, no matching language servers.', notify_msg) |           eq('[LSP] Format request failed, no matching language servers.', notify_msg) | ||||||
|           client.stop() |           client:stop() | ||||||
|         end, |         end, | ||||||
|       } |       } | ||||||
|     end) |     end) | ||||||
| @@ -4795,7 +4795,7 @@ describe('LSP', function() | |||||||
|             end) |             end) | ||||||
|             eq(nil, notify_msg) |             eq(nil, notify_msg) | ||||||
|           elseif ctx.method == 'shutdown' then |           elseif ctx.method == 'shutdown' then | ||||||
|             client.stop() |             client:stop() | ||||||
|           end |           end | ||||||
|         end, |         end, | ||||||
|       } |       } | ||||||
| @@ -4836,7 +4836,7 @@ describe('LSP', function() | |||||||
|             end) |             end) | ||||||
|             eq(nil, notify_msg) |             eq(nil, notify_msg) | ||||||
|           elseif ctx.method == 'shutdown' then |           elseif ctx.method == 'shutdown' then | ||||||
|             client.stop() |             client:stop() | ||||||
|           end |           end | ||||||
|         end, |         end, | ||||||
|       } |       } | ||||||
| @@ -4883,7 +4883,7 @@ describe('LSP', function() | |||||||
|             end) |             end) | ||||||
|             eq(nil, notify_msg) |             eq(nil, notify_msg) | ||||||
|           elseif ctx.method == 'shutdown' then |           elseif ctx.method == 'shutdown' then | ||||||
|             client.stop() |             client:stop() | ||||||
|           end |           end | ||||||
|         end, |         end, | ||||||
|       } |       } | ||||||
| @@ -4930,7 +4930,7 @@ describe('LSP', function() | |||||||
|             end) |             end) | ||||||
|             eq({ handler_called = true }, result) |             eq({ handler_called = true }, result) | ||||||
|           elseif ctx.method == 'shutdown' then |           elseif ctx.method == 'shutdown' then | ||||||
|             client.stop() |             client:stop() | ||||||
|           end |           end | ||||||
|         end, |         end, | ||||||
|       } |       } | ||||||
| @@ -5477,7 +5477,7 @@ describe('LSP', function() | |||||||
|           result[#result + 1] = { |           result[#result + 1] = { | ||||||
|             method = method, |             method = method, | ||||||
|             fname = fname, |             fname = fname, | ||||||
|             supported = client.supports_method(method, { bufnr = bufnr }), |             supported = client:supports_method(method, { bufnr = bufnr }), | ||||||
|           } |           } | ||||||
|         end |         end | ||||||
|  |  | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user