Skip to content

Commit 29b20da

Browse files
committed
make changes to add_missing_impl_members to update changes to utils
1 parent 1c6f47c commit 29b20da

2 files changed

Lines changed: 29 additions & 32 deletions

File tree

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

Lines changed: 14 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,16 @@
11
use hir::HasSource;
22
use syntax::{
33
Edition,
4-
ast::{self, AstNode, make},
4+
ast::{self, AstNode, syntax_factory::SyntaxFactory},
55
syntax_editor::{Position, SyntaxEditor},
66
};
77

88
use crate::{
99
AssistId,
1010
assist_context::{AssistContext, Assists},
1111
utils::{
12-
DefaultMethods, IgnoreAssocItems, add_trait_assoc_items_to_impl, filter_assoc_items,
13-
gen_trait_fn_body,
12+
DefaultMethods, IgnoreAssocItems, add_trait_assoc_items_to_impl_with_factory,
13+
filter_assoc_items, gen_trait_fn_body,
1414
},
1515
};
1616

@@ -148,7 +148,9 @@ fn add_missing_impl_members_inner(
148148

149149
let target = impl_def.syntax().text_range();
150150
acc.add(AssistId::quick_fix(assist_id), label, target, |edit| {
151-
let new_item = add_trait_assoc_items_to_impl(
151+
let make = SyntaxFactory::with_mappings();
152+
let new_item = add_trait_assoc_items_to_impl_with_factory(
153+
&make,
152154
&ctx.sema,
153155
ctx.config,
154156
&missing_items,
@@ -164,6 +166,7 @@ fn add_missing_impl_members_inner(
164166
let mut first_new_item = if let DefaultMethods::No = mode
165167
&& let ast::AssocItem::Fn(func) = &first_new_item
166168
&& let Some(body) = try_gen_trait_body(
169+
&make,
167170
ctx,
168171
func,
169172
trait_ref,
@@ -189,10 +192,10 @@ fn add_missing_impl_members_inner(
189192
if let Some(assoc_item_list) = impl_def.assoc_item_list() {
190193
assoc_item_list.add_items(&mut editor, new_assoc_items);
191194
} else {
192-
let assoc_item_list = make::assoc_item_list(Some(new_assoc_items)).clone_for_update();
195+
let assoc_item_list = make.assoc_item_list(new_assoc_items);
193196
editor.insert_all(
194197
Position::after(impl_def.syntax()),
195-
vec![make::tokens::whitespace(" ").into(), assoc_item_list.syntax().clone().into()],
198+
vec![make.whitespace(" ").into(), assoc_item_list.syntax().clone().into()],
196199
);
197200
first_new_item = assoc_item_list.assoc_items().next();
198201
}
@@ -215,23 +218,24 @@ fn add_missing_impl_members_inner(
215218
editor.add_annotation(first_new_item.syntax(), tabstop);
216219
};
217220
};
221+
editor.add_mappings(make.finish_with_mappings());
218222
edit.add_file_edits(ctx.vfs_file_id(), editor);
219223
})
220224
}
221225

222226
fn try_gen_trait_body(
227+
make: &SyntaxFactory,
223228
ctx: &AssistContext<'_>,
224229
func: &ast::Fn,
225230
trait_ref: hir::TraitRef<'_>,
226231
impl_def: &ast::Impl,
227232
edition: Edition,
228233
) -> Option<ast::BlockExpr> {
229-
let trait_path = make::ext::ident_path(
230-
&trait_ref.trait_().name(ctx.db()).display(ctx.db(), edition).to_string(),
231-
);
234+
let trait_path =
235+
make.ident_path(&trait_ref.trait_().name(ctx.db()).display(ctx.db(), edition).to_string());
232236
let hir_ty = ctx.sema.resolve_type(&impl_def.self_ty()?)?;
233237
let adt = hir_ty.as_adt()?.source(ctx.db())?;
234-
gen_trait_fn_body(func, &trait_path, &adt.value, Some(trait_ref))
238+
gen_trait_fn_body(make, func, &trait_path, &adt.value, Some(trait_ref))
235239
}
236240

237241
#[cfg(test)]

crates/ide-assists/src/utils/gen_trait_fn_body.rs

Lines changed: 15 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,10 @@
11
//! This module contains functions to generate default trait impl function bodies where possible.
22
33
use hir::TraitRef;
4-
use syntax::ast::{self, AstNode, BinaryOp, CmpOp, HasName, LogicOp, edit::AstNodeEdit, syntax_factory::SyntaxFactory};
4+
use syntax::ast::{
5+
self, AstNode, BinaryOp, CmpOp, HasName, LogicOp, edit::AstNodeEdit,
6+
syntax_factory::SyntaxFactory,
7+
};
58

69
/// Generate custom trait bodies without default implementation where possible.
710
///
@@ -94,8 +97,7 @@ fn gen_clone_impl(make: &SyntaxFactory, adt: &ast::Adt) -> Option<ast::BlockExpr
9497
}
9598
let pat = make.tuple_struct_pat(variant_name.clone(), pats.into_iter());
9699
let struct_name = make.expr_path(variant_name);
97-
let tuple_expr =
98-
make.expr_call(struct_name, make.arg_list(fields)).into();
100+
let tuple_expr = make.expr_call(struct_name, make.arg_list(fields)).into();
99101
arms.push(make.match_arm(pat.into(), None, tuple_expr));
100102
}
101103

@@ -197,8 +199,7 @@ fn gen_debug_impl(make: &SyntaxFactory, adt: &ast::Adt) -> Option<ast::BlockExpr
197199

198200
// => <expr>.finish()
199201
let method = make.name_ref("finish");
200-
let expr =
201-
make.expr_method_call(expr, method, make.arg_list([])).into();
202+
let expr = make.expr_method_call(expr, method, make.arg_list([])).into();
202203

203204
// => MyStruct { fields.. } => f.debug_struct("MyStruct")...finish(),
204205
let pat_field_list = make.record_pat_field_list(pats, None);
@@ -232,19 +233,16 @@ fn gen_debug_impl(make: &SyntaxFactory, adt: &ast::Adt) -> Option<ast::BlockExpr
232233

233234
// => <expr>.finish()
234235
let method = make.name_ref("finish");
235-
let expr=
236-
make.expr_method_call(expr, method, make.arg_list([])).into();
236+
let expr = make.expr_method_call(expr, method, make.arg_list([])).into();
237237

238238
// => MyStruct (fields..) => f.debug_tuple("MyStruct")...finish(),
239239
let pat = make.tuple_struct_pat(variant_name.clone(), pats.into_iter());
240240
arms.push(make.match_arm(pat.into(), None, expr));
241241
}
242242
None => {
243-
let fmt_string =
244-
make.expr_literal(&(format!("\"{name}\""))).into();
245-
let args = make.token_tree_from_node(
246-
make.arg_list([target, fmt_string]).syntax(),
247-
);
243+
let fmt_string = make.expr_literal(&(format!("\"{name}\""))).into();
244+
let args =
245+
make.token_tree_from_node(make.arg_list([target, fmt_string]).syntax());
248246
let macro_name = make.ident_path("write");
249247
let macro_call = make.expr_macro(macro_name, args);
250248

@@ -278,8 +276,7 @@ fn gen_debug_impl(make: &SyntaxFactory, adt: &ast::Adt) -> Option<ast::BlockExpr
278276
let mut expr = make.expr_method_call(target, method, args).into();
279277
for field in field_list.fields() {
280278
let name = field.name()?;
281-
let f_name =
282-
make.expr_literal(&(format!("\"{name}\""))).into();
279+
let f_name = make.expr_literal(&(format!("\"{name}\""))).into();
283280
let f_path = make.expr_path(make.ident_path("self"));
284281
let f_path = make.expr_field(f_path, &format!("{name}")).into();
285282
let f_path = make.expr_ref(f_path, false);
@@ -298,9 +295,7 @@ fn gen_debug_impl(make: &SyntaxFactory, adt: &ast::Adt) -> Option<ast::BlockExpr
298295
let f_path = make.expr_field(f_path, &format!("{i}")).into();
299296
let f_path = make.expr_ref(f_path, false);
300297
let method = make.name_ref("field");
301-
expr = make
302-
.expr_method_call(expr, method, make.arg_list([f_path]))
303-
.into();
298+
expr = make.expr_method_call(expr, method, make.arg_list([f_path])).into();
304299
}
305300
expr
306301
}
@@ -354,9 +349,8 @@ fn gen_default_impl(make: &SyntaxFactory, adt: &ast::Adt) -> Option<ast::BlockEx
354349
make.record_expr(struct_name, fields).into()
355350
}
356351
};
357-
let body = make
358-
.block_expr(None::<ast::Stmt>, Some(expr))
359-
.indent(ast::edit::IndentLevel(1));
352+
let body =
353+
make.block_expr(None::<ast::Stmt>, Some(expr)).indent(ast::edit::IndentLevel(1));
360354
Some(body)
361355
}
362356
}
@@ -391,8 +385,7 @@ fn gen_hash_impl(make: &SyntaxFactory, adt: &ast::Adt) -> Option<ast::BlockExpr>
391385
let mut stmts = vec![];
392386
for field in field_list.fields() {
393387
let base = make.expr_path(make.ident_path("self"));
394-
let target =
395-
make.expr_field(base, &field.name()?.to_string()).into();
388+
let target = make.expr_field(base, &field.name()?.to_string()).into();
396389
stmts.push(gen_hash_call(target));
397390
}
398391
make.block_expr(stmts, None).indent(ast::edit::IndentLevel(1))

0 commit comments

Comments
 (0)