Skip to content

Commit b24b82f

Browse files
committed
Auto merge of rust-lang#12074 - jonas-schievink:deprioritize-flyimport, r=jonas-schievink
Reduce priority of flyimport completions Fixes rust-lang/rust-analyzer#12068
2 parents c1de78f + 3a83684 commit b24b82f

File tree

2 files changed

+46
-2
lines changed

2 files changed

+46
-2
lines changed

crates/ide_completion/src/item.rs

+7
Original file line numberDiff line numberDiff line change
@@ -141,6 +141,8 @@ pub struct CompletionRelevance {
141141
pub is_item_from_trait: bool,
142142
/// This is set when an import is suggested whose name is already imported.
143143
pub is_name_already_imported: bool,
144+
/// This is set for completions that will insert a `use` item.
145+
pub requires_import: bool,
144146
/// Set for method completions of the `core::ops` and `core::cmp` family.
145147
pub is_op_method: bool,
146148
/// Set for item completions that are private but in the workspace.
@@ -208,6 +210,7 @@ impl CompletionRelevance {
208210
is_local,
209211
is_item_from_trait,
210212
is_name_already_imported,
213+
requires_import,
211214
is_op_method,
212215
is_private_editable,
213216
postfix_match,
@@ -226,6 +229,10 @@ impl CompletionRelevance {
226229
if !is_name_already_imported {
227230
score += 1;
228231
}
232+
// lower rank for items that don't need an import
233+
if !requires_import {
234+
score += 1;
235+
}
229236
if exact_name_match {
230237
score += 10;
231238
}

crates/ide_completion/src/render.rs

+39-2
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,11 @@ impl<'a> RenderContext<'a> {
5858
}
5959

6060
fn completion_relevance(&self) -> CompletionRelevance {
61-
CompletionRelevance { is_private_editable: self.is_private_editable, ..Default::default() }
61+
CompletionRelevance {
62+
is_private_editable: self.is_private_editable,
63+
requires_import: self.import_to_add.is_some(),
64+
..Default::default()
65+
}
6266
}
6367

6468
fn is_deprecated(&self, def: impl HasAttrs) -> bool {
@@ -247,6 +251,7 @@ fn render_resolution_simple_(
247251

248252
let local_name = local_name.to_smol_str();
249253
let mut item = CompletionItem::new(kind, ctx.source_range(), local_name.clone());
254+
item.set_relevance(ctx.completion_relevance());
250255
if let ScopeDef::Local(local) = resolution {
251256
let ty = local.ty(db);
252257
if !ty.is_unknown() {
@@ -446,6 +451,7 @@ mod tests {
446451
"snippet",
447452
),
448453
(relevance.is_op_method, "op_method"),
454+
(relevance.requires_import, "requires_import"),
449455
]
450456
.into_iter()
451457
.filter_map(|(cond, desc)| if cond { Some(desc) } else { None })
@@ -626,6 +632,7 @@ fn main() { let _: m::Spam = S$0 }
626632
is_local: false,
627633
is_item_from_trait: false,
628634
is_name_already_imported: false,
635+
requires_import: false,
629636
is_op_method: false,
630637
is_private_editable: false,
631638
postfix_match: None,
@@ -650,6 +657,7 @@ fn main() { let _: m::Spam = S$0 }
650657
is_local: false,
651658
is_item_from_trait: false,
652659
is_name_already_imported: false,
660+
requires_import: false,
653661
is_op_method: false,
654662
is_private_editable: false,
655663
postfix_match: None,
@@ -740,6 +748,7 @@ fn foo() { A { the$0 } }
740748
is_local: false,
741749
is_item_from_trait: false,
742750
is_name_already_imported: false,
751+
requires_import: false,
743752
is_op_method: false,
744753
is_private_editable: false,
745754
postfix_match: None,
@@ -1579,7 +1588,7 @@ fn main() {
15791588
&[CompletionItemKind::Snippet, CompletionItemKind::Method],
15801589
expect![[r#"
15811590
sn not [snippet]
1582-
me not() (use ops::Not) [type_could_unify]
1591+
me not() (use ops::Not) [type_could_unify+requires_import]
15831592
sn if []
15841593
sn while []
15851594
sn ref []
@@ -1621,4 +1630,32 @@ fn main() {
16211630
"#]],
16221631
);
16231632
}
1633+
1634+
#[test]
1635+
fn flyimport_reduced_relevance() {
1636+
check_relevance(
1637+
r#"
1638+
mod std {
1639+
pub mod io {
1640+
pub trait BufRead {}
1641+
pub struct BufReader;
1642+
pub struct BufWriter;
1643+
}
1644+
}
1645+
struct Buffer;
1646+
1647+
fn f() {
1648+
Buf$0
1649+
}
1650+
"#,
1651+
expect![[r#"
1652+
md std []
1653+
st Buffer []
1654+
fn f() []
1655+
tt BufRead (use std::io::BufRead) [requires_import]
1656+
st BufReader (use std::io::BufReader) [requires_import]
1657+
st BufWriter (use std::io::BufWriter) [requires_import]
1658+
"#]],
1659+
);
1660+
}
16241661
}

0 commit comments

Comments
 (0)