Skip to content

Commit f09b67a

Browse files
Fix panic when documenting libproc-macro
1 parent dd68d20 commit f09b67a

File tree

1 file changed

+10
-13
lines changed

1 file changed

+10
-13
lines changed

src/librustdoc/passes/collect_trait_impls.rs

Lines changed: 10 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@ crate fn collect_trait_impls(krate: Crate, cx: &mut DocContext<'_>) -> Crate {
6666
debug!("add_deref_target: type {:?}, target {:?}", type_did, target);
6767
if let Some(target_prim) = target.primitive_type() {
6868
cleaner.prims.insert(target_prim);
69-
} else if let Some(target_did) = target.def_id() {
69+
} else if let Some(target_did) = target.def_id_no_primitives() {
7070
// `impl Deref<Target = S> for S`
7171
if target_did == type_did {
7272
// Avoid infinite cycles
@@ -82,7 +82,7 @@ crate fn collect_trait_impls(krate: Crate, cx: &mut DocContext<'_>) -> Crate {
8282
for it in &new_items {
8383
if let ImplItem(Impl { ref for_, ref trait_, ref items, .. }) = *it.kind {
8484
if trait_.as_ref().map(|t| t.def_id()) == cx.tcx.lang_items().deref_trait()
85-
&& cleaner.keep_impl(for_)
85+
&& cleaner.keep_impl(for_, true)
8686
{
8787
let target = items
8888
.iter()
@@ -97,7 +97,7 @@ crate fn collect_trait_impls(krate: Crate, cx: &mut DocContext<'_>) -> Crate {
9797
} else if let Some(did) = target.def_id(&cx.cache) {
9898
cleaner.items.insert(did.into());
9999
}
100-
if let Some(for_did) = for_.def_id() {
100+
if let Some(for_did) = for_.def_id_no_primitives() {
101101
if type_did_to_deref_target.insert(for_did, target).is_none() {
102102
// Since only the `DefId` portion of the `Type` instances is known to be same for both the
103103
// `Deref` target type and the impl for type positions, this map of types is keyed by
@@ -113,10 +113,10 @@ crate fn collect_trait_impls(krate: Crate, cx: &mut DocContext<'_>) -> Crate {
113113

114114
new_items.retain(|it| {
115115
if let ImplItem(Impl { ref for_, ref trait_, ref blanket_impl, .. }) = *it.kind {
116-
cleaner.keep_impl(for_)
117-
|| trait_
118-
.as_ref()
119-
.map_or(false, |t| cleaner.keep_impl_with_def_id(t.def_id().into()))
116+
cleaner.keep_impl(
117+
for_,
118+
trait_.as_ref().map(|t| t.def_id()) == cx.tcx.lang_items().deref_trait(),
119+
) || trait_.as_ref().map_or(false, |t| cleaner.keep_impl_with_def_id(t.def_id().into()))
120120
|| blanket_impl.is_some()
121121
} else {
122122
true
@@ -215,17 +215,14 @@ struct BadImplStripper {
215215
}
216216

217217
impl BadImplStripper {
218-
fn keep_impl(&self, ty: &Type) -> bool {
218+
fn keep_impl(&self, ty: &Type, is_deref: bool) -> bool {
219219
if let Generic(_) = ty {
220220
// keep impls made on generics
221221
true
222222
} else if let Some(prim) = ty.primitive_type() {
223223
self.prims.contains(&prim)
224-
} else if ty.def_id_no_primitives().is_some() {
225-
// We want to keep *ALL* deref implementations in case some of them are used in
226-
// the current crate.
227-
// FIXME: Try to filter the one actually used...
228-
true
224+
} else if let Some(did) = ty.def_id_no_primitives() {
225+
is_deref || self.keep_impl_with_def_id(did.into())
229226
} else {
230227
false
231228
}

0 commit comments

Comments
 (0)