Skip to content

Commit d104ab2

Browse files
author
Marc Jakobi
committed
feat(lsp): auto-detect some extra plugin client capabilities
1 parent d6fd0b7 commit d104ab2

File tree

4 files changed

+97
-40
lines changed

4 files changed

+97
-40
lines changed

CHANGELOG.md

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,14 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
88

99
## [Unreleased]
1010

11+
### Added
12+
13+
- LSP: Automatically detect and register client capabilities for the following plugins,
14+
if installed:
15+
- [cmp-nvim-lsp](https://github.com/hrsh7th/cmp-nvim-lsp)
16+
- [nvim-lsp-selection-range](https://github.com/camilledejoye/nvim-lsp-selection-range)
17+
- [nvim-ufo](https://github.com/kevinhwang91/nvim-ufo)
18+
1119
### Fixed
1220

1321
- Neotest: Correctly mark passed and skipped tests when running a

lua/rustaceanvim/config/internal.lua

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ local compat = require('rustaceanvim.compat')
33
local config = require('rustaceanvim.config')
44
local executors = require('rustaceanvim.executors')
55
local os = require('rustaceanvim.os')
6+
local server_config = require('rustaceanvim.config.server')
67

78
local RustaceanConfig
89

@@ -263,6 +264,8 @@ local RustaceanDefaultConfig = {
263264
---@diagnostic disable-next-line: undefined-doc-class
264265
---@class RustaceanLspClientConfig: vim.lsp.ClientConfig
265266
server = {
267+
---@type rustaceanvim.ClientCapabilities
268+
capabilities = server_config.create_client_capabilities(),
266269
---@type boolean | fun(bufnr: integer):boolean Whether to automatically attach the LSP client.
267270
---Defaults to `true` if the `rust-analyzer` executable is found.
268271
auto_attach = function(bufnr)
@@ -292,10 +295,7 @@ local RustaceanDefaultConfig = {
292295

293296
---@type table | (fun(project_root:string|nil, default_settings: table|nil):table) -- The rust-analyzer settings or a function that creates them.
294297
settings = function(project_root, default_settings)
295-
return require('rustaceanvim.config.server').load_rust_analyzer_settings(
296-
project_root,
297-
{ default_settings = default_settings }
298-
)
298+
return server_config.load_rust_analyzer_settings(project_root, { default_settings = default_settings })
299299
end,
300300

301301
--- @type table

lua/rustaceanvim/config/server.lua

Lines changed: 85 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,4 +63,89 @@ function server.load_rust_analyzer_settings(project_root, opts)
6363
return default_settings
6464
end
6565

66+
---@return rustaceanvim.ClientCapabilities
67+
local function make_rustaceanvim_capabilities()
68+
---@class rustaceanvim.ClientCapabilities: lsp.ClientCapabilities
69+
local capabilities = vim.lsp.protocol.make_client_capabilities()
70+
71+
-- snippets
72+
capabilities.textDocument.completion.completionItem.snippetSupport = true
73+
74+
-- send actions with hover request
75+
---@class rustaceanvim.ExperimentalCapabilities
76+
capabilities.experimental = {
77+
hoverActions = true,
78+
hoverRange = true,
79+
serverStatusNotification = true,
80+
snippetTextEdit = true,
81+
codeActionGroup = true,
82+
ssr = true,
83+
}
84+
85+
-- enable auto-import
86+
capabilities.textDocument.completion.completionItem.resolveSupport = {
87+
properties = { 'documentation', 'detail', 'additionalTextEdits' },
88+
}
89+
90+
-- rust analyzer goodies
91+
local experimental_commands = {
92+
'rust-analyzer.runSingle',
93+
'rust-analyzer.showReferences',
94+
'rust-analyzer.gotoLocation',
95+
'editor.action.triggerParameterHints',
96+
}
97+
if package.loaded['dap'] ~= nil then
98+
table.insert(experimental_commands, 'rust-analyzer.debugSingle')
99+
end
100+
101+
---@class rustaceanvim.ExperimentalCommandCapabilities
102+
capabilities.experimental.commands = {
103+
commands = experimental_commands,
104+
}
105+
106+
return capabilities
107+
end
108+
109+
---@param mod_name string
110+
---@param callback fun(mod: table): lsp.ClientCapabilities
111+
---@return lsp.ClientCapabilities
112+
local function mk_capabilities_if_available(mod_name, callback)
113+
local available, mod = pcall(require, mod_name)
114+
if available and type(mod) == 'table' then
115+
local ok, capabilities = pcall(callback, mod)
116+
if ok then
117+
return capabilities
118+
end
119+
end
120+
return {}
121+
end
122+
123+
---@return rustaceanvim.ClientCapabilities
124+
function server.create_client_capabilities()
125+
local rs_capabilities = make_rustaceanvim_capabilities()
126+
local cmp_capabilities = mk_capabilities_if_available('cmp_nvim_lsp', function(cmp_nvim_lsp)
127+
return cmp_nvim_lsp.default_capabilities()
128+
end)
129+
local selection_range_capabilities = mk_capabilities_if_available('lsp-selection-range', function(lsp_selection_range)
130+
return lsp_selection_range.update_capabilities {}
131+
end)
132+
local folding_range_capabilities = mk_capabilities_if_available('ufo', function(_)
133+
return {
134+
textDocument = {
135+
foldingRange = {
136+
dynamicRegistration = false,
137+
lineFoldingOnly = true,
138+
},
139+
},
140+
}
141+
end)
142+
return vim.tbl_deep_extend(
143+
'keep',
144+
rs_capabilities,
145+
cmp_capabilities,
146+
selection_range_capabilities,
147+
folding_range_capabilities
148+
)
149+
end
150+
66151
return server

lua/rustaceanvim/lsp.lua

Lines changed: 0 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -135,42 +135,6 @@ M.start = function(bufnr)
135135
lsp_start_config.cmd = rust_analyzer_cmd
136136
lsp_start_config.name = 'rust-analyzer'
137137
lsp_start_config.filetypes = { 'rust' }
138-
local capabilities = vim.lsp.protocol.make_client_capabilities()
139-
140-
-- snippets
141-
capabilities.textDocument.completion.completionItem.snippetSupport = true
142-
143-
-- send actions with hover request
144-
capabilities.experimental = {
145-
hoverActions = true,
146-
hoverRange = true,
147-
serverStatusNotification = true,
148-
snippetTextEdit = true,
149-
codeActionGroup = true,
150-
ssr = true,
151-
}
152-
153-
-- enable auto-import
154-
capabilities.textDocument.completion.completionItem.resolveSupport = {
155-
properties = { 'documentation', 'detail', 'additionalTextEdits' },
156-
}
157-
158-
-- rust analyzer goodies
159-
local experimental_commands = {
160-
'rust-analyzer.runSingle',
161-
'rust-analyzer.showReferences',
162-
'rust-analyzer.gotoLocation',
163-
'editor.action.triggerParameterHints',
164-
}
165-
if package.loaded['dap'] ~= nil then
166-
table.insert(experimental_commands, 'rust-analyzer.debugSingle')
167-
end
168-
169-
capabilities.experimental.commands = {
170-
commands = experimental_commands,
171-
}
172-
173-
lsp_start_config.capabilities = vim.tbl_deep_extend('force', capabilities, lsp_start_config.capabilities or {})
174138

175139
local custom_handlers = {}
176140
custom_handlers['experimental/serverStatus'] = server_status.handler

0 commit comments

Comments
 (0)