Skip to content

Commit c4e10c8

Browse files
committed
gen partialeq for tuple enums
1 parent 741e27b commit c4e10c8

File tree

1 file changed

+34
-5
lines changed

1 file changed

+34
-5
lines changed

crates/ide_assists/src/utils/gen_trait_fn_body.rs

Lines changed: 34 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -367,6 +367,10 @@ fn gen_partial_eq(adt: &ast::Adt, func: &ast::Fn) -> Option<()> {
367367
let record_name = make::path_concat(first, second);
368368
Some(record_name)
369369
}
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+
}
370374
// FIXME: return `None` if the trait carries a generic type; we can only
371375
// generate this code `Self` for the time being.
372376

@@ -399,7 +403,7 @@ fn gen_partial_eq(adt: &ast::Adt, func: &ast::Fn) -> Option<()> {
399403
let l_name = &format!("l_{}", field_name);
400404
l_fields.push(gen_record_pat_field(&field_name, &l_name));
401405

402-
let r_name = &format!("l_{}", field_name);
406+
let r_name = &format!("r_{}", field_name);
403407
r_fields.push(gen_record_pat_field(&field_name, &r_name));
404408

405409
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<()> {
408412
expr = gen_eq_chain(expr, cmp);
409413
}
410414

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()]);
414418

415419
if let Some(expr) = expr {
416420
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<()> {
419423

420424
// todo!("implement tuple record iteration")
421425
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+
}
423452
}
424453
None => continue,
425454
}

0 commit comments

Comments
 (0)