Skip to content

Commit

Permalink
auto merge of #16767 : SiegeLord/rust/reexported_methods, r=cmr
Browse files Browse the repository at this point in the history
Previously, this caused methods of re-exported types to not be inserted into
the search index. This fix may introduce some false positives, but in my
testing they appear as orphaned methods and end up not being inserted into the
final search index at a later stage.

Fixes issue #11943
  • Loading branch information
bors committed Aug 29, 2014
2 parents 6025926 + 0db6f4c commit 51d0d06
Show file tree
Hide file tree
Showing 4 changed files with 89 additions and 8 deletions.
18 changes: 10 additions & 8 deletions src/librustdoc/html/render.rs
Original file line number Diff line number Diff line change
Expand Up @@ -819,16 +819,17 @@ impl DocFolder for Cache {
// Index this method for searching later on
match item.name {
Some(ref s) => {
let parent = match item.inner {
let (parent, is_method) = match item.inner {
clean::TyMethodItem(..) |
clean::StructFieldItem(..) |
clean::VariantItem(..) => {
(Some(*self.parent_stack.last().unwrap()),
Some(self.stack.slice_to(self.stack.len() - 1)))
((Some(*self.parent_stack.last().unwrap()),
Some(self.stack.slice_to(self.stack.len() - 1))),
false)
}
clean::MethodItem(..) => {
if self.parent_stack.len() == 0 {
(None, None)
((None, None), false)
} else {
let last = self.parent_stack.last().unwrap();
let did = *last;
Expand All @@ -844,17 +845,18 @@ impl DocFolder for Cache {
Some(..) => Some(self.stack.as_slice()),
None => None
};
(Some(*last), path)
((Some(*last), path), true)
}
}
_ => (None, Some(self.stack.as_slice()))
_ => ((None, Some(self.stack.as_slice())), false)
};
let hidden_field = match item.inner {
clean::StructFieldItem(clean::HiddenStructField) => true,
_ => false
};

match parent {
(parent, Some(path)) if !self.privmod && !hidden_field => {
(parent, Some(path)) if is_method || (!self.privmod && !hidden_field) => {
self.search_index.push(IndexItem {
ty: shortty(&item),
name: s.to_string(),
Expand All @@ -863,7 +865,7 @@ impl DocFolder for Cache {
parent: parent,
});
}
(Some(parent), None) if !self.privmod => {
(Some(parent), None) if is_method || (!self.privmod && !hidden_field)=> {
if ast_util::is_local(parent) {
// We have a parent, but we don't know where they're
// defined yet. Wait for later to index this item.
Expand Down
17 changes: 17 additions & 0 deletions src/test/run-make/rustdoc-search-index/Makefile
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
-include ../tools.mk

# FIXME ignore windows
ifndef IS_WINDOWS

source=index.rs

all:
$(HOST_RPATH_ENV) $(RUSTDOC) -w html -o $(TMPDIR)/doc $(source)
cp $(source) $(TMPDIR)
cp verify.sh $(TMPDIR)
$(call RUN,verify.sh) $(TMPDIR)

else
all:

endif
29 changes: 29 additions & 0 deletions src/test/run-make/rustdoc-search-index/index.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
// Copyright 2014 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.

#![crate_name = "rustdoc_test"]

// In: Foo
pub use private::Foo;

mod private {
pub struct Foo;
impl Foo {
// In: test_method
pub fn test_method() {}
// Out: priv_method
fn priv_method() {}
}

pub trait PrivateTrait {
// Out: priv_method
fn trait_method() {}
}
}
33 changes: 33 additions & 0 deletions src/test/run-make/rustdoc-search-index/verify.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
#!/bin/sh

source="$1/index.rs"
index="$1/doc/search-index.js"

if ! [ -e $index ]
then
echo "Could not find the search index (looked for $index)"
exit 1
fi

ins=$(grep -o 'In: .*' $source | sed 's/In: \(.*\)/\1/g')
outs=$(grep -o 'Out: .*' $source | sed 's/Out: \(.*\)/\1/g')

for p in $ins
do
if ! grep -q $p $index
then
echo "'$p' was erroneously excluded from search index."
exit 1
fi
done

for p in $outs
do
if grep -q $p $index
then
echo "'$p' was erroneously included in search index."
exit 1
fi
done

exit 0

0 comments on commit 51d0d06

Please sign in to comment.