// rustfmt-normalize_comments: true
// rustfmt-wrap_comments: true

                                                                       /// A Doc comment
#[AnAttribute]
pub struct Foo {
    #[rustfmt::skip]
    f :   SomeType, // Comment beside a field
    f: SomeType, // Comment beside a field
    // Comment on a field
    #[AnAttribute]
    g: SomeOtherType,
      /// A doc comment on a field
    h: AThirdType,
    pub i: TypeForPublicField
}

// Destructuring
fn foo() {
    S { x: 5,
        ..};
        Struct {..} = Struct { a: 1, b: 4 };
        Struct {      a,     .. } = Struct { a: 1, b: 2, c: 3};
        TupleStruct(a,..,   b) = TupleStruct(1, 2);
        TupleStruct(  ..) = TupleStruct(3, 4);
        TupleStruct(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa, .., bbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) = TupleStruct(1, 2);
}

// #1095
struct S<T: /* comment */> {
    t: T,
}

// #1029
pub struct Foo {
    #[doc(hidden)]
    // This will NOT get deleted!
    bar: String, // hi
}

// #1029
struct X {
    // `x` is an important number.
    #[allow(unused)] // TODO: use
    x: u32,
}

// #410
#[allow(missing_docs)]
pub struct Writebatch<K: Key> {
    #[allow(dead_code)] //only used for holding the internal pointer
    writebatch: RawWritebatch,
    marker: PhantomData<K>,
}

struct Bar;

struct NewType(Type,       OtherType);

struct
NewInt     <T: Copy>(pub i32, SomeType /* inline comment */, T /* sup */


    );

struct Qux<'a,
           N: Clone + 'a,
           E: Clone + 'a,
           G: Labeller<'a, N, E> + GraphWalk<'a, N, E>,
           W: Write + Copy>
(
    AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA, // Comment
    BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB,
    #[AnAttr]
    // Comment
    /// Testdoc
    G,
    pub W,
);

struct Tuple(/*Comment 1*/ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,
             /* Comment 2   */ BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB,);

// With a where-clause and generics.
pub struct Foo<'a, Y: Baz>
    where X: Whatever
{
    f: SomeType, // Comment beside a field
}

struct Baz {

    a: A,  // Comment A
    b: B, // Comment B
    c: C,   // Comment C

}

struct Baz {
    a: A,  // Comment A

    b: B, // Comment B




    c: C,   // Comment C
}

struct Baz {

    a: A,

    b: B,
    c: C,



    
    d: D

}

struct Baz
{
    // Comment A
    a: A,
    
    // Comment B
b: B,
    // Comment C
      c: C,}

// Will this be a one-liner?
struct Tuple(
    A, //Comment
    B
);

pub struct State<F: FnMut() -> time::Timespec> { now: F }

pub struct State<F: FnMut() -> ()> { now: F }

pub struct State<F: FnMut()> { now: F }

struct Palette { /// A map of indices in the palette to a count of pixels in approximately that color
                    foo: i32}

// Splitting a single line comment into a block previously had a misalignment
// when the field had attributes
struct FieldsWithAttributes {
    // Pre Comment
    #[rustfmt::skip] pub host:String, // Post comment BBBBBBBBBBBBBB BBBBBBBBBBBBBBBB BBBBBBBBBBBBBBBB BBBBBBBBBBBBBBBBB BBBBBBBBBBB
    //Another pre comment
    #[attr1]
    #[attr2] pub id: usize // CCCCCCCCCCCCCCCCCCC CCCCCCCCCCCCCCCCCCC CCCCCCCCCCCCCCCC CCCCCCCCCCCCCCCCCC CCCCCCCCCCCCCC CCCCCCCCCCCC
}

struct Deep {
    deeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeep: node::Handle<IdRef<'id, Node<K, V>>,
                                                     Type,
                                                     NodeType>,
}

