Unnamed repository; edit this file 'description' to name the repository.
impl PartialOrd codegen for C-style enums
Yoshua Wuyts 2021-10-12
parent c0263fb · commit 95eff43
-rw-r--r--crates/ide_assists/src/handlers/replace_derive_with_manual_impl.rs29
-rw-r--r--crates/ide_assists/src/utils/gen_trait_fn_body.rs6
2 files changed, 32 insertions, 3 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 27bba8732f..03211f728a 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
@@ -713,6 +713,35 @@ impl PartialOrd for Foo {
}
#[test]
+ fn add_custom_impl_partial_ord_enum() {
+ check_assist(
+ replace_derive_with_manual_impl,
+ r#"
+//- minicore: ord
+#[derive(Partial$0Ord)]
+enum Foo {
+ Bin,
+ Bar,
+ Baz,
+}
+"#,
+ r#"
+enum Foo {
+ Bin,
+ Bar,
+ Baz,
+}
+
+impl PartialOrd for Foo {
+ $0fn partial_cmp(&self, other: &Self) -> Option<core::cmp::Ordering> {
+ core::mem::discriminant(self).partial_cmp(core::mem::discriminant(other))
+ }
+}
+"#,
+ )
+ }
+
+ #[test]
fn add_custom_impl_partial_ord_tuple_struct() {
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 d9a3d23eb5..9bafae46c5 100644
--- a/crates/ide_assists/src/utils/gen_trait_fn_body.rs
+++ b/crates/ide_assists/src/utils/gen_trait_fn_body.rs
@@ -635,7 +635,7 @@ fn gen_partial_ord(adt: &ast::Adt, func: &ast::Fn) -> Option<()> {
let lhs = make::expr_call(make_discriminant()?, make::arg_list(Some(lhs_name.clone())));
let rhs_name = make::expr_path(make::ext::ident_path("other"));
let rhs = make::expr_call(make_discriminant()?, make::arg_list(Some(rhs_name.clone())));
- let eq_check = make::expr_op(ast::BinOp::EqualityTest, lhs, rhs);
+ let ord_check = gen_partial_cmp_call(lhs, rhs);
let mut case_count = 0;
let mut arms = vec![];
@@ -705,11 +705,11 @@ fn gen_partial_ord(adt: &ast::Adt, func: &ast::Fn) -> Option<()> {
}
let expr = match arms.len() {
- 0 => eq_check,
+ 0 => ord_check,
_ => {
if case_count > arms.len() {
let lhs = make::wildcard_pat().into();
- arms.push(make::match_arm(Some(lhs), None, eq_check));
+ arms.push(make::match_arm(Some(lhs), None, ord_check));
}
let match_target = make::expr_tuple(vec![lhs_name, rhs_name]);