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

#![crate_name = "foo"]
#![feature(inherent_associated_types)]
#![allow(incomplete_features)]

//@ !has 'foo/index.html' '//a[@href="struct.FooPublic.html"]/..' 'FooPublic 🔒'
//@ has 'foo/struct.FooPublic.html' '//pre' 'pub struct FooPublic'
pub struct FooPublic;
//@ has 'foo/index.html' '//a[@href="struct.FooJustCrate.html"]/..' 'FooJustCrate 🔒'
//@ has 'foo/struct.FooJustCrate.html' '//pre' 'pub(crate) struct FooJustCrate'
pub(crate) struct FooJustCrate;
//@ has 'foo/index.html' '//a[@href="struct.FooPubCrate.html"]/..' 'FooPubCrate 🔒'
//@ has 'foo/struct.FooPubCrate.html' '//pre' 'pub(crate) struct FooPubCrate'
pub(crate) struct FooPubCrate;
//@ has 'foo/index.html' '//a[@href="struct.FooSelf.html"]/..' 'FooSelf 🔒'
//@ has 'foo/struct.FooSelf.html' '//pre' 'pub(crate) struct FooSelf'
pub(self) struct FooSelf;
//@ has 'foo/index.html' '//a[@href="struct.FooInSelf.html"]/..' 'FooInSelf 🔒'
//@ has 'foo/struct.FooInSelf.html' '//pre' 'pub(crate) struct FooInSelf'
pub(in self) struct FooInSelf;
//@ has 'foo/index.html' '//a[@href="struct.FooPriv.html"]/..' 'FooPriv 🔒'
//@ has 'foo/struct.FooPriv.html' '//pre' 'pub(crate) struct FooPriv'
struct FooPriv;

//@ !has 'foo/index.html' '//a[@href="pub_mod/index.html"]/..' 'pub_mod 🔒'
pub mod pub_mod {}

//@ has 'foo/index.html' '//a[@href="pub_crate_mod/index.html"]/..' 'pub_crate_mod 🔒'
pub(crate) mod pub_crate_mod {}

//@ has 'foo/index.html' '//a[@href="a/index.html"]/..' 'a 🔒'
mod a {
    //@ has 'foo/a/index.html' '//a[@href="struct.FooASuper.html"]/..' 'FooASuper 🔒'
    //@ has 'foo/a/struct.FooASuper.html' '//pre' 'pub(crate) struct FooASuper'
    pub(super) struct FooASuper;
    //@ has 'foo/a/index.html' '//a[@href="struct.FooAInSuper.html"]/..' 'FooAInSuper 🔒'
    //@ has 'foo/a/struct.FooAInSuper.html' '//pre' 'pub(crate) struct FooAInSuper'
    pub(in super) struct FooAInSuper;
    //@ has 'foo/a/index.html' '//a[@href="struct.FooAInA.html"]/..' 'FooAInA 🔒'
    //@ has 'foo/a/struct.FooAInA.html' '//pre' 'struct FooAInA'
    //@ !has 'foo/a/struct.FooAInA.html' '//pre' 'pub'
    pub(in a) struct FooAInA;
    //@ has 'foo/a/index.html' '//a[@href="struct.FooAPriv.html"]/..' 'FooAPriv 🔒'
    //@ has 'foo/a/struct.FooAPriv.html' '//pre' 'struct FooAPriv'
    //@ !has 'foo/a/struct.FooAPriv.html' '//pre' 'pub'
    struct FooAPriv;

