diff options
Diffstat (limited to 'runtime/lua')
-rw-r--r-- | runtime/lua/vim/lsp/tagfunc.lua | 35 |
1 files changed, 22 insertions, 13 deletions
diff --git a/runtime/lua/vim/lsp/tagfunc.lua b/runtime/lua/vim/lsp/tagfunc.lua index 957449743b..4ad50e4a58 100644 --- a/runtime/lua/vim/lsp/tagfunc.lua +++ b/runtime/lua/vim/lsp/tagfunc.lua @@ -2,6 +2,11 @@ local lsp = vim.lsp local util = lsp.util local ms = lsp.protocol.Methods +---@param name string +---@param range lsp.Range +---@param uri string +---@param offset_encoding string +---@return {name: string, filename: string, cmd: string, kind?: string} local function mk_tag_item(name, range, uri, offset_encoding) local bufnr = vim.uri_to_bufnr(uri) -- This is get_line_byte_from_position is 0-indexed, call cursor expects a 1-indexed position @@ -13,6 +18,8 @@ local function mk_tag_item(name, range, uri, offset_encoding) } end +---@param pattern string +---@return table[] local function query_definition(pattern) local params = util.make_position_params() local results_by_client, err = lsp.buf_request_sync(0, ms.textDocument_definition, params, 1000) @@ -23,17 +30,19 @@ local function query_definition(pattern) local add = function(range, uri, offset_encoding) table.insert(results, mk_tag_item(pattern, range, uri, offset_encoding)) end - for client_id, lsp_results in pairs(results_by_client) do + for client_id, lsp_results in pairs(assert(results_by_client)) do local client = lsp.get_client_by_id(client_id) + local offset_encoding = client and client.offset_encoding or 'utf-16' local result = lsp_results.result or {} if result.range then -- Location add(result.range, result.uri) - else -- Location[] or LocationLink[] + else + result = result --[[@as (lsp.Location[]|lsp.LocationLink[])]] for _, item in pairs(result) do if item.range then -- Location - add(item.range, item.uri, client.offset_encoding) + add(item.range, item.uri, offset_encoding) else -- LocationLink - add(item.targetSelectionRange, item.targetUri, client.offset_encoding) + add(item.targetSelectionRange, item.targetUri, offset_encoding) end end end @@ -41,6 +50,8 @@ local function query_definition(pattern) return results end +---@param pattern string +---@return table[] local function query_workspace_symbols(pattern) local results_by_client, err = lsp.buf_request_sync(0, ms.workspace_symbol, { query = pattern }, 1000) @@ -48,11 +59,13 @@ local function query_workspace_symbols(pattern) return {} end local results = {} - for client_id, symbols in pairs(results_by_client) do + for client_id, responses in pairs(assert(results_by_client)) do local client = lsp.get_client_by_id(client_id) - for _, symbol in pairs(symbols.result or {}) do + local offset_encoding = client and client.offset_encoding or 'utf-16' + local symbols = responses.result --[[@as lsp.SymbolInformation[]|nil]] + for _, symbol in pairs(symbols or {}) do local loc = symbol.location - local item = mk_tag_item(symbol.name, loc.range, loc.uri, client.offset_encoding) + local item = mk_tag_item(symbol.name, loc.range, loc.uri, offset_encoding) item.kind = lsp.protocol.SymbolKind[symbol.kind] or 'Unknown' table.insert(results, item) end @@ -61,12 +74,8 @@ local function query_workspace_symbols(pattern) end local function tagfunc(pattern, flags) - local matches - if string.match(flags, 'c') then - matches = query_definition(pattern) - else - matches = query_workspace_symbols(pattern) - end + local matches = string.match(flags, 'c') and query_definition(pattern) + or query_workspace_symbols(pattern) -- fall back to tags if no matches return #matches > 0 and matches or vim.NIL end |