Skip to content

Commit 2fb563f

Browse files
committed
fix: refactor introduce_named_generic assist
Signed-off-by: Tarek <tareknaser360@gmail.com>
1 parent 5aaffe6 commit 2fb563f

File tree

2 files changed

+31
-42
lines changed

2 files changed

+31
-42
lines changed

crates/ide-assists/src/handlers/introduce_named_generic.rs

Lines changed: 5 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,6 @@
11
use ide_db::syntax_helpers::suggest_name;
22
use itertools::Itertools;
3-
use syntax::{
4-
ast::{self, syntax_factory::SyntaxFactory, AstNode, HasGenericParams, HasName},
5-
SyntaxElement,
6-
};
3+
use syntax::ast::{self, syntax_factory::SyntaxFactory, AstNode, HasGenericParams, HasName};
74

85
use crate::{AssistContext, AssistId, AssistKind, Assists};
96

@@ -25,20 +22,14 @@ pub(crate) fn introduce_named_generic(acc: &mut Assists, ctx: &AssistContext<'_>
2522

2623
let type_bound_list = impl_trait_type.type_bound_list()?;
2724

28-
// FIXME: Is this node appropriate to use for SyntaxEditor in this case?
29-
let parent_node = match ctx.covering_element() {
30-
SyntaxElement::Node(n) => n,
31-
SyntaxElement::Token(t) => t.parent()?,
32-
};
3325
let make = SyntaxFactory::new();
34-
3526
let target = fn_.syntax().text_range();
3627
acc.add(
3728
AssistId("introduce_named_generic", AssistKind::RefactorRewrite),
3829
"Replace impl trait with generic",
3930
target,
40-
|edit| {
41-
let mut editor = edit.make_editor(&parent_node);
31+
|builder| {
32+
let mut editor = builder.make_editor(fn_.syntax());
4233

4334
let existing_names = match fn_.generic_param_list() {
4435
Some(generic_param_list) => generic_param_list
@@ -63,11 +54,11 @@ pub(crate) fn introduce_named_generic(acc: &mut Assists, ctx: &AssistContext<'_>
6354
fn_.syntax_editor_add_generic_param(&mut editor, generic_param.clone());
6455

6556
if let Some(cap) = ctx.config.snippet_cap {
66-
editor.add_annotation(generic_param.syntax(), edit.make_tabstop_before(cap));
57+
editor.add_annotation(generic_param.syntax(), builder.make_tabstop_before(cap));
6758
}
6859

6960
editor.add_mappings(make.finish_with_mappings());
70-
edit.add_file_edits(ctx.file_id(), editor);
61+
builder.add_file_edits(ctx.file_id(), editor);
7162
},
7263
)
7364
}

crates/syntax/src/ast/edit_in_place.rs

Lines changed: 26 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -64,40 +64,38 @@ impl ast::Fn {
6464
) {
6565
match self.generic_param_list() {
6666
Some(generic_param_list) => match generic_param_list.generic_params().last() {
67-
Some(_last_param) => {
67+
Some(last_param) => {
6868
// There exists a generic param list and it's not empty
6969
let position = generic_param_list.r_angle_token().map_or_else(
7070
|| crate::syntax_editor::Position::last_child_of(self.syntax()),
7171
crate::syntax_editor::Position::before,
7272
);
7373

74-
if let Some(last_param) = generic_param_list.generic_params().last() {
75-
if last_param
76-
.syntax()
77-
.next_sibling_or_token()
78-
.map_or(false, |it| it.kind() == SyntaxKind::COMMA)
79-
{
80-
editor.insert(
81-
crate::syntax_editor::Position::after(last_param.syntax()),
82-
new_param.syntax().clone(),
83-
);
84-
editor.insert(
85-
crate::syntax_editor::Position::after(last_param.syntax()),
86-
make::token(SyntaxKind::WHITESPACE),
87-
);
88-
editor.insert(
89-
crate::syntax_editor::Position::after(last_param.syntax()),
90-
make::token(SyntaxKind::COMMA),
91-
);
92-
} else {
93-
let elements = vec![
94-
make::token(SyntaxKind::COMMA).into(),
95-
make::token(SyntaxKind::WHITESPACE).into(),
96-
new_param.syntax().clone().into(),
97-
];
98-
editor.insert_all(position, elements);
99-
}
100-
};
74+
if last_param
75+
.syntax()
76+
.next_sibling_or_token()
77+
.map_or(false, |it| it.kind() == SyntaxKind::COMMA)
78+
{
79+
editor.insert(
80+
crate::syntax_editor::Position::after(last_param.syntax()),
81+
new_param.syntax().clone(),
82+
);
83+
editor.insert(
84+
crate::syntax_editor::Position::after(last_param.syntax()),
85+
make::token(SyntaxKind::WHITESPACE),
86+
);
87+
editor.insert(
88+
crate::syntax_editor::Position::after(last_param.syntax()),
89+
make::token(SyntaxKind::COMMA),
90+
);
91+
} else {
92+
let elements = vec![
93+
make::token(SyntaxKind::COMMA).into(),
94+
make::token(SyntaxKind::WHITESPACE).into(),
95+
new_param.syntax().clone().into(),
96+
];
97+
editor.insert_all(position, elements);
98+
}
10199
}
102100
None => {
103101
// There exists a generic param list but it's empty

0 commit comments

Comments
 (0)