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> {
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()),
}
}

View File

@ -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();
// 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);
}
// 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