diff --git a/crates/editor/src/display_map.rs b/crates/editor/src/display_map.rs index b9d59d65df..aa41959363 100644 --- a/crates/editor/src/display_map.rs +++ b/crates/editor/src/display_map.rs @@ -1068,13 +1068,15 @@ impl DisplaySnapshot { DisplayPoint(self.block_snapshot.clip_point(point.0, bias)) } - pub fn clip_at_line_end(&self, point: DisplayPoint) -> DisplayPoint { - let mut point = point.0; - if point.column == self.line_len(DisplayRow(point.row)) { - point.column = point.column.saturating_sub(1); - point = self.block_snapshot.clip_point(point, Bias::Left); + pub fn clip_at_line_end(&self, display_point: DisplayPoint) -> DisplayPoint { + let mut point = self.display_point_to_point(display_point, Bias::Left); + + if point.column != self.buffer_snapshot.line_len(MultiBufferRow(point.row)) { + return display_point; } - DisplayPoint(point) + point.column = point.column.saturating_sub(1); + point = self.buffer_snapshot.clip_point(point, Bias::Left); + self.point_to_display_point(point, Bias::Left) } pub fn folds_in_range(&self, range: Range) -> impl Iterator diff --git a/crates/vim/src/motion.rs b/crates/vim/src/motion.rs index 9da2238eaa..96a5ef7454 100644 --- a/crates/vim/src/motion.rs +++ b/crates/vim/src/motion.rs @@ -2761,6 +2761,8 @@ mod test { }; use editor::display_map::Inlay; use indoc::indoc; + use language::Point; + use multi_buffer::MultiBufferRow; #[gpui::test] async fn test_start_end_of_paragraph(cx: &mut gpui::TestAppContext) { @@ -3428,10 +3430,10 @@ mod test { cx.set_state( indoc! {" - struct Foo { - ˇ - } - "}, + struct Foo { + ˇ + } + "}, Mode::Normal, ); @@ -3445,9 +3447,40 @@ mod test { cx.simulate_keystrokes("j"); cx.assert_state( indoc! {" - struct Foo { + struct Foo { - ˇ} + ˇ} + "}, + Mode::Normal, + ); + } + + #[gpui::test] + async fn test_clipping_with_inlay_hints_end_of_line(cx: &mut gpui::TestAppContext) { + let mut cx = VimTestContext::new(cx, true).await; + + cx.set_state( + indoc! {" + ˇstruct Foo { + + } + "}, + Mode::Normal, + ); + cx.update_editor(|editor, _window, cx| { + let snapshot = editor.buffer().read(cx).snapshot(cx); + let end_of_line = + snapshot.anchor_after(Point::new(0, snapshot.line_len(MultiBufferRow(0)))); + let inlay_text = " hint"; + let inlay = Inlay::inline_completion(1, end_of_line, inlay_text); + editor.splice_inlays(vec![], vec![inlay], cx); + }); + cx.simulate_keystrokes("$"); + cx.assert_state( + indoc! {" + struct Foo ˇ{ + + } "}, Mode::Normal, );