Skip to content

Commit

Permalink
rustdoc: Add support for pub(restricted)
Browse files Browse the repository at this point in the history
  • Loading branch information
ollie27 committed May 12, 2018
1 parent fe63e47 commit 3daded0
Show file tree
Hide file tree
Showing 3 changed files with 71 additions and 5 deletions.
17 changes: 14 additions & 3 deletions src/librustdoc/clean/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ pub use self::ItemEnum::*;
pub use self::TyParamBound::*;
pub use self::SelfTy::*;
pub use self::FunctionRetTy::*;
pub use self::Visibility::*;
pub use self::Visibility::{Public, Inherited};

use syntax;
use rustc_target::spec::abi::Abi;
Expand Down Expand Up @@ -2976,11 +2976,22 @@ impl<'tcx> Clean<Item> for ty::FieldDef {
pub enum Visibility {
Public,
Inherited,
Crate,
Restricted(DefId, Path),
}

impl Clean<Option<Visibility>> for hir::Visibility {
fn clean(&self, _: &DocContext) -> Option<Visibility> {
Some(if *self == hir::Visibility::Public { Public } else { Inherited })
fn clean(&self, cx: &DocContext) -> Option<Visibility> {
Some(match *self {
hir::Visibility::Public => Visibility::Public,
hir::Visibility::Inherited => Visibility::Inherited,
hir::Visibility::Crate => Visibility::Crate,
hir::Visibility::Restricted { ref path, .. } => {
let path = path.clean(cx);
let did = register_def(cx, path.def);
Visibility::Restricted(did, path)
}
})
}
}

Expand Down
15 changes: 13 additions & 2 deletions src/librustdoc/html/format.rs
Original file line number Diff line number Diff line change
Expand Up @@ -927,8 +927,19 @@ impl<'a> fmt::Display for Method<'a> {
impl<'a> fmt::Display for VisSpace<'a> {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
match *self.get() {
Some(clean::Public) => write!(f, "pub "),
Some(clean::Inherited) | None => Ok(())
Some(clean::Public) => f.write_str("pub "),
Some(clean::Inherited) | None => Ok(()),
Some(clean::Visibility::Crate) => write!(f, "pub(crate) "),
Some(clean::Visibility::Restricted(did, ref path)) => {
f.write_str("pub(")?;
if path.segments.len() != 1
|| (path.segments[0].name != "self" && path.segments[0].name != "super")
{
f.write_str("in ")?;
}
resolved_path(f, did, path, true, false)?;
f.write_str(") ")
}
}
}
}
Expand Down
44 changes: 44 additions & 0 deletions src/test/rustdoc/pub-restricted.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
// Copyright 2018 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.

// ignore-tidy-linelength

// compile-flags: --document-private-items

#![feature(crate_visibility_modifier)]

#![crate_name = "foo"]

// @has 'foo/struct.FooPublic.html' '//pre' 'pub struct FooPublic'
pub struct FooPublic;
// @has 'foo/struct.FooJustCrate.html' '//pre' 'pub(crate) struct FooJustCrate'
crate struct FooJustCrate;
// @has 'foo/struct.FooPubCrate.html' '//pre' 'pub(crate) struct FooPubCrate'
pub(crate) struct FooPubCrate;
// @has 'foo/struct.FooSelf.html' '//pre' 'pub(self) struct FooSelf'
pub(self) struct FooSelf;
// @has 'foo/struct.FooInSelf.html' '//pre' 'pub(self) struct FooInSelf'
pub(in self) struct FooInSelf;
mod a {
// @has 'foo/a/struct.FooSuper.html' '//pre' 'pub(super) struct FooSuper'
pub(super) struct FooSuper;
// @has 'foo/a/struct.FooInSuper.html' '//pre' 'pub(super) struct FooInSuper'
pub(in super) struct FooInSuper;
// @has 'foo/a/struct.FooInA.html' '//pre' 'pub(in a) struct FooInA'
pub(in a) struct FooInA;
mod b {
// @has 'foo/a/b/struct.FooInSelfSuperB.html' '//pre' 'pub(in self::super::b) struct FooInSelfSuperB'
pub(in self::super::b) struct FooInSelfSuperB;
// @has 'foo/a/b/struct.FooInSuperSuper.html' '//pre' 'pub(in super::super) struct FooInSuperSuper'
pub(in super::super) struct FooInSuperSuper;
// @has 'foo/a/b/struct.FooInAB.html' '//pre' 'pub(in a::b) struct FooInAB'
pub(in a::b) struct FooInAB;
}
}

0 comments on commit 3daded0

Please sign in to comment.