@@ -268,7 +268,7 @@ impl Client {
268 Delete(i) | Retain(i) => *i,
268 Delete(i) | Retain(i) => *i,
269 Insert(_) => 0,
269 Insert(_) => 0,
271− let old_end = old_pos + len;
271+ let mut old_end = old_pos + len;
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);
280+ changes.push(lsp::TextDocumentContentChangeEvent {
281+ range: Some(lsp::Range::new(start, end)),
282+ text: "".to_string(),
287+ let start = pos_to_lsp_pos(&old_text, old_pos);
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);
281 iter.next();
294 iter.next();
283 // replacement
296 // replacement
284− changes.push(lsp::TextDocumentContentChangeEvent {
297+ end
285− range: Some(lsp::Range::new(start, end)),
290− // deletion
299+ // insert
291− changes.push(lsp::TextDocumentContentChangeEvent {
300+ start
292− range: Some(lsp::Range::new(start, end)),
293− text: "".to_string(),
299− let start = pos_to_lsp_pos(&old_text, old_pos);
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,