about summary refs log tree commit diff
diff options
context:
space:
mode:
authorLukas Wirth <lukastw97@gmail.com>2022-02-01 12:33:55 +0100
committerLukas Wirth <lukastw97@gmail.com>2022-02-01 12:33:55 +0100
commitfcdced115e3b101ed168b175fa63a2a07c1e839c (patch)
treed4307e658a716232215012336231648d23fc47f3
parent4800c05a206eb156617b76fdb30af0b6c2c0fb26 (diff)
downloadrust-fcdced115e3b101ed168b175fa63a2a07c1e839c.tar.gz
rust-fcdced115e3b101ed168b175fa63a2a07c1e839c.zip
Deprioritize ops function completions for non-method calls
-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 15dacc8e462..5feee48a96c 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 fc2cb933db2..224d4b054e0 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()
     });