diff options
author | Aleksey Kladov <[email protected]> | 2018-09-15 18:29:22 +0100 |
---|---|---|
committer | Aleksey Kladov <[email protected]> | 2018-09-15 22:00:05 +0100 |
commit | 58674dc3c415142dbdd93b990d9f5b4fe10bef69 (patch) | |
tree | d30f60432f96e256d20e805e1f62a3084f61644a /crates/libanalysis/src/module_map_db | |
parent | d59413c895e7b49ed2ad01be35871e417a57a43c (diff) |
ModuleTreeDescriptor
Diffstat (limited to 'crates/libanalysis/src/module_map_db')
-rw-r--r-- | crates/libanalysis/src/module_map_db/descr.rs | 29 | ||||
-rw-r--r-- | crates/libanalysis/src/module_map_db/mod.rs | 47 |
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 @@ | |||
1 | use libsyntax2::{ | ||
2 | SmolStr, | ||
3 | ast::{self, NameOwner}, | ||
4 | }; | ||
5 | |||
6 | #[derive(Debug, Hash)] | ||
7 | pub struct ModuleDescr { | ||
8 | pub submodules: Vec<Submodule> | ||
9 | } | ||
10 | |||
11 | impl 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)] | ||
27 | pub 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 @@ | |||
1 | mod descr; | ||
2 | |||
3 | use std::sync::Arc; | 1 | use std::sync::Arc; |
4 | use { | 2 | use { |
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 | ||
13 | pub(crate) fn register_queries(reg: &mut QueryRegistry) { | 11 | pub(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 | |
15 | pub(crate) fn module_tree(ctx: QueryCtx) -> Arc<ModuleTreeDescriptor> { | ||
16 | ctx.get(MODULE_TREE, ()) | ||
17 | } | 17 | } |
18 | 18 | ||
19 | impl<'a> QueryCtx<'a> { | 19 | impl<'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 | ||
28 | const MODULE_DESCR: Query<FileId, descr::ModuleDescr> = Query(30, |ctx, &file_id| { | 25 | const 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 | ||
33 | const RESOLVE_SUBMODULE: Query<(FileId, descr::Submodule), Vec<FileId>> = Query(31, |ctx, params| { | 30 | const 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, ¶ms.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); | |
38 | const 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)] |