@@ -58,16 +58,29 @@ fn gen_clone_impl(adt: &ast::Adt, func: &ast::Fn) -> Option<()> {
58
58
let field = make:: record_expr_field ( name_ref, Some ( method_call) ) ;
59
59
fields. push ( field) ;
60
60
}
61
- let pattern = make:: record_pat ( variant_name. clone ( ) , pats. into_iter ( ) ) ;
62
-
61
+ let pat = make:: record_pat ( variant_name. clone ( ) , pats. into_iter ( ) ) ;
63
62
let fields = make:: record_expr_field_list ( fields) ;
64
63
let record_expr = make:: record_expr ( variant_name, fields) . into ( ) ;
65
-
66
- arms. push ( make:: match_arm ( Some ( pattern. into ( ) ) , None , record_expr) ) ;
64
+ arms. push ( make:: match_arm ( Some ( pat. into ( ) ) , None , record_expr) ) ;
67
65
}
68
66
69
67
// => match self { Self::Name(arg1) => Self::Name(arg1.clone()) }
70
- Some ( ast:: FieldList :: TupleFieldList ( list) ) => todo ! ( ) ,
68
+ Some ( ast:: FieldList :: TupleFieldList ( list) ) => {
69
+ let mut pats = vec ! [ ] ;
70
+ let mut fields = vec ! [ ] ;
71
+ for ( i, _) in list. fields ( ) . enumerate ( ) {
72
+ let field_name = format ! ( "arg{}" , i) ;
73
+ let pat = make:: ident_pat ( false , false , make:: name ( & field_name) ) ;
74
+ pats. push ( pat. into ( ) ) ;
75
+
76
+ let f_path = make:: expr_path ( make:: ext:: ident_path ( & field_name) ) ;
77
+ fields. push ( gen_clone_call ( f_path) ) ;
78
+ }
79
+ let pat = make:: tuple_struct_pat ( variant_name. clone ( ) , pats. into_iter ( ) ) ;
80
+ let struct_name = make:: expr_path ( variant_name) ;
81
+ let tuple_expr = make:: expr_call ( struct_name, make:: arg_list ( fields) ) ;
82
+ arms. push ( make:: match_arm ( Some ( pat. into ( ) ) , None , tuple_expr) ) ;
83
+ }
71
84
72
85
// => match self { Self::Name => Self::Name }
73
86
None => {
0 commit comments