//@aux-build:non-exhaustive-enum.rs
#![allow(
    clippy::manual_unwrap_or_default,
    clippy::manual_unwrap_or,
    clippy::redundant_pattern_matching
)]
#![warn(clippy::unneeded_struct_pattern)]

extern crate non_exhaustive_enum;
use non_exhaustive_enum::*;

fn noop() {}

fn main() {
    match Some(114514) {
        Some(v) => v,
        None => 0,
        //~^ unneeded_struct_pattern
    };

    match Some(1919810) {
        Some(v) => v,
        None => 0,
        //~^ unneeded_struct_pattern
    };

    match Some(123456) {
        Some(v) => v,
        None => 0,
    };

    match Some(Some(123456)) {
        Some(Some(v)) => v,
        Some(None) => 0,
        //~^ unneeded_struct_pattern
        None => 0,
        //~^ unneeded_struct_pattern
    };

    if let None = Some(0) {}
    //~^ unneeded_struct_pattern
    if let None = Some(0) {}
    //~^ unneeded_struct_pattern
    if let Some(None) = Some(Some(0)) {}
    //~^ unneeded_struct_pattern
    let None = Some(0) else { panic!() };
    //~^ unneeded_struct_pattern
    let None = Some(0) else { panic!() };
    //~^ unneeded_struct_pattern
    let Some(None) = Some(Some(0)) else { panic!() };
    //~^ unneeded_struct_pattern

    enum Custom {
        HasFields {
            field: i32,
        },
        HasBracketsNoFields {},
        NoBrackets,
        #[non_exhaustive]
        NoBracketsNonExhaustive,
        Init,
    };

    match Custom::Init {
        Custom::HasFields { field: value } => value,
        Custom::HasBracketsNoFields {} => 0,
        Custom::NoBrackets => 0,              //~ unneeded_struct_pattern
        Custom::NoBracketsNonExhaustive => 0, //~ unneeded_struct_pattern
        _ => 0,
    };

    match Custom::Init {
        Custom::HasFields { field: value } => value,
        Custom::HasBracketsNoFields { .. } => 0,
        Custom::NoBrackets => 0,              //~ unneeded_struct_pattern
        Custom::NoBracketsNonExhaustive => 0, //~ unneeded_struct_pattern
        _ => 0,
    };

    match Custom::Init {
        Custom::NoBrackets if true => 0, //~ unneeded_struct_pattern
        _ => 0,
    };

    match Custom::Init {
        Custom::NoBrackets | Custom::NoBracketsNonExhaustive => 0,
        //~^ unneeded_struct_pattern
        //~| unneeded_struct_pattern
        _ => 0,
    };

    if let Custom::HasFields { field: value } = Custom::Init {
        noop();
    }
    if let Custom::HasBracketsNoFields {} = Custom::Init {
        noop();
    }
    if let Custom::HasBracketsNoFields { .. } = Custom::Init {
        noop();
    }
    if let Custom::NoBrackets = Custom::Init {
        //~^ unneeded_struct_pattern
        noop();
    }
    if let Custom::NoBrackets = Custom::Init {
        //~^ unneeded_struct_pattern
        noop();
    }
    if let Custom::NoBrackets | Custom::NoBracketsNonExhaustive = Custom::Init {
        //~^ unneeded_struct_pattern
        //~| unneeded_struct_pattern
        noop();
    }
    if let Custom::NoBracketsNonExhaustive = Custom::Init {
        //~^ unneeded_struct_pattern
        noop();
    }
    if let Custom::NoBracketsNonExhaustive = Custom::Init {
        //~^ unneeded_struct_pattern
        noop();
    }

    let Custom::HasFields { field: value } = Custom::Init else {
        panic!()
    };

    let Custom::HasBracketsNoFields {} = Custom::Init else {
        panic!()
    };

    let Custom::HasBracketsNoFields { .. } = Custom::Init else {
        panic!()
    };
    let Custom::NoBrackets = Custom::Init else { panic!() }; //~ unneeded_struct_pattern

    let Custom::NoBrackets = Custom::Init else {
        //~^ unneeded_struct_pattern
        panic!()
    };
    let Custom::NoBracketsNonExhaustive = Custom::Init else {
        //~^ unneeded_struct_pattern
        panic!()
    };
    let Custom::NoBracketsNonExhaustive = Custom::Init else {
        //~^ unneeded_struct_pattern
        panic!()
    };

    enum Refutable {
        Variant,
    }

    fn pat_in_fn_param_1(Refutable::Variant: Refutable) {} //~ unneeded_struct_pattern
    fn pat_in_fn_param_2(Refutable::Variant: Refutable) {} //~ unneeded_struct_pattern

    for Refutable::Variant in [] {} //~ unneeded_struct_pattern
    for Refutable::Variant in [] {} //~ unneeded_struct_pattern
}

fn external_crate() {
    use ExtNonExhaustiveVariant::*;

    match ExhaustiveUnit {
        // Expected
        ExhaustiveUnit => 0,
        _ => 0,
    };

    match ExhaustiveUnit {
        // Exhaustive variant
        ExhaustiveUnit => 0, //~ unneeded_struct_pattern
        _ => 0,
    };

    match ExhaustiveUnit {
        // Exhaustive variant
        ExhaustiveUnit => 0, //~ unneeded_struct_pattern
        _ => 0,
    };

    match ExhaustiveUnit {
        ExhaustiveUnit => 0,
        // vvvvv Non-exhaustive variants, should all be ignored
        Unit { .. } => 0,
        Tuple { 0: field, .. } => field,
        StructNoField { .. } => 0,
        Struct { field, .. } => field,
        _ => 0,
    };
}
