Skip to content

Commit 733ef31

Browse files
bors[bot]matklad
andauthored
Merge #4804
4804: Simplify API r=matklad a=matklad bors r+ 🤖 Co-authored-by: Aleksey Kladov <aleksey.kladov@gmail.com>
2 parents 3999bbb + 38fa4d1 commit 733ef31

File tree

4 files changed

+56
-107
lines changed

4 files changed

+56
-107
lines changed

crates/ra_assists/src/assist_context.rs

Lines changed: 27 additions & 72 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
//! See `AssistContext`
22
3+
use std::mem;
4+
35
use algo::find_covering_element;
46
use hir::Semantics;
57
use ra_db::{FileId, FileRange};
@@ -19,7 +21,6 @@ use crate::{
1921
assist_config::{AssistConfig, SnippetCap},
2022
Assist, AssistId, GroupLabel, ResolvedAssist,
2123
};
22-
use rustc_hash::FxHashMap;
2324

2425
/// `AssistContext` allows to apply an assist or check if it could be applied.
2526
///
@@ -139,16 +140,6 @@ impl Assists {
139140
let label = Assist::new(id, label.into(), None, target);
140141
self.add_impl(label, f)
141142
}
142-
pub(crate) fn add_in_multiple_files(
143-
&mut self,
144-
id: AssistId,
145-
label: impl Into<String>,
146-
target: TextRange,
147-
f: impl FnOnce(&mut AssistDirector),
148-
) -> Option<()> {
149-
let label = Assist::new(id, label.into(), None, target);
150-
self.add_impl_multiple_files(label, f)
151-
}
152143
pub(crate) fn add_group(
153144
&mut self,
154145
group: &GroupLabel,
@@ -173,31 +164,6 @@ impl Assists {
173164
Some(())
174165
}
175166

176-
fn add_impl_multiple_files(
177-
&mut self,
178-
label: Assist,
179-
f: impl FnOnce(&mut AssistDirector),
180-
) -> Option<()> {
181-
if !self.resolve {
182-
self.buf.push((label, None));
183-
return None;
184-
}
185-
let mut director = AssistDirector::default();
186-
f(&mut director);
187-
let changes = director.finish();
188-
let file_edits: Vec<SourceFileEdit> =
189-
changes.into_iter().map(|mut change| change.source_file_edits.pop().unwrap()).collect();
190-
191-
let source_change = SourceChange {
192-
source_file_edits: file_edits,
193-
file_system_edits: vec![],
194-
is_snippet: false,
195-
};
196-
197-
self.buf.push((label, Some(source_change)));
198-
Some(())
199-
}
200-
201167
fn finish(mut self) -> Vec<(Assist, Option<SourceChange>)> {
202168
self.buf.sort_by_key(|(label, _edit)| label.target.len());
203169
self.buf
@@ -206,13 +172,32 @@ impl Assists {
206172

207173
pub(crate) struct AssistBuilder {
208174
edit: TextEditBuilder,
209-
file: FileId,
175+
file_id: FileId,
210176
is_snippet: bool,
177+
edits: Vec<SourceFileEdit>,
211178
}
212179

213180
impl AssistBuilder {
214-
pub(crate) fn new(file: FileId) -> AssistBuilder {
215-
AssistBuilder { edit: TextEditBuilder::default(), file, is_snippet: false }
181+
pub(crate) fn new(file_id: FileId) -> AssistBuilder {
182+
AssistBuilder {
183+
edit: TextEditBuilder::default(),
184+
file_id,
185+
is_snippet: false,
186+
edits: Vec::new(),
187+
}
188+
}
189+
190+
pub(crate) fn edit_file(&mut self, file_id: FileId) {
191+
self.file_id = file_id;
192+
}
193+
194+
fn commit(&mut self) {
195+
let edit = mem::take(&mut self.edit).finish();
196+
if !edit.is_empty() {
197+
let new_edit = SourceFileEdit { file_id: self.file_id, edit };
198+
assert!(!self.edits.iter().any(|it| it.file_id == new_edit.file_id));
199+
self.edits.push(new_edit);
200+
}
216201
}
217202

218203
/// Remove specified `range` of text.
@@ -270,48 +255,18 @@ impl AssistBuilder {
270255
algo::diff(&node, &new).into_text_edit(&mut self.edit)
271256
}
272257

273-
// FIXME: better API
274-
pub(crate) fn set_file(&mut self, assist_file: FileId) {
275-
self.file = assist_file;
276-
}
277-
278258
// FIXME: kill this API
279259
/// Get access to the raw `TextEditBuilder`.
280260
pub(crate) fn text_edit_builder(&mut self) -> &mut TextEditBuilder {
281261
&mut self.edit
282262
}
283263

284-
fn finish(self) -> SourceChange {
285-
let edit = self.edit.finish();
286-
let source_file_edit = SourceFileEdit { file_id: self.file, edit };
287-
let mut res: SourceChange = source_file_edit.into();
264+
fn finish(mut self) -> SourceChange {
265+
self.commit();
266+
let mut res: SourceChange = mem::take(&mut self.edits).into();
288267
if self.is_snippet {
289268
res.is_snippet = true;
290269
}
291270
res
292271
}
293272
}
294-
295-
pub(crate) struct AssistDirector {
296-
builders: FxHashMap<FileId, AssistBuilder>,
297-
}
298-
299-
impl AssistDirector {
300-
pub(crate) fn perform(&mut self, file_id: FileId, f: impl FnOnce(&mut AssistBuilder)) {
301-
let mut builder = self.builders.entry(file_id).or_insert(AssistBuilder::new(file_id));
302-
f(&mut builder);
303-
}
304-
305-
fn finish(self) -> Vec<SourceChange> {
306-
self.builders
307-
.into_iter()
308-
.map(|(_, builder)| builder.finish())
309-
.collect::<Vec<SourceChange>>()
310-
}
311-
}
312-
313-
impl Default for AssistDirector {
314-
fn default() -> Self {
315-
AssistDirector { builders: FxHashMap::default() }
316-
}
317-
}

crates/ra_assists/src/handlers/add_function.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ pub(crate) fn add_function(acc: &mut Assists, ctx: &AssistContext) -> Option<()>
6464
let target = call.syntax().text_range();
6565
acc.add(AssistId("add_function"), "Add function", target, |builder| {
6666
let function_template = function_builder.render();
67-
builder.set_file(function_template.file);
67+
builder.edit_file(function_template.file);
6868
let new_fn = function_template.to_string(ctx.config.snippet_cap);
6969
match ctx.config.snippet_cap {
7070
Some(cap) => builder.insert_snippet(cap, function_template.insert_offset, new_fn),

crates/ra_assists/src/handlers/extract_struct_from_enum_variant.rs

Lines changed: 26 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,17 @@
1+
use hir::{EnumVariant, Module, ModuleDef, Name};
2+
use ra_db::FileId;
3+
use ra_fmt::leading_indent;
14
use ra_ide_db::{defs::Definition, search::Reference, RootDatabase};
25
use ra_syntax::{
36
algo::find_node_at_offset,
4-
ast::{self, AstNode, NameOwner},
7+
ast::{self, ArgListOwner, AstNode, NameOwner, VisibilityOwner},
58
SourceFile, SyntaxNode, TextRange, TextSize,
69
};
10+
use rustc_hash::FxHashSet;
711

812
use crate::{
9-
assist_context::{AssistBuilder, AssistDirector},
10-
utils::insert_use_statement,
11-
AssistContext, AssistId, Assists,
13+
assist_context::AssistBuilder, utils::insert_use_statement, AssistContext, AssistId, Assists,
1214
};
13-
use ast::{ArgListOwner, VisibilityOwner};
14-
use hir::{EnumVariant, Module, ModuleDef, Name};
15-
use ra_db::FileId;
16-
use ra_fmt::leading_indent;
17-
use rustc_hash::FxHashSet;
1815

1916
// Assist: extract_struct_from_enum_variant
2017
//
@@ -50,11 +47,11 @@ pub(crate) fn extract_struct_from_enum_variant(
5047
let enum_module_def = ModuleDef::from(enum_hir);
5148
let current_module = enum_hir.module(ctx.db);
5249
let target = variant.syntax().text_range();
53-
acc.add_in_multiple_files(
50+
acc.add(
5451
AssistId("extract_struct_from_enum_variant"),
5552
"Extract struct from enum variant",
5653
target,
57-
|edit| {
54+
|builder| {
5855
let definition = Definition::ModuleDef(ModuleDef::EnumVariant(variant_hir));
5956
let res = definition.find_usages(&ctx.db, None);
6057
let start_offset = variant.parent_enum().syntax().text_range().start();
@@ -64,7 +61,7 @@ pub(crate) fn extract_struct_from_enum_variant(
6461
let source_file = ctx.sema.parse(reference.file_range.file_id);
6562
update_reference(
6663
ctx,
67-
edit,
64+
builder,
6865
reference,
6966
&source_file,
7067
&enum_module_def,
@@ -73,7 +70,7 @@ pub(crate) fn extract_struct_from_enum_variant(
7370
);
7471
}
7572
extract_struct_def(
76-
edit,
73+
builder,
7774
enum_ast.syntax(),
7875
&variant_name,
7976
&field_list.to_string(),
@@ -82,7 +79,7 @@ pub(crate) fn extract_struct_from_enum_variant(
8279
&visibility,
8380
);
8481
let list_range = field_list.syntax().text_range();
85-
update_variant(edit, &variant_name, ctx.frange.file_id, list_range);
82+
update_variant(builder, &variant_name, ctx.frange.file_id, list_range);
8683
},
8784
)
8885
}
@@ -115,7 +112,7 @@ fn insert_import(
115112
}
116113

117114
fn extract_struct_def(
118-
edit: &mut AssistDirector,
115+
builder: &mut AssistBuilder,
119116
enum_ast: &SyntaxNode,
120117
variant_name: &str,
121118
variant_list: &str,
@@ -142,14 +139,13 @@ fn extract_struct_def(
142139
list_with_visibility(variant_list),
143140
indent
144141
);
145-
edit.perform(file_id, |builder| {
146-
builder.insert(start_offset, struct_def);
147-
});
142+
builder.edit_file(file_id);
143+
builder.insert(start_offset, struct_def);
148144
Some(())
149145
}
150146

151147
fn update_variant(
152-
edit: &mut AssistDirector,
148+
builder: &mut AssistBuilder,
153149
variant_name: &str,
154150
file_id: FileId,
155151
list_range: TextRange,
@@ -158,15 +154,14 @@ fn update_variant(
158154
list_range.start().checked_add(TextSize::from(1))?,
159155
list_range.end().checked_sub(TextSize::from(1))?,
160156
);
161-
edit.perform(file_id, |builder| {
162-
builder.replace(inside_variant_range, variant_name);
163-
});
157+
builder.edit_file(file_id);
158+
builder.replace(inside_variant_range, variant_name);
164159
Some(())
165160
}
166161

167162
fn update_reference(
168163
ctx: &AssistContext,
169-
edit: &mut AssistDirector,
164+
builder: &mut AssistBuilder,
170165
reference: Reference,
171166
source_file: &SourceFile,
172167
enum_module_def: &ModuleDef,
@@ -186,16 +181,15 @@ fn update_reference(
186181
list_range.start().checked_add(TextSize::from(1))?,
187182
list_range.end().checked_sub(TextSize::from(1))?,
188183
);
189-
edit.perform(reference.file_range.file_id, |builder| {
190-
if !visited_modules_set.contains(&module) {
191-
if insert_import(ctx, builder, &path_expr, &module, enum_module_def, variant_hir_name)
192-
.is_some()
193-
{
194-
visited_modules_set.insert(module);
195-
}
184+
builder.edit_file(reference.file_range.file_id);
185+
if !visited_modules_set.contains(&module) {
186+
if insert_import(ctx, builder, &path_expr, &module, enum_module_def, variant_hir_name)
187+
.is_some()
188+
{
189+
visited_modules_set.insert(module);
196190
}
197-
builder.replace(inside_list_range, format!("{}{}", segment, list));
198-
});
191+
}
192+
builder.replace(inside_list_range, format!("{}{}", segment, list));
199193
Some(())
200194
}
201195

crates/ra_assists/src/handlers/fix_visibility.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@ fn add_vis_to_referenced_module_def(acc: &mut Assists, ctx: &AssistContext) -> O
6363
};
6464

6565
acc.add(AssistId("fix_visibility"), assist_label, target, |builder| {
66-
builder.set_file(target_file);
66+
builder.edit_file(target_file);
6767
match ctx.config.snippet_cap {
6868
Some(cap) => builder.insert_snippet(cap, offset, format!("$0{} ", missing_visibility)),
6969
None => builder.insert(offset, format!("{} ", missing_visibility)),
@@ -106,7 +106,7 @@ fn add_vis_to_referenced_record_field(acc: &mut Assists, ctx: &AssistContext) ->
106106
format!("Change visibility of {}.{} to {}", parent_name, target_name, missing_visibility);
107107

108108
acc.add(AssistId("fix_visibility"), assist_label, target, |builder| {
109-
builder.set_file(target_file);
109+
builder.edit_file(target_file);
110110
match ctx.config.snippet_cap {
111111
Some(cap) => builder.insert_snippet(cap, offset, format!("$0{} ", missing_visibility)),
112112
None => builder.insert(offset, format!("{} ", missing_visibility)),

0 commit comments

Comments
 (0)