Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit cc0dc8d

Browse files
rustdoc-json: discard non-local inherent impls
1 parent 80d8270 commit cc0dc8d

File tree

5 files changed

+25
-18
lines changed

5 files changed

+25
-18
lines changed

‎src/librustdoc/formats/cache.rs

Lines changed: 15 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -442,16 +442,16 @@ impl<'a, 'tcx> DocFolder for CacheBuilder<'a, 'tcx> {
442442
// `public_items` map, so we can skip inserting into the
443443
// paths map if there was already an entry present and we're
444444
// not a public item.
445-
if !self.cache.paths.contains_key(&item.item_id.expect_def_id())
445+
let item_def_id = item.item_id.expect_def_id();
446+
if !self.cache.paths.contains_key(&item_def_id)
446447
|| self
447448
.cache
448449
.effective_visibilities
449-
.is_directly_public(self.tcx, item.item_id.expect_def_id())
450+
.is_directly_public(self.tcx, item_def_id)
450451
{
451-
self.cache.paths.insert(
452-
item.item_id.expect_def_id(),
453-
(self.cache.stack.clone(), item.type_()),
454-
);
452+
self.cache
453+
.paths
454+
.insert(item_def_id, (self.cache.stack.clone(), item.type_()));
455455
}
456456
}
457457
}
@@ -543,19 +543,23 @@ impl<'a, 'tcx> DocFolder for CacheBuilder<'a, 'tcx> {
543543
}
544544
}
545545
let impl_item = Impl { impl_item: item };
546-
if impl_item.trait_did().map_or(true, |d| self.cache.traits.contains_key(&d)) {
546+
let impl_def_id = impl_item.def_id();
547+
let impl_trait_id = impl_item.trait_did();
548+
if match impl_trait_id {
549+
Some(d) => self.cache.traits.contains_key(&d),
550+
None => impl_def_id.is_local() || impl_item.is_on_local_type(self.cache, self.tcx),
551+
} {
547552
for did in dids {
548-
if self.impl_ids.entry(did).or_default().insert(impl_item.def_id()) {
553+
if self.impl_ids.entry(did).or_default().insert(impl_def_id) {
549554
self.cache
550555
.impls
551556
.entry(did)
552557
.or_insert_with(Vec::new)
553558
.push(impl_item.clone());
554559
}
555560
}
556-
} else {
557-
let trait_did = impl_item.trait_did().expect("no trait did");
558-
self.cache.orphan_trait_impls.push((trait_did, dids, impl_item));
561+
} else if let Some(impl_trait_id) = impl_trait_id {
562+
self.cache.orphan_trait_impls.push((impl_trait_id, dids, impl_item));
559563
}
560564
None
561565
} else {

‎src/librustdoc/formats/mod.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,12 @@ pub(crate) mod cache;
22
pub(crate) mod item_type;
33
pub(crate) mod renderer;
44

5+
use cache::Cache;
56
pub(crate) use renderer::{run_format, FormatRenderer};
67
use rustc_hir::def_id::DefId;
8+
use rustc_middle::ty::TyCtxt;
79

810
use crate::clean::{self, ItemId};
9-
use crate::html::render::Context;
1011

1112
/// Metadata about implementations for a type or trait.
1213
#[derive(Clone, Debug)]
@@ -43,8 +44,7 @@ impl Impl {
4344
// Returns true if this is an implementation on a "local" type, meaning:
4445
// the type is in the current crate, or the type and the trait are both
4546
// re-exported by the current crate.
46-
pub(crate) fn is_on_local_type(&self, cx: &Context<'_>) -> bool {
47-
let cache = cx.cache();
47+
pub(crate) fn is_on_local_type(&self, cache: &Cache, tcx: TyCtxt<'_>) -> bool {
4848
let for_type = &self.inner_impl().for_;
4949
if let Some(for_type_did) = for_type.def_id(cache) {
5050
// The "for" type is local if it's in the paths for the current crate.
@@ -67,7 +67,7 @@ impl Impl {
6767
// a foreign type. To make sure that confusion doesn't pass on to
6868
// the reader, consider all implementations in std, core, and alloc
6969
// to be on local types.
70-
let crate_name = cx.tcx().crate_name(trait_did.krate);
70+
let crate_name = tcx.crate_name(trait_did.krate);
7171
if matches!(crate_name.as_str(), "std" | "core" | "alloc") {
7272
return true;
7373
}

‎src/librustdoc/html/render/print_item.rs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -980,8 +980,9 @@ fn item_trait(w: &mut Buffer, cx: &mut Context<'_>, it: &clean::Item, t: &clean:
980980
}
981981
}
982982

983-
let (local, mut foreign) =
984-
implementors.iter().partition::<Vec<_>, _>(|i| i.is_on_local_type(cx));
983+
let (local, mut foreign) = implementors
984+
.iter()
985+
.partition::<Vec<_>, _>(|i| i.is_on_local_type(cx.cache(), cx.tcx()));
985986

986987
let (mut synthetic, mut concrete): (Vec<&&Impl>, Vec<&&Impl>) =
987988
local.iter().partition(|i| i.inner_impl().kind.is_auto());

‎src/librustdoc/html/render/sidebar.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -199,7 +199,7 @@ fn sidebar_trait<'a>(
199199
foreign_impls.extend(
200200
implementors
201201
.iter()
202-
.filter(|i| !i.is_on_local_type(cx))
202+
.filter(|i| !i.is_on_local_type(cx.cache(), cx.tcx()))
203203
.filter_map(|i| super::extract_for_impl_name(&i.impl_item, cx))
204204
.map(|(name, id)| Link::new(id, name)),
205205
);
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
//@ !has "$.index[*][?(@.inner=='impl')]"
2+
fn main() {}

0 commit comments

Comments
(0)

AltStyle によって変換されたページ (->オリジナル) /