Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'crates/ide-assists/src/handlers/generate_deref.rs')
-rw-r--r--crates/ide-assists/src/handlers/generate_deref.rs68
1 files changed, 41 insertions, 27 deletions
diff --git a/crates/ide-assists/src/handlers/generate_deref.rs b/crates/ide-assists/src/handlers/generate_deref.rs
index 5534dc1cd3..5a514fca09 100644
--- a/crates/ide-assists/src/handlers/generate_deref.rs
+++ b/crates/ide-assists/src/handlers/generate_deref.rs
@@ -2,7 +2,7 @@ use hir::{ModPath, ModuleDef};
use ide_db::{FileId, RootDatabase, famous_defs::FamousDefs};
use syntax::{
Edition,
- ast::{self, AstNode, HasName, edit::AstNodeEdit, syntax_factory::SyntaxFactory},
+ ast::{self, AstNode, HasName, edit::AstNodeEdit},
syntax_editor::Position,
};
@@ -138,28 +138,35 @@ fn generate_edit(
trait_path: ModPath,
edition: Edition,
) {
- let make = SyntaxFactory::with_mappings();
+ let mut editor = edit.make_editor(strukt.syntax());
let strukt_adt = ast::Adt::Struct(strukt.clone());
- let trait_ty = make.ty(&trait_path.display(db, edition).to_string());
+ let trait_ty = editor.make().ty(&trait_path.display(db, edition).to_string());
let assoc_items: Vec<ast::AssocItem> = match deref_type {
DerefType::Deref => {
let target_alias =
- make.ty_alias([], "Target", None, None, None, Some((field_type, None)));
- let ret_ty =
- make.ty_ref(make.ty_path(make.path_from_text("Self::Target")).into(), false);
- let field_expr = make.expr_field(make.expr_path(make.ident_path("self")), field_name);
- let body = make.block_expr([], Some(make.expr_ref(field_expr.into(), false)));
- let fn_ = make
+ editor.make().ty_alias([], "Target", None, None, None, Some((field_type, None)));
+ let ret_ty = editor.make().ty_ref(
+ editor.make().ty_path(editor.make().path_from_text("Self::Target")).into(),
+ false,
+ );
+ let field_expr = editor
+ .make()
+ .expr_field(editor.make().expr_path(editor.make().ident_path("self")), field_name);
+ let body = editor
+ .make()
+ .block_expr([], Some(editor.make().expr_ref(field_expr.into(), false)));
+ let fn_ = editor
+ .make()
.fn_(
[],
None,
- make.name("deref"),
+ editor.make().name("deref"),
None,
None,
- make.param_list(Some(make.self_param()), []),
+ editor.make().param_list(Some(editor.make().self_param()), []),
body,
- Some(make.ret_type(ret_ty)),
+ Some(editor.make().ret_type(ret_ty)),
false,
false,
false,
@@ -169,20 +176,26 @@ fn generate_edit(
vec![ast::AssocItem::TypeAlias(target_alias), ast::AssocItem::Fn(fn_)]
}
DerefType::DerefMut => {
- let ret_ty =
- make.ty_ref(make.ty_path(make.path_from_text("Self::Target")).into(), true);
- let field_expr = make.expr_field(make.expr_path(make.ident_path("self")), field_name);
- let body = make.block_expr([], Some(make.expr_ref(field_expr.into(), true)));
- let fn_ = make
+ let ret_ty = editor.make().ty_ref(
+ editor.make().ty_path(editor.make().path_from_text("Self::Target")).into(),
+ true,
+ );
+ let field_expr = editor
+ .make()
+ .expr_field(editor.make().expr_path(editor.make().ident_path("self")), field_name);
+ let body =
+ editor.make().block_expr([], Some(editor.make().expr_ref(field_expr.into(), true)));
+ let fn_ = editor
+ .make()
.fn_(
[],
None,
- make.name("deref_mut"),
+ editor.make().name("deref_mut"),
None,
None,
- make.param_list(Some(make.mut_self_param()), []),
+ editor.make().param_list(Some(editor.make().mut_self_param()), []),
body,
- Some(make.ret_type(ret_ty)),
+ Some(editor.make().ret_type(ret_ty)),
false,
false,
false,
@@ -193,17 +206,18 @@ fn generate_edit(
}
};
- let body = make.assoc_item_list(assoc_items);
+ let body = editor.make().assoc_item_list(assoc_items);
let indent = strukt.indent_level();
- let impl_ = generate_trait_impl_intransitive_with_item(&make, &strukt_adt, trait_ty, body)
- .indent(indent);
-
- let mut editor = edit.make_editor(strukt.syntax());
+ let impl_ =
+ generate_trait_impl_intransitive_with_item(editor.make(), &strukt_adt, trait_ty, body)
+ .indent(indent);
editor.insert_all(
Position::after(strukt.syntax()),
- vec![make.whitespace(&format!("\n\n{indent}")).into(), impl_.syntax().clone().into()],
+ vec![
+ editor.make().whitespace(&format!("\n\n{indent}")).into(),
+ impl_.syntax().clone().into(),
+ ],
);
- editor.add_mappings(make.finish_with_mappings());
edit.add_file_edits(file_id, editor);
}