Skip to content

Commit 21d51ff

Browse files
thomasfaingnaertprabirshrestha
authored andcommitted
Fix text edits not preserving v:completed_item (#389)
* Add test to check v:completed_item after textedits * Fix v:completed_item being reset after text edits * Add silent to execute call in apply_text_edits
1 parent 900e861 commit 21d51ff

File tree

2 files changed

+89
-7
lines changed

2 files changed

+89
-7
lines changed

autoload/lsp/utils/text_edit.vim

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ function! lsp#utils#text_edit#apply_text_edits(uri, text_edits) abort
6060
set selection=exclusive
6161
set virtualedit=onemore
6262

63-
execute l:cmd
63+
silent execute l:cmd
6464
finally
6565
let &paste = l:was_paste
6666
let &selection = l:was_selection
@@ -158,13 +158,11 @@ function! s:generate_sub_cmd_insert(text_edit) abort
158158
let l:sub_cmd .= s:generate_move_start_cmd(l:start_line, l:start_character)
159159

160160
if l:start_character >= len(getline(l:start_line))
161-
let l:sub_cmd .= 'a'
161+
let l:sub_cmd .= "\"=l:merged_text_edit['merged']['newText']\<CR>p"
162162
else
163-
let l:sub_cmd .= 'i'
163+
let l:sub_cmd .= "\"=l:merged_text_edit['merged']['newText']\<CR>P"
164164
endif
165165

166-
let l:sub_cmd .= printf('%s', l:new_text)
167-
168166
return l:sub_cmd
169167
endfunction
170168

@@ -183,8 +181,7 @@ function! s:generate_sub_cmd_replace(text_edit) abort
183181
if len(l:new_text) == 0
184182
let l:sub_cmd .= 'x'
185183
else
186-
let l:sub_cmd .= 'c'
187-
let l:sub_cmd .= printf('%s', l:new_text) " change text
184+
let l:sub_cmd .= "\"=l:merged_text_edit['merged']['newText']\<CR>p"
188185
endif
189186

190187
return l:sub_cmd

test/lsp/utils/text_edit.vimspec

Lines changed: 85 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -115,6 +115,91 @@ Describe lsp#utils#text_edit
115115
let l:buffer_text = s:get_text()
116116
Assert Equals(l:buffer_text, ['foo', 'ar', ''])
117117
End
118+
119+
It preserves v:completed_item
120+
" Add some text to buffer
121+
call s:set_text(['foo', 'bar'])
122+
123+
" Go to end of file and invoke completion
124+
execute "normal Gof\<C-p>\<Esc>"
125+
126+
" Make sure that v:completed_item is set
127+
Assert Equals(v:completed_item["word"], "foo")
128+
let l:old_completed_item = v:completed_item
129+
130+
" Perform some text edits
131+
132+
" Insert
133+
call lsp#utils#text_edit#apply_text_edits(
134+
\ expand('%'),
135+
\ [{
136+
\ 'range': {
137+
\ 'start': {
138+
\ 'line': 1,
139+
\ 'character': 1
140+
\ },
141+
\ 'end': {
142+
\ 'line': 1,
143+
\ 'character': 1
144+
\ }
145+
\ },
146+
\ 'newText': 'baz'
147+
\ }])
148+
149+
" Insert empty
150+
call lsp#utils#text_edit#apply_text_edits(
151+
\ expand('%'),
152+
\ [{
153+
\ 'range': {
154+
\ 'start': {
155+
\ 'line': 1,
156+
\ 'character': 1
157+
\ },
158+
\ 'end': {
159+
\ 'line': 1,
160+
\ 'character': 1
161+
\ }
162+
\ },
163+
\ 'newText': ''
164+
\ }])
165+
166+
" Replace
167+
call lsp#utils#text_edit#apply_text_edits(
168+
\ expand('%'),
169+
\ [{
170+
\ 'range': {
171+
\ 'start': {
172+
\ 'line': 1,
173+
\ 'character': 0
174+
\ },
175+
\ 'end': {
176+
\ 'line': 1,
177+
\ 'character': 1
178+
\ }
179+
\ },
180+
\ 'newText': 'replaced'
181+
\ }])
182+
183+
" Delete
184+
call lsp#utils#text_edit#apply_text_edits(
185+
\ expand('%'),
186+
\ [{
187+
\ 'range': {
188+
\ 'start': {
189+
\ 'line': 1,
190+
\ 'character': 0
191+
\ },
192+
\ 'end': {
193+
\ 'line': 1,
194+
\ 'character': 1
195+
\ }
196+
\ },
197+
\ 'newText': ''
198+
\ }])
199+
200+
" Make sure v:completed_item is not changed
201+
Assert Equals(v:completed_item, l:old_completed_item)
202+
End
118203
End
119204
End
120205

0 commit comments

Comments
 (0)