Fix errors on blanket impls by ignoring the children of their generated implementations
This commit is contained in:
parent
72e74d7b9c
commit
aa523a9b4b
@ -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 {
|
||||
|
@ -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) {
|
||||
|
14
src/test/rustdoc-json/impls/blanket_with_local.rs
Normal file
14
src/test/rustdoc-json/impls/blanket_with_local.rs
Normal 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 {}
|
Loading…
x
Reference in New Issue
Block a user