diff --git a/src/librustdoc/html/render.rs b/src/librustdoc/html/render.rs
index 6415ee85f5704..3ddeef7e05818 100644
--- a/src/librustdoc/html/render.rs
+++ b/src/librustdoc/html/render.rs
@@ -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;
@@ -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(),
@@ -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.
diff --git a/src/test/run-make/rustdoc-search-index/Makefile b/src/test/run-make/rustdoc-search-index/Makefile
new file mode 100644
index 0000000000000..1248f144a8493
--- /dev/null
+++ b/src/test/run-make/rustdoc-search-index/Makefile
@@ -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
diff --git a/src/test/run-make/rustdoc-search-index/index.rs b/src/test/run-make/rustdoc-search-index/index.rs
new file mode 100644
index 0000000000000..019d77f1b1cbd
--- /dev/null
+++ b/src/test/run-make/rustdoc-search-index/index.rs
@@ -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 or the MIT license
+// , 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() {}
+ }
+}
diff --git a/src/test/run-make/rustdoc-search-index/verify.sh b/src/test/run-make/rustdoc-search-index/verify.sh
new file mode 100755
index 0000000000000..af5033adf6bcd
--- /dev/null
+++ b/src/test/run-make/rustdoc-search-index/verify.sh
@@ -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