From ae7fca1e1f5d74bf88ffacaf339b28d8c73f8c4f Mon Sep 17 00:00:00 2001 From: mitaa Date: Wed, 9 Mar 2016 02:05:39 +0100 Subject: [PATCH 1/3] Check for `doc(inline)` instead of `.*(inline)` --- src/librustdoc/visit_ast.rs | 4 +-- .../rustdoc/inline_local/please_inline.rs | 29 +++++++++++++++++++ 2 files changed, 31 insertions(+), 2 deletions(-) create mode 100644 src/test/rustdoc/inline_local/please_inline.rs diff --git a/src/librustdoc/visit_ast.rs b/src/librustdoc/visit_ast.rs index bc6b4f83984b0..7a3adc157c261 100644 --- a/src/librustdoc/visit_ast.rs +++ b/src/librustdoc/visit_ast.rs @@ -276,10 +276,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) { diff --git a/src/test/rustdoc/inline_local/please_inline.rs b/src/test/rustdoc/inline_local/please_inline.rs new file mode 100644 index 0000000000000..d237ab8dab01a --- /dev/null +++ b/src/test/rustdoc/inline_local/please_inline.rs @@ -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 or the MIT license +// , 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; +} From a20e6bb1627f8669b334e673740f78e435cd0321 Mon Sep 17 00:00:00 2001 From: mitaa Date: Thu, 10 Mar 2016 03:29:46 +0100 Subject: [PATCH 2/3] Consider `doc(hidden)` for crate-local inlining --- src/librustdoc/visit_ast.rs | 42 +++++++++++++++++--- src/test/rustdoc/inline_local/issue-28537.rs | 27 +++++++++++++ 2 files changed, 63 insertions(+), 6 deletions(-) create mode 100644 src/test/rustdoc/inline_local/issue-28537.rs diff --git a/src/librustdoc/visit_ast.rs b/src/librustdoc/visit_ast.rs index 7a3adc157c261..4c03abac9e867 100644 --- a/src/librustdoc/visit_ast.rs +++ b/src/librustdoc/visit_ast.rs @@ -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 @@ -182,7 +183,7 @@ impl<'a, 'tcx> RustdocVisitor<'a, 'tcx> { please_inline: bool) -> Option { 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)) @@ -190,7 +191,7 @@ impl<'a, 'tcx> RustdocVisitor<'a, 'tcx> { } 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::>(); @@ -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)) @@ -213,8 +213,32 @@ impl<'a, 'tcx> RustdocVisitor<'a, 'tcx> { } - fn resolve_id(&mut self, id: ast::NodeId, renamed: Option, + /// 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, 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 @@ -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) { diff --git a/src/test/rustdoc/inline_local/issue-28537.rs b/src/test/rustdoc/inline_local/issue-28537.rs new file mode 100644 index 0000000000000..b38e104b7b4ee --- /dev/null +++ b/src/test/rustdoc/inline_local/issue-28537.rs @@ -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 or the MIT license +// , 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; From 7c983991d9ec1adb3dc608f4f87c48f5bd46641f Mon Sep 17 00:00:00 2001 From: mitaa Date: Wed, 9 Mar 2016 00:57:13 +0100 Subject: [PATCH 3/3] Remove `feature(globs)` since they are stable --- src/test/run-pass/cci_nested_exe.rs | 2 -- src/test/rustdoc/recursion1.rs | 1 - src/test/rustdoc/recursion2.rs | 1 - src/test/rustdoc/recursion3.rs | 2 -- 4 files changed, 6 deletions(-) diff --git a/src/test/run-pass/cci_nested_exe.rs b/src/test/run-pass/cci_nested_exe.rs index e4f4a4f3a576c..b40c29dd71529 100644 --- a/src/test/run-pass/cci_nested_exe.rs +++ b/src/test/run-pass/cci_nested_exe.rs @@ -11,8 +11,6 @@ // aux-build:cci_nested_lib.rs -#![feature(globs)] - extern crate cci_nested_lib; use cci_nested_lib::*; diff --git a/src/test/rustdoc/recursion1.rs b/src/test/rustdoc/recursion1.rs index 7505d20566dbb..00f7d90fabc38 100644 --- a/src/test/rustdoc/recursion1.rs +++ b/src/test/rustdoc/recursion1.rs @@ -9,7 +9,6 @@ // except according to those terms. #![crate_type = "lib"] -#![feature(globs)] mod m { pub use self::a::Foo; diff --git a/src/test/rustdoc/recursion2.rs b/src/test/rustdoc/recursion2.rs index 7505d20566dbb..00f7d90fabc38 100644 --- a/src/test/rustdoc/recursion2.rs +++ b/src/test/rustdoc/recursion2.rs @@ -9,7 +9,6 @@ // except according to those terms. #![crate_type = "lib"] -#![feature(globs)] mod m { pub use self::a::Foo; diff --git a/src/test/rustdoc/recursion3.rs b/src/test/rustdoc/recursion3.rs index 62a13f76ca4f0..1d9b903a27920 100644 --- a/src/test/rustdoc/recursion3.rs +++ b/src/test/rustdoc/recursion3.rs @@ -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::*;