about summary refs log tree commit diff
diff options
context:
space:
mode:
authorMichael Chisolm <aj2vm@yahoo.com>2022-07-20 00:26:50 -0400
committerMichael Chisolm <aj2vm@yahoo.com>2022-07-20 00:26:50 -0400
commit1c32fcfeb40f64eea0d00f497990553bdb59c4da (patch)
tree2e0abfdfd4287a97229dfb31d6ecc5dc2036f7ea
parent0e7135615f9a9878269853861890b7baf26ba14b (diff)
downloadrust-1c32fcfeb40f64eea0d00f497990553bdb59c4da.tar.gz
rust-1c32fcfeb40f64eea0d00f497990553bdb59c4da.zip
Fix generated `PartialEq::ne`
-rw-r--r--crates/ide-assists/src/handlers/add_missing_impl_members.rs26
-rw-r--r--crates/ide-assists/src/utils/gen_trait_fn_body.rs5
-rw-r--r--crates/test-utils/src/minicore.rs3
3 files changed, 33 insertions, 1 deletions
diff --git a/crates/ide-assists/src/handlers/add_missing_impl_members.rs b/crates/ide-assists/src/handlers/add_missing_impl_members.rs
index 573c362c818..6e6fd96a684 100644
--- a/crates/ide-assists/src/handlers/add_missing_impl_members.rs
+++ b/crates/ide-assists/src/handlers/add_missing_impl_members.rs
@@ -1305,4 +1305,30 @@ impl Trait<u32> for Impl {
 }"#,
         );
     }
+
+    #[test]
+    fn test_default_partial_eq() {
+        check_assist(
+            add_missing_default_members,
+            r#"
+//- minicore: eq
+struct SomeStruct {
+    data: usize,
+    field: (usize, usize),
+}
+impl PartialEq for SomeStruct {$0}
+"#,
+            r#"
+struct SomeStruct {
+    data: usize,
+    field: (usize, usize),
+}
+impl PartialEq for SomeStruct {
+    $0fn ne(&self, other: &Self) -> bool {
+            !self.eq(other)
+        }
+}
+"#,
+        );
+    }
 }
diff --git a/crates/ide-assists/src/utils/gen_trait_fn_body.rs b/crates/ide-assists/src/utils/gen_trait_fn_body.rs
index 30b994806ba..ec4835969f8 100644
--- a/crates/ide-assists/src/utils/gen_trait_fn_body.rs
+++ b/crates/ide-assists/src/utils/gen_trait_fn_body.rs
@@ -394,6 +394,9 @@ fn gen_hash_impl(adt: &ast::Adt, func: &ast::Fn) -> Option<()> {
 
 /// Generate a `PartialEq` impl based on the fields and members of the target type.
 fn gen_partial_eq(adt: &ast::Adt, func: &ast::Fn) -> Option<()> {
+    if func.name().map_or(false, |name| name.text() == "ne") {
+        return None;
+    }
     fn gen_eq_chain(expr: Option<ast::Expr>, cmp: ast::Expr) -> Option<ast::Expr> {
         match expr {
             Some(expr) => Some(make::expr_bin_op(expr, BinaryOp::LogicOp(LogicOp::And), cmp)),
@@ -424,7 +427,7 @@ fn gen_partial_eq(adt: &ast::Adt, func: &ast::Fn) -> Option<()> {
     // generate this code `Self` for the time being.
 
     let body = match adt {
-        // `Hash` cannot be derived for unions, so no default impl can be provided.
+        // `PartialEq` cannot be derived for unions, so no default impl can be provided.
         ast::Adt::Union(_) => return None,
 
         ast::Adt::Enum(enum_) => {
diff --git a/crates/test-utils/src/minicore.rs b/crates/test-utils/src/minicore.rs
index 8474014a2cb..f48d1ec66aa 100644
--- a/crates/test-utils/src/minicore.rs
+++ b/crates/test-utils/src/minicore.rs
@@ -354,6 +354,9 @@ pub mod cmp {
     #[lang = "eq"]
     pub trait PartialEq<Rhs: ?Sized = Self> {
         fn eq(&self, other: &Rhs) -> bool;
+        fn ne(&self, other: &Rhs) -> bool {
+            !self.eq(other)
+        }
     }
 
     pub trait Eq: PartialEq<Self> {}