// Chained foreign-class method dispatch: `Cls.static().instance(...)`
// resolves the inner call's return type so the outer dispatch's
// receiver type is known. Pre-fix this collapsed to s64 in
// `inferExprType`, the foreign_class_map lookup missed, and lowering
// emitted `error: unresolved 'init'` (or 'initWithWindowScene' etc.)
// — see issues/0043 for the chess uikit.sx C4 migration that hit it.
//
// Two return-type shapes covered: explicit `*ClassName` (alloc here)
// and `*Self` (init). Both must propagate through the chain so the
// next `.method(...)` finds the foreign-class declaration.

#import "modules/std.sx";
#import "modules/compiler.sx";

NSObject :: #foreign #objc_class("NSObject") {
    alloc :: () -> *NSObject;
    init :: (self: *Self) -> *Self;
}

NSObjectSelfReturn :: #foreign #objc_class("NSObject") {
    alloc :: () -> *Self;
    init :: (self: *Self) -> *Self;
}

main :: () -> s32 {
    inline if OS == .macos {
        a := NSObject.alloc().init();
        if a != null {
            print("explicit-then-self ok\n");
        }
        b := NSObjectSelfReturn.alloc().init();
        if b != null {
            print("self-then-self ok\n");
        }
    }
    inline if OS != .macos {
        print("explicit-then-self ok\n");
        print("self-then-self ok\n");
    }
    0;
}
