From 9374d526da82a74c5d5f7d7b8cef97feb3104274 Mon Sep 17 00:00:00 2001 From: Yoshua Wuyts Date: Mon, 16 Aug 2021 17:39:08 +0200 Subject: [PATCH] fix debug tuple structs --- .../replace_derive_with_manual_impl.rs | 2 +- .../src/utils/gen_trait_fn_body.rs | 39 +++++++++++++++++-- 2 files changed, 37 insertions(+), 4 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 813f662f10c..d6319ea5c13 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 @@ -327,7 +327,7 @@ enum Foo { impl core::fmt::Debug for Foo { $0fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result { match self { - Self::Bar(arg1, arg2) => f.debug_tuple("Bar").field(arg1).field(arg2).finish(), + Self::Bar(arg0, arg1) => f.debug_tuple("Bar").field(arg0).field(arg1).finish(), Self::Baz => write!(f, "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 54060c02a37..1c941382732 100644 --- a/crates/ide_assists/src/utils/gen_trait_fn_body.rs +++ b/crates/ide_assists/src/utils/gen_trait_fn_body.rs @@ -166,7 +166,7 @@ fn gen_debug_impl(adt: &ast::Adt, func: &ast::Fn) -> Option<()> { for field in list.fields() { let name = field.name()?; - // => MyStruct { field_name } + // create a field pattern for use in `MyStruct { fields.. }` let field_name = field.name()?; let pat = make::ident_pat(false, false, field_name.clone()); pats.push(pat.into()); @@ -184,11 +184,44 @@ fn gen_debug_impl(adt: &ast::Adt, func: &ast::Fn) -> Option<()> { let method = make::name_ref("finish"); let expr = make::expr_method_call(expr, method, make::arg_list(None)); - // => MyStruct { fields.. } => f.debug_struct()...finish(), + // => MyStruct { fields.. } => f.debug_struct("MyStruct")...finish(), let pat = make::record_pat(variant_name.clone(), pats.into_iter()); arms.push(make::match_arm(Some(pat.into()), None, expr)); } - Some(ast::FieldList::TupleFieldList(_list)) => todo!(), + Some(ast::FieldList::TupleFieldList(list)) => { + let mut pats = vec![]; + + // => f.debug_tuple(name) + let target = make::expr_path(make::ext::ident_path("f")); + let method = make::name_ref("debug_tuple"); + let struct_name = format!("\"{}\"", name); + let args = make::arg_list(Some(make::expr_literal(&struct_name).into())); + let mut expr = make::expr_method_call(target, method, args); + + for (i, _) in list.fields().enumerate() { + let name = format!("arg{}", i); + + // create a field pattern for use in `MyStruct(fields..)` + let field_name = make::name(&name); + let pat = make::ident_pat(false, false, field_name.clone()); + pats.push(pat.into()); + + // => .field(field) + let method_name = make::name_ref("field"); + let field_path = &format!("{}", name); + let field_path = make::expr_path(make::ext::ident_path(field_path)); + let args = make::arg_list(vec![field_path]); + expr = make::expr_method_call(expr, method_name, args); + } + + // => .finish() + let method = make::name_ref("finish"); + let expr = make::expr_method_call(expr, method, make::arg_list(None)); + + // => MyStruct (fields..) => f.debug_tuple("MyStruct")...finish(), + let pat = make::tuple_struct_pat(variant_name.clone(), pats.into_iter()); + arms.push(make::match_arm(Some(pat.into()), None, expr)); + } None => { let fmt_string = make::expr_literal(&(format!("\"{}\"", name))).into(); let args = make::arg_list(vec![target, fmt_string]); -- 2.44.0