mirror of
				https://github.com/neovim/neovim.git
				synced 2025-10-26 12:27:24 +00:00 
			
		
		
		
	fix(lsp.buf): use correct offset_encoding for all requests
Problem: `lsp.buf_request` send the same params to all servers and many calls to this pass PositionalParams which depends on the clients offset_encoding. This can result with incorrect params being sent to a server. Solution: `lsp.buf_request` `params` argument can now be passed as a function which takes the client as the first argument. This is used in lsp/buf.lua to construct correct params for each client request.
This commit is contained in:
		| @@ -854,7 +854,7 @@ api.nvim_create_autocmd('VimLeavePre', { | |||||||
| --- | --- | ||||||
| ---@param bufnr (integer) Buffer handle, or 0 for current. | ---@param bufnr (integer) Buffer handle, or 0 for current. | ||||||
| ---@param method (string) LSP method name | ---@param method (string) LSP method name | ||||||
| ---@param params table|nil Parameters to send to the server | ---@param params? table|(fun(client: vim.lsp.Client, bufnr: integer): table?) Parameters to send to the server | ||||||
| ---@param handler? lsp.Handler See |lsp-handler| | ---@param handler? lsp.Handler See |lsp-handler| | ||||||
| ---       If nil, follows resolution strategy defined in |lsp-handler-configuration| | ---       If nil, follows resolution strategy defined in |lsp-handler-configuration| | ||||||
| ---@param on_unsupported? fun() | ---@param on_unsupported? fun() | ||||||
| @@ -879,7 +879,8 @@ function lsp.buf_request(bufnr, method, params, handler, on_unsupported) | |||||||
|     if client.supports_method(method, { bufnr = bufnr }) then |     if client.supports_method(method, { bufnr = bufnr }) then | ||||||
|       method_supported = true |       method_supported = true | ||||||
|  |  | ||||||
|       local request_success, request_id = client.request(method, params, handler, bufnr) |       local cparams = type(params) == 'function' and params(client, bufnr) or params --[[@as table?]] | ||||||
|  |       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 | ||||||
|   | |||||||
| @@ -7,6 +7,19 @@ local ms = require('vim.lsp.protocol').Methods | |||||||
|  |  | ||||||
| local M = {} | local M = {} | ||||||
|  |  | ||||||
|  | --- @param params? table | ||||||
|  | --- @return fun(client: vim.lsp.Client): lsp.TextDocumentPositionParams | ||||||
|  | local function client_positional_params(params) | ||||||
|  |   local win = api.nvim_get_current_win() | ||||||
|  |   return function(client) | ||||||
|  |     local ret = util.make_position_params(win, client.offset_encoding) | ||||||
|  |     if params then | ||||||
|  |       ret = vim.tbl_extend('force', ret, params) | ||||||
|  |     end | ||||||
|  |     return ret | ||||||
|  |   end | ||||||
|  | end | ||||||
|  |  | ||||||
| --- Displays hover information about the symbol under the cursor in a floating | --- Displays hover information about the symbol under the cursor in a floating | ||||||
| --- window. The window will be dismissed on cursor move. | --- window. The window will be dismissed on cursor move. | ||||||
| --- Calling the function twice will jump into the floating window | --- Calling the function twice will jump into the floating window | ||||||
| @@ -15,8 +28,7 @@ local M = {} | |||||||
| --- except that "q" dismisses the window. | --- except that "q" dismisses the window. | ||||||
| --- You can scroll the contents the same as you would any other buffer. | --- You can scroll the contents the same as you would any other buffer. | ||||||
| function M.hover() | function M.hover() | ||||||
|   local params = util.make_position_params() |   lsp.buf_request(0, ms.textDocument_hover, client_positional_params()) | ||||||
|   lsp.buf_request(0, ms.textDocument_hover, params) |  | ||||||
| end | end | ||||||
|  |  | ||||||
| local function request_with_opts(name, params, opts) | local function request_with_opts(name, params, opts) | ||||||
| @@ -166,8 +178,7 @@ end | |||||||
| --- Displays signature information about the symbol under the cursor in a | --- Displays signature information about the symbol under the cursor in a | ||||||
| --- floating window. | --- floating window. | ||||||
| function M.signature_help() | function M.signature_help() | ||||||
|   local params = util.make_position_params() |   lsp.buf_request(0, ms.textDocument_signatureHelp, client_positional_params()) | ||||||
|   lsp.buf_request(0, ms.textDocument_signatureHelp, params) |  | ||||||
| end | end | ||||||
|  |  | ||||||
| --- Retrieves the completion items at the current cursor position. Can only be | --- Retrieves the completion items at the current cursor position. Can only be | ||||||
| @@ -179,9 +190,13 @@ end | |||||||
| --- | --- | ||||||
| ---@see vim.lsp.protocol.CompletionTriggerKind | ---@see vim.lsp.protocol.CompletionTriggerKind | ||||||
| function M.completion(context) | function M.completion(context) | ||||||
|   local params = util.make_position_params() |   return lsp.buf_request( | ||||||
|   params.context = context |     0, | ||||||
|   return lsp.buf_request(0, ms.textDocument_completion, params) |     ms.textDocument_completion, | ||||||
|  |     client_positional_params({ | ||||||
|  |       context = context, | ||||||
|  |     }) | ||||||
|  |   ) | ||||||
| end | end | ||||||
|  |  | ||||||
| ---@param bufnr integer | ---@param bufnr integer | ||||||
| @@ -587,9 +602,12 @@ end | |||||||
|  |  | ||||||
| --- @param method string | --- @param method string | ||||||
| local function call_hierarchy(method) | local function call_hierarchy(method) | ||||||
|   local params = util.make_position_params() |   lsp.buf_request( | ||||||
|  |     0, | ||||||
|  |     ms.textDocument_prepareCallHierarchy, | ||||||
|  |     client_positional_params(), | ||||||
|     --- @param result lsp.CallHierarchyItem[]? |     --- @param result lsp.CallHierarchyItem[]? | ||||||
|   lsp.buf_request(0, ms.textDocument_prepareCallHierarchy, params, function(err, result, ctx) |     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) | ||||||
|         return |         return | ||||||
| @@ -603,7 +621,8 @@ local function call_hierarchy(method) | |||||||
|         return |         return | ||||||
|       end |       end | ||||||
|       request_with_id(ctx.client_id, method, { item = item }, nil, ctx.bufnr) |       request_with_id(ctx.client_id, method, { item = item }, nil, ctx.bufnr) | ||||||
|   end) |     end | ||||||
|  |   ) | ||||||
| end | end | ||||||
|  |  | ||||||
| --- Lists all the call sites of the symbol under the cursor in the | --- Lists all the call sites of the symbol under the cursor in the | ||||||
| @@ -773,8 +792,7 @@ end | |||||||
| ---         |hl-LspReferenceRead| | ---         |hl-LspReferenceRead| | ||||||
| ---         |hl-LspReferenceWrite| | ---         |hl-LspReferenceWrite| | ||||||
| function M.document_highlight() | function M.document_highlight() | ||||||
|   local params = util.make_position_params() |   lsp.buf_request(0, ms.textDocument_documentHighlight, client_positional_params()) | ||||||
|   lsp.buf_request(0, ms.textDocument_documentHighlight, params) |  | ||||||
| end | end | ||||||
|  |  | ||||||
| --- Removes document highlights from current buffer. | --- Removes document highlights from current buffer. | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 Lewis Russell
					Lewis Russell