crate fn collect_trait_impls(krate: Crate, cx: &DocContext<'_>) -> Crate {
let mut synth = SyntheticImplCollector::new(cx);
- let mut krate = synth.fold_crate(krate);
+ let mut krate = cx.sess().time("collect_synthetic_impls", || synth.fold_crate(krate));
let prims: FxHashSet<PrimitiveType> = krate.primitives.iter().map(|p| p.1).collect();
let crate_items = {
let mut coll = ItemCollector::new();
- krate = coll.fold_crate(krate);
+ krate = cx.sess().time("collect_items_for_trait_impls", || coll.fold_crate(krate));
coll.items
};
// Also try to inline primitive impls from other crates.
for &def_id in PrimitiveType::all_impls(cx.tcx).values().flatten() {
if !def_id.is_local() {
- inline::build_impl(cx, None, def_id, None, &mut new_items);
+ cx.sess().time("build_primitive_trait_impl", || {
+ inline::build_impl(cx, None, def_id, None, &mut new_items);
- // FIXME(eddyb) is this `doc(hidden)` check needed?
- if !cx.tcx.get_attrs(def_id).lists(sym::doc).has_word(sym::hidden) {
- let self_ty = cx.tcx.type_of(def_id);
- let impls = get_auto_trait_and_blanket_impls(cx, self_ty, def_id);
- let mut renderinfo = cx.renderinfo.borrow_mut();
+ // FIXME(eddyb) is this `doc(hidden)` check needed?
+ if !cx.tcx.get_attrs(def_id).lists(sym::doc).has_word(sym::hidden) {
+ let self_ty = cx.tcx.type_of(def_id);
+ let impls = get_auto_trait_and_blanket_impls(cx, self_ty, def_id);
+ let mut renderinfo = cx.renderinfo.borrow_mut();
- new_items.extend(impls.filter(|i| renderinfo.inlined.insert(i.def_id)));
- }
+ new_items.extend(impls.filter(|i| renderinfo.inlined.insert(i.def_id)));
+ }
+ })
}
}
// scan through included items ahead of time to splice in Deref targets to the "valid" sets
for it in &new_items {
- if let ImplItem(Impl { ref for_, ref trait_, ref items, .. }) = it.kind {
+ if let ImplItem(Impl { ref for_, ref trait_, ref items, .. }) = *it.kind {
if cleaner.keep_item(for_) && trait_.def_id() == cx.tcx.lang_items().deref_trait() {
let target = items
.iter()
- .find_map(|item| match item.kind {
+ .find_map(|item| match *item.kind {
TypedefItem(ref t, true) => Some(&t.type_),
_ => None,
})
}
new_items.retain(|it| {
- if let ImplItem(Impl { ref for_, ref trait_, ref blanket_impl, .. }) = it.kind {
+ if let ImplItem(Impl { ref for_, ref trait_, ref blanket_impl, .. }) = *it.kind {
cleaner.keep_item(for_)
|| trait_.as_ref().map_or(false, |t| cleaner.keep_item(t))
|| blanket_impl.is_some()
}
if let Some(ref mut it) = krate.module {
- if let ModuleItem(Module { ref mut items, .. }) = it.kind {
+ if let ModuleItem(Module { ref mut items, .. }) = *it.kind {
items.extend(synth.impls);
items.extend(new_items);
} else {
if i.is_struct() || i.is_enum() || i.is_union() {
// FIXME(eddyb) is this `doc(hidden)` check needed?
if !self.cx.tcx.get_attrs(i.def_id).lists(sym::doc).has_word(sym::hidden) {
- self.impls.extend(get_auto_trait_and_blanket_impls(
- self.cx,
- self.cx.tcx.type_of(i.def_id),
- i.def_id,
- ));
+ self.cx.sess().time("get_auto_trait_and_blanket_synthetic_impls", || {
+ self.impls.extend(get_auto_trait_and_blanket_impls(
+ self.cx,
+ self.cx.tcx.type_of(i.def_id),
+ i.def_id,
+ ));
+ });
}
}