@@ -361,26 +361,56 @@ fn gen_partial_eq(adt: &ast::Adt, func: &ast::Fn) -> Option<()> {
361
361
match variant. field_list ( ) {
362
362
// => (Self::Bar { bin: l_bin }, Self::Bar { bin: r_bin }) => l_bin == r_bin,
363
363
Some ( ast:: FieldList :: RecordFieldList ( list) ) => {
364
- // let mut pats = vec![];
364
+ let mut expr = None ;
365
+ let mut l_fields = vec ! [ ] ;
366
+ let mut r_fields = vec ! [ ] ;
365
367
// let mut fields = vec![];
368
+
369
+ // !! make::record_pat_field{list, etc};
370
+
366
371
for field in list. fields ( ) {
367
- // let field_name = field.name()?;
368
- // let pat = make::record_pat(path, pats);
369
- // let pat = make::ident_pat(false, false, field_name.clone());
370
- // pats.push(pat.into());
371
-
372
- // let path = make::ext::ident_path(&field_name.to_string());
373
- // let method_call = gen_clone_call(make::expr_path(path));
374
- // let name_ref = make::name_ref(&field_name.to_string());
375
- // let field = make::record_expr_field(name_ref, Some(method_call));
376
- // fields.push(field);
372
+ let field_name = field. name ( ) ?. to_string ( ) ;
373
+
374
+ let l_name = & format ! ( "l_{}" , field_name) ;
375
+ let pat = make:: ext:: simple_ident_pat ( make:: name ( & l_name) ) ;
376
+ let name_ref = make:: name_ref ( & field_name) ;
377
+ let field = make:: record_pat_field ( name_ref, pat. into ( ) ) ;
378
+ l_fields. push ( field) ;
379
+
380
+ let r_name = & format ! ( "r_{}" , field_name) ;
381
+ let pat = make:: ext:: simple_ident_pat ( make:: name ( & r_name) ) ;
382
+ let name_ref = make:: name_ref ( & field_name) ;
383
+ let field = make:: record_pat_field ( name_ref, pat. into ( ) ) ;
384
+ r_fields. push ( field) ;
385
+
386
+ let lhs = make:: expr_path ( make:: ext:: ident_path ( l_name) ) ;
387
+ let rhs = make:: expr_path ( make:: ext:: ident_path ( r_name) ) ;
388
+ let cmp = make:: expr_op ( ast:: BinOp :: EqualityTest , lhs, rhs) ;
389
+ expr = match expr {
390
+ Some ( expr) => {
391
+ Some ( make:: expr_op ( ast:: BinOp :: BooleanAnd , expr, cmp) )
392
+ }
393
+ None => Some ( cmp) ,
394
+ } ;
395
+ }
396
+ let first = make:: ext:: ident_path ( "Self" ) ;
397
+ let second = make:: path_from_text ( & variant. name ( ) ?. to_string ( ) ) ;
398
+ let record_name = make:: path_concat ( first, second) ;
399
+ let list = make:: record_pat_field_list ( l_fields) ;
400
+ let l_record = make:: record_pat_with_fields ( record_name, list) ;
401
+
402
+ let first = make:: ext:: ident_path ( "Self" ) ;
403
+ let second = make:: path_from_text ( & variant. name ( ) ?. to_string ( ) ) ;
404
+ let record_name = make:: path_concat ( first, second) ;
405
+ let list = make:: record_pat_field_list ( r_fields) ;
406
+ let r_record = make:: record_pat_with_fields ( record_name, list) ;
407
+
408
+ let tuple = make:: tuple_pat ( vec ! [ l_record. into( ) , r_record. into( ) ] ) ;
409
+ if let Some ( expr) = expr {
410
+ arms. push ( make:: match_arm ( Some ( tuple. into ( ) ) , None , expr) ) ;
377
411
}
378
- // let pat = make::record_pat(variant_name.clone(), pats.into_iter());
379
- // let fields = make::record_expr_field_list(fields);
380
- // let record_expr = make::record_expr(variant_name, fields).into();
381
- // arms.push(make::match_arm(Some(pat.into()), None, record_expr));
382
- todo ! ( "implement tuple record iteration" )
383
412
}
413
+ // todo!("implement tuple record iteration")
384
414
Some ( ast:: FieldList :: TupleFieldList ( list) ) => {
385
415
todo ! ( "implement tuple enum iteration" )
386
416
}
0 commit comments