diff options
| author | Florian Diebold <[email protected]> | 2019-12-26 15:31:38 +0000 |
|---|---|---|
| committer | Florian Diebold <[email protected]> | 2019-12-26 15:31:38 +0000 |
| commit | 04cf98f8a6a67c899dd290d4b66c37794b24a568 (patch) | |
| tree | 0fa656975139c8d8530d01381e118d07e79cb27b /crates | |
| parent | 78111620a33c57b58b07ebf044a7d53dc56176ef (diff) | |
Fix cross-crate glob privacy handling
Diffstat (limited to 'crates')
| -rw-r--r-- | crates/ra_hir_def/src/nameres/collector.rs | 7 | ||||
| -rw-r--r-- | crates/ra_hir_def/src/nameres/tests/globs.rs | 20 | ||||
| -rw-r--r-- | crates/ra_hir_def/src/visibility.rs | 7 |
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] |
| 173 | fn 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] | ||
| 173 | fn glob_enum() { | 193 | fn 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, |
