Resolve completions properly (#18212)
Related to https://github.com/rust-lang/rust-analyzer/pull/18167 * Declare more completion item fields in the client completion resolve capabilities * Do resolve completions even if their docs are present * Instead, do not resolve completions that could not be resolved when handling the remote client resolve requests * Do replace the old lsp completion data with the resolved one Release Notes: - Improved completion resolve mechanism
This commit is contained in:
parent
bb7d9d3525
commit
05d18321db
3 changed files with 35 additions and 11 deletions
|
@ -615,8 +615,14 @@ impl LanguageServer {
|
||||||
snippet_support: Some(true),
|
snippet_support: Some(true),
|
||||||
resolve_support: Some(CompletionItemCapabilityResolveSupport {
|
resolve_support: Some(CompletionItemCapabilityResolveSupport {
|
||||||
properties: vec![
|
properties: vec![
|
||||||
"documentation".to_string(),
|
|
||||||
"additionalTextEdits".to_string(),
|
"additionalTextEdits".to_string(),
|
||||||
|
"command".to_string(),
|
||||||
|
"detail".to_string(),
|
||||||
|
"documentation".to_string(),
|
||||||
|
"filterText".to_string(),
|
||||||
|
"labelDetails".to_string(),
|
||||||
|
"tags".to_string(),
|
||||||
|
"textEdit".to_string(),
|
||||||
],
|
],
|
||||||
}),
|
}),
|
||||||
insert_replace_support: Some(true),
|
insert_replace_support: Some(true),
|
||||||
|
|
|
@ -1615,10 +1615,6 @@ impl LspStore {
|
||||||
let (server_id, completion) = {
|
let (server_id, completion) = {
|
||||||
let completions_guard = completions.read();
|
let completions_guard = completions.read();
|
||||||
let completion = &completions_guard[completion_index];
|
let completion = &completions_guard[completion_index];
|
||||||
if completion.documentation.is_some() {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
did_resolve = true;
|
did_resolve = true;
|
||||||
let server_id = completion.server_id;
|
let server_id = completion.server_id;
|
||||||
let completion = completion.lsp_completion.clone();
|
let completion = completion.lsp_completion.clone();
|
||||||
|
@ -1643,10 +1639,6 @@ impl LspStore {
|
||||||
let (server_id, completion) = {
|
let (server_id, completion) = {
|
||||||
let completions_guard = completions.read();
|
let completions_guard = completions.read();
|
||||||
let completion = &completions_guard[completion_index];
|
let completion = &completions_guard[completion_index];
|
||||||
if completion.documentation.is_some() {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
let server_id = completion.server_id;
|
let server_id = completion.server_id;
|
||||||
let completion = completion.lsp_completion.clone();
|
let completion = completion.lsp_completion.clone();
|
||||||
|
|
||||||
|
@ -1743,6 +1735,10 @@ impl LspStore {
|
||||||
completion.lsp_completion.insert_text_format = completion_item.insert_text_format;
|
completion.lsp_completion.insert_text_format = completion_item.insert_text_format;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
let mut completions = completions.write();
|
||||||
|
let completion = &mut completions[completion_index];
|
||||||
|
completion.lsp_completion = completion_item;
|
||||||
}
|
}
|
||||||
|
|
||||||
#[allow(clippy::too_many_arguments)]
|
#[allow(clippy::too_many_arguments)]
|
||||||
|
@ -1771,6 +1767,10 @@ impl LspStore {
|
||||||
else {
|
else {
|
||||||
return;
|
return;
|
||||||
};
|
};
|
||||||
|
let Some(lsp_completion) = serde_json::from_slice(&response.lsp_completion).log_err()
|
||||||
|
else {
|
||||||
|
return;
|
||||||
|
};
|
||||||
|
|
||||||
let documentation = if response.documentation.is_empty() {
|
let documentation = if response.documentation.is_empty() {
|
||||||
Documentation::Undocumented
|
Documentation::Undocumented
|
||||||
|
@ -1787,6 +1787,7 @@ impl LspStore {
|
||||||
let mut completions = completions.write();
|
let mut completions = completions.write();
|
||||||
let completion = &mut completions[completion_index];
|
let completion = &mut completions[completion_index];
|
||||||
completion.documentation = Some(documentation);
|
completion.documentation = Some(documentation);
|
||||||
|
completion.lsp_completion = lsp_completion;
|
||||||
|
|
||||||
let old_range = response
|
let old_range = response
|
||||||
.old_start
|
.old_start
|
||||||
|
@ -4192,17 +4193,32 @@ impl LspStore {
|
||||||
let lsp_completion = serde_json::from_slice(&envelope.payload.lsp_completion)?;
|
let lsp_completion = serde_json::from_slice(&envelope.payload.lsp_completion)?;
|
||||||
|
|
||||||
let completion = this
|
let completion = this
|
||||||
.read_with(&cx, |this, _| {
|
.read_with(&cx, |this, cx| {
|
||||||
let id = LanguageServerId(envelope.payload.language_server_id as usize);
|
let id = LanguageServerId(envelope.payload.language_server_id as usize);
|
||||||
let Some(server) = this.language_server_for_id(id) else {
|
let Some(server) = this.language_server_for_id(id) else {
|
||||||
return Err(anyhow!("No language server {id}"));
|
return Err(anyhow!("No language server {id}"));
|
||||||
};
|
};
|
||||||
|
|
||||||
Ok(server.request::<lsp::request::ResolveCompletionItem>(lsp_completion))
|
Ok(cx.background_executor().spawn(async move {
|
||||||
|
let can_resolve = server
|
||||||
|
.capabilities()
|
||||||
|
.completion_provider
|
||||||
|
.as_ref()
|
||||||
|
.and_then(|options| options.resolve_provider)
|
||||||
|
.unwrap_or(false);
|
||||||
|
if can_resolve {
|
||||||
|
server
|
||||||
|
.request::<lsp::request::ResolveCompletionItem>(lsp_completion)
|
||||||
|
.await
|
||||||
|
} else {
|
||||||
|
anyhow::Ok(lsp_completion)
|
||||||
|
}
|
||||||
|
}))
|
||||||
})??
|
})??
|
||||||
.await?;
|
.await?;
|
||||||
|
|
||||||
let mut documentation_is_markdown = false;
|
let mut documentation_is_markdown = false;
|
||||||
|
let lsp_completion = serde_json::to_string(&completion)?.into_bytes();
|
||||||
let documentation = match completion.documentation {
|
let documentation = match completion.documentation {
|
||||||
Some(lsp::Documentation::String(text)) => text,
|
Some(lsp::Documentation::String(text)) => text,
|
||||||
|
|
||||||
|
@ -4244,6 +4260,7 @@ impl LspStore {
|
||||||
old_start,
|
old_start,
|
||||||
old_end,
|
old_end,
|
||||||
new_text,
|
new_text,
|
||||||
|
lsp_completion,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1219,6 +1219,7 @@ message ResolveCompletionDocumentationResponse {
|
||||||
Anchor old_start = 3;
|
Anchor old_start = 3;
|
||||||
Anchor old_end = 4;
|
Anchor old_end = 4;
|
||||||
string new_text = 5;
|
string new_text = 5;
|
||||||
|
bytes lsp_completion = 6;
|
||||||
}
|
}
|
||||||
|
|
||||||
message ResolveInlayHint {
|
message ResolveInlayHint {
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue