diff --git a/crates/buffer/src/random_char_iter.rs b/crates/buffer/src/random_char_iter.rs index 244665688d..535ee03eef 100644 --- a/crates/buffer/src/random_char_iter.rs +++ b/crates/buffer/src/random_char_iter.rs @@ -14,14 +14,14 @@ impl Iterator for RandomCharIter { fn next(&mut self) -> Option { 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()), } } diff --git a/crates/editor/src/display_map/block_map.rs b/crates/editor/src/display_map/block_map.rs index 0f2fbcf973..34c5672c5e 100644 --- a/crates/editor/src/display_map/block_map.rs +++ b/crates/editor/src/display_map/block_map.rs @@ -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