zeta: Extend text in popover until EOL (#21811)

Release Notes:

- N/A

Co-authored-by: Antonio <antonio@zed.dev>
Co-authored-by: Bennet <bennet@zed.dev>
This commit is contained in:
Thorsten Ball 2024-12-10 16:21:45 +01:00 committed by GitHub
parent 4300ef840b
commit 43ba0c9fa6
No known key found for this signature in database
GPG key ID: B5690EEEBB952194

View file

@ -2834,8 +2834,7 @@ impl EditorElement {
return None; return None;
} }
let (text, highlights) = let (text, highlights) = inline_completion_popover_text(editor_snapshot, edits, cx);
inline_completion_popover_text(edit_start, editor_snapshot, edits, cx);
let longest_row = let longest_row =
editor_snapshot.longest_row_in_range(edit_start.row()..edit_end.row() + 1); editor_snapshot.longest_row_in_range(edit_start.row()..edit_end.row() + 1);
@ -4300,11 +4299,17 @@ impl EditorElement {
} }
fn inline_completion_popover_text( fn inline_completion_popover_text(
edit_start: DisplayPoint,
editor_snapshot: &EditorSnapshot, editor_snapshot: &EditorSnapshot,
edits: &Vec<(Range<Anchor>, String)>, edits: &Vec<(Range<Anchor>, String)>,
cx: &WindowContext, cx: &WindowContext,
) -> (String, Vec<(Range<usize>, HighlightStyle)>) { ) -> (String, Vec<(Range<usize>, HighlightStyle)>) {
let edit_start = edits
.first()
.unwrap()
.0
.start
.to_display_point(editor_snapshot);
let mut text = String::new(); let mut text = String::new();
let mut offset = DisplayPoint::new(edit_start.row(), 0).to_offset(editor_snapshot, Bias::Left); let mut offset = DisplayPoint::new(edit_start.row(), 0).to_offset(editor_snapshot, Bias::Left);
let mut highlights = Vec::new(); 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) (text, highlights)
} }
@ -7097,13 +7118,11 @@ mod tests {
let snapshot = editor.snapshot(cx); let snapshot = editor.snapshot(cx);
let edit_range = snapshot.buffer_snapshot.anchor_after(Point::new(0, 6)) let edit_range = snapshot.buffer_snapshot.anchor_after(Point::new(0, 6))
..snapshot.buffer_snapshot.anchor_before(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 edits = vec![(edit_range, " beautiful".to_string())];
let (text, highlights) = let (text, highlights) = inline_completion_popover_text(&snapshot, &edits, cx);
inline_completion_popover_text(edit_start, &snapshot, &edits, cx);
assert_eq!(text, "Hello, beautiful"); assert_eq!(text, "Hello, beautiful world!");
assert_eq!(highlights.len(), 1); assert_eq!(highlights.len(), 1);
assert_eq!(highlights[0].0, 6..16); assert_eq!(highlights[0].0, 6..16);
assert_eq!( assert_eq!(
@ -7125,17 +7144,15 @@ mod tests {
window window
.update(cx, |editor, cx| { .update(cx, |editor, cx| {
let snapshot = editor.snapshot(cx); let snapshot = editor.snapshot(cx);
let edit_start = DisplayPoint::new(DisplayRow(0), 0);
let edits = vec![( let edits = vec![(
snapshot.buffer_snapshot.anchor_after(Point::new(0, 0)) snapshot.buffer_snapshot.anchor_after(Point::new(0, 0))
..snapshot.buffer_snapshot.anchor_before(Point::new(0, 4)), ..snapshot.buffer_snapshot.anchor_before(Point::new(0, 4)),
"That".to_string(), "That".to_string(),
)]; )];
let (text, highlights) = let (text, highlights) = inline_completion_popover_text(&snapshot, &edits, cx);
inline_completion_popover_text(edit_start, &snapshot, &edits, cx);
assert_eq!(text, "That"); assert_eq!(text, "That is a test.");
assert_eq!(highlights.len(), 1); assert_eq!(highlights.len(), 1);
assert_eq!(highlights[0].0, 0..4); assert_eq!(highlights[0].0, 0..4);
assert_eq!( assert_eq!(
@ -7157,7 +7174,6 @@ mod tests {
window window
.update(cx, |editor, cx| { .update(cx, |editor, cx| {
let snapshot = editor.snapshot(cx); let snapshot = editor.snapshot(cx);
let edit_start = DisplayPoint::new(DisplayRow(0), 0);
let edits = vec![ let edits = vec![
( (
snapshot.buffer_snapshot.anchor_after(Point::new(0, 0)) 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_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(), " and universe".into(),
), ),
]; ];
let (text, highlights) = let (text, highlights) = inline_completion_popover_text(&snapshot, &edits, cx);
inline_completion_popover_text(edit_start, &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.len(), 2);
assert_eq!(highlights[0].0, 0..9); assert_eq!(highlights[0].0, 0..9);
assert_eq!(highlights[1].0, 16..29); assert_eq!(highlights[1].0, 16..29);
@ -7204,7 +7219,6 @@ mod tests {
window window
.update(cx, |editor, cx| { .update(cx, |editor, cx| {
let snapshot = editor.snapshot(cx); let snapshot = editor.snapshot(cx);
let edit_start = DisplayPoint::new(DisplayRow(1), 0);
let edits = vec![ let edits = vec![
( (
snapshot.buffer_snapshot.anchor_before(Point::new(1, 7)) snapshot.buffer_snapshot.anchor_before(Point::new(1, 7))
@ -7223,10 +7237,9 @@ mod tests {
), ),
]; ];
let (text, highlights) = let (text, highlights) = inline_completion_popover_text(&snapshot, &edits, cx);
inline_completion_popover_text(edit_start, &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.len(), 3);
assert_eq!(highlights[0].0, 7..15); // "modified" assert_eq!(highlights[0].0, 7..15); // "modified"
assert_eq!(highlights[1].0, 16..30); // "New third line" assert_eq!(highlights[1].0, 16..30); // "New third line"