Skip to content

Commit a9ae0b0

Browse files
bors[bot]avrong
andauthored
Merge #11857
11857: Lower postfix suggestions in completions list r=Veykril a=avrong Fixes #11850 Adds a parameter for postfix suggestions in `CompletionRelevance`, and basing on it, decreases relevance score of such items in completion list Co-authored-by: Aleksei Trifonov <[email protected]>
2 parents 0e02522 + eda4046 commit a9ae0b0

File tree

5 files changed

+57
-30
lines changed

5 files changed

+57
-30
lines changed

crates/ide_completion/src/completions/postfix.rs

+12-9
Original file line numberDiff line numberDiff line change
@@ -12,9 +12,11 @@ use syntax::{
1212
use text_edit::TextEdit;
1313

1414
use crate::{
15-
completions::postfix::format_like::add_format_like_completions, context::CompletionContext,
16-
item::Builder, patterns::ImmediateLocation, CompletionItem, CompletionItemKind,
17-
CompletionRelevance, Completions, SnippetScope,
15+
completions::postfix::format_like::add_format_like_completions,
16+
context::CompletionContext,
17+
item::{Builder, CompletionRelevancePostfixMatch},
18+
patterns::ImmediateLocation,
19+
CompletionItem, CompletionItemKind, CompletionRelevance, Completions, SnippetScope,
1820
};
1921

2022
pub(crate) fn complete_postfix(acc: &mut Completions, ctx: &CompletionContext) {
@@ -240,12 +242,13 @@ fn build_postfix_snippet_builder<'ctx>(
240242
let mut item =
241243
CompletionItem::new(CompletionItemKind::Snippet, ctx.source_range(), label);
242244
item.detail(detail).snippet_edit(cap, edit);
243-
if ctx.original_token.text() == label {
244-
let relevance =
245-
CompletionRelevance { exact_postfix_snippet_match: true, ..Default::default() };
246-
item.set_relevance(relevance);
247-
}
248-
245+
let postfix_match = if ctx.original_token.text() == label {
246+
Some(CompletionRelevancePostfixMatch::Exact)
247+
} else {
248+
Some(CompletionRelevancePostfixMatch::NonExact)
249+
};
250+
let relevance = CompletionRelevance { postfix_match, ..Default::default() };
251+
item.set_relevance(relevance);
249252
item
250253
}
251254
}

crates/ide_completion/src/completions/record.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ use syntax::{ast::Expr, T};
44

55
use crate::{
66
patterns::ImmediateLocation, CompletionContext, CompletionItem, CompletionItemKind,
7-
CompletionRelevance, Completions,
7+
CompletionRelevance, CompletionRelevancePostfixMatch, Completions,
88
};
99

