Skip to content

Commit 94c2f68

Browse files
Merge pull request #22049 from Shourya742/2026-04-15-move-syntax-factory-inside-syntax-editor
Move syntax factory inside syntax editor
2 parents 1e7decd + 745286d commit 94c2f68

95 files changed

Lines changed: 903 additions & 1136 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

crates/hir-expand/src/builtin/derive_macro.rs

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ use crate::{
2222
use syntax::{
2323
ast::{
2424
self, AstNode, FieldList, HasAttrs, HasGenericArgs, HasGenericParams, HasModuleItem,
25-
HasName, HasTypeBounds, make, syntax_factory::SyntaxFactory,
25+
HasName, HasTypeBounds, make,
2626
},
2727
syntax_editor::{GetOrCreateWhereClause, SyntaxEditor},
2828
ted,
@@ -1294,10 +1294,8 @@ fn coerce_pointee_expand(
12941294
));
12951295
}
12961296

1297-
let (mut editor, strukt) = SyntaxEditor::with_ast_node(strukt);
1298-
let make = SyntaxFactory::with_mappings();
1299-
strukt.get_or_create_where_clause(&mut editor, &make, new_predicates.into_iter());
1300-
editor.add_mappings(make.finish_with_mappings());
1297+
let (editor, strukt) = SyntaxEditor::with_ast_node(strukt);
1298+
strukt.get_or_create_where_clause(&editor, new_predicates.into_iter());
13011299
let edit = editor.finish();
13021300
let strukt = ast::Struct::cast(edit.new_root().clone()).unwrap();
13031301
let adt = ast::Adt::Struct(strukt.clone());

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

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
use either::Either;
22
use syntax::{
33
AstNode, T,
4-
ast::{self, edit::AstNodeEdit, syntax_factory::SyntaxFactory},
4+
ast::{self, edit::AstNodeEdit},
55
match_ast,
66
};
77

@@ -56,15 +56,13 @@ pub(crate) fn add_braces(acc: &mut Assists, ctx: &AssistContext<'_>) -> Option<(
5656
},
5757
expr.syntax().text_range(),
5858
|builder| {
59-
let make = SyntaxFactory::with_mappings();
60-
let mut editor = builder.make_editor(expr.syntax());
59+
let editor = builder.make_editor(expr.syntax());
60+
let make = editor.make();
6161

6262
let new_expr = expr.reset_indent().indent(1.into());
6363
let block_expr = make.block_expr(None, Some(new_expr));
6464

6565
editor.replace(expr.syntax(), block_expr.indent(expr.indent_level()).syntax());
66-
67-
editor.add_mappings(make.finish_with_mappings());
6866
builder.add_file_edits(ctx.vfs_file_id(), editor);
6967
},
7068
)

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

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -53,18 +53,18 @@ pub(crate) fn add_explicit_method_call_deref(
5353
"Insert explicit method call derefs",
5454
dot_token.text_range(),
5555
|builder| {
56-
let mut edit = builder.make_editor(method_call_expr.syntax());
57-
let make = SyntaxFactory::without_mappings();
56+
let editor = builder.make_editor(method_call_expr.syntax());
57+
let make = editor.make();
5858
let mut expr = receiver.clone();
5959

6060
for adjust_kind in adjustments {
61-
expr = adjust_kind.wrap_expr(expr, &make);
61+
expr = adjust_kind.wrap_expr(expr, make);
6262
}
6363

6464
expr = make.expr_paren(expr).into();
65-
edit.replace(receiver.syntax(), expr.syntax());
65+
editor.replace(receiver.syntax(), expr.syntax());
6666

67-
builder.add_file_edits(ctx.vfs_file_id(), edit);
67+
builder.add_file_edits(ctx.vfs_file_id(), editor);
6868
},
6969
)
7070
}

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

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ use ide_db::{
33
};
44
use syntax::{
55
SyntaxToken, T,
6-
ast::{self, AstNode, HasLoopBody, syntax_factory::SyntaxFactory},
6+
ast::{self, AstNode, HasLoopBody},
77
syntax_editor::{Position, SyntaxEditor},
88
};
99

@@ -42,8 +42,8 @@ pub(crate) fn add_label_to_loop(acc: &mut Assists, ctx: &AssistContext<'_>) -> O
4242
"Add Label",
4343
loop_expr.syntax().text_range(),
4444
|builder| {
45-
let make = SyntaxFactory::with_mappings();
46-
let mut editor = builder.make_editor(loop_expr.syntax());
45+
let editor = builder.make_editor(loop_expr.syntax());
46+
let make = editor.make();
4747

4848
let label = make.lifetime("'l");
4949
let elements = vec![
@@ -65,11 +65,10 @@ pub(crate) fn add_label_to_loop(acc: &mut Assists, ctx: &AssistContext<'_>) -> O
6565
_ => return,
6666
};
6767
if let Some(token) = token {
68-
insert_label_after_token(&mut editor, &make, &token, ctx, builder);
68+
insert_label_after_token(&editor, &token, ctx, builder);
6969
}
7070
});
7171

72-
editor.add_mappings(make.finish_with_mappings());
7372
builder.add_file_edits(ctx.vfs_file_id(), editor);
7473
builder.rename();
7574
},
@@ -85,12 +84,12 @@ fn loop_token(loop_expr: &ast::AnyHasLoopBody) -> Option<syntax::SyntaxToken> {
8584
}
8685

