Simplify signature of SuggestionMap::replace
This commit is contained in:
parent
83051f1e86
commit
fb48854e5a
1 changed files with 36 additions and 25 deletions
|
@ -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>>,
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue