]> git.lizzy.rs Git - rust.git/commitdiff
Fix cross-crate glob privacy handling
authorFlorian Diebold <flodiebold@gmail.com>
Thu, 26 Dec 2019 15:31:38 +0000 (16:31 +0100)
committerFlorian Diebold <flodiebold@gmail.com>
Thu, 26 Dec 2019 15:31:38 +0000 (16:31 +0100)
crates/ra_hir_def/src/nameres/collector.rs
crates/ra_hir_def/src/nameres/tests/globs.rs
crates/ra_hir_def/src/visibility.rs

index 63beaedc58860d33982954648d92366c6d35a757..30771d5106396de9a9aaac06466b51ed6cb3b64d 100644 (file)
@@ -378,12 +378,7 @@ fn record_resolved_import(&mut self, directive: &ImportDirective) {
                             .resolutions()
                             // only keep visible names...
                             .map(|(n, res)| {
-                                (
-                                    n,
-                                    res.filter_visibility(|v| {
-                                        v.visible_from_def_map(&self.def_map, module_id)
-                                    }),
-                                )
+                                (n, res.filter_visibility(|v| v.visible_from_other_crate()))
                             })
                             .filter(|(_, res)| !res.is_none())
                             .collect::<Vec<_>>();
index 82d947b78f70f187e489ad9c3417601f9e515383..71fa0abe8a3bedb8bf2d8c9b97c5208b8f1aaa7d 100644 (file)
@@ -169,6 +169,26 @@ fn glob_across_crates() {
     );
 }
 
+#[test]
+fn glob_privacy_across_crates() {
+    covers!(glob_across_crates);
+    let map = def_map(
+        "
+        //- /main.rs crate:main deps:test_crate
+        use test_crate::*;
+
+        //- /lib.rs crate:test_crate
+        pub struct Baz;
+        struct Foo;
+        ",
+    );
+    assert_snapshot!(map, @r###"
+   ⋮crate
+   ⋮Baz: t v
+    "###
+    );
+}
+
 #[test]
 fn glob_enum() {
     covers!(glob_enum);
index dccf2776e2fa470c7c875188e2ee0dc7ba511a08..a90ba73763b971498ea2fc9c964ac0495475ea60 100644 (file)
@@ -99,6 +99,13 @@ pub fn visible_from(self, db: &impl DefDatabase, from_module: ModuleId) -> bool
         self.visible_from_def_map(&def_map, from_module.local_id)
     }
 
+    pub(crate) fn visible_from_other_crate(self) -> bool {
+        match self {
+            Visibility::Module(_) => false,
+            Visibility::Public => true,
+        }
+    }
+
     pub(crate) fn visible_from_def_map(
         self,
         def_map: &crate::nameres::CrateDefMap,