From 2e81ce7dfa1c3429ee82f336bbec59e056702b3d Mon Sep 17 00:00:00 2001 From: Oliver Middleton Date: Tue, 23 Jan 2018 04:22:20 +0000 Subject: [PATCH] rustdoc: Hide methods from #[doc(masked)] crates from the search index --- src/librustdoc/html/render.rs | 52 +++++++++++++++------------- src/test/rustdoc/auxiliary/masked.rs | 20 +++++++++++ src/test/rustdoc/masked.rs | 40 +++++++++++++++++++++ 3 files changed, 87 insertions(+), 25 deletions(-) create mode 100644 src/test/rustdoc/auxiliary/masked.rs create mode 100644 src/test/rustdoc/masked.rs diff --git a/src/librustdoc/html/render.rs b/src/librustdoc/html/render.rs index cfa09ea30a8..dd40f979fd1 100644 --- a/src/librustdoc/html/render.rs +++ b/src/librustdoc/html/render.rs @@ -1174,6 +1174,16 @@ fn fold_item(&mut self, item: clean::Item) -> Option { _ => self.stripped_mod, }; + // If the impl is from a masked crate or references something from a + // masked crate then remove it completely. + if let clean::ImplItem(ref i) = item.inner { + if self.masked_crates.contains(&item.def_id.krate) || + i.trait_.def_id().map_or(false, |d| self.masked_crates.contains(&d.krate)) || + i.for_.def_id().map_or(false, |d| self.masked_crates.contains(&d.krate)) { + return None; + } + } + // Register any generics to their corresponding string. This is used // when pretty-printing types. if let Some(generics) = item.inner.generics() { @@ -1188,14 +1198,10 @@ fn fold_item(&mut self, item: clean::Item) -> Option { // Collect all the implementors of traits. if let clean::ImplItem(ref i) = item.inner { - if !self.masked_crates.contains(&item.def_id.krate) { - if let Some(did) = i.trait_.def_id() { - if i.for_.def_id().map_or(true, |d| !self.masked_crates.contains(&d.krate)) { - self.implementors.entry(did).or_insert(vec![]).push(Impl { - impl_item: item.clone(), - }); - } - } + if let Some(did) = i.trait_.def_id() { + self.implementors.entry(did).or_insert(vec![]).push(Impl { + impl_item: item.clone(), + }); } } @@ -1358,24 +1364,20 @@ fn fold_item(&mut self, item: clean::Item) -> Option { // Note: matching twice to restrict the lifetime of the `i` borrow. let mut dids = FxHashSet(); if let clean::Item { inner: clean::ImplItem(ref i), .. } = item { - let masked_trait = i.trait_.def_id().map_or(false, - |d| self.masked_crates.contains(&d.krate)); - if !masked_trait { - match i.for_ { - clean::ResolvedPath { did, .. } | - clean::BorrowedRef { - type_: box clean::ResolvedPath { did, .. }, .. - } => { - dids.insert(did); - } - ref t => { - let did = t.primitive_type().and_then(|t| { - self.primitive_locations.get(&t).cloned() - }); + match i.for_ { + clean::ResolvedPath { did, .. } | + clean::BorrowedRef { + type_: box clean::ResolvedPath { did, .. }, .. + } => { + dids.insert(did); + } + ref t => { + let did = t.primitive_type().and_then(|t| { + self.primitive_locations.get(&t).cloned() + }); - if let Some(did) = did { - dids.insert(did); - } + if let Some(did) = did { + dids.insert(did); } } } diff --git a/src/test/rustdoc/auxiliary/masked.rs b/src/test/rustdoc/auxiliary/masked.rs new file mode 100644 index 00000000000..e0d53a72220 --- /dev/null +++ b/src/test/rustdoc/auxiliary/masked.rs @@ -0,0 +1,20 @@ +// Copyright 2018 The Rust Project Developers. See the COPYRIGHT +// file at the top-level directory of this distribution and at +// http://rust-lang.org/COPYRIGHT. +// +// Licensed under the Apache License, Version 2.0 or the MIT license +// , at your +// option. This file may not be copied, modified, or distributed +// except according to those terms. + +#[derive(Clone)] +pub struct MaskedStruct; + +pub trait MaskedTrait { + fn masked_method(); +} + +impl MaskedTrait for String { + fn masked_method() {} +} diff --git a/src/test/rustdoc/masked.rs b/src/test/rustdoc/masked.rs new file mode 100644 index 00000000000..1f398da84e5 --- /dev/null +++ b/src/test/rustdoc/masked.rs @@ -0,0 +1,40 @@ +// Copyright 2018 The Rust Project Developers. See the COPYRIGHT +// file at the top-level directory of this distribution and at +// http://rust-lang.org/COPYRIGHT. +// +// Licensed under the Apache License, Version 2.0 or the MIT license +// , at your +// option. This file may not be copied, modified, or distributed +// except according to those terms. + +// aux-build:masked.rs + +#![feature(doc_masked)] + +#![crate_name = "foo"] + +#[doc(masked)] +extern crate masked; + +// @!has 'search-index.js' 'masked_method' + +// @!has 'foo/struct.String.html' 'MaskedTrait' +// @!has 'foo/struct.String.html' 'masked_method' +pub use std::string::String; + +// @!has 'foo/trait.Clone.html' 'MaskedStruct' +pub use std::clone::Clone; + +// @!has 'foo/struct.MyStruct.html' 'MaskedTrait' +// @!has 'foo/struct.MyStruct.html' 'masked_method' +pub struct MyStruct; + +impl masked::MaskedTrait for MyStruct { + fn masked_method() {} +} + +// @!has 'foo/trait.MyTrait.html' 'MaskedStruct' +pub trait MyTrait {} + +impl MyTrait for masked::MaskedStruct {} -- 2.44.0