mirror of
https://github.com/neovim/neovim.git
synced 2025-09-06 03:18:16 +00:00
feat(lsp): static registration support (#34371)
This commit is contained in:

committed by
GitHub

parent
a5f236291c
commit
d75ffa5934
@@ -554,6 +554,8 @@ function Client:initialize()
|
|||||||
assert(result.capabilities, "initialize result doesn't contain capabilities")
|
assert(result.capabilities, "initialize result doesn't contain capabilities")
|
||||||
self.server_capabilities = assert(lsp.protocol.resolve_capabilities(self.server_capabilities))
|
self.server_capabilities = assert(lsp.protocol.resolve_capabilities(self.server_capabilities))
|
||||||
|
|
||||||
|
self:_process_static_registrations()
|
||||||
|
|
||||||
if self.server_capabilities.positionEncoding then
|
if self.server_capabilities.positionEncoding then
|
||||||
self.offset_encoding = self.server_capabilities.positionEncoding
|
self.offset_encoding = self.server_capabilities.positionEncoding
|
||||||
end
|
end
|
||||||
@@ -585,6 +587,48 @@ function Client:initialize()
|
|||||||
end)
|
end)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
-- Server capabilities for methods that support static registration.
|
||||||
|
local static_registration_capabilities = {
|
||||||
|
[ms.textDocument_prepareCallHierarchy] = 'callHierarchyProvider',
|
||||||
|
[ms.textDocument_documentColor] = 'colorProvider',
|
||||||
|
[ms.textDocument_declaration] = 'declarationProvider',
|
||||||
|
[ms.textDocument_diagnostic] = 'diagnosticProvider',
|
||||||
|
[ms.textDocument_foldingRange] = 'foldingRangeProvider',
|
||||||
|
[ms.textDocument_implementation] = 'implementationProvider',
|
||||||
|
[ms.textDocument_inlayHint] = 'inlayHintProvider',
|
||||||
|
[ms.textDocument_inlineValue] = 'inlineValueProvider',
|
||||||
|
[ms.textDocument_linkedEditingRange] = 'linkedEditingRangeProvider',
|
||||||
|
[ms.textDocument_moniker] = 'monikerProvider',
|
||||||
|
[ms.textDocument_selectionRange] = 'selectionRangeProvider',
|
||||||
|
[ms.textDocument_semanticTokens_full] = 'semanticTokensProvider',
|
||||||
|
[ms.textDocument_typeDefinition] = 'typeDefinitionProvider',
|
||||||
|
[ms.textDocument_prepareTypeHierarchy] = 'typeHierarchyProvider',
|
||||||
|
}
|
||||||
|
|
||||||
|
--- @private
|
||||||
|
function Client:_process_static_registrations()
|
||||||
|
local static_registrations = {} ---@type lsp.Registration[]
|
||||||
|
|
||||||
|
for method, capability in pairs(static_registration_capabilities) do
|
||||||
|
if
|
||||||
|
vim.tbl_get(self.server_capabilities, capability, 'id')
|
||||||
|
and self:_supports_registration(method)
|
||||||
|
then
|
||||||
|
static_registrations[#static_registrations + 1] = {
|
||||||
|
id = self.server_capabilities[capability].id,
|
||||||
|
method = method,
|
||||||
|
registerOptions = {
|
||||||
|
documentSelector = self.server_capabilities[capability].documentSelector, ---@type lsp.DocumentSelector?
|
||||||
|
},
|
||||||
|
}
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
if next(static_registrations) then
|
||||||
|
self:_register_dynamic(static_registrations)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
--- @private
|
--- @private
|
||||||
--- Returns the handler associated with an LSP method.
|
--- Returns the handler associated with an LSP method.
|
||||||
--- Returns the default handler if the user hasn't set a custom one.
|
--- Returns the default handler if the user hasn't set a custom one.
|
||||||
|
@@ -5727,6 +5727,28 @@ describe('LSP', function()
|
|||||||
eq({ method = 'textDocument/rangeFormatting', supported = true, fname = tmpfile }, result[4])
|
eq({ method = 'textDocument/rangeFormatting', supported = true, fname = tmpfile }, result[4])
|
||||||
eq({ method = 'textDocument/completion', supported = false }, result[5])
|
eq({ method = 'textDocument/completion', supported = false }, result[5])
|
||||||
end)
|
end)
|
||||||
|
|
||||||
|
it('supports static registration', function()
|
||||||
|
exec_lua(create_server_definition)
|
||||||
|
|
||||||
|
local client_id = exec_lua(function()
|
||||||
|
local server = _G._create_server({
|
||||||
|
capabilities = {
|
||||||
|
colorProvider = { id = 'color-registration' },
|
||||||
|
},
|
||||||
|
})
|
||||||
|
|
||||||
|
return assert(vim.lsp.start({ name = 'dynamic-test', cmd = server.cmd }))
|
||||||
|
end)
|
||||||
|
|
||||||
|
eq(
|
||||||
|
true,
|
||||||
|
exec_lua(function()
|
||||||
|
local client = assert(vim.lsp.get_client_by_id(client_id))
|
||||||
|
return client.dynamic_capabilities:get('textDocument/documentColor') ~= nil
|
||||||
|
end)
|
||||||
|
)
|
||||||
|
end)
|
||||||
end)
|
end)
|
||||||
|
|
||||||
describe('vim.lsp._watchfiles', function()
|
describe('vim.lsp._watchfiles', function()
|
||||||
|
Reference in New Issue
Block a user