// EXTRA_OBJC_SOURCES: objc_instance_variable.m
// REQUIRED_ARGS: -L-framework -LFoundation

import core.attribute : selector;

// Verify that a class with a method with D linkage is considered an externally
// defined class. https://issues.dlang.org/show_bug.cgi?id=19700

extern (Objective-C) extern class NSObject {}

extern (Objective-C)
extern class NSString : NSObject
{
    NSString init() @selector("init");
    static NSString alloc() @selector("alloc");

    const(char)* UTF8String() @selector("UTF8String");

    NSString initWithBytes(
        const(void)* bytes,
        size_t length,
        size_t encoding
    ) @selector("initWithBytes:length:encoding:");

    extern (D) NSString init(string s)
    {
        return initWithBytes(s.ptr, s.length, NSUTF8StringEncoding);
    }

    // adding C and C++ linkages for completeness
    extern (C) void foo() {}
    extern (C++) void bar() {}
}

enum NSUTF8StringEncoding = 4;

void main()
{
    auto s = "hello";
    auto str = NSString.alloc.initWithBytes(s.ptr, s.length, NSUTF8StringEncoding);

    assert(str !is null);
}
