Subject: [PATCH] Merge pull request #18503 from SomeoneToIgnore/kb/better-resolve-indexing Update the file hash Use completion item indices instead of property matching when searching for the completion item to resolve --- Index: crates/rust-analyzer/src/handlers/request.rs IDEA additional info: Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP <+>UTF-8 =================================================================== diff --git a/crates/rust-analyzer/src/handlers/request.rs b/crates/rust-analyzer/src/handlers/request.rs --- a/crates/rust-analyzer/src/handlers/request.rs (revision 81636f1fd119b253fedc46e65be3e373210f74dd) +++ b/crates/rust-analyzer/src/handlers/request.rs (revision aabab2927418ddd071149166f071859698008e40) @@ -1131,7 +1131,7 @@ else { return Ok(original_completion); }; - let mut resolved_completions = to_proto::completion_items( + let resolved_completions = to_proto::completion_items( &snap.config, &forced_resolve_completions_config.fields_to_resolve, &line_index, @@ -1140,13 +1140,15 @@ resolve_data.trigger_character, resolved_completions, ); - - let mut resolved_completion = - if resolved_completions.get(resolve_data.completion_item_index).is_some() { - resolved_completions.swap_remove(resolve_data.completion_item_index) - } else { - return Ok(original_completion); - }; + let Some(mut resolved_completion) = resolved_completions.into_iter().find(|completion| { + completion.label == original_completion.label + && completion.kind == original_completion.kind + && completion.deprecated == original_completion.deprecated + && completion.preselect == original_completion.preselect + && completion.sort_text == original_completion.sort_text + }) else { + return Ok(original_completion); + }; if !resolve_data.imports.is_empty() { let additional_edits = snap Index: crates/rust-analyzer/src/lsp/ext.rs IDEA additional info: Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP <+>UTF-8 =================================================================== diff --git a/crates/rust-analyzer/src/lsp/ext.rs b/crates/rust-analyzer/src/lsp/ext.rs --- a/crates/rust-analyzer/src/lsp/ext.rs (revision 81636f1fd119b253fedc46e65be3e373210f74dd) +++ b/crates/rust-analyzer/src/lsp/ext.rs (revision aabab2927418ddd071149166f071859698008e40) @@ -826,7 +826,6 @@ pub imports: Vec, pub version: Option, pub trigger_character: Option, - pub completion_item_index: usize, } #[derive(Debug, Serialize, Deserialize)] Index: crates/rust-analyzer/src/lsp/to_proto.rs IDEA additional info: Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP <+>UTF-8 =================================================================== diff --git a/crates/rust-analyzer/src/lsp/to_proto.rs b/crates/rust-analyzer/src/lsp/to_proto.rs --- a/crates/rust-analyzer/src/lsp/to_proto.rs (revision 81636f1fd119b253fedc46e65be3e373210f74dd) +++ b/crates/rust-analyzer/src/lsp/to_proto.rs (revision aabab2927418ddd071149166f071859698008e40) @@ -392,36 +392,18 @@ } else { Vec::new() }; - let (ref_resolve_data, resolve_data) = if something_to_resolve || !imports.is_empty() { - 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 { + if something_to_resolve || !imports.is_empty() { + let data = lsp_ext::CompletionResolveData { position: tdpp.clone(), imports, version, trigger_character: completion_trigger_character, - completion_item_index: item_index, }; - (ref_resolve_data, Some(to_value(resolve_data).unwrap())) - } else { - (None, None) - }; + lsp_item.data = Some(to_value(data).unwrap()); + } if let Some((label, indel, relevance)) = ref_match { - let mut lsp_item_with_ref = - lsp_types::CompletionItem { label, data: ref_resolve_data, ..lsp_item.clone() }; + let mut lsp_item_with_ref = lsp_types::CompletionItem { label, ..lsp_item.clone() }; lsp_item_with_ref .additional_text_edits .get_or_insert_with(Default::default) @@ -430,7 +412,6 @@ acc.push(lsp_item_with_ref); }; - lsp_item.data = resolve_data; acc.push(lsp_item); fn set_score( Index: docs/dev/lsp-extensions.md IDEA additional info: Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP <+>UTF-8 =================================================================== diff --git a/docs/dev/lsp-extensions.md b/docs/dev/lsp-extensions.md --- a/docs/dev/lsp-extensions.md (revision 4b621e030af5ad45510b4f4662d686a51cc6f4a0) +++ b/docs/dev/lsp-extensions.md (revision 81636f1fd119b253fedc46e65be3e373210f74dd) @@ -1,5 +1,5 @@