Force resolve all completions, to ensure their edits are up-to-date
co-authored-by: Max Brunsfeld <max@zed.dev>
This commit is contained in:
parent
c732aa1617
commit
0c7949bdee
2 changed files with 5 additions and 98 deletions
|
@ -7224,7 +7224,7 @@ async fn test_language_server_restart_due_to_settings_change(cx: &mut gpui::Test
|
||||||
}
|
}
|
||||||
|
|
||||||
#[gpui::test]
|
#[gpui::test]
|
||||||
async fn test_completions_with_extra_edits(cx: &mut gpui::TestAppContext) {
|
async fn test_completions_with_additional_edits(cx: &mut gpui::TestAppContext) {
|
||||||
init_test(cx, |_| {});
|
init_test(cx, |_| {});
|
||||||
|
|
||||||
let mut cx = EditorLspTestContext::new_rust(
|
let mut cx = EditorLspTestContext::new_rust(
|
||||||
|
@ -7294,92 +7294,6 @@ async fn test_completions_with_extra_edits(cx: &mut gpui::TestAppContext) {
|
||||||
|
|
||||||
request.next().await;
|
request.next().await;
|
||||||
|
|
||||||
cx.condition(|editor, _| editor.context_menu_visible())
|
|
||||||
.await;
|
|
||||||
let apply_additional_edits = cx.update_editor(|editor, cx| {
|
|
||||||
editor
|
|
||||||
.confirm_completion(&ConfirmCompletion::default(), cx)
|
|
||||||
.unwrap()
|
|
||||||
});
|
|
||||||
cx.assert_editor_state(indoc! {"fn main() { let a = 2.Some(2)ˇ; }"});
|
|
||||||
apply_additional_edits.await.unwrap();
|
|
||||||
cx.assert_editor_state(indoc! {"fn main() { let a = Some(2)ˇ; }"});
|
|
||||||
}
|
|
||||||
|
|
||||||
#[gpui::test]
|
|
||||||
async fn test_completions_with_extra_resolved_edits(cx: &mut gpui::TestAppContext) {
|
|
||||||
init_test(cx, |_| {});
|
|
||||||
|
|
||||||
let mut cx = EditorLspTestContext::new_rust(
|
|
||||||
lsp::ServerCapabilities {
|
|
||||||
completion_provider: Some(lsp::CompletionOptions {
|
|
||||||
trigger_characters: Some(vec![".".to_string()]),
|
|
||||||
..Default::default()
|
|
||||||
}),
|
|
||||||
..Default::default()
|
|
||||||
},
|
|
||||||
cx,
|
|
||||||
)
|
|
||||||
.await;
|
|
||||||
|
|
||||||
cx.set_state(indoc! {"fn main() { let a = 2ˇ; }"});
|
|
||||||
cx.simulate_keystroke(".");
|
|
||||||
let completion_item = lsp::CompletionItem {
|
|
||||||
label: "some".into(),
|
|
||||||
kind: Some(lsp::CompletionItemKind::SNIPPET),
|
|
||||||
detail: Some("Wrap the expression in an `Option::Some`".to_string()),
|
|
||||||
documentation: Some(lsp::Documentation::MarkupContent(lsp::MarkupContent {
|
|
||||||
kind: lsp::MarkupKind::Markdown,
|
|
||||||
value: "```rust\nSome(2)\n```".to_string(),
|
|
||||||
})),
|
|
||||||
deprecated: Some(false),
|
|
||||||
sort_text: Some("fffffff2".to_string()),
|
|
||||||
filter_text: Some("some".to_string()),
|
|
||||||
insert_text_format: Some(lsp::InsertTextFormat::SNIPPET),
|
|
||||||
text_edit: Some(lsp::CompletionTextEdit::Edit(lsp::TextEdit {
|
|
||||||
range: lsp::Range {
|
|
||||||
start: lsp::Position {
|
|
||||||
line: 0,
|
|
||||||
character: 22,
|
|
||||||
},
|
|
||||||
end: lsp::Position {
|
|
||||||
line: 0,
|
|
||||||
character: 22,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
new_text: "Some(2)".to_string(),
|
|
||||||
})),
|
|
||||||
additional_text_edits: Some(vec![lsp::TextEdit {
|
|
||||||
range: lsp::Range {
|
|
||||||
start: lsp::Position {
|
|
||||||
line: 0,
|
|
||||||
character: 20,
|
|
||||||
},
|
|
||||||
end: lsp::Position {
|
|
||||||
line: 0,
|
|
||||||
character: 22,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
new_text: "".to_string(),
|
|
||||||
}]),
|
|
||||||
..Default::default()
|
|
||||||
};
|
|
||||||
|
|
||||||
let closure_completion_item = completion_item.clone();
|
|
||||||
let mut request = cx.handle_request::<lsp::request::Completion, _, _>(move |_, _, _| {
|
|
||||||
let task_completion_item = closure_completion_item.clone();
|
|
||||||
async move {
|
|
||||||
Ok(Some(lsp::CompletionResponse::Array(vec![
|
|
||||||
lsp::CompletionItem {
|
|
||||||
additional_text_edits: None,
|
|
||||||
..task_completion_item
|
|
||||||
},
|
|
||||||
])))
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
request.next().await;
|
|
||||||
|
|
||||||
cx.condition(|editor, _| editor.context_menu_visible())
|
cx.condition(|editor, _| editor.context_menu_visible())
|
||||||
.await;
|
.await;
|
||||||
let apply_additional_edits = cx.update_editor(|editor, cx| {
|
let apply_additional_edits = cx.update_editor(|editor, cx| {
|
||||||
|
|
|
@ -4446,17 +4446,10 @@ impl Project {
|
||||||
};
|
};
|
||||||
|
|
||||||
cx.spawn(|this, mut cx| async move {
|
cx.spawn(|this, mut cx| async move {
|
||||||
let additional_text_edits = if let Some(edits) =
|
let additional_text_edits = lang_server
|
||||||
completion.lsp_completion.additional_text_edits.as_ref()
|
.request::<lsp::request::ResolveCompletionItem>(completion.lsp_completion)
|
||||||
{
|
.await?
|
||||||
Some(edits.clone())
|
.additional_text_edits;
|
||||||
} else {
|
|
||||||
lang_server
|
|
||||||
.request::<lsp::request::ResolveCompletionItem>(completion.lsp_completion)
|
|
||||||
.await?
|
|
||||||
.additional_text_edits
|
|
||||||
};
|
|
||||||
|
|
||||||
if let Some(edits) = additional_text_edits {
|
if let Some(edits) = additional_text_edits {
|
||||||
let edits = this
|
let edits = this
|
||||||
.update(&mut cx, |this, cx| {
|
.update(&mut cx, |this, cx| {
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue