Skip to content

Commit fa20a50

Browse files
committed
Remove SyntaxRewriter usage in insert_use in favor of ted
1 parent e8744ed commit fa20a50

File tree

8 files changed

+185
-243
lines changed

8 files changed

+185
-243
lines changed

crates/ide_assists/src/handlers/auto_import.rs

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -101,9 +101,11 @@ pub(crate) fn auto_import(acc: &mut Assists, ctx: &AssistContext) -> Option<()>
101101
format!("Import `{}`", import.import_path),
102102
range,
103103
|builder| {
104-
let rewriter =
105-
insert_use(&scope, mod_path_to_ast(&import.import_path), ctx.config.insert_use);
106-
builder.rewrite(rewriter);
104+
let scope = match scope.clone() {
105+
ImportScope::File(it) => ImportScope::File(builder.make_ast_mut(it)),
106+
ImportScope::Module(it) => ImportScope::Module(builder.make_ast_mut(it)),
107+
};
108+
insert_use(&scope, mod_path_to_ast(&import.import_path), ctx.config.insert_use);
107109
},
108110
);
109111
}

crates/ide_assists/src/handlers/extract_struct_from_enum_variant.rs

Lines changed: 45 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -13,9 +13,9 @@ use ide_db::{
1313
};
1414
use rustc_hash::FxHashSet;
1515
use syntax::{
16-
algo::{find_node_at_offset, SyntaxRewriter},
17-
ast::{self, edit::IndentLevel, make, AstNode, NameOwner, VisibilityOwner},
18-
SourceFile, SyntaxElement, SyntaxNode, T,
16+
algo::find_node_at_offset,
17+
ast::{self, make, AstNode, NameOwner, VisibilityOwner},
18+
ted, SourceFile, SyntaxElement, SyntaxNode, T,
1919
};
2020

2121
use crate::{AssistContext, AssistId, AssistKind, Assists};
@@ -62,40 +62,45 @@ pub(crate) fn extract_struct_from_enum_variant(
6262
let mut visited_modules_set = FxHashSet::default();
6363
let current_module = enum_hir.module(ctx.db());
6464
visited_modules_set.insert(current_module);
65-
let mut def_rewriter = None;
65+
let mut def_file_references = None;
6666
for (file_id, references) in usages {
67-
let mut rewriter = SyntaxRewriter::default();
68-
let source_file = ctx.sema.parse(file_id);
67+
if file_id == ctx.frange.file_id {
68+
def_file_references = Some(references);
69+
continue;
70+
}
71+
builder.edit_file(file_id);
72+
let source_file = builder.make_ast_mut(ctx.sema.parse(file_id));
6973
for reference in references {
7074
update_reference(
7175
ctx,
72-
&mut rewriter,
7376
reference,
7477
&source_file,
7578
&enum_module_def,
7679
&variant_hir_name,
7780
&mut visited_modules_set,
7881
);
7982
}
80-
if file_id == ctx.frange.file_id {
81-
def_rewriter = Some(rewriter);
82-
continue;
83-
}
84-
builder.edit_file(file_id);
85-
builder.rewrite(rewriter);
8683
}
87-
let mut rewriter = def_rewriter.unwrap_or_default();
88-
update_variant(&mut rewriter, &variant);
84+
builder.edit_file(ctx.frange.file_id);
85+
let variant = builder.make_ast_mut(variant.clone());
86+
let source_file = builder.make_ast_mut(ctx.sema.parse(ctx.frange.file_id));
87+
for reference in def_file_references.into_iter().flatten() {
88+
update_reference(
89+
ctx,
90+
reference,
91+
&source_file,
92+
&enum_module_def,
93+
&variant_hir_name,
94+
&mut visited_modules_set,
95+
);
96+
}
8997
extract_struct_def(
90-
&mut rewriter,
91-
&enum_ast,
9298
variant_name.clone(),
9399
&field_list,
94100
&variant.parent_enum().syntax().clone().into(),
95101
enum_ast.visibility(),
96102
);
97-
builder.edit_file(ctx.frange.file_id);
98-
builder.rewrite(rewriter);
103+
update_variant(&variant);
99104
},
100105
)
101106
}
@@ -138,7 +143,6 @@ fn existing_definition(db: &RootDatabase, variant_name: &ast::Name, variant: &Va
138143

139144
fn insert_import(
140145
ctx: &AssistContext,
141-
rewriter: &mut SyntaxRewriter,
142146
scope_node: &SyntaxNode,
143147
module: &Module,
144148
enum_module_def: &ModuleDef,
@@ -151,14 +155,12 @@ fn insert_import(
151155
mod_path.pop_segment();
152156
mod_path.push_segment(variant_hir_name.clone());
153157
let scope = ImportScope::find_insert_use_container(scope_node, &ctx.sema)?;
154-
*rewriter += insert_use(&scope, mod_path_to_ast(&mod_path), ctx.config.insert_use);
158+
insert_use(&scope, mod_path_to_ast(&mod_path), ctx.config.insert_use);
155159
}
156160
Some(())
157161
}
158162

159163
fn extract_struct_def(
160-
rewriter: &mut SyntaxRewriter,
161-
enum_: &ast::Enum,
162164
variant_name: ast::Name,
163165
field_list: &Either<ast::RecordFieldList, ast::TupleFieldList>,
164166
start_offset: &SyntaxElement,
@@ -180,33 +182,34 @@ fn extract_struct_def(
180182
.into(),
181183
};
182184

183-
rewriter.insert_before(
184-
start_offset,
185-
make::struct_(visibility, variant_name, None, field_list).syntax(),
185+
ted::insert_raw(
186+
ted::Position::before(start_offset),
187+
make::struct_(visibility, variant_name, None, field_list).clone_for_update().syntax(),
186188
);
187-
rewriter.insert_before(start_offset, &make::tokens::blank_line());
189+
ted::insert_raw(ted::Position::before(start_offset), &make::tokens::blank_line());
188190

189-
if let indent_level @ 1..=usize::MAX = IndentLevel::from_node(enum_.syntax()).0 as usize {
190-
rewriter
191-
.insert_before(start_offset, &make::tokens::whitespace(&" ".repeat(4 * indent_level)));
192-
}
191+
// if let indent_level @ 1..=usize::MAX = IndentLevel::from_node(enum_.syntax()).0 as usize {
192+
// ted::insert(ted::Position::before(start_offset), &make::tokens::blank_line());
193+
// rewriter
194+
// .insert_before(start_offset, &make::tokens::whitespace(&" ".repeat(4 * indent_level)));
195+
// }
193196
Some(())
194197
}
195198

196-
fn update_variant(rewriter: &mut SyntaxRewriter, variant: &ast::Variant) -> Option<()> {
199+
fn update_variant(variant: &ast::Variant) -> Option<()> {
197200
let name = variant.name()?;
198201
let tuple_field = make::tuple_field(None, make::ty(&name.text()));
199202
let replacement = make::variant(
200203
name,
201204
Some(ast::FieldList::TupleFieldList(make::tuple_field_list(iter::once(tuple_field)))),
202-
);
203-
rewriter.replace(variant.syntax(), replacement.syntax());
205+
)
206+
.clone_for_update();
207+
ted::replace(variant.syntax(), replacement.syntax());
204208
Some(())
205209
}
206210

207211
fn update_reference(
208212
ctx: &AssistContext,
209-
rewriter: &mut SyntaxRewriter,
210213
reference: FileReference,
211214
source_file: &SourceFile,
212215
enum_module_def: &ModuleDef,
@@ -230,14 +233,16 @@ fn update_reference(
230233

231234
let module = ctx.sema.scope(&expr).module()?;
232235
if !visited_modules_set.contains(&module) {
233-
if insert_import(ctx, rewriter, &expr, &module, enum_module_def, variant_hir_name).is_some()
234-
{
236+
if insert_import(ctx, &expr, &module, enum_module_def, variant_hir_name).is_some() {
235237
visited_modules_set.insert(module);
236238
}
237239
}
238-
rewriter.insert_after(segment.syntax(), &make::token(T!['(']));
239-
rewriter.insert_after(segment.syntax(), segment.syntax());
240-
rewriter.insert_after(&expr, &make::token(T![')']));
240+
ted::insert_raw(
241+
ted::Position::before(segment.syntax()),
242+
make::path_from_text(&format!("{}", segment)).clone_for_update().syntax(),
243+
);
244+
ted::insert_raw(ted::Position::before(segment.syntax()), make::token(T!['(']));
245+
ted::insert_raw(ted::Position::after(&expr), make::token(T![')']));
241246
Some(())
242247
}
243248

crates/ide_assists/src/handlers/replace_qualified_name_with_use.rs

Lines changed: 12 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
use ide_db::helpers::insert_use::{insert_use, ImportScope};
2-
use syntax::{algo::SyntaxRewriter, ast, match_ast, AstNode, SyntaxNode};
2+
use syntax::{ast, match_ast, ted, AstNode, SyntaxNode};
33

44
use crate::{AssistContext, AssistId, AssistKind, Assists};
55

@@ -40,18 +40,17 @@ pub(crate) fn replace_qualified_name_with_use(
4040
|builder| {
4141
// Now that we've brought the name into scope, re-qualify all paths that could be
4242
// affected (that is, all paths inside the node we added the `use` to).
43-
let mut rewriter = SyntaxRewriter::default();
44-
shorten_paths(&mut rewriter, syntax.clone(), &path);
43+
let syntax = builder.make_mut(syntax.clone());
4544
if let Some(ref import_scope) = ImportScope::from(syntax.clone()) {
46-
rewriter += insert_use(import_scope, path, ctx.config.insert_use);
47-
builder.rewrite(rewriter);
45+
insert_use(import_scope, path.clone(), ctx.config.insert_use);
4846
}
47+
shorten_paths(syntax.clone(), &path.clone_for_update());
4948
},
5049
)
5150
}
5251

5352
/// Adds replacements to `re` that shorten `path` in all descendants of `node`.
54-
fn shorten_paths(rewriter: &mut SyntaxRewriter<'static>, node: SyntaxNode, path: &ast::Path) {
53+
fn shorten_paths(node: SyntaxNode, path: &ast::Path) {
5554
for child in node.children() {
5655
match_ast! {
5756
match child {
@@ -62,32 +61,28 @@ fn shorten_paths(rewriter: &mut SyntaxRewriter<'static>, node: SyntaxNode, path:
6261
ast::Module(_it) => continue,
6362

6463
ast::Path(p) => {
65-
match maybe_replace_path(rewriter, p.clone(), path.clone()) {
64+
match maybe_replace_path(p.clone(), path.clone()) {
6665
Some(()) => {},
67-
None => shorten_paths(rewriter, p.syntax().clone(), path),
66+
None => shorten_paths(p.syntax().clone(), path),
6867
}
6968
},
70-
_ => shorten_paths(rewriter, child, path),
69+
_ => shorten_paths(child, path),
7170
}
7271
}
7372
}
7473
}
7574

76-
fn maybe_replace_path(
77-
rewriter: &mut SyntaxRewriter<'static>,
78-
path: ast::Path,
79-
target: ast::Path,
80-
) -> Option<()> {
75+
fn maybe_replace_path(path: ast::Path, target: ast::Path) -> Option<()> {
8176
if !path_eq(path.clone(), target) {
8277
return None;
8378
}
8479

8580
// Shorten `path`, leaving only its last segment.
8681
if let Some(parent) = path.qualifier() {
87-
rewriter.delete(parent.syntax());
82+
ted::remove(parent.syntax());
8883
}
8984
if let Some(double_colon) = path.coloncolon_token() {
90-
rewriter.delete(&double_colon);
85+
ted::remove(&double_colon);
9186
}
9287

9388
Some(())
@@ -150,6 +145,7 @@ Debug
150145
",
151146
);
152147
}
148+
153149
#[test]
154150
fn test_replace_add_use_no_anchor_with_item_below() {
155151
check_assist(

crates/ide_completion/src/item.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -377,11 +377,11 @@ impl ImportEdit {
377377
pub fn to_text_edit(&self, cfg: InsertUseConfig) -> Option<TextEdit> {
378378
let _p = profile::span("ImportEdit::to_text_edit");
379379

380-
let rewriter =
381-
insert_use::insert_use(&self.scope, mod_path_to_ast(&self.import.import_path), cfg);
382-
let old_ast = rewriter.rewrite_root()?;
380+
let new_ast = self.scope.clone_for_update();
381+
insert_use::insert_use(&new_ast, mod_path_to_ast(&self.import.import_path), cfg);
383382
let mut import_insert = TextEdit::builder();
384-
algo::diff(&old_ast, &rewriter.rewrite(&old_ast)).into_text_edit(&mut import_insert);
383+
algo::diff(self.scope.as_syntax_node(), new_ast.as_syntax_node())
384+
.into_text_edit(&mut import_insert);
385385

386386
Some(import_insert.finish())
387387
}

0 commit comments

Comments
 (0)