// rustfmt-single_line_let_else_max_width: 100

fn main() {
    // Although this won't compile it still parses so make sure we can format empty else blocks
    let Some(x) = opt else {};

    // let-else may be formatted on a single line if they are "short"
    // and only contain a single expression
    let Some(x) = opt else { return };

    let Some(x) = opt else { return };

    let Some(x) = opt else {
        return;
    };

    let Some(x) = opt else {
        // nope
        return;
    };

    let Some(x) = opt else {
        let y = 1;
        return y;
    };

    let Some(x) = y.foo(
        "abc",
        fairly_long_identifier,
        "def",
        "123456",
        "string",
        "cheese",
    ) else {
        bar()
    };

    let Some(x) = abcdef()
        .foo(
            "abc",
            some_really_really_really_long_ident,
            "ident",
            "123456",
        )
        .bar()
        .baz()
        .qux("fffffffffffffffff")
    else {
        foo_bar()
    };
}

fn with_comments_around_else_keyword() {
    let Some(x) = opt
    /* pre else keyword block-comment */
    else {
        return;
    };

    let Some(x) = opt else
    /* post else keyword block-comment */
    {
        return;
    };

    let Some(x) = opt
    /* pre else keyword block-comment */
    else
    /* post else keyword block-comment */
    {
        return;
    };

    let Some(x) = opt
    // pre else keyword line-comment
    else {
        return;
    };

    let Some(x) = opt else
    // post else keyword line-comment
    {
        return;
    };

    let Some(x) = opt
    // pre else keyword line-comment
    else
    // post else keyword line-comment
    {
        return;
    };
}

fn unbreakable_initializer_expr_pre_formatting_let_else_length_near_max_width() {
    // Pre Formatting:
    // The length of `(indent)let pat = init else block;` is 100 (max_width)
    // Post Formatting:
    // The formatting is left unchanged!
    let Some(x) = some_really_really_really_really_really_really_really_long_name_A else { return };

    // Pre Formatting:
    // The length of `(indent)let pat = init else block;` is 100 (max_width)
    // Post Formatting:
    // The else keyword and opening brace remain on the same line as the initializer expr,
    // and the else block is formatted over multiple lines because we can't fit the
    // else block on the same line as the initializer expr.
    let Some(x) = some_really_really_really_really_really_really_really_long_name___B else {
        return;
    };

    // Pre Formatting:
    // The length of `(indent)let pat = init else block;` is 100 (max_width)
    // Post Formatting:
    // The else keyword and opening brace remain on the same line as the initializer expr,
    // and the else block is formatted over multiple lines because we can't fit the
    // else block on the same line as the initializer expr.
    let Some(x) = some_really_really_really_really_long_name_____C else {
        some_divergent_function()
    };

    // Pre Formatting:
    // The length of `(indent)let pat = init else block;` is 101 (> max_width)
    // Post Formatting:
    // The else keyword and opening brace remain on the same line as the initializer expr,
    // and the else block is formatted over multiple lines because we can't fit the
    // else block on the same line as the initializer expr.
    let Some(x) = some_really_really_really_really_really_really_really_long_name__D else {
        return;
    };
}

fn unbreakable_initializer_expr_pre_formatting_length_up_to_opening_brace_near_max_width() {
    // Pre Formatting:
    // The length of `(indent)let pat = init else {` is 99 (< max_width)
    // Post Formatting:
    // The else keyword and opening brace remain on the same line as the initializer expr,
    // and the else block is formatted over multiple lines because we can't fit the
    // else block on the same line as the initializer expr.
    let Some(x) = some_really_really_really_really_really_really_really_really_long_name___E else {
        return;
    };

    // Pre Formatting:
    // The length of `(indent)let pat = init else {` is 101 (> max_width)
    // Post Formatting:
    // The else keyword and opening brace cannot fit on the same line as the initializer expr.
    // They are formatted on the next line.
    let Some(x) = some_really_really_really_really_really_really_really_really_long_name_____F
    else {
        return;
    };
}

