Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'crates/ide-assists/src/handlers/convert_named_struct_to_tuple_struct.rs')
-rw-r--r--crates/ide-assists/src/handlers/convert_named_struct_to_tuple_struct.rs71
1 files changed, 34 insertions, 37 deletions
diff --git a/crates/ide-assists/src/handlers/convert_named_struct_to_tuple_struct.rs b/crates/ide-assists/src/handlers/convert_named_struct_to_tuple_struct.rs
index 4ea56e3e61..5b691dba5e 100644
--- a/crates/ide-assists/src/handlers/convert_named_struct_to_tuple_struct.rs
+++ b/crates/ide-assists/src/handlers/convert_named_struct_to_tuple_struct.rs
@@ -3,9 +3,7 @@ use ide_db::{defs::Definition, search::FileReference};
use syntax::{
NodeOrToken, SyntaxKind, SyntaxNode, T,
algo::next_non_trivia_token,
- ast::{
- self, AstNode, HasAttrs, HasGenericParams, HasVisibility, syntax_factory::SyntaxFactory,
- },
+ ast::{self, AstNode, HasAttrs, HasGenericParams, HasVisibility},
match_ast,
syntax_editor::{Element, Position, SyntaxEditor},
};
@@ -101,27 +99,26 @@ fn edit_struct_def(
) {
// Note that we don't need to consider macro files in this function because this is
// currently not triggered for struct definitions inside macro calls.
+ let editor = builder.make_editor(strukt.syntax());
+ let make = editor.make();
+
let tuple_fields = record_fields.fields().filter_map(|f| {
- let (mut editor, field) =
- SyntaxEditor::with_ast_node(&ast::make::tuple_field(f.visibility(), f.ty()?));
- editor.insert_all(
+ let (field_editor, field) =
+ SyntaxEditor::with_ast_node(&make.tuple_field(f.visibility(), f.ty()?));
+ field_editor.insert_all(
Position::first_child_of(field.syntax()),
f.attrs().map(|attr| attr.syntax().clone().into()).collect(),
);
- let field_syntax = editor.finish().new_root().clone();
- let field = ast::TupleField::cast(field_syntax)?;
- Some(field)
+ let field_syntax = field_editor.finish().new_root().clone();
+ ast::TupleField::cast(field_syntax)
});
- let make = SyntaxFactory::without_mappings();
- let mut edit = builder.make_editor(strukt.syntax());
-
let tuple_fields = make.tuple_field_list(tuple_fields);
let mut elements = vec![tuple_fields.syntax().clone().into()];
if let Either::Left(strukt) = strukt {
if let Some(w) = strukt.where_clause() {
- edit.delete(w.syntax());
+ editor.delete(w.syntax());
elements.extend([
make.whitespace("\n").into(),
@@ -136,23 +133,23 @@ fn edit_struct_def(
.and_then(|tok| tok.next_token())
.filter(|tok| tok.kind() == SyntaxKind::WHITESPACE)
{
- edit.delete(tok);
+ editor.delete(tok);
}
} else {
elements.push(make.token(T![;]).into());
}
}
- edit.replace_with_many(record_fields.syntax(), elements);
+ editor.replace_with_many(record_fields.syntax(), elements);
if let Some(tok) = record_fields
.l_curly_token()
.and_then(|tok| tok.prev_token())
.filter(|tok| tok.kind() == SyntaxKind::WHITESPACE)
{
- edit.delete(tok)
+ editor.delete(tok)
}
- builder.add_file_edits(ctx.vfs_file_id(), edit);
+ builder.add_file_edits(ctx.vfs_file_id(), editor);
}
fn edit_struct_references(
@@ -168,18 +165,18 @@ fn edit_struct_references(
for (file_id, refs) in usages {
let source = ctx.sema.parse(file_id);
- let mut edit = builder.make_editor(source.syntax());
+ let editor = builder.make_editor(source.syntax());
for r in refs {
- process_struct_name_reference(ctx, r, &mut edit, &source);
+ process_struct_name_reference(ctx, r, &editor, &source);
}
- builder.add_file_edits(file_id.file_id(ctx.db()), edit);
+ builder.add_file_edits(file_id.file_id(ctx.db()), editor);
}
}
fn process_struct_name_reference(
ctx: &AssistContext<'_>,
r: FileReference,
- edit: &mut SyntaxEditor,
+ edit: &SyntaxEditor,
source: &ast::SourceFile,
) -> Option<()> {
// First check if it's the last semgnet of a path that directly belongs to a record
@@ -232,7 +229,7 @@ fn process_struct_name_reference(
fn record_to_tuple_struct_like<T, I>(
ctx: &AssistContext<'_>,
source: &ast::SourceFile,
- edit: &mut SyntaxEditor,
+ editor: &SyntaxEditor,
field_list: T,
fields: impl FnOnce(&T) -> I,
) -> Option<()>
@@ -240,7 +237,7 @@ where
T: AstNode,
I: IntoIterator<Item = ast::NameRef>,
{
- let make = SyntaxFactory::without_mappings();
+ let make = editor.make();
let orig = ctx.sema.original_range_opt(field_list.syntax())?;
let list_range = cover_edit_range(source.syntax(), orig.range);
@@ -254,13 +251,13 @@ where
};
if l_curly.kind() == T!['{'] {
- delete_whitespace(edit, l_curly.prev_token());
- delete_whitespace(edit, l_curly.next_token());
- edit.replace(l_curly, make.token(T!['(']));
+ delete_whitespace(editor, l_curly.prev_token());
+ delete_whitespace(editor, l_curly.next_token());
+ editor.replace(l_curly, make.token(T!['(']));
}
if r_curly.kind() == T!['}'] {
- delete_whitespace(edit, r_curly.prev_token());
- edit.replace(r_curly, make.token(T![')']));
+ delete_whitespace(editor, r_curly.prev_token());
+ editor.replace(r_curly, make.token(T![')']));
}
for name_ref in fields(&field_list) {
@@ -270,14 +267,14 @@ where
if let Some(colon) = next_non_trivia_token(name_range.end().clone())
&& colon.kind() == T![:]
{
- edit.delete(&colon);
- edit.delete_all(name_range);
+ editor.delete(&colon);
+ editor.delete_all(name_range);
if let Some(next) = next_non_trivia_token(colon.clone())
&& next.kind() != T!['}']
{
// Avoid overlapping delete whitespace on `{ field: }`
- delete_whitespace(edit, colon.next_token());
+ delete_whitespace(editor, colon.next_token());
}
}
}
@@ -289,7 +286,6 @@ fn edit_field_references(
builder: &mut SourceChangeBuilder,
fields: impl Iterator<Item = ast::RecordField>,
) {
- let make = SyntaxFactory::without_mappings();
for (index, field) in fields.enumerate() {
let field = match ctx.sema.to_def(&field) {
Some(it) => it,
@@ -299,13 +295,14 @@ fn edit_field_references(
let usages = def.usages(&ctx.sema).all();
for (file_id, refs) in usages {
let source = ctx.sema.parse(file_id);
- let mut edit = builder.make_editor(source.syntax());
+ let editor = builder.make_editor(source.syntax());
+ let make = editor.make();
for r in refs {
if let Some(name_ref) = r.name.as_name_ref() {
// Only edit the field reference if it's part of a `.field` access
if name_ref.syntax().parent().and_then(ast::FieldExpr::cast).is_some() {
- edit.replace_all(
+ editor.replace_all(
cover_edit_range(source.syntax(), r.range),
vec![make.name_ref(&index.to_string()).syntax().clone().into()],
);
@@ -313,12 +310,12 @@ fn edit_field_references(
}
}
- builder.add_file_edits(file_id.file_id(ctx.db()), edit);
+ builder.add_file_edits(file_id.file_id(ctx.db()), editor);
}
}
}
-fn delete_whitespace(edit: &mut SyntaxEditor, whitespace: Option<impl Element>) {
+fn delete_whitespace(edit: &SyntaxEditor, whitespace: Option<impl Element>) {
let Some(whitespace) = whitespace else { return };
let NodeOrToken::Token(token) = whitespace.syntax_element() else { return };
@@ -328,7 +325,7 @@ fn delete_whitespace(edit: &mut SyntaxEditor, whitespace: Option<impl Element>)
}
fn remove_trailing_comma(w: ast::WhereClause) -> SyntaxNode {
- let (mut editor, w) = SyntaxEditor::new(w.syntax().clone());
+ let (editor, w) = SyntaxEditor::new(w.syntax().clone());
if let Some(last) = w.last_child_or_token()
&& last.kind() == T![,]
{