fix: don't blow up when nvim_buf_get_lines() returns Blobs (#2050)

* fix: don't blow up when `nvim_buf_get_lines()` returns Blobs

Some LSP servers may return binary garbage and `nvim_buf_get_lines()`
will return a `Blob` instead of a `String` in those cases.

I added some `print(vim.inspect())` debugging in
`entry.get_documentation()` to prove that by the time the text passes
through there, it's already garbage.

Here's an excerpt from a sample line returned by `nvim_buf_get_lines()`,
as rendered by `vim.inspect()`:

    default\0\0\0!      vim.opt.background = 'dark'\0\0\0000

(etc)

Now, this looks like an LSP bug to me, but I think we shouldn't allow
buggy LSP output to crash nvim-cmp. "Be conservative in what you send,
be liberal in what you accept" and all that.

So, degrade by coercing any `Blob` we see into a `String` before passing
it to `strdisplaywidth()`.

Closes: https://github.com/hrsh7th/nvim-cmp/issues/820

* add comment

---------

Co-authored-by: hrsh7th <629908+hrsh7th@users.noreply.github.com>
This commit is contained in:
Greg Hurrell
2024-10-21 13:38:46 +02:00
committed by GitHub
parent 2c93d5e7e2
commit 5d0651c9d6

View File

@@ -309,6 +309,10 @@ window.get_content_height = function(self)
local height = 0 local height = 0
vim.api.nvim_buf_call(self:get_buffer(), function() vim.api.nvim_buf_call(self:get_buffer(), function()
for _, text in ipairs(vim.api.nvim_buf_get_lines(self:get_buffer(), 0, -1, false)) do for _, text in ipairs(vim.api.nvim_buf_get_lines(self:get_buffer(), 0, -1, false)) do
-- nvim_buf_get_lines sometimes returns a blob. see #2050
if vim.fn.type(text) == vim.v.t_blob then
text = vim.fn.string(text)
end
height = height + math.max(1, math.ceil(vim.fn.strdisplaywidth(text) / self.style.width)) height = height + math.max(1, math.ceil(vim.fn.strdisplaywidth(text) / self.style.width))
end end
end) end)