Auto merge of #32142 - mitaa:rdoc-maybe-inline-local, r=alexcrichton
rustdoc: improve crate-local inlining fixes #28537 r? @alexcrichton
This commit is contained in:
commit
beb444eaed
7 changed files with 94 additions and 14 deletions
|
@ -26,6 +26,7 @@ use rustc::middle::stability;
|
||||||
use rustc_front::hir;
|
use rustc_front::hir;
|
||||||
|
|
||||||
use core;
|
use core;
|
||||||
|
use clean::{Clean, Attributes};
|
||||||
use doctree::*;
|
use doctree::*;
|
||||||
|
|
||||||
// looks to me like the first two of these are actually
|
// looks to me like the first two of these are actually
|
||||||
|
@ -182,7 +183,7 @@ impl<'a, 'tcx> RustdocVisitor<'a, 'tcx> {
|
||||||
please_inline: bool) -> Option<hir::ViewPath_> {
|
please_inline: bool) -> Option<hir::ViewPath_> {
|
||||||
match path {
|
match path {
|
||||||
hir::ViewPathSimple(dst, base) => {
|
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
|
None
|
||||||
} else {
|
} else {
|
||||||
Some(hir::ViewPathSimple(dst, base))
|
Some(hir::ViewPathSimple(dst, base))
|
||||||
|
@ -190,7 +191,7 @@ impl<'a, 'tcx> RustdocVisitor<'a, 'tcx> {
|
||||||
}
|
}
|
||||||
hir::ViewPathList(p, paths) => {
|
hir::ViewPathList(p, paths) => {
|
||||||
let mine = paths.into_iter().filter(|path| {
|
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)
|
please_inline)
|
||||||
}).collect::<hir::HirVec<hir::PathListItem>>();
|
}).collect::<hir::HirVec<hir::PathListItem>>();
|
||||||
|
|
||||||
|
@ -201,9 +202,8 @@ impl<'a, 'tcx> RustdocVisitor<'a, 'tcx> {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// these are feature gated anyway
|
|
||||||
hir::ViewPathGlob(base) => {
|
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
|
None
|
||||||
} else {
|
} else {
|
||||||
Some(hir::ViewPathGlob(base))
|
Some(hir::ViewPathGlob(base))
|
||||||
|
@ -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 {
|
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() {
|
let tcx = match self.cx.tcx_opt() {
|
||||||
Some(tcx) => tcx,
|
Some(tcx) => tcx,
|
||||||
None => return false
|
None => return false
|
||||||
|
@ -226,9 +250,15 @@ impl<'a, 'tcx> RustdocVisitor<'a, 'tcx> {
|
||||||
let analysis = match self.analysis {
|
let analysis = match self.analysis {
|
||||||
Some(analysis) => analysis, None => return false
|
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
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
if !self.view_item_stack.insert(def_node_id) { return false }
|
if !self.view_item_stack.insert(def_node_id) { return false }
|
||||||
|
|
||||||
let ret = match tcx.map.get(def_node_id) {
|
let ret = match tcx.map.get(def_node_id) {
|
||||||
|
@ -276,10 +306,10 @@ impl<'a, 'tcx> RustdocVisitor<'a, 'tcx> {
|
||||||
let node = if item.vis == hir::Public {
|
let node = if item.vis == hir::Public {
|
||||||
let please_inline = item.attrs.iter().any(|item| {
|
let please_inline = item.attrs.iter().any(|item| {
|
||||||
match item.meta_item_list() {
|
match item.meta_item_list() {
|
||||||
Some(list) => {
|
Some(list) if &item.name()[..] == "doc" => {
|
||||||
list.iter().any(|i| &i.name()[..] == "inline")
|
list.iter().any(|i| &i.name()[..] == "inline")
|
||||||
}
|
}
|
||||||
None => false,
|
_ => false,
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
match self.visit_view_path(node, om, item.id, please_inline) {
|
match self.visit_view_path(node, om, item.id, please_inline) {
|
||||||
|
|
|
@ -11,8 +11,6 @@
|
||||||
// aux-build:cci_nested_lib.rs
|
// aux-build:cci_nested_lib.rs
|
||||||
|
|
||||||
|
|
||||||
#![feature(globs)]
|
|
||||||
|
|
||||||
extern crate cci_nested_lib;
|
extern crate cci_nested_lib;
|
||||||
use cci_nested_lib::*;
|
use cci_nested_lib::*;
|
||||||
|
|
||||||
|
|
27
src/test/rustdoc/inline_local/issue-28537.rs
Normal file
27
src/test/rustdoc/inline_local/issue-28537.rs
Normal file
|
@ -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
src/test/rustdoc/inline_local/please_inline.rs
Normal file
29
src/test/rustdoc/inline_local/please_inline.rs
Normal file
|
@ -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;
|
||||||
|
}
|
|
@ -9,7 +9,6 @@
|
||||||
// except according to those terms.
|
// except according to those terms.
|
||||||
|
|
||||||
#![crate_type = "lib"]
|
#![crate_type = "lib"]
|
||||||
#![feature(globs)]
|
|
||||||
|
|
||||||
mod m {
|
mod m {
|
||||||
pub use self::a::Foo;
|
pub use self::a::Foo;
|
||||||
|
|
|
@ -9,7 +9,6 @@
|
||||||
// except according to those terms.
|
// except according to those terms.
|
||||||
|
|
||||||
#![crate_type = "lib"]
|
#![crate_type = "lib"]
|
||||||
#![feature(globs)]
|
|
||||||
|
|
||||||
mod m {
|
mod m {
|
||||||
pub use self::a::Foo;
|
pub use self::a::Foo;
|
||||||
|
|
|
@ -8,8 +8,6 @@
|
||||||
// option. This file may not be copied, modified, or distributed
|
// option. This file may not be copied, modified, or distributed
|
||||||
// except according to those terms.
|
// except according to those terms.
|
||||||
|
|
||||||
#![feature(globs)]
|
|
||||||
|
|
||||||
pub mod longhands {
|
pub mod longhands {
|
||||||
pub use super::*;
|
pub use super::*;
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue