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 | 44 |
1 files changed, 31 insertions, 13 deletions
diff --git a/crates/ide_completion/src/item.rs b/crates/ide_completion/src/item.rs index 4b9f7d17c3..89cbddbad3 100644 --- a/crates/ide_completion/src/item.rs +++ b/crates/ide_completion/src/item.rs @@ -143,15 +143,8 @@ pub struct CompletionRelevance { pub is_op_method: bool, /// Set for item completions that are private but in the workspace. pub is_private_editable: bool, - /// This is set in cases like these: - /// - /// ``` - /// (a > b).not$0 - /// ``` - /// - /// Basically, we want to guarantee that postfix snippets always takes - /// precedence over everything else. - pub exact_postfix_snippet_match: bool, + /// Set for postfix snippet item completions + pub postfix_match: Option<CompletionRelevancePostfixMatch>, } #[derive(Debug, Clone, Copy, Eq, PartialEq)] @@ -178,8 +171,23 @@ pub enum CompletionRelevanceTypeMatch { Exact, } +#[derive(Debug, Clone, Copy, Eq, PartialEq)] +pub enum CompletionRelevancePostfixMatch { + /// Set in cases when item is postfix, but not exact + NonExact, + /// This is set in cases like these: + /// + /// ``` + /// (a > b).not$0 + /// ``` + /// + /// Basically, we want to guarantee that postfix snippets always takes + /// precedence over everything else. + Exact, +} + impl CompletionRelevance { - const BASE_LINE: u32 = 2; + const BASE_LINE: u32 = 3; /// Provides a relevance score. Higher values are more relevant. /// /// The absolute value of the relevance score is not meaningful, for @@ -199,6 +207,9 @@ impl CompletionRelevance { if self.is_private_editable { score -= 1; } + if self.postfix_match.is_some() { + score -= 3; + } // score increases if self.exact_name_match { @@ -212,9 +223,10 @@ impl CompletionRelevance { if self.is_local { score += 1; } - if self.exact_postfix_snippet_match { + if self.postfix_match == Some(CompletionRelevancePostfixMatch::Exact) { score += 100; } + score } @@ -530,7 +542,9 @@ mod tests { use itertools::Itertools; use test_utils::assert_eq_text; - use super::{CompletionRelevance, CompletionRelevanceTypeMatch}; + use super::{ + CompletionRelevance, CompletionRelevancePostfixMatch, CompletionRelevanceTypeMatch, + }; /// Check that these are CompletionRelevance are sorted in ascending order /// by their relevance score. @@ -574,6 +588,10 @@ mod tests { // that any items in the same vec have the same score. let expected_relevance_order = vec![ vec![CompletionRelevance { + postfix_match: Some(CompletionRelevancePostfixMatch::NonExact), + ..CompletionRelevance::default() + }], + vec![CompletionRelevance { is_op_method: true, is_private_editable: true, ..CompletionRelevance::default() @@ -612,7 +630,7 @@ mod tests { ..CompletionRelevance::default() }], vec![CompletionRelevance { - exact_postfix_snippet_match: true, + postfix_match: Some(CompletionRelevancePostfixMatch::Exact), ..CompletionRelevance::default() }], ]; |