mirror of
https://github.com/zed-industries/zed.git
synced 2025-02-03 17:44:30 +00:00
WIP
This commit is contained in:
parent
34f85b5690
commit
131979dff0
2 changed files with 62 additions and 56 deletions
|
@ -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,6 +258,7 @@ impl BlockMap {
|
|||
new_transforms.push(Transform::block(block.clone()), &());
|
||||
}
|
||||
|
||||
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);
|
||||
|
@ -262,6 +269,7 @@ impl BlockMap {
|
|||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
new_transforms.push_tree(cursor.suffix(&()), &());
|
||||
drop(cursor);
|
||||
*transforms = new_transforms;
|
||||
|
@ -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
|
||||
|
|
Loading…
Reference in a new issue