#![crate_name = "foo"]

// @has foo/struct.Foo0.html
pub struct Foo0;

impl Foo0 {
    // @has - '//*[@class="stab deprecated"]' 'Deprecated since 1.0.1: fn_with_doc'
    // @hasraw - 'fn_with_doc short'
    // @hasraw - 'fn_with_doc full'
    /// fn_with_doc short
    ///
    /// fn_with_doc full
    #[deprecated(since = "1.0.1", note = "fn_with_doc")]
    pub fn fn_with_doc() {}

    // @has - '//*[@class="stab deprecated"]' 'Deprecated since 1.0.2: fn_without_doc'
    #[deprecated(since = "1.0.2", note = "fn_without_doc")]
    pub fn fn_without_doc() {}
}

pub trait Bar {
    /// fn_empty_with_doc short
    ///
    /// fn_empty_with_doc full
    #[deprecated(since = "1.0.3", note = "fn_empty_with_doc")]
    fn fn_empty_with_doc();

    #[deprecated(since = "1.0.4", note = "fn_empty_without_doc")]
    fn fn_empty_without_doc();

    /// fn_def_with_doc short
    ///
    /// fn_def_with_doc full
    #[deprecated(since = "1.0.5", note = "fn_def_with_doc")]
    fn fn_def_with_doc() {}

    #[deprecated(since = "1.0.6", note = "fn_def_without_doc")]
    fn fn_def_without_doc() {}

    /// fn_def_def_with_doc short
    ///
    /// fn_def_def_with_doc full
    #[deprecated(since = "1.0.7", note = "fn_def_def_with_doc")]
    fn fn_def_def_with_doc() {}

    #[deprecated(since = "1.0.8", note = "fn_def_def_without_doc")]
    fn fn_def_def_without_doc() {}
}

// @has foo/struct.Foo1.html
pub struct Foo1;

impl Bar for Foo1 {
    // @has - '//*[@class="stab deprecated"]' 'Deprecated since 1.0.3: fn_empty_with_doc'
    // @hasraw - 'fn_empty_with_doc_impl short'
    // @hasraw - 'fn_empty_with_doc_impl full'
    /// fn_empty_with_doc_impl short
    ///
    /// fn_empty_with_doc_impl full
    fn fn_empty_with_doc() {}

    // @has - '//*[@class="stab deprecated"]' 'Deprecated since 1.0.4: fn_empty_without_doc'
    fn fn_empty_without_doc() {}

    // @has - '//*[@class="stab deprecated"]' 'Deprecated since 1.0.5: fn_def_with_doc'
    // @hasraw - 'fn_def_with_doc_impl short'
    // @hasraw - 'fn_def_with_doc_impl full'
    /// fn_def_with_doc_impl short
    ///
    /// fn_def_with_doc_impl full
    fn fn_def_with_doc() {}

    // @has - '//*[@class="stab deprecated"]' 'Deprecated since 1.0.6: fn_def_without_doc'
    fn fn_def_without_doc() {}

    // @has - '//*[@class="stab deprecated"]' 'Deprecated since 1.0.7: fn_def_def_with_doc'
    // @hasraw - 'fn_def_def_with_doc short'
    // @!hasraw - 'fn_def_def_with_doc full'

    // @has - '//*[@class="stab deprecated"]' 'Deprecated since 1.0.8: fn_def_def_without_doc'
}

// @has foo/struct.Foo2.html
pub struct Foo2;

impl Bar for Foo2 {
    // @has - '//*[@class="stab deprecated"]' 'Deprecated since 1.0.3: fn_empty_with_doc'
    // @hasraw - 'fn_empty_with_doc short'
    // @!hasraw - 'fn_empty_with_doc full'
    fn fn_empty_with_doc() {}

    // @has - '//*[@class="stab deprecated"]' 'Deprecated since 1.0.4: fn_empty_without_doc'
    // @hasraw - 'fn_empty_without_doc_impl short'
    // @hasraw - 'fn_empty_without_doc_impl full'
    /// fn_empty_without_doc_impl short
    ///
    /// fn_empty_without_doc_impl full
    fn fn_empty_without_doc() {}

    // @has - '//*[@class="stab deprecated"]' 'Deprecated since 1.0.5: fn_def_with_doc'
    // @hasraw - 'fn_def_with_doc short'
    // @!hasraw - 'fn_def_with_doc full'
    fn fn_def_with_doc() {}

    // @has - '//*[@class="stab deprecated"]' 'Deprecated since 1.0.6: fn_def_without_doc'
    // @hasraw - 'fn_def_without_doc_impl short'
    // @hasraw - 'fn_def_without_doc_impl full'
    /// fn_def_without_doc_impl short
    ///
    /// fn_def_without_doc_impl full
    fn fn_def_without_doc() {}

    // @has - '//*[@class="stab deprecated"]' 'Deprecated since 1.0.7: fn_def_def_with_doc'
    // @hasraw - 'fn_def_def_with_doc short'
    // @!hasraw - 'fn_def_def_with_doc full'

    // @has - '//*[@class="stab deprecated"]' 'Deprecated since 1.0.8: fn_def_def_without_doc'
}