diff --git a/.github/workflows/objective_c.yaml b/.github/workflows/objective_c.yaml index d6ca3f834..13120bd62 100644 --- a/.github/workflows/objective_c.yaml +++ b/.github/workflows/objective_c.yaml @@ -31,7 +31,6 @@ jobs: - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 - uses: subosito/flutter-action@44ac965b96f18d999802d4b807e3256d5a3f9fa1 with: - flutter-version: 3.19.0 channel: 'stable' - id: install name: Install dependencies @@ -53,7 +52,6 @@ jobs: - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 - uses: subosito/flutter-action@44ac965b96f18d999802d4b807e3256d5a3f9fa1 with: - flutter-version: 3.19.0 channel: 'stable' - name: Install dependencies run: flutter pub get @@ -90,7 +88,6 @@ jobs: - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 - uses: subosito/flutter-action@44ac965b96f18d999802d4b807e3256d5a3f9fa1 with: - flutter-version: 3.19.0 channel: 'stable' - name: Install dependencies run: flutter pub get diff --git a/pkgs/ffigen/lib/src/code_generator/objc_built_in_functions.dart b/pkgs/ffigen/lib/src/code_generator/objc_built_in_functions.dart index a40c5bf7a..29d07b627 100644 --- a/pkgs/ffigen/lib/src/code_generator/objc_built_in_functions.dart +++ b/pkgs/ffigen/lib/src/code_generator/objc_built_in_functions.dart @@ -2,6 +2,8 @@ // 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 'package:meta/meta.dart'; + import '../code_generator.dart'; import '../config_provider/config_types.dart'; @@ -43,7 +45,8 @@ class ObjCBuiltInFunctions { ObjCImport('UnimplementedOptionalMethodException'); // Keep in sync with pkgs/objective_c/ffigen_objc.yaml. - static const _builtInInterfaces = { + @visibleForTesting + static const builtInInterfaces = { 'DartProxy', 'DartProxyBuilder', 'NSArray', @@ -78,11 +81,13 @@ class ObjCBuiltInFunctions { 'NSValue', 'Protocol', }; - static const _builtInCompounds = { + @visibleForTesting + static const builtInCompounds = { 'NSFastEnumerationState': 'NSFastEnumerationState', '_NSRange': 'NSRange', }; - static const _builtInEnums = { + @visibleForTesting + static const builtInEnums = { 'NSBinarySearchingOptions', 'NSComparisonResult', 'NSDataBase64DecodingOptions', @@ -110,11 +115,11 @@ class ObjCBuiltInFunctions { // TODO(https://github.com/dart-lang/native/issues/1173): Ideally this check // would be based on more than just the name. bool isBuiltInInterface(String name) => - !generateForPackageObjectiveC && _builtInInterfaces.contains(name); + !generateForPackageObjectiveC && builtInInterfaces.contains(name); String? getBuiltInCompoundName(String name) => - generateForPackageObjectiveC ? null : _builtInCompounds[name]; + generateForPackageObjectiveC ? null : builtInCompounds[name]; bool isBuiltInEnum(String name) => - !generateForPackageObjectiveC && _builtInEnums.contains(name); + !generateForPackageObjectiveC && builtInEnums.contains(name); bool isNSObject(String name) => name == 'NSObject'; // We need to load a separate instance of objc_msgSend for each signature. If diff --git a/pkgs/ffigen/pubspec.yaml b/pkgs/ffigen/pubspec.yaml index e4fab2612..b230bddb7 100644 --- a/pkgs/ffigen/pubspec.yaml +++ b/pkgs/ffigen/pubspec.yaml @@ -24,6 +24,7 @@ dependencies: file: ^7.0.0 glob: ^2.0.0 logging: ^1.0.0 + meta: ^1.11.0 package_config: ^2.1.0 path: ^1.8.0 pub_semver: ^2.1.4 @@ -37,7 +38,6 @@ dev_dependencies: dart_flutter_team_lints: ^2.0.0 json_schema: ^5.1.1 leak_tracker: ^10.0.7 - meta: ^1.11.0 objective_c: ^2.1.0 test: ^1.16.2 diff --git a/pkgs/objective_c/CHANGELOG.md b/pkgs/objective_c/CHANGELOG.md index 41c265239..7f16f3208 100644 --- a/pkgs/objective_c/CHANGELOG.md +++ b/pkgs/objective_c/CHANGELOG.md @@ -4,6 +4,10 @@ bindings if an optional method is invoked, and the instance doesn't implement the method. - Dispatch all object/block releases to the main thread. +- Require Dart 3.4 or later (due to the use of `dart:ffi` + `Struct.create` by `package:ffigen`). +- __Breaking change__: Return structs from ObjC methods by value instead of + taking a struct return pointer. ## 2.0.0 diff --git a/pkgs/objective_c/ffigen_objc.yaml b/pkgs/objective_c/ffigen_objc.yaml index 7174be78a..992c39708 100644 --- a/pkgs/objective_c/ffigen_objc.yaml +++ b/pkgs/objective_c/ffigen_objc.yaml @@ -100,5 +100,3 @@ preamble: | // ignore_for_file: unused_element // ignore_for_file: unused_field // coverage:ignore-file - - import 'package:ffi/ffi.dart' as pkg_ffi; diff --git a/pkgs/objective_c/lib/src/objective_c_bindings_generated.dart b/pkgs/objective_c/lib/src/objective_c_bindings_generated.dart index 4d01ce9fb..38f3d89c0 100644 --- a/pkgs/objective_c/lib/src/objective_c_bindings_generated.dart +++ b/pkgs/objective_c/lib/src/objective_c_bindings_generated.dart @@ -13,14 +13,13 @@ // ignore_for_file: unused_field // coverage:ignore-file -import 'package:ffi/ffi.dart' as pkg_ffi; - // AUTO GENERATED FILE, DO NOT EDIT. // // Generated by `package:ffigen`. // ignore_for_file: type=lint import 'dart:ffi' as ffi; import '../objective_c.dart' as objc; +import 'package:ffi/ffi.dart' as pkg_ffi; @ffi.Native< ffi.Pointer Function( @@ -1449,22 +1448,27 @@ class NSData extends NSObject { } /// rangeOfData:options:range: - void rangeOfData_options_range_(ffi.Pointer stret, NSData dataToFind, - NSDataSearchOptions mask, NSRange searchRange) { + NSRange rangeOfData_options_range_( + NSData dataToFind, NSDataSearchOptions mask, NSRange searchRange) { + final _ptr = pkg_ffi.calloc(); objc.useMsgSendVariants ? _objc_msgSend_1wjxqnxStret( - stret, + _ptr, this.ref.pointer, _sel_rangeOfData_options_range_, dataToFind.ref.pointer, mask.value, searchRange) - : stret.ref = _objc_msgSend_1wjxqnx( + : _ptr.ref = _objc_msgSend_1wjxqnx( this.ref.pointer, _sel_rangeOfData_options_range_, dataToFind.ref.pointer, mask.value, searchRange); + final _finalizable = _ptr.cast().asTypedList( + ffi.sizeOf(), + finalizer: pkg_ffi.calloc.nativeFree); + return ffi.Struct.create(_finalizable); } /// subdataWithRange: @@ -8295,12 +8299,17 @@ class NSString extends NSObject { } /// lineRangeForRange: - void lineRangeForRange_(ffi.Pointer stret, NSRange range) { + NSRange lineRangeForRange_(NSRange range) { + final _ptr = pkg_ffi.calloc(); objc.useMsgSendVariants ? _objc_msgSend_hgyeceStret( - stret, this.ref.pointer, _sel_lineRangeForRange_, range) - : stret.ref = _objc_msgSend_hgyece( + _ptr, this.ref.pointer, _sel_lineRangeForRange_, range) + : _ptr.ref = _objc_msgSend_hgyece( this.ref.pointer, _sel_lineRangeForRange_, range); + final _finalizable = _ptr.cast().asTypedList( + ffi.sizeOf(), + finalizer: pkg_ffi.calloc.nativeFree); + return ffi.Struct.create(_finalizable); } /// localizedCapitalizedString @@ -8358,13 +8367,17 @@ class NSString extends NSObject { } /// localizedStandardRangeOfString: - void localizedStandardRangeOfString_( - ffi.Pointer stret, NSString str) { + NSRange localizedStandardRangeOfString_(NSString str) { + final _ptr = pkg_ffi.calloc(); objc.useMsgSendVariants - ? _objc_msgSend_1pl4rx6Stret(stret, this.ref.pointer, + ? _objc_msgSend_1pl4rx6Stret(_ptr, this.ref.pointer, _sel_localizedStandardRangeOfString_, str.ref.pointer) - : stret.ref = _objc_msgSend_1pl4rx6(this.ref.pointer, + : _ptr.ref = _objc_msgSend_1pl4rx6(this.ref.pointer, _sel_localizedStandardRangeOfString_, str.ref.pointer); + final _finalizable = _ptr.cast().asTypedList( + ffi.sizeOf(), + finalizer: pkg_ffi.calloc.nativeFree); + return ffi.Struct.create(_finalizable); } /// localizedStringWithFormat: @@ -8445,12 +8458,17 @@ class NSString extends NSObject { } /// paragraphRangeForRange: - void paragraphRangeForRange_(ffi.Pointer stret, NSRange range) { + NSRange paragraphRangeForRange_(NSRange range) { + final _ptr = pkg_ffi.calloc(); objc.useMsgSendVariants ? _objc_msgSend_hgyeceStret( - stret, this.ref.pointer, _sel_paragraphRangeForRange_, range) - : stret.ref = _objc_msgSend_hgyece( + _ptr, this.ref.pointer, _sel_paragraphRangeForRange_, range) + : _ptr.ref = _objc_msgSend_hgyece( this.ref.pointer, _sel_paragraphRangeForRange_, range); + final _finalizable = _ptr.cast().asTypedList( + ffi.sizeOf(), + finalizer: pkg_ffi.calloc.nativeFree); + return ffi.Struct.create(_finalizable); } /// precomposedStringWithCanonicalMapping @@ -8483,138 +8501,173 @@ class NSString extends NSObject { } /// rangeOfCharacterFromSet: - void rangeOfCharacterFromSet_( - ffi.Pointer stret, NSCharacterSet searchSet) { + NSRange rangeOfCharacterFromSet_(NSCharacterSet searchSet) { + final _ptr = pkg_ffi.calloc(); objc.useMsgSendVariants - ? _objc_msgSend_1pl4rx6Stret(stret, this.ref.pointer, + ? _objc_msgSend_1pl4rx6Stret(_ptr, this.ref.pointer, _sel_rangeOfCharacterFromSet_, searchSet.ref.pointer) - : stret.ref = _objc_msgSend_1pl4rx6(this.ref.pointer, + : _ptr.ref = _objc_msgSend_1pl4rx6(this.ref.pointer, _sel_rangeOfCharacterFromSet_, searchSet.ref.pointer); + final _finalizable = _ptr.cast().asTypedList( + ffi.sizeOf(), + finalizer: pkg_ffi.calloc.nativeFree); + return ffi.Struct.create(_finalizable); } /// rangeOfCharacterFromSet:options: - void rangeOfCharacterFromSet_options_(ffi.Pointer stret, + NSRange rangeOfCharacterFromSet_options_( NSCharacterSet searchSet, NSStringCompareOptions mask) { + final _ptr = pkg_ffi.calloc(); objc.useMsgSendVariants ? _objc_msgSend_1yjgs24Stret( - stret, + _ptr, this.ref.pointer, _sel_rangeOfCharacterFromSet_options_, searchSet.ref.pointer, mask.value) - : stret.ref = _objc_msgSend_1yjgs24( + : _ptr.ref = _objc_msgSend_1yjgs24( this.ref.pointer, _sel_rangeOfCharacterFromSet_options_, searchSet.ref.pointer, mask.value); + final _finalizable = _ptr.cast().asTypedList( + ffi.sizeOf(), + finalizer: pkg_ffi.calloc.nativeFree); + return ffi.Struct.create(_finalizable); } /// rangeOfCharacterFromSet:options:range: - void rangeOfCharacterFromSet_options_range_( - ffi.Pointer stret, - NSCharacterSet searchSet, - NSStringCompareOptions mask, - NSRange rangeOfReceiverToSearch) { + NSRange rangeOfCharacterFromSet_options_range_(NSCharacterSet searchSet, + NSStringCompareOptions mask, NSRange rangeOfReceiverToSearch) { + final _ptr = pkg_ffi.calloc(); objc.useMsgSendVariants ? _objc_msgSend_ws2nkjStret( - stret, + _ptr, this.ref.pointer, _sel_rangeOfCharacterFromSet_options_range_, searchSet.ref.pointer, mask.value, rangeOfReceiverToSearch) - : stret.ref = _objc_msgSend_ws2nkj( + : _ptr.ref = _objc_msgSend_ws2nkj( this.ref.pointer, _sel_rangeOfCharacterFromSet_options_range_, searchSet.ref.pointer, mask.value, rangeOfReceiverToSearch); + final _finalizable = _ptr.cast().asTypedList( + ffi.sizeOf(), + finalizer: pkg_ffi.calloc.nativeFree); + return ffi.Struct.create(_finalizable); } /// rangeOfComposedCharacterSequenceAtIndex: - void rangeOfComposedCharacterSequenceAtIndex_( - ffi.Pointer stret, int index) { + NSRange rangeOfComposedCharacterSequenceAtIndex_(int index) { + final _ptr = pkg_ffi.calloc(); objc.useMsgSendVariants - ? _objc_msgSend_rmij85Stret(stret, this.ref.pointer, + ? _objc_msgSend_rmij85Stret(_ptr, this.ref.pointer, _sel_rangeOfComposedCharacterSequenceAtIndex_, index) - : stret.ref = _objc_msgSend_rmij85(this.ref.pointer, + : _ptr.ref = _objc_msgSend_rmij85(this.ref.pointer, _sel_rangeOfComposedCharacterSequenceAtIndex_, index); + final _finalizable = _ptr.cast().asTypedList( + ffi.sizeOf(), + finalizer: pkg_ffi.calloc.nativeFree); + return ffi.Struct.create(_finalizable); } /// rangeOfComposedCharacterSequencesForRange: - void rangeOfComposedCharacterSequencesForRange_( - ffi.Pointer stret, NSRange range) { + NSRange rangeOfComposedCharacterSequencesForRange_(NSRange range) { + final _ptr = pkg_ffi.calloc(); objc.useMsgSendVariants - ? _objc_msgSend_hgyeceStret(stret, this.ref.pointer, + ? _objc_msgSend_hgyeceStret(_ptr, this.ref.pointer, _sel_rangeOfComposedCharacterSequencesForRange_, range) - : stret.ref = _objc_msgSend_hgyece(this.ref.pointer, + : _ptr.ref = _objc_msgSend_hgyece(this.ref.pointer, _sel_rangeOfComposedCharacterSequencesForRange_, range); + final _finalizable = _ptr.cast().asTypedList( + ffi.sizeOf(), + finalizer: pkg_ffi.calloc.nativeFree); + return ffi.Struct.create(_finalizable); } /// rangeOfString: - void rangeOfString_(ffi.Pointer stret, NSString searchString) { + NSRange rangeOfString_(NSString searchString) { + final _ptr = pkg_ffi.calloc(); objc.useMsgSendVariants - ? _objc_msgSend_1pl4rx6Stret(stret, this.ref.pointer, + ? _objc_msgSend_1pl4rx6Stret(_ptr, this.ref.pointer, _sel_rangeOfString_, searchString.ref.pointer) - : stret.ref = _objc_msgSend_1pl4rx6( + : _ptr.ref = _objc_msgSend_1pl4rx6( this.ref.pointer, _sel_rangeOfString_, searchString.ref.pointer); + final _finalizable = _ptr.cast().asTypedList( + ffi.sizeOf(), + finalizer: pkg_ffi.calloc.nativeFree); + return ffi.Struct.create(_finalizable); } /// rangeOfString:options: - void rangeOfString_options_(ffi.Pointer stret, NSString searchString, - NSStringCompareOptions mask) { + NSRange rangeOfString_options_( + NSString searchString, NSStringCompareOptions mask) { + final _ptr = pkg_ffi.calloc(); objc.useMsgSendVariants - ? _objc_msgSend_1yjgs24Stret(stret, this.ref.pointer, + ? _objc_msgSend_1yjgs24Stret(_ptr, this.ref.pointer, _sel_rangeOfString_options_, searchString.ref.pointer, mask.value) - : stret.ref = _objc_msgSend_1yjgs24(this.ref.pointer, + : _ptr.ref = _objc_msgSend_1yjgs24(this.ref.pointer, _sel_rangeOfString_options_, searchString.ref.pointer, mask.value); + final _finalizable = _ptr.cast().asTypedList( + ffi.sizeOf(), + finalizer: pkg_ffi.calloc.nativeFree); + return ffi.Struct.create(_finalizable); } /// rangeOfString:options:range: - void rangeOfString_options_range_( - ffi.Pointer stret, - NSString searchString, - NSStringCompareOptions mask, - NSRange rangeOfReceiverToSearch) { + NSRange rangeOfString_options_range_(NSString searchString, + NSStringCompareOptions mask, NSRange rangeOfReceiverToSearch) { + final _ptr = pkg_ffi.calloc(); objc.useMsgSendVariants ? _objc_msgSend_ws2nkjStret( - stret, + _ptr, this.ref.pointer, _sel_rangeOfString_options_range_, searchString.ref.pointer, mask.value, rangeOfReceiverToSearch) - : stret.ref = _objc_msgSend_ws2nkj( + : _ptr.ref = _objc_msgSend_ws2nkj( this.ref.pointer, _sel_rangeOfString_options_range_, searchString.ref.pointer, mask.value, rangeOfReceiverToSearch); + final _finalizable = _ptr.cast().asTypedList( + ffi.sizeOf(), + finalizer: pkg_ffi.calloc.nativeFree); + return ffi.Struct.create(_finalizable); } /// rangeOfString:options:range:locale: - void rangeOfString_options_range_locale_( - ffi.Pointer stret, + NSRange rangeOfString_options_range_locale_( NSString searchString, NSStringCompareOptions mask, NSRange rangeOfReceiverToSearch, NSLocale? locale) { + final _ptr = pkg_ffi.calloc(); objc.useMsgSendVariants ? _objc_msgSend_17qtp0oStret( - stret, + _ptr, this.ref.pointer, _sel_rangeOfString_options_range_locale_, searchString.ref.pointer, mask.value, rangeOfReceiverToSearch, locale?.ref.pointer ?? ffi.nullptr) - : stret.ref = _objc_msgSend_17qtp0o( + : _ptr.ref = _objc_msgSend_17qtp0o( this.ref.pointer, _sel_rangeOfString_options_range_locale_, searchString.ref.pointer, mask.value, rangeOfReceiverToSearch, locale?.ref.pointer ?? ffi.nullptr); + final _finalizable = _ptr.cast().asTypedList( + ffi.sizeOf(), + finalizer: pkg_ffi.calloc.nativeFree); + return ffi.Struct.create(_finalizable); } /// readableTypeIdentifiersForItemProvider @@ -10141,10 +10194,15 @@ class NSValue extends NSObject { } /// rangeValue - void getRangeValue(ffi.Pointer stret) { + NSRange get rangeValue { + final _ptr = pkg_ffi.calloc(); objc.useMsgSendVariants - ? _objc_msgSend_vi3lefStret(stret, this.ref.pointer, _sel_rangeValue) - : stret.ref = _objc_msgSend_vi3lef(this.ref.pointer, _sel_rangeValue); + ? _objc_msgSend_vi3lefStret(_ptr, this.ref.pointer, _sel_rangeValue) + : _ptr.ref = _objc_msgSend_vi3lef(this.ref.pointer, _sel_rangeValue); + final _finalizable = _ptr.cast().asTypedList( + ffi.sizeOf(), + finalizer: pkg_ffi.calloc.nativeFree); + return ffi.Struct.create(_finalizable); } /// supportsSecureCoding diff --git a/pkgs/objective_c/pubspec.yaml b/pkgs/objective_c/pubspec.yaml index 56bdc8101..eb0e05cb1 100644 --- a/pkgs/objective_c/pubspec.yaml +++ b/pkgs/objective_c/pubspec.yaml @@ -14,7 +14,7 @@ topics: - codegen environment: - sdk: '>=3.3.0 <4.0.0' + sdk: '>=3.4.0 <4.0.0' flutter: '>=3.3.0' dependencies: diff --git a/pkgs/objective_c/test/interface_lists_test.dart b/pkgs/objective_c/test/interface_lists_test.dart index 3d4c2d567..41d3e1f96 100644 --- a/pkgs/objective_c/test/interface_lists_test.dart +++ b/pkgs/objective_c/test/interface_lists_test.dart @@ -43,7 +43,7 @@ void main() { }); test('ObjCBuiltInFunctions.builtInCompounds', () { - expect(ObjCBuiltInFunctions.builtInCompounds, yamlStructs); + expect(ObjCBuiltInFunctions.builtInCompounds.values, yamlStructs); }); test('ObjCBuiltInFunctions.builtInEnums', () {