on master help sign in
Adjust LSP changeset generation too: insert now always preceedes delete.
0541fbbBlaž Hrastnik
helix-lsp/src/client.rs+20−19
@@ -268,7 +268,7 @@ impl Client {
268 Delete(i) | Retain(i) => *i,
268 Delete(i) | Retain(i) => *i,
269 Insert(_) => 0,
269 Insert(_) => 0,
270 };
270 };
271− let old_end = old_pos + len;
271+ let mut old_end = old_pos + len;
272
272
273 match change {
273 match change {
274 Retain(_) => {}
274 Retain(_) => {}
@@ -276,31 +276,32 @@ impl Client {
276 let start = pos_to_lsp_pos(&old_text, old_pos);
276 let start = pos_to_lsp_pos(&old_text, old_pos);
277 let end = pos_to_lsp_pos(&old_text, old_end);
277 let end = pos_to_lsp_pos(&old_text, old_end);
278
278
279+ // deletion
280+ changes.push(lsp::TextDocumentContentChangeEvent {
281+ range: Some(lsp::Range::new(start, end)),
282+ text: "".to_string(),
283+ range_length: None,
284+ });
285+ }
286+ Insert(s) => {
287+ let start = pos_to_lsp_pos(&old_text, old_pos);
288+
279− // a subsequent ins means a replace, consume it
289+ // a subsequent delete means a replace, consume it
280− if let Some(Insert(s)) = iter.peek() {
290+ let end = if let Some(Delete(len)) = iter.peek() {
291+ old_end = old_pos + len;
292+ let end = pos_to_lsp_pos(&old_text, old_end);
293+
281 iter.next();
294 iter.next();
282
295
283 // replacement
296 // replacement
284− changes.push(lsp::TextDocumentContentChangeEvent {
297+ end
285− range: Some(lsp::Range::new(start, end)),
286− text: s.into(),
287− range_length: None,
288− });
289 } else {
298 } else {
290− // deletion
299+ // insert
291− changes.push(lsp::TextDocumentContentChangeEvent {
300+ start
292− range: Some(lsp::Range::new(start, end)),
293− text: "".to_string(),
294− range_length: None,
295− });
296 };
301 };
297− }
298− Insert(s) => {
299− let start = pos_to_lsp_pos(&old_text, old_pos);
300
302
301− // insert
302 changes.push(lsp::TextDocumentContentChangeEvent {
303 changes.push(lsp::TextDocumentContentChangeEvent {
303− range: Some(lsp::Range::new(start, start)),
304+ range: Some(lsp::Range::new(start, end)),
304 text: s.into(),
305 text: s.into(),
305 range_length: None,
306 range_length: None,
306 });
307 });