diff options
| author | bors <bors@rust-lang.org> | 2024-09-13 09:44:28 +0000 |
|---|---|---|
| committer | bors <bors@rust-lang.org> | 2024-09-13 09:44:28 +0000 |
| commit | 004d6466338f13f2a8ceb7d39a7fcee9677ff36e (patch) | |
| tree | 2430ffdbb4e4ba442752fe325d20dcf05cd70300 | |
| parent | 50b71859bef21360c2f3b5778f90c47685200c7a (diff) | |
| parent | bd085df893d054c3dd8190dea089a82d40ea5e61 (diff) | |
| download | rust-004d6466338f13f2a8ceb7d39a7fcee9677ff36e.tar.gz rust-004d6466338f13f2a8ceb7d39a7fcee9677ff36e.zip | |
Auto merge of #18073 - alibektas:immutable_tree_panics, r=lnicola
fix: Immutable tree panic in `generate_delegate_trait` fixes #17835
| -rw-r--r-- | src/tools/rust-analyzer/crates/ide-assists/src/handlers/generate_delegate_trait.rs | 43 |
1 files changed, 41 insertions, 2 deletions
diff --git a/src/tools/rust-analyzer/crates/ide-assists/src/handlers/generate_delegate_trait.rs b/src/tools/rust-analyzer/crates/ide-assists/src/handlers/generate_delegate_trait.rs index a55323eb59d..66bf9b01868 100644 --- a/src/tools/rust-analyzer/crates/ide-assists/src/handlers/generate_delegate_trait.rs +++ b/src/tools/rust-analyzer/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) + } +} +"#, + ) + } } |