8786
fn insert_label_after_token(
88-
editor: &mut SyntaxEditor,
89-
make: &SyntaxFactory,
87+
editor: &SyntaxEditor,
9088
token: &SyntaxToken,
9189
ctx: &AssistContext<'_>,
9290
builder: &mut SourceChangeBuilder,
9391
) {
92+
let make = editor.make();
9493
let label = make.lifetime("'l");
9594
let elements = vec![make.whitespace(" ").into(), label.syntax().clone().into()];
9695
editor.insert_all(Position::after(token), elements);

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

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -148,9 +148,10 @@ 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 make = SyntaxFactory::with_mappings();
151+
let editor = edit.make_editor(impl_def.syntax());
152+
let make = editor.make();
152153
let new_item = add_trait_assoc_items_to_impl(
153-
&make,
154+
make,
154155
&ctx.sema,
155156
ctx.config,
156157
&missing_items,
@@ -166,7 +167,7 @@ fn add_missing_impl_members_inner(
166167
let mut first_new_item = if let DefaultMethods::No = mode
167168
&& let ast::AssocItem::Fn(func) = &first_new_item
168169
&& let Some(body) = try_gen_trait_body(
169-
&make,
170+
make,
170171
ctx,
171172
func,
172173
trait_ref,
@@ -175,7 +176,7 @@ fn add_missing_impl_members_inner(
175176
)
176177
&& let Some(func_body) = func.body()
177178
{
178-
let (mut func_editor, _) = SyntaxEditor::new(first_new_item.syntax().clone());
179+
let (func_editor, _) = SyntaxEditor::new(first_new_item.syntax().clone());
179180
func_editor.replace(func_body.syntax(), body.syntax());
180181
ast::AssocItem::cast(func_editor.finish().new_root().clone())
181182
} else {
@@ -188,9 +189,8 @@ fn add_missing_impl_members_inner(
188189
.chain(other_items.iter().cloned())
189190
.collect::<Vec<_>>();
190191

191-
let mut editor = edit.make_editor(impl_def.syntax());
192192
if let Some(assoc_item_list) = impl_def.assoc_item_list() {
193-
assoc_item_list.add_items(&mut editor, new_assoc_items);
193+
assoc_item_list.add_items(&editor, new_assoc_items);
194194
} else {
195195
let assoc_item_list = make.assoc_item_list(new_assoc_items);
196196
editor.insert_all(
@@ -218,7 +218,6 @@ fn add_missing_impl_members_inner(
218218
editor.add_annotation(first_new_item.syntax(), tabstop);
219219
};
220220
};
221-
editor.add_mappings(make.finish_with_mappings());
222221
edit.add_file_edits(ctx.vfs_file_id(), editor);
223222
})
224223
}

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

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,7 @@ pub(crate) fn add_missing_match_arms(acc: &mut Assists, ctx: &AssistContext<'_>)
7474
.filter(|pat| !matches!(pat, Pat::WildcardPat(_)))
7575
.collect();
7676

77-
let make = SyntaxFactory::with_mappings();
77+
let make = SyntaxFactory::without_mappings();
7878

7979
let scope = ctx.sema.scope(expr.syntax())?;
8080
let module = scope.module();
@@ -271,12 +271,12 @@ pub(crate) fn add_missing_match_arms(acc: &mut Assists, ctx: &AssistContext<'_>)
271271
}
272272
};
273273

274-
let mut editor = builder.make_editor(&old_place);
274+
let editor = builder.make_editor(&old_place);
275275
let mut arms_edit = ArmsEdit { match_arm_list, place: old_place, last_arm: None };
276276

277-
arms_edit.remove_wildcard_arms(ctx, &mut editor);
278-
arms_edit.add_comma_after_last_arm(ctx, &make, &mut editor);
279-
arms_edit.append_arms(&missing_arms, &make, &mut editor);
277+
arms_edit.remove_wildcard_arms(ctx, &editor);
278+
arms_edit.add_comma_after_last_arm(ctx, &make, &editor);
279+
arms_edit.append_arms(&missing_arms, &make, &editor);
280280

281281
if let Some(cap) = ctx.config.snippet_cap {
282282
if let Some(it) = missing_arms
@@ -297,7 +297,6 @@ pub(crate) fn add_missing_match_arms(acc: &mut Assists, ctx: &AssistContext<'_>)
297297
}
298298
}
299299

300-
editor.add_mappings(make.take());
301300
builder.add_file_edits(ctx.vfs_file_id(), editor);
302301
},
303302
)
@@ -358,7 +357,7 @@ struct ArmsEdit {
358357
}
359358

360359
impl ArmsEdit {
361-
fn remove_wildcard_arms(&mut self, ctx: &AssistContext<'_>, editor: &mut SyntaxEditor) {
360+
fn remove_wildcard_arms(&mut self, ctx: &AssistContext<'_>, editor: &SyntaxEditor) {
362361
for arm in self.match_arm_list.arms() {
363362
if !matches!(arm.pat(), Some(Pat::WildcardPat(_))) {
364363
self.last_arm = Some(arm);
@@ -387,7 +386,7 @@ impl ArmsEdit {
387386
}
388387
}
389388

390-
fn append_arms(&self, arms: &[ast::MatchArm], make: &SyntaxFactory, editor: &mut SyntaxEditor) {
389+
fn append_arms(&self, arms: &[ast::MatchArm], make: &SyntaxFactory, editor: &SyntaxEditor) {
391390
let Some(mut before) = self.place.last_token() else {
392391
stdx::never!("match arm list not contain any token");
393392
return;
@@ -420,7 +419,7 @@ impl ArmsEdit {
420419
&self,
421420
ctx: &AssistContext<'_>,
422421
make: &SyntaxFactory,
423-
editor: &mut SyntaxEditor,
422+
editor: &SyntaxEditor,
424423
) {
425424
if let Some(last_arm) = &self.last_arm
426425
&& last_arm.comma_token().is_none()

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

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -93,8 +93,8 @@ pub(crate) fn add_turbo_fish(acc: &mut Assists, ctx: &AssistContext<'_>) -> Opti
9393
"Add `: _` before assignment operator",
9494
ident.text_range(),
9595
|builder| {
96-
let mut editor = builder.make_editor(let_stmt.syntax());
97-
let make = SyntaxFactory::without_mappings();
96+
let editor = builder.make_editor(let_stmt.syntax());
97+
let make = editor.make();
9898

9999
if let_stmt.semicolon_token().is_none() {
100100
editor.insert(
@@ -103,6 +103,7 @@ pub(crate) fn add_turbo_fish(acc: &mut Assists, ctx: &AssistContext<'_>) -> Opti
103103
);
104104
}
105105

106+
let make = editor.make();
106107
let placeholder_ty = make.ty_placeholder();
107108

108109
if let Some(pat) = let_stmt.pat() {
@@ -141,14 +142,12 @@ pub(crate) fn add_turbo_fish(acc: &mut Assists, ctx: &AssistContext<'_>) -> Opti
141142
ident.text_range(),
142143
|builder| {
143144
builder.trigger_parameter_hints();
144-
145-
let make = SyntaxFactory::with_mappings();
146-
let mut editor = match &turbofish_target {
145+
let editor = match &turbofish_target {
147146
Either::Left(it) => builder.make_editor(it.syntax()),
148147
Either::Right(it) => builder.make_editor(it.syntax()),
149148
};
150149

151-
let fish_head = get_fish_head(&make, number_of_arguments);
150+
let fish_head = get_fish_head(editor.make(), number_of_arguments);
152151

153152
match turbofish_target {
154153
Either::Left(path_segment) => {
@@ -180,8 +179,6 @@ pub(crate) fn add_turbo_fish(acc: &mut Assists, ctx: &AssistContext<'_>) -> Opti
180179
editor.add_annotation(arg.syntax(), builder.make_placeholder_snippet(cap));
181180
}
182181
}
183-
184-
editor.add_mappings(make.finish_with_mappings());
185182
builder.add_file_edits(ctx.vfs_file_id(), editor);
186183
},
187184
)

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

Lines changed: 15 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -80,9 +80,8 @@ pub(crate) fn apply_demorgan(acc: &mut Assists, ctx: &AssistContext<'_>) -> Opti
8080
_ => return None,
8181
};
8282

83-
let make = SyntaxFactory::with_mappings();
84-
85-
let (mut editor, demorganed) = SyntaxEditor::with_ast_node(&bin_expr);
83+
let (editor, demorganed) = SyntaxEditor::with_ast_node(&bin_expr);
84+
let make = editor.make();
8685
editor.replace(demorganed.op_token()?, make.token(inv_token));
8786

8887
let mut exprs = VecDeque::from([
@@ -98,7 +97,7 @@ pub(crate) fn apply_demorgan(acc: &mut Assists, ctx: &AssistContext<'_>) -> Opti
9897
exprs.push_back((bin_expr.lhs()?, cbin_expr.lhs()?, prec));
9998
exprs.push_back((bin_expr.rhs()?, cbin_expr.rhs()?, prec));
10099
} else {
101-
let mut inv = invert_boolean_expression(&make, expr);
100+
let mut inv = invert_boolean_expression(make, expr);
102101
if precedence(&inv).needs_parentheses_in(prec) {
103102
inv = make.expr_paren(inv).into();
104103
}
@@ -108,15 +107,14 @@ pub(crate) fn apply_demorgan(acc: &mut Assists, ctx: &AssistContext<'_>) -> Opti
108107
return None;
109108
}
110109
} else {
111-
let mut inv = invert_boolean_expression(&make, demorganed.clone());
110+
let mut inv = invert_boolean_expression(make, demorganed.clone());
112111
if precedence(&inv).needs_parentheses_in(prec) {
113112
inv = make.expr_paren(inv).into();
114113
}
115114
editor.replace(demorganed.syntax(), inv.syntax());
116115
}
117116
}
118117

119-
editor.add_mappings(make.finish_with_mappings());
120118
let edit = editor.finish();
121119
let demorganed = ast::Expr::cast(edit.new_root().clone())?;
122120

@@ -126,7 +124,9 @@ pub(crate) fn apply_demorgan(acc: &mut Assists, ctx: &AssistContext<'_>) -> Opti
126124
"Apply De Morgan's law",
127125
op_range,
128126
|builder| {
129-
let make = SyntaxFactory::with_mappings();
127+
let editor = builder.make_editor(bin_expr.syntax());
128+
let make = editor.make();
129+
130130
let (target_node, result_expr) = if let Some(neg_expr) = bin_expr
131131
.syntax()
132132
.parent()
@@ -141,9 +141,9 @@ pub(crate) fn apply_demorgan(acc: &mut Assists, ctx: &AssistContext<'_>) -> Opti
141141
bin_expr.syntax().parent().and_then(ast::ParenExpr::cast)
142142
{
143143
cov_mark::hit!(demorgan_double_parens);
144-
(paren_expr.syntax().clone(), add_bang_paren(&make, demorganed))
144+
(paren_expr.syntax().clone(), add_bang_paren(make, demorganed))
145145
} else {
146-
(bin_expr.syntax().clone(), add_bang_paren(&make, demorganed))
146+
(bin_expr.syntax().clone(), add_bang_paren(make, demorganed))
147147
};
148148

149149
let final_expr = if target_node
@@ -156,9 +156,7 @@ pub(crate) fn apply_demorgan(acc: &mut Assists, ctx: &AssistContext<'_>) -> Opti
156156
result_expr
157157
};
158158

159-
let mut editor = builder.make_editor(&target_node);
160159
editor.replace(&target_node, final_expr.syntax());
161-
editor.add_mappings(make.finish_with_mappings());
162160
builder.add_file_edits(ctx.vfs_file_id(), editor);
163161
},
164162
)
@@ -206,8 +204,8 @@ pub(crate) fn apply_demorgan_iterator(acc: &mut Assists, ctx: &AssistContext<'_>
206204
label,
207205
op_range,
208206
|builder| {
209-
let make = SyntaxFactory::with_mappings();
210-
let mut editor = builder.make_editor(method_call.syntax());
207+
let editor = builder.make_editor(method_call.syntax());
208+
let make = editor.make();
211209
// replace the method name
212210
let new_name = match name.text().as_str() {
213211
"all" => make.name_ref("any"),
@@ -217,7 +215,7 @@ pub(crate) fn apply_demorgan_iterator(acc: &mut Assists, ctx: &AssistContext<'_>
217215
editor.replace(name.syntax(), new_name.syntax());
218216

219217
// negate all tail expressions in the closure body
220-
let tail_cb = &mut |e: &_| tail_cb_impl(&mut editor, &make, e);
218+
let tail_cb = &mut |e: &_| tail_cb_impl(&editor, e);
221219
walk_expr(&closure_body, &mut |expr| {
222220
if let ast::Expr::ReturnExpr(ret_expr) = expr
223221
&& let Some(ret_expr_arg) = &ret_expr.expr()
@@ -240,8 +238,6 @@ pub(crate) fn apply_demorgan_iterator(acc: &mut Assists, ctx: &AssistContext<'_>
240238
} else {
241239
editor.insert(Position::before(method_call.syntax()), make.token(SyntaxKind::BANG));
242240
}
243-
244-
editor.add_mappings(make.finish_with_mappings());
245241
builder.add_file_edits(ctx.vfs_file_id(), editor);
246242
},
247243
)
@@ -269,18 +265,18 @@ fn validate_method_call_expr(
269265
it_type.impls_trait(sema.db, iter_trait, &[]).then_some((name_ref, arg_expr))
270266
}
271267

272-
fn tail_cb_impl(editor: &mut SyntaxEditor, make: &SyntaxFactory, e: &ast::Expr) {
268+
fn tail_cb_impl(editor: &SyntaxEditor, e: &ast::Expr) {
273269
match e {
274270
ast::Expr::BreakExpr(break_expr) => {
275271
if let Some(break_expr_arg) = break_expr.expr() {
276-
for_each_tail_expr(&break_expr_arg, &mut |e| tail_cb_impl(editor, make, e))
272+
for_each_tail_expr(&break_expr_arg, &mut |e| tail_cb_impl(editor, e))
277273
}
278274
}
279275
ast::Expr::ReturnExpr(_) => {
280276
// all return expressions have already been handled by the walk loop
281277
}
282278
e => {
283-
let inverted_body = invert_boolean_expression(make, e.clone());
279+
let inverted_body = invert_boolean_expression(editor.make(), e.clone());
284280
editor.replace(e.syntax(), inverted_body.syntax());
285281
}
286282
}

0 commit comments

Comments
 (0)