diff options
-rw-r--r-- | runtime/doc/lsp.txt | 6 | ||||
-rw-r--r-- | runtime/doc/news.txt | 3 | ||||
-rw-r--r-- | runtime/lua/vim/lsp/util.lua | 29 |
3 files changed, 25 insertions, 13 deletions
diff --git a/runtime/doc/lsp.txt b/runtime/doc/lsp.txt index 25ef7f24cc..9e6aec4bf7 100644 --- a/runtime/doc/lsp.txt +++ b/runtime/doc/lsp.txt @@ -2380,8 +2380,10 @@ symbols_to_items({symbols}, {bufnr}) *vim.lsp.util.symbols_to_items()* Converts symbols to quickfix list items. Parameters: ~ - • {symbols} (`lsp.DocumentSymbol[]|lsp.SymbolInformation[]`) - • {bufnr} (`integer?`) + • {symbols} (`lsp.DocumentSymbol[]|lsp.SymbolInformation[]`) list of + symbols + • {bufnr} (`integer?`) buffer handle or 0 for current, defaults to + current Return: ~ (`vim.quickfix.entry[]`) See |setqflist()| for the format diff --git a/runtime/doc/news.txt b/runtime/doc/news.txt index 90a020bb4d..8ab001bf94 100644 --- a/runtime/doc/news.txt +++ b/runtime/doc/news.txt @@ -277,7 +277,8 @@ LSP • `:checkhealth vim.lsp` displays the server version (if available). • Completion side effects (including snippet expansion, execution of commands and application of additional text edits) is now built-in. -• |vim.lsp.util.locations_to_items()| sets `end_col` and `end_lnum` fields. +• |vim.lsp.util.locations_to_items()| and |vim.lsp.util.symbols_to_items()| now + sets `end_col` and `end_lnum` fields. • |vim.lsp.buf.format()| now supports passing a list of ranges via the `range` parameter (this requires support for the `textDocument/rangesFormatting` request). diff --git a/runtime/lua/vim/lsp/util.lua b/runtime/lua/vim/lsp/util.lua index e16a905c44..e0d93ca75b 100644 --- a/runtime/lua/vim/lsp/util.lua +++ b/runtime/lua/vim/lsp/util.lua @@ -1775,32 +1775,41 @@ end --- Converts symbols to quickfix list items. --- ----@param symbols lsp.DocumentSymbol[]|lsp.SymbolInformation[] ----@param bufnr? integer +---@param symbols lsp.DocumentSymbol[]|lsp.SymbolInformation[] list of symbols +---@param bufnr? integer buffer handle or 0 for current, defaults to current ---@return vim.quickfix.entry[] # See |setqflist()| for the format function M.symbols_to_items(symbols, bufnr) - bufnr = bufnr or 0 + bufnr = vim._resolve_bufnr(bufnr) + local items = {} --- @type vim.quickfix.entry[] for _, symbol in ipairs(symbols) do - --- @type string?, lsp.Position? - local filename, pos + --- @type string?, lsp.Range? + local filename, range if symbol.location then --- @cast symbol lsp.SymbolInformation filename = vim.uri_to_fname(symbol.location.uri) - pos = symbol.location.range.start + range = symbol.location.range elseif symbol.selectionRange then --- @cast symbol lsp.DocumentSymbol filename = api.nvim_buf_get_name(bufnr) - pos = symbol.selectionRange.start + range = symbol.selectionRange end - if filename and pos then + if filename and range then local kind = protocol.SymbolKind[symbol.kind] or 'Unknown' + + local lnum = range['start'].line + 1 + local col = range['start'].character + 1 + local end_lnum = range['end'].line + 1 + local end_col = range['end'].character + 1 + items[#items + 1] = { filename = filename, - lnum = pos.line + 1, - col = pos.character + 1, + lnum = lnum, + col = col, + end_lnum = end_lnum, + end_col = end_col, kind = kind, text = '[' .. kind .. '] ' .. symbol.name, } |