aboutsummaryrefslogtreecommitdiff
path: root/crates/assists/src/assist_context.rs
diff options
context:
space:
mode:
Diffstat (limited to 'crates/assists/src/assist_context.rs')
-rw-r--r--crates/assists/src/assist_context.rs41
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
3use std::mem; 3use std::mem;
4 4
5use algo::find_covering_element;
6use hir::Semantics; 5use hir::Semantics;
7use ide_db::{ 6use ide_db::{
8 base_db::{AnchoredPathBuf, FileId, FileRange}, 7 base_db::{AnchoredPathBuf, FileId, FileRange},
@@ -10,7 +9,7 @@ use ide_db::{
10}; 9};
11use ide_db::{ 10use 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};
16use syntax::{ 15use 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 {
180pub(crate) struct AssistBuilder { 179pub(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
188impl AssistBuilder { 185impl 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}