struct Foo<T>(T);
struct Foo<T>(T) where T: Copy, T: Eq;
struct Foo<T>(TTTTTTTTTTTTTTTTT, UUUUUUUUUUUUUUUUUUUUUUUU, TTTTTTTTTTTTTTTTTTT, UUUUUUUUUUUUUUUUUUU);
struct Foo<T>(TTTTTTTTTTTTTTTTTT, UUUUUUUUUUUUUUUUUUUUUUUU, TTTTTTTTTTTTTTTTTTT) where T: PartialEq;
struct Foo<T>(TTTTTTTTTTTTTTTTT, UUUUUUUUUUUUUUUUUUUUUUUU, TTTTTTTTTTTTTTTTTTTTT) where T: PartialEq;
struct Foo<T>(TTTTTTTTTTTTTTTTT, UUUUUUUUUUUUUUUUUUUUUUUU, TTTTTTTTTTTTTTTTTTT, UUUUUUUUUUUUUUUUUUU) where T: PartialEq;
struct Foo<T>(TTTTTTTTTTTTTTTTT, // Foo
              UUUUUUUUUUUUUUUUUUUUUUUU /* Bar */,
              // Baz
              TTTTTTTTTTTTTTTTTTT,
              // Qux (FIXME #572 - doc comment)
              UUUUUUUUUUUUUUUUUUU);

mod m {
    struct X<T> where T: Sized {
        a: T,
    }
}

struct Foo<T>(TTTTTTTTTTTTTTTTTTT,
              /// Qux
    UUUUUUUUUUUUUUUUUUU);

struct Issue677 {
    pub ptr: *const libc::c_void,
    pub trace: fn(  obj: 
          *const libc::c_void, tracer   : *mut   JSTracer   ),
}

struct Foo {}
struct Foo {
    }
struct Foo {
    // comment
    }
struct Foo {
    // trailing space ->    


    }
struct Foo { /* comment */ }
struct Foo( /* comment */ );

struct LongStruct {
    a: A,
    the_quick_brown_fox_jumps_over_the_lazy_dog:AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,
}

struct Deep {
    deeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeep: node::Handle<IdRef<'id, Node<Key, Value>>,
                                                                         Type,
                                                                         NodeType>,
}

struct Foo<C=()>(String);

// #1364
fn foo() {
    convex_shape.set_point(0, &Vector2f { x: 400.0, y: 100.0 });
    convex_shape.set_point(1, &Vector2f { x: 500.0, y: 70.0 });
    convex_shape.set_point(2, &Vector2f { x: 450.0, y: 100.0 });
    convex_shape.set_point(3, &Vector2f { x: 580.0, y: 150.0 });
}

// Vertical alignment
struct Foo {
    aaaaa: u32, // a

    b: u32, // b
    cc: u32, // cc

    xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx: u32, // 1
    yy: u32, // comment2
    zzz: u32, // comment3

    aaaaaa: u32, // comment4
    bb: u32, // comment5
    // separate
    dd: u32, // comment7
    c: u32, // comment6

    aaaaaaa: u32, /* multi
     * line
     * comment
     */
    b: u32, // hi

    do_not_push_this_comment1: u32, // comment1
    xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx: u32, // 2
    please_do_not_push_this_comment3: u32, // comment3

    do_not_push_this_comment1: u32, // comment1
    // separate
    xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx: u32, // 2
    please_do_not_push_this_comment3: u32, // comment3

    do_not_push_this_comment1: u32, // comment1
    xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx: u32, // 2
    // separate
    please_do_not_push_this_comment3: u32, // comment3
}

// structs with long identifier
struct Loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong {}
struct Looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong {}
struct Loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong {}
struct Loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong { x: i32 }

// structs with visibility, do not duplicate visibility (#2110).
pub(in self) struct Foo{}
pub(super) struct Foo{}
pub(crate) struct Foo{}
pub(in self) struct Foo();
pub(super) struct Foo();
pub(crate) struct Foo();

// #2125
pub struct ReadinessCheckRegistry(Mutex<HashMap<Arc<String>, Box<Fn() -> ReadinessCheck + Sync + Send>>>);

// #2144 unit struct with generics
struct MyBox<T:?Sized>;
struct MyBoxx<T, S> where T: ?Sized, S: Clone;

// #2208
struct Test {
    /// foo
    #[serde(default)]
    pub join: Vec<String>,
    #[serde(default)] pub tls: bool,
}

// #2818
struct Paren((i32)) where i32: Trait;
struct Parens((i32, i32)) where i32: Trait;
