提交 9ba92972 编写于 作者: N Nixon Enraght-Moony

Don't call `item` on modules for json renderer

Closes #80664
上级 ce21447c
......@@ -13,6 +13,11 @@
/// Gives a description of the renderer. Used for performance profiling.
fn descr() -> &'static str;
/// Whether to call `item` recursivly for modules
///
/// This is true for html, and false for json. See #80664
const RUN_ON_MODULE: bool;
/// Sets up any state required for the renderer. When this is called the cache has already been
/// populated.
fn init(
......@@ -68,7 +73,7 @@ fn after_krate(
let unknown = Symbol::intern("<unknown item>");
while let Some((mut cx, item)) = work.pop() {
if item.is_mod() {
if item.is_mod() && T::RUN_ON_MODULE {
// modules are special because they add a namespace. We also need to
// recurse into the items of the module as well.
let name = item.name.as_ref().unwrap().to_string();
......
......@@ -290,6 +290,8 @@ fn descr() -> &'static str {
"html"
}
const RUN_ON_MODULE: bool = true;
fn init(
mut krate: clean::Crate,
options: RenderOptions,
......
......@@ -179,7 +179,8 @@ fn from_clean_item_kind(item: clean::ItemKind, tcx: TyCtxt<'_>, name: &Option<Sy
bounds: g.into_iter().map(Into::into).collect(),
default: t.map(Into::into),
},
StrippedItem(inner) => from_clean_item_kind(*inner, tcx, name),
// `convert_item` early returns `None` for striped items
StrippedItem(_) => unreachable!(),
PrimitiveItem(_) | KeywordItem(_) => {
panic!("{:?} is not supported for JSON output", item)
}
......
......@@ -129,6 +129,8 @@ fn descr() -> &'static str {
"json"
}
const RUN_ON_MODULE: bool = false;
fn init(
krate: clean::Crate,
options: RenderOptions,
......@@ -169,8 +171,10 @@ fn item(&mut self, item: clean::Item) -> Result<(), Error> {
e.impls = self.get_impls(id)
}
let removed = self.index.borrow_mut().insert(from_def_id(id), new_item.clone());
// FIXME(adotinthevoid): Currently, the index is duplicated. This is a sanity check
// to make sure the items are unique.
// to make sure the items are unique. The main place this happens is when an item, is
// reexported in more than one place. See `rustdoc-json/reexport/in_root_and_mod`
if let Some(old_item) = removed {
assert_eq!(old_item, new_item);
}
......
#![feature(no_core)]
#![no_core]
mod foo {
// @set foo_id = in_root_and_mod.json "$.index[*][?(@.name=='Foo')].id"
pub struct Foo;
}
// @has - "$.index[*][?(@.name=='in_root_and_mod')].inner.items[*]" $foo_id
pub use foo::Foo;
pub mod bar {
// @has - "$.index[*][?(@.name=='bar')].inner.items[*]" $foo_id
pub use crate::foo::Foo;
}
#![feature(no_core)]
#![no_core]
pub mod foo {
// @set bar_id = in_root_and_mod_pub.json "$.index[*][?(@.name=='Bar')].id"
// @has - "$.index[*][?(@.name=='foo')].inner.items[*]" $bar_id
pub struct Bar;
}
// @set root_import_id = - "$.index[*][?(@.inner.span=='foo::Bar')].id"
// @is - "$.index[*][?(@.inner.span=='foo::Bar')].inner.id" $bar_id
// @has - "$.index[*][?(@.name=='in_root_and_mod_pub')].inner.items[*]" $root_import_id
pub use foo::Bar;
pub mod baz {
// @set baz_import_id = - "$.index[*][?(@.inner.span=='crate::foo::Bar')].id"
// @is - "$.index[*][?(@.inner.span=='crate::foo::Bar')].inner.id" $bar_id
// @has - "$.index[*][?(@.name=='baz')].inner.items[*]" $baz_import_id
pub use crate::foo::Bar;
}
// edition:2018
#![no_core]
#![feature(no_core)]
// @!has rename_private.json "$.index[*][?(@.name=='inner')]"
mod inner {
// @!has - "$.index[*][?(@.name=='Public')]"
pub struct Public;
}
// @set newname_id = - "$.index[*][?(@.name=='NewName')].id"
// @is - "$.index[*][?(@.name=='NewName')].kind" \"struct\"
// @has - "$.index[*][?(@.name=='rename_private')].inner.items[*]" $newname_id
pub use inner::Public as NewName;
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册