Fix multiline completions when surroundings don't match completion text (#28995)
Follow up to the scenarios I overlooked in https://github.com/zed-industries/zed/pull/28586. Release Notes: - N/A
This commit is contained in:
parent
58d8b91131
commit
1aa1b2bede
2 changed files with 116 additions and 23 deletions
|
@ -10104,7 +10104,7 @@ async fn test_completion_with_mode_specified_by_action(cx: &mut TestAppContext)
|
|||
}
|
||||
|
||||
#[gpui::test]
|
||||
async fn test_completion_replacing_suffix_in_multicursors(cx: &mut TestAppContext) {
|
||||
async fn test_completion_replacing_surrounding_text_with_multicursors(cx: &mut TestAppContext) {
|
||||
init_test(cx, |_| {});
|
||||
let mut cx = EditorLspTestContext::new_rust(
|
||||
lsp::ServerCapabilities {
|
||||
|
@ -10118,6 +10118,8 @@ async fn test_completion_replacing_suffix_in_multicursors(cx: &mut TestAppContex
|
|||
)
|
||||
.await;
|
||||
|
||||
// scenario: surrounding text matches completion text
|
||||
let completion_text = "to_offset";
|
||||
let initial_state = indoc! {"
|
||||
1. buf.to_offˇsuffix
|
||||
2. buf.to_offˇsuf
|
||||
|
@ -10148,7 +10150,6 @@ async fn test_completion_replacing_suffix_in_multicursors(cx: &mut TestAppContex
|
|||
|
||||
buf.<to_off|suffix> // newest cursor
|
||||
"};
|
||||
let completion_text = "to_offset";
|
||||
let expected = indoc! {"
|
||||
1. buf.to_offsetˇ
|
||||
2. buf.to_offsetˇsuf
|
||||
|
@ -10164,24 +10165,122 @@ async fn test_completion_replacing_suffix_in_multicursors(cx: &mut TestAppContex
|
|||
|
||||
buf.to_offsetˇ // newest cursor
|
||||
"};
|
||||
|
||||
cx.set_state(initial_state);
|
||||
cx.update_editor(|editor, window, cx| {
|
||||
editor.show_completions(&ShowCompletions { trigger: None }, window, cx);
|
||||
});
|
||||
|
||||
let counter = Arc::new(AtomicUsize::new(0));
|
||||
handle_completion_request_with_insert_and_replace(
|
||||
&mut cx,
|
||||
completion_marked_buffer,
|
||||
vec![completion_text],
|
||||
counter.clone(),
|
||||
Arc::new(AtomicUsize::new(0)),
|
||||
)
|
||||
.await;
|
||||
cx.condition(|editor, _| editor.context_menu_visible())
|
||||
.await;
|
||||
assert_eq!(counter.load(atomic::Ordering::Acquire), 1);
|
||||
let apply_additional_edits = cx.update_editor(|editor, window, cx| {
|
||||
editor
|
||||
.confirm_completion_replace(&ConfirmCompletionReplace, window, cx)
|
||||
.unwrap()
|
||||
});
|
||||
cx.assert_editor_state(expected);
|
||||
handle_resolve_completion_request(&mut cx, None).await;
|
||||
apply_additional_edits.await.unwrap();
|
||||
|
||||
// scenario: surrounding text matches surroundings of newest cursor, inserting at the end
|
||||
let completion_text = "foo_and_bar";
|
||||
let initial_state = indoc! {"
|
||||
1. ooanbˇ
|
||||
2. zooanbˇ
|
||||
3. ooanbˇz
|
||||
4. zooanbˇz
|
||||
5. ooanˇ
|
||||
6. oanbˇ
|
||||
|
||||
ooanbˇ
|
||||
"};
|
||||
let completion_marked_buffer = indoc! {"
|
||||
1. ooanb
|
||||
2. zooanb
|
||||
3. ooanbz
|
||||
4. zooanbz
|
||||
5. ooan
|
||||
6. oanb
|
||||
|
||||
<ooanb|>
|
||||
"};
|
||||
let expected = indoc! {"
|
||||
1. foo_and_barˇ
|
||||
2. zfoo_and_barˇ
|
||||
3. foo_and_barˇz
|
||||
4. zfoo_and_barˇz
|
||||
5. ooanfoo_and_barˇ
|
||||
6. oanbfoo_and_barˇ
|
||||
|
||||
foo_and_barˇ
|
||||
"};
|
||||
cx.set_state(initial_state);
|
||||
cx.update_editor(|editor, window, cx| {
|
||||
editor.show_completions(&ShowCompletions { trigger: None }, window, cx);
|
||||
});
|
||||
handle_completion_request_with_insert_and_replace(
|
||||
&mut cx,
|
||||
completion_marked_buffer,
|
||||
vec![completion_text],
|
||||
Arc::new(AtomicUsize::new(0)),
|
||||
)
|
||||
.await;
|
||||
cx.condition(|editor, _| editor.context_menu_visible())
|
||||
.await;
|
||||
let apply_additional_edits = cx.update_editor(|editor, window, cx| {
|
||||
editor
|
||||
.confirm_completion_replace(&ConfirmCompletionReplace, window, cx)
|
||||
.unwrap()
|
||||
});
|
||||
cx.assert_editor_state(expected);
|
||||
handle_resolve_completion_request(&mut cx, None).await;
|
||||
apply_additional_edits.await.unwrap();
|
||||
|
||||
// scenario: surrounding text matches surroundings of newest cursor, inserted at the middle
|
||||
// (expects the same as if it was inserted at the end)
|
||||
let completion_text = "foo_and_bar";
|
||||
let initial_state = indoc! {"
|
||||
1. ooˇanb
|
||||
2. zooˇanb
|
||||
3. ooˇanbz
|
||||
4. zooˇanbz
|
||||
|
||||
ooˇanb
|
||||
"};
|
||||
let completion_marked_buffer = indoc! {"
|
||||
1. ooanb
|
||||
2. zooanb
|
||||
3. ooanbz
|
||||
4. zooanbz
|
||||
|
||||
<oo|anb>
|
||||
"};
|
||||
let expected = indoc! {"
|
||||
1. foo_and_barˇ
|
||||
2. zfoo_and_barˇ
|
||||
3. foo_and_barˇz
|
||||
4. zfoo_and_barˇz
|
||||
|
||||
foo_and_barˇ
|
||||
"};
|
||||
cx.set_state(initial_state);
|
||||
cx.update_editor(|editor, window, cx| {
|
||||
editor.show_completions(&ShowCompletions { trigger: None }, window, cx);
|
||||
});
|
||||
handle_completion_request_with_insert_and_replace(
|
||||
&mut cx,
|
||||
completion_marked_buffer,
|
||||
vec![completion_text],
|
||||
Arc::new(AtomicUsize::new(0)),
|
||||
)
|
||||
.await;
|
||||
cx.condition(|editor, _| editor.context_menu_visible())
|
||||
.await;
|
||||
let apply_additional_edits = cx.update_editor(|editor, window, cx| {
|
||||
editor
|
||||
.confirm_completion_replace(&ConfirmCompletionReplace, window, cx)
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue