Skip to content

Commit e47f791

Browse files
authored
Merge pull request #20368 from Hmikihiro/migrate_delegate_methods
Migrate `generate_delegate_methods` assist to use `SyntaxEditor`
2 parents 279b464 + e314bfa commit e47f791

File tree

6 files changed

+41
-36
lines changed

6 files changed

+41
-36
lines changed

src/tools/rust-analyzer/crates/ide-assists/src/handlers/add_missing_impl_members.rs

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -183,13 +183,11 @@ fn add_missing_impl_members_inner(
183183
.clone()
184184
.into_iter()
185185
.chain(other_items.iter().cloned())
186-
.map(either::Either::Right)
187186
.collect::<Vec<_>>();
188187

189188
let mut editor = edit.make_editor(impl_def.syntax());
190189
if let Some(assoc_item_list) = impl_def.assoc_item_list() {
191-
let items = new_assoc_items.into_iter().filter_map(either::Either::right).collect();
192-
assoc_item_list.add_items(&mut editor, items);
190+
assoc_item_list.add_items(&mut editor, new_assoc_items);
193191
} else {
194192
let assoc_item_list = make::assoc_item_list(Some(new_assoc_items)).clone_for_update();
195193
editor.insert_all(

src/tools/rust-analyzer/crates/ide-assists/src/handlers/generate_delegate_methods.rs

Lines changed: 36 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,11 @@ use hir::{HasCrate, HasVisibility};
22
use ide_db::{FxHashSet, path_transform::PathTransform};
33
use syntax::{
44
ast::{
5-
self, AstNode, HasGenericParams, HasName, HasVisibility as _, edit_in_place::Indent, make,
5+
self, AstNode, HasGenericParams, HasName, HasVisibility as _,
6+
edit::{AstNodeEdit, IndentLevel},
7+
make,
68
},
7-
ted,
9+
syntax_editor::Position,
810
};
911

1012
use crate::{
@@ -165,54 +167,66 @@ pub(crate) fn generate_delegate_methods(acc: &mut Assists, ctx: &AssistContext<'
165167
is_unsafe,
166168
is_gen,
167169
)
168-
.clone_for_update();
169-
170-
// Get the impl to update, or create one if we need to.
171-
let impl_def = match impl_def {
172-
Some(impl_def) => edit.make_mut(impl_def),
170+
.indent(IndentLevel(1));
171+
let item = ast::AssocItem::Fn(f.clone());
172+
173+
let mut editor = edit.make_editor(strukt.syntax());
174+
let fn_: Option<ast::AssocItem> = match impl_def {
175+
Some(impl_def) => match impl_def.assoc_item_list() {
176+
Some(assoc_item_list) => {
177+
let item = item.indent(IndentLevel::from_node(impl_def.syntax()));
178+
assoc_item_list.add_items(&mut editor, vec![item.clone()]);
179+
Some(item)
180+
}
181+
None => {
182+
let assoc_item_list = make::assoc_item_list(Some(vec![item]));
183+
editor.insert(
184+
Position::last_child_of(impl_def.syntax()),
185+
assoc_item_list.syntax(),
186+
);
187+
assoc_item_list.assoc_items().next()
188+
}
189+
},
173190
None => {
174191
let name = &strukt_name.to_string();
175192
let ty_params = strukt.generic_param_list();
176193
let ty_args = ty_params.as_ref().map(|it| it.to_generic_args());
177194
let where_clause = strukt.where_clause();
195+
let assoc_item_list = make::assoc_item_list(Some(vec![item]));
178196

179197
let impl_def = make::impl_(
180198
ty_params,
181199
ty_args,
182200
make::ty_path(make::ext::ident_path(name)),
183201
where_clause,
184-
None,
202+
Some(assoc_item_list),
185203
)
186204
.clone_for_update();
187205

188206
// Fixup impl_def indentation
189207
let indent = strukt.indent_level();
190-
impl_def.reindent_to(indent);
208+
let impl_def = impl_def.indent(indent);
191209

192210
// Insert the impl block.
193211
let strukt = edit.make_mut(strukt.clone());
194-
ted::insert_all(
195-
ted::Position::after(strukt.syntax()),
212+
editor.insert_all(
213+
Position::after(strukt.syntax()),
196214
vec![
197215
make::tokens::whitespace(&format!("\n\n{indent}")).into(),
198216
impl_def.syntax().clone().into(),
199217
],
200218
);
201-
202-
impl_def
219+
impl_def.assoc_item_list().and_then(|list| list.assoc_items().next())
203220
}
204221
};
205222

206-
// Fixup function indentation.
207-
// FIXME: Should really be handled by `AssocItemList::add_item`
208-
f.reindent_to(impl_def.indent_level() + 1);
209-
210-
let assoc_items = impl_def.get_or_create_assoc_item_list();
211-
assoc_items.add_item(f.clone().into());
212-
213-
if let Some(cap) = ctx.config.snippet_cap {
214-
edit.add_tabstop_before(cap, f)
223+
if let Some(cap) = ctx.config.snippet_cap
224+
&& let Some(fn_) = fn_
225+
{
226+
let tabstop = edit.make_tabstop_before(cap);
227+
editor.add_annotation(fn_.syntax(), tabstop);
215228
}
229+
edit.add_file_edits(ctx.vfs_file_id(), editor);
216230
},
217231
)?;
218232
}

src/tools/rust-analyzer/crates/ide-assists/src/handlers/generate_impl.rs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -201,7 +201,6 @@ pub(crate) fn generate_impl_trait(acc: &mut Assists, ctx: &AssistContext<'_>) ->
201201
&impl_,
202202
&target_scope,
203203
);
204-
let assoc_items = assoc_items.into_iter().map(either::Either::Right).collect();
205204
let assoc_item_list = make::assoc_item_list(Some(assoc_items));
206205
make_impl_(Some(assoc_item_list))
207206
};

src/tools/rust-analyzer/crates/ide-assists/src/handlers/generate_new.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -168,15 +168,15 @@ pub(crate) fn generate_new(acc: &mut Assists, ctx: &AssistContext<'_>) -> Option
168168
);
169169
fn_.syntax().clone()
170170
} else {
171-
let items = vec![either::Either::Right(ast::AssocItem::Fn(fn_))];
171+
let items = vec![ast::AssocItem::Fn(fn_)];
172172
let list = make::assoc_item_list(Some(items));
173173
editor.insert(Position::after(impl_def.syntax()), list.syntax());
174174
list.syntax().clone()
175175
}
176176
} else {
177177
// Generate a new impl to add the method to
178178
let indent_level = strukt.indent_level();
179-
let body = vec![either::Either::Right(ast::AssocItem::Fn(fn_))];
179+
let body = vec![ast::AssocItem::Fn(fn_)];
180180
let list = make::assoc_item_list(Some(body));
181181
let impl_def = generate_impl_with_item(&ast::Adt::Struct(strukt.clone()), Some(list));
182182

src/tools/rust-analyzer/crates/ide-assists/src/handlers/replace_derive_with_manual_impl.rs

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -221,11 +221,7 @@ fn impl_def_from_trait(
221221
} else {
222222
Some(first.clone())
223223
};
224-
let items = first_item
225-
.into_iter()
226-
.chain(other.iter().cloned())
227-
.map(either::Either::Right)
228-
.collect();
224+
let items = first_item.into_iter().chain(other.iter().cloned()).collect();
229225
make::assoc_item_list(Some(items))
230226
} else {
231227
make::assoc_item_list(None)

src/tools/rust-analyzer/crates/syntax/src/ast/make.rs

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -229,9 +229,7 @@ pub fn ty_fn_ptr<I: Iterator<Item = Param>>(
229229
}
230230
}
231231

232-
pub fn assoc_item_list(
233-
body: Option<Vec<either::Either<ast::Attr, ast::AssocItem>>>,
234-
) -> ast::AssocItemList {
232+
pub fn assoc_item_list(body: Option<Vec<ast::AssocItem>>) -> ast::AssocItemList {
235233
let is_break_braces = body.is_some();
236234
let body_newline = if is_break_braces { "\n".to_owned() } else { String::new() };
237235
let body_indent = if is_break_braces { " ".to_owned() } else { String::new() };

0 commit comments

Comments
 (0)