aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorYi Ming <ofseed@foxmail.com>2025-02-11 17:09:39 +0800
committerYi Ming <ofseed@foxmail.com>2025-02-11 17:09:39 +0800
commit67221497762ab5a055451c40a374e03bb620a68a (patch)
tree1b9291bfef62a0dacf3c1c4d4e5306a7eae96918
parentf8cbdbb4a817c9e85386c50ddf31460e49038c21 (diff)
downloadrneovim-67221497762ab5a055451c40a374e03bb620a68a.tar.gz
rneovim-67221497762ab5a055451c40a374e03bb620a68a.tar.bz2
rneovim-67221497762ab5a055451c40a374e03bb620a68a.zip
feat(lsp): include `end_col` and `end_lnum` in `vim.lsp.buf.symbols_to_items`
-rw-r--r--runtime/doc/lsp.txt6
-rw-r--r--runtime/doc/news.txt3
-rw-r--r--runtime/lua/vim/lsp/util.lua29
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,
}