fix(lsp): fix nil-index behavior for UTF-8 in _str_*index_enc methods (#16785)

Previously, the `_str_utfindex_enc` and `_str_byteindex_enc` helper functions would return `nil` when `offset_encoding == "utf-8"` and `index == nil`. Clearly, this doesn't reflect the expected behavior of the functions they're wrapping which would return the length of the line in this case. This should fix behavior with servers that use UTF-8 `offset_encoding` when applying text edits, formatting a range, and doing range code actions (though this isn't tested currently).

(cherry picked from commit 5f4c501cf1)

Co-authored-by: Rishikesh Vaishnav <rishhvaishnav@gmail.com>
This commit is contained in:
github-actions[bot]
2021-12-25 10:52:45 -05:00
committed by GitHub
parent ee9e3420fd
commit 03bd9147f0

View File

@ -97,15 +97,17 @@ end
---@param encoding string utf-8|utf-16|utf-32|nil defaults to utf-16 ---@param encoding string utf-8|utf-16|utf-32|nil defaults to utf-16
---@return number `encoding` index of `index` in `line` ---@return number `encoding` index of `index` in `line`
function M._str_utfindex_enc(line, index, encoding) function M._str_utfindex_enc(line, index, encoding)
if encoding ~= 'utf-8' then if not encoding then encoding = 'utf-16' end
local col32, col16 = vim.str_utfindex(line, index) if encoding == 'utf-8' then
if encoding == 'utf-32' then if index then return index else return #line end
return col32 elseif encoding == 'utf-16' then
else local _, col16 = vim.str_utfindex(line, index)
return col16 return col16
end elseif encoding == 'utf-32' then
local col32, _ = vim.str_utfindex(line, index)
return col32
else else
return index error("Invalid encoding: " .. vim.inspect(encoding))
end end
end end
@ -117,10 +119,15 @@ end
---@param encoding string utf-8|utf-16|utf-32|nil defaults to utf-16 ---@param encoding string utf-8|utf-16|utf-32|nil defaults to utf-16
---@return number byte (utf-8) index of `encoding` index `index` in `line` ---@return number byte (utf-8) index of `encoding` index `index` in `line`
function M._str_byteindex_enc(line, index, encoding) function M._str_byteindex_enc(line, index, encoding)
if encoding ~= 'utf-8' then if not encoding then encoding = 'utf-16' end
return vim.str_byteindex(line, index, not encoding or encoding ~= 'utf-32') if encoding == 'utf-8' then
if index then return index else return #line end
elseif encoding == 'utf-16' then
return vim.str_byteindex(line, index, true)
elseif encoding == 'utf-32' then
return vim.str_byteindex(line, index)
else else
return index error("Invalid encoding: " .. vim.inspect(encoding))
end end
end end