From 54c5a26fbb0aa30956dabb85784a4cabb3fa9f51 Mon Sep 17 00:00:00 2001 From: Liam Appelbe Date: Mon, 15 Jul 2024 15:53:09 +1000 Subject: [PATCH 1/6] Resolve conflicts in native block wrapper names. Also remove nullable annotation from native code. It doesn't do anything and is sometimes invalid. --- pkgs/ffigen/lib/src/code_generator/binding.dart | 6 +++++- pkgs/ffigen/lib/src/code_generator/func.dart | 1 + pkgs/ffigen/lib/src/code_generator/library.dart | 9 +++++++-- pkgs/ffigen/lib/src/code_generator/objc_block.dart | 1 + pkgs/ffigen/lib/src/code_generator/objc_nullable.dart | 2 +- 5 files changed, 15 insertions(+), 4 deletions(-) diff --git a/pkgs/ffigen/lib/src/code_generator/binding.dart b/pkgs/ffigen/lib/src/code_generator/binding.dart index 61cdd48b7..ad74325d0 100644 --- a/pkgs/ffigen/lib/src/code_generator/binding.dart +++ b/pkgs/ffigen/lib/src/code_generator/binding.dart @@ -13,13 +13,14 @@ abstract class Binding { final String usr; /// The name as it was in C. - final String originalName; + String originalName; /// Binding name to generate, may get changed to resolve name conflicts. String name; final String? dartDoc; final bool isInternal; + final bool originalNameIsRenamable; Binding({ required this.usr, @@ -27,6 +28,7 @@ abstract class Binding { required this.name, this.dartDoc, this.isInternal = false, + this.originalNameIsRenamable = false, }); /// Get all dependencies, including itself and save them in [dependencies]. @@ -50,6 +52,7 @@ abstract class LookUpBinding extends Binding { required super.name, super.dartDoc, super.isInternal, + super.originalNameIsRenamable, }) : super( usr: usr ?? name, originalName: originalName ?? name, @@ -64,6 +67,7 @@ abstract class NoLookUpBinding extends Binding { required super.name, super.dartDoc, super.isInternal, + super.originalNameIsRenamable, }) : super( usr: usr ?? name, originalName: originalName ?? name, diff --git a/pkgs/ffigen/lib/src/code_generator/func.dart b/pkgs/ffigen/lib/src/code_generator/func.dart index 3cc2e7668..62b8796cf 100644 --- a/pkgs/ffigen/lib/src/code_generator/func.dart +++ b/pkgs/ffigen/lib/src/code_generator/func.dart @@ -65,6 +65,7 @@ class Func extends LookUpBinding { this.isLeaf = false, this.objCReturnsRetained = false, super.isInternal, + super.originalNameIsRenamable, this.ffiNativeConfig = const FfiNativeConfig(enabled: false), }) : functionType = FunctionType( returnType: returnType, diff --git a/pkgs/ffigen/lib/src/code_generator/library.dart b/pkgs/ffigen/lib/src/code_generator/library.dart index 8737ef7cf..a70ce9a02 100644 --- a/pkgs/ffigen/lib/src/code_generator/library.dart +++ b/pkgs/ffigen/lib/src/code_generator/library.dart @@ -39,9 +39,10 @@ class Library { /// Handle any declaration-declaration name conflicts and emit warnings. final declConflictHandler = UniqueNamer({}); + final originalNameRenamer = UniqueNamer({}); for (final b in this.bindings) { _warnIfPrivateDeclaration(b); - _resolveIfNameConflicts(declConflictHandler, b); + _resolveIfNameConflicts(declConflictHandler, originalNameRenamer, b); } // Override pack values according to config. We do this after declaration @@ -114,7 +115,7 @@ class Library { } /// Resolves name conflict(if any) and logs a warning. - void _resolveIfNameConflicts(UniqueNamer namer, Binding b) { + void _resolveIfNameConflicts(UniqueNamer namer, UniqueNamer originalNameRenamer, Binding b) { // Print warning if name was conflicting and has been changed. if (namer.isUsed(b.name)) { final oldName = b.name; @@ -125,6 +126,10 @@ class Library { } else { namer.markUsed(b.name); } + + if (b.originalNameIsRenamable) { + b.originalName = originalNameRenamer.makeUnique(b.originalName); + } } /// Generates [file] by generating C bindings. diff --git a/pkgs/ffigen/lib/src/code_generator/objc_block.dart b/pkgs/ffigen/lib/src/code_generator/objc_block.dart index 6bc3cf356..91019c7b5 100644 --- a/pkgs/ffigen/lib/src/code_generator/objc_block.dart +++ b/pkgs/ffigen/lib/src/code_generator/objc_block.dart @@ -275,6 +275,7 @@ $blockTypedef $fnName($blockTypedef block) { objCReturnsRetained: true, isLeaf: true, isInternal: true, + originalNameIsRenamable: true, ffiNativeConfig: const FfiNativeConfig(enabled: true), )..addDependencies(dependencies); } diff --git a/pkgs/ffigen/lib/src/code_generator/objc_nullable.dart b/pkgs/ffigen/lib/src/code_generator/objc_nullable.dart index ead151a68..12093d810 100644 --- a/pkgs/ffigen/lib/src/code_generator/objc_nullable.dart +++ b/pkgs/ffigen/lib/src/code_generator/objc_nullable.dart @@ -38,7 +38,7 @@ class ObjCNullable extends Type { @override String getNativeType({String varName = ''}) => - '${child.getNativeType()} _Nullable $varName'; + child.getNativeType(varName: varName); @override bool get sameFfiDartAndCType => child.sameFfiDartAndCType; From a7524ccfbed767ab7611ac266db51e95fc89f49d Mon Sep 17 00:00:00 2001 From: Liam Appelbe Date: Mon, 15 Jul 2024 16:46:46 +1000 Subject: [PATCH 2/6] Use <> style imports for framework headers in ObjC native code Also, use #import instead of #include --- pkgs/ffigen/lib/src/code_generator/library.dart | 3 ++- pkgs/ffigen/lib/src/code_generator/utils.dart | 15 +++++++++++++++ pkgs/ffigen/lib/src/code_generator/writer.dart | 15 +++++++++++++-- 3 files changed, 30 insertions(+), 3 deletions(-) diff --git a/pkgs/ffigen/lib/src/code_generator/library.dart b/pkgs/ffigen/lib/src/code_generator/library.dart index a70ce9a02..8ce8d96e8 100644 --- a/pkgs/ffigen/lib/src/code_generator/library.dart +++ b/pkgs/ffigen/lib/src/code_generator/library.dart @@ -115,7 +115,8 @@ class Library { } /// Resolves name conflict(if any) and logs a warning. - void _resolveIfNameConflicts(UniqueNamer namer, UniqueNamer originalNameRenamer, Binding b) { + void _resolveIfNameConflicts( + UniqueNamer namer, UniqueNamer originalNameRenamer, Binding b) { // Print warning if name was conflicting and has been changed. if (namer.isUsed(b.name)) { final oldName = b.name; diff --git a/pkgs/ffigen/lib/src/code_generator/utils.dart b/pkgs/ffigen/lib/src/code_generator/utils.dart index 43073aabb..b095f7bea 100644 --- a/pkgs/ffigen/lib/src/code_generator/utils.dart +++ b/pkgs/ffigen/lib/src/code_generator/utils.dart @@ -140,3 +140,18 @@ String findDart() { throw Exception( "Couldn't find Dart executable near ${Platform.resolvedExecutable}"); } + +/// Attempts to parse an absolute path to an ObjC framework header. Returns an +/// importable path if successful, otherwise returns null. +String? parseObjCFrameworkHeader(String path) { + final match = _frameworkHeaderRegex.firstMatch(path); + + if (match == null) { + return null; + } + + return '${match[1]}/${match[2]}'; +} + +final _frameworkHeaderRegex = RegExp( + r'.*/Library(?:/.*/|/)Frameworks/([^/]+)\.framework(?:/.*/|/)Headers/(.*)'); diff --git a/pkgs/ffigen/lib/src/code_generator/writer.dart b/pkgs/ffigen/lib/src/code_generator/writer.dart index 8c6df054d..33d456a69 100644 --- a/pkgs/ffigen/lib/src/code_generator/writer.dart +++ b/pkgs/ffigen/lib/src/code_generator/writer.dart @@ -396,6 +396,18 @@ class Writer { }; } + static String _objcImport(String entryPoint, String outDir) { + final builtInHeader = parseObjCFrameworkHeader(entryPoint); + + if (builtInHeader == null) { + // If it's not a built in header, use a relative import. + return '#import "${p.relative(entryPoint, from: outDir)}"\n'; + } + + // If it's a built in header, use a <> style import. + return '#import <$builtInHeader>'; + } + /// Writes the Objective C code needed for the bindings, if any. Returns null /// if there are no bindings that need generated ObjC code. This function does /// not generate the output file, but the [outFilename] does affect the @@ -410,8 +422,7 @@ class Writer { '''); for (final entryPoint in nativeEntryPoints) { - final path = p.relative(entryPoint, from: outDir); - s.write('#include "$path"\n'); + s.write(_objcImport(entryPoint, outDir)); } var empty = true; From 20d01da9acfcb189c3bb3dbe52a3759d439f7198 Mon Sep 17 00:00:00 2001 From: Liam Appelbe Date: Mon, 15 Jul 2024 16:47:52 +1000 Subject: [PATCH 3/6] Test framework header parser --- .../unit_tests/objc_built_in_header_test.dart | 48 +++++++++++++++++++ 1 file changed, 48 insertions(+) create mode 100644 pkgs/ffigen/test/unit_tests/objc_built_in_header_test.dart diff --git a/pkgs/ffigen/test/unit_tests/objc_built_in_header_test.dart b/pkgs/ffigen/test/unit_tests/objc_built_in_header_test.dart new file mode 100644 index 000000000..9eff99cc8 --- /dev/null +++ b/pkgs/ffigen/test/unit_tests/objc_built_in_header_test.dart @@ -0,0 +1,48 @@ +// Copyright (c) 2024, 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 'package:ffigen/src/code_generator/utils.dart'; +import 'package:test/test.dart'; + +void main() { + group('ObjC framework header test', () { + test('parsing', () { + expect(parseObjCFrameworkHeader(''), null); + expect( + parseObjCFrameworkHeader( + '/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/System/' + 'Library/Frameworks/AppKit.framework/Versions/C/Headers/NSMatrix.h'), + 'AppKit/NSMatrix.h'); + expect( + parseObjCFrameworkHeader( + '/System/Library/Frameworks/Photos.framework/Versions/Current/' + 'Headers/SomeHeader.h'), + 'Photos/SomeHeader.h'); + expect( + parseObjCFrameworkHeader( + '/Library/Frameworks/macFUSE.framework/Headers/macFUSE.h'), + 'macFUSE/macFUSE.h'); + expect( + parseObjCFrameworkHeader( + '/Library/Frameworks/Foo.framework/Headers/Bar.h'), + 'Foo/Bar.h'); + expect( + parseObjCFrameworkHeader( + 'a/b/c/Library/Frameworks/Foo.framework/Headers/Bar.h'), + 'Foo/Bar.h'); + expect( + parseObjCFrameworkHeader( + '/Library/a/b/c/Frameworks/Foo.framework/Headers/Bar.h'), + 'Foo/Bar.h'); + expect( + parseObjCFrameworkHeader( + '/Library/Frameworks/Foo.framework/a/b/c/Headers/Bar.h'), + 'Foo/Bar.h'); + expect( + parseObjCFrameworkHeader( + '/Library/Frameworks/Foo.framework/Headers/a/b/c/Bar.h'), + 'Foo/a/b/c/Bar.h'); + }); + }); +} From 7085046fbc72973b4f127e1e2c5f1989ba79723d Mon Sep 17 00:00:00 2001 From: Liam Appelbe Date: Tue, 16 Jul 2024 12:06:05 +1000 Subject: [PATCH 4/6] More tests --- pkgs/ffigen/test/native_objc_test/block_config.yaml | 1 + pkgs/ffigen/test/native_objc_test/block_test.dart | 11 +++++++++++ pkgs/ffigen/test/native_objc_test/block_test.h | 2 ++ pkgs/ffigen/test/native_objc_test/block_test.m | 4 ++++ .../test/unit_tests/objc_built_in_header_test.dart | 2 ++ 5 files changed, 20 insertions(+) diff --git a/pkgs/ffigen/test/native_objc_test/block_config.yaml b/pkgs/ffigen/test/native_objc_test/block_config.yaml index c8d214c6b..8af2cd3d1 100644 --- a/pkgs/ffigen/test/native_objc_test/block_config.yaml +++ b/pkgs/ffigen/test/native_objc_test/block_config.yaml @@ -19,6 +19,7 @@ typedefs: - NullableObjectBlock - BlockBlock - ListenerBlock + - ObjectListenerBlock - NullableListenerBlock - StructListenerBlock - NSStringListenerBlock diff --git a/pkgs/ffigen/test/native_objc_test/block_test.dart b/pkgs/ffigen/test/native_objc_test/block_test.dart index e52477f8f..510e8c7ca 100644 --- a/pkgs/ffigen/test/native_objc_test/block_test.dart +++ b/pkgs/ffigen/test/native_objc_test/block_test.dart @@ -189,6 +189,17 @@ void main() { expect(isCalled, isTrue); }); + test('Object listener block', () async { + final hasRun = Completer(); + final block = DartObjectListenerBlock.listener((DummyObject x) { + expect(x, isNotNull); + hasRun.complete(); + }); + + BlockTester.callObjectListener_(block); + await hasRun.future; + }); + test('Nullable listener block', () async { final hasRun = Completer(); final block = DartNullableListenerBlock.listener((DummyObject? x) { diff --git a/pkgs/ffigen/test/native_objc_test/block_test.h b/pkgs/ffigen/test/native_objc_test/block_test.h index 5fbe987b8..9c77fb515 100644 --- a/pkgs/ffigen/test/native_objc_test/block_test.h +++ b/pkgs/ffigen/test/native_objc_test/block_test.h @@ -37,6 +37,7 @@ typedef DummyObject* (^ObjectBlock)(DummyObject*); typedef DummyObject* _Nullable (^NullableObjectBlock)(DummyObject* _Nullable); typedef IntBlock (^BlockBlock)(IntBlock); typedef void (^ListenerBlock)(IntBlock); +typedef void (^ObjectListenerBlock)(DummyObject*); typedef void (^NullableListenerBlock)(DummyObject* _Nullable); typedef void (^StructListenerBlock)(struct Vec2, Vec4, NSObject*); typedef void (^NSStringListenerBlock)(NSString*); @@ -61,6 +62,7 @@ typedef void (^NoTrampolineListenerBlock)(int32_t, Vec4, const char*); + (DummyObject*)callObjectBlock:(ObjectBlock)block NS_RETURNS_RETAINED; + (nullable DummyObject*)callNullableObjectBlock:(NullableObjectBlock)block; + (void)callListener:(ListenerBlock)block; ++ (void)callObjectListener:(ObjectListenerBlock)block; + (void)callNullableListener:(NullableListenerBlock)block; + (void)callStructListener:(StructListenerBlock)block; + (void)callNSStringListener:(NSStringListenerBlock)block x:(int32_t)x; diff --git a/pkgs/ffigen/test/native_objc_test/block_test.m b/pkgs/ffigen/test/native_objc_test/block_test.m index 86a3605d9..aa055f91d 100644 --- a/pkgs/ffigen/test/native_objc_test/block_test.m +++ b/pkgs/ffigen/test/native_objc_test/block_test.m @@ -94,6 +94,10 @@ + (NSThread*)callWithBlockOnNewThread:(ListenerBlock)block { object:block]; } ++ (void)callObjectListener:(ObjectListenerBlock)block { + block([DummyObject alloc]); +} + + (void)callNullableListener:(NullableListenerBlock)block { block(nil); } diff --git a/pkgs/ffigen/test/unit_tests/objc_built_in_header_test.dart b/pkgs/ffigen/test/unit_tests/objc_built_in_header_test.dart index 9eff99cc8..00baf901e 100644 --- a/pkgs/ffigen/test/unit_tests/objc_built_in_header_test.dart +++ b/pkgs/ffigen/test/unit_tests/objc_built_in_header_test.dart @@ -9,6 +9,8 @@ void main() { group('ObjC framework header test', () { test('parsing', () { expect(parseObjCFrameworkHeader(''), null); + expect(parseObjCFrameworkHeader('/Foo/Bar.h'), null); + expect(parseObjCFrameworkHeader('/Library/a/b/c/Headers/Bar.h'), null); expect( parseObjCFrameworkHeader( '/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/System/' From 6762f6314782f0df059da80a90e11c81d19411d9 Mon Sep 17 00:00:00 2001 From: Liam Appelbe Date: Wed, 17 Jul 2024 11:54:47 +1000 Subject: [PATCH 5/6] Revert renaming of originalName. Add Func.useNameForLookup instead --- pkgs/ffigen/lib/src/code_generator/binding.dart | 6 +----- pkgs/ffigen/lib/src/code_generator/func.dart | 9 ++++++--- pkgs/ffigen/lib/src/code_generator/library.dart | 9 ++------- pkgs/ffigen/lib/src/code_generator/objc_block.dart | 4 ++-- 4 files changed, 11 insertions(+), 17 deletions(-) diff --git a/pkgs/ffigen/lib/src/code_generator/binding.dart b/pkgs/ffigen/lib/src/code_generator/binding.dart index ad74325d0..61cdd48b7 100644 --- a/pkgs/ffigen/lib/src/code_generator/binding.dart +++ b/pkgs/ffigen/lib/src/code_generator/binding.dart @@ -13,14 +13,13 @@ abstract class Binding { final String usr; /// The name as it was in C. - String originalName; + final String originalName; /// Binding name to generate, may get changed to resolve name conflicts. String name; final String? dartDoc; final bool isInternal; - final bool originalNameIsRenamable; Binding({ required this.usr, @@ -28,7 +27,6 @@ abstract class Binding { required this.name, this.dartDoc, this.isInternal = false, - this.originalNameIsRenamable = false, }); /// Get all dependencies, including itself and save them in [dependencies]. @@ -52,7 +50,6 @@ abstract class LookUpBinding extends Binding { required super.name, super.dartDoc, super.isInternal, - super.originalNameIsRenamable, }) : super( usr: usr ?? name, originalName: originalName ?? name, @@ -67,7 +64,6 @@ abstract class NoLookUpBinding extends Binding { required super.name, super.dartDoc, super.isInternal, - super.originalNameIsRenamable, }) : super( usr: usr ?? name, originalName: originalName ?? name, diff --git a/pkgs/ffigen/lib/src/code_generator/func.dart b/pkgs/ffigen/lib/src/code_generator/func.dart index 62b8796cf..debc7e25f 100644 --- a/pkgs/ffigen/lib/src/code_generator/func.dart +++ b/pkgs/ffigen/lib/src/code_generator/func.dart @@ -44,6 +44,7 @@ class Func extends LookUpBinding { final bool exposeFunctionTypedefs; final bool isLeaf; final bool objCReturnsRetained; + final bool useNameForLookup; final FfiNativeConfig ffiNativeConfig; late final String funcPointerName; @@ -64,8 +65,8 @@ class Func extends LookUpBinding { this.exposeFunctionTypedefs = false, this.isLeaf = false, this.objCReturnsRetained = false, + this.useNameForLookup = false, super.isInternal, - super.originalNameIsRenamable, this.ffiNativeConfig = const FfiNativeConfig(enabled: false), }) : functionType = FunctionType( returnType: returnType, @@ -93,6 +94,8 @@ class Func extends LookUpBinding { } } + String get _lookupName => useNameForLookup ? name : originalName; + @override BindingString toBindingString(Writer w) { final s = StringBuffer(); @@ -153,7 +156,7 @@ ${makeNativeAnnotation( w, nativeType: cType, dartName: nativeFuncName, - nativeSymbolName: originalName, + nativeSymbolName: _lookupName, isLeaf: isLeaf, )} external $ffiReturnType $nativeFuncName($ffiArgDeclString); @@ -199,7 +202,7 @@ $dartReturnType $enclosingFuncName($dartArgDeclString) { // Write function pointer. s.write(''' late final $funcPointerName = ${w.lookupFuncIdentifier}< - ${w.ffiLibraryPrefix}.NativeFunction<$cType>>('$originalName'); + ${w.ffiLibraryPrefix}.NativeFunction<$cType>>('$_lookupName'); late final $funcVarName = $funcPointerName.asFunction<$dartType>($isLeafString); '''); diff --git a/pkgs/ffigen/lib/src/code_generator/library.dart b/pkgs/ffigen/lib/src/code_generator/library.dart index 8ce8d96e8..5035ddd8c 100644 --- a/pkgs/ffigen/lib/src/code_generator/library.dart +++ b/pkgs/ffigen/lib/src/code_generator/library.dart @@ -39,10 +39,9 @@ class Library { /// Handle any declaration-declaration name conflicts and emit warnings. final declConflictHandler = UniqueNamer({}); - final originalNameRenamer = UniqueNamer({}); for (final b in this.bindings) { _warnIfPrivateDeclaration(b); - _resolveIfNameConflicts(declConflictHandler, originalNameRenamer, b); + _resolveIfNameConflicts(declConflictHandler, b); } // Override pack values according to config. We do this after declaration @@ -116,7 +115,7 @@ class Library { /// Resolves name conflict(if any) and logs a warning. void _resolveIfNameConflicts( - UniqueNamer namer, UniqueNamer originalNameRenamer, Binding b) { + UniqueNamer namer, Binding b) { // Print warning if name was conflicting and has been changed. if (namer.isUsed(b.name)) { final oldName = b.name; @@ -127,10 +126,6 @@ class Library { } else { namer.markUsed(b.name); } - - if (b.originalNameIsRenamable) { - b.originalName = originalNameRenamer.makeUnique(b.originalName); - } } /// Generates [file] by generating C bindings. diff --git a/pkgs/ffigen/lib/src/code_generator/objc_block.dart b/pkgs/ffigen/lib/src/code_generator/objc_block.dart index 91019c7b5..5fe6295b1 100644 --- a/pkgs/ffigen/lib/src/code_generator/objc_block.dart +++ b/pkgs/ffigen/lib/src/code_generator/objc_block.dart @@ -238,7 +238,7 @@ pointer.ref.invoke.cast<$natTrampFnType>().asFunction<$trampFuncFfiDartType>()( argsReceived.add(t.getNativeType(varName: argName)); retains.add(t.generateRetain(argName) ?? argName); } - final fnName = _wrapListenerBlock!.originalName; + final fnName = _wrapListenerBlock!.name; final blockTypedef = w.objCLevelUniqueNamer.makeUnique('ListenerBlock'); final s = StringBuffer(); @@ -275,7 +275,7 @@ $blockTypedef $fnName($blockTypedef block) { objCReturnsRetained: true, isLeaf: true, isInternal: true, - originalNameIsRenamable: true, + useNameForLookup: true, ffiNativeConfig: const FfiNativeConfig(enabled: true), )..addDependencies(dependencies); } From 65255d19b5892b6a1d8afb8e4da643c2abbf74bf Mon Sep 17 00:00:00 2001 From: Liam Appelbe Date: Wed, 17 Jul 2024 11:59:36 +1000 Subject: [PATCH 6/6] nits --- pkgs/ffigen/lib/src/code_generator/library.dart | 3 +-- pkgs/ffigen/lib/src/code_generator/writer.dart | 10 +++++----- ...eader_test.dart => objc_framework_header_test.dart} | 0 3 files changed, 6 insertions(+), 7 deletions(-) rename pkgs/ffigen/test/unit_tests/{objc_built_in_header_test.dart => objc_framework_header_test.dart} (100%) diff --git a/pkgs/ffigen/lib/src/code_generator/library.dart b/pkgs/ffigen/lib/src/code_generator/library.dart index 5035ddd8c..8737ef7cf 100644 --- a/pkgs/ffigen/lib/src/code_generator/library.dart +++ b/pkgs/ffigen/lib/src/code_generator/library.dart @@ -114,8 +114,7 @@ class Library { } /// Resolves name conflict(if any) and logs a warning. - void _resolveIfNameConflicts( - UniqueNamer namer, Binding b) { + void _resolveIfNameConflicts(UniqueNamer namer, Binding b) { // Print warning if name was conflicting and has been changed. if (namer.isUsed(b.name)) { final oldName = b.name; diff --git a/pkgs/ffigen/lib/src/code_generator/writer.dart b/pkgs/ffigen/lib/src/code_generator/writer.dart index 33d456a69..363262d37 100644 --- a/pkgs/ffigen/lib/src/code_generator/writer.dart +++ b/pkgs/ffigen/lib/src/code_generator/writer.dart @@ -397,15 +397,15 @@ class Writer { } static String _objcImport(String entryPoint, String outDir) { - final builtInHeader = parseObjCFrameworkHeader(entryPoint); + final frameworkHeader = parseObjCFrameworkHeader(entryPoint); - if (builtInHeader == null) { - // If it's not a built in header, use a relative import. + if (frameworkHeader == null) { + // If it's not a framework header, use a relative import. return '#import "${p.relative(entryPoint, from: outDir)}"\n'; } - // If it's a built in header, use a <> style import. - return '#import <$builtInHeader>'; + // If it's a framework header, use a <> style import. + return '#import <$frameworkHeader>'; } /// Writes the Objective C code needed for the bindings, if any. Returns null diff --git a/pkgs/ffigen/test/unit_tests/objc_built_in_header_test.dart b/pkgs/ffigen/test/unit_tests/objc_framework_header_test.dart similarity index 100% rename from pkgs/ffigen/test/unit_tests/objc_built_in_header_test.dart rename to pkgs/ffigen/test/unit_tests/objc_framework_header_test.dart