Use completion item indices instead of property matching when searching for the completion item to resolve

This commit is contained in:
Kirill Bulatov 2024-11-11 15:50:04 +01:00
parent aabab29274
commit 81636f1fd1
3 changed files with 33 additions and 15 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(