Skip to content

Commit

Permalink
rustdoc: Hide self: Box<Self> in list of deref methods
Browse files Browse the repository at this point in the history
These methods can never be called through deref so there is no point
including them. For example you can't call `into_boxed_bytes` or
`into_string` on `String`.
  • Loading branch information
ollie27 committed Jun 2, 2017
1 parent afd4b81 commit 88c791b
Show file tree
Hide file tree
Showing 4 changed files with 25 additions and 7 deletions.
1 change: 1 addition & 0 deletions src/librustdoc/clean/mod.rs
Expand Up @@ -124,6 +124,7 @@ impl<'a, 'tcx> Clean<Crate> for visit_ast::RustdocVisitor<'a, 'tcx> {
let mut r = cx.renderinfo.borrow_mut();
r.deref_trait_did = cx.tcx.lang_items.deref_trait();
r.deref_mut_trait_did = cx.tcx.lang_items.deref_mut_trait();
r.owned_box_did = cx.tcx.lang_items.owned_box();
}

let mut externs = Vec::new();
Expand Down
19 changes: 12 additions & 7 deletions src/librustdoc/html/render.rs
Expand Up @@ -262,6 +262,7 @@ pub struct Cache {
stripped_mod: bool,
deref_trait_did: Option<DefId>,
deref_mut_trait_did: Option<DefId>,
owned_box_did: Option<DefId>,

// In rare case where a structure is defined in one module but implemented
// in another, if the implementing module is parsed before defining module,
Expand All @@ -280,6 +281,7 @@ pub struct RenderInfo {
pub external_typarams: FxHashMap<DefId, String>,
pub deref_trait_did: Option<DefId>,
pub deref_mut_trait_did: Option<DefId>,
pub owned_box_did: Option<DefId>,
}

/// Helper struct to render all source code to HTML pages
Expand Down Expand Up @@ -507,6 +509,7 @@ pub fn run(mut krate: clean::Crate,
external_typarams,
deref_trait_did,
deref_mut_trait_did,
owned_box_did,
} = renderinfo;

let external_paths = external_paths.into_iter()
Expand All @@ -530,6 +533,7 @@ pub fn run(mut krate: clean::Crate,
traits: mem::replace(&mut krate.external_traits, FxHashMap()),
deref_trait_did: deref_trait_did,
deref_mut_trait_did: deref_mut_trait_did,
owned_box_did: owned_box_did,
typarams: external_typarams,
};

Expand Down Expand Up @@ -2933,17 +2937,18 @@ fn render_impl(w: &mut fmt::Formatter, cx: &Context, i: &Impl, link: AssocItemLi
};

if let Some(self_ty) = self_type_opt {
let by_mut_ref = match self_ty {
SelfTy::SelfBorrowed(_lifetime, mutability) => {
mutability == Mutability::Mutable
},
let (by_mut_ref, by_box) = match self_ty {
SelfTy::SelfBorrowed(_, mutability) |
SelfTy::SelfExplicit(clean::BorrowedRef { mutability, .. }) => {
mutability == Mutability::Mutable
(mutability == Mutability::Mutable, false)
},
SelfTy::SelfExplicit(clean::ResolvedPath { did, .. }) => {
(false, Some(did) == cache().owned_box_did)
},
_ => false,
_ => (false, false),
};

deref_mut_ || !by_mut_ref
(deref_mut_ || !by_mut_ref) && !by_box
} else {
false
}
Expand Down
6 changes: 6 additions & 0 deletions src/test/rustdoc/issue-35169-2.rs
Expand Up @@ -19,6 +19,8 @@ impl Foo {
pub fn by_explicit_ref(self: &Foo) {}
pub fn by_mut_ref(&mut self) {}
pub fn by_explicit_mut_ref(self: &mut Foo) {}
pub fn by_explicit_box(self: Box<Foo>) {}
pub fn by_explicit_self_box(self: Box<Self>) {}
pub fn static_foo() {}
}

Expand All @@ -41,5 +43,9 @@ impl DerefMut for Bar {
// @has - '//*[@id="method.by_mut_ref"]' 'fn by_mut_ref(&mut self)'
// @has - '//*[@id="by_explicit_mut_ref.v"]' 'fn by_explicit_mut_ref(self: &mut Foo)'
// @has - '//*[@id="method.by_explicit_mut_ref"]' 'fn by_explicit_mut_ref(self: &mut Foo)'
// @!has - '//*[@id="by_explicit_box.v"]' 'fn by_explicit_box(self: Box<Foo>)'
// @!has - '//*[@id="method.by_explicit_box"]' 'fn by_explicit_box(self: Box<Foo>)'
// @!has - '//*[@id="by_explicit_self_box.v"]' 'fn by_explicit_self_box(self: Box<Self>)'
// @!has - '//*[@id="method.by_explicit_self_box"]' 'fn by_explicit_self_box(self: Box<Self>)'
// @!has - '//*[@id="static_foo.v"]' 'fn static_foo()'
// @!has - '//*[@id="method.static_foo"]' 'fn static_foo()'
6 changes: 6 additions & 0 deletions src/test/rustdoc/issue-35169.rs
Expand Up @@ -18,6 +18,8 @@ impl Foo {
pub fn by_explicit_ref(self: &Foo) {}
pub fn by_mut_ref(&mut self) {}
pub fn by_explicit_mut_ref(self: &mut Foo) {}
pub fn by_explicit_box(self: Box<Foo>) {}
pub fn by_explicit_self_box(self: Box<Self>) {}
pub fn static_foo() {}
}

Expand All @@ -36,5 +38,9 @@ impl Deref for Bar {
// @!has - '//*[@id="method.by_mut_ref"]' 'fn by_mut_ref(&mut self)'
// @!has - '//*[@id="by_explicit_mut_ref.v"]' 'fn by_explicit_mut_ref(self: &mut Foo)'
// @!has - '//*[@id="method.by_explicit_mut_ref"]' 'fn by_explicit_mut_ref(self: &mut Foo)'
// @!has - '//*[@id="by_explicit_box.v"]' 'fn by_explicit_box(self: Box<Foo>)'
// @!has - '//*[@id="method.by_explicit_box"]' 'fn by_explicit_box(self: Box<Foo>)'
// @!has - '//*[@id="by_explicit_self_box.v"]' 'fn by_explicit_self_box(self: Box<Self>)'
// @!has - '//*[@id="method.by_explicit_self_box"]' 'fn by_explicit_self_box(self: Box<Self>)'
// @!has - '//*[@id="static_foo.v"]' 'fn static_foo()'
// @!has - '//*[@id="method.static_foo"]' 'fn static_foo()'

0 comments on commit 88c791b

Please sign in to comment.