mirror of
https://github.com/neovim/neovim.git
synced 2025-02-25 18:55:25 -06:00
feat(lsp): move inlay_hint() to vim.lsp (#24130)
Allows to keep more functions hidden and gives a path forward for further inlay_hint related functions - like applying textEdits. See https://github.com/neovim/neovim/pull/23984#pullrequestreview-1486624668
This commit is contained in:
parent
d55d7646c1
commit
37079fca58
@ -810,6 +810,13 @@ get_log_path() *vim.lsp.get_log_path()*
|
|||||||
Return: ~
|
Return: ~
|
||||||
(string) path to log file
|
(string) path to log file
|
||||||
|
|
||||||
|
inlay_hint({bufnr}, {enable}) *vim.lsp.inlay_hint()*
|
||||||
|
Enable/disable/toggle inlay hints for a buffer
|
||||||
|
|
||||||
|
Parameters: ~
|
||||||
|
• {bufnr} (integer) Buffer handle, or 0 for current
|
||||||
|
• {enable} (boolean|nil) true/false to enable/disable, nil to toggle
|
||||||
|
|
||||||
omnifunc({findstart}, {base}) *vim.lsp.omnifunc()*
|
omnifunc({findstart}, {base}) *vim.lsp.omnifunc()*
|
||||||
Implements 'omnifunc' compatible LSP completion.
|
Implements 'omnifunc' compatible LSP completion.
|
||||||
|
|
||||||
@ -1227,13 +1234,6 @@ incoming_calls() *vim.lsp.buf.incoming_calls()*
|
|||||||
window. If the symbol can resolve to multiple items, the user can pick one
|
window. If the symbol can resolve to multiple items, the user can pick one
|
||||||
in the |inputlist()|.
|
in the |inputlist()|.
|
||||||
|
|
||||||
inlay_hint({bufnr}, {enable}) *vim.lsp.buf.inlay_hint()*
|
|
||||||
Enable/disable/toggle inlay hints for a buffer
|
|
||||||
|
|
||||||
Parameters: ~
|
|
||||||
• {bufnr} (integer) Buffer handle, or 0 for current
|
|
||||||
• {enable} (boolean|nil) true/false to enable/disable, nil to toggle
|
|
||||||
|
|
||||||
list_workspace_folders() *vim.lsp.buf.list_workspace_folders()*
|
list_workspace_folders() *vim.lsp.buf.list_workspace_folders()*
|
||||||
List workspace folders.
|
List workspace folders.
|
||||||
|
|
||||||
|
@ -98,7 +98,7 @@ The following new APIs and features were added.
|
|||||||
|
|
||||||
• |nvim_set_keymap()| and |nvim_del_keymap()| now support abbreviations.
|
• |nvim_set_keymap()| and |nvim_del_keymap()| now support abbreviations.
|
||||||
|
|
||||||
• Implemented LSP inlay hints: |vim.lsp.buf.inlay_hint()|
|
• Implemented LSP inlay hints: |vim.lsp.inlay_hint()|
|
||||||
https://microsoft.github.io/language-server-protocol/specifications/lsp/3.17/specification/#textDocument_inlayHint
|
https://microsoft.github.io/language-server-protocol/specifications/lsp/3.17/specification/#textDocument_inlayHint
|
||||||
|
|
||||||
==============================================================================
|
==============================================================================
|
||||||
|
@ -2474,6 +2474,13 @@ function lsp.with(handler, override_config)
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
--- Enable/disable/toggle inlay hints for a buffer
|
||||||
|
---@param bufnr (integer) Buffer handle, or 0 for current
|
||||||
|
---@param enable (boolean|nil) true/false to enable/disable, nil to toggle
|
||||||
|
function lsp.inlay_hint(bufnr, enable)
|
||||||
|
return require('vim.lsp.inlay_hint')(bufnr, enable)
|
||||||
|
end
|
||||||
|
|
||||||
--- Helper function to use when implementing a handler.
|
--- Helper function to use when implementing a handler.
|
||||||
--- This will check that all of the keys in the user configuration
|
--- This will check that all of the keys in the user configuration
|
||||||
--- are valid keys and make sense to include for this handler.
|
--- are valid keys and make sense to include for this handler.
|
||||||
|
@ -796,19 +796,4 @@ function M.execute_command(command_params)
|
|||||||
request('workspace/executeCommand', command_params)
|
request('workspace/executeCommand', command_params)
|
||||||
end
|
end
|
||||||
|
|
||||||
--- Enable/disable/toggle inlay hints for a buffer
|
|
||||||
---@param bufnr (integer) Buffer handle, or 0 for current
|
|
||||||
---@param enable (boolean|nil) true/false to enable/disable, nil to toggle
|
|
||||||
function M.inlay_hint(bufnr, enable)
|
|
||||||
vim.validate({ enable = { enable, { 'boolean', 'nil' } }, bufnr = { bufnr, 'number' } })
|
|
||||||
local inlay_hint = require('vim.lsp._inlay_hint')
|
|
||||||
if enable then
|
|
||||||
inlay_hint.enable(bufnr)
|
|
||||||
elseif enable == false then
|
|
||||||
inlay_hint.disable(bufnr)
|
|
||||||
else
|
|
||||||
inlay_hint.toggle(bufnr)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
return M
|
return M
|
||||||
|
@ -220,7 +220,7 @@ M['textDocument/codeLens'] = function(...)
|
|||||||
end
|
end
|
||||||
|
|
||||||
M['textDocument/inlayHint'] = function(...)
|
M['textDocument/inlayHint'] = function(...)
|
||||||
return require('vim.lsp._inlay_hint').on_inlayhint(...)
|
return require('vim.lsp.inlay_hint').on_inlayhint(...)
|
||||||
end
|
end
|
||||||
|
|
||||||
--see: https://microsoft.github.io/language-server-protocol/specifications/specification-current/#textDocument_references
|
--see: https://microsoft.github.io/language-server-protocol/specifications/specification-current/#textDocument_references
|
||||||
@ -617,22 +617,8 @@ M['window/showDocument'] = function(_, result, ctx, _)
|
|||||||
end
|
end
|
||||||
|
|
||||||
---@see https://microsoft.github.io/language-server-protocol/specifications/lsp/3.17/specification/#workspace_inlayHint_refresh
|
---@see https://microsoft.github.io/language-server-protocol/specifications/lsp/3.17/specification/#workspace_inlayHint_refresh
|
||||||
M['workspace/inlayHint/refresh'] = function(err, _, ctx)
|
M['workspace/inlayHint/refresh'] = function(err, result, ctx, config)
|
||||||
local inlay_hint = require('vim.lsp._inlay_hint')
|
return require('vim.lsp.inlay_hint').on_refresh(err, result, ctx, config)
|
||||||
if err then
|
|
||||||
return vim.NIL
|
|
||||||
end
|
|
||||||
|
|
||||||
for _, bufnr in ipairs(vim.lsp.get_buffers_by_client_id(ctx.client_id)) do
|
|
||||||
for _, winid in ipairs(api.nvim_list_wins()) do
|
|
||||||
if api.nvim_win_get_buf(winid) == bufnr then
|
|
||||||
inlay_hint.refresh({ bufnr = bufnr })
|
|
||||||
break
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
return vim.NIL
|
|
||||||
end
|
end
|
||||||
|
|
||||||
-- Add boilerplate error validation and logging for all of these.
|
-- Add boilerplate error validation and logging for all of these.
|
||||||
|
@ -101,7 +101,7 @@ end
|
|||||||
--- - only_visible (boolean, default: false): Whether to only refresh hints for the visible regions of the buffer
|
--- - only_visible (boolean, default: false): Whether to only refresh hints for the visible regions of the buffer
|
||||||
---
|
---
|
||||||
---@private
|
---@private
|
||||||
function M.refresh(opts)
|
local function refresh(opts)
|
||||||
opts = opts or {}
|
opts = opts or {}
|
||||||
local bufnr = resolve_bufnr(opts.bufnr or 0)
|
local bufnr = resolve_bufnr(opts.bufnr or 0)
|
||||||
local bufstate = bufstates[bufnr]
|
local bufstate = bufstates[bufnr]
|
||||||
@ -139,6 +139,24 @@ function M.refresh(opts)
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
--- |lsp-handler| for the method `textDocument/inlayHint/refresh`
|
||||||
|
---@private
|
||||||
|
function M.on_refresh(err, _, ctx, _)
|
||||||
|
if err then
|
||||||
|
return vim.NIL
|
||||||
|
end
|
||||||
|
for _, bufnr in ipairs(vim.lsp.get_buffers_by_client_id(ctx.client_id)) do
|
||||||
|
for _, winid in ipairs(api.nvim_list_wins()) do
|
||||||
|
if api.nvim_win_get_buf(winid) == bufnr then
|
||||||
|
refresh({ bufnr = bufnr })
|
||||||
|
break
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
return vim.NIL
|
||||||
|
end
|
||||||
|
|
||||||
--- Clear inlay hints
|
--- Clear inlay hints
|
||||||
---@param bufnr (integer) Buffer handle, or 0 for current
|
---@param bufnr (integer) Buffer handle, or 0 for current
|
||||||
---@private
|
---@private
|
||||||
@ -163,18 +181,18 @@ end
|
|||||||
---@private
|
---@private
|
||||||
local function make_request(request_bufnr)
|
local function make_request(request_bufnr)
|
||||||
reset_timer(request_bufnr)
|
reset_timer(request_bufnr)
|
||||||
M.refresh({ bufnr = request_bufnr })
|
refresh({ bufnr = request_bufnr })
|
||||||
end
|
end
|
||||||
|
|
||||||
--- Enable inlay hints for a buffer
|
--- Enable inlay hints for a buffer
|
||||||
---@param bufnr (integer) Buffer handle, or 0 for current
|
---@param bufnr (integer) Buffer handle, or 0 for current
|
||||||
---@private
|
---@private
|
||||||
function M.enable(bufnr)
|
local function enable(bufnr)
|
||||||
bufnr = resolve_bufnr(bufnr)
|
bufnr = resolve_bufnr(bufnr)
|
||||||
local bufstate = bufstates[bufnr]
|
local bufstate = bufstates[bufnr]
|
||||||
if not (bufstate and bufstate.enabled) then
|
if not (bufstate and bufstate.enabled) then
|
||||||
bufstates[bufnr] = { enabled = true, timer = nil, applied = {} }
|
bufstates[bufnr] = { enabled = true, timer = nil, applied = {} }
|
||||||
M.refresh({ bufnr = bufnr })
|
refresh({ bufnr = bufnr })
|
||||||
api.nvim_buf_attach(bufnr, true, {
|
api.nvim_buf_attach(bufnr, true, {
|
||||||
on_lines = function(_, cb_bufnr)
|
on_lines = function(_, cb_bufnr)
|
||||||
if not bufstates[cb_bufnr].enabled then
|
if not bufstates[cb_bufnr].enabled then
|
||||||
@ -190,7 +208,7 @@ function M.enable(bufnr)
|
|||||||
if bufstates[cb_bufnr] and bufstates[cb_bufnr].enabled then
|
if bufstates[cb_bufnr] and bufstates[cb_bufnr].enabled then
|
||||||
bufstates[cb_bufnr] = { enabled = true, applied = {} }
|
bufstates[cb_bufnr] = { enabled = true, applied = {} }
|
||||||
end
|
end
|
||||||
M.refresh({ bufnr = cb_bufnr })
|
refresh({ bufnr = cb_bufnr })
|
||||||
end,
|
end,
|
||||||
on_detach = function(_, cb_bufnr)
|
on_detach = function(_, cb_bufnr)
|
||||||
clear(cb_bufnr)
|
clear(cb_bufnr)
|
||||||
@ -211,7 +229,7 @@ end
|
|||||||
--- Disable inlay hints for a buffer
|
--- Disable inlay hints for a buffer
|
||||||
---@param bufnr (integer) Buffer handle, or 0 for current
|
---@param bufnr (integer) Buffer handle, or 0 for current
|
||||||
---@private
|
---@private
|
||||||
function M.disable(bufnr)
|
local function disable(bufnr)
|
||||||
bufnr = resolve_bufnr(bufnr)
|
bufnr = resolve_bufnr(bufnr)
|
||||||
if bufstates[bufnr] and bufstates[bufnr].enabled then
|
if bufstates[bufnr] and bufstates[bufnr].enabled then
|
||||||
clear(bufnr)
|
clear(bufnr)
|
||||||
@ -223,7 +241,7 @@ end
|
|||||||
--- Toggle inlay hints for a buffer
|
--- Toggle inlay hints for a buffer
|
||||||
---@param bufnr (integer) Buffer handle, or 0 for current
|
---@param bufnr (integer) Buffer handle, or 0 for current
|
||||||
---@private
|
---@private
|
||||||
function M.toggle(bufnr)
|
local function toggle(bufnr)
|
||||||
bufnr = resolve_bufnr(bufnr)
|
bufnr = resolve_bufnr(bufnr)
|
||||||
local bufstate = bufstates[bufnr]
|
local bufstate = bufstates[bufnr]
|
||||||
if bufstate and bufstate.enabled then
|
if bufstate and bufstate.enabled then
|
||||||
@ -281,4 +299,15 @@ api.nvim_set_decoration_provider(namespace, {
|
|||||||
end,
|
end,
|
||||||
})
|
})
|
||||||
|
|
||||||
return M
|
return setmetatable(M, {
|
||||||
|
__call = function(_, bufnr, enable_)
|
||||||
|
vim.validate({ enable = { enable_, { 'boolean', 'nil' } }, bufnr = { bufnr, 'number' } })
|
||||||
|
if enable_ then
|
||||||
|
enable(bufnr)
|
||||||
|
elseif enable_ == false then
|
||||||
|
disable(bufnr)
|
||||||
|
else
|
||||||
|
toggle(bufnr)
|
||||||
|
end
|
||||||
|
end,
|
||||||
|
})
|
@ -64,7 +64,7 @@ describe('inlay hints', function()
|
|||||||
end)
|
end)
|
||||||
|
|
||||||
it(
|
it(
|
||||||
'inlay hints are applied when vim.lsp.buf.inlay_hint(true) is called',
|
'inlay hints are applied when vim.lsp.inlay_hint(true) is called',
|
||||||
function()
|
function()
|
||||||
local res = exec_lua([[
|
local res = exec_lua([[
|
||||||
bufnr = vim.api.nvim_get_current_buf()
|
bufnr = vim.api.nvim_get_current_buf()
|
||||||
@ -79,7 +79,7 @@ describe('inlay hints', function()
|
|||||||
|
|
||||||
|
|
||||||
insert(text)
|
insert(text)
|
||||||
exec_lua([[vim.lsp.buf.inlay_hint(bufnr, true)]])
|
exec_lua([[vim.lsp.inlay_hint(bufnr, true)]])
|
||||||
screen:expect({
|
screen:expect({
|
||||||
grid = [[
|
grid = [[
|
||||||
auto add(int a, int b)-> int { return a + b; } |
|
auto add(int a, int b)-> int { return a + b; } |
|
||||||
@ -96,7 +96,7 @@ describe('inlay hints', function()
|
|||||||
end)
|
end)
|
||||||
|
|
||||||
it(
|
it(
|
||||||
'inlay hints are cleared when vim.lsp.buf.inlay_hint(false) is called',
|
'inlay hints are cleared when vim.lsp.inlay_hint(false) is called',
|
||||||
function()
|
function()
|
||||||
exec_lua([[
|
exec_lua([[
|
||||||
bufnr = vim.api.nvim_get_current_buf()
|
bufnr = vim.api.nvim_get_current_buf()
|
||||||
@ -105,7 +105,7 @@ describe('inlay hints', function()
|
|||||||
]])
|
]])
|
||||||
|
|
||||||
insert(text)
|
insert(text)
|
||||||
exec_lua([[vim.lsp.buf.inlay_hint(bufnr, true)]])
|
exec_lua([[vim.lsp.inlay_hint(bufnr, true)]])
|
||||||
screen:expect({
|
screen:expect({
|
||||||
grid = [[
|
grid = [[
|
||||||
auto add(int a, int b)-> int { return a + b; } |
|
auto add(int a, int b)-> int { return a + b; } |
|
||||||
@ -119,7 +119,7 @@ describe('inlay hints', function()
|
|||||||
|
|
|
|
||||||
]]
|
]]
|
||||||
})
|
})
|
||||||
exec_lua([[vim.lsp.buf.inlay_hint(bufnr, false)]])
|
exec_lua([[vim.lsp.inlay_hint(bufnr, false)]])
|
||||||
screen:expect({
|
screen:expect({
|
||||||
grid = [[
|
grid = [[
|
||||||
auto add(int a, int b) { return a + b; } |
|
auto add(int a, int b) { return a + b; } |
|
||||||
|
Loading…
Reference in New Issue
Block a user