// rustfmt-wrap_comments: true
// rustfmt-normalize_doc_attributes: true

// Only doc = "" attributes should be normalized
//! Example doc attribute comment
//!          Example doc attribute comment with 10 leading spaces
#![doc(
    html_logo_url = "https://www.rust-lang.org/logos/rust-logo-128x128-blk-v2.png",
    html_favicon_url = "https://doc.rust-lang.org/favicon.ico",
    html_root_url = "https://doc.rust-lang.org/nightly/",
    html_playground_url = "https://play.rust-lang.org/",
    test(attr(deny(warnings)))
)]

// Long `#[doc = "..."]`
struct A {
    /// xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
    b: i32,
}

/// The `nodes` and `edges` method each return instantiations of `Cow<[T]>` to
/// leave implementers the freedom to create entirely new vectors or to pass
/// back slices into internally owned vectors.
struct B {
    b: i32,
}

/// Level 1 comment
mod tests {
    /// Level 2 comment
    impl A {
        /// Level 3 comment
        fn f() {
            /// Level 4 comment
            fn g() {}
        }
    }
}

struct C {
    /// item doc attrib comment
    // regular item comment
    b: i32,

    // regular item comment
    /// item doc attrib comment
    c: i32,
}

// non-regression test for regular attributes, from #2647
#[cfg(
    feature = "this_line_is_101_characters_long_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
)]
pub fn foo() {}

// path attrs
#[clippy::bar]
#[clippy::bar(a, b, c)]
pub fn foo() {}

mod issue_2620 {
    #[derive(Debug, StructOpt)]
    #[structopt(about = "Display information about the character on FF Logs")]
    pub struct Params {
        #[structopt(help = "The server the character is on")]
        server: String,
        #[structopt(help = "The character's first name")]
        first_name: String,
        #[structopt(help = "The character's last name")]
        last_name: String,
        #[structopt(
            short = "j",
            long = "job",
            help = "The job to look at",
            parse(try_from_str)
        )]
        job: Option<Job>,
    }
}

// non-regression test for regular attributes, from #2969
#[cfg(not(all(
    feature = "std",
    any(
        target_os = "linux",
        target_os = "android",
        target_os = "netbsd",
        target_os = "dragonfly",
        target_os = "haiku",
        target_os = "emscripten",
        target_os = "solaris",
        target_os = "cloudabi",
        target_os = "macos",
        target_os = "ios",
        target_os = "freebsd",
        target_os = "openbsd",
        target_os = "redox",
        target_os = "fuchsia",
        windows,
        all(target_arch = "wasm32", feature = "stdweb"),
        all(target_arch = "wasm32", feature = "wasm-bindgen"),
    )
)))]
type Os = NoSource;

// use cases from bindgen needing precise control over leading spaces
/// <div rustbindgen accessor></div>
#[repr(C)]
#[derive(Debug, Default, Copy, Clone)]
pub struct ContradictAccessors {
    ///<foo>no leading spaces here</foo>
    pub mBothAccessors: ::std::os::raw::c_int,
    /// <div rustbindgen accessor="false"></div>
    pub mNoAccessors: ::std::os::raw::c_int,
    /// <div rustbindgen accessor="unsafe"></div>
    pub mUnsafeAccessors: ::std::os::raw::c_int,
    /// <div rustbindgen accessor="immutable"></div>
    pub mImmutableAccessor: ::std::os::raw::c_int,
}

/// \brief          MPI structure
#[repr(C)]
#[derive(Debug, Copy, Clone)]
pub struct mbedtls_mpi {
    ///<  integer sign
    pub s: ::std::os::raw::c_int,
    ///<  total # of limbs
    pub n: ::std::os::raw::c_ulong,
    ///<  pointer to limbs
    pub p: *mut mbedtls_mpi_uint,
}
