diff options
Diffstat (limited to 'crates/ra_assists/src/assist_context.rs')
-rw-r--r-- | crates/ra_assists/src/assist_context.rs | 39 |
1 files changed, 27 insertions, 12 deletions
diff --git a/crates/ra_assists/src/assist_context.rs b/crates/ra_assists/src/assist_context.rs index 5b1a4680b..edd8255f4 100644 --- a/crates/ra_assists/src/assist_context.rs +++ b/crates/ra_assists/src/assist_context.rs | |||
@@ -1,5 +1,7 @@ | |||
1 | //! See `AssistContext` | 1 | //! See `AssistContext` |
2 | 2 | ||
3 | use std::mem; | ||
4 | |||
3 | use algo::find_covering_element; | 5 | use algo::find_covering_element; |
4 | use hir::Semantics; | 6 | use hir::Semantics; |
5 | use ra_db::{FileId, FileRange}; | 7 | use ra_db::{FileId, FileRange}; |
@@ -170,13 +172,32 @@ impl Assists { | |||
170 | 172 | ||
171 | pub(crate) struct AssistBuilder { | 173 | pub(crate) struct AssistBuilder { |
172 | edit: TextEditBuilder, | 174 | edit: TextEditBuilder, |
173 | file: FileId, | 175 | file_id: FileId, |
174 | is_snippet: bool, | 176 | is_snippet: bool, |
177 | edits: Vec<SourceFileEdit>, | ||
175 | } | 178 | } |
176 | 179 | ||
177 | impl AssistBuilder { | 180 | impl AssistBuilder { |
178 | pub(crate) fn new(file: FileId) -> AssistBuilder { | 181 | pub(crate) fn new(file_id: FileId) -> AssistBuilder { |
179 | AssistBuilder { edit: TextEditBuilder::default(), file, is_snippet: false } | 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 | } | ||
180 | } | 201 | } |
181 | 202 | ||
182 | /// Remove specified `range` of text. | 203 | /// Remove specified `range` of text. |
@@ -234,21 +255,15 @@ impl AssistBuilder { | |||
234 | algo::diff(&node, &new).into_text_edit(&mut self.edit) | 255 | algo::diff(&node, &new).into_text_edit(&mut self.edit) |
235 | } | 256 | } |
236 | 257 | ||
237 | // FIXME: better API | ||
238 | pub(crate) fn set_file(&mut self, assist_file: FileId) { | ||
239 | self.file = assist_file; | ||
240 | } | ||
241 | |||
242 | // FIXME: kill this API | 258 | // FIXME: kill this API |
243 | /// Get access to the raw `TextEditBuilder`. | 259 | /// Get access to the raw `TextEditBuilder`. |
244 | pub(crate) fn text_edit_builder(&mut self) -> &mut TextEditBuilder { | 260 | pub(crate) fn text_edit_builder(&mut self) -> &mut TextEditBuilder { |
245 | &mut self.edit | 261 | &mut self.edit |
246 | } | 262 | } |
247 | 263 | ||
248 | fn finish(self) -> SourceChange { | 264 | fn finish(mut self) -> SourceChange { |
249 | let edit = self.edit.finish(); | 265 | self.commit(); |
250 | let source_file_edit = SourceFileEdit { file_id: self.file, edit }; | 266 | let mut res: SourceChange = mem::take(&mut self.edits).into(); |
251 | let mut res: SourceChange = source_file_edit.into(); | ||
252 | if self.is_snippet { | 267 | if self.is_snippet { |
253 | res.is_snippet = true; | 268 | res.is_snippet = true; |
254 | } | 269 | } |