Skip to content

Commit c41c134

Browse files
authored
Merge pull request #22105 from Shourya742/2026-04-20-replace-most-make-with-editor-specific-make
Replace make with SyntaxFactory in few handlers
2 parents d9ae790 + f932567 commit c41c134

8 files changed

Lines changed: 91 additions & 81 deletions

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

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ use ide_db::{famous_defs::FamousDefs, helpers::mod_path_to_ast};
88
use itertools::Itertools;
99
use syntax::ast::edit::IndentLevel;
1010
use syntax::ast::syntax_factory::SyntaxFactory;
11-
use syntax::ast::{self, AstNode, MatchArmList, MatchExpr, Pat, make};
11+
use syntax::ast::{self, AstNode, MatchArmList, MatchExpr, Pat};
1212
use syntax::syntax_editor::{Position, SyntaxEditor};
1313
use syntax::{SyntaxKind, SyntaxNode, ToSmolStr};
1414

@@ -592,12 +592,12 @@ fn build_pat(
592592
ExtendedVariant::Variant { variant: var, use_self } => {
593593
let edition = module.krate(db).edition(db);
594594
let path = if use_self {
595-
make::path_from_segments(
595+
make.path_from_segments(
596596
[
597-
make::path_segment(make::name_ref_self_ty()),
598-
make::path_segment(make::name_ref(
599-
&var.name(db).display(db, edition).to_smolstr(),
600-
)),
597+
make.path_segment(make.name_ref_self_ty()),
598+
make.path_segment(
599+
make.name_ref(&var.name(db).display(db, edition).to_smolstr()),
600+
),
601601
],
602602
false,
603603
)
@@ -611,7 +611,7 @@ fn build_pat(
611611
let pats = fields.into_iter().map(|f| {
612612
let name = name_generator.for_type(&f.ty(db).to_type(db), db, edition);
613613
match name {
614-
Some(name) => make::ext::simple_ident_pat(make.name(&name)).into(),
614+
Some(name) => make.ident_pat(false, false, make.name(&name)).into(),
615615
None => make.wildcard_pat().into(),
616616
}
617617
});

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

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -99,21 +99,20 @@ fn edit_struct_def(
9999
) {
100100
// Note that we don't need to consider macro files in this function because this is
101101
// currently not triggered for struct definitions inside macro calls.
102+
let editor = builder.make_editor(strukt.syntax());
103+
let make = editor.make();
104+
102105
let tuple_fields = record_fields.fields().filter_map(|f| {
103-
let (editor, field) =
104-
SyntaxEditor::with_ast_node(&ast::make::tuple_field(f.visibility(), f.ty()?));
105-
editor.insert_all(
106+
let (field_editor, field) =
107+
SyntaxEditor::with_ast_node(&make.tuple_field(f.visibility(), f.ty()?));
108+
field_editor.insert_all(
106109
Position::first_child_of(field.syntax()),
107110
f.attrs().map(|attr| attr.syntax().clone().into()).collect(),
108111
);
109-
let field_syntax = editor.finish().new_root().clone();
110-
let field = ast::TupleField::cast(field_syntax)?;
111-
Some(field)
112+
let field_syntax = field_editor.finish().new_root().clone();
113+
ast::TupleField::cast(field_syntax)
112114
});
113115

114-
let editor = builder.make_editor(strukt.syntax());
115-
let make = editor.make();
116-
117116
let tuple_fields = make.tuple_field_list(tuple_fields);
118117

119118
let mut elements = vec![tuple_fields.syntax().clone().into()];

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

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -105,7 +105,7 @@ fn edit_struct_def(
105105
let make = editor.make();
106106
let record_fields = tuple_fields.fields().zip(names).filter_map(|(f, name)| {
107107
let (field_editor, field) =
108-
SyntaxEditor::with_ast_node(&ast::make::record_field(f.visibility(), name, f.ty()?));
108+
SyntaxEditor::with_ast_node(&make.record_field(f.visibility(), name, f.ty()?));
109109
field_editor.insert_all(
110110
Position::first_child_of(field.syntax()),
111111
f.attrs().map(|attr| attr.syntax().clone().into()).collect(),
@@ -119,21 +119,21 @@ fn edit_struct_def(
119119
if let Some(w) = strukt.where_clause() {
120120
editor.delete(w.syntax());
121121
let mut insert_element = Vec::new();
122-
insert_element.push(ast::make::tokens::single_newline().syntax_element());
122+
insert_element.push(make.whitespace("\n").syntax_element());
123123
insert_element.push(w.syntax().syntax_element());
124124
if w.syntax().last_token().is_none_or(|t| t.kind() != SyntaxKind::COMMA) {
125-
insert_element.push(ast::make::token(T![,]).into());
125+
insert_element.push(make.token(T![,]).into());
126126
}
127-
insert_element.push(ast::make::tokens::single_newline().syntax_element());
127+
insert_element.push(make.whitespace("\n").syntax_element());
128128
editor.insert_all(tuple_fields_before, insert_element);
129129
} else {
130-
editor.insert(tuple_fields_before, ast::make::tokens::single_space());
130+
editor.insert(tuple_fields_before, make.whitespace(" "));
131131
}
132132
if let Some(t) = strukt.semicolon_token() {
133133
editor.delete(t);
134134
}
135135
} else {
136-
editor.insert(tuple_fields_before, ast::make::tokens::single_space());
136+
editor.insert(tuple_fields_before, make.whitespace(" "));
137137
}
138138

139139
editor.replace(tuple_fields.syntax(), record_fields.syntax());
@@ -189,7 +189,7 @@ fn process_struct_name_reference(
189189
let range = ctx.sema.original_range_opt(tuple_struct_pat.syntax())?.range;
190190
let new = make.record_pat_with_fields(
191191
full_path,
192-
generate_record_pat_list(&tuple_struct_pat, names),
192+
generate_record_pat_list(&tuple_struct_pat, names, make),
193193
);
194194
editor.replace_all(cover_edit_range(source.syntax(), range), vec![new.syntax().clone().into()]);
195195
},
@@ -316,6 +316,7 @@ fn generate_names(
316316
fn generate_record_pat_list(
317317
pat: &ast::TupleStructPat,
318318
names: &[ast::Name],
319+
make: &SyntaxFactory,
319320
) -> ast::RecordPatFieldList {
320321
let pure_fields = pat.fields().filter(|p| !matches!(p, ast::Pat::RestPat(_)));
321322
let rest_len = names.len().saturating_sub(pure_fields.clone().count());
@@ -327,8 +328,8 @@ fn generate_record_pat_list(
327328

328329
let fields = before_rest
329330
.chain(after_rest)
330-
.map(|(pat, name)| ast::make::record_pat_field(ast::make::name_ref(&name.text()), pat));
331-
ast::make::record_pat_field_list(fields, rest_pat)
331+
.map(|(pat, name)| make.record_pat_field(make.name_ref(&name.text()), pat));
332+
make.record_pat_field_list(fields, rest_pat)
332333
}
333334

334335
#[cfg(test)]

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

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,8 @@ use ide_db::assists::AssistId;
33
use syntax::{
44
AstNode, AstToken, SyntaxKind, T,
55
ast::{
6-
self, HasDocComments, HasGenericParams, HasName, HasVisibility, edit::AstNodeEdit, make,
6+
self, HasDocComments, HasGenericParams, HasName, HasVisibility, edit::AstNodeEdit,
7+
syntax_factory::SyntaxFactory,
78
},
89
syntax_editor::{Position, SyntaxEditor},
910
};
@@ -112,7 +113,7 @@ pub(crate) fn generate_trait_from_impl(acc: &mut Assists, ctx: &AssistContext<'_
112113
let make = editor.make();
113114
let trait_ast = make.trait_(
114115
false,
115-
&trait_name(&impl_assoc_items).text(),
116+
&trait_name(&impl_assoc_items, make).text(),
116117
impl_ast.generic_param_list(),
117118
impl_ast.where_clause(),
118119
trait_items,
@@ -124,9 +125,9 @@ pub(crate) fn generate_trait_from_impl(acc: &mut Assists, ctx: &AssistContext<'_
124125
// Change `impl Foo` to `impl NewTrait for Foo`
125126
let mut elements = vec![
126127
trait_name_ref.syntax().clone().into(),
127-
make::tokens::single_space().into(),
128-
make::token(T![for]).into(),
129-
make::tokens::single_space().into(),
128+
make.whitespace(" ").into(),
129+
make.token(T![for]).into(),
130+
make.whitespace(" ").into(),
130131
];
131132

132133
if let Some(params) = impl_ast.generic_param_list() {
@@ -146,7 +147,7 @@ pub(crate) fn generate_trait_from_impl(acc: &mut Assists, ctx: &AssistContext<'_
146147
Position::before(impl_ast.syntax()),
147148
vec![
148149
trait_ast.syntax().clone().into(),
149-
make::tokens::whitespace(&format!("\n\n{}", impl_ast.indent_level())).into(),
150+
make.whitespace(&format!("\n\n{}", impl_ast.indent_level())).into(),
150151
],
151152
);
152153

@@ -163,16 +164,16 @@ pub(crate) fn generate_trait_from_impl(acc: &mut Assists, ctx: &AssistContext<'_
163164
Some(())
164165
}
165166

166-
fn trait_name(items: &ast::AssocItemList) -> ast::Name {
167+
fn trait_name(items: &ast::AssocItemList, make: &SyntaxFactory) -> ast::Name {
167168
let mut fn_names = items
168169
.assoc_items()
169170
.filter_map(|x| if let ast::AssocItem::Fn(f) = x { f.name() } else { None });
170171
fn_names
171172
.next()
172173
.and_then(|name| {
173-
fn_names.next().is_none().then(|| make::name(&stdx::to_camel_case(&name.text())))
174+
fn_names.next().is_none().then(|| make.name(&stdx::to_camel_case(&name.text())))
174175
})
175-
.unwrap_or_else(|| make::name("NewTrait"))
176+
.unwrap_or_else(|| make.name("NewTrait"))
176177
}
177178

178179
/// `E0449` Trait items always share the visibility of their trait
@@ -202,6 +203,7 @@ fn remove_doc_comments(editor: &SyntaxEditor, item: &ast::AssocItem) {
202203
}
203204

204205
fn strip_body(editor: &SyntaxEditor, item: &ast::AssocItem) {
206+
let make = editor.make();
205207
if let ast::AssocItem::Fn(f) = item
206208
&& let Some(body) = f.body()
207209
{
@@ -213,7 +215,7 @@ fn strip_body(editor: &SyntaxEditor, item: &ast::AssocItem) {
213215
editor.delete(prev);
214216
}
215217

216-
editor.replace(body.syntax(), make::tokens::semicolon());
218+
editor.replace(body.syntax(), make.token(T![;]));
217219
};
218220
}
219221

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

Lines changed: 16 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
use itertools::Itertools;
22
use syntax::{
33
Edition, NodeOrToken, SyntaxNode, SyntaxToken, T,
4-
ast::{self, AstNode, make},
4+
ast::{self, AstNode, syntax_factory::SyntaxFactory},
55
match_ast,
66
syntax_editor::{Position, SyntaxEditor},
77
};
@@ -24,6 +24,8 @@ use crate::{AssistContext, AssistId, Assists};
2424
// }
2525
// ```
2626
pub(crate) fn remove_dbg(acc: &mut Assists, ctx: &AssistContext<'_>) -> Option<()> {
27+
let (editor, _) = SyntaxEditor::new(ctx.source_file().syntax().clone());
28+
let make = editor.make();
2729
let macro_calls = if ctx.has_empty_selection() {
2830
vec![ctx.find_node_at_offset::<ast::MacroExpr>()?]
2931
} else {
@@ -39,15 +41,16 @@ pub(crate) fn remove_dbg(acc: &mut Assists, ctx: &AssistContext<'_>) -> Option<(
3941
.collect()
4042
};
4143

42-
let replacements =
43-
macro_calls.into_iter().filter_map(compute_dbg_replacement).collect::<Vec<_>>();
44+
let replacements = macro_calls
45+
.into_iter()
46+
.filter_map(|macro_expr| compute_dbg_replacement(macro_expr, make))
47+
.collect::<Vec<_>>();
4448
let target = replacements
4549
.iter()
4650
.flat_map(|(node_or_token, _)| node_or_token.iter())
4751
.map(|t| t.text_range())
4852
.reduce(|acc, range| acc.cover(range))?;
4953
acc.add(AssistId::quick_fix("remove_dbg"), "Remove dbg!()", target, |builder| {
50-
let editor = builder.make_editor(ctx.source_file().syntax());
5154
for (range, expr) in replacements {
5255
if let Some(expr) = expr {
5356
editor.insert(Position::before(range[0].clone()), expr.syntax());
@@ -68,6 +71,7 @@ pub(crate) fn remove_dbg(acc: &mut Assists, ctx: &AssistContext<'_>) -> Option<(
6871
/// Returns `Some(_, None)` when the macro call should just be removed.
6972
fn compute_dbg_replacement(
7073
macro_expr: ast::MacroExpr,
74+
make: &SyntaxFactory,
7175
) -> Option<(Vec<NodeOrToken<SyntaxNode, SyntaxToken>>, Option<ast::Expr>)> {
7276
let macro_call = macro_expr.macro_call()?;
7377
let tt = macro_call.token_tree()?;
@@ -110,7 +114,7 @@ fn compute_dbg_replacement(
110114
}
111115
(replace, None)
112116
},
113-
_ => (vec![macro_call.syntax().clone().into()], Some(make::ext::expr_unit())),
117+
_ => (vec![macro_call.syntax().clone().into()], Some(make.expr_unit())),
114118
}
115119
}
116120
}
@@ -162,14 +166,14 @@ fn compute_dbg_replacement(
162166
},
163167
None => false,
164168
};
165-
let expr = replace_nested_dbgs(expr.clone());
166-
let expr = if wrap { make::expr_paren(expr).into() } else { expr };
169+
let expr = replace_nested_dbgs(expr.clone(), make);
170+
let expr = if wrap { make.expr_paren(expr).into() } else { expr };
167171
(vec![macro_call.syntax().clone().into()], Some(expr))
168172
}
169173
// dbg!(expr0, expr1, ...)
170174
exprs => {
171-
let exprs = exprs.iter().cloned().map(replace_nested_dbgs);
172-
let expr = make::expr_tuple(exprs);
175+
let exprs = exprs.iter().cloned().map(|expr| replace_nested_dbgs(expr, make));
176+
let expr = make.expr_tuple(exprs);
173177
(vec![macro_call.syntax().clone().into()], Some(expr.into()))
174178
}
175179
})
@@ -189,12 +193,12 @@ fn pure_expr(expr: &ast::Expr) -> bool {
189193
}
190194
}
191195

192-
fn replace_nested_dbgs(expanded: ast::Expr) -> ast::Expr {
196+
fn replace_nested_dbgs(expanded: ast::Expr, make: &SyntaxFactory) -> ast::Expr {
193197
if let ast::Expr::MacroExpr(mac) = &expanded {
194198
// Special-case when `expanded` itself is `dbg!()` since we cannot replace the whole tree
195199
// with `ted`. It should be fairly rare as it means the user wrote `dbg!(dbg!(..))` but you
196200
// never know how code ends up being!
197-
let replaced = if let Some((_, expr_opt)) = compute_dbg_replacement(mac.clone()) {
201+
let replaced = if let Some((_, expr_opt)) = compute_dbg_replacement(mac.clone(), make) {
198202
match expr_opt {
199203
Some(expr) => expr,
200204
None => {
@@ -215,7 +219,7 @@ fn replace_nested_dbgs(expanded: ast::Expr) -> ast::Expr {
215219
expanded.syntax().descendants().filter_map(ast::MacroExpr::cast).collect();
216220

217221
for mac in macro_exprs {
218-
let expr_opt = match compute_dbg_replacement(mac.clone()) {
222+
let expr_opt = match compute_dbg_replacement(mac.clone(), make) {
219223
Some((_, expr)) => expr,
220224
None => continue,
221225
};

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

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
use syntax::{
22
AstNode, SyntaxKind,
3-
ast::{self, HasAttrs, HasVisibility, edit::IndentLevel, make},
4-
syntax_editor::{Element, Position, Removable},
3+
ast::{self, HasAttrs, HasVisibility, edit::IndentLevel, syntax_factory::SyntaxFactory},
4+
syntax_editor::{Element, Position, Removable, SyntaxEditor},
55
};
66

77
use crate::{
@@ -22,6 +22,8 @@ use crate::{
2222
// use std::fmt::Display;
2323
// ```
2424
pub(crate) fn unmerge_imports(acc: &mut Assists, ctx: &AssistContext<'_>) -> Option<()> {
25+
let (editor, _) = SyntaxEditor::new(ctx.source_file().syntax().clone());
26+
let make = editor.make();
2527
let tree = ctx.find_node_at_offset::<ast::UseTree>()?;
2628

2729
let tree_list = tree.syntax().parent().and_then(ast::UseTreeList::cast)?;
@@ -31,7 +33,7 @@ pub(crate) fn unmerge_imports(acc: &mut Assists, ctx: &AssistContext<'_>) -> Opt
3133
}
3234

3335
let use_ = tree_list.syntax().ancestors().find_map(ast::Use::cast)?;
34-
let path = resolve_full_path(&tree)?;
36+
let path = resolve_full_path(&tree, make)?;
3537

3638
// If possible, explain what is going to be done.
3739
let label = match tree.path().and_then(|path| path.first_segment()) {
@@ -41,7 +43,6 @@ pub(crate) fn unmerge_imports(acc: &mut Assists, ctx: &AssistContext<'_>) -> Opt
4143

4244
let target = tree.syntax().text_range();
4345
acc.add(AssistId::refactor_rewrite("unmerge_imports"), label, target, |builder| {
44-
let editor = builder.make_editor(use_.syntax());
4546
let make = editor.make();
4647
let new_use = make.use_(
4748
use_.attrs(),
@@ -64,15 +65,15 @@ pub(crate) fn unmerge_imports(acc: &mut Assists, ctx: &AssistContext<'_>) -> Opt
6465
})
6566
}
6667

67-
fn resolve_full_path(tree: &ast::UseTree) -> Option<ast::Path> {
68+
fn resolve_full_path(tree: &ast::UseTree, make: &SyntaxFactory) -> Option<ast::Path> {
6869
let paths = tree
6970
.syntax()
7071
.ancestors()
7172
.take_while(|n| n.kind() != SyntaxKind::USE)
7273
.filter_map(ast::UseTree::cast)
7374
.filter_map(|t| t.path());
7475

75-
let final_path = paths.reduce(|prev, next| make::path_concat(next, prev))?;
76+
let final_path = paths.reduce(|prev, next| make.path_concat(next, prev))?;
7677
if final_path.segment().is_some_and(|it| it.self_token().is_some()) {
7778
final_path.qualifier()
7879
} else {

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

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@ use syntax::{
33
ast::{
44
self,
55
edit::{AstNodeEdit, IndentLevel},
6-
make,
76
},
87
match_ast,
98
syntax_editor::{Element, Position, SyntaxEditor},
@@ -83,7 +82,8 @@ pub(crate) fn unwrap_block(acc: &mut Assists, ctx: &AssistContext<'_>) -> Option
8382
})
8483
}
8584

86-
fn delete_else_before(container: SyntaxNode, edit: &SyntaxEditor) {
85+
fn delete_else_before(container: SyntaxNode, editor: &SyntaxEditor) {
86+
let make = editor.make();
8787
let Some(else_token) = container
8888
.siblings_with_tokens(syntax::Direction::Prev)
8989
.skip(1)
@@ -94,10 +94,10 @@ fn delete_else_before(container: SyntaxNode, edit: &SyntaxEditor) {
9494
};
9595
itertools::chain(else_token.prev_token(), else_token.next_token())
9696
.filter(|it| it.kind() == SyntaxKind::WHITESPACE)
97-
.for_each(|it| edit.delete(it));
97+
.for_each(|it| editor.delete(it));
9898
let indent = IndentLevel::from_node(&container);
99-
let newline = make::tokens::whitespace(&format!("\n{indent}"));
100-
edit.replace(else_token, newline);
99+
let newline = make.whitespace(&format!("\n{indent}"));
100+
editor.replace(else_token, newline);
101101
}
102102

103103
fn wrap_let(assign: &ast::LetStmt, replacement: ast::BlockExpr) -> ast::BlockExpr {

0 commit comments

Comments
 (0)