Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

refactor(lsp): extract resolve_bufnr to vim.lsp.util #28494

Closed
wants to merge 2 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
28 changes: 8 additions & 20 deletions runtime/lua/vim/lsp.lua
Original file line number Diff line number Diff line change
Expand Up @@ -68,18 +68,6 @@ lsp._request_name_to_capability = {

-- TODO improve handling of scratch buffers with LSP attached.

--- Returns the buffer number for the given {bufnr}.
---
---@param bufnr (integer|nil) Buffer number to resolve. Defaults to current buffer
---@return integer bufnr
local function resolve_bufnr(bufnr)
validate({ bufnr = { bufnr, 'n', true } })
if bufnr == nil or bufnr == 0 then
return api.nvim_get_current_buf()
end
return bufnr
end

---@private
--- Called by the client when trying to call a method that's not
--- supported in any of the servers registered for the current buffer.
Expand Down Expand Up @@ -242,7 +230,7 @@ end
function lsp.start(config, opts)
opts = opts or {}
local reuse_client = opts.reuse_client or reuse_client_default
local bufnr = resolve_bufnr(opts.bufnr)
local bufnr = util.resolve_bufnr(opts.bufnr)

for _, client in pairs(all_clients) do
if reuse_client(client, config) then
Expand Down Expand Up @@ -467,7 +455,7 @@ end
---Buffer lifecycle handler for textDocument/didSave
--- @param bufnr integer
local function text_document_did_save_handler(bufnr)
bufnr = resolve_bufnr(bufnr)
bufnr = util.resolve_bufnr(bufnr)
local uri = vim.uri_from_bufnr(bufnr)
local text = once(lsp._buf_get_full_text)
for _, client in ipairs(lsp.get_clients({ bufnr = bufnr })) do
Expand Down Expand Up @@ -592,7 +580,7 @@ function lsp.buf_attach_client(bufnr, client_id)
bufnr = { bufnr, 'n', true },
client_id = { client_id, 'n' },
})
bufnr = resolve_bufnr(bufnr)
bufnr = util.resolve_bufnr(bufnr)
if not api.nvim_buf_is_loaded(bufnr) then
log.warn(string.format('buf_attach_client called on unloaded buffer (id: %d): ', bufnr))
return false
Expand Down Expand Up @@ -633,7 +621,7 @@ function lsp.buf_detach_client(bufnr, client_id)
bufnr = { bufnr, 'n', true },
client_id = { client_id, 'n' },
})
bufnr = resolve_bufnr(bufnr)
bufnr = util.resolve_bufnr(bufnr)

local client = all_clients[client_id]
if not client or not client.attached_buffers[bufnr] then
Expand Down Expand Up @@ -757,7 +745,7 @@ function lsp.get_clients(filter)

local clients = {} --- @type vim.lsp.Client[]

local bufnr = filter.bufnr and resolve_bufnr(filter.bufnr)
local bufnr = filter.bufnr and util.resolve_bufnr(filter.bufnr)

for _, client in pairs(all_clients) do
if
Expand Down Expand Up @@ -852,7 +840,7 @@ function lsp.buf_request(bufnr, method, params, handler)
handler = { handler, 'f', true },
})

bufnr = resolve_bufnr(bufnr)
bufnr = util.resolve_bufnr(bufnr)
local method_supported = false
local clients = lsp.get_clients({ bufnr = bufnr })
local client_request_ids = {} --- @type table<integer,integer>
Expand Down Expand Up @@ -1086,7 +1074,7 @@ end
function lsp.buf_get_clients(bufnr)
vim.deprecate('vim.lsp.buf_get_clients()', 'vim.lsp.get_clients()', '0.12')
local result = {} --- @type table<integer,vim.lsp.Client>
for _, client in ipairs(lsp.get_clients({ bufnr = resolve_bufnr(bufnr) })) do
for _, client in ipairs(lsp.get_clients({ bufnr = util.resolve_bufnr(bufnr) })) do
result[client.id] = client
end
return result
Expand Down Expand Up @@ -1140,7 +1128,7 @@ function lsp.for_each_buffer_client(bufnr, fn)
'lsp.get_clients({ bufnr = bufnr }) with regular loop',
'0.12'
)
bufnr = resolve_bufnr(bufnr)
bufnr = util.resolve_bufnr(bufnr)

