Unnamed repository; edit this file 'description' to name the repository.
Merge pull request #22503 from ChayimFriedman2/lower-variant
fix: Try to improve completion ranking
Lukas Wirth 4 weeks ago
parent d1a54ad · parent b58caa7 · commit 2eac062
-rw-r--r--crates/ide-completion/src/item.rs58
-rw-r--r--crates/ide-completion/src/render.rs8
-rw-r--r--crates/ide-completion/src/tests/expression.rs54
3 files changed, 93 insertions, 27 deletions
diff --git a/crates/ide-completion/src/item.rs b/crates/ide-completion/src/item.rs
index f54c8dd8b0..61281f8cfb 100644
--- a/crates/ide-completion/src/item.rs
+++ b/crates/ide-completion/src/item.rs
@@ -304,19 +304,19 @@ impl CompletionRelevance {
// only applicable for completions within use items
// lower rank for conflicting import names
if is_name_already_imported {
- score -= 1;
+ score -= 15;
}
// slightly prefer locals
if is_local {
- score += 1;
+ score += 2;
}
if is_missing {
- score += 1;
+ score += 2;
}
// lower rank private things
if !is_private_editable {
- score += 1;
+ score += 10;
}
if let Some(trait_) = trait_ {
@@ -337,10 +337,10 @@ impl CompletionRelevance {
// lower rank for items that need an import
if requires_import {
- score -= 1;
+ score -= 12;
}
if exact_name_match {
- score += 20;
+ score += 40;
}
match postfix_match {
Some(CompletionRelevancePostfixMatch::Exact) => score += 100,
@@ -348,16 +348,26 @@ impl CompletionRelevance {
None => (),
};
score += match type_match {
- Some(CompletionRelevanceTypeMatch::Exact) => 18,
- Some(CompletionRelevanceTypeMatch::CouldUnify) => 5,
+ Some(CompletionRelevanceTypeMatch::Exact) => 35,
+ Some(CompletionRelevanceTypeMatch::CouldUnify) => 15,
None => 0,
};
if let Some(function) = function {
- let mut fn_score = match function.return_type {
- CompletionRelevanceReturnType::DirectConstructor => 15,
- CompletionRelevanceReturnType::Builder => 10,
- CompletionRelevanceReturnType::Constructor => 5,
- CompletionRelevanceReturnType::Other => 0u32,
+ let mut fn_score = if requires_import {
+ // Rank constructors that require imports lower than those who don't.
+ match function.return_type {
+ CompletionRelevanceReturnType::DirectConstructor => 8,
+ CompletionRelevanceReturnType::Builder => 5,
+ CompletionRelevanceReturnType::Constructor => 3,
+ CompletionRelevanceReturnType::Other => 0u32,
+ }
+ } else {
+ match function.return_type {
+ CompletionRelevanceReturnType::DirectConstructor => 15,
+ CompletionRelevanceReturnType::Builder => 10,
+ CompletionRelevanceReturnType::Constructor => 5,
+ CompletionRelevanceReturnType::Other => 0u32,
+ }
};
// When a fn is bumped due to return type:
@@ -375,12 +385,12 @@ impl CompletionRelevance {
};
if has_local_inherent_impl {
- score -= 5;
+ score -= 8;
}
// lower rank for deprecated items
if is_deprecated {
- score -= 5;
+ score -= 15;
}
score
@@ -831,15 +841,17 @@ mod tests {
is_private_editable: true,
..default
}],
- vec![Cr {
- trait_: Some(crate::item::CompletionRelevanceTraitInfo {
- notable_trait: false,
- is_op_method: true,
- }),
- ..default
- }],
+ vec![
+ Cr {
+ trait_: Some(crate::item::CompletionRelevanceTraitInfo {
+ notable_trait: false,
+ is_op_method: true,
+ }),
+ ..default
+ },
+ Cr { is_private_editable: true, ..default },
+ ],
vec![Cr { postfix_match: Some(CompletionRelevancePostfixMatch::NonExact), ..default }],
- vec![Cr { is_private_editable: true, ..default }],
vec![default],
vec![Cr { is_local: true, ..default }],
vec![Cr { type_match: Some(CompletionRelevanceTypeMatch::CouldUnify), ..default }],
diff --git a/crates/ide-completion/src/render.rs b/crates/ide-completion/src/render.rs
index bb92aad184..e48847c983 100644
--- a/crates/ide-completion/src/render.rs
+++ b/crates/ide-completion/src/render.rs
@@ -1071,12 +1071,12 @@ fn main() {
"#,
expect![[r#"
ev dep::test_mod_b::Enum::Variant dep::test_mod_b::Enum::Variant [type]
- ev Variant Variant [type+requires_import]
ex dep::test_mod_b::Enum::Variant [type]
- ev Variant Variant [requires_import]
+ ev Variant Variant [type+requires_import]
md dep:: []
fn main() fn() []
fn test(…) fn(Enum) []
+ ev Variant Variant [requires_import]
"#]],
);
}
@@ -3989,11 +3989,11 @@ fn foo() {
}
"#,
expect![[r#"
- ev Foo::B Foo::B [type_could_unify]
- ev Foo::A(…) Foo::A(T) [type_could_unify]
lc foo Foo<u32> [type+local]
ex Foo::B [type]
ex foo [type]
+ ev Foo::B Foo::B [type_could_unify]
+ ev Foo::A(…) Foo::A(T) [type_could_unify]
en Foo Foo<T> [type_could_unify]
fn baz() fn() -> Foo<T> [type_could_unify]
fn bar() fn() -> Foo<u8> []
diff --git a/crates/ide-completion/src/tests/expression.rs b/crates/ide-completion/src/tests/expression.rs
index 3d4ad78c34..e49afa66ad 100644
--- a/crates/ide-completion/src/tests/expression.rs
+++ b/crates/ide-completion/src/tests/expression.rs
@@ -4055,3 +4055,57 @@ fn test<H: Test1>(test: H) {
expect![""],
);
}
+
+#[test]
+fn imported_enum_variant_has_lower_priority() {
+ check(
+ r#"
+pub struct String {}
+mod foo {
+ pub enum Foo { String }
+}
+fn main() {
+ Strin$0
+}
+ "#,
+ expect![[r#"
+ fn main() fn()
+ md foo::
+ st String String
+ ev String (use foo::Foo::String) String
+ bt u32 u32
+ kw async
+ kw const
+ kw crate::
+ kw enum
+ kw extern
+ kw false
+ kw fn
+ kw for
+ kw if
+ kw if let
+ kw impl
+ kw impl for
+ kw let
+ kw letm
+ kw loop
+ kw match
+ kw mod
+ kw return
+ kw self::
+ kw static
+ kw struct
+ kw trait
+ kw true
+ kw type
+ kw union
+ kw unsafe
+ kw use
+ kw while
+ kw while let
+ sn macro_rules
+ sn pd
+ sn ppd
+ "#]],
+ );
+}