diff options
| author | rami3l <rami3l@outlook.com> | 2022-12-06 21:40:45 +0800 |
|---|---|---|
| committer | rami3l <rami3l@outlook.com> | 2022-12-06 21:54:53 +0800 |
| commit | fed74c8b71a5116852bf8a42242dee1025c51e78 (patch) | |
| tree | 32dd55ff97c51b6ae66c70ddd9e5732f57949f6c | |
| parent | df07c8fafa78ace4c4d2ded82d561f76a35e0ade (diff) | |
| download | rust-fed74c8b71a5116852bf8a42242dee1025c51e78.tar.gz rust-fed74c8b71a5116852bf8a42242dee1025c51e78.zip | |
fix: add fallback case in generated `PartialEq` impl
| -rw-r--r-- | crates/ide-assists/src/handlers/replace_derive_with_manual_impl.rs | 33 | ||||
| -rw-r--r-- | crates/ide-assists/src/utils/gen_trait_fn_body.rs | 7 |
2 files changed, 33 insertions, 7 deletions
diff --git a/crates/ide-assists/src/handlers/replace_derive_with_manual_impl.rs b/crates/ide-assists/src/handlers/replace_derive_with_manual_impl.rs index 6fa15b28e4e..a1ca2861215 100644 --- a/crates/ide-assists/src/handlers/replace_derive_with_manual_impl.rs +++ b/crates/ide-assists/src/handlers/replace_derive_with_manual_impl.rs @@ -907,7 +907,7 @@ impl PartialEq for Foo { } #[test] - fn add_custom_impl_partial_eq_tuple_enum() { + fn add_custom_impl_partial_eq_partial_tuple_enum() { check_assist( replace_derive_with_manual_impl, r#" @@ -937,6 +937,37 @@ impl PartialEq for Foo { } #[test] + fn add_custom_impl_partial_eq_tuple_enum() { + check_assist( + replace_derive_with_manual_impl, + r#" +//- minicore: eq, derive +#[derive(Partial$0Eq)] +enum Foo { + Bar(String), + Baz(i32), +} +"#, + r#" +enum Foo { + Bar(String), + Baz(i32), +} + +impl PartialEq for Foo { + $0fn eq(&self, other: &Self) -> bool { + match (self, other) { + (Self::Bar(l0), Self::Bar(r0)) => l0 == r0, + (Self::Baz(l0), Self::Baz(r0)) => l0 == r0, + _ => core::mem::discriminant(self) == core::mem::discriminant(other), + } + } +} +"#, + ) + } + + #[test] fn add_custom_impl_partial_eq_record_enum() { check_assist( replace_derive_with_manual_impl, 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 6c87e66c134..287001af84f 100644 --- a/crates/ide-assists/src/utils/gen_trait_fn_body.rs +++ b/crates/ide-assists/src/utils/gen_trait_fn_body.rs @@ -439,10 +439,8 @@ fn gen_partial_eq(adt: &ast::Adt, func: &ast::Fn) -> Option<()> { let eq_check = make::expr_bin_op(lhs, BinaryOp::CmpOp(CmpOp::Eq { negated: false }), rhs); - let mut n_cases = 0; let mut arms = vec![]; for variant in enum_.variant_list()?.variants() { - n_cases += 1; match variant.field_list() { // => (Self::Bar { bin: l_bin }, Self::Bar { bin: r_bin }) => l_bin == r_bin, Some(ast::FieldList::RecordFieldList(list)) => { @@ -517,10 +515,7 @@ fn gen_partial_eq(adt: &ast::Adt, func: &ast::Fn) -> Option<()> { let expr = match arms.len() { 0 => eq_check, _ => { - if n_cases > arms.len() { - let lhs = make::wildcard_pat().into(); - arms.push(make::match_arm(Some(lhs), None, eq_check)); - } + arms.push(make::match_arm(Some(make::wildcard_pat().into()), None, eq_check)); let match_target = make::expr_tuple(vec![lhs_name, rhs_name]); let list = make::match_arm_list(arms).indent(ast::edit::IndentLevel(1)); |
