Skip to content

Commit d02bf21

Browse files
committed
migrate fn edit_struct_def in convert_tuple_struct_to_named_struct to SyntaxEditor
Signed-off-by: Hayashi Mikihiro <[email protected]>
1 parent 6e2306f commit d02bf21

File tree

1 file changed

+24
-30
lines changed

1 file changed

+24
-30
lines changed

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

Lines changed: 24 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
use either::Either;
22
use ide_db::defs::{Definition, NameRefClass};
33
use syntax::{
4-
SyntaxKind, SyntaxNode,
4+
SyntaxKind, SyntaxNode, T,
55
ast::{self, AstNode, HasAttrs, HasGenericParams, HasVisibility},
66
match_ast,
7-
syntax_editor::{Position, SyntaxEditor},
7+
syntax_editor::{Element, Position, SyntaxEditor},
88
};
99

1010
use crate::{AssistContext, AssistId, Assists, assist_context::SourceChangeBuilder};
@@ -72,7 +72,7 @@ pub(crate) fn convert_tuple_struct_to_named_struct(
7272
Either::Right(v) => Either::Right(ctx.sema.to_def(v)?),
7373
};
7474
let target = strukt_or_variant.as_ref().either(|s| s.syntax(), |v| v.syntax()).text_range();
75-
75+
let syntax = strukt_or_variant.as_ref().either(|s| s.syntax(), |v| v.syntax());
7676
acc.add(
7777
AssistId::refactor_rewrite("convert_tuple_struct_to_named_struct"),
7878
"Convert to named struct",
@@ -81,58 +81,53 @@ pub(crate) fn convert_tuple_struct_to_named_struct(
8181
let names = generate_names(tuple_fields.fields());
8282
edit_field_references(ctx, edit, tuple_fields.fields(), &names);
8383
edit_struct_references(ctx, edit, strukt_def, &names);
84-
edit_struct_def(ctx, edit, &strukt_or_variant, tuple_fields, names);
84+
let mut editor = edit.make_editor(syntax);
85+
edit_struct_def(&mut editor, &strukt_or_variant, tuple_fields, names);
86+
edit.add_file_edits(ctx.vfs_file_id(), editor);
8587
},
8688
)
8789
}
8890

8991
fn edit_struct_def(
90-
ctx: &AssistContext<'_>,
91-
edit: &mut SourceChangeBuilder,
92+
editor: &mut SyntaxEditor,
9293
strukt: &Either<ast::Struct, ast::Variant>,
9394
tuple_fields: ast::TupleFieldList,
9495
names: Vec<ast::Name>,
9596
) {
9697
let record_fields = tuple_fields.fields().zip(names).filter_map(|(f, name)| {
9798
let field = ast::make::record_field(f.visibility(), name, f.ty()?);
98-
let mut editor = SyntaxEditor::new(field.syntax().clone());
99-
editor.insert_all(
99+
let mut field_editor = SyntaxEditor::new(field.syntax().clone());
100+
field_editor.insert_all(
100101
Position::first_child_of(field.syntax()),
101102
f.attrs().map(|attr| attr.syntax().clone_subtree().clone_for_update().into()).collect(),
102103
);
103-
ast::RecordField::cast(editor.finish().new_root().clone())
104+
ast::RecordField::cast(field_editor.finish().new_root().clone())
104105
});
105-
let record_fields = ast::make::record_field_list(record_fields);
106-
let tuple_fields_text_range = tuple_fields.syntax().text_range();
107-
108-
edit.edit_file(ctx.vfs_file_id());
106+
let record_fields = ast::make::record_field_list(record_fields).clone_for_update();
107+
let tuple_fields_before = Position::before(tuple_fields.syntax());
109108

110109
if let Either::Left(strukt) = strukt {
111110
if let Some(w) = strukt.where_clause() {
112-
edit.delete(w.syntax().text_range());
113-
edit.insert(
114-
tuple_fields_text_range.start(),
115-
ast::make::tokens::single_newline().text(),
116-
);
117-
edit.insert(tuple_fields_text_range.start(), w.syntax().text());
111+
editor.delete(w.syntax());
112+
let mut insert_element = Vec::new();
113+
insert_element.push(ast::make::tokens::single_newline().syntax_element());
114+
insert_element.push(w.syntax().clone_for_update().syntax_element());
118115
if w.syntax().last_token().is_none_or(|t| t.kind() != SyntaxKind::COMMA) {
119-
edit.insert(tuple_fields_text_range.start(), ",");
116+
insert_element.push(ast::make::token(T![,]).into());
120117
}
121-
edit.insert(
122-
tuple_fields_text_range.start(),
123-
ast::make::tokens::single_newline().text(),
124-
);
118+
insert_element.push(ast::make::tokens::single_newline().syntax_element());
119+
editor.insert_all(tuple_fields_before, insert_element);
125120
} else {
126-
edit.insert(tuple_fields_text_range.start(), ast::make::tokens::single_space().text());
121+
editor.insert(tuple_fields_before, ast::make::tokens::single_space());
127122
}
128123
if let Some(t) = strukt.semicolon_token() {
129-
edit.delete(t.text_range());
124+
editor.delete(t);
130125
}
131126
} else {
132-
edit.insert(tuple_fields_text_range.start(), ast::make::tokens::single_space().text());
127+
editor.insert(tuple_fields_before, ast::make::tokens::single_space());
133128
}
134129

135-
edit.replace(tuple_fields_text_range, record_fields.to_string());
130+
editor.replace(tuple_fields.syntax(), record_fields.syntax());
136131
}
137132

138133
fn edit_struct_references(
@@ -1015,8 +1010,7 @@ where
10151010
pub struct $0Foo(#[my_custom_attr] u32);
10161011
"#,
10171012
r#"
1018-
pub struct Foo { #[my_custom_attr]
1019-
field1: u32 }
1013+
pub struct Foo { #[my_custom_attr]field1: u32 }
10201014
"#,
10211015
);
10221016
}

0 commit comments

Comments
 (0)