fix(lsp): handle self-mapped methods in supports_method #39383

Problem:
The LSP client incorrectly checks for server capabilities when determining
support for self-mapped methods (e.g., 'shutdown'), which do not have
corresponding capabilities in the server's response. This leads to false
negatives when checking if such methods are supported.
This was handled correctly for dynamic registrations, but not for static.

Methods such as 'shutdown', do not have a related server capability and should
be assumed to be supported.

Solution:
Update the `supports_method` logic to always return true for self-mapped
methods.

(cherry picked from commit f83d0b9653)
This commit is contained in:
Tristan Knight
2026-04-24 23:48:23 +01:00
committed by github-actions[bot]
parent e5d6d2e769
commit aedbae4ab6
2 changed files with 17 additions and 4 deletions

View File

@@ -1204,7 +1204,15 @@ function Client:supports_method(method, bufnr)
bufnr = bufnr.bufnr bufnr = bufnr.bufnr
end end
local required_capability = lsp.protocol._request_name_to_server_capability[method] local required_capability = lsp.protocol._request_name_to_server_capability[method]
if required_capability and vim.tbl_get(self.server_capabilities, unpack(required_capability)) then local is_self_mapping = required_capability
and #required_capability == 1
and required_capability[1] == method
if
not is_self_mapping
and required_capability
and vim.tbl_get(self.server_capabilities, unpack(required_capability))
then
return true return true
end end
@@ -1229,9 +1237,10 @@ function Client:supports_method(method, bufnr)
return false return false
end end
-- if we don't know about the method, assume that the client supports it. -- If we don't know about the method, or if it is a self-mapping(method=required_capability)
-- This needs to be at the end, so that dynamic_capabilities are checked first -- assume that the client supports it.
return required_capability == nil -- This needs to be at the end, so that dynamic_capabilities are checked first.
return required_capability == nil or is_self_mapping
end end
--- Executes callback fn for all registrations for a given LSP method. --- Executes callback fn for all registrations for a given LSP method.

View File

@@ -998,6 +998,10 @@ describe('LSP', function()
eq(true, client:supports_method('textDocument/hover')) eq(true, client:supports_method('textDocument/hover'))
eq(false, client:supports_method('textDocument/definition')) eq(false, client:supports_method('textDocument/definition'))
-- Self-mapped methods do not have a related server capability and should be assumed
-- to be supported.
eq(true, client:supports_method('shutdown'))
-- unknown methods are assumed to be supported. -- unknown methods are assumed to be supported.
eq(true, client:supports_method('unknown-method')) eq(true, client:supports_method('unknown-method'))
end, end,