mirror of
https://github.com/zed-industries/zed.git
synced 2025-02-11 04:36:24 +00:00
Draft the postfix completions support
This commit is contained in:
parent
99c2395a86
commit
6d96c6ef51
2 changed files with 101 additions and 10 deletions
|
@ -7223,6 +7223,97 @@ async fn test_language_server_restart_due_to_settings_change(cx: &mut gpui::Test
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[gpui::test]
|
||||||
|
async fn test_completions_with_extra_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![
|
||||||
|
task_completion_item,
|
||||||
|
])))
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
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)ˇ; }"});
|
||||||
|
|
||||||
|
cx.handle_request::<lsp::request::ResolveCompletionItem, _, _>(move |_, _, _| {
|
||||||
|
let task_completion_item = completion_item.clone();
|
||||||
|
async move { Ok(task_completion_item) }
|
||||||
|
})
|
||||||
|
.next()
|
||||||
|
.await
|
||||||
|
.unwrap();
|
||||||
|
apply_additional_edits.await.unwrap();
|
||||||
|
cx.assert_editor_state(indoc! {"fn main() { let a = Some(2)ˇ; }"});
|
||||||
|
}
|
||||||
|
|
||||||
fn empty_range(row: usize, column: usize) -> Range<DisplayPoint> {
|
fn empty_range(row: usize, column: usize) -> Range<DisplayPoint> {
|
||||||
let point = DisplayPoint::new(row as u32, column as u32);
|
let point = DisplayPoint::new(row as u32, column as u32);
|
||||||
point..point
|
point..point
|
||||||
|
|
|
@ -1349,7 +1349,6 @@ impl LspCommand for GetCompletions {
|
||||||
} else {
|
} else {
|
||||||
Default::default()
|
Default::default()
|
||||||
};
|
};
|
||||||
|
|
||||||
let completions = buffer.read_with(&cx, |buffer, _| {
|
let completions = buffer.read_with(&cx, |buffer, _| {
|
||||||
let language = buffer.language().cloned();
|
let language = buffer.language().cloned();
|
||||||
let snapshot = buffer.snapshot();
|
let snapshot = buffer.snapshot();
|
||||||
|
@ -1358,15 +1357,16 @@ impl LspCommand for GetCompletions {
|
||||||
completions
|
completions
|
||||||
.into_iter()
|
.into_iter()
|
||||||
.filter_map(move |mut lsp_completion| {
|
.filter_map(move |mut lsp_completion| {
|
||||||
// For now, we can only handle additional edits if they are returned
|
// TODO kb store these? at least, should only allow this when we have resolve
|
||||||
// when resolving the completion, not if they are present initially.
|
// // For now, we can only handle additional edits if they are returned
|
||||||
if lsp_completion
|
// // when resolving the completion, not if they are present initially.
|
||||||
.additional_text_edits
|
// if lsp_completion
|
||||||
.as_ref()
|
// .additional_text_edits
|
||||||
.map_or(false, |edits| !edits.is_empty())
|
// .as_ref()
|
||||||
{
|
// .map_or(false, |edits| !edits.is_empty())
|
||||||
return None;
|
// {
|
||||||
}
|
// return None;
|
||||||
|
// }
|
||||||
|
|
||||||
let (old_range, mut new_text) = match lsp_completion.text_edit.as_ref() {
|
let (old_range, mut new_text) = match lsp_completion.text_edit.as_ref() {
|
||||||
// If the language server provides a range to overwrite, then
|
// If the language server provides a range to overwrite, then
|
||||||
|
|
Loading…
Reference in a new issue