diff options
| author | Étienne Robert <etiennerobert33@gmail.com> | 2026-08-24 14:41:57 +0200 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2026-08-24 08:41:57 -0400 |
| commit | 143bbfbb1239cba40b9adc52559c358aaa69a277 (patch) | |
| tree | c39c0442ae99df8afb01343249b011d1465582a6 /test/functional/plugin/lsp/inline_completion_spec.lua | |
| parent | 2a382ffb6173b14919acf3a430b7504eb5793063 (diff) | |
| download | rneovim-143bbfbb1239cba40b9adc52559c358aaa69a277.tar.gz rneovim-143bbfbb1239cba40b9adc52559c358aaa69a277.tar.bz2 rneovim-143bbfbb1239cba40b9adc52559c358aaa69a277.zip | |
fix(lsp): clamp inline completion range to the line on accept #41435
Problem:
`Completor:accept()` hands the item's range straight to
`nvim_buf_set_text()`. That range is resolved when the response arrives,
so text deleted before accepting (backspacing within the 200 ms
debounce) leaves the range end past what is left of the line, and the
accept aborts with `Invalid 'end_col': out of range`.
18d6436 fixed the same staleness in `Completor:show()`, which drops an
item once its range *start* falls outside the buffer. That guard does
not cover the range end, and `accept()` was never given one, so this is
a hole left by that fix rather than a regression of it.
Solution:
Clamp the end of the range to the end of the line before writing. The
start needs no clamp: `show()` dropped the item one event loop tick
earlier if it had gone out of range.
Diffstat (limited to 'test/functional/plugin/lsp/inline_completion_spec.lua')
| -rw-r--r-- | test/functional/plugin/lsp/inline_completion_spec.lua | 13 |
1 files changed, 13 insertions, 0 deletions
diff --git a/test/functional/plugin/lsp/inline_completion_spec.lua b/test/functional/plugin/lsp/inline_completion_spec.lua index 529f0b4126..5383480437 100644 --- a/test/functional/plugin/lsp/inline_completion_spec.lua +++ b/test/functional/plugin/lsp/inline_completion_spec.lua @@ -280,6 +280,19 @@ describe('vim.lsp.inline_completion', function() }, }, result) end) + + it('accepts an item after the line shrank past its range', function() + feed('i') + screen:expect({ grid = grid_with_candidates }) + exec_lua(function() + -- Shrink the line the item's range covers, as backspacing would. + vim.api.nvim_buf_set_text(0, 0, 18, 0, 20, {}) + vim.lsp.inline_completion.get() + end) + n.poke_eventloop() + feed('<Esc>') + screen:expect({ grid = grid_applied_candidates }) + end) end) describe('select()', function() |