Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'crates/ide-assists/src/handlers/generate_blanket_trait_impl.rs')
| -rw-r--r-- | crates/ide-assists/src/handlers/generate_blanket_trait_impl.rs | 37 |
1 files changed, 20 insertions, 17 deletions
diff --git a/crates/ide-assists/src/handlers/generate_blanket_trait_impl.rs b/crates/ide-assists/src/handlers/generate_blanket_trait_impl.rs index 0bb90f187c..4454e47013 100644 --- a/crates/ide-assists/src/handlers/generate_blanket_trait_impl.rs +++ b/crates/ide-assists/src/handlers/generate_blanket_trait_impl.rs @@ -58,7 +58,7 @@ use syntax::{ // ``` pub(crate) fn generate_blanket_trait_impl( acc: &mut Assists, - ctx: &AssistContext<'_>, + ctx: &AssistContext<'_, '_>, ) -> Option<()> { let name = ctx.find_node_at_offset::<ast::Name>()?; let traitd = ast::Trait::cast(name.syntax().parent()?)?; @@ -89,7 +89,24 @@ pub(crate) fn generate_blanket_trait_impl( ))]); let trait_gen_args = - traitd.generic_param_list().map(|param_list| param_list.to_generic_args()); + traitd.generic_param_list().map(|param_list| param_list.to_generic_args(make)); + + let body = traitd.assoc_item_list().and_then(|trait_assoc_list| { + let items = trait_assoc_list + .assoc_items() + .filter_map(|item| { + let item = match item { + ast::AssocItem::Fn(method) if method.body().is_none() => { + todo_fn(make, &method, ctx.config).into() + } + ast::AssocItem::Const(_) | ast::AssocItem::TypeAlias(_) => item, + _ => return None, + }; + Some(item.reset_indent().indent(1.into())) + }) + .collect::<Vec<_>>(); + (!items.is_empty()).then(|| make.assoc_item_list(items)) + }); let impl_ = make.impl_trait( cfg_attrs(&traitd), @@ -103,23 +120,9 @@ pub(crate) fn generate_blanket_trait_impl( thisty.into(), trait_where_clause, None, - None, + body, ); - if let Some(trait_assoc_list) = traitd.assoc_item_list() { - let assoc_item_list = impl_.get_or_create_assoc_item_list_with_editor(&editor); - for item in trait_assoc_list.assoc_items() { - let item = match item { - ast::AssocItem::Fn(method) if method.body().is_none() => { - todo_fn(make, &method, ctx.config).into() - } - ast::AssocItem::Const(_) | ast::AssocItem::TypeAlias(_) => item, - _ => continue, - }; - assoc_item_list.add_item(item.reset_indent().indent(1.into())); - } - } - let impl_ = impl_.indent(indent); editor.insert_all( |