Simplify signature of `SuggestionMap::replace`

Antonio Scandurra created

Change summary

crates/editor/src/display_map/suggestion_map.rs | 61 +++++++++++-------
1 file changed, 36 insertions(+), 25 deletions(-)

Detailed changes

crates/editor/src/display_map/suggestion_map.rs 🔗

@@ -35,45 +35,56 @@ impl AddAssign for SuggestionOffset {
 }
 
 #[derive(Clone)]
-pub struct Suggestion {
-    offset: FoldOffset,
+pub struct Suggestion<T> {
+    position: T,
     text: Rope,
 }
 
 pub struct SuggestionMap(Mutex<SuggestionSnapshot>);
 
 impl SuggestionMap {
-    pub fn replace<P, T>(
+    pub fn replace<T>(
         &mut self,
-        position: P,
-        text: T,
+        new_suggestion: Option<Suggestion<T>>,
         fold_snapshot: FoldSnapshot,
         fold_edits: Vec<FoldEdit>,
     ) -> (SuggestionSnapshot, Vec<SuggestionEdit>)
     where
-        P: ToPoint,
-        T: Into<Rope>,
+        T: ToPoint,
     {
-        let buffer_point = position.to_point(fold_snapshot.buffer_snapshot());
-        let fold_point = fold_snapshot.to_fold_point(buffer_point, Bias::Left);
-        let fold_offset = fold_point.to_offset(&fold_snapshot);
-        let new_suggestion = Suggestion {
-            offset: fold_offset,
-            text: text.into(),
-        };
+        let new_suggestion = new_suggestion.map(|new_suggestion| {
+            let buffer_point = new_suggestion
+                .position
+                .to_point(fold_snapshot.buffer_snapshot());
+            let fold_point = fold_snapshot.to_fold_point(buffer_point, Bias::Left);
+            let fold_offset = fold_point.to_offset(&fold_snapshot);
+            Suggestion {
+                position: fold_offset,
+                text: new_suggestion.text,
+            }
+        });
 
         let (_, edits) = self.sync(fold_snapshot, fold_edits);
         let mut snapshot = self.0.lock();
+
         let old = if let Some(suggestion) = snapshot.suggestion.take() {
-            SuggestionOffset(suggestion.offset.0)
-                ..SuggestionOffset(suggestion.offset.0 + suggestion.text.len())
+            SuggestionOffset(suggestion.position.0)
+                ..SuggestionOffset(suggestion.position.0 + suggestion.text.len())
+        } else if let Some(new_suggestion) = new_suggestion.as_ref() {
+            SuggestionOffset(new_suggestion.position.0)..SuggestionOffset(new_suggestion.position.0)
         } else {
-            SuggestionOffset(new_suggestion.offset.0)..SuggestionOffset(new_suggestion.offset.0)
+            return (snapshot.clone(), edits);
         };
-        let new = SuggestionOffset(new_suggestion.offset.0)
-            ..SuggestionOffset(new_suggestion.offset.0 + new_suggestion.text.len());
+
+        let new = if let Some(suggestion) = new_suggestion.as_ref() {
+            SuggestionOffset(suggestion.position.0)
+                ..SuggestionOffset(suggestion.position.0 + suggestion.text.len())
+        } else {
+            old.start..old.start
+        };
+
         let patch = Patch::new(edits).compose([SuggestionEdit { old, new }]);
-        snapshot.suggestion = Some(new_suggestion);
+        snapshot.suggestion = new_suggestion;
         (snapshot.clone(), patch.into_inner())
     }
 
@@ -91,10 +102,10 @@ impl SuggestionMap {
             let start = fold_edit.new.start;
             let end = FoldOffset(start.0 + fold_edit.old_len().0);
             if let Some(suggestion) = snapshot.suggestion.as_mut() {
-                if end < suggestion.offset {
-                    suggestion.offset.0 += fold_edit.new_len().0;
-                    suggestion.offset.0 -= fold_edit.old_len().0;
-                } else if start > suggestion.offset {
+                if end < suggestion.position {
+                    suggestion.position.0 += fold_edit.new_len().0;
+                    suggestion.position.0 -= fold_edit.old_len().0;
+                } else if start > suggestion.position {
                     suggestion_old_len = suggestion.text.len();
                     suggestion_new_len = suggestion_old_len;
                 } else {
@@ -126,5 +137,5 @@ impl SuggestionMap {
 #[derive(Clone)]
 pub struct SuggestionSnapshot {
     folds_snapshot: FoldSnapshot,
-    suggestion: Option<Suggestion>,
+    suggestion: Option<Suggestion<FoldOffset>>,
 }