diff options
Diffstat (limited to 'crates/ide_assists/src/utils.rs')
-rw-r--r-- | crates/ide_assists/src/utils.rs | 26 |
1 files changed, 14 insertions, 12 deletions
diff --git a/crates/ide_assists/src/utils.rs b/crates/ide_assists/src/utils.rs index 0dcf20c61..7d562d1d4 100644 --- a/crates/ide_assists/src/utils.rs +++ b/crates/ide_assists/src/utils.rs | |||
@@ -128,15 +128,12 @@ pub fn add_trait_assoc_items_to_impl( | |||
128 | sema: &hir::Semantics<ide_db::RootDatabase>, | 128 | sema: &hir::Semantics<ide_db::RootDatabase>, |
129 | items: Vec<ast::AssocItem>, | 129 | items: Vec<ast::AssocItem>, |
130 | trait_: hir::Trait, | 130 | trait_: hir::Trait, |
131 | impl_def: ast::Impl, | 131 | impl_: ast::Impl, |
132 | target_scope: hir::SemanticsScope, | 132 | target_scope: hir::SemanticsScope, |
133 | ) -> (ast::Impl, ast::AssocItem) { | 133 | ) -> (ast::Impl, ast::AssocItem) { |
134 | let impl_item_list = impl_def.assoc_item_list().unwrap_or_else(make::assoc_item_list); | ||
135 | |||
136 | let n_existing_items = impl_item_list.assoc_items().count(); | ||
137 | let source_scope = sema.scope_for_def(trait_); | 134 | let source_scope = sema.scope_for_def(trait_); |
138 | let ast_transform = QualifyPaths::new(&target_scope, &source_scope) | 135 | let ast_transform = QualifyPaths::new(&target_scope, &source_scope) |
139 | .or(SubstituteTypeParams::for_trait_impl(&source_scope, trait_, impl_def.clone())); | 136 | .or(SubstituteTypeParams::for_trait_impl(&source_scope, trait_, impl_.clone())); |
140 | 137 | ||
141 | let items = items | 138 | let items = items |
142 | .into_iter() | 139 | .into_iter() |
@@ -147,13 +144,18 @@ pub fn add_trait_assoc_items_to_impl( | |||
147 | ast::AssocItem::TypeAlias(def) => ast::AssocItem::TypeAlias(def.remove_bounds()), | 144 | ast::AssocItem::TypeAlias(def) => ast::AssocItem::TypeAlias(def.remove_bounds()), |
148 | _ => it, | 145 | _ => it, |
149 | }) | 146 | }) |
150 | .map(|it| edit::remove_attrs_and_docs(&it)); | 147 | .map(|it| edit::remove_attrs_and_docs(&it).clone_subtree().clone_for_update()); |
151 | 148 | ||
152 | let new_impl_item_list = impl_item_list.append_items(items); | 149 | let res = impl_.clone_for_update(); |
153 | let new_impl_def = impl_def.with_assoc_item_list(new_impl_item_list); | 150 | let assoc_item_list = res.get_or_create_assoc_item_list(); |
154 | let first_new_item = | 151 | let mut first_item = None; |
155 | new_impl_def.assoc_item_list().unwrap().assoc_items().nth(n_existing_items).unwrap(); | 152 | for item in items { |
156 | return (new_impl_def, first_new_item); | 153 | if first_item.is_none() { |
154 | first_item = Some(item.clone()) | ||
155 | } | ||
156 | assoc_item_list.add_item(item) | ||
157 | } | ||
158 | return (res, first_item.unwrap()); | ||
157 | 159 | ||
158 | fn add_body(fn_def: ast::Fn) -> ast::Fn { | 160 | fn add_body(fn_def: ast::Fn) -> ast::Fn { |
159 | match fn_def.body() { | 161 | match fn_def.body() { |