    //@ has 'foo/a/index.html' '//a[@href="b/index.html"]/..' 'b 🔒'
    mod b {
        //@ has 'foo/a/b/index.html' '//a[@href="struct.FooBSuper.html"]/..' 'FooBSuper 🔒'
        //@ has 'foo/a/b/struct.FooBSuper.html' '//pre' 'pub(super) struct FooBSuper'
        pub(super) struct FooBSuper;
        //@ has 'foo/a/b/index.html' '//a[@href="struct.FooBInSuperSuper.html"]/..' 'FooBInSuperSuper 🔒'
        //@ has 'foo/a/b/struct.FooBInSuperSuper.html' '//pre' 'pub(crate) struct FooBInSuperSuper'
        pub(in super::super) struct FooBInSuperSuper;
        //@ has 'foo/a/b/index.html' '//a[@href="struct.FooBInAB.html"]/..' 'FooBInAB 🔒'
        //@ has 'foo/a/b/struct.FooBInAB.html' '//pre' 'struct FooBInAB'
        //@ !has 'foo/a/b/struct.FooBInAB.html' '//pre' 'pub'
        pub(in a::b) struct FooBInAB;
        //@ has 'foo/a/b/index.html' '//a[@href="struct.FooBPriv.html"]/..' 'FooBPriv 🔒'
        //@ has 'foo/a/b/struct.FooBPriv.html' '//pre' 'struct FooBPriv'
        //@ !has 'foo/a/b/struct.FooBPriv.html' '//pre' 'pub'
        struct FooBPriv;

        //@ !has 'foo/a/b/index.html' '//a[@href="struct.FooBPub.html"]/..' 'FooBPub 🔒'
        //@ has 'foo/a/b/struct.FooBPub.html' '//pre' 'pub struct FooBPub'
        pub struct FooBPub;
    }
}

//@ has 'foo/trait.PubTrait.html' '//pre' 'pub trait PubTrait'
//
//@ has 'foo/trait.PubTrait.html' '//pre' 'type Type;'
//@ !has 'foo/trait.PubTrait.html' '//pre' 'pub type Type;'
//
//@ has 'foo/trait.PubTrait.html' '//pre' 'const CONST: usize;'
//@ !has 'foo/trait.PubTrait.html' '//pre' 'pub const CONST: usize;'
//
//@ has 'foo/trait.PubTrait.html' '//pre' 'fn function();'
//@ !has 'foo/trait.PubTrait.html' '//pre' 'pub fn function();'
//
//@ !has 'foo/index.html' '//a[@href="trait.PubTrait.html"]/..' 'PubTrait 🔒'

pub trait PubTrait {
    type Type;
    const CONST: usize;
    fn function();
}

//@ has 'foo/index.html' '//a[@href="trait.PrivTrait.html"]/..' 'PrivTrait 🔒'
trait PrivTrait {}

//@ has 'foo/struct.FooPublic.html' '//h4[@class="code-header"]' 'type Type'
//@ !has 'foo/struct.FooPublic.html' '//h4[@class="code-header"]' 'pub type Type'
//
//@ has 'foo/struct.FooPublic.html' '//h4[@class="code-header"]' 'const CONST: usize'
//@ !has 'foo/struct.FooPublic.html' '//h4[@class="code-header"]' 'pub const CONST: usize'
//
//@ has 'foo/struct.FooPublic.html' '//h4[@class="code-header"]' 'fn function()'
//@ !has 'foo/struct.FooPublic.html' '//h4[@class="code-header"]' 'pub fn function()'

impl PubTrait for FooPublic {
    type Type = usize;
    const CONST: usize = 0;
    fn function() {}
}

pub struct Assoc;

//@ has foo/struct.Assoc.html
impl Assoc {
    //@ has - '//*[@id="associatedtype.TypePub"]' 'pub type TypePub'
    pub type TypePub = usize;

    //@ has - '//*[@id="associatedtype.TypePriv"]' 'pub(crate) type TypePriv'
    type TypePriv = usize;

    //@ has - '//*[@id="associatedconstant.CONST_PUB"]' 'pub const CONST_PUB'
    pub const CONST_PUB: usize = 0;

    //@ has - '//*[@id="associatedconstant.CONST_PRIV"]' 'pub(crate) const CONST_PRIV'
    const CONST_PRIV: usize = 0;

    //@ has - '//*[@id="method.function_pub"]' 'pub fn function_pub()'
    pub fn function_pub() {}

    //@ has - '//*[@id="method.function_priv"]' 'pub(crate) fn function_priv()'
    fn function_priv() {}
}