@@ -61,6 +61,9 @@ pub struct CompletionItem {
6161 pub documentation : Option < Documentation < ' static > > ,
6262
6363 /// Whether this item is marked as deprecated
64+ ///
65+ /// NOTE: this field is used in the LSP protocol. For the use of this information in completion
66+ /// scoring, see [`CompletionRelevance::is_deprecated`].
6467 pub deprecated : bool ,
6568
6669 /// If completing a function call, ask the editor to show parameter popup
@@ -186,6 +189,11 @@ pub struct CompletionRelevance {
186189 pub is_skipping_completion : bool ,
187190 /// if inherent impl already exists in current module, user may not want to implement it again.
188191 pub has_local_inherent_impl : bool ,
192+ /// Set when the completion item is deprecated.
193+ ///
194+ /// NOTE: This is duplicated from [`CompletionItem::deprecated`] in order to allow using this
195+ /// information in the calculation of the relevance score.
196+ pub is_deprecated : bool ,
189197}
190198#[ derive( Debug , Clone , Copy , Eq , PartialEq ) ]
191199pub struct CompletionRelevanceTraitInfo {
@@ -278,6 +286,7 @@ impl CompletionRelevance {
278286 function,
279287 is_skipping_completion,
280288 has_local_inherent_impl,
289+ is_deprecated : _,
281290 } = self ;
282291
283292 // only applicable for completions within use items
@@ -582,6 +591,9 @@ impl Builder {
582591 None => TextEdit :: replace ( self . source_range , insert_text) ,
583592 } ;
584593
594+ // Copy `deprecated` to `self.relevance.is_deprecated`
595+ let relevance = CompletionRelevance { is_deprecated : self . deprecated , ..self . relevance } ;
596+
585597 let import_to_add = self
586598 . imports_to_add
587599 . into_iter ( )
@@ -603,7 +615,7 @@ impl Builder {
603615 kind : self . kind ,
604616 deprecated : self . deprecated ,
605617 trigger_call_info : self . trigger_call_info ,
606- relevance : self . relevance ,
618+ relevance,
607619 ref_match : self . ref_match ,
608620 import_to_add,
609621 }
@@ -674,6 +686,15 @@ impl Builder {
674686 self
675687 }
676688 pub ( crate ) fn set_relevance ( & mut self , relevance : CompletionRelevance ) -> & mut Builder {
689+ // The default value of `CompletionRelevance.is_deprecated` is `false`, so it being `true`
690+ // would mean it was set manually. Advise using the other function instead.
691+ //
692+ // This is technically not necessary, because `deprecated` will get reconciled in
693+ // `Builder::build` anyway -- it just helps keep the callers consistent.
694+ assert ! (
695+ !relevance. is_deprecated,
696+ "`deprecated` should be set using `Builder::set_deprecated` instead"
697+ ) ;
677698 self . relevance = relevance;
678699 self
679700 }
@@ -708,9 +729,25 @@ mod tests {
708729 use test_utils:: assert_eq_text;
709730
710731 use super :: {
711- CompletionRelevance , CompletionRelevancePostfixMatch , CompletionRelevanceTypeMatch ,
732+ CompletionItem , CompletionItemKind , CompletionRelevance , CompletionRelevancePostfixMatch ,
733+ CompletionRelevanceTypeMatch ,
712734 } ;
713735
736+ #[ test]
737+ fn builder_deprecated_from_set_deprecated ( ) {
738+ // setting just `item.deprecated` also sets `item.relevance.is_deprecated`
739+ let mut builder = CompletionItem :: new (
740+ CompletionItemKind :: Expression ,
741+ Default :: default ( ) ,
742+ "" ,
743+ syntax:: Edition :: DEFAULT ,
744+ ) ;
745+ builder. set_deprecated ( true ) ;
746+ let item = builder. build ( & Default :: default ( ) ) ;
747+ assert ! ( item. deprecated) ;
748+ assert ! ( item. relevance. is_deprecated) ;
749+ }
750+
714751 /// Check that these are CompletionRelevance are sorted in ascending order
715752 /// by their relevance score.
716753 ///
0 commit comments