Skip to content

Commit 279b464

Browse files
authored
Merge pull request rust-lang#20364 from Hmikihiro/migrate_convert_from_to_tryfrom
Migrate `convert_from_to_tryfrom` assist to use `SyntaxEditor`
2 parents f360d6c + 81c4086 commit 279b464

File tree

1 file changed

+23
-19
lines changed

1 file changed

+23
-19
lines changed

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

Lines changed: 23 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,7 @@
11
use ide_db::{famous_defs::FamousDefs, traits::resolve_target_trait};
2-
use itertools::Itertools;
3-
use syntax::{
4-
ast::{self, AstNode, HasGenericArgs, HasName, make},
5-
ted,
6-
};
2+
use syntax::ast::edit::IndentLevel;
3+
use syntax::ast::{self, AstNode, HasGenericArgs, HasName, make};
4+
use syntax::syntax_editor::{Element, Position};
75

86
use crate::{AssistContext, AssistId, Assists};
97

@@ -49,6 +47,7 @@ pub(crate) fn convert_from_to_tryfrom(acc: &mut Assists, ctx: &AssistContext<'_>
4947
};
5048

5149
let associated_items = impl_.assoc_item_list()?;
50+
let associated_l_curly = associated_items.l_curly_token()?;
5251
let from_fn = associated_items.assoc_items().find_map(|item| {
5352
if let ast::AssocItem::Fn(f) = item
5453
&& f.name()?.text() == "from"
@@ -75,30 +74,25 @@ pub(crate) fn convert_from_to_tryfrom(acc: &mut Assists, ctx: &AssistContext<'_>
7574
"Convert From to TryFrom",
7675
impl_.syntax().text_range(),
7776
|builder| {
78-
let trait_ty = builder.make_mut(trait_ty);
79-
let from_fn_return_type = builder.make_mut(from_fn_return_type);
80-
let from_fn_name = builder.make_mut(from_fn_name);
81-
let tail_expr = builder.make_mut(tail_expr);
82-
let return_exprs = return_exprs.map(|r| builder.make_mut(r)).collect_vec();
83-
let associated_items = builder.make_mut(associated_items);
84-
85-
ted::replace(
77+
let mut editor = builder.make_editor(impl_.syntax());
78+
editor.replace(
8679
trait_ty.syntax(),
8780
make::ty(&format!("TryFrom<{from_type}>")).syntax().clone_for_update(),
8881
);
89-
ted::replace(
82+
editor.replace(
9083
from_fn_return_type.syntax(),
9184
make::ty("Result<Self, Self::Error>").syntax().clone_for_update(),
9285
);
93-
ted::replace(from_fn_name.syntax(), make::name("try_from").syntax().clone_for_update());
94-
ted::replace(
86+
editor
87+
.replace(from_fn_name.syntax(), make::name("try_from").syntax().clone_for_update());
88+
editor.replace(
9589
tail_expr.syntax(),
9690
wrap_ok(tail_expr.clone()).syntax().clone_for_update(),
9791
);
9892

9993
for r in return_exprs {
10094
let t = r.expr().unwrap_or_else(make::ext::expr_unit);
101-
ted::replace(t.syntax(), wrap_ok(t.clone()).syntax().clone_for_update());
95+
editor.replace(t.syntax(), wrap_ok(t.clone()).syntax().clone_for_update());
10296
}
10397

10498
let error_type = ast::AssocItem::TypeAlias(make::ty_alias(
@@ -114,10 +108,20 @@ pub(crate) fn convert_from_to_tryfrom(acc: &mut Assists, ctx: &AssistContext<'_>
114108
&& let ast::AssocItem::TypeAlias(type_alias) = &error_type
115109
&& let Some(ty) = type_alias.ty()
116110
{
117-
builder.add_placeholder_snippet(cap, ty);
111+
let placeholder = builder.make_placeholder_snippet(cap);
112+
editor.add_annotation(ty.syntax(), placeholder);
118113
}
119114

120-
associated_items.add_item_at_start(error_type);
115+
let indent = IndentLevel::from_token(&associated_l_curly) + 1;
116+
editor.insert_all(
117+
Position::after(associated_l_curly),
118+
vec![
119+
make::tokens::whitespace(&format!("\n{indent}")).syntax_element(),
120+
error_type.syntax().syntax_element(),
121+
make::tokens::whitespace("\n").syntax_element(),
122+
],
123+
);
124+
builder.add_file_edits(ctx.vfs_file_id(), editor);
121125
},
122126
)
123127
}

0 commit comments

Comments
 (0)