//! This file has been automatically generated by `objc2`'s `header-translator`.
//! DO NOT EDIT
use objc2::__framework_prelude::*;

use crate::*;

extern "C" {
    #[cfg(all(feature = "NSObjCRuntime", feature = "NSString"))]
    pub static NSGenericException: &'static NSExceptionName;
}

extern "C" {
    #[cfg(all(feature = "NSObjCRuntime", feature = "NSString"))]
    pub static NSRangeException: &'static NSExceptionName;
}

extern "C" {
    #[cfg(all(feature = "NSObjCRuntime", feature = "NSString"))]
    pub static NSInvalidArgumentException: &'static NSExceptionName;
}

extern "C" {
    #[cfg(all(feature = "NSObjCRuntime", feature = "NSString"))]
    pub static NSInternalInconsistencyException: &'static NSExceptionName;
}

extern "C" {
    #[cfg(all(feature = "NSObjCRuntime", feature = "NSString"))]
    pub static NSMallocException: &'static NSExceptionName;
}

extern "C" {
    #[cfg(all(feature = "NSObjCRuntime", feature = "NSString"))]
    pub static NSObjectInaccessibleException: &'static NSExceptionName;
}

extern "C" {
    #[cfg(all(feature = "NSObjCRuntime", feature = "NSString"))]
    pub static NSObjectNotAvailableException: &'static NSExceptionName;
}

extern "C" {
    #[cfg(all(feature = "NSObjCRuntime", feature = "NSString"))]
    pub static NSDestinationInvalidException: &'static NSExceptionName;
}

extern "C" {
    #[cfg(all(feature = "NSObjCRuntime", feature = "NSString"))]
    pub static NSPortTimeoutException: &'static NSExceptionName;
}

extern "C" {
    #[cfg(all(feature = "NSObjCRuntime", feature = "NSString"))]
    pub static NSInvalidSendPortException: &'static NSExceptionName;
}

extern "C" {
    #[cfg(all(feature = "NSObjCRuntime", feature = "NSString"))]
    pub static NSInvalidReceivePortException: &'static NSExceptionName;
}

extern "C" {
    #[cfg(all(feature = "NSObjCRuntime", feature = "NSString"))]
    pub static NSPortSendException: &'static NSExceptionName;
}

extern "C" {
    #[cfg(all(feature = "NSObjCRuntime", feature = "NSString"))]
    pub static NSPortReceiveException: &'static NSExceptionName;
}

extern "C" {
    #[cfg(all(feature = "NSObjCRuntime", feature = "NSString"))]
    pub static NSOldStyleException: &'static NSExceptionName;
}

extern "C" {
    #[cfg(all(feature = "NSObjCRuntime", feature = "NSString"))]
    pub static NSInconsistentArchiveException: &'static NSExceptionName;
}

extern_class!(
    #[derive(PartialEq, Eq, Hash)]
    pub struct NSException;

    unsafe impl ClassType for NSException {
        type Super = NSObject;
        type Mutability = InteriorMutable;
    }
);

#[cfg(feature = "NSObject")]
unsafe impl NSCoding for NSException {}

#[cfg(feature = "NSObject")]
unsafe impl NSCopying for NSException {}

unsafe impl NSObjectProtocol for NSException {}

#[cfg(feature = "NSObject")]
unsafe impl NSSecureCoding for NSException {}

extern_methods!(
    unsafe impl NSException {
        #[cfg(all(
            feature = "NSDictionary",
            feature = "NSObjCRuntime",
            feature = "NSString"
        ))]
        #[method_id(@__retain_semantics Other exceptionWithName:reason:userInfo:)]
        pub unsafe fn exceptionWithName_reason_userInfo(
            name: &NSExceptionName,
            reason: Option<&NSString>,
            user_info: Option<&NSDictionary>,
        ) -> Retained<NSException>;

        #[cfg(all(
            feature = "NSDictionary",
            feature = "NSObjCRuntime",
            feature = "NSString"
        ))]
        #[method_id(@__retain_semantics Init initWithName:reason:userInfo:)]
        pub unsafe fn initWithName_reason_userInfo(
            this: Allocated<Self>,
            a_name: &NSExceptionName,
            a_reason: Option<&NSString>,
            a_user_info: Option<&NSDictionary>,
        ) -> Retained<Self>;

        #[cfg(all(feature = "NSObjCRuntime", feature = "NSString"))]
        #[method_id(@__retain_semantics Other name)]
        pub fn name(&self) -> Retained<NSExceptionName>;

        #[cfg(feature = "NSString")]
        #[method_id(@__retain_semantics Other reason)]
        pub fn reason(&self) -> Option<Retained<NSString>>;

        #[cfg(feature = "NSDictionary")]
        #[method_id(@__retain_semantics Other userInfo)]
        pub fn userInfo(&self) -> Option<Retained<NSDictionary>>;

        #[cfg(all(feature = "NSArray", feature = "NSValue"))]
        #[method_id(@__retain_semantics Other callStackReturnAddresses)]
        pub unsafe fn callStackReturnAddresses(&self) -> Retained<NSArray<NSNumber>>;

        #[cfg(all(feature = "NSArray", feature = "NSString"))]
        #[method_id(@__retain_semantics Other callStackSymbols)]
        pub unsafe fn callStackSymbols(&self) -> Retained<NSArray<NSString>>;
    }
);

extern_methods!(
    /// Methods declared on superclass `NSObject`
    unsafe impl NSException {
        #[method_id(@__retain_semantics Init init)]
        pub unsafe fn init(this: Allocated<Self>) -> Retained<Self>;
    }
);

extern_methods!(
    /// NSExceptionRaisingConveniences
    unsafe impl NSException {}
);

pub type NSUncaughtExceptionHandler = TodoFunction;

extern "C" {
    pub fn NSGetUncaughtExceptionHandler() -> *mut NSUncaughtExceptionHandler;
}

extern "C" {
    pub fn NSSetUncaughtExceptionHandler(_: *mut NSUncaughtExceptionHandler);
}

extern "C" {
    #[cfg(feature = "NSString")]
    pub static NSAssertionHandlerKey: &'static NSString;
}

extern_class!(
    #[derive(Debug, PartialEq, Eq, Hash)]
    pub struct NSAssertionHandler;

    unsafe impl ClassType for NSAssertionHandler {
        type Super = NSObject;
        type Mutability = InteriorMutable;
    }
);

unsafe impl NSObjectProtocol for NSAssertionHandler {}

extern_methods!(
    unsafe impl NSAssertionHandler {
        #[method_id(@__retain_semantics Other currentHandler)]
        pub unsafe fn currentHandler() -> Retained<NSAssertionHandler>;
    }
);

extern_methods!(
    /// Methods declared on superclass `NSObject`
    unsafe impl NSAssertionHandler {
        #[method_id(@__retain_semantics Init init)]
        pub unsafe fn init(this: Allocated<Self>) -> Retained<Self>;

        #[method_id(@__retain_semantics New new)]
        pub unsafe fn new() -> Retained<Self>;
    }
);
