@@ -58,16 +58,29 @@ fn gen_clone_impl(adt: &ast::Adt, func: &ast::Fn) -> Option<()> {
5858 let field = make:: record_expr_field ( name_ref, Some ( method_call) ) ;
5959 fields. push ( field) ;
6060 }
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 ( ) ) ;
6362 let fields = make:: record_expr_field_list ( fields) ;
6463 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) ) ;
6765 }
6866
6967 // => 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+ }
7184
7285 // => match self { Self::Name => Self::Name }
7386 None => {
0 commit comments