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 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 {

    }

    // bool literal
    if true && 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 {

    }
}
