// rustfmt-edition: 2024

fn main() {
    if let x = x
        && x
    {}

    if xxx && let x = x {}

    if aaaaaaaaaaaaaaaaaaaaa
        && aaaaaaaaaaaaaaa
        && aaaaaaaaa
        && let Some(x) = xxxxxxxxxxxx
        && aaaaaaa
        && let None = aaaaaaaaaa
    {}

    if aaaaaaaaaaaaaaaaaaaaa
        && aaaaaaaaaaaaaaa
        && aaaaaaaaa
        && let Some(x) = xxxxxxxxxxxx
        && aaaaaaa
        && let None = aaaaaaaaaa
    {}

    if let Some(Struct { x: TS(1, 2) }) = path::to::<_>(hehe)
        && let [Simple, people] = /* get ready */
            create_universe(/* hi */ GreatPowers)
                .initialize_badminton()
                .populate_swamps()
        && let everybody = (Loops {
            hi, /*hi*/
            ..loopy()
        })
        && summons::triumphantly()
    {
        todo!()
    }

    if let XXXXXXXXX {
        xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx,
        yyyyyyyyyyyyy,
        zzzzzzzzzzzzz,
    } = xxxxxxx()
        && let Foo = bar()
    {
        todo!()
    }
}

fn test_single_line_let_chain() {
    // first item in let-chain is an ident
    if a && let Some(b) = foo() {}

    // first item in let-chain is a bool literal
    if true && let Some(x) = y {}

    // first item in let-chain is a unary ! with an ident
    let unary_not = if !from_hir_call && let Some(p) = parent {};

    // first item in let-chain is a unary * with an ident
    let unary_deref = if *some_deref && let Some(p) = parent {};

    // first item in let-chain is a unary - (neg) with an ident
    let unary_neg = if -some_ident && let Some(p) = parent {};

    // first item in let-chain is a try (?) with an ident
    let try_ = if some_try? && let Some(p) = parent {};

    // first item in let-chain is an ident wrapped in parens
    let in_parens = if (some_ident) && let Some(p) = parent {};

    // first item in let-chain is a ref & with an ident
    let _ref = if &some_ref && let Some(p) = parent {};

    // first item in let-chain is a ref &mut with an ident
    let mut_ref = if &mut some_ref && let Some(p) = parent {};

    // chain unary ref and try
    let chain_of_unary_ref_and_try = if !&*some_ref? && let Some(p) = parent {};
}

fn test_multi_line_let_chain() {
    // Can only single line the let-chain if the first item is an ident
    if let Some(x) = y
        && a
    {}

    // More than one let-chain must be formatted on multiple lines
    if let Some(x) = y
        && let Some(a) = b
    {}

    // The ident isn't long enough so we don't wrap the first let-chain
    if a && let Some(x) = y
        && let Some(a) = b
    {}

    // The ident is long enough so both let-chains are wrapped
    if aaa
        && let Some(x) = y
        && let Some(a) = b
    {}

    // function call
    if a()
        && let Some(x) = y
    {}

    // cast to a bool
    if 1 as bool
        && let Some(x) = y
    {}

    // matches! macro call
    if matches!(a, some_type)
        && let Some(x) = y
    {}

    // block expression returning bool
    if { true }
        && let Some(x) = y
    {}

    // field access
    if a.x
        && let Some(x) = y
    {}
}
