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