Merge pull request #18503 from SomeoneToIgnore/kb/better-resolve-indexing

Use completion item indices instead of property matching when searching for the completion item to resolve
This commit is contained in:
Laurențiu Nicola 2024-11-11 16:31:11 +00:00 committed by GitHub
commit 61dba0292d
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
4 changed files with 34 additions and 16 deletions

View File

@ -1131,7 +1131,7 @@ pub(crate) fn handle_completion_resolve(
else { else {
return Ok(original_completion); return Ok(original_completion);
}; };
let resolved_completions = to_proto::completion_items( let mut resolved_completions = to_proto::completion_items(
&snap.config, &snap.config,
&forced_resolve_completions_config.fields_to_resolve, &forced_resolve_completions_config.fields_to_resolve,
&line_index, &line_index,
@ -1140,15 +1140,13 @@ pub(crate) fn handle_completion_resolve(
resolve_data.trigger_character, resolve_data.trigger_character,
resolved_completions, resolved_completions,
); );
let Some(mut resolved_completion) = resolved_completions.into_iter().find(|completion| {
completion.label == original_completion.label let mut resolved_completion =
&& completion.kind == original_completion.kind if resolved_completions.get(resolve_data.completion_item_index).is_some() {
&& completion.deprecated == original_completion.deprecated resolved_completions.swap_remove(resolve_data.completion_item_index)
&& completion.preselect == original_completion.preselect } else {
&& completion.sort_text == original_completion.sort_text return Ok(original_completion);
}) else { };
return Ok(original_completion);
};
if !resolve_data.imports.is_empty() { if !resolve_data.imports.is_empty() {
let additional_edits = snap let additional_edits = snap

View File

@ -826,6 +826,7 @@ pub struct CompletionResolveData {
pub imports: Vec<CompletionImport>, pub imports: Vec<CompletionImport>,
pub version: Option<i32>, pub version: Option<i32>,
pub trigger_character: Option<char>, pub trigger_character: Option<char>,
pub completion_item_index: usize,
} }
#[derive(Debug, Serialize, Deserialize)] #[derive(Debug, Serialize, Deserialize)]

View File

@ -392,18 +392,36 @@ fn completion_item(
} else { } else {
Vec::new() Vec::new()
}; };
if something_to_resolve || !imports.is_empty() { let (ref_resolve_data, resolve_data) = if something_to_resolve || !imports.is_empty() {
let data = lsp_ext::CompletionResolveData { let mut item_index = acc.len();
let ref_resolve_data = if ref_match.is_some() {
let ref_resolve_data = lsp_ext::CompletionResolveData {
position: tdpp.clone(),
imports: Vec::new(),
version,
trigger_character: completion_trigger_character,
completion_item_index: item_index,
};
item_index += 1;
Some(to_value(ref_resolve_data).unwrap())
} else {
None
};
let resolve_data = lsp_ext::CompletionResolveData {
position: tdpp.clone(), position: tdpp.clone(),
imports, imports,
version, version,
trigger_character: completion_trigger_character, trigger_character: completion_trigger_character,
completion_item_index: item_index,
}; };
lsp_item.data = Some(to_value(data).unwrap()); (ref_resolve_data, Some(to_value(resolve_data).unwrap()))
} } else {
(None, None)
};
if let Some((label, indel, relevance)) = ref_match { if let Some((label, indel, relevance)) = ref_match {
let mut lsp_item_with_ref = lsp_types::CompletionItem { label, ..lsp_item.clone() }; let mut lsp_item_with_ref =
lsp_types::CompletionItem { label, data: ref_resolve_data, ..lsp_item.clone() };
lsp_item_with_ref lsp_item_with_ref
.additional_text_edits .additional_text_edits
.get_or_insert_with(Default::default) .get_or_insert_with(Default::default)
@ -412,6 +430,7 @@ fn completion_item(
acc.push(lsp_item_with_ref); acc.push(lsp_item_with_ref);
}; };
lsp_item.data = resolve_data;
acc.push(lsp_item); acc.push(lsp_item);
fn set_score( fn set_score(

View File

@ -1,5 +1,5 @@
<!--- <!---
lsp/ext.rs hash: 90cf7718d54fe3c2 lsp/ext.rs hash: 96f88b7a5d0080c6
If you need to change the above hash to make the test pass, please check if you If you need to change the above hash to make the test pass, please check if you
need to adjust this doc as well and ping this issue: need to adjust this doc as well and ping this issue: