From 08bfea5c74190bf4e9ccdb5ed9ecc8f38a6c13d7 Mon Sep 17 00:00:00 2001 From: Liam Appelbe Date: Thu, 31 Aug 2023 14:54:02 +1200 Subject: [PATCH] Test --- example/swift/swift_api.h | 144 ++++++++++++++--------- lib/src/code_generator/objc_block.dart | 24 ++-- lib/src/config_provider/config_spec.dart | 2 +- test/native_objc_test/block_test.dart | 22 ++-- 4 files changed, 115 insertions(+), 77 deletions(-) diff --git a/example/swift/swift_api.h b/example/swift/swift_api.h index 0928c492..14ebedf9 100644 --- a/example/swift/swift_api.h +++ b/example/swift/swift_api.h @@ -1,4 +1,4 @@ -// Generated by Apple Swift version 5.7.2 (swiftlang-5.7.2.135.5 clang-1400.0.29.51) +// Generated by Apple Swift version 5.8.1 (swiftlang-5.8.0.124.5 clang-1403.0.22.11.100) #ifndef SWIFT_MODULE_SWIFT_H #define SWIFT_MODULE_SWIFT_H #pragma clang diagnostic push @@ -21,7 +21,6 @@ # include #endif -#pragma clang diagnostic ignored "-Wduplicate-method-match" #pragma clang diagnostic ignored "-Wauto-import" #if defined(__OBJC__) #include @@ -30,10 +29,24 @@ #include #include #include +#include +#include +#include +#include #else #include #include #include +#include +#endif +#if defined(__cplusplus) +#if __has_include() +# include +#else +# ifndef __ptrauth_swift_value_witness_function_pointer +# define __ptrauth_swift_value_witness_function_pointer(x) +# endif +#endif #endif #if !defined(SWIFT_TYPEDEFS) @@ -69,53 +82,66 @@ typedef unsigned int swift_uint4 __attribute__((__ext_vector_type__(4))); # if __has_feature(objc_class_property) # define SWIFT_CLASS_PROPERTY(...) __VA_ARGS__ # else -# define SWIFT_CLASS_PROPERTY(...) +# define SWIFT_CLASS_PROPERTY(...) # endif #endif - -#if __has_attribute(objc_runtime_name) -# define SWIFT_RUNTIME_NAME(X) __attribute__((objc_runtime_name(X))) -#else -# define SWIFT_RUNTIME_NAME(X) +#if !defined(SWIFT_RUNTIME_NAME) +# if __has_attribute(objc_runtime_name) +# define SWIFT_RUNTIME_NAME(X) __attribute__((objc_runtime_name(X))) +# else +# define SWIFT_RUNTIME_NAME(X) +# endif #endif -#if __has_attribute(swift_name) -# define SWIFT_COMPILE_NAME(X) __attribute__((swift_name(X))) -#else -# define SWIFT_COMPILE_NAME(X) +#if !defined(SWIFT_COMPILE_NAME) +# if __has_attribute(swift_name) +# define SWIFT_COMPILE_NAME(X) __attribute__((swift_name(X))) +# else +# define SWIFT_COMPILE_NAME(X) +# endif #endif -#if __has_attribute(objc_method_family) -# define SWIFT_METHOD_FAMILY(X) __attribute__((objc_method_family(X))) -#else -# define SWIFT_METHOD_FAMILY(X) +#if !defined(SWIFT_METHOD_FAMILY) +# if __has_attribute(objc_method_family) +# define SWIFT_METHOD_FAMILY(X) __attribute__((objc_method_family(X))) +# else +# define SWIFT_METHOD_FAMILY(X) +# endif #endif -#if __has_attribute(noescape) -# define SWIFT_NOESCAPE __attribute__((noescape)) -#else -# define SWIFT_NOESCAPE +#if !defined(SWIFT_NOESCAPE) +# if __has_attribute(noescape) +# define SWIFT_NOESCAPE __attribute__((noescape)) +# else +# define SWIFT_NOESCAPE +# endif #endif -#if __has_attribute(ns_consumed) -# define SWIFT_RELEASES_ARGUMENT __attribute__((ns_consumed)) -#else -# define SWIFT_RELEASES_ARGUMENT +#if !defined(SWIFT_RELEASES_ARGUMENT) +# if __has_attribute(ns_consumed) +# define SWIFT_RELEASES_ARGUMENT __attribute__((ns_consumed)) +# else +# define SWIFT_RELEASES_ARGUMENT +# endif #endif -#if __has_attribute(warn_unused_result) -# define SWIFT_WARN_UNUSED_RESULT __attribute__((warn_unused_result)) -#else -# define SWIFT_WARN_UNUSED_RESULT +#if !defined(SWIFT_WARN_UNUSED_RESULT) +# if __has_attribute(warn_unused_result) +# define SWIFT_WARN_UNUSED_RESULT __attribute__((warn_unused_result)) +# else +# define SWIFT_WARN_UNUSED_RESULT +# endif #endif -#if __has_attribute(noreturn) -# define SWIFT_NORETURN __attribute__((noreturn)) -#else -# define SWIFT_NORETURN +#if !defined(SWIFT_NORETURN) +# if __has_attribute(noreturn) +# define SWIFT_NORETURN __attribute__((noreturn)) +# else +# define SWIFT_NORETURN +# endif #endif #if !defined(SWIFT_CLASS_EXTRA) -# define SWIFT_CLASS_EXTRA +# define SWIFT_CLASS_EXTRA #endif #if !defined(SWIFT_PROTOCOL_EXTRA) -# define SWIFT_PROTOCOL_EXTRA +# define SWIFT_PROTOCOL_EXTRA #endif #if !defined(SWIFT_ENUM_EXTRA) -# define SWIFT_ENUM_EXTRA +# define SWIFT_ENUM_EXTRA #endif #if !defined(SWIFT_CLASS) # if __has_attribute(objc_subclassing_restricted) @@ -135,28 +161,25 @@ typedef unsigned int swift_uint4 __attribute__((__ext_vector_type__(4))); # define SWIFT_RESILIENT_CLASS_NAMED(SWIFT_NAME) SWIFT_CLASS_NAMED(SWIFT_NAME) # endif #endif - #if !defined(SWIFT_PROTOCOL) # define SWIFT_PROTOCOL(SWIFT_NAME) SWIFT_RUNTIME_NAME(SWIFT_NAME) SWIFT_PROTOCOL_EXTRA # define SWIFT_PROTOCOL_NAMED(SWIFT_NAME) SWIFT_COMPILE_NAME(SWIFT_NAME) SWIFT_PROTOCOL_EXTRA #endif - #if !defined(SWIFT_EXTENSION) # define SWIFT_EXTENSION(M) SWIFT_PASTE(M##_Swift_, __LINE__) #endif - #if !defined(OBJC_DESIGNATED_INITIALIZER) # if __has_attribute(objc_designated_initializer) # define OBJC_DESIGNATED_INITIALIZER __attribute__((objc_designated_initializer)) # else -# define OBJC_DESIGNATED_INITIALIZER +# define OBJC_DESIGNATED_INITIALIZER # endif #endif #if !defined(SWIFT_ENUM_ATTR) -# if defined(__has_attribute) && __has_attribute(enum_extensibility) +# if __has_attribute(enum_extensibility) # define SWIFT_ENUM_ATTR(_extensibility) __attribute__((enum_extensibility(_extensibility))) # else -# define SWIFT_ENUM_ATTR(_extensibility) +# define SWIFT_ENUM_ATTR(_extensibility) # endif #endif #if !defined(SWIFT_ENUM) @@ -185,14 +208,16 @@ typedef unsigned int swift_uint4 __attribute__((__ext_vector_type__(4))); #if !defined(SWIFT_DEPRECATED_MSG) # define SWIFT_DEPRECATED_MSG(...) __attribute__((deprecated(__VA_ARGS__))) #endif -#if __has_feature(attribute_diagnose_if_objc) -# define SWIFT_DEPRECATED_OBJC(Msg) __attribute__((diagnose_if(1, Msg, "warning"))) -#else -# define SWIFT_DEPRECATED_OBJC(Msg) SWIFT_DEPRECATED_MSG(Msg) +#if !defined(SWIFT_DEPRECATED_OBJC) +# if __has_feature(attribute_diagnose_if_objc) +# define SWIFT_DEPRECATED_OBJC(Msg) __attribute__((diagnose_if(1, Msg, "warning"))) +# else +# define SWIFT_DEPRECATED_OBJC(Msg) SWIFT_DEPRECATED_MSG(Msg) +# endif #endif #if defined(__OBJC__) #if !defined(IBSegueAction) -# define IBSegueAction +# define IBSegueAction #endif #endif #if !defined(SWIFT_EXTERN) @@ -205,26 +230,31 @@ typedef unsigned int swift_uint4 __attribute__((__ext_vector_type__(4))); #if !defined(SWIFT_CALL) # define SWIFT_CALL __attribute__((swiftcall)) #endif +#if !defined(SWIFT_INDIRECT_RESULT) +# define SWIFT_INDIRECT_RESULT __attribute__((swift_indirect_result)) +#endif +#if !defined(SWIFT_CONTEXT) +# define SWIFT_CONTEXT __attribute__((swift_context)) +#endif +#if !defined(SWIFT_ERROR_RESULT) +# define SWIFT_ERROR_RESULT __attribute__((swift_error_result)) +#endif #if defined(__cplusplus) -#if !defined(SWIFT_NOEXCEPT) # define SWIFT_NOEXCEPT noexcept -#endif #else -#if !defined(SWIFT_NOEXCEPT) # define SWIFT_NOEXCEPT #endif +#if defined(_WIN32) +#if !defined(SWIFT_IMPORT_STDLIB_SYMBOL) +# define SWIFT_IMPORT_STDLIB_SYMBOL __declspec(dllimport) #endif -#if defined(__cplusplus) -#if !defined(SWIFT_CXX_INT_DEFINED) -#define SWIFT_CXX_INT_DEFINED -namespace swift { -using Int = ptrdiff_t; -using UInt = size_t; -} +#else +#if !defined(SWIFT_IMPORT_STDLIB_SYMBOL) +# define SWIFT_IMPORT_STDLIB_SYMBOL #endif #endif #if defined(__OBJC__) -#if __has_feature(modules) +#if __has_feature(objc_modules) #if __has_warning("-Watimport-in-framework-header") #pragma clang diagnostic ignored "-Watimport-in-framework-header" #endif diff --git a/lib/src/code_generator/objc_block.dart b/lib/src/code_generator/objc_block.dart index a2e1c009..704dd5a1 100644 --- a/lib/src/code_generator/objc_block.dart +++ b/lib/src/code_generator/objc_block.dart @@ -18,12 +18,12 @@ class ObjCBlock extends BindingType { required List argTypes, required ObjCBuiltInFunctions builtInFunctions, }) : this._( - usr: usr, - name: _getBlockName(returnType, argTypes), - returnType: returnType, - argTypes: argTypes, - builtInFunctions: builtInFunctions, - ); + usr: usr, + name: _getBlockName(returnType, argTypes), + returnType: returnType, + argTypes: argTypes, + builtInFunctions: builtInFunctions, + ); ObjCBlock._({ required String usr, @@ -37,11 +37,15 @@ class ObjCBlock extends BindingType { name: name, ); - static final _illegalNameChar = RegExp(r'[^0-9a-zA-Z]'); - static String _typeName(Type type) => - type.toString().replaceAll(_illegalNameChar, ''); // .getDartType(w) + // Generates a human readable name for the block based on the args and return + // type. These names will be pretty verbose and unweildy, but they're at least + // sensible and stable. Users can always add their own typedef with a simpler + // name if necessary. static String _getBlockName(Type returnType, List argTypes) => - 'ObjCBlock_${_typeName(returnType)}_${argTypes.map(_typeName).join('_')}'; + 'ObjCBlock_${[returnType, ...argTypes].map(_typeName).join('_')}'; + static String _typeName(Type type) => + type.toString().replaceAll(_illegalNameChar, ''); + static final _illegalNameChar = RegExp(r'[^0-9a-zA-Z]'); @override BindingString toBindingString(Writer w) { diff --git a/lib/src/config_provider/config_spec.dart b/lib/src/config_provider/config_spec.dart index 3d67be9d..c7ed4061 100644 --- a/lib/src/config_provider/config_spec.dart +++ b/lib/src/config_provider/config_spec.dart @@ -591,7 +591,7 @@ class StringConfigSpec extends ConfigSpec { if (!o.checkType(log: log)) { return false; } - if (!(_regexp?.hasMatch(o.value as String) ?? true)) { + if (_regexp != null && !_regexp.hasMatch(o.value as String)) { if (log) { _logger.severe( "Expected value of key '${o.pathString}' to match pattern $pattern (Input - ${o.value})."); diff --git a/test/native_objc_test/block_test.dart b/test/native_objc_test/block_test.dart index fd8c491f..3728eb12 100644 --- a/test/native_objc_test/block_test.dart +++ b/test/native_objc_test/block_test.dart @@ -15,6 +15,10 @@ import '../test_utils.dart'; import 'block_bindings.dart'; import 'util.dart'; +// The generated block names are stable but verbose, so typedef them. +typedef IntBlock = ObjCBlock_Int32_Int32; +typedef VoidBlock = ObjCBlock_ffiVoid; + void main() { late BlockTestObjCLibrary lib; late void Function(Pointer, Pointer) executeInternalCommand; @@ -52,8 +56,8 @@ void main() { }); test('Block from function pointer', () { - final block = ObjCBlock1.fromFunctionPointer( - lib, Pointer.fromFunction(_add100, 999)); + final block = + IntBlock.fromFunctionPointer(lib, Pointer.fromFunction(_add100, 999)); final blockTester = BlockTester.makeFromBlock_(lib, block); blockTester.pokeBlock(); expect(blockTester.call_(123), 223); @@ -65,7 +69,7 @@ void main() { } test('Block from function', () { - final block = ObjCBlock1.fromFunction(lib, makeAdder(4000)); + final block = IntBlock.fromFunction(lib, makeAdder(4000)); final blockTester = BlockTester.makeFromBlock_(lib, block); blockTester.pokeBlock(); expect(blockTester.call_(123), 4123); @@ -75,7 +79,7 @@ void main() { test('Listener block same thread', () async { final hasRun = Completer(); int value = 0; - final block = ObjCBlock.listener(lib, () { + final block = VoidBlock.listener(lib, () { value = 123; hasRun.complete(); }); @@ -89,7 +93,7 @@ void main() { test('Listener block new thread', () async { final hasRun = Completer(); int value = 0; - final block = ObjCBlock.listener(lib, () { + final block = VoidBlock.listener(lib, () { value = 123; hasRun.complete(); }); @@ -102,8 +106,8 @@ void main() { }); Pointer funcPointerBlockRefCountTest() { - final block = ObjCBlock1.fromFunctionPointer( - lib, Pointer.fromFunction(_add100, 999)); + final block = + IntBlock.fromFunctionPointer(lib, Pointer.fromFunction(_add100, 999)); expect(BlockTester.getBlockRetainCount_(lib, block.pointer.cast()), 1); return block.pointer.cast(); } @@ -115,7 +119,7 @@ void main() { }); Pointer funcBlockRefCountTest() { - final block = ObjCBlock1.fromFunction(lib, makeAdder(4000)); + final block = IntBlock.fromFunction(lib, makeAdder(4000)); expect(BlockTester.getBlockRetainCount_(lib, block.pointer.cast()), 1); return block.pointer.cast(); } @@ -127,7 +131,7 @@ void main() { }); test('Block fields have sensible values', () { - final block = ObjCBlock1.fromFunction(lib, makeAdder(4000)); + final block = IntBlock.fromFunction(lib, makeAdder(4000)); final blockPtr = block.pointer; expect(blockPtr.ref.isa, isNot(0)); expect(blockPtr.ref.flags, isNot(0)); // Set by Block_copy.