diff options
Diffstat (limited to 'crates/assists/src/assist_context.rs')
-rw-r--r-- | crates/assists/src/assist_context.rs | 41 |
1 files changed, 10 insertions, 31 deletions
diff --git a/crates/assists/src/assist_context.rs b/crates/assists/src/assist_context.rs index 91cc63427..8d93edba2 100644 --- a/crates/assists/src/assist_context.rs +++ b/crates/assists/src/assist_context.rs | |||
@@ -2,7 +2,6 @@ | |||
2 | 2 | ||
3 | use std::mem; | 3 | use std::mem; |
4 | 4 | ||
5 | use algo::find_covering_element; | ||
6 | use hir::Semantics; | 5 | use hir::Semantics; |
7 | use ide_db::{ | 6 | use ide_db::{ |
8 | base_db::{AnchoredPathBuf, FileId, FileRange}, | 7 | base_db::{AnchoredPathBuf, FileId, FileRange}, |
@@ -10,7 +9,7 @@ use ide_db::{ | |||
10 | }; | 9 | }; |
11 | use ide_db::{ | 10 | use ide_db::{ |
12 | label::Label, | 11 | label::Label, |
13 | source_change::{FileSystemEdit, SourceChange, SourceFileEdit}, | 12 | source_change::{FileSystemEdit, SourceChange}, |
14 | RootDatabase, | 13 | RootDatabase, |
15 | }; | 14 | }; |
16 | use syntax::{ | 15 | use syntax::{ |
@@ -94,11 +93,11 @@ impl<'a> AssistContext<'a> { | |||
94 | self.sema.find_node_at_offset_with_descend(self.source_file.syntax(), self.offset()) | 93 | self.sema.find_node_at_offset_with_descend(self.source_file.syntax(), self.offset()) |
95 | } | 94 | } |
96 | pub(crate) fn covering_element(&self) -> SyntaxElement { | 95 | pub(crate) fn covering_element(&self) -> SyntaxElement { |
97 | find_covering_element(self.source_file.syntax(), self.frange.range) | 96 | self.source_file.syntax().covering_element(self.frange.range) |
98 | } | 97 | } |
99 | // FIXME: remove | 98 | // FIXME: remove |
100 | pub(crate) fn covering_node_for_range(&self, range: TextRange) -> SyntaxElement { | 99 | pub(crate) fn covering_node_for_range(&self, range: TextRange) -> SyntaxElement { |
101 | find_covering_element(self.source_file.syntax(), range) | 100 | self.source_file.syntax().covering_element(range) |
102 | } | 101 | } |
103 | } | 102 | } |
104 | 103 | ||
@@ -180,20 +179,12 @@ impl Assists { | |||
180 | pub(crate) struct AssistBuilder { | 179 | pub(crate) struct AssistBuilder { |
181 | edit: TextEditBuilder, | 180 | edit: TextEditBuilder, |
182 | file_id: FileId, | 181 | file_id: FileId, |
183 | is_snippet: bool, | 182 | source_change: SourceChange, |
184 | source_file_edits: Vec<SourceFileEdit>, | ||
185 | file_system_edits: Vec<FileSystemEdit>, | ||
186 | } | 183 | } |
187 | 184 | ||
188 | impl AssistBuilder { | 185 | impl AssistBuilder { |
189 | pub(crate) fn new(file_id: FileId) -> AssistBuilder { | 186 | pub(crate) fn new(file_id: FileId) -> AssistBuilder { |
190 | AssistBuilder { | 187 | AssistBuilder { edit: TextEdit::builder(), file_id, source_change: SourceChange::default() } |
191 | edit: TextEdit::builder(), | ||
192 | file_id, | ||
193 | is_snippet: false, | ||
194 | source_file_edits: Vec::default(), | ||
195 | file_system_edits: Vec::default(), | ||
196 | } | ||
197 | } | 188 | } |
198 | 189 | ||
199 | pub(crate) fn edit_file(&mut self, file_id: FileId) { | 190 | pub(crate) fn edit_file(&mut self, file_id: FileId) { |
@@ -204,15 +195,7 @@ impl AssistBuilder { | |||
204 | fn commit(&mut self) { | 195 | fn commit(&mut self) { |
205 | let edit = mem::take(&mut self.edit).finish(); | 196 | let edit = mem::take(&mut self.edit).finish(); |
206 | if !edit.is_empty() { | 197 | if !edit.is_empty() { |
207 | match self.source_file_edits.binary_search_by_key(&self.file_id, |edit| edit.file_id) { | 198 | self.source_change.insert_source_edit(self.file_id, edit); |
208 | Ok(idx) => self.source_file_edits[idx] | ||
209 | .edit | ||
210 | .union(edit) | ||
211 | .expect("overlapping edits for same file"), | ||
212 | Err(idx) => self | ||
213 | .source_file_edits | ||
214 | .insert(idx, SourceFileEdit { file_id: self.file_id, edit }), | ||
215 | } | ||
216 | } | 199 | } |
217 | } | 200 | } |
218 | 201 | ||
@@ -231,7 +214,7 @@ impl AssistBuilder { | |||
231 | offset: TextSize, | 214 | offset: TextSize, |
232 | snippet: impl Into<String>, | 215 | snippet: impl Into<String>, |
233 | ) { | 216 | ) { |
234 | self.is_snippet = true; | 217 | self.source_change.is_snippet = true; |
235 | self.insert(offset, snippet); | 218 | self.insert(offset, snippet); |
236 | } | 219 | } |
237 | /// Replaces specified `range` of text with a given string. | 220 | /// Replaces specified `range` of text with a given string. |
@@ -245,7 +228,7 @@ impl AssistBuilder { | |||
245 | range: TextRange, | 228 | range: TextRange, |
246 | snippet: impl Into<String>, | 229 | snippet: impl Into<String>, |
247 | ) { | 230 | ) { |
248 | self.is_snippet = true; | 231 | self.source_change.is_snippet = true; |
249 | self.replace(range, snippet); | 232 | self.replace(range, snippet); |
250 | } | 233 | } |
251 | pub(crate) fn replace_ast<N: AstNode>(&mut self, old: N, new: N) { | 234 | pub(crate) fn replace_ast<N: AstNode>(&mut self, old: N, new: N) { |
@@ -260,15 +243,11 @@ impl AssistBuilder { | |||
260 | pub(crate) fn create_file(&mut self, dst: AnchoredPathBuf, content: impl Into<String>) { | 243 | pub(crate) fn create_file(&mut self, dst: AnchoredPathBuf, content: impl Into<String>) { |
261 | let file_system_edit = | 244 | let file_system_edit = |
262 | FileSystemEdit::CreateFile { dst: dst.clone(), initial_contents: content.into() }; | 245 | FileSystemEdit::CreateFile { dst: dst.clone(), initial_contents: content.into() }; |
263 | self.file_system_edits.push(file_system_edit); | 246 | self.source_change.push_file_system_edit(file_system_edit); |
264 | } | 247 | } |
265 | 248 | ||
266 | fn finish(mut self) -> SourceChange { | 249 | fn finish(mut self) -> SourceChange { |
267 | self.commit(); | 250 | self.commit(); |
268 | SourceChange { | 251 | mem::take(&mut self.source_change) |
269 | source_file_edits: mem::take(&mut self.source_file_edits), | ||
270 | file_system_edits: mem::take(&mut self.file_system_edits), | ||
271 | is_snippet: self.is_snippet, | ||
272 | } | ||
273 | } | 252 | } |
274 | } | 253 | } |