diff options
Diffstat (limited to 'crates/ra_analysis/src')
-rw-r--r-- | crates/ra_analysis/src/imp.rs | 118 | ||||
-rw-r--r-- | crates/ra_analysis/src/lib.rs | 63 |
2 files changed, 80 insertions, 101 deletions
diff --git a/crates/ra_analysis/src/imp.rs b/crates/ra_analysis/src/imp.rs index d9a3f97e9..0faf8b85d 100644 --- a/crates/ra_analysis/src/imp.rs +++ b/crates/ra_analysis/src/imp.rs | |||
@@ -1,9 +1,6 @@ | |||
1 | use std::{ | 1 | use std::sync::Arc; |
2 | fmt, | ||
3 | sync::Arc, | ||
4 | }; | ||
5 | 2 | ||
6 | use salsa::{Database, ParallelDatabase}; | 3 | use salsa::Database; |
7 | 4 | ||
8 | use hir::{ | 5 | use hir::{ |
9 | self, FnSignatureInfo, Problem, source_binder, | 6 | self, FnSignatureInfo, Problem, source_binder, |
@@ -21,18 +18,12 @@ use ra_syntax::{ | |||
21 | use crate::{ | 18 | use crate::{ |
22 | AnalysisChange, | 19 | AnalysisChange, |
23 | Cancelable, NavigationTarget, | 20 | Cancelable, NavigationTarget, |
24 | completion::{CompletionItem, completions}, | ||
25 | CrateId, db, Diagnostic, FileId, FilePosition, FileRange, FileSystemEdit, | 21 | CrateId, db, Diagnostic, FileId, FilePosition, FileRange, FileSystemEdit, |
26 | Query, ReferenceResolution, RootChange, SourceChange, SourceFileEdit, | 22 | Query, ReferenceResolution, RootChange, SourceChange, SourceFileEdit, |
27 | symbol_index::{LibrarySymbolsQuery, FileSymbol}, | 23 | symbol_index::{LibrarySymbolsQuery, FileSymbol}, |
28 | }; | 24 | }; |
29 | 25 | ||
30 | impl db::RootDatabase { | 26 | impl db::RootDatabase { |
31 | pub(crate) fn analysis(&self) -> AnalysisImpl { | ||
32 | AnalysisImpl { | ||
33 | db: self.snapshot(), | ||
34 | } | ||
35 | } | ||
36 | pub(crate) fn apply_change(&mut self, change: AnalysisChange) { | 27 | pub(crate) fn apply_change(&mut self, change: AnalysisChange) { |
37 | log::info!("apply_change {:?}", change); | 28 | log::info!("apply_change {:?}", change); |
38 | // self.gc_syntax_trees(); | 29 | // self.gc_syntax_trees(); |
@@ -108,20 +99,9 @@ impl db::RootDatabase { | |||
108 | } | 99 | } |
109 | } | 100 | } |
110 | 101 | ||
111 | pub(crate) struct AnalysisImpl { | 102 | impl db::RootDatabase { |
112 | pub(crate) db: salsa::Snapshot<db::RootDatabase>, | ||
113 | } | ||
114 | |||
115 | impl fmt::Debug for AnalysisImpl { | ||
116 | fn fmt(&self, fmt: &mut fmt::Formatter) -> fmt::Result { | ||
117 | let db: &db::RootDatabase = &self.db; | ||
118 | fmt.debug_struct("AnalysisImpl").field("db", db).finish() | ||
119 | } | ||
120 | } | ||
121 | |||
122 | impl AnalysisImpl { | ||
123 | pub(crate) fn module_path(&self, position: FilePosition) -> Cancelable<Option<String>> { | 103 | pub(crate) fn module_path(&self, position: FilePosition) -> Cancelable<Option<String>> { |
124 | let descr = match source_binder::module_from_position(&*self.db, position)? { | 104 | let descr = match source_binder::module_from_position(self, position)? { |
125 | None => return Ok(None), | 105 | None => return Ok(None), |
126 | Some(it) => it, | 106 | Some(it) => it, |
127 | }; | 107 | }; |
@@ -143,12 +123,15 @@ impl AnalysisImpl { | |||
143 | 123 | ||
144 | /// This returns `Vec` because a module may be included from several places. We | 124 | /// This returns `Vec` because a module may be included from several places. We |
145 | /// don't handle this case yet though, so the Vec has length at most one. | 125 | /// don't handle this case yet though, so the Vec has length at most one. |
146 | pub fn parent_module(&self, position: FilePosition) -> Cancelable<Vec<NavigationTarget>> { | 126 | pub(crate) fn parent_module( |
147 | let descr = match source_binder::module_from_position(&*self.db, position)? { | 127 | &self, |
128 | position: FilePosition, | ||
129 | ) -> Cancelable<Vec<NavigationTarget>> { | ||
130 | let descr = match source_binder::module_from_position(self, position)? { | ||
148 | None => return Ok(Vec::new()), | 131 | None => return Ok(Vec::new()), |
149 | Some(it) => it, | 132 | Some(it) => it, |
150 | }; | 133 | }; |
151 | let (file_id, decl) = match descr.parent_link_source(&*self.db) { | 134 | let (file_id, decl) = match descr.parent_link_source(self) { |
152 | None => return Ok(Vec::new()), | 135 | None => return Ok(Vec::new()), |
153 | Some(it) => it, | 136 | Some(it) => it, |
154 | }; | 137 | }; |
@@ -162,39 +145,33 @@ impl AnalysisImpl { | |||
162 | Ok(vec![NavigationTarget { file_id, symbol }]) | 145 | Ok(vec![NavigationTarget { file_id, symbol }]) |
163 | } | 146 | } |
164 | /// Returns `Vec` for the same reason as `parent_module` | 147 | /// Returns `Vec` for the same reason as `parent_module` |
165 | pub fn crate_for(&self, file_id: FileId) -> Cancelable<Vec<CrateId>> { | 148 | pub(crate) fn crate_for(&self, file_id: FileId) -> Cancelable<Vec<CrateId>> { |
166 | let descr = match source_binder::module_from_file_id(&*self.db, file_id)? { | 149 | let descr = match source_binder::module_from_file_id(self, file_id)? { |
167 | None => return Ok(Vec::new()), | 150 | None => return Ok(Vec::new()), |
168 | Some(it) => it, | 151 | Some(it) => it, |
169 | }; | 152 | }; |
170 | let root = descr.crate_root(); | 153 | let root = descr.crate_root(); |
171 | let file_id = root.file_id(); | 154 | let file_id = root.file_id(); |
172 | 155 | ||
173 | let crate_graph = self.db.crate_graph(); | 156 | let crate_graph = self.crate_graph(); |
174 | let crate_id = crate_graph.crate_id_for_crate_root(file_id); | 157 | let crate_id = crate_graph.crate_id_for_crate_root(file_id); |
175 | Ok(crate_id.into_iter().collect()) | 158 | Ok(crate_id.into_iter().collect()) |
176 | } | 159 | } |
177 | pub fn crate_root(&self, crate_id: CrateId) -> FileId { | 160 | pub(crate) fn crate_root(&self, crate_id: CrateId) -> FileId { |
178 | self.db.crate_graph().crate_root(crate_id) | 161 | self.crate_graph().crate_root(crate_id) |
179 | } | ||
180 | pub fn completions(&self, position: FilePosition) -> Cancelable<Option<Vec<CompletionItem>>> { | ||
181 | let completions = completions(&self.db, position)?; | ||
182 | Ok(completions.map(|it| it.into())) | ||
183 | } | 162 | } |
184 | pub fn approximately_resolve_symbol( | 163 | pub(crate) fn approximately_resolve_symbol( |
185 | &self, | 164 | &self, |
186 | position: FilePosition, | 165 | position: FilePosition, |
187 | ) -> Cancelable<Option<ReferenceResolution>> { | 166 | ) -> Cancelable<Option<ReferenceResolution>> { |
188 | let file = self.db.source_file(position.file_id); | 167 | let file = self.source_file(position.file_id); |
189 | let syntax = file.syntax(); | 168 | let syntax = file.syntax(); |
190 | if let Some(name_ref) = find_node_at_offset::<ast::NameRef>(syntax, position.offset) { | 169 | if let Some(name_ref) = find_node_at_offset::<ast::NameRef>(syntax, position.offset) { |
191 | let mut rr = ReferenceResolution::new(name_ref.syntax().range()); | 170 | let mut rr = ReferenceResolution::new(name_ref.syntax().range()); |
192 | if let Some(fn_descr) = source_binder::function_from_child_node( | 171 | if let Some(fn_descr) = |
193 | &*self.db, | 172 | source_binder::function_from_child_node(self, position.file_id, name_ref.syntax())? |
194 | position.file_id, | 173 | { |
195 | name_ref.syntax(), | 174 | let scope = fn_descr.scopes(self); |
196 | )? { | ||
197 | let scope = fn_descr.scopes(&*self.db); | ||
198 | // First try to resolve the symbol locally | 175 | // First try to resolve the symbol locally |
199 | if let Some(entry) = scope.resolve_local_name(name_ref) { | 176 | if let Some(entry) = scope.resolve_local_name(name_ref) { |
200 | rr.add_resolution( | 177 | rr.add_resolution( |
@@ -219,7 +196,7 @@ impl AnalysisImpl { | |||
219 | if let Some(module) = name.syntax().parent().and_then(ast::Module::cast) { | 196 | if let Some(module) = name.syntax().parent().and_then(ast::Module::cast) { |
220 | if module.has_semi() { | 197 | if module.has_semi() { |
221 | if let Some(child_module) = | 198 | if let Some(child_module) = |
222 | source_binder::module_from_declaration(&*self.db, position.file_id, module)? | 199 | source_binder::module_from_declaration(self, position.file_id, module)? |
223 | { | 200 | { |
224 | let file_id = child_module.file_id(); | 201 | let file_id = child_module.file_id(); |
225 | let name = match child_module.name() { | 202 | let name = match child_module.name() { |
@@ -240,10 +217,13 @@ impl AnalysisImpl { | |||
240 | Ok(None) | 217 | Ok(None) |
241 | } | 218 | } |
242 | 219 | ||
243 | pub fn find_all_refs(&self, position: FilePosition) -> Cancelable<Vec<(FileId, TextRange)>> { | 220 | pub(crate) fn find_all_refs( |
244 | let file = self.db.source_file(position.file_id); | 221 | &self, |
222 | position: FilePosition, | ||
223 | ) -> Cancelable<Vec<(FileId, TextRange)>> { | ||
224 | let file = self.source_file(position.file_id); | ||
245 | // Find the binding associated with the offset | 225 | // Find the binding associated with the offset |
246 | let (binding, descr) = match find_binding(&self.db, &file, position)? { | 226 | let (binding, descr) = match find_binding(self, &file, position)? { |
247 | None => return Ok(Vec::new()), | 227 | None => return Ok(Vec::new()), |
248 | Some(it) => it, | 228 | Some(it) => it, |
249 | }; | 229 | }; |
@@ -255,7 +235,7 @@ impl AnalysisImpl { | |||
255 | .collect::<Vec<_>>(); | 235 | .collect::<Vec<_>>(); |
256 | ret.extend( | 236 | ret.extend( |
257 | descr | 237 | descr |
258 | .scopes(&*self.db) | 238 | .scopes(self) |
259 | .find_all_refs(binding) | 239 | .find_all_refs(binding) |
260 | .into_iter() | 240 | .into_iter() |
261 | .map(|ref_desc| (position.file_id, ref_desc.range)), | 241 | .map(|ref_desc| (position.file_id, ref_desc.range)), |
@@ -293,8 +273,8 @@ impl AnalysisImpl { | |||
293 | Ok(Some((binding, descr))) | 273 | Ok(Some((binding, descr))) |
294 | } | 274 | } |
295 | } | 275 | } |
296 | pub fn doc_text_for(&self, nav: NavigationTarget) -> Cancelable<Option<String>> { | 276 | pub(crate) fn doc_text_for(&self, nav: NavigationTarget) -> Cancelable<Option<String>> { |
297 | let file = self.db.source_file(nav.file_id); | 277 | let file = self.source_file(nav.file_id); |
298 | let result = match (nav.symbol.description(&file), nav.symbol.docs(&file)) { | 278 | let result = match (nav.symbol.description(&file), nav.symbol.docs(&file)) { |
299 | (Some(desc), Some(docs)) => { | 279 | (Some(desc), Some(docs)) => { |
300 | Some("```rust\n".to_string() + &*desc + "\n```\n\n" + &*docs) | 280 | Some("```rust\n".to_string() + &*desc + "\n```\n\n" + &*docs) |
@@ -307,8 +287,8 @@ impl AnalysisImpl { | |||
307 | Ok(result) | 287 | Ok(result) |
308 | } | 288 | } |
309 | 289 | ||
310 | pub fn diagnostics(&self, file_id: FileId) -> Cancelable<Vec<Diagnostic>> { | 290 | pub(crate) fn diagnostics(&self, file_id: FileId) -> Cancelable<Vec<Diagnostic>> { |
311 | let syntax = self.db.source_file(file_id); | 291 | let syntax = self.source_file(file_id); |
312 | 292 | ||
313 | let mut res = ra_editor::diagnostics(&syntax) | 293 | let mut res = ra_editor::diagnostics(&syntax) |
314 | .into_iter() | 294 | .into_iter() |
@@ -319,9 +299,9 @@ impl AnalysisImpl { | |||
319 | fix: d.fix.map(|fix| SourceChange::from_local_edit(file_id, fix)), | 299 | fix: d.fix.map(|fix| SourceChange::from_local_edit(file_id, fix)), |
320 | }) | 300 | }) |
321 | .collect::<Vec<_>>(); | 301 | .collect::<Vec<_>>(); |
322 | if let Some(m) = source_binder::module_from_file_id(&*self.db, file_id)? { | 302 | if let Some(m) = source_binder::module_from_file_id(self, file_id)? { |
323 | for (name_node, problem) in m.problems(&*self.db) { | 303 | for (name_node, problem) in m.problems(self) { |
324 | let source_root = self.db.file_source_root(file_id); | 304 | let source_root = self.file_source_root(file_id); |
325 | let diag = match problem { | 305 | let diag = match problem { |
326 | Problem::UnresolvedModule { candidate } => { | 306 | Problem::UnresolvedModule { candidate } => { |
327 | let create_file = FileSystemEdit::CreateFile { | 307 | let create_file = FileSystemEdit::CreateFile { |
@@ -371,8 +351,8 @@ impl AnalysisImpl { | |||
371 | Ok(res) | 351 | Ok(res) |
372 | } | 352 | } |
373 | 353 | ||
374 | pub fn assists(&self, frange: FileRange) -> Vec<SourceChange> { | 354 | pub(crate) fn assists(&self, frange: FileRange) -> Vec<SourceChange> { |
375 | let file = self.db.source_file(frange.file_id); | 355 | let file = self.source_file(frange.file_id); |
376 | let offset = frange.range.start(); | 356 | let offset = frange.range.start(); |
377 | let actions = vec![ | 357 | let actions = vec![ |
378 | ra_editor::flip_comma(&file, offset).map(|f| f()), | 358 | ra_editor::flip_comma(&file, offset).map(|f| f()), |
@@ -389,11 +369,11 @@ impl AnalysisImpl { | |||
389 | .collect() | 369 | .collect() |
390 | } | 370 | } |
391 | 371 | ||
392 | pub fn resolve_callable( | 372 | pub(crate) fn resolve_callable( |
393 | &self, | 373 | &self, |
394 | position: FilePosition, | 374 | position: FilePosition, |
395 | ) -> Cancelable<Option<(FnSignatureInfo, Option<usize>)>> { | 375 | ) -> Cancelable<Option<(FnSignatureInfo, Option<usize>)>> { |
396 | let file = self.db.source_file(position.file_id); | 376 | let file = self.source_file(position.file_id); |
397 | let syntax = file.syntax(); | 377 | let syntax = file.syntax(); |
398 | 378 | ||
399 | // Find the calling expression and it's NameRef | 379 | // Find the calling expression and it's NameRef |
@@ -404,12 +384,12 @@ impl AnalysisImpl { | |||
404 | let file_symbols = self.index_resolve(name_ref)?; | 384 | let file_symbols = self.index_resolve(name_ref)?; |
405 | for (fn_file_id, fs) in file_symbols { | 385 | for (fn_file_id, fs) in file_symbols { |
406 | if fs.kind == FN_DEF { | 386 | if fs.kind == FN_DEF { |
407 | let fn_file = self.db.source_file(fn_file_id); | 387 | let fn_file = self.source_file(fn_file_id); |
408 | if let Some(fn_def) = find_node_at_offset(fn_file.syntax(), fs.node_range.start()) { | 388 | if let Some(fn_def) = find_node_at_offset(fn_file.syntax(), fs.node_range.start()) { |
409 | let descr = ctry!(source_binder::function_from_source( | 389 | let descr = ctry!(source_binder::function_from_source( |
410 | &*self.db, fn_file_id, fn_def | 390 | self, fn_file_id, fn_def |
411 | )?); | 391 | )?); |
412 | if let Some(descriptor) = descr.signature_info(&*self.db) { | 392 | if let Some(descriptor) = descr.signature_info(self) { |
413 | // If we have a calling expression let's find which argument we are on | 393 | // If we have a calling expression let's find which argument we are on |
414 | let mut current_parameter = None; | 394 | let mut current_parameter = None; |
415 | 395 | ||
@@ -456,20 +436,20 @@ impl AnalysisImpl { | |||
456 | Ok(None) | 436 | Ok(None) |
457 | } | 437 | } |
458 | 438 | ||
459 | pub fn type_of(&self, frange: FileRange) -> Cancelable<Option<String>> { | 439 | pub(crate) fn type_of(&self, frange: FileRange) -> Cancelable<Option<String>> { |
460 | let file = self.db.source_file(frange.file_id); | 440 | let file = self.source_file(frange.file_id); |
461 | let syntax = file.syntax(); | 441 | let syntax = file.syntax(); |
462 | let node = find_covering_node(syntax, frange.range); | 442 | let node = find_covering_node(syntax, frange.range); |
463 | let parent_fn = ctry!(node.ancestors().find_map(FnDef::cast)); | 443 | let parent_fn = ctry!(node.ancestors().find_map(FnDef::cast)); |
464 | let function = ctry!(source_binder::function_from_source( | 444 | let function = ctry!(source_binder::function_from_source( |
465 | &*self.db, | 445 | self, |
466 | frange.file_id, | 446 | frange.file_id, |
467 | parent_fn | 447 | parent_fn |
468 | )?); | 448 | )?); |
469 | let infer = function.infer(&*self.db)?; | 449 | let infer = function.infer(self)?; |
470 | Ok(infer.type_of_node(node).map(|t| t.to_string())) | 450 | Ok(infer.type_of_node(node).map(|t| t.to_string())) |
471 | } | 451 | } |
472 | pub fn rename( | 452 | pub(crate) fn rename( |
473 | &self, | 453 | &self, |
474 | position: FilePosition, | 454 | position: FilePosition, |
475 | new_name: &str, | 455 | new_name: &str, |
@@ -493,7 +473,7 @@ impl AnalysisImpl { | |||
493 | let mut query = Query::new(name.to_string()); | 473 | let mut query = Query::new(name.to_string()); |
494 | query.exact(); | 474 | query.exact(); |
495 | query.limit(4); | 475 | query.limit(4); |
496 | crate::symbol_index::world_symbols(&*self.db, query) | 476 | crate::symbol_index::world_symbols(self, query) |
497 | } | 477 | } |
498 | } | 478 | } |
499 | 479 | ||
diff --git a/crates/ra_analysis/src/lib.rs b/crates/ra_analysis/src/lib.rs index 03994b7c4..efb483103 100644 --- a/crates/ra_analysis/src/lib.rs +++ b/crates/ra_analysis/src/lib.rs | |||
@@ -27,11 +27,9 @@ use ra_syntax::{SourceFileNode, TextRange, TextUnit, SmolStr, SyntaxKind}; | |||
27 | use ra_text_edit::TextEdit; | 27 | use ra_text_edit::TextEdit; |
28 | use rayon::prelude::*; | 28 | use rayon::prelude::*; |
29 | use relative_path::RelativePathBuf; | 29 | use relative_path::RelativePathBuf; |
30 | use salsa::ParallelDatabase; | ||
30 | 31 | ||
31 | use crate::{ | 32 | use crate::symbol_index::{SymbolIndex, FileSymbol}; |
32 | imp::AnalysisImpl, | ||
33 | symbol_index::{SymbolIndex, FileSymbol}, | ||
34 | }; | ||
35 | 33 | ||
36 | pub use crate::{ | 34 | pub use crate::{ |
37 | completion::{CompletionItem, CompletionItemKind, InsertText}, | 35 | completion::{CompletionItem, CompletionItemKind, InsertText}, |
@@ -161,7 +159,7 @@ impl AnalysisHost { | |||
161 | /// semantic information. | 159 | /// semantic information. |
162 | pub fn analysis(&self) -> Analysis { | 160 | pub fn analysis(&self) -> Analysis { |
163 | Analysis { | 161 | Analysis { |
164 | imp: self.db.analysis(), | 162 | db: self.db.snapshot(), |
165 | } | 163 | } |
166 | } | 164 | } |
167 | /// Applies changes to the current state of the world. If there are | 165 | /// Applies changes to the current state of the world. If there are |
@@ -293,56 +291,56 @@ impl ReferenceResolution { | |||
293 | /// `Analysis` are canceled (most method return `Err(Canceled)`). | 291 | /// `Analysis` are canceled (most method return `Err(Canceled)`). |
294 | #[derive(Debug)] | 292 | #[derive(Debug)] |
295 | pub struct Analysis { | 293 | pub struct Analysis { |
296 | pub(crate) imp: AnalysisImpl, | 294 | db: salsa::Snapshot<db::RootDatabase>, |
297 | } | 295 | } |
298 | 296 | ||
299 | impl Analysis { | 297 | impl Analysis { |
300 | pub fn file_text(&self, file_id: FileId) -> Arc<String> { | 298 | pub fn file_text(&self, file_id: FileId) -> Arc<String> { |
301 | self.imp.db.file_text(file_id) | 299 | self.db.file_text(file_id) |
302 | } | 300 | } |
303 | pub fn file_syntax(&self, file_id: FileId) -> SourceFileNode { | 301 | pub fn file_syntax(&self, file_id: FileId) -> SourceFileNode { |
304 | self.imp.db.source_file(file_id).clone() | 302 | self.db.source_file(file_id).clone() |
305 | } | 303 | } |
306 | pub fn file_line_index(&self, file_id: FileId) -> Arc<LineIndex> { | 304 | pub fn file_line_index(&self, file_id: FileId) -> Arc<LineIndex> { |
307 | self.imp.db.file_lines(file_id) | 305 | self.db.file_lines(file_id) |
308 | } | 306 | } |
309 | pub fn extend_selection(&self, frange: FileRange) -> TextRange { | 307 | pub fn extend_selection(&self, frange: FileRange) -> TextRange { |
310 | extend_selection::extend_selection(&self.imp.db, frange) | 308 | extend_selection::extend_selection(&self.db, frange) |
311 | } | 309 | } |
312 | pub fn matching_brace(&self, file: &SourceFileNode, offset: TextUnit) -> Option<TextUnit> { | 310 | pub fn matching_brace(&self, file: &SourceFileNode, offset: TextUnit) -> Option<TextUnit> { |
313 | ra_editor::matching_brace(file, offset) | 311 | ra_editor::matching_brace(file, offset) |
314 | } | 312 | } |
315 | pub fn syntax_tree(&self, file_id: FileId) -> String { | 313 | pub fn syntax_tree(&self, file_id: FileId) -> String { |
316 | let file = self.imp.db.source_file(file_id); | 314 | let file = self.db.source_file(file_id); |
317 | ra_editor::syntax_tree(&file) | 315 | ra_editor::syntax_tree(&file) |
318 | } | 316 | } |
319 | pub fn join_lines(&self, frange: FileRange) -> SourceChange { | 317 | pub fn join_lines(&self, frange: FileRange) -> SourceChange { |
320 | let file = self.imp.db.source_file(frange.file_id); | 318 | let file = self.db.source_file(frange.file_id); |
321 | SourceChange::from_local_edit(frange.file_id, ra_editor::join_lines(&file, frange.range)) | 319 | SourceChange::from_local_edit(frange.file_id, ra_editor::join_lines(&file, frange.range)) |
322 | } | 320 | } |
323 | pub fn on_enter(&self, position: FilePosition) -> Option<SourceChange> { | 321 | pub fn on_enter(&self, position: FilePosition) -> Option<SourceChange> { |
324 | let file = self.imp.db.source_file(position.file_id); | 322 | let file = self.db.source_file(position.file_id); |
325 | let edit = ra_editor::on_enter(&file, position.offset)?; | 323 | let edit = ra_editor::on_enter(&file, position.offset)?; |
326 | let res = SourceChange::from_local_edit(position.file_id, edit); | 324 | let res = SourceChange::from_local_edit(position.file_id, edit); |
327 | Some(res) | 325 | Some(res) |
328 | } | 326 | } |
329 | pub fn on_eq_typed(&self, position: FilePosition) -> Option<SourceChange> { | 327 | pub fn on_eq_typed(&self, position: FilePosition) -> Option<SourceChange> { |
330 | let file = self.imp.db.source_file(position.file_id); | 328 | let file = self.db.source_file(position.file_id); |
331 | Some(SourceChange::from_local_edit( | 329 | Some(SourceChange::from_local_edit( |
332 | position.file_id, | 330 | position.file_id, |
333 | ra_editor::on_eq_typed(&file, position.offset)?, | 331 | ra_editor::on_eq_typed(&file, position.offset)?, |
334 | )) | 332 | )) |
335 | } | 333 | } |
336 | pub fn file_structure(&self, file_id: FileId) -> Vec<StructureNode> { | 334 | pub fn file_structure(&self, file_id: FileId) -> Vec<StructureNode> { |
337 | let file = self.imp.db.source_file(file_id); | 335 | let file = self.db.source_file(file_id); |
338 | ra_editor::file_structure(&file) | 336 | ra_editor::file_structure(&file) |
339 | } | 337 | } |
340 | pub fn folding_ranges(&self, file_id: FileId) -> Vec<Fold> { | 338 | pub fn folding_ranges(&self, file_id: FileId) -> Vec<Fold> { |
341 | let file = self.imp.db.source_file(file_id); | 339 | let file = self.db.source_file(file_id); |
342 | ra_editor::folding_ranges(&file) | 340 | ra_editor::folding_ranges(&file) |
343 | } | 341 | } |
344 | pub fn symbol_search(&self, query: Query) -> Cancelable<Vec<NavigationTarget>> { | 342 | pub fn symbol_search(&self, query: Query) -> Cancelable<Vec<NavigationTarget>> { |
345 | let res = symbol_index::world_symbols(&*self.imp.db, query)? | 343 | let res = symbol_index::world_symbols(&*self.db, query)? |
346 | .into_iter() | 344 | .into_iter() |
347 | .map(|(file_id, symbol)| NavigationTarget { file_id, symbol }) | 345 | .map(|(file_id, symbol)| NavigationTarget { file_id, symbol }) |
348 | .collect(); | 346 | .collect(); |
@@ -352,57 +350,58 @@ impl Analysis { | |||
352 | &self, | 350 | &self, |
353 | position: FilePosition, | 351 | position: FilePosition, |
354 | ) -> Cancelable<Option<ReferenceResolution>> { | 352 | ) -> Cancelable<Option<ReferenceResolution>> { |
355 | self.imp.approximately_resolve_symbol(position) | 353 | self.db.approximately_resolve_symbol(position) |
356 | } | 354 | } |
357 | pub fn find_all_refs(&self, position: FilePosition) -> Cancelable<Vec<(FileId, TextRange)>> { | 355 | pub fn find_all_refs(&self, position: FilePosition) -> Cancelable<Vec<(FileId, TextRange)>> { |
358 | self.imp.find_all_refs(position) | 356 | self.db.find_all_refs(position) |
359 | } | 357 | } |
360 | pub fn doc_text_for(&self, nav: NavigationTarget) -> Cancelable<Option<String>> { | 358 | pub fn doc_text_for(&self, nav: NavigationTarget) -> Cancelable<Option<String>> { |
361 | self.imp.doc_text_for(nav) | 359 | self.db.doc_text_for(nav) |
362 | } | 360 | } |
363 | pub fn parent_module(&self, position: FilePosition) -> Cancelable<Vec<NavigationTarget>> { | 361 | pub fn parent_module(&self, position: FilePosition) -> Cancelable<Vec<NavigationTarget>> { |
364 | self.imp.parent_module(position) | 362 | self.db.parent_module(position) |
365 | } | 363 | } |
366 | pub fn module_path(&self, position: FilePosition) -> Cancelable<Option<String>> { | 364 | pub fn module_path(&self, position: FilePosition) -> Cancelable<Option<String>> { |
367 | self.imp.module_path(position) | 365 | self.db.module_path(position) |
368 | } | 366 | } |
369 | pub fn crate_for(&self, file_id: FileId) -> Cancelable<Vec<CrateId>> { | 367 | pub fn crate_for(&self, file_id: FileId) -> Cancelable<Vec<CrateId>> { |
370 | self.imp.crate_for(file_id) | 368 | self.db.crate_for(file_id) |
371 | } | 369 | } |
372 | pub fn crate_root(&self, crate_id: CrateId) -> Cancelable<FileId> { | 370 | pub fn crate_root(&self, crate_id: CrateId) -> Cancelable<FileId> { |
373 | Ok(self.imp.crate_root(crate_id)) | 371 | Ok(self.db.crate_root(crate_id)) |
374 | } | 372 | } |
375 | pub fn runnables(&self, file_id: FileId) -> Cancelable<Vec<Runnable>> { | 373 | pub fn runnables(&self, file_id: FileId) -> Cancelable<Vec<Runnable>> { |
376 | let file = self.imp.db.source_file(file_id); | 374 | let file = self.db.source_file(file_id); |
377 | Ok(runnables::runnables(self, &file, file_id)) | 375 | Ok(runnables::runnables(self, &file, file_id)) |
378 | } | 376 | } |
379 | pub fn highlight(&self, file_id: FileId) -> Cancelable<Vec<HighlightedRange>> { | 377 | pub fn highlight(&self, file_id: FileId) -> Cancelable<Vec<HighlightedRange>> { |
380 | syntax_highlighting::highlight(&*self.imp.db, file_id) | 378 | syntax_highlighting::highlight(&*self.db, file_id) |
381 | } | 379 | } |
382 | pub fn completions(&self, position: FilePosition) -> Cancelable<Option<Vec<CompletionItem>>> { | 380 | pub fn completions(&self, position: FilePosition) -> Cancelable<Option<Vec<CompletionItem>>> { |
383 | self.imp.completions(position) | 381 | let completions = completion::completions(&self.db, position)?; |
382 | Ok(completions.map(|it| it.into())) | ||
384 | } | 383 | } |
385 | pub fn assists(&self, frange: FileRange) -> Cancelable<Vec<SourceChange>> { | 384 | pub fn assists(&self, frange: FileRange) -> Cancelable<Vec<SourceChange>> { |
386 | Ok(self.imp.assists(frange)) | 385 | Ok(self.db.assists(frange)) |
387 | } | 386 | } |
388 | pub fn diagnostics(&self, file_id: FileId) -> Cancelable<Vec<Diagnostic>> { | 387 | pub fn diagnostics(&self, file_id: FileId) -> Cancelable<Vec<Diagnostic>> { |
389 | self.imp.diagnostics(file_id) | 388 | self.db.diagnostics(file_id) |
390 | } | 389 | } |
391 | pub fn resolve_callable( | 390 | pub fn resolve_callable( |
392 | &self, | 391 | &self, |
393 | position: FilePosition, | 392 | position: FilePosition, |
394 | ) -> Cancelable<Option<(FnSignatureInfo, Option<usize>)>> { | 393 | ) -> Cancelable<Option<(FnSignatureInfo, Option<usize>)>> { |
395 | self.imp.resolve_callable(position) | 394 | self.db.resolve_callable(position) |
396 | } | 395 | } |
397 | pub fn type_of(&self, frange: FileRange) -> Cancelable<Option<String>> { | 396 | pub fn type_of(&self, frange: FileRange) -> Cancelable<Option<String>> { |
398 | self.imp.type_of(frange) | 397 | self.db.type_of(frange) |
399 | } | 398 | } |
400 | pub fn rename( | 399 | pub fn rename( |
401 | &self, | 400 | &self, |
402 | position: FilePosition, | 401 | position: FilePosition, |
403 | new_name: &str, | 402 | new_name: &str, |
404 | ) -> Cancelable<Vec<SourceFileEdit>> { | 403 | ) -> Cancelable<Vec<SourceFileEdit>> { |
405 | self.imp.rename(position, new_name) | 404 | self.db.rename(position, new_name) |
406 | } | 405 | } |
407 | } | 406 | } |
408 | 407 | ||