Skip to content

Commit 95eff43

Browse files
committed
impl PartialOrd codegen for C-style enums
1 parent c0263fb commit 95eff43

File tree

2 files changed

+32
-3
lines changed

2 files changed

+32
-3
lines changed

crates/ide_assists/src/handlers/replace_derive_with_manual_impl.rs

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -712,6 +712,35 @@ impl PartialOrd for Foo {
712712
)
713713
}
714714

715+
#[test]
716+
fn add_custom_impl_partial_ord_enum() {
717+
check_assist(
718+
replace_derive_with_manual_impl,
719+
r#"
720+
//- minicore: ord
721+
#[derive(Partial$0Ord)]
722+
enum Foo {
723+
Bin,
724+
Bar,
725+
Baz,
726+
}
727+
"#,
728+
r#"
729+
enum Foo {
730+
Bin,
731+
Bar,
732+
Baz,
733+
}
734+
735+
impl PartialOrd for Foo {
736+
$0fn partial_cmp(&self, other: &Self) -> Option<core::cmp::Ordering> {
737+
core::mem::discriminant(self).partial_cmp(core::mem::discriminant(other))
738+
}
739+
}
740+
"#,
741+
)
742+
}
743+
715744
#[test]
716745
fn add_custom_impl_partial_ord_tuple_struct() {
717746
check_assist(

crates/ide_assists/src/utils/gen_trait_fn_body.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -635,7 +635,7 @@ fn gen_partial_ord(adt: &ast::Adt, func: &ast::Fn) -> Option<()> {
635635
let lhs = make::expr_call(make_discriminant()?, make::arg_list(Some(lhs_name.clone())));
636636
let rhs_name = make::expr_path(make::ext::ident_path("other"));
637637
let rhs = make::expr_call(make_discriminant()?, make::arg_list(Some(rhs_name.clone())));
638-
let eq_check = make::expr_op(ast::BinOp::EqualityTest, lhs, rhs);
638+
let ord_check = gen_partial_cmp_call(lhs, rhs);
639639

640640
let mut case_count = 0;
641641
let mut arms = vec![];
@@ -705,11 +705,11 @@ fn gen_partial_ord(adt: &ast::Adt, func: &ast::Fn) -> Option<()> {
705705
}
706706

707707
let expr = match arms.len() {
708-
0 => eq_check,
708+
0 => ord_check,
709709
_ => {
710710
if case_count > arms.len() {
711711
let lhs = make::wildcard_pat().into();
712-
arms.push(make::match_arm(Some(lhs), None, eq_check));
712+
arms.push(make::match_arm(Some(lhs), None, ord_check));
713713
}
714714

715715
let match_target = make::expr_tuple(vec![lhs_name, rhs_name]);

0 commit comments

Comments
 (0)