@@ -367,6 +367,10 @@ fn gen_partial_eq(adt: &ast::Adt, func: &ast::Fn) -> Option<()> {
367
367
let record_name = make:: path_concat ( first, second) ;
368
368
Some ( record_name)
369
369
}
370
+
371
+ fn gen_tuple_field ( field_name : & String ) -> ast:: Pat {
372
+ ast:: Pat :: IdentPat ( make:: ident_pat ( false , false , make:: name ( field_name) ) )
373
+ }
370
374
// FIXME: return `None` if the trait carries a generic type; we can only
371
375
// generate this code `Self` for the time being.
372
376
@@ -399,7 +403,7 @@ fn gen_partial_eq(adt: &ast::Adt, func: &ast::Fn) -> Option<()> {
399
403
let l_name = & format ! ( "l_{}" , field_name) ;
400
404
l_fields. push ( gen_record_pat_field ( & field_name, & l_name) ) ;
401
405
402
- let r_name = & format ! ( "l_ {}" , field_name) ;
406
+ let r_name = & format ! ( "r_ {}" , field_name) ;
403
407
r_fields. push ( gen_record_pat_field ( & field_name, & r_name) ) ;
404
408
405
409
let lhs = make:: expr_path ( make:: ext:: ident_path ( l_name) ) ;
@@ -408,9 +412,9 @@ fn gen_partial_eq(adt: &ast::Adt, func: &ast::Fn) -> Option<()> {
408
412
expr = gen_eq_chain ( expr, cmp) ;
409
413
}
410
414
411
- let l_record = gen_record_pat ( gen_variant_path ( & variant) ?, l_fields) ;
412
- let r_record = gen_record_pat ( gen_variant_path ( & variant) ?, r_fields) ;
413
- let tuple = make:: tuple_pat ( vec ! [ l_record . into( ) , r_record . into( ) ] ) ;
415
+ let left = gen_record_pat ( gen_variant_path ( & variant) ?, l_fields) ;
416
+ let right = gen_record_pat ( gen_variant_path ( & variant) ?, r_fields) ;
417
+ let tuple = make:: tuple_pat ( vec ! [ left . into( ) , right . into( ) ] ) ;
414
418
415
419
if let Some ( expr) = expr {
416
420
arms. push ( make:: match_arm ( Some ( tuple. into ( ) ) , None , expr) ) ;
@@ -419,7 +423,32 @@ fn gen_partial_eq(adt: &ast::Adt, func: &ast::Fn) -> Option<()> {
419
423
420
424
// todo!("implement tuple record iteration")
421
425
Some ( ast:: FieldList :: TupleFieldList ( list) ) => {
422
- todo ! ( "implement tuple enum iteration" )
426
+ let mut expr = None ;
427
+ let mut l_fields = vec ! [ ] ;
428
+ let mut r_fields = vec ! [ ] ;
429
+
430
+ for ( i, _) in list. fields ( ) . enumerate ( ) {
431
+ let field_name = format ! ( "{}" , i) ;
432
+
433
+ let l_name = format ! ( "l{}" , field_name) ;
434
+ l_fields. push ( gen_tuple_field ( & l_name) ) ;
435
+
436
+ let r_name = format ! ( "r{}" , field_name) ;
437
+ r_fields. push ( gen_tuple_field ( & r_name) ) ;
438
+
439
+ let lhs = make:: expr_path ( make:: ext:: ident_path ( & l_name) ) ;
440
+ let rhs = make:: expr_path ( make:: ext:: ident_path ( & r_name) ) ;
441
+ let cmp = make:: expr_op ( ast:: BinOp :: EqualityTest , lhs, rhs) ;
442
+ expr = gen_eq_chain ( expr, cmp) ;
443
+ }
444
+
445
+ let left = make:: tuple_struct_pat ( gen_variant_path ( & variant) ?, l_fields) ;
446
+ let right = make:: tuple_struct_pat ( gen_variant_path ( & variant) ?, r_fields) ;
447
+ let tuple = make:: tuple_pat ( vec ! [ left. into( ) , right. into( ) ] ) ;
448
+
449
+ if let Some ( expr) = expr {
450
+ arms. push ( make:: match_arm ( Some ( tuple. into ( ) ) , None , expr) ) ;
451
+ }
423
452
}
424
453
None => continue ,
425
454
}
0 commit comments