From 58674dc3c415142dbdd93b990d9f5b4fe10bef69 Mon Sep 17 00:00:00 2001 From: Aleksey Kladov Date: Sat, 15 Sep 2018 20:29:22 +0300 Subject: ModuleTreeDescriptor --- crates/libanalysis/src/module_map_db/descr.rs | 29 ----------------- crates/libanalysis/src/module_map_db/mod.rs | 47 +++++++++------------------ 2 files changed, 16 insertions(+), 60 deletions(-) delete mode 100644 crates/libanalysis/src/module_map_db/descr.rs (limited to 'crates/libanalysis/src/module_map_db') 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 @@ -use libsyntax2::{ - SmolStr, - ast::{self, NameOwner}, -}; - -#[derive(Debug, Hash)] -pub struct ModuleDescr { - pub submodules: Vec -} - -impl ModuleDescr { - pub fn new(root: ast::Root) -> ModuleDescr { - let submodules = root - .modules() - .filter_map(|module| { - let name = module.name()?.text(); - if !module.has_semi() { - return None; - } - Some(Submodule { name }) - }).collect(); - - ModuleDescr { submodules } } -} - -#[derive(Clone, Hash, PartialEq, Eq, Debug)] -pub struct Submodule { - pub name: SmolStr, -} 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 @@ -mod descr; - use std::sync::Arc; use { FileId, @@ -7,49 +5,36 @@ use { Query, QueryRegistry, QueryCtx, file_syntax, file_set }, - module_map::resolve_submodule, + descriptors::{ModuleDescriptor, ModuleTreeDescriptor} }; pub(crate) fn register_queries(reg: &mut QueryRegistry) { reg.add(MODULE_DESCR, "MODULE_DESCR"); - reg.add(RESOLVE_SUBMODULE, "RESOLVE_SUBMODULE"); - reg.add(PARENT_MODULE, "PARENT_MODULE"); +} + +pub(crate) fn module_tree(ctx: QueryCtx) -> Arc { + ctx.get(MODULE_TREE, ()) } impl<'a> QueryCtx<'a> { - fn module_descr(&self, file_id: FileId) -> Arc { + fn module_descr(&self, file_id: FileId) -> Arc { self.get(MODULE_DESCR, file_id) } - fn resolve_submodule(&self, file_id: FileId, submod: descr::Submodule) -> Arc> { - self.get(RESOLVE_SUBMODULE, (file_id, submod)) - } } -const MODULE_DESCR: Query = Query(30, |ctx, &file_id| { +const MODULE_DESCR: Query = Query(30, |ctx, &file_id| { let file = file_syntax(ctx, file_id); - descr::ModuleDescr::new(file.ast()) + ModuleDescriptor::new(file.ast()) }); -const RESOLVE_SUBMODULE: Query<(FileId, descr::Submodule), Vec> = Query(31, |ctx, params| { - let files = file_set(ctx); - resolve_submodule(params.0, ¶ms.1.name, &files.1).0 -}); - -const PARENT_MODULE: Query> = Query(40, |ctx, file_id| { - let files = file_set(ctx); - let res = files.0.iter() - .map(|&parent_id| (parent_id, ctx.module_descr(parent_id))) - .filter(|(parent_id, descr)| { - descr.submodules.iter() - .any(|subm| { - ctx.resolve_submodule(*parent_id, subm.clone()) - .iter() - .any(|it| it == file_id) - }) - }) - .map(|(id, _)| id) - .collect(); - res +const MODULE_TREE: Query<(), ModuleTreeDescriptor> = Query(31, |ctx, _| { + let file_set = file_set(ctx); + let mut files = Vec::new(); + for &file_id in file_set.0.iter() { + let module_descr = ctx.get(MODULE_DESCR, file_id); + files.push((file_id, module_descr)); + } + ModuleTreeDescriptor::new(files.iter().map(|(file_id, descr)| (*file_id, &**descr)), &file_set.1) }); #[cfg(test)] -- cgit v1.2.3