1010
pub(crate) fn complete_record(acc: &mut Completions, ctx: &CompletionContext) -> Option<()> {
@@ -45,7 +45,7 @@ pub(crate) fn complete_record(acc: &mut Completions, ctx: &CompletionContext) ->
4545
let completion_text =
4646
completion_text.strip_prefix(ctx.token.text()).unwrap_or(completion_text);
4747
item.insert_text(completion_text).set_relevance(CompletionRelevance {
48-
exact_postfix_snippet_match: true,
48+
postfix_match: Some(CompletionRelevancePostfixMatch::Exact),
4949
..Default::default()
5050
});
5151
item.add_to(acc);

crates/ide_completion/src/item.rs

+31-13
Original file line numberDiff line numberDiff line change
@@ -143,15 +143,8 @@ pub struct CompletionRelevance {
143143
pub is_op_method: bool,
144144
/// Set for item completions that are private but in the workspace.
145145
pub is_private_editable: bool,
146-
/// This is set in cases like these:
147-
///
148-
/// ```
149-
/// (a > b).not$0
150-
/// ```
151-
///
152-
/// Basically, we want to guarantee that postfix snippets always takes
153-
/// precedence over everything else.
154-
pub exact_postfix_snippet_match: bool,
146+
/// Set for postfix snippet item completions
147+
pub postfix_match: Option<CompletionRelevancePostfixMatch>,
155148
}
156149

157150
#[derive(Debug, Clone, Copy, Eq, PartialEq)]
@@ -178,8 +171,23 @@ pub enum CompletionRelevanceTypeMatch {
178171
Exact,
179172
}
180173

174+
#[derive(Debug, Clone, Copy, Eq, PartialEq)]
175+
pub enum CompletionRelevancePostfixMatch {
176+
/// Set in cases when item is postfix, but not exact
177+
NonExact,
178+
/// This is set in cases like these:
179+
///
180+
/// ```
181+
/// (a > b).not$0
182+
/// ```
183+
///
184+
/// Basically, we want to guarantee that postfix snippets always takes
185+
/// precedence over everything else.
186+
Exact,
187+
}
188+
181189
impl CompletionRelevance {
182-
const BASE_LINE: u32 = 2;
190+
const BASE_LINE: u32 = 3;
183191
/// Provides a relevance score. Higher values are more relevant.
184192
///
185193
/// The absolute value of the relevance score is not meaningful, for
@@ -199,6 +207,9 @@ impl CompletionRelevance {
199207
if self.is_private_editable {
200208
score -= 1;
201209
}
210+
if self.postfix_match.is_some() {
211+
score -= 3;
212+
}
202213

203214
// score increases
204215
if self.exact_name_match {
@@ -212,9 +223,10 @@ impl CompletionRelevance {
212223
if self.is_local {
213224
score += 1;
214225
}
215-
if self.exact_postfix_snippet_match {
226+
if self.postfix_match == Some(CompletionRelevancePostfixMatch::Exact) {
216227
score += 100;
217228
}
229+
218230
score
219231
}
220232

@@ -530,7 +542,9 @@ mod tests {
530542
use itertools::Itertools;
531543
use test_utils::assert_eq_text;
532544

533-
use super::{CompletionRelevance, CompletionRelevanceTypeMatch};
545+
use super::{
546+
CompletionRelevance, CompletionRelevancePostfixMatch, CompletionRelevanceTypeMatch,
547+
};
534548

535549
/// Check that these are CompletionRelevance are sorted in ascending order
536550
/// by their relevance score.
@@ -573,6 +587,10 @@ mod tests {
573587
// This test asserts that the relevance score for these items is ascending, and
574588
// that any items in the same vec have the same score.
575589
let expected_relevance_order = vec![
590+
vec![CompletionRelevance {
591+
postfix_match: Some(CompletionRelevancePostfixMatch::NonExact),
592+
..CompletionRelevance::default()
593+
}],
576594
vec![CompletionRelevance {
577595
is_op_method: true,
578596
is_private_editable: true,
@@ -612,7 +630,7 @@ mod tests {
612630
..CompletionRelevance::default()
613631
}],
614632
vec![CompletionRelevance {
615-
exact_postfix_snippet_match: true,
633+
postfix_match: Some(CompletionRelevancePostfixMatch::Exact),
616634
..CompletionRelevance::default()
617635
}],
618636
];

crates/ide_completion/src/lib.rs

+4-1
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,10 @@ use crate::{completions::Completions, context::CompletionContext};
2828

2929
pub use crate::{
3030
config::CompletionConfig,
31-
item::{CompletionItem, CompletionItemKind, CompletionRelevance, ImportEdit},
31+
item::{
32+
CompletionItem, CompletionItemKind, CompletionRelevance, CompletionRelevancePostfixMatch,
33+
ImportEdit,
34+
},
3235
snippet::{Snippet, SnippetScope},
3336
};
3437

crates/ide_completion/src/render.rs

+8-5
Original file line numberDiff line numberDiff line change
@@ -365,7 +365,7 @@ mod tests {
365365
use crate::{
366366
item::CompletionRelevanceTypeMatch,
367367
tests::{check_edit, do_completion, get_all_items, TEST_CONFIG},
368-
CompletionItem, CompletionItemKind, CompletionRelevance,
368+
CompletionItem, CompletionItemKind, CompletionRelevance, CompletionRelevancePostfixMatch,
369369
};
370370

371371
#[track_caller]
@@ -432,7 +432,10 @@ mod tests {
432432
),
433433
(relevance.exact_name_match, "name"),
434434
(relevance.is_local, "local"),
435-
(relevance.exact_postfix_snippet_match, "snippet"),
435+
(
436+
relevance.postfix_match == Some(CompletionRelevancePostfixMatch::Exact),
437+
"snippet",
438+
),
436439
(relevance.is_op_method, "op_method"),
437440
]
438441
.into_iter()
@@ -614,7 +617,7 @@ fn main() { let _: m::Spam = S$0 }
614617
is_local: false,
615618
is_op_method: false,
616619
is_private_editable: false,
617-
exact_postfix_snippet_match: false,
620+
postfix_match: None,
618621
},
619622
},
620623
CompletionItem {
@@ -635,7 +638,7 @@ fn main() { let _: m::Spam = S$0 }
635638
is_local: false,
636639
is_op_method: false,
637640
is_private_editable: false,
638-
exact_postfix_snippet_match: false,
641+
postfix_match: None,
639642
},
640643
},
641644
]
@@ -722,7 +725,7 @@ fn foo() { A { the$0 } }
722725
is_local: false,
723726
is_op_method: false,
724727
is_private_editable: false,
725-
exact_postfix_snippet_match: false,
728+
postfix_match: None,
726729
},
727730
},
728731
]

0 commit comments

Comments
 (0)