diff --git a/crates/go_to_line/src/cursor_position.rs b/crates/go_to_line/src/cursor_position.rs index 179b817329..322a791b13 100644 --- a/crates/go_to_line/src/cursor_position.rs +++ b/crates/go_to_line/src/cursor_position.rs @@ -39,15 +39,32 @@ pub struct UserCaretPosition { } impl UserCaretPosition { - pub fn at_selection_end(selection: &Selection, snapshot: &MultiBufferSnapshot) -> Self { + pub(crate) fn at_selection_end( + selection: &Selection, + snapshot: &MultiBufferSnapshot, + ) -> Self { let selection_end = selection.head(); - let line_start = Point::new(selection_end.row, 0); - let chars_to_last_position = snapshot - .text_summary_for_range::(line_start..selection_end) - .chars as u32; + let (line, character) = if let Some((buffer_snapshot, point, _)) = + snapshot.point_to_buffer_point(selection_end) + { + let line_start = Point::new(point.row, 0); + + let chars_to_last_position = buffer_snapshot + .text_summary_for_range::(line_start..point) + .chars as u32; + (line_start.row, chars_to_last_position) + } else { + let line_start = Point::new(selection_end.row, 0); + + let chars_to_last_position = snapshot + .text_summary_for_range::(line_start..selection_end) + .chars as u32; + (selection_end.row, chars_to_last_position) + }; + Self { - line: NonZeroU32::new(selection_end.row + 1).expect("added 1"), - character: NonZeroU32::new(chars_to_last_position + 1).expect("added 1"), + line: NonZeroU32::new(line + 1).expect("added 1"), + character: NonZeroU32::new(character + 1).expect("added 1"), } } }