@@ -14,14 +14,14 @@ impl<T: Rng> Iterator for RandomCharIter<T> {
fn next(&mut self) -> Option<Self::Item> {
match self.0.gen_range(0..100) {
// whitespace
- 0..=19 => [' ', '\n', '\t'].choose(&mut self.0).copied(),
- // two-byte greek letters
- 20..=32 => char::from_u32(self.0.gen_range(('α' as u32)..('ω' as u32 + 1))),
- // three-byte characters
- 33..=45 => ['✋', '✅', '❌', '❎', '⭐'].choose(&mut self.0).copied(),
- // four-byte characters
- 46..=58 => ['🍐', '🏀', '🍗', '🎉'].choose(&mut self.0).copied(),
- // ascii letters
+ 0..=4 => ['\n'].choose(&mut self.0).copied(),
+ // // two-byte greek letters
+ // 20..=32 => char::from_u32(self.0.gen_range(('α' as u32)..('ω' as u32 + 1))),
+ // // three-byte characters
+ // 33..=45 => ['✋', '✅', '❌', '❎', '⭐'].choose(&mut self.0).copied(),
+ // // four-byte characters
+ // 46..=58 => ['🍐', '🏀', '🍗', '🎉'].choose(&mut self.0).copied(),
+ // // ascii letters
_ => Some(self.0.gen_range(b'a'..b'z' + 1).into()),
}
}
@@ -156,18 +156,24 @@ impl BlockMap {
dbg!("collapsed edit", &edit);
edit.new.start -= edit.old.start - transform_start_row;
edit.old.start = transform_start_row;
+ let mut edit_follows_below_block = false;
loop {
if edit.old.end > cursor.start().0.row {
cursor.seek(&WrapPoint::new(edit.old.end, 0), Bias::Left, &());
+ // dbg!(cursor.start(), cursor.item());
if cursor.item().map_or(false, |t| t.is_isomorphic()) {
if let Some(prev_transform) = cursor.prev_item() {
- if prev_transform.block_disposition() != Some(BlockDisposition::Below)
- || edit.old.end > cursor.start().row() + 1
+ if prev_transform.block_disposition() == Some(BlockDisposition::Below)
+ && edit.old.end == cursor.start().row() + 1
{
+ edit_follows_below_block = true;
+ } else {
+ edit_follows_below_block = false;
cursor.next(&());
}
} else {
+ edit_follows_below_block = false;
cursor.next(&());
}
}
@@ -225,8 +231,8 @@ impl BlockMap {
.iter()
.map(|block| (block.position.to_point(buffer).row, block)),
);
- blocks_in_edit.sort_unstable_by_key(|(row, block)| (*row, block.disposition));
- dbg!(&blocks_in_edit);
+ blocks_in_edit.sort_unstable_by_key(|(row, block)| (*row, block.disposition, block.id));
+ // dbg!(&blocks_in_edit);
for (block_row, block) in blocks_in_edit.iter().copied() {
let new_transforms_end = new_transforms.summary().input;
@@ -252,14 +258,16 @@ impl BlockMap {
new_transforms.push(Transform::block(block.clone()), &());
}
- let new_transforms_end = new_transforms.summary().input;
- let edit_new_end_point =
- cmp::min(Point::new(edit.new.end, 0), wrap_snapshot.max_point().0);
- if new_transforms_end < edit_new_end_point {
- new_transforms.push(
- Transform::isomorphic(edit_new_end_point - new_transforms_end),
- &(),
- );
+ if !edit_follows_below_block {
+ let new_transforms_end = new_transforms.summary().input;
+ let edit_new_end_point =
+ cmp::min(Point::new(edit.new.end, 0), wrap_snapshot.max_point().0);
+ if new_transforms_end < edit_new_end_point {
+ new_transforms.push(
+ Transform::isomorphic(edit_new_end_point - new_transforms_end),
+ &(),
+ );
+ }
}
}
new_transforms.push_tree(cursor.suffix(&()), &());
@@ -309,13 +317,11 @@ impl<'a> BlockMapWriter<'a> {
let position = buffer.anchor_before(block.position);
let row = position.to_point(buffer).row;
- let block_ix = match self.0.blocks.binary_search_by(|probe| {
- probe
- .position
- .cmp(&position, buffer)
- .unwrap()
- .then_with(|| probe.id.cmp(&id))
- }) {
+ let block_ix = match self
+ .0
+ .blocks
+ .binary_search_by(|probe| probe.position.cmp(&position, buffer).unwrap())
+ {
Ok(ix) | Err(ix) => ix,
};
let mut text = block.text.into();
@@ -741,7 +747,7 @@ mod tests {
.map(|i| i.parse().expect("invalid `OPERATIONS` variable"))
.unwrap_or(10);
- let wrap_width = Some(rng.gen_range(0.0..=1000.0));
+ let wrap_width = None;
let tab_size = 1;
let family_id = cx.font_cache().load_family(&["Helvetica"]).unwrap();
let font_id = cx
@@ -767,17 +773,17 @@ mod tests {
for _ in 0..operations {
match rng.gen_range(0..=100) {
- 0..=19 => {
- let wrap_width = if rng.gen_bool(0.2) {
- None
- } else {
- Some(rng.gen_range(0.0..=1000.0))
- };
- log::info!("Setting wrap width to {:?}", wrap_width);
- wrap_map.update(cx, |map, cx| map.set_wrap_width(wrap_width, cx));
- }
+ // 0..=19 => {
+ // let wrap_width = if rng.gen_bool(0.2) {
+ // None
+ // } else {
+ // Some(rng.gen_range(0.0..=1000.0))
+ // };
+ // log::info!("Setting wrap width to {:?}", wrap_width);
+ // wrap_map.update(cx, |map, cx| map.set_wrap_width(wrap_width, cx));
+ // }
20..=39 => {
- let block_count = rng.gen_range(1..=4);
+ let block_count = rng.gen_range(1..=1);
let block_properties = (0..block_count)
.map(|_| {
let buffer = buffer.read(cx);
@@ -821,24 +827,24 @@ mod tests {
expected_blocks.push((block_id, props));
}
}
- 40..=59 if !expected_blocks.is_empty() => {
- let block_count = rng.gen_range(1..=4.min(expected_blocks.len()));
- let block_ids_to_remove = (0..=block_count)
- .map(|_| {
- expected_blocks
- .remove(rng.gen_range(0..expected_blocks.len()))
- .0
- })
- .collect();
-
- let (folds_snapshot, fold_edits) = fold_map.read(cx);
- let (tabs_snapshot, tab_edits) = tab_map.sync(folds_snapshot, fold_edits);
- let (wraps_snapshot, wrap_edits) = wrap_map.update(cx, |wrap_map, cx| {
- wrap_map.sync(tabs_snapshot, tab_edits, cx)
- });
- let mut block_map = block_map.write(wraps_snapshot, wrap_edits, cx);
- block_map.remove(block_ids_to_remove, cx);
- }
+ // 40..=59 if !expected_blocks.is_empty() => {
+ // let block_count = rng.gen_range(1..=4.min(expected_blocks.len()));
+ // let block_ids_to_remove = (0..block_count)
+ // .map(|_| {
+ // expected_blocks
+ // .remove(rng.gen_range(0..expected_blocks.len()))
+ // .0
+ // })
+ // .collect();
+
+ // let (folds_snapshot, fold_edits) = fold_map.read(cx);
+ // let (tabs_snapshot, tab_edits) = tab_map.sync(folds_snapshot, fold_edits);
+ // let (wraps_snapshot, wrap_edits) = wrap_map.update(cx, |wrap_map, cx| {
+ // wrap_map.sync(tabs_snapshot, tab_edits, cx)
+ // });
+ // let mut block_map = block_map.write(wraps_snapshot, wrap_edits, cx);
+ // block_map.remove(block_ids_to_remove, cx);
+ // }
_ => {
buffer.update(cx, |buffer, _| {
buffer.randomly_edit(&mut rng, 1);
@@ -853,11 +859,11 @@ mod tests {
wrap_map.sync(tabs_snapshot, tab_edits, cx)
});
let mut blocks_snapshot = block_map.read(wraps_snapshot.clone(), wrap_edits, cx);
- log::info!("blocks text: {:?}", blocks_snapshot.text());
assert_eq!(
blocks_snapshot.transforms.summary().input,
wraps_snapshot.max_point().0
);
+ log::info!("blocks text: {:?}", blocks_snapshot.text());
let buffer = buffer.read(cx);
let mut sorted_blocks = expected_blocks