From 1c32fcfeb40f64eea0d00f497990553bdb59c4da Mon Sep 17 00:00:00 2001 From: Michael Chisolm Date: Wed, 20 Jul 2022 00:26:50 -0400 Subject: [PATCH] Fix generated `PartialEq::ne` --- .../src/handlers/add_missing_impl_members.rs | 26 +++++++++++++++++++ .../src/utils/gen_trait_fn_body.rs | 5 +++- crates/test-utils/src/minicore.rs | 3 +++ 3 files changed, 33 insertions(+), 1 deletion(-) 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 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, cmp: ast::Expr) -> Option { 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 { fn eq(&self, other: &Rhs) -> bool; + fn ne(&self, other: &Rhs) -> bool { + !self.eq(other) + } } pub trait Eq: PartialEq {}