collect all submodules

This commit is contained in:
Aleksey Kladov 2018-11-05 13:08:52 +03:00
parent e0b21b9899
commit 17a88928f4
2 changed files with 30 additions and 20 deletions

View file

@ -5,7 +5,7 @@ use std::sync::Arc;
use ra_syntax::{ use ra_syntax::{
ast::{self, AstNode, FnDefNode}, ast::{self, AstNode, FnDefNode},
SmolStr, TextRange, TextRange,
}; };
use crate::{ use crate::{
@ -14,7 +14,7 @@ use crate::{
descriptors::module::{ModuleId, ModuleScope, ModuleTree, ModuleSource}, descriptors::module::{ModuleId, ModuleScope, ModuleTree, ModuleSource},
input::SourceRootId, input::SourceRootId,
syntax_ptr::LocalSyntaxPtr, syntax_ptr::LocalSyntaxPtr,
Cancelable, FileId, Cancelable,
}; };
salsa::query_group! { salsa::query_group! {

View file

@ -21,7 +21,7 @@ use super::{
#[derive(Clone, Hash, PartialEq, Eq, Debug)] #[derive(Clone, Hash, PartialEq, Eq, Debug)]
pub(crate) struct Submodule { pub(crate) struct Submodule {
name: SmolStr name: SmolStr,
} }
pub(crate) fn submodules( pub(crate) fn submodules(
@ -29,26 +29,36 @@ pub(crate) fn submodules(
source: ModuleSource, source: ModuleSource,
) -> Cancelable<Arc<Vec<Submodule>>> { ) -> Cancelable<Arc<Vec<Submodule>>> {
db::check_canceled(db)?; db::check_canceled(db)?;
let file_id = match source { let submodules = match source.resolve(db) {
ModuleSource::File(it) => it, ModuleSourceNode::Root(it) => collect_submodules(it.ast()),
_ => unimplemented!(), ModuleSourceNode::Inline(it) => it
.ast()
.item_list()
.map(collect_submodules)
.unwrap_or_else(Vec::new),
}; };
let file = db.file_syntax(file_id); return Ok(Arc::new(submodules));
let root = file.ast();
let submodules = modules(root) fn collect_submodules<'a>(root: impl ast::ModuleItemOwner<'a>) -> Vec<Submodule> {
.map(|(name, _)| Submodule { name }) modules(root)
.collect(); .filter(|(_, m)| m.has_semi())
Ok(Arc::new(submodules)) .map(|(name, _)| Submodule { name })
.collect()
}
} }
pub(crate) fn modules(root: ast::Root<'_>) -> impl Iterator<Item = (SmolStr, ast::Module<'_>)> { pub(crate) fn modules<'a>(
root.modules().filter_map(|module| { root: impl ast::ModuleItemOwner<'a>,
let name = module.name()?.text(); ) -> impl Iterator<Item = (SmolStr, ast::Module<'a>)> {
if !module.has_semi() { root.items()
return None; .filter_map(|item| match item {
} ast::ModuleItem::Module(m) => Some(m),
Some((name, module)) _ => None,
}) })
.filter_map(|module| {
let name = module.name()?.text();
Some((name, module))
})
} }
pub(crate) fn module_scope( pub(crate) fn module_scope(