diff --git a/pkgs/ffigen/lib/src/code_generator/func.dart b/pkgs/ffigen/lib/src/code_generator/func.dart index a654d3afd..601f13b75 100644 --- a/pkgs/ffigen/lib/src/code_generator/func.dart +++ b/pkgs/ffigen/lib/src/code_generator/func.dart @@ -3,7 +3,6 @@ // BSD-style license that can be found in the LICENSE file. import '../code_generator.dart'; -import '../config_provider/config_types.dart'; import '../visitor/ast.dart'; import 'binding_string.dart'; @@ -47,7 +46,7 @@ class Func extends LookUpBinding { final bool isLeaf; final bool objCReturnsRetained; final bool useNameForLookup; - final FfiNativeConfig ffiNativeConfig; + final bool loadFromNativeAsset; late final String funcPointerName; /// Contains typealias for function type if [exposeFunctionTypedefs] is true. @@ -69,7 +68,7 @@ class Func extends LookUpBinding { this.objCReturnsRetained = false, this.useNameForLookup = false, super.isInternal, - this.ffiNativeConfig = const FfiNativeConfig(enabled: false), + this.loadFromNativeAsset = false, }) : functionType = FunctionType( returnType: returnType, parameters: parameters ?? const [], @@ -158,7 +157,7 @@ class Func extends LookUpBinding { funcImplCall = '$funcVarName($argString)'; } - if (ffiNativeConfig.enabled) { + if (loadFromNativeAsset) { final nativeFuncName = needsWrapper ? funcVarName : enclosingFuncName; s.write(''' ${makeNativeAnnotation(w, nativeType: cType, dartName: nativeFuncName, nativeSymbolName: _lookupName, isLeaf: isLeaf)} @@ -223,7 +222,7 @@ late final $funcVarName = $funcPointerName.asFunction<$dartType>($isLeafString); visitor.visit(functionType); visitor.visit(_exposedFunctionTypealias); visitor.visit(ffiImport); - if (ffiNativeConfig.enabled && exposeSymbolAddress) { + if (loadFromNativeAsset && exposeSymbolAddress) { visitor.visit(selfImport); } } diff --git a/pkgs/ffigen/lib/src/code_generator/func_type.dart b/pkgs/ffigen/lib/src/code_generator/func_type.dart index 0c3b341ec..ee48c8f20 100644 --- a/pkgs/ffigen/lib/src/code_generator/func_type.dart +++ b/pkgs/ffigen/lib/src/code_generator/func_type.dart @@ -5,7 +5,6 @@ import '../code_generator.dart'; import '../context.dart'; import '../visitor/ast.dart'; - import 'unique_namer.dart'; /// Represents a function type. diff --git a/pkgs/ffigen/lib/src/code_generator/global.dart b/pkgs/ffigen/lib/src/code_generator/global.dart index f570e1c7e..df40efe12 100644 --- a/pkgs/ffigen/lib/src/code_generator/global.dart +++ b/pkgs/ffigen/lib/src/code_generator/global.dart @@ -2,9 +2,7 @@ // 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 '../config_provider/config_types.dart'; import '../visitor/ast.dart'; - import 'binding.dart'; import 'binding_string.dart'; import 'compound.dart'; @@ -27,7 +25,7 @@ import 'writer.dart'; class Global extends LookUpBinding { final Type type; final bool exposeSymbolAddress; - final FfiNativeConfig nativeConfig; + final bool loadFromNativeAsset; final bool constant; Global({ @@ -38,7 +36,7 @@ class Global extends LookUpBinding { super.dartDoc, this.exposeSymbolAddress = false, this.constant = false, - this.nativeConfig = const FfiNativeConfig(enabled: false), + this.loadFromNativeAsset = false, }); @override @@ -52,7 +50,7 @@ class Global extends LookUpBinding { // Removing pointer reference for ConstantArray cType since we always wrap // globals with pointer below. - final cType = (type is ConstantArray && !nativeConfig.enabled) + final cType = (type is ConstantArray && !loadFromNativeAsset) ? (type as ConstantArray).child.getCType(context) : type.getCType(context); @@ -84,7 +82,7 @@ class Global extends LookUpBinding { } } - if (nativeConfig.enabled) { + if (loadFromNativeAsset) { if (type case final ConstantArray arr) { s.writeln(makeArrayAnnotation(w, arr)); } @@ -168,7 +166,7 @@ class Global extends LookUpBinding { super.visitChildren(visitor); visitor.visit(type); visitor.visit(ffiImport); - if (nativeConfig.enabled && exposeSymbolAddress) { + if (loadFromNativeAsset && exposeSymbolAddress) { visitor.visit(selfImport); } } diff --git a/pkgs/ffigen/lib/src/code_generator/library.dart b/pkgs/ffigen/lib/src/code_generator/library.dart index 43f85915b..fd5e95645 100644 --- a/pkgs/ffigen/lib/src/code_generator/library.dart +++ b/pkgs/ffigen/lib/src/code_generator/library.dart @@ -8,7 +8,6 @@ import 'package:yaml_edit/yaml_edit.dart'; import '../code_generator.dart'; import '../code_generator/utils.dart'; -import '../config_provider/config.dart' show Config; import '../config_provider/config_types.dart'; import '../context.dart'; @@ -24,21 +23,20 @@ class Library { Library._(this.bindings, this.writer, this.context); - static Library fromConfig({ - required Config config, + static Library fromContext({ required List bindings, required Context context, }) => Library( - name: config.wrapperName, - description: config.wrapperDocComment, + name: context.config.wrapperName, + description: context.config.wrapperDocComment, bindings: bindings, - header: config.preamble, + header: context.config.preamble, generateForPackageObjectiveC: // ignore: deprecated_member_use_from_same_package - config.objectiveC?.generateForPackageObjectiveC ?? false, - libraryImports: config.libraryImports.values.toList(), - silenceEnumWarning: config.enums.silenceWarning, - nativeEntryPoints: config.entryPoints + context.config.objectiveC?.generateForPackageObjectiveC ?? false, + libraryImports: context.config.libraryImports.values.toList(), + silenceEnumWarning: context.config.enums.silenceWarning, + nativeEntryPoints: context.config.entryPoints .map((uri) => uri.toFilePath()) .toList(), context: context, @@ -61,18 +59,16 @@ class Library { FfiNativeConfig? nativeConfig; for (final binding in bindings.whereType()) { - final nativeConfigForBinding = switch (binding) { - Func() => binding.ffiNativeConfig, - Global() => binding.nativeConfig, - _ => null, + final loadFromNativeAsset = switch (binding) { + Func() => binding.loadFromNativeAsset, + Global() => binding.loadFromNativeAsset, + _ => false, }; // At the moment, all bindings share their native config. - nativeConfig ??= nativeConfigForBinding; + if (loadFromNativeAsset) nativeConfig = context.config.ffiNativeConfig; - final usesLookup = - nativeConfigForBinding == null || !nativeConfigForBinding.enabled; - (usesLookup ? lookupBindings : nativeBindings).add(binding); + (loadFromNativeAsset ? nativeBindings : lookupBindings).add(binding); } final noLookUpBindings = bindings.whereType().toList(); 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 0b421600f..ef2ef58e6 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 @@ -3,7 +3,6 @@ // BSD-style license that can be found in the LICENSE file. import '../code_generator.dart'; -import '../config_provider/config_types.dart'; import '../context.dart'; import '../visitor/ast.dart'; @@ -180,7 +179,7 @@ class ObjCBuiltInFunctions { isLeaf: true, isInternal: true, useNameForLookup: true, - ffiNativeConfig: const FfiNativeConfig(enabled: true), + loadFromNativeAsset: true, ); final _protocolTrampolines = {}; @@ -202,7 +201,7 @@ class ObjCBuiltInFunctions { isLeaf: false, isInternal: true, useNameForLookup: true, - ffiNativeConfig: const FfiNativeConfig(enabled: true), + loadFromNativeAsset: true, ), ); } diff --git a/pkgs/ffigen/lib/src/code_generator/writer.dart b/pkgs/ffigen/lib/src/code_generator/writer.dart index 4d74f1f65..c500776d1 100644 --- a/pkgs/ffigen/lib/src/code_generator/writer.dart +++ b/pkgs/ffigen/lib/src/code_generator/writer.dart @@ -317,7 +317,7 @@ class Writer { bindings.sort((a, b) => a.usr.compareTo(b.usr)); final usesFfiNative = bindings.whereType().any( - (element) => element.ffiNativeConfig.enabled, + (element) => element.loadFromNativeAsset, ); return { diff --git a/pkgs/ffigen/lib/src/header_parser/parser.dart b/pkgs/ffigen/lib/src/header_parser/parser.dart index 6bf12e91f..07ad515b7 100644 --- a/pkgs/ffigen/lib/src/header_parser/parser.dart +++ b/pkgs/ffigen/lib/src/header_parser/parser.dart @@ -31,9 +31,8 @@ import 'translation_unit_parser.dart'; import 'utils.dart'; /// Main entrypoint for header_parser. -Library parse(Context context) => Library.fromConfig( +Library parse(Context context) => Library.fromContext( bindings: transformBindings(parseToBindings(context), context), - config: context.config, context: context, ); diff --git a/pkgs/ffigen/lib/src/header_parser/sub_parsers/functiondecl_parser.dart b/pkgs/ffigen/lib/src/header_parser/sub_parsers/functiondecl_parser.dart index 14af73eb4..d77867acf 100644 --- a/pkgs/ffigen/lib/src/header_parser/sub_parsers/functiondecl_parser.dart +++ b/pkgs/ffigen/lib/src/header_parser/sub_parsers/functiondecl_parser.dart @@ -151,7 +151,7 @@ List parseFunctionDeclaration( exposeFunctionTypedefs: config.functions.includeTypedef(decl), isLeaf: config.functions.isLeaf(decl), objCReturnsRetained: objCReturnsRetained, - ffiNativeConfig: config.ffiNativeConfig, + loadFromNativeAsset: config.ffiNativeConfig.enabled, ), ); } diff --git a/pkgs/ffigen/lib/src/header_parser/sub_parsers/var_parser.dart b/pkgs/ffigen/lib/src/header_parser/sub_parsers/var_parser.dart index c0dd9eaf0..41e0352aa 100644 --- a/pkgs/ffigen/lib/src/header_parser/sub_parsers/var_parser.dart +++ b/pkgs/ffigen/lib/src/header_parser/sub_parsers/var_parser.dart @@ -47,7 +47,7 @@ Global? parseVarDeclaration(Context context, clang_types.CXCursor cursor) { dartDoc: getCursorDocComment(context, cursor), exposeSymbolAddress: config.globals.includeSymbolAddress(decl), constant: cType.isConstQualified, - nativeConfig: config.ffiNativeConfig, + loadFromNativeAsset: config.ffiNativeConfig.enabled, ); bindingsIndex.addGlobalVarToSeen(usr, global); diff --git a/pkgs/ffigen/test/code_generator_tests/code_generator_test.dart b/pkgs/ffigen/test/code_generator_tests/code_generator_test.dart index dfdc3aec4..1cf104f49 100644 --- a/pkgs/ffigen/test/code_generator_tests/code_generator_test.dart +++ b/pkgs/ffigen/test/code_generator_tests/code_generator_test.dart @@ -4,7 +4,6 @@ import 'package:ffigen/src/code_generator.dart'; import 'package:ffigen/src/config_provider/config.dart'; -import 'package:ffigen/src/config_provider/config_types.dart'; import 'package:ffigen/src/header_parser/parser.dart'; import 'package:meta/meta.dart'; import 'package:test/test.dart'; @@ -23,7 +22,7 @@ void main() { FfiGenerator( output: Output( dartFile: Uri.file('unused'), - style: const DynamicLibraryBindings(), + style: const NativeExternalBindings(assetId: 'test'), ), enums: Enums.includeAll, functions: Functions.includeAll, @@ -38,31 +37,22 @@ void main() { group('code_generator: ', () { @isTestGroup - void withAndWithoutNative( - String description, - void Function(FfiNativeConfig) runTest, - ) { + void withAndWithoutNative(String description, void Function(bool) runTest) { group(description, () { - test( - 'without Native', - () => runTest(const FfiNativeConfig(enabled: false)), - ); - test( - 'with Native', - () => runTest(const FfiNativeConfig(enabled: true, assetId: 'test')), - ); + test('without Native', () => runTest(false)); + test('with Native', () => runTest(true)); }); } withAndWithoutNative('Function Binding (primitives, pointers)', ( - nativeConfig, + loadFromNativeAsset, ) { final nativeContext = testContext( FfiGenerator( output: Output( dartFile: Uri.file('unused'), - style: nativeConfig.enabled - ? const NativeExternalBindings() + style: loadFromNativeAsset + ? const NativeExternalBindings(assetId: 'test') : const DynamicLibraryBindings(wrapperName: 'Wrapper'), ), enums: Enums.includeAll, @@ -81,13 +71,13 @@ void main() { header: licenseHeader, bindings: transformBindings([ Func( - ffiNativeConfig: nativeConfig, + loadFromNativeAsset: loadFromNativeAsset, name: 'noParam', dartDoc: 'Just a test function\nheres another line', returnType: NativeType(SupportedNativeType.int32), ), Func( - ffiNativeConfig: nativeConfig, + loadFromNativeAsset: loadFromNativeAsset, name: 'withPrimitiveParam', parameters: [ Parameter( @@ -104,7 +94,7 @@ void main() { returnType: NativeType(SupportedNativeType.char), ), Func( - ffiNativeConfig: nativeConfig, + loadFromNativeAsset: loadFromNativeAsset, name: 'withPointerParam', parameters: [ Parameter( @@ -123,7 +113,7 @@ void main() { returnType: PointerType(NativeType(SupportedNativeType.double)), ), Func( - ffiNativeConfig: nativeConfig, + loadFromNativeAsset: loadFromNativeAsset, isLeaf: true, name: 'leafFunc', dartDoc: 'A function with isLeaf: true', @@ -141,7 +131,7 @@ void main() { _matchLib( library, - nativeConfig.enabled ? 'function_ffiNative' : 'function', + loadFromNativeAsset ? 'function_ffiNative' : 'function', ); }); @@ -256,7 +246,7 @@ void main() { }); withAndWithoutNative('global (primitives, pointers, pointer to struct)', ( - nativeConfig, + loadFromNativeAsset, ) { final structSome = Struct(context: context, name: 'Some'); final emptyGlobalStruct = Struct(context: context, name: 'EmptyStruct'); @@ -267,41 +257,41 @@ void main() { header: licenseHeader, bindings: transformBindings([ Global( - nativeConfig: nativeConfig, + loadFromNativeAsset: loadFromNativeAsset, name: 'test1', type: NativeType(SupportedNativeType.int32), ), Global( - nativeConfig: nativeConfig, + loadFromNativeAsset: loadFromNativeAsset, name: 'test2', type: PointerType(NativeType(SupportedNativeType.float)), constant: true, ), Global( - nativeConfig: nativeConfig, + loadFromNativeAsset: loadFromNativeAsset, name: 'test3', type: ConstantArray( 10, NativeType(SupportedNativeType.float), - useArrayType: nativeConfig.enabled, + useArrayType: loadFromNativeAsset, ), constant: true, ), structSome, Global( - nativeConfig: nativeConfig, + loadFromNativeAsset: loadFromNativeAsset, name: 'test5', type: PointerType(structSome), ), emptyGlobalStruct, Global( - nativeConfig: nativeConfig, + loadFromNativeAsset: loadFromNativeAsset, name: 'globalStruct', type: emptyGlobalStruct, ), ], context), ); - _matchLib(library, nativeConfig.enabled ? 'global_native' : 'global'); + _matchLib(library, loadFromNativeAsset ? 'global_native' : 'global'); }); test('constant', () { @@ -544,7 +534,6 @@ void main() { }); test('Adds Native symbol on mismatch', () { - final nativeConfig = const FfiNativeConfig(enabled: true); final library = Library( context: context, name: 'init_dylib', @@ -552,13 +541,13 @@ void main() { '$licenseHeader\n// ignore_for_file: unused_element, camel_case_types, non_constant_identifier_names\n', bindings: transformBindings([ Func( - ffiNativeConfig: nativeConfig, + loadFromNativeAsset: true, name: 'test', originalName: '_test', returnType: NativeType(SupportedNativeType.voidType), ), Global( - nativeConfig: nativeConfig, + loadFromNativeAsset: true, name: 'testField', originalName: '_testField', type: NativeType(SupportedNativeType.int16), diff --git a/pkgs/ffigen/test/code_generator_tests/expected_bindings/_expected_native_symbol_bindings.dart b/pkgs/ffigen/test/code_generator_tests/expected_bindings/_expected_native_symbol_bindings.dart index ef9dd6fb8..bccf11324 100644 --- a/pkgs/ffigen/test/code_generator_tests/expected_bindings/_expected_native_symbol_bindings.dart +++ b/pkgs/ffigen/test/code_generator_tests/expected_bindings/_expected_native_symbol_bindings.dart @@ -8,6 +8,9 @@ // // Generated by `package:ffigen`. // ignore_for_file: type=lint +@ffi.DefaultAsset('test') +library; + import 'dart:ffi' as ffi; @ffi.Native(symbol: '_test')