Unnamed repository; edit this file 'description' to name the repository.
Merge #11390
11390: fix: Deprioritize ops function completions for non-method calls r=Veykril a=Veykril Fixes https://github.com/rust-analyzer/rust-analyzer/issues/10593 bors r+ Co-authored-by: Lukas Wirth <[email protected]>
bors[bot] 2022-02-01
parent 4800c05 · parent fcdced1 · commit 9b88956
-rw-r--r--crates/ide_completion/src/render.rs27
-rw-r--r--crates/ide_completion/src/render/function.rs12
2 files changed, 30 insertions, 9 deletions
diff --git a/crates/ide_completion/src/render.rs b/crates/ide_completion/src/render.rs
index 15dacc8e46..5feee48a96 100644
--- a/crates/ide_completion/src/render.rs
+++ b/crates/ide_completion/src/render.rs
@@ -1354,7 +1354,7 @@ fn main() {
}
#[test]
- fn op_method_relevances() {
+ fn op_function_relevances() {
check_relevance(
r#"
#[lang = "sub"]
@@ -1367,7 +1367,30 @@ fn foo(a: u32) { a.$0 }
expect![[r#"
me sub(…) (as Sub) [op_method]
"#]],
- )
+ );
+ check_relevance(
+ r#"
+struct Foo;
+impl Foo {
+ fn new() -> Self {}
+}
+#[lang = "eq"]
+pub trait PartialEq<Rhs: ?Sized = Self> {
+ fn eq(&self, other: &Rhs) -> bool;
+ fn ne(&self, other: &Rhs) -> bool;
+}
+
+impl PartialEq for Foo {}
+fn main() {
+ Foo::$0
+}
+"#,
+ expect![[r#"
+ fn new() []
+ me eq(…) (as PartialEq) [op_method]
+ me ne(…) (as PartialEq) [op_method]
+ "#]],
+ );
}
#[test]
diff --git a/crates/ide_completion/src/render/function.rs b/crates/ide_completion/src/render/function.rs
index fc2cb933db..224d4b054e 100644
--- a/crates/ide_completion/src/render/function.rs
+++ b/crates/ide_completion/src/render/function.rs
@@ -67,16 +67,14 @@ fn render(
);
let ret_type = func.ret_type(db);
+ let is_op_method = func
+ .as_assoc_item(ctx.db())
+ .and_then(|trait_| trait_.containing_trait_or_trait_impl(ctx.db()))
+ .map_or(false, |trait_| completion.is_ops_trait(trait_));
item.set_relevance(CompletionRelevance {
type_match: compute_type_match(completion, &ret_type),
exact_name_match: compute_exact_name_match(completion, &call),
- is_op_method: match func_type {
- FuncType::Method(_) => func
- .as_assoc_item(ctx.db())
- .and_then(|trait_| trait_.containing_trait_or_trait_impl(ctx.db()))
- .map_or(false, |trait_| completion.is_ops_trait(trait_)),
- _ => false,
- },
+ is_op_method,
..CompletionRelevance::default()
});