Skip to content

Commit 5342800

Browse files
committed
internal: rewrite **Repalce impl Trait** assist to mutable syntax trees
1 parent 984d20a commit 5342800

File tree

2 files changed

+20
-23
lines changed

2 files changed

+20
-23
lines changed

crates/ide_assists/src/handlers/replace_impl_trait_with_generic.rs

Lines changed: 13 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,7 @@
1-
use syntax::ast::{self, edit::AstNodeEdit, make, AstNode, GenericParamsOwner};
1+
use syntax::{
2+
ast::{self, edit_in_place::GenericParamsOwnerEdit, make, AstNode},
3+
ted,
4+
};
25

36
use crate::{utils::suggest_name, AssistContext, AssistId, AssistKind, Assists};
47

@@ -29,18 +32,17 @@ pub(crate) fn replace_impl_trait_with_generic(
2932
"Replace impl trait with generic",
3033
target,
3134
|edit| {
32-
let type_param_name = suggest_name::for_generic_parameter(&impl_trait_type);
35+
let impl_trait_type = edit.make_ast_mut(impl_trait_type);
36+
let fn_ = edit.make_ast_mut(fn_);
3337

34-
let generic_param_list = fn_
35-
.generic_param_list()
36-
.unwrap_or_else(|| make::generic_param_list(None))
37-
.append_param(make::generic_param(&type_param_name, Some(type_bound_list)));
38+
let type_param_name = suggest_name::for_generic_parameter(&impl_trait_type);
3839

39-
let new_type_fn = fn_
40-
.replace_descendant::<ast::Type>(impl_trait_type.into(), make::ty(&type_param_name))
41-
.with_generic_param_list(generic_param_list);
40+
let type_param =
41+
make::generic_param(&type_param_name, Some(type_bound_list)).clone_for_update();
42+
let new_ty = make::ty(&type_param_name).clone_for_update();
4243

43-
edit.replace_ast(fn_.clone(), new_type_fn);
44+
ted::replace(impl_trait_type.syntax(), new_ty.syntax());
45+
fn_.get_or_create_generic_param_list().add_generic_param(type_param)
4446
},
4547
)
4648
}
@@ -127,7 +129,7 @@ fn foo<
127129
fn foo<
128130
G: Foo,
129131
F,
130-
H, B: Bar
132+
H, B: Bar,
131133
>(bar: B) {}
132134
"#,
133135
);

crates/syntax/src/ast/edit_in_place.rs

Lines changed: 7 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -195,18 +195,13 @@ impl ast::GenericParamList {
195195
pub fn add_generic_param(&self, generic_param: ast::GenericParam) {
196196
match self.generic_params().last() {
197197
Some(last_param) => {
198-
let mut elems = Vec::new();
199-
if !last_param
200-
.syntax()
201-
.siblings_with_tokens(Direction::Next)
202-
.any(|it| it.kind() == T![,])
203-
{
204-
elems.push(make::token(T![,]).into());
205-
elems.push(make::tokens::single_space().into());
206-
};
207-
elems.push(generic_param.syntax().clone().into());
208-
let after_last_param = Position::after(last_param.syntax());
209-
ted::insert_all(after_last_param, elems);
198+
let position = Position::after(last_param.syntax());
199+
let elements = vec![
200+
make::token(T![,]).into(),
201+
make::tokens::single_space().into(),
202+
generic_param.syntax().clone().into(),
203+
];
204+
ted::insert_all(position, elements);
210205
}
211206
None => {
212207
let after_l_angle = Position::after(self.l_angle_token().unwrap());

0 commit comments

Comments
 (0)