-/// A public module
-struct ASTModule {
- pub attrs: Vec<syn::Attribute>,
- pub items: Vec<syn::Item>,
- pub submods: Vec<String>,
-}
-/// A struct containing the syn::File AST for each file in the crate.
-struct FullLibraryAST {
- modules: HashMap<String, ASTModule, NonRandomHash>,
-}
-impl FullLibraryAST {
- fn load_module(&mut self, module: String, attrs: Vec<syn::Attribute>, mut items: Vec<syn::Item>) {
- let mut non_mod_items = Vec::with_capacity(items.len());
- let mut submods = Vec::with_capacity(items.len());
- for item in items.drain(..) {
- match item {
- syn::Item::Mod(m) if m.content.is_some() => {
- if export_status(&m.attrs) == ExportStatus::Export {
- if let syn::Visibility::Public(_) = m.vis {
- let modident = format!("{}", m.ident);
- let modname = if module != "" {
- module.clone() + "::" + &modident
- } else {
- modident.clone()
- };
- self.load_module(modname, m.attrs, m.content.unwrap().1);
- submods.push(modident);
- } else {
- non_mod_items.push(syn::Item::Mod(m));
- }
- }
- },
- syn::Item::Mod(_) => panic!("--pretty=expanded output should never have non-body modules"),
- _ => { non_mod_items.push(item); }
- }
- }
- self.modules.insert(module, ASTModule { attrs, items: non_mod_items, submods });
- }
-
- pub fn load_lib(lib: syn::File) -> Self {
- assert_eq!(export_status(&lib.attrs), ExportStatus::Export);
- let mut res = Self { modules: HashMap::default() };
- res.load_module("".to_owned(), lib.attrs, lib.items);
- res
- }
-}