mirror of
https://github.com/neovim/neovim.git
synced 2025-09-06 03:18:16 +00:00
fix(lsp): Allow subsequent text document edits to pass (#13534)
* fix: Allow subsequent text document edits to pass * fixup: cleaner code * add tests
This commit is contained in:
@@ -254,19 +254,27 @@ function M.extract_completion_items(result)
|
||||
end
|
||||
|
||||
--- Applies a `TextDocumentEdit`, which is a list of changes to a single
|
||||
-- document.
|
||||
--- document.
|
||||
---
|
||||
--@param text_document_edit (table) a `TextDocumentEdit` object
|
||||
--@see https://microsoft.github.io/language-server-protocol/specifications/specification-current/#textDocumentEdit
|
||||
function M.apply_text_document_edit(text_document_edit)
|
||||
---@param text_document_edit table: a `TextDocumentEdit` object
|
||||
---@param index number: Optional index of the edit, if from a list of edits (or nil, if not from a list)
|
||||
---@see https://microsoft.github.io/language-server-protocol/specifications/specification-current/#textDocumentEdit
|
||||
function M.apply_text_document_edit(text_document_edit, index)
|
||||
local text_document = text_document_edit.textDocument
|
||||
local bufnr = vim.uri_to_bufnr(text_document.uri)
|
||||
|
||||
-- For lists of text document edits,
|
||||
-- do not check the version after the first edit.
|
||||
local should_check_version = true
|
||||
if index and index > 1 then
|
||||
should_check_version = false
|
||||
end
|
||||
|
||||
-- `VersionedTextDocumentIdentifier`s version may be null
|
||||
-- https://microsoft.github.io/language-server-protocol/specification#versionedTextDocumentIdentifier
|
||||
if text_document.version
|
||||
if should_check_version and (text_document.version
|
||||
and M.buf_versions[bufnr]
|
||||
and M.buf_versions[bufnr] > text_document.version then
|
||||
and M.buf_versions[bufnr] > text_document.version) then
|
||||
print("Buffer ", text_document.uri, " newer than edits.")
|
||||
return
|
||||
end
|
||||
@@ -459,12 +467,12 @@ end
|
||||
-- @see https://microsoft.github.io/language-server-protocol/specifications/specification-current/#workspace_applyEdit
|
||||
function M.apply_workspace_edit(workspace_edit)
|
||||
if workspace_edit.documentChanges then
|
||||
for _, change in ipairs(workspace_edit.documentChanges) do
|
||||
for idx, change in ipairs(workspace_edit.documentChanges) do
|
||||
if change.kind then
|
||||
-- TODO(ashkan) handle CreateFile/RenameFile/DeleteFile
|
||||
error(string.format("Unsupported change: %q", vim.inspect(change)))
|
||||
else
|
||||
M.apply_text_document_edit(change)
|
||||
M.apply_text_document_edit(change, idx)
|
||||
end
|
||||
end
|
||||
return
|
||||
|
Reference in New Issue
Block a user