Simplify signature of SuggestionMap::replace

This commit is contained in:
Antonio Scandurra 2023-03-20 14:00:14 +01:00
parent 83051f1e86
commit fb48854e5a

View file

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