local api = vim.api
local validate = vim.validate
local lsp = vim._defer_require('vim.lsp', {
_changetracking = ..., --- @module 'vim.lsp._changetracking'
_dynamic = ..., --- @module 'vim.lsp._dynamic'
_snippet_grammar = ..., --- @module 'vim.lsp._snippet_grammar'
_tagfunc = ..., --- @module 'vim.lsp._tagfunc'
_watchfiles = ..., --- @module 'vim.lsp._watchfiles'
buf = ..., --- @module 'vim.lsp.buf'
client = ..., --- @module 'vim.lsp.client'
codelens = ..., --- @module 'vim.lsp.codelens'
completion = ..., --- @module 'vim.lsp.completion'
diagnostic = ..., --- @module 'vim.lsp.diagnostic'
handlers = ..., --- @module 'vim.lsp.handlers'
inlay_hint = ..., --- @module 'vim.lsp.inlay_hint'
log = ..., --- @module 'vim.lsp.log'
protocol = ..., --- @module 'vim.lsp.protocol'
rpc = ..., --- @module 'vim.lsp.rpc'
semantic_tokens = ..., --- @module 'vim.lsp.semantic_tokens'
util = ..., --- @module 'vim.lsp.util'
})
local log = lsp.log
local protocol = lsp.protocol
local ms = protocol.Methods
local util = lsp.util
local changetracking = lsp._changetracking
-- Export these directly from rpc.
---@nodoc
lsp.rpc_response_error = lsp.rpc.rpc_response_error
-- maps request name to the required server_capability in the client.
lsp._request_name_to_capability = {
[ms.callHierarchy_incomingCalls] = { 'callHierarchyProvider' },
[ms.callHierarchy_outgoingCalls] = { 'callHierarchyProvider' },
[ms.codeAction_resolve] = { 'codeActionProvider', 'resolveProvider' },
[ms.codeLens_resolve] = { 'codeLensProvider', 'resolveProvider' },
[ms.documentLink_resolve] = { 'documentLinkProvider', 'resolveProvider' },
[ms.inlayHint_resolve] = { 'inlayHintProvider', 'resolveProvider' },
[ms.textDocument_codeAction] = { 'codeActionProvider' },
[ms.textDocument_codeLens] = { 'codeLensProvider' },
[ms.textDocument_completion] = { 'completionProvider' },
[ms.textDocument_declaration] = { 'declarationProvider' },
[ms.textDocument_definition] = { 'definitionProvider' },
[ms.textDocument_diagnostic] = { 'diagnosticProvider' },
[ms.textDocument_didClose] = { 'textDocumentSync', 'openClose' },
[ms.textDocument_didOpen] = { 'textDocumentSync', 'openClose' },
[ms.textDocument_documentColor] = { 'colorProvider' },
[ms.textDocument_documentHighlight] = { 'documentHighlightProvider' },
[ms.textDocument_documentLink] = { 'documentLinkProvider' },
[ms.textDocument_documentSymbol] = { 'documentSymbolProvider' },
[ms.textDocument_formatting] = { 'documentFormattingProvider' },
[ms.textDocument_hover] = { 'hoverProvider' },
[ms.textDocument_implementation] = { 'implementationProvider' },
[ms.textDocument_inlayHint] = { 'inlayHintProvider' },
[ms.textDocument_inlineValue] = { 'inlineValueProvider' },
[ms.textDocument_linkedEditingRange] = { 'linkedEditingRangeProvider' },
[ms.textDocument_moniker] = { 'monikerProvider' },
[ms.textDocument_onTypeFormatting] = { 'documentOnTypeFormattingProvider' },
[ms.textDocument_prepareCallHierarchy] = { 'callHierarchyProvider' },
[ms.textDocument_prepareRename] = { 'renameProvider', 'prepareProvider' },
[ms.textDocument_prepareTypeHierarchy] = { 'typeHierarchyProvider' },
[ms.textDocument_rangeFormatting] = { 'documentRangeFormattingProvider' },
[ms.textDocument_rangesFormatting] = { 'documentRangeFormattingProvider', 'rangesSupport' },
[ms.textDocument_references] = { 'referencesProvider' },
[ms.textDocument_rename] = { 'renameProvider' },
[ms.textDocument_selectionRange] = { 'selectionRangeProvider' },
[ms.textDocument_semanticTokens_full] = { 'semanticTokensProvider' },
[ms.textDocument_semanticTokens_full_delta] = { 'semanticTokensProvider' },
[ms.textDocument_signatureHelp] = { 'signatureHelpProvider' },
[ms.textDocument_typeDefinition] = { 'typeDefinitionProvider' },
[ms.textDocument_willSaveWaitUntil] = { 'textDocumentSync', 'willSaveWaitUntil' },
[ms.textDocument_willSave] = { 'textDocumentSync', 'willSave' },
[ms.typeHierarchy_subtypes] = { 'typeHierarchyProvider' },
[ms.typeHierarchy_supertypes] = { 'typeHierarchyProvider' },
[ms.workspace_executeCommand] = { 'executeCommandProvider' },
[ms.workspace_symbol] = { 'workspaceSymbolProvider' },
}
-- TODO improve handling of scratch buffers with LSP attached.
--- Returns the buffer number for the given {bufnr}.
---
---@param bufnr (integer|nil) Buffer number to resolve. Defaults to current buffer
---@return integer bufnr
local function resolve_bufnr(bufnr)
validate('bufnr', bufnr, 'number', true)
if bufnr == nil or bufnr == 0 then
return api.nvim_get_current_buf()
end
return bufnr
end
---@private
--- Called by the client when trying to call a method that's not
--- supported in any of the servers registered for the current buffer.
---@param method (string) name of the method
function lsp._unsupported_method(method)
local msg = string.format(
'method %s is not supported by any of the servers registered for the current buffer',
method
)
log.warn(msg)
return msg
end
local wait_result_reason = { [-1] = 'timeout', [-2] = 'interrupted', [-3] = 'error' }
local format_line_ending = {
['unix'] = '\n',
['dos'] = '\r\n',
['mac'] = '\r',
}
---@private
---@param bufnr (number)
---@return string
function lsp._buf_get_line_ending(bufnr)
return format_line_ending[vim.bo[bufnr].fileformat] or '\n'
end
-- Tracks all clients created via lsp.start_client
local all_clients
|