From 2f866974d9bfd7cd3be89f3806dbb623cf358bf3 Mon Sep 17 00:00:00 2001 From: Yoshua Wuyts Date: Tue, 10 Aug 2021 15:07:13 +0200 Subject: [PATCH] gen clone for tuple enums --- .../replace_derive_with_manual_impl.rs | 2 +- .../src/utils/gen_trait_fn_body.rs | 23 +++++++++++++++---- 2 files changed, 19 insertions(+), 6 deletions(-) diff --git a/crates/ide_assists/src/handlers/replace_derive_with_manual_impl.rs b/crates/ide_assists/src/handlers/replace_derive_with_manual_impl.rs index 65495e3b8f65..f256bf035ba6 100644 --- a/crates/ide_assists/src/handlers/replace_derive_with_manual_impl.rs +++ b/crates/ide_assists/src/handlers/replace_derive_with_manual_impl.rs @@ -567,7 +567,7 @@ enum Foo { impl Clone for Foo { $0fn clone(&self) -> Self { match self { - Self::Bar(arg1) => Self::Bar(arg1.clone()), + Self::Bar(arg0) => Self::Bar(arg0.clone()), Self::Baz => Self::Baz, } } diff --git a/crates/ide_assists/src/utils/gen_trait_fn_body.rs b/crates/ide_assists/src/utils/gen_trait_fn_body.rs index 2f4eb6ca55c3..04f396d46e20 100644 --- a/crates/ide_assists/src/utils/gen_trait_fn_body.rs +++ b/crates/ide_assists/src/utils/gen_trait_fn_body.rs @@ -58,16 +58,29 @@ fn gen_clone_impl(adt: &ast::Adt, func: &ast::Fn) -> Option<()> { let field = make::record_expr_field(name_ref, Some(method_call)); fields.push(field); } - let pattern = make::record_pat(variant_name.clone(), pats.into_iter()); - + let pat = make::record_pat(variant_name.clone(), pats.into_iter()); let fields = make::record_expr_field_list(fields); let record_expr = make::record_expr(variant_name, fields).into(); - - arms.push(make::match_arm(Some(pattern.into()), None, record_expr)); + arms.push(make::match_arm(Some(pat.into()), None, record_expr)); } // => match self { Self::Name(arg1) => Self::Name(arg1.clone()) } - Some(ast::FieldList::TupleFieldList(list)) => todo!(), + Some(ast::FieldList::TupleFieldList(list)) => { + let mut pats = vec![]; + let mut fields = vec![]; + for (i, _) in list.fields().enumerate() { + let field_name = format!("arg{}", i); + let pat = make::ident_pat(false, false, make::name(&field_name)); + pats.push(pat.into()); + + let f_path = make::expr_path(make::ext::ident_path(&field_name)); + fields.push(gen_clone_call(f_path)); + } + let pat = make::tuple_struct_pat(variant_name.clone(), pats.into_iter()); + let struct_name = make::expr_path(variant_name); + let tuple_expr = make::expr_call(struct_name, make::arg_list(fields)); + arms.push(make::match_arm(Some(pat.into()), None, tuple_expr)); + } // => match self { Self::Name => Self::Name } None => {