aboutsummaryrefslogtreecommitdiff
path: root/runtime/lua/vim/lsp/util.lua
diff options
context:
space:
mode:
authorAndreas Johansson <ndreas@users.noreply.github.com>2020-05-17 19:47:14 +0200
committerGitHub <noreply@github.com>2020-05-17 13:47:14 -0400
commit4fbbe1c957509393563be9492d03b9e95bb08e6a (patch)
tree3b2b4d93df88f1c7a95ae589f60f692162fc65f3 /runtime/lua/vim/lsp/util.lua
parentae5bd0454ee4ed3bdbf22e953a216449ca34dd46 (diff)
downloadrneovim-4fbbe1c957509393563be9492d03b9e95bb08e6a.tar.gz
rneovim-4fbbe1c957509393563be9492d03b9e95bb08e6a.tar.bz2
rneovim-4fbbe1c957509393563be9492d03b9e95bb08e6a.zip
lsp: Handle end lines in apply_text_edits (#12314)
If the LSP sends an end line that is larger than what nvim considers to be the last line, you get an Index out of bounds error when fetching the line from nvim, a change that was introduced in #12223. This change removes the strict indexing and checks the return value from nvim_buf_get_lines.
Diffstat (limited to 'runtime/lua/vim/lsp/util.lua')
-rw-r--r--runtime/lua/vim/lsp/util.lua27
1 files changed, 21 insertions, 6 deletions
diff --git a/runtime/lua/vim/lsp/util.lua b/runtime/lua/vim/lsp/util.lua
index c92a317d0c..534c90f1fd 100644
--- a/runtime/lua/vim/lsp/util.lua
+++ b/runtime/lua/vim/lsp/util.lua
@@ -94,6 +94,19 @@ local edit_sort_key = sort_by_key(function(e)
return {e.A[1], e.A[2], e.i}
end)
+local function get_line_byte_from_line_character(bufnr, lnum, cnum)
+ -- Skip check when the byte and character position is the same
+ if cnum > 0 then
+ local lines = api.nvim_buf_get_lines(bufnr, lnum, lnum+1, false)
+
+ if #lines > 0 then
+ return vim.str_byteindex(lines[1], cnum)
+ end
+ end
+
+ return cnum
+end
+
function M.apply_text_edits(text_edits, bufnr)
if not next(text_edits) then return end
if not api.nvim_buf_is_loaded(bufnr) then
@@ -104,13 +117,15 @@ function M.apply_text_edits(text_edits, bufnr)
for i, e in ipairs(text_edits) do
-- adjust start and end column for UTF-16 encoding of non-ASCII characters
local start_row = e.range.start.line
- local start_col = e.range.start.character
- local start_bline = api.nvim_buf_get_lines(bufnr, start_row, start_row+1, true)[1]
- start_col = vim.str_byteindex(start_bline, start_col)
+ local start_col = get_line_byte_from_line_character(
+ bufnr,
+ start_row,
+ e.range.start.character)
local end_row = e.range["end"].line
- local end_col = e.range["end"].character
- local end_bline = api.nvim_buf_get_lines(bufnr, end_row, end_row+1, true)[1]
- end_col = vim.str_byteindex(end_bline, end_col)
+ local end_col = get_line_byte_from_line_character(
+ bufnr,
+ end_row,
+ e.range["end"].character)
start_line = math.min(e.range.start.line, start_line)
finish_line = math.max(e.range["end"].line, finish_line)
-- TODO(ashkan) sanity check ranges for overlap.