aboutsummaryrefslogtreecommitdiff
path: root/runtime/lua/vim/lsp/util.lua
diff options
context:
space:
mode:
authorFolke Lemaitre <folke.lemaitre@gmail.com>2021-07-09 12:38:29 +0200
committerGitHub <noreply@github.com>2021-07-09 03:38:29 -0700
commit9132b76da6c22bdd96af62113ff23e408fcc2ae7 (patch)
treedcf57bfac808ff6afff527def052895c3b21908d /runtime/lua/vim/lsp/util.lua
parent1c416892879de6b78038f2cc2f1487eff46abb60 (diff)
downloadrneovim-9132b76da6c22bdd96af62113ff23e408fcc2ae7.tar.gz
rneovim-9132b76da6c22bdd96af62113ff23e408fcc2ae7.tar.bz2
rneovim-9132b76da6c22bdd96af62113ff23e408fcc2ae7.zip
fix(lsp): support duplicate params in signature help (#15032)
Diffstat (limited to 'runtime/lua/vim/lsp/util.lua')
-rw-r--r--runtime/lua/vim/lsp/util.lua32
1 files changed, 27 insertions, 5 deletions
diff --git a/runtime/lua/vim/lsp/util.lua b/runtime/lua/vim/lsp/util.lua
index 17440ca1b5..f047a12dff 100644
--- a/runtime/lua/vim/lsp/util.lua
+++ b/runtime/lua/vim/lsp/util.lua
@@ -845,9 +845,10 @@ end
---
--@param signature_help Response of `textDocument/SignatureHelp`
--@param ft optional filetype that will be use as the `lang` for the label markdown code block
+--@param triggers optional list of trigger characters from the lsp server. used to better determine parameter offsets
--@returns list of lines of converted markdown.
--@see https://microsoft.github.io/language-server-protocol/specifications/specification-current/#textDocument_signatureHelp
-function M.convert_signature_help_to_markdown_lines(signature_help, ft)
+function M.convert_signature_help_to_markdown_lines(signature_help, ft, triggers)
if not signature_help.signatures then
return
end
@@ -877,10 +878,16 @@ function M.convert_signature_help_to_markdown_lines(signature_help, ft)
end
if signature.parameters and #signature.parameters > 0 then
local active_parameter = (signature.activeParameter or signature_help.activeParameter or 0)
- -- If the activeParameter is not inside the valid range, then clip it.
+ if active_parameter < 0
+ then active_parameter = 0
+ end
+
+ -- If the activeParameter is > #parameters, then set it to the last
+ -- NOTE: this is not fully according to the spec, but a client-side interpretation
if active_parameter >= #signature.parameters then
- active_parameter = 0
+ active_parameter = #signature.parameters - 1
end
+
local parameter = signature.parameters[active_parameter + 1]
if parameter then
--[=[
@@ -905,8 +912,23 @@ function M.convert_signature_help_to_markdown_lines(signature_help, ft)
if type(parameter.label) == "table" then
active_hl = parameter.label
else
- local i = signature.label:find(parameter.label)
- if i then active_hl = {i - 1, i + #parameter.label - 1} end
+ local offset = 1
+ -- try to set the initial offset to the first found trigger character
+ for _, t in ipairs(triggers or {}) do
+ local trigger_offset = signature.label:find(t, 1, true)
+ if trigger_offset and (offset == 1 or trigger_offset < offset) then
+ offset = trigger_offset
+ end
+ end
+ for p, param in pairs(signature.parameters) do
+ offset = signature.label:find(param.label, offset, true)
+ if not offset then break end
+ if p == active_parameter + 1 then
+ active_hl = {offset - 1, offset + #parameter.label - 1}
+ break
+ end
+ offset = offset + #param.label + 1
+ end
end
end
if parameter.documentation then