Rollup merge of #108310 - GuillaumeGomez:fix-reexports-duplicated-attributes, r=notriddle
rustdoc: Fix duplicated attributes for first reexport Fixes #108281. r? ``@notriddle``
This commit is contained in:
commit
8d33b780ff
@ -2114,17 +2114,29 @@ fn get_all_import_attributes<'hir>(
|
|||||||
attributes: &mut Vec<ast::Attribute>,
|
attributes: &mut Vec<ast::Attribute>,
|
||||||
is_inline: bool,
|
is_inline: bool,
|
||||||
) {
|
) {
|
||||||
|
let mut first = true;
|
||||||
let hir_map = tcx.hir();
|
let hir_map = tcx.hir();
|
||||||
let mut visitor = OneLevelVisitor::new(hir_map, target_def_id);
|
let mut visitor = OneLevelVisitor::new(hir_map, target_def_id);
|
||||||
let mut visited = FxHashSet::default();
|
let mut visited = FxHashSet::default();
|
||||||
|
|
||||||
// If the item is an import and has at least a path with two parts, we go into it.
|
// If the item is an import and has at least a path with two parts, we go into it.
|
||||||
while let hir::ItemKind::Use(path, _) = item.kind && visited.insert(item.hir_id()) {
|
while let hir::ItemKind::Use(path, _) = item.kind && visited.insert(item.hir_id()) {
|
||||||
// We add the attributes from this import into the list.
|
if first {
|
||||||
add_without_unwanted_attributes(attributes, hir_map.attrs(item.hir_id()), is_inline);
|
// This is the "original" reexport so we get all its attributes without filtering them.
|
||||||
|
attributes.extend_from_slice(hir_map.attrs(item.hir_id()));
|
||||||
|
first = false;
|
||||||
|
} else {
|
||||||
|
add_without_unwanted_attributes(attributes, hir_map.attrs(item.hir_id()), is_inline);
|
||||||
|
}
|
||||||
|
|
||||||
let def_id = if path.segments.len() > 1 {
|
let def_id = if let [.., parent_segment, _] = &path.segments {
|
||||||
match path.segments[path.segments.len() - 2].res {
|
match parent_segment.res {
|
||||||
hir::def::Res::Def(_, def_id) => def_id,
|
hir::def::Res::Def(_, def_id) => def_id,
|
||||||
|
_ if parent_segment.ident.name == kw::Crate => {
|
||||||
|
// In case the "parent" is the crate, it'll give `Res::Err` so we need to
|
||||||
|
// circumvent it this way.
|
||||||
|
tcx.parent(item.owner_id.def_id.to_def_id())
|
||||||
|
}
|
||||||
_ => break,
|
_ => break,
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
@ -2341,9 +2353,7 @@ fn clean_maybe_renamed_item<'tcx>(
|
|||||||
if let Some(import_id) = import_id &&
|
if let Some(import_id) = import_id &&
|
||||||
let Some(hir::Node::Item(use_node)) = cx.tcx.hir().find_by_def_id(import_id)
|
let Some(hir::Node::Item(use_node)) = cx.tcx.hir().find_by_def_id(import_id)
|
||||||
{
|
{
|
||||||
// First, we add the attributes from the current import.
|
let is_inline = inline::load_attrs(cx, import_id.to_def_id()).lists(sym::doc).get_word_attr(sym::inline).is_some();
|
||||||
extra_attrs.extend_from_slice(inline::load_attrs(cx, import_id.to_def_id()));
|
|
||||||
let is_inline = extra_attrs.lists(sym::doc).get_word_attr(sym::inline).is_some();
|
|
||||||
// Then we get all the various imports' attributes.
|
// Then we get all the various imports' attributes.
|
||||||
get_all_import_attributes(use_node, cx.tcx, item.owner_id.def_id, &mut extra_attrs, is_inline);
|
get_all_import_attributes(use_node, cx.tcx, item.owner_id.def_id, &mut extra_attrs, is_inline);
|
||||||
add_without_unwanted_attributes(&mut extra_attrs, inline::load_attrs(cx, def_id), is_inline);
|
add_without_unwanted_attributes(&mut extra_attrs, inline::load_attrs(cx, def_id), is_inline);
|
||||||
|
25
tests/rustdoc/issue-108281.rs
Normal file
25
tests/rustdoc/issue-108281.rs
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
// Regression test for <https://github.com/rust-lang/rust/issues/108281>.
|
||||||
|
// It ensures that the attributes on the first reexport are not duplicated.
|
||||||
|
|
||||||
|
#![crate_name = "foo"]
|
||||||
|
|
||||||
|
// @has 'foo/index.html'
|
||||||
|
|
||||||
|
#[doc(hidden)]
|
||||||
|
pub fn bar() {}
|
||||||
|
mod sub {
|
||||||
|
pub fn public() {}
|
||||||
|
}
|
||||||
|
|
||||||
|
// @matches - '//*[@class="desc docblock-short"]' '^Displayed$'
|
||||||
|
/// Displayed
|
||||||
|
#[doc(inline)]
|
||||||
|
pub use crate::bar as Bar;
|
||||||
|
// @matches - '//*[@class="desc docblock-short"]' '^Hello\sDisplayed$'
|
||||||
|
#[doc(inline)]
|
||||||
|
/// Hello
|
||||||
|
pub use crate::Bar as Bar2;
|
||||||
|
|
||||||
|
// @matches - '//*[@class="desc docblock-short"]' '^Public$'
|
||||||
|
/// Public
|
||||||
|
pub use crate::sub::public as Public;
|
Loading…
Reference in New Issue
Block a user