Skip to content

Commit fa46a9e

Browse files
SomeoneToIgnorelnicola
authored andcommitted
Use completion item indices instead of property matching when searching for the completion item to resolve
1 parent eb6e3fa commit fa46a9e

File tree

3 files changed

+33
-15
lines changed

3 files changed

+33
-15
lines changed

src/tools/rust-analyzer/crates/rust-analyzer/src/handlers/request.rs

+8-10
Original file line numberDiff line numberDiff line change
@@ -1068,7 +1068,7 @@ pub(crate) fn handle_completion_resolve(
10681068
else {
10691069
return Ok(original_completion);
10701070
};
1071-
let resolved_completions = to_proto::completion_items(
1071+
let mut resolved_completions = to_proto::completion_items(
10721072
&snap.config,
10731073
&forced_resolve_completions_config.fields_to_resolve,
10741074
&line_index,
@@ -1077,15 +1077,13 @@ pub(crate) fn handle_completion_resolve(
10771077
resolve_data.trigger_character,
10781078
resolved_completions,
10791079
);
1080-
let Some(mut resolved_completion) = resolved_completions.into_iter().find(|completion| {
1081-
completion.label == original_completion.label
1082-
&& completion.kind == original_completion.kind
1083-
&& completion.deprecated == original_completion.deprecated
1084-
&& completion.preselect == original_completion.preselect
1085-
&& completion.sort_text == original_completion.sort_text
1086-
}) else {
1087-
return Ok(original_completion);
1088-
};
1080+
1081+
let mut resolved_completion =
1082+
if resolved_completions.get(resolve_data.completion_item_index).is_some() {
1083+
resolved_completions.swap_remove(resolve_data.completion_item_index)
1084+
} else {
1085+
return Ok(original_completion);
1086+
};
10891087

10901088
if !resolve_data.imports.is_empty() {
10911089
let additional_edits = snap

src/tools/rust-analyzer/crates/rust-analyzer/src/lsp/ext.rs

+1
Original file line numberDiff line numberDiff line change
@@ -826,6 +826,7 @@ pub struct CompletionResolveData {
826826
pub imports: Vec<CompletionImport>,
827827
pub version: Option<i32>,
828828
pub trigger_character: Option<char>,
829+
pub completion_item_index: usize,
829830
}
830831

831832
#[derive(Debug, Serialize, Deserialize)]

src/tools/rust-analyzer/crates/rust-analyzer/src/lsp/to_proto.rs

+24-5
Original file line numberDiff line numberDiff line change
@@ -391,18 +391,36 @@ fn completion_item(
391391
} else {
392392
Vec::new()
393393
};
394-
if something_to_resolve || !imports.is_empty() {
395-
let data = lsp_ext::CompletionResolveData {
394+
let (ref_resolve_data, resolve_data) = if something_to_resolve || !imports.is_empty() {
395+
let mut item_index = acc.len();
396+
let ref_resolve_data = if ref_match.is_some() {
397+
let ref_resolve_data = lsp_ext::CompletionResolveData {
398+
position: tdpp.clone(),
399+
imports: Vec::new(),
400+
version,
401+
trigger_character: completion_trigger_character,
402+
completion_item_index: item_index,
403+
};
404+
item_index += 1;
405+
Some(to_value(ref_resolve_data).unwrap())
406+
} else {
407+
None
408+
};
409+
let resolve_data = lsp_ext::CompletionResolveData {
396410
position: tdpp.clone(),
397411
imports,
398412
version,
399413
trigger_character: completion_trigger_character,
414+
completion_item_index: item_index,
400415
};
401-
lsp_item.data = Some(to_value(data).unwrap());
402-
}
416+
(ref_resolve_data, Some(to_value(resolve_data).unwrap()))
417+
} else {
418+
(None, None)
419+
};
403420

404421
if let Some((label, indel, relevance)) = ref_match {
405-
let mut lsp_item_with_ref = lsp_types::CompletionItem { label, ..lsp_item.clone() };
422+
let mut lsp_item_with_ref =
423+
lsp_types::CompletionItem { label, data: ref_resolve_data, ..lsp_item.clone() };
406424
lsp_item_with_ref
407425
.additional_text_edits
408426
.get_or_insert_with(Default::default)
@@ -411,6 +429,7 @@ fn completion_item(
411429
acc.push(lsp_item_with_ref);
412430
};
413431

432+
lsp_item.data = resolve_data;
414433
acc.push(lsp_item);
415434

416435
fn set_score(

0 commit comments

Comments
 (0)