aboutsummaryrefslogtreecommitdiff
path: root/crates/ra_analysis/src/completion.rs
diff options
context:
space:
mode:
authorAleksey Kladov <[email protected]>2018-10-30 23:08:54 +0000
committerAleksey Kladov <[email protected]>2018-10-30 23:08:54 +0000
commitfbbee537228538f448a335bb0b2dabec2b3d443e (patch)
treedb676e2c84585c13179e0116b018a3e67b550190 /crates/ra_analysis/src/completion.rs
parentd10214581e18a3c98760ecf8ebbd27aaf48ec9ae (diff)
Add ModuleScope as a query
This is a first step towards queryifing completion and resolve. Some code currently duplicates ra_editor: the plan is to move all completion from ra_editor, but it'll take more than one commit.
Diffstat (limited to 'crates/ra_analysis/src/completion.rs')
-rw-r--r--crates/ra_analysis/src/completion.rs35
1 files changed, 23 insertions, 12 deletions
diff --git a/crates/ra_analysis/src/completion.rs b/crates/ra_analysis/src/completion.rs
index 0a2f99575..0141d132e 100644
--- a/crates/ra_analysis/src/completion.rs
+++ b/crates/ra_analysis/src/completion.rs
@@ -1,40 +1,51 @@
1use ra_editor::{CompletionItem, find_node_at_offset, complete_module_items}; 1use ra_editor::{CompletionItem, find_node_at_offset};
2use ra_syntax::{ 2use ra_syntax::{
3 AtomEdit, File, TextUnit, AstNode, 3 AtomEdit, File, TextUnit, AstNode,
4 ast::{self, ModuleItemOwner}, 4 ast::{self, ModuleItemOwner, AstChildren},
5}; 5};
6 6
7use crate::{ 7use crate::{
8 FileId, Cancelable, 8 FileId, Cancelable,
9 input::FilesDatabase, 9 input::FilesDatabase,
10 db::{self, SyntaxDatabase}, 10 db::{self, SyntaxDatabase},
11 descriptors::module::{ModulesDatabase, ModuleTree, ModuleId}, 11 descriptors::module::{ModulesDatabase, ModuleTree, ModuleId, scope::ModuleScope},
12}; 12};
13 13
14pub(crate) fn resolve_based_completion(db: &db::RootDatabase, file_id: FileId, offset: TextUnit) -> Cancelable<Option<Vec<CompletionItem>>> { 14pub(crate) fn resolve_based_completion(db: &db::RootDatabase, file_id: FileId, offset: TextUnit) -> Cancelable<Option<Vec<CompletionItem>>> {
15 let source_root_id = db.file_source_root(file_id); 15 let source_root_id = db.file_source_root(file_id);
16 let file = db.file_syntax(file_id); 16 let file = db.file_syntax(file_id);
17 let module_tree = db.module_tree(source_root_id)?; 17 let module_tree = db.module_tree(source_root_id)?;
18 let module_id = match module_tree.any_module_for_file(file_id) {
19 None => return Ok(None),
20 Some(it) => it,
21 };
18 let file = { 22 let file = {
19 let edit = AtomEdit::insert(offset, "intellijRulezz".to_string()); 23 let edit = AtomEdit::insert(offset, "intellijRulezz".to_string());
20 file.reparse(&edit) 24 file.reparse(&edit)
21 }; 25 };
22 let target_file = match find_target_module(&module_tree, file_id, &file, offset) { 26 let target_module_id = match find_target_module(&module_tree, module_id, &file, offset) {
23 None => return Ok(None), 27 None => return Ok(None),
24 Some(target_module) => { 28 Some(it) => it,
25 let file_id = target_module.file_id(&module_tree);
26 db.file_syntax(file_id)
27 }
28 }; 29 };
29 let mut res = Vec::new(); 30 let module_scope = db.module_scope(source_root_id, target_module_id)?;
30 complete_module_items(target_file.ast().items(), None, &mut res); 31 let res: Vec<_> = module_scope
32 .entries()
33 .iter()
34 .map(|entry| CompletionItem {
35 label: entry.name().to_string(),
36 lookup: None,
37 snippet: None,
38 })
39 .collect();
31 Ok(Some(res)) 40 Ok(Some(res))
32} 41}
33 42
34pub(crate) fn find_target_module(module_tree: &ModuleTree, file_id: FileId, file: &File, offset: TextUnit) -> Option<ModuleId> { 43
44
45pub(crate) fn find_target_module(module_tree: &ModuleTree, module_id: ModuleId, file: &File, offset: TextUnit) -> Option<ModuleId> {
35 let name_ref: ast::NameRef = find_node_at_offset(file.syntax(), offset)?; 46 let name_ref: ast::NameRef = find_node_at_offset(file.syntax(), offset)?;
36 let mut crate_path = crate_path(name_ref)?; 47 let mut crate_path = crate_path(name_ref)?;
37 let module_id = module_tree.any_module_for_file(file_id)?; 48
38 crate_path.pop(); 49 crate_path.pop();
39 let mut target_module = module_id.root(&module_tree); 50 let mut target_module = module_id.root(&module_tree);
40 for name in crate_path { 51 for name in crate_path {