diff --git a/crates/language/src/buffer.rs b/crates/language/src/buffer.rs index 7d1cb5b040869ec4eac3311e2960254762dfe55f..968e46eb3cdf97662d7fb77f2ee0e3afb517edf1 100644 --- a/crates/language/src/buffer.rs +++ b/crates/language/src/buffer.rs @@ -1480,6 +1480,9 @@ impl Buffer { may_block: bool, cx: &mut Context, ) { + if language == self.language { + return; + } self.non_text_state_update_count += 1; self.syntax_map.lock().clear(&self.text); let old_language = std::mem::replace(&mut self.language, language); diff --git a/crates/multi_buffer/src/multi_buffer.rs b/crates/multi_buffer/src/multi_buffer.rs index 477aa3b2e1e83229556eecb7869d41b55a75f16e..18831e2fc789ebcd1aea76f9fdbf5aa4b640b9f3 100644 --- a/crates/multi_buffer/src/multi_buffer.rs +++ b/crates/multi_buffer/src/multi_buffer.rs @@ -3052,11 +3052,17 @@ impl MultiBuffer { *non_text_state_update_count += 1; } - for (id, diff) in diffs.iter() { - if buffer_diff.get(id).is_none() || diff.is_inverted { - buffer_diff.insert(*id, diff.snapshot(cx)); - } - } + let diffs_to_add = diffs + .iter() + .filter_map(|(id, diff)| { + if diff.is_inverted || buffer_diff.get(id).is_none() { + Some((*id, diff.snapshot(cx))) + } else { + None + } + }) + .collect::>(); + buffer_diff.extend(diffs_to_add); excerpts_to_edit.sort_unstable_by_key(|(locator, _, _)| *locator); diff --git a/crates/sum_tree/src/tree_map.rs b/crates/sum_tree/src/tree_map.rs index e58f7a65dd5d13ca67d4433bd25118ffb55d1169..9cdbb3c3e97208e4fc70230e1ccb797b301e1e0d 100644 --- a/crates/sum_tree/src/tree_map.rs +++ b/crates/sum_tree/src/tree_map.rs @@ -83,6 +83,9 @@ impl TreeMap { .into_iter() .map(|(key, value)| Edit::Insert(MapEntry { key, value })) .collect(); + if edits.is_empty() { + return; + } self.0.edit(edits, ()); } diff --git a/crates/text/src/text.rs b/crates/text/src/text.rs index 5c78f9aea606d2f3eb828643e660a1b41d65e755..7d5dcd654ed5399c16628eddc366516670f75ab9 100644 --- a/crates/text/src/text.rs +++ b/crates/text/src/text.rs @@ -2508,15 +2508,14 @@ impl BufferSnapshot { where D: TextDimension + Ord, { - let fragments_cursor = if *since == self.version { - None - } else { - let mut cursor = self.fragments.filter(&None, move |summary| { - !since.observed_all(&summary.max_version) - }); - cursor.next(); - Some(cursor) - }; + if *since == self.version { + return None.into_iter().flatten(); + } + let mut cursor = self.fragments.filter(&None, move |summary| { + !since.observed_all(&summary.max_version) + }); + cursor.next(); + let fragments_cursor = Some(cursor); let start_fragment_id = self.fragment_id_for_anchor(&range.start); let (start, _, item) = self .fragments @@ -2537,7 +2536,7 @@ impl BufferSnapshot { } let end_fragment_id = self.fragment_id_for_anchor(&range.end); - Edits { + Some(Edits { visible_cursor: self.visible_text.cursor(visible_start), deleted_cursor: self.deleted_text.cursor(deleted_start), fragments_cursor, @@ -2547,7 +2546,9 @@ impl BufferSnapshot { new_end: D::zero(()), range: (start_fragment_id, range.start.offset)..(end_fragment_id, range.end.offset), buffer_id: self.remote_id, - } + }) + .into_iter() + .flatten() } pub fn has_edits_since_in_range(&self, since: &clock::Global, range: Range) -> bool {