mirror of
https://github.com/neovim/neovim
synced 2025-07-18 10:11:50 +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,23 +602,27 @@ 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(
|
||||||
--- @param result lsp.CallHierarchyItem[]?
|
0,
|
||||||
lsp.buf_request(0, ms.textDocument_prepareCallHierarchy, params, function(err, result, ctx)
|
ms.textDocument_prepareCallHierarchy,
|
||||||
if err then
|
client_positional_params(),
|
||||||
vim.notify(err.message, vim.log.levels.WARN)
|
--- @param result lsp.CallHierarchyItem[]?
|
||||||
return
|
function(err, result, ctx)
|
||||||
|
if err then
|
||||||
|
vim.notify(err.message, vim.log.levels.WARN)
|
||||||
|
return
|
||||||
|
end
|
||||||
|
if not result or vim.tbl_isempty(result) then
|
||||||
|
vim.notify('No item resolved', vim.log.levels.WARN)
|
||||||
|
return
|
||||||
|
end
|
||||||
|
local item = pick_call_hierarchy_item(result)
|
||||||
|
if not item then
|
||||||
|
return
|
||||||
|
end
|
||||||
|
request_with_id(ctx.client_id, method, { item = item }, nil, ctx.bufnr)
|
||||||
end
|
end
|
||||||
if not result or vim.tbl_isempty(result) then
|
)
|
||||||
vim.notify('No item resolved', vim.log.levels.WARN)
|
|
||||||
return
|
|
||||||
end
|
|
||||||
local item = pick_call_hierarchy_item(result)
|
|
||||||
if not item then
|
|
||||||
return
|
|
||||||
end
|
|
||||||
request_with_id(ctx.client_id, method, { item = item }, nil, ctx.bufnr)
|
|
||||||
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