@@ -574,154 +574,24 @@ fn gen_partial_eq(adt: &ast::Adt, func: &ast::Fn) -> Option<()> {
574
574
}
575
575
576
576
fn gen_partial_ord ( adt : & ast:: Adt , func : & ast:: Fn ) -> Option < ( ) > {
577
- fn gen_partial_cmp_call ( lhs : ast:: Expr , rhs : ast:: Expr ) -> ast:: Expr {
578
- let method = make:: name_ref ( "partial_cmp" ) ;
579
- make:: expr_method_call ( lhs, method, make:: arg_list ( Some ( rhs) ) )
580
- }
581
- fn gen_partial_cmp_call2 ( mut lhs : Vec < ast:: Expr > , mut rhs : Vec < ast:: Expr > ) -> ast:: Expr {
577
+ fn gen_partial_cmp_call ( mut lhs : Vec < ast:: Expr > , mut rhs : Vec < ast:: Expr > ) -> ast:: Expr {
582
578
let ( lhs, rhs) = match ( lhs. len ( ) , rhs. len ( ) ) {
583
579
( 1 , 1 ) => ( lhs. pop ( ) . unwrap ( ) , rhs. pop ( ) . unwrap ( ) ) ,
584
580
_ => ( make:: expr_tuple ( lhs. into_iter ( ) ) , make:: expr_tuple ( rhs. into_iter ( ) ) ) ,
585
581
} ;
582
+ let rhs = make:: expr_ref ( rhs, false ) ;
586
583
let method = make:: name_ref ( "partial_cmp" ) ;
587
584
make:: expr_method_call ( lhs, method, make:: arg_list ( Some ( rhs) ) )
588
585
}
589
586
590
- fn gen_record_pat_field ( field_name : & str , pat_name : & str ) -> ast:: RecordPatField {
591
- let pat = make:: ext:: simple_ident_pat ( make:: name ( & pat_name) ) ;
592
- let name_ref = make:: name_ref ( field_name) ;
593
- make:: record_pat_field ( name_ref, pat. into ( ) )
594
- }
595
-
596
- fn gen_record_pat ( record_name : ast:: Path , fields : Vec < ast:: RecordPatField > ) -> ast:: RecordPat {
597
- let list = make:: record_pat_field_list ( fields) ;
598
- make:: record_pat_with_fields ( record_name, list)
599
- }
600
-
601
- fn gen_variant_path ( variant : & ast:: Variant ) -> Option < ast:: Path > {
602
- make:: ext:: path_from_idents ( [ "Self" , & variant. name ( ) ?. to_string ( ) ] )
603
- }
604
-
605
- fn gen_tuple_field ( field_name : & String ) -> ast:: Pat {
606
- ast:: Pat :: IdentPat ( make:: ident_pat ( false , false , make:: name ( field_name) ) )
607
- }
608
-
609
587
// FIXME: return `None` if the trait carries a generic type; we can only
610
588
// generate this code `Self` for the time being.
611
589
612
590
let body = match adt {
613
- // `Hash ` cannot be derived for unions, so no default impl can be provided.
591
+ // `PartialOrd ` cannot be derived for unions, so no default impl can be provided.
614
592
ast:: Adt :: Union ( _) => return None ,
615
-
616
- ast:: Adt :: Enum ( enum_) => {
617
- // => std::mem::discriminant(self) == std::mem::discriminant(other)
618
- let lhs_name = make:: expr_path ( make:: ext:: ident_path ( "self" ) ) ;
619
- let lhs = make:: expr_call ( make_discriminant ( ) ?, make:: arg_list ( Some ( lhs_name. clone ( ) ) ) ) ;
620
- let rhs_name = make:: expr_path ( make:: ext:: ident_path ( "other" ) ) ;
621
- let rhs = make:: expr_call ( make_discriminant ( ) ?, make:: arg_list ( Some ( rhs_name. clone ( ) ) ) ) ;
622
- let ord_check = gen_partial_cmp_call ( lhs, rhs) ;
623
-
624
- let mut case_count = 0 ;
625
- let mut arms = vec ! [ ] ;
626
- for variant in enum_. variant_list ( ) ?. variants ( ) {
627
- case_count += 1 ;
628
- match variant. field_list ( ) {
629
- // => (Self::Bar { bin: l_bin }, Self::Bar { bin: r_bin }) => l_bin == r_bin,
630
- Some ( ast:: FieldList :: RecordFieldList ( list) ) => {
631
- let mut l_pat_fields = vec ! [ ] ;
632
- let mut r_pat_fields = vec ! [ ] ;
633
- let mut l_fields = vec ! [ ] ;
634
- let mut r_fields = vec ! [ ] ;
635
-
636
- for field in list. fields ( ) {
637
- let field_name = field. name ( ) ?. to_string ( ) ;
638
-
639
- let l_name = & format ! ( "l_{}" , field_name) ;
640
- l_pat_fields. push ( gen_record_pat_field ( & field_name, & l_name) ) ;
641
-
642
- let r_name = & format ! ( "r_{}" , field_name) ;
643
- r_pat_fields. push ( gen_record_pat_field ( & field_name, & r_name) ) ;
644
-
645
- let lhs = make:: expr_path ( make:: ext:: ident_path ( l_name) ) ;
646
- let rhs = make:: expr_path ( make:: ext:: ident_path ( r_name) ) ;
647
- l_fields. push ( lhs) ;
648
- r_fields. push ( rhs) ;
649
- }
650
-
651
- let left_pat = gen_record_pat ( gen_variant_path ( & variant) ?, l_pat_fields) ;
652
- let right_pat = gen_record_pat ( gen_variant_path ( & variant) ?, r_pat_fields) ;
653
- let tuple_pat = make:: tuple_pat ( vec ! [ left_pat. into( ) , right_pat. into( ) ] ) ;
654
-
655
- let len = l_fields. len ( ) ;
656
- if len != 0 {
657
- let mut expr = gen_partial_cmp_call2 ( l_fields, r_fields) ;
658
- if len >= 2 {
659
- expr = make:: block_expr ( None , Some ( expr) )
660
- . indent ( ast:: edit:: IndentLevel ( 1 ) )
661
- . into ( ) ;
662
- }
663
- arms. push ( make:: match_arm ( Some ( tuple_pat. into ( ) ) , None , expr) ) ;
664
- }
665
- }
666
-
667
- Some ( ast:: FieldList :: TupleFieldList ( list) ) => {
668
- let mut l_pat_fields = vec ! [ ] ;
669
- let mut r_pat_fields = vec ! [ ] ;
670
- let mut l_fields = vec ! [ ] ;
671
- let mut r_fields = vec ! [ ] ;
672
-
673
- for ( i, _) in list. fields ( ) . enumerate ( ) {
674
- let field_name = format ! ( "{}" , i) ;
675
-
676
- let l_name = format ! ( "l{}" , field_name) ;
677
- l_pat_fields. push ( gen_tuple_field ( & l_name) ) ;
678
-
679
- let r_name = format ! ( "r{}" , field_name) ;
680
- r_pat_fields. push ( gen_tuple_field ( & r_name) ) ;
681
-
682
- let lhs = make:: expr_path ( make:: ext:: ident_path ( & l_name) ) ;
683
- let rhs = make:: expr_path ( make:: ext:: ident_path ( & r_name) ) ;
684
- l_fields. push ( lhs) ;
685
- r_fields. push ( rhs) ;
686
- }
687
-
688
- let left_pat =
689
- make:: tuple_struct_pat ( gen_variant_path ( & variant) ?, l_pat_fields) ;
690
- let right_pat =
691
- make:: tuple_struct_pat ( gen_variant_path ( & variant) ?, r_pat_fields) ;
692
- let tuple_pat = make:: tuple_pat ( vec ! [ left_pat. into( ) , right_pat. into( ) ] ) ;
693
-
694
- let len = l_fields. len ( ) ;
695
- if len != 0 {
696
- let mut expr = gen_partial_cmp_call2 ( l_fields, r_fields) ;
697
- if len >= 2 {
698
- expr = make:: block_expr ( None , Some ( expr) )
699
- . indent ( ast:: edit:: IndentLevel ( 1 ) )
700
- . into ( ) ;
701
- }
702
- arms. push ( make:: match_arm ( Some ( tuple_pat. into ( ) ) , None , expr) ) ;
703
- }
704
- }
705
- None => continue ,
706
- }
707
- }
708
-
709
- let expr = match arms. len ( ) {
710
- 0 => ord_check,
711
- _ => {
712
- if case_count > arms. len ( ) {
713
- let lhs = make:: wildcard_pat ( ) . into ( ) ;
714
- arms. push ( make:: match_arm ( Some ( lhs) , None , ord_check) ) ;
715
- }
716
-
717
- let match_target = make:: expr_tuple ( vec ! [ lhs_name, rhs_name] ) ;
718
- let list = make:: match_arm_list ( arms) . indent ( ast:: edit:: IndentLevel ( 1 ) ) ;
719
- make:: expr_match ( match_target, list)
720
- }
721
- } ;
722
-
723
- make:: block_expr ( None , Some ( expr) ) . indent ( ast:: edit:: IndentLevel ( 1 ) )
724
- }
593
+ // `core::mem::Discriminant` does not implement `PartialOrd` in stable Rust today.
594
+ ast:: Adt :: Enum ( _) => return None ,
725
595
ast:: Adt :: Struct ( strukt) => match strukt. field_list ( ) {
726
596
Some ( ast:: FieldList :: RecordFieldList ( field_list) ) => {
727
597
let mut l_fields = vec ! [ ] ;
@@ -735,7 +605,7 @@ fn gen_partial_ord(adt: &ast::Adt, func: &ast::Fn) -> Option<()> {
735
605
r_fields. push ( rhs) ;
736
606
}
737
607
738
- let expr = gen_partial_cmp_call2 ( l_fields, r_fields) ;
608
+ let expr = gen_partial_cmp_call ( l_fields, r_fields) ;
739
609
make:: block_expr ( None , Some ( expr) ) . indent ( ast:: edit:: IndentLevel ( 1 ) )
740
610
}
741
611
@@ -751,7 +621,7 @@ fn gen_partial_ord(adt: &ast::Adt, func: &ast::Fn) -> Option<()> {
751
621
l_fields. push ( lhs) ;
752
622
r_fields. push ( rhs) ;
753
623
}
754
- let expr = gen_partial_cmp_call2 ( l_fields, r_fields) ;
624
+ let expr = gen_partial_cmp_call ( l_fields, r_fields) ;
755
625
make:: block_expr ( None , Some ( expr) ) . indent ( ast:: edit:: IndentLevel ( 1 ) )
756
626
}
757
627
0 commit comments