Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'crates/ide-completion/src/item.rs')
| -rw-r--r-- | crates/ide-completion/src/item.rs | 46 |
1 files changed, 44 insertions, 2 deletions
diff --git a/crates/ide-completion/src/item.rs b/crates/ide-completion/src/item.rs index 6abf4f632a..6b34bf07bb 100644 --- a/crates/ide-completion/src/item.rs +++ b/crates/ide-completion/src/item.rs @@ -61,6 +61,9 @@ pub struct CompletionItem { pub documentation: Option<Documentation<'static>>, /// Whether this item is marked as deprecated + /// + /// NOTE: this field is used in the LSP protocol. For the use of this information in completion + /// scoring, see [`CompletionRelevance::is_deprecated`]. pub deprecated: bool, /// If completing a function call, ask the editor to show parameter popup @@ -194,6 +197,11 @@ pub struct CompletionRelevance { pub is_skipping_completion: bool, /// if inherent impl already exists in current module, user may not want to implement it again. pub has_local_inherent_impl: bool, + /// Set when the completion item is deprecated. + /// + /// NOTE: This is duplicated from [`CompletionItem::deprecated`] in order to allow using this + /// information in the calculation of the relevance score. + pub is_deprecated: bool, } #[derive(Debug, Clone, Copy, Eq, PartialEq)] pub struct CompletionRelevanceTraitInfo { @@ -286,6 +294,7 @@ impl CompletionRelevance { function, is_skipping_completion, has_local_inherent_impl, + is_deprecated, } = self; // only applicable for completions within use items @@ -362,6 +371,11 @@ impl CompletionRelevance { score -= 5; } + // lower rank for deprecated items + if is_deprecated { + score -= 5; + } + score } @@ -590,6 +604,9 @@ impl Builder { None => TextEdit::replace(self.source_range, insert_text), }; + // Copy `deprecated` to `self.relevance.is_deprecated` + let relevance = CompletionRelevance { is_deprecated: self.deprecated, ..self.relevance }; + let import_to_add = self .imports_to_add .into_iter() @@ -622,7 +639,7 @@ impl Builder { kind: self.kind, deprecated: self.deprecated, trigger_call_info: self.trigger_call_info, - relevance: self.relevance, + relevance, ref_match: self.ref_match, import_to_add, } @@ -693,6 +710,15 @@ impl Builder { self } pub(crate) fn set_relevance(&mut self, relevance: CompletionRelevance) -> &mut Builder { + // The default value of `CompletionRelevance.is_deprecated` is `false`, so it being `true` + // would mean it was set manually. Advise using the other function instead. + // + // This is technically not necessary, because `deprecated` will get reconciled in + // `Builder::build` anyway -- it just helps keep the callers consistent. + assert!( + !relevance.is_deprecated, + "`deprecated` should be set using `Builder::set_deprecated` instead" + ); self.relevance = relevance; self } @@ -727,9 +753,25 @@ mod tests { use test_utils::assert_eq_text; use super::{ - CompletionRelevance, CompletionRelevancePostfixMatch, CompletionRelevanceTypeMatch, + CompletionItem, CompletionItemKind, CompletionRelevance, CompletionRelevancePostfixMatch, + CompletionRelevanceTypeMatch, }; + #[test] + fn builder_deprecated_from_set_deprecated() { + // setting just `item.deprecated` also sets `item.relevance.is_deprecated` + let mut builder = CompletionItem::new( + CompletionItemKind::Expression, + Default::default(), + "", + syntax::Edition::DEFAULT, + ); + builder.set_deprecated(true); + let item = builder.build(&Default::default()); + assert!(item.deprecated); + assert!(item.relevance.is_deprecated); + } + /// Check that these are CompletionRelevance are sorted in ascending order /// by their relevance score. /// |