From 45cad0456f6d8624e8c9d66709444106748a1f03 Mon Sep 17 00:00:00 2001 From: Oliver Middleton Date: Wed, 10 Jan 2018 07:05:30 +0000 Subject: [PATCH] rustdoc: Populate external_traits with traits only seen in impls This means default methods can always be found and "Important traits" will include all spotlight traits. --- src/librustdoc/clean/inline.rs | 9 ++++++++ src/librustdoc/clean/mod.rs | 3 +-- src/librustdoc/html/render.rs | 5 ++--- .../auxiliary/impl-inline-without-trait.rs | 18 +++++++++++++++ .../inline_cross/impl-inline-without-trait.rs | 22 +++++++++++++++++++ 5 files changed, 52 insertions(+), 5 deletions(-) create mode 100644 src/test/rustdoc/inline_cross/auxiliary/impl-inline-without-trait.rs create mode 100644 src/test/rustdoc/inline_cross/impl-inline-without-trait.rs diff --git a/src/librustdoc/clean/inline.rs b/src/librustdoc/clean/inline.rs index 914365b003e..26919239bb9 100644 --- a/src/librustdoc/clean/inline.rs +++ b/src/librustdoc/clean/inline.rs @@ -349,6 +349,9 @@ pub fn build_impl(cx: &DocContext, did: DefId, ret: &mut Vec) { if trait_.def_id() == tcx.lang_items().deref_trait() { super::build_deref_target_impls(cx, &trait_items, ret); } + if let Some(trait_did) = trait_.def_id() { + record_extern_trait(cx, trait_did); + } let provided = trait_.def_id().map(|did| { tcx.provided_trait_methods(did) @@ -504,3 +507,9 @@ fn separate_supertrait_bounds(mut g: clean::Generics) }); (g, ty_bounds) } + +pub fn record_extern_trait(cx: &DocContext, did: DefId) { + cx.external_traits.borrow_mut().entry(did).or_insert_with(|| { + build_external_trait(cx, did) + }); +} diff --git a/src/librustdoc/clean/mod.rs b/src/librustdoc/clean/mod.rs index 265114ae826..48b1c46ec01 100644 --- a/src/librustdoc/clean/mod.rs +++ b/src/librustdoc/clean/mod.rs @@ -3189,8 +3189,7 @@ fn register_def(cx: &DocContext, def: Def) -> DefId { if did.is_local() { return did } inline::record_extern_fqn(cx, did, kind); if let TypeKind::Trait = kind { - let t = inline::build_external_trait(cx, did); - cx.external_traits.borrow_mut().insert(did, t); + inline::record_extern_trait(cx, did); } did } diff --git a/src/librustdoc/html/render.rs b/src/librustdoc/html/render.rs index 7449c08fcd2..5aa03227d1d 100644 --- a/src/librustdoc/html/render.rs +++ b/src/librustdoc/html/render.rs @@ -3291,8 +3291,7 @@ fn spotlight_decl(decl: &clean::FnDecl) -> Result { if let Some(impls) = c.impls.get(&did) { for i in impls { let impl_ = i.inner_impl(); - if impl_.trait_.def_id().and_then(|d| c.traits.get(&d)) - .map_or(false, |t| t.is_spotlight) { + if impl_.trait_.def_id().map_or(false, |d| c.traits[&d].is_spotlight) { if out.is_empty() { out.push_str( &format!("

Important traits for {}

\ @@ -3458,7 +3457,7 @@ fn doc_impl_item(w: &mut fmt::Formatter, cx: &Context, item: &clean::Item, } let traits = &cache().traits; - let trait_ = i.trait_did().and_then(|did| traits.get(&did)); + let trait_ = i.trait_did().map(|did| &traits[&did]); if !show_def_docs { write!(w, "")?; diff --git a/src/test/rustdoc/inline_cross/auxiliary/impl-inline-without-trait.rs b/src/test/rustdoc/inline_cross/auxiliary/impl-inline-without-trait.rs new file mode 100644 index 00000000000..5d4adb28cd8 --- /dev/null +++ b/src/test/rustdoc/inline_cross/auxiliary/impl-inline-without-trait.rs @@ -0,0 +1,18 @@ +// 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. + +pub trait MyTrait { + /// docs for my_trait_method + fn my_trait_method() {} +} + +pub struct MyStruct; + +impl MyTrait for MyStruct {} diff --git a/src/test/rustdoc/inline_cross/impl-inline-without-trait.rs b/src/test/rustdoc/inline_cross/impl-inline-without-trait.rs new file mode 100644 index 00000000000..ea97d9d6ac2 --- /dev/null +++ b/src/test/rustdoc/inline_cross/impl-inline-without-trait.rs @@ -0,0 +1,22 @@ +// 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:impl-inline-without-trait.rs +// build-aux-docs +// ignore-cross-compile + +#![crate_name = "foo"] + +extern crate impl_inline_without_trait; + +// @has 'foo/struct.MyStruct.html' +// @has - '//*[@id="method.my_trait_method"]' 'fn my_trait_method()' +// @has - '//*[@class="docblock"]' 'docs for my_trait_method' +pub use impl_inline_without_trait::MyStruct; -- 2.44.0