aboutsummaryrefslogtreecommitdiff
path: root/runtime/lua/vim/lsp
diff options
context:
space:
mode:
Diffstat (limited to 'runtime/lua/vim/lsp')
-rw-r--r--runtime/lua/vim/lsp/_completion.lua236
-rw-r--r--runtime/lua/vim/lsp/_dynamic.lua109
-rw-r--r--runtime/lua/vim/lsp/_meta.lua22
-rw-r--r--runtime/lua/vim/lsp/_meta/protocol.lua4396
-rw-r--r--runtime/lua/vim/lsp/_snippet.lua500
-rw-r--r--runtime/lua/vim/lsp/_snippet_grammar.lua181
-rw-r--r--runtime/lua/vim/lsp/_watchfiles.lua251
-rw-r--r--runtime/lua/vim/lsp/buf.lua380
-rw-r--r--runtime/lua/vim/lsp/codelens.lua122
-rw-r--r--runtime/lua/vim/lsp/diagnostic.lua285
-rw-r--r--runtime/lua/vim/lsp/handlers.lua321
-rw-r--r--runtime/lua/vim/lsp/health.lua19
-rw-r--r--runtime/lua/vim/lsp/inlay_hint.lua377
-rw-r--r--runtime/lua/vim/lsp/log.lua30
-rw-r--r--runtime/lua/vim/lsp/protocol.lua594
-rw-r--r--runtime/lua/vim/lsp/rpc.lua230
-rw-r--r--runtime/lua/vim/lsp/semantic_tokens.lua325
-rw-r--r--runtime/lua/vim/lsp/sync.lua25
-rw-r--r--runtime/lua/vim/lsp/tagfunc.lua46
-rw-r--r--runtime/lua/vim/lsp/util.lua834
20 files changed, 7520 insertions, 1763 deletions
diff --git a/runtime/lua/vim/lsp/_completion.lua b/runtime/lua/vim/lsp/_completion.lua
new file mode 100644
index 0000000000..7a607d6c13
--- /dev/null
+++ b/runtime/lua/vim/lsp/_completion.lua
@@ -0,0 +1,236 @@
+local M = {}
+local api = vim.api
+local lsp = vim.lsp
+local protocol = lsp.protocol
+local ms = protocol.Methods
+
+---@param input string unparsed snippet
+---@return string parsed snippet
+local function parse_snippet(input)
+ local ok, parsed = pcall(function()
+ return require('vim.lsp._snippet_grammar').parse(input)
+ end)
+ return ok and tostring(parsed) or input
+end
+
+--- Returns text that should be inserted when selecting completion item. The
+--- precedence is as follows: textEdit.newText > insertText > label
+---
+--- See https://microsoft.github.io/language-server-protocol/specifications/specification-current/#textDocument_completion
+---
+---@param item lsp.CompletionItem
+---@return string
+local function get_completion_word(item)
+ if item.textEdit ~= nil and item.textEdit.newText ~= nil and item.textEdit.newText ~= '' then
+ if item.insertTextFormat == protocol.InsertTextFormat.PlainText then
+ return item.textEdit.newText
+ else
+ return parse_snippet(item.textEdit.newText)
+ end
+ elseif item.insertText ~= nil and item.insertText ~= '' then
+ if item.insertTextFormat == protocol.InsertTextFormat.PlainText then
+ return item.insertText
+ else
+ return parse_snippet(item.insertText)
+ end
+ end
+ return item.label
+end
+
+---@param result lsp.CompletionList|lsp.CompletionItem[]
+---@return lsp.CompletionItem[]
+local function get_items(result)
+ if result.items then
+ return result.items
+ end
+ return result
+end
+
+--- Turns the result of a `textDocument/completion` request into vim-compatible
+--- |complete-items|.
+---
+---@param result lsp.CompletionList|lsp.CompletionItem[] Result of `textDocument/completion`
+---@param prefix string prefix to filter the completion items
+---@return table[]
+---@see complete-items
+function M._lsp_to_complete_items(result, prefix)
+ local items = get_items(result)
+ if vim.tbl_isempty(items) then
+ return {}
+ end
+
+ local function matches_prefix(item)
+ return vim.startswith(get_completion_word(item), prefix)
+ end
+
+ items = vim.tbl_filter(matches_prefix, items) --[[@as lsp.CompletionItem[]|]]
+ table.sort(items, function(a, b)
+ return (a.sortText or a.label) < (b.sortText or b.label)
+ end)
+
+ local matches = {}
+ for _, item in ipairs(items) do
+ local info = ''
+ local documentation = item.documentation
+ if documentation then
+ if type(documentation) == 'string' and documentation ~= '' then
+ info = documentation
+ elseif type(documentation) == 'table' and type(documentation.value) == 'string' then
+ info = documentation.value
+ else
+ vim.notify(
+ ('invalid documentation value %s'):format(vim.inspect(documentation)),
+ vim.log.levels.WARN
+ )
+ end
+ end
+ local word = get_completion_word(item)
+ table.insert(matches, {
+ word = word,
+ abbr = item.label,
+ kind = protocol.CompletionItemKind[item.kind] or 'Unknown',
+ menu = item.detail or '',
+ info = #info > 0 and info or nil,
+ icase = 1,
+ dup = 1,
+ empty = 1,
+ user_data = {
+ nvim = {
+ lsp = {
+ completion_item = item,
+ },
+ },
+ },
+ })
+ end
+ return matches
+end
+
+---@param lnum integer 0-indexed
+---@param items lsp.CompletionItem[]
+local function adjust_start_col(lnum, line, items, encoding)
+ local min_start_char = nil
+ for _, item in pairs(items) do
+ if item.textEdit and item.textEdit.range.start.line == lnum then
+ if min_start_char and min_start_char ~= item.textEdit.range.start.character then
+ return nil
+ end
+ min_start_char = item.textEdit.range.start.character
+ end
+ end
+ if min_start_char then
+ return vim.lsp.util._str_byteindex_enc(line, min_start_char, encoding)
+ else
+ return nil
+ end
+end
+
+---@private
+---@param line string line content
+---@param lnum integer 0-indexed line number
+---@param client_start_boundary integer 0-indexed word boundary
+---@param server_start_boundary? integer 0-indexed word boundary, based on textEdit.range.start.character
+---@param result lsp.CompletionList|lsp.CompletionItem[]
+---@param encoding string
+---@return table[] matches
+---@return integer? server_start_boundary
+function M._convert_results(
+ line,
+ lnum,
+ cursor_col,
+ client_start_boundary,
+ server_start_boundary,
+ result,
+ encoding
+)
+ -- Completion response items may be relative to a position different than `client_start_boundary`.
+ -- Concrete example, with lua-language-server:
+ --
+ -- require('plenary.asy|
+ -- ▲ ▲ ▲
+ -- │ │ └── cursor_pos: 20
+ -- │ └────── client_start_boundary: 17
+ -- └────────────── textEdit.range.start.character: 9
+ -- .newText = 'plenary.async'
+ -- ^^^
+ -- prefix (We'd remove everything not starting with `asy`,
+ -- so we'd eliminate the `plenary.async` result
+ --
+ -- `adjust_start_col` is used to prefer the language server boundary.
+ --
+ local candidates = get_items(result)
+ local curstartbyte = adjust_start_col(lnum, line, candidates, encoding)
+ if server_start_boundary == nil then
+ server_start_boundary = curstartbyte
+ elseif curstartbyte ~= nil and curstartbyte ~= server_start_boundary then
+ server_start_boundary = client_start_boundary
+ end
+ local prefix = line:sub((server_start_boundary or client_start_boundary) + 1, cursor_col)
+ local matches = M._lsp_to_complete_items(result, prefix)
+ return matches, server_start_boundary
+end
+
+---@param findstart integer 0 or 1, decides behavior
+---@param base integer findstart=0, text to match against
+---@return integer|table Decided by {findstart}:
+--- - findstart=0: column where the completion starts, or -2 or -3
+--- - findstart=1: list of matches (actually just calls |complete()|)
+function M.omnifunc(findstart, base)
+ assert(base) -- silence luals
+ local bufnr = api.nvim_get_current_buf()
+ local clients = lsp.get_clients({ bufnr = bufnr, method = ms.textDocument_completion })
+ local remaining = #clients
+ if remaining == 0 then
+ return findstart == 1 and -1 or {}
+ end
+
+ local win = api.nvim_get_current_win()
+ local cursor = api.nvim_win_get_cursor(win)
+ local lnum = cursor[1] - 1
+ local cursor_col = cursor[2]
+ local line = api.nvim_get_current_line()
+ local line_to_cursor = line:sub(1, cursor_col)
+ local client_start_boundary = vim.fn.match(line_to_cursor, '\\k*$') --[[@as integer]]
+ local server_start_boundary = nil
+ local items = {}
+
+ local function on_done()
+ local mode = api.nvim_get_mode()['mode']
+ if mode == 'i' or mode == 'ic' then
+ vim.fn.complete((server_start_boundary or client_start_boundary) + 1, items)
+ end
+ end
+
+ local util = vim.lsp.util
+ for _, client in ipairs(clients) do
+ local params = util.make_position_params(win, client.offset_encoding)
+ client.request(ms.textDocument_completion, params, function(err, result)
+ if err then
+ require('vim.lsp.log').warn(err.message)
+ end
+ if result and vim.fn.mode() == 'i' then
+ local matches
+ matches, server_start_boundary = M._convert_results(
+ line,
+ lnum,
+ cursor_col,
+ client_start_boundary,
+ server_start_boundary,
+ result,
+ client.offset_encoding
+ )
+ vim.list_extend(items, matches)
+ end
+ remaining = remaining - 1
+ if remaining == 0 then
+ vim.schedule(on_done)
+ end
+ end, bufnr)
+ end
+
+ -- Return -2 to signal that we should continue completion so that we can
+ -- async complete.
+ return -2
+end
+
+return M
diff --git a/runtime/lua/vim/lsp/_dynamic.lua b/runtime/lua/vim/lsp/_dynamic.lua
new file mode 100644
index 0000000000..04040e8e28
--- /dev/null
+++ b/runtime/lua/vim/lsp/_dynamic.lua
@@ -0,0 +1,109 @@
+local wf = require('vim.lsp._watchfiles')
+
+--- @class lsp.DynamicCapabilities
+--- @field capabilities table<string, lsp.Registration[]>
+--- @field client_id number
+local M = {}
+
+--- @param client_id number
+function M.new(client_id)
+ return setmetatable({
+ capabilities = {},
+ client_id = client_id,
+ }, { __index = M })
+end
+
+function M:supports_registration(method)
+ local client = vim.lsp.get_client_by_id(self.client_id)
+ if not client then
+ return false
+ end
+ local capability = vim.tbl_get(client.config.capabilities, unpack(vim.split(method, '/')))
+ return type(capability) == 'table' and capability.dynamicRegistration
+end
+
+--- @param registrations lsp.Registration[]
+--- @private
+function M:register(registrations)
+ -- remove duplicates
+ self:unregister(registrations)
+ for _, reg in ipairs(registrations) do
+ local method = reg.method
+ if not self.capabilities[method] then
+ self.capabilities[method] = {}
+ end
+ table.insert(self.capabilities[method], reg)
+ end
+end
+
+--- @param unregisterations lsp.Unregistration[]
+--- @private
+function M:unregister(unregisterations)
+ for _, unreg in ipairs(unregisterations) do
+ local method = unreg.method
+ if not self.capabilities[method] then
+ return
+ end
+ local id = unreg.id
+ for i, reg in ipairs(self.capabilities[method]) do
+ if reg.id == id then
+ table.remove(self.capabilities[method], i)
+ break
+ end
+ end
+ end
+end
+
+--- @param method string
+--- @param opts? {bufnr?: number}
+--- @return lsp.Registration? (table|nil) the registration if found
+--- @private
+function M:get(method, opts)
+ opts = opts or {}
+ opts.bufnr = opts.bufnr or vim.api.nvim_get_current_buf()
+ for _, reg in ipairs(self.capabilities[method] or {}) do
+ if not reg.registerOptions then
+ return reg
+ end
+ local documentSelector = reg.registerOptions.documentSelector
+ if not documentSelector then
+ return reg
+ end
+ if M.match(opts.bufnr, documentSelector) then
+ return reg
+ end
+ end
+end
+
+--- @param method string
+--- @param opts? {bufnr?: number}
+--- @private
+function M:supports(method, opts)
+ return self:get(method, opts) ~= nil
+end
+
+--- @param bufnr number
+--- @param documentSelector lsp.DocumentSelector
+--- @private
+function M.match(bufnr, documentSelector)
+ local ft = vim.bo[bufnr].filetype
+ local uri = vim.uri_from_bufnr(bufnr)
+ local fname = vim.uri_to_fname(uri)
+ for _, filter in ipairs(documentSelector) do
+ local matches = true
+ if filter.language and ft ~= filter.language then
+ matches = false
+ end
+ if matches and filter.scheme and not vim.startswith(uri, filter.scheme .. ':') then
+ matches = false
+ end
+ if matches and filter.pattern and not wf._match(filter.pattern, fname) then
+ matches = false
+ end
+ if matches then
+ return true
+ end
+ end
+end
+
+return M
diff --git a/runtime/lua/vim/lsp/_meta.lua b/runtime/lua/vim/lsp/_meta.lua
new file mode 100644
index 0000000000..acf799264e
--- /dev/null
+++ b/runtime/lua/vim/lsp/_meta.lua
@@ -0,0 +1,22 @@
+---@meta
+error('Cannot require a meta file')
+
+---@alias lsp-handler fun(err: lsp.ResponseError|nil, result: any, context: lsp.HandlerContext, config: table|nil): any?
+
+---@class lsp.HandlerContext
+---@field method string
+---@field client_id integer
+---@field bufnr? integer
+---@field params? any
+
+---@class lsp.ResponseError
+---@field code integer
+---@field message string
+---@field data string|number|boolean|table[]|table|nil
+
+--- @class lsp.DocumentFilter
+--- @field language? string
+--- @field scheme? string
+--- @field pattern? string
+
+--- @alias lsp.RegisterOptions any | lsp.StaticRegistrationOptions | lsp.TextDocumentRegistrationOptions
diff --git a/runtime/lua/vim/lsp/_meta/protocol.lua b/runtime/lua/vim/lsp/_meta/protocol.lua
new file mode 100644
index 0000000000..72b0f00f65
--- /dev/null
+++ b/runtime/lua/vim/lsp/_meta/protocol.lua
@@ -0,0 +1,4396 @@
+--[[
+This file is autogenerated from scripts/gen_lsp.lua
+Regenerate:
+nvim -l scripts/gen_lsp.lua gen --version 3.18 --runtime/lua/vim/lsp/_meta/protocol.lua
+--]]
+
+---@meta
+error('Cannot require a meta file')
+
+---@alias lsp.null nil
+---@alias uinteger integer
+---@alias lsp.decimal number
+---@alias lsp.DocumentUri string
+---@alias lsp.URI string
+---@alias lsp.LSPObject table<string, lsp.LSPAny>
+---@alias lsp.LSPArray lsp.LSPAny[]
+---@alias lsp.LSPAny lsp.LSPObject|lsp.LSPArray|string|number|boolean|nil
+
+---@class lsp.ImplementationParams: lsp.TextDocumentPositionParams, lsp.WorkDoneProgressParams, lsp.PartialResultParams
+
+---Represents a location inside a resource, such as a line
+---inside a text file.
+---@class lsp.Location
+---@field uri lsp.DocumentUri
+---@field range lsp.Range
+
+---@class lsp.ImplementationRegistrationOptions: lsp.TextDocumentRegistrationOptions, lsp.StaticRegistrationOptions
+
+---@class lsp.TypeDefinitionParams: lsp.TextDocumentPositionParams, lsp.WorkDoneProgressParams, lsp.PartialResultParams
+
+---@class lsp.TypeDefinitionRegistrationOptions: lsp.TextDocumentRegistrationOptions, lsp.StaticRegistrationOptions
+
+---A workspace folder inside a client.
+---@class lsp.WorkspaceFolder
+---The associated URI for this workspace folder.
+---@field uri lsp.URI
+---The name of the workspace folder. Used to refer to this
+---workspace folder in the user interface.
+---@field name string
+
+---The parameters of a `workspace/didChangeWorkspaceFolders` notification.
+---@class lsp.DidChangeWorkspaceFoldersParams
+---The actual workspace folder change event.
+---@field event lsp.WorkspaceFoldersChangeEvent
+
+---The parameters of a configuration request.
+---@class lsp.ConfigurationParams
+---@field items lsp.ConfigurationItem[]
+
+---Parameters for a {@link DocumentColorRequest}.
+---@class lsp.DocumentColorParams
+---The text document.
+---@field textDocument lsp.TextDocumentIdentifier
+
+---Represents a color range from a document.
+---@class lsp.ColorInformation
+---The range in the document where this color appears.
+---@field range lsp.Range
+---The actual color value for this color range.
+---@field color lsp.Color
+
+---@class lsp.DocumentColorRegistrationOptions: lsp.TextDocumentRegistrationOptions, lsp.StaticRegistrationOptions
+
+---Parameters for a {@link ColorPresentationRequest}.
+---@class lsp.ColorPresentationParams
+---The text document.
+---@field textDocument lsp.TextDocumentIdentifier
+---The color to request presentations for.
+---@field color lsp.Color
+---The range where the color would be inserted. Serves as a context.
+---@field range lsp.Range
+
+---@class lsp.ColorPresentation
+---The label of this color presentation. It will be shown on the color
+---picker header. By default this is also the text that is inserted when selecting
+---this color presentation.
+---@field label string
+---An {@link TextEdit edit} which is applied to a document when selecting
+---this presentation for the color. When `falsy` the {@link ColorPresentation.label label}
+---is used.
+---@field textEdit? lsp.TextEdit
+---An optional array of additional {@link TextEdit text edits} that are applied when
+---selecting this color presentation. Edits must not overlap with the main {@link ColorPresentation.textEdit edit} nor with themselves.
+---@field additionalTextEdits? lsp.TextEdit[]
+
+---@class lsp.WorkDoneProgressOptions
+---@field workDoneProgress? boolean
+
+---General text document registration options.
+---@class lsp.TextDocumentRegistrationOptions
+---A document selector to identify the scope of the registration. If set to null
+---the document selector provided on the client side will be used.
+---@field documentSelector lsp.DocumentSelector|lsp.null
+
+---Parameters for a {@link FoldingRangeRequest}.
+---@class lsp.FoldingRangeParams
+---The text document.
+---@field textDocument lsp.TextDocumentIdentifier
+
+---Represents a folding range. To be valid, start and end line must be bigger than zero and smaller
+---than the number of lines in the document. Clients are free to ignore invalid ranges.
+---@class lsp.FoldingRange
+---The zero-based start line of the range to fold. The folded area starts after the line's last character.
+---To be valid, the end must be zero or larger and smaller than the number of lines in the document.
+---@field startLine uinteger
+---The zero-based character offset from where the folded range starts. If not defined, defaults to the length of the start line.
+---@field startCharacter? uinteger
+---The zero-based end line of the range to fold. The folded area ends with the line's last character.
+---To be valid, the end must be zero or larger and smaller than the number of lines in the document.
+---@field endLine uinteger
+---The zero-based character offset before the folded range ends. If not defined, defaults to the length of the end line.
+---@field endCharacter? uinteger
+---Describes the kind of the folding range such as `comment' or 'region'. The kind
+---is used to categorize folding ranges and used by commands like 'Fold all comments'.
+---See {@link FoldingRangeKind} for an enumeration of standardized kinds.
+---@field kind? lsp.FoldingRangeKind
+---The text that the client should show when the specified range is
+---collapsed. If not defined or not supported by the client, a default
+---will be chosen by the client.
+---
+---@since 3.17.0
+---@field collapsedText? string
+
+---@class lsp.FoldingRangeRegistrationOptions: lsp.TextDocumentRegistrationOptions, lsp.StaticRegistrationOptions
+
+---@class lsp.DeclarationParams: lsp.TextDocumentPositionParams, lsp.WorkDoneProgressParams, lsp.PartialResultParams
+
+---@class lsp.DeclarationRegistrationOptions: lsp.DeclarationOptions, lsp.StaticRegistrationOptions
+
+---A parameter literal used in selection range requests.
+---@class lsp.SelectionRangeParams
+---The text document.
+---@field textDocument lsp.TextDocumentIdentifier
+---The positions inside the text document.
+---@field positions lsp.Position[]
+
+---A selection range represents a part of a selection hierarchy. A selection range
+---may have a parent selection range that contains it.
+---@class lsp.SelectionRange
+---The {@link Range range} of this selection range.
+---@field range lsp.Range
+---The parent selection range containing this range. Therefore `parent.range` must contain `this.range`.
+---@field parent? lsp.SelectionRange
+
+---@class lsp.SelectionRangeRegistrationOptions: lsp.SelectionRangeOptions, lsp.StaticRegistrationOptions
+
+---@class lsp.WorkDoneProgressCreateParams
+---The token to be used to report progress.
+---@field token lsp.ProgressToken
+
+---@class lsp.WorkDoneProgressCancelParams
+---The token to be used to report progress.
+---@field token lsp.ProgressToken
+
+---The parameter of a `textDocument/prepareCallHierarchy` request.
+---
+---@since 3.16.0
+---@class lsp.CallHierarchyPrepareParams: lsp.TextDocumentPositionParams, lsp.WorkDoneProgressParams
+
+---Represents programming constructs like functions or constructors in the context
+---of call hierarchy.
+---
+---@since 3.16.0
+---@class lsp.CallHierarchyItem
+---The name of this item.
+---@field name string
+---The kind of this item.
+---@field kind lsp.SymbolKind
+---Tags for this item.
+---@field tags? lsp.SymbolTag[]
+---More detail for this item, e.g. the signature of a function.
+---@field detail? string
+---The resource identifier of this item.
+---@field uri lsp.DocumentUri
+---The range enclosing this symbol not including leading/trailing whitespace but everything else, e.g. comments and code.
+---@field range lsp.Range
+---The range that should be selected and revealed when this symbol is being picked, e.g. the name of a function.
+---Must be contained by the {@link CallHierarchyItem.range `range`}.
+---@field selectionRange lsp.Range
+---A data entry field that is preserved between a call hierarchy prepare and
+---incoming calls or outgoing calls requests.
+---@field data? lsp.LSPAny
+
+---Call hierarchy options used during static or dynamic registration.
+---
+---@since 3.16.0
+---@class lsp.CallHierarchyRegistrationOptions: lsp.TextDocumentRegistrationOptions, lsp.StaticRegistrationOptions
+
+---The parameter of a `callHierarchy/incomingCalls` request.
+---
+---@since 3.16.0
+---@class lsp.CallHierarchyIncomingCallsParams
+---@field item lsp.CallHierarchyItem
+
+---Represents an incoming call, e.g. a caller of a method or constructor.
+---
+---@since 3.16.0
+---@class lsp.CallHierarchyIncomingCall
+---The item that makes the call.
+---@field from lsp.CallHierarchyItem
+---The ranges at which the calls appear. This is relative to the caller
+---denoted by {@link CallHierarchyIncomingCall.from `this.from`}.
+---@field fromRanges lsp.Range[]
+
+---The parameter of a `callHierarchy/outgoingCalls` request.
+---
+---@since 3.16.0
+---@class lsp.CallHierarchyOutgoingCallsParams
+---@field item lsp.CallHierarchyItem
+
+---Represents an outgoing call, e.g. calling a getter from a method or a method from a constructor etc.
+---
+---@since 3.16.0
+---@class lsp.CallHierarchyOutgoingCall
+---The item that is called.
+---@field to lsp.CallHierarchyItem
+---The range at which this item is called. This is the range relative to the caller, e.g the item
+---passed to {@link CallHierarchyItemProvider.provideCallHierarchyOutgoingCalls `provideCallHierarchyOutgoingCalls`}
+---and not {@link CallHierarchyOutgoingCall.to `this.to`}.
+---@field fromRanges lsp.Range[]
+
+---@since 3.16.0
+---@class lsp.SemanticTokensParams
+---The text document.
+---@field textDocument lsp.TextDocumentIdentifier
+
+---@since 3.16.0
+---@class lsp.SemanticTokens
+---An optional result id. If provided and clients support delta updating
+---the client will include the result id in the next semantic token request.
+---A server can then instead of computing all semantic tokens again simply
+---send a delta.
+---@field resultId? string
+---The actual tokens.
+---@field data uinteger[]
+
+---@since 3.16.0
+---@class lsp.SemanticTokensPartialResult
+---@field data uinteger[]
+
+---@since 3.16.0
+---@class lsp.SemanticTokensRegistrationOptions: lsp.TextDocumentRegistrationOptions, lsp.StaticRegistrationOptions
+
+---@since 3.16.0
+---@class lsp.SemanticTokensDeltaParams
+---The text document.
+---@field textDocument lsp.TextDocumentIdentifier
+---The result id of a previous response. The result Id can either point to a full response
+---or a delta response depending on what was received last.
+---@field previousResultId string
+
+---@since 3.16.0
+---@class lsp.SemanticTokensDelta
+---@field resultId? string
+---The semantic token edits to transform a previous result into a new result.
+---@field edits lsp.SemanticTokensEdit[]
+
+---@since 3.16.0
+---@class lsp.SemanticTokensDeltaPartialResult
+---@field edits lsp.SemanticTokensEdit[]
+
+---@since 3.16.0
+---@class lsp.SemanticTokensRangeParams
+---The text document.
+---@field textDocument lsp.TextDocumentIdentifier
+---The range the semantic tokens are requested for.
+---@field range lsp.Range
+
+---Params to show a resource in the UI.
+---
+---@since 3.16.0
+---@class lsp.ShowDocumentParams
+---The uri to show.
+---@field uri lsp.URI
+---Indicates to show the resource in an external program.
+---To show, for example, `https://code.visualstudio.com/`
+---in the default WEB browser set `external` to `true`.
+---@field external? boolean
+---An optional property to indicate whether the editor
+---showing the document should take focus or not.
+---Clients might ignore this property if an external
+---program is started.
+---@field takeFocus? boolean
+---An optional selection range if the document is a text
+---document. Clients might ignore the property if an
+---external program is started or the file is not a text
+---file.
+---@field selection? lsp.Range
+
+---The result of a showDocument request.
+---
+---@since 3.16.0
+---@class lsp.ShowDocumentResult
+---A boolean indicating if the show was successful.
+---@field success boolean
+
+---@class lsp.LinkedEditingRangeParams: lsp.TextDocumentPositionParams, lsp.WorkDoneProgressParams
+
+---The result of a linked editing range request.
+---
+---@since 3.16.0
+---@class lsp.LinkedEditingRanges
+---A list of ranges that can be edited together. The ranges must have
+---identical length and contain identical text content. The ranges cannot overlap.
+---@field ranges lsp.Range[]
+---An optional word pattern (regular expression) that describes valid contents for
+---the given ranges. If no pattern is provided, the client configuration's word
+---pattern will be used.
+---@field wordPattern? string
+
+---@class lsp.LinkedEditingRangeRegistrationOptions: lsp.TextDocumentRegistrationOptions, lsp.StaticRegistrationOptions
+
+---The parameters sent in notifications/requests for user-initiated creation of
+---files.
+---
+---@since 3.16.0
+---@class lsp.CreateFilesParams
+---An array of all files/folders created in this operation.
+---@field files lsp.FileCreate[]
+
+---A workspace edit represents changes to many resources managed in the workspace. The edit
+---should either provide `changes` or `documentChanges`. If documentChanges are present
+---they are preferred over `changes` if the client can handle versioned document edits.
+---
+---Since version 3.13.0 a workspace edit can contain resource operations as well. If resource
+---operations are present clients need to execute the operations in the order in which they
+---are provided. So a workspace edit for example can consist of the following two changes:
+---(1) a create file a.txt and (2) a text document edit which insert text into file a.txt.
+---
+---An invalid sequence (e.g. (1) delete file a.txt and (2) insert text into file a.txt) will
+---cause failure of the operation. How the client recovers from the failure is described by
+---the client capability: `workspace.workspaceEdit.failureHandling`
+---@class lsp.WorkspaceEdit
+---Holds changes to existing resources.
+---@field changes? table<lsp.DocumentUri, lsp.TextEdit[]>
+---Depending on the client capability `workspace.workspaceEdit.resourceOperations` document changes
+---are either an array of `TextDocumentEdit`s to express changes to n different text documents
+---where each text document edit addresses a specific version of a text document. Or it can contain
+---above `TextDocumentEdit`s mixed with create, rename and delete file / folder operations.
+---
+---Whether a client supports versioned document edits is expressed via
+---`workspace.workspaceEdit.documentChanges` client capability.
+---
+---If a client neither supports `documentChanges` nor `workspace.workspaceEdit.resourceOperations` then
+---only plain `TextEdit`s using the `changes` property are supported.
+---@field documentChanges? lsp.TextDocumentEdit|lsp.CreateFile|lsp.RenameFile|lsp.DeleteFile[]
+---A map of change annotations that can be referenced in `AnnotatedTextEdit`s or create, rename and
+---delete file / folder operations.
+---
+---Whether clients honor this property depends on the client capability `workspace.changeAnnotationSupport`.
+---
+---@since 3.16.0
+---@field changeAnnotations? table<lsp.ChangeAnnotationIdentifier, lsp.ChangeAnnotation>
+
+---The options to register for file operations.
+---
+---@since 3.16.0
+---@class lsp.FileOperationRegistrationOptions
+---The actual filters.
+---@field filters lsp.FileOperationFilter[]
+
+---The parameters sent in notifications/requests for user-initiated renames of
+---files.
+---
+---@since 3.16.0
+---@class lsp.RenameFilesParams
+---An array of all files/folders renamed in this operation. When a folder is renamed, only
+---the folder will be included, and not its children.
+---@field files lsp.FileRename[]
+
+---The parameters sent in notifications/requests for user-initiated deletes of
+---files.
+---
+---@since 3.16.0
+---@class lsp.DeleteFilesParams
+---An array of all files/folders deleted in this operation.
+---@field files lsp.FileDelete[]
+
+---@class lsp.MonikerParams: lsp.TextDocumentPositionParams, lsp.WorkDoneProgressParams, lsp.PartialResultParams
+
+---Moniker definition to match LSIF 0.5 moniker definition.
+---
+---@since 3.16.0
+---@class lsp.Moniker
+---The scheme of the moniker. For example tsc or .Net
+---@field scheme string
+---The identifier of the moniker. The value is opaque in LSIF however
+---schema owners are allowed to define the structure if they want.
+---@field identifier string
+---The scope in which the moniker is unique
+---@field unique lsp.UniquenessLevel
+---The moniker kind if known.
+---@field kind? lsp.MonikerKind
+
+---@class lsp.MonikerRegistrationOptions: lsp.TextDocumentRegistrationOptions
+
+---The parameter of a `textDocument/prepareTypeHierarchy` request.
+---
+---@since 3.17.0
+---@class lsp.TypeHierarchyPrepareParams: lsp.TextDocumentPositionParams, lsp.WorkDoneProgressParams
+
+---@since 3.17.0
+---@class lsp.TypeHierarchyItem
+---The name of this item.
+---@field name string
+---The kind of this item.
+---@field kind lsp.SymbolKind
+---Tags for this item.
+---@field tags? lsp.SymbolTag[]
+---More detail for this item, e.g. the signature of a function.
+---@field detail? string
+---The resource identifier of this item.
+---@field uri lsp.DocumentUri
+---The range enclosing this symbol not including leading/trailing whitespace
+---but everything else, e.g. comments and code.
+---@field range lsp.Range
+---The range that should be selected and revealed when this symbol is being
+---picked, e.g. the name of a function. Must be contained by the
+---{@link TypeHierarchyItem.range `range`}.
+---@field selectionRange lsp.Range
+---A data entry field that is preserved between a type hierarchy prepare and
+---supertypes or subtypes requests. It could also be used to identify the
+---type hierarchy in the server, helping improve the performance on
+---resolving supertypes and subtypes.
+---@field data? lsp.LSPAny
+
+---Type hierarchy options used during static or dynamic registration.
+---
+---@since 3.17.0
+---@class lsp.TypeHierarchyRegistrationOptions: lsp.TextDocumentRegistrationOptions, lsp.StaticRegistrationOptions
+
+---The parameter of a `typeHierarchy/supertypes` request.
+---
+---@since 3.17.0
+---@class lsp.TypeHierarchySupertypesParams
+---@field item lsp.TypeHierarchyItem
+
+---The parameter of a `typeHierarchy/subtypes` request.
+---
+---@since 3.17.0
+---@class lsp.TypeHierarchySubtypesParams
+---@field item lsp.TypeHierarchyItem
+
+---A parameter literal used in inline value requests.
+---
+---@since 3.17.0
+---@class lsp.InlineValueParams
+---The text document.
+---@field textDocument lsp.TextDocumentIdentifier
+---The document range for which inline values should be computed.
+---@field range lsp.Range
+---Additional information about the context in which inline values were
+---requested.
+---@field context lsp.InlineValueContext
+
+---Inline value options used during static or dynamic registration.
+---
+---@since 3.17.0
+---@class lsp.InlineValueRegistrationOptions: lsp.InlineValueOptions, lsp.StaticRegistrationOptions
+
+---A parameter literal used in inlay hint requests.
+---
+---@since 3.17.0
+---@class lsp.InlayHintParams
+---The text document.
+---@field textDocument lsp.TextDocumentIdentifier
+---The document range for which inlay hints should be computed.
+---@field range lsp.Range
+
+---Inlay hint information.
+---
+---@since 3.17.0
+---@class lsp.InlayHint
+---The position of this hint.
+---@field position lsp.Position
+---The label of this hint. A human readable string or an array of
+---InlayHintLabelPart label parts.
+---
+---*Note* that neither the string nor the label part can be empty.
+---@field label string|lsp.InlayHintLabelPart[]
+---The kind of this hint. Can be omitted in which case the client
+---should fall back to a reasonable default.
+---@field kind? lsp.InlayHintKind
+---Optional text edits that are performed when accepting this inlay hint.
+---
+---*Note* that edits are expected to