From 04cf98f8a6a67c899dd290d4b66c37794b24a568 Mon Sep 17 00:00:00 2001 From: Florian Diebold Date: Thu, 26 Dec 2019 16:31:38 +0100 Subject: Fix cross-crate glob privacy handling --- crates/ra_hir_def/src/nameres/collector.rs | 7 +------ crates/ra_hir_def/src/nameres/tests/globs.rs | 20 ++++++++++++++++++++ crates/ra_hir_def/src/visibility.rs | 7 +++++++ 3 files changed, 28 insertions(+), 6 deletions(-) (limited to 'crates') 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 .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::>(); 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 @@ -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); 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 { 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, -- cgit v1.2.3