Skip to content

Commit fc17eb4

Browse files
yoshuawuytsrylev
andcommitted
gen PartialEq for Record enums
Co-Authored-By: Ryan Levick <[email protected]>
1 parent 1cf7af7 commit fc17eb4

File tree

2 files changed

+53
-19
lines changed

2 files changed

+53
-19
lines changed

crates/ide_assists/src/handlers/replace_derive_with_manual_impl.rs

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -752,9 +752,11 @@ enum Foo {
752752
bin: String,
753753
},
754754
Baz {
755-
quz: String,
755+
qux: String,
756756
fez: String,
757757
},
758+
Qux {},
759+
Bin,
758760
}
759761
"#,
760762
r#"
@@ -763,17 +765,19 @@ enum Foo {
763765
bin: String,
764766
},
765767
Baz {
766-
quz: String,
768+
qux: String,
767769
fez: String,
768770
},
771+
Qux {},
772+
Bin,
769773
}
770774
771775
impl PartialEq for Foo {
772776
$0fn eq(&self, other: &Self) -> bool {
773777
if core::mem::discriminant(self) == core::mem::discriminant(other) {
774778
match (self, other) {
775779
(Self::Bar { bin: l_bin }, Self::Bar { bin: r_bin }) => l_bin == r_bin,
776-
(Self::Baz { qux: l_qux, fez: l_fez }, Self::Bar { qux: r_qux, fez: r_fez }) => l_qux == r_qux && l_fez == r_fez,
780+
(Self::Baz { qux: l_qux, fez: l_fez }, Self::Baz { qux: r_qux, fez: r_fez }) => l_qux == r_qux && l_fez == r_fez,
777781
_ => true,
778782
}
779783
} else {

crates/ide_assists/src/utils/gen_trait_fn_body.rs

Lines changed: 46 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -361,26 +361,56 @@ fn gen_partial_eq(adt: &ast::Adt, func: &ast::Fn) -> Option<()> {
361361
match variant.field_list() {
362362
// => (Self::Bar { bin: l_bin }, Self::Bar { bin: r_bin }) => l_bin == r_bin,
363363
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![];
365367
// let mut fields = vec![];
368+
369+
// !! make::record_pat_field{list, etc};
370+
366371
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));
377411
}
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")
383412
}
413+
// todo!("implement tuple record iteration")
384414
Some(ast::FieldList::TupleFieldList(list)) => {
385415
todo!("implement tuple enum iteration")
386416
}

0 commit comments

Comments
 (0)