fn unbreakable_initializer_expr_pre_formatting_length_through_initializer_expr_near_max_width() {
    // Pre Formatting:
    // The length of `(indent)let pat = init` is 99 (< max_width)
    // Post Formatting:
    // The else keyword and opening brace cannot fit on the same line as the initializer expr.
    // They are formatted on the next line.
    let Some(x) = some_really_really_really_really_really_really_really_really_really_long_name___G
    else {
        return;
    };

    // Pre Formatting:
    // The length of `(indent)let pat = init` is 100 (max_width)
    // Post Formatting:
    // Break after the `=` and put the initializer expr on it's own line.
    // Because the initializer expr is multi-lined the else is placed on it's own line.
    let Some(x) =
        some_really_really_really_really_really_really_really_really_really_long_name____H
    else {
        return;
    };

    // Pre Formatting:
    // The length of `(indent)let pat = init` is 109 (> max_width)
    // Post Formatting:
    // Break after the `=` and put the initializer expr on it's own line.
    // Because the initializer expr is multi-lined the else is placed on it's own line.
    // The initializer expr has a length of 91, which when indented on the next line
    // The `(indent)init` line has a length of 99. This is the max length that the `init` can be
    // before we start running into max_width issues. I suspect this is because the shape is
    // accounting for the `;` at the end of the `let-else` statement.
    let Some(x) =
        some_really_really_really_really_really_really_really_really_really_really_long_name______I
    else {
        return;
    };

    // Pre Formatting:
    // The length of `(indent)let pat = init` is 110 (> max_width)
    // Post Formatting:
    // Max length issues prevent us from formatting.
    // The initializer expr has a length of 92, which if it would be indented on the next line
    // the `(indent)init` line has a length of 100 which == max_width of 100.
    // One might expect formatting to succeed, but I suspect the reason we hit max_width issues is
    // because the Shape is accounting for the `;` at the end of the `let-else` statement.
    let Some(x) = some_really_really_really_really_really_really_really_really_really_really_really_long_nameJ else {return};
}

fn long_patterns() {
    let Foo {
        x: Bar(..),
        y: FooBar(..),
        z: Baz(..),
    } = opt
    else {
        return;
    };

    // with version=One we don't wrap long array patterns
    let [aaaaaaaaaaaaaaaa, bbbbbbbbbbbbbbb, cccccccccccccccccc, dddddddddddddddddd] = opt else {
        return;
    };

    let ("aaaaaaaaaaaaaaaaaaa"
    | "bbbbbbbbbbbbbbbbb"
    | "cccccccccccccccccccccccc"
    | "dddddddddddddddd"
    | "eeeeeeeeeeeeeeee") = opt
    else {
        return;
    };

    let Some(Ok((Message::ChangeColor(super::color::Color::Rgb(r, g, b)), Point { x, y, z }))) =
        opt
    else {
        return;
    };
}

fn with_trailing_try_operator() {
    // Currently the trailing ? forces the else on the next line
    // This may be revisited in style edition 2024
    let Some(next_bucket) = ranking_rules[cur_ranking_rule_index].next_bucket(
        ctx,
        logger,
        &ranking_rule_universes[cur_ranking_rule_index],
    )?
    else {
        return;
    };

    // Maybe this is a workaround?
    let Ok(Some(next_bucket)) = ranking_rules[cur_ranking_rule_index].next_bucket(
        ctx,
        logger,
        &ranking_rule_universes[cur_ranking_rule_index],
    ) else {
        return;
    };
}

fn issue5901() {
    #[cfg(target_os = "linux")]
    let Some(x) = foo
    else {
        todo!()
    };

    #[cfg(target_os = "linux")]
    // Some comments between attributes and let-else statement
    let Some(x) = foo
    else {
        todo!()
    };

    #[cfg(target_os = "linux")]
    #[cfg(target_arch = "x86_64")]
    let Some(x) = foo
    else {
        todo!()
    };

    // The else block will be multi-lined because attributes and comments before `let`
    // are included when calculating max width
    #[cfg(target_os = "linux")]
    #[cfg(target_arch = "x86_64")]
    // Some comments between attributes and let-else statement
    let Some(x) = foo() else {
        todo!()
    };
}
