Auto merge of #12074 - jonas-schievink:deprioritize-flyimport, r=jonas-schievink

Reduce priority of flyimport completions

Fixes https://github.com/rust-lang/rust-analyzer/issues/12068
This commit is contained in:
bors 2022-04-25 12:35:39 +00:00
commit b24b82fa34
2 changed files with 46 additions and 2 deletions

View file

@ -141,6 +141,8 @@ pub struct CompletionRelevance {
pub is_item_from_trait: bool,
/// This is set when an import is suggested whose name is already imported.
pub is_name_already_imported: bool,
/// This is set for completions that will insert a `use` item.
pub requires_import: bool,
/// Set for method completions of the `core::ops` and `core::cmp` family.
pub is_op_method: bool,
/// Set for item completions that are private but in the workspace.
@ -208,6 +210,7 @@ impl CompletionRelevance {
is_local,
is_item_from_trait,
is_name_already_imported,
requires_import,
is_op_method,
is_private_editable,
postfix_match,
@ -226,6 +229,10 @@ impl CompletionRelevance {
if !is_name_already_imported {
score += 1;
}
// lower rank for items that don't need an import
if !requires_import {
score += 1;
}
if exact_name_match {
score += 10;
}

View file

@ -58,7 +58,11 @@ impl<'a> RenderContext<'a> {
}
fn completion_relevance(&self) -> CompletionRelevance {
CompletionRelevance { is_private_editable: self.is_private_editable, ..Default::default() }
CompletionRelevance {
is_private_editable: self.is_private_editable,
requires_import: self.import_to_add.is_some(),
..Default::default()
}
}
fn is_deprecated(&self, def: impl HasAttrs) -> bool {
@ -247,6 +251,7 @@ fn render_resolution_simple_(
let local_name = local_name.to_smol_str();
let mut item = CompletionItem::new(kind, ctx.source_range(), local_name.clone());
item.set_relevance(ctx.completion_relevance());
if let ScopeDef::Local(local) = resolution {
let ty = local.ty(db);
if !ty.is_unknown() {
@ -446,6 +451,7 @@ mod tests {
"snippet",
),
(relevance.is_op_method, "op_method"),
(relevance.requires_import, "requires_import"),
]
.into_iter()
.filter_map(|(cond, desc)| if cond { Some(desc) } else { None })
@ -626,6 +632,7 @@ fn main() { let _: m::Spam = S$0 }
is_local: false,
is_item_from_trait: false,
is_name_already_imported: false,
requires_import: false,
is_op_method: false,
is_private_editable: false,
postfix_match: None,
@ -650,6 +657,7 @@ fn main() { let _: m::Spam = S$0 }
is_local: false,
is_item_from_trait: false,
is_name_already_imported: false,
requires_import: false,
is_op_method: false,
is_private_editable: false,
postfix_match: None,
@ -740,6 +748,7 @@ fn foo() { A { the$0 } }
is_local: false,
is_item_from_trait: false,
is_name_already_imported: false,
requires_import: false,
is_op_method: false,
is_private_editable: false,
postfix_match: None,
@ -1579,7 +1588,7 @@ fn main() {
&[CompletionItemKind::Snippet, CompletionItemKind::Method],
expect![[r#"
sn not [snippet]
me not() (use ops::Not) [type_could_unify]
me not() (use ops::Not) [type_could_unify+requires_import]
sn if []
sn while []
sn ref []
@ -1621,4 +1630,32 @@ fn main() {
"#]],
);
}
#[test]
fn flyimport_reduced_relevance() {
check_relevance(
r#"
mod std {
pub mod io {
pub trait BufRead {}
pub struct BufReader;
pub struct BufWriter;
}
}
struct Buffer;
fn f() {
Buf$0
}
"#,
expect![[r#"
md std []
st Buffer []
fn f() []
tt BufRead (use std::io::BufRead) [requires_import]
st BufReader (use std::io::BufReader) [requires_import]
st BufWriter (use std::io::BufWriter) [requires_import]
"#]],
);
}
}