aboutsummaryrefslogtreecommitdiff
path: root/crates/libanalysis/src/module_map_db
diff options
context:
space:
mode:
authorAleksey Kladov <[email protected]>2018-09-15 18:29:22 +0100
committerAleksey Kladov <[email protected]>2018-09-15 22:00:05 +0100
commit58674dc3c415142dbdd93b990d9f5b4fe10bef69 (patch)
treed30f60432f96e256d20e805e1f62a3084f61644a /crates/libanalysis/src/module_map_db
parentd59413c895e7b49ed2ad01be35871e417a57a43c (diff)
ModuleTreeDescriptor
Diffstat (limited to 'crates/libanalysis/src/module_map_db')
-rw-r--r--crates/libanalysis/src/module_map_db/descr.rs29
-rw-r--r--crates/libanalysis/src/module_map_db/mod.rs47
2 files changed, 16 insertions, 60 deletions
diff --git a/crates/libanalysis/src/module_map_db/descr.rs b/crates/libanalysis/src/module_map_db/descr.rs
deleted file mode 100644
index fb298a315..000000000
--- a/crates/libanalysis/src/module_map_db/descr.rs
+++ /dev/null
@@ -1,29 +0,0 @@
1use libsyntax2::{
2 SmolStr,
3 ast::{self, NameOwner},
4};
5
6#[derive(Debug, Hash)]
7pub struct ModuleDescr {
8 pub submodules: Vec<Submodule>
9}
10
11impl ModuleDescr {
12 pub fn new(root: ast::Root) -> ModuleDescr {
13 let submodules = root
14 .modules()
15 .filter_map(|module| {
16 let name = module.name()?.text();
17 if !module.has_semi() {
18 return None;
19 }
20 Some(Submodule { name })
21 }).collect();
22
23 ModuleDescr { submodules } }
24}
25
26#[derive(Clone, Hash, PartialEq, Eq, Debug)]
27pub struct Submodule {
28 pub name: SmolStr,
29}
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)]