Remove FIXME and fix inconsistency of local blanket impls by using HIR for them
This commit is contained in:
parent
84e918971d
commit
f4b42946c8
@ -101,6 +101,27 @@ impl<'a, 'tcx> BlanketImplFinder<'a, 'tcx> {
|
||||
|
||||
cx.generated_synthetics.insert((ty, trait_def_id));
|
||||
|
||||
let hir_imp = impl_def_id.as_local()
|
||||
.map(|local| cx.tcx.hir().expect_item(local))
|
||||
.and_then(|item| if let hir::ItemKind::Impl(i) = &item.kind {
|
||||
Some(i)
|
||||
} else {
|
||||
None
|
||||
});
|
||||
|
||||
let items = match hir_imp {
|
||||
Some(imp) => imp
|
||||
.items
|
||||
.iter()
|
||||
.map(|ii| cx.tcx.hir().impl_item(ii.id).clean(cx))
|
||||
.collect::<Vec<_>>(),
|
||||
None => cx.tcx
|
||||
.associated_items(impl_def_id)
|
||||
.in_definition_order()
|
||||
.map(|x| x.clean(cx))
|
||||
.collect::<Vec<_>>(),
|
||||
};
|
||||
|
||||
impls.push(Item {
|
||||
name: None,
|
||||
attrs: Default::default(),
|
||||
@ -117,12 +138,7 @@ impl<'a, 'tcx> BlanketImplFinder<'a, 'tcx> {
|
||||
// the post-inference `trait_ref`, as it's more accurate.
|
||||
trait_: Some(trait_ref.clean(cx)),
|
||||
for_: ty.clean(cx),
|
||||
items: cx
|
||||
.tcx
|
||||
.associated_items(impl_def_id)
|
||||
.in_definition_order()
|
||||
.map(|x| x.clean(cx))
|
||||
.collect::<Vec<_>>(),
|
||||
items,
|
||||
polarity: ty::ImplPolarity::Positive,
|
||||
kind: ImplKind::Blanket(box trait_ref.self_ty().clean(cx)),
|
||||
}),
|
||||
|
@ -172,21 +172,8 @@ 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> {
|
||||
let local_blanket_impl = match item.def_id {
|
||||
clean::ItemId::Blanket { impl_id, .. } => impl_id.is_local(),
|
||||
clean::ItemId::Auto { .. }
|
||||
| clean::ItemId::DefId(_)
|
||||
| clean::ItemId::Primitive(_, _) => false,
|
||||
};
|
||||
|
||||
// Flatten items that recursively store other items
|
||||
// FIXME(CraftSpider): We skip children of local blanket implementations, as we'll have
|
||||
// already seen the actual generic impl, and the generated ones don't need documenting.
|
||||
// This is necessary due to the visibility, return type, and self arg of the generated
|
||||
// impls not quite matching, and will no longer be necessary when the mismatch is fixed.
|
||||
if !local_blanket_impl {
|
||||
item.kind.inner_items().for_each(|i| self.item(i.clone()).unwrap());
|
||||
}
|
||||
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) {
|
||||
|
Loading…
x
Reference in New Issue
Block a user