From 43ba0c9fa6ce51a1b89fd2b5da012025a0322c04 Mon Sep 17 00:00:00 2001 From: Thorsten Ball Date: Tue, 10 Dec 2024 16:21:45 +0100 Subject: [PATCH] zeta: Extend text in popover until EOL (#21811) Release Notes: - N/A Co-authored-by: Antonio Co-authored-by: Bennet --- crates/editor/src/element.rs | 53 ++++++++++++++++++++++-------------- 1 file changed, 33 insertions(+), 20 deletions(-) diff --git a/crates/editor/src/element.rs b/crates/editor/src/element.rs index caa736da7a8131..029bc53288eba3 100644 --- a/crates/editor/src/element.rs +++ b/crates/editor/src/element.rs @@ -2834,8 +2834,7 @@ impl EditorElement { return None; } - let (text, highlights) = - inline_completion_popover_text(edit_start, editor_snapshot, edits, cx); + let (text, highlights) = inline_completion_popover_text(editor_snapshot, edits, cx); let longest_row = editor_snapshot.longest_row_in_range(edit_start.row()..edit_end.row() + 1); @@ -4300,11 +4299,17 @@ impl EditorElement { } fn inline_completion_popover_text( - edit_start: DisplayPoint, editor_snapshot: &EditorSnapshot, edits: &Vec<(Range, String)>, cx: &WindowContext, ) -> (String, Vec<(Range, HighlightStyle)>) { + let edit_start = edits + .first() + .unwrap() + .0 + .start + .to_display_point(editor_snapshot); + let mut text = String::new(); let mut offset = DisplayPoint::new(edit_start.row(), 0).to_offset(editor_snapshot, Bias::Left); let mut highlights = Vec::new(); @@ -4329,6 +4334,22 @@ fn inline_completion_popover_text( }, )); } + + let edit_end = edits + .last() + .unwrap() + .0 + .end + .to_display_point(editor_snapshot); + let end_of_line = DisplayPoint::new(edit_end.row(), editor_snapshot.line_len(edit_end.row())) + .to_offset(editor_snapshot, Bias::Right); + text.extend( + editor_snapshot + .buffer_snapshot + .chunks(offset..end_of_line, false) + .map(|chunk| chunk.text), + ); + (text, highlights) } @@ -7097,13 +7118,11 @@ mod tests { let snapshot = editor.snapshot(cx); let edit_range = snapshot.buffer_snapshot.anchor_after(Point::new(0, 6)) ..snapshot.buffer_snapshot.anchor_before(Point::new(0, 6)); - let edit_start = DisplayPoint::new(DisplayRow(0), 6); let edits = vec![(edit_range, " beautiful".to_string())]; - let (text, highlights) = - inline_completion_popover_text(edit_start, &snapshot, &edits, cx); + let (text, highlights) = inline_completion_popover_text(&snapshot, &edits, cx); - assert_eq!(text, "Hello, beautiful"); + assert_eq!(text, "Hello, beautiful world!"); assert_eq!(highlights.len(), 1); assert_eq!(highlights[0].0, 6..16); assert_eq!( @@ -7125,17 +7144,15 @@ mod tests { window .update(cx, |editor, cx| { let snapshot = editor.snapshot(cx); - let edit_start = DisplayPoint::new(DisplayRow(0), 0); let edits = vec![( snapshot.buffer_snapshot.anchor_after(Point::new(0, 0)) ..snapshot.buffer_snapshot.anchor_before(Point::new(0, 4)), "That".to_string(), )]; - let (text, highlights) = - inline_completion_popover_text(edit_start, &snapshot, &edits, cx); + let (text, highlights) = inline_completion_popover_text(&snapshot, &edits, cx); - assert_eq!(text, "That"); + assert_eq!(text, "That is a test."); assert_eq!(highlights.len(), 1); assert_eq!(highlights[0].0, 0..4); assert_eq!( @@ -7157,7 +7174,6 @@ mod tests { window .update(cx, |editor, cx| { let snapshot = editor.snapshot(cx); - let edit_start = DisplayPoint::new(DisplayRow(0), 0); let edits = vec![ ( snapshot.buffer_snapshot.anchor_after(Point::new(0, 0)) @@ -7166,15 +7182,14 @@ mod tests { ), ( snapshot.buffer_snapshot.anchor_after(Point::new(0, 12)) - ..snapshot.buffer_snapshot.anchor_before(Point::new(0, 13)), + ..snapshot.buffer_snapshot.anchor_before(Point::new(0, 12)), " and universe".into(), ), ]; - let (text, highlights) = - inline_completion_popover_text(edit_start, &snapshot, &edits, cx); + let (text, highlights) = inline_completion_popover_text(&snapshot, &edits, cx); - assert_eq!(text, "Greetings, world and universe"); + assert_eq!(text, "Greetings, world and universe!"); assert_eq!(highlights.len(), 2); assert_eq!(highlights[0].0, 0..9); assert_eq!(highlights[1].0, 16..29); @@ -7204,7 +7219,6 @@ mod tests { window .update(cx, |editor, cx| { let snapshot = editor.snapshot(cx); - let edit_start = DisplayPoint::new(DisplayRow(1), 0); let edits = vec![ ( snapshot.buffer_snapshot.anchor_before(Point::new(1, 7)) @@ -7223,10 +7237,9 @@ mod tests { ), ]; - let (text, highlights) = - inline_completion_popover_text(edit_start, &snapshot, &edits, cx); + let (text, highlights) = inline_completion_popover_text(&snapshot, &edits, cx); - assert_eq!(text, "Second modified\nNew third line\nFourth updated"); + assert_eq!(text, "Second modified\nNew third line\nFourth updated line"); assert_eq!(highlights.len(), 3); assert_eq!(highlights[0].0, 7..15); // "modified" assert_eq!(highlights[1].0, 16..30); // "New third line"