diff --git a/crates/editor/src/display_map/block_map.rs b/crates/editor/src/display_map/block_map.rs index 7664ff4d2d7121..9021f0223db3e0 100644 --- a/crates/editor/src/display_map/block_map.rs +++ b/crates/editor/src/display_map/block_map.rs @@ -1775,8 +1775,12 @@ impl BlockMapWriter<'_> { let start = block.placement.start().to_point(&buffer); let end = block.placement.end().to_point(&buffer); - let start_wrap_row = wrap_snapshot.make_wrap_point(start, Bias::Left).row(); - let end_wrap_row = wrap_snapshot.make_wrap_point(end, Bias::Left).row(); + let start_wrap_row = wrap_snapshot + .make_wrap_point(Point::new(start.row, 0), Bias::Left) + .row(); + let end_wrap_row = wrap_snapshot + .make_wrap_point(Point::new(end.row, 0), Bias::Left) + .row(); let (start_row, end_row) = { previous_wrap_row_range.take_if(|range| { @@ -1927,8 +1931,12 @@ impl BlockMapWriter<'_> { let end = block.placement.end().to_point(buffer); if last_block_buffer_row != Some(end.row) { last_block_buffer_row = Some(end.row); - let start_wrap_row = wrap_snapshot.make_wrap_point(start, Bias::Left).row(); - let end_wrap_row = wrap_snapshot.make_wrap_point(end, Bias::Left).row(); + let start_wrap_row = wrap_snapshot + .make_wrap_point(Point::new(start.row, 0), Bias::Left) + .row(); + let end_wrap_row = wrap_snapshot + .make_wrap_point(Point::new(end.row, 0), Bias::Left) + .row(); let (start_row, end_row) = { previous_wrap_row_range.take_if(|range| { !range.contains(&start_wrap_row) || !range.contains(&end_wrap_row) @@ -3305,6 +3313,41 @@ mod tests { ); } + #[gpui::test] + fn test_insert_and_remove_block_anchored_past_soft_wrap(cx: &mut gpui::TestAppContext) { + cx.update(init_test); + + let text = "one two three\nfour\nfive"; + + let buffer = cx.update(|cx| MultiBuffer::build_simple(text, cx)); + let buffer_snapshot = cx.update(|cx| buffer.read(cx).snapshot(cx)); + let (_, inlay_snapshot) = InlayMap::new(buffer_snapshot.clone()); + let (_, fold_snapshot) = FoldMap::new(inlay_snapshot); + let (_, tab_snapshot) = TabMap::new(fold_snapshot, 4.try_into().unwrap()); + let (_, wraps_snapshot) = cx.update(|cx| { + WrapMap::new(tab_snapshot, font("Helvetica"), px(14.0), Some(px(90.)), cx) + }); + let mut block_map = BlockMap::new(wraps_snapshot.clone(), 1, 1); + + let mut writer = block_map.write(wraps_snapshot.clone(), Default::default(), None); + let block_id = writer.insert(vec![BlockProperties { + style: BlockStyle::Fixed, + placement: BlockPlacement::Above(buffer_snapshot.anchor_after(Point::new(0, 12))), + render: Arc::new(|_| div().into_any()), + height: Some(2), + priority: 0, + }])[0]; + + let snapshot = block_map.read(wraps_snapshot.clone(), Default::default(), None); + assert_eq!(snapshot.text(), "\n\none two \nthree\nfour\nfive"); + + let mut writer = block_map.write(wraps_snapshot.clone(), Default::default(), None); + writer.remove(HashSet::from_iter([block_id])); + + let snapshot = block_map.read(wraps_snapshot, Default::default(), None); + assert_eq!(snapshot.text(), "one two \nthree\nfour\nfive"); + } + #[gpui::test] fn test_replace_lines(cx: &mut gpui::TestAppContext) { cx.update(init_test);