From 33472ebf7e46377cb2283d715aedfb21dc5f1409 Mon Sep 17 00:00:00 2001 From: Max Brunsfeld Date: Thu, 3 Jun 2021 13:51:13 -0700 Subject: [PATCH] Ensure fragments are only consumed once in apply_local_edit --- zed/src/editor/buffer.rs | 33 ++++++++++++++++++--------------- 1 file changed, 18 insertions(+), 15 deletions(-) diff --git a/zed/src/editor/buffer.rs b/zed/src/editor/buffer.rs index ffc61a422baf0538aea59ccf52bb385a5bda0c8c..b138742ed9bf933788daa34b5d8cbfd920d8f225 100644 --- a/zed/src/editor/buffer.rs +++ b/zed/src/editor/buffer.rs @@ -1455,11 +1455,14 @@ impl Buffer { let mut fragment_start = old_fragments.start().visible; for range in ranges { if range.start > old_fragments.end(&None).visible { - if old_fragments.end(&None).visible > fragment_start { - let mut suffix = old_fragments.item().unwrap().clone(); - suffix.len = old_fragments.end(&None).visible - fragment_start; - new_ropes.push_fragment(&suffix, suffix.visible); - new_fragments.push(suffix, &None); + if fragment_start > old_fragments.start().visible { + let fragment_end = old_fragments.end(&None).visible; + if fragment_end > fragment_start { + let mut suffix = old_fragments.item().unwrap().clone(); + suffix.len = fragment_end - fragment_start; + new_ropes.push_fragment(&suffix, suffix.visible); + new_fragments.push(suffix, &None); + } old_fragments.next(&None); } @@ -1517,24 +1520,24 @@ impl Buffer { edit.ranges.push(full_range_start..full_range_end); } - let fragment_end = old_fragments.end(&None).visible; - if fragment_end > fragment_start { - let mut suffix = old_fragments.item().unwrap().clone(); - suffix.len = fragment_end - fragment_start; - new_ropes.push_fragment(&suffix, suffix.visible); - new_fragments.push(suffix, &None); - } - if old_fragments.item().is_some() { + if fragment_start > old_fragments.start().visible { + let fragment_end = old_fragments.end(&None).visible; + if fragment_end > fragment_start { + let mut suffix = old_fragments.item().unwrap().clone(); + suffix.len = fragment_end - fragment_start; + new_ropes.push_fragment(&suffix, suffix.visible); + new_fragments.push(suffix, &None); + } old_fragments.next(&None); } let suffix = old_fragments.suffix(&None); new_ropes.push_tree(suffix.summary().text); new_fragments.push_tree(suffix, &None); - let (visible_text, deleted_text) = new_ropes.finish(); - drop(old_fragments); + drop(old_fragments); self.fragments = new_fragments; + let (visible_text, deleted_text) = new_ropes.finish(); self.visible_text = visible_text; self.deleted_text = deleted_text; edit