aboutsummaryrefslogtreecommitdiff
path: root/crates
diff options
context:
space:
mode:
authorFlorian Diebold <[email protected]>2019-12-26 15:31:38 +0000
committerFlorian Diebold <[email protected]>2019-12-26 15:31:38 +0000
commit04cf98f8a6a67c899dd290d4b66c37794b24a568 (patch)
tree0fa656975139c8d8530d01381e118d07e79cb27b /crates
parent78111620a33c57b58b07ebf044a7d53dc56176ef (diff)
Fix cross-crate glob privacy handling
Diffstat (limited to 'crates')
-rw-r--r--crates/ra_hir_def/src/nameres/collector.rs7
-rw-r--r--crates/ra_hir_def/src/nameres/tests/globs.rs20
-rw-r--r--crates/ra_hir_def/src/visibility.rs7
3 files changed, 28 insertions, 6 deletions
diff --git a/crates/ra_hir_def/src/nameres/collector.rs b/crates/ra_hir_def/src/nameres/collector.rs
index 63beaedc5..30771d510 100644
--- a/crates/ra_hir_def/src/nameres/collector.rs
+++ b/crates/ra_hir_def/src/nameres/collector.rs
@@ -378,12 +378,7 @@ where
378 .resolutions() 378 .resolutions()
379 // only keep visible names... 379 // only keep visible names...
380 .map(|(n, res)| { 380 .map(|(n, res)| {
381 ( 381 (n, res.filter_visibility(|v| v.visible_from_other_crate()))
382 n,
383 res.filter_visibility(|v| {
384 v.visible_from_def_map(&self.def_map, module_id)
385 }),
386 )
387 }) 382 })
388 .filter(|(_, res)| !res.is_none()) 383 .filter(|(_, res)| !res.is_none())
389 .collect::<Vec<_>>(); 384 .collect::<Vec<_>>();
diff --git a/crates/ra_hir_def/src/nameres/tests/globs.rs b/crates/ra_hir_def/src/nameres/tests/globs.rs
index 82d947b78..71fa0abe8 100644
--- a/crates/ra_hir_def/src/nameres/tests/globs.rs
+++ b/crates/ra_hir_def/src/nameres/tests/globs.rs
@@ -170,6 +170,26 @@ fn glob_across_crates() {
170} 170}
171 171
172#[test] 172#[test]
173fn glob_privacy_across_crates() {
174 covers!(glob_across_crates);
175 let map = def_map(
176 "
177 //- /main.rs crate:main deps:test_crate
178 use test_crate::*;
179
180 //- /lib.rs crate:test_crate
181 pub struct Baz;
182 struct Foo;
183 ",
184 );
185 assert_snapshot!(map, @r###"
186 ⋮crate
187 ⋮Baz: t v
188 "###
189 );
190}
191
192#[test]
173fn glob_enum() { 193fn glob_enum() {
174 covers!(glob_enum); 194 covers!(glob_enum);
175 let map = def_map( 195 let map = def_map(
diff --git a/crates/ra_hir_def/src/visibility.rs b/crates/ra_hir_def/src/visibility.rs
index dccf2776e..a90ba7376 100644
--- a/crates/ra_hir_def/src/visibility.rs
+++ b/crates/ra_hir_def/src/visibility.rs
@@ -99,6 +99,13 @@ impl Visibility {
99 self.visible_from_def_map(&def_map, from_module.local_id) 99 self.visible_from_def_map(&def_map, from_module.local_id)
100 } 100 }
101 101
102 pub(crate) fn visible_from_other_crate(self) -> bool {
103 match self {
104 Visibility::Module(_) => false,
105 Visibility::Public => true,
106 }
107 }
108
102 pub(crate) fn visible_from_def_map( 109 pub(crate) fn visible_from_def_map(
103 self, 110 self,
104 def_map: &crate::nameres::CrateDefMap, 111 def_map: &crate::nameres::CrateDefMap,