Skip to content

Commit 2f86697

Browse files
committed
gen clone for tuple enums
1 parent e0adb39 commit 2f86697

File tree

2 files changed

+19
-6
lines changed

2 files changed

+19
-6
lines changed

crates/ide_assists/src/handlers/replace_derive_with_manual_impl.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -567,7 +567,7 @@ enum Foo {
567567
impl Clone for Foo {
568568
$0fn clone(&self) -> Self {
569569
match self {
570-
Self::Bar(arg1) => Self::Bar(arg1.clone()),
570+
Self::Bar(arg0) => Self::Bar(arg0.clone()),
571571
Self::Baz => Self::Baz,
572572
}
573573
}

crates/ide_assists/src/utils/gen_trait_fn_body.rs

Lines changed: 18 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)