From 971c88db809f448cada0fcdfea53051fedac84f3 Mon Sep 17 00:00:00 2001 From: Antonio Scandurra Date: Tue, 4 Apr 2023 17:14:52 +0200 Subject: [PATCH] Return the previous suggestion when replacing it --- crates/editor/src/display_map.rs | 9 ++++++--- crates/editor/src/display_map/suggestion_map.rs | 17 ++++++++++++----- 2 files changed, 18 insertions(+), 8 deletions(-) diff --git a/crates/editor/src/display_map.rs b/crates/editor/src/display_map.rs index c5e6b371ed..f54e2e980c 100644 --- a/crates/editor/src/display_map.rs +++ b/crates/editor/src/display_map.rs @@ -7,7 +7,7 @@ mod wrap_map; use crate::{Anchor, AnchorRangeExt, MultiBuffer, MultiBufferSnapshot, ToOffset, ToPoint}; pub use block_map::{BlockMap, BlockPoint}; use collections::{HashMap, HashSet}; -use fold_map::FoldMap; +use fold_map::{FoldMap, FoldOffset}; use gpui::{ color::Color, fonts::{FontId, HighlightStyle}, @@ -238,19 +238,22 @@ impl DisplayMap { &self, new_suggestion: Option>, cx: &mut ModelContext, - ) where + ) -> Option> + where T: ToPoint, { let snapshot = self.buffer.read(cx).snapshot(cx); let edits = self.buffer_subscription.consume().into_inner(); let tab_size = Self::tab_size(&self.buffer, cx); let (snapshot, edits) = self.fold_map.read(snapshot, edits); - let (snapshot, edits) = self.suggestion_map.replace(new_suggestion, snapshot, edits); + let (snapshot, edits, old_suggestion) = + self.suggestion_map.replace(new_suggestion, snapshot, edits); let (snapshot, edits) = self.tab_map.sync(snapshot, edits, tab_size); let (snapshot, edits) = self .wrap_map .update(cx, |map, cx| map.sync(snapshot, edits, cx)); self.block_map.read(snapshot, edits); + old_suggestion } pub fn set_font(&self, font_id: FontId, font_size: f32, cx: &mut ModelContext) -> bool { diff --git a/crates/editor/src/display_map/suggestion_map.rs b/crates/editor/src/display_map/suggestion_map.rs index ccc07bf591..17dbae6031 100644 --- a/crates/editor/src/display_map/suggestion_map.rs +++ b/crates/editor/src/display_map/suggestion_map.rs @@ -79,7 +79,11 @@ impl SuggestionMap { new_suggestion: Option>, fold_snapshot: FoldSnapshot, fold_edits: Vec, - ) -> (SuggestionSnapshot, Vec) + ) -> ( + SuggestionSnapshot, + Vec, + Option>, + ) where T: ToPoint, { @@ -99,7 +103,8 @@ impl SuggestionMap { let mut snapshot = self.0.lock(); let mut patch = Patch::new(edits); - if let Some(suggestion) = snapshot.suggestion.take() { + let old_suggestion = snapshot.suggestion.take(); + if let Some(suggestion) = &old_suggestion { patch = patch.compose([SuggestionEdit { old: SuggestionOffset(suggestion.position.0) ..SuggestionOffset(suggestion.position.0 + suggestion.text.len()), @@ -119,7 +124,7 @@ impl SuggestionMap { snapshot.suggestion = new_suggestion; snapshot.version += 1; - (snapshot.clone(), patch.into_inner()) + (snapshot.clone(), patch.into_inner(), old_suggestion) } pub fn sync( @@ -589,7 +594,7 @@ mod tests { let (suggestion_map, suggestion_snapshot) = SuggestionMap::new(fold_snapshot.clone()); assert_eq!(suggestion_snapshot.text(), "abcdefghi"); - let (suggestion_snapshot, _) = suggestion_map.replace( + let (suggestion_snapshot, _, _) = suggestion_map.replace( Some(Suggestion { position: 3, text: "123\n456".into(), @@ -854,7 +859,9 @@ mod tests { }; log::info!("replacing suggestion with {:?}", new_suggestion); - self.replace(new_suggestion, fold_snapshot, Default::default()) + let (snapshot, edits, _) = + self.replace(new_suggestion, fold_snapshot, Default::default()); + (snapshot, edits) } } }