1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
//! A public module that is always included in the crate.

/// A public struct that is always included in the crate.
#[cfg_attr(feature = "copy", derive(Copy))]
pub struct A {
    /// A public field that is always included in the crate.
    pub a: u8,

    #[cfg(feature = "foo")]
    /// A public field that is only included in the crate with feature `foo`.
    pub foo: u8,

    #[cfg(all(feature = "foo", feature = "bar"))]
    /// A public field that is only included in the crate with features `foo` and `bar`.
    pub foobar: u8,
}

/// A public function that is always included in the crate.
pub fn a() {
}

#[cfg(feature = "foo")]
/// A public function that is only included in the crate with feature `foo`.
pub fn foo() {
}

#[cfg(all(feature = "foo", feature = "bar"))]
/// A public function that is only included in the crate with features `foo` and `bar`.
pub fn foobar() {
}

/// A public trait that is always included in the crate.
pub trait ATrait {
    #[cfg(feature = "foo")]
    /// A trait method that is only included in the crate with feature `foo`.
    fn foo(&self) {
    }

    #[cfg(all(feature = "foo", feature = "bar"))]
    /// A trait method that is only included in the crate with features `foo` and `bar`.
    fn foobar(&self) {
    }
}

#[cfg(feature = "foo")]
/// A public trait that is only included in the crate with feature `foo`.
pub trait FooTrait {
    /// A trait method that is always included in the crate.
    /// (if the parent trait is)
    fn foo(&self) {
    }

    #[cfg(feature = "bar")]
    /// A trait method that is only included in the crate with feature `bar`.
    /// (if the parent trait is)
    fn foobar(&self) {
    }
}

#[cfg(all(feature = "foo", feature = "bar"))]
/// A public trait that is only included in the crate with features `foo` and `bar`.
pub trait FooBarTrait {
    /// A trait method impl that is always included in the crate.
    /// (if the parent trait is)
    fn foo(&self) {
    }

    /// A trait method impl that is always included in the crate.
    /// (if the parent trait is)
    fn foobar(&self) {
    }
}

/// Some impls (from `a`) that are always included in the crate.
impl A {
    /// A public method that is always included in the crate.
    pub fn a(&self) {
    }

    #[cfg(feature = "foo")]
    /// A public method that is only included in the crate with feature `foo`.
    pub fn foo(&self) {
    }

    #[cfg(all(feature = "foo", feature = "bar"))]
    /// A public method that is only included in the crate with features `foo` and `bar`.
    pub fn foobar2(&self) {
    }
}

/// A trait impl that is always included in the crate.
impl ATrait for A {
    #[cfg(feature = "foo")]
    /// A trait method impl that is only included in the crate with feature `foo`.
    fn foo(&self) {
    }

    #[cfg(all(feature = "foo", feature = "bar"))]
    /// A trait method impl that is only included in the crate with features `foo` and `bar`.
    fn foobar(&self) {
    }
}

#[cfg(feature = "foo")]
/// A trait impl that is only included in the crate with feature `foo`.
impl FooTrait for A {
    /// A trait method impl that is always included in the crate.
    /// (if the parent trait is)
    fn foo(&self) {
    }

    #[cfg(feature = "bar")]
    /// A trait method impl that is only included in the crate with feature `bar`.
    /// (if the parent trait is)
    fn foobar(&self) {
    }
}

#[cfg(all(feature = "foo", feature = "bar"))]
/// A trait impl that is only included in the crate with features `foo` and `bar`.
impl FooBarTrait for A {
    /// A trait method impl that is always included in the crate.
    /// (if the parent trait is)
    fn foo(&self) {
    }

    /// A trait method impl that is always included in the crate.
    /// (if the parent trait is)
    fn foobar(&self) {
    }
}