@@ -581,6 +581,29 @@ fn gen_partial_ord(adt: &ast::Adt, func: &ast::Fn) -> Option<()> {
581
581
}
582
582
}
583
583
584
+ fn gen_partial_eq_match ( match_target : ast:: Expr ) -> Option < ast:: Stmt > {
585
+ let mut arms = vec ! [ ] ;
586
+
587
+ let variant_name =
588
+ make:: path_pat ( make:: ext:: path_from_idents ( [ "core" , "cmp" , "Ordering" , "Eq" ] ) ?) ;
589
+ let lhs = make:: tuple_struct_pat ( make:: ext:: path_from_idents ( [ "Some" ] ) ?, [ variant_name] ) ;
590
+ arms. push ( make:: match_arm ( Some ( lhs. into ( ) ) , None , make:: expr_empty_block ( ) ) ) ;
591
+
592
+ arms. push ( make:: match_arm (
593
+ [ make:: ident_pat ( false , false , make:: name ( "ord" ) ) . into ( ) ] ,
594
+ None ,
595
+ make:: expr_return ( Some ( make:: expr_path ( make:: ext:: ident_path ( "ord" ) ) ) ) ,
596
+ ) ) ;
597
+ // let rhs = make::expr_path(make::ext::ident_path("other"));
598
+ let list = make:: match_arm_list ( arms) . indent ( ast:: edit:: IndentLevel ( 1 ) ) ;
599
+ Some ( make:: expr_stmt ( make:: expr_match ( match_target, list) ) . into ( ) )
600
+ }
601
+
602
+ fn gen_partial_cmp_call ( lhs : ast:: Expr , rhs : ast:: Expr ) -> ast:: Expr {
603
+ let method = make:: name_ref ( "partial_cmp" ) ;
604
+ make:: expr_method_call ( lhs, method, make:: arg_list ( Some ( rhs) ) )
605
+ }
606
+
584
607
fn gen_record_pat_field ( field_name : & str , pat_name : & str ) -> ast:: RecordPatField {
585
608
let pat = make:: ext:: simple_ident_pat ( make:: name ( & pat_name) ) ;
586
609
let name_ref = make:: name_ref ( field_name) ;
@@ -700,16 +723,22 @@ fn gen_partial_ord(adt: &ast::Adt, func: &ast::Fn) -> Option<()> {
700
723
}
701
724
ast:: Adt :: Struct ( strukt) => match strukt. field_list ( ) {
702
725
Some ( ast:: FieldList :: RecordFieldList ( field_list) ) => {
703
- let mut expr = None ;
726
+ let mut exprs = vec ! [ ] ;
704
727
for field in field_list. fields ( ) {
705
728
let lhs = make:: expr_path ( make:: ext:: ident_path ( "self" ) ) ;
706
729
let lhs = make:: expr_field ( lhs, & field. name ( ) ?. to_string ( ) ) ;
707
730
let rhs = make:: expr_path ( make:: ext:: ident_path ( "other" ) ) ;
708
731
let rhs = make:: expr_field ( rhs, & field. name ( ) ?. to_string ( ) ) ;
709
- let cmp = make :: expr_op ( ast :: BinOp :: EqualityTest , lhs, rhs) ;
710
- expr = gen_eq_chain ( expr , cmp ) ;
732
+ let ord = gen_partial_cmp_call ( lhs, rhs) ;
733
+ exprs . push ( ord ) ;
711
734
}
712
- make:: block_expr ( None , expr) . indent ( ast:: edit:: IndentLevel ( 1 ) )
735
+
736
+ let tail = exprs. pop ( ) ;
737
+ let stmts = exprs
738
+ . into_iter ( )
739
+ . map ( gen_partial_eq_match)
740
+ . collect :: < Option < Vec < ast:: Stmt > > > ( ) ?;
741
+ make:: block_expr ( stmts. into_iter ( ) , tail) . indent ( ast:: edit:: IndentLevel ( 1 ) )
713
742
}
714
743
715
744
Some ( ast:: FieldList :: TupleFieldList ( field_list) ) => {
0 commit comments