Do not prefer module parents which are doc(hidden) in visibility map

This commit is contained in:
Michael Goulet 2022-07-24 21:25:35 +00:00
parent 6d1100fa79
commit 42a4419120
2 changed files with 18 additions and 8 deletions

View file

@ -375,9 +375,13 @@ pub(in crate::rmeta) fn provide(providers: &mut Providers) {
use std::collections::vec_deque::VecDeque;
let mut visible_parent_map: DefIdMap<DefId> = Default::default();
// This is a secondary visible_parent_map, storing the DefId of parents that re-export
// the child as `_`. Since we prefer parents that don't do this, merge this map at the
// end, only if we're missing any keys from the former.
// This is a secondary visible_parent_map, storing the DefId of
// parents that re-export the child as `_` or module parents
// which are `#[doc(hidden)]`. Since we prefer paths that don't
// do this, merge this map at the end, only if we're missing
// keys from the former.
// This is a rudimentary check that does not catch all cases,
// just the easiest.
let mut fallback_map: DefIdMap<DefId> = Default::default();
// Issue 46112: We want the map to prefer the shortest
@ -412,6 +416,11 @@ pub(in crate::rmeta) fn provide(providers: &mut Providers) {
return;
}
if ty::util::is_doc_hidden(tcx, parent) {
fallback_map.insert(def_id, parent);
return;
}
match visible_parent_map.entry(def_id) {
Entry::Occupied(mut entry) => {
// If `child` is defined in crate `cnum`, ensure
@ -439,8 +448,9 @@ pub(in crate::rmeta) fn provide(providers: &mut Providers) {
}
}
// Fill in any missing entries with the (less preferable) path ending in `::_`.
// We still use this path in a diagnostic that suggests importing `::*`.
// Fill in any missing entries with the less preferable path.
// If this path re-exports the child as `_`, we still use this
// path in a diagnostic that suggests importing `::*`.
for (child, parent) in fallback_map {
visible_parent_map.entry(child).or_insert(parent);
}

View file

@ -8,10 +8,10 @@ LL | let x: Option<i32> = 1i32;
|
= note: expected enum `Option<i32>`
found type `i32`
help: try wrapping the expression in `hidden_parent::__private::Some`
help: try wrapping the expression in `Some`
|
LL | let x: Option<i32> = hidden_parent::__private::Some(1i32);
| +++++++++++++++++++++++++++++++ +
LL | let x: Option<i32> = Some(1i32);
| +++++ +
error: aborting due to previous error