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
bors 2024-09-13
parent fd243cd · parent 8f5a5e0 · commit 4221354
-rw-r--r--crates/ide-assists/src/handlers/generate_delegate_trait.rs43
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)
+ }
+}
+"#,
+ )
+ }
}