Fix errors on blanket impls by ignoring the children of their generated implementations

This commit is contained in:
Rune Tynan 2022-01-13 12:38:08 -05:00
parent 72e74d7b9c
commit aa523a9b4b
3 changed files with 27 additions and 1 deletions

View File

@ -75,6 +75,14 @@ impl ItemId {
}
}
#[inline]
crate fn is_local_impl(self) -> bool {
match self {
ItemId::Blanket { impl_id, .. } => impl_id.is_local(),
ItemId::Auto { .. } | ItemId::DefId(_) | ItemId::Primitive(_, _) => false,
}
}
#[inline]
#[track_caller]
crate fn expect_def_id(self) -> DefId {

View File

@ -172,7 +172,11 @@ impl<'tcx> FormatRenderer<'tcx> for JsonRenderer<'tcx> {
/// implementations filled out before they're inserted.
fn item(&mut self, item: clean::Item) -> Result<(), Error> {
// Flatten items that recursively store other items
item.kind.inner_items().for_each(|i| self.item(i.clone()).unwrap());
// We skip local blanket implementations, as we'll have already seen the actual generic
// impl, and the generated ones don't need documenting.
if !item.def_id.is_local_impl() {
item.kind.inner_items().for_each(|i| self.item(i.clone()).unwrap());
}
let id = item.def_id;
if let Some(mut new_item) = self.convert_item(item) {

View File

@ -0,0 +1,14 @@
// Test for the ICE in rust/83718
// A blanket impl plus a local type together shouldn't result in mismatched ID issues
// @has method_abi.json "$.index[*][?(@.name=='Load')]"
pub trait Load {
fn load() {}
}
impl<P> Load for P {
fn load() {}
}
// @has - "$.index[*][?(@.name=='Wrapper')]"
pub struct Wrapper {}