let is_macro_use = attrs.by_key("macro_use").exists();
match module {
// inline module, just recurse
- raw::ModuleData::Definition { name, items, ast_id } => {
- let module_id =
- self.push_child_module(name.clone(), AstId::new(self.file_id, *ast_id), None);
+ raw::ModuleData::Definition { name, visibility, items, ast_id } => {
+ let module_id = self.push_child_module(
+ name.clone(),
+ AstId::new(self.file_id, *ast_id),
+ None,
+ &visibility,
+ );
ModCollector {
def_collector: &mut *self.def_collector,
}
}
// out of line module, resolve, parse and recurse
- raw::ModuleData::Declaration { name, ast_id } => {
+ raw::ModuleData::Declaration { name, visibility, ast_id } => {
let ast_id = AstId::new(self.file_id, *ast_id);
match self.mod_dir.resolve_declaration(
self.def_collector.db,
path_attr,
) {
Ok((file_id, mod_dir)) => {
- let module_id = self.push_child_module(name.clone(), ast_id, Some(file_id));
+ let module_id = self.push_child_module(
+ name.clone(),
+ ast_id,
+ Some(file_id),
+ &visibility,
+ );
let raw_items = self.def_collector.db.raw_items(file_id.into());
ModCollector {
def_collector: &mut *self.def_collector,
name: Name,
declaration: AstId<ast::Module>,
definition: Option<FileId>,
+ visibility: &crate::visibility::Visibility,
) -> LocalModuleId {
+ let vis = self
+ .def_collector
+ .def_map
+ .resolve_visibility(self.def_collector.db, self.module_id, visibility)
+ .unwrap_or(ResolvedVisibility::Public);
let modules = &mut self.def_collector.def_map.modules;
let res = modules.alloc(ModuleData::default());
modules[res].parent = Some(self.module_id);
modules[self.module_id].children.insert(name.clone(), res);
let module = ModuleId { krate: self.def_collector.def_map.krate, local_id: res };
let def: ModuleDefId = module.into();
- let vis = ResolvedVisibility::Public; // TODO handle module visibility
self.def_collector.def_map.modules[self.module_id].scope.define_def(def);
self.def_collector.update(self.module_id, &[(name, PerNs::from_def(def, vis))], vis);
res
#[derive(Debug, PartialEq, Eq)]
pub(super) enum ModuleData {
- Declaration { name: Name, ast_id: FileAstId<ast::Module> },
- Definition { name: Name, ast_id: FileAstId<ast::Module>, items: Vec<RawItem> },
+ Declaration {
+ name: Name,
+ visibility: Visibility,
+ ast_id: FileAstId<ast::Module>,
+ },
+ Definition {
+ name: Name,
+ visibility: Visibility,
+ ast_id: FileAstId<ast::Module>,
+ items: Vec<RawItem>,
+ },
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
None => return,
};
let attrs = self.parse_attrs(&module);
+ let visibility = Visibility::from_ast_with_hygiene(module.visibility(), &self.hygiene);
let ast_id = self.source_ast_id_map.ast_id(&module);
if module.has_semi() {
- let item = self.raw_items.modules.alloc(ModuleData::Declaration { name, ast_id });
+ let item =
+ self.raw_items.modules.alloc(ModuleData::Declaration { name, visibility, ast_id });
self.push_item(current_module, attrs, RawItemKind::Module(item));
return;
}
if let Some(item_list) = module.item_list() {
let item = self.raw_items.modules.alloc(ModuleData::Definition {
name,
+ visibility,
ast_id,
items: Vec::new(),
});