Unnamed repository; edit this file 'description' to name the repository.
Auto merge of #18073 - alibektas:immutable_tree_panics, r=lnicola
fix: Immutable tree panic in `generate_delegate_trait`
fixes #17835
| -rw-r--r-- | crates/ide-assists/src/handlers/generate_delegate_trait.rs | 43 |
1 files changed, 41 insertions, 2 deletions
diff --git a/crates/ide-assists/src/handlers/generate_delegate_trait.rs b/crates/ide-assists/src/handlers/generate_delegate_trait.rs index a55323eb59..66bf9b0186 100644 --- a/crates/ide-assists/src/handlers/generate_delegate_trait.rs +++ b/crates/ide-assists/src/handlers/generate_delegate_trait.rs @@ -282,8 +282,11 @@ fn generate_impl( ai.assoc_items() .filter(|item| matches!(item, AssocItem::MacroCall(_)).not()) .for_each(|item| { - let assoc = - process_assoc_item(item, qualified_path_type.clone(), field_name); + let assoc = process_assoc_item( + item.clone_for_update(), + qualified_path_type.clone(), + field_name, + ); if let Some(assoc) = assoc { delegate_assoc_items.add_item(assoc); } @@ -1797,4 +1800,40 @@ impl T for B { "#, ); } + + #[test] + fn assoc_items_attributes_mutably_cloned() { + check_assist( + generate_delegate_trait, + r#" +pub struct A; +pub trait C<D> { + #[allow(clippy::dead_code)] + fn a_funk(&self) -> &D; +} + +pub struct B<T: C<A>> { + has_dr$0ain: T, +} +"#, + r#" +pub struct A; +pub trait C<D> { + #[allow(clippy::dead_code)] + fn a_funk(&self) -> &D; +} + +pub struct B<T: C<A>> { + has_drain: T, +} + +impl<D, T: C<A>> C<D> for B<T> { + #[allow(clippy::dead_code)] + fn a_funk(&self) -> &D { + <T as C<D>>::a_funk(&self.has_drain) + } +} +"#, + ) + } } |