]> git.lizzy.rs Git - rust.git/commitdiff
Handle privacy for modules
authorFlorian Diebold <flodiebold@gmail.com>
Thu, 26 Dec 2019 14:49:13 +0000 (15:49 +0100)
committerFlorian Diebold <flodiebold@gmail.com>
Thu, 26 Dec 2019 15:23:40 +0000 (16:23 +0100)
crates/ra_hir_def/src/nameres/collector.rs
crates/ra_hir_def/src/nameres/raw.rs
crates/ra_hir_def/src/nameres/tests/globs.rs

index 51df44d2f327971bd61a815f3276a3d586064237..a80c4f8e9b739c7eff5282962f36ed7d3a2aa780 100644 (file)
@@ -677,9 +677,13 @@ fn collect_module(&mut self, module: &raw::ModuleData, attrs: &Attrs) {
         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,
@@ -694,7 +698,7 @@ fn collect_module(&mut self, module: &raw::ModuleData, attrs: &Attrs) {
                 }
             }
             // 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,
@@ -703,7 +707,12 @@ fn collect_module(&mut self, module: &raw::ModuleData, attrs: &Attrs) {
                     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,
@@ -734,7 +743,13 @@ fn push_child_module(
         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);
@@ -745,7 +760,6 @@ fn push_child_module(
         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
index 9dabb5b6d5be862acab7e9c37c36ee84d0cbd63b..59f79f7cd8f4f97297f63a02f5340887172e70b3 100644 (file)
@@ -125,8 +125,17 @@ pub(super) enum RawItemKind {
 
 #[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)]
@@ -283,10 +292,12 @@ fn add_module(&mut self, current_module: Option<Module>, module: ast::Module) {
             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;
         }
@@ -294,6 +305,7 @@ fn add_module(&mut self, current_module: Option<Module>, module: ast::Module) {
         if let Some(item_list) = module.item_list() {
             let item = self.raw_items.modules.alloc(ModuleData::Definition {
                 name,
+                visibility,
                 ast_id,
                 items: Vec::new(),
             });
index 5f137d3a66208403f647728736bd486ce5f83f1a..82d947b78f70f187e489ad9c3417601f9e515383 100644 (file)
@@ -122,7 +122,7 @@ fn glob_privacy_2() {
         use foo::bar::*;
 
         //- /foo/mod.rs
-        pub mod bar;
+        mod bar;
         fn Foo() {};
         pub struct Foo {};
 
@@ -136,7 +136,6 @@ fn glob_privacy_2() {
     crate
     Foo: t
     PubCrateStruct: t v
-    bar: t
     foo: t
     
     crate::foo