@@ -268,7 +268,7 @@ impl Client {
268268 Delete(i) | Retain(i) => *i,
269269 Insert(_) => 0,
270270 };
271− let old_end = old_pos + len;
271+ let mut old_end = old_pos + len;
272272
273273 match change {
274274 Retain(_) => {}
@@ -276,31 +276,32 @@ impl Client {
276276 let start = pos_to_lsp_pos(&old_text, old_pos);
277277 let end = pos_to_lsp_pos(&old_text, old_end);
278278
279− // a subsequent ins means a replace, consume it
280− if let Some(Insert(s)) = iter.peek() {
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+
289+ // a subsequent delete means a replace, consume it
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+
281294 iter.next();
282295
283296 // replacement
284− changes.push(lsp::TextDocumentContentChangeEvent {
285− range: Some(lsp::Range::new(start, end)),
286− text: s.into(),
287− range_length: None,
288− });
297+ end
289298 } else {
290− // deletion
291− changes.push(lsp::TextDocumentContentChangeEvent {
292− range: Some(lsp::Range::new(start, end)),
293− text: "".to_string(),
294− range_length: None,
295− });
299+ // insert
300+ start
296301 };
297− }
298− Insert(s) => {
299− let start = pos_to_lsp_pos(&old_text, old_pos);
300302
301− // insert
302303 changes.push(lsp::TextDocumentContentChangeEvent {
303− range: Some(lsp::Range::new(start, start)),
304+ range: Some(lsp::Range::new(start, end)),
304305 text: s.into(),
305306 range_length: None,
306307 });