aboutsummaryrefslogtreecommitdiff
path: root/crates/ra_analysis/src/module_map.rs
diff options
context:
space:
mode:
Diffstat (limited to 'crates/ra_analysis/src/module_map.rs')
-rw-r--r--crates/ra_analysis/src/module_map.rs22
1 files changed, 13 insertions, 9 deletions
diff --git a/crates/ra_analysis/src/module_map.rs b/crates/ra_analysis/src/module_map.rs
index b15432498..3c800265a 100644
--- a/crates/ra_analysis/src/module_map.rs
+++ b/crates/ra_analysis/src/module_map.rs
@@ -1,37 +1,41 @@
1use std::sync::Arc;
2
1use crate::{ 3use crate::{
4 db,
5 Cancelable,
2 db::SyntaxDatabase, 6 db::SyntaxDatabase,
3 descriptors::{ModuleDescriptor, ModuleTreeDescriptor}, 7 descriptors::{ModuleDescriptor, ModuleTreeDescriptor},
4 FileId, 8 FileId,
5}; 9};
6 10
7use std::sync::Arc;
8
9salsa::query_group! { 11salsa::query_group! {
10 pub(crate) trait ModulesDatabase: SyntaxDatabase { 12 pub(crate) trait ModulesDatabase: SyntaxDatabase {
11 fn module_tree() -> Arc<ModuleTreeDescriptor> { 13 fn module_tree() -> Cancelable<Arc<ModuleTreeDescriptor>> {
12 type ModuleTreeQuery; 14 type ModuleTreeQuery;
13 } 15 }
14 fn module_descriptor(file_id: FileId) -> Arc<ModuleDescriptor> { 16 fn module_descriptor(file_id: FileId) -> Cancelable<Arc<ModuleDescriptor>> {
15 type ModuleDescriptorQuery; 17 type ModuleDescriptorQuery;
16 } 18 }
17 } 19 }
18} 20}
19 21
20fn module_descriptor(db: &impl ModulesDatabase, file_id: FileId) -> Arc<ModuleDescriptor> { 22fn module_descriptor(db: &impl ModulesDatabase, file_id: FileId) -> Cancelable<Arc<ModuleDescriptor>> {
23 db::check_canceled(db)?;
21 let file = db.file_syntax(file_id); 24 let file = db.file_syntax(file_id);
22 Arc::new(ModuleDescriptor::new(file.ast())) 25 Ok(Arc::new(ModuleDescriptor::new(file.ast())))
23} 26}
24 27
25fn module_tree(db: &impl ModulesDatabase) -> Arc<ModuleTreeDescriptor> { 28fn module_tree(db: &impl ModulesDatabase) -> Cancelable<Arc<ModuleTreeDescriptor>> {
29 db::check_canceled(db)?;
26 let file_set = db.file_set(); 30 let file_set = db.file_set();
27 let mut files = Vec::new(); 31 let mut files = Vec::new();
28 for &file_id in file_set.files.iter() { 32 for &file_id in file_set.files.iter() {
29 let module_descr = db.module_descriptor(file_id); 33 let module_descr = db.module_descriptor(file_id)?;
30 files.push((file_id, module_descr)); 34 files.push((file_id, module_descr));
31 } 35 }
32 let res = ModuleTreeDescriptor::new( 36 let res = ModuleTreeDescriptor::new(
33 files.iter().map(|(file_id, descr)| (*file_id, &**descr)), 37 files.iter().map(|(file_id, descr)| (*file_id, &**descr)),
34 &file_set.resolver, 38 &file_set.resolver,
35 ); 39 );
36 Arc::new(res) 40 Ok(Arc::new(res))
37} 41}