From e80ccd3d3aea9af8d3e0972d4f73f81a99fadfcd Mon Sep 17 00:00:00 2001 From: Nixon Enraght-Moony Date: Tue, 13 Sep 2022 18:34:15 +0100 Subject: [PATCH] Rustdoc-Json: Don't loose subitems of foreign traits. --- src/etc/check_missing_items.py | 9 +++++++-- src/librustdoc/json/mod.rs | 15 +++++++++++++-- src/test/rustdoc-json/traits/uses_extern_trait.rs | 7 +++++++ 3 files changed, 27 insertions(+), 4 deletions(-) create mode 100644 src/test/rustdoc-json/traits/uses_extern_trait.rs diff --git a/src/etc/check_missing_items.py b/src/etc/check_missing_items.py index 991c881bae10d..0026c4cbdca2c 100644 --- a/src/etc/check_missing_items.py +++ b/src/etc/check_missing_items.py @@ -49,6 +49,8 @@ def check_generic_param(param): ty = param["kind"]["type"] if ty["default"]: check_type(ty["default"]) + for bound in ty["bounds"]: + check_generic_bound(bound) elif "const" in param["kind"]: check_type(param["kind"]["const"]) @@ -88,8 +90,11 @@ def check_path(path): check_type(input_ty) if args["parenthesized"]["output"]: check_type(args["parenthesized"]["output"]) - if not valid_id(path["id"]): - print("Type contained an invalid ID:", path["id"]) + + if path["id"] in crate["index"]: + work_list.add(path["id"]) + elif path["id"] not in crate["paths"]: + print("Id not in index or paths:", path["id"]) sys.exit(1) def check_type(ty): diff --git a/src/librustdoc/json/mod.rs b/src/librustdoc/json/mod.rs index 6a1409c739424..5e8f5f6fe3eb9 100644 --- a/src/librustdoc/json/mod.rs +++ b/src/librustdoc/json/mod.rs @@ -101,6 +101,7 @@ impl<'tcx> JsonRenderer<'tcx> { } fn get_trait_items(&mut self) -> Vec<(types::Id, types::Item)> { + debug!("Adding foreign trait items"); Rc::clone(&self.cache) .traits .iter() @@ -109,6 +110,7 @@ impl<'tcx> JsonRenderer<'tcx> { if !id.is_local() { let trait_item = &trait_item.trait_; for item in &trait_item.items { + trace!("Adding subitem to {id:?}: {:?}", item.item_id); self.item(item.clone()).unwrap(); } let item_id = from_item_id(id.into(), self.tcx); @@ -184,7 +186,9 @@ impl<'tcx> FormatRenderer<'tcx> for JsonRenderer<'tcx> { /// the hashmap because certain items (traits and types) need to have their mappings for trait /// implementations filled out before they're inserted. fn item(&mut self, item: clean::Item) -> Result<(), Error> { - trace!("rendering {} {:?}", item.type_(), item.name); + let item_type = item.type_(); + let item_name = item.name; + trace!("rendering {} {:?}", item_type, item_name); // Flatten items that recursively store other items. We include orphaned items from // stripped modules and etc that are otherwise reachable. @@ -253,6 +257,7 @@ impl<'tcx> FormatRenderer<'tcx> for JsonRenderer<'tcx> { } } + trace!("done rendering {} {:?}", item_type, item_name); Ok(()) } @@ -263,14 +268,20 @@ impl<'tcx> FormatRenderer<'tcx> for JsonRenderer<'tcx> { fn after_krate(&mut self) -> Result<(), Error> { debug!("Done with crate"); + debug!("Adding Primitve impls"); for primitive in Rc::clone(&self.cache).primitive_locations.values() { self.get_impls(*primitive); } let e = ExternalCrate { crate_num: LOCAL_CRATE }; + // FIXME(adotinthevoid): Remove this, as it's not consistant with not + // inlining foreign items. + let foreign_trait_items = self.get_trait_items(); let mut index = (*self.index).clone().into_inner(); - index.extend(self.get_trait_items()); + index.extend(foreign_trait_items); + + debug!("Constructing Output"); // This needs to be the default HashMap for compatibility with the public interface for // rustdoc-json-types #[allow(rustc::default_hash_types)] diff --git a/src/test/rustdoc-json/traits/uses_extern_trait.rs b/src/test/rustdoc-json/traits/uses_extern_trait.rs new file mode 100644 index 0000000000000..430dd1543f561 --- /dev/null +++ b/src/test/rustdoc-json/traits/uses_extern_trait.rs @@ -0,0 +1,7 @@ +#![no_std] +pub fn drop_default(_x: T) {} + +// FIXME(adotinthevoid): Theses shouldn't be here +// @has "$.index[*][?(@.name=='Debug')]" +// @set Debug_fmt = "$.index[*][?(@.name=='Debug')].inner.items[*]" +// @has "$.index[*][?(@.name=='fmt')].id" $Debug_fmt