mirror of
https://github.com/rust-lang/rust-analyzer.git
synced 2025-09-29 05:15:04 +00:00
collect all submodules
This commit is contained in:
parent
e0b21b9899
commit
17a88928f4
2 changed files with 30 additions and 20 deletions
|
@ -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! {
|
||||||
|
|
|
@ -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(
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue