Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'crates/hir-def/src/nameres/path_resolution.rs')
-rw-r--r--crates/hir-def/src/nameres/path_resolution.rs13
1 files changed, 9 insertions, 4 deletions
diff --git a/crates/hir-def/src/nameres/path_resolution.rs b/crates/hir-def/src/nameres/path_resolution.rs
index be3438e427..700264839b 100644
--- a/crates/hir-def/src/nameres/path_resolution.rs
+++ b/crates/hir-def/src/nameres/path_resolution.rs
@@ -21,7 +21,7 @@ use crate::{
nameres::{sub_namespace_match, BlockInfo, BuiltinShadowMode, DefMap, MacroSubNs},
path::{ModPath, PathKind},
per_ns::PerNs,
- visibility::{RawVisibility, Visibility},
+ visibility::{RawVisibility, Visibility, VisibilityExplicity},
AdtId, CrateId, EnumVariantId, LocalModuleId, ModuleDefId,
};
@@ -94,8 +94,13 @@ impl DefMap {
return None;
}
let types = result.take_types()?;
+ let mv = if path.is_pub_crate() {
+ VisibilityExplicity::Explicit
+ } else {
+ VisibilityExplicity::Implicit
+ };
match types {
- ModuleDefId::ModuleId(m) => Visibility::Module(m),
+ ModuleDefId::ModuleId(m) => Visibility::Module(m, mv),
// error: visibility needs to refer to module
_ => {
return None;
@@ -108,11 +113,11 @@ impl DefMap {
// In block expressions, `self` normally refers to the containing non-block module, and
// `super` to its parent (etc.). However, visibilities must only refer to a module in the
// DefMap they're written in, so we restrict them when that happens.
- if let Visibility::Module(m) = vis {
+ if let Visibility::Module(m, mv) = vis {
// ...unless we're resolving visibility for an associated item in an impl.
if self.block_id() != m.block && !within_impl {
cov_mark::hit!(adjust_vis_in_block_def_map);
- vis = Visibility::Module(self.module_id(Self::ROOT));
+ vis = Visibility::Module(self.module_id(Self::ROOT), mv);
tracing::debug!("visibility {:?} points outside DefMap, adjusting to {:?}", m, vis);
}
}