From 9ee75f4781e61d18b75c5f46041e092d6759b827 Mon Sep 17 00:00:00 2001 From: zeertzjq Date: Thu, 12 Oct 2023 15:19:27 +0800 Subject: [PATCH] fix(lsp): handle NUL bytes in popup text Fix #25610 (cherry picked from commit 762a9e138bc06bf7840482c3dd39f2a2d75ebfb9) --- runtime/lua/vim/lsp/util.lua | 4 ++-- test/functional/plugin/lsp_spec.lua | 12 ++++++++++++ 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/runtime/lua/vim/lsp/util.lua b/runtime/lua/vim/lsp/util.lua index c759d9e957..ae733b04d6 100644 --- a/runtime/lua/vim/lsp/util.lua +++ b/runtime/lua/vim/lsp/util.lua @@ -1547,7 +1547,7 @@ function M._make_floating_popup_size(contents, opts) width = 0 for i, line in ipairs(contents) do -- TODO(ashkan) use nvim_strdisplaywidth if/when that is introduced. - line_widths[i] = vim.fn.strdisplaywidth(line) + line_widths[i] = vim.fn.strdisplaywidth(line:gsub('%z', '\n')) width = math.max(line_widths[i], width) end end @@ -1576,7 +1576,7 @@ function M._make_floating_popup_size(contents, opts) height = 0 if vim.tbl_isempty(line_widths) then for _, line in ipairs(contents) do - local line_width = vim.fn.strdisplaywidth(line) + local line_width = vim.fn.strdisplaywidth(line:gsub('%z', '\n')) height = height + math.ceil(line_width / wrap_at) end else diff --git a/test/functional/plugin/lsp_spec.lua b/test/functional/plugin/lsp_spec.lua index 7d91bd6a0b..2e1a31b89b 100644 --- a/test/functional/plugin/lsp_spec.lua +++ b/test/functional/plugin/lsp_spec.lua @@ -2897,6 +2897,18 @@ describe('LSP', function() it('calculates size correctly with wrapping', function() eq({15,5}, exec_lua[[ return {vim.lsp.util._make_floating_popup_size(contents,{width = 15, wrap_at = 14})} ]]) end) + + it('handles NUL bytes in text', function() + exec_lua([[ contents = { + '\000\001\002\003\004\005\006\007\008\009', + '\010\011\012\013\014\015\016\017\018\019', + '\020\021\022\023\024\025\026\027\028\029', + } ]]) + command('set list listchars=') + eq({20,3}, exec_lua[[ return {vim.lsp.util._make_floating_popup_size(contents)} ]]) + command('set display+=uhex') + eq({40,3}, exec_lua[[ return {vim.lsp.util._make_floating_popup_size(contents)} ]]) + end) end) describe('lsp.util.trim.trim_empty_lines', function()