Skip to content

Commit

Permalink
Auto merge of #36078 - ollie27:rustdoc_search_assocconst, r=alexcrichton
Browse files Browse the repository at this point in the history
rustdoc: Fix associated consts in search results

Associated consts can appear in none trait impls so need to be treated
like methods when generating the search index.

Fixes #36031
  • Loading branch information
bors authored Sep 6, 2016
2 parents e1d0de8 + b56d61c commit 1d04201
Show file tree
Hide file tree
Showing 3 changed files with 50 additions and 11 deletions.
21 changes: 10 additions & 11 deletions src/librustdoc/html/render.rs
Original file line number Diff line number Diff line change
Expand Up @@ -272,7 +272,7 @@ pub struct Cache {
// then the fully qualified name of the structure isn't presented in `paths`
// yet when its implementation methods are being indexed. Caches such methods
// and their parent id here and indexes them at the end of crate parsing.
orphan_methods: Vec<(DefId, clean::Item)>,
orphan_impl_items: Vec<(DefId, clean::Item)>,
}

/// Temporary storage for data obtained during `RustdocVisitor::clean()`.
Expand Down Expand Up @@ -529,7 +529,7 @@ pub fn run(mut krate: clean::Crate,
seen_mod: false,
stripped_mod: false,
access_levels: krate.access_levels.clone(),
orphan_methods: Vec::new(),
orphan_impl_items: Vec::new(),
traits: mem::replace(&mut krate.external_traits, FnvHashMap()),
deref_trait_did: deref_trait_did,
typarams: external_typarams,
Expand Down Expand Up @@ -581,12 +581,12 @@ fn build_index(krate: &clean::Crate, cache: &mut Cache) -> String {
let mut crate_paths = Vec::<Json>::new();

let Cache { ref mut search_index,
ref orphan_methods,
ref orphan_impl_items,
ref mut paths, .. } = *cache;

// Attach all orphan methods to the type's definition if the type
// Attach all orphan items to the type's definition if the type
// has since been learned.
for &(did, ref item) in orphan_methods {
for &(did, ref item) in orphan_impl_items {
if let Some(&(ref fqp, _)) = paths.get(&did) {
search_index.push(IndexItem {
ty: item_type(item),
Expand Down Expand Up @@ -1024,23 +1024,22 @@ impl DocFolder for Cache {

// Index this method for searching later on
if let Some(ref s) = item.name {
let (parent, is_method) = match item.inner {
let (parent, is_inherent_impl_item) = match item.inner {
clean::StrippedItem(..) => ((None, None), false),
clean::AssociatedConstItem(..) |
clean::TypedefItem(_, true) if self.parent_is_trait_impl => {
// skip associated items in trait impls
((None, None), false)
}
clean::AssociatedTypeItem(..) |
clean::AssociatedConstItem(..) |
clean::TyMethodItem(..) |
clean::StructFieldItem(..) |
clean::VariantItem(..) => {
((Some(*self.parent_stack.last().unwrap()),
Some(&self.stack[..self.stack.len() - 1])),
false)
}
clean::MethodItem(..) => {
clean::MethodItem(..) | clean::AssociatedConstItem(..) => {
if self.parent_stack.is_empty() {
((None, None), false)
} else {
Expand All @@ -1066,7 +1065,7 @@ impl DocFolder for Cache {
};

match parent {
(parent, Some(path)) if is_method || (!self.stripped_mod) => {
(parent, Some(path)) if is_inherent_impl_item || (!self.stripped_mod) => {
debug_assert!(!item.is_stripped());

// A crate has a module at its root, containing all items,
Expand All @@ -1084,10 +1083,10 @@ impl DocFolder for Cache {
});
}
}
(Some(parent), None) if is_method => {
(Some(parent), None) if is_inherent_impl_item => {
// We have a parent, but we don't know where they're
// defined yet. Wait for later to index this item.
self.orphan_methods.push((parent, item.clone()));
self.orphan_impl_items.push((parent, item.clone()));
}
_ => {}
}
Expand Down
21 changes: 21 additions & 0 deletions src/test/rustdoc/auxiliary/issue-36031.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
// Copyright 2016 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 <LICENSE-APACHE or
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
// option. This file may not be copied, modified, or distributed
// except according to those terms.

#![feature(associated_consts)]

pub trait Foo {
const FOO: usize;
}

pub struct Bar;

impl Bar {
pub const BAR: usize = 3;
}
19 changes: 19 additions & 0 deletions src/test/rustdoc/issue-36031.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
// Copyright 2016 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 <LICENSE-APACHE or
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
// option. This file may not be copied, modified, or distributed
// except according to those terms.

// aux-build:issue-36031.rs
// build-aux-docs
// ignore-cross-compile

#![crate_name = "foo"]

extern crate issue_36031;

pub use issue_36031::Foo;

0 comments on commit 1d04201

Please sign in to comment.