Skip to content

Commit

Permalink
Rollup merge of rust-lang#32142 - mitaa:rdoc-maybe-inline-local, r=al…
Browse files Browse the repository at this point in the history
…excrichton

rustdoc: improve crate-local inlining

fixes rust-lang#28537

r? @alexcrichton
  • Loading branch information
Manishearth committed Mar 12, 2016
2 parents a128b31 + 7c98399 commit 5d443c6
Show file tree
Hide file tree
Showing 7 changed files with 94 additions and 14 deletions.
46 changes: 38 additions & 8 deletions src/librustdoc/visit_ast.rs
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ use rustc::middle::stability;
use rustc_front::hir;

use core;
use clean::{Clean, Attributes};
use doctree::*;

// looks to me like the first two of these are actually
Expand Down Expand Up @@ -182,15 +183,15 @@ impl<'a, 'tcx> RustdocVisitor<'a, 'tcx> {
please_inline: bool) -> Option<hir::ViewPath_> {
match path {
hir::ViewPathSimple(dst, base) => {
if self.resolve_id(id, Some(dst), false, om, please_inline) {
if self.maybe_inline_local(id, Some(dst), false, om, please_inline) {
None
} else {
Some(hir::ViewPathSimple(dst, base))
}
}
hir::ViewPathList(p, paths) => {
let mine = paths.into_iter().filter(|path| {
!self.resolve_id(path.node.id(), None, false, om,
!self.maybe_inline_local(path.node.id(), None, false, om,
please_inline)
}).collect::<hir::HirVec<hir::PathListItem>>();

Expand All @@ -201,9 +202,8 @@ impl<'a, 'tcx> RustdocVisitor<'a, 'tcx> {
}
}

// these are feature gated anyway
hir::ViewPathGlob(base) => {
if self.resolve_id(id, None, true, om, please_inline) {
if self.maybe_inline_local(id, None, true, om, please_inline) {
None
} else {
Some(hir::ViewPathGlob(base))
Expand All @@ -213,8 +213,32 @@ impl<'a, 'tcx> RustdocVisitor<'a, 'tcx> {

}

fn resolve_id(&mut self, id: ast::NodeId, renamed: Option<ast::Name>,
/// Tries to resolve the target of a `pub use` statement and inlines the
/// target if it is defined locally and would not be documented otherwise,
/// or when it is specifically requested with `please_inline`.
/// (the latter is the case when the import is marked `doc(inline)`)
///
/// Cross-crate inlining occurs later on during crate cleaning
/// and follows different rules.
///
/// Returns true if the target has been inlined.
fn maybe_inline_local(&mut self, id: ast::NodeId, renamed: Option<ast::Name>,
glob: bool, om: &mut Module, please_inline: bool) -> bool {

fn inherits_doc_hidden(cx: &core::DocContext, mut node: ast::NodeId) -> bool {
while let Some(id) = cx.map.get_enclosing_scope(node) {
node = id;
let attrs = cx.map.attrs(node).clean(cx);
if attrs.list_def("doc").has_word("hidden") {
return true;
}
if node == ast::CRATE_NODE_ID {
break;
}
}
false
}

let tcx = match self.cx.tcx_opt() {
Some(tcx) => tcx,
None => return false
Expand All @@ -226,9 +250,15 @@ impl<'a, 'tcx> RustdocVisitor<'a, 'tcx> {
let analysis = match self.analysis {
Some(analysis) => analysis, None => return false
};
if !please_inline && analysis.access_levels.is_public(def) {

let is_private = !analysis.access_levels.is_public(def);
let is_hidden = inherits_doc_hidden(self.cx, def_node_id);

// Only inline if requested or if the item would otherwise be stripped
if !please_inline && !is_private && !is_hidden {
return false
}

if !self.view_item_stack.insert(def_node_id) { return false }

let ret = match tcx.map.get(def_node_id) {
Expand Down Expand Up @@ -276,10 +306,10 @@ impl<'a, 'tcx> RustdocVisitor<'a, 'tcx> {
let node = if item.vis == hir::Public {
let please_inline = item.attrs.iter().any(|item| {
match item.meta_item_list() {
Some(list) => {
Some(list) if &item.name()[..] == "doc" => {
list.iter().any(|i| &i.name()[..] == "inline")
}
None => false,
_ => false,
}
});
match self.visit_view_path(node, om, item.id, please_inline) {
Expand Down
2 changes: 0 additions & 2 deletions src/test/run-pass/cci_nested_exe.rs
Original file line number Diff line number Diff line change
Expand Up @@ -11,8 +11,6 @@
// aux-build:cci_nested_lib.rs


#![feature(globs)]

extern crate cci_nested_lib;
use cci_nested_lib::*;

Expand Down
27 changes: 27 additions & 0 deletions src/test/rustdoc/inline_local/issue-28537.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
// 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.

#[doc(hidden)]
pub mod foo {
pub struct Foo;
}

mod bar {
pub use self::bar::Bar;
mod bar {
pub struct Bar;
}
}

// @has issue_28537/struct.Foo.html
pub use foo::Foo;

// @has issue_28537/struct.Bar.html
pub use self::bar::Bar;
29 changes: 29 additions & 0 deletions src/test/rustdoc/inline_local/please_inline.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
// 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.

pub mod foo {
pub struct Foo;
}

// @has please_inline/a/index.html
pub mod a {
// @!has - 'pub use foo::'
// @has please_inline/a/struct.Foo.html
#[doc(inline)]
pub use foo::Foo;
}

// @has please_inline/b/index.html
pub mod b {
// @has - 'pub use foo::'
// @!has please_inline/b/struct.Foo.html
#[feature(inline)]
pub use foo::Foo;
}
1 change: 0 additions & 1 deletion src/test/rustdoc/recursion1.rs
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,6 @@
// except according to those terms.

#![crate_type = "lib"]
#![feature(globs)]

mod m {
pub use self::a::Foo;
Expand Down
1 change: 0 additions & 1 deletion src/test/rustdoc/recursion2.rs
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,6 @@
// except according to those terms.

#![crate_type = "lib"]
#![feature(globs)]

mod m {
pub use self::a::Foo;
Expand Down
2 changes: 0 additions & 2 deletions src/test/rustdoc/recursion3.rs
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,6 @@
// option. This file may not be copied, modified, or distributed
// except according to those terms.

#![feature(globs)]

pub mod longhands {
pub use super::*;

Expand Down

0 comments on commit 5d443c6

Please sign in to comment.