Bump FoldMap's version in FoldMap::sync (and not in DisplayMap)

This commit is contained in:
Antonio Scandurra 2021-12-01 12:05:02 +01:00
parent b841b3eb79
commit 47c467dafc
6 changed files with 386 additions and 347 deletions

View file

@ -33,7 +33,7 @@ pub struct DisplayMap {
tab_map: TabMap,
wrap_map: ModelHandle<WrapMap>,
block_map: BlockMap,
edits_since_sync: Mutex<Patch<usize>>,
buffer_edits_since_sync: Mutex<Patch<usize>>,
}
impl Entity for DisplayMap {
@ -49,7 +49,7 @@ impl DisplayMap {
wrap_width: Option<f32>,
cx: &mut ModelContext<Self>,
) -> Self {
let (fold_map, snapshot) = FoldMap::new(buffer.clone(), cx);
let (fold_map, snapshot) = FoldMap::new(buffer.read(cx).snapshot());
let (tab_map, snapshot) = TabMap::new(snapshot, tab_size);
let (wrap_map, snapshot) = WrapMap::new(snapshot, font_id, font_size, wrap_width, cx);
let block_map = BlockMap::new(buffer.clone(), snapshot);
@ -61,14 +61,15 @@ impl DisplayMap {
tab_map,
wrap_map,
block_map,
edits_since_sync: Default::default(),
buffer_edits_since_sync: Default::default(),
}
}
pub fn snapshot(&self, cx: &mut ModelContext<Self>) -> DisplayMapSnapshot {
let buffer_snapshot = self.buffer.read(cx).snapshot();
let (folds_snapshot, edits) = self.fold_map.read(
mem::take(&mut *self.edits_since_sync.lock()).into_inner(),
cx,
buffer_snapshot,
mem::take(&mut *self.buffer_edits_since_sync.lock()).into_inner(),
);
let (tabs_snapshot, edits) = self.tab_map.sync(folds_snapshot.clone(), edits);
let (wraps_snapshot, edits) = self
@ -90,16 +91,17 @@ impl DisplayMap {
ranges: impl IntoIterator<Item = Range<T>>,
cx: &mut ModelContext<Self>,
) {
let snapshot = self.buffer.read(cx).snapshot();
let (mut fold_map, snapshot, edits) = self.fold_map.write(
mem::take(&mut *self.edits_since_sync.lock()).into_inner(),
cx,
snapshot,
mem::take(&mut *self.buffer_edits_since_sync.lock()).into_inner(),
);
let (snapshot, edits) = self.tab_map.sync(snapshot, edits);
let (snapshot, edits) = self
.wrap_map
.update(cx, |map, cx| map.sync(snapshot, edits, cx));
self.block_map.read(snapshot, edits, cx);
let (snapshot, edits) = fold_map.fold(ranges, cx);
let (snapshot, edits) = fold_map.fold(ranges);
let (snapshot, edits) = self.tab_map.sync(snapshot, edits);
let (snapshot, edits) = self
.wrap_map
@ -112,16 +114,17 @@ impl DisplayMap {
ranges: impl IntoIterator<Item = Range<T>>,
cx: &mut ModelContext<Self>,
) {
let snapshot = self.buffer.read(cx).snapshot();
let (mut fold_map, snapshot, edits) = self.fold_map.write(
mem::take(&mut *self.edits_since_sync.lock()).into_inner(),
cx,
snapshot,
mem::take(&mut *self.buffer_edits_since_sync.lock()).into_inner(),
);
let (snapshot, edits) = self.tab_map.sync(snapshot, edits);
let (snapshot, edits) = self
.wrap_map
.update(cx, |map, cx| map.sync(snapshot, edits, cx));
self.block_map.read(snapshot, edits, cx);
let (snapshot, edits) = fold_map.unfold(ranges, cx);
let (snapshot, edits) = fold_map.unfold(ranges);
let (snapshot, edits) = self.tab_map.sync(snapshot, edits);
let (snapshot, edits) = self
.wrap_map
@ -138,9 +141,10 @@ impl DisplayMap {
P: ToOffset + Clone,
T: Into<Rope> + Clone,
{
let snapshot = self.buffer.read(cx).snapshot();
let (snapshot, edits) = self.fold_map.read(
mem::take(&mut *self.edits_since_sync.lock()).into_inner(),
cx,
snapshot,
mem::take(&mut *self.buffer_edits_since_sync.lock()).into_inner(),
);
let (snapshot, edits) = self.tab_map.sync(snapshot, edits);
let (snapshot, edits) = self
@ -159,9 +163,10 @@ impl DisplayMap {
}
pub fn remove_blocks(&mut self, ids: HashSet<BlockId>, cx: &mut ModelContext<Self>) {
let snapshot = self.buffer.read(cx).snapshot();
let (snapshot, edits) = self.fold_map.read(
mem::take(&mut *self.edits_since_sync.lock()).into_inner(),
cx,
snapshot,
mem::take(&mut *self.buffer_edits_since_sync.lock()).into_inner(),
);
let (snapshot, edits) = self.tab_map.sync(snapshot, edits);
let (snapshot, edits) = self
@ -194,13 +199,9 @@ impl DisplayMap {
) {
match event {
language::Event::Edited(patch) => {
self.fold_map.version += 1;
let mut edits_since_sync = self.edits_since_sync.lock();
let mut edits_since_sync = self.buffer_edits_since_sync.lock();
*edits_since_sync = edits_since_sync.compose(patch);
}
language::Event::Reparsed | language::Event::DiagnosticsUpdated => {
self.fold_map.version += 1;
}
_ => {}
}
}
@ -563,7 +564,7 @@ mod tests {
}
}
_ => {
buffer.update(&mut cx, |buffer, _| buffer.randomly_edit(&mut rng, 5));
buffer.update(&mut cx, |buffer, cx| buffer.randomly_edit(&mut rng, 5, cx));
}
}