Skip to content

Commit 60cc5f2

Browse files
committed
Duplicate CompletionItem.deprecated as CompletionRelevance.is_deprecated
This also adds `deprecated` reconciliation logic to `Builder`
1 parent 378914c commit 60cc5f2

2 files changed

Lines changed: 187 additions & 4 deletions

File tree

crates/ide-completion/src/item.rs

Lines changed: 39 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -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)]
191199
pub 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

Comments
 (0)