[ffigen] Add the ability to cast from a pointer to an interface. (#346)
diff --git a/pkgs/ffigen/lib/src/code_generator/objc_interface.dart b/pkgs/ffigen/lib/src/code_generator/objc_interface.dart index c7cdbea..6b9c4c6 100644 --- a/pkgs/ffigen/lib/src/code_generator/objc_interface.dart +++ b/pkgs/ffigen/lib/src/code_generator/objc_interface.dart
@@ -98,6 +98,11 @@ s.write(' return $name._(other._id, other._lib);\n'); s.write(' }\n\n'); + s.write( + ' static $name castFromPointer($natLib lib, ffi.Pointer<ObjCObject> other) {\n'); + s.write(' return $name._(other, lib);\n'); + s.write(' }\n\n'); + if (isNSString) { builtInFunctions.generateNSStringUtils(w, s); }
diff --git a/pkgs/ffigen/test/header_parser_tests/expected_bindings/_expected_objc_config_bindings.dart b/pkgs/ffigen/test/header_parser_tests/expected_bindings/_expected_objc_config_bindings.dart index cedcffe..3a2029d 100644 --- a/pkgs/ffigen/test/header_parser_tests/expected_bindings/_expected_objc_config_bindings.dart +++ b/pkgs/ffigen/test/header_parser_tests/expected_bindings/_expected_objc_config_bindings.dart
@@ -433,6 +433,10 @@ return Foo._(other._id, other._lib); } + static Foo castFromPointer(NativeLibrary lib, ffi.Pointer<ObjCObject> other) { + return Foo._(other, lib); + } + static Foo new1(NativeLibrary _lib) { final _ret = _lib._objc_msgSend_1(_lib._class_Foo1, _lib._sel_new1); return Foo._(_ret, _lib); @@ -455,6 +459,11 @@ return NSObject._(other._id, other._lib); } + static NSObject castFromPointer( + NativeLibrary lib, ffi.Pointer<ObjCObject> other) { + return NSObject._(other, lib); + } + static void load(NativeLibrary _lib) { _lib._objc_msgSend_0(_lib._class_NSObject1, _lib._sel_load1); } @@ -629,6 +638,11 @@ static NSMethodSignature castFrom<T extends _ObjCWrapper>(T other) { return NSMethodSignature._(other._id, other._lib); } + + static NSMethodSignature castFromPointer( + NativeLibrary lib, ffi.Pointer<ObjCObject> other) { + return NSMethodSignature._(other, lib); + } } typedef NSUInteger = pkg_ffi.UnsignedLong; @@ -640,6 +654,11 @@ return NSString._(other._id, other._lib); } + static NSString castFromPointer( + NativeLibrary lib, ffi.Pointer<ObjCObject> other) { + return NSString._(other, lib); + } + factory NSString(NativeLibrary _lib, String str) { final cstr = str.toNativeUtf8(); final nsstr = stringWithCString_encoding(_lib, cstr.cast(), 4 /* UTF8 */);
diff --git a/pkgs/ffigen/test/header_parser_tests/expected_bindings/_expected_objc_interface_bindings.dart b/pkgs/ffigen/test/header_parser_tests/expected_bindings/_expected_objc_interface_bindings.dart index efb1b93..45201d7 100644 --- a/pkgs/ffigen/test/header_parser_tests/expected_bindings/_expected_objc_interface_bindings.dart +++ b/pkgs/ffigen/test/header_parser_tests/expected_bindings/_expected_objc_interface_bindings.dart
@@ -529,6 +529,10 @@ return Foo._(other._id, other._lib); } + static Foo castFromPointer(NativeLibrary lib, ffi.Pointer<ObjCObject> other) { + return Foo._(other, lib); + } + int get someProperty { return _lib._objc_msgSend_15(_id, _lib._sel_someProperty1); } @@ -589,6 +593,11 @@ return NSObject._(other._id, other._lib); } + static NSObject castFromPointer( + NativeLibrary lib, ffi.Pointer<ObjCObject> other) { + return NSObject._(other, lib); + } + static void load(NativeLibrary _lib) { _lib._objc_msgSend_0(_lib._class_NSObject1, _lib._sel_load1); } @@ -763,6 +772,11 @@ static NSMethodSignature castFrom<T extends _ObjCWrapper>(T other) { return NSMethodSignature._(other._id, other._lib); } + + static NSMethodSignature castFromPointer( + NativeLibrary lib, ffi.Pointer<ObjCObject> other) { + return NSMethodSignature._(other, lib); + } } typedef NSUInteger = pkg_ffi.UnsignedLong; @@ -774,6 +788,11 @@ return NSString._(other._id, other._lib); } + static NSString castFromPointer( + NativeLibrary lib, ffi.Pointer<ObjCObject> other) { + return NSString._(other, lib); + } + factory NSString(NativeLibrary _lib, String str) { final cstr = str.toNativeUtf8(); final nsstr = stringWithCString_encoding(_lib, cstr.cast(), 4 /* UTF8 */);
diff --git a/pkgs/ffigen/test/native_objc_test/cast_bindings.dart b/pkgs/ffigen/test/native_objc_test/cast_bindings.dart new file mode 100644 index 0000000..fcac886 --- /dev/null +++ b/pkgs/ffigen/test/native_objc_test/cast_bindings.dart
@@ -0,0 +1,1276 @@ +// ignore_for_file: camel_case_types, non_constant_identifier_names, unused_element, unused_field + +// AUTO GENERATED FILE, DO NOT EDIT. +// +// Generated by `package:ffigen`. +import 'dart:ffi' as ffi; +import 'package:ffi/ffi.dart' as pkg_ffi; + +/// Tests casting objects +class CastTestObjCLibrary { + /// Holds the symbol lookup function. + final ffi.Pointer<T> Function<T extends ffi.NativeType>(String symbolName) + _lookup; + + /// The symbols are looked up in [dynamicLibrary]. + CastTestObjCLibrary(ffi.DynamicLibrary dynamicLibrary) + : _lookup = dynamicLibrary.lookup; + + /// The symbols are looked up with [lookup]. + CastTestObjCLibrary.fromLookup( + ffi.Pointer<T> Function<T extends ffi.NativeType>(String symbolName) + lookup) + : _lookup = lookup; + + late final ffi.Pointer<ffi.Double> _NSFoundationVersionNumber = + _lookup<ffi.Double>('NSFoundationVersionNumber'); + + double get NSFoundationVersionNumber => _NSFoundationVersionNumber.value; + + set NSFoundationVersionNumber(double value) => + _NSFoundationVersionNumber.value = value; + + late final ffi.Pointer<NSInteger> _NSNotFound = + _lookup<NSInteger>('NSNotFound'); + + int get NSNotFound => _NSNotFound.value; + + set NSNotFound(int value) => _NSNotFound.value = value; + + late final ffi.Pointer<ffi.Double> _kCFCoreFoundationVersionNumber = + _lookup<ffi.Double>('kCFCoreFoundationVersionNumber'); + + double get kCFCoreFoundationVersionNumber => + _kCFCoreFoundationVersionNumber.value; + + set kCFCoreFoundationVersionNumber(double value) => + _kCFCoreFoundationVersionNumber.value = value; + + late final ffi.Pointer<CFIndex> _kCFNotFound = + _lookup<CFIndex>('kCFNotFound'); + + int get kCFNotFound => _kCFNotFound.value; + + set kCFNotFound(int value) => _kCFNotFound.value = value; + + late final ffi.Pointer<CFNullRef> _kCFNull = _lookup<CFNullRef>('kCFNull'); + + CFNullRef get kCFNull => _kCFNull.value; + + set kCFNull(CFNullRef value) => _kCFNull.value = value; + + late final ffi.Pointer<CFAllocatorRef> _kCFAllocatorDefault = + _lookup<CFAllocatorRef>('kCFAllocatorDefault'); + + CFAllocatorRef get kCFAllocatorDefault => _kCFAllocatorDefault.value; + + set kCFAllocatorDefault(CFAllocatorRef value) => + _kCFAllocatorDefault.value = value; + + late final ffi.Pointer<CFAllocatorRef> _kCFAllocatorSystemDefault = + _lookup<CFAllocatorRef>('kCFAllocatorSystemDefault'); + + CFAllocatorRef get kCFAllocatorSystemDefault => + _kCFAllocatorSystemDefault.value; + + set kCFAllocatorSystemDefault(CFAllocatorRef value) => + _kCFAllocatorSystemDefault.value = value; + + late final ffi.Pointer<CFAllocatorRef> _kCFAllocatorMalloc = + _lookup<CFAllocatorRef>('kCFAllocatorMalloc'); + + CFAllocatorRef get kCFAllocatorMalloc => _kCFAllocatorMalloc.value; + + set kCFAllocatorMalloc(CFAllocatorRef value) => + _kCFAllocatorMalloc.value = value; + + late final ffi.Pointer<CFAllocatorRef> _kCFAllocatorMallocZone = + _lookup<CFAllocatorRef>('kCFAllocatorMallocZone'); + + CFAllocatorRef get kCFAllocatorMallocZone => _kCFAllocatorMallocZone.value; + + set kCFAllocatorMallocZone(CFAllocatorRef value) => + _kCFAllocatorMallocZone.value = value; + + late final ffi.Pointer<CFAllocatorRef> _kCFAllocatorNull = + _lookup<CFAllocatorRef>('kCFAllocatorNull'); + + CFAllocatorRef get kCFAllocatorNull => _kCFAllocatorNull.value; + + set kCFAllocatorNull(CFAllocatorRef value) => _kCFAllocatorNull.value = value; + + late final ffi.Pointer<CFAllocatorRef> _kCFAllocatorUseContext = + _lookup<CFAllocatorRef>('kCFAllocatorUseContext'); + + CFAllocatorRef get kCFAllocatorUseContext => _kCFAllocatorUseContext.value; + + set kCFAllocatorUseContext(CFAllocatorRef value) => + _kCFAllocatorUseContext.value = value; + + ffi.Pointer<ObjCSel> _registerName1(String name) { + final cstr = name.toNativeUtf8(); + final sel = _sel_registerName(cstr.cast()); + pkg_ffi.calloc.free(cstr); + return sel; + } + + ffi.Pointer<ObjCSel> _sel_registerName( + ffi.Pointer<pkg_ffi.Char> str, + ) { + return __sel_registerName( + str, + ); + } + + late final __sel_registerNamePtr = _lookup< + ffi.NativeFunction< + ffi.Pointer<ObjCSel> Function( + ffi.Pointer<pkg_ffi.Char>)>>('sel_registerName'); + late final __sel_registerName = __sel_registerNamePtr + .asFunction<ffi.Pointer<ObjCSel> Function(ffi.Pointer<pkg_ffi.Char>)>(); + + ffi.Pointer<ObjCObject> _getClass1(String name) { + final cstr = name.toNativeUtf8(); + final clazz = _objc_getClass(cstr.cast()); + pkg_ffi.calloc.free(cstr); + return clazz; + } + + ffi.Pointer<ObjCObject> _objc_getClass( + ffi.Pointer<pkg_ffi.Char> str, + ) { + return __objc_getClass( + str, + ); + } + + late final __objc_getClassPtr = _lookup< + ffi.NativeFunction< + ffi.Pointer<ObjCObject> Function( + ffi.Pointer<pkg_ffi.Char>)>>('objc_getClass'); + late final __objc_getClass = __objc_getClassPtr.asFunction< + ffi.Pointer<ObjCObject> Function(ffi.Pointer<pkg_ffi.Char>)>(); + + late final ffi.Pointer<ObjCObject> _class_Castaway1 = _getClass1("Castaway"); + late final ffi.Pointer<ObjCObject> _class_NSObject1 = _getClass1("NSObject"); + late final ffi.Pointer<ObjCSel> _sel_load1 = _registerName1("load"); + void _objc_msgSend_0( + ffi.Pointer<ObjCObject> obj, + ffi.Pointer<ObjCSel> sel, + ) { + return __objc_msgSend_0( + obj, + sel, + ); + } + + late final __objc_msgSend_0Ptr = _lookup< + ffi.NativeFunction< + ffi.Void Function( + ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend'); + late final __objc_msgSend_0 = __objc_msgSend_0Ptr.asFunction< + void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>(); + + late final ffi.Pointer<ObjCSel> _sel_initialize1 = + _registerName1("initialize"); + late final ffi.Pointer<ObjCSel> _sel_init1 = _registerName1("init"); + instancetype _objc_msgSend_1( + ffi.Pointer<ObjCObject> obj, + ffi.Pointer<ObjCSel> sel, + ) { + return __objc_msgSend_1( + obj, + sel, + ); + } + + late final __objc_msgSend_1Ptr = _lookup< + ffi.NativeFunction< + instancetype Function( + ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend'); + late final __objc_msgSend_1 = __objc_msgSend_1Ptr.asFunction< + instancetype Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>(); + + late final ffi.Pointer<ObjCSel> _sel_new1 = _registerName1("new"); + late final ffi.Pointer<ObjCSel> _sel_allocWithZone_1 = + _registerName1("allocWithZone:"); + instancetype _objc_msgSend_2( + ffi.Pointer<ObjCObject> obj, + ffi.Pointer<ObjCSel> sel, + ffi.Pointer<_NSZone> zone, + ) { + return __objc_msgSend_2( + obj, + sel, + zone, + ); + } + + late final __objc_msgSend_2Ptr = _lookup< + ffi.NativeFunction< + instancetype Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, + ffi.Pointer<_NSZone>)>>('objc_msgSend'); + late final __objc_msgSend_2 = __objc_msgSend_2Ptr.asFunction< + instancetype Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, + ffi.Pointer<_NSZone>)>(); + + late final ffi.Pointer<ObjCSel> _sel_alloc1 = _registerName1("alloc"); + late final ffi.Pointer<ObjCSel> _sel_dealloc1 = _registerName1("dealloc"); + late final ffi.Pointer<ObjCSel> _sel_finalize1 = _registerName1("finalize"); + late final ffi.Pointer<ObjCSel> _sel_copy1 = _registerName1("copy"); + late final ffi.Pointer<ObjCSel> _sel_mutableCopy1 = + _registerName1("mutableCopy"); + late final ffi.Pointer<ObjCSel> _sel_copyWithZone_1 = + _registerName1("copyWithZone:"); + late final ffi.Pointer<ObjCSel> _sel_mutableCopyWithZone_1 = + _registerName1("mutableCopyWithZone:"); + late final ffi.Pointer<ObjCSel> _sel_instancesRespondToSelector_1 = + _registerName1("instancesRespondToSelector:"); + bool _objc_msgSend_3( + ffi.Pointer<ObjCObject> obj, + ffi.Pointer<ObjCSel> sel, + ffi.Pointer<ObjCSel> aSelector, + ) { + return __objc_msgSend_3( + obj, + sel, + aSelector, + ) != + 0; + } + + late final __objc_msgSend_3Ptr = _lookup< + ffi.NativeFunction< + ffi.Uint8 Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, + ffi.Pointer<ObjCSel>)>>('objc_msgSend'); + late final __objc_msgSend_3 = __objc_msgSend_3Ptr.asFunction< + int Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, + ffi.Pointer<ObjCSel>)>(); + + late final ffi.Pointer<ObjCSel> _sel_conformsToProtocol_1 = + _registerName1("conformsToProtocol:"); + bool _objc_msgSend_4( + ffi.Pointer<ObjCObject> obj, + ffi.Pointer<ObjCSel> sel, + ffi.Pointer<ObjCObject> protocol, + ) { + return __objc_msgSend_4( + obj, + sel, + protocol, + ) != + 0; + } + + late final __objc_msgSend_4Ptr = _lookup< + ffi.NativeFunction< + ffi.Uint8 Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, + ffi.Pointer<ObjCObject>)>>('objc_msgSend'); + late final __objc_msgSend_4 = __objc_msgSend_4Ptr.asFunction< + int Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, + ffi.Pointer<ObjCObject>)>(); + + late final ffi.Pointer<ObjCSel> _sel_methodForSelector_1 = + _registerName1("methodForSelector:"); + IMP _objc_msgSend_5( + ffi.Pointer<ObjCObject> obj, + ffi.Pointer<ObjCSel> sel, + ffi.Pointer<ObjCSel> aSelector, + ) { + return __objc_msgSend_5( + obj, + sel, + aSelector, + ); + } + + late final __objc_msgSend_5Ptr = _lookup< + ffi.NativeFunction< + IMP Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, + ffi.Pointer<ObjCSel>)>>('objc_msgSend'); + late final __objc_msgSend_5 = __objc_msgSend_5Ptr.asFunction< + IMP Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, + ffi.Pointer<ObjCSel>)>(); + + late final ffi.Pointer<ObjCSel> _sel_instanceMethodForSelector_1 = + _registerName1("instanceMethodForSelector:"); + late final ffi.Pointer<ObjCSel> _sel_doesNotRecognizeSelector_1 = + _registerName1("doesNotRecognizeSelector:"); + void _objc_msgSend_6( + ffi.Pointer<ObjCObject> obj, + ffi.Pointer<ObjCSel> sel, + ffi.Pointer<ObjCSel> aSelector, + ) { + return __objc_msgSend_6( + obj, + sel, + aSelector, + ); + } + + late final __objc_msgSend_6Ptr = _lookup< + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, + ffi.Pointer<ObjCSel>)>>('objc_msgSend'); + late final __objc_msgSend_6 = __objc_msgSend_6Ptr.asFunction< + void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, + ffi.Pointer<ObjCSel>)>(); + + late final ffi.Pointer<ObjCSel> _sel_forwardingTargetForSelector_1 = + _registerName1("forwardingTargetForSelector:"); + ffi.Pointer<ObjCObject> _objc_msgSend_7( + ffi.Pointer<ObjCObject> obj, + ffi.Pointer<ObjCSel> sel, + ffi.Pointer<ObjCSel> aSelector, + ) { + return __objc_msgSend_7( + obj, + sel, + aSelector, + ); + } + + late final __objc_msgSend_7Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>, + ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCSel>)>>('objc_msgSend'); + late final __objc_msgSend_7 = __objc_msgSend_7Ptr.asFunction< + ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>, + ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCSel>)>(); + + late final ffi.Pointer<ObjCSel> _sel_forwardInvocation_1 = + _registerName1("forwardInvocation:"); + void _objc_msgSend_8( + ffi.Pointer<ObjCObject> obj, + ffi.Pointer<ObjCSel> sel, + ffi.Pointer<ObjCObject> anInvocation, + ) { + return __objc_msgSend_8( + obj, + sel, + anInvocation, + ); + } + + late final __objc_msgSend_8Ptr = _lookup< + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, + ffi.Pointer<ObjCObject>)>>('objc_msgSend'); + late final __objc_msgSend_8 = __objc_msgSend_8Ptr.asFunction< + void Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>, + ffi.Pointer<ObjCObject>)>(); + + late final ffi.Pointer<ObjCObject> _class_NSMethodSignature1 = + _getClass1("NSMethodSignature"); + late final ffi.Pointer<ObjCSel> _sel_methodSignatureForSelector_1 = + _registerName1("methodSignatureForSelector:"); + ffi.Pointer<ObjCObject> _objc_msgSend_9( + ffi.Pointer<ObjCObject> obj, + ffi.Pointer<ObjCSel> sel, + ffi.Pointer<ObjCSel> aSelector, + ) { + return __objc_msgSend_9( + obj, + sel, + aSelector, + ); + } + + late final __objc_msgSend_9Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>, + ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCSel>)>>('objc_msgSend'); + late final __objc_msgSend_9 = __objc_msgSend_9Ptr.asFunction< + ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>, + ffi.Pointer<ObjCSel>, ffi.Pointer<ObjCSel>)>(); + + late final ffi.Pointer<ObjCSel> _sel_instanceMethodSignatureForSelector_1 = + _registerName1("instanceMethodSignatureForSelector:"); + late final ffi.Pointer<ObjCSel> _sel_allowsWeakReference1 = + _registerName1("allowsWeakReference"); + bool _objc_msgSend_10( + ffi.Pointer<ObjCObject> obj, + ffi.Pointer<ObjCSel> sel, + ) { + return __objc_msgSend_10( + obj, + sel, + ) != + 0; + } + + late final __objc_msgSend_10Ptr = _lookup< + ffi.NativeFunction< + ffi.Uint8 Function( + ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend'); + late final __objc_msgSend_10 = __objc_msgSend_10Ptr.asFunction< + int Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>(); + + late final ffi.Pointer<ObjCSel> _sel_retainWeakReference1 = + _registerName1("retainWeakReference"); + late final ffi.Pointer<ObjCSel> _sel_isSubclassOfClass_1 = + _registerName1("isSubclassOfClass:"); + late final ffi.Pointer<ObjCSel> _sel_resolveClassMethod_1 = + _registerName1("resolveClassMethod:"); + late final ffi.Pointer<ObjCSel> _sel_resolveInstanceMethod_1 = + _registerName1("resolveInstanceMethod:"); + late final ffi.Pointer<ObjCSel> _sel_hash1 = _registerName1("hash"); + int _objc_msgSend_11( + ffi.Pointer<ObjCObject> obj, + ffi.Pointer<ObjCSel> sel, + ) { + return __objc_msgSend_11( + obj, + sel, + ); + } + + late final __objc_msgSend_11Ptr = _lookup< + ffi.NativeFunction< + NSUInteger Function( + ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend'); + late final __objc_msgSend_11 = __objc_msgSend_11Ptr.asFunction< + int Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>(); + + late final ffi.Pointer<ObjCSel> _sel_superclass1 = + _registerName1("superclass"); + late final ffi.Pointer<ObjCSel> _sel_class1 = _registerName1("class"); + late final ffi.Pointer<ObjCObject> _class_NSString1 = _getClass1("NSString"); + late final ffi.Pointer<ObjCSel> _sel_stringWithCString_encoding_1 = + _registerName1("stringWithCString:encoding:"); + ffi.Pointer<ObjCObject> _objc_msgSend_12( + ffi.Pointer<ObjCObject> obj, + ffi.Pointer<ObjCSel> sel, + ffi.Pointer<pkg_ffi.Char> cString, + int enc, + ) { + return __objc_msgSend_12( + obj, + sel, + cString, + enc, + ); + } + + late final __objc_msgSend_12Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer<ObjCObject> Function( + ffi.Pointer<ObjCObject>, + ffi.Pointer<ObjCSel>, + ffi.Pointer<pkg_ffi.Char>, + pkg_ffi.UnsignedInt)>>('objc_msgSend'); + late final __objc_msgSend_12 = __objc_msgSend_12Ptr.asFunction< + ffi.Pointer<ObjCObject> Function(ffi.Pointer<ObjCObject>, + ffi.Pointer<ObjCSel>, ffi.Pointer<pkg_ffi.Char>, int)>(); + + late final ffi.Pointer<ObjCSel> _sel_UTF8String1 = + _registerName1("UTF8String"); + ffi.Pointer<pkg_ffi.Char> _objc_msgSend_13( + ffi.Pointer<ObjCObject> obj, + ffi.Pointer<ObjCSel> sel, + ) { + return __objc_msgSend_13( + obj, + sel, + ); + } + + late final __objc_msgSend_13Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer<pkg_ffi.Char> Function( + ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend'); + late final __objc_msgSend_13 = __objc_msgSend_13Ptr.asFunction< + ffi.Pointer<pkg_ffi.Char> Function( + ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>(); + + late final ffi.Pointer<ObjCSel> _sel_description1 = + _registerName1("description"); + ffi.Pointer<ObjCObject> _objc_msgSend_14( + ffi.Pointer<ObjCObject> obj, + ffi.Pointer<ObjCSel> sel, + ) { + return __objc_msgSend_14( + obj, + sel, + ); + } + + late final __objc_msgSend_14Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer<ObjCObject> Function( + ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend'); + late final __objc_msgSend_14 = __objc_msgSend_14Ptr.asFunction< + ffi.Pointer<ObjCObject> Function( + ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>(); + + late final ffi.Pointer<ObjCSel> _sel_debugDescription1 = + _registerName1("debugDescription"); + late final ffi.Pointer<ObjCSel> _sel_meAsNSObject1 = + _registerName1("meAsNSObject"); + ffi.Pointer<ObjCObject> _objc_msgSend_15( + ffi.Pointer<ObjCObject> obj, + ffi.Pointer<ObjCSel> sel, + ) { + return __objc_msgSend_15( + obj, + sel, + ); + } + + late final __objc_msgSend_15Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer<ObjCObject> Function( + ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend'); + late final __objc_msgSend_15 = __objc_msgSend_15Ptr.asFunction< + ffi.Pointer<ObjCObject> Function( + ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>(); + + late final ffi.Pointer<ObjCSel> _sel_meAsInt1 = _registerName1("meAsInt"); + int _objc_msgSend_16( + ffi.Pointer<ObjCObject> obj, + ffi.Pointer<ObjCSel> sel, + ) { + return __objc_msgSend_16( + obj, + sel, + ); + } + + late final __objc_msgSend_16Ptr = _lookup< + ffi.NativeFunction< + ffi.Int64 Function( + ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>>('objc_msgSend'); + late final __objc_msgSend_16 = __objc_msgSend_16Ptr.asFunction< + int Function(ffi.Pointer<ObjCObject>, ffi.Pointer<ObjCSel>)>(); +} + +abstract class NSComparisonResult { + static const int NSOrderedAscending = -1; + static const int NSOrderedSame = 0; + static const int NSOrderedDescending = 1; +} + +abstract class NSEnumerationOptions { + static const int NSEnumerationConcurrent = 1; + static const int NSEnumerationReverse = 2; +} + +abstract class NSSortOptions { + static const int NSSortConcurrent = 1; + static const int NSSortStable = 16; +} + +abstract class NSQualityOfService { + static const int NSQualityOfServiceUserInteractive = 33; + static const int NSQualityOfServiceUserInitiated = 25; + static const int NSQualityOfServiceUtility = 17; + static const int NSQualityOfServiceBackground = 9; + static const int NSQualityOfServiceDefault = -1; +} + +typedef NSInteger = pkg_ffi.Long; + +class __CFString extends ffi.Opaque {} + +abstract class CFComparisonResult { + static const int kCFCompareLessThan = -1; + static const int kCFCompareEqualTo = 0; + static const int kCFCompareGreaterThan = 1; +} + +typedef CFIndex = pkg_ffi.Long; + +class CFRange extends ffi.Struct { + @CFIndex() + external int location; + + @CFIndex() + external int length; +} + +class __CFNull extends ffi.Opaque {} + +typedef CFNullRef = ffi.Pointer<__CFNull>; + +class __CFAllocator extends ffi.Opaque {} + +typedef CFAllocatorRef = ffi.Pointer<__CFAllocator>; + +class CFAllocatorContext extends ffi.Struct { + @CFIndex() + external int version; + + external ffi.Pointer<ffi.Void> info; + + external CFAllocatorRetainCallBack retain; + + external CFAllocatorReleaseCallBack release; + + external CFAllocatorCopyDescriptionCallBack copyDescription; + + external CFAllocatorAllocateCallBack allocate; + + external CFAllocatorReallocateCallBack reallocate; + + external CFAllocatorDeallocateCallBack deallocate; + + external CFAllocatorPreferredSizeCallBack preferredSize; +} + +typedef CFAllocatorRetainCallBack = ffi.Pointer< + ffi.NativeFunction<ffi.Pointer<ffi.Void> Function(ffi.Pointer<ffi.Void>)>>; +typedef CFAllocatorReleaseCallBack + = ffi.Pointer<ffi.NativeFunction<ffi.Void Function(ffi.Pointer<ffi.Void>)>>; +typedef CFAllocatorCopyDescriptionCallBack = ffi + .Pointer<ffi.NativeFunction<CFStringRef Function(ffi.Pointer<ffi.Void>)>>; +typedef CFStringRef = ffi.Pointer<__CFString>; +typedef CFAllocatorAllocateCallBack = ffi.Pointer< + ffi.NativeFunction< + ffi.Pointer<ffi.Void> Function( + CFIndex, CFOptionFlags, ffi.Pointer<ffi.Void>)>>; +typedef CFOptionFlags = pkg_ffi.UnsignedLong; +typedef CFAllocatorReallocateCallBack = ffi.Pointer< + ffi.NativeFunction< + ffi.Pointer<ffi.Void> Function(ffi.Pointer<ffi.Void>, CFIndex, + CFOptionFlags, ffi.Pointer<ffi.Void>)>>; +typedef CFAllocatorDeallocateCallBack = ffi.Pointer< + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer<ffi.Void>, ffi.Pointer<ffi.Void>)>>; +typedef CFAllocatorPreferredSizeCallBack = ffi.Pointer< + ffi.NativeFunction< + CFIndex Function(CFIndex, CFOptionFlags, ffi.Pointer<ffi.Void>)>>; + +class _ObjCWrapper { + final ffi.Pointer<ObjCObject> _id; + final CastTestObjCLibrary _lib; + _ObjCWrapper._(this._id, this._lib); +} + +class Castaway extends NSObject { + Castaway._(ffi.Pointer<ObjCObject> id, CastTestObjCLibrary lib) + : super._(id, lib); + + static Castaway castFrom<T extends _ObjCWrapper>(T other) { + return Castaway._(other._id, other._lib); + } + + static Castaway castFromPointer( + CastTestObjCLibrary lib, ffi.Pointer<ObjCObject> other) { + return Castaway._(other, lib); + } + + NSObject meAsNSObject() { + final _ret = _lib._objc_msgSend_15(_id, _lib._sel_meAsNSObject1); + return NSObject._(_ret, _lib); + } + + int meAsInt() { + return _lib._objc_msgSend_16(_id, _lib._sel_meAsInt1); + } + + static Castaway new1(CastTestObjCLibrary _lib) { + final _ret = _lib._objc_msgSend_1(_lib._class_Castaway1, _lib._sel_new1); + return Castaway._(_ret, _lib); + } + + static Castaway alloc(CastTestObjCLibrary _lib) { + final _ret = _lib._objc_msgSend_1(_lib._class_Castaway1, _lib._sel_alloc1); + return Castaway._(_ret, _lib); + } +} + +class ObjCSel extends ffi.Opaque {} + +class ObjCObject extends ffi.Opaque {} + +class NSObject extends _ObjCWrapper { + NSObject._(ffi.Pointer<ObjCObject> id, CastTestObjCLibrary lib) + : super._(id, lib); + + static NSObject castFrom<T extends _ObjCWrapper>(T other) { + return NSObject._(other._id, other._lib); + } + + static NSObject castFromPointer( + CastTestObjCLibrary lib, ffi.Pointer<ObjCObject> other) { + return NSObject._(other, lib); + } + + static void load(CastTestObjCLibrary _lib) { + _lib._objc_msgSend_0(_lib._class_NSObject1, _lib._sel_load1); + } + + static void initialize(CastTestObjCLibrary _lib) { + _lib._objc_msgSend_0(_lib._class_NSObject1, _lib._sel_initialize1); + } + + NSObject init() { + final _ret = _lib._objc_msgSend_1(_id, _lib._sel_init1); + return NSObject._(_ret, _lib); + } + + static NSObject new1(CastTestObjCLibrary _lib) { + final _ret = _lib._objc_msgSend_1(_lib._class_NSObject1, _lib._sel_new1); + return NSObject._(_ret, _lib); + } + + static NSObject allocWithZone( + CastTestObjCLibrary _lib, ffi.Pointer<_NSZone> zone) { + final _ret = _lib._objc_msgSend_2( + _lib._class_NSObject1, _lib._sel_allocWithZone_1, zone); + return NSObject._(_ret, _lib); + } + + static NSObject alloc(CastTestObjCLibrary _lib) { + final _ret = _lib._objc_msgSend_1(_lib._class_NSObject1, _lib._sel_alloc1); + return NSObject._(_ret, _lib); + } + + void dealloc() { + _lib._objc_msgSend_0(_id, _lib._sel_dealloc1); + } + + void finalize() { + _lib._objc_msgSend_0(_id, _lib._sel_finalize1); + } + + NSObject copy() { + final _ret = _lib._objc_msgSend_1(_id, _lib._sel_copy1); + return NSObject._(_ret, _lib); + } + + NSObject mutableCopy() { + final _ret = _lib._objc_msgSend_1(_id, _lib._sel_mutableCopy1); + return NSObject._(_ret, _lib); + } + + static NSObject copyWithZone( + CastTestObjCLibrary _lib, ffi.Pointer<_NSZone> zone) { + final _ret = _lib._objc_msgSend_2( + _lib._class_NSObject1, _lib._sel_copyWithZone_1, zone); + return NSObject._(_ret, _lib); + } + + static NSObject mutableCopyWithZone( + CastTestObjCLibrary _lib, ffi.Pointer<_NSZone> zone) { + final _ret = _lib._objc_msgSend_2( + _lib._class_NSObject1, _lib._sel_mutableCopyWithZone_1, zone); + return NSObject._(_ret, _lib); + } + + static bool instancesRespondToSelector( + CastTestObjCLibrary _lib, ffi.Pointer<ObjCSel> aSelector) { + return _lib._objc_msgSend_3(_lib._class_NSObject1, + _lib._sel_instancesRespondToSelector_1, aSelector); + } + + static bool conformsToProtocol(CastTestObjCLibrary _lib, NSObject? protocol) { + return _lib._objc_msgSend_4(_lib._class_NSObject1, + _lib._sel_conformsToProtocol_1, protocol?._id ?? ffi.nullptr); + } + + IMP methodForSelector(ffi.Pointer<ObjCSel> aSelector) { + return _lib._objc_msgSend_5(_id, _lib._sel_methodForSelector_1, aSelector); + } + + static IMP instanceMethodForSelector( + CastTestObjCLibrary _lib, ffi.Pointer<ObjCSel> aSelector) { + return _lib._objc_msgSend_5(_lib._class_NSObject1, + _lib._sel_instanceMethodForSelector_1, aSelector); + } + + void doesNotRecognizeSelector(ffi.Pointer<ObjCSel> aSelector) { + _lib._objc_msgSend_6(_id, _lib._sel_doesNotRecognizeSelector_1, aSelector); + } + + NSObject forwardingTargetForSelector(ffi.Pointer<ObjCSel> aSelector) { + final _ret = _lib._objc_msgSend_7( + _id, _lib._sel_forwardingTargetForSelector_1, aSelector); + return NSObject._(_ret, _lib); + } + + void forwardInvocation(NSObject? anInvocation) { + _lib._objc_msgSend_8( + _id, _lib._sel_forwardInvocation_1, anInvocation?._id ?? ffi.nullptr); + } + + NSMethodSignature methodSignatureForSelector(ffi.Pointer<ObjCSel> aSelector) { + final _ret = _lib._objc_msgSend_9( + _id, _lib._sel_methodSignatureForSelector_1, aSelector); + return NSMethodSignature._(_ret, _lib); + } + + static NSMethodSignature instanceMethodSignatureForSelector( + CastTestObjCLibrary _lib, ffi.Pointer<ObjCSel> aSelector) { + final _ret = _lib._objc_msgSend_9(_lib._class_NSObject1, + _lib._sel_instanceMethodSignatureForSelector_1, aSelector); + return NSMethodSignature._(_ret, _lib); + } + + bool allowsWeakReference() { + return _lib._objc_msgSend_10(_id, _lib._sel_allowsWeakReference1); + } + + bool retainWeakReference() { + return _lib._objc_msgSend_10(_id, _lib._sel_retainWeakReference1); + } + + static bool isSubclassOfClass(CastTestObjCLibrary _lib, NSObject aClass) { + return _lib._objc_msgSend_4( + _lib._class_NSObject1, _lib._sel_isSubclassOfClass_1, aClass._id); + } + + static bool resolveClassMethod( + CastTestObjCLibrary _lib, ffi.Pointer<ObjCSel> sel) { + return _lib._objc_msgSend_3( + _lib._class_NSObject1, _lib._sel_resolveClassMethod_1, sel); + } + + static bool resolveInstanceMethod( + CastTestObjCLibrary _lib, ffi.Pointer<ObjCSel> sel) { + return _lib._objc_msgSend_3( + _lib._class_NSObject1, _lib._sel_resolveInstanceMethod_1, sel); + } + + static int hash(CastTestObjCLibrary _lib) { + return _lib._objc_msgSend_11(_lib._class_NSObject1, _lib._sel_hash1); + } + + static NSObject superclass(CastTestObjCLibrary _lib) { + final _ret = + _lib._objc_msgSend_1(_lib._class_NSObject1, _lib._sel_superclass1); + return NSObject._(_ret, _lib); + } + + static NSObject class1(CastTestObjCLibrary _lib) { + final _ret = _lib._objc_msgSend_1(_lib._class_NSObject1, _lib._sel_class1); + return NSObject._(_ret, _lib); + } + + static NSString description(CastTestObjCLibrary _lib) { + final _ret = + _lib._objc_msgSend_14(_lib._class_NSObject1, _lib._sel_description1); + return NSString._(_ret, _lib); + } + + static NSString debugDescription(CastTestObjCLibrary _lib) { + final _ret = _lib._objc_msgSend_14( + _lib._class_NSObject1, _lib._sel_debugDescription1); + return NSString._(_ret, _lib); + } +} + +typedef instancetype = ffi.Pointer<ObjCObject>; + +class _NSZone extends ffi.Opaque {} + +typedef IMP = ffi.Pointer<ffi.NativeFunction<ffi.Void Function()>>; + +class NSMethodSignature extends _ObjCWrapper { + NSMethodSignature._(ffi.Pointer<ObjCObject> id, CastTestObjCLibrary lib) + : super._(id, lib); + + static NSMethodSignature castFrom<T extends _ObjCWrapper>(T other) { + return NSMethodSignature._(other._id, other._lib); + } + + static NSMethodSignature castFromPointer( + CastTestObjCLibrary lib, ffi.Pointer<ObjCObject> other) { + return NSMethodSignature._(other, lib); + } +} + +typedef NSUInteger = pkg_ffi.UnsignedLong; + +class NSString extends _ObjCWrapper { + NSString._(ffi.Pointer<ObjCObject> id, CastTestObjCLibrary lib) + : super._(id, lib); + + static NSString castFrom<T extends _ObjCWrapper>(T other) { + return NSString._(other._id, other._lib); + } + + static NSString castFromPointer( + CastTestObjCLibrary lib, ffi.Pointer<ObjCObject> other) { + return NSString._(other, lib); + } + + factory NSString(CastTestObjCLibrary _lib, String str) { + final cstr = str.toNativeUtf8(); + final nsstr = stringWithCString_encoding(_lib, cstr.cast(), 4 /* UTF8 */); + pkg_ffi.calloc.free(cstr); + return nsstr; + } + + @override + String toString() => UTF8String().cast<pkg_ffi.Utf8>().toDartString(); + + static NSString stringWithCString_encoding( + CastTestObjCLibrary _lib, ffi.Pointer<pkg_ffi.Char> cString, int enc) { + final _ret = _lib._objc_msgSend_12(_lib._class_NSString1, + _lib._sel_stringWithCString_encoding_1, cString, enc); + return NSString._(_ret, _lib); + } + + ffi.Pointer<pkg_ffi.Char> UTF8String() { + return _lib._objc_msgSend_13(_id, _lib._sel_UTF8String1); + } +} + +extension StringToNSString on String { + NSString toNSString(CastTestObjCLibrary lib) => NSString(lib, this); +} + +const int NSScannedOption = 1; + +const int NSCollectorDisabledOption = 2; + +const int NS_BLOCKS_AVAILABLE = 1; + +const int __COREFOUNDATION_CFAVAILABILITY__ = 1; + +const int __CF_ENUM_FIXED_IS_AVAILABLE = 1; + +const double NSFoundationVersionNumber10_0 = 397.4; + +const double NSFoundationVersionNumber10_1 = 425.0; + +const double NSFoundationVersionNumber10_1_1 = 425.0; + +const double NSFoundationVersionNumber10_1_2 = 425.0; + +const double NSFoundationVersionNumber10_1_3 = 425.0; + +const double NSFoundationVersionNumber10_1_4 = 425.0; + +const double NSFoundationVersionNumber10_2 = 462.0; + +const double NSFoundationVersionNumber10_2_1 = 462.0; + +const double NSFoundationVersionNumber10_2_2 = 462.0; + +const double NSFoundationVersionNumber10_2_3 = 462.0; + +const double NSFoundationVersionNumber10_2_4 = 462.0; + +const double NSFoundationVersionNumber10_2_5 = 462.0; + +const double NSFoundationVersionNumber10_2_6 = 462.0; + +const double NSFoundationVersionNumber10_2_7 = 462.7; + +const double NSFoundationVersionNumber10_2_8 = 462.7; + +const double NSFoundationVersionNumber10_3 = 500.0; + +const double NSFoundationVersionNumber10_3_1 = 500.0; + +const double NSFoundationVersionNumber10_3_2 = 500.3; + +const double NSFoundationVersionNumber10_3_3 = 500.54; + +const double NSFoundationVersionNumber10_3_4 = 500.56; + +const double NSFoundationVersionNumber10_3_5 = 500.56; + +const double NSFoundationVersionNumber10_3_6 = 500.56; + +const double NSFoundationVersionNumber10_3_7 = 500.56; + +const double NSFoundationVersionNumber10_3_8 = 500.56; + +const double NSFoundationVersionNumber10_3_9 = 500.58; + +const double NSFoundationVersionNumber10_4 = 567.0; + +const double NSFoundationVersionNumber10_4_1 = 567.0; + +const double NSFoundationVersionNumber10_4_2 = 567.12; + +const double NSFoundationVersionNumber10_4_3 = 567.21; + +const double NSFoundationVersionNumber10_4_4_Intel = 567.23; + +const double NSFoundationVersionNumber10_4_4_PowerPC = 567.21; + +const double NSFoundationVersionNumber10_4_5 = 567.25; + +const double NSFoundationVersionNumber10_4_6 = 567.26; + +const double NSFoundationVersionNumber10_4_7 = 567.27; + +const double NSFoundationVersionNumber10_4_8 = 567.28; + +const double NSFoundationVersionNumber10_4_9 = 567.29; + +const double NSFoundationVersionNumber10_4_10 = 567.29; + +const double NSFoundationVersionNumber10_4_11 = 567.36; + +const double NSFoundationVersionNumber10_5 = 677.0; + +const double NSFoundationVersionNumber10_5_1 = 677.1; + +const double NSFoundationVersionNumber10_5_2 = 677.15; + +const double NSFoundationVersionNumber10_5_3 = 677.19; + +const double NSFoundationVersionNumber10_5_4 = 677.19; + +const double NSFoundationVersionNumber10_5_5 = 677.21; + +const double NSFoundationVersionNumber10_5_6 = 677.22; + +const double NSFoundationVersionNumber10_5_7 = 677.24; + +const double NSFoundationVersionNumber10_5_8 = 677.26; + +const double NSFoundationVersionNumber10_6 = 751.0; + +const double NSFoundationVersionNumber10_6_1 = 751.0; + +const double NSFoundationVersionNumber10_6_2 = 751.14; + +const double NSFoundationVersionNumber10_6_3 = 751.21; + +const double NSFoundationVersionNumber10_6_4 = 751.29; + +const double NSFoundationVersionNumber10_6_5 = 751.42; + +const double NSFoundationVersionNumber10_6_6 = 751.53; + +const double NSFoundationVersionNumber10_6_7 = 751.53; + +const double NSFoundationVersionNumber10_6_8 = 751.62; + +const double NSFoundationVersionNumber10_7 = 833.1; + +const double NSFoundationVersionNumber10_7_1 = 833.1; + +const double NSFoundationVersionNumber10_7_2 = 833.2; + +const double NSFoundationVersionNumber10_7_3 = 833.24; + +const double NSFoundationVersionNumber10_7_4 = 833.25; + +const double NSFoundationVersionNumber10_8 = 945.0; + +const double NSFoundationVersionNumber10_8_1 = 945.0; + +const double NSFoundationVersionNumber10_8_2 = 945.11; + +const double NSFoundationVersionNumber10_8_3 = 945.16; + +const double NSFoundationVersionNumber10_8_4 = 945.18; + +const int NSFoundationVersionNumber10_9 = 1056; + +const int NSFoundationVersionNumber10_9_1 = 1056; + +const double NSFoundationVersionNumber10_9_2 = 1056.13; + +const double NSFoundationVersionNumber10_10 = 1151.16; + +const double NSFoundationVersionNumber10_10_1 = 1151.16; + +const double NSFoundationVersionNumber10_10_2 = 1152.14; + +const double NSFoundationVersionNumber10_10_3 = 1153.2; + +const double NSFoundationVersionNumber10_10_4 = 1153.2; + +const int NSFoundationVersionNumber10_10_5 = 1154; + +const int NSFoundationVersionNumber10_10_Max = 1199; + +const int NSFoundationVersionNumber10_11 = 1252; + +const double NSFoundationVersionNumber10_11_1 = 1255.1; + +const double NSFoundationVersionNumber10_11_2 = 1256.1; + +const double NSFoundationVersionNumber10_11_3 = 1256.1; + +const int NSFoundationVersionNumber10_11_4 = 1258; + +const int NSFoundationVersionNumber10_11_Max = 1299; + +const int __COREFOUNDATION_CFBASE__ = 1; + +const int TRUE = 1; + +const int FALSE = 0; + +const double kCFCoreFoundationVersionNumber10_0 = 196.4; + +const double kCFCoreFoundationVersionNumber10_0_3 = 196.5; + +const double kCFCoreFoundationVersionNumber10_1 = 226.0; + +const double kCFCoreFoundationVersionNumber10_1_1 = 226.0; + +const double kCFCoreFoundationVersionNumber10_1_2 = 227.2; + +const double kCFCoreFoundationVersionNumber10_1_3 = 227.2; + +const double kCFCoreFoundationVersionNumber10_1_4 = 227.3; + +const double kCFCoreFoundationVersionNumber10_2 = 263.0; + +const double kCFCoreFoundationVersionNumber10_2_1 = 263.1; + +const double kCFCoreFoundationVersionNumber10_2_2 = 263.1; + +const double kCFCoreFoundationVersionNumber10_2_3 = 263.3; + +const double kCFCoreFoundationVersionNumber10_2_4 = 263.3; + +const double kCFCoreFoundationVersionNumber10_2_5 = 263.5; + +const double kCFCoreFoundationVersionNumber10_2_6 = 263.5; + +const double kCFCoreFoundationVersionNumber10_2_7 = 263.5; + +const double kCFCoreFoundationVersionNumber10_2_8 = 263.5; + +const double kCFCoreFoundationVersionNumber10_3 = 299.0; + +const double kCFCoreFoundationVersionNumber10_3_1 = 299.0; + +const double kCFCoreFoundationVersionNumber10_3_2 = 299.0; + +const double kCFCoreFoundationVersionNumber10_3_3 = 299.3; + +const double kCFCoreFoundationVersionNumber10_3_4 = 299.31; + +const double kCFCoreFoundationVersionNumber10_3_5 = 299.31; + +const double kCFCoreFoundationVersionNumber10_3_6 = 299.32; + +const double kCFCoreFoundationVersionNumber10_3_7 = 299.33; + +const double kCFCoreFoundationVersionNumber10_3_8 = 299.33; + +const double kCFCoreFoundationVersionNumber10_3_9 = 299.35; + +const double kCFCoreFoundationVersionNumber10_4 = 368.0; + +const double kCFCoreFoundationVersionNumber10_4_1 = 368.1; + +const double kCFCoreFoundationVersionNumber10_4_2 = 368.11; + +const double kCFCoreFoundationVersionNumber10_4_3 = 368.18; + +const double kCFCoreFoundationVersionNumber10_4_4_Intel = 368.26; + +const double kCFCoreFoundationVersionNumber10_4_4_PowerPC = 368.25; + +const double kCFCoreFoundationVersionNumber10_4_5_Intel = 368.26; + +const double kCFCoreFoundationVersionNumber10_4_5_PowerPC = 368.25; + +const double kCFCoreFoundationVersionNumber10_4_6_Intel = 368.26; + +const double kCFCoreFoundationVersionNumber10_4_6_PowerPC = 368.25; + +const double kCFCoreFoundationVersionNumber10_4_7 = 368.27; + +const double kCFCoreFoundationVersionNumber10_4_8 = 368.27; + +const double kCFCoreFoundationVersionNumber10_4_9 = 368.28; + +const double kCFCoreFoundationVersionNumber10_4_10 = 368.28; + +const double kCFCoreFoundationVersionNumber10_4_11 = 368.31; + +const double kCFCoreFoundationVersionNumber10_5 = 476.0; + +const double kCFCoreFoundationVersionNumber10_5_1 = 476.0; + +const double kCFCoreFoundationVersionNumber10_5_2 = 476.1; + +const double kCFCoreFoundationVersionNumber10_5_3 = 476.13; + +const double kCFCoreFoundationVersionNumber10_5_4 = 476.14; + +const double kCFCoreFoundationVersionNumber10_5_5 = 476.15; + +const double kCFCoreFoundationVersionNumber10_5_6 = 476.17; + +const double kCFCoreFoundationVersionNumber10_5_7 = 476.18; + +const double kCFCoreFoundationVersionNumber10_5_8 = 476.19; + +const double kCFCoreFoundationVersionNumber10_6 = 550.0; + +const double kCFCoreFoundationVersionNumber10_6_1 = 550.0; + +const double kCFCoreFoundationVersionNumber10_6_2 = 550.13; + +const double kCFCoreFoundationVersionNumber10_6_3 = 550.19; + +const double kCFCoreFoundationVersionNumber10_6_4 = 550.29; + +const double kCFCoreFoundationVersionNumber10_6_5 = 550.42; + +const double kCFCoreFoundationVersionNumber10_6_6 = 550.42; + +const double kCFCoreFoundationVersionNumber10_6_7 = 550.42; + +const double kCFCoreFoundationVersionNumber10_6_8 = 550.43; + +const double kCFCoreFoundationVersionNumber10_7 = 635.0; + +const double kCFCoreFoundationVersionNumber10_7_1 = 635.0; + +const double kCFCoreFoundationVersionNumber10_7_2 = 635.15; + +const double kCFCoreFoundationVersionNumber10_7_3 = 635.19; + +const double kCFCoreFoundationVersionNumber10_7_4 = 635.21; + +const double kCFCoreFoundationVersionNumber10_7_5 = 635.21; + +const double kCFCoreFoundationVersionNumber10_8 = 744.0; + +const double kCFCoreFoundationVersionNumber10_8_1 = 744.0; + +const double kCFCoreFoundationVersionNumber10_8_2 = 744.12; + +const double kCFCoreFoundationVersionNumber10_8_3 = 744.18; + +const double kCFCoreFoundationVersionNumber10_8_4 = 744.19; + +const double kCFCoreFoundationVersionNumber10_9 = 855.11; + +const double kCFCoreFoundationVersionNumber10_9_1 = 855.11; + +const double kCFCoreFoundationVersionNumber10_9_2 = 855.14; + +const double kCFCoreFoundationVersionNumber10_10 = 1151.16; + +const double kCFCoreFoundationVersionNumber10_10_1 = 1151.16; + +const int kCFCoreFoundationVersionNumber10_10_2 = 1152; + +const double kCFCoreFoundationVersionNumber10_10_3 = 1153.18; + +const double kCFCoreFoundationVersionNumber10_10_4 = 1153.18; + +const double kCFCoreFoundationVersionNumber10_10_5 = 1153.18; + +const int kCFCoreFoundationVersionNumber10_10_Max = 1199; + +const int kCFCoreFoundationVersionNumber10_11 = 1253; + +const double kCFCoreFoundationVersionNumber10_11_1 = 1255.1; + +const double kCFCoreFoundationVersionNumber10_11_2 = 1256.14; + +const double kCFCoreFoundationVersionNumber10_11_3 = 1256.14; + +const double kCFCoreFoundationVersionNumber10_11_4 = 1258.1; + +const int kCFCoreFoundationVersionNumber10_11_Max = 1299; + +const int ISA_PTRAUTH_DISCRIMINATOR = 27361;
diff --git a/pkgs/ffigen/test/native_objc_test/cast_config.yaml b/pkgs/ffigen/test/native_objc_test/cast_config.yaml new file mode 100644 index 0000000..c080359 --- /dev/null +++ b/pkgs/ffigen/test/native_objc_test/cast_config.yaml
@@ -0,0 +1,12 @@ +name: CastTestObjCLibrary +description: 'Tests casting objects' +language: objc +output: 'test/native_objc_test/cast_bindings.dart' +functions: + exclude: + - '.*' +headers: + entry-points: + - 'test/native_objc_test/cast_test.m' +preamble: | + // ignore_for_file: camel_case_types, non_constant_identifier_names, unused_element, unused_field
diff --git a/pkgs/ffigen/test/native_objc_test/cast_test.dart b/pkgs/ffigen/test/native_objc_test/cast_test.dart new file mode 100644 index 0000000..20f2e18 --- /dev/null +++ b/pkgs/ffigen/test/native_objc_test/cast_test.dart
@@ -0,0 +1,68 @@ +// Copyright (c) 2022, the Dart project authors. Please see the AUTHORS file +// for details. All rights reserved. Use of this source code is governed by a +// BSD-style license that can be found in the LICENSE file. + +// Objective C support is only available on mac. +@TestOn('mac-os') + +import 'dart:ffi'; +import 'dart:io'; + +import 'package:ffigen/ffigen.dart'; +import 'package:path/path.dart' as path; +import 'package:test/test.dart'; +import 'package:yaml/yaml.dart'; +import '../test_utils.dart'; +import 'cast_bindings.dart'; + +void main() { + late Castaway testInstance; + late CastTestObjCLibrary lib; + + group('cast', () { + setUpAll(() { + logWarnings(); + final dylib = File('test/native_objc_test/cast_test.dylib'); + verifySetupFile(dylib); + lib = CastTestObjCLibrary(DynamicLibrary.open(dylib.absolute.path)); + testInstance = Castaway.new1(lib); + }); + + test('generate_bindings', () { + final config = Config.fromYaml(loadYaml( + File(path.join('test', 'native_objc_test', 'cast_config.yaml')) + .readAsStringSync()) as YamlMap); + final library = parse(config); + final file = File( + path.join('test', 'debug_generated', 'cast_test.dart'), + ); + library.generateFile(file); + + try { + final actual = file.readAsStringSync(); + final expected = File(path.join(config.output)).readAsStringSync(); + expect(actual, expected); + if (file.existsSync()) { + file.delete(); + } + } catch (e) { + print('Failed test: Debug generated file: ${file.absolute.path}'); + rethrow; + } + }); + + test('castFrom', () { + final meAsInt = testInstance.meAsInt(); + expect(Castaway.castFrom(testInstance.meAsNSObject()).meAsInt(), meAsInt); + }); + + test('castFromPointer', () { + final meAsInt = testInstance.meAsInt(); + expect( + Castaway.castFromPointer( + lib, Pointer<ObjCObject>.fromAddress(meAsInt)) + .meAsInt(), + meAsInt); + }); + }); +}
diff --git a/pkgs/ffigen/test/native_objc_test/cast_test.m b/pkgs/ffigen/test/native_objc_test/cast_test.m new file mode 100644 index 0000000..363b3ad --- /dev/null +++ b/pkgs/ffigen/test/native_objc_test/cast_test.m
@@ -0,0 +1,25 @@ +// Copyright (c) 2022, the Dart project authors. Please see the AUTHORS file +// for details. All rights reserved. Use of this source code is governed by a +// BSD-style license that can be found in the LICENSE file. + +#import <Foundation/NSObject.h> + +@interface Castaway : NSObject { +} + +- (NSObject *) meAsNSObject; +- (int64_t) meAsInt; + +@end + +@implementation Castaway + +- (NSObject *) meAsNSObject { + return self; +} + +- (int64_t) meAsInt { + return (int64_t) self; +} + +@end
diff --git a/pkgs/ffigen/test/native_objc_test/method_bindings.dart b/pkgs/ffigen/test/native_objc_test/method_bindings.dart index fc3bd60..27920b0 100644 --- a/pkgs/ffigen/test/native_objc_test/method_bindings.dart +++ b/pkgs/ffigen/test/native_objc_test/method_bindings.dart
@@ -707,6 +707,11 @@ return MethodInterface._(other._id, other._lib); } + static MethodInterface castFromPointer( + MethodTestObjCLibrary lib, ffi.Pointer<ObjCObject> other) { + return MethodInterface._(other, lib); + } + int add() { return _lib._objc_msgSend_15(_id, _lib._sel_add1); } @@ -767,6 +772,11 @@ return NSObject._(other._id, other._lib); } + static NSObject castFromPointer( + MethodTestObjCLibrary lib, ffi.Pointer<ObjCObject> other) { + return NSObject._(other, lib); + } + static void load(MethodTestObjCLibrary _lib) { _lib._objc_msgSend_0(_lib._class_NSObject1, _lib._sel_load1); } @@ -945,6 +955,11 @@ static NSMethodSignature castFrom<T extends _ObjCWrapper>(T other) { return NSMethodSignature._(other._id, other._lib); } + + static NSMethodSignature castFromPointer( + MethodTestObjCLibrary lib, ffi.Pointer<ObjCObject> other) { + return NSMethodSignature._(other, lib); + } } typedef NSUInteger = pkg_ffi.UnsignedLong; @@ -957,6 +972,11 @@ return NSString._(other._id, other._lib); } + static NSString castFromPointer( + MethodTestObjCLibrary lib, ffi.Pointer<ObjCObject> other) { + return NSString._(other, lib); + } + factory NSString(MethodTestObjCLibrary _lib, String str) { final cstr = str.toNativeUtf8(); final nsstr = stringWithCString_encoding(_lib, cstr.cast(), 4 /* UTF8 */);
diff --git a/pkgs/ffigen/test/native_objc_test/native_objc_test_bindings.dart b/pkgs/ffigen/test/native_objc_test/native_objc_test_bindings.dart index b6edcc8..cf75b1c 100644 --- a/pkgs/ffigen/test/native_objc_test/native_objc_test_bindings.dart +++ b/pkgs/ffigen/test/native_objc_test/native_objc_test_bindings.dart
@@ -1156,6 +1156,11 @@ return Foo._(other._id, other._lib); } + static Foo castFromPointer( + NativeObjCLibrary lib, ffi.Pointer<ObjCObject> other) { + return Foo._(other, lib); + } + int get intVal { return _lib._objc_msgSend_17(_id, _lib._sel_intVal1); } @@ -1200,6 +1205,11 @@ return NSObject._(other._id, other._lib); } + static NSObject castFromPointer( + NativeObjCLibrary lib, ffi.Pointer<ObjCObject> other) { + return NSObject._(other, lib); + } + static void load(NativeObjCLibrary _lib) { _lib._objc_msgSend_0(_lib._class_NSObject1, _lib._sel_load1); } @@ -1377,6 +1387,11 @@ static NSMethodSignature castFrom<T extends _ObjCWrapper>(T other) { return NSMethodSignature._(other._id, other._lib); } + + static NSMethodSignature castFromPointer( + NativeObjCLibrary lib, ffi.Pointer<ObjCObject> other) { + return NSMethodSignature._(other, lib); + } } class NSString extends NSObject { @@ -1387,6 +1402,11 @@ return NSString._(other._id, other._lib); } + static NSString castFromPointer( + NativeObjCLibrary lib, ffi.Pointer<ObjCObject> other) { + return NSString._(other, lib); + } + factory NSString(NativeObjCLibrary _lib, String str) { final cstr = str.toNativeUtf8(); final nsstr = stringWithCString_encoding(_lib, cstr.cast(), 4 /* UTF8 */);
diff --git a/pkgs/ffigen/test/native_objc_test/nullable_bindings.dart b/pkgs/ffigen/test/native_objc_test/nullable_bindings.dart index 2350bb5..6f6b1b8 100644 --- a/pkgs/ffigen/test/native_objc_test/nullable_bindings.dart +++ b/pkgs/ffigen/test/native_objc_test/nullable_bindings.dart
@@ -622,6 +622,11 @@ return NullableInterface._(other._id, other._lib); } + static NullableInterface castFromPointer( + NullableTestObjCLibrary lib, ffi.Pointer<ObjCObject> other) { + return NullableInterface._(other, lib); + } + static bool isNullWithNullableNSObjectArg( NullableTestObjCLibrary _lib, NSObject? x) { return _lib._objc_msgSend_4(_lib._class_NullableInterface1, @@ -659,6 +664,11 @@ return NSObject._(other._id, other._lib); } + static NSObject castFromPointer( + NullableTestObjCLibrary lib, ffi.Pointer<ObjCObject> other) { + return NSObject._(other, lib); + } + static void load(NullableTestObjCLibrary _lib) { _lib._objc_msgSend_0(_lib._class_NSObject1, _lib._sel_load1); } @@ -837,6 +847,11 @@ static NSMethodSignature castFrom<T extends _ObjCWrapper>(T other) { return NSMethodSignature._(other._id, other._lib); } + + static NSMethodSignature castFromPointer( + NullableTestObjCLibrary lib, ffi.Pointer<ObjCObject> other) { + return NSMethodSignature._(other, lib); + } } typedef NSUInteger = pkg_ffi.UnsignedLong; @@ -849,6 +864,11 @@ return NSString._(other._id, other._lib); } + static NSString castFromPointer( + NullableTestObjCLibrary lib, ffi.Pointer<ObjCObject> other) { + return NSString._(other, lib); + } + factory NSString(NullableTestObjCLibrary _lib, String str) { final cstr = str.toNativeUtf8(); final nsstr = stringWithCString_encoding(_lib, cstr.cast(), 4 /* UTF8 */);
diff --git a/pkgs/ffigen/test/native_objc_test/property_bindings.dart b/pkgs/ffigen/test/native_objc_test/property_bindings.dart index 353d0c1..0b7ecc3 100644 --- a/pkgs/ffigen/test/native_objc_test/property_bindings.dart +++ b/pkgs/ffigen/test/native_objc_test/property_bindings.dart
@@ -673,6 +673,11 @@ return PropertyInterface._(other._id, other._lib); } + static PropertyInterface castFromPointer( + PropertyTestObjCLibrary lib, ffi.Pointer<ObjCObject> other) { + return PropertyInterface._(other, lib); + } + int get readOnlyProperty { return _lib._objc_msgSend_15(_id, _lib._sel_readOnlyProperty1); } @@ -726,6 +731,11 @@ return NSObject._(other._id, other._lib); } + static NSObject castFromPointer( + PropertyTestObjCLibrary lib, ffi.Pointer<ObjCObject> other) { + return NSObject._(other, lib); + } + static void load(PropertyTestObjCLibrary _lib) { _lib._objc_msgSend_0(_lib._class_NSObject1, _lib._sel_load1); } @@ -904,6 +914,11 @@ static NSMethodSignature castFrom<T extends _ObjCWrapper>(T other) { return NSMethodSignature._(other._id, other._lib); } + + static NSMethodSignature castFromPointer( + PropertyTestObjCLibrary lib, ffi.Pointer<ObjCObject> other) { + return NSMethodSignature._(other, lib); + } } typedef NSUInteger = pkg_ffi.UnsignedLong; @@ -916,6 +931,11 @@ return NSString._(other._id, other._lib); } + static NSString castFromPointer( + PropertyTestObjCLibrary lib, ffi.Pointer<ObjCObject> other) { + return NSString._(other, lib); + } + factory NSString(PropertyTestObjCLibrary _lib, String str) { final cstr = str.toNativeUtf8(); final nsstr = stringWithCString_encoding(_lib, cstr.cast(), 4 /* UTF8 */);
diff --git a/pkgs/ffigen/test/native_objc_test/setup.dart b/pkgs/ffigen/test/native_objc_test/setup.dart index 37e5eac..63cf56b 100644 --- a/pkgs/ffigen/test/native_objc_test/setup.dart +++ b/pkgs/ffigen/test/native_objc_test/setup.dart
@@ -33,6 +33,7 @@ } print('Building Dynamic Library for Objective C Native Tests...'); await _buildLib('native_objc_test.m', 'native_objc_test.dylib'); + await _buildLib('cast_test.m', 'cast_test.dylib'); await _buildLib('method_test.m', 'method_test.dylib'); await _buildLib('nullable_test.m', 'nullable_test.dylib'); await _buildLib('property_test.m', 'property_test.dylib');
diff --git a/pkgs/ffigen/test/native_objc_test/string_bindings.dart b/pkgs/ffigen/test/native_objc_test/string_bindings.dart index e1f64f2..d9ea394 100644 --- a/pkgs/ffigen/test/native_objc_test/string_bindings.dart +++ b/pkgs/ffigen/test/native_objc_test/string_bindings.dart
@@ -2638,6 +2638,11 @@ return NSValue._(other._id, other._lib); } + static NSValue castFromPointer( + StringTestObjCLibrary lib, ffi.Pointer<ObjCObject> other) { + return NSValue._(other, lib); + } + void getValue_size(ffi.Pointer<ffi.Void> value, int size) { _lib._objc_msgSend_17(_id, _lib._sel_getValue_size_1, value, size); } @@ -2682,6 +2687,11 @@ return NSObject._(other._id, other._lib); } + static NSObject castFromPointer( + StringTestObjCLibrary lib, ffi.Pointer<ObjCObject> other) { + return NSObject._(other, lib); + } + static void load(StringTestObjCLibrary _lib) { _lib._objc_msgSend_0(_lib._class_NSObject1, _lib._sel_load1); } @@ -2860,6 +2870,11 @@ static NSMethodSignature castFrom<T extends _ObjCWrapper>(T other) { return NSMethodSignature._(other._id, other._lib); } + + static NSMethodSignature castFromPointer( + StringTestObjCLibrary lib, ffi.Pointer<ObjCObject> other) { + return NSMethodSignature._(other, lib); + } } typedef NSUInteger = pkg_ffi.UnsignedLong; @@ -2872,6 +2887,11 @@ return NSString._(other._id, other._lib); } + static NSString castFromPointer( + StringTestObjCLibrary lib, ffi.Pointer<ObjCObject> other) { + return NSString._(other, lib); + } + factory NSString(StringTestObjCLibrary _lib, String str) { final cstr = str.toNativeUtf8(); final nsstr = stringWithCString_encoding(_lib, cstr.cast(), 4 /* UTF8 */); @@ -2938,6 +2958,11 @@ return NSNumber._(other._id, other._lib); } + static NSNumber castFromPointer( + StringTestObjCLibrary lib, ffi.Pointer<ObjCObject> other) { + return NSNumber._(other, lib); + } + @override NSNumber initWithCoder(NSObject? coder) { final _ret = _lib._objc_msgSend_13( @@ -3147,6 +3172,11 @@ return NSEnumerator._(other._id, other._lib); } + static NSEnumerator castFromPointer( + StringTestObjCLibrary lib, ffi.Pointer<ObjCObject> other) { + return NSEnumerator._(other, lib); + } + NSObject nextObject() { final _ret = _lib._objc_msgSend_1(_id, _lib._sel_nextObject1); return NSObject._(_ret, _lib); @@ -3179,6 +3209,11 @@ return NSOrderedCollectionChange._(other._id, other._lib); } + static NSOrderedCollectionChange castFromPointer( + StringTestObjCLibrary lib, ffi.Pointer<ObjCObject> other) { + return NSOrderedCollectionChange._(other, lib); + } + NSObject get object { final _ret = _lib._objc_msgSend_1(_id, _lib._sel_object1); return NSObject._(_ret, _lib); @@ -3242,6 +3277,11 @@ return NSIndexSet._(other._id, other._lib); } + static NSIndexSet castFromPointer( + StringTestObjCLibrary lib, ffi.Pointer<ObjCObject> other) { + return NSIndexSet._(other, lib); + } + static NSIndexSet indexSet(StringTestObjCLibrary _lib) { final _ret = _lib._objc_msgSend_1(_lib._class_NSIndexSet1, _lib._sel_indexSet1); @@ -3451,6 +3491,11 @@ return NSMutableIndexSet._(other._id, other._lib); } + static NSMutableIndexSet castFromPointer( + StringTestObjCLibrary lib, ffi.Pointer<ObjCObject> other) { + return NSMutableIndexSet._(other, lib); + } + void addIndexes(NSObject? indexSet) { _lib._objc_msgSend_8( _id, _lib._sel_addIndexes_1, indexSet?._id ?? ffi.nullptr); @@ -3537,6 +3582,11 @@ return NSOrderedCollectionDifference._(other._id, other._lib); } + static NSOrderedCollectionDifference castFromPointer( + StringTestObjCLibrary lib, ffi.Pointer<ObjCObject> other) { + return NSOrderedCollectionDifference._(other, lib); + } + NSOrderedCollectionDifference initWithChanges(NSObject? changes) { final _ret = _lib._objc_msgSend_13( _id, _lib._sel_initWithChanges_1, changes?._id ?? ffi.nullptr); @@ -3617,6 +3667,11 @@ return NSArray._(other._id, other._lib); } + static NSArray castFromPointer( + StringTestObjCLibrary lib, ffi.Pointer<ObjCObject> other) { + return NSArray._(other, lib); + } + int get count { return _lib._objc_msgSend_11(_id, _lib._sel_count1); } @@ -3670,6 +3725,11 @@ return NSMutableArray._(other._id, other._lib); } + static NSMutableArray castFromPointer( + StringTestObjCLibrary lib, ffi.Pointer<ObjCObject> other) { + return NSMutableArray._(other, lib); + } + void addObject(NSObject anObject) { _lib._objc_msgSend_8(_id, _lib._sel_addObject_1, anObject._id); } @@ -3743,6 +3803,11 @@ return NSItemProvider._(other._id, other._lib); } + static NSItemProvider castFromPointer( + StringTestObjCLibrary lib, ffi.Pointer<ObjCObject> other) { + return NSItemProvider._(other, lib); + } + @override NSItemProvider init() { final _ret = _lib._objc_msgSend_1(_id, _lib._sel_init1); @@ -3928,6 +3993,11 @@ static NSProgress castFrom<T extends _ObjCWrapper>(T other) { return NSProgress._(other._id, other._lib); } + + static NSProgress castFromPointer( + StringTestObjCLibrary lib, ffi.Pointer<ObjCObject> other) { + return NSProgress._(other, lib); + } } typedef NSItemProviderLoadHandler = ffi.Pointer<ObjCObject>; @@ -3981,6 +4051,11 @@ return NSMutableString._(other._id, other._lib); } + static NSMutableString castFromPointer( + StringTestObjCLibrary lib, ffi.Pointer<ObjCObject> other) { + return NSMutableString._(other, lib); + } + void replaceCharactersInRange_withString(NSRange range, NSObject? aString) { _lib._objc_msgSend_79(_id, _lib._sel_replaceCharactersInRange_withString_1, range, aString?._id ?? ffi.nullptr); @@ -4016,6 +4091,11 @@ return NSSimpleCString._(other._id, other._lib); } + static NSSimpleCString castFromPointer( + StringTestObjCLibrary lib, ffi.Pointer<ObjCObject> other) { + return NSSimpleCString._(other, lib); + } + static NSString stringWithCString_encoding( StringTestObjCLibrary _lib, ffi.Pointer<pkg_ffi.Char> cString, int enc) { final _ret = _lib._objc_msgSend_14(_lib._class_NSSimpleCString1, @@ -4044,6 +4124,11 @@ return NSConstantString._(other._id, other._lib); } + static NSConstantString castFromPointer( + StringTestObjCLibrary lib, ffi.Pointer<ObjCObject> other) { + return NSConstantString._(other, lib); + } + static NSString stringWithCString_encoding( StringTestObjCLibrary _lib, ffi.Pointer<pkg_ffi.Char> cString, int enc) { final _ret = _lib._objc_msgSend_14(_lib._class_NSConstantString1, @@ -4072,6 +4157,11 @@ return StringUtil._(other._id, other._lib); } + static StringUtil castFromPointer( + StringTestObjCLibrary lib, ffi.Pointer<ObjCObject> other) { + return StringUtil._(other, lib); + } + static NSString strConcat_with( StringTestObjCLibrary _lib, NSObject? a, NSObject? b) { final _ret = _lib._objc_msgSend_80(
diff --git a/pkgs/ffigen/test/regen.dart b/pkgs/ffigen/test/regen.dart index 675d414..01fb806 100644 --- a/pkgs/ffigen/test/regen.dart +++ b/pkgs/ffigen/test/regen.dart
@@ -75,6 +75,11 @@ ); await _regenConfig( + File('test/native_objc_test/cast_config.yaml'), + File('test/native_objc_test/cast_bindings.dart'), + ); + + await _regenConfig( File('test/native_objc_test/method_config.yaml'), File('test/native_objc_test/method_bindings.dart'), );