for _, client in pairs(lsp.get_clients({ bufnr = bufnr })) do
fn(client, client.id, bufnr)
Expand Down
14 changes: 1 addition & 13 deletions runtime/lua/vim/lsp/client.lua
Original file line number Diff line number Diff line change
Expand Up @@ -641,18 +641,6 @@ function Client:_resolve_handler(method)
return self.handlers[method] or lsp.handlers[method]
end

--- Returns the buffer number for the given {bufnr}.
---
--- @param bufnr (integer|nil) Buffer number to resolve. Defaults to current buffer
--- @return integer bufnr
local function resolve_bufnr(bufnr)
validate({ bufnr = { bufnr, 'n', true } })
if bufnr == nil or bufnr == 0 then
return api.nvim_get_current_buf()
end
return bufnr
end

--- @private
--- Sends a request to the server.
---
Expand Down Expand Up @@ -680,7 +668,7 @@ function Client:_request(method, params, handler, bufnr)
-- Ensure pending didChange notifications are sent so that the server doesn't operate on a stale state
changetracking.flush(self, bufnr)
local version = lsp.util.buf_versions[bufnr]
bufnr = resolve_bufnr(bufnr)
bufnr = lsp.util.resolve_bufnr(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 context = {
Expand Down
22 changes: 18 additions & 4 deletions runtime/lua/vim/lsp/codelens.lua
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ local util = require('vim.lsp.util')
local log = require('vim.lsp.log')
local ms = require('vim.lsp.protocol').Methods
local api = vim.api
local validate = vim.validate
local M = {}

--- bufnr → true|nil
Expand Down Expand Up @@ -104,8 +105,16 @@ function M.run()
end
end

--- Returns the buffer number for the given {bufnr}.
---
--- @param bufnr (integer|nil) Buffer number to resolve. Defaults to current buffer
--- @return integer bufnr
local function resolve_bufnr(bufnr)
return bufnr == 0 and api.nvim_get_current_buf() or bufnr
validate({ bufnr = { bufnr, 'n', true } })
if bufnr == nil or bufnr == 0 then
return api.nvim_get_current_buf()
end
return bufnr
end

--- Clear the lenses
Expand Down Expand Up @@ -296,9 +305,14 @@ end
--- @param opts? vim.lsp.codelens.refresh.Opts Optional fields
function M.refresh(opts)
opts = opts or {}
local bufnr = opts.bufnr and resolve_bufnr(opts.bufnr)
local buffers = bufnr and { bufnr }
or vim.tbl_filter(api.nvim_buf_is_loaded, api.nvim_list_bufs())
---@type integer[]
local buffers
if opts.bufnr then
local bufnr = resolve_bufnr(opts.bufnr)
buffers = { bufnr }
else
buffers = vim.tbl_filter(api.nvim_buf_is_loaded, api.nvim_list_bufs())
end

for _, buf in ipairs(buffers) do
if not active_refreshes[buf] then
Expand Down
12 changes: 12 additions & 0 deletions runtime/lua/vim/lsp/util.lua
Original file line number Diff line number Diff line change
Expand Up @@ -113,6 +113,18 @@ local function create_window_without_focus()
return new
end

--- Returns the buffer number for the given {bufnr}.
---
---@param bufnr (integer|nil) Buffer number to resolve. Defaults to current buffer
---@return integer bufnr
function M.resolve_bufnr(bufnr)
validate({ bufnr = { bufnr, 'n', true } })
if bufnr == nil or bufnr == 0 then
return api.nvim_get_current_buf()
end
return bufnr
end

--- Convert byte index to `encoding` index.
--- Convenience wrapper around vim.str_utfindex
---@param line string line to be indexed
Expand Down