From 549bc29b6f8c85ce0eba5ffcd0e3016c607d642f Mon Sep 17 00:00:00 2001 From: Sanchayan Maity Date: Mon, 10 Jul 2023 14:24:50 +0530 Subject: [PATCH] nvim: lsp: Update capabilities check Dynamic capabilities were introduced in neovim with commit ddd92a7. With dynamic registration of LSP capabilities, a client's `server_capabilities` is no longer a sufficient indicator to see if a server supports a feature. We instead need to use `client.supports_method()` which considers both the dynamic capabilities and static `server_capabilities`. --- nvim/.config/nvim/lua/lsp.lua | 54 +++++++++++++++++------------------ 1 file changed, 27 insertions(+), 27 deletions(-) diff --git a/nvim/.config/nvim/lua/lsp.lua b/nvim/.config/nvim/lua/lsp.lua index 4c79655..6985139 100644 --- a/nvim/.config/nvim/lua/lsp.lua +++ b/nvim/.config/nvim/lua/lsp.lua @@ -48,29 +48,29 @@ protocol.CompletionItemKind = { local lsp_augroup_id = vim.api.nvim_create_augroup("LSP", { clear = true }) local lsp_key_mappings = { - { "definitionProvider" , 'n', 'pd' , 'lua PeekDefinition()' }, - { "definitionProvider" , 'n', 'gd' , 'lua vim.lsp.buf.definition()' }, ---{ "declarationProvider" , 'n', 'gD' , 'lua vim.lsp.buf.declaration()' }, - { "typeDefinitionProvider" , 'n', '' , 'lua vim.lsp.buf.type_definition()' }, - { "referencesProvider" , 'n', 'gr' , 'lua vim.lsp.buf.references()' }, - { "implementationProvider" , 'n', 'gD' , 'lua vim.lsp.buf.implementation()' }, - { "documentSymbolProvider" , 'n', '1gd' , 'lua vim.lsp.buf.document_symbol()' }, - { "workspaceSymbolProvider", 'n', '1gD' , 'lua vim.lsp.buf.workspace_symbol()' }, - { "hoverProvider" , 'n', 'k', 'lua vim.lsp.buf.hover()' }, - { "signatureHelpProvider" , 'n', 'S', 'lua vim.lsp.buf.signature_help()' }, - { "renameProvider" , 'n', 'gR' , 'lua vim.lsp.buf.rename()' }, - { "inlayHintProvider" , 'n', 'gi' , 'lua vim.lsp.inlay_hint(0, nil)' }, + { "textDocument/definition" , 'n', 'pd' , 'lua PeekDefinition()' }, + { "textDocument/definition" , 'n', 'gd' , 'lua vim.lsp.buf.definition()' }, +--{ "textDocument/declaration" , 'n', 'gD' , 'lua vim.lsp.buf.declaration()' }, + { "textDocument/typeDefinition" , 'n', '' , 'lua vim.lsp.buf.type_definition()' }, + { "textDocument/references" , 'n', 'gr' , 'lua vim.lsp.buf.references()' }, + { "textDocument/implementation" , 'n', 'gD' , 'lua vim.lsp.buf.implementation()' }, + { "textDocument/documentSymbol" , 'n', '1gd' , 'lua vim.lsp.buf.document_symbol()' }, + { "workspace/symbol" , 'n', '1gD' , 'lua vim.lsp.buf.workspace_symbol()' }, + { "textDocument/hover" , 'n', 'k', 'lua vim.lsp.buf.hover()' }, + { "textDocument/signatureHelp" , 'n', 'S', 'lua vim.lsp.buf.signature_help()' }, + { "textDocument/rename" , 'n', 'gR' , 'lua vim.lsp.buf.rename()' }, + { "textDocument/inlayHint" , 'n', 'gi' , 'lua vim.lsp.inlay_hint(0, nil)' }, - { "documentRangeFormattingProvider", 'x', 'gq', 'lua vim.lsp.buf.format({async=true})' }, - { "documentFormattingProvider" , 'n', 'gq', 'lua vim.lsp.buf.format({async=true})' }, + { "textDocument/rangeFormatting", 'x', 'gq', 'lua vim.lsp.buf.format({async=true})' }, + { "textDocument/formatting" , 'n', 'gq', 'lua vim.lsp.buf.format({async=true})' }, - { "codeActionProvider", 'n', 'ga' , 'lua vim.lsp.buf.code_action()' }, - { "codeActionProvider", 'v', 'ga' , 'lua vim.lsp.buf.code_action()' }, - { "codeActionProvider", 'n', 'r', 'lua vim.lsp.buf.code_action{only = \'refactor\' }' }, - { "codeActionProvider", 'v', 'r', 'lua vim.lsp.buf.code_action{only = \'refactor\' }' }, + { "textDocument/codeAction", 'n', 'ga' , 'lua vim.lsp.buf.code_action()' }, + { "textDocument/codeAction", 'v', 'ga' , 'lua vim.lsp.buf.code_action()' }, + { "textDocument/codeAction", 'n', 'r', 'lua vim.lsp.buf.code_action{only = \'refactor\' }' }, + { "textDocument/codeAction", 'v', 'r', 'lua vim.lsp.buf.code_action{only = \'refactor\' }' }, - { "codeLensProvider", 'n', 'l', 'lua vim.lsp.codelens.run()' }, - { "codeLensProvider", 'n', 'L', 'lua vim.lsp.codelens.clear()' }, + { "textDocument/codeLens", 'n', 'l', 'lua vim.lsp.codelens.run()' }, + { "textDocument/codeLens", 'n', 'L', 'lua vim.lsp.codelens.clear()' }, } local CODE_ACTION_AVAILABLE = "CodeActionAvailable" @@ -189,12 +189,12 @@ local on_attach = function(client, bufnr) for _, mappings in pairs(lsp_key_mappings) do local capability, mode, lhs, rhs = unpack(mappings) - if client.server_capabilities[capability] then + if client.supports_method(capability) then vim.api.nvim_buf_set_keymap(bufnr, mode, lhs, rhs, opts) end end - if client.server_capabilities.codeActionProvider then + if client.supports_method('textDocument/codeAction') then vim.api.nvim_create_autocmd({"CursorHold", "CursorHoldI"}, { group = lsp_augroup_id, buffer = bufnr, @@ -215,7 +215,7 @@ local on_attach = function(client, bufnr) }) end - if client.server_capabilities.codeLensProvider then + if client.supports_method('textDocument/codeLens') then vim.api.nvim_create_autocmd({"CursorHold", "CursorHoldI", "InsertLeave"}, { group = lsp_augroup_id, buffer = bufnr, @@ -223,7 +223,7 @@ local on_attach = function(client, bufnr) }) end - if client.server_capabilities.documentHighlightProvider then + if client.supports_method('textDocument/documentHighlight') then vim.api.nvim_create_autocmd("CursorHold", { group = lsp_augroup_id, buffer = bufnr, @@ -236,7 +236,7 @@ local on_attach = function(client, bufnr) }) end - if client.server_capabilities.inlayHintProvider then + if client.supports_method('textDocument/inlayHint') then vim.lsp.inlay_hint(bufnr, false) end end @@ -250,7 +250,7 @@ vim.api.nvim_create_autocmd("LspAttach", { for _, mappings in pairs(lsp_key_mappings) do local capability, mode, lhs, rhs = unpack(mappings) - if client.server_capabilities[capability] then + if client.supports_method(capability) then vim.api.nvim_buf_set_keymap(bufnr, mode, lhs, rhs, opts) end end @@ -267,7 +267,7 @@ vim.api.nvim_create_autocmd("LspDetach", { for _, mappings in pairs(lsp_key_mappings) do local capability, mode, lhs, _ = unpack(mappings) - if client.server_capabilities and client.server_capabilities[capability] then + if client.supports_method(capability) then vim.api.nvim_buf_del_keymap(bufnr, mode, lhs) end end