aboutsummaryrefslogtreecommitdiff
path: root/crates/libanalysis/src/module_map_db/mod.rs
diff options
context:
space:
mode:
Diffstat (limited to 'crates/libanalysis/src/module_map_db/mod.rs')
-rw-r--r--crates/libanalysis/src/module_map_db/mod.rs47
1 files changed, 16 insertions, 31 deletions
diff --git a/crates/libanalysis/src/module_map_db/mod.rs b/crates/libanalysis/src/module_map_db/mod.rs
index 5560e4a34..adad943da 100644
--- a/crates/libanalysis/src/module_map_db/mod.rs
+++ b/crates/libanalysis/src/module_map_db/mod.rs
@@ -1,5 +1,3 @@
1mod descr;
2
3use std::sync::Arc; 1use std::sync::Arc;
4use { 2use {
5 FileId, 3 FileId,
@@ -7,49 +5,36 @@ use {
7 Query, QueryRegistry, QueryCtx, 5 Query, QueryRegistry, QueryCtx,
8 file_syntax, file_set 6 file_syntax, file_set
9 }, 7 },
10 module_map::resolve_submodule, 8 descriptors::{ModuleDescriptor, ModuleTreeDescriptor}
11}; 9};
12 10
13pub(crate) fn register_queries(reg: &mut QueryRegistry) { 11pub(crate) fn register_queries(reg: &mut QueryRegistry) {
14 reg.add(MODULE_DESCR, "MODULE_DESCR"); 12 reg.add(MODULE_DESCR, "MODULE_DESCR");
15 reg.add(RESOLVE_SUBMODULE, "RESOLVE_SUBMODULE"); 13}
16 reg.add(PARENT_MODULE, "PARENT_MODULE"); 14
15pub(crate) fn module_tree(ctx: QueryCtx) -> Arc<ModuleTreeDescriptor> {
16 ctx.get(MODULE_TREE, ())
17} 17}
18 18
19impl<'a> QueryCtx<'a> { 19impl<'a> QueryCtx<'a> {
20 fn module_descr(&self, file_id: FileId) -> Arc<descr::ModuleDescr> { 20 fn module_descr(&self, file_id: FileId) -> Arc<ModuleDescriptor> {
21 self.get(MODULE_DESCR, file_id) 21 self.get(MODULE_DESCR, file_id)
22 } 22 }
23 fn resolve_submodule(&self, file_id: FileId, submod: descr::Submodule) -> Arc<Vec<FileId>> {
24 self.get(RESOLVE_SUBMODULE, (file_id, submod))
25 }
26} 23}
27 24
28const MODULE_DESCR: Query<FileId, descr::ModuleDescr> = Query(30, |ctx, &file_id| { 25const MODULE_DESCR: Query<FileId, ModuleDescriptor> = Query(30, |ctx, &file_id| {
29 let file = file_syntax(ctx, file_id); 26 let file = file_syntax(ctx, file_id);
30 descr::ModuleDescr::new(file.ast()) 27 ModuleDescriptor::new(file.ast())
31}); 28});
32 29
33const RESOLVE_SUBMODULE: Query<(FileId, descr::Submodule), Vec<FileId>> = Query(31, |ctx, params| { 30const MODULE_TREE: Query<(), ModuleTreeDescriptor> = Query(31, |ctx, _| {
34 let files = file_set(ctx); 31 let file_set = file_set(ctx);
35 resolve_submodule(params.0, &params.1.name, &files.1).0 32 let mut files = Vec::new();
36}); 33 for &file_id in file_set.0.iter() {
37 34 let module_descr = ctx.get(MODULE_DESCR, file_id);
38const PARENT_MODULE: Query<FileId, Vec<FileId>> = Query(40, |ctx, file_id| { 35 files.push((file_id, module_descr));
39 let files = file_set(ctx); 36 }
40 let res = files.0.iter() 37 ModuleTreeDescriptor::new(files.iter().map(|(file_id, descr)| (*file_id, &**descr)), &file_set.1)
41 .map(|&parent_id| (parent_id, ctx.module_descr(parent_id)))
42 .filter(|(parent_id, descr)| {
43 descr.submodules.iter()
44 .any(|subm| {
45 ctx.resolve_submodule(*parent_id, subm.clone())
46 .iter()
47 .any(|it| it == file_id)
48 })
49 })
50 .map(|(id, _)| id)
51 .collect();
52 res
53}); 38});
54 39
55#[cfg(test)] 40#[cfg(test)]