diff --git a/runtime/doc/lsp.txt b/runtime/doc/lsp.txt index 4c0ad1e035..d2d7e9faac 100644 --- a/runtime/doc/lsp.txt +++ b/runtime/doc/lsp.txt @@ -1751,6 +1751,9 @@ locations_to_items({locations}, {offset_encoding}) Returns the items with the byte position calculated correctly and in sorted order, for display in quickfix and location lists. + The `user_data` field of each resulting item will contain the original + `Location` or `LocationLink` it was computed from. + The result can be passed to the {list} argument of |setqflist()| or |setloclist()|. diff --git a/runtime/doc/news.txt b/runtime/doc/news.txt index 7607d218c3..972f37f0e9 100644 --- a/runtime/doc/news.txt +++ b/runtime/doc/news.txt @@ -162,6 +162,9 @@ The following new APIs and features were added. • The |:terminal| command now accepts some |:command-modifiers| (specifically |:horizontal| and those that affect splitting a window). +• |vim.lsp.util.locations_to_items()| sets the `user_data` of each item to the + original LSP `Location` or `LocationLink`. + ============================================================================== CHANGED FEATURES *news-changed* diff --git a/runtime/lua/vim/lsp/util.lua b/runtime/lua/vim/lsp/util.lua index 2e376f9093..a6d17afa1b 100644 --- a/runtime/lua/vim/lsp/util.lua +++ b/runtime/lua/vim/lsp/util.lua @@ -1812,6 +1812,9 @@ end) --- Returns the items with the byte position calculated correctly and in sorted --- order, for display in quickfix and location lists. --- +--- The `user_data` field of each resulting item will contain the original +--- `Location` or `LocationLink` it was computed from. +--- --- The result can be passed to the {list} argument of |setqflist()| or --- |setloclist()|. --- @@ -1840,7 +1843,7 @@ function M.locations_to_items(locations, offset_encoding) -- locations may be Location or LocationLink local uri = d.uri or d.targetUri local range = d.range or d.targetSelectionRange - table.insert(grouped[uri], { start = range.start }) + table.insert(grouped[uri], { start = range.start, location = d }) end local keys = vim.tbl_keys(grouped) @@ -1872,6 +1875,7 @@ function M.locations_to_items(locations, offset_encoding) lnum = row + 1, col = col + 1, text = line, + user_data = temp.location, }) end end diff --git a/test/functional/plugin/lsp_spec.lua b/test/functional/plugin/lsp_spec.lua index 6223c6b8d8..3eb89b4556 100644 --- a/test/functional/plugin/lsp_spec.lua +++ b/test/functional/plugin/lsp_spec.lua @@ -2387,7 +2387,14 @@ describe('LSP', function() filename = '/fake/uri', lnum = 1, col = 3, - text = 'testing' + text = 'testing', + user_data = { + uri = 'file:///fake/uri', + range = { + start = { line = 0, character = 2 }, + ['end'] = { line = 0, character = 3 }, + } + } }, } local actual = exec_lua [[ @@ -2413,7 +2420,18 @@ describe('LSP', function() filename = '/fake/uri', lnum = 1, col = 3, - text = 'testing' + text = 'testing', + user_data = { + targetUri = "file:///fake/uri", + targetRange = { + start = { line = 0, character = 2 }, + ['end'] = { line = 0, character = 3 }, + }, + targetSelectionRange = { + start = { line = 0, character = 2 }, + ['end'] = { line = 0, character = 3 }, + } + } }, } local actual = exec_lua [[