From bee42bc87a249bddcd7d13a7a7c257f0c7f78072 Mon Sep 17 00:00:00 2001 From: Florian Fischer Date: Tue, 1 Jul 2025 23:06:56 -0500 Subject: fix conversion of last byte selections If a language server sends a selection including the last byte, the line number will be one greater than the actual number of lines. Those selections are not converted by our algorithm iterating all lines. Add a special case to still convert them. Fixes: f5c2043 --- util.lua | 8 ++++++++ 1 file changed, 8 insertions(+) (limited to 'util.lua') diff --git a/util.lua b/util.lua index 2b090b2..e36c23f 100644 --- a/util.lua +++ b/util.lua @@ -242,6 +242,14 @@ function util.vis_sorted_selections_to_pos(file, sorted_selections) pos = pos + #line + 1 end + + -- Some language servers (pylsp) sends a range including the first character after the last line. + -- e.g. [{"line":1, "col":1}, {"line":#lines+1, "col":1}] + -- But this selection can not be handled by iterating all lines. + -- Add a special case for the selection of the first char after the last line. + if sel.line == line_count + 1 and sel.col == 1 then + table.insert(positions, pos) + end return positions end -- cgit v1.2.3 From 05f2d8e253c3523e63ea08018f8bb9d23f6659b5 Mon Sep 17 00:00:00 2001 From: Florian Fischer Date: Wed, 2 Jul 2025 23:06:50 -0400 Subject: add special case for the gopls empty file range --- util.lua | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) (limited to 'util.lua') diff --git a/util.lua b/util.lua index e36c23f..3d10e95 100644 --- a/util.lua +++ b/util.lua @@ -243,12 +243,16 @@ function util.vis_sorted_selections_to_pos(file, sorted_selections) pos = pos + #line + 1 end - -- Some language servers (pylsp) sends a range including the first character after the last line. + -- Some language servers (pylsp) send ranges including the first character after the last line. -- e.g. [{"line":1, "col":1}, {"line":#lines+1, "col":1}] -- But this selection can not be handled by iterating all lines. - -- Add a special case for the selection of the first char after the last line. - if sel.line == line_count + 1 and sel.col == 1 then + -- Special case ranges ensing after the last line. + -- Additionaly the start and end can overlap. + -- Gopls sends the range [{"line":1, "col":1}, {"line":1, "col":1}] when editing an empty file. + while sel and sel.line == line_count + 1 and sel.col == 1 do table.insert(positions, pos) + sel_i = sel_i + 1 + sel = sorted_selections[sel_i] end return positions end -- cgit v1.2.3