This commit is contained in:
Antonio Scandurra 2021-11-15 17:54:28 +01:00
parent 34f85b5690
commit 131979dff0
2 changed files with 62 additions and 56 deletions

View file

@ -14,14 +14,14 @@ impl<T: Rng> Iterator for RandomCharIter<T> {
fn next(&mut self) -> Option<Self::Item> { fn next(&mut self) -> Option<Self::Item> {
match self.0.gen_range(0..100) { match self.0.gen_range(0..100) {
// whitespace // whitespace
0..=19 => [' ', '\n', '\t'].choose(&mut self.0).copied(), 0..=4 => ['\n'].choose(&mut self.0).copied(),
// two-byte greek letters // // two-byte greek letters
20..=32 => char::from_u32(self.0.gen_range(('α' as u32)..('ω' as u32 + 1))), // 20..=32 => char::from_u32(self.0.gen_range(('α' as u32)..('ω' as u32 + 1))),
// three-byte characters // // three-byte characters
33..=45 => ['✋', '✅', '❌', '❎', '⭐'].choose(&mut self.0).copied(), // 33..=45 => ['✋', '✅', '❌', '❎', '⭐'].choose(&mut self.0).copied(),
// four-byte characters // // four-byte characters
46..=58 => ['🍐', '🏀', '🍗', '🎉'].choose(&mut self.0).copied(), // 46..=58 => ['🍐', '🏀', '🍗', '🎉'].choose(&mut self.0).copied(),
// ascii letters // // ascii letters
_ => Some(self.0.gen_range(b'a'..b'z' + 1).into()), _ => Some(self.0.gen_range(b'a'..b'z' + 1).into()),
} }
} }

View file

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