mirror of
https://github.com/rust-lang/rust.git
synced 2024-11-25 16:24:46 +00:00
Rollup merge of #99344 - notriddle:notriddle/multiple-macro-rules-w-same-name, r=GuillaumeGomez
rustdoc: avoid inlining items with duplicate `(type, name)` Fixes #99221
This commit is contained in:
commit
affdcd6cef
@ -57,11 +57,43 @@ impl<'tcx> Clean<'tcx, Item> for DocModule<'tcx> {
|
||||
.map(|(item, renamed)| clean_maybe_renamed_foreign_item(cx, item, *renamed)),
|
||||
);
|
||||
items.extend(self.mods.iter().map(|x| x.clean(cx)));
|
||||
items.extend(
|
||||
self.items
|
||||
.iter()
|
||||
.flat_map(|(item, renamed)| clean_maybe_renamed_item(cx, item, *renamed)),
|
||||
);
|
||||
|
||||
// Split up imports from all other items.
|
||||
//
|
||||
// This covers the case where somebody does an import which should pull in an item,
|
||||
// but there's already an item with the same namespace and same name. Rust gives
|
||||
// priority to the not-imported one, so we should, too.
|
||||
let mut inserted = FxHashSet::default();
|
||||
items.extend(self.items.iter().flat_map(|(item, renamed)| {
|
||||
// First, lower everything other than imports.
|
||||
if matches!(item.kind, hir::ItemKind::Use(..)) {
|
||||
return Vec::new();
|
||||
}
|
||||
let v = clean_maybe_renamed_item(cx, item, *renamed);
|
||||
for item in &v {
|
||||
if let Some(name) = item.name {
|
||||
inserted.insert((item.type_(), name));
|
||||
}
|
||||
}
|
||||
v
|
||||
}));
|
||||
items.extend(self.items.iter().flat_map(|(item, renamed)| {
|
||||
// Now we actually lower the imports, skipping everything else.
|
||||
if !matches!(item.kind, hir::ItemKind::Use(..)) {
|
||||
return Vec::new();
|
||||
}
|
||||
let mut v = clean_maybe_renamed_item(cx, item, *renamed);
|
||||
v.drain_filter(|item| {
|
||||
if let Some(name) = item.name {
|
||||
// If an item with the same type and name already exists,
|
||||
// it takes priority over the inlined stuff.
|
||||
!inserted.insert((item.type_(), name))
|
||||
} else {
|
||||
false
|
||||
}
|
||||
});
|
||||
v
|
||||
}));
|
||||
|
||||
// determine if we should display the inner contents or
|
||||
// the outer `mod` item for the source code.
|
||||
|
20
src/test/rustdoc/auxiliary/issue-99221-aux.rs
Normal file
20
src/test/rustdoc/auxiliary/issue-99221-aux.rs
Normal file
@ -0,0 +1,20 @@
|
||||
pub struct Option;
|
||||
impl Option {
|
||||
pub fn unwrap(self) {}
|
||||
}
|
||||
|
||||
mod macros {
|
||||
use crate::Option;
|
||||
/// [`Option::unwrap`]
|
||||
#[macro_export]
|
||||
macro_rules! print {
|
||||
() => ()
|
||||
}
|
||||
}
|
||||
|
||||
mod structs {
|
||||
use crate::Option;
|
||||
/// [`Option::unwrap`]
|
||||
pub struct Print;
|
||||
}
|
||||
pub use structs::Print;
|
@ -0,0 +1,19 @@
|
||||
// aux-build:issue-99221-aux.rs
|
||||
// build-aux-docs
|
||||
// ignore-cross-compile
|
||||
|
||||
#![crate_name = "foo"]
|
||||
|
||||
#[macro_use]
|
||||
extern crate issue_99221_aux;
|
||||
|
||||
pub use issue_99221_aux::*;
|
||||
|
||||
// @count foo/index.html '//a[@class="macro"]' 1
|
||||
|
||||
mod inner {
|
||||
#[macro_export]
|
||||
macro_rules! print {
|
||||
() => ()
|
||||
}
|
||||
}
|
@ -0,0 +1,17 @@
|
||||
// aux-build:issue-99221-aux.rs
|
||||
// build-aux-docs
|
||||
// ignore-cross-compile
|
||||
|
||||
#![crate_name = "foo"]
|
||||
|
||||
#[macro_use]
|
||||
extern crate issue_99221_aux;
|
||||
|
||||
pub use issue_99221_aux::*;
|
||||
|
||||
// @count foo/index.html '//a[@class="macro"]' 1
|
||||
|
||||
#[macro_export]
|
||||
macro_rules! print {
|
||||
() => ()
|
||||
}
|
14
src/test/rustdoc/issue-99221-multiple-structs-w-same-name.rs
Normal file
14
src/test/rustdoc/issue-99221-multiple-structs-w-same-name.rs
Normal file
@ -0,0 +1,14 @@
|
||||
// aux-build:issue-99221-aux.rs
|
||||
// build-aux-docs
|
||||
// ignore-cross-compile
|
||||
|
||||
#![crate_name = "foo"]
|
||||
|
||||
#[macro_use]
|
||||
extern crate issue_99221_aux;
|
||||
|
||||
pub use issue_99221_aux::*;
|
||||
|
||||
// @count foo/index.html '//a[@class="struct"][@title="foo::Print struct"]' 1
|
||||
|
||||
pub struct Print;
|
Loading…
Reference in New Issue
Block a user