diff --git a/pkgs/code_assets/example/host_name/tool/ffigen.dart b/pkgs/code_assets/example/host_name/tool/ffigen.dart index 3d191a6305..dfbbdec3d8 100644 --- a/pkgs/code_assets/example/host_name/tool/ffigen.dart +++ b/pkgs/code_assets/example/host_name/tool/ffigen.dart @@ -8,12 +8,13 @@ import 'package:ffigen/ffigen.dart'; void main() { final packageRoot = Platform.script.resolve('../'); - final functions = Functions.includeSet({'gethostname'}); final FfiGenerator generator; if (Platform.isWindows) { generator = FfiGenerator( - headers: Headers(entryPoints: [packageRoot.resolve('src/windows.h')]), - functions: functions, + input: Input(entryPoints: [packageRoot.resolve('src/windows.h')]), + visitors: const [ + IncludeSetVisitor(functions: {'gethostname'}), + ], output: Output( dartFile: packageRoot.resolve('lib/src/third_party/windows.dart'), preamble: ''' @@ -26,8 +27,10 @@ void main() { ); } else { generator = FfiGenerator( - headers: Headers(entryPoints: [packageRoot.resolve('src/unix.h')]), - functions: functions, + input: Input(entryPoints: [packageRoot.resolve('src/unix.h')]), + visitors: const [ + IncludeSetVisitor(functions: {'gethostname'}), + ], output: Output( dartFile: packageRoot.resolve('lib/src/third_party/unix.dart'), preamble: ''' diff --git a/pkgs/code_assets/example/mini_audio/tool/ffigen.dart b/pkgs/code_assets/example/mini_audio/tool/ffigen.dart index 980d449568..673884eaa4 100644 --- a/pkgs/code_assets/example/mini_audio/tool/ffigen.dart +++ b/pkgs/code_assets/example/mini_audio/tool/ffigen.dart @@ -9,24 +9,20 @@ import 'package:ffigen/ffigen.dart'; void main() { final packageRoot = Platform.script.resolve('../'); FfiGenerator( - headers: Headers( - entryPoints: [packageRoot.resolve('third_party/miniaudio.h')], - ), - functions: Functions( - include: (decl) => { - 'ma_engine_init', - 'ma_engine_play_sound', - 'ma_engine_uninit', - }.contains(decl.originalName), - recordUse: (_) => true, - ), - structs: Structs( - include: (decl) => {'ma_engine'}.contains(decl.originalName), - ), - enums: Enums( - include: (decl) => {'ma_result'}.contains(decl.originalName), - silenceWarning: true, - ), + input: Input(entryPoints: [packageRoot.resolve('third_party/miniaudio.h')]), + visitors: const [ + IncludeSetVisitor( + functions: { + 'ma_engine_init', + 'ma_engine_play_sound', + 'ma_engine_uninit', + }, + structs: {'ma_engine'}, + enums: {'ma_result'}, + typedefs: {'ma_result'}, + ), + RecordUseVisitor(), + ], output: Output( dartFile: packageRoot.resolve('lib/src/third_party/miniaudio.g.dart'), recordUseMapping: packageRoot.resolve( diff --git a/pkgs/code_assets/example/sqlite/tool/ffigen.dart b/pkgs/code_assets/example/sqlite/tool/ffigen.dart index 034b15b38a..0718921ffa 100644 --- a/pkgs/code_assets/example/sqlite/tool/ffigen.dart +++ b/pkgs/code_assets/example/sqlite/tool/ffigen.dart @@ -9,13 +9,13 @@ import 'package:ffigen/ffigen.dart'; void main() { final packageRoot = Platform.script.resolve('../'); FfiGenerator( - headers: Headers( + input: Input( entryPoints: [packageRoot.resolve('third_party/sqlite/sqlite3.h')], ), - functions: Functions( - include: (decl) => {'sqlite3_libversion'}.contains(decl.originalName), - recordUse: (_) => true, - ), + visitors: const [ + IncludeSetVisitor(functions: {'sqlite3_libversion'}), + RecordUseVisitor(), + ], output: Output( dartFile: packageRoot.resolve('lib/src/third_party/sqlite3.g.dart'), recordUseMapping: packageRoot.resolve( diff --git a/pkgs/code_assets/example/sqlite_no_link/tool/ffigen.dart b/pkgs/code_assets/example/sqlite_no_link/tool/ffigen.dart index 96e9d1a029..25f9232b5d 100644 --- a/pkgs/code_assets/example/sqlite_no_link/tool/ffigen.dart +++ b/pkgs/code_assets/example/sqlite_no_link/tool/ffigen.dart @@ -9,10 +9,13 @@ import 'package:ffigen/ffigen.dart'; void main() { final packageRoot = Platform.script.resolve('../'); FfiGenerator( - headers: Headers( + input: Input( entryPoints: [packageRoot.resolve('third_party/sqlite/sqlite3.h')], ), - functions: Functions.includeSet({'sqlite3_libversion'}), + visitors: const [ + IncludeSetVisitor(functions: {'sqlite3_libversion'}), + RecordUseVisitor(), + ], output: Output( dartFile: packageRoot.resolve('lib/src/third_party/sqlite3.g.dart'), preamble: ''' diff --git a/pkgs/code_assets/example/sqlite_prebuilt/tool/ffigen.dart b/pkgs/code_assets/example/sqlite_prebuilt/tool/ffigen.dart index 96e9d1a029..25f9232b5d 100644 --- a/pkgs/code_assets/example/sqlite_prebuilt/tool/ffigen.dart +++ b/pkgs/code_assets/example/sqlite_prebuilt/tool/ffigen.dart @@ -9,10 +9,13 @@ import 'package:ffigen/ffigen.dart'; void main() { final packageRoot = Platform.script.resolve('../'); FfiGenerator( - headers: Headers( + input: Input( entryPoints: [packageRoot.resolve('third_party/sqlite/sqlite3.h')], ), - functions: Functions.includeSet({'sqlite3_libversion'}), + visitors: const [ + IncludeSetVisitor(functions: {'sqlite3_libversion'}), + RecordUseVisitor(), + ], output: Output( dartFile: packageRoot.resolve('lib/src/third_party/sqlite3.g.dart'), preamble: ''' diff --git a/pkgs/code_assets/example/stb_image/tool/ffigen.dart b/pkgs/code_assets/example/stb_image/tool/ffigen.dart index a1ed4b0a3b..353e006701 100644 --- a/pkgs/code_assets/example/stb_image/tool/ffigen.dart +++ b/pkgs/code_assets/example/stb_image/tool/ffigen.dart @@ -9,13 +9,11 @@ import 'package:ffigen/ffigen.dart'; void main() { final packageRoot = Platform.script.resolve('../'); FfiGenerator( - headers: Headers( - entryPoints: [packageRoot.resolve('third_party/stb_image.h')], - ), - functions: Functions( - include: (decl) => {'stbi_info'}.contains(decl.originalName), - recordUse: (_) => true, - ), + input: Input(entryPoints: [packageRoot.resolve('third_party/stb_image.h')]), + visitors: const [ + IncludeSetVisitor(functions: {'stbi_info'}), + RecordUseVisitor(), + ], output: Output( dartFile: packageRoot.resolve('lib/src/third_party/stb_image.g.dart'), recordUseMapping: packageRoot.resolve( diff --git a/pkgs/ffigen/README.md b/pkgs/ffigen/README.md index 190f275cc4..a7fcb020b3 100644 --- a/pkgs/ffigen/README.md +++ b/pkgs/ffigen/README.md @@ -64,9 +64,9 @@ app has been created via `dart create ffigen_example`. // Required. Output path for the generated bindings. output: Output(dartFile: packageRoot.resolve('lib/add.g.dart')), // Optional. Where to look for header files. - headers: Headers(entryPoints: [packageRoot.resolve('src/add.h')]), - // Optional. What functions to generate bindings for. - functions: Functions.includeSet({'add'}), + input: Input(entryPoints: [packageRoot.resolve('src/add.h')]), + // Optional. Visitors to filter and customize generated bindings. + visitors: [const IncludeSetVisitor(functions: {'add'})], ).generate(); } ``` diff --git a/pkgs/ffigen/example/add/tool/ffigen.dart b/pkgs/ffigen/example/add/tool/ffigen.dart index e87def4258..1ff5e37453 100644 --- a/pkgs/ffigen/example/add/tool/ffigen.dart +++ b/pkgs/ffigen/example/add/tool/ffigen.dart @@ -8,8 +8,10 @@ import 'package:ffigen/ffigen.dart'; FfiGenerator getConfig(Uri packageRoot) { return FfiGenerator( output: Output(dartFile: packageRoot.resolve('lib/add.g.dart')), - headers: Headers(entryPoints: [packageRoot.resolve('src/add.h')]), - functions: Functions.includeSet({'add'}), + input: Input(entryPoints: [packageRoot.resolve('src/add.h')]), + visitors: [ + const IncludeSetVisitor(functions: {'add'}), + ], ); } diff --git a/pkgs/ffigen/example/ffinative/lib/generated_bindings.dart b/pkgs/ffigen/example/ffinative/lib/generated_bindings.dart index 04ba758de0..1df75ba58a 100644 --- a/pkgs/ffigen/example/ffinative/lib/generated_bindings.dart +++ b/pkgs/ffigen/example/ffinative/lib/generated_bindings.dart @@ -24,7 +24,6 @@ external ffi.Pointer divide(int a, int b); @ffi.Native Function(ffi.Float, ffi.Float)>() external ffi.Pointer dividePrecision(double a, double b); -/// Version of the native C library @ffi.Native>() external final ffi.Pointer library_version; diff --git a/pkgs/ffigen/example/libclang-example/generated_bindings.dart b/pkgs/ffigen/example/libclang-example/generated_bindings.dart index 207c7c3e0d..f290f01eed 100644 --- a/pkgs/ffigen/example/libclang-example/generated_bindings.dart +++ b/pkgs/ffigen/example/libclang-example/generated_bindings.dart @@ -7,7 +7,6 @@ // // Generated by `package:ffigen`. // ignore_for_file: type=lint, unused_import, unused_element, deprecated_member_use_from_same_package -import 'custom_import.dart' as custom_import; import 'dart:ffi' as ffi; /// Holds bindings to LibClang. @@ -32,11 +31,11 @@ class LibClang { } late final _clang_CXCursorSet_containsPtr = - _lookup>( - 'clang_CXCursorSet_contains', - ); + _lookup< + ffi.NativeFunction + >('clang_CXCursorSet_contains'); late final _clang_CXCursorSet_contains = _clang_CXCursorSet_containsPtr - .asFunction(); + .asFunction(); /// Inserts a CXCursor into a CXCursorSet. /// @@ -46,11 +45,11 @@ class LibClang { } late final _clang_CXCursorSet_insertPtr = - _lookup>( - 'clang_CXCursorSet_insert', - ); + _lookup< + ffi.NativeFunction + >('clang_CXCursorSet_insert'); late final _clang_CXCursorSet_insert = _clang_CXCursorSet_insertPtr - .asFunction(); + .asFunction(); /// Gets the general options associated with a CXIndex. /// @@ -61,12 +60,11 @@ class LibClang { } late final _clang_CXIndex_getGlobalOptionsPtr = - _lookup>( + _lookup>( 'clang_CXIndex_getGlobalOptions', ); late final _clang_CXIndex_getGlobalOptions = - _clang_CXIndex_getGlobalOptionsPtr - .asFunction(); + _clang_CXIndex_getGlobalOptionsPtr.asFunction(); /// Sets general options associated with a CXIndex. /// @@ -84,12 +82,12 @@ class LibClang { } late final _clang_CXIndex_setGlobalOptionsPtr = - _lookup>( + _lookup>( 'clang_CXIndex_setGlobalOptions', ); late final _clang_CXIndex_setGlobalOptions = _clang_CXIndex_setGlobalOptionsPtr - .asFunction(); + .asFunction(); /// Sets the invocation emission path option in a CXIndex. /// @@ -105,11 +103,11 @@ class LibClang { late final _clang_CXIndex_setInvocationEmissionPathOptionPtr = _lookup< - ffi.NativeFunction + ffi.NativeFunction)> >('clang_CXIndex_setInvocationEmissionPathOption'); late final _clang_CXIndex_setInvocationEmissionPathOption = _clang_CXIndex_setInvocationEmissionPathOptionPtr - .asFunction(); + .asFunction)>(); /// Determine if a C++ constructor is a converting constructor. int clang_CXXConstructor_isConvertingConstructor(CXCursor C) { @@ -117,12 +115,12 @@ class LibClang { } late final _clang_CXXConstructor_isConvertingConstructorPtr = - _lookup< - ffi.NativeFunction - >('clang_CXXConstructor_isConvertingConstructor'); + _lookup>( + 'clang_CXXConstructor_isConvertingConstructor', + ); late final _clang_CXXConstructor_isConvertingConstructor = _clang_CXXConstructor_isConvertingConstructorPtr - .asFunction(); + .asFunction(); /// Determine if a C++ constructor is a copy constructor. int clang_CXXConstructor_isCopyConstructor(CXCursor C) { @@ -130,12 +128,12 @@ class LibClang { } late final _clang_CXXConstructor_isCopyConstructorPtr = - _lookup>( + _lookup>( 'clang_CXXConstructor_isCopyConstructor', ); late final _clang_CXXConstructor_isCopyConstructor = _clang_CXXConstructor_isCopyConstructorPtr - .asFunction(); + .asFunction(); /// Determine if a C++ constructor is the default constructor. int clang_CXXConstructor_isDefaultConstructor(CXCursor C) { @@ -143,12 +141,12 @@ class LibClang { } late final _clang_CXXConstructor_isDefaultConstructorPtr = - _lookup< - ffi.NativeFunction - >('clang_CXXConstructor_isDefaultConstructor'); + _lookup>( + 'clang_CXXConstructor_isDefaultConstructor', + ); late final _clang_CXXConstructor_isDefaultConstructor = _clang_CXXConstructor_isDefaultConstructorPtr - .asFunction(); + .asFunction(); /// Determine if a C++ constructor is a move constructor. int clang_CXXConstructor_isMoveConstructor(CXCursor C) { @@ -156,12 +154,12 @@ class LibClang { } late final _clang_CXXConstructor_isMoveConstructorPtr = - _lookup>( + _lookup>( 'clang_CXXConstructor_isMoveConstructor', ); late final _clang_CXXConstructor_isMoveConstructor = _clang_CXXConstructor_isMoveConstructorPtr - .asFunction(); + .asFunction(); /// Determine if a C++ field is declared 'mutable'. int clang_CXXField_isMutable(CXCursor C) { @@ -169,11 +167,11 @@ class LibClang { } late final _clang_CXXField_isMutablePtr = - _lookup>( + _lookup>( 'clang_CXXField_isMutable', ); late final _clang_CXXField_isMutable = _clang_CXXField_isMutablePtr - .asFunction(); + .asFunction(); /// Determine if a C++ member function or member function template is /// declared 'const'. @@ -182,11 +180,11 @@ class LibClang { } late final _clang_CXXMethod_isConstPtr = - _lookup>( + _lookup>( 'clang_CXXMethod_isConst', ); late final _clang_CXXMethod_isConst = _clang_CXXMethod_isConstPtr - .asFunction(); + .asFunction(); /// Determine if a C++ method is declared '= default'. int clang_CXXMethod_isDefaulted(CXCursor C) { @@ -194,11 +192,11 @@ class LibClang { } late final _clang_CXXMethod_isDefaultedPtr = - _lookup>( + _lookup>( 'clang_CXXMethod_isDefaulted', ); late final _clang_CXXMethod_isDefaulted = _clang_CXXMethod_isDefaultedPtr - .asFunction(); + .asFunction(); /// Determine if a C++ member function or member function template is /// pure virtual. @@ -207,11 +205,11 @@ class LibClang { } late final _clang_CXXMethod_isPureVirtualPtr = - _lookup>( + _lookup>( 'clang_CXXMethod_isPureVirtual', ); late final _clang_CXXMethod_isPureVirtual = _clang_CXXMethod_isPureVirtualPtr - .asFunction(); + .asFunction(); /// Determine if a C++ member function or member function template is /// declared 'static'. @@ -220,11 +218,11 @@ class LibClang { } late final _clang_CXXMethod_isStaticPtr = - _lookup>( + _lookup>( 'clang_CXXMethod_isStatic', ); late final _clang_CXXMethod_isStatic = _clang_CXXMethod_isStaticPtr - .asFunction(); + .asFunction(); /// Determine if a C++ member function or member function template is /// explicitly declared 'virtual' or if it overrides a virtual method from @@ -234,11 +232,11 @@ class LibClang { } late final _clang_CXXMethod_isVirtualPtr = - _lookup>( + _lookup>( 'clang_CXXMethod_isVirtual', ); late final _clang_CXXMethod_isVirtual = _clang_CXXMethod_isVirtualPtr - .asFunction(); + .asFunction(); /// Determine if a C++ record is abstract, i.e. whether a class or struct /// has a pure virtual member function. @@ -247,11 +245,11 @@ class LibClang { } late final _clang_CXXRecord_isAbstractPtr = - _lookup>( + _lookup>( 'clang_CXXRecord_isAbstract', ); late final _clang_CXXRecord_isAbstract = _clang_CXXRecord_isAbstractPtr - .asFunction(); + .asFunction(); /// If cursor is a statement declaration tries to evaluate the /// statement and if its variable, tries to evaluate its initializer, @@ -261,11 +259,11 @@ class LibClang { } late final _clang_Cursor_EvaluatePtr = - _lookup>( + _lookup>( 'clang_Cursor_Evaluate', ); late final _clang_Cursor_Evaluate = _clang_Cursor_EvaluatePtr - .asFunction(); + .asFunction(); /// Retrieve the argument cursor of a function or method. /// @@ -277,11 +275,11 @@ class LibClang { } late final _clang_Cursor_getArgumentPtr = - _lookup>( + _lookup>( 'clang_Cursor_getArgument', ); late final _clang_Cursor_getArgument = _clang_Cursor_getArgumentPtr - .asFunction(); + .asFunction(); /// Given a cursor that represents a documentable entity (e.g., /// declaration), return the associated \paragraph; otherwise return the @@ -291,12 +289,12 @@ class LibClang { } late final _clang_Cursor_getBriefCommentTextPtr = - _lookup>( + _lookup>( 'clang_Cursor_getBriefCommentText', ); late final _clang_Cursor_getBriefCommentText = _clang_Cursor_getBriefCommentTextPtr - .asFunction(); + .asFunction(); /// Retrieve the CXStrings representing the mangled symbols of the C++ /// constructor or destructor at the cursor. @@ -305,11 +303,11 @@ class LibClang { } late final _clang_Cursor_getCXXManglingsPtr = - _lookup>( + _lookup Function(CXCursor)>>( 'clang_Cursor_getCXXManglings', ); late final _clang_Cursor_getCXXManglings = _clang_Cursor_getCXXManglingsPtr - .asFunction(); + .asFunction Function(CXCursor)>(); /// Given a cursor that represents a declaration, return the associated /// comment's source range. The range may include multiple consecutive comments @@ -319,11 +317,11 @@ class LibClang { } late final _clang_Cursor_getCommentRangePtr = - _lookup>( + _lookup>( 'clang_Cursor_getCommentRange', ); late final _clang_Cursor_getCommentRange = _clang_Cursor_getCommentRangePtr - .asFunction(); + .asFunction(); /// Retrieve the CXString representing the mangled name of the cursor. CXString clang_Cursor_getMangling(CXCursor arg0) { @@ -331,11 +329,11 @@ class LibClang { } late final _clang_Cursor_getManglingPtr = - _lookup>( + _lookup>( 'clang_Cursor_getMangling', ); late final _clang_Cursor_getMangling = _clang_Cursor_getManglingPtr - .asFunction(); + .asFunction(); /// Given a CXCursor_ModuleImportDecl cursor, return the associated module. CXModule clang_Cursor_getModule(CXCursor C) { @@ -343,11 +341,11 @@ class LibClang { } late final _clang_Cursor_getModulePtr = - _lookup>( + _lookup>( 'clang_Cursor_getModule', ); late final _clang_Cursor_getModule = _clang_Cursor_getModulePtr - .asFunction(); + .asFunction(); /// Retrieve the number of non-variadic arguments associated with a given /// cursor. @@ -359,11 +357,11 @@ class LibClang { } late final _clang_Cursor_getNumArgumentsPtr = - _lookup>( + _lookup>( 'clang_Cursor_getNumArguments', ); late final _clang_Cursor_getNumArguments = _clang_Cursor_getNumArgumentsPtr - .asFunction(); + .asFunction(); /// Returns the number of template args of a function decl representing a /// template specialization. @@ -384,12 +382,12 @@ class LibClang { } late final _clang_Cursor_getNumTemplateArgumentsPtr = - _lookup>( + _lookup>( 'clang_Cursor_getNumTemplateArguments', ); late final _clang_Cursor_getNumTemplateArguments = _clang_Cursor_getNumTemplateArgumentsPtr - .asFunction(); + .asFunction(); /// Given a cursor that represents an Objective-C method or parameter /// declaration, return the associated Objective-C qualifiers for the return @@ -400,12 +398,12 @@ class LibClang { } late final _clang_Cursor_getObjCDeclQualifiersPtr = - _lookup>( + _lookup>( 'clang_Cursor_getObjCDeclQualifiers', ); late final _clang_Cursor_getObjCDeclQualifiers = _clang_Cursor_getObjCDeclQualifiersPtr - .asFunction(); + .asFunction(); /// Retrieve the CXStrings representing the mangled symbols of the ObjC /// class interface or implementation at the cursor. @@ -414,11 +412,11 @@ class LibClang { } late final _clang_Cursor_getObjCManglingsPtr = - _lookup>( + _lookup Function(CXCursor)>>( 'clang_Cursor_getObjCManglings', ); late final _clang_Cursor_getObjCManglings = _clang_Cursor_getObjCManglingsPtr - .asFunction(); + .asFunction Function(CXCursor)>(); /// Given a cursor that represents a property declaration, return the /// associated property attributes. The bits are formed from @@ -430,12 +428,12 @@ class LibClang { } late final _clang_Cursor_getObjCPropertyAttributesPtr = - _lookup>( - 'clang_Cursor_getObjCPropertyAttributes', - ); + _lookup< + ffi.NativeFunction + >('clang_Cursor_getObjCPropertyAttributes'); late final _clang_Cursor_getObjCPropertyAttributes = _clang_Cursor_getObjCPropertyAttributesPtr - .asFunction(); + .asFunction(); /// Given a cursor that represents a property declaration, return the /// name of the method that implements the getter. @@ -444,12 +442,12 @@ class LibClang { } late final _clang_Cursor_getObjCPropertyGetterNamePtr = - _lookup>( + _lookup>( 'clang_Cursor_getObjCPropertyGetterName', ); late final _clang_Cursor_getObjCPropertyGetterName = _clang_Cursor_getObjCPropertyGetterNamePtr - .asFunction(); + .asFunction(); /// Given a cursor that represents a property declaration, return the /// name of the method that implements the setter, if any. @@ -458,12 +456,12 @@ class LibClang { } late final _clang_Cursor_getObjCPropertySetterNamePtr = - _lookup>( + _lookup>( 'clang_Cursor_getObjCPropertySetterName', ); late final _clang_Cursor_getObjCPropertySetterName = _clang_Cursor_getObjCPropertySetterNamePtr - .asFunction(); + .asFunction(); /// If the cursor points to a selector identifier in an Objective-C /// method or message expression, this returns the selector index. @@ -479,12 +477,12 @@ class LibClang { } late final _clang_Cursor_getObjCSelectorIndexPtr = - _lookup>( + _lookup>( 'clang_Cursor_getObjCSelectorIndex', ); late final _clang_Cursor_getObjCSelectorIndex = _clang_Cursor_getObjCSelectorIndexPtr - .asFunction(); + .asFunction(); /// Return the offset of the field represented by the Cursor. /// @@ -502,11 +500,11 @@ class LibClang { } late final _clang_Cursor_getOffsetOfFieldPtr = - _lookup>( + _lookup>( 'clang_Cursor_getOffsetOfField', ); late final _clang_Cursor_getOffsetOfField = _clang_Cursor_getOffsetOfFieldPtr - .asFunction(); + .asFunction(); /// Given a cursor that represents a declaration, return the associated /// comment text, including comment markers. @@ -515,12 +513,12 @@ class LibClang { } late final _clang_Cursor_getRawCommentTextPtr = - _lookup>( + _lookup>( 'clang_Cursor_getRawCommentText', ); late final _clang_Cursor_getRawCommentText = _clang_Cursor_getRawCommentTextPtr - .asFunction(); + .asFunction(); /// Given a cursor pointing to an Objective-C message or property /// reference, or C++ method call, returns the CXType of the receiver. @@ -529,11 +527,11 @@ class LibClang { } late final _clang_Cursor_getReceiverTypePtr = - _lookup>( + _lookup>( 'clang_Cursor_getReceiverType', ); late final _clang_Cursor_getReceiverType = _clang_Cursor_getReceiverTypePtr - .asFunction(); + .asFunction(); /// Retrieve a range for a piece that forms the cursors spelling name. /// Most of the times there is only one range for the complete spelling but for @@ -553,12 +551,14 @@ class LibClang { } late final _clang_Cursor_getSpellingNameRangePtr = - _lookup>( - 'clang_Cursor_getSpellingNameRange', - ); + _lookup< + ffi.NativeFunction< + CXSourceRange Function(CXCursor, ffi.UnsignedInt, ffi.UnsignedInt) + > + >('clang_Cursor_getSpellingNameRange'); late final _clang_Cursor_getSpellingNameRange = _clang_Cursor_getSpellingNameRangePtr - .asFunction(); + .asFunction(); /// Returns the storage class for a function or variable declaration. /// @@ -569,11 +569,11 @@ class LibClang { } late final _clang_Cursor_getStorageClassPtr = - _lookup>( + _lookup>( 'clang_Cursor_getStorageClass', ); late final _clang_Cursor_getStorageClass = _clang_Cursor_getStorageClassPtr - .asFunction(); + .asFunction(); /// Retrieve the kind of the I'th template argument of the CXCursor C. /// @@ -599,12 +599,12 @@ class LibClang { } late final _clang_Cursor_getTemplateArgumentKindPtr = - _lookup>( - 'clang_Cursor_getTemplateArgumentKind', - ); + _lookup< + ffi.NativeFunction + >('clang_Cursor_getTemplateArgumentKind'); late final _clang_Cursor_getTemplateArgumentKind = _clang_Cursor_getTemplateArgumentKindPtr - .asFunction(); + .asFunction(); /// Retrieve a CXType representing the type of a TemplateArgument of a /// function decl representing a template specialization. @@ -627,12 +627,12 @@ class LibClang { } late final _clang_Cursor_getTemplateArgumentTypePtr = - _lookup>( + _lookup>( 'clang_Cursor_getTemplateArgumentType', ); late final _clang_Cursor_getTemplateArgumentType = _clang_Cursor_getTemplateArgumentTypePtr - .asFunction(); + .asFunction(); /// Retrieve the value of an Integral TemplateArgument (of a function /// decl representing a template specialization) as an unsigned long long. @@ -655,11 +655,13 @@ class LibClang { late final _clang_Cursor_getTemplateArgumentUnsignedValuePtr = _lookup< - ffi.NativeFunction + ffi.NativeFunction< + ffi.UnsignedLongLong Function(CXCursor, ffi.UnsignedInt) + > >('clang_Cursor_getTemplateArgumentUnsignedValue'); late final _clang_Cursor_getTemplateArgumentUnsignedValue = _clang_Cursor_getTemplateArgumentUnsignedValuePtr - .asFunction(); + .asFunction(); /// Retrieve the value of an Integral TemplateArgument (of a function /// decl representing a template specialization) as a signed long long. @@ -681,12 +683,12 @@ class LibClang { } late final _clang_Cursor_getTemplateArgumentValuePtr = - _lookup>( - 'clang_Cursor_getTemplateArgumentValue', - ); + _lookup< + ffi.NativeFunction + >('clang_Cursor_getTemplateArgumentValue'); late final _clang_Cursor_getTemplateArgumentValue = _clang_Cursor_getTemplateArgumentValuePtr - .asFunction(); + .asFunction(); /// Returns the translation unit that a cursor originated from. CXTranslationUnit clang_Cursor_getTranslationUnit(CXCursor arg0) { @@ -694,12 +696,12 @@ class LibClang { } late final _clang_Cursor_getTranslationUnitPtr = - _lookup>( + _lookup>( 'clang_Cursor_getTranslationUnit', ); late final _clang_Cursor_getTranslationUnit = _clang_Cursor_getTranslationUnitPtr - .asFunction(); + .asFunction(); /// Determine whether the given cursor has any attributes. int clang_Cursor_hasAttrs(CXCursor C) { @@ -707,11 +709,11 @@ class LibClang { } late final _clang_Cursor_hasAttrsPtr = - _lookup>( + _lookup>( 'clang_Cursor_hasAttrs', ); late final _clang_Cursor_hasAttrs = _clang_Cursor_hasAttrsPtr - .asFunction(); + .asFunction(); /// Determine whether the given cursor represents an anonymous /// tag or namespace @@ -720,11 +722,11 @@ class LibClang { } late final _clang_Cursor_isAnonymousPtr = - _lookup>( + _lookup>( 'clang_Cursor_isAnonymous', ); late final _clang_Cursor_isAnonymous = _clang_Cursor_isAnonymousPtr - .asFunction(); + .asFunction(); /// Determine whether the given cursor represents an anonymous record /// declaration. @@ -733,12 +735,12 @@ class LibClang { } late final _clang_Cursor_isAnonymousRecordDeclPtr = - _lookup>( + _lookup>( 'clang_Cursor_isAnonymousRecordDecl', ); late final _clang_Cursor_isAnonymousRecordDecl = _clang_Cursor_isAnonymousRecordDeclPtr - .asFunction(); + .asFunction(); /// Returns non-zero if the cursor specifies a Record member that is a /// bitfield. @@ -747,11 +749,11 @@ class LibClang { } late final _clang_Cursor_isBitFieldPtr = - _lookup>( + _lookup>( 'clang_Cursor_isBitField', ); late final _clang_Cursor_isBitField = _clang_Cursor_isBitFieldPtr - .asFunction(); + .asFunction(); /// Given a cursor pointing to a C++ method call or an Objective-C /// message, returns non-zero if the method/message is "dynamic", meaning: @@ -767,11 +769,11 @@ class LibClang { } late final _clang_Cursor_isDynamicCallPtr = - _lookup>( + _lookup>( 'clang_Cursor_isDynamicCall', ); late final _clang_Cursor_isDynamicCall = _clang_Cursor_isDynamicCallPtr - .asFunction(); + .asFunction(); /// Returns non-zero if the given cursor points to a symbol marked with /// external_source_symbol attribute. @@ -794,11 +796,25 @@ class LibClang { } late final _clang_Cursor_isExternalSymbolPtr = - _lookup>( - 'clang_Cursor_isExternalSymbol', - ); + _lookup< + ffi.NativeFunction< + ffi.UnsignedInt Function( + CXCursor, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ) + > + >('clang_Cursor_isExternalSymbol'); late final _clang_Cursor_isExternalSymbol = _clang_Cursor_isExternalSymbolPtr - .asFunction(); + .asFunction< + int Function( + CXCursor, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ) + >(); /// Determine whether a CXCursor that is a function declaration, is an /// inline declaration. @@ -807,12 +823,11 @@ class LibClang { } late final _clang_Cursor_isFunctionInlinedPtr = - _lookup>( + _lookup>( 'clang_Cursor_isFunctionInlined', ); late final _clang_Cursor_isFunctionInlined = - _clang_Cursor_isFunctionInlinedPtr - .asFunction(); + _clang_Cursor_isFunctionInlinedPtr.asFunction(); /// Determine whether the given cursor represents an inline namespace /// declaration. @@ -821,12 +836,11 @@ class LibClang { } late final _clang_Cursor_isInlineNamespacePtr = - _lookup>( + _lookup>( 'clang_Cursor_isInlineNamespace', ); late final _clang_Cursor_isInlineNamespace = - _clang_Cursor_isInlineNamespacePtr - .asFunction(); + _clang_Cursor_isInlineNamespacePtr.asFunction(); /// Determine whether a CXCursor that is a macro, is a /// builtin one. @@ -835,11 +849,11 @@ class LibClang { } late final _clang_Cursor_isMacroBuiltinPtr = - _lookup>( + _lookup>( 'clang_Cursor_isMacroBuiltin', ); late final _clang_Cursor_isMacroBuiltin = _clang_Cursor_isMacroBuiltinPtr - .asFunction(); + .asFunction(); /// Determine whether a CXCursor that is a macro, is /// function like. @@ -848,12 +862,11 @@ class LibClang { } late final _clang_Cursor_isMacroFunctionLikePtr = - _lookup>( + _lookup>( 'clang_Cursor_isMacroFunctionLike', ); late final _clang_Cursor_isMacroFunctionLike = - _clang_Cursor_isMacroFunctionLikePtr - .asFunction(); + _clang_Cursor_isMacroFunctionLikePtr.asFunction(); /// Returns non-zero if \p cursor is null. int clang_Cursor_isNull(CXCursor cursor) { @@ -861,11 +874,11 @@ class LibClang { } late final _clang_Cursor_isNullPtr = - _lookup>( + _lookup>( 'clang_Cursor_isNull', ); late final _clang_Cursor_isNull = _clang_Cursor_isNullPtr - .asFunction(); + .asFunction(); /// Given a cursor that represents an Objective-C method or property /// declaration, return non-zero if the declaration was affected by "\@optional". @@ -875,11 +888,11 @@ class LibClang { } late final _clang_Cursor_isObjCOptionalPtr = - _lookup>( + _lookup>( 'clang_Cursor_isObjCOptional', ); late final _clang_Cursor_isObjCOptional = _clang_Cursor_isObjCOptionalPtr - .asFunction(); + .asFunction(); /// Returns non-zero if the given cursor is a variadic function or method. int clang_Cursor_isVariadic(CXCursor C) { @@ -887,11 +900,11 @@ class LibClang { } late final _clang_Cursor_isVariadicPtr = - _lookup>( + _lookup>( 'clang_Cursor_isVariadic', ); late final _clang_Cursor_isVariadic = _clang_Cursor_isVariadicPtr - .asFunction(); + .asFunction(); /// Determine if an enum declaration refers to a scoped enum. int clang_EnumDecl_isScoped(CXCursor C) { @@ -899,11 +912,11 @@ class LibClang { } late final _clang_EnumDecl_isScopedPtr = - _lookup>( + _lookup>( 'clang_EnumDecl_isScoped', ); late final _clang_EnumDecl_isScoped = _clang_EnumDecl_isScopedPtr - .asFunction(); + .asFunction(); /// Disposes the created Eval memory. void clang_EvalResult_dispose(CXEvalResult E) { @@ -911,11 +924,11 @@ class LibClang { } late final _clang_EvalResult_disposePtr = - _lookup>( + _lookup>( 'clang_EvalResult_dispose', ); late final _clang_EvalResult_dispose = _clang_EvalResult_disposePtr - .asFunction(); + .asFunction(); /// Returns the evaluation result as double if the /// kind is double. @@ -924,11 +937,11 @@ class LibClang { } late final _clang_EvalResult_getAsDoublePtr = - _lookup>( + _lookup>( 'clang_EvalResult_getAsDouble', ); late final _clang_EvalResult_getAsDouble = _clang_EvalResult_getAsDoublePtr - .asFunction(); + .asFunction(); /// Returns the evaluation result as integer if the /// kind is Int. @@ -937,11 +950,11 @@ class LibClang { } late final _clang_EvalResult_getAsIntPtr = - _lookup>( + _lookup>( 'clang_EvalResult_getAsInt', ); late final _clang_EvalResult_getAsInt = _clang_EvalResult_getAsIntPtr - .asFunction(); + .asFunction(); /// Returns the evaluation result as a long long integer if the /// kind is Int. This prevents overflows that may happen if the result is @@ -951,12 +964,12 @@ class LibClang { } late final _clang_EvalResult_getAsLongLongPtr = - _lookup>( + _lookup>( 'clang_EvalResult_getAsLongLong', ); late final _clang_EvalResult_getAsLongLong = _clang_EvalResult_getAsLongLongPtr - .asFunction(); + .asFunction(); /// Returns the evaluation result as a constant string if the /// kind is other than Int or float. User must not free this pointer, @@ -967,11 +980,11 @@ class LibClang { } late final _clang_EvalResult_getAsStrPtr = - _lookup>( + _lookup Function(CXEvalResult)>>( 'clang_EvalResult_getAsStr', ); late final _clang_EvalResult_getAsStr = _clang_EvalResult_getAsStrPtr - .asFunction(); + .asFunction Function(CXEvalResult)>(); /// Returns the evaluation result as an unsigned integer if /// the kind is Int and clang_EvalResult_isUnsignedInt is non-zero. @@ -980,12 +993,12 @@ class LibClang { } late final _clang_EvalResult_getAsUnsignedPtr = - _lookup>( + _lookup>( 'clang_EvalResult_getAsUnsigned', ); late final _clang_EvalResult_getAsUnsigned = _clang_EvalResult_getAsUnsignedPtr - .asFunction(); + .asFunction(); /// Returns the kind of the evaluated result. CXEvalResultKind clang_EvalResult_getKind(CXEvalResult E) { @@ -993,11 +1006,11 @@ class LibClang { } late final _clang_EvalResult_getKindPtr = - _lookup>( + _lookup>( 'clang_EvalResult_getKind', ); late final _clang_EvalResult_getKind = _clang_EvalResult_getKindPtr - .asFunction(); + .asFunction(); /// Returns a non-zero value if the kind is Int and the evaluation /// result resulted in an unsigned integer. @@ -1006,12 +1019,12 @@ class LibClang { } late final _clang_EvalResult_isUnsignedIntPtr = - _lookup>( + _lookup>( 'clang_EvalResult_isUnsignedInt', ); late final _clang_EvalResult_isUnsignedInt = _clang_EvalResult_isUnsignedIntPtr - .asFunction(); + .asFunction(); /// Returns non-zero if the \c file1 and \c file2 point to the same file, /// or they are both NULL. @@ -1020,11 +1033,11 @@ class LibClang { } late final _clang_File_isEqualPtr = - _lookup>( + _lookup>( 'clang_File_isEqual', ); late final _clang_File_isEqual = _clang_File_isEqualPtr - .asFunction(); + .asFunction(); /// Returns the real path name of \c file. /// @@ -1034,11 +1047,11 @@ class LibClang { } late final _clang_File_tryGetRealPathNamePtr = - _lookup>( + _lookup>( 'clang_File_tryGetRealPathName', ); late final _clang_File_tryGetRealPathName = _clang_File_tryGetRealPathNamePtr - .asFunction(); + .asFunction(); /// An indexing action/session, to be applied to one or multiple /// translation units. @@ -1049,11 +1062,11 @@ class LibClang { } late final _clang_IndexAction_createPtr = - _lookup>( + _lookup>( 'clang_IndexAction_create', ); late final _clang_IndexAction_create = _clang_IndexAction_createPtr - .asFunction(); + .asFunction(); /// Destroy the given index action. /// @@ -1064,11 +1077,11 @@ class LibClang { } late final _clang_IndexAction_disposePtr = - _lookup>( + _lookup>( 'clang_IndexAction_dispose', ); late final _clang_IndexAction_dispose = _clang_IndexAction_disposePtr - .asFunction(); + .asFunction(); /// Returns non-zero if the given source location is in the main file of /// the corresponding translation unit. @@ -1077,11 +1090,11 @@ class LibClang { } late final _clang_Location_isFromMainFilePtr = - _lookup>( + _lookup>( 'clang_Location_isFromMainFile', ); late final _clang_Location_isFromMainFile = _clang_Location_isFromMainFilePtr - .asFunction(); + .asFunction(); /// Returns non-zero if the given source location is in a system header. int clang_Location_isInSystemHeader(CXSourceLocation location) { @@ -1089,12 +1102,12 @@ class LibClang { } late final _clang_Location_isInSystemHeaderPtr = - _lookup>( + _lookup>( 'clang_Location_isInSystemHeader', ); late final _clang_Location_isInSystemHeader = _clang_Location_isInSystemHeaderPtr - .asFunction(); + .asFunction(); /// \param Module a module object. /// @@ -1104,11 +1117,11 @@ class LibClang { } late final _clang_Module_getASTFilePtr = - _lookup>( + _lookup>( 'clang_Module_getASTFile', ); late final _clang_Module_getASTFile = _clang_Module_getASTFilePtr - .asFunction(); + .asFunction(); /// \param Module a module object. /// @@ -1118,11 +1131,11 @@ class LibClang { } late final _clang_Module_getFullNamePtr = - _lookup>( + _lookup>( 'clang_Module_getFullName', ); late final _clang_Module_getFullName = _clang_Module_getFullNamePtr - .asFunction(); + .asFunction(); /// \param Module a module object. /// @@ -1133,11 +1146,11 @@ class LibClang { } late final _clang_Module_getNamePtr = - _lookup>( + _lookup>( 'clang_Module_getName', ); late final _clang_Module_getName = _clang_Module_getNamePtr - .asFunction(); + .asFunction(); /// \param Module a module object. /// @@ -1150,12 +1163,14 @@ class LibClang { } late final _clang_Module_getNumTopLevelHeadersPtr = - _lookup>( - 'clang_Module_getNumTopLevelHeaders', - ); + _lookup< + ffi.NativeFunction< + ffi.UnsignedInt Function(CXTranslationUnit, CXModule) + > + >('clang_Module_getNumTopLevelHeaders'); late final _clang_Module_getNumTopLevelHeaders = _clang_Module_getNumTopLevelHeadersPtr - .asFunction(); + .asFunction(); /// \param Module a module object. /// @@ -1166,11 +1181,11 @@ class LibClang { } late final _clang_Module_getParentPtr = - _lookup>( + _lookup>( 'clang_Module_getParent', ); late final _clang_Module_getParent = _clang_Module_getParentPtr - .asFunction(); + .asFunction(); /// \param Module a module object. /// @@ -1186,12 +1201,14 @@ class LibClang { } late final _clang_Module_getTopLevelHeaderPtr = - _lookup>( - 'clang_Module_getTopLevelHeader', - ); + _lookup< + ffi.NativeFunction< + CXFile Function(CXTranslationUnit, CXModule, ffi.UnsignedInt) + > + >('clang_Module_getTopLevelHeader'); late final _clang_Module_getTopLevelHeader = _clang_Module_getTopLevelHeaderPtr - .asFunction(); + .asFunction(); /// \param Module a module object. /// @@ -1201,11 +1218,11 @@ class LibClang { } late final _clang_Module_isSystemPtr = - _lookup>( + _lookup>( 'clang_Module_isSystem', ); late final _clang_Module_isSystem = _clang_Module_isSystemPtr - .asFunction(); + .asFunction(); /// Release a printing policy. void clang_PrintingPolicy_dispose(CXPrintingPolicy Policy) { @@ -1213,11 +1230,11 @@ class LibClang { } late final _clang_PrintingPolicy_disposePtr = - _lookup>( + _lookup>( 'clang_PrintingPolicy_dispose', ); late final _clang_PrintingPolicy_dispose = _clang_PrintingPolicy_disposePtr - .asFunction(); + .asFunction(); /// Get a property value for the given printing policy. int clang_PrintingPolicy_getProperty( @@ -1228,12 +1245,14 @@ class LibClang { } late final _clang_PrintingPolicy_getPropertyPtr = - _lookup>( - 'clang_PrintingPolicy_getProperty', - ); + _lookup< + ffi.NativeFunction< + ffi.UnsignedInt Function(CXPrintingPolicy, ffi.UnsignedInt) + > + >('clang_PrintingPolicy_getProperty'); late final _clang_PrintingPolicy_getProperty = _clang_PrintingPolicy_getPropertyPtr - .asFunction(); + .asFunction(); /// Set a property value for the given printing policy. void clang_PrintingPolicy_setProperty( @@ -1245,12 +1264,14 @@ class LibClang { } late final _clang_PrintingPolicy_setPropertyPtr = - _lookup>( - 'clang_PrintingPolicy_setProperty', - ); + _lookup< + ffi.NativeFunction< + ffi.Void Function(CXPrintingPolicy, ffi.UnsignedInt, ffi.UnsignedInt) + > + >('clang_PrintingPolicy_setProperty'); late final _clang_PrintingPolicy_setProperty = _clang_PrintingPolicy_setPropertyPtr - .asFunction(); + .asFunction(); /// Returns non-zero if \p range is null. int clang_Range_isNull(CXSourceRange range) { @@ -1258,11 +1279,11 @@ class LibClang { } late final _clang_Range_isNullPtr = - _lookup>( + _lookup>( 'clang_Range_isNull', ); late final _clang_Range_isNull = _clang_Range_isNullPtr - .asFunction(); + .asFunction(); /// Destroy the CXTargetInfo object. void clang_TargetInfo_dispose(CXTargetInfo Info) { @@ -1270,11 +1291,11 @@ class LibClang { } late final _clang_TargetInfo_disposePtr = - _lookup>( + _lookup>( 'clang_TargetInfo_dispose', ); late final _clang_TargetInfo_dispose = _clang_TargetInfo_disposePtr - .asFunction(); + .asFunction(); /// Get the pointer width of the target in bits. /// @@ -1284,12 +1305,12 @@ class LibClang { } late final _clang_TargetInfo_getPointerWidthPtr = - _lookup>( + _lookup>( 'clang_TargetInfo_getPointerWidth', ); late final _clang_TargetInfo_getPointerWidth = _clang_TargetInfo_getPointerWidthPtr - .asFunction(); + .asFunction(); /// Get the normalized target triple as a string. /// @@ -1299,11 +1320,11 @@ class LibClang { } late final _clang_TargetInfo_getTriplePtr = - _lookup>( + _lookup>( 'clang_TargetInfo_getTriple', ); late final _clang_TargetInfo_getTriple = _clang_TargetInfo_getTriplePtr - .asFunction(); + .asFunction(); /// Return the alignment of a type in bytes as per C++[expr.alignof] /// standard. @@ -1320,11 +1341,11 @@ class LibClang { } late final _clang_Type_getAlignOfPtr = - _lookup>( + _lookup>( 'clang_Type_getAlignOf', ); late final _clang_Type_getAlignOf = _clang_Type_getAlignOfPtr - .asFunction(); + .asFunction(); /// Retrieve the ref-qualifier kind of a function or method. /// @@ -1335,11 +1356,11 @@ class LibClang { } late final _clang_Type_getCXXRefQualifierPtr = - _lookup>( + _lookup>( 'clang_Type_getCXXRefQualifier', ); late final _clang_Type_getCXXRefQualifier = _clang_Type_getCXXRefQualifierPtr - .asFunction(); + .asFunction(); /// Return the class type of an member pointer type. /// @@ -1349,11 +1370,11 @@ class LibClang { } late final _clang_Type_getClassTypePtr = - _lookup>( + _lookup>( 'clang_Type_getClassType', ); late final _clang_Type_getClassType = _clang_Type_getClassTypePtr - .asFunction(); + .asFunction(); /// Return the type that was modified by this attributed type. /// @@ -1363,11 +1384,11 @@ class LibClang { } late final _clang_Type_getModifiedTypePtr = - _lookup>( + _lookup>( 'clang_Type_getModifiedType', ); late final _clang_Type_getModifiedType = _clang_Type_getModifiedTypePtr - .asFunction(); + .asFunction(); /// Retrieve the type named by the qualified-id. /// @@ -1377,11 +1398,11 @@ class LibClang { } late final _clang_Type_getNamedTypePtr = - _lookup>( + _lookup>( 'clang_Type_getNamedType', ); late final _clang_Type_getNamedType = _clang_Type_getNamedTypePtr - .asFunction(); + .asFunction(); /// Retrieve the nullability kind of a pointer type. CXTypeNullabilityKind clang_Type_getNullability(CXType T) { @@ -1389,11 +1410,11 @@ class LibClang { } late final _clang_Type_getNullabilityPtr = - _lookup>( + _lookup>( 'clang_Type_getNullability', ); late final _clang_Type_getNullability = _clang_Type_getNullabilityPtr - .asFunction(); + .asFunction(); /// Retrieve the number of protocol references associated with an ObjC object/id. /// @@ -1403,12 +1424,11 @@ class LibClang { } late final _clang_Type_getNumObjCProtocolRefsPtr = - _lookup>( + _lookup>( 'clang_Type_getNumObjCProtocolRefs', ); late final _clang_Type_getNumObjCProtocolRefs = - _clang_Type_getNumObjCProtocolRefsPtr - .asFunction(); + _clang_Type_getNumObjCProtocolRefsPtr.asFunction(); /// Retreive the number of type arguments associated with an ObjC object. /// @@ -1418,11 +1438,11 @@ class LibClang { } late final _clang_Type_getNumObjCTypeArgsPtr = - _lookup>( + _lookup>( 'clang_Type_getNumObjCTypeArgs', ); late final _clang_Type_getNumObjCTypeArgs = _clang_Type_getNumObjCTypeArgsPtr - .asFunction(); + .asFunction(); /// Returns the number of template arguments for given template /// specialization, or -1 if type \c T is not a template specialization. @@ -1431,12 +1451,11 @@ class LibClang { } late final _clang_Type_getNumTemplateArgumentsPtr = - _lookup>( + _lookup>( 'clang_Type_getNumTemplateArguments', ); late final _clang_Type_getNumTemplateArguments = - _clang_Type_getNumTemplateArgumentsPtr - .asFunction(); + _clang_Type_getNumTemplateArgumentsPtr.asFunction(); /// Returns the Objective-C type encoding for the specified CXType. CXString clang_Type_getObjCEncoding(CXType type) { @@ -1444,11 +1463,11 @@ class LibClang { } late final _clang_Type_getObjCEncodingPtr = - _lookup>( + _lookup>( 'clang_Type_getObjCEncoding', ); late final _clang_Type_getObjCEncoding = _clang_Type_getObjCEncodingPtr - .asFunction(); + .asFunction(); /// Retrieves the base type of the ObjCObjectType. /// @@ -1458,12 +1477,12 @@ class LibClang { } late final _clang_Type_getObjCObjectBaseTypePtr = - _lookup>( + _lookup>( 'clang_Type_getObjCObjectBaseType', ); late final _clang_Type_getObjCObjectBaseType = _clang_Type_getObjCObjectBaseTypePtr - .asFunction(); + .asFunction(); /// Retrieve the decl for a protocol reference for an ObjC object/id. /// @@ -1474,12 +1493,12 @@ class LibClang { } late final _clang_Type_getObjCProtocolDeclPtr = - _lookup>( + _lookup>( 'clang_Type_getObjCProtocolDecl', ); late final _clang_Type_getObjCProtocolDecl = _clang_Type_getObjCProtocolDeclPtr - .asFunction(); + .asFunction(); /// Retrieve a type argument associated with an ObjC object. /// @@ -1490,11 +1509,11 @@ class LibClang { } late final _clang_Type_getObjCTypeArgPtr = - _lookup>( + _lookup>( 'clang_Type_getObjCTypeArg', ); late final _clang_Type_getObjCTypeArg = _clang_Type_getObjCTypeArgPtr - .asFunction(); + .asFunction(); /// Return the offset of a field named S in a record of type T in bits /// as it would be returned by __offsetof__ as per C++11[18.2p4] @@ -1512,11 +1531,11 @@ class LibClang { } late final _clang_Type_getOffsetOfPtr = - _lookup>( - 'clang_Type_getOffsetOf', - ); + _lookup< + ffi.NativeFunction)> + >('clang_Type_getOffsetOf'); late final _clang_Type_getOffsetOf = _clang_Type_getOffsetOfPtr - .asFunction(); + .asFunction)>(); /// Return the size of a type in bytes as per C++[expr.sizeof] standard. /// @@ -1530,11 +1549,11 @@ class LibClang { } late final _clang_Type_getSizeOfPtr = - _lookup>( + _lookup>( 'clang_Type_getSizeOf', ); late final _clang_Type_getSizeOf = _clang_Type_getSizeOfPtr - .asFunction(); + .asFunction(); /// Returns the type template argument of a template class specialization /// at given index. @@ -1546,12 +1565,12 @@ class LibClang { } late final _clang_Type_getTemplateArgumentAsTypePtr = - _lookup>( + _lookup>( 'clang_Type_getTemplateArgumentAsType', ); late final _clang_Type_getTemplateArgumentAsType = _clang_Type_getTemplateArgumentAsTypePtr - .asFunction(); + .asFunction(); /// Determine if a typedef is 'transparent' tag. /// @@ -1564,12 +1583,11 @@ class LibClang { } late final _clang_Type_isTransparentTagTypedefPtr = - _lookup>( + _lookup>( 'clang_Type_isTransparentTagTypedef', ); late final _clang_Type_isTransparentTagTypedef = - _clang_Type_isTransparentTagTypedefPtr - .asFunction(); + _clang_Type_isTransparentTagTypedefPtr.asFunction(); /// Visit the fields of a particular type. /// @@ -1597,11 +1615,13 @@ class LibClang { } late final _clang_Type_visitFieldsPtr = - _lookup>( - 'clang_Type_visitFields', - ); + _lookup< + ffi.NativeFunction< + ffi.UnsignedInt Function(CXType, CXFieldVisitor, CXClientData) + > + >('clang_Type_visitFields'); late final _clang_Type_visitFields = _clang_Type_visitFieldsPtr - .asFunction(); + .asFunction(); /// Annotate the given set of tokens by providing cursors for each token /// that can be mapped to a specific entity within the abstract syntax tree. @@ -1641,11 +1661,25 @@ class LibClang { } late final _clang_annotateTokensPtr = - _lookup>( - 'clang_annotateTokens', - ); + _lookup< + ffi.NativeFunction< + ffi.Void Function( + CXTranslationUnit, + ffi.Pointer, + ffi.UnsignedInt, + ffi.Pointer, + ) + > + >('clang_annotateTokens'); late final _clang_annotateTokens = _clang_annotateTokensPtr - .asFunction(); + .asFunction< + void Function( + CXTranslationUnit, + ffi.Pointer, + int, + ffi.Pointer, + ) + >(); /// Perform code completion at a given location in a translation unit. /// @@ -1734,11 +1768,31 @@ class LibClang { } late final _clang_codeCompleteAtPtr = - _lookup>( - 'clang_codeCompleteAt', - ); + _lookup< + ffi.NativeFunction< + ffi.Pointer Function( + CXTranslationUnit, + ffi.Pointer, + ffi.UnsignedInt, + ffi.UnsignedInt, + ffi.Pointer, + ffi.UnsignedInt, + ffi.UnsignedInt, + ) + > + >('clang_codeCompleteAt'); late final _clang_codeCompleteAt = _clang_codeCompleteAtPtr - .asFunction(); + .asFunction< + ffi.Pointer Function( + CXTranslationUnit, + ffi.Pointer, + int, + int, + ffi.Pointer, + int, + int, + ) + >(); /// Returns the cursor kind for the container for the current code /// completion context. The container is only guaranteed to be set for @@ -1764,12 +1818,22 @@ class LibClang { } late final _clang_codeCompleteGetContainerKindPtr = - _lookup>( - 'clang_codeCompleteGetContainerKind', - ); + _lookup< + ffi.NativeFunction< + ffi.UnsignedInt Function( + ffi.Pointer, + ffi.Pointer, + ) + > + >('clang_codeCompleteGetContainerKind'); late final _clang_codeCompleteGetContainerKind = _clang_codeCompleteGetContainerKindPtr - .asFunction(); + .asFunction< + int Function( + ffi.Pointer, + ffi.Pointer, + ) + >(); /// Returns the USR for the container for the current code completion /// context. If there is not a container for the current context, this @@ -1785,12 +1849,14 @@ class LibClang { } late final _clang_codeCompleteGetContainerUSRPtr = - _lookup>( - 'clang_codeCompleteGetContainerUSR', - ); + _lookup< + ffi.NativeFunction< + CXString Function(ffi.Pointer) + > + >('clang_codeCompleteGetContainerUSR'); late final _clang_codeCompleteGetContainerUSR = _clang_codeCompleteGetContainerUSRPtr - .asFunction(); + .asFunction)>(); /// Determines what completions are appropriate for the context /// the given code completion. @@ -1806,11 +1872,13 @@ class LibClang { } late final _clang_codeCompleteGetContextsPtr = - _lookup>( - 'clang_codeCompleteGetContexts', - ); + _lookup< + ffi.NativeFunction< + ffi.UnsignedLongLong Function(ffi.Pointer) + > + >('clang_codeCompleteGetContexts'); late final _clang_codeCompleteGetContexts = _clang_codeCompleteGetContextsPtr - .asFunction(); + .asFunction)>(); /// Retrieve a diagnostic associated with the given code completion. /// @@ -1827,12 +1895,19 @@ class LibClang { } late final _clang_codeCompleteGetDiagnosticPtr = - _lookup>( - 'clang_codeCompleteGetDiagnostic', - ); + _lookup< + ffi.NativeFunction< + CXDiagnostic Function( + ffi.Pointer, + ffi.UnsignedInt, + ) + > + >('clang_codeCompleteGetDiagnostic'); late final _clang_codeCompleteGetDiagnostic = _clang_codeCompleteGetDiagnosticPtr - .asFunction(); + .asFunction< + CXDiagnostic Function(ffi.Pointer, int) + >(); /// Determine the number of diagnostics produced prior to the /// location where code completion was performed. @@ -1843,12 +1918,14 @@ class LibClang { } late final _clang_codeCompleteGetNumDiagnosticsPtr = - _lookup>( - 'clang_codeCompleteGetNumDiagnostics', - ); + _lookup< + ffi.NativeFunction< + ffi.UnsignedInt Function(ffi.Pointer) + > + >('clang_codeCompleteGetNumDiagnostics'); late final _clang_codeCompleteGetNumDiagnostics = _clang_codeCompleteGetNumDiagnosticsPtr - .asFunction(); + .asFunction)>(); /// Returns the currently-entered selector for an Objective-C message /// send, formatted like "initWithFoo:bar:". Only guaranteed to return a @@ -1866,12 +1943,14 @@ class LibClang { } late final _clang_codeCompleteGetObjCSelectorPtr = - _lookup>( - 'clang_codeCompleteGetObjCSelector', - ); + _lookup< + ffi.NativeFunction< + CXString Function(ffi.Pointer) + > + >('clang_codeCompleteGetObjCSelector'); late final _clang_codeCompleteGetObjCSelector = _clang_codeCompleteGetObjCSelectorPtr - .asFunction(); + .asFunction)>(); /// Construct a USR for a specified Objective-C category. CXString clang_constructUSR_ObjCCategory( @@ -1882,12 +1961,16 @@ class LibClang { } late final _clang_constructUSR_ObjCCategoryPtr = - _lookup>( - 'clang_constructUSR_ObjCCategory', - ); + _lookup< + ffi.NativeFunction< + CXString Function(ffi.Pointer, ffi.Pointer) + > + >('clang_constructUSR_ObjCCategory'); late final _clang_constructUSR_ObjCCategory = _clang_constructUSR_ObjCCategoryPtr - .asFunction(); + .asFunction< + CXString Function(ffi.Pointer, ffi.Pointer) + >(); /// Construct a USR for a specified Objective-C class. CXString clang_constructUSR_ObjCClass(ffi.Pointer class_name) { @@ -1895,11 +1978,11 @@ class LibClang { } late final _clang_constructUSR_ObjCClassPtr = - _lookup>( + _lookup)>>( 'clang_constructUSR_ObjCClass', ); late final _clang_constructUSR_ObjCClass = _clang_constructUSR_ObjCClassPtr - .asFunction(); + .asFunction)>(); /// Construct a USR for a specified Objective-C instance variable and /// the USR for its containing class. @@ -1911,11 +1994,11 @@ class LibClang { } late final _clang_constructUSR_ObjCIvarPtr = - _lookup>( - 'clang_constructUSR_ObjCIvar', - ); + _lookup< + ffi.NativeFunction, CXString)> + >('clang_constructUSR_ObjCIvar'); late final _clang_constructUSR_ObjCIvar = _clang_constructUSR_ObjCIvarPtr - .asFunction(); + .asFunction, CXString)>(); /// Construct a USR for a specified Objective-C method and /// the USR for its containing class. @@ -1928,11 +2011,13 @@ class LibClang { } late final _clang_constructUSR_ObjCMethodPtr = - _lookup>( - 'clang_constructUSR_ObjCMethod', - ); + _lookup< + ffi.NativeFunction< + CXString Function(ffi.Pointer, ffi.UnsignedInt, CXString) + > + >('clang_constructUSR_ObjCMethod'); late final _clang_constructUSR_ObjCMethod = _clang_constructUSR_ObjCMethodPtr - .asFunction(); + .asFunction, int, CXString)>(); /// Construct a USR for a specified Objective-C property and the USR /// for its containing class. @@ -1944,12 +2029,12 @@ class LibClang { } late final _clang_constructUSR_ObjCPropertyPtr = - _lookup>( - 'clang_constructUSR_ObjCProperty', - ); + _lookup< + ffi.NativeFunction, CXString)> + >('clang_constructUSR_ObjCProperty'); late final _clang_constructUSR_ObjCProperty = _clang_constructUSR_ObjCPropertyPtr - .asFunction(); + .asFunction, CXString)>(); /// Construct a USR for a specified Objective-C protocol. CXString clang_constructUSR_ObjCProtocol( @@ -1959,12 +2044,12 @@ class LibClang { } late final _clang_constructUSR_ObjCProtocolPtr = - _lookup>( + _lookup)>>( 'clang_constructUSR_ObjCProtocol', ); late final _clang_constructUSR_ObjCProtocol = _clang_constructUSR_ObjCProtocolPtr - .asFunction(); + .asFunction)>(); /// Creates an empty CXCursorSet. CXCursorSet clang_createCXCursorSet() { @@ -1972,11 +2057,11 @@ class LibClang { } late final _clang_createCXCursorSetPtr = - _lookup>( + _lookup>( 'clang_createCXCursorSet', ); late final _clang_createCXCursorSet = _clang_createCXCursorSetPtr - .asFunction(); + .asFunction(); /// Provides a shared context for creating translation units. /// @@ -2024,9 +2109,11 @@ class LibClang { } late final _clang_createIndexPtr = - _lookup>('clang_createIndex'); + _lookup>( + 'clang_createIndex', + ); late final _clang_createIndex = _clang_createIndexPtr - .asFunction(); + .asFunction(); /// Same as \c clang_createTranslationUnit2, but returns /// the \c CXTranslationUnit instead of an error code. In case of an error this @@ -2040,11 +2127,13 @@ class LibClang { } late final _clang_createTranslationUnitPtr = - _lookup>( - 'clang_createTranslationUnit', - ); + _lookup< + ffi.NativeFunction< + CXTranslationUnit Function(CXIndex, ffi.Pointer) + > + >('clang_createTranslationUnit'); late final _clang_createTranslationUnit = _clang_createTranslationUnitPtr - .asFunction(); + .asFunction)>(); /// Create a translation unit from an AST file (\c -emit-ast). /// @@ -2063,11 +2152,23 @@ class LibClang { } late final _clang_createTranslationUnit2Ptr = - _lookup>( - 'clang_createTranslationUnit2', - ); + _lookup< + ffi.NativeFunction< + ffi.UnsignedInt Function( + CXIndex, + ffi.Pointer, + ffi.Pointer, + ) + > + >('clang_createTranslationUnit2'); late final _clang_createTranslationUnit2 = _clang_createTranslationUnit2Ptr - .asFunction(); + .asFunction< + int Function( + CXIndex, + ffi.Pointer, + ffi.Pointer, + ) + >(); /// Return the CXTranslationUnit for a given source file and the provided /// command line arguments one would pass to the compiler. @@ -2127,11 +2228,29 @@ class LibClang { late final _clang_createTranslationUnitFromSourceFilePtr = _lookup< - ffi.NativeFunction + ffi.NativeFunction< + CXTranslationUnit Function( + CXIndex, + ffi.Pointer, + ffi.Int, + ffi.Pointer>, + ffi.UnsignedInt, + ffi.Pointer, + ) + > >('clang_createTranslationUnitFromSourceFile'); late final _clang_createTranslationUnitFromSourceFile = _clang_createTranslationUnitFromSourceFilePtr - .asFunction(); + .asFunction< + CXTranslationUnit Function( + CXIndex, + ffi.Pointer, + int, + ffi.Pointer>, + int, + ffi.Pointer, + ) + >(); /// Returns a default set of code-completion options that can be /// passed to\c clang_codeCompleteAt(). @@ -2140,12 +2259,11 @@ class LibClang { } late final _clang_defaultCodeCompleteOptionsPtr = - _lookup>( + _lookup>( 'clang_defaultCodeCompleteOptions', ); late final _clang_defaultCodeCompleteOptions = - _clang_defaultCodeCompleteOptionsPtr - .asFunction(); + _clang_defaultCodeCompleteOptionsPtr.asFunction(); /// Retrieve the set of display options most similar to the /// default behavior of the clang compiler. @@ -2157,12 +2275,11 @@ class LibClang { } late final _clang_defaultDiagnosticDisplayOptionsPtr = - _lookup>( + _lookup>( 'clang_defaultDiagnosticDisplayOptions', ); late final _clang_defaultDiagnosticDisplayOptions = - _clang_defaultDiagnosticDisplayOptionsPtr - .asFunction(); + _clang_defaultDiagnosticDisplayOptionsPtr.asFunction(); /// Returns the set of flags that is suitable for parsing a translation /// unit that is being edited. @@ -2179,12 +2296,12 @@ class LibClang { } late final _clang_defaultEditingTranslationUnitOptionsPtr = - _lookup< - ffi.NativeFunction - >('clang_defaultEditingTranslationUnitOptions'); + _lookup>( + 'clang_defaultEditingTranslationUnitOptions', + ); late final _clang_defaultEditingTranslationUnitOptions = _clang_defaultEditingTranslationUnitOptionsPtr - .asFunction(); + .asFunction(); /// Returns the set of flags that is suitable for reparsing a translation /// unit. @@ -2199,11 +2316,11 @@ class LibClang { } late final _clang_defaultReparseOptionsPtr = - _lookup>( + _lookup>( 'clang_defaultReparseOptions', ); late final _clang_defaultReparseOptions = _clang_defaultReparseOptionsPtr - .asFunction(); + .asFunction(); /// Returns the set of flags that is suitable for saving a translation /// unit. @@ -2217,11 +2334,11 @@ class LibClang { } late final _clang_defaultSaveOptionsPtr = - _lookup>( + _lookup>( 'clang_defaultSaveOptions', ); late final _clang_defaultSaveOptions = _clang_defaultSaveOptionsPtr - .asFunction(); + .asFunction(); /// Disposes a CXCursorSet and releases its associated memory. void clang_disposeCXCursorSet(CXCursorSet cset) { @@ -2229,11 +2346,11 @@ class LibClang { } late final _clang_disposeCXCursorSetPtr = - _lookup>( + _lookup>( 'clang_disposeCXCursorSet', ); late final _clang_disposeCXCursorSet = _clang_disposeCXCursorSetPtr - .asFunction(); + .asFunction(); /// Free the memory associated with a \c CXPlatformAvailability structure. void clang_disposeCXPlatformAvailability( @@ -2243,24 +2360,26 @@ class LibClang { } late final _clang_disposeCXPlatformAvailabilityPtr = - _lookup>( - 'clang_disposeCXPlatformAvailability', - ); + _lookup< + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer) + > + >('clang_disposeCXPlatformAvailability'); late final _clang_disposeCXPlatformAvailability = _clang_disposeCXPlatformAvailabilityPtr - .asFunction(); + .asFunction)>(); void clang_disposeCXTUResourceUsage(CXTUResourceUsage usage) { return _clang_disposeCXTUResourceUsage(usage); } late final _clang_disposeCXTUResourceUsagePtr = - _lookup>( + _lookup>( 'clang_disposeCXTUResourceUsage', ); late final _clang_disposeCXTUResourceUsage = _clang_disposeCXTUResourceUsagePtr - .asFunction(); + .asFunction(); /// Free the given set of code-completion results. void clang_disposeCodeCompleteResults( @@ -2270,12 +2389,14 @@ class LibClang { } late final _clang_disposeCodeCompleteResultsPtr = - _lookup>( - 'clang_disposeCodeCompleteResults', - ); + _lookup< + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer) + > + >('clang_disposeCodeCompleteResults'); late final _clang_disposeCodeCompleteResults = _clang_disposeCodeCompleteResultsPtr - .asFunction(); + .asFunction)>(); /// Destroy a diagnostic. void clang_disposeDiagnostic(CXDiagnostic Diagnostic) { @@ -2283,11 +2404,11 @@ class LibClang { } late final _clang_disposeDiagnosticPtr = - _lookup>( + _lookup>( 'clang_disposeDiagnostic', ); late final _clang_disposeDiagnostic = _clang_disposeDiagnosticPtr - .asFunction(); + .asFunction(); /// Release a CXDiagnosticSet and all of its contained diagnostics. void clang_disposeDiagnosticSet(CXDiagnosticSet Diags) { @@ -2295,11 +2416,11 @@ class LibClang { } late final _clang_disposeDiagnosticSetPtr = - _lookup>( + _lookup>( 'clang_disposeDiagnosticSet', ); late final _clang_disposeDiagnosticSet = _clang_disposeDiagnosticSetPtr - .asFunction(); + .asFunction(); /// Destroy the given index. /// @@ -2310,11 +2431,11 @@ class LibClang { } late final _clang_disposeIndexPtr = - _lookup>( + _lookup>( 'clang_disposeIndex', ); late final _clang_disposeIndex = _clang_disposeIndexPtr - .asFunction(); + .asFunction(); /// Free the set of overridden cursors returned by \c /// clang_getOverriddenCursors(). @@ -2323,12 +2444,12 @@ class LibClang { } late final _clang_disposeOverriddenCursorsPtr = - _lookup>( + _lookup)>>( 'clang_disposeOverriddenCursors', ); late final _clang_disposeOverriddenCursors = _clang_disposeOverriddenCursorsPtr - .asFunction(); + .asFunction)>(); /// Destroy the given \c CXSourceRangeList. void clang_disposeSourceRangeList(ffi.Pointer ranges) { @@ -2336,11 +2457,11 @@ class LibClang { } late final _clang_disposeSourceRangeListPtr = - _lookup>( - 'clang_disposeSourceRangeList', - ); + _lookup< + ffi.NativeFunction)> + >('clang_disposeSourceRangeList'); late final _clang_disposeSourceRangeList = _clang_disposeSourceRangeListPtr - .asFunction(); + .asFunction)>(); /// Free the given string. void clang_disposeString(CXString string) { @@ -2348,11 +2469,11 @@ class LibClang { } late final _clang_disposeStringPtr = - _lookup>( + _lookup>( 'clang_disposeString', ); late final _clang_disposeString = _clang_disposeStringPtr - .asFunction(); + .asFunction(); /// Free the given string set. void clang_disposeStringSet(ffi.Pointer set) { @@ -2360,11 +2481,11 @@ class LibClang { } late final _clang_disposeStringSetPtr = - _lookup>( + _lookup)>>( 'clang_disposeStringSet', ); late final _clang_disposeStringSet = _clang_disposeStringSetPtr - .asFunction(); + .asFunction)>(); /// Free the given set of tokens. void clang_disposeTokens( @@ -2376,11 +2497,19 @@ class LibClang { } late final _clang_disposeTokensPtr = - _lookup>( - 'clang_disposeTokens', - ); + _lookup< + ffi.NativeFunction< + ffi.Void Function( + CXTranslationUnit, + ffi.Pointer, + ffi.UnsignedInt, + ) + > + >('clang_disposeTokens'); late final _clang_disposeTokens = _clang_disposeTokensPtr - .asFunction(); + .asFunction< + void Function(CXTranslationUnit, ffi.Pointer, int) + >(); /// Destroy the specified CXTranslationUnit object. void clang_disposeTranslationUnit(CXTranslationUnit arg0) { @@ -2388,22 +2517,22 @@ class LibClang { } late final _clang_disposeTranslationUnitPtr = - _lookup>( + _lookup>( 'clang_disposeTranslationUnit', ); late final _clang_disposeTranslationUnit = _clang_disposeTranslationUnitPtr - .asFunction(); + .asFunction(); void clang_enableStackTraces() { return _clang_enableStackTraces(); } late final _clang_enableStackTracesPtr = - _lookup>( + _lookup>( 'clang_enableStackTraces', ); late final _clang_enableStackTraces = _clang_enableStackTracesPtr - .asFunction(); + .asFunction(); /// Determine whether two cursors are equivalent. int clang_equalCursors(CXCursor arg0, CXCursor arg1) { @@ -2411,11 +2540,11 @@ class LibClang { } late final _clang_equalCursorsPtr = - _lookup>( + _lookup>( 'clang_equalCursors', ); late final _clang_equalCursors = _clang_equalCursorsPtr - .asFunction(); + .asFunction(); /// Determine whether two source locations, which must refer into /// the same translation unit, refer to exactly the same point in the source @@ -2428,11 +2557,13 @@ class LibClang { } late final _clang_equalLocationsPtr = - _lookup>( - 'clang_equalLocations', - ); + _lookup< + ffi.NativeFunction< + ffi.UnsignedInt Function(CXSourceLocation, CXSourceLocation) + > + >('clang_equalLocations'); late final _clang_equalLocations = _clang_equalLocationsPtr - .asFunction(); + .asFunction(); /// Determine whether two ranges are equivalent. /// @@ -2442,9 +2573,13 @@ class LibClang { } late final _clang_equalRangesPtr = - _lookup>('clang_equalRanges'); + _lookup< + ffi.NativeFunction< + ffi.UnsignedInt Function(CXSourceRange, CXSourceRange) + > + >('clang_equalRanges'); late final _clang_equalRanges = _clang_equalRangesPtr - .asFunction(); + .asFunction(); /// Determine whether two CXTypes represent the same type. /// @@ -2455,9 +2590,11 @@ class LibClang { } late final _clang_equalTypesPtr = - _lookup>('clang_equalTypes'); + _lookup>( + 'clang_equalTypes', + ); late final _clang_equalTypes = _clang_equalTypesPtr - .asFunction(); + .asFunction(); void clang_executeOnThread( ffi.Pointer)>> @@ -2469,11 +2606,27 @@ class LibClang { } late final _clang_executeOnThreadPtr = - _lookup>( - 'clang_executeOnThread', - ); + _lookup< + ffi.NativeFunction< + ffi.Void Function( + ffi.Pointer< + ffi.NativeFunction)> + >, + ffi.Pointer, + ffi.UnsignedInt, + ) + > + >('clang_executeOnThread'); late final _clang_executeOnThread = _clang_executeOnThreadPtr - .asFunction(); + .asFunction< + void Function( + ffi.Pointer< + ffi.NativeFunction)> + >, + ffi.Pointer, + int, + ) + >(); /// Find #import/#include directives in a specific file. /// @@ -2494,11 +2647,19 @@ class LibClang { } late final _clang_findIncludesInFilePtr = - _lookup>( - 'clang_findIncludesInFile', - ); + _lookup< + ffi.NativeFunction< + ffi.UnsignedInt Function( + CXTranslationUnit, + CXFile, + CXCursorAndRangeVisitor, + ) + > + >('clang_findIncludesInFile'); late final _clang_findIncludesInFile = _clang_findIncludesInFilePtr - .asFunction(); + .asFunction< + int Function(CXTranslationUnit, CXFile, CXCursorAndRangeVisitor) + >(); /// Find references of a declaration in a specific file. /// @@ -2523,11 +2684,13 @@ class LibClang { } late final _clang_findReferencesInFilePtr = - _lookup>( - 'clang_findReferencesInFile', - ); + _lookup< + ffi.NativeFunction< + ffi.UnsignedInt Function(CXCursor, CXFile, CXCursorAndRangeVisitor) + > + >('clang_findReferencesInFile'); late final _clang_findReferencesInFile = _clang_findReferencesInFilePtr - .asFunction(); + .asFunction(); /// Format the given diagnostic in a manner that is suitable for display. /// @@ -2547,11 +2710,11 @@ class LibClang { } late final _clang_formatDiagnosticPtr = - _lookup>( - 'clang_formatDiagnostic', - ); + _lookup< + ffi.NativeFunction + >('clang_formatDiagnostic'); late final _clang_formatDiagnostic = _clang_formatDiagnosticPtr - .asFunction(); + .asFunction(); /// Returns the address space of the given type. int clang_getAddressSpace(CXType T) { @@ -2559,11 +2722,11 @@ class LibClang { } late final _clang_getAddressSpacePtr = - _lookup>( + _lookup>( 'clang_getAddressSpace', ); late final _clang_getAddressSpace = _clang_getAddressSpacePtr - .asFunction(); + .asFunction(); /// Retrieve all ranges from all files that were skipped by the /// preprocessor. @@ -2577,11 +2740,13 @@ class LibClang { } late final _clang_getAllSkippedRangesPtr = - _lookup>( - 'clang_getAllSkippedRanges', - ); + _lookup< + ffi.NativeFunction< + ffi.Pointer Function(CXTranslationUnit) + > + >('clang_getAllSkippedRanges'); late final _clang_getAllSkippedRanges = _clang_getAllSkippedRangesPtr - .asFunction(); + .asFunction Function(CXTranslationUnit)>(); /// Retrieve the type of a parameter of a function type. /// @@ -2592,9 +2757,11 @@ class LibClang { } late final _clang_getArgTypePtr = - _lookup>('clang_getArgType'); + _lookup>( + 'clang_getArgType', + ); late final _clang_getArgType = _clang_getArgTypePtr - .asFunction(); + .asFunction(); /// Return the element type of an array type. /// @@ -2604,11 +2771,11 @@ class LibClang { } late final _clang_getArrayElementTypePtr = - _lookup>( + _lookup>( 'clang_getArrayElementType', ); late final _clang_getArrayElementType = _clang_getArrayElementTypePtr - .asFunction(); + .asFunction(); /// Return the array size of a constant array. /// @@ -2618,11 +2785,11 @@ class LibClang { } late final _clang_getArraySizePtr = - _lookup>( + _lookup>( 'clang_getArraySize', ); late final _clang_getArraySize = _clang_getArraySizePtr - .asFunction(); + .asFunction(); /// Retrieve the character data associated with the given string. ffi.Pointer clang_getCString(CXString string) { @@ -2630,9 +2797,11 @@ class LibClang { } late final _clang_getCStringPtr = - _lookup>('clang_getCString'); + _lookup Function(CXString)>>( + 'clang_getCString', + ); late final _clang_getCString = _clang_getCStringPtr - .asFunction(); + .asFunction Function(CXString)>(); /// Return the memory usage of a translation unit. This object /// should be released with clang_disposeCXTUResourceUsage(). @@ -2641,11 +2810,11 @@ class LibClang { } late final _clang_getCXTUResourceUsagePtr = - _lookup>( - 'clang_getCXTUResourceUsage', - ); + _lookup< + ffi.NativeFunction + >('clang_getCXTUResourceUsage'); late final _clang_getCXTUResourceUsage = _clang_getCXTUResourceUsagePtr - .asFunction(); + .asFunction(); /// Returns the access control level for the referenced object. /// @@ -2657,11 +2826,11 @@ class LibClang { } late final _clang_getCXXAccessSpecifierPtr = - _lookup>( + _lookup>( 'clang_getCXXAccessSpecifier', ); late final _clang_getCXXAccessSpecifier = _clang_getCXXAccessSpecifierPtr - .asFunction(); + .asFunction(); /// Retrieve the canonical cursor corresponding to the given cursor. /// @@ -2690,11 +2859,11 @@ class LibClang { } late final _clang_getCanonicalCursorPtr = - _lookup>( + _lookup>( 'clang_getCanonicalCursor', ); late final _clang_getCanonicalCursor = _clang_getCanonicalCursorPtr - .asFunction(); + .asFunction(); /// Return the canonical type for a CXType. /// @@ -2707,11 +2876,11 @@ class LibClang { } late final _clang_getCanonicalTypePtr = - _lookup>( + _lookup>( 'clang_getCanonicalType', ); late final _clang_getCanonicalType = _clang_getCanonicalTypePtr - .asFunction(); + .asFunction(); /// Retrieve the child diagnostics of a CXDiagnostic. /// @@ -2722,11 +2891,11 @@ class LibClang { } late final _clang_getChildDiagnosticsPtr = - _lookup>( + _lookup>( 'clang_getChildDiagnostics', ); late final _clang_getChildDiagnostics = _clang_getChildDiagnosticsPtr - .asFunction(); + .asFunction(); /// Return a version string, suitable for showing to a user, but not /// intended to be parsed (the format is not guaranteed to be stable). @@ -2735,11 +2904,9 @@ class LibClang { } late final _clang_getClangVersionPtr = - _lookup>( - 'clang_getClangVersion', - ); + _lookup>('clang_getClangVersion'); late final _clang_getClangVersion = _clang_getClangVersionPtr - .asFunction(); + .asFunction(); /// Retrieve the annotation associated with the given completion string. /// @@ -2758,11 +2925,13 @@ class LibClang { } late final _clang_getCompletionAnnotationPtr = - _lookup>( - 'clang_getCompletionAnnotation', - ); + _lookup< + ffi.NativeFunction< + CXString Function(CXCompletionString, ffi.UnsignedInt) + > + >('clang_getCompletionAnnotation'); late final _clang_getCompletionAnnotation = _clang_getCompletionAnnotationPtr - .asFunction(); + .asFunction(); /// Determine the availability of the entity that this code-completion /// string refers to. @@ -2779,12 +2948,12 @@ class LibClang { } late final _clang_getCompletionAvailabilityPtr = - _lookup>( + _lookup>( 'clang_getCompletionAvailability', ); late final _clang_getCompletionAvailability = _clang_getCompletionAvailabilityPtr - .asFunction(); + .asFunction(); /// Retrieve the brief documentation comment attached to the declaration /// that corresponds to the given completion string. @@ -2795,12 +2964,12 @@ class LibClang { } late final _clang_getCompletionBriefCommentPtr = - _lookup>( + _lookup>( 'clang_getCompletionBriefComment', ); late final _clang_getCompletionBriefComment = _clang_getCompletionBriefCommentPtr - .asFunction(); + .asFunction(); /// Retrieve the completion string associated with a particular chunk /// within a completion string. @@ -2823,11 +2992,13 @@ class LibClang { late final _clang_getCompletionChunkCompletionStringPtr = _lookup< - ffi.NativeFunction + ffi.NativeFunction< + CXCompletionString Function(CXCompletionString, ffi.UnsignedInt) + > >('clang_getCompletionChunkCompletionString'); late final _clang_getCompletionChunkCompletionString = _clang_getCompletionChunkCompletionStringPtr - .asFunction(); + .asFunction(); /// Determine the kind of a particular chunk within a completion string. /// @@ -2846,11 +3017,13 @@ class LibClang { } late final _clang_getCompletionChunkKindPtr = - _lookup>( - 'clang_getCompletionChunkKind', - ); + _lookup< + ffi.NativeFunction< + ffi.UnsignedInt Function(CXCompletionString, ffi.UnsignedInt) + > + >('clang_getCompletionChunkKind'); late final _clang_getCompletionChunkKind = _clang_getCompletionChunkKindPtr - .asFunction(); + .asFunction(); /// Retrieve the text associated with a particular chunk within a /// completion string. @@ -2868,11 +3041,13 @@ class LibClang { } late final _clang_getCompletionChunkTextPtr = - _lookup>( - 'clang_getCompletionChunkText', - ); + _lookup< + ffi.NativeFunction< + CXString Function(CXCompletionString, ffi.UnsignedInt) + > + >('clang_getCompletionChunkText'); late final _clang_getCompletionChunkText = _clang_getCompletionChunkTextPtr - .asFunction(); + .asFunction(); /// Fix-its that *must* be applied before inserting the text for the /// corresponding completion. @@ -2930,11 +3105,25 @@ class LibClang { } late final _clang_getCompletionFixItPtr = - _lookup>( - 'clang_getCompletionFixIt', - ); + _lookup< + ffi.NativeFunction< + CXString Function( + ffi.Pointer, + ffi.UnsignedInt, + ffi.UnsignedInt, + ffi.Pointer, + ) + > + >('clang_getCompletionFixIt'); late final _clang_getCompletionFixIt = _clang_getCompletionFixItPtr - .asFunction(); + .asFunction< + CXString Function( + ffi.Pointer, + int, + int, + ffi.Pointer, + ) + >(); /// Retrieve the number of annotations associated with the given /// completion string. @@ -2948,12 +3137,12 @@ class LibClang { } late final _clang_getCompletionNumAnnotationsPtr = - _lookup>( + _lookup>( 'clang_getCompletionNumAnnotations', ); late final _clang_getCompletionNumAnnotations = _clang_getCompletionNumAnnotationsPtr - .asFunction(); + .asFunction(); /// Retrieve the number of fix-its for the given completion index. /// @@ -2974,11 +3163,16 @@ class LibClang { } late final _clang_getCompletionNumFixItsPtr = - _lookup>( - 'clang_getCompletionNumFixIts', - ); + _lookup< + ffi.NativeFunction< + ffi.UnsignedInt Function( + ffi.Pointer, + ffi.UnsignedInt, + ) + > + >('clang_getCompletionNumFixIts'); late final _clang_getCompletionNumFixIts = _clang_getCompletionNumFixItsPtr - .asFunction(); + .asFunction, int)>(); /// Retrieve the parent context of the given completion string. /// @@ -3002,11 +3196,15 @@ class LibClang { } late final _clang_getCompletionParentPtr = - _lookup>( - 'clang_getCompletionParent', - ); + _lookup< + ffi.NativeFunction< + CXString Function(CXCompletionString, ffi.Pointer) + > + >('clang_getCompletionParent'); late final _clang_getCompletionParent = _clang_getCompletionParentPtr - .asFunction(); + .asFunction< + CXString Function(CXCompletionString, ffi.Pointer) + >(); /// Determine the priority of this code completion. /// @@ -3023,11 +3221,11 @@ class LibClang { } late final _clang_getCompletionPriorityPtr = - _lookup>( + _lookup>( 'clang_getCompletionPriority', ); late final _clang_getCompletionPriority = _clang_getCompletionPriorityPtr - .asFunction(); + .asFunction(); /// Map a source location to the cursor that describes the entity at that /// location in the source code. @@ -3047,9 +3245,13 @@ class LibClang { } late final _clang_getCursorPtr = - _lookup>('clang_getCursor'); + _lookup< + ffi.NativeFunction< + CXCursor Function(CXTranslationUnit, CXSourceLocation) + > + >('clang_getCursor'); late final _clang_getCursor = _clang_getCursorPtr - .asFunction(); + .asFunction(); /// Determine the availability of the entity that this cursor refers to, /// taking the current target platform into account. @@ -3062,11 +3264,11 @@ class LibClang { } late final _clang_getCursorAvailabilityPtr = - _lookup>( + _lookup>( 'clang_getCursorAvailability', ); late final _clang_getCursorAvailability = _clang_getCursorAvailabilityPtr - .asFunction(); + .asFunction(); /// Retrieve a completion string for an arbitrary declaration or macro /// definition cursor. @@ -3080,12 +3282,12 @@ class LibClang { } late final _clang_getCursorCompletionStringPtr = - _lookup>( + _lookup>( 'clang_getCursorCompletionString', ); late final _clang_getCursorCompletionString = _clang_getCursorCompletionStringPtr - .asFunction(); + .asFunction(); /// For a cursor that is either a reference to or a declaration /// of some entity, retrieve a cursor that describes the definition of @@ -3118,11 +3320,11 @@ class LibClang { } late final _clang_getCursorDefinitionPtr = - _lookup>( + _lookup>( 'clang_getCursorDefinition', ); late final _clang_getCursorDefinition = _clang_getCursorDefinitionPtr - .asFunction(); + .asFunction(); /// Retrieve the display name for the entity referenced by this cursor. /// @@ -3134,11 +3336,11 @@ class LibClang { } late final _clang_getCursorDisplayNamePtr = - _lookup>( + _lookup>( 'clang_getCursorDisplayName', ); late final _clang_getCursorDisplayName = _clang_getCursorDisplayNamePtr - .asFunction(); + .asFunction(); /// Retrieve the exception specification type associated with a given cursor. /// This is a value of type CXCursor_ExceptionSpecificationKind. @@ -3149,12 +3351,12 @@ class LibClang { } late final _clang_getCursorExceptionSpecificationTypePtr = - _lookup< - ffi.NativeFunction - >('clang_getCursorExceptionSpecificationType'); + _lookup>( + 'clang_getCursorExceptionSpecificationType', + ); late final _clang_getCursorExceptionSpecificationType = _clang_getCursorExceptionSpecificationTypePtr - .asFunction(); + .asFunction(); /// Retrieve the physical extent of the source construct referenced by /// the given cursor. @@ -3170,11 +3372,11 @@ class LibClang { } late final _clang_getCursorExtentPtr = - _lookup>( + _lookup>( 'clang_getCursorExtent', ); late final _clang_getCursorExtent = _clang_getCursorExtentPtr - .asFunction(); + .asFunction(); /// Retrieve the kind of the given cursor. CXCursorKind clang_getCursorKind(CXCursor arg0) { @@ -3182,11 +3384,11 @@ class LibClang { } late final _clang_getCursorKindPtr = - _lookup>( + _lookup>( 'clang_getCursorKind', ); late final _clang_getCursorKind = _clang_getCursorKindPtr - .asFunction(); + .asFunction(); /// \defgroup CINDEX_DEBUG Debugging facilities /// @@ -3199,11 +3401,11 @@ class LibClang { } late final _clang_getCursorKindSpellingPtr = - _lookup>( + _lookup>( 'clang_getCursorKindSpelling', ); late final _clang_getCursorKindSpelling = _clang_getCursorKindSpellingPtr - .asFunction(); + .asFunction(); /// Determine the "language" of the entity referred to by a given cursor. CXLanguageKind clang_getCursorLanguage(CXCursor cursor) { @@ -3211,11 +3413,11 @@ class LibClang { } late final _clang_getCursorLanguagePtr = - _lookup>( + _lookup>( 'clang_getCursorLanguage', ); late final _clang_getCursorLanguage = _clang_getCursorLanguagePtr - .asFunction(); + .asFunction(); /// Determine the lexical parent of the given cursor. /// @@ -3254,11 +3456,11 @@ class LibClang { } late final _clang_getCursorLexicalParentPtr = - _lookup>( + _lookup>( 'clang_getCursorLexicalParent', ); late final _clang_getCursorLexicalParent = _clang_getCursorLexicalParentPtr - .asFunction(); + .asFunction(); /// Determine the linkage of the entity referred to by a given cursor. CXLinkageKind clang_getCursorLinkage(CXCursor cursor) { @@ -3266,11 +3468,11 @@ class LibClang { } late final _clang_getCursorLinkagePtr = - _lookup>( + _lookup>( 'clang_getCursorLinkage', ); late final _clang_getCursorLinkage = _clang_getCursorLinkagePtr - .asFunction(); + .asFunction(); /// Retrieve the physical location of the source constructor referenced /// by the given cursor. @@ -3285,11 +3487,11 @@ class LibClang { } late final _clang_getCursorLocationPtr = - _lookup>( + _lookup>( 'clang_getCursorLocation', ); late final _clang_getCursorLocation = _clang_getCursorLocationPtr - .asFunction(); + .asFunction(); /// Determine the availability of the entity that this cursor refers to /// on any platforms for which availability information is known. @@ -3346,12 +3548,32 @@ class LibClang { } late final _clang_getCursorPlatformAvailabilityPtr = - _lookup>( - 'clang_getCursorPlatformAvailability', - ); + _lookup< + ffi.NativeFunction< + ffi.Int Function( + CXCursor, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Int, + ) + > + >('clang_getCursorPlatformAvailability'); late final _clang_getCursorPlatformAvailability = _clang_getCursorPlatformAvailabilityPtr - .asFunction(); + .asFunction< + int Function( + CXCursor, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + int, + ) + >(); /// Pretty print declarations. /// @@ -3370,11 +3592,11 @@ class LibClang { } late final _clang_getCursorPrettyPrintedPtr = - _lookup>( - 'clang_getCursorPrettyPrinted', - ); + _lookup< + ffi.NativeFunction + >('clang_getCursorPrettyPrinted'); late final _clang_getCursorPrettyPrinted = _clang_getCursorPrettyPrintedPtr - .asFunction(); + .asFunction(); /// Retrieve the default policy for the cursor. /// @@ -3385,11 +3607,11 @@ class LibClang { } late final _clang_getCursorPrintingPolicyPtr = - _lookup>( + _lookup>( 'clang_getCursorPrintingPolicy', ); late final _clang_getCursorPrintingPolicy = _clang_getCursorPrintingPolicyPtr - .asFunction(); + .asFunction(); /// Given a cursor that references something else, return the source range /// covering that reference. @@ -3416,12 +3638,14 @@ class LibClang { } late final _clang_getCursorReferenceNameRangePtr = - _lookup>( - 'clang_getCursorReferenceNameRange', - ); + _lookup< + ffi.NativeFunction< + CXSourceRange Function(CXCursor, ffi.UnsignedInt, ffi.UnsignedInt) + > + >('clang_getCursorReferenceNameRange'); late final _clang_getCursorReferenceNameRange = _clang_getCursorReferenceNameRangePtr - .asFunction(); + .asFunction(); /// For a cursor that is a reference, retrieve a cursor representing the /// entity that it references. @@ -3437,11 +3661,11 @@ class LibClang { } late final _clang_getCursorReferencedPtr = - _lookup>( + _lookup>( 'clang_getCursorReferenced', ); late final _clang_getCursorReferenced = _clang_getCursorReferencedPtr - .asFunction(); + .asFunction(); /// Retrieve the return type associated with a given cursor. /// @@ -3451,11 +3675,11 @@ class LibClang { } late final _clang_getCursorResultTypePtr = - _lookup>( + _lookup>( 'clang_getCursorResultType', ); late final _clang_getCursorResultType = _clang_getCursorResultTypePtr - .asFunction(); + .asFunction(); /// Determine the semantic parent of the given cursor. /// @@ -3493,11 +3717,11 @@ class LibClang { } late final _clang_getCursorSemanticParentPtr = - _lookup>( + _lookup>( 'clang_getCursorSemanticParent', ); late final _clang_getCursorSemanticParent = _clang_getCursorSemanticParentPtr - .asFunction(); + .asFunction(); /// Retrieve a name for the entity referenced by this cursor. CXString clang_getCursorSpelling(CXCursor arg0) { @@ -3505,11 +3729,11 @@ class LibClang { } late final _clang_getCursorSpellingPtr = - _lookup>( + _lookup>( 'clang_getCursorSpelling', ); late final _clang_getCursorSpelling = _clang_getCursorSpellingPtr - .asFunction(); + .asFunction(); /// Determine the "thread-local storage (TLS) kind" of the declaration /// referred to by a cursor. @@ -3518,11 +3742,11 @@ class LibClang { } late final _clang_getCursorTLSKindPtr = - _lookup>( + _lookup>( 'clang_getCursorTLSKind', ); late final _clang_getCursorTLSKind = _clang_getCursorTLSKindPtr - .asFunction(); + .asFunction(); /// Retrieve the type of a CXCursor (if any). CXType clang_getCursorType(CXCursor C) { @@ -3530,11 +3754,11 @@ class LibClang { } late final _clang_getCursorTypePtr = - _lookup>( + _lookup>( 'clang_getCursorType', ); late final _clang_getCursorType = _clang_getCursorTypePtr - .asFunction(); + .asFunction(); /// Retrieve a Unified Symbol Resolution (USR) for the entity referenced /// by the given cursor. @@ -3548,11 +3772,11 @@ class LibClang { } late final _clang_getCursorUSRPtr = - _lookup>( + _lookup>( 'clang_getCursorUSR', ); late final _clang_getCursorUSR = _clang_getCursorUSRPtr - .asFunction(); + .asFunction(); /// Describe the visibility of the entity referred to by a cursor. /// @@ -3568,11 +3792,11 @@ class LibClang { } late final _clang_getCursorVisibilityPtr = - _lookup>( + _lookup>( 'clang_getCursorVisibility', ); late final _clang_getCursorVisibility = _clang_getCursorVisibilityPtr - .asFunction(); + .asFunction(); /// Returns the Objective-C type encoding for the specified declaration. CXString clang_getDeclObjCTypeEncoding(CXCursor C) { @@ -3580,11 +3804,11 @@ class LibClang { } late final _clang_getDeclObjCTypeEncodingPtr = - _lookup>( + _lookup>( 'clang_getDeclObjCTypeEncoding', ); late final _clang_getDeclObjCTypeEncoding = _clang_getDeclObjCTypeEncodingPtr - .asFunction(); + .asFunction(); void clang_getDefinitionSpellingAndExtent( CXCursor arg0, @@ -3607,12 +3831,32 @@ class LibClang { } late final _clang_getDefinitionSpellingAndExtentPtr = - _lookup>( - 'clang_getDefinitionSpellingAndExtent', - ); + _lookup< + ffi.NativeFunction< + ffi.Void Function( + CXCursor, + ffi.Pointer>, + ffi.Pointer>, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ) + > + >('clang_getDefinitionSpellingAndExtent'); late final _clang_getDefinitionSpellingAndExtent = _clang_getDefinitionSpellingAndExtentPtr - .asFunction(); + .asFunction< + void Function( + CXCursor, + ffi.Pointer>, + ffi.Pointer>, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ) + >(); /// Retrieve a diagnostic associated with the given translation unit. /// @@ -3626,11 +3870,13 @@ class LibClang { } late final _clang_getDiagnosticPtr = - _lookup>( - 'clang_getDiagnostic', - ); + _lookup< + ffi.NativeFunction< + CXDiagnostic Function(CXTranslationUnit, ffi.UnsignedInt) + > + >('clang_getDiagnostic'); late final _clang_getDiagnostic = _clang_getDiagnosticPtr - .asFunction(); + .asFunction(); /// Retrieve the category number for this diagnostic. /// @@ -3645,11 +3891,11 @@ class LibClang { } late final _clang_getDiagnosticCategoryPtr = - _lookup>( + _lookup>( 'clang_getDiagnosticCategory', ); late final _clang_getDiagnosticCategory = _clang_getDiagnosticCategoryPtr - .asFunction(); + .asFunction(); /// Retrieve the name of a particular diagnostic category. This /// is now deprecated. Use clang_getDiagnosticCategoryText() @@ -3665,12 +3911,11 @@ class LibClang { } late final _clang_getDiagnosticCategoryNamePtr = - _lookup>( + _lookup>( 'clang_getDiagnosticCategoryName', ); late final _clang_getDiagnosticCategoryName = - _clang_getDiagnosticCategoryNamePtr - .asFunction(); + _clang_getDiagnosticCategoryNamePtr.asFunction(); /// Retrieve the diagnostic category text for a given diagnostic. /// @@ -3680,12 +3925,12 @@ class LibClang { } late final _clang_getDiagnosticCategoryTextPtr = - _lookup>( + _lookup>( 'clang_getDiagnosticCategoryText', ); late final _clang_getDiagnosticCategoryText = _clang_getDiagnosticCategoryTextPtr - .asFunction(); + .asFunction(); /// Retrieve the replacement information for a given fix-it. /// @@ -3719,11 +3964,19 @@ class LibClang { } late final _clang_getDiagnosticFixItPtr = - _lookup>( - 'clang_getDiagnosticFixIt', - ); + _lookup< + ffi.NativeFunction< + CXString Function( + CXDiagnostic, + ffi.UnsignedInt, + ffi.Pointer, + ) + > + >('clang_getDiagnosticFixIt'); late final _clang_getDiagnosticFixIt = _clang_getDiagnosticFixItPtr - .asFunction(); + .asFunction< + CXString Function(CXDiagnostic, int, ffi.Pointer) + >(); /// Retrieve a diagnostic associated with the given CXDiagnosticSet. /// @@ -3737,11 +3990,13 @@ class LibClang { } late final _clang_getDiagnosticInSetPtr = - _lookup>( - 'clang_getDiagnosticInSet', - ); + _lookup< + ffi.NativeFunction< + CXDiagnostic Function(CXDiagnosticSet, ffi.UnsignedInt) + > + >('clang_getDiagnosticInSet'); late final _clang_getDiagnosticInSet = _clang_getDiagnosticInSetPtr - .asFunction(); + .asFunction(); /// Retrieve the source location of the given diagnostic. /// @@ -3752,11 +4007,11 @@ class LibClang { } late final _clang_getDiagnosticLocationPtr = - _lookup>( + _lookup>( 'clang_getDiagnosticLocation', ); late final _clang_getDiagnosticLocation = _clang_getDiagnosticLocationPtr - .asFunction(); + .asFunction(); /// Determine the number of fix-it hints associated with the /// given diagnostic. @@ -3765,11 +4020,11 @@ class LibClang { } late final _clang_getDiagnosticNumFixItsPtr = - _lookup>( + _lookup>( 'clang_getDiagnosticNumFixIts', ); late final _clang_getDiagnosticNumFixIts = _clang_getDiagnosticNumFixItsPtr - .asFunction(); + .asFunction(); /// Determine the number of source ranges associated with the given /// diagnostic. @@ -3778,11 +4033,11 @@ class LibClang { } late final _clang_getDiagnosticNumRangesPtr = - _lookup>( + _lookup>( 'clang_getDiagnosticNumRanges', ); late final _clang_getDiagnosticNumRanges = _clang_getDiagnosticNumRangesPtr - .asFunction(); + .asFunction(); /// Retrieve the name of the command-line option that enabled this /// diagnostic. @@ -3802,11 +4057,13 @@ class LibClang { } late final _clang_getDiagnosticOptionPtr = - _lookup>( - 'clang_getDiagnosticOption', - ); + _lookup< + ffi.NativeFunction< + CXString Function(CXDiagnostic, ffi.Pointer) + > + >('clang_getDiagnosticOption'); late final _clang_getDiagnosticOption = _clang_getDiagnosticOptionPtr - .asFunction(); + .asFunction)>(); /// Retrieve a source range associated with the diagnostic. /// @@ -3824,11 +4081,13 @@ class LibClang { } late final _clang_getDiagnosticRangePtr = - _lookup>( - 'clang_getDiagnosticRange', - ); + _lookup< + ffi.NativeFunction< + CXSourceRange Function(CXDiagnostic, ffi.UnsignedInt) + > + >('clang_getDiagnosticRange'); late final _clang_getDiagnosticRange = _clang_getDiagnosticRangePtr - .asFunction(); + .asFunction(); /// Retrieve the complete set of diagnostics associated with a /// translation unit. @@ -3839,11 +4098,11 @@ class LibClang { } late final _clang_getDiagnosticSetFromTUPtr = - _lookup>( + _lookup>( 'clang_getDiagnosticSetFromTU', ); late final _clang_getDiagnosticSetFromTU = _clang_getDiagnosticSetFromTUPtr - .asFunction(); + .asFunction(); /// Determine the severity of the given diagnostic. CXDiagnosticSeverity clang_getDiagnosticSeverity(CXDiagnostic arg0) { @@ -3851,11 +4110,11 @@ class LibClang { } late final _clang_getDiagnosticSeverityPtr = - _lookup>( + _lookup>( 'clang_getDiagnosticSeverity', ); late final _clang_getDiagnosticSeverity = _clang_getDiagnosticSeverityPtr - .asFunction(); + .asFunction(); /// Retrieve the text of the given diagnostic. CXString clang_getDiagnosticSpelling(CXDiagnostic arg0) { @@ -3863,11 +4122,11 @@ class LibClang { } late final _clang_getDiagnosticSpellingPtr = - _lookup>( + _lookup>( 'clang_getDiagnosticSpelling', ); late final _clang_getDiagnosticSpelling = _clang_getDiagnosticSpellingPtr - .asFunction(); + .asFunction(); /// Return the element type of an array, complex, or vector type. /// @@ -3878,11 +4137,11 @@ class LibClang { } late final _clang_getElementTypePtr = - _lookup>( + _lookup>( 'clang_getElementType', ); late final _clang_getElementType = _clang_getElementTypePtr - .asFunction(); + .asFunction(); /// Retrieve the integer value of an enum constant declaration as an unsigned /// long long. @@ -3895,12 +4154,12 @@ class LibClang { } late final _clang_getEnumConstantDeclUnsignedValuePtr = - _lookup>( + _lookup>( 'clang_getEnumConstantDeclUnsignedValue', ); late final _clang_getEnumConstantDeclUnsignedValue = _clang_getEnumConstantDeclUnsignedValuePtr - .asFunction(); + .asFunction(); /// Retrieve the integer value of an enum constant declaration as a signed /// long long. @@ -3913,12 +4172,11 @@ class LibClang { } late final _clang_getEnumConstantDeclValuePtr = - _lookup>( + _lookup>( 'clang_getEnumConstantDeclValue', ); late final _clang_getEnumConstantDeclValue = - _clang_getEnumConstantDeclValuePtr - .asFunction(); + _clang_getEnumConstantDeclValuePtr.asFunction(); /// Retrieve the integer type of an enum declaration. /// @@ -3929,11 +4187,11 @@ class LibClang { } late final _clang_getEnumDeclIntegerTypePtr = - _lookup>( + _lookup>( 'clang_getEnumDeclIntegerType', ); late final _clang_getEnumDeclIntegerType = _clang_getEnumDeclIntegerTypePtr - .asFunction(); + .asFunction(); /// Retrieve the exception specification type associated with a function type. /// This is a value of type CXCursor_ExceptionSpecificationKind. @@ -3944,12 +4202,12 @@ class LibClang { } late final _clang_getExceptionSpecificationTypePtr = - _lookup>( + _lookup>( 'clang_getExceptionSpecificationType', ); late final _clang_getExceptionSpecificationType = _clang_getExceptionSpecificationTypePtr - .asFunction(); + .asFunction(); /// Retrieve the file, line, column, and offset represented by /// the given source location. @@ -3982,11 +4240,27 @@ class LibClang { } late final _clang_getExpansionLocationPtr = - _lookup>( - 'clang_getExpansionLocation', - ); + _lookup< + ffi.NativeFunction< + ffi.Void Function( + CXSourceLocation, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ) + > + >('clang_getExpansionLocation'); late final _clang_getExpansionLocation = _clang_getExpansionLocationPtr - .asFunction(); + .asFunction< + void Function( + CXSourceLocation, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ) + >(); /// Retrieve the bit width of a bit field declaration as an integer. /// @@ -3996,11 +4270,11 @@ class LibClang { } late final _clang_getFieldDeclBitWidthPtr = - _lookup>( + _lookup>( 'clang_getFieldDeclBitWidth', ); late final _clang_getFieldDeclBitWidth = _clang_getFieldDeclBitWidthPtr - .asFunction(); + .asFunction(); /// Retrieve a file handle within the given translation unit. /// @@ -4015,8 +4289,13 @@ class LibClang { } late final _clang_getFilePtr = - _lookup>('clang_getFile'); - late final _clang_getFile = _clang_getFilePtr.asFunction(); + _lookup< + ffi.NativeFunction< + CXFile Function(CXTranslationUnit, ffi.Pointer) + > + >('clang_getFile'); + late final _clang_getFile = _clang_getFilePtr + .asFunction)>(); /// Retrieve the buffer associated with the given file. /// @@ -4037,11 +4316,23 @@ class LibClang { } late final _clang_getFileContentsPtr = - _lookup>( - 'clang_getFileContents', - ); + _lookup< + ffi.NativeFunction< + ffi.Pointer Function( + CXTranslationUnit, + CXFile, + ffi.Pointer, + ) + > + >('clang_getFileContents'); late final _clang_getFileContents = _clang_getFileContentsPtr - .asFunction(); + .asFunction< + ffi.Pointer Function( + CXTranslationUnit, + CXFile, + ffi.Pointer, + ) + >(); /// Retrieve the file, line, column, and offset represented by /// the given source location. @@ -4075,11 +4366,27 @@ class LibClang { } late final _clang_getFileLocationPtr = - _lookup>( - 'clang_getFileLocation', - ); + _lookup< + ffi.NativeFunction< + ffi.Void Function( + CXSourceLocation, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ) + > + >('clang_getFileLocation'); late final _clang_getFileLocation = _clang_getFileLocationPtr - .asFunction(); + .asFunction< + void Function( + CXSourceLocation, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ) + >(); /// Retrieve the complete file and path name of the given file. CXString clang_getFileName(CXFile SFile) { @@ -4087,9 +4394,11 @@ class LibClang { } late final _clang_getFileNamePtr = - _lookup>('clang_getFileName'); + _lookup>( + 'clang_getFileName', + ); late final _clang_getFileName = _clang_getFileNamePtr - .asFunction(); + .asFunction(); /// Retrieve the last modification time of the given file. int clang_getFileTime(CXFile SFile) { @@ -4097,9 +4406,11 @@ class LibClang { } late final _clang_getFileTimePtr = - _lookup>('clang_getFileTime'); + _lookup>( + 'clang_getFileTime', + ); late final _clang_getFileTime = _clang_getFileTimePtr - .asFunction(); + .asFunction(); /// Retrieve the unique ID for the given \c file. /// @@ -4112,11 +4423,13 @@ class LibClang { } late final _clang_getFileUniqueIDPtr = - _lookup>( - 'clang_getFileUniqueID', - ); + _lookup< + ffi.NativeFunction< + ffi.Int Function(CXFile, ffi.Pointer) + > + >('clang_getFileUniqueID'); late final _clang_getFileUniqueID = _clang_getFileUniqueIDPtr - .asFunction(); + .asFunction)>(); /// Retrieve the calling convention associated with a function type. /// @@ -4126,12 +4439,11 @@ class LibClang { } late final _clang_getFunctionTypeCallingConvPtr = - _lookup>( + _lookup>( 'clang_getFunctionTypeCallingConv', ); late final _clang_getFunctionTypeCallingConv = - _clang_getFunctionTypeCallingConvPtr - .asFunction(); + _clang_getFunctionTypeCallingConvPtr.asFunction(); /// For cursors representing an iboutletcollection attribute, /// this function returns the collection element type. @@ -4140,12 +4452,12 @@ class LibClang { } late final _clang_getIBOutletCollectionTypePtr = - _lookup>( + _lookup>( 'clang_getIBOutletCollectionType', ); late final _clang_getIBOutletCollectionType = _clang_getIBOutletCollectionTypePtr - .asFunction(); + .asFunction(); /// Retrieve the file that is included by the given inclusion directive /// cursor. @@ -4154,11 +4466,11 @@ class LibClang { } late final _clang_getIncludedFilePtr = - _lookup>( + _lookup>( 'clang_getIncludedFile', ); late final _clang_getIncludedFile = _clang_getIncludedFilePtr - .asFunction(); + .asFunction(); /// Visit the set of preprocessor inclusions in a translation unit. /// The visitor function is called with the provided data for every included @@ -4173,11 +4485,15 @@ class LibClang { } late final _clang_getInclusionsPtr = - _lookup>( - 'clang_getInclusions', - ); + _lookup< + ffi.NativeFunction< + ffi.Void Function(CXTranslationUnit, CXInclusionVisitor, CXClientData) + > + >('clang_getInclusions'); late final _clang_getInclusions = _clang_getInclusionsPtr - .asFunction(); + .asFunction< + void Function(CXTranslationUnit, CXInclusionVisitor, CXClientData) + >(); /// Legacy API to retrieve the file, line, column, and offset represented /// by the given source location. @@ -4202,12 +4518,28 @@ class LibClang { } late final _clang_getInstantiationLocationPtr = - _lookup>( - 'clang_getInstantiationLocation', - ); + _lookup< + ffi.NativeFunction< + ffi.Void Function( + CXSourceLocation, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ) + > + >('clang_getInstantiationLocation'); late final _clang_getInstantiationLocation = _clang_getInstantiationLocationPtr - .asFunction(); + .asFunction< + void Function( + CXSourceLocation, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ) + >(); /// Retrieves the source location associated with a given file/line/column /// in a particular translation unit. @@ -4221,9 +4553,20 @@ class LibClang { } late final _clang_getLocationPtr = - _lookup>('clang_getLocation'); + _lookup< + ffi.NativeFunction< + CXSourceLocation Function( + CXTranslationUnit, + CXFile, + ffi.UnsignedInt, + ffi.UnsignedInt, + ) + > + >('clang_getLocation'); late final _clang_getLocation = _clang_getLocationPtr - .asFunction(); + .asFunction< + CXSourceLocation Function(CXTranslationUnit, CXFile, int, int) + >(); /// Retrieves the source location associated with a given character offset /// in a particular translation unit. @@ -4236,11 +4579,13 @@ class LibClang { } late final _clang_getLocationForOffsetPtr = - _lookup>( - 'clang_getLocationForOffset', - ); + _lookup< + ffi.NativeFunction< + CXSourceLocation Function(CXTranslationUnit, CXFile, ffi.UnsignedInt) + > + >('clang_getLocationForOffset'); late final _clang_getLocationForOffset = _clang_getLocationForOffsetPtr - .asFunction(); + .asFunction(); /// Given a CXFile header file, return the module that contains it, if one /// exists. @@ -4249,11 +4594,11 @@ class LibClang { } late final _clang_getModuleForFilePtr = - _lookup>( + _lookup>( 'clang_getModuleForFile', ); late final _clang_getModuleForFile = _clang_getModuleForFilePtr - .asFunction(); + .asFunction(); /// Retrieve the NULL cursor, which represents no entity. CXCursor clang_getNullCursor() { @@ -4261,11 +4606,9 @@ class LibClang { } late final _clang_getNullCursorPtr = - _lookup>( - 'clang_getNullCursor', - ); + _lookup>('clang_getNullCursor'); late final _clang_getNullCursor = _clang_getNullCursorPtr - .asFunction(); + .asFunction(); /// Retrieve a NULL (invalid) source location. CXSourceLocation clang_getNullLocation() { @@ -4273,11 +4616,11 @@ class LibClang { } late final _clang_getNullLocationPtr = - _lookup>( + _lookup>( 'clang_getNullLocation', ); late final _clang_getNullLocation = _clang_getNullLocationPtr - .asFunction(); + .asFunction(); /// Retrieve a NULL (invalid) source range. CXSourceRange clang_getNullRange() { @@ -4285,11 +4628,11 @@ class LibClang { } late final _clang_getNullRangePtr = - _lookup>( + _lookup>( 'clang_getNullRange', ); late final _clang_getNullRange = _clang_getNullRangePtr - .asFunction(); + .asFunction(); /// Retrieve the number of non-variadic parameters associated with a /// function type. @@ -4300,11 +4643,11 @@ class LibClang { } late final _clang_getNumArgTypesPtr = - _lookup>( + _lookup>( 'clang_getNumArgTypes', ); late final _clang_getNumArgTypes = _clang_getNumArgTypesPtr - .asFunction(); + .asFunction(); /// Retrieve the number of chunks in the given code-completion string. int clang_getNumCompletionChunks(CXCompletionString completion_string) { @@ -4312,11 +4655,11 @@ class LibClang { } late final _clang_getNumCompletionChunksPtr = - _lookup>( + _lookup>( 'clang_getNumCompletionChunks', ); late final _clang_getNumCompletionChunks = _clang_getNumCompletionChunksPtr - .asFunction(); + .asFunction(); /// Determine the number of diagnostics produced for the given /// translation unit. @@ -4325,11 +4668,11 @@ class LibClang { } late final _clang_getNumDiagnosticsPtr = - _lookup>( + _lookup>( 'clang_getNumDiagnostics', ); late final _clang_getNumDiagnostics = _clang_getNumDiagnosticsPtr - .asFunction(); + .asFunction(); /// Determine the number of diagnostics in a CXDiagnosticSet. int clang_getNumDiagnosticsInSet(CXDiagnosticSet Diags) { @@ -4337,11 +4680,11 @@ class LibClang { } late final _clang_getNumDiagnosticsInSetPtr = - _lookup>( + _lookup>( 'clang_getNumDiagnosticsInSet', ); late final _clang_getNumDiagnosticsInSet = _clang_getNumDiagnosticsInSetPtr - .asFunction(); + .asFunction(); /// Return the number of elements of an array or vector type. /// @@ -4352,11 +4695,11 @@ class LibClang { } late final _clang_getNumElementsPtr = - _lookup>( + _lookup>( 'clang_getNumElements', ); late final _clang_getNumElements = _clang_getNumElementsPtr - .asFunction(); + .asFunction(); /// Determine the number of overloaded declarations referenced by a /// \c CXCursor_OverloadedDeclRef cursor. @@ -4370,11 +4713,11 @@ class LibClang { } late final _clang_getNumOverloadedDeclsPtr = - _lookup>( + _lookup>( 'clang_getNumOverloadedDecls', ); late final _clang_getNumOverloadedDecls = _clang_getNumOverloadedDeclsPtr - .asFunction(); + .asFunction(); /// Retrieve a cursor for one of the overloaded declarations referenced /// by a \c CXCursor_OverloadedDeclRef cursor. @@ -4393,11 +4736,11 @@ class LibClang { } late final _clang_getOverloadedDeclPtr = - _lookup>( + _lookup>( 'clang_getOverloadedDecl', ); late final _clang_getOverloadedDecl = _clang_getOverloadedDeclPtr - .asFunction(); + .asFunction(); /// Determine the set of methods that are overridden by the given /// method. @@ -4449,11 +4792,23 @@ class LibClang { } late final _clang_getOverriddenCursorsPtr = - _lookup>( - 'clang_getOverriddenCursors', - ); + _lookup< + ffi.NativeFunction< + ffi.Void Function( + CXCursor, + ffi.Pointer>, + ffi.Pointer, + ) + > + >('clang_getOverriddenCursors'); late final _clang_getOverriddenCursors = _clang_getOverriddenCursorsPtr - .asFunction(); + .asFunction< + void Function( + CXCursor, + ffi.Pointer>, + ffi.Pointer, + ) + >(); /// For pointer types, returns the type of the pointee. CXType clang_getPointeeType(CXType T) { @@ -4461,11 +4816,11 @@ class LibClang { } late final _clang_getPointeeTypePtr = - _lookup>( + _lookup>( 'clang_getPointeeType', ); late final _clang_getPointeeType = _clang_getPointeeTypePtr - .asFunction(); + .asFunction(); /// Retrieve the file, line and column represented by the given source /// location, as specified in a # line directive. @@ -4515,11 +4870,25 @@ class LibClang { } late final _clang_getPresumedLocationPtr = - _lookup>( - 'clang_getPresumedLocation', - ); + _lookup< + ffi.NativeFunction< + ffi.Void Function( + CXSourceLocation, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ) + > + >('clang_getPresumedLocation'); late final _clang_getPresumedLocation = _clang_getPresumedLocationPtr - .asFunction(); + .asFunction< + void Function( + CXSourceLocation, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ) + >(); /// Retrieve a source range given the beginning and ending source /// locations. @@ -4528,9 +4897,13 @@ class LibClang { } late final _clang_getRangePtr = - _lookup>('clang_getRange'); + _lookup< + ffi.NativeFunction< + CXSourceRange Function(CXSourceLocation, CXSourceLocation) + > + >('clang_getRange'); late final _clang_getRange = _clang_getRangePtr - .asFunction(); + .asFunction(); /// Retrieve a source location representing the last character within a /// source range. @@ -4539,9 +4912,11 @@ class LibClang { } late final _clang_getRangeEndPtr = - _lookup>('clang_getRangeEnd'); + _lookup>( + 'clang_getRangeEnd', + ); late final _clang_getRangeEnd = _clang_getRangeEndPtr - .asFunction(); + .asFunction(); /// Retrieve a source location representing the first character within a /// source range. @@ -4550,11 +4925,11 @@ class LibClang { } late final _clang_getRangeStartPtr = - _lookup>( + _lookup>( 'clang_getRangeStart', ); late final _clang_getRangeStart = _clang_getRangeStartPtr - .asFunction(); + .asFunction(); /// Retrieve a remapping. /// @@ -4567,11 +4942,11 @@ class LibClang { } late final _clang_getRemappingsPtr = - _lookup>( + _lookup)>>( 'clang_getRemappings', ); late final _clang_getRemappings = _clang_getRemappingsPtr - .asFunction(); + .asFunction)>(); /// Retrieve a remapping. /// @@ -4589,12 +4964,19 @@ class LibClang { } late final _clang_getRemappingsFromFileListPtr = - _lookup>( - 'clang_getRemappingsFromFileList', - ); + _lookup< + ffi.NativeFunction< + CXRemapping Function( + ffi.Pointer>, + ffi.UnsignedInt, + ) + > + >('clang_getRemappingsFromFileList'); late final _clang_getRemappingsFromFileList = _clang_getRemappingsFromFileListPtr - .asFunction(); + .asFunction< + CXRemapping Function(ffi.Pointer>, int) + >(); /// Retrieve the return type associated with a function type. /// @@ -4604,11 +4986,11 @@ class LibClang { } late final _clang_getResultTypePtr = - _lookup>( + _lookup>( 'clang_getResultType', ); late final _clang_getResultType = _clang_getResultTypePtr - .asFunction(); + .asFunction(); /// Retrieve all ranges that were skipped by the preprocessor. /// @@ -4622,11 +5004,15 @@ class LibClang { } late final _clang_getSkippedRangesPtr = - _lookup>( - 'clang_getSkippedRanges', - ); + _lookup< + ffi.NativeFunction< + ffi.Pointer Function(CXTranslationUnit, CXFile) + > + >('clang_getSkippedRanges'); late final _clang_getSkippedRanges = _clang_getSkippedRangesPtr - .asFunction(); + .asFunction< + ffi.Pointer Function(CXTranslationUnit, CXFile) + >(); /// Given a cursor that may represent a specialization or instantiation /// of a template, retrieve the cursor that represents the template that it @@ -4659,12 +5045,12 @@ class LibClang { } late final _clang_getSpecializedCursorTemplatePtr = - _lookup>( + _lookup>( 'clang_getSpecializedCursorTemplate', ); late final _clang_getSpecializedCursorTemplate = _clang_getSpecializedCursorTemplatePtr - .asFunction(); + .asFunction(); /// Retrieve the file, line, column, and offset represented by /// the given source location. @@ -4697,11 +5083,27 @@ class LibClang { } late final _clang_getSpellingLocationPtr = - _lookup>( - 'clang_getSpellingLocation', - ); + _lookup< + ffi.NativeFunction< + ffi.Void Function( + CXSourceLocation, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ) + > + >('clang_getSpellingLocation'); late final _clang_getSpellingLocation = _clang_getSpellingLocationPtr - .asFunction(); + .asFunction< + void Function( + CXSourceLocation, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ) + >(); /// Returns the human-readable null-terminated C string that represents /// the name of the memory category. This string should never be freed. @@ -4712,11 +5114,11 @@ class LibClang { } late final _clang_getTUResourceUsageNamePtr = - _lookup>( - 'clang_getTUResourceUsageName', - ); + _lookup< + ffi.NativeFunction Function(ffi.UnsignedInt)> + >('clang_getTUResourceUsageName'); late final _clang_getTUResourceUsageName = _clang_getTUResourceUsageNamePtr - .asFunction(); + .asFunction Function(int)>(); /// Given a cursor that represents a template, determine /// the cursor kind of the specializations would be generated by instantiating @@ -4738,11 +5140,11 @@ class LibClang { } late final _clang_getTemplateCursorKindPtr = - _lookup>( + _lookup>( 'clang_getTemplateCursorKind', ); late final _clang_getTemplateCursorKind = _clang_getTemplateCursorKindPtr - .asFunction(); + .asFunction(); /// Get the raw lexical token starting with the given location. /// @@ -4761,9 +5163,15 @@ class LibClang { } late final _clang_getTokenPtr = - _lookup>('clang_getToken'); + _lookup< + ffi.NativeFunction< + ffi.Pointer Function(CXTranslationUnit, CXSourceLocation) + > + >('clang_getToken'); late final _clang_getToken = _clang_getTokenPtr - .asFunction(); + .asFunction< + ffi.Pointer Function(CXTranslationUnit, CXSourceLocation) + >(); /// Retrieve a source range that covers the given token. CXSourceRange clang_getTokenExtent(CXTranslationUnit arg0, CXToken arg1) { @@ -4771,11 +5179,11 @@ class LibClang { } late final _clang_getTokenExtentPtr = - _lookup>( - 'clang_getTokenExtent', - ); + _lookup< + ffi.NativeFunction + >('clang_getTokenExtent'); late final _clang_getTokenExtent = _clang_getTokenExtentPtr - .asFunction(); + .asFunction(); /// Determine the kind of the given token. CXTokenKind clang_getTokenKind(CXToken arg0) { @@ -4783,11 +5191,11 @@ class LibClang { } late final _clang_getTokenKindPtr = - _lookup>( + _lookup>( 'clang_getTokenKind', ); late final _clang_getTokenKind = _clang_getTokenKindPtr - .asFunction(); + .asFunction(); /// Retrieve the source location of the given token. CXSourceLocation clang_getTokenLocation( @@ -4798,11 +5206,13 @@ class LibClang { } late final _clang_getTokenLocationPtr = - _lookup>( - 'clang_getTokenLocation', - ); + _lookup< + ffi.NativeFunction< + CXSourceLocation Function(CXTranslationUnit, CXToken) + > + >('clang_getTokenLocation'); late final _clang_getTokenLocation = _clang_getTokenLocationPtr - .asFunction(); + .asFunction(); /// Determine the spelling of the given token. /// @@ -4813,11 +5223,11 @@ class LibClang { } late final _clang_getTokenSpellingPtr = - _lookup>( - 'clang_getTokenSpelling', - ); + _lookup< + ffi.NativeFunction + >('clang_getTokenSpelling'); late final _clang_getTokenSpelling = _clang_getTokenSpellingPtr - .asFunction(); + .asFunction(); /// Retrieve the cursor that represents the given translation unit. /// @@ -4828,12 +5238,12 @@ class LibClang { } late final _clang_getTranslationUnitCursorPtr = - _lookup>( + _lookup>( 'clang_getTranslationUnitCursor', ); late final _clang_getTranslationUnitCursor = _clang_getTranslationUnitCursorPtr - .asFunction(); + .asFunction(); /// Get the original translation unit source file name. CXString clang_getTranslationUnitSpelling(CXTranslationUnit CTUnit) { @@ -4841,12 +5251,12 @@ class LibClang { } late final _clang_getTranslationUnitSpellingPtr = - _lookup>( + _lookup>( 'clang_getTranslationUnitSpelling', ); late final _clang_getTranslationUnitSpelling = _clang_getTranslationUnitSpellingPtr - .asFunction(); + .asFunction(); /// Get target information for this translation unit. /// @@ -4856,12 +5266,12 @@ class LibClang { } late final _clang_getTranslationUnitTargetInfoPtr = - _lookup>( + _lookup>( 'clang_getTranslationUnitTargetInfo', ); late final _clang_getTranslationUnitTargetInfo = _clang_getTranslationUnitTargetInfoPtr - .asFunction(); + .asFunction(); /// Return the cursor for the declaration of the given type. CXCursor clang_getTypeDeclaration(CXType T) { @@ -4869,11 +5279,11 @@ class LibClang { } late final _clang_getTypeDeclarationPtr = - _lookup>( + _lookup>( 'clang_getTypeDeclaration', ); late final _clang_getTypeDeclaration = _clang_getTypeDeclarationPtr - .asFunction(); + .asFunction(); /// Retrieve the spelling of a given CXTypeKind. CXString clang_getTypeKindSpelling(CXTypeKind K) { @@ -4881,11 +5291,11 @@ class LibClang { } late final _clang_getTypeKindSpellingPtr = - _lookup>( + _lookup>( 'clang_getTypeKindSpelling', ); late final _clang_getTypeKindSpelling = _clang_getTypeKindSpellingPtr - .asFunction(); + .asFunction(); /// Pretty-print the underlying type using the rules of the /// language of the translation unit from which it came. @@ -4896,11 +5306,11 @@ class LibClang { } late final _clang_getTypeSpellingPtr = - _lookup>( + _lookup>( 'clang_getTypeSpelling', ); late final _clang_getTypeSpelling = _clang_getTypeSpellingPtr - .asFunction(); + .asFunction(); /// Retrieve the underlying type of a typedef declaration. /// @@ -4911,12 +5321,12 @@ class LibClang { } late final _clang_getTypedefDeclUnderlyingTypePtr = - _lookup>( + _lookup>( 'clang_getTypedefDeclUnderlyingType', ); late final _clang_getTypedefDeclUnderlyingType = _clang_getTypedefDeclUnderlyingTypePtr - .asFunction(); + .asFunction(); /// Returns the typedef name of the given type. CXString clang_getTypedefName(CXType CT) { @@ -4924,11 +5334,11 @@ class LibClang { } late final _clang_getTypedefNamePtr = - _lookup>( + _lookup>( 'clang_getTypedefName', ); late final _clang_getTypedefName = _clang_getTypedefNamePtr - .asFunction(); + .asFunction(); /// Compute a hash value for the given cursor. int clang_hashCursor(CXCursor arg0) { @@ -4936,9 +5346,11 @@ class LibClang { } late final _clang_hashCursorPtr = - _lookup>('clang_hashCursor'); + _lookup>( + 'clang_hashCursor', + ); late final _clang_hashCursor = _clang_hashCursorPtr - .asFunction(); + .asFunction(); /// Retrieve the CXSourceLocation represented by the given CXIdxLoc. CXSourceLocation clang_indexLoc_getCXSourceLocation(CXIdxLoc loc) { @@ -4946,12 +5358,12 @@ class LibClang { } late final _clang_indexLoc_getCXSourceLocationPtr = - _lookup>( + _lookup>( 'clang_indexLoc_getCXSourceLocation', ); late final _clang_indexLoc_getCXSourceLocation = _clang_indexLoc_getCXSourceLocationPtr - .asFunction(); + .asFunction(); /// Retrieve the CXIdxFile, file, line, column, and offset represented by /// the given CXIdxLoc. @@ -4978,12 +5390,30 @@ class LibClang { } late final _clang_indexLoc_getFileLocationPtr = - _lookup>( - 'clang_indexLoc_getFileLocation', - ); + _lookup< + ffi.NativeFunction< + ffi.Void Function( + CXIdxLoc, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ) + > + >('clang_indexLoc_getFileLocation'); late final _clang_indexLoc_getFileLocation = _clang_indexLoc_getFileLocationPtr - .asFunction(); + .asFunction< + void Function( + CXIdxLoc, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ) + >(); /// Index the given source file and the translation unit corresponding /// to that file via callbacks implemented through #IndexerCallbacks. @@ -5039,11 +5469,41 @@ class LibClang { } late final _clang_indexSourceFilePtr = - _lookup>( - 'clang_indexSourceFile', - ); + _lookup< + ffi.NativeFunction< + ffi.Int Function( + CXIndexAction, + CXClientData, + ffi.Pointer, + ffi.UnsignedInt, + ffi.UnsignedInt, + ffi.Pointer, + ffi.Pointer>, + ffi.Int, + ffi.Pointer, + ffi.UnsignedInt, + ffi.Pointer, + ffi.UnsignedInt, + ) + > + >('clang_indexSourceFile'); late final _clang_indexSourceFile = _clang_indexSourceFilePtr - .asFunction(); + .asFunction< + int Function( + CXIndexAction, + CXClientData, + ffi.Pointer, + int, + int, + ffi.Pointer, + ffi.Pointer>, + int, + ffi.Pointer, + int, + ffi.Pointer, + int, + ) + >(); /// Same as clang_indexSourceFile but requires a full command line /// for \c command_line_args including argv[0]. This is useful if the standard @@ -5079,11 +5539,41 @@ class LibClang { } late final _clang_indexSourceFileFullArgvPtr = - _lookup>( - 'clang_indexSourceFileFullArgv', - ); + _lookup< + ffi.NativeFunction< + ffi.Int Function( + CXIndexAction, + CXClientData, + ffi.Pointer, + ffi.UnsignedInt, + ffi.UnsignedInt, + ffi.Pointer, + ffi.Pointer>, + ffi.Int, + ffi.Pointer, + ffi.UnsignedInt, + ffi.Pointer, + ffi.UnsignedInt, + ) + > + >('clang_indexSourceFileFullArgv'); late final _clang_indexSourceFileFullArgv = _clang_indexSourceFileFullArgvPtr - .asFunction(); + .asFunction< + int Function( + CXIndexAction, + CXClientData, + ffi.Pointer, + int, + int, + ffi.Pointer, + ffi.Pointer>, + int, + ffi.Pointer, + int, + ffi.Pointer, + int, + ) + >(); /// Index the given translation unit via callbacks implemented through /// #IndexerCallbacks. @@ -5118,11 +5608,29 @@ class LibClang { } late final _clang_indexTranslationUnitPtr = - _lookup>( - 'clang_indexTranslationUnit', - ); + _lookup< + ffi.NativeFunction< + ffi.Int Function( + CXIndexAction, + CXClientData, + ffi.Pointer, + ffi.UnsignedInt, + ffi.UnsignedInt, + CXTranslationUnit, + ) + > + >('clang_indexTranslationUnit'); late final _clang_indexTranslationUnit = _clang_indexTranslationUnitPtr - .asFunction(); + .asFunction< + int Function( + CXIndexAction, + CXClientData, + ffi.Pointer, + int, + int, + CXTranslationUnit, + ) + >(); ffi.Pointer clang_index_getCXXClassDeclInfo( ffi.Pointer arg0, @@ -5131,12 +5639,20 @@ class LibClang { } late final _clang_index_getCXXClassDeclInfoPtr = - _lookup>( - 'clang_index_getCXXClassDeclInfo', - ); + _lookup< + ffi.NativeFunction< + ffi.Pointer Function( + ffi.Pointer, + ) + > + >('clang_index_getCXXClassDeclInfo'); late final _clang_index_getCXXClassDeclInfo = _clang_index_getCXXClassDeclInfoPtr - .asFunction(); + .asFunction< + ffi.Pointer Function( + ffi.Pointer, + ) + >(); /// For retrieving a custom CXIdxClientContainer attached to a /// container. @@ -5147,12 +5663,16 @@ class LibClang { } late final _clang_index_getClientContainerPtr = - _lookup>( - 'clang_index_getClientContainer', - ); + _lookup< + ffi.NativeFunction< + CXIdxClientContainer Function(ffi.Pointer) + > + >('clang_index_getClientContainer'); late final _clang_index_getClientContainer = _clang_index_getClientContainerPtr - .asFunction(); + .asFunction< + CXIdxClientContainer Function(ffi.Pointer) + >(); /// For retrieving a custom CXIdxClientEntity attached to an entity. CXIdxClientEntity clang_index_getClientEntity( @@ -5162,11 +5682,13 @@ class LibClang { } late final _clang_index_getClientEntityPtr = - _lookup>( - 'clang_index_getClientEntity', - ); + _lookup< + ffi.NativeFunction< + CXIdxClientEntity Function(ffi.Pointer) + > + >('clang_index_getClientEntity'); late final _clang_index_getClientEntity = _clang_index_getClientEntityPtr - .asFunction(); + .asFunction)>(); ffi.Pointer clang_index_getIBOutletCollectionAttrInfo(ffi.Pointer arg0) { @@ -5175,11 +5697,19 @@ class LibClang { late final _clang_index_getIBOutletCollectionAttrInfoPtr = _lookup< - ffi.NativeFunction + ffi.NativeFunction< + ffi.Pointer Function( + ffi.Pointer, + ) + > >('clang_index_getIBOutletCollectionAttrInfo'); late final _clang_index_getIBOutletCollectionAttrInfo = _clang_index_getIBOutletCollectionAttrInfoPtr - .asFunction(); + .asFunction< + ffi.Pointer Function( + ffi.Pointer, + ) + >(); ffi.Pointer clang_index_getObjCCategoryDeclInfo( ffi.Pointer arg0, @@ -5188,12 +5718,20 @@ class LibClang { } late final _clang_index_getObjCCategoryDeclInfoPtr = - _lookup>( - 'clang_index_getObjCCategoryDeclInfo', - ); + _lookup< + ffi.NativeFunction< + ffi.Pointer Function( + ffi.Pointer, + ) + > + >('clang_index_getObjCCategoryDeclInfo'); late final _clang_index_getObjCCategoryDeclInfo = _clang_index_getObjCCategoryDeclInfoPtr - .asFunction(); + .asFunction< + ffi.Pointer Function( + ffi.Pointer, + ) + >(); ffi.Pointer clang_index_getObjCContainerDeclInfo( ffi.Pointer arg0, @@ -5202,12 +5740,20 @@ class LibClang { } late final _clang_index_getObjCContainerDeclInfoPtr = - _lookup>( - 'clang_index_getObjCContainerDeclInfo', - ); + _lookup< + ffi.NativeFunction< + ffi.Pointer Function( + ffi.Pointer, + ) + > + >('clang_index_getObjCContainerDeclInfo'); late final _clang_index_getObjCContainerDeclInfo = _clang_index_getObjCContainerDeclInfoPtr - .asFunction(); + .asFunction< + ffi.Pointer Function( + ffi.Pointer, + ) + >(); ffi.Pointer clang_index_getObjCInterfaceDeclInfo( ffi.Pointer arg0, @@ -5216,12 +5762,20 @@ class LibClang { } late final _clang_index_getObjCInterfaceDeclInfoPtr = - _lookup>( - 'clang_index_getObjCInterfaceDeclInfo', - ); + _lookup< + ffi.NativeFunction< + ffi.Pointer Function( + ffi.Pointer, + ) + > + >('clang_index_getObjCInterfaceDeclInfo'); late final _clang_index_getObjCInterfaceDeclInfo = _clang_index_getObjCInterfaceDeclInfoPtr - .asFunction(); + .asFunction< + ffi.Pointer Function( + ffi.Pointer, + ) + >(); ffi.Pointer clang_index_getObjCPropertyDeclInfo( ffi.Pointer arg0, @@ -5230,12 +5784,20 @@ class LibClang { } late final _clang_index_getObjCPropertyDeclInfoPtr = - _lookup>( - 'clang_index_getObjCPropertyDeclInfo', - ); + _lookup< + ffi.NativeFunction< + ffi.Pointer Function( + ffi.Pointer, + ) + > + >('clang_index_getObjCPropertyDeclInfo'); late final _clang_index_getObjCPropertyDeclInfo = _clang_index_getObjCPropertyDeclInfoPtr - .asFunction(); + .asFunction< + ffi.Pointer Function( + ffi.Pointer, + ) + >(); ffi.Pointer clang_index_getObjCProtocolRefListInfo(ffi.Pointer arg0) { @@ -5243,24 +5805,31 @@ class LibClang { } late final _clang_index_getObjCProtocolRefListInfoPtr = - _lookup>( - 'clang_index_getObjCProtocolRefListInfo', - ); + _lookup< + ffi.NativeFunction< + ffi.Pointer Function( + ffi.Pointer, + ) + > + >('clang_index_getObjCProtocolRefListInfo'); late final _clang_index_getObjCProtocolRefListInfo = _clang_index_getObjCProtocolRefListInfoPtr - .asFunction(); + .asFunction< + ffi.Pointer Function( + ffi.Pointer, + ) + >(); int clang_index_isEntityObjCContainerKind(CXIdxEntityKind arg0) { return _clang_index_isEntityObjCContainerKind(arg0.value); } late final _clang_index_isEntityObjCContainerKindPtr = - _lookup>( + _lookup>( 'clang_index_isEntityObjCContainerKind', ); late final _clang_index_isEntityObjCContainerKind = - _clang_index_isEntityObjCContainerKindPtr - .asFunction(); + _clang_index_isEntityObjCContainerKindPtr.asFunction(); /// For setting a custom CXIdxClientContainer attached to a /// container. @@ -5272,12 +5841,19 @@ class LibClang { } late final _clang_index_setClientContainerPtr = - _lookup>( - 'clang_index_setClientContainer', - ); + _lookup< + ffi.NativeFunction< + ffi.Void Function( + ffi.Pointer, + CXIdxClientContainer, + ) + > + >('clang_index_setClientContainer'); late final _clang_index_setClientContainer = _clang_index_setClientContainerPtr - .asFunction(); + .asFunction< + void Function(ffi.Pointer, CXIdxClientContainer) + >(); /// For setting a custom CXIdxClientEntity attached to an entity. void clang_index_setClientEntity( @@ -5288,11 +5864,15 @@ class LibClang { } late final _clang_index_setClientEntityPtr = - _lookup>( - 'clang_index_setClientEntity', - ); + _lookup< + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer, CXIdxClientEntity) + > + >('clang_index_setClientEntity'); late final _clang_index_setClientEntity = _clang_index_setClientEntityPtr - .asFunction(); + .asFunction< + void Function(ffi.Pointer, CXIdxClientEntity) + >(); /// Determine whether the given cursor kind represents an attribute. int clang_isAttribute(CXCursorKind arg0) { @@ -5300,9 +5880,11 @@ class LibClang { } late final _clang_isAttributePtr = - _lookup>('clang_isAttribute'); + _lookup>( + 'clang_isAttribute', + ); late final _clang_isAttribute = _clang_isAttributePtr - .asFunction(); + .asFunction(); /// Determine whether a CXType has the "const" qualifier set, /// without looking through typedefs that may have added "const" at a @@ -5312,11 +5894,11 @@ class LibClang { } late final _clang_isConstQualifiedTypePtr = - _lookup>( + _lookup>( 'clang_isConstQualifiedType', ); late final _clang_isConstQualifiedType = _clang_isConstQualifiedTypePtr - .asFunction(); + .asFunction(); /// Determine whether the declaration pointed to by this cursor /// is also a definition of that entity. @@ -5325,11 +5907,11 @@ class LibClang { } late final _clang_isCursorDefinitionPtr = - _lookup>( + _lookup>( 'clang_isCursorDefinition', ); late final _clang_isCursorDefinition = _clang_isCursorDefinitionPtr - .asFunction(); + .asFunction(); /// Determine whether the given cursor kind represents a declaration. int clang_isDeclaration(CXCursorKind arg0) { @@ -5337,11 +5919,11 @@ class LibClang { } late final _clang_isDeclarationPtr = - _lookup>( + _lookup>( 'clang_isDeclaration', ); late final _clang_isDeclaration = _clang_isDeclarationPtr - .asFunction(); + .asFunction(); /// Determine whether the given cursor kind represents an expression. int clang_isExpression(CXCursorKind arg0) { @@ -5349,11 +5931,11 @@ class LibClang { } late final _clang_isExpressionPtr = - _lookup>( + _lookup>( 'clang_isExpression', ); late final _clang_isExpression = _clang_isExpressionPtr - .asFunction(); + .asFunction(); /// Determine whether the given header is guarded against /// multiple inclusions, either with the conventional @@ -5363,12 +5945,12 @@ class LibClang { } late final _clang_isFileMultipleIncludeGuardedPtr = - _lookup>( - 'clang_isFileMultipleIncludeGuarded', - ); + _lookup< + ffi.NativeFunction + >('clang_isFileMultipleIncludeGuarded'); late final _clang_isFileMultipleIncludeGuarded = _clang_isFileMultipleIncludeGuardedPtr - .asFunction(); + .asFunction(); /// Return 1 if the CXType is a variadic function type, and 0 otherwise. int clang_isFunctionTypeVariadic(CXType T) { @@ -5376,11 +5958,11 @@ class LibClang { } late final _clang_isFunctionTypeVariadicPtr = - _lookup>( + _lookup>( 'clang_isFunctionTypeVariadic', ); late final _clang_isFunctionTypeVariadic = _clang_isFunctionTypeVariadicPtr - .asFunction(); + .asFunction(); /// Determine whether the given cursor kind represents an invalid /// cursor. @@ -5389,9 +5971,11 @@ class LibClang { } late final _clang_isInvalidPtr = - _lookup>('clang_isInvalid'); + _lookup>( + 'clang_isInvalid', + ); late final _clang_isInvalid = _clang_isInvalidPtr - .asFunction(); + .asFunction(); /// Determine whether the given declaration is invalid. /// @@ -5404,11 +5988,11 @@ class LibClang { } late final _clang_isInvalidDeclarationPtr = - _lookup>( + _lookup>( 'clang_isInvalidDeclaration', ); late final _clang_isInvalidDeclaration = _clang_isInvalidDeclarationPtr - .asFunction(); + .asFunction(); /// Return 1 if the CXType is a POD (plain old data) type, and 0 /// otherwise. @@ -5417,9 +6001,11 @@ class LibClang { } late final _clang_isPODTypePtr = - _lookup>('clang_isPODType'); + _lookup>( + 'clang_isPODType', + ); late final _clang_isPODType = _clang_isPODTypePtr - .asFunction(); + .asFunction(); /// Determine whether the given cursor represents a preprocessing /// element, such as a preprocessor directive or macro instantiation. @@ -5428,11 +6014,11 @@ class LibClang { } late final _clang_isPreprocessingPtr = - _lookup>( + _lookup>( 'clang_isPreprocessing', ); late final _clang_isPreprocessing = _clang_isPreprocessingPtr - .asFunction(); + .asFunction(); /// Determine whether the given cursor kind represents a simple /// reference. @@ -5445,9 +6031,11 @@ class LibClang { } late final _clang_isReferencePtr = - _lookup>('clang_isReference'); + _lookup>( + 'clang_isReference', + ); late final _clang_isReference = _clang_isReferencePtr - .asFunction(); + .asFunction(); /// Determine whether a CXType has the "restrict" qualifier set, /// without looking through typedefs that may have added "restrict" at a @@ -5457,11 +6045,11 @@ class LibClang { } late final _clang_isRestrictQualifiedTypePtr = - _lookup>( + _lookup>( 'clang_isRestrictQualifiedType', ); late final _clang_isRestrictQualifiedType = _clang_isRestrictQualifiedTypePtr - .asFunction(); + .asFunction(); /// Determine whether the given cursor kind represents a statement. int clang_isStatement(CXCursorKind arg0) { @@ -5469,9 +6057,11 @@ class LibClang { } late final _clang_isStatementPtr = - _lookup>('clang_isStatement'); + _lookup>( + 'clang_isStatement', + ); late final _clang_isStatement = _clang_isStatementPtr - .asFunction(); + .asFunction(); /// Determine whether the given cursor kind represents a translation /// unit. @@ -5480,11 +6070,11 @@ class LibClang { } late final _clang_isTranslationUnitPtr = - _lookup>( + _lookup>( 'clang_isTranslationUnit', ); late final _clang_isTranslationUnit = _clang_isTranslationUnitPtr - .asFunction(); + .asFunction(); /// Determine whether the given cursor represents a currently /// unexposed piece of the AST (e.g., CXCursor_UnexposedStmt). @@ -5493,9 +6083,11 @@ class LibClang { } late final _clang_isUnexposedPtr = - _lookup>('clang_isUnexposed'); + _lookup>( + 'clang_isUnexposed', + ); late final _clang_isUnexposed = _clang_isUnexposedPtr - .asFunction(); + .asFunction(); /// Returns 1 if the base class specified by the cursor with kind /// CX_CXXBaseSpecifier is virtual. @@ -5504,11 +6096,11 @@ class LibClang { } late final _clang_isVirtualBasePtr = - _lookup>( + _lookup>( 'clang_isVirtualBase', ); late final _clang_isVirtualBase = _clang_isVirtualBasePtr - .asFunction(); + .asFunction(); /// Determine whether a CXType has the "volatile" qualifier set, /// without looking through typedefs that may have added "volatile" at @@ -5518,11 +6110,11 @@ class LibClang { } late final _clang_isVolatileQualifiedTypePtr = - _lookup>( + _lookup>( 'clang_isVolatileQualifiedType', ); late final _clang_isVolatileQualifiedType = _clang_isVolatileQualifiedTypePtr - .asFunction(); + .asFunction(); /// Deserialize a set of diagnostics from a Clang diagnostics bitcode /// file. @@ -5544,11 +6136,23 @@ class LibClang { } late final _clang_loadDiagnosticsPtr = - _lookup>( - 'clang_loadDiagnostics', - ); + _lookup< + ffi.NativeFunction< + CXDiagnosticSet Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ) + > + >('clang_loadDiagnostics'); late final _clang_loadDiagnostics = _clang_loadDiagnosticsPtr - .asFunction(); + .asFunction< + CXDiagnosticSet Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ) + >(); /// Same as \c clang_parseTranslationUnit2, but returns /// the \c CXTranslationUnit instead of an error code. In case of an error this @@ -5575,11 +6179,31 @@ class LibClang { } late final _clang_parseTranslationUnitPtr = - _lookup>( - 'clang_parseTranslationUnit', - ); + _lookup< + ffi.NativeFunction< + CXTranslationUnit Function( + CXIndex, + ffi.Pointer, + ffi.Pointer>, + ffi.Int, + ffi.Pointer, + ffi.UnsignedInt, + ffi.UnsignedInt, + ) + > + >('clang_parseTranslationUnit'); late final _clang_parseTranslationUnit = _clang_parseTranslationUnitPtr - .asFunction(); + .asFunction< + CXTranslationUnit Function( + CXIndex, + ffi.Pointer, + ffi.Pointer>, + int, + ffi.Pointer, + int, + int, + ) + >(); /// Parse the given source file and the translation unit corresponding /// to that file. @@ -5648,11 +6272,33 @@ class LibClang { } late final _clang_parseTranslationUnit2Ptr = - _lookup>( - 'clang_parseTranslationUnit2', - ); + _lookup< + ffi.NativeFunction< + ffi.UnsignedInt Function( + CXIndex, + ffi.Pointer, + ffi.Pointer>, + ffi.Int, + ffi.Pointer, + ffi.UnsignedInt, + ffi.UnsignedInt, + ffi.Pointer, + ) + > + >('clang_parseTranslationUnit2'); late final _clang_parseTranslationUnit2 = _clang_parseTranslationUnit2Ptr - .asFunction(); + .asFunction< + int Function( + CXIndex, + ffi.Pointer, + ffi.Pointer>, + int, + ffi.Pointer, + int, + int, + ffi.Pointer, + ) + >(); /// Same as clang_parseTranslationUnit2 but requires a full command line /// for \c command_line_args including argv[0]. This is useful if the standard @@ -5682,12 +6328,34 @@ class LibClang { } late final _clang_parseTranslationUnit2FullArgvPtr = - _lookup>( - 'clang_parseTranslationUnit2FullArgv', - ); + _lookup< + ffi.NativeFunction< + ffi.UnsignedInt Function( + CXIndex, + ffi.Pointer, + ffi.Pointer>, + ffi.Int, + ffi.Pointer, + ffi.UnsignedInt, + ffi.UnsignedInt, + ffi.Pointer, + ) + > + >('clang_parseTranslationUnit2FullArgv'); late final _clang_parseTranslationUnit2FullArgv = _clang_parseTranslationUnit2FullArgvPtr - .asFunction(); + .asFunction< + int Function( + CXIndex, + ffi.Pointer, + ffi.Pointer>, + int, + ffi.Pointer, + int, + int, + ffi.Pointer, + ) + >(); /// Dispose the remapping. void clang_remap_dispose(CXRemapping arg0) { @@ -5695,11 +6363,11 @@ class LibClang { } late final _clang_remap_disposePtr = - _lookup>( + _lookup>( 'clang_remap_dispose', ); late final _clang_remap_dispose = _clang_remap_disposePtr - .asFunction(); + .asFunction(); /// Get the original and the associated filename from the remapping. /// @@ -5717,11 +6385,25 @@ class LibClang { } late final _clang_remap_getFilenamesPtr = - _lookup>( - 'clang_remap_getFilenames', - ); + _lookup< + ffi.NativeFunction< + ffi.Void Function( + CXRemapping, + ffi.UnsignedInt, + ffi.Pointer, + ffi.Pointer, + ) + > + >('clang_remap_getFilenames'); late final _clang_remap_getFilenames = _clang_remap_getFilenamesPtr - .asFunction(); + .asFunction< + void Function( + CXRemapping, + int, + ffi.Pointer, + ffi.Pointer, + ) + >(); /// Determine the number of remappings. int clang_remap_getNumFiles(CXRemapping arg0) { @@ -5729,11 +6411,11 @@ class LibClang { } late final _clang_remap_getNumFilesPtr = - _lookup>( + _lookup>( 'clang_remap_getNumFiles', ); late final _clang_remap_getNumFiles = _clang_remap_getNumFilesPtr - .asFunction(); + .asFunction(); /// Reparse the source files that produced this translation unit. /// @@ -5787,11 +6469,20 @@ class LibClang { } late final _clang_reparseTranslationUnitPtr = - _lookup>( - 'clang_reparseTranslationUnit', - ); + _lookup< + ffi.NativeFunction< + ffi.Int Function( + CXTranslationUnit, + ffi.UnsignedInt, + ffi.Pointer, + ffi.UnsignedInt, + ) + > + >('clang_reparseTranslationUnit'); late final _clang_reparseTranslationUnit = _clang_reparseTranslationUnitPtr - .asFunction(); + .asFunction< + int Function(CXTranslationUnit, int, ffi.Pointer, int) + >(); /// Saves a translation unit into a serialized representation of /// that translation unit on disk. @@ -5823,11 +6514,19 @@ class LibClang { } late final _clang_saveTranslationUnitPtr = - _lookup>( - 'clang_saveTranslationUnit', - ); + _lookup< + ffi.NativeFunction< + ffi.Int Function( + CXTranslationUnit, + ffi.Pointer, + ffi.UnsignedInt, + ) + > + >('clang_saveTranslationUnit'); late final _clang_saveTranslationUnit = _clang_saveTranslationUnitPtr - .asFunction(); + .asFunction< + int Function(CXTranslationUnit, ffi.Pointer, int) + >(); /// Sort the code-completion results in case-insensitive alphabetical /// order. @@ -5842,12 +6541,14 @@ class LibClang { } late final _clang_sortCodeCompletionResultsPtr = - _lookup>( - 'clang_sortCodeCompletionResults', - ); + _lookup< + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer, ffi.UnsignedInt) + > + >('clang_sortCodeCompletionResults'); late final _clang_sortCodeCompletionResults = _clang_sortCodeCompletionResultsPtr - .asFunction(); + .asFunction, int)>(); /// Suspend a translation unit in order to free memory associated with it. /// @@ -5859,11 +6560,11 @@ class LibClang { } late final _clang_suspendTranslationUnitPtr = - _lookup>( + _lookup>( 'clang_suspendTranslationUnit', ); late final _clang_suspendTranslationUnit = _clang_suspendTranslationUnitPtr - .asFunction(); + .asFunction(); /// Enable/disable crash recovery. /// @@ -5874,11 +6575,11 @@ class LibClang { } late final _clang_toggleCrashRecoveryPtr = - _lookup>( + _lookup>( 'clang_toggleCrashRecovery', ); late final _clang_toggleCrashRecovery = _clang_toggleCrashRecoveryPtr - .asFunction(); + .asFunction(); /// Tokenize the source code described by the given range into raw /// lexical tokens. @@ -5904,9 +6605,25 @@ class LibClang { } late final _clang_tokenizePtr = - _lookup>('clang_tokenize'); + _lookup< + ffi.NativeFunction< + ffi.Void Function( + CXTranslationUnit, + CXSourceRange, + ffi.Pointer>, + ffi.Pointer, + ) + > + >('clang_tokenize'); late final _clang_tokenize = _clang_tokenizePtr - .asFunction(); + .asFunction< + void Function( + CXTranslationUnit, + CXSourceRange, + ffi.Pointer>, + ffi.Pointer, + ) + >(); /// Visit the children of a particular cursor. /// @@ -5937,11 +6654,13 @@ class LibClang { } late final _clang_visitChildrenPtr = - _lookup>( - 'clang_visitChildren', - ); + _lookup< + ffi.NativeFunction< + ffi.UnsignedInt Function(CXCursor, CXCursorVisitor, CXClientData) + > + >('clang_visitChildren'); late final _clang_visitChildren = _clang_visitChildrenPtr - .asFunction(); + .asFunction(); late final addresses = _SymbolAddresses(this); } @@ -5949,772 +6668,1319 @@ class LibClang { class _SymbolAddresses { final LibClang _library; _SymbolAddresses(this._library); - ffi.Pointer> + ffi.Pointer< + ffi.NativeFunction + > get clang_CXCursorSet_contains => _library._clang_CXCursorSet_containsPtr; - ffi.Pointer> + ffi.Pointer< + ffi.NativeFunction + > get clang_CXCursorSet_insert => _library._clang_CXCursorSet_insertPtr; - ffi.Pointer> + ffi.Pointer> get clang_CXIndex_getGlobalOptions => _library._clang_CXIndex_getGlobalOptionsPtr; - ffi.Pointer> + ffi.Pointer> get clang_CXIndex_setGlobalOptions => _library._clang_CXIndex_setGlobalOptionsPtr; ffi.Pointer< - ffi.NativeFunction + ffi.NativeFunction)> > get clang_CXIndex_setInvocationEmissionPathOption => _library._clang_CXIndex_setInvocationEmissionPathOptionPtr; - ffi.Pointer< - ffi.NativeFunction - > + ffi.Pointer> get clang_CXXConstructor_isConvertingConstructor => _library._clang_CXXConstructor_isConvertingConstructorPtr; - ffi.Pointer> + ffi.Pointer> get clang_CXXConstructor_isCopyConstructor => _library._clang_CXXConstructor_isCopyConstructorPtr; - ffi.Pointer< - ffi.NativeFunction - > + ffi.Pointer> get clang_CXXConstructor_isDefaultConstructor => _library._clang_CXXConstructor_isDefaultConstructorPtr; - ffi.Pointer> + ffi.Pointer> get clang_CXXConstructor_isMoveConstructor => _library._clang_CXXConstructor_isMoveConstructorPtr; - ffi.Pointer> + ffi.Pointer> get clang_CXXField_isMutable => _library._clang_CXXField_isMutablePtr; - ffi.Pointer> + ffi.Pointer> get clang_CXXMethod_isConst => _library._clang_CXXMethod_isConstPtr; - ffi.Pointer> + ffi.Pointer> get clang_CXXMethod_isDefaulted => _library._clang_CXXMethod_isDefaultedPtr; - ffi.Pointer> + ffi.Pointer> get clang_CXXMethod_isPureVirtual => _library._clang_CXXMethod_isPureVirtualPtr; - ffi.Pointer> + ffi.Pointer> get clang_CXXMethod_isStatic => _library._clang_CXXMethod_isStaticPtr; - ffi.Pointer> + ffi.Pointer> get clang_CXXMethod_isVirtual => _library._clang_CXXMethod_isVirtualPtr; - ffi.Pointer> + ffi.Pointer> get clang_CXXRecord_isAbstract => _library._clang_CXXRecord_isAbstractPtr; - ffi.Pointer> + ffi.Pointer> get clang_Cursor_Evaluate => _library._clang_Cursor_EvaluatePtr; - ffi.Pointer> + ffi.Pointer> get clang_Cursor_getArgument => _library._clang_Cursor_getArgumentPtr; - ffi.Pointer> + ffi.Pointer> get clang_Cursor_getBriefCommentText => _library._clang_Cursor_getBriefCommentTextPtr; - ffi.Pointer> + ffi.Pointer Function(CXCursor)>> get clang_Cursor_getCXXManglings => _library._clang_Cursor_getCXXManglingsPtr; - ffi.Pointer> + ffi.Pointer> get clang_Cursor_getCommentRange => _library._clang_Cursor_getCommentRangePtr; - ffi.Pointer> + ffi.Pointer> get clang_Cursor_getMangling => _library._clang_Cursor_getManglingPtr; - ffi.Pointer> + ffi.Pointer> get clang_Cursor_getModule => _library._clang_Cursor_getModulePtr; - ffi.Pointer> + ffi.Pointer> get clang_Cursor_getNumArguments => _library._clang_Cursor_getNumArgumentsPtr; - ffi.Pointer> + ffi.Pointer> get clang_Cursor_getNumTemplateArguments => _library._clang_Cursor_getNumTemplateArgumentsPtr; - ffi.Pointer> + ffi.Pointer> get clang_Cursor_getObjCDeclQualifiers => _library._clang_Cursor_getObjCDeclQualifiersPtr; - ffi.Pointer> + ffi.Pointer Function(CXCursor)>> get clang_Cursor_getObjCManglings => _library._clang_Cursor_getObjCManglingsPtr; - ffi.Pointer> + ffi.Pointer< + ffi.NativeFunction + > get clang_Cursor_getObjCPropertyAttributes => _library._clang_Cursor_getObjCPropertyAttributesPtr; - ffi.Pointer> + ffi.Pointer> get clang_Cursor_getObjCPropertyGetterName => _library._clang_Cursor_getObjCPropertyGetterNamePtr; - ffi.Pointer> + ffi.Pointer> get clang_Cursor_getObjCPropertySetterName => _library._clang_Cursor_getObjCPropertySetterNamePtr; - ffi.Pointer> + ffi.Pointer> get clang_Cursor_getObjCSelectorIndex => _library._clang_Cursor_getObjCSelectorIndexPtr; - ffi.Pointer> + ffi.Pointer> get clang_Cursor_getOffsetOfField => _library._clang_Cursor_getOffsetOfFieldPtr; - ffi.Pointer> + ffi.Pointer> get clang_Cursor_getRawCommentText => _library._clang_Cursor_getRawCommentTextPtr; - ffi.Pointer> + ffi.Pointer> get clang_Cursor_getReceiverType => _library._clang_Cursor_getReceiverTypePtr; - ffi.Pointer> + ffi.Pointer< + ffi.NativeFunction< + CXSourceRange Function(CXCursor, ffi.UnsignedInt, ffi.UnsignedInt) + > + > get clang_Cursor_getSpellingNameRange => _library._clang_Cursor_getSpellingNameRangePtr; - ffi.Pointer> + ffi.Pointer> get clang_Cursor_getStorageClass => _library._clang_Cursor_getStorageClassPtr; - ffi.Pointer> + ffi.Pointer< + ffi.NativeFunction + > get clang_Cursor_getTemplateArgumentKind => _library._clang_Cursor_getTemplateArgumentKindPtr; - ffi.Pointer> + ffi.Pointer> get clang_Cursor_getTemplateArgumentType => _library._clang_Cursor_getTemplateArgumentTypePtr; ffi.Pointer< - ffi.NativeFunction + ffi.NativeFunction > get clang_Cursor_getTemplateArgumentUnsignedValue => _library._clang_Cursor_getTemplateArgumentUnsignedValuePtr; - ffi.Pointer> + ffi.Pointer< + ffi.NativeFunction + > get clang_Cursor_getTemplateArgumentValue => _library._clang_Cursor_getTemplateArgumentValuePtr; - ffi.Pointer> + ffi.Pointer> get clang_Cursor_getTranslationUnit => _library._clang_Cursor_getTranslationUnitPtr; - ffi.Pointer> + ffi.Pointer> get clang_Cursor_hasAttrs => _library._clang_Cursor_hasAttrsPtr; - ffi.Pointer> + ffi.Pointer> get clang_Cursor_isAnonymous => _library._clang_Cursor_isAnonymousPtr; - ffi.Pointer> + ffi.Pointer> get clang_Cursor_isAnonymousRecordDecl => _library._clang_Cursor_isAnonymousRecordDeclPtr; - ffi.Pointer> + ffi.Pointer> get clang_Cursor_isBitField => _library._clang_Cursor_isBitFieldPtr; - ffi.Pointer> + ffi.Pointer> get clang_Cursor_isDynamicCall => _library._clang_Cursor_isDynamicCallPtr; - ffi.Pointer> + ffi.Pointer< + ffi.NativeFunction< + ffi.UnsignedInt Function( + CXCursor, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ) + > + > get clang_Cursor_isExternalSymbol => _library._clang_Cursor_isExternalSymbolPtr; - ffi.Pointer> + ffi.Pointer> get clang_Cursor_isFunctionInlined => _library._clang_Cursor_isFunctionInlinedPtr; - ffi.Pointer> + ffi.Pointer> get clang_Cursor_isInlineNamespace => _library._clang_Cursor_isInlineNamespacePtr; - ffi.Pointer> + ffi.Pointer> get clang_Cursor_isMacroBuiltin => _library._clang_Cursor_isMacroBuiltinPtr; - ffi.Pointer> + ffi.Pointer> get clang_Cursor_isMacroFunctionLike => _library._clang_Cursor_isMacroFunctionLikePtr; - ffi.Pointer> + ffi.Pointer> get clang_Cursor_isNull => _library._clang_Cursor_isNullPtr; - ffi.Pointer> + ffi.Pointer> get clang_Cursor_isObjCOptional => _library._clang_Cursor_isObjCOptionalPtr; - ffi.Pointer> + ffi.Pointer> get clang_Cursor_isVariadic => _library._clang_Cursor_isVariadicPtr; - ffi.Pointer> + ffi.Pointer> get clang_EnumDecl_isScoped => _library._clang_EnumDecl_isScopedPtr; - ffi.Pointer> + ffi.Pointer> get clang_EvalResult_dispose => _library._clang_EvalResult_disposePtr; - ffi.Pointer> + ffi.Pointer> get clang_EvalResult_getAsDouble => _library._clang_EvalResult_getAsDoublePtr; - ffi.Pointer> + ffi.Pointer> get clang_EvalResult_getAsInt => _library._clang_EvalResult_getAsIntPtr; - ffi.Pointer> + ffi.Pointer> get clang_EvalResult_getAsLongLong => _library._clang_EvalResult_getAsLongLongPtr; - ffi.Pointer> + ffi.Pointer Function(CXEvalResult)>> get clang_EvalResult_getAsStr => _library._clang_EvalResult_getAsStrPtr; - ffi.Pointer> + ffi.Pointer> get clang_EvalResult_getAsUnsigned => _library._clang_EvalResult_getAsUnsignedPtr; - ffi.Pointer> + ffi.Pointer> get clang_EvalResult_getKind => _library._clang_EvalResult_getKindPtr; - ffi.Pointer> + ffi.Pointer> get clang_EvalResult_isUnsignedInt => _library._clang_EvalResult_isUnsignedIntPtr; - ffi.Pointer> + ffi.Pointer> get clang_File_isEqual => _library._clang_File_isEqualPtr; - ffi.Pointer> + ffi.Pointer> get clang_File_tryGetRealPathName => _library._clang_File_tryGetRealPathNamePtr; - ffi.Pointer> + ffi.Pointer> get clang_IndexAction_create => _library._clang_IndexAction_createPtr; - ffi.Pointer> + ffi.Pointer> get clang_IndexAction_dispose => _library._clang_IndexAction_disposePtr; - ffi.Pointer> + ffi.Pointer> get clang_Location_isFromMainFile => _library._clang_Location_isFromMainFilePtr; - ffi.Pointer> + ffi.Pointer> get clang_Location_isInSystemHeader => _library._clang_Location_isInSystemHeaderPtr; - ffi.Pointer> + ffi.Pointer> get clang_Module_getASTFile => _library._clang_Module_getASTFilePtr; - ffi.Pointer> + ffi.Pointer> get clang_Module_getFullName => _library._clang_Module_getFullNamePtr; - ffi.Pointer> + ffi.Pointer> get clang_Module_getName => _library._clang_Module_getNamePtr; - ffi.Pointer> + ffi.Pointer< + ffi.NativeFunction + > get clang_Module_getNumTopLevelHeaders => _library._clang_Module_getNumTopLevelHeadersPtr; - ffi.Pointer> + ffi.Pointer> get clang_Module_getParent => _library._clang_Module_getParentPtr; - ffi.Pointer> + ffi.Pointer< + ffi.NativeFunction< + CXFile Function(CXTranslationUnit, CXModule, ffi.UnsignedInt) + > + > get clang_Module_getTopLevelHeader => _library._clang_Module_getTopLevelHeaderPtr; - ffi.Pointer> + ffi.Pointer> get clang_Module_isSystem => _library._clang_Module_isSystemPtr; - ffi.Pointer> + ffi.Pointer> get clang_PrintingPolicy_dispose => _library._clang_PrintingPolicy_disposePtr; - ffi.Pointer> + ffi.Pointer< + ffi.NativeFunction< + ffi.UnsignedInt Function(CXPrintingPolicy, ffi.UnsignedInt) + > + > get clang_PrintingPolicy_getProperty => _library._clang_PrintingPolicy_getPropertyPtr; - ffi.Pointer> + ffi.Pointer< + ffi.NativeFunction< + ffi.Void Function(CXPrintingPolicy, ffi.UnsignedInt, ffi.UnsignedInt) + > + > get clang_PrintingPolicy_setProperty => _library._clang_PrintingPolicy_setPropertyPtr; - ffi.Pointer> + ffi.Pointer> get clang_Range_isNull => _library._clang_Range_isNullPtr; - ffi.Pointer> + ffi.Pointer> get clang_TargetInfo_dispose => _library._clang_TargetInfo_disposePtr; - ffi.Pointer> + ffi.Pointer> get clang_TargetInfo_getPointerWidth => _library._clang_TargetInfo_getPointerWidthPtr; - ffi.Pointer> + ffi.Pointer> get clang_TargetInfo_getTriple => _library._clang_TargetInfo_getTriplePtr; - ffi.Pointer> + ffi.Pointer> get clang_Type_getAlignOf => _library._clang_Type_getAlignOfPtr; - ffi.Pointer> + ffi.Pointer> get clang_Type_getCXXRefQualifier => _library._clang_Type_getCXXRefQualifierPtr; - ffi.Pointer> + ffi.Pointer> get clang_Type_getClassType => _library._clang_Type_getClassTypePtr; - ffi.Pointer> + ffi.Pointer> get clang_Type_getModifiedType => _library._clang_Type_getModifiedTypePtr; - ffi.Pointer> + ffi.Pointer> get clang_Type_getNamedType => _library._clang_Type_getNamedTypePtr; - ffi.Pointer> + ffi.Pointer> get clang_Type_getNullability => _library._clang_Type_getNullabilityPtr; - ffi.Pointer> + ffi.Pointer> get clang_Type_getNumObjCProtocolRefs => _library._clang_Type_getNumObjCProtocolRefsPtr; - ffi.Pointer> + ffi.Pointer> get clang_Type_getNumObjCTypeArgs => _library._clang_Type_getNumObjCTypeArgsPtr; - ffi.Pointer> + ffi.Pointer> get clang_Type_getNumTemplateArguments => _library._clang_Type_getNumTemplateArgumentsPtr; - ffi.Pointer> + ffi.Pointer> get clang_Type_getObjCEncoding => _library._clang_Type_getObjCEncodingPtr; - ffi.Pointer> + ffi.Pointer> get clang_Type_getObjCObjectBaseType => _library._clang_Type_getObjCObjectBaseTypePtr; - ffi.Pointer> + ffi.Pointer> get clang_Type_getObjCProtocolDecl => _library._clang_Type_getObjCProtocolDeclPtr; - ffi.Pointer> + ffi.Pointer> get clang_Type_getObjCTypeArg => _library._clang_Type_getObjCTypeArgPtr; - ffi.Pointer> + ffi.Pointer< + ffi.NativeFunction)> + > get clang_Type_getOffsetOf => _library._clang_Type_getOffsetOfPtr; - ffi.Pointer> + ffi.Pointer> get clang_Type_getSizeOf => _library._clang_Type_getSizeOfPtr; - ffi.Pointer> + ffi.Pointer> get clang_Type_getTemplateArgumentAsType => _library._clang_Type_getTemplateArgumentAsTypePtr; - ffi.Pointer> + ffi.Pointer> get clang_Type_isTransparentTagTypedef => _library._clang_Type_isTransparentTagTypedefPtr; - ffi.Pointer> + ffi.Pointer< + ffi.NativeFunction< + ffi.UnsignedInt Function(CXType, CXFieldVisitor, CXClientData) + > + > get clang_Type_visitFields => _library._clang_Type_visitFieldsPtr; - ffi.Pointer> + ffi.Pointer< + ffi.NativeFunction< + ffi.Void Function( + CXTranslationUnit, + ffi.Pointer, + ffi.UnsignedInt, + ffi.Pointer, + ) + > + > get clang_annotateTokens => _library._clang_annotateTokensPtr; - ffi.Pointer> + ffi.Pointer< + ffi.NativeFunction< + ffi.Pointer Function( + CXTranslationUnit, + ffi.Pointer, + ffi.UnsignedInt, + ffi.UnsignedInt, + ffi.Pointer, + ffi.UnsignedInt, + ffi.UnsignedInt, + ) + > + > get clang_codeCompleteAt => _library._clang_codeCompleteAtPtr; - ffi.Pointer> + ffi.Pointer< + ffi.NativeFunction< + ffi.UnsignedInt Function( + ffi.Pointer, + ffi.Pointer, + ) + > + > get clang_codeCompleteGetContainerKind => _library._clang_codeCompleteGetContainerKindPtr; - ffi.Pointer> + ffi.Pointer< + ffi.NativeFunction)> + > get clang_codeCompleteGetContainerUSR => _library._clang_codeCompleteGetContainerUSRPtr; - ffi.Pointer> + ffi.Pointer< + ffi.NativeFunction< + ffi.UnsignedLongLong Function(ffi.Pointer) + > + > get clang_codeCompleteGetContexts => _library._clang_codeCompleteGetContextsPtr; - ffi.Pointer> + ffi.Pointer< + ffi.NativeFunction< + CXDiagnostic Function(ffi.Pointer, ffi.UnsignedInt) + > + > get clang_codeCompleteGetDiagnostic => _library._clang_codeCompleteGetDiagnosticPtr; - ffi.Pointer> + ffi.Pointer< + ffi.NativeFunction< + ffi.UnsignedInt Function(ffi.Pointer) + > + > get clang_codeCompleteGetNumDiagnostics => _library._clang_codeCompleteGetNumDiagnosticsPtr; - ffi.Pointer> + ffi.Pointer< + ffi.NativeFunction)> + > get clang_codeCompleteGetObjCSelector => _library._clang_codeCompleteGetObjCSelectorPtr; - ffi.Pointer> + ffi.Pointer< + ffi.NativeFunction< + CXString Function(ffi.Pointer, ffi.Pointer) + > + > get clang_constructUSR_ObjCCategory => _library._clang_constructUSR_ObjCCategoryPtr; - ffi.Pointer> + ffi.Pointer)>> get clang_constructUSR_ObjCClass => _library._clang_constructUSR_ObjCClassPtr; - ffi.Pointer> + ffi.Pointer< + ffi.NativeFunction, CXString)> + > get clang_constructUSR_ObjCIvar => _library._clang_constructUSR_ObjCIvarPtr; - ffi.Pointer> + ffi.Pointer< + ffi.NativeFunction< + CXString Function(ffi.Pointer, ffi.UnsignedInt, CXString) + > + > get clang_constructUSR_ObjCMethod => _library._clang_constructUSR_ObjCMethodPtr; - ffi.Pointer> + ffi.Pointer< + ffi.NativeFunction, CXString)> + > get clang_constructUSR_ObjCProperty => _library._clang_constructUSR_ObjCPropertyPtr; - ffi.Pointer> + ffi.Pointer)>> get clang_constructUSR_ObjCProtocol => _library._clang_constructUSR_ObjCProtocolPtr; - ffi.Pointer> + ffi.Pointer> get clang_createCXCursorSet => _library._clang_createCXCursorSetPtr; - ffi.Pointer> + ffi.Pointer> get clang_createIndex => _library._clang_createIndexPtr; - ffi.Pointer> + ffi.Pointer< + ffi.NativeFunction< + CXTranslationUnit Function(CXIndex, ffi.Pointer) + > + > get clang_createTranslationUnit => _library._clang_createTranslationUnitPtr; - ffi.Pointer> + ffi.Pointer< + ffi.NativeFunction< + ffi.UnsignedInt Function( + CXIndex, + ffi.Pointer, + ffi.Pointer, + ) + > + > get clang_createTranslationUnit2 => _library._clang_createTranslationUnit2Ptr; ffi.Pointer< - ffi.NativeFunction + ffi.NativeFunction< + CXTranslationUnit Function( + CXIndex, + ffi.Pointer, + ffi.Int, + ffi.Pointer>, + ffi.UnsignedInt, + ffi.Pointer, + ) + > > get clang_createTranslationUnitFromSourceFile => _library._clang_createTranslationUnitFromSourceFilePtr; - ffi.Pointer> + ffi.Pointer> get clang_defaultCodeCompleteOptions => _library._clang_defaultCodeCompleteOptionsPtr; - ffi.Pointer> + ffi.Pointer> get clang_defaultDiagnosticDisplayOptions => _library._clang_defaultDiagnosticDisplayOptionsPtr; - ffi.Pointer< - ffi.NativeFunction - > + ffi.Pointer> get clang_defaultEditingTranslationUnitOptions => _library._clang_defaultEditingTranslationUnitOptionsPtr; - ffi.Pointer> + ffi.Pointer> get clang_defaultReparseOptions => _library._clang_defaultReparseOptionsPtr; - ffi.Pointer> + ffi.Pointer> get clang_defaultSaveOptions => _library._clang_defaultSaveOptionsPtr; - ffi.Pointer> + ffi.Pointer> get clang_disposeCXCursorSet => _library._clang_disposeCXCursorSetPtr; - ffi.Pointer> + ffi.Pointer< + ffi.NativeFunction)> + > get clang_disposeCXPlatformAvailability => _library._clang_disposeCXPlatformAvailabilityPtr; - ffi.Pointer> + ffi.Pointer> get clang_disposeCXTUResourceUsage => _library._clang_disposeCXTUResourceUsagePtr; - ffi.Pointer> + ffi.Pointer< + ffi.NativeFunction)> + > get clang_disposeCodeCompleteResults => _library._clang_disposeCodeCompleteResultsPtr; - ffi.Pointer> + ffi.Pointer> get clang_disposeDiagnostic => _library._clang_disposeDiagnosticPtr; - ffi.Pointer> + ffi.Pointer> get clang_disposeDiagnosticSet => _library._clang_disposeDiagnosticSetPtr; - ffi.Pointer> + ffi.Pointer> get clang_disposeIndex => _library._clang_disposeIndexPtr; - ffi.Pointer> + ffi.Pointer)>> get clang_disposeOverriddenCursors => _library._clang_disposeOverriddenCursorsPtr; - ffi.Pointer> + ffi.Pointer< + ffi.NativeFunction)> + > get clang_disposeSourceRangeList => _library._clang_disposeSourceRangeListPtr; - ffi.Pointer> + ffi.Pointer> get clang_disposeString => _library._clang_disposeStringPtr; - ffi.Pointer> + ffi.Pointer)>> get clang_disposeStringSet => _library._clang_disposeStringSetPtr; - ffi.Pointer> + ffi.Pointer< + ffi.NativeFunction< + ffi.Void Function( + CXTranslationUnit, + ffi.Pointer, + ffi.UnsignedInt, + ) + > + > get clang_disposeTokens => _library._clang_disposeTokensPtr; - ffi.Pointer> + ffi.Pointer> get clang_disposeTranslationUnit => _library._clang_disposeTranslationUnitPtr; - ffi.Pointer> + ffi.Pointer> get clang_enableStackTraces => _library._clang_enableStackTracesPtr; - ffi.Pointer> + ffi.Pointer> get clang_equalCursors => _library._clang_equalCursorsPtr; - ffi.Pointer> + ffi.Pointer< + ffi.NativeFunction< + ffi.UnsignedInt Function(CXSourceLocation, CXSourceLocation) + > + > get clang_equalLocations => _library._clang_equalLocationsPtr; - ffi.Pointer> + ffi.Pointer< + ffi.NativeFunction + > get clang_equalRanges => _library._clang_equalRangesPtr; - ffi.Pointer> + ffi.Pointer> get clang_equalTypes => _library._clang_equalTypesPtr; - ffi.Pointer> + ffi.Pointer< + ffi.NativeFunction< + ffi.Void Function( + ffi.Pointer< + ffi.NativeFunction)> + >, + ffi.Pointer, + ffi.UnsignedInt, + ) + > + > get clang_executeOnThread => _library._clang_executeOnThreadPtr; - ffi.Pointer> + ffi.Pointer< + ffi.NativeFunction< + ffi.UnsignedInt Function( + CXTranslationUnit, + CXFile, + CXCursorAndRangeVisitor, + ) + > + > get clang_findIncludesInFile => _library._clang_findIncludesInFilePtr; - ffi.Pointer> + ffi.Pointer< + ffi.NativeFunction< + ffi.UnsignedInt Function(CXCursor, CXFile, CXCursorAndRangeVisitor) + > + > get clang_findReferencesInFile => _library._clang_findReferencesInFilePtr; - ffi.Pointer> + ffi.Pointer< + ffi.NativeFunction + > get clang_formatDiagnostic => _library._clang_formatDiagnosticPtr; - ffi.Pointer> + ffi.Pointer> get clang_getAddressSpace => _library._clang_getAddressSpacePtr; - ffi.Pointer> + ffi.Pointer< + ffi.NativeFunction< + ffi.Pointer Function(CXTranslationUnit) + > + > get clang_getAllSkippedRanges => _library._clang_getAllSkippedRangesPtr; - ffi.Pointer> + ffi.Pointer> get clang_getArgType => _library._clang_getArgTypePtr; - ffi.Pointer> + ffi.Pointer> get clang_getArrayElementType => _library._clang_getArrayElementTypePtr; - ffi.Pointer> + ffi.Pointer> get clang_getArraySize => _library._clang_getArraySizePtr; - ffi.Pointer> + ffi.Pointer Function(CXString)>> get clang_getCString => _library._clang_getCStringPtr; - ffi.Pointer> + ffi.Pointer> get clang_getCXTUResourceUsage => _library._clang_getCXTUResourceUsagePtr; - ffi.Pointer> + ffi.Pointer> get clang_getCXXAccessSpecifier => _library._clang_getCXXAccessSpecifierPtr; - ffi.Pointer> + ffi.Pointer> get clang_getCanonicalCursor => _library._clang_getCanonicalCursorPtr; - ffi.Pointer> + ffi.Pointer> get clang_getCanonicalType => _library._clang_getCanonicalTypePtr; - ffi.Pointer> + ffi.Pointer> get clang_getChildDiagnostics => _library._clang_getChildDiagnosticsPtr; - ffi.Pointer> + ffi.Pointer> get clang_getClangVersion => _library._clang_getClangVersionPtr; - ffi.Pointer> + ffi.Pointer< + ffi.NativeFunction + > get clang_getCompletionAnnotation => _library._clang_getCompletionAnnotationPtr; - ffi.Pointer> + ffi.Pointer> get clang_getCompletionAvailability => _library._clang_getCompletionAvailabilityPtr; - ffi.Pointer> + ffi.Pointer> get clang_getCompletionBriefComment => _library._clang_getCompletionBriefCommentPtr; ffi.Pointer< - ffi.NativeFunction + ffi.NativeFunction< + CXCompletionString Function(CXCompletionString, ffi.UnsignedInt) + > > get clang_getCompletionChunkCompletionString => _library._clang_getCompletionChunkCompletionStringPtr; - ffi.Pointer> + ffi.Pointer< + ffi.NativeFunction< + ffi.UnsignedInt Function(CXCompletionString, ffi.UnsignedInt) + > + > get clang_getCompletionChunkKind => _library._clang_getCompletionChunkKindPtr; - ffi.Pointer> + ffi.Pointer< + ffi.NativeFunction + > get clang_getCompletionChunkText => _library._clang_getCompletionChunkTextPtr; - ffi.Pointer> + ffi.Pointer< + ffi.NativeFunction< + CXString Function( + ffi.Pointer, + ffi.UnsignedInt, + ffi.UnsignedInt, + ffi.Pointer, + ) + > + > get clang_getCompletionFixIt => _library._clang_getCompletionFixItPtr; - ffi.Pointer> + ffi.Pointer> get clang_getCompletionNumAnnotations => _library._clang_getCompletionNumAnnotationsPtr; - ffi.Pointer> + ffi.Pointer< + ffi.NativeFunction< + ffi.UnsignedInt Function( + ffi.Pointer, + ffi.UnsignedInt, + ) + > + > get clang_getCompletionNumFixIts => _library._clang_getCompletionNumFixItsPtr; - ffi.Pointer> + ffi.Pointer< + ffi.NativeFunction< + CXString Function(CXCompletionString, ffi.Pointer) + > + > get clang_getCompletionParent => _library._clang_getCompletionParentPtr; - ffi.Pointer> + ffi.Pointer> get clang_getCompletionPriority => _library._clang_getCompletionPriorityPtr; - ffi.Pointer> get clang_getCursor => - _library._clang_getCursorPtr; - ffi.Pointer> + ffi.Pointer< + ffi.NativeFunction + > + get clang_getCursor => _library._clang_getCursorPtr; + ffi.Pointer> get clang_getCursorAvailability => _library._clang_getCursorAvailabilityPtr; - ffi.Pointer> + ffi.Pointer> get clang_getCursorCompletionString => _library._clang_getCursorCompletionStringPtr; - ffi.Pointer> + ffi.Pointer> get clang_getCursorDefinition => _library._clang_getCursorDefinitionPtr; - ffi.Pointer> + ffi.Pointer> get clang_getCursorDisplayName => _library._clang_getCursorDisplayNamePtr; - ffi.Pointer< - ffi.NativeFunction - > + ffi.Pointer> get clang_getCursorExceptionSpecificationType => _library._clang_getCursorExceptionSpecificationTypePtr; - ffi.Pointer> + ffi.Pointer> get clang_getCursorExtent => _library._clang_getCursorExtentPtr; - ffi.Pointer> + ffi.Pointer> get clang_getCursorKind => _library._clang_getCursorKindPtr; - ffi.Pointer> + ffi.Pointer> get clang_getCursorKindSpelling => _library._clang_getCursorKindSpellingPtr; - ffi.Pointer> + ffi.Pointer> get clang_getCursorLanguage => _library._clang_getCursorLanguagePtr; - ffi.Pointer> + ffi.Pointer> get clang_getCursorLexicalParent => _library._clang_getCursorLexicalParentPtr; - ffi.Pointer> + ffi.Pointer> get clang_getCursorLinkage => _library._clang_getCursorLinkagePtr; - ffi.Pointer> + ffi.Pointer> get clang_getCursorLocation => _library._clang_getCursorLocationPtr; - ffi.Pointer> + ffi.Pointer< + ffi.NativeFunction< + ffi.Int Function( + CXCursor, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Int, + ) + > + > get clang_getCursorPlatformAvailability => _library._clang_getCursorPlatformAvailabilityPtr; - ffi.Pointer> + ffi.Pointer> get clang_getCursorPrettyPrinted => _library._clang_getCursorPrettyPrintedPtr; - ffi.Pointer> + ffi.Pointer> get clang_getCursorPrintingPolicy => _library._clang_getCursorPrintingPolicyPtr; - ffi.Pointer> + ffi.Pointer< + ffi.NativeFunction< + CXSourceRange Function(CXCursor, ffi.UnsignedInt, ffi.UnsignedInt) + > + > get clang_getCursorReferenceNameRange => _library._clang_getCursorReferenceNameRangePtr; - ffi.Pointer> + ffi.Pointer> get clang_getCursorReferenced => _library._clang_getCursorReferencedPtr; - ffi.Pointer> + ffi.Pointer> get clang_getCursorResultType => _library._clang_getCursorResultTypePtr; - ffi.Pointer> + ffi.Pointer> get clang_getCursorSemanticParent => _library._clang_getCursorSemanticParentPtr; - ffi.Pointer> + ffi.Pointer> get clang_getCursorSpelling => _library._clang_getCursorSpellingPtr; - ffi.Pointer> + ffi.Pointer> get clang_getCursorTLSKind => _library._clang_getCursorTLSKindPtr; - ffi.Pointer> + ffi.Pointer> get clang_getCursorType => _library._clang_getCursorTypePtr; - ffi.Pointer> + ffi.Pointer> get clang_getCursorUSR => _library._clang_getCursorUSRPtr; - ffi.Pointer> + ffi.Pointer> get clang_getCursorVisibility => _library._clang_getCursorVisibilityPtr; - ffi.Pointer> + ffi.Pointer> get clang_getDeclObjCTypeEncoding => _library._clang_getDeclObjCTypeEncodingPtr; - ffi.Pointer> + ffi.Pointer< + ffi.NativeFunction< + ffi.Void Function( + CXCursor, + ffi.Pointer>, + ffi.Pointer>, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ) + > + > get clang_getDefinitionSpellingAndExtent => _library._clang_getDefinitionSpellingAndExtentPtr; - ffi.Pointer> + ffi.Pointer< + ffi.NativeFunction< + CXDiagnostic Function(CXTranslationUnit, ffi.UnsignedInt) + > + > get clang_getDiagnostic => _library._clang_getDiagnosticPtr; - ffi.Pointer> + ffi.Pointer> get clang_getDiagnosticCategory => _library._clang_getDiagnosticCategoryPtr; - ffi.Pointer> + ffi.Pointer> get clang_getDiagnosticCategoryName => _library._clang_getDiagnosticCategoryNamePtr; - ffi.Pointer> + ffi.Pointer> get clang_getDiagnosticCategoryText => _library._clang_getDiagnosticCategoryTextPtr; - ffi.Pointer> + ffi.Pointer< + ffi.NativeFunction< + CXString Function( + CXDiagnostic, + ffi.UnsignedInt, + ffi.Pointer, + ) + > + > get clang_getDiagnosticFixIt => _library._clang_getDiagnosticFixItPtr; - ffi.Pointer> + ffi.Pointer< + ffi.NativeFunction + > get clang_getDiagnosticInSet => _library._clang_getDiagnosticInSetPtr; - ffi.Pointer> + ffi.Pointer> get clang_getDiagnosticLocation => _library._clang_getDiagnosticLocationPtr; - ffi.Pointer> + ffi.Pointer> get clang_getDiagnosticNumFixIts => _library._clang_getDiagnosticNumFixItsPtr; - ffi.Pointer> + ffi.Pointer> get clang_getDiagnosticNumRanges => _library._clang_getDiagnosticNumRangesPtr; - ffi.Pointer> + ffi.Pointer< + ffi.NativeFunction)> + > get clang_getDiagnosticOption => _library._clang_getDiagnosticOptionPtr; - ffi.Pointer> + ffi.Pointer< + ffi.NativeFunction + > get clang_getDiagnosticRange => _library._clang_getDiagnosticRangePtr; - ffi.Pointer> + ffi.Pointer> get clang_getDiagnosticSetFromTU => _library._clang_getDiagnosticSetFromTUPtr; - ffi.Pointer> + ffi.Pointer> get clang_getDiagnosticSeverity => _library._clang_getDiagnosticSeverityPtr; - ffi.Pointer> + ffi.Pointer> get clang_getDiagnosticSpelling => _library._clang_getDiagnosticSpellingPtr; - ffi.Pointer> + ffi.Pointer> get clang_getElementType => _library._clang_getElementTypePtr; - ffi.Pointer> + ffi.Pointer> get clang_getEnumConstantDeclUnsignedValue => _library._clang_getEnumConstantDeclUnsignedValuePtr; - ffi.Pointer> + ffi.Pointer> get clang_getEnumConstantDeclValue => _library._clang_getEnumConstantDeclValuePtr; - ffi.Pointer> + ffi.Pointer> get clang_getEnumDeclIntegerType => _library._clang_getEnumDeclIntegerTypePtr; - ffi.Pointer> + ffi.Pointer> get clang_getExceptionSpecificationType => _library._clang_getExceptionSpecificationTypePtr; - ffi.Pointer> + ffi.Pointer< + ffi.NativeFunction< + ffi.Void Function( + CXSourceLocation, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ) + > + > get clang_getExpansionLocation => _library._clang_getExpansionLocationPtr; - ffi.Pointer> + ffi.Pointer> get clang_getFieldDeclBitWidth => _library._clang_getFieldDeclBitWidthPtr; - ffi.Pointer> get clang_getFile => - _library._clang_getFilePtr; - ffi.Pointer> + ffi.Pointer< + ffi.NativeFunction< + CXFile Function(CXTranslationUnit, ffi.Pointer) + > + > + get clang_getFile => _library._clang_getFilePtr; + ffi.Pointer< + ffi.NativeFunction< + ffi.Pointer Function( + CXTranslationUnit, + CXFile, + ffi.Pointer, + ) + > + > get clang_getFileContents => _library._clang_getFileContentsPtr; - ffi.Pointer> + ffi.Pointer< + ffi.NativeFunction< + ffi.Void Function( + CXSourceLocation, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ) + > + > get clang_getFileLocation => _library._clang_getFileLocationPtr; - ffi.Pointer> + ffi.Pointer> get clang_getFileName => _library._clang_getFileNamePtr; - ffi.Pointer> + ffi.Pointer> get clang_getFileTime => _library._clang_getFileTimePtr; - ffi.Pointer> + ffi.Pointer< + ffi.NativeFunction)> + > get clang_getFileUniqueID => _library._clang_getFileUniqueIDPtr; - ffi.Pointer> + ffi.Pointer> get clang_getFunctionTypeCallingConv => _library._clang_getFunctionTypeCallingConvPtr; - ffi.Pointer> + ffi.Pointer> get clang_getIBOutletCollectionType => _library._clang_getIBOutletCollectionTypePtr; - ffi.Pointer> + ffi.Pointer> get clang_getIncludedFile => _library._clang_getIncludedFilePtr; - ffi.Pointer> + ffi.Pointer< + ffi.NativeFunction< + ffi.Void Function(CXTranslationUnit, CXInclusionVisitor, CXClientData) + > + > get clang_getInclusions => _library._clang_getInclusionsPtr; - ffi.Pointer> + ffi.Pointer< + ffi.NativeFunction< + ffi.Void Function( + CXSourceLocation, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ) + > + > get clang_getInstantiationLocation => _library._clang_getInstantiationLocationPtr; - ffi.Pointer> + ffi.Pointer< + ffi.NativeFunction< + CXSourceLocation Function( + CXTranslationUnit, + CXFile, + ffi.UnsignedInt, + ffi.UnsignedInt, + ) + > + > get clang_getLocation => _library._clang_getLocationPtr; - ffi.Pointer> + ffi.Pointer< + ffi.NativeFunction< + CXSourceLocation Function(CXTranslationUnit, CXFile, ffi.UnsignedInt) + > + > get clang_getLocationForOffset => _library._clang_getLocationForOffsetPtr; - ffi.Pointer> + ffi.Pointer> get clang_getModuleForFile => _library._clang_getModuleForFilePtr; - ffi.Pointer> + ffi.Pointer> get clang_getNullCursor => _library._clang_getNullCursorPtr; - ffi.Pointer> + ffi.Pointer> get clang_getNullLocation => _library._clang_getNullLocationPtr; - ffi.Pointer> + ffi.Pointer> get clang_getNullRange => _library._clang_getNullRangePtr; - ffi.Pointer> + ffi.Pointer> get clang_getNumArgTypes => _library._clang_getNumArgTypesPtr; - ffi.Pointer> + ffi.Pointer> get clang_getNumCompletionChunks => _library._clang_getNumCompletionChunksPtr; - ffi.Pointer> + ffi.Pointer> get clang_getNumDiagnostics => _library._clang_getNumDiagnosticsPtr; - ffi.Pointer> + ffi.Pointer> get clang_getNumDiagnosticsInSet => _library._clang_getNumDiagnosticsInSetPtr; - ffi.Pointer> + ffi.Pointer> get clang_getNumElements => _library._clang_getNumElementsPtr; - ffi.Pointer> + ffi.Pointer> get clang_getNumOverloadedDecls => _library._clang_getNumOverloadedDeclsPtr; - ffi.Pointer> + ffi.Pointer> get clang_getOverloadedDecl => _library._clang_getOverloadedDeclPtr; - ffi.Pointer> + ffi.Pointer< + ffi.NativeFunction< + ffi.Void Function( + CXCursor, + ffi.Pointer>, + ffi.Pointer, + ) + > + > get clang_getOverriddenCursors => _library._clang_getOverriddenCursorsPtr; - ffi.Pointer> + ffi.Pointer> get clang_getPointeeType => _library._clang_getPointeeTypePtr; - ffi.Pointer> + ffi.Pointer< + ffi.NativeFunction< + ffi.Void Function( + CXSourceLocation, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ) + > + > get clang_getPresumedLocation => _library._clang_getPresumedLocationPtr; - ffi.Pointer> get clang_getRange => - _library._clang_getRangePtr; - ffi.Pointer> + ffi.Pointer< + ffi.NativeFunction< + CXSourceRange Function(CXSourceLocation, CXSourceLocation) + > + > + get clang_getRange => _library._clang_getRangePtr; + ffi.Pointer> get clang_getRangeEnd => _library._clang_getRangeEndPtr; - ffi.Pointer> + ffi.Pointer> get clang_getRangeStart => _library._clang_getRangeStartPtr; - ffi.Pointer> + ffi.Pointer)>> get clang_getRemappings => _library._clang_getRemappingsPtr; - ffi.Pointer> + ffi.Pointer< + ffi.NativeFunction< + CXRemapping Function(ffi.Pointer>, ffi.UnsignedInt) + > + > get clang_getRemappingsFromFileList => _library._clang_getRemappingsFromFileListPtr; - ffi.Pointer> + ffi.Pointer> get clang_getResultType => _library._clang_getResultTypePtr; - ffi.Pointer> + ffi.Pointer< + ffi.NativeFunction< + ffi.Pointer Function(CXTranslationUnit, CXFile) + > + > get clang_getSkippedRanges => _library._clang_getSkippedRangesPtr; - ffi.Pointer> + ffi.Pointer> get clang_getSpecializedCursorTemplate => _library._clang_getSpecializedCursorTemplatePtr; - ffi.Pointer> + ffi.Pointer< + ffi.NativeFunction< + ffi.Void Function( + CXSourceLocation, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ) + > + > get clang_getSpellingLocation => _library._clang_getSpellingLocationPtr; - ffi.Pointer> + ffi.Pointer< + ffi.NativeFunction Function(ffi.UnsignedInt)> + > get clang_getTUResourceUsageName => _library._clang_getTUResourceUsageNamePtr; - ffi.Pointer> + ffi.Pointer> get clang_getTemplateCursorKind => _library._clang_getTemplateCursorKindPtr; - ffi.Pointer> get clang_getToken => - _library._clang_getTokenPtr; - ffi.Pointer> + ffi.Pointer< + ffi.NativeFunction< + ffi.Pointer Function(CXTranslationUnit, CXSourceLocation) + > + > + get clang_getToken => _library._clang_getTokenPtr; + ffi.Pointer< + ffi.NativeFunction + > get clang_getTokenExtent => _library._clang_getTokenExtentPtr; - ffi.Pointer> + ffi.Pointer> get clang_getTokenKind => _library._clang_getTokenKindPtr; - ffi.Pointer> + ffi.Pointer< + ffi.NativeFunction + > get clang_getTokenLocation => _library._clang_getTokenLocationPtr; - ffi.Pointer> + ffi.Pointer> get clang_getTokenSpelling => _library._clang_getTokenSpellingPtr; - ffi.Pointer> + ffi.Pointer> get clang_getTranslationUnitCursor => _library._clang_getTranslationUnitCursorPtr; - ffi.Pointer> + ffi.Pointer> get clang_getTranslationUnitSpelling => _library._clang_getTranslationUnitSpellingPtr; - ffi.Pointer> + ffi.Pointer> get clang_getTranslationUnitTargetInfo => _library._clang_getTranslationUnitTargetInfoPtr; - ffi.Pointer> + ffi.Pointer> get clang_getTypeDeclaration => _library._clang_getTypeDeclarationPtr; - ffi.Pointer> + ffi.Pointer> get clang_getTypeKindSpelling => _library._clang_getTypeKindSpellingPtr; - ffi.Pointer> + ffi.Pointer> get clang_getTypeSpelling => _library._clang_getTypeSpellingPtr; - ffi.Pointer> + ffi.Pointer> get clang_getTypedefDeclUnderlyingType => _library._clang_getTypedefDeclUnderlyingTypePtr; - ffi.Pointer> + ffi.Pointer> get clang_getTypedefName => _library._clang_getTypedefNamePtr; - ffi.Pointer> + ffi.Pointer> get clang_hashCursor => _library._clang_hashCursorPtr; - ffi.Pointer> + ffi.Pointer> get clang_indexLoc_getCXSourceLocation => _library._clang_indexLoc_getCXSourceLocationPtr; - ffi.Pointer> + ffi.Pointer< + ffi.NativeFunction< + ffi.Void Function( + CXIdxLoc, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ) + > + > get clang_indexLoc_getFileLocation => _library._clang_indexLoc_getFileLocationPtr; - ffi.Pointer> + ffi.Pointer< + ffi.NativeFunction< + ffi.Int Function( + CXIndexAction, + CXClientData, + ffi.Pointer, + ffi.UnsignedInt, + ffi.UnsignedInt, + ffi.Pointer, + ffi.Pointer>, + ffi.Int, + ffi.Pointer, + ffi.UnsignedInt, + ffi.Pointer, + ffi.UnsignedInt, + ) + > + > get clang_indexSourceFile => _library._clang_indexSourceFilePtr; - ffi.Pointer> + ffi.Pointer< + ffi.NativeFunction< + ffi.Int Function( + CXIndexAction, + CXClientData, + ffi.Pointer, + ffi.UnsignedInt, + ffi.UnsignedInt, + ffi.Pointer, + ffi.Pointer>, + ffi.Int, + ffi.Pointer, + ffi.UnsignedInt, + ffi.Pointer, + ffi.UnsignedInt, + ) + > + > get clang_indexSourceFileFullArgv => _library._clang_indexSourceFileFullArgvPtr; - ffi.Pointer> + ffi.Pointer< + ffi.NativeFunction< + ffi.Int Function( + CXIndexAction, + CXClientData, + ffi.Pointer, + ffi.UnsignedInt, + ffi.UnsignedInt, + CXTranslationUnit, + ) + > + > get clang_indexTranslationUnit => _library._clang_indexTranslationUnitPtr; - ffi.Pointer> + ffi.Pointer< + ffi.NativeFunction< + ffi.Pointer Function(ffi.Pointer) + > + > get clang_index_getCXXClassDeclInfo => _library._clang_index_getCXXClassDeclInfoPtr; - ffi.Pointer> + ffi.Pointer< + ffi.NativeFunction< + CXIdxClientContainer Function(ffi.Pointer) + > + > get clang_index_getClientContainer => _library._clang_index_getClientContainerPtr; - ffi.Pointer> + ffi.Pointer< + ffi.NativeFunction)> + > get clang_index_getClientEntity => _library._clang_index_getClientEntityPtr; ffi.Pointer< - ffi.NativeFunction + ffi.NativeFunction< + ffi.Pointer Function( + ffi.Pointer, + ) + > > get clang_index_getIBOutletCollectionAttrInfo => _library._clang_index_getIBOutletCollectionAttrInfoPtr; - ffi.Pointer> + ffi.Pointer< + ffi.NativeFunction< + ffi.Pointer Function( + ffi.Pointer, + ) + > + > get clang_index_getObjCCategoryDeclInfo => _library._clang_index_getObjCCategoryDeclInfoPtr; - ffi.Pointer> + ffi.Pointer< + ffi.NativeFunction< + ffi.Pointer Function( + ffi.Pointer, + ) + > + > get clang_index_getObjCContainerDeclInfo => _library._clang_index_getObjCContainerDeclInfoPtr; - ffi.Pointer> + ffi.Pointer< + ffi.NativeFunction< + ffi.Pointer Function( + ffi.Pointer, + ) + > + > get clang_index_getObjCInterfaceDeclInfo => _library._clang_index_getObjCInterfaceDeclInfoPtr; - ffi.Pointer> + ffi.Pointer< + ffi.NativeFunction< + ffi.Pointer Function( + ffi.Pointer, + ) + > + > get clang_index_getObjCPropertyDeclInfo => _library._clang_index_getObjCPropertyDeclInfoPtr; - ffi.Pointer> + ffi.Pointer< + ffi.NativeFunction< + ffi.Pointer Function( + ffi.Pointer, + ) + > + > get clang_index_getObjCProtocolRefListInfo => _library._clang_index_getObjCProtocolRefListInfoPtr; - ffi.Pointer> + ffi.Pointer> get clang_index_isEntityObjCContainerKind => _library._clang_index_isEntityObjCContainerKindPtr; - ffi.Pointer> + ffi.Pointer< + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer, CXIdxClientContainer) + > + > get clang_index_setClientContainer => _library._clang_index_setClientContainerPtr; - ffi.Pointer> + ffi.Pointer< + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer, CXIdxClientEntity) + > + > get clang_index_setClientEntity => _library._clang_index_setClientEntityPtr; - ffi.Pointer> + ffi.Pointer> get clang_isAttribute => _library._clang_isAttributePtr; - ffi.Pointer> + ffi.Pointer> get clang_isConstQualifiedType => _library._clang_isConstQualifiedTypePtr; - ffi.Pointer> + ffi.Pointer> get clang_isCursorDefinition => _library._clang_isCursorDefinitionPtr; - ffi.Pointer> + ffi.Pointer> get clang_isDeclaration => _library._clang_isDeclarationPtr; - ffi.Pointer> + ffi.Pointer> get clang_isExpression => _library._clang_isExpressionPtr; - ffi.Pointer> + ffi.Pointer< + ffi.NativeFunction + > get clang_isFileMultipleIncludeGuarded => _library._clang_isFileMultipleIncludeGuardedPtr; - ffi.Pointer> + ffi.Pointer> get clang_isFunctionTypeVariadic => _library._clang_isFunctionTypeVariadicPtr; - ffi.Pointer> get clang_isInvalid => - _library._clang_isInvalidPtr; - ffi.Pointer> + ffi.Pointer> + get clang_isInvalid => _library._clang_isInvalidPtr; + ffi.Pointer> get clang_isInvalidDeclaration => _library._clang_isInvalidDeclarationPtr; - ffi.Pointer> get clang_isPODType => - _library._clang_isPODTypePtr; - ffi.Pointer> + ffi.Pointer> + get clang_isPODType => _library._clang_isPODTypePtr; + ffi.Pointer> get clang_isPreprocessing => _library._clang_isPreprocessingPtr; - ffi.Pointer> + ffi.Pointer> get clang_isReference => _library._clang_isReferencePtr; - ffi.Pointer> + ffi.Pointer> get clang_isRestrictQualifiedType => _library._clang_isRestrictQualifiedTypePtr; - ffi.Pointer> + ffi.Pointer> get clang_isStatement => _library._clang_isStatementPtr; - ffi.Pointer> + ffi.Pointer> get clang_isTranslationUnit => _library._clang_isTranslationUnitPtr; - ffi.Pointer> + ffi.Pointer> get clang_isUnexposed => _library._clang_isUnexposedPtr; - ffi.Pointer> + ffi.Pointer> get clang_isVirtualBase => _library._clang_isVirtualBasePtr; - ffi.Pointer> + ffi.Pointer> get clang_isVolatileQualifiedType => _library._clang_isVolatileQualifiedTypePtr; - ffi.Pointer> + ffi.Pointer< + ffi.NativeFunction< + CXDiagnosticSet Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ) + > + > get clang_loadDiagnostics => _library._clang_loadDiagnosticsPtr; - ffi.Pointer> + ffi.Pointer< + ffi.NativeFunction< + CXTranslationUnit Function( + CXIndex, + ffi.Pointer, + ffi.Pointer>, + ffi.Int, + ffi.Pointer, + ffi.UnsignedInt, + ffi.UnsignedInt, + ) + > + > get clang_parseTranslationUnit => _library._clang_parseTranslationUnitPtr; - ffi.Pointer> + ffi.Pointer< + ffi.NativeFunction< + ffi.UnsignedInt Function( + CXIndex, + ffi.Pointer, + ffi.Pointer>, + ffi.Int, + ffi.Pointer, + ffi.UnsignedInt, + ffi.UnsignedInt, + ffi.Pointer, + ) + > + > get clang_parseTranslationUnit2 => _library._clang_parseTranslationUnit2Ptr; - ffi.Pointer> + ffi.Pointer< + ffi.NativeFunction< + ffi.UnsignedInt Function( + CXIndex, + ffi.Pointer, + ffi.Pointer>, + ffi.Int, + ffi.Pointer, + ffi.UnsignedInt, + ffi.UnsignedInt, + ffi.Pointer, + ) + > + > get clang_parseTranslationUnit2FullArgv => _library._clang_parseTranslationUnit2FullArgvPtr; - ffi.Pointer> + ffi.Pointer> get clang_remap_dispose => _library._clang_remap_disposePtr; - ffi.Pointer> + ffi.Pointer< + ffi.NativeFunction< + ffi.Void Function( + CXRemapping, + ffi.UnsignedInt, + ffi.Pointer, + ffi.Pointer, + ) + > + > get clang_remap_getFilenames => _library._clang_remap_getFilenamesPtr; - ffi.Pointer> + ffi.Pointer> get clang_remap_getNumFiles => _library._clang_remap_getNumFilesPtr; - ffi.Pointer> + ffi.Pointer< + ffi.NativeFunction< + ffi.Int Function( + CXTranslationUnit, + ffi.UnsignedInt, + ffi.Pointer, + ffi.UnsignedInt, + ) + > + > get clang_reparseTranslationUnit => _library._clang_reparseTranslationUnitPtr; - ffi.Pointer> + ffi.Pointer< + ffi.NativeFunction< + ffi.Int Function( + CXTranslationUnit, + ffi.Pointer, + ffi.UnsignedInt, + ) + > + > get clang_saveTranslationUnit => _library._clang_saveTranslationUnitPtr; - ffi.Pointer> + ffi.Pointer< + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer, ffi.UnsignedInt) + > + > get clang_sortCodeCompletionResults => _library._clang_sortCodeCompletionResultsPtr; - ffi.Pointer> + ffi.Pointer> get clang_suspendTranslationUnit => _library._clang_suspendTranslationUnitPtr; - ffi.Pointer> + ffi.Pointer> get clang_toggleCrashRecovery => _library._clang_toggleCrashRecoveryPtr; - ffi.Pointer> get clang_tokenize => - _library._clang_tokenizePtr; - ffi.Pointer> + ffi.Pointer< + ffi.NativeFunction< + ffi.Void Function( + CXTranslationUnit, + CXSourceRange, + ffi.Pointer>, + ffi.Pointer, + ) + > + > + get clang_tokenize => _library._clang_tokenizePtr; + ffi.Pointer< + ffi.NativeFunction< + ffi.UnsignedInt Function(CXCursor, CXCursorVisitor, CXClientData) + > + > get clang_visitChildren => _library._clang_visitChildrenPtr; } @@ -8217,7 +9483,9 @@ enum CXCursorKind { } /// A fast container representing a set of CXCursors. -typedef CXCursorSet = ffi.Pointer; +typedef CXCursorSet = ffi.Pointer; + +final class CXCursorSetImpl extends ffi.Opaque {} /// Visitor invoked for each cursor found by a traversal. /// @@ -8230,19 +9498,15 @@ typedef CXCursorSet = ffi.Pointer; /// The visitor should return one of the \c CXChildVisitResult values /// to direct clang_visitCursorChildren(). typedef CXCursorVisitor = - ffi.Pointer>; -typedef CXCursorVisitorFunction = - ffi.UnsignedInt Function( - CXCursor cursor, - CXCursor parent, - CXClientData client_data, - ); -typedef DartCXCursorVisitorFunction = - CXChildVisitResult Function( - CXCursor cursor, - CXCursor parent, - CXClientData client_data, - ); + ffi.Pointer< + ffi.NativeFunction< + ffi.UnsignedInt Function( + CXCursor cursor, + CXCursor parent, + CXClientData client_data, + ) + > + >; /// A single diagnostic, containing the diagnostic's severity, /// location, text, source ranges, and fix-it hints. @@ -8360,11 +9624,11 @@ enum CXEvalResultKind { /// The visitor should return one of the \c CXVisitorResult values /// to direct \c clang_Type_visitFields. typedef CXFieldVisitor = - ffi.Pointer>; -typedef CXFieldVisitorFunction = - ffi.UnsignedInt Function(CXCursor C, CXClientData client_data); -typedef DartCXFieldVisitorFunction = - CXVisitorResult Function(CXCursor C, CXClientData client_data); + ffi.Pointer< + ffi.NativeFunction< + ffi.UnsignedInt Function(CXCursor C, CXClientData client_data) + > + >; /// A particular source file that is part of a translation unit. typedef CXFile = ffi.Pointer; @@ -8905,21 +10169,16 @@ final class CXIdxObjCProtocolRefListInfo extends ffi.Struct { /// array is sorted in order of immediate inclusion. For example, /// the first element refers to the location that included 'included_file'. typedef CXInclusionVisitor = - ffi.Pointer>; -typedef CXInclusionVisitorFunction = - ffi.Void Function( - CXFile included_file, - ffi.Pointer inclusion_stack, - ffi.UnsignedInt include_len, - CXClientData client_data, - ); -typedef DartCXInclusionVisitorFunction = - void Function( - CXFile included_file, - ffi.Pointer inclusion_stack, - int include_len, - CXClientData client_data, - ); + ffi.Pointer< + ffi.NativeFunction< + ffi.Void Function( + CXFile included_file, + ffi.Pointer inclusion_stack, + ffi.UnsignedInt include_len, + CXClientData client_data, + ) + > + >; /// An "index" that consists of a set of translation units that would /// typically be linked together into an executable or library. @@ -10097,1523 +11356,3 @@ final class IndexerCallbacks extends ffi.Struct { ..ref.indexDeclaration = indexDeclaration ..ref.indexEntityReference = indexEntityReference; } - -typedef NativeClang_CXCursorSet_contains = - ffi.UnsignedInt Function(CXCursorSet cset, CXCursor cursor); -typedef DartClang_CXCursorSet_contains = - int Function(CXCursorSet cset, CXCursor cursor); -typedef NativeClang_CXCursorSet_insert = - ffi.UnsignedInt Function(CXCursorSet cset, CXCursor cursor); -typedef DartClang_CXCursorSet_insert = - int Function(CXCursorSet cset, CXCursor cursor); -typedef NativeClang_CXIndex_getGlobalOptions = - ffi.UnsignedInt Function(CXIndex); -typedef DartClang_CXIndex_getGlobalOptions = int Function(CXIndex); -typedef NativeClang_CXIndex_setGlobalOptions = - ffi.Void Function(CXIndex, ffi.UnsignedInt options); -typedef DartClang_CXIndex_setGlobalOptions = - void Function(CXIndex, int options); -typedef NativeClang_CXIndex_setInvocationEmissionPathOption = - ffi.Void Function(CXIndex, ffi.Pointer Path); -typedef DartClang_CXIndex_setInvocationEmissionPathOption = - void Function(CXIndex, ffi.Pointer Path); -typedef NativeClang_CXXConstructor_isConvertingConstructor = - ffi.UnsignedInt Function(CXCursor C); -typedef DartClang_CXXConstructor_isConvertingConstructor = - int Function(CXCursor C); -typedef NativeClang_CXXConstructor_isCopyConstructor = - ffi.UnsignedInt Function(CXCursor C); -typedef DartClang_CXXConstructor_isCopyConstructor = int Function(CXCursor C); -typedef NativeClang_CXXConstructor_isDefaultConstructor = - ffi.UnsignedInt Function(CXCursor C); -typedef DartClang_CXXConstructor_isDefaultConstructor = - int Function(CXCursor C); -typedef NativeClang_CXXConstructor_isMoveConstructor = - ffi.UnsignedInt Function(CXCursor C); -typedef DartClang_CXXConstructor_isMoveConstructor = int Function(CXCursor C); -typedef NativeClang_CXXField_isMutable = ffi.UnsignedInt Function(CXCursor C); -typedef DartClang_CXXField_isMutable = int Function(CXCursor C); -typedef NativeClang_CXXMethod_isConst = ffi.UnsignedInt Function(CXCursor C); -typedef DartClang_CXXMethod_isConst = int Function(CXCursor C); -typedef NativeClang_CXXMethod_isDefaulted = - ffi.UnsignedInt Function(CXCursor C); -typedef DartClang_CXXMethod_isDefaulted = int Function(CXCursor C); -typedef NativeClang_CXXMethod_isPureVirtual = - ffi.UnsignedInt Function(CXCursor C); -typedef DartClang_CXXMethod_isPureVirtual = int Function(CXCursor C); -typedef NativeClang_CXXMethod_isStatic = ffi.UnsignedInt Function(CXCursor C); -typedef DartClang_CXXMethod_isStatic = int Function(CXCursor C); -typedef NativeClang_CXXMethod_isVirtual = ffi.UnsignedInt Function(CXCursor C); -typedef DartClang_CXXMethod_isVirtual = int Function(CXCursor C); -typedef NativeClang_CXXRecord_isAbstract = ffi.UnsignedInt Function(CXCursor C); -typedef DartClang_CXXRecord_isAbstract = int Function(CXCursor C); -typedef NativeClang_Cursor_Evaluate = CXEvalResult Function(CXCursor C); -typedef DartClang_Cursor_Evaluate = CXEvalResult Function(CXCursor C); -typedef NativeClang_Cursor_getArgument = - CXCursor Function(CXCursor C, ffi.UnsignedInt i); -typedef DartClang_Cursor_getArgument = CXCursor Function(CXCursor C, int i); -typedef NativeClang_Cursor_getBriefCommentText = CXString Function(CXCursor C); -typedef DartClang_Cursor_getBriefCommentText = CXString Function(CXCursor C); -typedef NativeClang_Cursor_getCXXManglings = - ffi.Pointer Function(CXCursor); -typedef DartClang_Cursor_getCXXManglings = - ffi.Pointer Function(CXCursor); -typedef NativeClang_Cursor_getCommentRange = CXSourceRange Function(CXCursor C); -typedef DartClang_Cursor_getCommentRange = CXSourceRange Function(CXCursor C); -typedef NativeClang_Cursor_getMangling = CXString Function(CXCursor); -typedef DartClang_Cursor_getMangling = CXString Function(CXCursor); -typedef NativeClang_Cursor_getModule = CXModule Function(CXCursor C); -typedef DartClang_Cursor_getModule = CXModule Function(CXCursor C); -typedef NativeClang_Cursor_getNumArguments = ffi.Int Function(CXCursor C); -typedef DartClang_Cursor_getNumArguments = int Function(CXCursor C); -typedef NativeClang_Cursor_getNumTemplateArguments = - ffi.Int Function(CXCursor C); -typedef DartClang_Cursor_getNumTemplateArguments = int Function(CXCursor C); -typedef NativeClang_Cursor_getObjCDeclQualifiers = - ffi.UnsignedInt Function(CXCursor C); -typedef DartClang_Cursor_getObjCDeclQualifiers = int Function(CXCursor C); -typedef NativeClang_Cursor_getObjCManglings = - ffi.Pointer Function(CXCursor); -typedef DartClang_Cursor_getObjCManglings = - ffi.Pointer Function(CXCursor); -typedef NativeClang_Cursor_getObjCPropertyAttributes = - ffi.UnsignedInt Function(CXCursor C, ffi.UnsignedInt reserved); -typedef DartClang_Cursor_getObjCPropertyAttributes = - int Function(CXCursor C, int reserved); -typedef NativeClang_Cursor_getObjCPropertyGetterName = - CXString Function(CXCursor C); -typedef DartClang_Cursor_getObjCPropertyGetterName = - CXString Function(CXCursor C); -typedef NativeClang_Cursor_getObjCPropertySetterName = - CXString Function(CXCursor C); -typedef DartClang_Cursor_getObjCPropertySetterName = - CXString Function(CXCursor C); -typedef NativeClang_Cursor_getObjCSelectorIndex = ffi.Int Function(CXCursor); -typedef DartClang_Cursor_getObjCSelectorIndex = int Function(CXCursor); -typedef NativeClang_Cursor_getOffsetOfField = ffi.LongLong Function(CXCursor C); -typedef DartClang_Cursor_getOffsetOfField = int Function(CXCursor C); -typedef NativeClang_Cursor_getRawCommentText = CXString Function(CXCursor C); -typedef DartClang_Cursor_getRawCommentText = CXString Function(CXCursor C); -typedef NativeClang_Cursor_getReceiverType = CXType Function(CXCursor C); -typedef DartClang_Cursor_getReceiverType = CXType Function(CXCursor C); -typedef NativeClang_Cursor_getSpellingNameRange = - CXSourceRange Function( - CXCursor, - ffi.UnsignedInt pieceIndex, - ffi.UnsignedInt options, - ); -typedef DartClang_Cursor_getSpellingNameRange = - CXSourceRange Function(CXCursor, int pieceIndex, int options); -typedef NativeClang_Cursor_getStorageClass = ffi.UnsignedInt Function(CXCursor); -typedef DartClang_Cursor_getStorageClass = int Function(CXCursor); -typedef NativeClang_Cursor_getTemplateArgumentKind = - ffi.UnsignedInt Function(CXCursor C, ffi.UnsignedInt I); -typedef DartClang_Cursor_getTemplateArgumentKind = - int Function(CXCursor C, int I); -typedef NativeClang_Cursor_getTemplateArgumentType = - CXType Function(CXCursor C, ffi.UnsignedInt I); -typedef DartClang_Cursor_getTemplateArgumentType = - CXType Function(CXCursor C, int I); -typedef NativeClang_Cursor_getTemplateArgumentUnsignedValue = - ffi.UnsignedLongLong Function(CXCursor C, ffi.UnsignedInt I); -typedef DartClang_Cursor_getTemplateArgumentUnsignedValue = - int Function(CXCursor C, int I); -typedef NativeClang_Cursor_getTemplateArgumentValue = - ffi.LongLong Function(CXCursor C, ffi.UnsignedInt I); -typedef DartClang_Cursor_getTemplateArgumentValue = - int Function(CXCursor C, int I); -typedef NativeClang_Cursor_getTranslationUnit = - CXTranslationUnit Function(CXCursor); -typedef DartClang_Cursor_getTranslationUnit = - CXTranslationUnit Function(CXCursor); -typedef NativeClang_Cursor_hasAttrs = ffi.UnsignedInt Function(CXCursor C); -typedef DartClang_Cursor_hasAttrs = int Function(CXCursor C); -typedef NativeClang_Cursor_isAnonymous = ffi.UnsignedInt Function(CXCursor C); -typedef DartClang_Cursor_isAnonymous = int Function(CXCursor C); -typedef NativeClang_Cursor_isAnonymousRecordDecl = - ffi.UnsignedInt Function(CXCursor C); -typedef DartClang_Cursor_isAnonymousRecordDecl = int Function(CXCursor C); -typedef NativeClang_Cursor_isBitField = ffi.UnsignedInt Function(CXCursor C); -typedef DartClang_Cursor_isBitField = int Function(CXCursor C); -typedef NativeClang_Cursor_isDynamicCall = ffi.Int Function(CXCursor C); -typedef DartClang_Cursor_isDynamicCall = int Function(CXCursor C); -typedef NativeClang_Cursor_isExternalSymbol = - ffi.UnsignedInt Function( - CXCursor C, - ffi.Pointer language, - ffi.Pointer definedIn, - ffi.Pointer isGenerated, - ); -typedef DartClang_Cursor_isExternalSymbol = - int Function( - CXCursor C, - ffi.Pointer language, - ffi.Pointer definedIn, - ffi.Pointer isGenerated, - ); -typedef NativeClang_Cursor_isFunctionInlined = - ffi.UnsignedInt Function(CXCursor C); -typedef DartClang_Cursor_isFunctionInlined = int Function(CXCursor C); -typedef NativeClang_Cursor_isInlineNamespace = - ffi.UnsignedInt Function(CXCursor C); -typedef DartClang_Cursor_isInlineNamespace = int Function(CXCursor C); -typedef NativeClang_Cursor_isMacroBuiltin = - ffi.UnsignedInt Function(CXCursor C); -typedef DartClang_Cursor_isMacroBuiltin = int Function(CXCursor C); -typedef NativeClang_Cursor_isMacroFunctionLike = - ffi.UnsignedInt Function(CXCursor C); -typedef DartClang_Cursor_isMacroFunctionLike = int Function(CXCursor C); -typedef NativeClang_Cursor_isNull = ffi.Int Function(CXCursor cursor); -typedef DartClang_Cursor_isNull = int Function(CXCursor cursor); -typedef NativeClang_Cursor_isObjCOptional = - ffi.UnsignedInt Function(CXCursor C); -typedef DartClang_Cursor_isObjCOptional = int Function(CXCursor C); -typedef NativeClang_Cursor_isVariadic = ffi.UnsignedInt Function(CXCursor C); -typedef DartClang_Cursor_isVariadic = int Function(CXCursor C); -typedef NativeClang_EnumDecl_isScoped = ffi.UnsignedInt Function(CXCursor C); -typedef DartClang_EnumDecl_isScoped = int Function(CXCursor C); -typedef NativeClang_EvalResult_dispose = ffi.Void Function(CXEvalResult E); -typedef DartClang_EvalResult_dispose = void Function(CXEvalResult E); -typedef NativeClang_EvalResult_getAsDouble = - ffi.Double Function(CXEvalResult E); -typedef DartClang_EvalResult_getAsDouble = double Function(CXEvalResult E); -typedef NativeClang_EvalResult_getAsInt = ffi.Int Function(CXEvalResult E); -typedef DartClang_EvalResult_getAsInt = int Function(CXEvalResult E); -typedef NativeClang_EvalResult_getAsLongLong = - ffi.LongLong Function(CXEvalResult E); -typedef DartClang_EvalResult_getAsLongLong = int Function(CXEvalResult E); -typedef NativeClang_EvalResult_getAsStr = - ffi.Pointer Function(CXEvalResult E); -typedef DartClang_EvalResult_getAsStr = - ffi.Pointer Function(CXEvalResult E); -typedef NativeClang_EvalResult_getAsUnsigned = - ffi.UnsignedLongLong Function(CXEvalResult E); -typedef DartClang_EvalResult_getAsUnsigned = int Function(CXEvalResult E); -typedef NativeClang_EvalResult_getKind = - ffi.UnsignedInt Function(CXEvalResult E); -typedef DartClang_EvalResult_getKind = int Function(CXEvalResult E); -typedef NativeClang_EvalResult_isUnsignedInt = - ffi.UnsignedInt Function(CXEvalResult E); -typedef DartClang_EvalResult_isUnsignedInt = int Function(CXEvalResult E); -typedef NativeClang_File_isEqual = ffi.Int Function(CXFile file1, CXFile file2); -typedef DartClang_File_isEqual = int Function(CXFile file1, CXFile file2); -typedef NativeClang_File_tryGetRealPathName = CXString Function(CXFile file); -typedef DartClang_File_tryGetRealPathName = CXString Function(CXFile file); -typedef NativeClang_IndexAction_create = CXIndexAction Function(CXIndex CIdx); -typedef DartClang_IndexAction_create = CXIndexAction Function(CXIndex CIdx); -typedef NativeClang_IndexAction_dispose = ffi.Void Function(CXIndexAction); -typedef DartClang_IndexAction_dispose = void Function(CXIndexAction); -typedef NativeClang_Location_isFromMainFile = - ffi.Int Function(CXSourceLocation location); -typedef DartClang_Location_isFromMainFile = - int Function(CXSourceLocation location); -typedef NativeClang_Location_isInSystemHeader = - ffi.Int Function(CXSourceLocation location); -typedef DartClang_Location_isInSystemHeader = - int Function(CXSourceLocation location); -typedef NativeClang_Module_getASTFile = CXFile Function(CXModule Module); -typedef DartClang_Module_getASTFile = CXFile Function(CXModule Module); -typedef NativeClang_Module_getFullName = CXString Function(CXModule Module); -typedef DartClang_Module_getFullName = CXString Function(CXModule Module); -typedef NativeClang_Module_getName = CXString Function(CXModule Module); -typedef DartClang_Module_getName = CXString Function(CXModule Module); -typedef NativeClang_Module_getNumTopLevelHeaders = - ffi.UnsignedInt Function(CXTranslationUnit, CXModule Module); -typedef DartClang_Module_getNumTopLevelHeaders = - int Function(CXTranslationUnit, CXModule Module); -typedef NativeClang_Module_getParent = CXModule Function(CXModule Module); -typedef DartClang_Module_getParent = CXModule Function(CXModule Module); -typedef NativeClang_Module_getTopLevelHeader = - CXFile Function(CXTranslationUnit, CXModule Module, ffi.UnsignedInt Index); -typedef DartClang_Module_getTopLevelHeader = - CXFile Function(CXTranslationUnit, CXModule Module, int Index); -typedef NativeClang_Module_isSystem = ffi.Int Function(CXModule Module); -typedef DartClang_Module_isSystem = int Function(CXModule Module); -typedef NativeClang_PrintingPolicy_dispose = - ffi.Void Function(CXPrintingPolicy Policy); -typedef DartClang_PrintingPolicy_dispose = - void Function(CXPrintingPolicy Policy); -typedef NativeClang_PrintingPolicy_getProperty = - ffi.UnsignedInt Function(CXPrintingPolicy Policy, ffi.UnsignedInt Property); -typedef DartClang_PrintingPolicy_getProperty = - int Function(CXPrintingPolicy Policy, int Property); -typedef NativeClang_PrintingPolicy_setProperty = - ffi.Void Function( - CXPrintingPolicy Policy, - ffi.UnsignedInt Property, - ffi.UnsignedInt Value, - ); -typedef DartClang_PrintingPolicy_setProperty = - void Function(CXPrintingPolicy Policy, int Property, int Value); -typedef NativeClang_Range_isNull = ffi.Int Function(CXSourceRange range); -typedef DartClang_Range_isNull = int Function(CXSourceRange range); -typedef NativeClang_TargetInfo_dispose = ffi.Void Function(CXTargetInfo Info); -typedef DartClang_TargetInfo_dispose = void Function(CXTargetInfo Info); -typedef NativeClang_TargetInfo_getPointerWidth = - ffi.Int Function(CXTargetInfo Info); -typedef DartClang_TargetInfo_getPointerWidth = int Function(CXTargetInfo Info); -typedef NativeClang_TargetInfo_getTriple = CXString Function(CXTargetInfo Info); -typedef DartClang_TargetInfo_getTriple = CXString Function(CXTargetInfo Info); -typedef NativeClang_Type_getAlignOf = ffi.LongLong Function(CXType T); -typedef DartClang_Type_getAlignOf = int Function(CXType T); -typedef NativeClang_Type_getCXXRefQualifier = - ffi.UnsignedInt Function(CXType T); -typedef DartClang_Type_getCXXRefQualifier = int Function(CXType T); -typedef NativeClang_Type_getClassType = CXType Function(CXType T); -typedef DartClang_Type_getClassType = CXType Function(CXType T); -typedef NativeClang_Type_getModifiedType = CXType Function(CXType T); -typedef DartClang_Type_getModifiedType = CXType Function(CXType T); -typedef NativeClang_Type_getNamedType = CXType Function(CXType T); -typedef DartClang_Type_getNamedType = CXType Function(CXType T); -typedef NativeClang_Type_getNullability = ffi.UnsignedInt Function(CXType T); -typedef DartClang_Type_getNullability = int Function(CXType T); -typedef NativeClang_Type_getNumObjCProtocolRefs = - ffi.UnsignedInt Function(CXType T); -typedef DartClang_Type_getNumObjCProtocolRefs = int Function(CXType T); -typedef NativeClang_Type_getNumObjCTypeArgs = - ffi.UnsignedInt Function(CXType T); -typedef DartClang_Type_getNumObjCTypeArgs = int Function(CXType T); -typedef NativeClang_Type_getNumTemplateArguments = ffi.Int Function(CXType T); -typedef DartClang_Type_getNumTemplateArguments = int Function(CXType T); -typedef NativeClang_Type_getObjCEncoding = CXString Function(CXType type); -typedef DartClang_Type_getObjCEncoding = CXString Function(CXType type); -typedef NativeClang_Type_getObjCObjectBaseType = CXType Function(CXType T); -typedef DartClang_Type_getObjCObjectBaseType = CXType Function(CXType T); -typedef NativeClang_Type_getObjCProtocolDecl = - CXCursor Function(CXType T, ffi.UnsignedInt i); -typedef DartClang_Type_getObjCProtocolDecl = CXCursor Function(CXType T, int i); -typedef NativeClang_Type_getObjCTypeArg = - CXType Function(CXType T, ffi.UnsignedInt i); -typedef DartClang_Type_getObjCTypeArg = CXType Function(CXType T, int i); -typedef NativeClang_Type_getOffsetOf = - ffi.LongLong Function(CXType T, ffi.Pointer S); -typedef DartClang_Type_getOffsetOf = - int Function(CXType T, ffi.Pointer S); -typedef NativeClang_Type_getSizeOf = ffi.LongLong Function(CXType T); -typedef DartClang_Type_getSizeOf = int Function(CXType T); -typedef NativeClang_Type_getTemplateArgumentAsType = - CXType Function(CXType T, ffi.UnsignedInt i); -typedef DartClang_Type_getTemplateArgumentAsType = - CXType Function(CXType T, int i); -typedef NativeClang_Type_isTransparentTagTypedef = - ffi.UnsignedInt Function(CXType T); -typedef DartClang_Type_isTransparentTagTypedef = int Function(CXType T); -typedef NativeClang_Type_visitFields = - ffi.UnsignedInt Function( - CXType T, - CXFieldVisitor visitor, - CXClientData client_data, - ); -typedef DartClang_Type_visitFields = - int Function(CXType T, CXFieldVisitor visitor, CXClientData client_data); -typedef NativeClang_annotateTokens = - ffi.Void Function( - CXTranslationUnit TU, - ffi.Pointer Tokens, - ffi.UnsignedInt NumTokens, - ffi.Pointer Cursors, - ); -typedef DartClang_annotateTokens = - void Function( - CXTranslationUnit TU, - ffi.Pointer Tokens, - int NumTokens, - ffi.Pointer Cursors, - ); -typedef NativeClang_codeCompleteAt = - ffi.Pointer Function( - CXTranslationUnit TU, - ffi.Pointer complete_filename, - ffi.UnsignedInt complete_line, - ffi.UnsignedInt complete_column, - ffi.Pointer unsaved_files, - ffi.UnsignedInt num_unsaved_files, - ffi.UnsignedInt options, - ); -typedef DartClang_codeCompleteAt = - ffi.Pointer Function( - CXTranslationUnit TU, - ffi.Pointer complete_filename, - int complete_line, - int complete_column, - ffi.Pointer unsaved_files, - int num_unsaved_files, - int options, - ); -typedef NativeClang_codeCompleteGetContainerKind = - ffi.UnsignedInt Function( - ffi.Pointer Results, - ffi.Pointer IsIncomplete, - ); -typedef DartClang_codeCompleteGetContainerKind = - int Function( - ffi.Pointer Results, - ffi.Pointer IsIncomplete, - ); -typedef NativeClang_codeCompleteGetContainerUSR = - CXString Function(ffi.Pointer Results); -typedef DartClang_codeCompleteGetContainerUSR = - CXString Function(ffi.Pointer Results); -typedef NativeClang_codeCompleteGetContexts = - ffi.UnsignedLongLong Function(ffi.Pointer Results); -typedef DartClang_codeCompleteGetContexts = - int Function(ffi.Pointer Results); -typedef NativeClang_codeCompleteGetDiagnostic = - CXDiagnostic Function( - ffi.Pointer Results, - ffi.UnsignedInt Index, - ); -typedef DartClang_codeCompleteGetDiagnostic = - CXDiagnostic Function( - ffi.Pointer Results, - int Index, - ); -typedef NativeClang_codeCompleteGetNumDiagnostics = - ffi.UnsignedInt Function(ffi.Pointer Results); -typedef DartClang_codeCompleteGetNumDiagnostics = - int Function(ffi.Pointer Results); -typedef NativeClang_codeCompleteGetObjCSelector = - CXString Function(ffi.Pointer Results); -typedef DartClang_codeCompleteGetObjCSelector = - CXString Function(ffi.Pointer Results); -typedef NativeClang_constructUSR_ObjCCategory = - CXString Function( - ffi.Pointer class_name, - ffi.Pointer category_name, - ); -typedef DartClang_constructUSR_ObjCCategory = - CXString Function( - ffi.Pointer class_name, - ffi.Pointer category_name, - ); -typedef NativeClang_constructUSR_ObjCClass = - CXString Function(ffi.Pointer class_name); -typedef DartClang_constructUSR_ObjCClass = - CXString Function(ffi.Pointer class_name); -typedef NativeClang_constructUSR_ObjCIvar = - CXString Function(ffi.Pointer name, CXString classUSR); -typedef DartClang_constructUSR_ObjCIvar = - CXString Function(ffi.Pointer name, CXString classUSR); -typedef NativeClang_constructUSR_ObjCMethod = - CXString Function( - ffi.Pointer name, - ffi.UnsignedInt isInstanceMethod, - CXString classUSR, - ); -typedef DartClang_constructUSR_ObjCMethod = - CXString Function( - ffi.Pointer name, - int isInstanceMethod, - CXString classUSR, - ); -typedef NativeClang_constructUSR_ObjCProperty = - CXString Function(ffi.Pointer property, CXString classUSR); -typedef DartClang_constructUSR_ObjCProperty = - CXString Function(ffi.Pointer property, CXString classUSR); -typedef NativeClang_constructUSR_ObjCProtocol = - CXString Function(ffi.Pointer protocol_name); -typedef DartClang_constructUSR_ObjCProtocol = - CXString Function(ffi.Pointer protocol_name); -typedef NativeClang_createCXCursorSet = CXCursorSet Function(); -typedef DartClang_createCXCursorSet = CXCursorSet Function(); -typedef NativeClang_createIndex = - CXIndex Function( - ffi.Int excludeDeclarationsFromPCH, - ffi.Int displayDiagnostics, - ); -typedef DartClang_createIndex = - CXIndex Function(int excludeDeclarationsFromPCH, int displayDiagnostics); -typedef NativeClang_createTranslationUnit = - CXTranslationUnit Function( - CXIndex CIdx, - ffi.Pointer ast_filename, - ); -typedef DartClang_createTranslationUnit = - CXTranslationUnit Function( - CXIndex CIdx, - ffi.Pointer ast_filename, - ); -typedef NativeClang_createTranslationUnit2 = - ffi.UnsignedInt Function( - CXIndex CIdx, - ffi.Pointer ast_filename, - ffi.Pointer out_TU, - ); -typedef DartClang_createTranslationUnit2 = - int Function( - CXIndex CIdx, - ffi.Pointer ast_filename, - ffi.Pointer out_TU, - ); -typedef NativeClang_createTranslationUnitFromSourceFile = - CXTranslationUnit Function( - CXIndex CIdx, - ffi.Pointer source_filename, - ffi.Int num_clang_command_line_args, - ffi.Pointer> clang_command_line_args, - ffi.UnsignedInt num_unsaved_files, - ffi.Pointer unsaved_files, - ); -typedef DartClang_createTranslationUnitFromSourceFile = - CXTranslationUnit Function( - CXIndex CIdx, - ffi.Pointer source_filename, - int num_clang_command_line_args, - ffi.Pointer> clang_command_line_args, - int num_unsaved_files, - ffi.Pointer unsaved_files, - ); -typedef NativeClang_defaultCodeCompleteOptions = ffi.UnsignedInt Function(); -typedef DartClang_defaultCodeCompleteOptions = int Function(); -typedef NativeClang_defaultDiagnosticDisplayOptions = - ffi.UnsignedInt Function(); -typedef DartClang_defaultDiagnosticDisplayOptions = int Function(); -typedef NativeClang_defaultEditingTranslationUnitOptions = - ffi.UnsignedInt Function(); -typedef DartClang_defaultEditingTranslationUnitOptions = int Function(); -typedef NativeClang_defaultReparseOptions = - ffi.UnsignedInt Function(CXTranslationUnit TU); -typedef DartClang_defaultReparseOptions = int Function(CXTranslationUnit TU); -typedef NativeClang_defaultSaveOptions = - ffi.UnsignedInt Function(CXTranslationUnit TU); -typedef DartClang_defaultSaveOptions = int Function(CXTranslationUnit TU); -typedef NativeClang_disposeCXCursorSet = ffi.Void Function(CXCursorSet cset); -typedef DartClang_disposeCXCursorSet = void Function(CXCursorSet cset); -typedef NativeClang_disposeCXPlatformAvailability = - ffi.Void Function(ffi.Pointer availability); -typedef DartClang_disposeCXPlatformAvailability = - void Function(ffi.Pointer availability); -typedef NativeClang_disposeCXTUResourceUsage = - ffi.Void Function(CXTUResourceUsage usage); -typedef DartClang_disposeCXTUResourceUsage = - void Function(CXTUResourceUsage usage); -typedef NativeClang_disposeCodeCompleteResults = - ffi.Void Function(ffi.Pointer Results); -typedef DartClang_disposeCodeCompleteResults = - void Function(ffi.Pointer Results); -typedef NativeClang_disposeDiagnostic = - ffi.Void Function(CXDiagnostic Diagnostic); -typedef DartClang_disposeDiagnostic = void Function(CXDiagnostic Diagnostic); -typedef NativeClang_disposeDiagnosticSet = - ffi.Void Function(CXDiagnosticSet Diags); -typedef DartClang_disposeDiagnosticSet = void Function(CXDiagnosticSet Diags); -typedef NativeClang_disposeIndex = ffi.Void Function(CXIndex index); -typedef DartClang_disposeIndex = void Function(CXIndex index); -typedef NativeClang_disposeOverriddenCursors = - ffi.Void Function(ffi.Pointer overridden); -typedef DartClang_disposeOverriddenCursors = - void Function(ffi.Pointer overridden); -typedef NativeClang_disposeSourceRangeList = - ffi.Void Function(ffi.Pointer ranges); -typedef DartClang_disposeSourceRangeList = - void Function(ffi.Pointer ranges); -typedef NativeClang_disposeString = ffi.Void Function(CXString string); -typedef DartClang_disposeString = void Function(CXString string); -typedef NativeClang_disposeStringSet = - ffi.Void Function(ffi.Pointer set); -typedef DartClang_disposeStringSet = - void Function(ffi.Pointer set); -typedef NativeClang_disposeTokens = - ffi.Void Function( - CXTranslationUnit TU, - ffi.Pointer Tokens, - ffi.UnsignedInt NumTokens, - ); -typedef DartClang_disposeTokens = - void Function( - CXTranslationUnit TU, - ffi.Pointer Tokens, - int NumTokens, - ); -typedef NativeClang_disposeTranslationUnit = - ffi.Void Function(CXTranslationUnit); -typedef DartClang_disposeTranslationUnit = void Function(CXTranslationUnit); -typedef NativeClang_enableStackTraces = ffi.Void Function(); -typedef DartClang_enableStackTraces = void Function(); -typedef NativeClang_equalCursors = ffi.UnsignedInt Function(CXCursor, CXCursor); -typedef DartClang_equalCursors = int Function(CXCursor, CXCursor); -typedef NativeClang_equalLocations = - ffi.UnsignedInt Function(CXSourceLocation loc1, CXSourceLocation loc2); -typedef DartClang_equalLocations = - int Function(CXSourceLocation loc1, CXSourceLocation loc2); -typedef NativeClang_equalRanges = - ffi.UnsignedInt Function(CXSourceRange range1, CXSourceRange range2); -typedef DartClang_equalRanges = - int Function(CXSourceRange range1, CXSourceRange range2); -typedef NativeClang_equalTypes = ffi.UnsignedInt Function(CXType A, CXType B); -typedef DartClang_equalTypes = int Function(CXType A, CXType B); -typedef NativeClang_executeOnThread = - ffi.Void Function( - ffi.Pointer)>> - fn, - ffi.Pointer user_data, - ffi.UnsignedInt stack_size, - ); -typedef DartClang_executeOnThread = - void Function( - ffi.Pointer)>> - fn, - ffi.Pointer user_data, - int stack_size, - ); -typedef NativeClang_findIncludesInFile = - ffi.UnsignedInt Function( - CXTranslationUnit TU, - CXFile file, - CXCursorAndRangeVisitor visitor, - ); -typedef DartClang_findIncludesInFile = - int Function( - CXTranslationUnit TU, - CXFile file, - CXCursorAndRangeVisitor visitor, - ); -typedef NativeClang_findReferencesInFile = - ffi.UnsignedInt Function( - CXCursor cursor, - CXFile file, - CXCursorAndRangeVisitor visitor, - ); -typedef DartClang_findReferencesInFile = - int Function(CXCursor cursor, CXFile file, CXCursorAndRangeVisitor visitor); -typedef NativeClang_formatDiagnostic = - CXString Function(CXDiagnostic Diagnostic, ffi.UnsignedInt Options); -typedef DartClang_formatDiagnostic = - CXString Function(CXDiagnostic Diagnostic, int Options); -typedef NativeClang_getAddressSpace = ffi.UnsignedInt Function(CXType T); -typedef DartClang_getAddressSpace = int Function(CXType T); -typedef NativeClang_getAllSkippedRanges = - ffi.Pointer Function(CXTranslationUnit tu); -typedef DartClang_getAllSkippedRanges = - ffi.Pointer Function(CXTranslationUnit tu); -typedef NativeClang_getArgType = CXType Function(CXType T, ffi.UnsignedInt i); -typedef DartClang_getArgType = CXType Function(CXType T, int i); -typedef NativeClang_getArrayElementType = CXType Function(CXType T); -typedef DartClang_getArrayElementType = CXType Function(CXType T); -typedef NativeClang_getArraySize = ffi.LongLong Function(CXType T); -typedef DartClang_getArraySize = int Function(CXType T); -typedef NativeClang_getCString = - ffi.Pointer Function(CXString string); -typedef DartClang_getCString = ffi.Pointer Function(CXString string); -typedef NativeClang_getCXTUResourceUsage = - CXTUResourceUsage Function(CXTranslationUnit TU); -typedef DartClang_getCXTUResourceUsage = - CXTUResourceUsage Function(CXTranslationUnit TU); -typedef NativeClang_getCXXAccessSpecifier = ffi.UnsignedInt Function(CXCursor); -typedef DartClang_getCXXAccessSpecifier = int Function(CXCursor); -typedef NativeClang_getCanonicalCursor = CXCursor Function(CXCursor); -typedef DartClang_getCanonicalCursor = CXCursor Function(CXCursor); -typedef NativeClang_getCanonicalType = CXType Function(CXType T); -typedef DartClang_getCanonicalType = CXType Function(CXType T); -typedef NativeClang_getChildDiagnostics = - CXDiagnosticSet Function(CXDiagnostic D); -typedef DartClang_getChildDiagnostics = - CXDiagnosticSet Function(CXDiagnostic D); -typedef NativeClang_getClangVersion = CXString Function(); -typedef DartClang_getClangVersion = CXString Function(); -typedef NativeClang_getCompletionAnnotation = - CXString Function( - CXCompletionString completion_string, - ffi.UnsignedInt annotation_number, - ); -typedef DartClang_getCompletionAnnotation = - CXString Function( - CXCompletionString completion_string, - int annotation_number, - ); -typedef NativeClang_getCompletionAvailability = - ffi.UnsignedInt Function(CXCompletionString completion_string); -typedef DartClang_getCompletionAvailability = - int Function(CXCompletionString completion_string); -typedef NativeClang_getCompletionBriefComment = - CXString Function(CXCompletionString completion_string); -typedef DartClang_getCompletionBriefComment = - CXString Function(CXCompletionString completion_string); -typedef NativeClang_getCompletionChunkCompletionString = - CXCompletionString Function( - CXCompletionString completion_string, - ffi.UnsignedInt chunk_number, - ); -typedef DartClang_getCompletionChunkCompletionString = - CXCompletionString Function( - CXCompletionString completion_string, - int chunk_number, - ); -typedef NativeClang_getCompletionChunkKind = - ffi.UnsignedInt Function( - CXCompletionString completion_string, - ffi.UnsignedInt chunk_number, - ); -typedef DartClang_getCompletionChunkKind = - int Function(CXCompletionString completion_string, int chunk_number); -typedef NativeClang_getCompletionChunkText = - CXString Function( - CXCompletionString completion_string, - ffi.UnsignedInt chunk_number, - ); -typedef DartClang_getCompletionChunkText = - CXString Function(CXCompletionString completion_string, int chunk_number); -typedef NativeClang_getCompletionFixIt = - CXString Function( - ffi.Pointer results, - ffi.UnsignedInt completion_index, - ffi.UnsignedInt fixit_index, - ffi.Pointer replacement_range, - ); -typedef DartClang_getCompletionFixIt = - CXString Function( - ffi.Pointer results, - int completion_index, - int fixit_index, - ffi.Pointer replacement_range, - ); -typedef NativeClang_getCompletionNumAnnotations = - ffi.UnsignedInt Function(CXCompletionString completion_string); -typedef DartClang_getCompletionNumAnnotations = - int Function(CXCompletionString completion_string); -typedef NativeClang_getCompletionNumFixIts = - ffi.UnsignedInt Function( - ffi.Pointer results, - ffi.UnsignedInt completion_index, - ); -typedef DartClang_getCompletionNumFixIts = - int Function( - ffi.Pointer results, - int completion_index, - ); -typedef NativeClang_getCompletionParent = - CXString Function( - CXCompletionString completion_string, - ffi.Pointer kind, - ); -typedef DartClang_getCompletionParent = - CXString Function( - CXCompletionString completion_string, - ffi.Pointer kind, - ); -typedef NativeClang_getCompletionPriority = - ffi.UnsignedInt Function(CXCompletionString completion_string); -typedef DartClang_getCompletionPriority = - int Function(CXCompletionString completion_string); -typedef NativeClang_getCursor = - CXCursor Function(CXTranslationUnit, CXSourceLocation); -typedef DartClang_getCursor = - CXCursor Function(CXTranslationUnit, CXSourceLocation); -typedef NativeClang_getCursorAvailability = - ffi.UnsignedInt Function(CXCursor cursor); -typedef DartClang_getCursorAvailability = int Function(CXCursor cursor); -typedef NativeClang_getCursorCompletionString = - CXCompletionString Function(CXCursor cursor); -typedef DartClang_getCursorCompletionString = - CXCompletionString Function(CXCursor cursor); -typedef NativeClang_getCursorDefinition = CXCursor Function(CXCursor); -typedef DartClang_getCursorDefinition = CXCursor Function(CXCursor); -typedef NativeClang_getCursorDisplayName = CXString Function(CXCursor); -typedef DartClang_getCursorDisplayName = CXString Function(CXCursor); -typedef NativeClang_getCursorExceptionSpecificationType = - ffi.Int Function(CXCursor C); -typedef DartClang_getCursorExceptionSpecificationType = - int Function(CXCursor C); -typedef NativeClang_getCursorExtent = CXSourceRange Function(CXCursor); -typedef DartClang_getCursorExtent = CXSourceRange Function(CXCursor); -typedef NativeClang_getCursorKind = ffi.UnsignedInt Function(CXCursor); -typedef DartClang_getCursorKind = int Function(CXCursor); -typedef NativeClang_getCursorKindSpelling = - CXString Function(ffi.UnsignedInt Kind); -typedef DartClang_getCursorKindSpelling = CXString Function(int Kind); -typedef NativeClang_getCursorLanguage = - ffi.UnsignedInt Function(CXCursor cursor); -typedef DartClang_getCursorLanguage = int Function(CXCursor cursor); -typedef NativeClang_getCursorLexicalParent = CXCursor Function(CXCursor cursor); -typedef DartClang_getCursorLexicalParent = CXCursor Function(CXCursor cursor); -typedef NativeClang_getCursorLinkage = - ffi.UnsignedInt Function(CXCursor cursor); -typedef DartClang_getCursorLinkage = int Function(CXCursor cursor); -typedef NativeClang_getCursorLocation = CXSourceLocation Function(CXCursor); -typedef DartClang_getCursorLocation = CXSourceLocation Function(CXCursor); -typedef NativeClang_getCursorPlatformAvailability = - ffi.Int Function( - CXCursor cursor, - ffi.Pointer always_deprecated, - ffi.Pointer deprecated_message, - ffi.Pointer always_unavailable, - ffi.Pointer unavailable_message, - ffi.Pointer availability, - ffi.Int availability_size, - ); -typedef DartClang_getCursorPlatformAvailability = - int Function( - CXCursor cursor, - ffi.Pointer always_deprecated, - ffi.Pointer deprecated_message, - ffi.Pointer always_unavailable, - ffi.Pointer unavailable_message, - ffi.Pointer availability, - int availability_size, - ); -typedef NativeClang_getCursorPrettyPrinted = - CXString Function(CXCursor Cursor, CXPrintingPolicy Policy); -typedef DartClang_getCursorPrettyPrinted = - CXString Function(CXCursor Cursor, CXPrintingPolicy Policy); -typedef NativeClang_getCursorPrintingPolicy = - CXPrintingPolicy Function(CXCursor); -typedef DartClang_getCursorPrintingPolicy = CXPrintingPolicy Function(CXCursor); -typedef NativeClang_getCursorReferenceNameRange = - CXSourceRange Function( - CXCursor C, - ffi.UnsignedInt NameFlags, - ffi.UnsignedInt PieceIndex, - ); -typedef DartClang_getCursorReferenceNameRange = - CXSourceRange Function(CXCursor C, int NameFlags, int PieceIndex); -typedef NativeClang_getCursorReferenced = CXCursor Function(CXCursor); -typedef DartClang_getCursorReferenced = CXCursor Function(CXCursor); -typedef NativeClang_getCursorResultType = CXType Function(CXCursor C); -typedef DartClang_getCursorResultType = CXType Function(CXCursor C); -typedef NativeClang_getCursorSemanticParent = - CXCursor Function(CXCursor cursor); -typedef DartClang_getCursorSemanticParent = CXCursor Function(CXCursor cursor); -typedef NativeClang_getCursorSpelling = CXString Function(CXCursor); -typedef DartClang_getCursorSpelling = CXString Function(CXCursor); -typedef NativeClang_getCursorTLSKind = - ffi.UnsignedInt Function(CXCursor cursor); -typedef DartClang_getCursorTLSKind = int Function(CXCursor cursor); -typedef NativeClang_getCursorType = CXType Function(CXCursor C); -typedef DartClang_getCursorType = CXType Function(CXCursor C); -typedef NativeClang_getCursorUSR = CXString Function(CXCursor); -typedef DartClang_getCursorUSR = CXString Function(CXCursor); -typedef NativeClang_getCursorVisibility = - ffi.UnsignedInt Function(CXCursor cursor); -typedef DartClang_getCursorVisibility = int Function(CXCursor cursor); -typedef NativeClang_getDeclObjCTypeEncoding = CXString Function(CXCursor C); -typedef DartClang_getDeclObjCTypeEncoding = CXString Function(CXCursor C); -typedef NativeClang_getDefinitionSpellingAndExtent = - ffi.Void Function( - CXCursor, - ffi.Pointer> startBuf, - ffi.Pointer> endBuf, - ffi.Pointer startLine, - ffi.Pointer startColumn, - ffi.Pointer endLine, - ffi.Pointer endColumn, - ); -typedef DartClang_getDefinitionSpellingAndExtent = - void Function( - CXCursor, - ffi.Pointer> startBuf, - ffi.Pointer> endBuf, - ffi.Pointer startLine, - ffi.Pointer startColumn, - ffi.Pointer endLine, - ffi.Pointer endColumn, - ); -typedef NativeClang_getDiagnostic = - CXDiagnostic Function(CXTranslationUnit Unit, ffi.UnsignedInt Index); -typedef DartClang_getDiagnostic = - CXDiagnostic Function(CXTranslationUnit Unit, int Index); -typedef NativeClang_getDiagnosticCategory = - ffi.UnsignedInt Function(CXDiagnostic); -typedef DartClang_getDiagnosticCategory = int Function(CXDiagnostic); -typedef NativeClang_getDiagnosticCategoryName = - CXString Function(ffi.UnsignedInt Category); -typedef DartClang_getDiagnosticCategoryName = CXString Function(int Category); -typedef NativeClang_getDiagnosticCategoryText = CXString Function(CXDiagnostic); -typedef DartClang_getDiagnosticCategoryText = CXString Function(CXDiagnostic); -typedef NativeClang_getDiagnosticFixIt = - CXString Function( - CXDiagnostic Diagnostic, - ffi.UnsignedInt FixIt, - ffi.Pointer ReplacementRange, - ); -typedef DartClang_getDiagnosticFixIt = - CXString Function( - CXDiagnostic Diagnostic, - int FixIt, - ffi.Pointer ReplacementRange, - ); -typedef NativeClang_getDiagnosticInSet = - CXDiagnostic Function(CXDiagnosticSet Diags, ffi.UnsignedInt Index); -typedef DartClang_getDiagnosticInSet = - CXDiagnostic Function(CXDiagnosticSet Diags, int Index); -typedef NativeClang_getDiagnosticLocation = - CXSourceLocation Function(CXDiagnostic); -typedef DartClang_getDiagnosticLocation = - CXSourceLocation Function(CXDiagnostic); -typedef NativeClang_getDiagnosticNumFixIts = - ffi.UnsignedInt Function(CXDiagnostic Diagnostic); -typedef DartClang_getDiagnosticNumFixIts = - int Function(CXDiagnostic Diagnostic); -typedef NativeClang_getDiagnosticNumRanges = - ffi.UnsignedInt Function(CXDiagnostic); -typedef DartClang_getDiagnosticNumRanges = int Function(CXDiagnostic); -typedef NativeClang_getDiagnosticOption = - CXString Function(CXDiagnostic Diag, ffi.Pointer Disable); -typedef DartClang_getDiagnosticOption = - CXString Function(CXDiagnostic Diag, ffi.Pointer Disable); -typedef NativeClang_getDiagnosticRange = - CXSourceRange Function(CXDiagnostic Diagnostic, ffi.UnsignedInt Range); -typedef DartClang_getDiagnosticRange = - CXSourceRange Function(CXDiagnostic Diagnostic, int Range); -typedef NativeClang_getDiagnosticSetFromTU = - CXDiagnosticSet Function(CXTranslationUnit Unit); -typedef DartClang_getDiagnosticSetFromTU = - CXDiagnosticSet Function(CXTranslationUnit Unit); -typedef NativeClang_getDiagnosticSeverity = - ffi.UnsignedInt Function(CXDiagnostic); -typedef DartClang_getDiagnosticSeverity = int Function(CXDiagnostic); -typedef NativeClang_getDiagnosticSpelling = CXString Function(CXDiagnostic); -typedef DartClang_getDiagnosticSpelling = CXString Function(CXDiagnostic); -typedef NativeClang_getElementType = CXType Function(CXType T); -typedef DartClang_getElementType = CXType Function(CXType T); -typedef NativeClang_getEnumConstantDeclUnsignedValue = - ffi.UnsignedLongLong Function(CXCursor C); -typedef DartClang_getEnumConstantDeclUnsignedValue = int Function(CXCursor C); -typedef NativeClang_getEnumConstantDeclValue = - ffi.LongLong Function(CXCursor C); -typedef DartClang_getEnumConstantDeclValue = int Function(CXCursor C); -typedef NativeClang_getEnumDeclIntegerType = CXType Function(CXCursor C); -typedef DartClang_getEnumDeclIntegerType = CXType Function(CXCursor C); -typedef NativeClang_getExceptionSpecificationType = ffi.Int Function(CXType T); -typedef DartClang_getExceptionSpecificationType = int Function(CXType T); -typedef NativeClang_getExpansionLocation = - ffi.Void Function( - CXSourceLocation location, - ffi.Pointer file, - ffi.Pointer line, - ffi.Pointer column, - ffi.Pointer offset, - ); -typedef DartClang_getExpansionLocation = - void Function( - CXSourceLocation location, - ffi.Pointer file, - ffi.Pointer line, - ffi.Pointer column, - ffi.Pointer offset, - ); -typedef NativeClang_getFieldDeclBitWidth = ffi.Int Function(CXCursor C); -typedef DartClang_getFieldDeclBitWidth = int Function(CXCursor C); -typedef NativeClang_getFile = - CXFile Function(CXTranslationUnit tu, ffi.Pointer file_name); -typedef DartClang_getFile = - CXFile Function(CXTranslationUnit tu, ffi.Pointer file_name); -typedef NativeClang_getFileContents = - ffi.Pointer Function( - CXTranslationUnit tu, - CXFile file, - ffi.Pointer size, - ); -typedef DartClang_getFileContents = - ffi.Pointer Function( - CXTranslationUnit tu, - CXFile file, - ffi.Pointer size, - ); -typedef NativeClang_getFileLocation = - ffi.Void Function( - CXSourceLocation location, - ffi.Pointer file, - ffi.Pointer line, - ffi.Pointer column, - ffi.Pointer offset, - ); -typedef DartClang_getFileLocation = - void Function( - CXSourceLocation location, - ffi.Pointer file, - ffi.Pointer line, - ffi.Pointer column, - ffi.Pointer offset, - ); -typedef NativeClang_getFileName = CXString Function(CXFile SFile); -typedef DartClang_getFileName = CXString Function(CXFile SFile); -typedef NativeClang_getFileTime = ffi.Int64 Function(CXFile SFile); -typedef DartClang_getFileTime = int Function(CXFile SFile); -typedef NativeClang_getFileUniqueID = - ffi.Int Function(CXFile file, ffi.Pointer outID); -typedef DartClang_getFileUniqueID = - int Function(CXFile file, ffi.Pointer outID); -typedef NativeClang_getFunctionTypeCallingConv = - ffi.UnsignedInt Function(CXType T); -typedef DartClang_getFunctionTypeCallingConv = int Function(CXType T); -typedef NativeClang_getIBOutletCollectionType = CXType Function(CXCursor); -typedef DartClang_getIBOutletCollectionType = CXType Function(CXCursor); -typedef NativeClang_getIncludedFile = CXFile Function(CXCursor cursor); -typedef DartClang_getIncludedFile = CXFile Function(CXCursor cursor); -typedef NativeClang_getInclusions = - ffi.Void Function( - CXTranslationUnit tu, - CXInclusionVisitor visitor, - CXClientData client_data, - ); -typedef DartClang_getInclusions = - void Function( - CXTranslationUnit tu, - CXInclusionVisitor visitor, - CXClientData client_data, - ); -typedef NativeClang_getInstantiationLocation = - ffi.Void Function( - CXSourceLocation location, - ffi.Pointer file, - ffi.Pointer line, - ffi.Pointer column, - ffi.Pointer offset, - ); -typedef DartClang_getInstantiationLocation = - void Function( - CXSourceLocation location, - ffi.Pointer file, - ffi.Pointer line, - ffi.Pointer column, - ffi.Pointer offset, - ); -typedef NativeClang_getLocation = - CXSourceLocation Function( - CXTranslationUnit tu, - CXFile file, - ffi.UnsignedInt line, - ffi.UnsignedInt column, - ); -typedef DartClang_getLocation = - CXSourceLocation Function( - CXTranslationUnit tu, - CXFile file, - int line, - int column, - ); -typedef NativeClang_getLocationForOffset = - CXSourceLocation Function( - CXTranslationUnit tu, - CXFile file, - ffi.UnsignedInt offset, - ); -typedef DartClang_getLocationForOffset = - CXSourceLocation Function(CXTranslationUnit tu, CXFile file, int offset); -typedef NativeClang_getModuleForFile = - CXModule Function(CXTranslationUnit, CXFile); -typedef DartClang_getModuleForFile = - CXModule Function(CXTranslationUnit, CXFile); -typedef NativeClang_getNullCursor = CXCursor Function(); -typedef DartClang_getNullCursor = CXCursor Function(); -typedef NativeClang_getNullLocation = CXSourceLocation Function(); -typedef DartClang_getNullLocation = CXSourceLocation Function(); -typedef NativeClang_getNullRange = CXSourceRange Function(); -typedef DartClang_getNullRange = CXSourceRange Function(); -typedef NativeClang_getNumArgTypes = ffi.Int Function(CXType T); -typedef DartClang_getNumArgTypes = int Function(CXType T); -typedef NativeClang_getNumCompletionChunks = - ffi.UnsignedInt Function(CXCompletionString completion_string); -typedef DartClang_getNumCompletionChunks = - int Function(CXCompletionString completion_string); -typedef NativeClang_getNumDiagnostics = - ffi.UnsignedInt Function(CXTranslationUnit Unit); -typedef DartClang_getNumDiagnostics = int Function(CXTranslationUnit Unit); -typedef NativeClang_getNumDiagnosticsInSet = - ffi.UnsignedInt Function(CXDiagnosticSet Diags); -typedef DartClang_getNumDiagnosticsInSet = int Function(CXDiagnosticSet Diags); -typedef NativeClang_getNumElements = ffi.LongLong Function(CXType T); -typedef DartClang_getNumElements = int Function(CXType T); -typedef NativeClang_getNumOverloadedDecls = - ffi.UnsignedInt Function(CXCursor cursor); -typedef DartClang_getNumOverloadedDecls = int Function(CXCursor cursor); -typedef NativeClang_getOverloadedDecl = - CXCursor Function(CXCursor cursor, ffi.UnsignedInt index); -typedef DartClang_getOverloadedDecl = - CXCursor Function(CXCursor cursor, int index); -typedef NativeClang_getOverriddenCursors = - ffi.Void Function( - CXCursor cursor, - ffi.Pointer> overridden, - ffi.Pointer num_overridden, - ); -typedef DartClang_getOverriddenCursors = - void Function( - CXCursor cursor, - ffi.Pointer> overridden, - ffi.Pointer num_overridden, - ); -typedef NativeClang_getPointeeType = CXType Function(CXType T); -typedef DartClang_getPointeeType = CXType Function(CXType T); -typedef NativeClang_getPresumedLocation = - ffi.Void Function( - CXSourceLocation location, - ffi.Pointer filename, - ffi.Pointer line, - ffi.Pointer column, - ); -typedef DartClang_getPresumedLocation = - void Function( - CXSourceLocation location, - ffi.Pointer filename, - ffi.Pointer line, - ffi.Pointer column, - ); -typedef NativeClang_getRange = - CXSourceRange Function(CXSourceLocation begin, CXSourceLocation end); -typedef DartClang_getRange = - CXSourceRange Function(CXSourceLocation begin, CXSourceLocation end); -typedef NativeClang_getRangeEnd = - CXSourceLocation Function(CXSourceRange range); -typedef DartClang_getRangeEnd = CXSourceLocation Function(CXSourceRange range); -typedef NativeClang_getRangeStart = - CXSourceLocation Function(CXSourceRange range); -typedef DartClang_getRangeStart = - CXSourceLocation Function(CXSourceRange range); -typedef NativeClang_getRemappings = - CXRemapping Function(ffi.Pointer path); -typedef DartClang_getRemappings = - CXRemapping Function(ffi.Pointer path); -typedef NativeClang_getRemappingsFromFileList = - CXRemapping Function( - ffi.Pointer> filePaths, - ffi.UnsignedInt numFiles, - ); -typedef DartClang_getRemappingsFromFileList = - CXRemapping Function( - ffi.Pointer> filePaths, - int numFiles, - ); -typedef NativeClang_getResultType = CXType Function(CXType T); -typedef DartClang_getResultType = CXType Function(CXType T); -typedef NativeClang_getSkippedRanges = - ffi.Pointer Function(CXTranslationUnit tu, CXFile file); -typedef DartClang_getSkippedRanges = - ffi.Pointer Function(CXTranslationUnit tu, CXFile file); -typedef NativeClang_getSpecializedCursorTemplate = - CXCursor Function(CXCursor C); -typedef DartClang_getSpecializedCursorTemplate = CXCursor Function(CXCursor C); -typedef NativeClang_getSpellingLocation = - ffi.Void Function( - CXSourceLocation location, - ffi.Pointer file, - ffi.Pointer line, - ffi.Pointer column, - ffi.Pointer offset, - ); -typedef DartClang_getSpellingLocation = - void Function( - CXSourceLocation location, - ffi.Pointer file, - ffi.Pointer line, - ffi.Pointer column, - ffi.Pointer offset, - ); -typedef NativeClang_getTUResourceUsageName = - ffi.Pointer Function(ffi.UnsignedInt kind); -typedef DartClang_getTUResourceUsageName = - ffi.Pointer Function(int kind); -typedef NativeClang_getTemplateCursorKind = - ffi.UnsignedInt Function(CXCursor C); -typedef DartClang_getTemplateCursorKind = int Function(CXCursor C); -typedef NativeClang_getToken = - ffi.Pointer Function( - CXTranslationUnit TU, - CXSourceLocation Location, - ); -typedef DartClang_getToken = - ffi.Pointer Function( - CXTranslationUnit TU, - CXSourceLocation Location, - ); -typedef NativeClang_getTokenExtent = - CXSourceRange Function(CXTranslationUnit, CXToken); -typedef DartClang_getTokenExtent = - CXSourceRange Function(CXTranslationUnit, CXToken); -typedef NativeClang_getTokenKind = ffi.UnsignedInt Function(CXToken); -typedef DartClang_getTokenKind = int Function(CXToken); -typedef NativeClang_getTokenLocation = - CXSourceLocation Function(CXTranslationUnit, CXToken); -typedef DartClang_getTokenLocation = - CXSourceLocation Function(CXTranslationUnit, CXToken); -typedef NativeClang_getTokenSpelling = - CXString Function(CXTranslationUnit, CXToken); -typedef DartClang_getTokenSpelling = - CXString Function(CXTranslationUnit, CXToken); -typedef NativeClang_getTranslationUnitCursor = - CXCursor Function(CXTranslationUnit); -typedef DartClang_getTranslationUnitCursor = - CXCursor Function(CXTranslationUnit); -typedef NativeClang_getTranslationUnitSpelling = - CXString Function(CXTranslationUnit CTUnit); -typedef DartClang_getTranslationUnitSpelling = - CXString Function(CXTranslationUnit CTUnit); -typedef NativeClang_getTranslationUnitTargetInfo = - CXTargetInfo Function(CXTranslationUnit CTUnit); -typedef DartClang_getTranslationUnitTargetInfo = - CXTargetInfo Function(CXTranslationUnit CTUnit); -typedef NativeClang_getTypeDeclaration = CXCursor Function(CXType T); -typedef DartClang_getTypeDeclaration = CXCursor Function(CXType T); -typedef NativeClang_getTypeKindSpelling = CXString Function(ffi.UnsignedInt K); -typedef DartClang_getTypeKindSpelling = CXString Function(int K); -typedef NativeClang_getTypeSpelling = CXString Function(CXType CT); -typedef DartClang_getTypeSpelling = CXString Function(CXType CT); -typedef NativeClang_getTypedefDeclUnderlyingType = CXType Function(CXCursor C); -typedef DartClang_getTypedefDeclUnderlyingType = CXType Function(CXCursor C); -typedef NativeClang_getTypedefName = CXString Function(CXType CT); -typedef DartClang_getTypedefName = CXString Function(CXType CT); -typedef NativeClang_hashCursor = ffi.UnsignedInt Function(CXCursor); -typedef DartClang_hashCursor = int Function(CXCursor); -typedef NativeClang_indexLoc_getCXSourceLocation = - CXSourceLocation Function(CXIdxLoc loc); -typedef DartClang_indexLoc_getCXSourceLocation = - CXSourceLocation Function(CXIdxLoc loc); -typedef NativeClang_indexLoc_getFileLocation = - ffi.Void Function( - CXIdxLoc loc, - ffi.Pointer indexFile, - ffi.Pointer file, - ffi.Pointer line, - ffi.Pointer column, - ffi.Pointer offset, - ); -typedef DartClang_indexLoc_getFileLocation = - void Function( - CXIdxLoc loc, - ffi.Pointer indexFile, - ffi.Pointer file, - ffi.Pointer line, - ffi.Pointer column, - ffi.Pointer offset, - ); -typedef NativeClang_indexSourceFile = - ffi.Int Function( - CXIndexAction, - CXClientData client_data, - ffi.Pointer index_callbacks, - ffi.UnsignedInt index_callbacks_size, - ffi.UnsignedInt index_options, - ffi.Pointer source_filename, - ffi.Pointer> command_line_args, - ffi.Int num_command_line_args, - ffi.Pointer unsaved_files, - ffi.UnsignedInt num_unsaved_files, - ffi.Pointer out_TU, - ffi.UnsignedInt TU_options, - ); -typedef DartClang_indexSourceFile = - int Function( - CXIndexAction, - CXClientData client_data, - ffi.Pointer index_callbacks, - int index_callbacks_size, - int index_options, - ffi.Pointer source_filename, - ffi.Pointer> command_line_args, - int num_command_line_args, - ffi.Pointer unsaved_files, - int num_unsaved_files, - ffi.Pointer out_TU, - int TU_options, - ); -typedef NativeClang_indexSourceFileFullArgv = - ffi.Int Function( - CXIndexAction, - CXClientData client_data, - ffi.Pointer index_callbacks, - ffi.UnsignedInt index_callbacks_size, - ffi.UnsignedInt index_options, - ffi.Pointer source_filename, - ffi.Pointer> command_line_args, - ffi.Int num_command_line_args, - ffi.Pointer unsaved_files, - ffi.UnsignedInt num_unsaved_files, - ffi.Pointer out_TU, - ffi.UnsignedInt TU_options, - ); -typedef DartClang_indexSourceFileFullArgv = - int Function( - CXIndexAction, - CXClientData client_data, - ffi.Pointer index_callbacks, - int index_callbacks_size, - int index_options, - ffi.Pointer source_filename, - ffi.Pointer> command_line_args, - int num_command_line_args, - ffi.Pointer unsaved_files, - int num_unsaved_files, - ffi.Pointer out_TU, - int TU_options, - ); -typedef NativeClang_indexTranslationUnit = - ffi.Int Function( - CXIndexAction, - CXClientData client_data, - ffi.Pointer index_callbacks, - ffi.UnsignedInt index_callbacks_size, - ffi.UnsignedInt index_options, - CXTranslationUnit, - ); -typedef DartClang_indexTranslationUnit = - int Function( - CXIndexAction, - CXClientData client_data, - ffi.Pointer index_callbacks, - int index_callbacks_size, - int index_options, - CXTranslationUnit, - ); -typedef NativeClang_index_getCXXClassDeclInfo = - ffi.Pointer Function(ffi.Pointer); -typedef DartClang_index_getCXXClassDeclInfo = - ffi.Pointer Function(ffi.Pointer); -typedef NativeClang_index_getClientContainer = - CXIdxClientContainer Function(ffi.Pointer); -typedef DartClang_index_getClientContainer = - CXIdxClientContainer Function(ffi.Pointer); -typedef NativeClang_index_getClientEntity = - CXIdxClientEntity Function(ffi.Pointer); -typedef DartClang_index_getClientEntity = - CXIdxClientEntity Function(ffi.Pointer); -typedef NativeClang_index_getIBOutletCollectionAttrInfo = - ffi.Pointer Function( - ffi.Pointer, - ); -typedef DartClang_index_getIBOutletCollectionAttrInfo = - ffi.Pointer Function( - ffi.Pointer, - ); -typedef NativeClang_index_getObjCCategoryDeclInfo = - ffi.Pointer Function(ffi.Pointer); -typedef DartClang_index_getObjCCategoryDeclInfo = - ffi.Pointer Function(ffi.Pointer); -typedef NativeClang_index_getObjCContainerDeclInfo = - ffi.Pointer Function( - ffi.Pointer, - ); -typedef DartClang_index_getObjCContainerDeclInfo = - ffi.Pointer Function( - ffi.Pointer, - ); -typedef NativeClang_index_getObjCInterfaceDeclInfo = - ffi.Pointer Function( - ffi.Pointer, - ); -typedef DartClang_index_getObjCInterfaceDeclInfo = - ffi.Pointer Function( - ffi.Pointer, - ); -typedef NativeClang_index_getObjCPropertyDeclInfo = - ffi.Pointer Function(ffi.Pointer); -typedef DartClang_index_getObjCPropertyDeclInfo = - ffi.Pointer Function(ffi.Pointer); -typedef NativeClang_index_getObjCProtocolRefListInfo = - ffi.Pointer Function( - ffi.Pointer, - ); -typedef DartClang_index_getObjCProtocolRefListInfo = - ffi.Pointer Function( - ffi.Pointer, - ); -typedef NativeClang_index_isEntityObjCContainerKind = - ffi.Int Function(ffi.UnsignedInt); -typedef DartClang_index_isEntityObjCContainerKind = int Function(int); -typedef NativeClang_index_setClientContainer = - ffi.Void Function(ffi.Pointer, CXIdxClientContainer); -typedef DartClang_index_setClientContainer = - void Function(ffi.Pointer, CXIdxClientContainer); -typedef NativeClang_index_setClientEntity = - ffi.Void Function(ffi.Pointer, CXIdxClientEntity); -typedef DartClang_index_setClientEntity = - void Function(ffi.Pointer, CXIdxClientEntity); -typedef NativeClang_isAttribute = ffi.UnsignedInt Function(ffi.UnsignedInt); -typedef DartClang_isAttribute = int Function(int); -typedef NativeClang_isConstQualifiedType = ffi.UnsignedInt Function(CXType T); -typedef DartClang_isConstQualifiedType = int Function(CXType T); -typedef NativeClang_isCursorDefinition = ffi.UnsignedInt Function(CXCursor); -typedef DartClang_isCursorDefinition = int Function(CXCursor); -typedef NativeClang_isDeclaration = ffi.UnsignedInt Function(ffi.UnsignedInt); -typedef DartClang_isDeclaration = int Function(int); -typedef NativeClang_isExpression = ffi.UnsignedInt Function(ffi.UnsignedInt); -typedef DartClang_isExpression = int Function(int); -typedef NativeClang_isFileMultipleIncludeGuarded = - ffi.UnsignedInt Function(CXTranslationUnit tu, CXFile file); -typedef DartClang_isFileMultipleIncludeGuarded = - int Function(CXTranslationUnit tu, CXFile file); -typedef NativeClang_isFunctionTypeVariadic = ffi.UnsignedInt Function(CXType T); -typedef DartClang_isFunctionTypeVariadic = int Function(CXType T); -typedef NativeClang_isInvalid = ffi.UnsignedInt Function(ffi.UnsignedInt); -typedef DartClang_isInvalid = int Function(int); -typedef NativeClang_isInvalidDeclaration = ffi.UnsignedInt Function(CXCursor); -typedef DartClang_isInvalidDeclaration = int Function(CXCursor); -typedef NativeClang_isPODType = ffi.UnsignedInt Function(CXType T); -typedef DartClang_isPODType = int Function(CXType T); -typedef NativeClang_isPreprocessing = ffi.UnsignedInt Function(ffi.UnsignedInt); -typedef DartClang_isPreprocessing = int Function(int); -typedef NativeClang_isReference = ffi.UnsignedInt Function(ffi.UnsignedInt); -typedef DartClang_isReference = int Function(int); -typedef NativeClang_isRestrictQualifiedType = - ffi.UnsignedInt Function(CXType T); -typedef DartClang_isRestrictQualifiedType = int Function(CXType T); -typedef NativeClang_isStatement = ffi.UnsignedInt Function(ffi.UnsignedInt); -typedef DartClang_isStatement = int Function(int); -typedef NativeClang_isTranslationUnit = - ffi.UnsignedInt Function(ffi.UnsignedInt); -typedef DartClang_isTranslationUnit = int Function(int); -typedef NativeClang_isUnexposed = ffi.UnsignedInt Function(ffi.UnsignedInt); -typedef DartClang_isUnexposed = int Function(int); -typedef NativeClang_isVirtualBase = ffi.UnsignedInt Function(CXCursor); -typedef DartClang_isVirtualBase = int Function(CXCursor); -typedef NativeClang_isVolatileQualifiedType = - ffi.UnsignedInt Function(CXType T); -typedef DartClang_isVolatileQualifiedType = int Function(CXType T); -typedef NativeClang_loadDiagnostics = - CXDiagnosticSet Function( - ffi.Pointer file, - ffi.Pointer error, - ffi.Pointer errorString, - ); -typedef DartClang_loadDiagnostics = - CXDiagnosticSet Function( - ffi.Pointer file, - ffi.Pointer error, - ffi.Pointer errorString, - ); -typedef NativeClang_parseTranslationUnit = - CXTranslationUnit Function( - CXIndex CIdx, - ffi.Pointer source_filename, - ffi.Pointer> command_line_args, - ffi.Int num_command_line_args, - ffi.Pointer unsaved_files, - ffi.UnsignedInt num_unsaved_files, - ffi.UnsignedInt options, - ); -typedef DartClang_parseTranslationUnit = - CXTranslationUnit Function( - CXIndex CIdx, - ffi.Pointer source_filename, - ffi.Pointer> command_line_args, - int num_command_line_args, - ffi.Pointer unsaved_files, - int num_unsaved_files, - int options, - ); -typedef NativeClang_parseTranslationUnit2 = - ffi.UnsignedInt Function( - CXIndex CIdx, - ffi.Pointer source_filename, - ffi.Pointer> command_line_args, - ffi.Int num_command_line_args, - ffi.Pointer unsaved_files, - ffi.UnsignedInt num_unsaved_files, - ffi.UnsignedInt options, - ffi.Pointer out_TU, - ); -typedef DartClang_parseTranslationUnit2 = - int Function( - CXIndex CIdx, - ffi.Pointer source_filename, - ffi.Pointer> command_line_args, - int num_command_line_args, - ffi.Pointer unsaved_files, - int num_unsaved_files, - int options, - ffi.Pointer out_TU, - ); -typedef NativeClang_parseTranslationUnit2FullArgv = - ffi.UnsignedInt Function( - CXIndex CIdx, - ffi.Pointer source_filename, - ffi.Pointer> command_line_args, - ffi.Int num_command_line_args, - ffi.Pointer unsaved_files, - ffi.UnsignedInt num_unsaved_files, - ffi.UnsignedInt options, - ffi.Pointer out_TU, - ); -typedef DartClang_parseTranslationUnit2FullArgv = - int Function( - CXIndex CIdx, - ffi.Pointer source_filename, - ffi.Pointer> command_line_args, - int num_command_line_args, - ffi.Pointer unsaved_files, - int num_unsaved_files, - int options, - ffi.Pointer out_TU, - ); -typedef NativeClang_remap_dispose = ffi.Void Function(CXRemapping); -typedef DartClang_remap_dispose = void Function(CXRemapping); -typedef NativeClang_remap_getFilenames = - ffi.Void Function( - CXRemapping, - ffi.UnsignedInt index, - ffi.Pointer original, - ffi.Pointer transformed, - ); -typedef DartClang_remap_getFilenames = - void Function( - CXRemapping, - int index, - ffi.Pointer original, - ffi.Pointer transformed, - ); -typedef NativeClang_remap_getNumFiles = ffi.UnsignedInt Function(CXRemapping); -typedef DartClang_remap_getNumFiles = int Function(CXRemapping); -typedef NativeClang_reparseTranslationUnit = - ffi.Int Function( - CXTranslationUnit TU, - ffi.UnsignedInt num_unsaved_files, - ffi.Pointer unsaved_files, - ffi.UnsignedInt options, - ); -typedef DartClang_reparseTranslationUnit = - int Function( - CXTranslationUnit TU, - int num_unsaved_files, - ffi.Pointer unsaved_files, - int options, - ); -typedef NativeClang_saveTranslationUnit = - ffi.Int Function( - CXTranslationUnit TU, - ffi.Pointer FileName, - ffi.UnsignedInt options, - ); -typedef DartClang_saveTranslationUnit = - int Function( - CXTranslationUnit TU, - ffi.Pointer FileName, - int options, - ); -typedef NativeClang_sortCodeCompletionResults = - ffi.Void Function( - ffi.Pointer Results, - ffi.UnsignedInt NumResults, - ); -typedef DartClang_sortCodeCompletionResults = - void Function(ffi.Pointer Results, int NumResults); -typedef NativeClang_suspendTranslationUnit = - ffi.UnsignedInt Function(CXTranslationUnit); -typedef DartClang_suspendTranslationUnit = int Function(CXTranslationUnit); -typedef NativeClang_toggleCrashRecovery = - ffi.Void Function(ffi.UnsignedInt isEnabled); -typedef DartClang_toggleCrashRecovery = void Function(int isEnabled); -typedef NativeClang_tokenize = - ffi.Void Function( - CXTranslationUnit TU, - CXSourceRange Range, - ffi.Pointer> Tokens, - ffi.Pointer NumTokens, - ); -typedef DartClang_tokenize = - void Function( - CXTranslationUnit TU, - CXSourceRange Range, - ffi.Pointer> Tokens, - ffi.Pointer NumTokens, - ); -typedef NativeClang_visitChildren = - ffi.UnsignedInt Function( - CXCursor parent, - CXCursorVisitor visitor, - CXClientData client_data, - ); -typedef DartClang_visitChildren = - int Function( - CXCursor parent, - CXCursorVisitor visitor, - CXClientData client_data, - ); diff --git a/pkgs/ffigen/example/objective_c/generate_code.dart b/pkgs/ffigen/example/objective_c/generate_code.dart index f4091a58e9..fa34a21173 100644 --- a/pkgs/ffigen/example/objective_c/generate_code.dart +++ b/pkgs/ffigen/example/objective_c/generate_code.dart @@ -8,7 +8,7 @@ import 'package:ffigen/ffigen.dart'; import 'package:logging/logging.dart'; final config = FfiGenerator( - headers: Headers( + input: Input( // The entryPoints are the files that FFIgen should scan to find the APIs // you want to generate bindings for. You can use the macSdkPath or // iosSdkPath getters to find the Apple SDKs. @@ -21,11 +21,10 @@ final config = FfiGenerator( // To tell FFIgen to generate Objective-C bindings, rather than C bindings, // set the objectiveC field to a non-null value. - objectiveC: ObjectiveC( - // The interfaces field is used to tell FFIgen which interfaces to generate - // bindings for. There's also a protocols and a categories field. - interfaces: Interfaces.includeSet({'AVAudioPlayer'}), - ), + objectiveC: const ObjectiveC(), + visitors: const [ + IncludeSetVisitor(objcInterfaces: {'AVAudioPlayer'}), + ], output: Output( // The Dart file where the bindings will be generated. diff --git a/pkgs/ffigen/ffigen.schema.json b/pkgs/ffigen/ffigen.schema.json index 7ffac6ad69..fe173ce01b 100644 --- a/pkgs/ffigen/ffigen.schema.json +++ b/pkgs/ffigen/ffigen.schema.json @@ -427,24 +427,12 @@ "include-unused-typedefs": { "type": "boolean" }, - "include-transitive-objc-interfaces": { - "type": "boolean" - }, - "include-transitive-objc-protocols": { - "type": "boolean" - }, - "include-transitive-objc-categories": { - "type": "boolean" - }, "generate-for-package-objective-c": { "type": "boolean" }, "sort": { "type": "boolean" }, - "use-supported-typedefs": { - "type": "boolean" - }, "comments": { "$oneOf": [ { diff --git a/pkgs/ffigen/hook/build.dart b/pkgs/ffigen/hook/build.dart index 4c1f5b4555..9ad39beda6 100644 --- a/pkgs/ffigen/hook/build.dart +++ b/pkgs/ffigen/hook/build.dart @@ -127,6 +127,7 @@ void main(List args) async { // flags, so we need to use the CustomBuilder again. final mFiles = _findFiles(objcTestDir, '.m') .where((uri) => !uri.pathSegments.last.contains('swift_class_test')) + .where((uri) => !uri.pathSegments.last.contains('sdk_variable_test')) .toList(); final hFiles = _findFiles(objcTestDir, '.h'); diff --git a/pkgs/ffigen/lib/ffigen.dart b/pkgs/ffigen/lib/ffigen.dart index 77e8b50f35..e0b62e033e 100644 --- a/pkgs/ffigen/lib/ffigen.dart +++ b/pkgs/ffigen/lib/ffigen.dart @@ -17,34 +17,21 @@ export 'src/code_generator/imports.dart' show ImportedType, LibraryImport; export 'src/config_provider.dart' show BindingStyle, - Categories, CommentLength, CommentStyle, CommentType, CompoundDependencies, Declaration, - Declarations, DynamicLibraryBindings, EnumStyle, - Enums, ExternalVersions, FfiGenerator, - Functions, - Globals, - Headers, - Integers, - Interfaces, - Macros, + Input, NativeExternalBindings, ObjectiveC, Output, PackingValue, - Protocols, - Structs, SymbolFile, - Typedefs, - Unions, - UnnamedEnums, VarArgFunction, Version, Versions, @@ -56,3 +43,4 @@ export 'src/config_provider.dart' macSdkUri, xcodePath, xcodeUri; +export 'src/config_provider/public_ast.dart'; diff --git a/pkgs/ffigen/lib/src/code_generator/binding.dart b/pkgs/ffigen/lib/src/code_generator/binding.dart index 5b52c350b1..75620a64ef 100644 --- a/pkgs/ffigen/lib/src/code_generator/binding.dart +++ b/pkgs/ffigen/lib/src/code_generator/binding.dart @@ -32,10 +32,14 @@ abstract class Binding extends AstNode implements Declaration { final String? dartDoc; final bool isInternal; + /// Whether this binding was explicitly included or excluded by a user + /// visitor or filter. + bool? userDefinedIsIncluded; + /// Whether these bindings should be generated. /// /// Set by MarkBindingsVisitation. - bool generateBindings = true; + bool generateBindings = false; Binding({ required this.usr, diff --git a/pkgs/ffigen/lib/src/code_generator/compound.dart b/pkgs/ffigen/lib/src/code_generator/compound.dart index bc13331cac..a6d2c39c96 100644 --- a/pkgs/ffigen/lib/src/code_generator/compound.dart +++ b/pkgs/ffigen/lib/src/code_generator/compound.dart @@ -20,6 +20,8 @@ abstract class Compound extends BindingType with HasLocalScope { /// A function can be safely pass this struct by value if it's complete. bool isIncomplete; + CompoundDependencies dependencies; + final List members; bool get isOpaque => members.isEmpty; @@ -45,6 +47,7 @@ abstract class Compound extends BindingType with HasLocalScope { super.originalName, required super.name, this.isIncomplete = false, + this.dependencies = CompoundDependencies.full, super.dartDoc, List? members, super.isInternal, @@ -80,7 +83,7 @@ abstract class Compound extends BindingType with HasLocalScope { bool _isEnumDartStyleMember(CompoundMember member) { final type = member.type; - return type is EnumClass && type.style == EnumStyle.dartEnum; + return type is EnumClass && type.resolvedStyle == EnumStyle.dartEnum; } String _memberStorageName(CompoundMember member) { @@ -146,6 +149,7 @@ abstract class Compound extends BindingType with HasLocalScope { @override bool get isObjCImport => + !(context.config.objectiveC?.generateForPackageObjectiveC ?? false) && context.objCBuiltInFunctions.getBuiltInCompoundName(originalName) != null; @override @@ -190,8 +194,8 @@ abstract class Compound extends BindingType with HasLocalScope { ); } if (m.type case EnumClass( - :final style, - ) when style == EnumStyle.dartEnum) { + :final resolvedStyle, + ) when resolvedStyle == EnumStyle.dartEnum) { final enumName = m.type.getDartType(context); final memberName = m.name; s.write( @@ -251,8 +255,10 @@ class CompoundMember extends AstNode { final String? dartDoc; final String originalName; final Type type; + bool? userDefinedIsIncluded; final Symbol _symbol; + Symbol get symbol => _symbol; String get name => _symbol.name; CompoundMember({ diff --git a/pkgs/ffigen/lib/src/code_generator/cpp_class.dart b/pkgs/ffigen/lib/src/code_generator/cpp_class.dart index a2e6cb13d8..4081f7dc5b 100644 --- a/pkgs/ffigen/lib/src/code_generator/cpp_class.dart +++ b/pkgs/ffigen/lib/src/code_generator/cpp_class.dart @@ -23,6 +23,7 @@ class CppMethod extends AstNode with HasLocalScope { final bool isConstant; final bool isStatic; final CppMethodKind kind; + bool? userDefinedIsIncluded; CppMethod({ required this.name, diff --git a/pkgs/ffigen/lib/src/code_generator/enum_class.dart b/pkgs/ffigen/lib/src/code_generator/enum_class.dart index ab87bafb05..5744851946 100644 --- a/pkgs/ffigen/lib/src/code_generator/enum_class.dart +++ b/pkgs/ffigen/lib/src/code_generator/enum_class.dart @@ -51,13 +51,16 @@ class EnumClass extends BindingType with HasLocalScope { Context context; /// Whether this enum should be generated as a collection of integers. - EnumStyle style; + EnumStyle? style; /// Don't code gen this alias at all, just use the [nativeType] directly. bool isAnonymous; final ApiAvailability? apiAvailability; + /// Whether to silence warning for enum integer type mimicking. + bool silenceWarning; + EnumClass({ super.usr, super.originalName, @@ -66,12 +69,15 @@ class EnumClass extends BindingType with HasLocalScope { Type? nativeType, List? enumConstants, required this.context, - this.style = EnumStyle.dartEnum, + this.style, this.isAnonymous = false, this.apiAvailability, + this.silenceWarning = false, }) : nativeType = nativeType ?? intType, enumConstants = enumConstants ?? []; + EnumStyle get resolvedStyle => style ?? EnumStyle.dartEnum; + /// Returns a string to declare the enum member and any documentation it may /// have had. String _formatValue(EnumConstant ec, {bool asInt = false}) { @@ -184,6 +190,7 @@ class EnumClass extends BindingType with HasLocalScope { @override bool get isObjCImport => + !(context.config.objectiveC?.generateForPackageObjectiveC ?? false) && context.objCBuiltInFunctions.isBuiltInEnum(originalName); @override @@ -212,7 +219,7 @@ class EnumClass extends BindingType with HasLocalScope { _writeDartDoc(s); if (enumConstants.isEmpty) { _writeEmptyEnum(s); - } else if (style == EnumStyle.intConstants) { + } else if (resolvedStyle == EnumStyle.intConstants) { s.write('sealed class $name {\n'); _writeIntegerConstants(s); s.write('}\n\n'); @@ -241,7 +248,7 @@ class EnumClass extends BindingType with HasLocalScope { @override String getDartType(Context context) { - if (style == EnumStyle.intConstants) { + if (resolvedStyle == EnumStyle.intConstants) { return nativeType.getDartType(context); } else if (isObjCImport) { return '${context.libs.prefix(objcPkgImport)}.$name'; @@ -258,7 +265,7 @@ class EnumClass extends BindingType with HasLocalScope { bool get sameFfiDartAndCType => nativeType.sameFfiDartAndCType; @override - bool get sameDartAndFfiDartType => style == EnumStyle.intConstants; + bool get sameDartAndFfiDartType => resolvedStyle == EnumStyle.intConstants; @override String? getDefaultValue(Context context) => '0'; @@ -299,8 +306,10 @@ class EnumConstant extends AstNode { final String? originalName; final String? dartDoc; final int value; + bool? userDefinedIsIncluded; final Symbol _symbol; + Symbol get symbol => _symbol; String get name => _symbol.name; EnumConstant({ diff --git a/pkgs/ffigen/lib/src/code_generator/func.dart b/pkgs/ffigen/lib/src/code_generator/func.dart index 596ad3072c..1cdd2cd1fe 100644 --- a/pkgs/ffigen/lib/src/code_generator/func.dart +++ b/pkgs/ffigen/lib/src/code_generator/func.dart @@ -3,8 +3,10 @@ // BSD-style license that can be found in the LICENSE file. import '../code_generator.dart'; +import '../config_provider/config_types.dart' show VarArgFunction; import '../context.dart'; import '../header_parser/sub_parsers/api_availability.dart'; +import '../strings.dart' as strings; import '../visitor/ast.dart'; import 'binding_string.dart'; import 'local_variables.dart'; @@ -43,13 +45,15 @@ import 'writer.dart'; /// ``` class Func extends LookUpBinding with HasLocalScope { final FunctionType functionType; - final bool exposeSymbolAddress; - final bool exposeFunctionTypedefs; - final bool isLeaf; + bool exposeSymbolAddress; + bool exposeFunctionTypedefs; + bool isLeaf; final bool objCReturnsRetained; final bool useNameForLookup; - final bool recordUse; + bool recordUse; final ApiAvailability? apiAvailability; + final bool isVariadic; + List varArgs; @override final bool loadFromNativeAsset; @@ -82,6 +86,8 @@ class Func extends LookUpBinding with HasLocalScope { super.isInternal, this.loadFromNativeAsset = false, this.apiAvailability, + this.isVariadic = false, + this.varArgs = const [], }) : functionType = FunctionType( returnType: returnType, parameters: parameters, @@ -107,6 +113,39 @@ class Func extends LookUpBinding with HasLocalScope { } } + /// Expands variant [Func] bindings based on [varArgs]. + List expandVarArgs() { + final expanded = []; + for (final vaFunc in varArgs) { + final f = Func( + dartDoc: dartDoc, + usr: usr.isNotEmpty + ? '$usr${strings.synthUsrChar} vaFunc: ${vaFunc.postfix}' + : '', + name: symbol.oldName + vaFunc.postfix, + originalName: originalName, + returnType: functionType.returnType, + parameters: functionType.parameters, + varArgParameters: [ + for (final ta in vaFunc.types) + Parameter(type: ta, name: 'va', objCConsumed: false), + ], + exposeSymbolAddress: exposeSymbolAddress, + exposeFunctionTypedefs: exposeFunctionTypedefs, + isLeaf: isLeaf, + recordUse: recordUse, + objCReturnsRetained: objCReturnsRetained, + loadFromNativeAsset: loadFromNativeAsset, + apiAvailability: apiAvailability, + useNameForLookup: useNameForLookup, + isInternal: isInternal, + ); + f.userDefinedIsIncluded = userDefinedIsIncluded; + expanded.add(f); + } + return expanded; + } + @override BindingString toBindingString(Writer w) { final s = StringBuffer(); @@ -289,6 +328,7 @@ class Parameter extends AstNode { final String originalName; Type type; final bool objCConsumed; + bool? userDefinedIsIncluded; Symbol symbol; String get name => symbol.name; diff --git a/pkgs/ffigen/lib/src/code_generator/global.dart b/pkgs/ffigen/lib/src/code_generator/global.dart index 594077eaeb..103bdda043 100644 --- a/pkgs/ffigen/lib/src/code_generator/global.dart +++ b/pkgs/ffigen/lib/src/code_generator/global.dart @@ -6,6 +6,7 @@ import '../visitor/ast.dart'; import 'binding.dart'; import 'binding_string.dart'; import 'compound.dart'; +import 'constant.dart'; import 'imports.dart'; import 'local_variables.dart'; import 'pointer.dart'; @@ -26,8 +27,9 @@ import 'writer.dart'; /// ``` class Global extends LookUpBinding with HasLocalScope { final Type type; - final bool exposeSymbolAddress; + bool exposeSymbolAddress; final bool constant; + final Constant? constantValue; @override final bool loadFromNativeAsset; @@ -40,11 +42,16 @@ class Global extends LookUpBinding with HasLocalScope { super.dartDoc, this.exposeSymbolAddress = false, this.constant = false, + this.constantValue, this.loadFromNativeAsset = false, }) : super(symbol: Symbol(name, SymbolKind.field)); @override BindingString toBindingString(Writer w) { + if (!exposeSymbolAddress && constantValue != null) { + constantValue!.symbol = symbol; + return constantValue!.toBindingString(w); + } final s = StringBuffer(); final globalVarName = name; s.write(makeDartDoc(dartDoc)); diff --git a/pkgs/ffigen/lib/src/code_generator/library.dart b/pkgs/ffigen/lib/src/code_generator/library.dart index 126a389354..b6cc91debc 100644 --- a/pkgs/ffigen/lib/src/code_generator/library.dart +++ b/pkgs/ffigen/lib/src/code_generator/library.dart @@ -38,8 +38,7 @@ class Library { context.config.objectiveC?.generateForPackageObjectiveC ?? false, // ignore: deprecated_member_use_from_same_package libraryImports: context.config.libraryImports, - silenceEnumWarning: context.config.enums.silenceWarning, - nativeEntryPoints: context.config.headers.entryPoints + nativeEntryPoints: context.config.input.entryPoints .map((uri) => uri.toFilePath()) .toList(), context: context, @@ -51,7 +50,6 @@ class Library { String? header, bool generateForPackageObjectiveC = false, List libraryImports = const [], - bool silenceEnumWarning = false, List nativeEntryPoints = const [], required Context context, }) { @@ -65,15 +63,27 @@ class Library { ? outputStyle.assetId : null; - for (final binding in bindings.whereType()) { - final loadFromNativeAsset = binding.loadFromNativeAsset; + for (final binding in bindings) { + if (binding is LookUpBinding) { + if (binding is Global && + !binding.exposeSymbolAddress && + binding.constantValue != null) { + continue; + } + final loadFromNativeAsset = binding.loadFromNativeAsset; - // At the moment, all bindings share their native config. - if (loadFromNativeAsset) nativeAssetId = outputStyleAssetId; + // At the moment, all bindings share their native config. + if (loadFromNativeAsset) nativeAssetId = outputStyleAssetId; - (loadFromNativeAsset ? nativeBindings : lookupBindings).add(binding); + (loadFromNativeAsset ? nativeBindings : lookupBindings).add(binding); + } } - final noLookUpBindings = bindings.whereType().toList(); + final noLookUpBindings = [ + ...bindings.whereType(), + ...bindings.whereType().where( + (g) => !g.exposeSymbolAddress && g.constantValue != null, + ), + ]; final hasNoLookupNativeHelper = noLookUpBindings.any( (b) => b.hasNativeHelperFunctions, ); @@ -90,7 +100,6 @@ class Library { header: header, additionalImports: libraryImports.map(context.libs.canonicalize).toList(), generateForPackageObjectiveC: generateForPackageObjectiveC, - silenceEnumWarning: silenceEnumWarning, nativeEntryPoints: nativeEntryPoints, context: context, ); 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 9323c807de..b83ed4b228 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 @@ -239,7 +239,7 @@ class ObjCBuiltInFunctions { // a hash of parts of the config. static String _libraryIdFromConfigHash(Config config) => fnvHash32( [ - ...config.headers.entryPoints, + ...config.input.entryPoints, config.output.dartFile, config.output.objCFile, ].map((uri) => path.basename(uri.toFilePath())).join('\n'), @@ -367,6 +367,9 @@ final $name = $getClass("$lookupName", () => $address.cast()); return BindingString(type: BindingStringType.global, string: s); } + @override + bool get hasNativeHelperFunctions => true; + @override void visitChildren(Visitor visitor) { super.visitChildren(visitor); @@ -396,6 +399,9 @@ class ObjCProtocolGlobal extends NoLookUpBinding { isInternal: true, ); + @override + bool get hasNativeHelperFunctions => true; + @override BindingString toBindingString(Writer w) { final context = w.context; diff --git a/pkgs/ffigen/lib/src/code_generator/objc_built_in_types.dart b/pkgs/ffigen/lib/src/code_generator/objc_built_in_types.dart index 194e77f1de..ae94004c73 100644 --- a/pkgs/ffigen/lib/src/code_generator/objc_built_in_types.dart +++ b/pkgs/ffigen/lib/src/code_generator/objc_built_in_types.dart @@ -5,11 +5,11 @@ // Generated by package:objective_c's tool/generate_code.dart. const objCBuiltInInterfaces = { + 'DOBJCObservation': 'DOBJCObservation', 'DOBJCDartInputStreamAdapter': 'DartInputStreamAdapter', 'DOBJCDartInputStreamAdapterWeakHolder': 'DartInputStreamAdapterWeakHolder', - 'DOBJCObservation': 'DOBJCObservation', - 'DOBJCDartProtocolBuilder': 'DartProtocolBuilder', 'DOBJCDartProtocol': 'DartProtocol', + 'DOBJCDartProtocolBuilder': 'DartProtocolBuilder', 'NSArray': 'NSArray', 'NSAttributedString': 'NSAttributedString', 'NSAttributedStringMarkdownParsingOptions': @@ -39,10 +39,10 @@ const objCBuiltInInterfaces = { 'NSNull': 'NSNull', 'NSNumber': 'NSNumber', 'NSObject': 'NSObject', - 'NSOutputStream': 'NSOutputStream', 'NSOrderedCollectionChange': 'NSOrderedCollectionChange', 'NSOrderedCollectionDifference': 'NSOrderedCollectionDifference', 'NSOrderedSet': 'NSOrderedSet', + 'NSOutputStream': 'NSOutputStream', 'NSPort': 'NSPort', 'NSPortMessage': 'NSPortMessage', 'NSProgress': 'NSProgress', @@ -138,7 +138,7 @@ const objCBuiltInCategories = { 'NSExtendedOrderedSet', 'NSExtendedSet', 'NSNumberCreation', - 'NSNumberIsFloat', 'NSNumberIsBool', + 'NSNumberIsFloat', 'NSStringExtensionMethods', }; diff --git a/pkgs/ffigen/lib/src/code_generator/objc_category.dart b/pkgs/ffigen/lib/src/code_generator/objc_category.dart index 9dc5235389..18e85f17f2 100644 --- a/pkgs/ffigen/lib/src/code_generator/objc_category.dart +++ b/pkgs/ffigen/lib/src/code_generator/objc_category.dart @@ -15,7 +15,7 @@ class ObjCCategory extends NoLookUpBinding with ObjCMethods, HasLocalScope { @override final Context context; final ObjCInterface parent; - final NoLookUpBinding classObject; + ObjCClassGlobal? get classObject => parent.classObject; final protocols = []; @@ -29,16 +29,16 @@ class ObjCCategory extends NoLookUpBinding with ObjCMethods, HasLocalScope { super.dartDoc, required this.context, required this.apiAvailability, - }) : classObject = parent.classObject, - super(symbol: Symbol(name ?? originalName, SymbolKind.klass)); + }) : super(symbol: Symbol(name ?? originalName, SymbolKind.klass)); void addProtocol(ObjCProtocol? proto) { if (proto != null) protocols.add(proto); } bool shouldCopyMethodToInterface(ObjCMethod method) { + if (parent.isObjCImport) return false; if (originalName.isEmpty) return true; - return method.returnsInstanceType && !parent.isObjCImport; + return method.returnsInstanceType; } @override diff --git a/pkgs/ffigen/lib/src/code_generator/objc_interface.dart b/pkgs/ffigen/lib/src/code_generator/objc_interface.dart index 7aca79873c..b683e979e6 100644 --- a/pkgs/ffigen/lib/src/code_generator/objc_interface.dart +++ b/pkgs/ffigen/lib/src/code_generator/objc_interface.dart @@ -17,9 +17,16 @@ class ObjCInterface extends BindingType with ObjCMethods, HasLocalScope { final Context context; ObjCInterface? superType; bool filled = false; + bool includeCategories = true; - final String? module; - late final NoLookUpBinding classObject; + String? module; + + ObjCClassGlobal? classObject; + ObjCClassGlobal fillClassObject() => classObject ??= ObjCClassGlobal( + '_class_${symbol.oldName}', + originalName, + module, + ); late final ObjCInternalGlobal _isKindOfClass; late final ObjCMsgSendFunc _isKindOfClassMsgSend; final protocols = []; @@ -47,7 +54,6 @@ class ObjCInterface extends BindingType with ObjCMethods, HasLocalScope { name ?? originalName, ) { - classObject = ObjCClassGlobal('_class_$name', originalName, module); _isKindOfClass = context.objCBuiltInFunctions.getSelObject( 'isKindOfClass:', ); @@ -103,8 +109,9 @@ class ObjCInterface extends BindingType with ObjCMethods, HasLocalScope { @override bool get isObjCImport => + !(context.config.objectiveC?.generateForPackageObjectiveC ?? false) && context.objCBuiltInFunctions.getBuiltInInterfaceName(originalName) != - null; + null; bool get unavailable => apiAvailability.availability == Availability.none; @@ -183,7 +190,7 @@ ${generateInstanceMethodBindings(w, this)} context, 'obj.ref.pointer', _isKindOfClass.name, - [classObject.name], + [classObject!.name], ); s.write(''' @@ -219,8 +226,16 @@ ${generateInstanceMethodBindings(w, this)} PointerType(objCObjectType).getCType(context); @override - String getDartType(Context context) => - isObjCImport ? '${context.libs.prefix(objcPkgImport)}.$name' : name; + String getDartType(Context context) { + if (isObjCImport) { + context.libs.markUsed(objcPkgImport); + final builtinName = + context.objCBuiltInFunctions.getBuiltInInterfaceName(originalName) ?? + originalName; + return '${context.libs.prefix(objcPkgImport)}.$builtinName'; + } + return name; + } @override String getNativeType(Context context, {String varName = ''}) => 'id $varName'; diff --git a/pkgs/ffigen/lib/src/code_generator/objc_methods.dart b/pkgs/ffigen/lib/src/code_generator/objc_methods.dart index 9812afb4be..57a03988d1 100644 --- a/pkgs/ffigen/lib/src/code_generator/objc_methods.dart +++ b/pkgs/ffigen/lib/src/code_generator/objc_methods.dart @@ -183,6 +183,7 @@ class ObjCMethod extends AstNode with HasLocalScope { final String? dartDoc; final String originalName; Symbol symbol; + bool? userDefinedIsIncluded; final String originalProtocolMethodName; Type returnType; final List _params; @@ -456,7 +457,7 @@ class ObjCMethod extends AstNode with HasLocalScope { // Evaluate targetStr and msgSendParams first to populate localVars. late String targetStr; if (isClassMethod) { - targetStr = (target as ObjCInterface).classObject.name; + targetStr = (target as ObjCInterface).classObject!.name; } else { targetStr = target.convertDartTypeToFfiDartType( context, diff --git a/pkgs/ffigen/lib/src/code_generator/objc_protocol.dart b/pkgs/ffigen/lib/src/code_generator/objc_protocol.dart index 456922be6b..f3627db88d 100644 --- a/pkgs/ffigen/lib/src/code_generator/objc_protocol.dart +++ b/pkgs/ffigen/lib/src/code_generator/objc_protocol.dart @@ -16,9 +16,17 @@ class ObjCProtocol extends BindingType with ObjCMethods, HasLocalScope { @override final Context context; final superProtocols = []; - final String? module; final Symbol loaderSymbol; - late final ObjCProtocolGlobal _protocolPointer; + String? module; + + ObjCProtocolGlobal? protocolPointer; + ObjCProtocolGlobal fillProtocolObject() => + protocolPointer ??= ObjCProtocolGlobal( + '_protocol_${symbol.oldName}', + originalName, + module, + loaderSymbol, + ); late final ObjCInternalGlobal _conformsTo; late final ObjCMsgSendFunc _conformsToMsgSend; final ApiAvailability apiAvailability; @@ -46,12 +54,6 @@ class ObjCProtocol extends BindingType with ObjCMethods, HasLocalScope { name ?? originalName, ) { - _protocolPointer = ObjCProtocolGlobal( - '_protocol_$originalName', - originalName, - module, - loaderSymbol, - ); _conformsTo = context.objCBuiltInFunctions.getSelObject( 'conformsToProtocol:', ); @@ -67,6 +69,7 @@ class ObjCProtocol extends BindingType with ObjCMethods, HasLocalScope { @override bool get isObjCImport => + !(context.config.objectiveC?.generateForPackageObjectiveC ?? false) && context.objCBuiltInFunctions.getBuiltInProtocolName(originalName) != null; bool get unavailable => apiAvailability.availability == Availability.none; @@ -121,7 +124,7 @@ extension type $name._($protocolBase object\$) implements ${sp.join(', ')} { context, 'obj.ref.pointer', _conformsTo.name, - [_protocolPointer.name], + [protocolPointer!.name], ); s.write(''' @@ -214,11 +217,11 @@ ${generateInstanceMethodBindings(w, this)} methodFields.write(makeDartDoc(method.dartDoc ?? method.originalName)); methodFields.write('''static final $fieldName = $methodClass<$funcType>( - ${_protocolPointer.name}, + ${protocolPointer!.name}, ${method.selObject.name}, ${_trampolineAddress(block)}, $getSignature( - ${_protocolPointer.name}, + ${protocolPointer!.name}, ${method.selObject.name}, isRequired: ${method.isRequired}, isInstanceMethod: ${method.isInstanceMethod}, @@ -235,7 +238,7 @@ ${generateInstanceMethodBindings(w, this)} ''' /// Returns the [$protocolClass] object for this protocol. static $protocolClass get \$protocol => - $protocolClass.fromPointer(${_protocolPointer.name}.cast()); + $protocolClass.fromPointer(${protocolPointer!.name}.cast()); /// Builds an object that implements the $originalName protocol. To implement /// multiple protocols, use [addToBuilder] or [$protocolBuilder] directly. @@ -337,7 +340,7 @@ ${generateInstanceMethodBindings(w, this)} @override BindingString? toObjCBindingString(Writer w) { - if (generateAsStub) return null; + if (generateAsStub || !generateBindings) return null; final mainString = ''' @@ -442,11 +445,13 @@ Protocol* ${loaderSymbol.name}(void) { return @protocol($originalName); } void visitChildren(Visitor visitor, {bool typeGraphOnly = false}) { if (!typeGraphOnly) { super.visitChildren(visitor); - visitor.visit(loaderSymbol); - visitor.visit(_protocolPointer); - visitor.visit(_conformsTo); - visitor.visit(_conformsToMsgSend); - visitMethods(visitor); + if (!generateAsStub) { + visitor.visit(loaderSymbol); + visitor.visit(protocolPointer); + visitor.visit(_conformsTo); + visitor.visit(_conformsToMsgSend); + visitMethods(visitor); + } visitor.visit(ffiImport); visitor.visit(objcPkgImport); } diff --git a/pkgs/ffigen/lib/src/code_generator/typealias.dart b/pkgs/ffigen/lib/src/code_generator/typealias.dart index dbd3687156..8c004fa28a 100644 --- a/pkgs/ffigen/lib/src/code_generator/typealias.dart +++ b/pkgs/ffigen/lib/src/code_generator/typealias.dart @@ -26,6 +26,8 @@ class Typealias extends BindingType { // Don't code gen this alias at all, just use the [type] directly. bool isAnonymous; + bool includeUnused; + /// Creates a Typealias. /// /// If [genFfiDartType] is true, a binding is generated for the Ffi Dart type @@ -38,6 +40,7 @@ class Typealias extends BindingType { required Type type, bool genFfiDartType = false, bool isInternal = false, + bool includeUnused = false, }) { final funcType = _getFunctionTypeFromPointer(type); if (funcType != null) { @@ -48,6 +51,7 @@ class Typealias extends BindingType { type: funcType, genFfiDartType: genFfiDartType, isInternal: isInternal, + includeUnused: includeUnused, ), ), ); @@ -62,6 +66,7 @@ class Typealias extends BindingType { type: type, genFfiDartType: genFfiDartType, isInternal: isInternal, + includeUnused: includeUnused, ); } return Typealias._( @@ -72,6 +77,7 @@ class Typealias extends BindingType { type: type, genFfiDartType: genFfiDartType, isInternal: isInternal, + includeUnused: includeUnused, ); } @@ -79,7 +85,14 @@ class Typealias extends BindingType { required String usr, required String name, required Type type, - }) : this._(usr: usr, name: name, type: type, isAnonymous: true); + bool includeUnused = false, + }) : this._( + usr: usr, + name: name, + type: type, + isAnonymous: true, + includeUnused: includeUnused, + ); Typealias._({ super.usr, @@ -90,6 +103,7 @@ class Typealias extends BindingType { bool genFfiDartType = false, super.isInternal, this.isAnonymous = false, + this.includeUnused = false, }) : _ffiDartAliasName = genFfiDartType ? Symbol('Dart$name', SymbolKind.klass) : null, @@ -244,6 +258,7 @@ class ObjCInstanceType extends Typealias { required super.type, super.genFfiDartType, super.isInternal, + super.includeUnused, }) : super._(); @override diff --git a/pkgs/ffigen/lib/src/code_generator/writer.dart b/pkgs/ffigen/lib/src/code_generator/writer.dart index 6a957e6fb6..e478b93eda 100644 --- a/pkgs/ffigen/lib/src/code_generator/writer.dart +++ b/pkgs/ffigen/lib/src/code_generator/writer.dart @@ -41,8 +41,6 @@ class Writer { bool get canGenerateSymbolOutput => _canGenerateSymbolOutput; bool _canGenerateSymbolOutput = false; - final bool silenceEnumWarning; - Writer({ required this.lookUpBindings, required this.ffiNativeBindings, @@ -52,7 +50,6 @@ class Writer { this.classDocComment, this.header, required this.generateForPackageObjectiveC, - required this.silenceEnumWarning, required this.nativeEntryPoints, required this.context, }) : symbolAddressWriter = SymbolAddressWriter(context); @@ -186,23 +183,23 @@ const _\$objcVersionCheck = $objcPrefix.ObjCVersionCheck( result.write(s); // Warn about Enum usage in API surface. - if (!silenceEnumWarning) { - final notEnums = _allBindings.where( - (b) => b is! Type || (b as Type).typealiasType is! EnumClass, + final notEnums = _allBindings.where( + (b) => b is! Type || (b as Type).typealiasType is! EnumClass, + ); + final usedEnums = visit(context, _FindEnumsVisitation(), notEnums).enums; + final unSilencedUsedEnums = usedEnums.where((e) => !e.silenceWarning); + if (unSilencedUsedEnums.isNotEmpty) { + final names = unSilencedUsedEnums.map((e) => e.originalName).toList() + ..sort(); + context.logger.severe( + 'The integer type used for enums is ' + 'implementation-defined. FFIgen tries to mimic the integer sizes ' + 'chosen by the most common compilers for the various OS and ' + 'architecture combinations. To prevent any crashes, remove the ' + 'enums from your API surface. To rely on the (unsafe!) mimicking, ' + 'you can silence this warning on the EnumClass. Affected enums:\n\t' + '${names.join('\n\t')}', ); - final usedEnums = visit(context, _FindEnumsVisitation(), notEnums).enums; - if (usedEnums.isNotEmpty) { - final names = usedEnums.map((e) => e.originalName).toList()..sort(); - context.logger.severe( - 'The integer type used for enums is ' - 'implementation-defined. FFIgen tries to mimic the integer sizes ' - 'chosen by the most common compilers for the various OS and ' - 'architecture combinations. To prevent any crashes, remove the ' - 'enums from your API surface. To rely on the (unsafe!) mimicking, ' - 'you can silence this warning by adding silence-enum-warning: true ' - 'to the FFIgen config. Affected enums:\n\t${names.join('\n\t')}', - ); - } } _canGenerateSymbolOutput = true; @@ -420,7 +417,7 @@ id objc_retainBlock(id); final s = StringBuffer(); final outDir = p.dirname(outFilename); // Emit each entry-point header exactly once. - for (final header in context.config.headers.entryPoints) { + for (final header in context.config.input.entryPoints) { s.write('#include "${p.relative(header.toFilePath(), from: outDir)}"\n'); } s.write(r''' diff --git a/pkgs/ffigen/lib/src/config_provider/config.dart b/pkgs/ffigen/lib/src/config_provider/config.dart index b45cac1199..d9ac806978 100644 --- a/pkgs/ffigen/lib/src/config_provider/config.dart +++ b/pkgs/ffigen/lib/src/config_provider/config.dart @@ -10,31 +10,51 @@ import 'package:meta/meta.dart'; import '../code_generator.dart'; import '../ffigen.dart'; import 'config_types.dart'; +import 'public_ast.dart' show Visitor; /// The generator that generates bindings for `dart:ffi` from C and Objective-C /// headers. // TODO: Add a code snippet example. final class FfiGenerator { - /// The configuration for header parsing of [FfiGenerator]. - final Headers headers; - - /// Configuration for enums. - final Enums enums; - - /// Configuration for functions. - final Functions functions; - - /// Configuration for globals. - final Globals globals; - - /// Configuration for integer types. - final Integers integers; - - /// Configuration for macro constants. - final Macros macros; + /// Visitors to configure generation options for target language declarations. + /// + /// You can filter declarations: + /// ```dart + /// Visitor.callback( + /// visitFunc: (node) { + /// if (node.originalName.startsWith('_')) { + /// node.isIncluded = false; + /// } + /// }, + /// ) + /// ``` + /// + /// You can rename declarations: + /// ```dart + /// Visitor.callback( + /// visitStruct: (node) { + /// if (node.originalName == 'custom_type') { + /// node.name = 'CustomType'; + /// } + /// }, + /// ) + /// ``` + /// + /// Multiple visitors can be provided, and are executed sequentially in order. + /// Nodes filtered out in an earlier pass (`node.isIncluded = false`) are + /// still visited in subsequent passes. + /// ```dart + /// Visitor.callback( + /// visitFunc: (node) { + /// if (!node.isIncluded) return; + /// // Process only included functions... + /// }, + /// ) + /// ``` + final List visitors; - /// Configuration for structs. - final Structs structs; + /// Input headers and compiler options. + final Input input; /// C++ specific configuration. /// @@ -44,15 +64,6 @@ final class FfiGenerator { /// may change or be removed in a future version without a deprecation notice. final Cpp? cpp; - /// Configuration for typedefs. - final Typedefs typedefs; - - /// Configuration for unions. - final Unions unions; - - /// Configuration for unnamed enum constants. - final UnnamedEnums unnamedEnums; - /// Objective-C specific configuration. /// /// If `null`, will only generate for C. @@ -81,6 +92,14 @@ final class FfiGenerator { ) final List libraryImports; + /// Custom type mappings for typedefs. + // TODO(https://github.com/dart-lang/native/issues/2595): Remove/change this. + @Deprecated( + 'This field will change type. See ' + 'https://github.com/dart-lang/native/issues/2595.', + ) + final List typedefImports; + /// Path to the clang library. /// /// Only visible for YamlConfig plumbing. @@ -88,17 +107,9 @@ final class FfiGenerator { final Uri? libclangDylib; const FfiGenerator({ - this.headers = const Headers(), - this.enums = Enums.excludeAll, - this.functions = Functions.excludeAll, - this.globals = Globals.excludeAll, - this.integers = const Integers(), - this.macros = Macros.excludeAll, - this.structs = Structs.excludeAll, + this.visitors = const [], + this.input = const Input(), this.cpp, - this.typedefs = Typedefs.excludeAll, - this.unions = Unions.excludeAll, - this.unnamedEnums = UnnamedEnums.excludeAll, this.objectiveC, required this.output, @Deprecated( @@ -111,6 +122,7 @@ final class FfiGenerator { 'https://github.com/dart-lang/native/issues/2597.', ) this.libraryImports = const [], + this.typedefImports = const [], @Deprecated('Only visible for YamlConfig plumbing.') this.libclangDylib, }); @@ -125,8 +137,8 @@ final class FfiGenerator { } } -/// The configuration for header parsing of [FfiGenerator]. -final class Headers { +/// The input configuration for header parsing of [FfiGenerator]. +final class Input { /// Path to headers. May not contain globs. final List entryPoints; @@ -137,12 +149,17 @@ final class Headers { static bool _includeDefault(Uri header) => true; /// Command line arguments to pass to clang_compiler. + /// + /// If `null`, default options based on your platform and target language are + /// used (for example, automatic macOS SDK path detection). + /// If an empty list `[]` is provided, default platform options are + /// suppressed. final List? compilerOptions; /// Where to ignore compiler warnings/errors in source header files. final bool ignoreSourceErrors; - const Headers({ + const Input({ this.entryPoints = const [], this.include = _includeDefault, this.compilerOptions, @@ -150,174 +167,6 @@ final class Headers { }); } -/// Configuration for declarations. -final class Declarations { - /// Whether to include the given declaration. - /// - /// ```dart - /// // This includes `Foo`, and nothing else: - /// include: (Declaration decl) => decl.originalName == 'Foo' - /// ``` - final bool Function(Declaration declaration) include; - - /// A function to pass to [include] that excludes all declarations. - static bool excludeAll(Declaration declaration) => false; - - /// A function to pass to [include] that includes all declarations. - static bool includeAll(Declaration declaration) => true; - - /// Returns a function to pass to [include] that includes all declarations - /// whose `originalName`s are in [names]. - static bool Function(Declaration) includeSet(Set names) => - (Declaration decl) => names.contains(decl.originalName); - - /// Whether the member of the declaration should be included. - /// - /// Only used for [Categories], [Interfaces], and [Protocols] methods and - /// properties. For Objective-C methods, this is the method selector, eg - /// `"arrayWithObjects:count:"`. - /// - /// Note that using [includeMember] to include a member of a class doesn't - /// affect whether the class is included. You'll also need to set [include] - /// for the class (this will be fixed in a future version of the API). - /// - /// ```dart - /// // This includes `Foo.bar`, and no other methods of `Foo`: - /// includeMember: (Declaration declaration, String member) => - /// ``` - // TODO(https://github.com/dart-lang/native/issues/2770): Merge with include. - final bool Function(Declaration declaration, String member) includeMember; - - /// A function to pass to [includeMember] that includes all members of all - /// declarations. - static bool includeAllMembers(Declaration declaration, String member) => true; - - /// A function to pass to [includeMember] that includes specific members. - /// - /// The map key is the declaration's `originalName`, and the value is the set - /// of member names to include. If the declaration is not in the map, all its - /// members are included. - static bool Function(Declaration, String) includeMemberSet( - Map> members, - ) => - (Declaration decl, String member) => - members[decl.originalName]?.contains(member) ?? true; - - /// Whether the symbol address should be exposed for this declaration. - /// - /// The address is exposed as an FFI pointer. - final bool Function(Declaration declaration) includeSymbolAddress; - - /// Returns a new name for the declaration, to replace its `originalName`. - /// - /// ```dart - /// // This renames `Foo` to `Bar`, and nothing else: - /// rename: (Declaration decl) => - /// decl.originalName == 'Foo' ? 'Bar' : decl.originalName - /// ``` - final String Function(Declaration declaration) rename; - - /// A function to pass to [rename] that doesn't rename the declaration. - static String useOriginalName(Declaration declaration) => - declaration.originalName; - - /// A function to pass to [rename] that applies a rename map. - /// - /// The key of the map is the declaration's `originalName`, and the value is - /// the new name to use. If the declaration is not in the map, it is not - /// renamed. - static String Function(Declaration) renameWithMap( - Map renames, - ) => - (Declaration declaration) => - renames[declaration.originalName] ?? declaration.originalName; - - /// Returns a new name for the member of the declaration, to replace its - /// `originalName`. - /// - /// Used for struct/union fields, enum elements, function params, and - /// Objective-C interface/protocol/category methods/properties. - /// - /// ```dart - /// // This renames `Foo.bar` to `Foo.baz`, and nothing else: - /// rename: (Declaration decl, String member) { - /// if (decl.originalName == 'Foo' && member == 'baz') { - /// return 'baz'; - /// } - /// return member; - /// } - /// ``` - final String Function(Declaration declaration, String member) renameMember; - - /// A function to pass to [renameMember] that doesn't rename the member. - static String useMemberOriginalName(Declaration declaration, String member) => - member; - - /// A function to pass to [renameMember] that applies a rename map. - /// - /// The key of the map is the declaration's `originalName`, and the value is - /// a map from member name to renamed member name. If the declaration is not - /// in the map, or the member isn't in the declaration's map, the member is - /// not renamed. - static String Function(Declaration, String) renameMemberWithMap( - Map> renames, - ) => - (Declaration declaration, String member) => - renames[declaration.originalName]?[member] ?? member; - - const Declarations({ - this.include = excludeAll, - this.includeMember = includeAllMembers, - this.includeSymbolAddress = excludeAll, - this.rename = useOriginalName, - this.renameMember = useMemberOriginalName, - }); -} - -/// Configuration for enum declarations. -final class Enums extends Declarations { - /// The [EnumStyle] to use for the given enum declaration. - /// - /// The `suggestedStyle` is a suggested [EnumStyle] based on the declaration - /// of the enum, if any. For example, Objective-C enums declared using - /// NS_OPTIONS are suggested to use [EnumStyle.intConstants]. - /// - /// ```dart - /// // This uses `intConstants` for `Foo`, and the default style otherwise: - /// style: (Declaration decl, EnumStyle? suggestedStyle) { - /// if (decl.originalName == 'Foo') { - /// return EnumStyle.intConstants; - /// } - /// return suggestedStyle ?? EnumStyle.dartEnum; - /// } - /// ``` - final EnumStyle Function(Declaration declaration, EnumStyle? suggestedStyle) - style; - - static EnumStyle _styleDefault( - Declaration declaration, - EnumStyle? suggestedStyle, - ) => suggestedStyle ?? EnumStyle.dartEnum; - - /// Whether to silence warning for enum integer type mimicking. - final bool silenceWarning; - - const Enums({ - super.include, - super.rename, - super.renameMember, - this.style = _styleDefault, - this.silenceWarning = false, - }); - - static const excludeAll = Enums(include: Declarations.excludeAll); - - static const includeAll = Enums(include: Declarations.includeAll); - - static Enums includeSet(Set names) => - Enums(include: Declarations.includeSet(names)); -} - /// Configuration for how to generate enums. enum EnumStyle { /// Generate a real Dart enum. @@ -329,248 +178,13 @@ enum EnumStyle { intConstants, } -/// Configuration for function declarations. -final class Functions extends Declarations { - /// Whether to generate a typedef for a given function's native type. - final bool Function(Declaration declaration) includeTypedef; - - static bool _includeTypedefDefault(Declaration declaration) => false; - - /// Whether the given function is a leaf function. - /// - /// This corresponds to the `isLeaf` parameter of FFI's `lookupFunction`. - /// For more details, its documentation is here: - /// https://api.dart.dev/dart-ffi/DynamicLibraryExtension/lookupFunction.html - final bool Function(Declaration declaration) isLeaf; - - static bool _isLeafDefault(Declaration declaration) => false; - - /// Whether to add the `@RecordUse()` annotation to the given function. - /// - /// Experimental: The record uses feature needs to be enabled as experiment. - @experimental - final bool Function(Declaration declaration) recordUse; - - static bool _recordUseDefault(Declaration declaration) => false; - - /// Map from function's original name to [VarArgFunction]s. - /// - /// Dart doesn't support variadic functions. Instead, variadic functions are - /// handled by generating multiple versions of the same function, with - /// different signatures. Each [VarArgFunction] represents one of those - /// signatures. - final Map> varArgs; - - const Functions({ - super.include, - super.includeSymbolAddress, - super.rename, - super.renameMember, - this.includeTypedef = _includeTypedefDefault, - this.isLeaf = _isLeafDefault, - this.recordUse = _recordUseDefault, - this.varArgs = const >{}, - }); - - static const excludeAll = Functions(include: Declarations.excludeAll); - - static const includeAll = Functions(include: Declarations.includeAll); - - static Functions includeSet(Set names) => - Functions(include: Declarations.includeSet(names)); -} - -/// Configuration for globals. -final class Globals extends Declarations { - const Globals({super.rename, super.include, super.includeSymbolAddress}); - - static const excludeAll = Globals(include: Declarations.excludeAll); - - static const includeAll = Globals(include: Declarations.includeAll); - - static Globals includeSet(Set names) => - Globals(include: Declarations.includeSet(names)); -} - -/// Configuration for integer types. -final class Integers { - /// Integer types imported from other Dart files. - // TODO(https://github.com/dart-lang/native/issues/2595): Change type. - @Deprecated( - 'This field will change type. See ' - 'https://github.com/dart-lang/native/issues/2595.', - ) - final List imported; - - const Integers({ - @Deprecated( - 'This field will change type. See ' - 'https://github.com/dart-lang/native/issues/2595.', - ) - this.imported = const [], - }); -} - -/// Configuration for macros. -final class Macros extends Declarations { - const Macros({super.rename, super.include}); - - static const excludeAll = Macros(include: Declarations.excludeAll); - - static const includeAll = Macros(include: Declarations.includeAll); - - static Macros includeSet(Set names) => - Macros(include: Declarations.includeSet(names)); -} - -/// Configuration for struct declarations. -final class Structs extends Declarations { - /// Whether structs that are dependencies should be included. - final CompoundDependencies dependencies; - - /// Structs imported from other Dart files. - // TODO(https://github.com/dart-lang/native/issues/2595): Change type. - @Deprecated( - 'This field will change type. See ' - 'https://github.com/dart-lang/native/issues/2595.', - ) - final List imported; - - /// Whether, and how, to override struct packing for the given struct. - final PackingValue? Function(Declaration declaration) packingOverride; - - static PackingValue? _packingOverrideDefault(Declaration declaration) => null; - - const Structs({ - super.include, - super.rename, - super.renameMember, - this.dependencies = CompoundDependencies.opaque, - @Deprecated( - 'This field will change type. See ' - 'https://github.com/dart-lang/native/issues/2595.', - ) - this.imported = const [], - this.packingOverride = _packingOverrideDefault, - }); - - static const excludeAll = Structs(include: Declarations.excludeAll); - - static const includeAll = Structs(include: Declarations.includeAll); - - static Structs includeSet(Set names) => - Structs(include: Declarations.includeSet(names)); -} - -/// Configuration for typedefs. -final class Typedefs extends Declarations { - /// Typedefs imported from other Dart files. - @Deprecated( - 'This field will change type. See ' - 'https://github.com/dart-lang/native/issues/2595.', - ) - final List imported; - - /// If enabled, unused typedefs will also be generated. - final bool includeUnused; - - /// If typedef of supported types(int8_t) should be directly used. - final bool useSupportedTypedefs; - - const Typedefs({ - super.rename, - super.include, - @Deprecated( - 'This field will change type. See ' - 'https://github.com/dart-lang/native/issues/2595.', - ) - this.imported = const [], - this.includeUnused = false, - this.useSupportedTypedefs = true, - }); - - static const Typedefs excludeAll = Typedefs(include: Declarations.excludeAll); - - static const Typedefs includeAll = Typedefs(include: Declarations.includeAll); - - static Typedefs includeSet(Set names) => - Typedefs(include: Declarations.includeSet(names)); -} - -/// Configuration for C++ class declarations. -final class CppClasses extends Declarations { - const CppClasses({super.include, super.rename, super.renameMember}); - - static const excludeAll = CppClasses(include: Declarations.excludeAll); - static const includeAll = CppClasses(include: Declarations.includeAll); - - static CppClasses includeSet(Set names) => - CppClasses(include: Declarations.includeSet(names)); -} - /// Configuration for C++. final class Cpp { - /// Declaration filters for C++ classes. - final CppClasses classes; - - const Cpp({this.classes = CppClasses.excludeAll}); -} - -/// Configuration for union declarations. -final class Unions extends Declarations { - /// Whether unions that are dependencies should be included. - final CompoundDependencies dependencies; - - /// Unions imported from other Dart files. - @Deprecated( - 'This field will change type. See ' - 'https://github.com/dart-lang/native/issues/2595.', - ) - final List imported; - - const Unions({ - super.include, - super.rename, - super.renameMember, - this.dependencies = CompoundDependencies.opaque, - @Deprecated( - 'This field will change type. See ' - 'https://github.com/dart-lang/native/issues/2595.', - ) - this.imported = const [], - }); - - static const excludeAll = Unions(include: Declarations.excludeAll); - - static const includeAll = Unions(include: Declarations.includeAll); - - static Unions includeSet(Set names) => - Unions(include: Declarations.includeSet(names)); -} - -/// Configuration for unnamed enum constants. -final class UnnamedEnums extends Declarations { - const UnnamedEnums({super.include, super.rename, super.renameMember}); - - static const excludeAll = UnnamedEnums(include: Declarations.excludeAll); - - static const includeAll = UnnamedEnums(include: Declarations.includeAll); - - static UnnamedEnums includeSet(Set names) => - UnnamedEnums(include: Declarations.includeSet(names)); + const Cpp(); } /// Configuration for Objective-C. final class ObjectiveC { - /// Declaration filters for Objective-C categories. - final Categories categories; - - /// Declaration filters for Objective-C interfaces. - final Interfaces interfaces; - - /// Declaration filters for Objective-C protocols. - final Protocols protocols; - // Undocumented option that changes code generation for package:objective_c. // The main difference is whether NSObject etc are imported from // package:objective_c (the default) or code genned like any other class. @@ -584,99 +198,12 @@ final class ObjectiveC { final ExternalVersions externalVersions; const ObjectiveC({ - this.categories = Categories.excludeAll, - this.interfaces = Interfaces.excludeAll, - this.protocols = Protocols.excludeAll, this.externalVersions = const ExternalVersions(), @Deprecated('Only for internal use.') this.generateForPackageObjectiveC = false, }); } -/// Configuration for Objective-C categories. -final class Categories extends Declarations { - /// If enabled, Objective-C categories that are not explicitly included by - /// the [Declarations], but extend interfaces that are included, - /// will be code-genned as if they were included. If disabled, these - /// transitively included categories will not be generated at all. - final bool includeTransitive; - - const Categories({ - super.include, - super.includeMember, - super.rename, - super.renameMember, - this.includeTransitive = true, - }); - - static const excludeAll = Categories(include: Declarations.excludeAll); - - static const includeAll = Categories(include: Declarations.includeAll); - - static Categories includeSet(Set names) => - Categories(include: Declarations.includeSet(names)); -} - -/// Configuration for Objective-C interfaces. -final class Interfaces extends Declarations { - /// If enabled, Objective-C interfaces that are not explicitly included by - /// the [Declarations], but are transitively included by other bindings, - /// will be code-genned as if they were included. If disabled, these - /// transitively included interfaces will be generated as stubs instead. - final bool includeTransitive; - - /// The module that the Objective-C interface belongs to. - final String? Function(Declaration declaration) module; - - const Interfaces({ - super.include, - super.includeMember, - super.rename, - super.renameMember, - this.includeTransitive = false, - this.module = noModule, - }); - - static const excludeAll = Interfaces(include: Declarations.excludeAll); - - static const includeAll = Interfaces(include: Declarations.includeAll); - - static Interfaces includeSet(Set names) => - Interfaces(include: Declarations.includeSet(names)); - - static String? noModule(Declaration declaration) => null; -} - -/// Configuration for Objective-C protocols. -final class Protocols extends Declarations { - /// If enabled, Objective-C protocols that are not explicitly included by - /// the [Declarations], but are transitively included by other bindings, - /// will be code-genned as if they were included. If disabled, these - /// transitively included protocols will not be generated at all. - final bool includeTransitive; - - /// The module that the Objective-C protocol belongs to. - final String? Function(Declaration declaration) module; - - const Protocols({ - super.include, - super.includeMember, - super.rename, - super.renameMember, - this.includeTransitive = false, - this.module = noModule, - }); - - static const excludeAll = Protocols(include: Declarations.excludeAll); - - static const includeAll = Protocols(include: Declarations.includeAll); - - static Protocols includeSet(Set names) => - Protocols(include: Declarations.includeSet(names)); - - static String? noModule(Declaration declaration) => null; -} - /// Configuration for outputting bindings. final class Output { /// The output Dart file for the generated bindings. @@ -766,39 +293,4 @@ final class DynamicLibraryBindings implements BindingStyle { extension type Config(FfiGenerator ffiGen) implements FfiGenerator { // ignore: deprecated_member_use_from_same_package Map get importedTypesByUsr => ffiGen.importedTypesByUsr; - - // Override declarative user spec with what FFIgen internals expect. - Map get typedefTypeMappings => - Map.fromEntries( - // ignore: deprecated_member_use_from_same_package - ffiGen.typedefs.imported.map( - (import) => MapEntry(import.nativeType, import), - ), - ); - - Map get structTypeMappings => - Map.fromEntries( - // ignore: deprecated_member_use_from_same_package - ffiGen.structs.imported.map( - (import) => MapEntry(import.nativeType, import), - ), - ); - - // Override declarative user spec with what FFIgen internals expect. - Map get unionTypeMappings => - Map.fromEntries( - // ignore: deprecated_member_use_from_same_package - ffiGen.unions.imported.map( - (import) => MapEntry(import.nativeType, import), - ), - ); - - // Override declarative user spec with what FFIgen internals expect. - Map get importedIntegers => - Map.fromEntries( - // ignore: deprecated_member_use_from_same_package - ffiGen.integers.imported.map( - (import) => MapEntry(import.nativeType, import), - ), - ); } diff --git a/pkgs/ffigen/lib/src/config_provider/config_types.dart b/pkgs/ffigen/lib/src/config_provider/config_types.dart index 0d356ac7a0..859d58245c 100644 --- a/pkgs/ffigen/lib/src/config_provider/config_types.dart +++ b/pkgs/ffigen/lib/src/config_provider/config_types.dart @@ -12,7 +12,6 @@ import 'package:pub_semver/pub_semver.dart'; import 'package:quiver/pattern.dart' as quiver; import '../code_generator.dart'; -import 'config.dart'; import 'path_finder.dart'; export 'package:pub_semver/pub_semver.dart' show Version; @@ -61,7 +60,7 @@ class StructPackingOverride { } // Holds headers and filters for header. -class YamlHeaders { +class YamlInput { /// Path to headers. /// /// This contains all the headers, after extraction from Globs. @@ -70,7 +69,7 @@ class YamlHeaders { /// Include filter for headers. final HeaderIncludeFilter includeFilter; - YamlHeaders({List? entryPoints, HeaderIncludeFilter? includeFilter}) + YamlInput({List? entryPoints, HeaderIncludeFilter? includeFilter}) : entryPoints = entryPoints?.map(Uri.file).toList() ?? [], includeFilter = includeFilter ?? GlobHeaderFilter(); } @@ -127,34 +126,31 @@ final class YamlDeclarationFilters { _memberIncluder = memberIncluder ?? YamlMemberIncluder(); /// Applies renaming and returns the result. - String rename(Declaration declaration) => - _renamer.rename(declaration.originalName); + String rename(String name) => _renamer.rename(name); /// Applies member renaming and returns the result. - String renameMember(Declaration declaration, String member) => - _memberRenamer.rename(declaration.originalName, member); + String renameMember(String name, String member) => + _memberRenamer.rename(name, member); /// Checks if a name is allowed by a filter. - bool shouldInclude(Declaration declaration) => - _includer.shouldInclude(declaration.originalName, excludeAllByDefault); + bool shouldInclude(String name) => + _includer.shouldInclude(name, excludeAllByDefault); + + /// Checks if a name is explicitly included by an include pattern. + bool isExplicitlyIncluded(String name) => + _includer.isExplicitlyIncluded(name); + + /// Checks if a name is explicitly excluded by an exclude pattern. + bool isExplicitlyExcluded(String name) => + _includer.isExplicitlyExcluded(name); /// Checks if the symbol address should be included for this name. - bool shouldIncludeSymbolAddress(Declaration declaration) => - _symbolAddressIncluder.shouldInclude(declaration.originalName); + bool shouldIncludeSymbolAddress(String name) => + _symbolAddressIncluder.shouldInclude(name); /// Checks if a member is allowed by a filter. - bool shouldIncludeMember(Declaration declaration, String member) => - _memberIncluder.shouldInclude(declaration.originalName, member); - - Declarations configAdapter() { - return Declarations( - include: shouldInclude, - includeSymbolAddress: shouldIncludeSymbolAddress, - includeMember: shouldIncludeMember, - rename: rename, - renameMember: renameMember, - ); - } + bool shouldIncludeMember(String name, String member) => + _memberIncluder.shouldInclude(name, member, false); } /// Matches `$`, value can be accessed in group 1 of match. @@ -252,6 +248,9 @@ class YamlIncluder { // Otherwise, fall back to the default behavior for empty filters. return !excludeAllByDefault; } + + bool isExplicitlyIncluded(String name) => _include.matches(name); + bool isExplicitlyExcluded(String name) => _exclude.matches(name); } /// Handles `full/regexp` renaming logic. @@ -352,20 +351,26 @@ class YamlMemberIncluder { }) : _memberIncluderFull = memberIncluderFull ?? {}, _memberIncluderMatchers = memberIncluderMatchers ?? []; - bool shouldInclude(String declaration, String member) { + bool shouldInclude( + String declaration, + String member, [ + bool excludeAllByDefault = false, + ]) { // Full matches take priority. final fullMatch = _memberIncluderFull[declaration]; - if (fullMatch != null) return fullMatch.shouldInclude(member); + if (fullMatch != null) { + return fullMatch.shouldInclude(member, excludeAllByDefault); + } // Check regex matchers. for (final (re, includer) in _memberIncluderMatchers) { if (quiver.matchesFull(re, declaration)) { - return includer.shouldInclude(member); + return includer.shouldInclude(member, excludeAllByDefault); } } - // By default, include all members. - return true; + // By default, include all members unless excludeAllByDefault is true. + return !excludeAllByDefault; } } diff --git a/pkgs/ffigen/lib/src/config_provider/public_ast.dart b/pkgs/ffigen/lib/src/config_provider/public_ast.dart new file mode 100644 index 0000000000..aa93d741c7 --- /dev/null +++ b/pkgs/ffigen/lib/src/config_provider/public_ast.dart @@ -0,0 +1,1122 @@ +// Copyright (c) 2026, 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 '../code_generator.dart' as ast; +import '../config_provider.dart'; + +/// User-facing Visitor for FFIgen's Public AST. +abstract class Visitor { + const Visitor(); + + factory Visitor.callback({ + void Function(PublicAst ast)? visitLibrary, + void Function(Struct node)? visitStruct, + void Function(Union node)? visitUnion, + void Function(EnumClass node)? visitEnum, + void Function(UnnamedEnumConstant node)? visitUnnamedEnumConstant, + void Function(Func node)? visitFunc, + void Function(Global node)? visitGlobal, + void Function(MacroConstant node)? visitMacroConstant, + void Function(Typealias node)? visitTypealias, + void Function(ObjCInterface node)? visitObjCInterface, + void Function(ObjCProtocol node)? visitObjCProtocol, + void Function(ObjCCategory node)? visitObjCCategory, + void Function(CppClass node)? visitCppClass, + void Function(Field node)? visitField, + void Function(EnumConstant node)? visitEnumConstant, + void Function(Parameter node)? visitParameter, + void Function(ObjCMethod node)? visitObjCMethod, + void Function(CppMethod node)? visitCppMethod, + }) = _VisitorImpl; + + void visitLibrary(PublicAst ast) { + ast.visitChildren(this); + } + + void visitStruct(Struct node) { + node.visitChildren(this); + } + + void visitUnion(Union node) { + node.visitChildren(this); + } + + void visitEnum(EnumClass node) { + node.visitChildren(this); + } + + void visitUnnamedEnumConstant(UnnamedEnumConstant node) { + node.visitChildren(this); + } + + void visitFunc(Func node) { + node.visitChildren(this); + } + + void visitGlobal(Global node) { + node.visitChildren(this); + } + + void visitMacroConstant(MacroConstant node) { + node.visitChildren(this); + } + + void visitTypealias(Typealias node) { + node.visitChildren(this); + } + + void visitObjCInterface(ObjCInterface node) { + node.visitChildren(this); + } + + void visitObjCProtocol(ObjCProtocol node) { + node.visitChildren(this); + } + + void visitObjCCategory(ObjCCategory node) { + node.visitChildren(this); + } + + void visitCppClass(CppClass node) { + node.visitChildren(this); + } + + void visitField(Field node) { + node.visitChildren(this); + } + + void visitEnumConstant(EnumConstant node) { + node.visitChildren(this); + } + + void visitParameter(Parameter node) { + node.visitChildren(this); + } + + void visitObjCMethod(ObjCMethod node) { + node.visitChildren(this); + } + + void visitCppMethod(CppMethod node) { + node.visitChildren(this); + } +} + +class _VisitorImpl extends Visitor { + final void Function(PublicAst ast)? _visitLibrary; + final void Function(Struct node)? _visitStruct; + final void Function(Union node)? _visitUnion; + final void Function(EnumClass node)? _visitEnum; + final void Function(UnnamedEnumConstant node)? _visitUnnamedEnumConstant; + final void Function(Func node)? _visitFunc; + final void Function(Global node)? _visitGlobal; + final void Function(MacroConstant node)? _visitMacroConstant; + final void Function(Typealias node)? _visitTypealias; + final void Function(ObjCInterface node)? _visitObjCInterface; + final void Function(ObjCProtocol node)? _visitObjCProtocol; + final void Function(ObjCCategory node)? _visitObjCCategory; + final void Function(CppClass node)? _visitCppClass; + final void Function(Field node)? _visitField; + final void Function(EnumConstant node)? _visitEnumConstant; + final void Function(Parameter node)? _visitParameter; + final void Function(ObjCMethod node)? _visitObjCMethod; + final void Function(CppMethod node)? _visitCppMethod; + + const _VisitorImpl({ + void Function(PublicAst ast)? visitLibrary, + void Function(Struct node)? visitStruct, + void Function(Union node)? visitUnion, + void Function(EnumClass node)? visitEnum, + void Function(UnnamedEnumConstant node)? visitUnnamedEnumConstant, + void Function(Func node)? visitFunc, + void Function(Global node)? visitGlobal, + void Function(MacroConstant node)? visitMacroConstant, + void Function(Typealias node)? visitTypealias, + void Function(ObjCInterface node)? visitObjCInterface, + void Function(ObjCProtocol node)? visitObjCProtocol, + void Function(ObjCCategory node)? visitObjCCategory, + void Function(CppClass node)? visitCppClass, + void Function(Field node)? visitField, + void Function(EnumConstant node)? visitEnumConstant, + void Function(Parameter node)? visitParameter, + void Function(ObjCMethod node)? visitObjCMethod, + void Function(CppMethod node)? visitCppMethod, + }) : _visitLibrary = visitLibrary, + _visitStruct = visitStruct, + _visitUnion = visitUnion, + _visitEnum = visitEnum, + _visitUnnamedEnumConstant = visitUnnamedEnumConstant, + _visitFunc = visitFunc, + _visitGlobal = visitGlobal, + _visitMacroConstant = visitMacroConstant, + _visitTypealias = visitTypealias, + _visitObjCInterface = visitObjCInterface, + _visitObjCProtocol = visitObjCProtocol, + _visitObjCCategory = visitObjCCategory, + _visitCppClass = visitCppClass, + _visitField = visitField, + _visitEnumConstant = visitEnumConstant, + _visitParameter = visitParameter, + _visitObjCMethod = visitObjCMethod, + _visitCppMethod = visitCppMethod, + super(); + + @override + void visitLibrary(PublicAst ast) { + _visitLibrary?.call(ast); + ast.visitChildren(this); + } + + @override + void visitStruct(Struct node) { + _visitStruct?.call(node); + node.visitChildren(this); + } + + @override + void visitUnion(Union node) { + _visitUnion?.call(node); + node.visitChildren(this); + } + + @override + void visitEnum(EnumClass node) { + _visitEnum?.call(node); + node.visitChildren(this); + } + + @override + void visitUnnamedEnumConstant(UnnamedEnumConstant node) { + _visitUnnamedEnumConstant?.call(node); + node.visitChildren(this); + } + + @override + void visitFunc(Func node) { + _visitFunc?.call(node); + node.visitChildren(this); + } + + @override + void visitGlobal(Global node) { + _visitGlobal?.call(node); + node.visitChildren(this); + } + + @override + void visitMacroConstant(MacroConstant node) { + _visitMacroConstant?.call(node); + node.visitChildren(this); + } + + @override + void visitTypealias(Typealias node) { + _visitTypealias?.call(node); + node.visitChildren(this); + } + + @override + void visitObjCInterface(ObjCInterface node) { + _visitObjCInterface?.call(node); + node.visitChildren(this); + } + + @override + void visitObjCProtocol(ObjCProtocol node) { + _visitObjCProtocol?.call(node); + node.visitChildren(this); + } + + @override + void visitObjCCategory(ObjCCategory node) { + _visitObjCCategory?.call(node); + node.visitChildren(this); + } + + @override + void visitCppClass(CppClass node) { + _visitCppClass?.call(node); + node.visitChildren(this); + } + + @override + void visitField(Field node) { + _visitField?.call(node); + node.visitChildren(this); + } + + @override + void visitEnumConstant(EnumConstant node) { + _visitEnumConstant?.call(node); + node.visitChildren(this); + } + + @override + void visitParameter(Parameter node) { + _visitParameter?.call(node); + node.visitChildren(this); + } + + @override + void visitObjCMethod(ObjCMethod node) { + _visitObjCMethod?.call(node); + node.visitChildren(this); + } + + @override + void visitCppMethod(CppMethod node) { + _visitCppMethod?.call(node); + node.visitChildren(this); + } +} + +typedef FfiVisitor = Visitor; + +/// Root AST container holding all top-level declarations. +class PublicAst { + final List declarations; + + PublicAst(this.declarations); + + factory PublicAst.fromBindings(List bindings) { + final decls = []; + for (final b in bindings) { + final shadow = _wrapBinding(b); + if (shadow != null) decls.add(shadow); + } + return PublicAst(decls); + } + + static Decl? _wrapBinding(ast.Binding binding) { + return switch (binding) { + final ast.Struct s => Struct(s), + final ast.Union u => Union(u), + final ast.EnumClass e => EnumClass(e), + final ast.UnnamedEnumConstant c => UnnamedEnumConstant(c), + final ast.Func f => Func(f), + final ast.Global g => Global(g), + final ast.MacroConstant m => MacroConstant(m), + final ast.Typealias t => Typealias(t), + final ast.ObjCInterface i => ObjCInterface(i), + final ast.ObjCProtocol p => ObjCProtocol(p), + final ast.ObjCCategory c => ObjCCategory(c), + final ast.CppClass c => CppClass(c), + _ => null, + }; + } + + void accept(Visitor visitor) { + visitor.visitLibrary(this); + } + + void visitChildren(Visitor visitor) { + for (final decl in declarations) { + decl.accept(visitor); + } + } +} + +typedef FfiAst = PublicAst; + +/// Abstract base for all public AST nodes. +abstract class AstNode { + void accept(Visitor visitor); + void visitChildren(Visitor visitor) {} +} + +/// Top-level declaration public AST element. +abstract class Decl extends AstNode { + String get originalName; + String get name; + set name(String value); + String get usr; + + bool get isIncluded; + set isIncluded(bool value); +} + +class Struct extends Decl { + final ast.Struct _binding; + + Struct(this._binding); + + @override + String get originalName => _binding.originalName; + + @override + String get usr => _binding.usr; + + @override + String get name => _binding.symbol.oldName; + + @override + set name(String value) => _binding.symbol.oldName = value; + + @override + bool get isIncluded => _binding.userDefinedIsIncluded ?? true; + + @override + set isIncluded(bool value) => _binding.userDefinedIsIncluded = value; + + int? get pack => _binding.pack; + set pack(int? value) => _binding.pack = value; + + CompoundDependencies get dependencies => _binding.dependencies; + set dependencies(CompoundDependencies value) => _binding.dependencies = value; + + List get fields => _binding.members.map(Field.new).toList(); + + @override + void accept(Visitor visitor) => visitor.visitStruct(this); + + @override + void visitChildren(Visitor visitor) { + for (final field in fields) { + field.accept(visitor); + } + } +} + +class Union implements Decl { + final ast.Union _binding; + + Union(this._binding); + + @override + String get originalName => _binding.originalName; + + @override + String get usr => _binding.usr; + + @override + String get name => _binding.symbol.oldName; + + @override + set name(String value) => _binding.symbol.oldName = value; + + @override + bool get isIncluded => _binding.userDefinedIsIncluded ?? true; + + @override + set isIncluded(bool value) => _binding.userDefinedIsIncluded = value; + + CompoundDependencies get dependencies => _binding.dependencies; + set dependencies(CompoundDependencies value) => _binding.dependencies = value; + + List get fields => _binding.members.map(Field.new).toList(); + + @override + void accept(Visitor visitor) => visitor.visitUnion(this); + + @override + void visitChildren(Visitor visitor) { + for (final field in fields) { + field.accept(visitor); + } + } +} + +class EnumClass implements Decl { + final ast.EnumClass _binding; + + EnumClass(this._binding); + + @override + String get originalName => _binding.originalName; + + @override + String get usr => _binding.usr; + + @override + String get name => _binding.symbol.oldName; + + @override + set name(String value) => _binding.symbol.oldName = value; + + @override + bool get isIncluded => _binding.userDefinedIsIncluded ?? true; + + @override + set isIncluded(bool value) => _binding.userDefinedIsIncluded = value; + + EnumStyle? get style => _binding.style; + set style(EnumStyle? value) => _binding.style = value; + + bool get silenceWarning => _binding.silenceWarning; + set silenceWarning(bool value) => _binding.silenceWarning = value; + + List get constants => + _binding.enumConstants.map(EnumConstant.new).toList(); + + @override + void accept(Visitor visitor) => visitor.visitEnum(this); + + @override + void visitChildren(Visitor visitor) { + for (final constant in constants) { + constant.accept(visitor); + } + } +} + +class UnnamedEnumConstant extends Decl { + final ast.UnnamedEnumConstant _binding; + + UnnamedEnumConstant(this._binding); + + @override + String get originalName => + _binding.originalName.isNotEmpty ? _binding.originalName : _binding.name; + + @override + String get usr => _binding.usr; + + @override + String get name => _binding.symbol.oldName; + + @override + set name(String value) => _binding.symbol.oldName = value; + + @override + bool get isIncluded => _binding.userDefinedIsIncluded ?? true; + + @override + set isIncluded(bool value) => _binding.userDefinedIsIncluded = value; + + @override + void accept(Visitor visitor) => visitor.visitUnnamedEnumConstant(this); +} + +class Func extends Decl { + final ast.Func _binding; + + Func(this._binding); + + @override + String get originalName => _binding.originalName; + + @override + String get usr => _binding.usr; + + @override + String get name => _binding.symbol.oldName; + + @override + set name(String value) { + _binding.symbol.oldName = value; + _binding.funcVarSymbol.oldName = '_$value'; + } + + @override + bool get isIncluded => _binding.userDefinedIsIncluded ?? true; + + @override + set isIncluded(bool value) => _binding.userDefinedIsIncluded = value; + + bool get exposeSymbolAddress => _binding.exposeSymbolAddress; + set exposeSymbolAddress(bool value) => _binding.exposeSymbolAddress = value; + + bool get exposeFunctionTypedefs => _binding.exposeFunctionTypedefs; + set exposeFunctionTypedefs(bool value) => + _binding.exposeFunctionTypedefs = value; + + bool get isLeaf => _binding.isLeaf; + set isLeaf(bool value) => _binding.isLeaf = value; + + bool get recordUse => _binding.recordUse; + set recordUse(bool value) => _binding.recordUse = value; + + bool get isVariadic => _binding.isVariadic; + + List get varArgs => _binding.varArgs; + set varArgs(List value) => _binding.varArgs = value; + + List get parameters => + _binding.functionType.parameters.map(Parameter.new).toList(); + + @override + void accept(Visitor visitor) => visitor.visitFunc(this); + + @override + void visitChildren(Visitor visitor) { + for (final param in parameters) { + param.accept(visitor); + } + } +} + +class Global extends Decl { + final ast.Global _binding; + + Global(this._binding); + + @override + String get originalName => _binding.originalName; + + @override + String get usr => _binding.usr; + + @override + String get name => _binding.symbol.oldName; + + @override + set name(String value) => _binding.symbol.oldName = value; + + @override + bool get isIncluded => _binding.userDefinedIsIncluded ?? true; + + @override + set isIncluded(bool value) => _binding.userDefinedIsIncluded = value; + + bool get exposeSymbolAddress => _binding.exposeSymbolAddress; + set exposeSymbolAddress(bool value) => _binding.exposeSymbolAddress = value; + + @override + void accept(Visitor visitor) => visitor.visitGlobal(this); +} + +class MacroConstant extends Decl { + final ast.MacroConstant _binding; + + MacroConstant(this._binding); + + @override + String get originalName => + _binding.originalName.isNotEmpty ? _binding.originalName : _binding.name; + + @override + String get usr => _binding.usr; + + @override + String get name => _binding.symbol.oldName; + + @override + set name(String value) => _binding.symbol.oldName = value; + + @override + bool get isIncluded => _binding.userDefinedIsIncluded ?? true; + + @override + set isIncluded(bool value) => _binding.userDefinedIsIncluded = value; + + @override + void accept(Visitor visitor) => visitor.visitMacroConstant(this); +} + +class Typealias extends Decl { + final ast.Typealias _binding; + + Typealias(this._binding); + + @override + String get originalName => _binding.originalName; + + @override + String get usr => _binding.usr; + + @override + String get name => _binding.symbol.oldName; + + @override + set name(String value) => _binding.symbol.oldName = value; + + @override + bool get isIncluded => _binding.userDefinedIsIncluded ?? true; + + @override + set isIncluded(bool value) => _binding.userDefinedIsIncluded = value; + + bool get includeUnused => _binding.includeUnused; + set includeUnused(bool value) => _binding.includeUnused = value; + + @override + void accept(Visitor visitor) => visitor.visitTypealias(this); +} + +class ObjCInterface extends Decl { + final ast.ObjCInterface _binding; + + ObjCInterface(this._binding); + + @override + String get originalName => _binding.originalName; + + @override + String get usr => _binding.usr; + + @override + String get name => _binding.symbol.oldName; + + @override + set name(String value) => _binding.symbol.oldName = value; + + @override + bool get isIncluded => _binding.userDefinedIsIncluded ?? true; + + @override + set isIncluded(bool value) => _binding.userDefinedIsIncluded = value; + + String? get module => _binding.module; + set module(String? value) => _binding.module = value; + + bool get includeCategories => _binding.includeCategories; + set includeCategories(bool value) => _binding.includeCategories = value; + + bool get isObjCImport => _binding.isObjCImport; + + List get methods => _binding.methods.map(ObjCMethod.new).toList(); + + @override + void accept(Visitor visitor) => visitor.visitObjCInterface(this); + + @override + void visitChildren(Visitor visitor) { + for (final method in methods) { + method.accept(visitor); + } + } +} + +class ObjCProtocol extends Decl { + final ast.ObjCProtocol _binding; + + ObjCProtocol(this._binding); + + @override + String get originalName => _binding.originalName; + + @override + String get usr => _binding.usr; + + @override + String get name => _binding.symbol.oldName; + + @override + set name(String value) => _binding.symbol.oldName = value; + + @override + bool get isIncluded => _binding.userDefinedIsIncluded ?? true; + + @override + set isIncluded(bool value) => _binding.userDefinedIsIncluded = value; + + String? get module => _binding.module; + set module(String? value) => _binding.module = value; + + bool get isObjCImport => _binding.isObjCImport; + + List get methods => _binding.methods.map(ObjCMethod.new).toList(); + + @override + void accept(Visitor visitor) => visitor.visitObjCProtocol(this); + + @override + void visitChildren(Visitor visitor) { + for (final method in methods) { + method.accept(visitor); + } + } +} + +class ObjCCategory extends Decl { + final ast.ObjCCategory _binding; + + ObjCCategory(this._binding); + + @override + String get originalName => _binding.originalName; + + @override + String get usr => _binding.usr; + + @override + String get name => _binding.symbol.oldName; + + @override + set name(String value) => _binding.symbol.oldName = value; + + @override + bool get isIncluded => _binding.userDefinedIsIncluded ?? true; + + @override + set isIncluded(bool value) => _binding.userDefinedIsIncluded = value; + + bool get isObjCImport => _binding.isObjCImport; + + ObjCInterface get interface => ObjCInterface(_binding.parent); + + List get methods => _binding.methods.map(ObjCMethod.new).toList(); + + @override + void accept(Visitor visitor) => visitor.visitObjCCategory(this); + + @override + void visitChildren(Visitor visitor) { + for (final method in methods) { + method.accept(visitor); + } + } +} + +class CppClass extends Decl { + final ast.CppClass _binding; + + CppClass(this._binding); + + @override + String get originalName => _binding.originalName; + + @override + String get usr => _binding.usr; + + @override + String get name => _binding.symbol.oldName; + + @override + set name(String value) => _binding.symbol.oldName = value; + + @override + bool get isIncluded => _binding.userDefinedIsIncluded ?? true; + + @override + set isIncluded(bool value) => _binding.userDefinedIsIncluded = value; + + List get methods => _binding.methods.map(CppMethod.new).toList(); + + List get fields => _binding.fields.map(Field.new).toList(); + + @override + void accept(Visitor visitor) => visitor.visitCppClass(this); + + @override + void visitChildren(Visitor visitor) { + for (final method in methods) { + method.accept(visitor); + } + for (final field in fields) { + field.accept(visitor); + } + } +} + +/// Member elements +class Field extends AstNode { + final ast.CompoundMember _member; + + Field(this._member); + + String get originalName => _member.originalName; + + String get name => _member.symbol.oldName; + + set name(String value) => _member.symbol.oldName = value; + + bool get isIncluded => _member.userDefinedIsIncluded ?? true; + + set isIncluded(bool value) => _member.userDefinedIsIncluded = value; + + @override + void accept(Visitor visitor) => visitor.visitField(this); +} + +class EnumConstant extends AstNode { + final ast.EnumConstant _constant; + + EnumConstant(this._constant); + + String? get originalName => _constant.originalName; + + String get name => _constant.symbol.oldName; + + set name(String value) => _constant.symbol.oldName = value; + + int get value => _constant.value; + + bool get isIncluded => _constant.userDefinedIsIncluded ?? true; + + set isIncluded(bool value) => _constant.userDefinedIsIncluded = value; + + @override + void accept(Visitor visitor) => visitor.visitEnumConstant(this); +} + +class Parameter extends AstNode { + final ast.Parameter _param; + + Parameter(this._param); + + String get originalName => _param.originalName; + + String get name => _param.symbol.oldName; + + set name(String value) => _param.symbol.oldName = value; + + bool get isIncluded => _param.userDefinedIsIncluded ?? true; + + set isIncluded(bool value) => _param.userDefinedIsIncluded = value; + + @override + void accept(Visitor visitor) => visitor.visitParameter(this); +} + +class ObjCMethod extends AstNode { + final ast.ObjCMethod _method; + + ObjCMethod(this._method); + + String get originalName => _method.originalName; + + String get name => _method.symbol.oldName; + + set name(String value) { + _method.symbol.oldName = value; + if (_method.protocolMethodName != null) { + _method.protocolMethodName!.oldName = value; + } + } + + bool get isClassMethod => _method.isClassMethod; + + bool get isProperty => _method.isProperty; + + bool get isIncluded => _method.userDefinedIsIncluded ?? true; + + set isIncluded(bool value) => _method.userDefinedIsIncluded = value; + + List get parameters => _method.params.map(Parameter.new).toList(); + + @override + void accept(Visitor visitor) => visitor.visitObjCMethod(this); + + @override + void visitChildren(Visitor visitor) { + for (final param in parameters) { + param.accept(visitor); + } + } +} + +class CppMethod extends AstNode { + final ast.CppMethod _method; + + CppMethod(this._method); + + String get originalName => _method.originalName; + + String get name => _method.name.oldName; + + set name(String value) => _method.name.oldName = value; + + bool get isIncluded => _method.userDefinedIsIncluded ?? true; + + set isIncluded(bool value) => _method.userDefinedIsIncluded = value; + + @override + void accept(Visitor visitor) => visitor.visitCppMethod(this); +} + +/// Built-in Helper Visitors +class IncludeAllVisitor extends Visitor { + const IncludeAllVisitor(); + + @override + void visitStruct(Struct node) => node.isIncluded = true; + + @override + void visitUnion(Union node) => node.isIncluded = true; + + @override + void visitEnum(EnumClass node) => node.isIncluded = true; + + @override + void visitFunc(Func node) => node.isIncluded = true; + + @override + void visitGlobal(Global node) => node.isIncluded = true; + + @override + void visitMacroConstant(MacroConstant node) => node.isIncluded = true; + + @override + void visitTypealias(Typealias node) => node.isIncluded = true; + + @override + void visitObjCInterface(ObjCInterface node) => node.isIncluded = true; + + @override + void visitObjCProtocol(ObjCProtocol node) => node.isIncluded = true; + + @override + void visitObjCCategory(ObjCCategory node) => node.isIncluded = true; + + @override + void visitUnnamedEnumConstant(UnnamedEnumConstant node) => + node.isIncluded = true; + + @override + void visitCppClass(CppClass node) => node.isIncluded = true; +} + +class ExcludeAllVisitor extends Visitor { + const ExcludeAllVisitor(); + + @override + void visitStruct(Struct node) => node.isIncluded = false; + + @override + void visitUnion(Union node) => node.isIncluded = false; + + @override + void visitEnum(EnumClass node) => node.isIncluded = false; + + @override + void visitFunc(Func node) => node.isIncluded = false; + + @override + void visitGlobal(Global node) => node.isIncluded = false; + + @override + void visitMacroConstant(MacroConstant node) => node.isIncluded = false; + + @override + void visitTypealias(Typealias node) => node.isIncluded = false; + + @override + void visitObjCInterface(ObjCInterface node) => node.isIncluded = false; + + @override + void visitObjCProtocol(ObjCProtocol node) => node.isIncluded = false; + + @override + void visitObjCCategory(ObjCCategory node) => node.isIncluded = false; + + @override + void visitUnnamedEnumConstant(UnnamedEnumConstant node) => + node.isIncluded = false; + + @override + void visitCppClass(CppClass node) => node.isIncluded = false; +} + +class IncludeSetVisitor extends Visitor { + final Set? functions; + final Set? structs; + final Set? unions; + final Set? enums; + final Set? unnamedEnumConstants; + final Set? globals; + final Set? macros; + final Set? typedefs; + final Set? objcInterfaces; + final Set? objcProtocols; + final Set? objcCategories; + final Set? cppClasses; + + const IncludeSetVisitor({ + this.functions, + this.structs, + this.unions, + this.enums, + this.unnamedEnumConstants, + this.globals, + this.macros, + this.typedefs, + this.objcInterfaces, + this.objcProtocols, + this.objcCategories, + this.cppClasses, + }); + + void _check(Decl node, Set? set) { + if (set != null) { + node.isIncluded = set.contains(node.originalName); + } + } + + @override + void visitStruct(Struct node) => _check(node, structs); + @override + void visitUnion(Union node) => _check(node, unions); + @override + void visitEnum(EnumClass node) => _check(node, enums); + @override + void visitUnnamedEnumConstant(UnnamedEnumConstant node) => + _check(node, unnamedEnumConstants); + @override + void visitFunc(Func node) => _check(node, functions); + @override + void visitGlobal(Global node) => _check(node, globals); + @override + void visitMacroConstant(MacroConstant node) => _check(node, macros); + @override + void visitTypealias(Typealias node) => _check(node, typedefs); + @override + void visitObjCInterface(ObjCInterface node) => _check(node, objcInterfaces); + @override + void visitObjCProtocol(ObjCProtocol node) => _check(node, objcProtocols); + @override + void visitObjCCategory(ObjCCategory node) => _check(node, objcCategories); + @override + void visitCppClass(CppClass node) => _check(node, cppClasses); +} + +class RecordUseVisitor extends Visitor { + const RecordUseVisitor(); + + @override + void visitFunc(Func node) { + node.recordUse = true; + } +} + +class ExposeSymbolAddressVisitor extends Visitor { + const ExposeSymbolAddressVisitor(); + + @override + void visitFunc(Func node) { + node.exposeSymbolAddress = true; + } + + @override + void visitGlobal(Global node) { + node.exposeSymbolAddress = true; + } +} + +class RenameMapVisitor extends Visitor { + final Map renames; + + const RenameMapVisitor(this.renames); + + void _rename(Decl node) { + if (renames.containsKey(node.originalName)) { + node.name = renames[node.originalName]!; + } + } + + @override + void visitStruct(Struct node) => _rename(node); + @override + void visitUnion(Union node) => _rename(node); + @override + void visitEnum(EnumClass node) => _rename(node); + @override + void visitUnnamedEnumConstant(UnnamedEnumConstant node) => _rename(node); + @override + void visitFunc(Func node) => _rename(node); + @override + void visitGlobal(Global node) => _rename(node); + @override + void visitMacroConstant(MacroConstant node) => _rename(node); + @override + void visitTypealias(Typealias node) => _rename(node); + @override + void visitObjCInterface(ObjCInterface node) => _rename(node); + @override + void visitObjCProtocol(ObjCProtocol node) => _rename(node); + @override + void visitObjCCategory(ObjCCategory node) => _rename(node); + @override + void visitCppClass(CppClass node) => _rename(node); +} diff --git a/pkgs/ffigen/lib/src/config_provider/spec_utils.dart b/pkgs/ffigen/lib/src/config_provider/spec_utils.dart index 10963e3006..0c8de99b19 100644 --- a/pkgs/ffigen/lib/src/config_provider/spec_utils.dart +++ b/pkgs/ffigen/lib/src/config_provider/spec_utils.dart @@ -286,7 +286,7 @@ List compilerOptsExtractor(List value) { return list; } -YamlHeaders headersExtractor( +YamlInput inputExtractor( Logger logger, Map> yamlConfig, String? configFilename, @@ -322,7 +322,7 @@ YamlHeaders headersExtractor( } } } - return YamlHeaders( + return YamlInput( entryPoints: entryPoints, includeFilter: GlobHeaderFilter(includeGlobs: includeGlobs), ); diff --git a/pkgs/ffigen/lib/src/config_provider/yaml_config.dart b/pkgs/ffigen/lib/src/config_provider/yaml_config.dart index f63ee2ff22..4e3968b452 100644 --- a/pkgs/ffigen/lib/src/config_provider/yaml_config.dart +++ b/pkgs/ffigen/lib/src/config_provider/yaml_config.dart @@ -16,6 +16,7 @@ import '../strings.dart' as strings; import 'config.dart'; import 'config_spec.dart'; import 'config_types.dart'; +import 'public_ast.dart' as public_ast; import 'spec_utils.dart'; /// Provides configurations to other modules. @@ -49,13 +50,13 @@ final class YamlConfig { late Language _language; /// Path to headers. May not contain globs. - List get entryPoints => _headers.entryPoints; + List get entryPoints => _input.entryPoints; /// Whether to include a specific header. This exists in addition to /// [entryPoints] to allow filtering of transitively included headers. bool shouldIncludeHeader(Uri header) => - _headers.includeFilter.shouldInclude(header); - late YamlHeaders _headers; + _input.includeFilter.shouldInclude(header); + late YamlInput _input; /// CommandLine Arguments to pass to clang_compiler. List get compilerOpts => _compilerOpts; @@ -117,27 +118,6 @@ final class YamlConfig { bool get includeUnusedTypedefs => _includeUnusedTypedefs; late bool _includeUnusedTypedefs; - /// If enabled, Objective C interfaces that are not explicitly included by the - /// [YamlDeclarationFilters], but are transitively included by other bindings, - /// will be code-genned as if they were included. If disabled, these - /// transitively included interfaces will be generated as stubs instead. - bool get includeTransitiveObjCInterfaces => _includeTransitiveObjCInterfaces; - late bool _includeTransitiveObjCInterfaces; - - /// If enabled, Objective C protocols that are not explicitly included by the - /// [YamlDeclarationFilters], but are transitively included by other bindings, - /// will be code-genned as if they were included. If disabled, these - /// transitively included protocols will not be generated at all. - bool get includeTransitiveObjCProtocols => _includeTransitiveObjCProtocols; - late bool _includeTransitiveObjCProtocols; - - /// If enabled, Objective C categories that are not explicitly included by - /// the [YamlDeclarationFilters], but extend interfaces that are included, - /// will be code-genned as if they were included. If disabled, these - /// transitively included categories will not be generated at all. - bool get includeTransitiveObjCCategories => _includeTransitiveObjCCategories; - late bool _includeTransitiveObjCCategories; - /// Undocumented option that changes code generation for package:objective_c. /// The main difference is whether NSObject etc are imported from /// package:objective_c (the default) or code genned like any other class. @@ -150,10 +130,6 @@ final class YamlConfig { bool get sort => _sort; late bool _sort; - /// If typedef of supported types(int8_t) should be directly used. - bool get useSupportedTypedefs => _useSupportedTypedefs; - late bool _useSupportedTypedefs; - /// Stores all the library imports specified by user including those for ffi /// and pkg_ffi. Map get libraryImports => _libraryImports; @@ -165,8 +141,8 @@ final class YamlConfig { late Map _usrTypeMappings; /// Stores typedef name to ImportedType mappings specified by user. - Map get typedefTypeMappings => _typedefTypeMappings; - late Map _typedefTypeMappings; + List get typedefImports => _typedefImports; + late List _typedefImports; /// Stores struct name to ImportedType mappings specified by user. Map get structTypeMappings => _structTypeMappings; @@ -377,30 +353,26 @@ final class YamlConfig { HeterogeneousMapEntry( key: strings.headers, required: true, - valueConfigSpec: - HeterogeneousMapConfigSpec, YamlHeaders>( - entries: [ - HeterogeneousMapEntry( - key: strings.entryPoints, - valueConfigSpec: ListConfigSpec>( - childConfigSpec: StringConfigSpec(), - ), - required: true, - ), - HeterogeneousMapEntry( - key: strings.includeDirectives, - valueConfigSpec: ListConfigSpec>( - childConfigSpec: StringConfigSpec(), - ), - ), - ], - transform: (node) => headersExtractor( - logger, - node.value, - filename?.toFilePath(), + valueConfigSpec: HeterogeneousMapConfigSpec, YamlInput>( + entries: [ + HeterogeneousMapEntry( + key: strings.entryPoints, + valueConfigSpec: ListConfigSpec>( + childConfigSpec: StringConfigSpec(), ), - result: (node) => _headers = node.value, + required: true, ), + HeterogeneousMapEntry( + key: strings.includeDirectives, + valueConfigSpec: ListConfigSpec>( + childConfigSpec: StringConfigSpec(), + ), + ), + ], + transform: (node) => + inputExtractor(logger, node.value, filename?.toFilePath()), + result: (node) => _input = node.value, + ), ), HeterogeneousMapEntry( key: strings.ignoreSourceErrors, @@ -770,11 +742,11 @@ final class YamlConfig { ], result: (node) { final nodeValue = node.value as Map; - _typedefTypeMappings = makeImportTypeMapping( + _typedefImports = makeImportTypeMapping( (nodeValue[strings.typeMapTypedefs]) as Map>, _libraryImports, - ); + ).values.toList(); _structTypeMappings = makeImportTypeMapping( (nodeValue[strings.typeMapStructs]) as Map>, @@ -799,27 +771,6 @@ final class YamlConfig { resultOrDefault: (node) => _includeUnusedTypedefs = node.value as bool, ), - HeterogeneousMapEntry( - key: strings.includeTransitiveObjCInterfaces, - valueConfigSpec: BoolConfigSpec(), - defaultValue: (node) => false, - resultOrDefault: (node) => - _includeTransitiveObjCInterfaces = node.value as bool, - ), - HeterogeneousMapEntry( - key: strings.includeTransitiveObjCProtocols, - valueConfigSpec: BoolConfigSpec(), - defaultValue: (node) => false, - resultOrDefault: (node) => - _includeTransitiveObjCProtocols = node.value as bool, - ), - HeterogeneousMapEntry( - key: strings.includeTransitiveObjCCategories, - valueConfigSpec: BoolConfigSpec(), - defaultValue: (node) => true, - resultOrDefault: (node) => - _includeTransitiveObjCCategories = node.value as bool, - ), HeterogeneousMapEntry( key: strings.generateForPackageObjectiveC, valueConfigSpec: BoolConfigSpec(), @@ -833,12 +784,7 @@ final class YamlConfig { defaultValue: (node) => false, resultOrDefault: (node) => _sort = node.value as bool, ), - HeterogeneousMapEntry( - key: strings.useSupportedTypedefs, - valueConfigSpec: BoolConfigSpec(), - defaultValue: (node) => true, - resultOrDefault: (node) => _useSupportedTypedefs = node.value as bool, - ), + HeterogeneousMapEntry( key: strings.comments, valueConfigSpec: _commentConfigSpec(), @@ -1226,122 +1172,445 @@ final class YamlConfig { ); } - FfiGenerator configAdapter() => FfiGenerator( - headers: Headers( - compilerOptions: compilerOpts, - entryPoints: entryPoints, - include: shouldIncludeHeader, - ignoreSourceErrors: ignoreSourceErrors, - ), - output: Output( - dartFile: output, - objectiveCFile: outputObjC, - symbolFile: symbolFile, - commentType: commentType, - preamble: preamble, - format: formatOutput, - style: ffiNativeConfig.enabled - ? NativeExternalBindings(assetId: ffiNativeConfig.assetId) - : DynamicLibraryBindings( - wrapperName: wrapperName, - wrapperDocComment: wrapperDocComment, - ), - ), - functions: Functions( - include: functionDecl.shouldInclude, - includeSymbolAddress: functionDecl.shouldIncludeSymbolAddress, - rename: functionDecl.rename, - renameMember: functionDecl.renameMember, - varArgs: varArgFunctions, - includeTypedef: shouldExposeFunctionTypedef, - isLeaf: isLeafFunction, - ), - structs: Structs( - include: _structDecl.shouldInclude, - rename: _structDecl.rename, - renameMember: _structDecl.renameMember, - dependencies: _structDependencies, - packingOverride: (decl) => - _structPackingOverride.getOverridenPackValue(decl.originalName), + FfiGenerator configAdapter() { + final yamlVisitor = YamlConfigAstVisitor( + usrTypeMappings: _usrTypeMappings, + typedefImports: _typedefImports, + functionDecl: _functionDecl, + structDecl: _structDecl, + unionDecl: _unionDecl, + enumClassDecl: _enumClassDecl, + unnamedEnumConstants: _unnamedEnumConstants, + globals: _globals, + macroDecl: _macroDecl, + typedefs: _typedefs, + objcInterfaces: _objcInterfaces, + objcProtocols: _objcProtocols, + objcCategories: _objcCategories, + exposeFunctionTypedefs: _exposeFunctionTypedefs, + leafFunctions: _leafFunctions, + enumsAsInt: _enumsAsInt, + silenceEnumWarning: _silenceEnumWarning, + structPackingOverride: _structPackingOverride, + objcInterfaceModules: _objcInterfaceModules, + objcProtocolModules: _objcProtocolModules, + structDependencies: _structDependencies, + unionDependencies: _unionDependencies, + includeUnusedTypedefs: _includeUnusedTypedefs, + varArgFunctions: _varArgFunctions, + ); + + return FfiGenerator( + visitors: [yamlVisitor], + input: Input( + compilerOptions: compilerOpts, + entryPoints: entryPoints, + include: shouldIncludeHeader, + ignoreSourceErrors: ignoreSourceErrors, + ), + output: Output( + dartFile: output, + objectiveCFile: outputObjC, + symbolFile: symbolFile, + commentType: commentType, + preamble: preamble, + format: formatOutput, + style: ffiNativeConfig.enabled + ? NativeExternalBindings(assetId: ffiNativeConfig.assetId) + : DynamicLibraryBindings( + wrapperName: wrapperName, + wrapperDocComment: wrapperDocComment, + ), + ), + typedefImports: _typedefImports, + objectiveC: language == Language.objc + ? ObjectiveC( + externalVersions: externalVersions, + // ignore: deprecated_member_use_from_same_package + generateForPackageObjectiveC: generateForPackageObjectiveC, + ) + : null, // ignore: deprecated_member_use_from_same_package - imported: structTypeMappings.values.toList(), - ), - enums: Enums( - include: _enumClassDecl.shouldInclude, - rename: _enumClassDecl.rename, - renameMember: _enumClassDecl.renameMember, - silenceWarning: silenceEnumWarning, - style: (e, suggestedStyle) { - if (suggestedStyle != null) return suggestedStyle; - return switch (enumShouldBeInt(e)) { - true => EnumStyle.intConstants, - false => EnumStyle.dartEnum, - }; - }, - ), - unions: Unions( - include: _unionDecl.shouldInclude, - rename: _unionDecl.rename, - renameMember: _unionDecl.renameMember, - dependencies: _unionDependencies, + libraryImports: libraryImports.values.toList(), // ignore: deprecated_member_use_from_same_package - imported: unionTypeMappings.values.toList(), - ), - unnamedEnums: UnnamedEnums( - include: _unnamedEnumConstants.shouldInclude, - rename: _unnamedEnumConstants.rename, - ), - globals: Globals( - include: globals.shouldInclude, - includeSymbolAddress: globals.shouldIncludeSymbolAddress, - rename: globals.rename, - ), - macros: Macros(include: macroDecl.shouldInclude, rename: macroDecl.rename), - typedefs: Typedefs( - include: typedefs.shouldInclude, - rename: typedefs.rename, - useSupportedTypedefs: useSupportedTypedefs, - includeUnused: includeUnusedTypedefs, + importedTypesByUsr: usrTypeMappings, // ignore: deprecated_member_use_from_same_package - imported: typedefTypeMappings.values.toList(), - ), - objectiveC: language == Language.objc - ? ObjectiveC( - interfaces: Interfaces( - include: objcInterfaces.shouldInclude, - includeMember: objcInterfaces.shouldIncludeMember, - rename: objcInterfaces.rename, - renameMember: objcInterfaces.renameMember, - includeTransitive: includeTransitiveObjCInterfaces, - module: interfaceModule, - ), - protocols: Protocols( - include: objcProtocols.shouldInclude, - includeMember: objcProtocols.shouldIncludeMember, - rename: objcProtocols.rename, - renameMember: objcProtocols.renameMember, - includeTransitive: includeTransitiveObjCProtocols, - module: protocolModule, - ), - categories: Categories( - include: objcCategories.shouldInclude, - includeMember: objcCategories.shouldIncludeMember, - rename: objcCategories.rename, - renameMember: objcCategories.renameMember, - includeTransitive: includeTransitiveObjCCategories, - ), - externalVersions: externalVersions, - // ignore: deprecated_member_use_from_same_package - generateForPackageObjectiveC: generateForPackageObjectiveC, - ) - : null, - // ignore: deprecated_member_use_from_same_package - libraryImports: libraryImports.values.toList(), - // ignore: deprecated_member_use_from_same_package - importedTypesByUsr: usrTypeMappings, - // ignore: deprecated_member_use_from_same_package - integers: Integers(imported: nativeTypeMappings.values.toList()), - // ignore: deprecated_member_use_from_same_package - libclangDylib: libclangDylib, - ); + libclangDylib: libclangDylib, + ); + } +} + +final class YamlConfigAstVisitor extends public_ast.Visitor { + final Map _usrTypeMappings; + final List _typedefImports; + final YamlDeclarationFilters _functionDecl; + final YamlDeclarationFilters _structDecl; + final YamlDeclarationFilters _unionDecl; + final YamlDeclarationFilters _enumClassDecl; + final YamlDeclarationFilters _unnamedEnumConstants; + final YamlDeclarationFilters _globals; + final YamlDeclarationFilters _macroDecl; + final YamlDeclarationFilters _typedefs; + final YamlDeclarationFilters _objcInterfaces; + final YamlDeclarationFilters _objcProtocols; + final YamlDeclarationFilters _objcCategories; + final YamlIncluder _exposeFunctionTypedefs; + final YamlIncluder _leafFunctions; + final YamlIncluder _enumsAsInt; + final StructPackingOverride _structPackingOverride; + final ObjCModules _objcInterfaceModules; + final ObjCModules _objcProtocolModules; + final CompoundDependencies _structDependencies; + final CompoundDependencies _unionDependencies; + final bool _includeUnusedTypedefs; + final Map> _varArgFunctions; + + YamlConfigAstVisitor({ + required Map usrTypeMappings, + required List typedefImports, + required YamlDeclarationFilters functionDecl, + required YamlDeclarationFilters structDecl, + required YamlDeclarationFilters unionDecl, + required YamlDeclarationFilters enumClassDecl, + required YamlDeclarationFilters unnamedEnumConstants, + required YamlDeclarationFilters globals, + required YamlDeclarationFilters macroDecl, + required YamlDeclarationFilters typedefs, + required YamlDeclarationFilters objcInterfaces, + required YamlDeclarationFilters objcProtocols, + required YamlDeclarationFilters objcCategories, + required YamlIncluder exposeFunctionTypedefs, + required YamlIncluder leafFunctions, + required YamlIncluder enumsAsInt, + required bool silenceEnumWarning, + required StructPackingOverride structPackingOverride, + required ObjCModules objcInterfaceModules, + required ObjCModules objcProtocolModules, + required CompoundDependencies structDependencies, + required CompoundDependencies unionDependencies, + required bool includeUnusedTypedefs, + required Map> varArgFunctions, + }) : _usrTypeMappings = usrTypeMappings, + _typedefImports = typedefImports, + _functionDecl = functionDecl, + _structDecl = structDecl, + _unionDecl = unionDecl, + _enumClassDecl = enumClassDecl, + _unnamedEnumConstants = unnamedEnumConstants, + _globals = globals, + _macroDecl = macroDecl, + _typedefs = typedefs, + _objcInterfaces = objcInterfaces, + _objcProtocols = objcProtocols, + _objcCategories = objcCategories, + _exposeFunctionTypedefs = exposeFunctionTypedefs, + _leafFunctions = leafFunctions, + _enumsAsInt = enumsAsInt, + _silenceEnumWarning = silenceEnumWarning, + _structPackingOverride = structPackingOverride, + _objcInterfaceModules = objcInterfaceModules, + _objcProtocolModules = objcProtocolModules, + _structDependencies = structDependencies, + _unionDependencies = unionDependencies, + _includeUnusedTypedefs = includeUnusedTypedefs, + _varArgFunctions = varArgFunctions, + super(); + + final bool _silenceEnumWarning; + + void _applyInclusion(public_ast.Decl node, YamlDeclarationFilters decl) { + if (node is public_ast.ObjCInterface && node.isObjCImport) { + node.isIncluded = false; + } else if (_usrTypeMappings.containsKey(node.usr)) { + node.isIncluded = false; + } else { + node.isIncluded = decl.shouldInclude(node.originalName); + } + } + + @override + void visitStruct(public_ast.Struct node) { + node.dependencies = _structDependencies; + _applyInclusion(node, _structDecl); + final renamed = _structDecl.rename(node.originalName); + if (renamed != node.originalName) { + node.name = renamed; + } + final pack = _structPackingOverride.getOverridenPackValue( + node.originalName, + ); + if (pack != null) { + node.pack = pack.value; + } + for (final field in node.fields) { + if (!_structDecl.shouldIncludeMember( + node.originalName, + field.originalName, + )) { + field.isIncluded = false; + } else { + final fieldRenamed = _structDecl.renameMember( + node.originalName, + field.originalName, + ); + if (fieldRenamed != field.originalName) { + field.name = fieldRenamed; + } + } + } + } + + @override + void visitUnion(public_ast.Union node) { + node.dependencies = _unionDependencies; + _applyInclusion(node, _unionDecl); + final renamed = _unionDecl.rename(node.originalName); + if (renamed != node.originalName) { + node.name = renamed; + } + for (final field in node.fields) { + if (!_unionDecl.shouldIncludeMember( + node.originalName, + field.originalName, + )) { + field.isIncluded = false; + } else { + final fieldRenamed = _unionDecl.renameMember( + node.originalName, + field.originalName, + ); + if (fieldRenamed != field.originalName) { + field.name = fieldRenamed; + } + } + } + } + + @override + void visitEnum(public_ast.EnumClass node) { + if (node.originalName.isEmpty) return; + _applyInclusion(node, _enumClassDecl); + final renamed = _enumClassDecl.rename(node.originalName); + if (renamed != node.originalName) { + node.name = renamed; + } + if (_enumsAsInt.shouldInclude(node.originalName)) { + node.style = EnumStyle.intConstants; + } + if (_silenceEnumWarning) { + node.silenceWarning = true; + } + for (final constant in node.constants) { + if (constant.originalName != null && + !_enumClassDecl.shouldIncludeMember( + node.originalName, + constant.originalName!, + )) { + constant.isIncluded = false; + } else if (constant.originalName != null) { + final constantRenamed = _enumClassDecl.renameMember( + node.originalName, + constant.originalName!, + ); + if (constantRenamed != constant.originalName) { + constant.name = constantRenamed; + } + } + } + } + + @override + void visitUnnamedEnumConstant(public_ast.UnnamedEnumConstant node) { + _applyInclusion(node, _unnamedEnumConstants); + final renamed = _unnamedEnumConstants.rename(node.originalName); + if (renamed != node.originalName) { + node.name = renamed; + } + } + + @override + void visitFunc(public_ast.Func node) { + _applyInclusion(node, _functionDecl); + final renamed = _functionDecl.rename(node.originalName); + if (renamed != node.originalName) { + node.name = renamed; + } + if (_functionDecl.shouldIncludeSymbolAddress(node.originalName)) { + node.exposeSymbolAddress = true; + } + if (_exposeFunctionTypedefs.shouldInclude(node.originalName)) { + node.exposeFunctionTypedefs = true; + } + if (_leafFunctions.shouldInclude(node.originalName)) { + node.isLeaf = true; + } + final varArgs = _varArgFunctions[node.originalName]; + if (varArgs != null) { + node.varArgs = varArgs; + } + for (final p in node.parameters) { + final pRenamed = _functionDecl.renameMember( + node.originalName, + p.originalName, + ); + if (pRenamed != p.originalName) { + p.name = pRenamed; + } + } + } + + @override + void visitGlobal(public_ast.Global node) { + _applyInclusion(node, _globals); + final renamed = _globals.rename(node.originalName); + if (renamed != node.originalName) { + node.name = renamed; + } + if (_globals.shouldIncludeSymbolAddress(node.originalName)) { + node.exposeSymbolAddress = true; + } + } + + @override + void visitMacroConstant(public_ast.MacroConstant node) { + _applyInclusion(node, _macroDecl); + final renamed = _macroDecl.rename(node.originalName); + if (renamed != node.originalName) { + node.name = renamed; + } + } + + @override + void visitTypealias(public_ast.Typealias node) { + node.includeUnused = _includeUnusedTypedefs; + if (_typedefImports.any((t) => t.nativeType == node.originalName)) { + node.isIncluded = false; + } else { + _applyInclusion(node, _typedefs); + } + final renamed = _typedefs.rename(node.originalName); + if (renamed != node.originalName) { + node.name = renamed; + } + } + + @override + void visitObjCInterface(public_ast.ObjCInterface node) { + _applyInclusion(node, _objcInterfaces); + final renamed = _objcInterfaces.rename(node.originalName); + if (renamed != node.originalName) { + node.name = renamed; + } + final mod = _objcInterfaceModules.getModule(node.originalName); + if (mod != null) node.module = mod; + for (final method in node.methods) { + if (!_objcInterfaces.shouldIncludeMember( + node.originalName, + method.originalName, + )) { + method.isIncluded = false; + } else { + final methodRenamed = _objcInterfaces.renameMember( + node.originalName, + method.originalName, + ); + if (methodRenamed != method.originalName) { + _renameObjCMethod(method, methodRenamed); + } + } + } + } + + void _renameObjCMethod(public_ast.ObjCMethod method, String methodRenamed) { + final chunks = methodRenamed.split(':'); + if (chunks.length == method.parameters.length + 1 && + (chunks.length == 1 || chunks.last.isEmpty)) { + method.name = chunks.first; + for (var i = 1; i < method.parameters.length; i++) { + method.parameters[i].name = chunks[i]; + } + } else { + method.name = methodRenamed.replaceAll(':', '_'); + for (var i = 1; i < method.parameters.length; i++) { + method.parameters[i].name = method.parameters[i].originalName; + } + } + } + + @override + void visitObjCProtocol(public_ast.ObjCProtocol node) { + _applyInclusion(node, _objcProtocols); + final renamed = _objcProtocols.rename(node.originalName); + if (renamed != node.originalName) { + node.name = renamed; + } + final mod = _objcProtocolModules.getModule(node.originalName); + if (mod != null) node.module = mod; + for (final method in node.methods) { + if (!_objcProtocols.shouldIncludeMember( + node.originalName, + method.originalName, + )) { + method.isIncluded = false; + } else { + final methodRenamed = _objcProtocols.renameMember( + node.originalName, + method.originalName, + ); + if (methodRenamed != method.originalName) { + _renameObjCMethod(method, methodRenamed); + } + } + } + } + + @override + void visitObjCCategory(public_ast.ObjCCategory node) { + if (node.originalName.isEmpty) return; + final isParentInterfaceIncluded = + _objcInterfaces.isExplicitlyIncluded(node.interface.originalName) && + node.interface.includeCategories; + if (_objcCategories.isExplicitlyIncluded(node.originalName)) { + node.isIncluded = true; + } else if (_objcCategories.isExplicitlyExcluded(node.originalName)) { + node.isIncluded = false; + } else if (isParentInterfaceIncluded) { + // Category extends an explicitly included interface with + // includeCategories=true. + node.isIncluded = true; + } else if (_objcCategories.excludeAllByDefault) { + node.isIncluded = false; + } else { + node.isIncluded = true; + } + + final renamed = _objcCategories.rename(node.originalName); + if (renamed != node.originalName) { + node.name = renamed; + } + for (final method in node.methods) { + if (_objcCategories.isExplicitlyIncluded(node.originalName) || + isParentInterfaceIncluded) { + if (!_objcCategories.shouldIncludeMember( + node.originalName, + method.originalName, + )) { + method.isIncluded = false; + } else { + final methodRenamed = _objcCategories.renameMember( + node.originalName, + method.originalName, + ); + if (methodRenamed != method.originalName) { + _renameObjCMethod(method, methodRenamed); + } + } + } else if (_objcCategories.excludeAllByDefault) { + method.isIncluded = false; + } + } + } + + @override + void visitCppClass(public_ast.CppClass node) {} } diff --git a/pkgs/ffigen/lib/src/context.dart b/pkgs/ffigen/lib/src/context.dart index 241c3a00f5..93b9bbb043 100644 --- a/pkgs/ffigen/lib/src/context.dart +++ b/pkgs/ffigen/lib/src/context.dart @@ -28,7 +28,7 @@ class Context { final reportedCommentRanges = <((String, int), (String, int))>{}; final libs = LibraryImports(); late final compilerOpts = - config.headers.compilerOptions ?? defaultCompilerOpts(logger); + config.input.compilerOptions ?? defaultCompilerOpts(logger); final Scope rootScope = Scope.createRoot('root'); final Scope rootObjCScope = Scope.createRoot('objc_root'); late final ExtraSymbols extraSymbols; diff --git a/pkgs/ffigen/lib/src/header_parser/parser.dart b/pkgs/ffigen/lib/src/header_parser/parser.dart index 61db077b41..8fc0c5bff9 100644 --- a/pkgs/ffigen/lib/src/header_parser/parser.dart +++ b/pkgs/ffigen/lib/src/header_parser/parser.dart @@ -12,11 +12,12 @@ import 'package:meta/meta.dart'; import '../code_generator.dart'; import '../code_generator/scope.dart'; import '../config_provider.dart'; +import '../config_provider/public_ast.dart' as public_ast; import '../config_provider/utils.dart'; import '../context.dart'; import '../strings.dart' as strings; -import '../visitor/apply_config_filters.dart'; import '../visitor/ast.dart'; +import '../visitor/collect_included_bindings.dart'; import '../visitor/copy_methods_from_super_type.dart'; import '../visitor/create_scopes.dart'; import '../visitor/fill_method_dependencies.dart'; @@ -72,12 +73,12 @@ List parseToBindings(Context context) { final bindings = {}; // Log all headers for user. - context.logger.info('Input Headers: ${config.headers.entryPoints}'); + context.logger.info('Input Headers: ${config.input.entryPoints}'); final tuList = >[]; // Parse all translation units from entry points. - for (final headerLocationUri in config.headers.entryPoints) { + for (final headerLocationUri in config.input.entryPoints) { final headerLocation = headerLocationUri.toFilePath(); context.logger.fine('Creating TranslationUnit for header: $headerLocation'); @@ -114,7 +115,7 @@ List parseToBindings(Context context) { 'The compiler found warnings/errors in source files.', ); context.logger.warning('This will likely generate invalid bindings.'); - if (config.headers.ignoreSourceErrors) { + if (config.input.ignoreSourceErrors) { context.logger.warning( 'Ignored source errors. (User supplied --ignore-source-errors)', ); @@ -176,12 +177,35 @@ List transformBindings(List rawBindings, Context context) { visit(context, CopyMethodsFromSuperTypesVisitation(), allBindings); visit(context, FixOverriddenMethodsVisitation(context), allBindings); - final applyConfigFiltersVisitation = ApplyConfigFiltersVisitation(config); - visit(context, applyConfigFiltersVisitation, allBindings); - final directlyIncluded = applyConfigFiltersVisitation.directlyIncluded; - final included = directlyIncluded.union( - applyConfigFiltersVisitation.indirectlyIncluded, + // Execute Public AST visitors. + final allBindingsWithImports = allBindings.union( + rawBindings.where((b) => b.isObjCImport).toSet(), ); + final publicAst = public_ast.PublicAst.fromBindings( + allBindingsWithImports.toList(), + ); + for (final v in config.visitors) { + publicAst.accept(v); + } + + final expandedBindings = {}; + for (final binding in allBindingsWithImports) { + if (binding is Func && binding.isVariadic && binding.varArgs.isNotEmpty) { + expandedBindings.addAll(binding.expandVarArgs()); + } else { + expandedBindings.add(binding); + } + } + allBindingsWithImports.clear(); + allBindingsWithImports.addAll(expandedBindings); + allBindings.clear(); + allBindings.addAll(expandedBindings.where((b) => !b.isObjCImport)); + + final collectIncludedBindings = CollectIncludedBindingsVisitation(config); + visit(context, collectIncludedBindings, allBindingsWithImports); + final directlyIncluded = collectIncludedBindings.directlyIncluded; + final indirectlyIncluded = collectIncludedBindings.indirectlyIncluded; + final included = directlyIncluded.union(indirectlyIncluded); final byValueCompounds = visit( context, @@ -190,7 +214,7 @@ List transformBindings(List rawBindings, Context context) { ).byValueCompounds; visit( context, - ClearOpaqueCompoundMembersVisitation(config, byValueCompounds, included), + ClearOpaqueCompoundMembersVisitation(byValueCompounds, included), allBindings, ); @@ -208,12 +232,12 @@ List transformBindings(List rawBindings, Context context) { final semiFinalBindings = visit( context, ListBindingsVisitation(config, included, transitives, directTransitives), - included, + included.union(transitives).union(directTransitives), ).bindings; final finalBindings = visit( context, FillMethodDependenciesVisitation(context, semiFinalBindings), - semiFinalBindings, + semiFinalBindings.union(indirectlyIncluded), ).finalBindings; visit(context, MarkBindingsVisitation(finalBindings), allBindings); visit(context, MarkImportsVisitation(context), finalBindings); @@ -232,17 +256,6 @@ List transformBindings(List rawBindings, Context context) { _warnIfPrivateDeclaration(b, context.logger); } - // Override pack values according to config. We do this after declaration - // conflicts have been handled so that users can target the generated names. - for (final b in finalBindingsList) { - if (b is Struct) { - final pack = config.structs.packingOverride(b); - if (pack != null) { - b.pack = pack.value; - } - } - } - return finalBindingsList; } diff --git a/pkgs/ffigen/lib/src/header_parser/sub_parsers/classdecl_parser.dart b/pkgs/ffigen/lib/src/header_parser/sub_parsers/classdecl_parser.dart index 64d9f92041..fb9cbbb405 100644 --- a/pkgs/ffigen/lib/src/header_parser/sub_parsers/classdecl_parser.dart +++ b/pkgs/ffigen/lib/src/header_parser/sub_parsers/classdecl_parser.dart @@ -4,7 +4,6 @@ import '../../code_generator.dart'; import '../../code_generator/scope.dart'; -import '../../config_provider/config_types.dart'; import '../../context.dart'; import '../clang_bindings/clang_bindings.dart' as clang_types; import '../utils.dart'; @@ -17,8 +16,7 @@ CppClass? parseClassDeclaration(Context context, clang_types.CXCursor cursor) { final logger = context.logger; // If C++ support is not configured, skip all C++ class cursors immediately. - final cppClasses = config.cpp?.classes; - if (cppClasses == null) return null; + if (config.cpp == null) return null; final usr = cursor.usr(); @@ -47,8 +45,6 @@ CppClass? parseClassDeclaration(Context context, clang_types.CXCursor cursor) { return null; } - final decl = Declaration(usr: usr, originalName: className); - logger.fine( '++++ Adding C++ Class: Name: $className, ${cursor.completeStringRepr()}', ); @@ -58,9 +54,15 @@ CppClass? parseClassDeclaration(Context context, clang_types.CXCursor cursor) { cursor.visitChildren((child) { final kind = clang.clang_getCursorKind(child); if (kind == clang_types.CXCursorKind.CXCursor_CXXMethod) { - _parseAnyMethod(context, child, decl, methods, CppMethodKind.method); + _parseAnyMethod(context, child, className, methods, CppMethodKind.method); } else if (kind == clang_types.CXCursorKind.CXCursor_Constructor) { - _parseAnyMethod(context, child, decl, methods, CppMethodKind.constructor); + _parseAnyMethod( + context, + child, + className, + methods, + CppMethodKind.constructor, + ); } }); @@ -72,7 +74,7 @@ CppClass? parseClassDeclaration(Context context, clang_types.CXCursor cursor) { availability: apiAvailability.dartDoc, ), originalName: className, - name: cppClasses.rename(decl), + name: className, context: context, methods: methods, fields: [], @@ -86,7 +88,7 @@ CppClass? parseClassDeclaration(Context context, clang_types.CXCursor cursor) { void _parseAnyMethod( Context context, clang_types.CXCursor cursor, - Declaration classDecl, + String className, List methods, CppMethodKind kind, ) { @@ -99,7 +101,7 @@ void _parseAnyMethod( kind == CppMethodKind.method && clang.clang_CXXMethod_isConst(cursor) != 0; - final parameters = _parseParameters(context, cursor, classDecl); + final parameters = _parseParameters(context, cursor); if (parameters == null) { logger.fine( ' ---- Skipping method $methodName due to unsupported parameter type', @@ -107,7 +109,6 @@ void _parseAnyMethod( return; } - final className = context.config.cpp!.classes.rename(classDecl); final symbol = switch (kind) { CppMethodKind.constructor => '${className}_new', CppMethodKind.method => '${className}_$methodName', @@ -132,7 +133,6 @@ void _parseAnyMethod( List? _parseParameters( Context context, clang_types.CXCursor cursor, - Declaration classDecl, ) { final logger = context.logger; var i = 0; diff --git a/pkgs/ffigen/lib/src/header_parser/sub_parsers/compounddecl_parser.dart b/pkgs/ffigen/lib/src/header_parser/sub_parsers/compounddecl_parser.dart index 23e01f33b1..04cef10514 100644 --- a/pkgs/ffigen/lib/src/header_parser/sub_parsers/compounddecl_parser.dart +++ b/pkgs/ffigen/lib/src/header_parser/sub_parsers/compounddecl_parser.dart @@ -3,8 +3,6 @@ // BSD-style license that can be found in the LICENSE file. import '../../code_generator.dart'; -import '../../config_provider/config.dart'; -import '../../config_provider/config_types.dart'; import '../../context.dart'; import '../../strings.dart' as strings; import '../clang_bindings/clang_bindings.dart' as clang_types; @@ -14,22 +12,10 @@ import 'api_availability.dart'; Compound? parseStructDeclaration( clang_types.CXCursor cursor, Context context, -) => _parseCompoundDeclaration( - cursor, - context, - 'Struct', - context.config.structs, - Struct.new, -); +) => _parseCompoundDeclaration(cursor, context, 'Struct', Struct.new); Compound? parseUnionDeclaration(clang_types.CXCursor cursor, Context context) => - _parseCompoundDeclaration( - cursor, - context, - 'Union', - context.config.unions, - Union.new, - ); + _parseCompoundDeclaration(cursor, context, 'Union', Union.new); /// Holds temporary information regarding [compound] while parsing. class _ParsedCompound { @@ -71,9 +57,6 @@ class _ParsedCompound { return maxChildAlignment > alignment; } - Declarations get compoundConfig => - compound is Struct ? context.config.structs : context.config.unions; - /// Returns pack value of a struct depending on config, returns null for no /// packing. int? get packValue { @@ -98,7 +81,6 @@ Compound? _parseCompoundDeclaration( clang_types.CXCursor cursor, Context context, String className, - Declarations configDecl, Compound Function({ String? usr, String? originalName, @@ -136,7 +118,6 @@ Compound? _parseCompoundDeclaration( return null; } - final decl = Declaration(usr: usr, originalName: declName); final Compound compound; if (declName.isEmpty) { cursor = context.cursorIndex.getDefinition(cursor); @@ -160,7 +141,7 @@ Compound? _parseCompoundDeclaration( compound = constructor( usr: usr, originalName: declName, - name: configDecl.rename(decl), + name: declName, dartDoc: getCursorDocComment( context, cursor, @@ -271,11 +252,6 @@ void _compoundMembersVisitor( _ParsedCompound parsed, ) { final context = parsed.context; - final compoundConf = parsed.compoundConfig; - final decl = Declaration( - usr: parsed.compound.usr, - originalName: parsed.compound.originalName, - ); try { switch (cursor.kind) { case clang_types.CXCursorKind.CXCursor_FieldDecl: @@ -315,7 +291,7 @@ void _compoundMembersVisitor( indent: nesting.length + commentPrefix.length, ), originalName: cursor.spelling(), - name: compoundConf.renameMember(decl, cursor.spelling()), + name: cursor.spelling(), type: mt, ), ); @@ -350,7 +326,7 @@ void _compoundMembersVisitor( indent: nesting.length + commentPrefix.length, ), originalName: spelling, - name: compoundConf.renameMember(decl, spelling), + name: spelling, type: mt, ), ); diff --git a/pkgs/ffigen/lib/src/header_parser/sub_parsers/enumdecl_parser.dart b/pkgs/ffigen/lib/src/header_parser/sub_parsers/enumdecl_parser.dart index ffd58fa9c5..dc8a2a2fc6 100644 --- a/pkgs/ffigen/lib/src/header_parser/sub_parsers/enumdecl_parser.dart +++ b/pkgs/ffigen/lib/src/header_parser/sub_parsers/enumdecl_parser.dart @@ -4,7 +4,6 @@ import '../../code_generator.dart'; import '../../config_provider/config.dart'; -import '../../config_provider/config_types.dart'; import '../../context.dart'; import '../clang_bindings/clang_bindings.dart' as clang_types; import '../type_extractor/cxtypekindmap.dart'; @@ -14,7 +13,6 @@ import 'unnamed_enumdecl_parser.dart'; /// Parses an enum declaration. EnumClass parseEnumDeclaration(clang_types.CXCursor cursor, Context context) { - final config = context.config; final logger = context.logger; EnumClass? enumClass; // Parse the cursor definition instead, if this is a forward declaration. @@ -55,7 +53,6 @@ EnumClass parseEnumDeclaration(clang_types.CXCursor cursor, Context context) { .where((c) => c.rawValue.startsWith('-')) .isNotEmpty; } else { - final decl = Declaration(usr: usr, originalName: enumName); logger.fine('++++ Adding Enum: ${cursor.completeStringRepr()}'); enumClass = EnumClass( usr: usr, @@ -65,7 +62,7 @@ EnumClass parseEnumDeclaration(clang_types.CXCursor cursor, Context context) { availability: apiAvailability.dartDoc, ), originalName: enumName, - name: config.enums.rename(decl), + name: enumName, nativeType: nativeType, context: context, apiAvailability: apiAvailability, @@ -84,7 +81,7 @@ EnumClass parseEnumDeclaration(clang_types.CXCursor cursor, Context context) { indent: nesting.length + commentPrefix.length, ), originalName: child.spelling(), - name: config.enums.renameMember(decl, child.spelling()), + name: child.spelling(), value: enumIntValue, ), ); @@ -107,8 +104,9 @@ EnumClass parseEnumDeclaration(clang_types.CXCursor cursor, Context context) { rethrow; } }); - final suggestedStyle = isNSOptions ? EnumStyle.intConstants : null; - enumClass.style = config.enums.style(decl, suggestedStyle); + if (isNSOptions) { + enumClass.style = EnumStyle.intConstants; + } context.bindingsIndex.addEnumToSeen(usr, enumClass); } 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 6273de7be8..d382e3f862 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 @@ -4,9 +4,7 @@ import '../../code_generator.dart'; import '../../config_provider/config.dart'; -import '../../config_provider/config_types.dart'; import '../../context.dart'; -import '../../strings.dart'; import '../clang_bindings/clang_bindings.dart' as clang_types; import '../utils.dart'; import 'api_availability.dart'; @@ -32,7 +30,6 @@ List parseFunctionDeclaration( return funcs; } - final decl = Declaration(usr: funcUsr, originalName: funcName); final cachedFunc = context.bindingsIndex.getSeenFunc(funcUsr); if (cachedFunc != null) { funcs.add(cachedFunc); @@ -41,15 +38,8 @@ List parseFunctionDeclaration( final returnType = cursor.returnType().toCodeGenType(context); - final ( - :parameters, - :hasIncompleteStruct, - :hasUnimplementedType, - ) = parseParameters( - context, - cursor, - renameFn: (paramName) => config.functions.renameMember(decl, paramName), - ); + final (:parameters, :hasIncompleteStruct, :hasUnimplementedType) = + parseParameters(context, cursor); if (clang.clang_Cursor_isFunctionInlined(cursor) != 0 && clang.clang_Cursor_getStorageClass(cursor) != @@ -96,49 +86,30 @@ List parseFunctionDeclaration( clang_types.CXCursorKind.CXCursor_NSReturnsRetained, ); - // Initialized with a single value with no prefix and empty var args. - var varArgFunctions = [null]; - if (config.functions.varArgs.containsKey(funcName)) { - if (clang.clang_isFunctionTypeVariadic(cursor.type()) == 1) { - varArgFunctions = config.functions.varArgs[funcName]!; - } else { - logger.warning( - 'Skipping variadic-argument config for function ' - "'$funcName' since its not variadic.", - ); - } - } - for (final vaFunc in varArgFunctions) { - var usr = funcUsr; - if (vaFunc != null) usr += '$synthUsrChar vaFunc: ${vaFunc.postfix}'; - funcs.add( - Func( - dartDoc: getCursorDocComment( - context, - cursor, - indent: nesting.length + commentPrefix.length, - availability: apiAvailability.dartDoc, - ), - usr: usr, - name: config.functions.rename(decl) + (vaFunc?.postfix ?? ''), - originalName: funcName, - returnType: returnType, - parameters: parameters, - varArgParameters: [ - for (final ta in vaFunc?.types ?? const []) - Parameter(type: ta, name: 'va', objCConsumed: false), - ], - exposeSymbolAddress: config.functions.includeSymbolAddress(decl), - exposeFunctionTypedefs: config.functions.includeTypedef(decl), - isLeaf: config.functions.isLeaf(decl), - recordUse: config.functions.recordUse(decl), - objCReturnsRetained: objCReturnsRetained, - loadFromNativeAsset: config.output.style is NativeExternalBindings, - apiAvailability: apiAvailability, - ), - ); - } - context.bindingsIndex.addFuncToSeen(funcUsr, funcs.last); + final isVariadic = clang.clang_isFunctionTypeVariadic(cursor.type()) == 1; + final func = Func( + dartDoc: getCursorDocComment( + context, + cursor, + indent: nesting.length + commentPrefix.length, + availability: apiAvailability.dartDoc, + ), + usr: funcUsr, + name: funcName, + originalName: funcName, + returnType: returnType, + parameters: parameters, + exposeSymbolAddress: false, + exposeFunctionTypedefs: false, + isLeaf: false, + recordUse: false, + objCReturnsRetained: objCReturnsRetained, + loadFromNativeAsset: config.output.style is NativeExternalBindings, + apiAvailability: apiAvailability, + isVariadic: isVariadic, + ); + funcs.add(func); + context.bindingsIndex.addFuncToSeen(funcUsr, func); } return funcs; diff --git a/pkgs/ffigen/lib/src/header_parser/sub_parsers/macro_parser.dart b/pkgs/ffigen/lib/src/header_parser/sub_parsers/macro_parser.dart index bc93a75224..d9930d377b 100644 --- a/pkgs/ffigen/lib/src/header_parser/sub_parsers/macro_parser.dart +++ b/pkgs/ffigen/lib/src/header_parser/sub_parsers/macro_parser.dart @@ -10,7 +10,6 @@ import 'package:logging/logging.dart'; import 'package:path/path.dart' as p; import '../../code_generator.dart'; -import '../../config_provider/config_types.dart'; import '../../context.dart'; import '../clang_bindings/clang_bindings.dart' as clang_types; import '../utils.dart'; @@ -23,7 +22,6 @@ void saveMacroDefinition(Context context, clang_types.CXCursor cursor) { return; } final originalMacroName = cursor.spelling(); - final decl = Declaration(usr: macroUsr, originalName: originalMacroName); if (clang.clang_Cursor_isMacroBuiltin(cursor) == 0 && clang.clang_Cursor_isMacroFunctionLike(cursor) == 0) { // Parse macro only if it's not builtin or function-like. @@ -31,7 +29,7 @@ void saveMacroDefinition(Context context, clang_types.CXCursor cursor) { "++++ Saved Macro '$originalMacroName' for later : " '${cursor.completeStringRepr()}', ); - final prefixedName = context.config.macros.rename(decl); + final prefixedName = originalMacroName; bindingsIndex.addMacroToSeen(macroUsr, prefixedName); _saveMacro(prefixedName, macroUsr, originalMacroName, context); } @@ -196,7 +194,7 @@ File createFileForMacros(Context context) { // Write file contents. final sb = StringBuffer(); - for (final h in context.config.headers.entryPoints) { + for (final h in context.config.input.entryPoints) { final fullHeaderPath = File(h.toFilePath()).absolute.path; sb.writeln('#include "$fullHeaderPath"'); } diff --git a/pkgs/ffigen/lib/src/header_parser/sub_parsers/objccategorydecl_parser.dart b/pkgs/ffigen/lib/src/header_parser/sub_parsers/objccategorydecl_parser.dart index 2c44e46d83..667583456c 100644 --- a/pkgs/ffigen/lib/src/header_parser/sub_parsers/objccategorydecl_parser.dart +++ b/pkgs/ffigen/lib/src/header_parser/sub_parsers/objccategorydecl_parser.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 '../clang_bindings/clang_bindings.dart' as clang_types; import '../utils.dart'; @@ -15,8 +14,7 @@ ObjCCategory? parseObjCCategoryDeclaration( Context context, clang_types.CXCursor cursor, ) { - final objcCategories = context.config.objectiveC?.categories; - if (objcCategories == null) { + if (context.config.objectiveC == null) { return null; } @@ -24,8 +22,6 @@ ObjCCategory? parseObjCCategoryDeclaration( final usr = cursor.usr(); final name = cursor.spelling(); - final decl = Declaration(usr: usr, originalName: name); - final cachedCategory = context.bindingsIndex.getSeenObjCCategory(usr); if (cachedCategory != null) { return cachedCategory; @@ -62,7 +58,7 @@ ObjCCategory? parseObjCCategoryDeclaration( final category = ObjCCategory( usr: usr, originalName: name, - name: objcCategories.rename(decl), + name: name, parent: parentInterface, dartDoc: getCursorDocComment( context, @@ -85,20 +81,13 @@ ObjCCategory? parseObjCCategoryDeclaration( ); break; case clang_types.CXCursorKind.CXCursor_ObjCPropertyDecl: - final (getter, setter) = parseObjCProperty( - context, - child, - decl, - objcCategories, - ); + final (getter, setter) = parseObjCProperty(context, child, name); category.addMethod(getter); category.addMethod(setter); break; case clang_types.CXCursorKind.CXCursor_ObjCInstanceMethodDecl: case clang_types.CXCursorKind.CXCursor_ObjCClassMethodDecl: - category.addMethod( - parseObjCMethod(context, child, decl, objcCategories), - ); + category.addMethod(parseObjCMethod(context, child, name)); break; } }); diff --git a/pkgs/ffigen/lib/src/header_parser/sub_parsers/objcinterfacedecl_parser.dart b/pkgs/ffigen/lib/src/header_parser/sub_parsers/objcinterfacedecl_parser.dart index eac6bb5ca7..de1ae2c240 100644 --- a/pkgs/ffigen/lib/src/header_parser/sub_parsers/objcinterfacedecl_parser.dart +++ b/pkgs/ffigen/lib/src/header_parser/sub_parsers/objcinterfacedecl_parser.dart @@ -3,8 +3,6 @@ // BSD-style license that can be found in the LICENSE file. import '../../code_generator.dart'; -import '../../config_provider/config.dart'; -import '../../config_provider/config_types.dart'; import '../../context.dart'; import '../clang_bindings/clang_bindings.dart' as clang_types; import '../utils.dart'; @@ -21,12 +19,10 @@ Type? parseObjCInterfaceDeclaration( if (cachedItf != null) return cachedItf; final name = cursor.spelling(); - final decl = Declaration(usr: usr, originalName: name); final apiAvailability = ApiAvailability.fromCursor(cursor, context); final config = context.config; - final objcInterfaces = config.objectiveC?.interfaces; - if (objcInterfaces == null) { + if (config.objectiveC == null) { return null; } @@ -39,8 +35,8 @@ Type? parseObjCInterfaceDeclaration( context: context, usr: usr, originalName: name, - name: objcInterfaces.rename(decl), - module: objcInterfaces.module(decl), + name: name, + module: null, dartDoc: getCursorDocComment( context, cursor, @@ -67,14 +63,11 @@ void fillObjCInterfaceMethodsIfNeeded( if (itf.filled) return; itf.filled = true; // Break cycles. - final objcInterfaces = context.config.objectiveC!.interfaces; - context.logger.fine( '++++ Filling ObjC interface: ' 'Name: ${itf.originalName}, ${cursor.completeStringRepr()}', ); - final itfDecl = Declaration(usr: itf.usr, originalName: itf.originalName); cursor.visitChildren((child) { switch (child.kind) { case clang_types.CXCursorKind.CXCursor_ObjCSuperClassRef: @@ -88,15 +81,14 @@ void fillObjCInterfaceMethodsIfNeeded( final (getter, setter) = parseObjCProperty( context, child, - itfDecl, - objcInterfaces, + itf.originalName, ); itf.addMethod(getter); itf.addMethod(setter); break; case clang_types.CXCursorKind.CXCursor_ObjCInstanceMethodDecl: case clang_types.CXCursorKind.CXCursor_ObjCClassMethodDecl: - itf.addMethod(parseObjCMethod(context, child, itfDecl, objcInterfaces)); + itf.addMethod(parseObjCMethod(context, child, itf.originalName)); break; } }); @@ -143,8 +135,7 @@ void _parseSuperType( (ObjCMethod?, ObjCMethod?) parseObjCProperty( Context context, clang_types.CXCursor cursor, - Declaration decl, - Declarations filters, + String declName, ) { final fieldName = cursor.spelling(); final fieldType = cursor.type().toCodeGenType(context); @@ -153,7 +144,7 @@ void _parseSuperType( if (fieldType.isIncompleteCompound) { context.logger.warning( - 'Property "$fieldName" in instance "${decl.originalName}" ' + 'Property "$fieldName" in instance "$declName" ' 'has incomplete type: $fieldType.', ); return (null, null); @@ -190,7 +181,7 @@ void _parseSuperType( final getter = ObjCMethod( context: context, originalName: getterName, - name: filters.renameMember(decl, getterName), + name: getterName, dartDoc: dartDoc ?? getterName, kind: ObjCMethodKind.propertyGetter, isClassMethod: isClassMethod, @@ -231,8 +222,7 @@ void _parseSuperType( ObjCMethod? parseObjCMethod( Context context, clang_types.CXCursor cursor, - Declaration itfDecl, - Declarations filters, + String declName, ) { final logger = context.logger; final methodName = cursor.spelling(); @@ -245,7 +235,7 @@ ObjCMethod? parseObjCMethod( if (returnType.isIncompleteCompound) { logger.warning( 'Method "$methodName" in instance ' - '"${itfDecl.originalName}" has incomplete ' + '"$declName" has incomplete ' 'return type: $returnType.', ); return null; @@ -266,12 +256,7 @@ ObjCMethod? parseObjCMethod( cursor.visitChildren((child) { switch (child.kind) { case clang_types.CXCursorKind.CXCursor_ParmDecl: - final p = _parseMethodParam( - context, - child, - itfDecl.originalName, - methodName, - ); + final p = _parseMethodParam(context, child, declName, methodName); if (p == null) { hasError = true; } else { @@ -298,7 +283,7 @@ ObjCMethod? parseObjCMethod( return ObjCMethod( context: context, originalName: methodName, - name: filters.renameMember(itfDecl, methodName), + name: methodName, dartDoc: getCursorDocComment( context, cursor, diff --git a/pkgs/ffigen/lib/src/header_parser/sub_parsers/objcprotocoldecl_parser.dart b/pkgs/ffigen/lib/src/header_parser/sub_parsers/objcprotocoldecl_parser.dart index b5c1f22c33..6c9a1a72b0 100644 --- a/pkgs/ffigen/lib/src/header_parser/sub_parsers/objcprotocoldecl_parser.dart +++ b/pkgs/ffigen/lib/src/header_parser/sub_parsers/objcprotocoldecl_parser.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 '../clang_bindings/clang_bindings.dart' as clang_types; import '../utils.dart'; @@ -21,16 +20,13 @@ ObjCProtocol? parseObjCProtocolDeclaration( return null; } - final objcProtocols = config.objectiveC?.protocols; - if (objcProtocols == null) { + if (config.objectiveC == null) { return null; } final usr = cursor.usr(); final name = cursor.spelling(); - final decl = Declaration(usr: usr, originalName: name); - final cachedProtocol = bindingsIndex.getSeenObjCProtocol(usr); if (cachedProtocol != null) { return cachedProtocol; @@ -63,8 +59,8 @@ ObjCProtocol? parseObjCProtocolDeclaration( context: context, usr: usr, originalName: name, - name: objcProtocols.rename(decl), - module: objcProtocols.module(decl), + name: name, + module: null, dartDoc: getCursorDocComment( context, cursor, @@ -91,20 +87,13 @@ ObjCProtocol? parseObjCProtocolDeclaration( } break; case clang_types.CXCursorKind.CXCursor_ObjCPropertyDecl: - final (getter, setter) = parseObjCProperty( - context, - child, - decl, - objcProtocols, - ); + final (getter, setter) = parseObjCProperty(context, child, name); protocol.addMethod(getter); protocol.addMethod(setter); break; case clang_types.CXCursorKind.CXCursor_ObjCInstanceMethodDecl: case clang_types.CXCursorKind.CXCursor_ObjCClassMethodDecl: - protocol.addMethod( - parseObjCMethod(context, child, decl, objcProtocols), - ); + protocol.addMethod(parseObjCMethod(context, child, name)); break; } }); diff --git a/pkgs/ffigen/lib/src/header_parser/sub_parsers/typedefdecl_parser.dart b/pkgs/ffigen/lib/src/header_parser/sub_parsers/typedefdecl_parser.dart index 5b6c40693b..52c8591f31 100644 --- a/pkgs/ffigen/lib/src/header_parser/sub_parsers/typedefdecl_parser.dart +++ b/pkgs/ffigen/lib/src/header_parser/sub_parsers/typedefdecl_parser.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 '../clang_bindings/clang_bindings.dart' as clang_types; import '../type_extractor/extractor.dart'; @@ -30,7 +29,6 @@ Typealias parseTypedefDeclaration( clang_types.CXCursor cursor, ) { final logger = context.logger; - final config = context.config; final bindingsIndex = context.bindingsIndex; final name = cursor.spelling(); final usr = cursor.usr(); @@ -38,7 +36,6 @@ Typealias parseTypedefDeclaration( final cachedType = bindingsIndex.getSeenTypealias(usr); if (cachedType != null) return cachedType; - final decl = Declaration(usr: usr, originalName: name); final ct = clang.clang_getTypedefDeclUnderlyingType(cursor); final s = getCodeGenType(context, ct, originalCursor: cursor); @@ -78,7 +75,7 @@ Typealias parseTypedefDeclaration( final type = Typealias( usr: usr, originalName: name, - name: config.typedefs.rename(decl), + name: name, type: s, dartDoc: getCursorDocComment(context, cursor), ); diff --git a/pkgs/ffigen/lib/src/header_parser/sub_parsers/unnamed_enumdecl_parser.dart b/pkgs/ffigen/lib/src/header_parser/sub_parsers/unnamed_enumdecl_parser.dart index 87c6269edb..2dec4a9965 100644 --- a/pkgs/ffigen/lib/src/header_parser/sub_parsers/unnamed_enumdecl_parser.dart +++ b/pkgs/ffigen/lib/src/header_parser/sub_parsers/unnamed_enumdecl_parser.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 '../clang_bindings/clang_bindings.dart' as clang_types; import '../utils.dart'; @@ -46,7 +45,6 @@ Constant? _addUnNamedEnumConstant( clang_types.CXCursor cursor, ) { final logger = context.logger; - final config = context.config; final bindingsIndex = context.bindingsIndex; final usr = cursor.usr(); @@ -68,9 +66,7 @@ Constant? _addUnNamedEnumConstant( final constant = UnnamedEnumConstant( usr: usr, originalName: cursor.spelling(), - name: config.unnamedEnums.rename( - Declaration(usr: cursor.usr(), originalName: cursor.spelling()), - ), + name: cursor.spelling(), dartDoc: apiAvailability.dartDoc, rawType: 'int', rawValue: clang.clang_getEnumConstantDeclValue(cursor).toString(), 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 6bd83d10ba..8743a12cfb 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 @@ -4,7 +4,6 @@ import '../../code_generator.dart'; import '../../config_provider/config.dart'; -import '../../config_provider/config_types.dart'; import '../../context.dart'; import '../clang_bindings/clang_bindings.dart' as clang_types; import '../utils.dart'; @@ -25,23 +24,19 @@ Binding? parseVarDeclaration(Context context, clang_types.CXCursor cursor) { return bindingsIndex.getSeenVariableConstant(usr); } - final decl = Declaration(usr: usr, originalName: name); final cType = cursor.type(); - // Try to evaluate as a constant first, - // unless the config asks for the variable's address. - if (cType.isConstQualified && !config.globals.includeSymbolAddress(decl)) { + Constant? constantValue; + if (cType.isConstQualified) { final evalResult = clang.clang_Cursor_Evaluate(cursor); final evalKind = clang.clang_EvalResult_getKind(evalResult); - Constant? constant; - switch (evalKind) { case clang_types.CXEvalResultKind.CXEval_Int: final value = clang.clang_EvalResult_getAsLongLong(evalResult); - constant = Constant( + constantValue = Constant( usr: usr, originalName: name, - name: config.globals.rename(decl), + name: name, dartDoc: getCursorDocComment(context, cursor), rawType: 'int', rawValue: value.toString(), @@ -49,10 +44,10 @@ Binding? parseVarDeclaration(Context context, clang_types.CXCursor cursor) { break; case clang_types.CXEvalResultKind.CXEval_Float: final value = clang.clang_EvalResult_getAsDouble(evalResult); - constant = Constant( + constantValue = Constant( usr: usr, originalName: name, - name: config.globals.rename(decl), + name: name, dartDoc: getCursorDocComment(context, cursor), rawType: 'double', rawValue: writeDoubleAsString(value), @@ -61,10 +56,10 @@ Binding? parseVarDeclaration(Context context, clang_types.CXCursor cursor) { case clang_types.CXEvalResultKind.CXEval_StrLiteral: final value = clang.clang_EvalResult_getAsStr(evalResult); final rawValue = getWrittenStringRepresentation(name, value, context); - constant = Constant( + constantValue = Constant( usr: usr, originalName: name, - name: config.globals.rename(decl), + name: name, dartDoc: getCursorDocComment(context, cursor), rawType: 'String', rawValue: "'$rawValue'", @@ -72,14 +67,6 @@ Binding? parseVarDeclaration(Context context, clang_types.CXCursor cursor) { break; } clang.clang_EvalResult_dispose(evalResult); - - if (constant != null) { - logger.fine( - '++++ Adding Constant from Global: ${cursor.completeStringRepr()}', - ); - bindingsIndex.addVariableConstantToSeen(usr, constant); - return constant; - } } logger.fine('++++ Adding Global: ${cursor.completeStringRepr()}'); @@ -101,12 +88,13 @@ Binding? parseVarDeclaration(Context context, clang_types.CXCursor cursor) { final global = Global( originalName: name, - name: config.globals.rename(decl), + name: name, usr: usr, type: type, dartDoc: getCursorDocComment(context, cursor), - exposeSymbolAddress: config.globals.includeSymbolAddress(decl), + exposeSymbolAddress: false, constant: cType.isConstQualified, + constantValue: constantValue, loadFromNativeAsset: nativeOutputStyle, ); bindingsIndex.addGlobalVarToSeen(usr, global); diff --git a/pkgs/ffigen/lib/src/header_parser/translation_unit_parser.dart b/pkgs/ffigen/lib/src/header_parser/translation_unit_parser.dart index 8d4022f31d..36534af6e0 100644 --- a/pkgs/ffigen/lib/src/header_parser/translation_unit_parser.dart +++ b/pkgs/ffigen/lib/src/header_parser/translation_unit_parser.dart @@ -26,7 +26,7 @@ Set parseTranslationUnit( translationUnitCursor.visitChildren((cursor) { final file = cursor.sourceFileName(); if (file.isEmpty) return; - if (headers[file] ??= context.config.headers.include(Uri.file(file))) { + if (headers[file] ??= context.config.input.include(Uri.file(file))) { try { logger.finest('rootCursorVisitor: ${cursor.completeStringRepr()}'); switch (clang.clang_getCursorKind(cursor)) { diff --git a/pkgs/ffigen/lib/src/header_parser/type_extractor/extractor.dart b/pkgs/ffigen/lib/src/header_parser/type_extractor/extractor.dart index 60762f7516..749b3b3499 100644 --- a/pkgs/ffigen/lib/src/header_parser/type_extractor/extractor.dart +++ b/pkgs/ffigen/lib/src/header_parser/type_extractor/extractor.dart @@ -149,10 +149,7 @@ Type getCodeGenType( if (typeSpellKey.startsWith('const ')) { typeSpellKey = typeSpellKey.replaceFirst('const ', ''); } - if (context.config.importedIntegers.containsKey(typeSpellKey)) { - context.logger.fine(' Type $typeSpellKey mapped from type-map.'); - return context.config.importedIntegers[typeSpellKey]!; - } else if (cxTypeKindToImportedTypes.containsKey(typeSpellKey)) { + if (cxTypeKindToImportedTypes.containsKey(typeSpellKey)) { return cxTypeKindToImportedTypes[typeSpellKey]!; } else { context.logger.fine( @@ -185,20 +182,20 @@ Type? _createTypeFromCursor( // those two types are ABI compatible, so just return bool regardless. return BooleanType(); } - if (config.typedefTypeMappings.containsKey(spelling)) { - logger.fine(' Type $spelling mapped from type-map'); - return config.typedefTypeMappings[spelling]!; - } - // Get name from supported typedef name if config allows. - if (config.typedefs.useSupportedTypedefs) { - if (suportedTypedefToSuportedNativeType.containsKey(spelling)) { - logger.fine(' Type Mapped from supported typedef'); - return NativeType(suportedTypedefToSuportedNativeType[spelling]!); - } else if (supportedTypedefToImportedType.containsKey(spelling)) { - logger.fine(' Type Mapped from supported typedef'); - return supportedTypedefToImportedType[spelling]!; + for (final importedType in config.typedefImports) { + if (importedType.nativeType == spelling) { + logger.fine(' Type Mapped from custom typedefTypeMappings'); + return importedType; } } + // Get name from supported typedef name. + if (suportedTypedefToSuportedNativeType.containsKey(spelling)) { + logger.fine(' Type Mapped from supported typedef'); + return NativeType(suportedTypedefToSuportedNativeType[spelling]!); + } else if (supportedTypedefToImportedType.containsKey(spelling)) { + logger.fine(' Type Mapped from supported typedef'); + return supportedTypedefToImportedType[spelling]!; + } final typealias = parseTypedefDeclaration(context, cursor); @@ -246,13 +243,11 @@ Type? _extractfromRecord( clang_types.CXCursor cursor, ) { final logger = context.logger; - final config = context.config; logger.fine('${_padding}_extractfromRecord: ${cursor.completeStringRepr()}'); - final declSpelling = cursor.spelling(); final cursorKind = clang.clang_getCursorKind(cursor); - if (config.cpp?.classes != null) { + if (context.config.cpp != null) { final seenCppClass = context.bindingsIndex.getSeenCppClass(cursor.usr()); if (seenCppClass != null) { return seenCppClass; @@ -267,16 +262,8 @@ Type? _extractfromRecord( } if (cursorKind == clang_types.CXCursorKind.CXCursor_StructDecl) { - if (config.structTypeMappings.containsKey(declSpelling)) { - logger.fine(' Type Mapped from type-map'); - return config.structTypeMappings[declSpelling]!; - } return parseStructDeclaration(cursor, context); } else if (cursorKind == clang_types.CXCursorKind.CXCursor_UnionDecl) { - if (config.unionTypeMappings.containsKey(declSpelling)) { - logger.fine(' Type Mapped from type-map'); - return config.unionTypeMappings[declSpelling]!; - } return parseUnionDeclaration(cursor, context); } diff --git a/pkgs/ffigen/lib/src/strings.dart b/pkgs/ffigen/lib/src/strings.dart index 8258f7a1a8..d865c1718e 100644 --- a/pkgs/ffigen/lib/src/strings.dart +++ b/pkgs/ffigen/lib/src/strings.dart @@ -83,9 +83,6 @@ const objcCategories = 'objc-categories'; const excludeAllByDefault = 'exclude-all-by-default'; const includeUnusedTypedefs = 'include-unused-typedefs'; -const includeTransitiveObjCInterfaces = 'include-transitive-objc-interfaces'; -const includeTransitiveObjCProtocols = 'include-transitive-objc-protocols'; -const includeTransitiveObjCCategories = 'include-transitive-objc-categories'; const generateForPackageObjectiveC = 'generate-for-package-objective-c'; // Sub-fields of Declarations. @@ -211,7 +208,6 @@ const supportedNativeTypeMappings = { // Boolean flags. const sort = 'sort'; -const useSupportedTypedefs = 'use-supported-typedefs'; const silenceEnumWarning = 'silence-enum-warning'; const ignoreSourceErrors = 'ignore-source-errors'; diff --git a/pkgs/ffigen/lib/src/visitor/apply_config_filters.dart b/pkgs/ffigen/lib/src/visitor/apply_config_filters.dart deleted file mode 100644 index d9f34e25bc..0000000000 --- a/pkgs/ffigen/lib/src/visitor/apply_config_filters.dart +++ /dev/null @@ -1,122 +0,0 @@ -// 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 '../code_generator.dart'; -import '../config_provider/config.dart' show Config, Declarations; - -import 'ast.dart'; - -class ApplyConfigFiltersVisitation extends Visitation { - final Config config; - final directlyIncluded = {}; - final indirectlyIncluded = {}; - ApplyConfigFiltersVisitation(this.config); - - void _visitImpl(Binding node, Declarations filters) { - node.visitChildren(visitor); - if (node.originalName == '') return; - if (config.importedTypesByUsr.containsKey(node.usr)) return; - if (filters.include(node)) directlyIncluded.add(node); - } - - @override - void visitStruct(Struct node) => _visitImpl(node, config.structs); - - @override - void visitUnion(Union node) => _visitImpl(node, config.unions); - - @override - void visitEnumClass(EnumClass node) { - if (node.isAnonymous) return; - _visitImpl(node, config.enums); - } - - @override - void visitCppClass(CppClass node) { - final cppClasses = config.cpp?.classes; - if (cppClasses == null) return; - _visitImpl(node, cppClasses); - } - - @override - void visitFunc(Func node) => _visitImpl(node, config.functions); - - @override - void visitMacroConstant(MacroConstant node) => - _visitImpl(node, config.macros); - - @override - void visitObjCInterface(ObjCInterface node) { - if (node.unavailable) return; - final objcInterfaces = config.objectiveC?.interfaces; - if (objcInterfaces == null) return; - - if (!node.isInternal) { - node.filterMethods( - (m) => - !m.unavailable && - objcInterfaces.includeMember(node, m.originalName), - ); - } - _visitImpl(node, objcInterfaces); - - // If this node is included, include all its super types. - if (directlyIncluded.contains(node)) { - for (ObjCInterface? t = node; t != null; t = t.superType) { - if (!indirectlyIncluded.add(t)) break; - } - } - } - - @override - void visitObjCCategory(ObjCCategory node) { - final objcCategories = config.objectiveC?.categories; - if (objcCategories == null) return; - node.filterMethods((m) { - if (m.unavailable) return false; - if (node.shouldCopyMethodToInterface(m)) return false; - return objcCategories.includeMember(node, m.originalName); - }); - _visitImpl(node, objcCategories); - } - - @override - void visitObjCProtocol(ObjCProtocol node) { - if (node.unavailable) return; - final objcProtocols = config.objectiveC?.protocols; - if (objcProtocols == null) return; - - node.filterMethods((m) { - // TODO(https://github.com/dart-lang/native/issues/1149): Support class - // methods on protocols if there's a use case. For now filter them. We - // filter here instead of during parsing so that these methods are still - // copied to any interfaces that implement the protocol. - if (m.unavailable) return false; - if (m.isClassMethod) return false; - - return objcProtocols.includeMember(node, m.originalName); - }); - _visitImpl(node, objcProtocols); - } - - @override - void visitUnnamedEnumConstant(UnnamedEnumConstant node) => - _visitImpl(node, config.unnamedEnums); - - @override - void visitGlobal(Global node) => _visitImpl(node, config.globals); - - @override - void visitConstant(Constant node) { - // MacroConstant and UnnamedEnumConstant have their own overrides, so this - // only applies to base Constants (e.g. from static const variables). - _visitImpl(node, config.globals); - } - - @override - void visitTypealias(Typealias node) { - if (node.isAnonymous) return; - _visitImpl(node, config.typedefs); - } -} diff --git a/pkgs/ffigen/lib/src/visitor/collect_included_bindings.dart b/pkgs/ffigen/lib/src/visitor/collect_included_bindings.dart new file mode 100644 index 0000000000..7b3e776328 --- /dev/null +++ b/pkgs/ffigen/lib/src/visitor/collect_included_bindings.dart @@ -0,0 +1,85 @@ +// 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 '../code_generator.dart'; +import '../config_provider/config.dart' show Config; + +import 'ast.dart'; + +class CollectIncludedBindingsVisitation extends Visitation { + final Config config; + final directlyIncluded = {}; + final indirectlyIncluded = {}; + CollectIncludedBindingsVisitation(this.config); + + @override + void visitBinding(Binding node) { + if (node.originalName.isEmpty) return; + if (node.userDefinedIsIncluded == false) return; + if (node.userDefinedIsIncluded == true) { + directlyIncluded.add(node); + } + if (node.isObjCImport && + !(config.objectiveC?.generateForPackageObjectiveC ?? false)) { + return; + } + node.visitChildren(visitor); + } + + @override + void visitEnumClass(EnumClass node) { + if (node.isAnonymous) return; + visitBinding(node); + } + + @override + void visitObjCInterface(ObjCInterface node) { + if (node.unavailable) return; + + if (!node.isInternal) { + node.filterMethods( + (m) => m.userDefinedIsIncluded != false && !m.unavailable, + ); + } + visitBinding(node); + + // If this node is included, include all its super types. + if (directlyIncluded.contains(node)) { + for (ObjCInterface? t = node; t != null; t = t.superType) { + if (t.isObjCImport) break; + if (!indirectlyIncluded.add(t)) break; + } + } + } + + @override + void visitObjCCategory(ObjCCategory node) { + node.filterMethods( + (m) => + m.userDefinedIsIncluded != false && + !m.unavailable && + !node.shouldCopyMethodToInterface(m), + ); + visitBinding(node); + } + + @override + void visitObjCProtocol(ObjCProtocol node) { + if (node.unavailable) return; + + node.filterMethods( + (m) => + m.userDefinedIsIncluded != false && + !m.unavailable && + !m.isClassMethod, + ); + visitBinding(node); + } + + @override + void visitTypealias(Typealias node) { + if (node.isAnonymous) return; + visitBinding(node); + } +} diff --git a/pkgs/ffigen/lib/src/visitor/fill_method_dependencies.dart b/pkgs/ffigen/lib/src/visitor/fill_method_dependencies.dart index 1fcbb7436a..e71936dad5 100644 --- a/pkgs/ffigen/lib/src/visitor/fill_method_dependencies.dart +++ b/pkgs/ffigen/lib/src/visitor/fill_method_dependencies.dart @@ -30,6 +30,7 @@ class FillMethodDependenciesVisitation extends Visitation { if (!finalBindings.contains(node)) return; if (!node.generateAsStub) { + node.fillClassObject(); node.visitChildren(visitor); _adder.visit(node.classObject); for (final method in node.methods) { @@ -43,6 +44,10 @@ class FillMethodDependenciesVisitation extends Visitation { if (!finalBindings.contains(node)) return; node.visitChildren(visitor); + if (node.methods.any((m) => m.isClassMethod)) { + node.parent.fillClassObject(); + _adder.visit(node.parent.classObject); + } for (final method in node.methods) { _adder.visit(method.fillMsgSend()); } @@ -53,7 +58,9 @@ class FillMethodDependenciesVisitation extends Visitation { if (!finalBindings.contains(node)) return; if (!node.generateAsStub) { + node.fillProtocolObject(); node.visitChildren(visitor); + _adder.visit(node.protocolPointer); for (final method in node.methods) { final blk = method.fillProtocolBlock(); _adder.visit(blk); @@ -105,6 +112,7 @@ class _MethodDepAdderVisitation extends Visitation { finalBindings.add(node); node.visitChildren(visitor); } + if (!node.isObjCImport) finalBindings.add(node); } @override diff --git a/pkgs/ffigen/lib/src/visitor/find_transitive_deps.dart b/pkgs/ffigen/lib/src/visitor/find_transitive_deps.dart index e251850ea5..aa39a378ca 100644 --- a/pkgs/ffigen/lib/src/visitor/find_transitive_deps.dart +++ b/pkgs/ffigen/lib/src/visitor/find_transitive_deps.dart @@ -17,16 +17,33 @@ class FindTransitiveDepsVisitation extends Visitation { transitives.add(node); } + @override + void visitObjCInterface(ObjCInterface node) { + if (node.isObjCImport) return; + transitives.add(node); + } + + @override + void visitObjCProtocol(ObjCProtocol node) { + if (node.isObjCImport) return; + transitives.add(node); + } + @override void visitEnumClass(EnumClass node) { - if (node.isAnonymous) return; - visitBinding(node); + node.visitChildren(visitor); + if (!node.isAnonymous) { + transitives.add(node); + } } @override void visitTypealias(Typealias node) { - if (node.isAnonymous) return; - visitBinding(node); + if (node.isAnonymous) { + node.visitChildren(visitor); + } else { + transitives.add(node); + } } } @@ -52,7 +69,7 @@ class FindDirectTransitiveDepsVisitation extends Visitation { @override void visitObjCInterface(ObjCInterface node) { - _visitImpl(node, config.objectiveC?.interfaces.includeTransitive ?? false); + _visitImpl(node, false); // Always visit the super type, regardless of whether the node is directly // included. This ensures that super types of stubs are also stubs, rather @@ -62,16 +79,17 @@ class FindDirectTransitiveDepsVisitation extends Visitation { // Similarly, always visit the protocols. visitor.visitAll(node.protocols); - // Visit the categories of built-in interfaces that have been explicitly - // included. https://github.com/dart-lang/native/issues/1820 - if (node.isObjCImport && directIncludes.contains(node)) { + // Visit categories of interfaces if includeCategories is true. + if (node.includeCategories && + (includes.contains(node) || + (node.isObjCImport && directIncludes.contains(node)))) { visitor.visitAll(node.categories); } } @override void visitObjCCategory(ObjCCategory node) { - _visitImpl(node, config.objectiveC?.categories.includeTransitive ?? false); + _visitImpl(node, node.parent.includeCategories); // Same as visitObjCInterface's visit of superType. visitor.visit(node.parent); @@ -79,7 +97,7 @@ class FindDirectTransitiveDepsVisitation extends Visitation { @override void visitObjCProtocol(ObjCProtocol node) { - _visitImpl(node, config.objectiveC?.protocols.includeTransitive ?? false); + _visitImpl(node, false); // Same as visitObjCInterface's visit of superType. visitor.visitAll(node.superProtocols); diff --git a/pkgs/ffigen/lib/src/visitor/list_bindings.dart b/pkgs/ffigen/lib/src/visitor/list_bindings.dart index ab07d88893..e0c309f92f 100644 --- a/pkgs/ffigen/lib/src/visitor/list_bindings.dart +++ b/pkgs/ffigen/lib/src/visitor/list_bindings.dart @@ -68,14 +68,12 @@ class ListBindingsVisitation extends Visitation { final _IncludeBehavior includeBehavior; if (node.isInternal) { includeBehavior = _IncludeBehavior.transitive; - } else if (config.objectiveC?.interfaces.includeTransitive ?? false) { - includeBehavior = _IncludeBehavior.configOrTransitive; } else { includeBehavior = _IncludeBehavior.configOnly; } final omit = node.unavailable || !_visitImpl(node, includeBehavior); - if (omit && directTransitives.contains(node)) { + if (omit && !node.isObjCImport && directTransitives.contains(node)) { node.generateAsStub = true; bindings.add(node); @@ -84,7 +82,7 @@ class ListBindingsVisitation extends Visitation { visitor.visitAll(node.protocols); } - if (includes.contains(node)) { + if (node.includeCategories && includes.contains(node)) { // Always visit the categories of explicitly included interfaces, even if // they're built-in types: https://github.com/dart-lang/native/issues/1820 visitor.visitAll(node.categories); @@ -92,25 +90,20 @@ class ListBindingsVisitation extends Visitation { } @override - void visitObjCCategory(ObjCCategory node) => _visitImpl( - node, - config.objectiveC?.categories.includeTransitive ?? false + void visitObjCCategory(ObjCCategory node) { + final parentIncluded = includes.contains(node.parent); + final behavior = node.parent.includeCategories && parentIncluded ? _IncludeBehavior.configOrDirectTransitive - : _IncludeBehavior.configOnly, - ); + : _IncludeBehavior.configOnly; + _visitImpl(node, behavior); + } @override void visitObjCProtocol(ObjCProtocol node) { final omit = - node.unavailable || - !_visitImpl( - node, - config.objectiveC?.protocols.includeTransitive ?? false - ? _IncludeBehavior.configOrTransitive - : _IncludeBehavior.configOnly, - ); - - if (omit && directTransitives.contains(node)) { + node.unavailable || !_visitImpl(node, _IncludeBehavior.configOnly); + + if (omit && !node.isObjCImport && directTransitives.contains(node)) { node.generateAsStub = true; bindings.add(node); @@ -119,11 +112,19 @@ class ListBindingsVisitation extends Visitation { } } + @override + void visitStruct(Struct node) => + _visitImpl(node, _IncludeBehavior.configOrDirectTransitive); + + @override + void visitUnion(Union node) => + _visitImpl(node, _IncludeBehavior.configOrDirectTransitive); + @override void visitTypealias(Typealias node) { _visitImpl( node, - config.typedefs.includeUnused + node.includeUnused ? _IncludeBehavior.configOnly : _IncludeBehavior.configAndTransitive, ); @@ -140,6 +141,10 @@ class ListBindingsVisitation extends Visitation { node.visitChildren(visitor); } } + + @override + void visitObjCBlock(ObjCBlock node) => + _visitImpl(node, _IncludeBehavior.configOrDirectTransitive); } class MarkBindingsVisitation extends Visitation { diff --git a/pkgs/ffigen/lib/src/visitor/opaque_compounds.dart b/pkgs/ffigen/lib/src/visitor/opaque_compounds.dart index 7fa06bbabb..262597a262 100644 --- a/pkgs/ffigen/lib/src/visitor/opaque_compounds.dart +++ b/pkgs/ffigen/lib/src/visitor/opaque_compounds.dart @@ -3,7 +3,6 @@ // BSD-style license that can be found in the LICENSE file. import '../code_generator.dart'; -import '../config_provider/config.dart' show Config; import '../config_provider/config_types.dart' show CompoundDependencies; import 'ast.dart'; @@ -36,31 +35,20 @@ class FindByValueCompoundsVisitation extends Visitation { } class ClearOpaqueCompoundMembersVisitation extends Visitation { - final Config config; final Set byValueCompounds; final Set included; - ClearOpaqueCompoundMembersVisitation( - this.config, - this.byValueCompounds, - this.included, - ); + ClearOpaqueCompoundMembersVisitation(this.byValueCompounds, this.included); - void _visitImpl(Compound node, CompoundDependencies compondDepsConfig) { + @override + void visitCompound(Compound node) { // If a compound isn't referred to by value, isn't explicitly included by // the config filters, and the config is using opaque deps, convert the // compound to be opaque by deleting its members. if (!byValueCompounds.contains(node) && !included.contains(node) && - compondDepsConfig == CompoundDependencies.opaque) { + node.dependencies == CompoundDependencies.opaque) { node.members.clear(); } } - - @override - void visitStruct(Struct node) => - _visitImpl(node, config.structs.dependencies); - - @override - void visitUnion(Union node) => _visitImpl(node, config.unions.dependencies); } diff --git a/pkgs/ffigen/pubspec.yaml b/pkgs/ffigen/pubspec.yaml index abbf0ad2b8..1ec0febcc1 100644 --- a/pkgs/ffigen/pubspec.yaml +++ b/pkgs/ffigen/pubspec.yaml @@ -39,6 +39,7 @@ dependencies: yaml_edit: ^2.0.3 dev_dependencies: + analyzer: ^8.1.1 async: ^2.11.0 dart_flutter_team_lints: ^3.5.2 json_schema: ^5.1.1 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 af37007f67..96931032aa 100644 --- a/pkgs/ffigen/test/code_generator_tests/code_generator_test.dart +++ b/pkgs/ffigen/test/code_generator_tests/code_generator_test.dart @@ -20,20 +20,13 @@ void main() { Context makeContext({Output? output}) => testContext( FfiGenerator( + visitors: const [IncludeAllVisitor()], output: output ?? Output( dartFile: Uri.file('unused'), style: const DynamicLibraryBindings(wrapperName: 'Bindings'), ), - enums: Enums.includeAll, - functions: Functions.includeAll, - globals: Globals.includeAll, - macros: Macros.includeAll, - structs: Structs.includeAll, - typedefs: Typedefs.includeAll, - unions: Unions.includeAll, - unnamedEnums: UnnamedEnums.includeAll, ), ); @@ -403,6 +396,7 @@ void main() { context: context, name: 'MyIntegerEnum', style: EnumStyle.intConstants, + silenceWarning: true, enumConstants: [ EnumConstant(name: 'int1', value: 1), EnumConstant(name: 'int2', value: 2), @@ -412,7 +406,6 @@ void main() { final library = Library( context: context, header: '$licenseHeader\n', - silenceEnumWarning: true, bindings: transformBindings([ enum1, enum2, @@ -450,6 +443,7 @@ void main() { context: context, name: 'Enum2', style: EnumStyle.intConstants, + silenceWarning: true, enumConstants: [ EnumConstant(name: 'value1', value: 0), EnumConstant(name: 'value2', value: 1), @@ -496,7 +490,6 @@ void main() { final lib = Library( context: context, header: '$licenseHeader\n', - silenceEnumWarning: true, bindings: transformBindings([ enum1, enum2, diff --git a/pkgs/ffigen/test/collision_tests/decl_decl_collision_test.dart b/pkgs/ffigen/test/collision_tests/decl_decl_collision_test.dart index 852edbee05..feb68b1d88 100644 --- a/pkgs/ffigen/test/collision_tests/decl_decl_collision_test.dart +++ b/pkgs/ffigen/test/collision_tests/decl_decl_collision_test.dart @@ -13,16 +13,11 @@ void main() { test('declaration conflict', () { final context = testContext( FfiGenerator( + visitors: const [IncludeAllVisitor()], output: Output( dartFile: Uri.file('unused'), style: const DynamicLibraryBindings(wrapperName: 'Bindings'), ), - functions: Functions.includeAll, - structs: Structs.includeAll, - enums: Enums.includeAll, - globals: Globals.includeAll, - macros: Macros.includeAll, - typedefs: Typedefs.includeAll, ), ); final library = Library( diff --git a/pkgs/ffigen/test/collision_tests/decl_symbol_address_collision_test.dart b/pkgs/ffigen/test/collision_tests/decl_symbol_address_collision_test.dart index fce49fd9c5..f6f4cefbdd 100644 --- a/pkgs/ffigen/test/collision_tests/decl_symbol_address_collision_test.dart +++ b/pkgs/ffigen/test/collision_tests/decl_symbol_address_collision_test.dart @@ -15,16 +15,11 @@ void main() { setUpAll(() { final context = testContext( FfiGenerator( + visitors: const [IncludeAllVisitor()], output: Output( dartFile: Uri.file('unused'), style: const DynamicLibraryBindings(wrapperName: 'Bindings'), ), - functions: Functions.includeAll, - structs: Structs.includeAll, - enums: Enums.includeAll, - globals: Globals.includeAll, - macros: Macros.includeAll, - typedefs: Typedefs.includeAll, ), ); actual = Library( diff --git a/pkgs/ffigen/test/collision_tests/reserved_keyword_collision_test.dart b/pkgs/ffigen/test/collision_tests/reserved_keyword_collision_test.dart index cc5e3a8195..fd643bee8c 100644 --- a/pkgs/ffigen/test/collision_tests/reserved_keyword_collision_test.dart +++ b/pkgs/ffigen/test/collision_tests/reserved_keyword_collision_test.dart @@ -21,7 +21,7 @@ void main() { style: const DynamicLibraryBindings(), ), - headers: Headers( + input: Input( entryPoints: [ Uri.file( path.join( @@ -33,15 +33,12 @@ void main() { ), ], ), - structs: Structs.includeAll, - unions: Unions.includeAll, - enums: Enums.includeAll, - functions: Functions.includeAll, - globals: Globals.includeAll, - typedefs: Typedefs( - include: (Declaration decl) => true, - includeUnused: true, - ), + visitors: [ + const IncludeAllVisitor(), + Visitor.callback( + visitTypealias: (node) => node.includeUnused = true, + ), + ], ), ), ); diff --git a/pkgs/ffigen/test/config_tests/compiler_opts_test.dart b/pkgs/ffigen/test/config_tests/compiler_opts_test.dart index d844f95412..8559faba45 100644 --- a/pkgs/ffigen/test/config_tests/compiler_opts_test.dart +++ b/pkgs/ffigen/test/config_tests/compiler_opts_test.dart @@ -37,7 +37,7 @@ ${strings.compilerOptsAuto}: ${strings.includeCStdLib}: false '''); expect( - config.headers.compilerOptions, + config.input.compilerOptions, equals([if (Platform.isMacOS) '-Wno-nullability-completeness']), ); }); diff --git a/pkgs/ffigen/test/example_tests/libclang_example_test.dart b/pkgs/ffigen/test/example_tests/libclang_example_test.dart index 22dd0a0c0e..6396f06945 100644 --- a/pkgs/ffigen/test/example_tests/libclang_example_test.dart +++ b/pkgs/ffigen/test/example_tests/libclang_example_test.dart @@ -28,7 +28,7 @@ void main() { // compiler options. It can't use absolute paths because it's checked in // yaml code. To support concurrent tests, we can't set Directory.current. // As a workaround, add an extra '-I' option that uses the absolute path. - generator.headers.compilerOptions!.add( + generator.input.compilerOptions!.add( '-I${path.join(packagePathForTests, 'third_party/libclang/include')}', ); diff --git a/pkgs/ffigen/test/header_parser_tests/expected_bindings/_expected_dart_handle_bindings.dart b/pkgs/ffigen/test/header_parser_tests/expected_bindings/_expected_dart_handle_bindings.dart index f7947f5dff..5f5df1f17f 100644 --- a/pkgs/ffigen/test/header_parser_tests/expected_bindings/_expected_dart_handle_bindings.dart +++ b/pkgs/ffigen/test/header_parser_tests/expected_bindings/_expected_dart_handle_bindings.dart @@ -71,6 +71,5 @@ final class Struct2 extends ffi.Struct { }) => $allocator()..ref.h = h; } -typedef Typedef1 = ffi.Pointer>; -typedef Typedef1Function = ffi.Void Function(ffi.Handle); -typedef DartTypedef1Function = void Function(Object); +typedef Typedef1 = + ffi.Pointer>; diff --git a/pkgs/ffigen/test/header_parser_tests/expected_bindings/_expected_native_func_typedef_bindings.dart b/pkgs/ffigen/test/header_parser_tests/expected_bindings/_expected_native_func_typedef_bindings.dart index 52c3240100..eb0ed55bf9 100644 --- a/pkgs/ffigen/test/header_parser_tests/expected_bindings/_expected_native_func_typedef_bindings.dart +++ b/pkgs/ffigen/test/header_parser_tests/expected_bindings/_expected_native_func_typedef_bindings.dart @@ -71,10 +71,7 @@ class NativeLibrary { .asFunction(); } -typedef InsideReturnType = - ffi.Pointer>; -typedef InsideReturnTypeFunction = ffi.Void Function(); -typedef DartInsideReturnTypeFunction = void Function(); +typedef InsideReturnType = ffi.Pointer>; final class Struct extends ffi.Struct { external ffi.Pointer< @@ -108,10 +105,6 @@ final class Struct2 extends ffi.Struct { }) => $allocator()..ref.constFuncPointer = constFuncPointer; } -typedef VoidFuncPointer = - ffi.Pointer>; -typedef VoidFuncPointerFunction = ffi.Void Function(); -typedef DartVoidFuncPointerFunction = void Function(); +typedef VoidFuncPointer = ffi.Pointer>; typedef WithTypedefReturnType = - ffi.Pointer>; -typedef WithTypedefReturnTypeFunction = InsideReturnType Function(); + ffi.Pointer>; diff --git a/pkgs/ffigen/test/header_parser_tests/expected_bindings/_expected_struct_fptr_fields_bindings.dart b/pkgs/ffigen/test/header_parser_tests/expected_bindings/_expected_struct_fptr_fields_bindings.dart index 550cfc43c9..5608b359c1 100644 --- a/pkgs/ffigen/test/header_parser_tests/expected_bindings/_expected_struct_fptr_fields_bindings.dart +++ b/pkgs/ffigen/test/header_parser_tests/expected_bindings/_expected_struct_fptr_fields_bindings.dart @@ -5,9 +5,7 @@ import 'dart:ffi' as ffi; typedef ArithmeticOperation = - ffi.Pointer>; -typedef ArithmeticOperationFunction = ffi.Int Function(ffi.Int a, ffi.Int b); -typedef DartArithmeticOperationFunction = int Function(int a, int b); + ffi.Pointer>; final class S extends ffi.Struct { external ffi.Pointer> func1; diff --git a/pkgs/ffigen/test/header_parser_tests/expected_bindings/_expected_typedef_bindings.dart b/pkgs/ffigen/test/header_parser_tests/expected_bindings/_expected_typedef_bindings.dart index 7d2414c949..89d7474092 100644 --- a/pkgs/ffigen/test/header_parser_tests/expected_bindings/_expected_typedef_bindings.dart +++ b/pkgs/ffigen/test/header_parser_tests/expected_bindings/_expected_typedef_bindings.dart @@ -97,9 +97,7 @@ typedef ExcludedStruct = _ExcludedStruct; typedef IncludedTypedef = ffi.Pointer; typedef NTyperef1 = ExcludedStruct; typedef NamedFunctionProto = - ffi.Pointer>; -typedef NamedFunctionProtoFunction = ffi.Void Function(); -typedef DartNamedFunctionProtoFunction = void Function(); + ffi.Pointer>; typedef NamedStructInTypedef = _NamedStructInTypedef; typedef NestingASpecifiedType = ffi.IntPtr; typedef DartNestingASpecifiedType = int; diff --git a/pkgs/ffigen/test/header_parser_tests/function_n_struct_test.dart b/pkgs/ffigen/test/header_parser_tests/function_n_struct_test.dart index 5ec728234a..9d077977e9 100644 --- a/pkgs/ffigen/test/header_parser_tests/function_n_struct_test.dart +++ b/pkgs/ffigen/test/header_parser_tests/function_n_struct_test.dart @@ -82,18 +82,11 @@ ${strings.headers}: Library expectedLibrary() { final context = testContext( FfiGenerator( + visitors: const [IncludeAllVisitor()], output: Output( dartFile: Uri.file('unused'), style: const DynamicLibraryBindings(), ), - enums: Enums.includeAll, - functions: Functions.includeAll, - globals: Globals.includeAll, - macros: Macros.includeAll, - structs: Structs.includeAll, - typedefs: Typedefs.includeAll, - unions: Unions.includeAll, - unnamedEnums: UnnamedEnums.includeAll, ), ); final struct1 = Struct( diff --git a/pkgs/ffigen/test/header_parser_tests/globals_test.dart b/pkgs/ffigen/test/header_parser_tests/globals_test.dart index df8a61b0bb..d1aa6ad6e6 100644 --- a/pkgs/ffigen/test/header_parser_tests/globals_test.dart +++ b/pkgs/ffigen/test/header_parser_tests/globals_test.dart @@ -91,18 +91,11 @@ void main() { Library expectedLibrary() { final context = testContext( FfiGenerator( + visitors: const [IncludeAllVisitor()], output: Output( dartFile: Uri.file('unused'), style: const DynamicLibraryBindings(), ), - enums: Enums.includeAll, - functions: Functions.includeAll, - globals: Globals.includeAll, - macros: Macros.includeAll, - structs: Structs.includeAll, - typedefs: Typedefs.includeAll, - unions: Unions.includeAll, - unnamedEnums: UnnamedEnums.includeAll, ), ); final globalStruct = Struct(context: context, name: 'EmptyStruct'); diff --git a/pkgs/ffigen/test/header_parser_tests/record_use_test.dart b/pkgs/ffigen/test/header_parser_tests/record_use_test.dart index f0dfd22fac..f44fd12223 100644 --- a/pkgs/ffigen/test/header_parser_tests/record_use_test.dart +++ b/pkgs/ffigen/test/header_parser_tests/record_use_test.dart @@ -3,12 +3,26 @@ // BSD-style license that can be found in the LICENSE file. import 'package:ffigen/src/config_provider.dart'; +import 'package:ffigen/src/config_provider/public_ast.dart'; import 'package:ffigen/src/header_parser.dart' show parse; import 'package:path/path.dart' as p; import 'package:test/test.dart'; import '../test_utils.dart'; +class _RecordUseVisitor extends Visitor { + _RecordUseVisitor(); + + @override + void visitFunc(Func node) { + if (node.originalName == 'sum') { + node.name = 'add'; + } + node.isIncluded = true; + node.recordUse = true; + } +} + void main() { group('record_use_test', () { test('Expected Bindings', () { @@ -16,13 +30,8 @@ void main() { p.join('test', 'header_parser_tests', 'record_use.h'), ); final generator = FfiGenerator( - headers: Headers(entryPoints: [Uri.file(headerFile)]), - functions: Functions( - include: (decl) => true, - recordUse: (decl) => true, - rename: (decl) => - decl.originalName == 'sum' ? 'add' : decl.originalName, - ), + visitors: [_RecordUseVisitor()], + input: Input(entryPoints: [Uri.file(headerFile)]), output: Output( dartFile: Uri.file('unused.dart'), style: const NativeExternalBindings(), diff --git a/pkgs/ffigen/test/header_parser_tests/sort_test.dart b/pkgs/ffigen/test/header_parser_tests/sort_test.dart index 92a6c79023..cf8c52e0eb 100644 --- a/pkgs/ffigen/test/header_parser_tests/sort_test.dart +++ b/pkgs/ffigen/test/header_parser_tests/sort_test.dart @@ -19,7 +19,7 @@ void main() { testContext( FfiGenerator( output: Output(dartFile: Uri.file('unused')), - headers: Headers( + input: Input( entryPoints: [ Uri.file( path.join( @@ -31,12 +31,12 @@ void main() { ), ], ), - structs: Structs.includeAll, - unions: Unions.includeAll, - typedefs: Typedefs( - include: (Declaration decl) => true, - includeUnused: true, - ), + visitors: [ + const IncludeAllVisitor(), + Visitor.callback( + visitTypealias: (node) => node.includeUnused = true, + ), + ], ), ), ); diff --git a/pkgs/ffigen/test/header_parser_tests/static_const_test.dart b/pkgs/ffigen/test/header_parser_tests/static_const_test.dart index a8fb0e4b86..a135cb49ba 100644 --- a/pkgs/ffigen/test/header_parser_tests/static_const_test.dart +++ b/pkgs/ffigen/test/header_parser_tests/static_const_test.dart @@ -185,7 +185,7 @@ Library expectedLibrary() { final myFlags = Typealias( name: 'MyFlags', type: NativeType(SupportedNativeType.uint64), - ); + )..generateBindings = true; final myBufferUsage = Typealias(name: 'MyBufferUsage', type: myFlags); return Library( diff --git a/pkgs/ffigen/test/large_integration_tests/_expected_libclang_bindings.dart b/pkgs/ffigen/test/large_integration_tests/_expected_libclang_bindings.dart index 35c30efc15..d6d209cc5c 100644 --- a/pkgs/ffigen/test/large_integration_tests/_expected_libclang_bindings.dart +++ b/pkgs/ffigen/test/large_integration_tests/_expected_libclang_bindings.dart @@ -3652,9 +3652,7 @@ class LibClang { } late final _clang_getFileTimePtr = - _lookup>( - 'clang_getFileTime', - ); + _lookup>('clang_getFileTime'); late final _clang_getFileTime = _clang_getFileTimePtr .asFunction(); @@ -6922,19 +6920,15 @@ final class CXCursorSetImpl extends ffi.Opaque {} /// Visitor invoked for each cursor found by a traversal. typedef CXCursorVisitor = - ffi.Pointer>; -typedef CXCursorVisitorFunction = - ffi.UnsignedInt Function( - CXCursor cursor, - CXCursor parent, - CXClientData client_data, - ); -typedef DartCXCursorVisitorFunction = - CXChildVisitResult Function( - CXCursor cursor, - CXCursor parent, - CXClientData client_data, - ); + ffi.Pointer< + ffi.NativeFunction< + ffi.UnsignedInt Function( + CXCursor cursor, + CXCursor parent, + CXClientData client_data, + ) + > + >; /// Describes the exception specification of a cursor. enum CXCursor_ExceptionSpecificationKind { @@ -7125,11 +7119,11 @@ enum CXEvalResultKind { /// Visitor invoked for each field found by a traversal. typedef CXFieldVisitor = - ffi.Pointer>; -typedef CXFieldVisitorFunction = - ffi.UnsignedInt Function(CXCursor C, CXClientData client_data); -typedef DartCXFieldVisitorFunction = - CXVisitorResult Function(CXCursor C, CXClientData client_data); + ffi.Pointer< + ffi.NativeFunction< + ffi.UnsignedInt Function(CXCursor C, CXClientData client_data) + > + >; /// A particular source file that is part of a translation unit. typedef CXFile = ffi.Pointer; @@ -7653,21 +7647,16 @@ final class CXIdxObjCProtocolRefListInfo extends ffi.Struct { /// Visitor invoked for each file in a translation unit (used with /// clang_getInclusions()). typedef CXInclusionVisitor = - ffi.Pointer>; -typedef CXInclusionVisitorFunction = - ffi.Void Function( - CXFile included_file, - ffi.Pointer inclusion_stack, - ffi.UnsignedInt include_len, - CXClientData client_data, - ); -typedef DartCXInclusionVisitorFunction = - void Function( - CXFile included_file, - ffi.Pointer inclusion_stack, - int include_len, - CXClientData client_data, - ); + ffi.Pointer< + ffi.NativeFunction< + ffi.Void Function( + CXFile included_file, + ffi.Pointer inclusion_stack, + ffi.UnsignedInt include_len, + CXClientData client_data, + ) + > + >; /// An "index" that consists of a set of translation units that would typically /// be linked together into an executable or library. @@ -9124,3 +9113,5 @@ final class IndexerCallbacks extends ffi.Struct { ..ref.indexDeclaration = indexDeclaration ..ref.indexEntityReference = indexEntityReference; } + +typedef time_t = ffi.Long; diff --git a/pkgs/ffigen/test/large_integration_tests/_expected_sqlite_bindings.dart b/pkgs/ffigen/test/large_integration_tests/_expected_sqlite_bindings.dart index d00b72bbf3..f6594a9f6a 100644 --- a/pkgs/ffigen/test/large_integration_tests/_expected_sqlite_bindings.dart +++ b/pkgs/ffigen/test/large_integration_tests/_expected_sqlite_bindings.dart @@ -12465,23 +12465,17 @@ final class fts5_api extends ffi.Struct { } typedef fts5_extension_function = - ffi.Pointer>; -typedef fts5_extension_functionFunction = - ffi.Void Function( - ffi.Pointer pApi, - ffi.Pointer pFts, - ffi.Pointer pCtx, - ffi.Int nVal, - ffi.Pointer> apVal, - ); -typedef Dartfts5_extension_functionFunction = - void Function( - ffi.Pointer pApi, - ffi.Pointer pFts, - ffi.Pointer pCtx, - int nVal, - ffi.Pointer> apVal, - ); + ffi.Pointer< + ffi.NativeFunction< + ffi.Void Function( + ffi.Pointer pApi, + ffi.Pointer pFts, + ffi.Pointer pCtx, + ffi.Int nVal, + ffi.Pointer> apVal, + ) + > + >; final class fts5_tokenizer extends ffi.Struct { external ffi.Pointer< @@ -12585,21 +12579,16 @@ final class sqlite3_blob extends ffi.Opaque {} /// This is legacy and deprecated. It is included for historical /// compatibility and is not documented. typedef sqlite3_callback = - ffi.Pointer>; -typedef sqlite3_callbackFunction = - ffi.Int Function( - ffi.Pointer, - ffi.Int, - ffi.Pointer>, - ffi.Pointer>, - ); -typedef Dartsqlite3_callbackFunction = - int Function( - ffi.Pointer, - int, - ffi.Pointer>, - ffi.Pointer>, - ); + ffi.Pointer< + ffi.NativeFunction< + ffi.Int Function( + ffi.Pointer, + ffi.Int, + ffi.Pointer>, + ffi.Pointer>, + ) + > + >; final class sqlite3_context extends ffi.Opaque {} @@ -12616,11 +12605,7 @@ final class sqlite3_context extends ffi.Opaque {} /// The typedef is necessary to work around problems in certain /// C++ compilers. typedef sqlite3_destructor_type = - ffi.Pointer>; -typedef sqlite3_destructor_typeFunction = - ffi.Void Function(ffi.Pointer); -typedef Dartsqlite3_destructor_typeFunction = - void Function(ffi.Pointer); + ffi.Pointer)>>; final class sqlite3_file extends ffi.Struct { /// Methods for an open file @@ -14006,9 +13991,7 @@ final class sqlite3_stmt extends ffi.Opaque {} final class sqlite3_str extends ffi.Opaque {} typedef sqlite3_syscall_ptr = - ffi.Pointer>; -typedef sqlite3_syscall_ptrFunction = ffi.Void Function(); -typedef Dartsqlite3_syscall_ptrFunction = void Function(); + ffi.Pointer>; typedef sqlite3_uint64 = sqlite_uint64; final class sqlite3_value extends ffi.Opaque {} diff --git a/pkgs/ffigen/test/large_integration_tests/large_objc_test.dart b/pkgs/ffigen/test/large_integration_tests/large_objc_test.dart index 1eb46cf241..6763b93a7d 100644 --- a/pkgs/ffigen/test/large_integration_tests/large_objc_test.dart +++ b/pkgs/ffigen/test/large_integration_tests/large_objc_test.dart @@ -32,29 +32,95 @@ Future run(String exe, List args) async { return await process.exitCode; } +// Reducing the bindings to a random subset so that the test completes in a +// reasonable amount of time. +// TODO(https://github.com/dart-lang/sdk/issues/56247): Remove this. +class _RandomIncludeVisitor extends Visitor { + _RandomIncludeVisitor(); + + static const inclusionRatio = 0.1; + static const seed = 1234; + static const forceIncludedProtocols = {'NSTextLocation'}; + + bool _randInclude(String kind, String usr, [String? member]) => + fnvHash32('$seed.$kind.$usr.$member') < ((1 << 32) * inclusionRatio); + + @override + void visitFunc(Func node) { + node.isIncluded = _randInclude('functionDecl', node.usr); + } + + @override + void visitStruct(Struct node) { + node.isIncluded = _randInclude('structDecl', node.usr); + } + + @override + void visitUnion(Union node) { + node.isIncluded = _randInclude('unionDecl', node.usr); + } + + @override + void visitEnum(EnumClass node) { + node.isIncluded = _randInclude('enums', node.usr); + } + + @override + void visitUnnamedEnumConstant(UnnamedEnumConstant node) { + node.isIncluded = _randInclude('unnamedEnumConstants', node.usr); + } + + @override + void visitGlobal(Global node) { + node.isIncluded = _randInclude('globals', node.usr); + } + + @override + void visitTypealias(Typealias node) { + node.isIncluded = _randInclude('typedefs', node.usr); + } + + @override + void visitObjCInterface(ObjCInterface node) { + node.isIncluded = _randInclude('objcInterfaces', node.usr); + for (final m in node.methods) { + m.isIncluded = _randInclude( + 'objcInterfaces.memb', + node.usr, + m.originalName, + ); + } + } + + @override + void visitObjCProtocol(ObjCProtocol node) { + node.isIncluded = + forceIncludedProtocols.contains(node.originalName) || + _randInclude('objcProtocols', node.usr); + for (final m in node.methods) { + m.isIncluded = _randInclude( + 'objcProtocols.memb', + node.usr, + m.originalName, + ); + } + } + + @override + void visitObjCCategory(ObjCCategory node) { + node.isIncluded = _randInclude('objcCategories', node.usr); + for (final m in node.methods) { + m.isIncluded = _randInclude( + 'objcCategories.memb', + node.usr, + m.originalName, + ); + } + } +} + void main() { test('Large ObjC integration test', () async { - // Reducing the bindings to a random subset so that the test completes in a - // reasonable amount of time. - // TODO(https://github.com/dart-lang/sdk/issues/56247): Remove this. - const inclusionRatio = 0.1; - const seed = 1234; - bool randInclude(String kind, Declaration declaration, [String? member]) => - fnvHash32('$seed.$kind.${declaration.usr}.$member') < - ((1 << 32) * inclusionRatio); - bool Function(Declaration clazz) includeRandom( - String kind, [ - Set forceIncludes = const {}, - ]) => - (Declaration declaration) => - forceIncludes.contains(declaration.originalName) || - randInclude(kind, declaration); - bool Function(Declaration declaration, String member) includeMemberRandom( - String kind, - ) => - (Declaration clazz, String method) => - randInclude('$kind.memb', clazz, method); - final outFile = path.join( packagePathForTests, 'test', @@ -68,11 +134,9 @@ void main() { 'large_objc_bindings.m', ); - // TODO(https://github.com/dart-lang/native/issues/2517): Remove this. - const forceIncludedProtocols = {'NSTextLocation'}; - final generator = FfiGenerator( - headers: Headers( + visitors: [_RandomIncludeVisitor()], + input: Input( entryPoints: [ Uri.file( path.join( @@ -94,42 +158,10 @@ void main() { // ignore_for_file: unused_field ''', ), - functions: () { - return Functions(include: includeRandom('functionDecl')); - }(), - structs: () { - return Structs(include: includeRandom('structDecl')); - }(), - unions: () { - return Unions(include: includeRandom('unionDecl')); - }(), - enums: () { - return Enums(include: includeRandom('enums')); - }(), - unnamedEnums: () { - return UnnamedEnums(include: includeRandom('unnamedEnumConstants')); - }(), - globals: Globals(include: includeRandom('globals')), - typedefs: Typedefs(include: includeRandom('typedefs')), objectiveC: ObjectiveC( - interfaces: Interfaces( - include: includeRandom('objcInterfaces'), - includeMember: includeMemberRandom('objcInterfaces'), - includeTransitive: false, - ), - protocols: Protocols( - include: includeRandom('objcProtocols', forceIncludedProtocols), - includeMember: includeMemberRandom('objcProtocols'), - includeTransitive: false, - ), - categories: Categories( - include: includeRandom('objcCategories'), - includeMember: includeMemberRandom('objcCategories'), - includeTransitive: false, - ), externalVersions: ExternalVersions( - ios: Versions(min: Version(12, 0, 0)), - macos: Versions(min: Version(10, 14, 0)), + ios: Versions(min: Version.parse('12.0.0')), + macos: Versions(min: Version.parse('10.14.0')), ), ), ); diff --git a/pkgs/ffigen/test/large_integration_tests/large_test.dart b/pkgs/ffigen/test/large_integration_tests/large_test.dart index edf269adeb..8726dafe7a 100644 --- a/pkgs/ffigen/test/large_integration_tests/large_test.dart +++ b/pkgs/ffigen/test/large_integration_tests/large_test.dart @@ -2,9 +2,9 @@ // 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/imports.dart'; import 'package:ffigen/src/config_provider/config.dart'; import 'package:ffigen/src/config_provider/config_types.dart'; +import 'package:ffigen/src/config_provider/public_ast.dart'; import 'package:ffigen/src/context.dart'; import 'package:ffigen/src/header_parser.dart'; import 'package:logging/logging.dart'; @@ -39,7 +39,7 @@ void main() { wrapperDocComment: 'Bindings to LibClang.', ), ), - headers: Headers( + input: Input( compilerOptions: [...defaultCompilerOpts(logger), '-I$includeDir'], entryPoints: [ Uri.file( @@ -63,15 +63,7 @@ void main() { 'Index.h', ].any((filename) => header.pathSegments.last == filename), ), - functions: Functions.includeAll, - structs: Structs.includeAll, - enums: Enums.includeAll, - macros: Macros.includeAll, - typedefs: Typedefs( - include: (_) => true, - // ignore: deprecated_member_use_from_same_package - imported: [ImportedType(ffiImport, 'Int64', 'int', 'time_t')], - ), + visitors: const [IncludeAllVisitor()], ); final library = parse(Context(logger, generator)); final context = testContext(); @@ -135,7 +127,7 @@ void main() { wrapperDocComment: 'Bindings to Cjson.', ), ), - headers: Headers( + input: Input( entryPoints: [ Uri.file( path.join( @@ -148,10 +140,7 @@ void main() { ], include: (Uri header) => header.pathSegments.last == 'cJSON.h', ), - functions: Functions.includeAll, - structs: Structs.includeAll, - macros: Macros.includeAll, - typedefs: Typedefs.includeAll, + visitors: const [IncludeAllVisitor()], ); final context = testContext(generator); final library = parse(context); @@ -164,9 +153,6 @@ void main() { }); test('SQLite test', () { - // Excluding functions etc that use 'va_list' because it can either be a - // Pointer<__va_list_tag> or int depending on the OS. - final vaRegex = RegExp(r'(^|[^a-z])va($|[^a-z])'); final generator = FfiGenerator( output: Output( dartFile: Uri.file('unused'), @@ -176,7 +162,7 @@ void main() { ), commentType: const CommentType(CommentStyle.any, CommentLength.full), ), - headers: Headers( + input: Input( entryPoints: [ Uri.file( path.join( @@ -189,21 +175,7 @@ void main() { ], include: (Uri header) => header.pathSegments.last == 'sqlite3.h', ), - functions: Functions( - include: (declaration) => !{ - 'sqlite3_vmprintf', - 'sqlite3_vsnprintf', - 'sqlite3_str_vappendf', - }.contains(declaration.originalName), - ), - structs: Structs( - include: (declaration) => !vaRegex.hasMatch(declaration.originalName), - ), - globals: Globals.includeAll, - macros: Macros.includeAll, - typedefs: Typedefs( - include: (declaration) => !vaRegex.hasMatch(declaration.originalName), - ), + visitors: const [IncludeAllVisitor(), _LargeTestVisitor()], ); final context = testContext(generator); final library = parse(context); @@ -214,21 +186,36 @@ void main() { '_expected_sqlite_bindings.dart', ]); }); + }); +} - test('Libclang config test', () { - final config = testConfigFromPath( - path.join(packagePathForTests, 'tool', 'libclang_config.yaml'), - ); - final context = testContext(config); - final library = parse(context); +class _LargeTestVisitor extends Visitor { + static final vaRegex = RegExp(r'(^|[^a-z])va($|[^a-z])'); - matchLibraryWithExpected(context, library, 'libclang_config.dart', [ - 'lib', - 'src', - 'header_parser', - 'clang_bindings', - 'clang_bindings.dart', - ]); - }); - }); + const _LargeTestVisitor(); + + @override + void visitFunc(Func node) { + if ({ + 'sqlite3_vmprintf', + 'sqlite3_vsnprintf', + 'sqlite3_str_vappendf', + }.contains(node.originalName)) { + node.isIncluded = false; + } + } + + @override + void visitStruct(Struct node) { + if (vaRegex.hasMatch(node.originalName)) { + node.isIncluded = false; + } + } + + @override + void visitTypealias(Typealias node) { + if (vaRegex.hasMatch(node.originalName)) { + node.isIncluded = false; + } + } } diff --git a/pkgs/ffigen/test/native_cpp_test/verify_bindings_test.dart b/pkgs/ffigen/test/native_cpp_test/verify_bindings_test.dart index 040580a872..59305249d4 100644 --- a/pkgs/ffigen/test/native_cpp_test/verify_bindings_test.dart +++ b/pkgs/ffigen/test/native_cpp_test/verify_bindings_test.dart @@ -37,16 +37,19 @@ void main() { assetId: 'package:ffigen/cpp_test', ), ), - headers: Headers( + input: Input( entryPoints: [ Uri.file(path.join(testDir.path, 'cpp_class_test.h')), Uri.file(path.join(testDir.path, 'finalizer_test_subject.h')), ], compilerOptions: ['-x', 'c++'], ), - cpp: Cpp( - classes: CppClasses.includeSet({'Animal', 'FinalizerTestSubject'}), - ), + cpp: const Cpp(), + visitors: [ + const IncludeSetVisitor( + cppClasses: {'Animal', 'FinalizerTestSubject'}, + ), + ], ), 'memory_edge_cases': FfiGenerator( output: Output( @@ -55,13 +58,16 @@ void main() { assetId: 'package:ffigen/cpp_test', ), ), - headers: Headers( + input: Input( entryPoints: [ Uri.file(path.join(testDir.path, 'memory_edge_cases.h')), ], compilerOptions: ['-x', 'c++'], ), - cpp: Cpp(classes: CppClasses.includeSet({'Node', 'NodeManager'})), + cpp: const Cpp(), + visitors: [ + const IncludeSetVisitor(cppClasses: {'Node', 'NodeManager'}), + ], ), }; diff --git a/pkgs/ffigen/test/native_objc_test/bad_method_test_bindings.dart b/pkgs/ffigen/test/native_objc_test/bad_method_test_bindings.dart index 82488c6378..3ae3ec75a3 100644 --- a/pkgs/ffigen/test/native_objc_test/bad_method_test_bindings.dart +++ b/pkgs/ffigen/test/native_objc_test/bad_method_test_bindings.dart @@ -2,6 +2,9 @@ // // Generated by `package:ffigen`. // ignore_for_file: type=lint, unused_import, unused_element, deprecated_member_use_from_same_package +@ffi.DefaultAsset('package:ffigen/objc_test') +library; + import 'dart:ffi' as ffi; import 'package:objective_c/objective_c.dart' as objc; import 'package:ffi/ffi.dart' as pkg_ffi; diff --git a/pkgs/ffigen/test/native_objc_test/bad_override_test_bindings.dart b/pkgs/ffigen/test/native_objc_test/bad_override_test_bindings.dart index 8c20372c4d..fe5b2b0093 100644 --- a/pkgs/ffigen/test/native_objc_test/bad_override_test_bindings.dart +++ b/pkgs/ffigen/test/native_objc_test/bad_override_test_bindings.dart @@ -2,6 +2,9 @@ // // Generated by `package:ffigen`. // ignore_for_file: type=lint, unused_import, unused_element, deprecated_member_use_from_same_package +@ffi.DefaultAsset('package:ffigen/objc_test') +library; + import 'dart:ffi' as ffi; import 'package:objective_c/objective_c.dart' as objc; import 'package:ffi/ffi.dart' as pkg_ffi; diff --git a/pkgs/ffigen/test/native_objc_test/block_inherit_test_bindings.dart b/pkgs/ffigen/test/native_objc_test/block_inherit_test_bindings.dart index 7b7403af4a..69230d5d10 100644 --- a/pkgs/ffigen/test/native_objc_test/block_inherit_test_bindings.dart +++ b/pkgs/ffigen/test/native_objc_test/block_inherit_test_bindings.dart @@ -2,6 +2,9 @@ // // Generated by `package:ffigen`. // ignore_for_file: type=lint, unused_import, unused_element, deprecated_member_use_from_same_package +@ffi.DefaultAsset('package:ffigen/objc_test') +library; + import 'dart:ffi' as ffi; import 'package:objective_c/objective_c.dart' as objc; import 'package:ffi/ffi.dart' as pkg_ffi; diff --git a/pkgs/ffigen/test/native_objc_test/cast_test_bindings.dart b/pkgs/ffigen/test/native_objc_test/cast_test_bindings.dart index 81819a6a97..463cd4713c 100644 --- a/pkgs/ffigen/test/native_objc_test/cast_test_bindings.dart +++ b/pkgs/ffigen/test/native_objc_test/cast_test_bindings.dart @@ -2,6 +2,9 @@ // // Generated by `package:ffigen`. // ignore_for_file: type=lint, unused_import, unused_element, deprecated_member_use_from_same_package +@ffi.DefaultAsset('package:ffigen/objc_test') +library; + import 'dart:ffi' as ffi; import 'package:objective_c/objective_c.dart' as objc; import 'package:ffi/ffi.dart' as pkg_ffi; diff --git a/pkgs/ffigen/test/native_objc_test/category_test_bindings.dart b/pkgs/ffigen/test/native_objc_test/category_test_bindings.dart index ea92ec92e7..8e38ffdef2 100644 --- a/pkgs/ffigen/test/native_objc_test/category_test_bindings.dart +++ b/pkgs/ffigen/test/native_objc_test/category_test_bindings.dart @@ -10,36 +10,6 @@ import 'package:objective_c/objective_c.dart' as objc; import 'package:ffi/ffi.dart' as pkg_ffi; const _$objcVersionCheck = objc.ObjCVersionCheck(9, 5); -@ffi.Native< - ffi.Pointer Function( - ffi.Int64, - ffi.Pointer, - ffi.Pointer< - ffi.NativeFunction< - ffi.Void Function(ffi.Pointer args) - > - >, - ) ->(isLeaf: true) -external ffi.Pointer _l3cf7j_wrapBlockingBlock_pfv6jd( - int port, - ffi.Pointer context, - ffi.Pointer< - ffi.NativeFunction args)> - > - directInvoke, -); - -@ffi.Native< - ffi.Pointer Function( - ffi.Int64, - ffi.Pointer, - ) ->(isLeaf: true) -external ffi.Pointer _l3cf7j_wrapListenerBlock_pfv6jd( - int port, - ffi.Pointer context, -); /// CatImplementsProto extension CatImplementsProto on Thing { @@ -289,171 +259,7 @@ extension Mul on Thing { } /// NSItemProvider -extension NSItemProvider on objc.NSURL { - /// itemProviderVisibilityForRepresentationWithTypeIdentifier: - objc.NSItemProviderRepresentationVisibility - itemProviderVisibilityForRepresentationWithTypeIdentifier( - objc.NSString typeIdentifier, - ) { - final _$$ref = object$.ref; - final _$$ref$1 = typeIdentifier.ref; - objc.checkOsVersionInternal( - 'NSURL.itemProviderVisibilityForRepresentationWithTypeIdentifier:', - iOS: (false, (11, 0, 0)), - macOS: (false, (10, 13, 0)), - ); - if (!objc.respondsToSelector( - _$$ref.pointer, - _sel_itemProviderVisibilityForRepresentationWithTypeIdentifier_, - )) { - throw objc.UnimplementedOptionalMethodException( - 'NSURL', - 'itemProviderVisibilityForRepresentationWithTypeIdentifier:', - ); - } - final $ret = _objc_msgSend_16fy0up( - _$$ref.pointer, - _sel_itemProviderVisibilityForRepresentationWithTypeIdentifier_, - _$$ref$1.pointer, - ); - return objc.NSItemProviderRepresentationVisibility.fromValue($ret); - } - - /// loadDataWithTypeIdentifier:forItemProviderCompletionHandler: - objc.NSProgress? loadDataWithTypeIdentifier( - objc.NSString typeIdentifier, { - required objc.ObjCBlock - forItemProviderCompletionHandler, - }) { - final _$$ref = object$.ref; - final _$$ref$1 = typeIdentifier.ref; - final _$$ref$2 = forItemProviderCompletionHandler.ref; - objc.checkOsVersionInternal( - 'NSURL.loadDataWithTypeIdentifier:forItemProviderCompletionHandler:', - iOS: (false, (11, 0, 0)), - macOS: (false, (10, 13, 0)), - ); - final $ret = _objc_msgSend_r0bo0s( - _$$ref.pointer, - _sel_loadDataWithTypeIdentifier_forItemProviderCompletionHandler_, - _$$ref$1.pointer, - _$$ref$2.pointer, - ); - return $ret.address == 0 - ? null - : objc.NSProgress.fromPointer($ret, retain: true, release: true); - } - - /// writableTypeIdentifiersForItemProvider - objc.NSArray get writableTypeIdentifiersForItemProvider { - final _$$ref = object$.ref; - objc.checkOsVersionInternal( - 'NSURL.writableTypeIdentifiersForItemProvider', - iOS: (false, (11, 0, 0)), - macOS: (false, (10, 13, 0)), - ); - if (!objc.respondsToSelector( - _$$ref.pointer, - _sel_writableTypeIdentifiersForItemProvider, - )) { - throw objc.UnimplementedOptionalMethodException( - 'NSURL', - 'writableTypeIdentifiersForItemProvider', - ); - } - final $ret = _objc_msgSend_151sglz( - _$$ref.pointer, - _sel_writableTypeIdentifiersForItemProvider, - ); - return objc.NSArray.fromPointer($ret, retain: true, release: true); - } - - /// itemProviderVisibilityForRepresentationWithTypeIdentifier: - static objc.NSItemProviderRepresentationVisibility - itemProviderVisibilityForRepresentationWithTypeIdentifier$1( - objc.NSString typeIdentifier, - ) { - final _$$ref = typeIdentifier.ref; - objc.checkOsVersionInternal( - 'NSURL.itemProviderVisibilityForRepresentationWithTypeIdentifier:', - iOS: (false, (11, 0, 0)), - macOS: (false, (10, 13, 0)), - ); - if (!objc.respondsToSelector( - _class_NSURL, - _sel_itemProviderVisibilityForRepresentationWithTypeIdentifier_, - )) { - throw objc.UnimplementedOptionalMethodException( - 'NSURL', - 'itemProviderVisibilityForRepresentationWithTypeIdentifier:', - ); - } - final $ret = _objc_msgSend_16fy0up( - _class_NSURL, - _sel_itemProviderVisibilityForRepresentationWithTypeIdentifier_, - _$$ref.pointer, - ); - return objc.NSItemProviderRepresentationVisibility.fromValue($ret); - } - - /// objectWithItemProviderData:typeIdentifier:error: - static objc.NSURL? objectWithItemProviderData( - objc.NSData data, { - required objc.NSString typeIdentifier, - }) { - final _$$ref = data.ref; - final _$$ref$1 = typeIdentifier.ref; - objc.checkOsVersionInternal( - 'NSURL.objectWithItemProviderData:typeIdentifier:error:', - iOS: (false, (11, 0, 0)), - macOS: (false, (10, 13, 0)), - ); - final $err = pkg_ffi.calloc>(); - try { - final $ret = _objc_msgSend_1pnyuds( - _class_NSURL, - _sel_objectWithItemProviderData_typeIdentifier_error_, - _$$ref.pointer, - _$$ref$1.pointer, - $err, - ); - objc.NSErrorException.checkErrorPointer($err.value); - return $ret.address == 0 - ? null - : objc.NSURL.fromPointer($ret, retain: true, release: true); - } finally { - pkg_ffi.calloc.free($err); - } - } - - /// readableTypeIdentifiersForItemProvider - static objc.NSArray getReadableTypeIdentifiersForItemProvider() { - objc.checkOsVersionInternal( - 'NSURL.readableTypeIdentifiersForItemProvider', - iOS: (false, (11, 0, 0)), - macOS: (false, (10, 13, 0)), - ); - final $ret = _objc_msgSend_151sglz( - _class_NSURL, - _sel_readableTypeIdentifiersForItemProvider, - ); - return objc.NSArray.fromPointer($ret, retain: true, release: true); - } - - /// writableTypeIdentifiersForItemProvider - static objc.NSArray getWritableTypeIdentifiersForItemProvider$1() { - objc.checkOsVersionInternal( - 'NSURL.writableTypeIdentifiersForItemProvider', - iOS: (false, (11, 0, 0)), - macOS: (false, (10, 13, 0)), - ); - final $ret = _objc_msgSend_151sglz( - _class_NSURL, - _sel_writableTypeIdentifiersForItemProvider, - ); - return objc.NSArray.fromPointer($ret, retain: true, release: true); - } -} +extension NSItemProvider on objc.NSURL {} /// NSPromisedItems extension NSPromisedItems on objc.NSURL { @@ -884,213 +690,6 @@ extension NSURLPathUtilities on objc.NSURL { } } -/// Construction methods for `objc.ObjCBlock`. -abstract final class ObjCBlock_ffiVoid_NSData_NSError { - /// Returns a block that wraps the given raw block pointer. - static objc.ObjCBlock - fromPointer( - ffi.Pointer pointer, { - bool retain = false, - bool release = false, - }) => objc.ObjCBlock( - pointer, - retain: retain, - release: release, - ); - - /// Creates a block from a C function pointer. - /// - /// This block must be invoked by native code running on the same thread as - /// the isolate that registered it. Invoking the block on the wrong thread - /// will result in a crash. - static objc.ObjCBlock - fromFunctionPointer( - ffi.Pointer< - ffi.NativeFunction< - ffi.Void Function( - ffi.Pointer arg0, - ffi.Pointer arg1, - ) - > - > - ptr, - ) => objc.ObjCBlock( - objc.newPointerBlock(_fnPtrCallable, ptr.cast()), - retain: false, - release: true, - ); - - /// Creates a block from a Dart function. - /// - /// This block must be invoked by native code running on the same thread as - /// the isolate that registered it. Invoking the block on the wrong thread - /// will result in a crash. - /// - /// If `keepIsolateAlive` is true, this block will keep this isolate alive - /// until it is garbage collected by both Dart and ObjC. - static objc.ObjCBlock - fromFunction( - void Function(objc.NSData?, objc.NSError?) fn, { - bool keepIsolateAlive = true, - }) => objc.ObjCBlock( - objc.newClosureBlock(_closureCallable, ( - ffi.Pointer arg0, - ffi.Pointer arg1, - ) { - return fn( - arg0.address == 0 - ? null - : objc.NSData.fromPointer(arg0, retain: true, release: true), - arg1.address == 0 - ? null - : objc.NSError.fromPointer(arg1, retain: true, release: true), - ); - }, keepIsolateAlive), - retain: false, - release: true, - ); - - /// Creates a listener block from a Dart function. - /// - /// This block can be invoked from any thread, but only supports void - /// functions, and is not run synchronously. Async functions (ie returning - /// Future) are not supported. - /// - /// If `keepIsolateAlive` is true, this block will keep this isolate alive - /// until it is garbage collected by both Dart and ObjC. - static objc.ObjCBlock - listener( - void Function(objc.NSData?, objc.NSError?) fn, { - bool keepIsolateAlive = true, - }) { - return objc.ObjCBlock( - objc.newBlockPort(_l3cf7j_wrapListenerBlock_pfv6jd, ( - ffi.Pointer rawArgs, - ) { - final args = _BlockArgs_x5cg0.fromPointer( - rawArgs, - retain: false, - release: false, - ); - - fn(args.arg0, args.arg1); - }, keepIsolateAlive), - retain: false, - release: true, - ); - } - - /// Creates a blocking block from a Dart function. - /// - /// This callback can be invoked from any native thread, and will block the - /// caller until the callback is handled by the Dart isolate that created - /// the block. Async functions (ie returning Future) are not supported. - /// - /// If `keepIsolateAlive` is true, this block will keep this isolate alive - /// until it is garbage collected by both Dart and ObjC. If the owner isolate - /// has shut down, and the block is invoked by native code, it may block - /// indefinitely, or have other undefined behavior. - static objc.ObjCBlock - blocking( - void Function(objc.NSData?, objc.NSError?) fn, { - bool keepIsolateAlive = true, - }) { - return objc.ObjCBlock( - objc.newBlockingBlockPort(_l3cf7j_wrapBlockingBlock_pfv6jd, ( - ffi.Pointer rawArgs, - ) { - final args = _BlockArgs_x5cg0.fromPointer( - rawArgs, - retain: false, - release: false, - ); - - fn(args.arg0, args.arg1); - }, keepIsolateAlive), - retain: false, - release: true, - ); - } - - static void _fnPtrTrampoline( - ffi.Pointer block, - ffi.Pointer arg0, - ffi.Pointer arg1, - ) => block.ref.target - .cast< - ffi.NativeFunction< - ffi.Void Function( - ffi.Pointer arg0, - ffi.Pointer arg1, - ) - > - >() - .asFunction< - void Function( - ffi.Pointer, - ffi.Pointer, - ) - >()(arg0, arg1); - static ffi.Pointer _fnPtrCallable = - ffi.Pointer.fromFunction< - ffi.Void Function( - ffi.Pointer, - ffi.Pointer, - ffi.Pointer, - ) - >(_fnPtrTrampoline) - .cast(); - static void _closureTrampoline( - ffi.Pointer block, - ffi.Pointer arg0, - ffi.Pointer arg1, - ) => - (objc.getBlockClosure(block) - as void Function( - ffi.Pointer, - ffi.Pointer, - ))(arg0, arg1); - static ffi.Pointer _closureCallable = - ffi.Pointer.fromFunction< - ffi.Void Function( - ffi.Pointer, - ffi.Pointer, - ffi.Pointer, - ) - >(_closureTrampoline) - .cast(); -} - -/// Call operator for `objc.ObjCBlock`. -extension ObjCBlock_ffiVoid_NSData_NSError$CallExtension - on objc.ObjCBlock { - void call(objc.NSData? arg0, objc.NSError? arg1) { - final _$$ref = arg0?.ref; - final _$$ref$1 = arg1?.ref; - return ref.pointer.ref.invoke - .cast< - ffi.NativeFunction< - ffi.Void Function( - ffi.Pointer block, - ffi.Pointer arg0, - ffi.Pointer arg1, - ) - > - >() - .asFunction< - void Function( - ffi.Pointer, - ffi.Pointer, - ffi.Pointer, - ) - >()( - ref.pointer, - _$$ref?.pointer ?? ffi.nullptr, - _$$ref$1?.pointer ?? ffi.nullptr, - ); - } -} - /// StaticAndInstanceMethodsWithSameNameCategory extension StaticAndInstanceMethodsWithSameNameCategory on Thing { /// sameNameMethod @@ -1214,50 +813,6 @@ extension Thing$Methods on Thing { } } -extension type _BlockArgs_x5cg0._(objc.ObjCObject object$) - implements objc.ObjCObject { - /// Constructs a [_BlockArgs_x5cg0] that points to the same underlying object as [other]. - _BlockArgs_x5cg0.as(objc.ObjCObject other) : object$ = other { - assert(isA(object$)); - } - - /// Constructs a [_BlockArgs_x5cg0] that wraps the given raw object pointer. - _BlockArgs_x5cg0.fromPointer( - ffi.Pointer other, { - bool retain = false, - bool release = false, - }) : object$ = objc.ObjCObject(other, retain: retain, release: release) { - assert(isA(object$)); - } - - /// Returns whether [obj] is an instance of [_BlockArgs_x5cg0]. - static bool isA(objc.ObjCObject? obj) => obj == null - ? false - : _objc_msgSend_19nvye5( - obj.ref.pointer, - _sel_isKindOfClass_, - _class__BlockArgs_x5cg0, - ); -} - -extension _BlockArgs_x5cg0$Methods on _BlockArgs_x5cg0 { - objc.NSData? get arg0 { - final _$$ref = object$.ref; - final $ret = _objc_msgSend_151sglz(_$$ref.pointer, _sel_arg0); - return $ret.address == 0 - ? null - : objc.NSData.fromPointer($ret, retain: true, release: true); - } - - objc.NSError? get arg1 { - final _$$ref = object$.ref; - final $ret = _objc_msgSend_151sglz(_$$ref.pointer, _sel_arg1); - return $ret.address == 0 - ? null - : objc.NSError.fromPointer($ret, retain: true, release: true); - } -} - @ffi.Native>( symbol: 'OBJC_CLASS_\$_ChildOfNSString', ) @@ -1302,16 +857,6 @@ final _class_Thing = objc.getClass( _class_Thing_raw, ).cast(), ); -@ffi.Native>( - symbol: 'OBJC_CLASS_\$__l3cf7j_BlockArgs_pfv6jd', -) -external ffi.Pointer _class__BlockArgs_x5cg0_raw; -final _class__BlockArgs_x5cg0 = objc.getClass( - "_l3cf7j_BlockArgs_pfv6jd", - () => ffi.Native.addressOf>( - _class__BlockArgs_x5cg0_raw, - ).cast(), -); final _objc_msgSend_151sglz = objc.msgSendPointer .cast< ffi.NativeFunction< @@ -1327,23 +872,6 @@ final _objc_msgSend_151sglz = objc.msgSendPointer ffi.Pointer, ) >(); -final _objc_msgSend_16fy0up = objc.msgSendPointer - .cast< - ffi.NativeFunction< - ffi.Long Function( - ffi.Pointer, - ffi.Pointer, - ffi.Pointer, - ) - > - >() - .asFunction< - int Function( - ffi.Pointer, - ffi.Pointer, - ffi.Pointer, - ) - >(); final _objc_msgSend_17amj0z = objc.msgSendPointer .cast< ffi.NativeFunction< @@ -1488,27 +1016,6 @@ final _objc_msgSend_1lsax7n = objc.msgSendPointer ffi.Pointer, ) >(); -final _objc_msgSend_1pnyuds = objc.msgSendPointer - .cast< - ffi.NativeFunction< - ffi.Pointer Function( - ffi.Pointer, - ffi.Pointer, - ffi.Pointer, - ffi.Pointer, - ffi.Pointer>, - ) - > - >() - .asFunction< - ffi.Pointer Function( - ffi.Pointer, - ffi.Pointer, - ffi.Pointer, - ffi.Pointer, - ffi.Pointer>, - ) - >(); final _objc_msgSend_1q0lyci = objc.msgSendPointer .cast< ffi.NativeFunction< @@ -1596,25 +1103,6 @@ final _objc_msgSend_91o635 = objc.msgSendPointer ffi.Pointer, ) >(); -final _objc_msgSend_r0bo0s = objc.msgSendPointer - .cast< - ffi.NativeFunction< - ffi.Pointer Function( - ffi.Pointer, - ffi.Pointer, - ffi.Pointer, - ffi.Pointer, - ) - > - >() - .asFunction< - ffi.Pointer Function( - ffi.Pointer, - ffi.Pointer, - ffi.Pointer, - ffi.Pointer, - ) - >(); late final _sel_URLByAppendingPathComponent_ = objc.registerName( "URLByAppendingPathComponent:", ); @@ -1648,8 +1136,6 @@ late final _sel_anonymousCategoryMethod = objc.registerName( late final _sel_anonymousCategoryStaticMethod = objc.registerName( "anonymousCategoryStaticMethod", ); -late final _sel_arg0 = objc.registerName("arg0"); -late final _sel_arg1 = objc.registerName("arg1"); late final _sel_checkPromisedItemIsReachableAndReturnError_ = objc.registerName( "checkPromisedItemIsReachableAndReturnError:", ); @@ -1667,15 +1153,7 @@ late final _sel_init = objc.registerName("init"); late final _sel_initWithCoder_ = objc.registerName("initWithCoder:"); late final _sel_instancetypeMethod = objc.registerName("instancetypeMethod"); late final _sel_isKindOfClass_ = objc.registerName("isKindOfClass:"); -late final _sel_itemProviderVisibilityForRepresentationWithTypeIdentifier_ = - objc.registerName( - "itemProviderVisibilityForRepresentationWithTypeIdentifier:", - ); late final _sel_lastPathComponent = objc.registerName("lastPathComponent"); -late final _sel_loadDataWithTypeIdentifier_forItemProviderCompletionHandler_ = - objc.registerName( - "loadDataWithTypeIdentifier:forItemProviderCompletionHandler:", - ); late final _sel_loadResourceDataNotifyingClient_usingCache_ = objc.registerName( "loadResourceDataNotifyingClient:usingCache:", ); @@ -1683,8 +1161,6 @@ late final _sel_method = objc.registerName("method"); late final _sel_mul_Y_ = objc.registerName("mul:Y:"); late final _sel_new = objc.registerName("new"); late final _sel_nsStringExtension = objc.registerName("nsStringExtension"); -late final _sel_objectWithItemProviderData_typeIdentifier_error_ = objc - .registerName("objectWithItemProviderData:typeIdentifier:error:"); late final _sel_pathComponents = objc.registerName("pathComponents"); late final _sel_pathExtension = objc.registerName("pathExtension"); late final _sel_promisedItemResourceValuesForKeys_error_ = objc.registerName( @@ -1692,9 +1168,6 @@ late final _sel_promisedItemResourceValuesForKeys_error_ = objc.registerName( ); late final _sel_propertyForKey_ = objc.registerName("propertyForKey:"); late final _sel_protoMethod = objc.registerName("protoMethod"); -late final _sel_readableTypeIdentifiersForItemProvider = objc.registerName( - "readableTypeIdentifiersForItemProvider", -); late final _sel_resourceDataUsingCache_ = objc.registerName( "resourceDataUsingCache:", ); @@ -1708,9 +1181,6 @@ late final _sel_sub_Y_ = objc.registerName("sub:Y:"); late final _sel_supportsSecureCoding = objc.registerName( "supportsSecureCoding", ); -late final _sel_writableTypeIdentifiersForItemProvider = objc.registerName( - "writableTypeIdentifiersForItemProvider", -); typedef instancetype = ffi.Pointer; typedef Dartinstancetype = objc.ObjCObject; diff --git a/pkgs/ffigen/test/native_objc_test/category_test_bindings.m b/pkgs/ffigen/test/native_objc_test/category_test_bindings.m deleted file mode 100644 index f0761e700f..0000000000 --- a/pkgs/ffigen/test/native_objc_test/category_test_bindings.m +++ /dev/null @@ -1,111 +0,0 @@ -#include -#import -#import -#import "category_test.h" -#import "category_test.h" - -#if !__has_feature(objc_arc) -#error "This file must be compiled with ARC enabled" -#endif - -#pragma clang diagnostic push -#pragma clang diagnostic ignored "-Wundeclared-selector" - -typedef struct { - int64_t version; - void* (*newWaiter)(void); - void (*awaitWaiter)(void*); - void* (*currentIsolate)(void); - void (*enterIsolate)(void*); - void (*exitIsolate)(void); - int64_t (*getMainPortId)(void); - bool (*getCurrentThreadOwnsIsolate)(int64_t); - void (*invokeListenerPortBlock)(int64_t port, void*); - void (*invokeBlockingPortBlock)(int64_t port, void*, void*); -} DOBJC_Context; - -id objc_retainBlock(id); - -#define BLOCKING_BLOCK_IMPL(ctx, TYPE, SIG, INVOKE_DIRECT, INVOKE_LISTENER) \ - assert(ctx->version >= 1); \ - void* targetIsolate = ctx->currentIsolate(); \ - int64_t targetPort = ctx->getMainPortId == NULL ? 0 : ctx->getMainPortId(); \ - __block __weak TYPE weakSelfBlock = nil; \ - TYPE strongSelfBlock = [SIG { \ - void* currentIsolate = ctx->currentIsolate(); \ - bool mayEnterIsolate = \ - currentIsolate == NULL && \ - ctx->getCurrentThreadOwnsIsolate != NULL && \ - ctx->getCurrentThreadOwnsIsolate(targetPort); \ - if (currentIsolate == targetIsolate || mayEnterIsolate) { \ - if (mayEnterIsolate) { \ - ctx->enterIsolate(targetIsolate); \ - } \ - INVOKE_DIRECT; \ - if (mayEnterIsolate) { \ - ctx->exitIsolate(); \ - } \ - } else { \ - void* waiter = ctx->newWaiter(); \ - TYPE selfRetain = [weakSelfBlock copy]; \ - INVOKE_LISTENER; \ - ctx->awaitWaiter(waiter); \ - (void)selfRetain; \ - } \ - } copy]; \ - weakSelfBlock = strongSelfBlock; \ - return strongSelfBlock; - - -__attribute__((visibility("default"))) -@interface _l3cf7j_BlockArgs_pfv6jd : NSObject -@property (copy) id block; -@property (strong) id arg0; -@property (strong) id arg1; -@end -@implementation _l3cf7j_BlockArgs_pfv6jd -@end - -typedef void (^_ListenerTrampoline)(id arg0, id arg1); -__attribute__((visibility("default"))) __attribute__((used)) -_ListenerTrampoline _l3cf7j_wrapListenerBlock_pfv6jd( - int64_t port, DOBJC_Context* ctx) NS_RETURNS_RETAINED { - __block __weak _ListenerTrampoline weakSelfBlock = nil; - _ListenerTrampoline strongSelfBlock = [^void(id arg0, id arg1) { - @autoreleasepool { - _l3cf7j_BlockArgs_pfv6jd* args = [[_l3cf7j_BlockArgs_pfv6jd alloc] init]; - args.block = weakSelfBlock; - args.arg0 = arg0; - args.arg1 = arg1; - ctx->invokeListenerPortBlock(port, (__bridge_retained void*)args); - } - } copy]; - weakSelfBlock = strongSelfBlock; - return strongSelfBlock; -} - -typedef void (^_BlockingTrampoline)(void * waiter, id arg0, id arg1); -__attribute__((visibility("default"))) __attribute__((used)) -_ListenerTrampoline _l3cf7j_wrapBlockingBlock_pfv6jd(int64_t port, DOBJC_Context* ctx, - void (*directInvoke)(void*)) NS_RETURNS_RETAINED { - BLOCKING_BLOCK_IMPL(ctx, _ListenerTrampoline, ^void(id arg0, id arg1), { - @autoreleasepool { - _l3cf7j_BlockArgs_pfv6jd* args = [[_l3cf7j_BlockArgs_pfv6jd alloc] init]; - args.block = weakSelfBlock; - args.arg0 = arg0; - args.arg1 = arg1; - directInvoke((__bridge_retained void*)args); - } - }, { - @autoreleasepool { - _l3cf7j_BlockArgs_pfv6jd* args = [[_l3cf7j_BlockArgs_pfv6jd alloc] init]; - args.block = weakSelfBlock; - args.arg0 = arg0; - args.arg1 = arg1; - ctx->invokeBlockingPortBlock(port, (__bridge_retained void*)args, waiter); - } - }); -} -#undef BLOCKING_BLOCK_IMPL - -#pragma clang diagnostic pop diff --git a/pkgs/ffigen/test/native_objc_test/deprecated_test.dart b/pkgs/ffigen/test/native_objc_test/deprecated_test.dart index 2b86a6fc69..363f17acd3 100644 --- a/pkgs/ffigen/test/native_objc_test/deprecated_test.dart +++ b/pkgs/ffigen/test/native_objc_test/deprecated_test.dart @@ -32,7 +32,7 @@ String bindingsForVersion({Versions? iosVers, Versions? macosVers}) { wrapperDocComment: 'Tests API deprecation', ), ), - headers: Headers( + input: Input( entryPoints: [ Uri.file( path.join( @@ -45,35 +45,20 @@ String bindingsForVersion({Versions? iosVers, Versions? macosVers}) { ], ), objectiveC: ObjectiveC( - interfaces: Interfaces( - include: (decl) => { - 'DeprecatedInterfaceMethods', - 'DeprecatedInterface', - }.contains(decl.originalName), - ), - protocols: Protocols( - include: (decl) => { - 'DeprecatedProtocolMethods', - 'DeprecatedProtocol', - }.contains(decl.originalName), - ), - categories: Categories( - include: (decl) => { - 'DeprecatedCategoryMethods', - 'DeprecatedCategory', - }.contains(decl.originalName), - includeTransitive: false, - ), externalVersions: ExternalVersions(ios: iosVers, macos: macosVers), ), - functions: Functions.includeSet({'normalFunction', 'deprecatedFunction'}), - structs: Structs.includeSet({'NormalStruct', 'DeprecatedStruct'}), - unions: Unions.includeSet({'NormalUnion', 'DeprecatedUnion'}), - enums: Enums.includeSet({'NormalEnum', 'DeprecatedEnum'}), - unnamedEnums: UnnamedEnums.includeSet({ - 'normalUnnamedEnum', - 'deprecatedUnnamedEnum', - }), + visitors: [ + const IncludeSetVisitor( + objcInterfaces: {'DeprecatedInterfaceMethods', 'DeprecatedInterface'}, + objcProtocols: {'DeprecatedProtocolMethods', 'DeprecatedProtocol'}, + objcCategories: {'DeprecatedCategoryMethods', 'DeprecatedCategory'}, + functions: {'normalFunction', 'deprecatedFunction'}, + structs: {'NormalStruct', 'DeprecatedStruct'}, + unions: {'NormalUnion', 'DeprecatedUnion'}, + enums: {'NormalEnum', 'DeprecatedEnum'}, + unnamedEnumConstants: {'normalUnnamedEnum', 'deprecatedUnnamedEnum'}, + ), + ], ).generate(logger: createTestLogger()); final file = path.join( packagePathForTests, diff --git a/pkgs/ffigen/test/native_objc_test/enum_test_bindings.dart b/pkgs/ffigen/test/native_objc_test/enum_test_bindings.dart index 5bd7236129..624ad51faa 100644 --- a/pkgs/ffigen/test/native_objc_test/enum_test_bindings.dart +++ b/pkgs/ffigen/test/native_objc_test/enum_test_bindings.dart @@ -2,6 +2,9 @@ // // Generated by `package:ffigen`. // ignore_for_file: type=lint, unused_import, unused_element, deprecated_member_use_from_same_package +@ffi.DefaultAsset('package:ffigen/objc_test') +library; + import 'dart:ffi' as ffi; import 'package:objective_c/objective_c.dart' as objc; import 'package:ffi/ffi.dart' as pkg_ffi; diff --git a/pkgs/ffigen/test/native_objc_test/error_method_test_bindings.dart b/pkgs/ffigen/test/native_objc_test/error_method_test_bindings.dart index d0d80a1eac..342e32e50b 100644 --- a/pkgs/ffigen/test/native_objc_test/error_method_test_bindings.dart +++ b/pkgs/ffigen/test/native_objc_test/error_method_test_bindings.dart @@ -2,6 +2,9 @@ // // Generated by `package:ffigen`. // ignore_for_file: type=lint, unused_import, unused_element, deprecated_member_use_from_same_package +@ffi.DefaultAsset('package:ffigen/objc_test') +library; + import 'dart:ffi' as ffi; import 'package:objective_c/objective_c.dart' as objc; import 'package:ffi/ffi.dart' as pkg_ffi; diff --git a/pkgs/ffigen/test/native_objc_test/failed_to_load_test_bindings.dart b/pkgs/ffigen/test/native_objc_test/failed_to_load_test_bindings.dart index 5ecf2b7327..8bd3c48f48 100644 --- a/pkgs/ffigen/test/native_objc_test/failed_to_load_test_bindings.dart +++ b/pkgs/ffigen/test/native_objc_test/failed_to_load_test_bindings.dart @@ -2,6 +2,9 @@ // // Generated by `package:ffigen`. // ignore_for_file: type=lint, unused_import, unused_element, deprecated_member_use_from_same_package +@ffi.DefaultAsset('package:ffigen/objc_test') +library; + import 'dart:ffi' as ffi; import 'package:objective_c/objective_c.dart' as objc; import 'package:ffi/ffi.dart' as pkg_ffi; diff --git a/pkgs/ffigen/test/native_objc_test/forward_decl_test_bindings.dart b/pkgs/ffigen/test/native_objc_test/forward_decl_test_bindings.dart index 188e6d8eda..855bf1a850 100644 --- a/pkgs/ffigen/test/native_objc_test/forward_decl_test_bindings.dart +++ b/pkgs/ffigen/test/native_objc_test/forward_decl_test_bindings.dart @@ -2,6 +2,9 @@ // // Generated by `package:ffigen`. // ignore_for_file: type=lint, unused_import, unused_element, deprecated_member_use_from_same_package +@ffi.DefaultAsset('package:ffigen/objc_test') +library; + import 'dart:ffi' as ffi; import 'package:objective_c/objective_c.dart' as objc; import 'package:ffi/ffi.dart' as pkg_ffi; diff --git a/pkgs/ffigen/test/native_objc_test/inherited_instancetype_test_bindings.dart b/pkgs/ffigen/test/native_objc_test/inherited_instancetype_test_bindings.dart index 8b8924ba40..8941ca4cbb 100644 --- a/pkgs/ffigen/test/native_objc_test/inherited_instancetype_test_bindings.dart +++ b/pkgs/ffigen/test/native_objc_test/inherited_instancetype_test_bindings.dart @@ -2,6 +2,9 @@ // // Generated by `package:ffigen`. // ignore_for_file: type=lint, unused_import, unused_element, deprecated_member_use_from_same_package +@ffi.DefaultAsset('package:ffigen/objc_test') +library; + import 'dart:ffi' as ffi; import 'package:objective_c/objective_c.dart' as objc; import 'package:ffi/ffi.dart' as pkg_ffi; diff --git a/pkgs/ffigen/test/native_objc_test/is_instance_test_bindings.dart b/pkgs/ffigen/test/native_objc_test/is_instance_test_bindings.dart index afbc325b2d..dfb2f8cca0 100644 --- a/pkgs/ffigen/test/native_objc_test/is_instance_test_bindings.dart +++ b/pkgs/ffigen/test/native_objc_test/is_instance_test_bindings.dart @@ -2,6 +2,9 @@ // // Generated by `package:ffigen`. // ignore_for_file: type=lint, unused_import, unused_element, deprecated_member_use_from_same_package +@ffi.DefaultAsset('package:ffigen/objc_test') +library; + import 'dart:ffi' as ffi; import 'package:objective_c/objective_c.dart' as objc; import 'package:ffi/ffi.dart' as pkg_ffi; diff --git a/pkgs/ffigen/test/native_objc_test/log_test_bindings.dart b/pkgs/ffigen/test/native_objc_test/log_test_bindings.dart index 769b9ad146..949df16cee 100644 --- a/pkgs/ffigen/test/native_objc_test/log_test_bindings.dart +++ b/pkgs/ffigen/test/native_objc_test/log_test_bindings.dart @@ -2,6 +2,9 @@ // // Generated by `package:ffigen`. // ignore_for_file: type=lint, unused_import, unused_element, deprecated_member_use_from_same_package +@ffi.DefaultAsset('package:ffigen/objc_test') +library; + import 'dart:ffi' as ffi; import 'package:objective_c/objective_c.dart' as objc; import 'package:ffi/ffi.dart' as pkg_ffi; diff --git a/pkgs/ffigen/test/native_objc_test/method_test_bindings.dart b/pkgs/ffigen/test/native_objc_test/method_test_bindings.dart index 105b569bef..8071e21574 100644 --- a/pkgs/ffigen/test/native_objc_test/method_test_bindings.dart +++ b/pkgs/ffigen/test/native_objc_test/method_test_bindings.dart @@ -2,6 +2,9 @@ // // Generated by `package:ffigen`. // ignore_for_file: type=lint, unused_import, unused_element, deprecated_member_use_from_same_package +@ffi.DefaultAsset('package:ffigen/objc_test') +library; + import 'dart:ffi' as ffi; import 'package:objective_c/objective_c.dart' as objc; import 'package:ffi/ffi.dart' as pkg_ffi; 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 08041d2b6f..9ddfe020c2 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 @@ -2,6 +2,9 @@ // // Generated by `package:ffigen`. // ignore_for_file: type=lint, unused_import, unused_element, deprecated_member_use_from_same_package +@ffi.DefaultAsset('package:ffigen/objc_test') +library; + import 'dart:ffi' as ffi; import 'package:objective_c/objective_c.dart' as objc; import 'package:ffi/ffi.dart' as pkg_ffi; diff --git a/pkgs/ffigen/test/native_objc_test/ns_range_test.dart b/pkgs/ffigen/test/native_objc_test/ns_range_test.dart index 6db7b5b2af..2af3ff7dee 100644 --- a/pkgs/ffigen/test/native_objc_test/ns_range_test.dart +++ b/pkgs/ffigen/test/native_objc_test/ns_range_test.dart @@ -34,7 +34,7 @@ void main() { wrapperName: 'NSRangeTestObjCLibrary', ), ), - headers: Headers( + input: Input( entryPoints: [ Uri.file( path.join( @@ -46,12 +46,10 @@ void main() { ), ], ), - objectiveC: ObjectiveC( - interfaces: Interfaces( - include: (decl) => - {'SFTranscriptionSegment'}.contains(decl.originalName), - ), - ), + objectiveC: const ObjectiveC(), + visitors: const [ + IncludeSetVisitor(objcInterfaces: {'SFTranscriptionSegment'}), + ], ).generate(logger: createTestLogger()); final file = path.join( packagePathForTests, diff --git a/pkgs/ffigen/test/native_objc_test/nullable_inheritance_test_bindings.dart b/pkgs/ffigen/test/native_objc_test/nullable_inheritance_test_bindings.dart index d6195255b1..89f9a52ab5 100644 --- a/pkgs/ffigen/test/native_objc_test/nullable_inheritance_test_bindings.dart +++ b/pkgs/ffigen/test/native_objc_test/nullable_inheritance_test_bindings.dart @@ -2,6 +2,9 @@ // // Generated by `package:ffigen`. // ignore_for_file: type=lint, unused_import, unused_element, deprecated_member_use_from_same_package +@ffi.DefaultAsset('package:ffigen/objc_test') +library; + import 'dart:ffi' as ffi; import 'package:objective_c/objective_c.dart' as objc; import 'package:ffi/ffi.dart' as pkg_ffi; diff --git a/pkgs/ffigen/test/native_objc_test/nullable_test_bindings.dart b/pkgs/ffigen/test/native_objc_test/nullable_test_bindings.dart index 60266099eb..ba8f6f1664 100644 --- a/pkgs/ffigen/test/native_objc_test/nullable_test_bindings.dart +++ b/pkgs/ffigen/test/native_objc_test/nullable_test_bindings.dart @@ -2,6 +2,9 @@ // // Generated by `package:ffigen`. // ignore_for_file: type=lint, unused_import, unused_element, deprecated_member_use_from_same_package +@ffi.DefaultAsset('package:ffigen/objc_test') +library; + import 'dart:ffi' as ffi; import 'package:objective_c/objective_c.dart' as objc; import 'package:ffi/ffi.dart' as pkg_ffi; diff --git a/pkgs/ffigen/test/native_objc_test/property_test_bindings.dart b/pkgs/ffigen/test/native_objc_test/property_test_bindings.dart index 01cd8da433..c153f673a9 100644 --- a/pkgs/ffigen/test/native_objc_test/property_test_bindings.dart +++ b/pkgs/ffigen/test/native_objc_test/property_test_bindings.dart @@ -2,6 +2,9 @@ // // Generated by `package:ffigen`. // ignore_for_file: type=lint, unused_import, unused_element, deprecated_member_use_from_same_package +@ffi.DefaultAsset('package:ffigen/objc_test') +library; + import 'dart:ffi' as ffi; import 'package:objective_c/objective_c.dart' as objc; import 'package:ffi/ffi.dart' as pkg_ffi; diff --git a/pkgs/ffigen/test/native_objc_test/rename_test_bindings.dart b/pkgs/ffigen/test/native_objc_test/rename_test_bindings.dart index 2e6adbb7d9..ea954ae1ef 100644 --- a/pkgs/ffigen/test/native_objc_test/rename_test_bindings.dart +++ b/pkgs/ffigen/test/native_objc_test/rename_test_bindings.dart @@ -2,6 +2,9 @@ // // Generated by `package:ffigen`. // ignore_for_file: type=lint, unused_import, unused_element, deprecated_member_use_from_same_package +@ffi.DefaultAsset('package:ffigen/objc_test') +library; + import 'dart:ffi' as ffi; import 'package:objective_c/objective_c.dart' as objc; import 'package:ffi/ffi.dart' as pkg_ffi; diff --git a/pkgs/ffigen/test/native_objc_test/runtime_version_test_bindings.dart b/pkgs/ffigen/test/native_objc_test/runtime_version_test_bindings.dart index 932aac144a..d40b182bd3 100644 --- a/pkgs/ffigen/test/native_objc_test/runtime_version_test_bindings.dart +++ b/pkgs/ffigen/test/native_objc_test/runtime_version_test_bindings.dart @@ -4,6 +4,9 @@ // // Generated by `package:ffigen`. // ignore_for_file: type=lint, unused_import, deprecated_member_use_from_same_package +@ffi.DefaultAsset('package:ffigen/objc_test') +library; + import 'dart:ffi' as ffi; import 'package:objective_c/objective_c.dart' as objc; import 'package:ffi/ffi.dart' as pkg_ffi; @@ -312,14 +315,6 @@ final _class_FutureAPIMethods = objc.getClass( _class_FutureAPIMethods_raw, ).cast(), ); -@ffi.Native>(symbol: 'OBJC_CLASS_\$_NSObject') -external ffi.Pointer _class_NSObject_raw; -final _class_NSObject = objc.getClass( - "NSObject", - () => ffi.Native.addressOf>( - _class_NSObject_raw, - ).cast(), -); final _objc_msgSend_13yqbb6 = objc.msgSendPointer .cast< ffi.NativeFunction< diff --git a/pkgs/ffigen/test/native_objc_test/sdk_variable_test_bindings.dart b/pkgs/ffigen/test/native_objc_test/sdk_variable_test_bindings.dart index aa89553bcb..9b8d26aea5 100644 --- a/pkgs/ffigen/test/native_objc_test/sdk_variable_test_bindings.dart +++ b/pkgs/ffigen/test/native_objc_test/sdk_variable_test_bindings.dart @@ -2,6 +2,9 @@ // // Generated by `package:ffigen`. // ignore_for_file: type=lint, unused_import, unused_element, deprecated_member_use_from_same_package +@ffi.DefaultAsset('package:ffigen/objc_test') +library; + import 'dart:ffi' as ffi; import 'package:objective_c/objective_c.dart' as objc; import 'package:ffi/ffi.dart' as pkg_ffi; diff --git a/pkgs/ffigen/test/native_objc_test/string_test_bindings.dart b/pkgs/ffigen/test/native_objc_test/string_test_bindings.dart index 2f6d7a520c..94a21fdc76 100644 --- a/pkgs/ffigen/test/native_objc_test/string_test_bindings.dart +++ b/pkgs/ffigen/test/native_objc_test/string_test_bindings.dart @@ -2,6 +2,9 @@ // // Generated by `package:ffigen`. // ignore_for_file: type=lint, unused_import, unused_element, deprecated_member_use_from_same_package +@ffi.DefaultAsset('package:ffigen/objc_test') +library; + import 'dart:ffi' as ffi; import 'package:objective_c/objective_c.dart' as objc; import 'package:ffi/ffi.dart' as pkg_ffi; diff --git a/pkgs/ffigen/test/native_objc_test/swift_unavailable_test.dart b/pkgs/ffigen/test/native_objc_test/swift_unavailable_test.dart index 84aa4a59b1..fffacaf47d 100644 --- a/pkgs/ffigen/test/native_objc_test/swift_unavailable_test.dart +++ b/pkgs/ffigen/test/native_objc_test/swift_unavailable_test.dart @@ -35,7 +35,7 @@ void main() { wrapperDocComment: 'Tests SWIFT_UNAVAILABLE annotation', ), ), - headers: Headers( + input: Input( entryPoints: [ Uri.file( path.join( @@ -47,11 +47,10 @@ void main() { ), ], ), - objectiveC: ObjectiveC( - interfaces: Interfaces( - include: (decl) => {'Animal'}.contains(decl.originalName), - ), - ), + objectiveC: const ObjectiveC(), + visitors: const [ + IncludeSetVisitor(objcInterfaces: {'Animal'}), + ], ).generate(logger: createTestLogger()); final file = path.join( packagePathForTests, diff --git a/pkgs/ffigen/test/native_objc_test/transitive_test.dart b/pkgs/ffigen/test/native_objc_test/transitive_test.dart index 371987996f..ca4a696f5f 100644 --- a/pkgs/ffigen/test/native_objc_test/transitive_test.dart +++ b/pkgs/ffigen/test/native_objc_test/transitive_test.dart @@ -14,11 +14,7 @@ import 'package:path/path.dart' as path; import 'package:test/test.dart'; import '../test_utils.dart'; -String generate({ - bool includeTransitiveObjCInterfaces = false, - bool includeTransitiveObjCProtocols = false, - bool includeTransitiveObjCCategories = false, -}) { +String generate({bool includeTransitiveObjCCategories = true}) { FfiGenerator( output: Output( dartFile: Uri.file( @@ -35,7 +31,7 @@ String generate({ wrapperDocComment: 'Tests transitive inclusion', ), ), - headers: Headers( + input: Input( entryPoints: [ Uri.file( path.join( @@ -47,27 +43,35 @@ String generate({ ), ], ), - objectiveC: ObjectiveC( - interfaces: Interfaces( - include: (decl) => { - 'DirectlyIncluded', - 'DirectlyIncludedWithProtocol', - 'DirectlyIncludedIntForCat', - 'Bug2935DirectInterface', - }.contains(decl.originalName), - includeTransitive: includeTransitiveObjCInterfaces, + objectiveC: const ObjectiveC(), + visitors: [ + Visitor.callback( + visitObjCInterface: (node) { + if ({ + 'DirectlyIncluded', + 'DirectlyIncludedWithProtocol', + 'DirectlyIncludedIntForCat', + 'Bug2935DirectInterface', + }.contains(node.originalName)) { + node.isIncluded = true; + } + node.includeCategories = includeTransitiveObjCCategories; + }, + visitObjCProtocol: (node) { + if ({'DirectlyIncludedProtocol'}.contains(node.originalName)) { + node.isIncluded = true; + } + }, + visitObjCCategory: (node) { + if ({'DirectlyIncludedCategory'}.contains(node.originalName)) { + node.isIncluded = true; + } + }, + visitEnum: (node) { + node.silenceWarning = true; + }, ), - protocols: Protocols( - include: (decl) => - {'DirectlyIncludedProtocol'}.contains(decl.originalName), - includeTransitive: includeTransitiveObjCProtocols, - ), - categories: Categories( - include: (decl) => - {'DirectlyIncludedCategory'}.contains(decl.originalName), - includeTransitive: includeTransitiveObjCCategories, - ), - ), + ], ).generate(logger: createTestLogger()); final file = path.join( packagePathForTests, @@ -87,30 +91,29 @@ void main() { Inclusion incItf(String name) { final classDef = bindings.contains( - 'extension type $name._(objc.ObjCObject ', + RegExp('extension type \\b$name\\._\\(objc\\.ObjCObject '), ); - final stubWarn = bindings.contains('WARNING: $name is a stub.'); final isInst = bindings.contains( '/// Returns whether [obj] is an instance of [$name].', ); - final any = bindings.contains(RegExp('\\W$name\\W')); - if (classDef && stubWarn && !isInst && any) return Inclusion.stubbed; - if (classDef && !stubWarn && isInst && any) return Inclusion.included; - if (!classDef && !stubWarn && !isInst && !any) return Inclusion.omitted; - throw Exception( - 'Bad interface: $name ($classDef, $stubWarn, $isInst, $any)', - ); + final any = bindings.contains(RegExp('\\b$name\\b')); + if (classDef && !isInst && any) return Inclusion.stubbed; + if (classDef && isInst && any) return Inclusion.included; + if (!classDef && !isInst && !any) return Inclusion.omitted; + throw Exception('Bad interface: $name ($classDef, $isInst, $any)'); } Inclusion incProto(String name) { final classDef = bindings.contains( - 'extension type $name._(objc.ObjCProtocol ', + RegExp('extension type \\b$name\\._\\(objc\\.ObjCProtocol '), + ); + final stubWarn = bindings.contains( + RegExp('WARNING: \\b$name is a stub\\.'), ); - final stubWarn = bindings.contains('WARNING: $name is a stub.'); final hasImpl = bindings.contains( '/// Adds the implementation of the $name protocol', ); - final any = bindings.contains(RegExp('\\W$name\\W')); + final any = bindings.contains(RegExp('\\b$name\\b')); if (classDef && stubWarn && !hasImpl && any) return Inclusion.stubbed; if (classDef && !stubWarn && hasImpl && any) return Inclusion.included; if (!classDef && !stubWarn && !hasImpl && !any) return Inclusion.omitted; @@ -120,53 +123,16 @@ void main() { } Inclusion incCat(String name) { - final classDef = bindings.contains('extension $name '); - final any = bindings.contains(RegExp('\\W$name\\W')); + final classDef = bindings.contains(RegExp('extension \\b$name\\b')); + final any = bindings.contains(RegExp('\\b$name\\b')); if (classDef && any) return Inclusion.included; if (!classDef && !any) return Inclusion.omitted; - throw Exception('Bad protocol: $name ($classDef, $any)'); + throw Exception('Bad category: $name ($classDef, $any)'); } group('transitive interfaces', () { - test('included', () { - bindings = generate(includeTransitiveObjCInterfaces: true); - - expect(incItf('DoublyTransitive'), Inclusion.included); - expect(incItf('TransitiveSuper'), Inclusion.included); - expect(incItf('Transitive'), Inclusion.included); - expect(incItf('SuperSuperType'), Inclusion.included); - expect(incItf('DoublySuperTransitive'), Inclusion.included); - expect(incItf('SuperTransitive'), Inclusion.included); - expect(incItf('SuperType'), Inclusion.included); - expect(incItf('DirectlyIncluded'), Inclusion.included); - expect(incItf('NotIncludedSuperType'), Inclusion.omitted); - expect(incItf('NotIncludedTransitive'), Inclusion.omitted); - expect(incItf('NotIncludedSuperType'), Inclusion.omitted); - expect(incItf('Bug2935DirectInterface'), Inclusion.included); - expect(incItf('Bug2935TransitiveInterface'), Inclusion.included); - expect(incItf('Bug2935TransitiveBlockInterface'), Inclusion.included); - - expect(bindings.contains('doubleMethod'), isTrue); - expect(bindings.contains('transitiveSuperMethod'), isTrue); - expect(bindings.contains('transitiveMethod'), isTrue); - expect(bindings.contains('superSuperMethod'), isTrue); - expect(bindings.contains('doublySuperMethod'), isTrue); - expect(bindings.contains('superTransitiveMethod'), isTrue); - expect(bindings.contains('superMethod'), isTrue); - expect(bindings.contains('directMethod'), isTrue); - expect(bindings.contains('notIncludedSuperMethod'), isFalse); - expect(bindings.contains('notIncludedTransitiveMethod'), isFalse); - expect(bindings.contains('notIncludedMethod'), isFalse); - expect(bindings.contains('bug2935DirectInterfaceMethod'), isTrue); - expect(bindings.contains('bug2935TransitiveInterfaceMethod'), isTrue); - expect( - bindings.contains('bug2935TransitiveBlockInterfaceMethod'), - isTrue, - ); - }); - test('stubbed', () { - bindings = generate(includeTransitiveObjCInterfaces: false); + bindings = generate(); expect(incItf('DoublyTransitive'), Inclusion.omitted); expect(incItf('TransitiveSuper'), Inclusion.stubbed); @@ -204,46 +170,8 @@ void main() { }); group('transitive protocols', () { - test('included', () { - bindings = generate(includeTransitiveObjCProtocols: true); - - expect(incProto('DoublyTransitiveProtocol'), Inclusion.included); - expect(incProto('TransitiveSuperProtocol'), Inclusion.included); - expect(incProto('TransitiveProtocol'), Inclusion.included); - expect(incProto('SuperSuperProtocol'), Inclusion.included); - expect(incProto('DoublySuperTransitiveProtocol'), Inclusion.included); - expect(incProto('SuperTransitiveProtocol'), Inclusion.included); - expect(incProto('SuperProtocol'), Inclusion.included); - expect(incProto('AnotherSuperProtocol'), Inclusion.included); - expect(incProto('DirectlyIncludedProtocol'), Inclusion.included); - expect(incProto('NotIncludedSuperProtocol'), Inclusion.omitted); - expect(incProto('NotIncludedTransitiveProtocol'), Inclusion.omitted); - expect(incProto('NotIncludedProtocol'), Inclusion.omitted); - expect(incProto('SuperFromInterfaceProtocol'), Inclusion.included); - expect(incProto('TransitiveFromInterfaceProtocol'), Inclusion.included); - expect(incItf('DirectlyIncludedWithProtocol'), Inclusion.included); - expect(incProto('Bug2935TransitiveProtocol'), Inclusion.included); - - expect(bindings.contains('doubleProtoMethod'), isTrue); - expect(bindings.contains('transitiveSuperProtoMethod'), isTrue); - expect(bindings.contains('transitiveProtoMethod'), isTrue); - expect(bindings.contains('superSuperProtoMethod'), isTrue); - expect(bindings.contains('doublySuperProtoMethod'), isTrue); - expect(bindings.contains('superTransitiveProtoMethod'), isTrue); - expect(bindings.contains('superProtoMethod'), isTrue); - expect(bindings.contains('anotherSuperProtoMethod'), isTrue); - expect(bindings.contains('directProtoMethod'), isTrue); - expect(bindings.contains('notIncludedSuperProtoMethod'), isFalse); - expect(bindings.contains('notIncludedTransitiveProtoMethod'), isFalse); - expect(bindings.contains('notIncludedProtoMethod'), isFalse); - expect(bindings.contains('superFromInterfaceProtoMethod'), isTrue); - expect(bindings.contains('transitiveFromInterfaceProtoMethod'), isTrue); - expect(bindings.contains('directlyIncludedWithProtoMethod'), isTrue); - expect(bindings.contains('bug2935TransitiveProtocolMethod'), isTrue); - }); - test('not included', () { - bindings = generate(includeTransitiveObjCProtocols: false); + bindings = generate(); expect(incProto('DoublyTransitiveProtocol'), Inclusion.omitted); expect(incProto('TransitiveSuperProtocol'), Inclusion.stubbed); diff --git a/pkgs/ffigen/test/native_objc_test/transitive_test.h b/pkgs/ffigen/test/native_objc_test/transitive_test.h index b5bd49e15f..76489a0369 100644 --- a/pkgs/ffigen/test/native_objc_test/transitive_test.h +++ b/pkgs/ffigen/test/native_objc_test/transitive_test.h @@ -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 + // === Interfaces === @interface DoublyTransitive {} diff --git a/pkgs/ffigen/test/native_objc_test/typedef_test_bindings.dart b/pkgs/ffigen/test/native_objc_test/typedef_test_bindings.dart index 3dbd0f8b85..bf5b3b5eb8 100644 --- a/pkgs/ffigen/test/native_objc_test/typedef_test_bindings.dart +++ b/pkgs/ffigen/test/native_objc_test/typedef_test_bindings.dart @@ -2,6 +2,9 @@ // // Generated by `package:ffigen`. // ignore_for_file: type=lint, unused_import, unused_element, deprecated_member_use_from_same_package +@ffi.DefaultAsset('package:ffigen/objc_test') +library; + import 'dart:ffi' as ffi; import 'package:objective_c/objective_c.dart' as objc; import 'package:ffi/ffi.dart' as pkg_ffi; diff --git a/pkgs/ffigen/test/public_ast_visitor_test.dart b/pkgs/ffigen/test/public_ast_visitor_test.dart new file mode 100644 index 0000000000..5c6d7ce012 --- /dev/null +++ b/pkgs/ffigen/test/public_ast_visitor_test.dart @@ -0,0 +1,294 @@ +// Copyright (c) 2026, 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 'dart:io'; + +import 'package:ffigen/ffigen.dart'; +import 'package:ffigen/src/code_generator.dart' as code_gen; +import 'package:ffigen/src/header_parser.dart' as parser; +import 'package:test/test.dart'; + +import 'test_utils.dart'; + +class CustomRenamerVisitor extends Visitor { + CustomRenamerVisitor(); + + @override + void visitFunc(Func node) { + if (node.originalName == 'func1') { + node.name = 'myCustomFunc'; + } + } + + @override + void visitStruct(Struct node) { + if (node.originalName == 'StructA') { + node.name = 'MyStructA'; + } + super.visitStruct(node); + } + + @override + void visitField(Field node) { + if (node.originalName == 'foo') { + node.name = 'bar'; + } + } +} + +class CustomExcluderVisitor extends Visitor { + CustomExcluderVisitor(); + + @override + void visitFunc(Func node) { + if (node.originalName == 'func2') { + node.isIncluded = false; + } + } + + @override + void visitStruct(Struct node) { + if (node.originalName == 'StructB') { + node.isIncluded = false; + } + } +} + +class CustomLeafVisitor extends Visitor { + CustomLeafVisitor(); + + @override + void visitFunc(Func node) { + if (node.originalName == 'func1' || node.name == 'myCustomFunc') { + node.isLeaf = true; + } + } +} + +void main() { + group('Public AST Visitors Test', () { + test('Visitor renaming, excluding, and leaf setting', () { + final headerUri = Uri.file( + absPath('test/header_parser_tests/functions.h'), + ); + final generator = FfiGenerator( + input: Input(entryPoints: [headerUri]), + output: Output(dartFile: Uri.file('unused.dart')), + visitors: [ + const IncludeAllVisitor(), + CustomRenamerVisitor(), + CustomExcluderVisitor(), + CustomLeafVisitor(), + ], + ); + + final library = parser.parse(testContext(generator)); + + // Check that func1 was renamed to myCustomFunc and marked leaf + final customFunc = library.getBinding('myCustomFunc') as code_gen.Func; + expect(customFunc.name, 'myCustomFunc'); + expect(customFunc.isLeaf, isTrue); + + // Check that func2 was excluded + expect( + () => library.getBinding('func2'), + throwsA(isA()), + ); + }); + + test('Automatic AST walking via visitChildren', () { + final headerUri = Uri.file( + absPath('test/header_parser_tests/function_n_struct.h'), + ); + final autoWalker = _AutoWalkVisitor(); + final generator = FfiGenerator( + input: Input(entryPoints: [headerUri]), + output: Output(dartFile: Uri.file('unused.dart')), + visitors: [const IncludeAllVisitor(), autoWalker], + ); + + parser.parse(testContext(generator)); + + // Verify fields were visited without manually looping inside visitStruct + expect(autoWalker.visitedFieldNames, contains('a')); + }); + + test('Inline callback-based Visitor constructor', () { + final headerUri = Uri.file( + absPath('test/header_parser_tests/function_n_struct.h'), + ); + final visitedFields = []; + final generator = FfiGenerator( + input: Input(entryPoints: [headerUri]), + output: Output(dartFile: Uri.file('unused.dart')), + visitors: [ + const IncludeAllVisitor(), + Visitor.callback( + visitFunc: (node) { + if (node.originalName == 'func1') { + node.name = 'inlineRenamedFunc1'; + } + }, + visitField: (node) { + visitedFields.add(node.originalName); + }, + ), + ], + ); + + final library = parser.parse(testContext(generator)); + + final renamedFunc = + library.getBinding('inlineRenamedFunc1') as code_gen.Func; + expect(renamedFunc.name, 'inlineRenamedFunc1'); + expect(visitedFields, contains('a')); + }); + + test('IncludeSetVisitor per-type inclusion', () { + final headerUri = Uri.file( + absPath('test/header_parser_tests/function_n_struct.h'), + ); + final generator = FfiGenerator( + input: Input(entryPoints: [headerUri]), + output: Output(dartFile: Uri.file('unused.dart')), + visitors: [ + const IncludeAllVisitor(), + const IncludeSetVisitor(functions: {'func1'}, structs: {'Struct1'}), + ], + ); + + final library = parser.parse(testContext(generator)); + + expect(library.getBinding('func1'), isNotNull); + expect( + () => library.getBinding('func2'), + throwsA(isA()), + ); + expect(library.getBinding('Struct1'), isNotNull); + expect( + () => library.getBinding('Struct6'), + throwsA(isA()), + ); + }); + + test('EnumClass.silenceWarning option on public AST', () { + final headerUri = Uri.file( + absPath('test/header_parser_tests/enum_int_mimic.h'), + ); + final generator = FfiGenerator( + input: Input(entryPoints: [headerUri]), + output: Output(dartFile: Uri.file('unused.dart')), + visitors: [ + const IncludeAllVisitor(), + Visitor.callback( + visitEnum: (node) { + node.silenceWarning = true; + }, + ), + ], + ); + + final library = parser.parse(testContext(generator)); + final enumClass = library.getBinding('Simple') as code_gen.EnumClass; + expect(enumClass.silenceWarning, isTrue); + }); + + test('EnumClass.style nullability on public AST', () { + final headerUri = Uri.file( + absPath('test/header_parser_tests/enum_int_mimic.h'), + ); + EnumStyle? initialStyle; + final generator = FfiGenerator( + input: Input(entryPoints: [headerUri]), + output: Output(dartFile: Uri.file('unused.dart')), + visitors: [ + const IncludeAllVisitor(), + Visitor.callback( + visitEnum: (node) { + initialStyle = node.style; + node.style = EnumStyle.intConstants; + }, + ), + ], + ); + + final library = parser.parse(testContext(generator)); + final enumClass = library.getBinding('Simple') as code_gen.EnumClass; + expect(initialStyle, isNull); + expect(enumClass.style, EnumStyle.intConstants); + expect(enumClass.resolvedStyle, EnumStyle.intConstants); + }); + + test( + 'ObjCInterface.includeCategories option on public AST', + () { + final headerUri = Uri.file( + absPath('test/native_objc_test/transitive_test.h'), + ); + final generator = FfiGenerator( + input: Input(entryPoints: [headerUri]), + output: Output(dartFile: Uri.file('unused.dart')), + objectiveC: const ObjectiveC(), + visitors: [ + const IncludeSetVisitor( + objcInterfaces: {'DirectlyIncludedIntForCat'}, + ), + Visitor.callback( + visitObjCInterface: (node) { + if (node.originalName == 'DirectlyIncludedIntForCat') { + expect(node.includeCategories, isTrue); + node.includeCategories = false; + expect(node.includeCategories, isFalse); + } + }, + ), + ], + ); + + final library = parser.parse(testContext(generator)); + final interface = + library.getBinding('DirectlyIncludedIntForCat') + as code_gen.ObjCInterface; + expect(interface.includeCategories, isFalse); + }, + skip: !Platform.isMacOS ? 'macOS specific test' : null, + ); + + test('Visitor setting varArgs for variadic functions', () { + final headerUri = Uri.file(absPath('test/header_parser_tests/varargs.h')); + final generator = FfiGenerator( + input: Input(entryPoints: [headerUri]), + output: Output(dartFile: Uri.file('unused.dart')), + visitors: [ + const IncludeAllVisitor(), + Visitor.callback( + visitFunc: (Func node) { + if (node.originalName == 'myfunc') { + node.varArgs = [ + VarArgFunction('custom', [code_gen.intType]), + ]; + } + }, + ), + ], + ); + + final library = parser.parse(testContext(generator)); + final func = library.getBinding('myfunccustom') as code_gen.Func; + expect(func, isNotNull); + expect(func.name, 'myfunccustom'); + }); + }); +} + +class _AutoWalkVisitor extends Visitor { + _AutoWalkVisitor(); + + final visitedFieldNames = []; + + @override + void visitField(Field node) { + visitedFieldNames.add(node.originalName); + } +} diff --git a/pkgs/ffigen/test/test_utils.dart b/pkgs/ffigen/test/test_utils.dart index 666d800678..67a477e580 100644 --- a/pkgs/ffigen/test/test_utils.dart +++ b/pkgs/ffigen/test/test_utils.dart @@ -4,12 +4,13 @@ import 'dart:ffi'; import 'dart:io'; -import 'package:ffi/ffi.dart'; +import 'package:ffi/ffi.dart'; import 'package:ffigen/src/code_generator.dart'; import 'package:ffigen/src/code_generator/scope.dart'; import 'package:ffigen/src/code_generator/utils.dart'; import 'package:ffigen/src/config_provider/config.dart'; +import 'package:ffigen/src/config_provider/public_ast.dart'; import 'package:ffigen/src/config_provider/utils.dart'; import 'package:ffigen/src/config_provider/yaml_config.dart'; import 'package:ffigen/src/context.dart'; @@ -21,6 +22,8 @@ import 'package:path/path.dart' as path; import 'package:test/test.dart'; import 'package:yaml/yaml.dart' as yaml; +export 'package:ffigen/src/config_provider/public_ast.dart' + show ExcludeAllVisitor, IncludeAllVisitor, IncludeSetVisitor, Visitor; export 'package:ffigen/src/config_provider/utils.dart'; Context testContext([FfiGenerator? generator]) { @@ -29,7 +32,11 @@ Context testContext([FfiGenerator? generator]) { )..createSync(recursive: true)).createTempSync(); return Context( createTestLogger(), - generator ?? FfiGenerator(output: Output(dartFile: Uri.file('unused'))), + generator ?? + FfiGenerator( + visitors: const [IncludeAllVisitor()], + output: Output(dartFile: Uri.file('unused')), + ), tmpDir: tmpDir.path, ); } diff --git a/pkgs/ffigen/test/unit_tests/config_util_test.dart b/pkgs/ffigen/test/unit_tests/config_util_test.dart index b928ed54a4..09c968edcd 100644 --- a/pkgs/ffigen/test/unit_tests/config_util_test.dart +++ b/pkgs/ffigen/test/unit_tests/config_util_test.dart @@ -1,48 +1,44 @@ -// Copyright (c) 2025, 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/ffigen.dart'; +import 'package:ffigen/src/code_generator.dart' as code_gen; import 'package:test/test.dart'; -Declaration decl(String name) => Declaration(usr: '', originalName: name); - -void main() { - group('Declarations utils', () { - test('includeSet', () { - final includer = Declarations.includeSet({'foo', 'bar'}); - expect(includer(decl('foo')), isTrue); - expect(includer(decl('bar')), isTrue); - expect(includer(decl('baz')), isFalse); - }); +import '../test_utils.dart'; - test('includeMemberSet', () { - final includer = Declarations.includeMemberSet({ - 'foo': {'bar'}, - }); - expect(includer(decl('foo'), 'bar'), isTrue); - expect(includer(decl('foo'), 'baz'), isFalse); - expect(includer(decl('goo'), 'bar'), isTrue); - expect(includer(decl('goo'), 'baz'), isTrue); - }); +Struct createStruct(String name) { + final generator = FfiGenerator( + input: const Input(entryPoints: []), + output: Output(dartFile: Uri.file('unused.dart')), + ); + return Struct( + code_gen.Struct( + context: testContext(generator), + name: name, + originalName: name, + usr: name, + ), + ); +} - test('renameWithMap', () { - final renamer = Declarations.renameWithMap({'foo': 'bar'}); - expect(renamer(decl('foo')), 'bar'); - expect(renamer(decl('bar')), 'bar'); - expect(renamer(decl('baz')), 'baz'); +void main() { + group('Visitor utils', () { + test('IncludeSetVisitor', () { + final visitor = const IncludeSetVisitor(structs: {'foo', 'bar'}); + final structFoo = createStruct('foo'); + final structBaz = createStruct('baz'); + visitor.visitStruct(structFoo); + visitor.visitStruct(structBaz); + expect(structFoo.isIncluded, isTrue); + expect(structBaz.isIncluded, isFalse); }); - test('renameMemberWithMap', () { - final renamer = Declarations.renameMemberWithMap({ - 'foo': {'bar': 'baz'}, - }); - expect(renamer(decl('foo'), 'bar'), 'baz'); - expect(renamer(decl('foo'), 'baz'), 'baz'); - expect(renamer(decl('foo'), 'bop'), 'bop'); - expect(renamer(decl('goo'), 'bar'), 'bar'); - expect(renamer(decl('goo'), 'baz'), 'baz'); - expect(renamer(decl('goo'), 'bop'), 'bop'); + test('RenameMapVisitor', () { + final visitor = const RenameMapVisitor({'foo': 'bar'}); + final structFoo = createStruct('foo'); + final structBaz = createStruct('baz'); + visitor.visitStruct(structFoo); + visitor.visitStruct(structBaz); + expect(structFoo.name, 'bar'); + expect(structBaz.name, 'baz'); }); }); } diff --git a/pkgs/ffigen/test/unit_tests/objc_inheritance_edge_case_test.dart b/pkgs/ffigen/test/unit_tests/objc_inheritance_edge_case_test.dart index 9965822210..4cd930ebbc 100644 --- a/pkgs/ffigen/test/unit_tests/objc_inheritance_edge_case_test.dart +++ b/pkgs/ffigen/test/unit_tests/objc_inheritance_edge_case_test.dart @@ -18,11 +18,9 @@ void main() { externalVersions: const ExternalVersions(), ); final config = FfiGenerator( + visitors: const [IncludeAllVisitor()], output: Output(dartFile: Uri.file('unused')), - objectiveC: const ObjectiveC( - interfaces: Interfaces.includeAll, - categories: Categories.includeAll, - ), + objectiveC: const ObjectiveC(), ); late Context context; final voidType = NativeType(SupportedNativeType.voidType); diff --git a/pkgs/ffigen/tool/check_sorted_bindings.dart b/pkgs/ffigen/tool/check_sorted_bindings.dart new file mode 100644 index 0000000000..81c5655902 --- /dev/null +++ b/pkgs/ffigen/tool/check_sorted_bindings.dart @@ -0,0 +1,303 @@ +// 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 'dart:io'; +import 'dart:typed_data'; + +import 'package:path/path.dart' as path; + +import 'summarize_bindings.dart'; + +class FileInfo { + final File file; + final String repoRelativePath; + final int size; + + FileInfo({ + required this.file, + required this.repoRelativePath, + required this.size, + }); +} + +enum _DiffOpType { equal, insert, delete } + +class _DiffOp { + final _DiffOpType type; + final String text; + final int oldLine; + final int newLine; + + _DiffOp(this.type, this.text, this.oldLine, this.newLine); +} + +String createUnifiedDiff( + String oldContent, + String newContent, { + required String oldHeader, + required String newHeader, + int contextSize = 3, +}) { + final oldLines = oldContent.split('\n'); + if (oldLines.isNotEmpty && oldLines.last.isEmpty) oldLines.removeLast(); + final newLines = newContent.split('\n'); + if (newLines.isNotEmpty && newLines.last.isEmpty) newLines.removeLast(); + + final m = oldLines.length; + final n = newLines.length; + + final dp = List.generate(m + 1, (_) => Int32List(n + 1)); + for (var i = m - 1; i >= 0; i--) { + for (var j = n - 1; j >= 0; j--) { + if (oldLines[i] == newLines[j]) { + dp[i][j] = 1 + dp[i + 1][j + 1]; + } else { + dp[i][j] = dp[i + 1][j] > dp[i][j + 1] ? dp[i + 1][j] : dp[i][j + 1]; + } + } + } + + var i = 0, j = 0; + final edits = <_DiffOp>[]; + while (i < m && j < n) { + if (oldLines[i] == newLines[j]) { + edits.add(_DiffOp(_DiffOpType.equal, oldLines[i], i + 1, j + 1)); + i++; + j++; + } else if (dp[i + 1][j] >= dp[i][j + 1]) { + edits.add(_DiffOp(_DiffOpType.delete, oldLines[i], i + 1, j + 1)); + i++; + } else { + edits.add(_DiffOp(_DiffOpType.insert, newLines[j], i + 1, j + 1)); + j++; + } + } + while (i < m) { + edits.add(_DiffOp(_DiffOpType.delete, oldLines[i], i + 1, j + 1)); + i++; + } + while (j < n) { + edits.add(_DiffOp(_DiffOpType.insert, newLines[j], i + 1, j + 1)); + j++; + } + + final hasDiff = edits.any((e) => e.type != _DiffOpType.equal); + if (!hasDiff) return ''; + + final buf = StringBuffer(); + buf.writeln('--- $oldHeader'); + buf.writeln('+++ $newHeader'); + + var idx = 0; + while (idx < edits.length) { + while (idx < edits.length && edits[idx].type == _DiffOpType.equal) { + idx++; + } + if (idx >= edits.length) break; + + final hunkStart = (idx - contextSize).clamp(0, edits.length); + var hunkEnd = idx; + while (hunkEnd < edits.length) { + if (edits[hunkEnd].type != _DiffOpType.equal) { + hunkEnd = (hunkEnd + contextSize + 1).clamp(0, edits.length); + } else { + var nextChange = hunkEnd; + while (nextChange < edits.length && + edits[nextChange].type == _DiffOpType.equal) { + nextChange++; + } + if (nextChange < edits.length && + nextChange - hunkEnd <= contextSize * 2) { + hunkEnd = nextChange; + } else { + break; + } + } + } + + final hunkEdits = edits.sublist(hunkStart, hunkEnd); + final oldStart = hunkEdits.first.oldLine; + final oldLength = hunkEdits + .where((e) => e.type != _DiffOpType.insert) + .length; + final newStart = hunkEdits.first.newLine; + final newLength = hunkEdits + .where((e) => e.type != _DiffOpType.delete) + .length; + + buf.writeln('@@ -$oldStart,$oldLength +$newStart,$newLength @@'); + for (final edit in hunkEdits) { + switch (edit.type) { + case _DiffOpType.equal: + buf.writeln(' ${edit.text}'); + break; + case _DiffOpType.delete: + buf.writeln('-${edit.text}'); + break; + case _DiffOpType.insert: + buf.writeln('+${edit.text}'); + break; + } + } + idx = hunkEnd; + } + + return buf.toString(); +} + +String findRepoRoot() { + try { + final result = Process.runSync('git', ['rev-parse', '--show-toplevel']); + if (result.exitCode == 0) { + return (result.stdout as String).trim(); + } + } catch (_) {} + + var current = Directory.current.absolute; + while (current.path != current.parent.path) { + if (Directory(path.join(current.path, 'pkgs')).existsSync()) { + return current.path; + } + current = current.parent; + } + return Directory.current.absolute.path; +} + +bool isExcludedPath(String relativePath) { + final parts = path.split(relativePath); + for (final part in parts) { + if (part == 'temp' || part == 'bin' || part.startsWith('.temp')) { + return true; + } + } + return false; +} + +bool isGeneratedBindingFile(File file) { + final filename = path.basename(file.path); + if (filename == 'writer.dart') { + return false; + } + if (filename.startsWith('_expected_') && filename.endsWith('.dart')) { + return true; + } + try { + final content = file.readAsStringSync(); + if (content.contains('AUTO GENERATED FILE')) { + return true; + } + } catch (_) {} + return false; +} + +Future main() async { + final repoRoot = findRepoRoot(); + final pkgsDir = Directory(path.join(repoRoot, 'pkgs')); + + if (!pkgsDir.existsSync()) { + print('Error: pkgs directory non-existent at ${pkgsDir.path}'); + exit(1); + } + + final files = []; + + final result = Process.runSync('git', [ + 'ls-files', + ], workingDirectory: repoRoot); + if (result.exitCode != 0) { + print('Error: git ls-files failed with code ${result.exitCode}'); + print(result.stderr); + exit(1); + } + + final lines = (result.stdout as String).split('\n'); + for (final line in lines) { + final repoRelativePath = line.trim().replaceAll('\\', '/'); + if (repoRelativePath.isEmpty || !repoRelativePath.endsWith('.dart')) { + continue; + } + if (!repoRelativePath.startsWith('pkgs/')) { + continue; + } + if (isExcludedPath(repoRelativePath)) { + continue; + } + final file = File(path.join(repoRoot, repoRelativePath)); + if (!file.existsSync()) { + continue; + } + if (isGeneratedBindingFile(file)) { + files.add( + FileInfo( + file: file, + repoRelativePath: repoRelativePath, + size: file.lengthSync(), + ), + ); + } + } + + // Sort strictly by file size in bytes (smallest to largest) + files.sort((a, b) { + final sizeCompare = a.size.compareTo(b.size); + if (sizeCompare != 0) return sizeCompare; + return a.repoRelativePath.compareTo(b.repoRelativePath); + }); + + final total = files.length; + print('Found $total generated binding files to check.\n'); + + for (var i = 0; i < total; i++) { + final fileInfo = files[i]; + final countStr = '[${i + 1}/$total]'; + final sizeStr = '(${fileInfo.size} bytes)'; + final pathStr = '${fileInfo.repoRelativePath}...'; + + stdout.write('$countStr $sizeStr $pathStr '); + await stdout.flush(); + + final currentContent = fileInfo.file.readAsStringSync(); + + var gitResult = await Process.run('git', [ + 'show', + 'main:${fileInfo.repoRelativePath}', + ]); + if (gitResult.exitCode != 0) { + final originResult = await Process.run('git', [ + 'show', + 'origin/main:${fileInfo.repoRelativePath}', + ]); + if (originResult.exitCode == 0) { + gitResult = originResult; + } + } + + final mainContent = gitResult.exitCode == 0 + ? (gitResult.stdout as String) + : ''; + + final currentSummary = summarizeContent(currentContent); + final mainSummary = summarizeContent(mainContent); + + if (currentSummary == mainSummary) { + print('-> CLEAN'); + } else { + print('-> DIFF DETECTED!'); + final diff = createUnifiedDiff( + mainSummary, + currentSummary, + oldHeader: 'main/${fileInfo.repoRelativePath}', + newHeader: 'current/${fileInfo.repoRelativePath}', + ); + if (diff.isNotEmpty) { + print(diff); + } else { + print('(AST summaries differ but diff output was empty)'); + } + // exit(1); + } + } + + print('\nAll $total files checked successfully with no diffs detected.'); +} diff --git a/pkgs/ffigen/tool/diff_bindings_with_main.dart b/pkgs/ffigen/tool/diff_bindings_with_main.dart new file mode 100644 index 0000000000..7b63e506d5 --- /dev/null +++ b/pkgs/ffigen/tool/diff_bindings_with_main.dart @@ -0,0 +1,27 @@ +// 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 'dart:io'; +import 'package:path/path.dart' as path; + +Future main(List args) async { + final scriptDir = path.dirname(Platform.script.toFilePath()); + final shScript = path.join(scriptDir, 'diff_bindings_with_main.sh'); + final targetArgs = args.isEmpty + ? ['../objective_c/lib/src/objective_c_bindings_generated.dart'] + : args; + + final result = await Process.run('/bin/bash', [ + shScript, + ...targetArgs, + ], workingDirectory: path.dirname(scriptDir)); + + if (result.stdout.toString().isNotEmpty) { + stdout.write(result.stdout); + } + if (result.stderr.toString().isNotEmpty) { + stderr.write(result.stderr); + } + exitCode = result.exitCode; +} diff --git a/pkgs/ffigen/tool/diff_bindings_with_main.sh b/pkgs/ffigen/tool/diff_bindings_with_main.sh new file mode 100755 index 0000000000..ce90a093f5 --- /dev/null +++ b/pkgs/ffigen/tool/diff_bindings_with_main.sh @@ -0,0 +1,73 @@ +#!/usr/bin/env bash +# 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. + +set -euo pipefail + +if [ "$#" -ne 1 ] || [ "$1" = "-h" ] || [ "$1" = "--help" ]; then + echo "Usage: $0 " + echo "Compares the binding summary of a Dart file against its version on the main branch." + exit 1 +fi + +FILE_PATH="$1" + +if [ ! -f "$FILE_PATH" ]; then + echo "Error: File '$FILE_PATH' does not exist." >&2 + exit 1 +fi + +REPO_ROOT="$(git rev-parse --show-toplevel 2>/dev/null)" || { + echo "Error: Not in a git repository." >&2 + exit 1 +} + +SUMMARIZE_SCRIPT="$REPO_ROOT/pkgs/ffigen/tool/summarize_bindings.dart" +if [ ! -f "$SUMMARIZE_SCRIPT" ]; then + echo "Error: summarize_bindings.dart not found at '$SUMMARIZE_SCRIPT'." >&2 + exit 1 +fi + +REPO_RELATIVE_PATH="$(git ls-files --full-name "$FILE_PATH" 2>/dev/null)" +if [ -z "$REPO_RELATIVE_PATH" ]; then + PREFIX="$(git rev-parse --show-prefix)" + REPO_RELATIVE_PATH="${PREFIX}${FILE_PATH}" +fi + +if git rev-parse --verify main >/dev/null 2>&1; then + MAIN_REF="main" +elif git rev-parse --verify origin/main >/dev/null 2>&1; then + MAIN_REF="origin/main" +else + echo "Error: Could not find 'main' or 'origin/main' branch." >&2 + exit 1 +fi + +if ! git show "$MAIN_REF:$REPO_RELATIVE_PATH" >/dev/null 2>&1; then + echo "Error: File '$REPO_RELATIVE_PATH' does not exist on '$MAIN_REF'." >&2 + exit 1 +fi + +PACKAGE_CONFIG="$REPO_ROOT/pkgs/ffigen/.dart_tool/package_config.json" +if [ -f "$PACKAGE_CONFIG" ]; then + DART_CMD=(dart --packages="$PACKAGE_CONFIG" "$SUMMARIZE_SCRIPT") +else + DART_CMD=(dart run "$SUMMARIZE_SCRIPT") +fi + +if command -v colordiff >/dev/null 2>&1; then + DIFF_CMD=(colordiff -u --label "main/$REPO_RELATIVE_PATH" --label "current/$REPO_RELATIVE_PATH") +else + DIFF_CMD=(diff -u --label "main/$REPO_RELATIVE_PATH" --label "current/$REPO_RELATIVE_PATH") +fi + +DIFF_OUTPUT=$("${DIFF_CMD[@]}" \ + <(git show "$MAIN_REF:$REPO_RELATIVE_PATH" | "${DART_CMD[@]}" -) \ + <("${DART_CMD[@]}" "$FILE_PATH") || true) + +if [ -z "$DIFF_OUTPUT" ]; then + echo "No binding differences found between main and current branch." +else + printf "%s\n" "$DIFF_OUTPUT" +fi diff --git a/pkgs/ffigen/tool/generate_code.dart b/pkgs/ffigen/tool/generate_code.dart new file mode 100644 index 0000000000..772ab5ce50 --- /dev/null +++ b/pkgs/ffigen/tool/generate_code.dart @@ -0,0 +1,187 @@ +// 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 'dart:io'; +import 'package:ffigen/ffigen.dart'; + +class LibClangVisitor extends Visitor { + const LibClangVisitor(); + static const enums = { + 'CXChildVisitResult', + 'CXCursorKind', + 'CXTypeKind', + 'CXDiagnosticDisplayOptions', + 'CXTranslationUnit_Flags', + 'CXEvalResultKind', + 'CXObjCPropertyAttrKind', + 'CXTypeNullabilityKind', + 'CXTypeLayoutError', + 'CXDiagnosticSeverity', + }; + + static const structs = { + 'CXCursor', + 'CXType', + 'CXSourceLocation', + 'CXString', + 'CXTranslationUnitImpl', + 'CXUnsavedFile', + 'CXSourceRange', + 'CXPlatformAvailability', + 'CXVersion', + }; + + static const functions = { + 'clang_createIndex', + 'clang_disposeIndex', + 'clang_getNumDiagnostics', + 'clang_getDiagnostic', + 'clang_getDiagnosticSeverity', + 'clang_disposeDiagnostic', + 'clang_parseTranslationUnit', + 'clang_disposeTranslationUnit', + 'clang_EvalResult_getKind', + 'clang_EvalResult_getAsInt', + 'clang_EvalResult_getAsLongLong', + 'clang_EvalResult_getAsDouble', + 'clang_EvalResult_getAsStr', + 'clang_EvalResult_dispose', + 'clang_getCString', + 'clang_disposeString', + 'clang_getCursorKind', + 'clang_getCursorKindSpelling', + 'clang_getCursorType', + 'clang_getTypeSpelling', + 'clang_getTypeKindSpelling', + 'clang_getResultType', + 'clang_getTypedefName', + 'clang_getPointeeType', + 'clang_getCanonicalType', + 'clang_Type_getNamedType', + 'clang_Type_getAlignOf', + 'clang_getTypeDeclaration', + 'clang_getTypedefDeclUnderlyingType', + 'clang_getCursorSpelling', + 'clang_getTranslationUnitCursor', + 'clang_formatDiagnostic', + 'clang_visitChildren', + 'clang_Cursor_getNumArguments', + 'clang_Cursor_getArgument', + 'clang_getNumArgTypes', + 'clang_getArgType', + 'clang_isConstQualifiedType', + 'clang_isFunctionTypeVariadic', + 'clang_Cursor_getStorageClass', + 'clang_getCursorResultType', + 'clang_getCursorExtent', + 'clang_getEnumConstantDeclValue', + 'clang_getEnumDeclIntegerType', + 'clang_equalRanges', + 'clang_Cursor_getCommentRange', + 'clang_Cursor_getRawCommentText', + 'clang_Cursor_getBriefCommentText', + 'clang_getCursorLocation', + 'clang_getRangeStart', + 'clang_getRangeEnd', + 'clang_getFileLocation', + 'clang_getFileName', + 'clang_getNumElements', + 'clang_getArrayElementType', + 'clang_Cursor_isMacroFunctionLike', + 'clang_Cursor_isMacroBuiltin', + 'clang_Cursor_Evaluate', + 'clang_Cursor_isAnonymous', + 'clang_Cursor_isAnonymousRecordDecl', + 'clang_getCursorUSR', + 'clang_getFieldDeclBitWidth', + 'clang_Cursor_isFunctionInlined', + 'clang_getCursorDefinition', + 'clang_isCursorDefinition', + 'clang_CXXMethod_isConst', + 'clang_CXXMethod_isStatic', + 'clang_getCursorAvailability', + 'clang_getCursorPlatformAvailability', + 'clang_disposeCXPlatformAvailability', + 'clang_Cursor_isNull', + 'clang_Cursor_hasAttrs', + 'clang_Type_getObjCObjectBaseType', + 'clang_Cursor_getObjCPropertyAttributes', + 'clang_Cursor_getObjCPropertyGetterName', + 'clang_Cursor_getObjCPropertySetterName', + 'clang_Cursor_isObjCOptional', + 'clang_Type_getNullability', + 'clang_Type_getModifiedType', + 'clang_Location_isInSystemHeader', + 'clang_getClangVersion', + 'clang_Type_getNumObjCProtocolRefs', + 'clang_Type_getObjCProtocolDecl', + }; + + @override + void visitEnum(EnumClass node) { + node.style = EnumStyle.intConstants; + if (node.originalName.isNotEmpty && !enums.contains(node.originalName)) { + node.isIncluded = false; + } + } + + @override + void visitStruct(Struct node) { + node.dependencies = CompoundDependencies.full; + if (node.originalName.isNotEmpty && + !structs.contains(node.originalName) && + !node.originalName.contains('Version') && + !node.originalName.contains('PlatformAvailability')) { + node.isIncluded = false; + } + } + + @override + void visitFunc(Func node) { + if (!functions.contains(node.originalName)) { + node.isIncluded = false; + } + } + + @override + void visitTypealias(Typealias node) { + node.includeUnused = true; + if (RegExp(r'.*time(64)?_t$').hasMatch(node.originalName)) { + node.isIncluded = false; + } + } +} + +void main() { + final root = Platform.script.resolve('../'); + FfiGenerator( + input: Input( + entryPoints: [ + root.resolve('third_party/libclang/include/clang-c/Index.h'), + ], + compilerOptions: ['-Ithird_party/libclang/include'], + ignoreSourceErrors: true, + include: (Uri header) => + header.path.endsWith('wrapper.c') || + header.path.endsWith('Index.h') || + header.path.endsWith('CXString.h'), + ), + visitors: [const LibClangVisitor()], + output: Output( + preamble: ''' +// Part of the LLVM Project, under the Apache License v2.0 with LLVM +// Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +''', + style: const DynamicLibraryBindings( + wrapperName: 'Clang', + wrapperDocComment: 'Holds bindings to LibClang.', + ), + dartFile: root.resolve( + 'lib/src/header_parser/clang_bindings/clang_bindings.dart', + ), + ), + ).generate(); +} diff --git a/pkgs/ffigen/tool/libclang_config.yaml b/pkgs/ffigen/tool/libclang_config.yaml deleted file mode 100644 index bc8fad04b7..0000000000 --- a/pkgs/ffigen/tool/libclang_config.yaml +++ /dev/null @@ -1,147 +0,0 @@ -# Copyright (c) 2020, 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. - -# Config file for generating the libclang bindings used by this package. - -# ===================== GENERATING BINDINGS ===================== -# cd to project's root, and run - -# dart run ffigen --config tool/libclang_config.yaml -# =============================================================== - -# yaml-language-server: $schema=../ffigen.schema.json - -name: Clang -description: Holds bindings to LibClang. -output: '../lib/src/header_parser/clang_bindings/clang_bindings.dart' -compiler-opts: - - '-Ithird_party/libclang/include' -headers: - entry-points: - - '../third_party/libclang/include/clang-c/Index.h' - include-directives: - - '**wrapper.c' - - '**Index.h' - - '**CXString.h' - -preamble: | - // Part of the LLVM Project, under the Apache License v2.0 with LLVM - // Exceptions. - // See https://llvm.org/LICENSE.txt for license information. - // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception - -enums: - include: - - CXChildVisitResult - - CXCursorKind - - CXTypeKind - - CXDiagnosticDisplayOptions - - CXTranslationUnit_Flags - - CXEvalResultKind - - CXObjCPropertyAttrKind - - CXTypeNullabilityKind - - CXTypeLayoutError - as-int: - include: - - .* - -structs: - include: - - CXCursor - - CXType - - CXSourceLocation - - CXString - - CXTranslationUnitImpl - - CXUnsavedFile - - CXSourceRange - -functions: - include: - - clang_createIndex - - clang_disposeIndex - - clang_getNumDiagnostics - - clang_getDiagnostic - - clang_getDiagnosticSeverity - - clang_disposeDiagnostic - - clang_parseTranslationUnit - - clang_disposeTranslationUnit - - clang_EvalResult_getKind - - clang_EvalResult_getAsInt - - clang_EvalResult_getAsLongLong - - clang_EvalResult_getAsDouble - - clang_EvalResult_getAsStr - - clang_EvalResult_dispose - - clang_getCString - - clang_disposeString - - clang_getCursorKind - - clang_getCursorKindSpelling - - clang_getCursorType - - clang_getTypeSpelling - - clang_getTypeKindSpelling - - clang_getResultType - - clang_getTypedefName - - clang_getPointeeType - - clang_getCanonicalType - - clang_Type_getNamedType - - clang_Type_getAlignOf - - clang_getTypeDeclaration - - clang_getTypedefDeclUnderlyingType - - clang_getCursorSpelling - - clang_getTranslationUnitCursor - - clang_formatDiagnostic - - clang_visitChildren - - clang_Cursor_getNumArguments - - clang_Cursor_getArgument - - clang_getNumArgTypes - - clang_getArgType - - clang_isConstQualifiedType - - clang_isFunctionTypeVariadic - - clang_Cursor_getStorageClass - - clang_getCursorResultType - - clang_getCursorExtent - - clang_getEnumConstantDeclValue - - clang_getEnumDeclIntegerType - - clang_equalRanges - - clang_Cursor_getCommentRange - - clang_Cursor_getRawCommentText - - clang_Cursor_getBriefCommentText - - clang_getCursorLocation - - clang_getRangeStart - - clang_getRangeEnd - - clang_getFileLocation - - clang_getFileName - - clang_getNumElements - - clang_getArrayElementType - - clang_Cursor_isMacroFunctionLike - - clang_Cursor_isMacroBuiltin - - clang_Cursor_Evaluate - - clang_Cursor_isAnonymous - - clang_Cursor_isAnonymousRecordDecl - - clang_getCursorUSR - - clang_getFieldDeclBitWidth - - clang_Cursor_isFunctionInlined - - clang_getCursorDefinition - - clang_isCursorDefinition - - clang_CXXMethod_isConst - - clang_CXXMethod_isStatic - - clang_getCursorAvailability - - clang_getCursorPlatformAvailability - - clang_disposeCXPlatformAvailability - - clang_Cursor_isNull - - clang_Cursor_hasAttrs - - clang_Type_getObjCObjectBaseType - - clang_Cursor_getObjCPropertyAttributes - - clang_Cursor_getObjCPropertyGetterName - - clang_Cursor_getObjCPropertySetterName - - clang_Cursor_isObjCOptional - - clang_Type_getNullability - - clang_Type_getModifiedType - - clang_Location_isInSystemHeader - - clang_getClangVersion - - clang_Type_getNumObjCProtocolRefs - - clang_Type_getObjCProtocolDecl - -# time_t typedef varies between platforms, and we don't need it anyway. -typedefs: - exclude: - - .*time(64)?_t diff --git a/pkgs/ffigen/tool/summarize_bindings.dart b/pkgs/ffigen/tool/summarize_bindings.dart new file mode 100644 index 0000000000..3d23e0b61d --- /dev/null +++ b/pkgs/ffigen/tool/summarize_bindings.dart @@ -0,0 +1,286 @@ +// 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 'dart:convert'; +import 'dart:io'; + +import 'package:analyzer/dart/analysis/features.dart'; +import 'package:analyzer/dart/analysis/utilities.dart'; +import 'package:analyzer/dart/ast/ast.dart'; +import 'package:args/args.dart'; + +class MemberSummary { + final String sortName; + final String formatted; + + MemberSummary({required this.sortName, required this.formatted}); +} + +class DeclarationSummary { + final String sortName; + final String formatted; + final List members; + + DeclarationSummary({ + required this.sortName, + required this.formatted, + List? members, + }) : members = members ?? []; +} + +List _extractMembers(ClassMember member, String containerName) { + final result = []; + if (member is ConstructorDeclaration) { + final name = member.name?.lexeme; + if (name == null) { + result.add( + MemberSummary(sortName: containerName, formatted: containerName), + ); + } else { + final fullName = '$containerName.$name'; + result.add(MemberSummary(sortName: fullName, formatted: fullName)); + } + } else if (member is MethodDeclaration) { + final name = member.name.lexeme; + if (member.isGetter) { + result.add(MemberSummary(sortName: name, formatted: 'getter $name')); + } else if (member.isSetter) { + result.add(MemberSummary(sortName: name, formatted: 'setter $name=')); + } else { + result.add(MemberSummary(sortName: name, formatted: 'method $name')); + } + } else if (member is FieldDeclaration) { + final isConst = member.fields.isConst; + for (final variable in member.fields.variables) { + final name = variable.name.lexeme; + if (isConst) { + result.add(MemberSummary(sortName: name, formatted: 'constant $name')); + } else { + result.add(MemberSummary(sortName: name, formatted: 'field $name')); + } + } + } + return result; +} + +String summarizeContent(String content) { + final parseResult = parseString( + content: content, + featureSet: FeatureSet.latestLanguageVersion(), + throwIfDiagnostics: false, + ); + final unit = parseResult.unit; + final declarations = []; + + for (final declaration in unit.declarations) { + if (declaration is ClassDeclaration) { + final className = declaration.name.lexeme; + final members = []; + for (final member in declaration.members) { + members.addAll(_extractMembers(member, className)); + } + declarations.add( + DeclarationSummary( + sortName: className, + formatted: 'class $className', + members: members, + ), + ); + } else if (declaration is EnumDeclaration) { + final enumName = declaration.name.lexeme; + final members = []; + for (final constant in declaration.constants) { + final constName = constant.name.lexeme; + members.add( + MemberSummary(sortName: constName, formatted: 'constant $constName'), + ); + } + for (final member in declaration.members) { + members.addAll(_extractMembers(member, enumName)); + } + declarations.add( + DeclarationSummary( + sortName: enumName, + formatted: 'enum $enumName', + members: members, + ), + ); + } else if (declaration is ExtensionDeclaration) { + final extName = declaration.name?.lexeme; + final displayName = extName ?? ''; + final formattedHeader = extName != null + ? 'extension $extName' + : 'extension'; + final members = []; + for (final member in declaration.members) { + members.addAll(_extractMembers(member, extName ?? '')); + } + declarations.add( + DeclarationSummary( + sortName: displayName, + formatted: formattedHeader, + members: members, + ), + ); + } else if (declaration is ExtensionTypeDeclaration) { + final extTypeName = declaration.name.lexeme; + final members = []; + final rep = declaration.representation; + final repConstructorName = rep.constructorName; + if (repConstructorName == null) { + members.add( + MemberSummary(sortName: extTypeName, formatted: extTypeName), + ); + } else { + final fullConstName = '$extTypeName.${repConstructorName.name.lexeme}'; + members.add( + MemberSummary(sortName: fullConstName, formatted: fullConstName), + ); + } + final fieldName = rep.fieldName.lexeme; + members.add( + MemberSummary(sortName: fieldName, formatted: 'field $fieldName'), + ); + + for (final member in declaration.members) { + members.addAll(_extractMembers(member, extTypeName)); + } + declarations.add( + DeclarationSummary( + sortName: extTypeName, + formatted: 'extension type $extTypeName', + members: members, + ), + ); + } else if (declaration is MixinDeclaration) { + final mixinName = declaration.name.lexeme; + final members = []; + for (final member in declaration.members) { + members.addAll(_extractMembers(member, mixinName)); + } + declarations.add( + DeclarationSummary( + sortName: mixinName, + formatted: 'mixin $mixinName', + members: members, + ), + ); + } else if (declaration is TypeAlias) { + final aliasName = declaration.name.lexeme; + declarations.add( + DeclarationSummary( + sortName: aliasName, + formatted: 'typedef $aliasName', + ), + ); + } else if (declaration is FunctionDeclaration) { + final funcName = declaration.name.lexeme; + if (declaration.isGetter) { + declarations.add( + DeclarationSummary(sortName: funcName, formatted: 'getter $funcName'), + ); + } else if (declaration.isSetter) { + declarations.add( + DeclarationSummary( + sortName: funcName, + formatted: 'setter $funcName=', + ), + ); + } else { + declarations.add( + DeclarationSummary( + sortName: funcName, + formatted: 'function $funcName', + ), + ); + } + } else if (declaration is TopLevelVariableDeclaration) { + for (final variable in declaration.variables.variables) { + final varName = variable.name.lexeme; + declarations.add( + DeclarationSummary(sortName: varName, formatted: 'field $varName'), + ); + } + } + } + + declarations.sort((a, b) { + final nameComp = a.sortName.compareTo(b.sortName); + if (nameComp != 0) return nameComp; + return a.formatted.compareTo(b.formatted); + }); + + final buffer = StringBuffer(); + for (final decl in declarations) { + buffer.writeln(decl.formatted); + decl.members.sort((a, b) { + final nameComp = a.sortName.compareTo(b.sortName); + if (nameComp != 0) return nameComp; + return a.formatted.compareTo(b.formatted); + }); + for (final member in decl.members) { + buffer.writeln(' ${member.formatted}'); + } + } + + return buffer.toString(); +} + +Future main(List args) async { + final parser = ArgParser() + ..addOption( + 'output', + abbr: 'o', + help: 'Path to write summary output to. Prints to stdout if omitted.', + ) + ..addFlag( + 'help', + abbr: 'h', + negatable: false, + help: 'Prints usage instructions.', + ); + + late final ArgResults results; + try { + results = parser.parse(args); + } catch (e) { + print('Error: $e\n'); + _printUsage(parser); + exit(1); + } + + if (results['help'] == true || results.rest.isEmpty) { + _printUsage(parser); + if (results['help'] != true && results.rest.isEmpty) { + exit(1); + } + return; + } + + final inputFilePath = results.rest.first; + final String content; + if (inputFilePath == '-') { + content = await stdin.transform(utf8.decoder).join(); + } else { + if (!File(inputFilePath).existsSync()) { + print('Error: Input file "$inputFilePath" does not exist.'); + exit(1); + } + content = File(inputFilePath).readAsStringSync(); + } + + final summary = summarizeContent(content); + + final outputPath = results['output'] as String?; + if (outputPath != null) { + File(outputPath).writeAsStringSync(summary); + } else { + stdout.write(summary); + } +} + +void _printUsage(ArgParser parser) { + print('Usage: dart run tool/summarize_bindings.dart [options] '); + print(parser.usage); +} diff --git a/pkgs/hooks_runner/test_data/treeshaking_dylib_record_use/tool/ffigen.dart b/pkgs/hooks_runner/test_data/treeshaking_dylib_record_use/tool/ffigen.dart index 1d7b443338..0002549490 100644 --- a/pkgs/hooks_runner/test_data/treeshaking_dylib_record_use/tool/ffigen.dart +++ b/pkgs/hooks_runner/test_data/treeshaking_dylib_record_use/tool/ffigen.dart @@ -11,13 +11,10 @@ void main() { // 1. Generate bindings for add.c FfiGenerator( - headers: Headers( + input: Input( entryPoints: [packageRoot.resolve('src/add.c')], ), - functions: Functions( - include: (_) => true, - recordUse: (_) => true, - ), + visitors: [const IncludeAllVisitor(), const RecordUseVisitor()], output: Output( preamble: ''' // Copyright (c) 2026, the Dart project authors. Please see the AUTHORS file @@ -36,13 +33,10 @@ void main() { // 2. Generate bindings for multiply.c FfiGenerator( - headers: Headers( + input: Input( entryPoints: [packageRoot.resolve('src/multiply.c')], ), - functions: Functions( - include: (_) => true, - recordUse: (_) => true, - ), + visitors: [const IncludeAllVisitor(), const RecordUseVisitor()], output: Output( preamble: ''' // Copyright (c) 2026, the Dart project authors. Please see the AUTHORS file diff --git a/pkgs/jni/lib/src/third_party/global_env_extensions.dart b/pkgs/jni/lib/src/third_party/global_env_extensions.dart index 8080191d5b..0edfa26a8a 100644 --- a/pkgs/jni/lib/src/third_party/global_env_extensions.dart +++ b/pkgs/jni/lib/src/third_party/global_env_extensions.dart @@ -45,17 +45,14 @@ class GlobalJniEnv { late final _GetVersion = ptr.ref.GetVersion.asFunction(isLeaf: true); - DartJIntMarker GetVersion() => _GetVersion().integer; + Dartjint GetVersion() => _GetVersion().integer; late final _DefineClass = ptr.ref.DefineClass.asFunction< - JniClassLookupResult Function( - ffi.Pointer name, - JObjectPtr loader, - ffi.Pointer buf, - DartJIntMarker bufLen)>(); + JniClassLookupResult Function(ffi.Pointer name, + JObjectPtr loader, ffi.Pointer buf, Dartjint bufLen)>(); JClassPtr DefineClass(ffi.Pointer name, JObjectPtr loader, - ffi.Pointer buf, DartJIntMarker bufLen) => + ffi.Pointer buf, Dartjint bufLen) => _DefineClass(name, loader, buf, bufLen).value; late final _FindClass = ptr.ref.FindClass @@ -78,10 +75,10 @@ class GlobalJniEnv { late final _ToReflectedMethod = ptr.ref.ToReflectedMethod.asFunction< JniResult Function( - JClassPtr cls, JMethodIDPtr methodId, DartJBooleanMarker isStatic)>(); + JClassPtr cls, JMethodIDPtr methodId, Dartjboolean isStatic)>(); JObjectPtr ToReflectedMethod( - JClassPtr cls, JMethodIDPtr methodId, DartJBooleanMarker isStatic) => + JClassPtr cls, JMethodIDPtr methodId, Dartjboolean isStatic) => _ToReflectedMethod(cls, methodId, isStatic).objectPointer; late final _GetSuperclass = ptr.ref.GetSuperclass @@ -98,21 +95,21 @@ class GlobalJniEnv { late final _ToReflectedField = ptr.ref.ToReflectedField.asFunction< JniResult Function( - JClassPtr cls, JFieldIDPtr fieldID, DartJBooleanMarker isStatic)>(); + JClassPtr cls, JFieldIDPtr fieldID, Dartjboolean isStatic)>(); JObjectPtr ToReflectedField( - JClassPtr cls, JFieldIDPtr fieldID, DartJBooleanMarker isStatic) => + JClassPtr cls, JFieldIDPtr fieldID, Dartjboolean isStatic) => _ToReflectedField(cls, fieldID, isStatic).objectPointer; late final _Throw = ptr.ref.Throw.asFunction(); - DartJIntMarker Throw(JThrowablePtr obj) => _Throw(obj).integer; + Dartjint Throw(JThrowablePtr obj) => _Throw(obj).integer; late final _ThrowNew = ptr.ref.ThrowNew.asFunction< JniResult Function(JClassPtr clazz, ffi.Pointer message)>(); - DartJIntMarker ThrowNew(JClassPtr clazz, ffi.Pointer message) => + Dartjint ThrowNew(JClassPtr clazz, ffi.Pointer message) => _ThrowNew(clazz, message).integer; late final _ExceptionOccurred = @@ -136,9 +133,9 @@ class GlobalJniEnv { void FatalError(ffi.Pointer msg) => _FatalError(msg).check(); late final _PushLocalFrame = ptr.ref.PushLocalFrame - .asFunction(); + .asFunction(); - DartJIntMarker PushLocalFrame(DartJIntMarker capacity) => + Dartjint PushLocalFrame(Dartjint capacity) => _PushLocalFrame(capacity).integer; late final _PopLocalFrame = @@ -176,9 +173,9 @@ class GlobalJniEnv { JObjectPtr NewLocalRef(JObjectPtr obj) => _NewLocalRef(obj).objectPointer; late final _EnsureLocalCapacity = ptr.ref.EnsureLocalCapacity - .asFunction(); + .asFunction(); - DartJIntMarker EnsureLocalCapacity(DartJIntMarker capacity) => + Dartjint EnsureLocalCapacity(Dartjint capacity) => _EnsureLocalCapacity(capacity).integer; late final _AllocObject = @@ -250,98 +247,98 @@ class GlobalJniEnv { late final _CallByteMethod = ptr.ref.CallByteMethod .asFunction(); - DartJByteMarker CallByteMethod(JObjectPtr obj, JMethodIDPtr methodID) => + Dartjbyte CallByteMethod(JObjectPtr obj, JMethodIDPtr methodID) => _CallByteMethod(obj, methodID).byte; late final _CallByteMethodA = ptr.ref.CallByteMethodA.asFunction< JniResult Function( JObjectPtr obj, JMethodIDPtr methodID, ffi.Pointer args)>(); - DartJByteMarker CallByteMethodA( + Dartjbyte CallByteMethodA( JObjectPtr obj, JMethodIDPtr methodID, ffi.Pointer args) => _CallByteMethodA(obj, methodID, args).byte; late final _CallCharMethod = ptr.ref.CallCharMethod .asFunction(); - DartJCharMarker CallCharMethod(JObjectPtr obj, JMethodIDPtr methodID) => + Dartjchar CallCharMethod(JObjectPtr obj, JMethodIDPtr methodID) => _CallCharMethod(obj, methodID).char; late final _CallCharMethodA = ptr.ref.CallCharMethodA.asFunction< JniResult Function( JObjectPtr obj, JMethodIDPtr methodID, ffi.Pointer args)>(); - DartJCharMarker CallCharMethodA( + Dartjchar CallCharMethodA( JObjectPtr obj, JMethodIDPtr methodID, ffi.Pointer args) => _CallCharMethodA(obj, methodID, args).char; late final _CallShortMethod = ptr.ref.CallShortMethod .asFunction(); - DartJShortMarker CallShortMethod(JObjectPtr obj, JMethodIDPtr methodID) => + Dartjshort CallShortMethod(JObjectPtr obj, JMethodIDPtr methodID) => _CallShortMethod(obj, methodID).short; late final _CallShortMethodA = ptr.ref.CallShortMethodA.asFunction< JniResult Function( JObjectPtr obj, JMethodIDPtr methodID, ffi.Pointer args)>(); - DartJShortMarker CallShortMethodA( + Dartjshort CallShortMethodA( JObjectPtr obj, JMethodIDPtr methodID, ffi.Pointer args) => _CallShortMethodA(obj, methodID, args).short; late final _CallIntMethod = ptr.ref.CallIntMethod .asFunction(); - DartJIntMarker CallIntMethod(JObjectPtr obj, JMethodIDPtr methodID) => + Dartjint CallIntMethod(JObjectPtr obj, JMethodIDPtr methodID) => _CallIntMethod(obj, methodID).integer; late final _CallIntMethodA = ptr.ref.CallIntMethodA.asFunction< JniResult Function( JObjectPtr obj, JMethodIDPtr methodID, ffi.Pointer args)>(); - DartJIntMarker CallIntMethodA( + Dartjint CallIntMethodA( JObjectPtr obj, JMethodIDPtr methodID, ffi.Pointer args) => _CallIntMethodA(obj, methodID, args).integer; late final _CallLongMethod = ptr.ref.CallLongMethod .asFunction(); - DartJLongMarker CallLongMethod(JObjectPtr obj, JMethodIDPtr methodID) => + Dartjlong CallLongMethod(JObjectPtr obj, JMethodIDPtr methodID) => _CallLongMethod(obj, methodID).long; late final _CallLongMethodA = ptr.ref.CallLongMethodA.asFunction< JniResult Function( JObjectPtr obj, JMethodIDPtr methodID, ffi.Pointer args)>(); - DartJLongMarker CallLongMethodA( + Dartjlong CallLongMethodA( JObjectPtr obj, JMethodIDPtr methodID, ffi.Pointer args) => _CallLongMethodA(obj, methodID, args).long; late final _CallFloatMethod = ptr.ref.CallFloatMethod .asFunction(); - DartJFloatMarker CallFloatMethod(JObjectPtr obj, JMethodIDPtr methodID) => + Dartjfloat CallFloatMethod(JObjectPtr obj, JMethodIDPtr methodID) => _CallFloatMethod(obj, methodID).float; late final _CallFloatMethodA = ptr.ref.CallFloatMethodA.asFunction< JniResult Function( JObjectPtr obj, JMethodIDPtr methodID, ffi.Pointer args)>(); - DartJFloatMarker CallFloatMethodA( + Dartjfloat CallFloatMethodA( JObjectPtr obj, JMethodIDPtr methodID, ffi.Pointer args) => _CallFloatMethodA(obj, methodID, args).float; late final _CallDoubleMethod = ptr.ref.CallDoubleMethod .asFunction(); - DartJDoubleMarker CallDoubleMethod(JObjectPtr obj, JMethodIDPtr methodID) => + Dartjdouble CallDoubleMethod(JObjectPtr obj, JMethodIDPtr methodID) => _CallDoubleMethod(obj, methodID).doubleFloat; late final _CallDoubleMethodA = ptr.ref.CallDoubleMethodA.asFunction< JniResult Function( JObjectPtr obj, JMethodIDPtr methodID, ffi.Pointer args)>(); - DartJDoubleMarker CallDoubleMethodA( + Dartjdouble CallDoubleMethodA( JObjectPtr obj, JMethodIDPtr methodID, ffi.Pointer args) => _CallDoubleMethodA(obj, methodID, args).doubleFloat; @@ -400,7 +397,7 @@ class GlobalJniEnv { JniResult Function( JObjectPtr obj, JClassPtr clazz, JMethodIDPtr methodID)>(); - DartJByteMarker CallNonvirtualByteMethod( + Dartjbyte CallNonvirtualByteMethod( JObjectPtr obj, JClassPtr clazz, JMethodIDPtr methodID) => _CallNonvirtualByteMethod(obj, clazz, methodID).byte; @@ -409,7 +406,7 @@ class GlobalJniEnv { JniResult Function(JObjectPtr obj, JClassPtr clazz, JMethodIDPtr methodID, ffi.Pointer args)>(); - DartJByteMarker CallNonvirtualByteMethodA(JObjectPtr obj, JClassPtr clazz, + Dartjbyte CallNonvirtualByteMethodA(JObjectPtr obj, JClassPtr clazz, JMethodIDPtr methodID, ffi.Pointer args) => _CallNonvirtualByteMethodA(obj, clazz, methodID, args).byte; @@ -418,7 +415,7 @@ class GlobalJniEnv { JniResult Function( JObjectPtr obj, JClassPtr clazz, JMethodIDPtr methodID)>(); - DartJCharMarker CallNonvirtualCharMethod( + Dartjchar CallNonvirtualCharMethod( JObjectPtr obj, JClassPtr clazz, JMethodIDPtr methodID) => _CallNonvirtualCharMethod(obj, clazz, methodID).char; @@ -427,7 +424,7 @@ class GlobalJniEnv { JniResult Function(JObjectPtr obj, JClassPtr clazz, JMethodIDPtr methodID, ffi.Pointer args)>(); - DartJCharMarker CallNonvirtualCharMethodA(JObjectPtr obj, JClassPtr clazz, + Dartjchar CallNonvirtualCharMethodA(JObjectPtr obj, JClassPtr clazz, JMethodIDPtr methodID, ffi.Pointer args) => _CallNonvirtualCharMethodA(obj, clazz, methodID, args).char; @@ -436,7 +433,7 @@ class GlobalJniEnv { JniResult Function( JObjectPtr obj, JClassPtr clazz, JMethodIDPtr methodID)>(); - DartJShortMarker CallNonvirtualShortMethod( + Dartjshort CallNonvirtualShortMethod( JObjectPtr obj, JClassPtr clazz, JMethodIDPtr methodID) => _CallNonvirtualShortMethod(obj, clazz, methodID).short; @@ -445,7 +442,7 @@ class GlobalJniEnv { JniResult Function(JObjectPtr obj, JClassPtr clazz, JMethodIDPtr methodID, ffi.Pointer args)>(); - DartJShortMarker CallNonvirtualShortMethodA(JObjectPtr obj, JClassPtr clazz, + Dartjshort CallNonvirtualShortMethodA(JObjectPtr obj, JClassPtr clazz, JMethodIDPtr methodID, ffi.Pointer args) => _CallNonvirtualShortMethodA(obj, clazz, methodID, args).short; @@ -454,7 +451,7 @@ class GlobalJniEnv { JniResult Function( JObjectPtr obj, JClassPtr clazz, JMethodIDPtr methodID)>(); - DartJIntMarker CallNonvirtualIntMethod( + Dartjint CallNonvirtualIntMethod( JObjectPtr obj, JClassPtr clazz, JMethodIDPtr methodID) => _CallNonvirtualIntMethod(obj, clazz, methodID).integer; @@ -463,7 +460,7 @@ class GlobalJniEnv { JniResult Function(JObjectPtr obj, JClassPtr clazz, JMethodIDPtr methodID, ffi.Pointer args)>(); - DartJIntMarker CallNonvirtualIntMethodA(JObjectPtr obj, JClassPtr clazz, + Dartjint CallNonvirtualIntMethodA(JObjectPtr obj, JClassPtr clazz, JMethodIDPtr methodID, ffi.Pointer args) => _CallNonvirtualIntMethodA(obj, clazz, methodID, args).integer; @@ -472,7 +469,7 @@ class GlobalJniEnv { JniResult Function( JObjectPtr obj, JClassPtr clazz, JMethodIDPtr methodID)>(); - DartJLongMarker CallNonvirtualLongMethod( + Dartjlong CallNonvirtualLongMethod( JObjectPtr obj, JClassPtr clazz, JMethodIDPtr methodID) => _CallNonvirtualLongMethod(obj, clazz, methodID).long; @@ -481,7 +478,7 @@ class GlobalJniEnv { JniResult Function(JObjectPtr obj, JClassPtr clazz, JMethodIDPtr methodID, ffi.Pointer args)>(); - DartJLongMarker CallNonvirtualLongMethodA(JObjectPtr obj, JClassPtr clazz, + Dartjlong CallNonvirtualLongMethodA(JObjectPtr obj, JClassPtr clazz, JMethodIDPtr methodID, ffi.Pointer args) => _CallNonvirtualLongMethodA(obj, clazz, methodID, args).long; @@ -490,7 +487,7 @@ class GlobalJniEnv { JniResult Function( JObjectPtr obj, JClassPtr clazz, JMethodIDPtr methodID)>(); - DartJFloatMarker CallNonvirtualFloatMethod( + Dartjfloat CallNonvirtualFloatMethod( JObjectPtr obj, JClassPtr clazz, JMethodIDPtr methodID) => _CallNonvirtualFloatMethod(obj, clazz, methodID).float; @@ -499,7 +496,7 @@ class GlobalJniEnv { JniResult Function(JObjectPtr obj, JClassPtr clazz, JMethodIDPtr methodID, ffi.Pointer args)>(); - DartJFloatMarker CallNonvirtualFloatMethodA(JObjectPtr obj, JClassPtr clazz, + Dartjfloat CallNonvirtualFloatMethodA(JObjectPtr obj, JClassPtr clazz, JMethodIDPtr methodID, ffi.Pointer args) => _CallNonvirtualFloatMethodA(obj, clazz, methodID, args).float; @@ -508,7 +505,7 @@ class GlobalJniEnv { JniResult Function( JObjectPtr obj, JClassPtr clazz, JMethodIDPtr methodID)>(); - DartJDoubleMarker CallNonvirtualDoubleMethod( + Dartjdouble CallNonvirtualDoubleMethod( JObjectPtr obj, JClassPtr clazz, JMethodIDPtr methodID) => _CallNonvirtualDoubleMethod(obj, clazz, methodID).doubleFloat; @@ -517,7 +514,7 @@ class GlobalJniEnv { JniResult Function(JObjectPtr obj, JClassPtr clazz, JMethodIDPtr methodID, ffi.Pointer args)>(); - DartJDoubleMarker CallNonvirtualDoubleMethodA(JObjectPtr obj, JClassPtr clazz, + Dartjdouble CallNonvirtualDoubleMethodA(JObjectPtr obj, JClassPtr clazz, JMethodIDPtr methodID, ffi.Pointer args) => _CallNonvirtualDoubleMethodA(obj, clazz, methodID, args).doubleFloat; @@ -565,49 +562,49 @@ class GlobalJniEnv { .asFunction( isLeaf: true); - DartJByteMarker GetByteField(JObjectPtr obj, JFieldIDPtr fieldID) => + Dartjbyte GetByteField(JObjectPtr obj, JFieldIDPtr fieldID) => _GetByteField(obj, fieldID).byte; late final _GetCharField = ptr.ref.GetCharField .asFunction( isLeaf: true); - DartJCharMarker GetCharField(JObjectPtr obj, JFieldIDPtr fieldID) => + Dartjchar GetCharField(JObjectPtr obj, JFieldIDPtr fieldID) => _GetCharField(obj, fieldID).char; late final _GetShortField = ptr.ref.GetShortField .asFunction( isLeaf: true); - DartJShortMarker GetShortField(JObjectPtr obj, JFieldIDPtr fieldID) => + Dartjshort GetShortField(JObjectPtr obj, JFieldIDPtr fieldID) => _GetShortField(obj, fieldID).short; late final _GetIntField = ptr.ref.GetIntField .asFunction( isLeaf: true); - DartJIntMarker GetIntField(JObjectPtr obj, JFieldIDPtr fieldID) => + Dartjint GetIntField(JObjectPtr obj, JFieldIDPtr fieldID) => _GetIntField(obj, fieldID).integer; late final _GetLongField = ptr.ref.GetLongField .asFunction( isLeaf: true); - DartJLongMarker GetLongField(JObjectPtr obj, JFieldIDPtr fieldID) => + Dartjlong GetLongField(JObjectPtr obj, JFieldIDPtr fieldID) => _GetLongField(obj, fieldID).long; late final _GetFloatField = ptr.ref.GetFloatField .asFunction( isLeaf: true); - DartJFloatMarker GetFloatField(JObjectPtr obj, JFieldIDPtr fieldID) => + Dartjfloat GetFloatField(JObjectPtr obj, JFieldIDPtr fieldID) => _GetFloatField(obj, fieldID).float; late final _GetDoubleField = ptr.ref.GetDoubleField .asFunction( isLeaf: true); - DartJDoubleMarker GetDoubleField(JObjectPtr obj, JFieldIDPtr fieldID) => + Dartjdouble GetDoubleField(JObjectPtr obj, JFieldIDPtr fieldID) => _GetDoubleField(obj, fieldID).doubleFloat; late final _SetObjectField = ptr.ref.SetObjectField.asFunction< @@ -618,63 +615,59 @@ class GlobalJniEnv { _SetObjectField(obj, fieldID, val).check(); late final _SetBooleanField = ptr.ref.SetBooleanField.asFunction< - JThrowablePtr Function(JObjectPtr obj, JFieldIDPtr fieldID, - DartJBooleanMarker val)>(isLeaf: true); + JThrowablePtr Function( + JObjectPtr obj, JFieldIDPtr fieldID, Dartjboolean val)>(isLeaf: true); - void SetBooleanField( - JObjectPtr obj, JFieldIDPtr fieldID, DartJBooleanMarker val) => + void SetBooleanField(JObjectPtr obj, JFieldIDPtr fieldID, Dartjboolean val) => _SetBooleanField(obj, fieldID, val).check(); late final _SetByteField = ptr.ref.SetByteField.asFunction< - JThrowablePtr Function(JObjectPtr obj, JFieldIDPtr fieldID, - DartJByteMarker val)>(isLeaf: true); + JThrowablePtr Function( + JObjectPtr obj, JFieldIDPtr fieldID, Dartjbyte val)>(isLeaf: true); - void SetByteField(JObjectPtr obj, JFieldIDPtr fieldID, DartJByteMarker val) => + void SetByteField(JObjectPtr obj, JFieldIDPtr fieldID, Dartjbyte val) => _SetByteField(obj, fieldID, val).check(); late final _SetCharField = ptr.ref.SetCharField.asFunction< - JThrowablePtr Function(JObjectPtr obj, JFieldIDPtr fieldID, - DartJCharMarker val)>(isLeaf: true); + JThrowablePtr Function( + JObjectPtr obj, JFieldIDPtr fieldID, Dartjchar val)>(isLeaf: true); - void SetCharField(JObjectPtr obj, JFieldIDPtr fieldID, DartJCharMarker val) => + void SetCharField(JObjectPtr obj, JFieldIDPtr fieldID, Dartjchar val) => _SetCharField(obj, fieldID, val).check(); late final _SetShortField = ptr.ref.SetShortField.asFunction< - JThrowablePtr Function(JObjectPtr obj, JFieldIDPtr fieldID, - DartJShortMarker val)>(isLeaf: true); + JThrowablePtr Function( + JObjectPtr obj, JFieldIDPtr fieldID, Dartjshort val)>(isLeaf: true); - void SetShortField( - JObjectPtr obj, JFieldIDPtr fieldID, DartJShortMarker val) => + void SetShortField(JObjectPtr obj, JFieldIDPtr fieldID, Dartjshort val) => _SetShortField(obj, fieldID, val).check(); late final _SetIntField = ptr.ref.SetIntField.asFunction< - JThrowablePtr Function(JObjectPtr obj, JFieldIDPtr fieldID, - DartJIntMarker val)>(isLeaf: true); + JThrowablePtr Function( + JObjectPtr obj, JFieldIDPtr fieldID, Dartjint val)>(isLeaf: true); - void SetIntField(JObjectPtr obj, JFieldIDPtr fieldID, DartJIntMarker val) => + void SetIntField(JObjectPtr obj, JFieldIDPtr fieldID, Dartjint val) => _SetIntField(obj, fieldID, val).check(); late final _SetLongField = ptr.ref.SetLongField.asFunction< - JThrowablePtr Function(JObjectPtr obj, JFieldIDPtr fieldID, - DartJLongMarker val)>(isLeaf: true); + JThrowablePtr Function( + JObjectPtr obj, JFieldIDPtr fieldID, Dartjlong val)>(isLeaf: true); - void SetLongField(JObjectPtr obj, JFieldIDPtr fieldID, DartJLongMarker val) => + void SetLongField(JObjectPtr obj, JFieldIDPtr fieldID, Dartjlong val) => _SetLongField(obj, fieldID, val).check(); late final _SetFloatField = ptr.ref.SetFloatField.asFunction< - JThrowablePtr Function(JObjectPtr obj, JFieldIDPtr fieldID, - DartJFloatMarker val)>(isLeaf: true); + JThrowablePtr Function( + JObjectPtr obj, JFieldIDPtr fieldID, Dartjfloat val)>(isLeaf: true); - void SetFloatField( - JObjectPtr obj, JFieldIDPtr fieldID, DartJFloatMarker val) => + void SetFloatField(JObjectPtr obj, JFieldIDPtr fieldID, Dartjfloat val) => _SetFloatField(obj, fieldID, val).check(); late final _SetDoubleField = ptr.ref.SetDoubleField.asFunction< - JThrowablePtr Function(JObjectPtr obj, JFieldIDPtr fieldID, - DartJDoubleMarker val)>(isLeaf: true); + JThrowablePtr Function( + JObjectPtr obj, JFieldIDPtr fieldID, Dartjdouble val)>(isLeaf: true); - void SetDoubleField( - JObjectPtr obj, JFieldIDPtr fieldID, DartJDoubleMarker val) => + void SetDoubleField(JObjectPtr obj, JFieldIDPtr fieldID, Dartjdouble val) => _SetDoubleField(obj, fieldID, val).check(); late final _GetStaticMethodID = ptr.ref.GetStaticMethodID.asFunction< @@ -718,38 +711,35 @@ class GlobalJniEnv { late final _CallStaticByteMethod = ptr.ref.CallStaticByteMethod .asFunction(); - DartJByteMarker CallStaticByteMethod( - JClassPtr clazz, JMethodIDPtr methodID) => + Dartjbyte CallStaticByteMethod(JClassPtr clazz, JMethodIDPtr methodID) => _CallStaticByteMethod(clazz, methodID).byte; late final _CallStaticByteMethodA = ptr.ref.CallStaticByteMethodA.asFunction< JniResult Function( JClassPtr clazz, JMethodIDPtr methodID, ffi.Pointer args)>(); - DartJByteMarker CallStaticByteMethodA( + Dartjbyte CallStaticByteMethodA( JClassPtr clazz, JMethodIDPtr methodID, ffi.Pointer args) => _CallStaticByteMethodA(clazz, methodID, args).byte; late final _CallStaticCharMethod = ptr.ref.CallStaticCharMethod .asFunction(); - DartJCharMarker CallStaticCharMethod( - JClassPtr clazz, JMethodIDPtr methodID) => + Dartjchar CallStaticCharMethod(JClassPtr clazz, JMethodIDPtr methodID) => _CallStaticCharMethod(clazz, methodID).char; late final _CallStaticCharMethodA = ptr.ref.CallStaticCharMethodA.asFunction< JniResult Function( JClassPtr clazz, JMethodIDPtr methodID, ffi.Pointer args)>(); - DartJCharMarker CallStaticCharMethodA( + Dartjchar CallStaticCharMethodA( JClassPtr clazz, JMethodIDPtr methodID, ffi.Pointer args) => _CallStaticCharMethodA(clazz, methodID, args).char; late final _CallStaticShortMethod = ptr.ref.CallStaticShortMethod .asFunction(); - DartJShortMarker CallStaticShortMethod( - JClassPtr clazz, JMethodIDPtr methodID) => + Dartjshort CallStaticShortMethod(JClassPtr clazz, JMethodIDPtr methodID) => _CallStaticShortMethod(clazz, methodID).short; late final _CallStaticShortMethodA = ptr.ref.CallStaticShortMethodA @@ -757,44 +747,42 @@ class GlobalJniEnv { JniResult Function(JClassPtr clazz, JMethodIDPtr methodID, ffi.Pointer args)>(); - DartJShortMarker CallStaticShortMethodA( + Dartjshort CallStaticShortMethodA( JClassPtr clazz, JMethodIDPtr methodID, ffi.Pointer args) => _CallStaticShortMethodA(clazz, methodID, args).short; late final _CallStaticIntMethod = ptr.ref.CallStaticIntMethod .asFunction(); - DartJIntMarker CallStaticIntMethod(JClassPtr clazz, JMethodIDPtr methodID) => + Dartjint CallStaticIntMethod(JClassPtr clazz, JMethodIDPtr methodID) => _CallStaticIntMethod(clazz, methodID).integer; late final _CallStaticIntMethodA = ptr.ref.CallStaticIntMethodA.asFunction< JniResult Function( JClassPtr clazz, JMethodIDPtr methodID, ffi.Pointer args)>(); - DartJIntMarker CallStaticIntMethodA( + Dartjint CallStaticIntMethodA( JClassPtr clazz, JMethodIDPtr methodID, ffi.Pointer args) => _CallStaticIntMethodA(clazz, methodID, args).integer; late final _CallStaticLongMethod = ptr.ref.CallStaticLongMethod .asFunction(); - DartJLongMarker CallStaticLongMethod( - JClassPtr clazz, JMethodIDPtr methodID) => + Dartjlong CallStaticLongMethod(JClassPtr clazz, JMethodIDPtr methodID) => _CallStaticLongMethod(clazz, methodID).long; late final _CallStaticLongMethodA = ptr.ref.CallStaticLongMethodA.asFunction< JniResult Function( JClassPtr clazz, JMethodIDPtr methodID, ffi.Pointer args)>(); - DartJLongMarker CallStaticLongMethodA( + Dartjlong CallStaticLongMethodA( JClassPtr clazz, JMethodIDPtr methodID, ffi.Pointer args) => _CallStaticLongMethodA(clazz, methodID, args).long; late final _CallStaticFloatMethod = ptr.ref.CallStaticFloatMethod .asFunction(); - DartJFloatMarker CallStaticFloatMethod( - JClassPtr clazz, JMethodIDPtr methodID) => + Dartjfloat CallStaticFloatMethod(JClassPtr clazz, JMethodIDPtr methodID) => _CallStaticFloatMethod(clazz, methodID).float; late final _CallStaticFloatMethodA = ptr.ref.CallStaticFloatMethodA @@ -802,15 +790,14 @@ class GlobalJniEnv { JniResult Function(JClassPtr clazz, JMethodIDPtr methodID, ffi.Pointer args)>(); - DartJFloatMarker CallStaticFloatMethodA( + Dartjfloat CallStaticFloatMethodA( JClassPtr clazz, JMethodIDPtr methodID, ffi.Pointer args) => _CallStaticFloatMethodA(clazz, methodID, args).float; late final _CallStaticDoubleMethod = ptr.ref.CallStaticDoubleMethod .asFunction(); - DartJDoubleMarker CallStaticDoubleMethod( - JClassPtr clazz, JMethodIDPtr methodID) => + Dartjdouble CallStaticDoubleMethod(JClassPtr clazz, JMethodIDPtr methodID) => _CallStaticDoubleMethod(clazz, methodID).doubleFloat; late final _CallStaticDoubleMethodA = ptr.ref.CallStaticDoubleMethodA @@ -818,7 +805,7 @@ class GlobalJniEnv { JniResult Function(JClassPtr clazz, JMethodIDPtr methodID, ffi.Pointer args)>(); - DartJDoubleMarker CallStaticDoubleMethodA( + Dartjdouble CallStaticDoubleMethodA( JClassPtr clazz, JMethodIDPtr methodID, ffi.Pointer args) => _CallStaticDoubleMethodA(clazz, methodID, args).doubleFloat; @@ -862,50 +849,49 @@ class GlobalJniEnv { .asFunction( isLeaf: true); - DartJByteMarker GetStaticByteField(JClassPtr clazz, JFieldIDPtr fieldID) => + Dartjbyte GetStaticByteField(JClassPtr clazz, JFieldIDPtr fieldID) => _GetStaticByteField(clazz, fieldID).byte; late final _GetStaticCharField = ptr.ref.GetStaticCharField .asFunction( isLeaf: true); - DartJCharMarker GetStaticCharField(JClassPtr clazz, JFieldIDPtr fieldID) => + Dartjchar GetStaticCharField(JClassPtr clazz, JFieldIDPtr fieldID) => _GetStaticCharField(clazz, fieldID).char; late final _GetStaticShortField = ptr.ref.GetStaticShortField .asFunction( isLeaf: true); - DartJShortMarker GetStaticShortField(JClassPtr clazz, JFieldIDPtr fieldID) => + Dartjshort GetStaticShortField(JClassPtr clazz, JFieldIDPtr fieldID) => _GetStaticShortField(clazz, fieldID).short; late final _GetStaticIntField = ptr.ref.GetStaticIntField .asFunction( isLeaf: true); - DartJIntMarker GetStaticIntField(JClassPtr clazz, JFieldIDPtr fieldID) => + Dartjint GetStaticIntField(JClassPtr clazz, JFieldIDPtr fieldID) => _GetStaticIntField(clazz, fieldID).integer; late final _GetStaticLongField = ptr.ref.GetStaticLongField .asFunction( isLeaf: true); - DartJLongMarker GetStaticLongField(JClassPtr clazz, JFieldIDPtr fieldID) => + Dartjlong GetStaticLongField(JClassPtr clazz, JFieldIDPtr fieldID) => _GetStaticLongField(clazz, fieldID).long; late final _GetStaticFloatField = ptr.ref.GetStaticFloatField .asFunction( isLeaf: true); - DartJFloatMarker GetStaticFloatField(JClassPtr clazz, JFieldIDPtr fieldID) => + Dartjfloat GetStaticFloatField(JClassPtr clazz, JFieldIDPtr fieldID) => _GetStaticFloatField(clazz, fieldID).float; late final _GetStaticDoubleField = ptr.ref.GetStaticDoubleField .asFunction( isLeaf: true); - DartJDoubleMarker GetStaticDoubleField( - JClassPtr clazz, JFieldIDPtr fieldID) => + Dartjdouble GetStaticDoubleField(JClassPtr clazz, JFieldIDPtr fieldID) => _GetStaticDoubleField(clazz, fieldID).doubleFloat; late final _SetStaticObjectField = ptr.ref.SetStaticObjectField.asFunction< @@ -918,80 +904,78 @@ class GlobalJniEnv { late final _SetStaticBooleanField = ptr.ref.SetStaticBooleanField.asFunction< JThrowablePtr Function(JClassPtr clazz, JFieldIDPtr fieldID, - DartJBooleanMarker val)>(isLeaf: true); + Dartjboolean val)>(isLeaf: true); void SetStaticBooleanField( - JClassPtr clazz, JFieldIDPtr fieldID, DartJBooleanMarker val) => + JClassPtr clazz, JFieldIDPtr fieldID, Dartjboolean val) => _SetStaticBooleanField(clazz, fieldID, val).check(); late final _SetStaticByteField = ptr.ref.SetStaticByteField.asFunction< - JThrowablePtr Function(JClassPtr clazz, JFieldIDPtr fieldID, - DartJByteMarker val)>(isLeaf: true); + JThrowablePtr Function( + JClassPtr clazz, JFieldIDPtr fieldID, Dartjbyte val)>(isLeaf: true); void SetStaticByteField( - JClassPtr clazz, JFieldIDPtr fieldID, DartJByteMarker val) => + JClassPtr clazz, JFieldIDPtr fieldID, Dartjbyte val) => _SetStaticByteField(clazz, fieldID, val).check(); late final _SetStaticCharField = ptr.ref.SetStaticCharField.asFunction< - JThrowablePtr Function(JClassPtr clazz, JFieldIDPtr fieldID, - DartJCharMarker val)>(isLeaf: true); + JThrowablePtr Function( + JClassPtr clazz, JFieldIDPtr fieldID, Dartjchar val)>(isLeaf: true); void SetStaticCharField( - JClassPtr clazz, JFieldIDPtr fieldID, DartJCharMarker val) => + JClassPtr clazz, JFieldIDPtr fieldID, Dartjchar val) => _SetStaticCharField(clazz, fieldID, val).check(); late final _SetStaticShortField = ptr.ref.SetStaticShortField.asFunction< - JThrowablePtr Function(JClassPtr clazz, JFieldIDPtr fieldID, - DartJShortMarker val)>(isLeaf: true); + JThrowablePtr Function( + JClassPtr clazz, JFieldIDPtr fieldID, Dartjshort val)>(isLeaf: true); void SetStaticShortField( - JClassPtr clazz, JFieldIDPtr fieldID, DartJShortMarker val) => + JClassPtr clazz, JFieldIDPtr fieldID, Dartjshort val) => _SetStaticShortField(clazz, fieldID, val).check(); late final _SetStaticIntField = ptr.ref.SetStaticIntField.asFunction< - JThrowablePtr Function(JClassPtr clazz, JFieldIDPtr fieldID, - DartJIntMarker val)>(isLeaf: true); + JThrowablePtr Function( + JClassPtr clazz, JFieldIDPtr fieldID, Dartjint val)>(isLeaf: true); - void SetStaticIntField( - JClassPtr clazz, JFieldIDPtr fieldID, DartJIntMarker val) => + void SetStaticIntField(JClassPtr clazz, JFieldIDPtr fieldID, Dartjint val) => _SetStaticIntField(clazz, fieldID, val).check(); late final _SetStaticLongField = ptr.ref.SetStaticLongField.asFunction< - JThrowablePtr Function(JClassPtr clazz, JFieldIDPtr fieldID, - DartJLongMarker val)>(isLeaf: true); + JThrowablePtr Function( + JClassPtr clazz, JFieldIDPtr fieldID, Dartjlong val)>(isLeaf: true); void SetStaticLongField( - JClassPtr clazz, JFieldIDPtr fieldID, DartJLongMarker val) => + JClassPtr clazz, JFieldIDPtr fieldID, Dartjlong val) => _SetStaticLongField(clazz, fieldID, val).check(); late final _SetStaticFloatField = ptr.ref.SetStaticFloatField.asFunction< - JThrowablePtr Function(JClassPtr clazz, JFieldIDPtr fieldID, - DartJFloatMarker val)>(isLeaf: true); + JThrowablePtr Function( + JClassPtr clazz, JFieldIDPtr fieldID, Dartjfloat val)>(isLeaf: true); void SetStaticFloatField( - JClassPtr clazz, JFieldIDPtr fieldID, DartJFloatMarker val) => + JClassPtr clazz, JFieldIDPtr fieldID, Dartjfloat val) => _SetStaticFloatField(clazz, fieldID, val).check(); late final _SetStaticDoubleField = ptr.ref.SetStaticDoubleField.asFunction< - JThrowablePtr Function(JClassPtr clazz, JFieldIDPtr fieldID, - DartJDoubleMarker val)>(isLeaf: true); + JThrowablePtr Function( + JClassPtr clazz, JFieldIDPtr fieldID, Dartjdouble val)>(isLeaf: true); void SetStaticDoubleField( - JClassPtr clazz, JFieldIDPtr fieldID, DartJDoubleMarker val) => + JClassPtr clazz, JFieldIDPtr fieldID, Dartjdouble val) => _SetStaticDoubleField(clazz, fieldID, val).check(); late final _NewString = ptr.ref.NewString.asFunction< JniResult Function( - ffi.Pointer unicodeChars, DartJIntMarker len)>(); + ffi.Pointer unicodeChars, Dartjint len)>(); - JStringPtr NewString( - ffi.Pointer unicodeChars, DartJIntMarker len) => + JStringPtr NewString(ffi.Pointer unicodeChars, Dartjint len) => _NewString(unicodeChars, len).objectPointer; late final _GetStringLength = ptr.ref.GetStringLength .asFunction(isLeaf: true); - DartJIntMarker GetStringLength(JStringPtr string) => + Dartjint GetStringLength(JStringPtr string) => _GetStringLength(string).integer; late final _GetStringChars = ptr.ref.GetStringChars.asFunction< @@ -1018,7 +1002,7 @@ class GlobalJniEnv { late final _GetStringUTFLength = ptr.ref.GetStringUTFLength .asFunction(isLeaf: true); - DartJIntMarker GetStringUTFLength(JStringPtr string) => + Dartjint GetStringUTFLength(JStringPtr string) => _GetStringUTFLength(string).integer; late final _GetStringUTFChars = ptr.ref.GetStringUTFChars.asFunction< @@ -1038,79 +1022,77 @@ class GlobalJniEnv { late final _GetArrayLength = ptr.ref.GetArrayLength .asFunction(isLeaf: true); - DartJIntMarker GetArrayLength(JArrayPtr array) => - _GetArrayLength(array).integer; + Dartjint GetArrayLength(JArrayPtr array) => _GetArrayLength(array).integer; late final _NewObjectArray = ptr.ref.NewObjectArray.asFunction< - JniResult Function(DartJIntMarker length, JClassPtr elementClass, + JniResult Function(Dartjint length, JClassPtr elementClass, JObjectPtr initialElement)>(); - JObjectArrayPtr NewObjectArray(DartJIntMarker length, JClassPtr elementClass, - JObjectPtr initialElement) => + JObjectArrayPtr NewObjectArray( + Dartjint length, JClassPtr elementClass, JObjectPtr initialElement) => _NewObjectArray(length, elementClass, initialElement).objectPointer; - late final _GetObjectArrayElement = ptr.ref.GetObjectArrayElement.asFunction< - JniResult Function( - JObjectArrayPtr array, DartJIntMarker index)>(isLeaf: true); + late final _GetObjectArrayElement = ptr.ref.GetObjectArrayElement + .asFunction( + isLeaf: true); - JObjectPtr GetObjectArrayElement( - JObjectArrayPtr array, DartJIntMarker index) => + JObjectPtr GetObjectArrayElement(JObjectArrayPtr array, Dartjint index) => _GetObjectArrayElement(array, index).objectPointer; late final _SetObjectArrayElement = ptr.ref.SetObjectArrayElement.asFunction< - JThrowablePtr Function(JObjectArrayPtr array, DartJIntMarker index, - JObjectPtr val)>(isLeaf: true); + JThrowablePtr Function( + JObjectArrayPtr array, Dartjint index, JObjectPtr val)>(isLeaf: true); void SetObjectArrayElement( - JObjectArrayPtr array, DartJIntMarker index, JObjectPtr val) => + JObjectArrayPtr array, Dartjint index, JObjectPtr val) => _SetObjectArrayElement(array, index, val).check(); - late final _NewBooleanArray = ptr.ref.NewBooleanArray - .asFunction(); + late final _NewBooleanArray = + ptr.ref.NewBooleanArray.asFunction(); - JBooleanArrayPtr NewBooleanArray(DartJIntMarker length) => + JBooleanArrayPtr NewBooleanArray(Dartjint length) => _NewBooleanArray(length).objectPointer; - late final _NewByteArray = ptr.ref.NewByteArray - .asFunction(); + late final _NewByteArray = + ptr.ref.NewByteArray.asFunction(); - JByteArrayPtr NewByteArray(DartJIntMarker length) => + JByteArrayPtr NewByteArray(Dartjint length) => _NewByteArray(length).objectPointer; - late final _NewCharArray = ptr.ref.NewCharArray - .asFunction(); + late final _NewCharArray = + ptr.ref.NewCharArray.asFunction(); - JCharArrayPtr NewCharArray(DartJIntMarker length) => + JCharArrayPtr NewCharArray(Dartjint length) => _NewCharArray(length).objectPointer; - late final _NewShortArray = ptr.ref.NewShortArray - .asFunction(); + late final _NewShortArray = + ptr.ref.NewShortArray.asFunction(); - JShortArrayPtr NewShortArray(DartJIntMarker length) => + JShortArrayPtr NewShortArray(Dartjint length) => _NewShortArray(length).objectPointer; - late final _NewIntArray = ptr.ref.NewIntArray - .asFunction(); + late final _NewIntArray = + ptr.ref.NewIntArray.asFunction(); - JIntArrayPtr NewIntArray(DartJIntMarker length) => + JIntArrayPtr NewIntArray(Dartjint length) => _NewIntArray(length).objectPointer; - late final _NewLongArray = ptr.ref.NewLongArray - .asFunction(); + late final _NewLongArray = + ptr.ref.NewLongArray.asFunction(); - JLongArrayPtr NewLongArray(DartJIntMarker length) => + JLongArrayPtr NewLongArray(Dartjint length) => _NewLongArray(length).objectPointer; - late final _NewFloatArray = ptr.ref.NewFloatArray - .asFunction(); + late final _NewFloatArray = + ptr.ref.NewFloatArray.asFunction(); - JFloatArrayPtr NewFloatArray(DartJIntMarker length) => + JFloatArrayPtr NewFloatArray(Dartjint length) => _NewFloatArray(length).objectPointer; - late final _NewDoubleArray = ptr.ref.NewDoubleArray - .asFunction(); + late final _NewDoubleArray = + ptr.ref.NewDoubleArray.asFunction(); - JDoubleArrayPtr NewDoubleArray(DartJIntMarker length) => + JDoubleArrayPtr NewDoubleArray(Dartjint length) => _NewDoubleArray(length).objectPointer; late final _GetBooleanArrayElements = ptr.ref.GetBooleanArrayElements @@ -1182,248 +1164,248 @@ class GlobalJniEnv { late final _ReleaseBooleanArrayElements = ptr.ref.ReleaseBooleanArrayElements .asFunction< JThrowablePtr Function(JBooleanArrayPtr array, - ffi.Pointer elems, DartJIntMarker mode)>(); + ffi.Pointer elems, Dartjint mode)>(); void ReleaseBooleanArrayElements(JBooleanArrayPtr array, - ffi.Pointer elems, DartJIntMarker mode) => + ffi.Pointer elems, Dartjint mode) => _ReleaseBooleanArrayElements(array, elems, mode).check(); late final _ReleaseByteArrayElements = ptr.ref.ReleaseByteArrayElements .asFunction< JThrowablePtr Function(JByteArrayPtr array, - ffi.Pointer elems, DartJIntMarker mode)>(); + ffi.Pointer elems, Dartjint mode)>(); - void ReleaseByteArrayElements(JByteArrayPtr array, - ffi.Pointer elems, DartJIntMarker mode) => + void ReleaseByteArrayElements( + JByteArrayPtr array, ffi.Pointer elems, Dartjint mode) => _ReleaseByteArrayElements(array, elems, mode).check(); late final _ReleaseCharArrayElements = ptr.ref.ReleaseCharArrayElements .asFunction< JThrowablePtr Function(JCharArrayPtr array, - ffi.Pointer elems, DartJIntMarker mode)>(); + ffi.Pointer elems, Dartjint mode)>(); - void ReleaseCharArrayElements(JCharArrayPtr array, - ffi.Pointer elems, DartJIntMarker mode) => + void ReleaseCharArrayElements( + JCharArrayPtr array, ffi.Pointer elems, Dartjint mode) => _ReleaseCharArrayElements(array, elems, mode).check(); late final _ReleaseShortArrayElements = ptr.ref.ReleaseShortArrayElements .asFunction< JThrowablePtr Function(JShortArrayPtr array, - ffi.Pointer elems, DartJIntMarker mode)>(); + ffi.Pointer elems, Dartjint mode)>(); void ReleaseShortArrayElements(JShortArrayPtr array, - ffi.Pointer elems, DartJIntMarker mode) => + ffi.Pointer elems, Dartjint mode) => _ReleaseShortArrayElements(array, elems, mode).check(); late final _ReleaseIntArrayElements = ptr.ref.ReleaseIntArrayElements .asFunction< JThrowablePtr Function(JIntArrayPtr array, - ffi.Pointer elems, DartJIntMarker mode)>(); + ffi.Pointer elems, Dartjint mode)>(); - void ReleaseIntArrayElements(JIntArrayPtr array, - ffi.Pointer elems, DartJIntMarker mode) => + void ReleaseIntArrayElements( + JIntArrayPtr array, ffi.Pointer elems, Dartjint mode) => _ReleaseIntArrayElements(array, elems, mode).check(); late final _ReleaseLongArrayElements = ptr.ref.ReleaseLongArrayElements .asFunction< JThrowablePtr Function(JLongArrayPtr array, - ffi.Pointer elems, DartJIntMarker mode)>(); + ffi.Pointer elems, Dartjint mode)>(); - void ReleaseLongArrayElements(JLongArrayPtr array, - ffi.Pointer elems, DartJIntMarker mode) => + void ReleaseLongArrayElements( + JLongArrayPtr array, ffi.Pointer elems, Dartjint mode) => _ReleaseLongArrayElements(array, elems, mode).check(); late final _ReleaseFloatArrayElements = ptr.ref.ReleaseFloatArrayElements .asFunction< JThrowablePtr Function(JFloatArrayPtr array, - ffi.Pointer elems, DartJIntMarker mode)>(); + ffi.Pointer elems, Dartjint mode)>(); void ReleaseFloatArrayElements(JFloatArrayPtr array, - ffi.Pointer elems, DartJIntMarker mode) => + ffi.Pointer elems, Dartjint mode) => _ReleaseFloatArrayElements(array, elems, mode).check(); late final _ReleaseDoubleArrayElements = ptr.ref.ReleaseDoubleArrayElements .asFunction< JThrowablePtr Function(JDoubleArrayPtr array, - ffi.Pointer elems, DartJIntMarker mode)>(); + ffi.Pointer elems, Dartjint mode)>(); void ReleaseDoubleArrayElements(JDoubleArrayPtr array, - ffi.Pointer elems, DartJIntMarker mode) => + ffi.Pointer elems, Dartjint mode) => _ReleaseDoubleArrayElements(array, elems, mode).check(); late final _GetBooleanArrayRegion = ptr.ref.GetBooleanArrayRegion.asFunction< - JThrowablePtr Function(JBooleanArrayPtr array, DartJIntMarker start, - DartJIntMarker len, ffi.Pointer buf)>(); + JThrowablePtr Function(JBooleanArrayPtr array, Dartjint start, + Dartjint len, ffi.Pointer buf)>(); - void GetBooleanArrayRegion(JBooleanArrayPtr array, DartJIntMarker start, - DartJIntMarker len, ffi.Pointer buf) => + void GetBooleanArrayRegion(JBooleanArrayPtr array, Dartjint start, + Dartjint len, ffi.Pointer buf) => _GetBooleanArrayRegion(array, start, len, buf).check(); late final _GetByteArrayRegion = ptr.ref.GetByteArrayRegion.asFunction< - JThrowablePtr Function(JByteArrayPtr array, DartJIntMarker start, - DartJIntMarker len, ffi.Pointer buf)>(); + JThrowablePtr Function(JByteArrayPtr array, Dartjint start, Dartjint len, + ffi.Pointer buf)>(); - void GetByteArrayRegion(JByteArrayPtr array, DartJIntMarker start, - DartJIntMarker len, ffi.Pointer buf) => + void GetByteArrayRegion(JByteArrayPtr array, Dartjint start, Dartjint len, + ffi.Pointer buf) => _GetByteArrayRegion(array, start, len, buf).check(); late final _GetCharArrayRegion = ptr.ref.GetCharArrayRegion.asFunction< - JThrowablePtr Function(JCharArrayPtr array, DartJIntMarker start, - DartJIntMarker len, ffi.Pointer buf)>(); + JThrowablePtr Function(JCharArrayPtr array, Dartjint start, Dartjint len, + ffi.Pointer buf)>(); - void GetCharArrayRegion(JCharArrayPtr array, DartJIntMarker start, - DartJIntMarker len, ffi.Pointer buf) => + void GetCharArrayRegion(JCharArrayPtr array, Dartjint start, Dartjint len, + ffi.Pointer buf) => _GetCharArrayRegion(array, start, len, buf).check(); late final _GetShortArrayRegion = ptr.ref.GetShortArrayRegion.asFunction< - JThrowablePtr Function(JShortArrayPtr array, DartJIntMarker start, - DartJIntMarker len, ffi.Pointer buf)>(); + JThrowablePtr Function(JShortArrayPtr array, Dartjint start, Dartjint len, + ffi.Pointer buf)>(); - void GetShortArrayRegion(JShortArrayPtr array, DartJIntMarker start, - DartJIntMarker len, ffi.Pointer buf) => + void GetShortArrayRegion(JShortArrayPtr array, Dartjint start, Dartjint len, + ffi.Pointer buf) => _GetShortArrayRegion(array, start, len, buf).check(); late final _GetIntArrayRegion = ptr.ref.GetIntArrayRegion.asFunction< - JThrowablePtr Function(JIntArrayPtr array, DartJIntMarker start, - DartJIntMarker len, ffi.Pointer buf)>(); + JThrowablePtr Function(JIntArrayPtr array, Dartjint start, Dartjint len, + ffi.Pointer buf)>(); - void GetIntArrayRegion(JIntArrayPtr array, DartJIntMarker start, - DartJIntMarker len, ffi.Pointer buf) => + void GetIntArrayRegion(JIntArrayPtr array, Dartjint start, Dartjint len, + ffi.Pointer buf) => _GetIntArrayRegion(array, start, len, buf).check(); late final _GetLongArrayRegion = ptr.ref.GetLongArrayRegion.asFunction< - JThrowablePtr Function(JLongArrayPtr array, DartJIntMarker start, - DartJIntMarker len, ffi.Pointer buf)>(); + JThrowablePtr Function(JLongArrayPtr array, Dartjint start, Dartjint len, + ffi.Pointer buf)>(); - void GetLongArrayRegion(JLongArrayPtr array, DartJIntMarker start, - DartJIntMarker len, ffi.Pointer buf) => + void GetLongArrayRegion(JLongArrayPtr array, Dartjint start, Dartjint len, + ffi.Pointer buf) => _GetLongArrayRegion(array, start, len, buf).check(); late final _GetFloatArrayRegion = ptr.ref.GetFloatArrayRegion.asFunction< - JThrowablePtr Function(JFloatArrayPtr array, DartJIntMarker start, - DartJIntMarker len, ffi.Pointer buf)>(); + JThrowablePtr Function(JFloatArrayPtr array, Dartjint start, Dartjint len, + ffi.Pointer buf)>(); - void GetFloatArrayRegion(JFloatArrayPtr array, DartJIntMarker start, - DartJIntMarker len, ffi.Pointer buf) => + void GetFloatArrayRegion(JFloatArrayPtr array, Dartjint start, Dartjint len, + ffi.Pointer buf) => _GetFloatArrayRegion(array, start, len, buf).check(); late final _GetDoubleArrayRegion = ptr.ref.GetDoubleArrayRegion.asFunction< - JThrowablePtr Function(JDoubleArrayPtr array, DartJIntMarker start, - DartJIntMarker len, ffi.Pointer buf)>(); + JThrowablePtr Function(JDoubleArrayPtr array, Dartjint start, + Dartjint len, ffi.Pointer buf)>(); - void GetDoubleArrayRegion(JDoubleArrayPtr array, DartJIntMarker start, - DartJIntMarker len, ffi.Pointer buf) => + void GetDoubleArrayRegion(JDoubleArrayPtr array, Dartjint start, Dartjint len, + ffi.Pointer buf) => _GetDoubleArrayRegion(array, start, len, buf).check(); late final _SetBooleanArrayRegion = ptr.ref.SetBooleanArrayRegion.asFunction< - JThrowablePtr Function(JBooleanArrayPtr array, DartJIntMarker start, - DartJIntMarker len, ffi.Pointer buf)>(); + JThrowablePtr Function(JBooleanArrayPtr array, Dartjint start, + Dartjint len, ffi.Pointer buf)>(); - void SetBooleanArrayRegion(JBooleanArrayPtr array, DartJIntMarker start, - DartJIntMarker len, ffi.Pointer buf) => + void SetBooleanArrayRegion(JBooleanArrayPtr array, Dartjint start, + Dartjint len, ffi.Pointer buf) => _SetBooleanArrayRegion(array, start, len, buf).check(); late final _SetByteArrayRegion = ptr.ref.SetByteArrayRegion.asFunction< - JThrowablePtr Function(JByteArrayPtr array, DartJIntMarker start, - DartJIntMarker len, ffi.Pointer buf)>(); + JThrowablePtr Function(JByteArrayPtr array, Dartjint start, Dartjint len, + ffi.Pointer buf)>(); - void SetByteArrayRegion(JByteArrayPtr array, DartJIntMarker start, - DartJIntMarker len, ffi.Pointer buf) => + void SetByteArrayRegion(JByteArrayPtr array, Dartjint start, Dartjint len, + ffi.Pointer buf) => _SetByteArrayRegion(array, start, len, buf).check(); late final _SetCharArrayRegion = ptr.ref.SetCharArrayRegion.asFunction< - JThrowablePtr Function(JCharArrayPtr array, DartJIntMarker start, - DartJIntMarker len, ffi.Pointer buf)>(); + JThrowablePtr Function(JCharArrayPtr array, Dartjint start, Dartjint len, + ffi.Pointer buf)>(); - void SetCharArrayRegion(JCharArrayPtr array, DartJIntMarker start, - DartJIntMarker len, ffi.Pointer buf) => + void SetCharArrayRegion(JCharArrayPtr array, Dartjint start, Dartjint len, + ffi.Pointer buf) => _SetCharArrayRegion(array, start, len, buf).check(); late final _SetShortArrayRegion = ptr.ref.SetShortArrayRegion.asFunction< - JThrowablePtr Function(JShortArrayPtr array, DartJIntMarker start, - DartJIntMarker len, ffi.Pointer buf)>(); + JThrowablePtr Function(JShortArrayPtr array, Dartjint start, Dartjint len, + ffi.Pointer buf)>(); - void SetShortArrayRegion(JShortArrayPtr array, DartJIntMarker start, - DartJIntMarker len, ffi.Pointer buf) => + void SetShortArrayRegion(JShortArrayPtr array, Dartjint start, Dartjint len, + ffi.Pointer buf) => _SetShortArrayRegion(array, start, len, buf).check(); late final _SetIntArrayRegion = ptr.ref.SetIntArrayRegion.asFunction< - JThrowablePtr Function(JIntArrayPtr array, DartJIntMarker start, - DartJIntMarker len, ffi.Pointer buf)>(); + JThrowablePtr Function(JIntArrayPtr array, Dartjint start, Dartjint len, + ffi.Pointer buf)>(); - void SetIntArrayRegion(JIntArrayPtr array, DartJIntMarker start, - DartJIntMarker len, ffi.Pointer buf) => + void SetIntArrayRegion(JIntArrayPtr array, Dartjint start, Dartjint len, + ffi.Pointer buf) => _SetIntArrayRegion(array, start, len, buf).check(); late final _SetLongArrayRegion = ptr.ref.SetLongArrayRegion.asFunction< - JThrowablePtr Function(JLongArrayPtr array, DartJIntMarker start, - DartJIntMarker len, ffi.Pointer buf)>(); + JThrowablePtr Function(JLongArrayPtr array, Dartjint start, Dartjint len, + ffi.Pointer buf)>(); - void SetLongArrayRegion(JLongArrayPtr array, DartJIntMarker start, - DartJIntMarker len, ffi.Pointer buf) => + void SetLongArrayRegion(JLongArrayPtr array, Dartjint start, Dartjint len, + ffi.Pointer buf) => _SetLongArrayRegion(array, start, len, buf).check(); late final _SetFloatArrayRegion = ptr.ref.SetFloatArrayRegion.asFunction< - JThrowablePtr Function(JFloatArrayPtr array, DartJIntMarker start, - DartJIntMarker len, ffi.Pointer buf)>(); + JThrowablePtr Function(JFloatArrayPtr array, Dartjint start, Dartjint len, + ffi.Pointer buf)>(); - void SetFloatArrayRegion(JFloatArrayPtr array, DartJIntMarker start, - DartJIntMarker len, ffi.Pointer buf) => + void SetFloatArrayRegion(JFloatArrayPtr array, Dartjint start, Dartjint len, + ffi.Pointer buf) => _SetFloatArrayRegion(array, start, len, buf).check(); late final _SetDoubleArrayRegion = ptr.ref.SetDoubleArrayRegion.asFunction< - JThrowablePtr Function(JDoubleArrayPtr array, DartJIntMarker start, - DartJIntMarker len, ffi.Pointer buf)>(); + JThrowablePtr Function(JDoubleArrayPtr array, Dartjint start, + Dartjint len, ffi.Pointer buf)>(); - void SetDoubleArrayRegion(JDoubleArrayPtr array, DartJIntMarker start, - DartJIntMarker len, ffi.Pointer buf) => + void SetDoubleArrayRegion(JDoubleArrayPtr array, Dartjint start, Dartjint len, + ffi.Pointer buf) => _SetDoubleArrayRegion(array, start, len, buf).check(); late final _RegisterNatives = ptr.ref.RegisterNatives.asFunction< JniResult Function(JClassPtr clazz, ffi.Pointer methods, - DartJIntMarker nMethods)>(); + Dartjint nMethods)>(); - DartJIntMarker RegisterNatives(JClassPtr clazz, - ffi.Pointer methods, DartJIntMarker nMethods) => + Dartjint RegisterNatives(JClassPtr clazz, + ffi.Pointer methods, Dartjint nMethods) => _RegisterNatives(clazz, methods, nMethods).integer; late final _UnregisterNatives = ptr.ref.UnregisterNatives .asFunction(); - DartJIntMarker UnregisterNatives(JClassPtr clazz) => + Dartjint UnregisterNatives(JClassPtr clazz) => _UnregisterNatives(clazz).integer; late final _MonitorEnter = ptr.ref.MonitorEnter.asFunction(); - DartJIntMarker MonitorEnter(JObjectPtr obj) => _MonitorEnter(obj).integer; + Dartjint MonitorEnter(JObjectPtr obj) => _MonitorEnter(obj).integer; late final _MonitorExit = ptr.ref.MonitorExit.asFunction(); - DartJIntMarker MonitorExit(JObjectPtr obj) => _MonitorExit(obj).integer; + Dartjint MonitorExit(JObjectPtr obj) => _MonitorExit(obj).integer; late final _GetJavaVM = ptr.ref.GetJavaVM - .asFunction> vm)>( + .asFunction> vm)>( isLeaf: true); - DartJIntMarker GetJavaVM(ffi.Pointer> vm) => + Dartjint GetJavaVM(ffi.Pointer> vm) => _GetJavaVM(vm).integer; late final _GetStringRegion = ptr.ref.GetStringRegion.asFunction< - JThrowablePtr Function(JStringPtr str, DartJIntMarker start, - DartJIntMarker len, ffi.Pointer buf)>(); + JThrowablePtr Function(JStringPtr str, Dartjint start, Dartjint len, + ffi.Pointer buf)>(); - void GetStringRegion(JStringPtr str, DartJIntMarker start, DartJIntMarker len, + void GetStringRegion(JStringPtr str, Dartjint start, Dartjint len, ffi.Pointer buf) => _GetStringRegion(str, start, len, buf).check(); late final _GetStringUTFRegion = ptr.ref.GetStringUTFRegion.asFunction< - JThrowablePtr Function(JStringPtr str, DartJIntMarker start, - DartJIntMarker len, ffi.Pointer buf)>(); + JThrowablePtr Function(JStringPtr str, Dartjint start, Dartjint len, + ffi.Pointer buf)>(); - void GetStringUTFRegion(JStringPtr str, DartJIntMarker start, - DartJIntMarker len, ffi.Pointer buf) => + void GetStringUTFRegion(JStringPtr str, Dartjint start, Dartjint len, + ffi.Pointer buf) => _GetStringUTFRegion(str, start, len, buf).check(); late final _GetPrimitiveArrayCritical = ptr.ref.GetPrimitiveArrayCritical @@ -1437,11 +1419,11 @@ class GlobalJniEnv { late final _ReleasePrimitiveArrayCritical = ptr.ref.ReleasePrimitiveArrayCritical.asFunction< - JThrowablePtr Function(JArrayPtr array, ffi.Pointer carray, - DartJIntMarker mode)>(); + JThrowablePtr Function( + JArrayPtr array, ffi.Pointer carray, Dartjint mode)>(); void ReleasePrimitiveArrayCritical( - JArrayPtr array, ffi.Pointer carray, DartJIntMarker mode) => + JArrayPtr array, ffi.Pointer carray, Dartjint mode) => _ReleasePrimitiveArrayCritical(array, carray, mode).check(); late final _GetStringCritical = ptr.ref.GetStringCritical.asFunction< @@ -1476,11 +1458,10 @@ class GlobalJniEnv { bool ExceptionCheck() => _ExceptionCheck().boolean; late final _NewDirectByteBuffer = ptr.ref.NewDirectByteBuffer.asFunction< - JniResult Function( - ffi.Pointer address, DartJLongMarker capacity)>(); + JniResult Function(ffi.Pointer address, Dartjlong capacity)>(); JObjectPtr NewDirectByteBuffer( - ffi.Pointer address, DartJLongMarker capacity) => + ffi.Pointer address, Dartjlong capacity) => _NewDirectByteBuffer(address, capacity).objectPointer; late final _GetDirectBufferAddress = ptr.ref.GetDirectBufferAddress @@ -1492,7 +1473,7 @@ class GlobalJniEnv { late final _GetDirectBufferCapacity = ptr.ref.GetDirectBufferCapacity .asFunction(isLeaf: true); - DartJLongMarker GetDirectBufferCapacity(JObjectPtr buf) => + Dartjlong GetDirectBufferCapacity(JObjectPtr buf) => _GetDirectBufferCapacity(buf).long; late final _GetObjectRefType = ptr.ref.GetObjectRefType diff --git a/pkgs/jni/lib/src/third_party/jni_bindings_generated.dart b/pkgs/jni/lib/src/third_party/jni_bindings_generated.dart index 603d6998b2..7c63a7e19e 100644 --- a/pkgs/jni/lib/src/third_party/jni_bindings_generated.dart +++ b/pkgs/jni/lib/src/third_party/jni_bindings_generated.dart @@ -40,14 +40,6 @@ // ignore_for_file: type=lint, unused_import, deprecated_member_use_from_same_package import 'dart:ffi' as ffi; -/// Bindings for libdartjni.so which is part of jni plugin. -/// -/// It also transitively includes type definitions such as JNIEnv from third_party/jni.h; -/// -/// However, functions prefixed JNI_ are not usable because they are in a different shared library. -/// -/// Regenerate bindings with `dart run ffigen --config ffigen.yaml`. -/// class JniBindings { /// Holds the symbol lookup function. final ffi.Pointer Function(String symbolName) @@ -348,17 +340,19 @@ class JniBindings { late final _setCaptureStackTraceOnRelease = _setCaptureStackTraceOnReleasePtr.asFunction(); - late final ffi.Pointer _tlsKey = - _lookup('tlsKey'); + late final ffi.Pointer _tlsKey = _lookup('tlsKey'); - Dart__darwin_pthread_key_t get tlsKey => _tlsKey.value; + int get tlsKey => _tlsKey.value; - set tlsKey(Dart__darwin_pthread_key_t value) => _tlsKey.value = value; + set tlsKey(int value) => _tlsKey.value = value; } +typedef C_JNIEnv = ffi.Pointer; + final class CallbackResult extends ffi.Opaque {} -typedef ConditionVariable = pthread_cond_t; +typedef ConditionVariable = ffi.Int; +typedef DartConditionVariable = int; typedef Dart_FinalizableHandle = ffi.Pointer; final class Dart_FinalizableHandle_ extends ffi.Opaque {} @@ -2691,233 +2685,3222 @@ final class GlobalJniEnvStruct extends ffi.Struct { typedef JArrayPtr = JObjectPtr; typedef JBooleanArrayPtr = JArrayPtr; - -/// Primitive types that match up with Java equivalents. typedef JBooleanMarker = ffi.Uint8; -typedef DartJBooleanMarker = int; +typedef Dartjboolean = int; typedef JByteArrayPtr = JArrayPtr; typedef JByteMarker = ffi.Int8; -typedef DartJByteMarker = int; +typedef Dartjbyte = int; typedef JCharArrayPtr = JArrayPtr; typedef JCharMarker = ffi.Uint16; -typedef DartJCharMarker = int; +typedef Dartjchar = int; typedef JClassPtr = JObjectPtr; typedef JDoubleArrayPtr = JArrayPtr; typedef JDoubleMarker = ffi.Double; -typedef DartJDoubleMarker = double; +typedef Dartjdouble = double; typedef JFieldIDPtr = ffi.Pointer; typedef JFloatArrayPtr = JArrayPtr; typedef JFloatMarker = ffi.Float; -typedef DartJFloatMarker = double; +typedef Dartjfloat = double; typedef JIntArrayPtr = JArrayPtr; typedef JIntMarker = ffi.Int32; -typedef DartJIntMarker = int; +typedef Dartjint = int; typedef JLongArrayPtr = JArrayPtr; typedef JLongMarker = ffi.Int64; -typedef DartJLongMarker = int; +typedef Dartjlong = int; typedef JMethodIDPtr = ffi.Pointer; -/// JNI invocation interface. final class JNIInvokeInterface extends ffi.Opaque {} -/// Table of interface function pointers. -final class JNINativeInterface extends ffi.Opaque {} +final class JNINativeInterface extends ffi.Struct { + external ffi.Pointer reserved0; -final class JNINativeMethod extends ffi.Struct { - external ffi.Pointer name; + external ffi.Pointer reserved1; - external ffi.Pointer signature; + external ffi.Pointer reserved2; - external ffi.Pointer fnPtr; + external ffi.Pointer reserved3; - static ffi.Pointer $allocate( - ffi.Allocator $allocator, { - required ffi.Pointer name, - required ffi.Pointer signature, - required ffi.Pointer fnPtr, - }) => - $allocator() - ..ref.name = name - ..ref.signature = signature - ..ref.fnPtr = fnPtr; -} + external ffi.Pointer< + ffi.NativeFunction env)>> + GetVersion; -typedef JObjectArrayPtr = JArrayPtr; + external ffi.Pointer< + ffi.NativeFunction< + JClassPtr Function( + ffi.Pointer env, + ffi.Pointer name, + JObjectPtr loader, + ffi.Pointer buf, + JSizeMarker bufLen)>> DefineClass; -/// Reference types, in C. -typedef JObjectPtr = ffi.Pointer; + external ffi.Pointer< + ffi.NativeFunction< + JClassPtr Function( + ffi.Pointer env, ffi.Pointer name)>> + FindClass; -enum JObjectRefType { - JNIInvalidRefType(0), - JNILocalRefType(1), - JNIGlobalRefType(2), - JNIWeakGlobalRefType(3); + external ffi.Pointer< + ffi.NativeFunction< + JMethodIDPtr Function( + ffi.Pointer env, JObjectPtr method)>> + FromReflectedMethod; - final int value; - const JObjectRefType(this.value); + external ffi.Pointer< + ffi.NativeFunction< + JFieldIDPtr Function( + ffi.Pointer env, JObjectPtr field)>> FromReflectedField; - static JObjectRefType fromValue(int value) => switch (value) { - 0 => JNIInvalidRefType, - 1 => JNILocalRefType, - 2 => JNIGlobalRefType, - 3 => JNIWeakGlobalRefType, - _ => throw ArgumentError('Unknown value for JObjectRefType: $value'), - }; -} + external ffi.Pointer< + ffi.NativeFunction< + JObjectPtr Function( + ffi.Pointer env, + JClassPtr cls, + JMethodIDPtr methodId, + JBooleanMarker isStatic)>> ToReflectedMethod; -typedef JShortArrayPtr = JArrayPtr; -typedef JShortMarker = ffi.Int16; -typedef DartJShortMarker = int; + external ffi.Pointer< + ffi.NativeFunction< + JClassPtr Function(ffi.Pointer env, JClassPtr clazz)>> + GetSuperclass; -/// "cardinal indices and sizes" -typedef JSizeMarker = JIntMarker; -typedef JStringPtr = JObjectPtr; -typedef JThrowablePtr = JObjectPtr; + external ffi.Pointer< + ffi.NativeFunction< + JBooleanMarker Function(ffi.Pointer env, JClassPtr clazz1, + JClassPtr clazz2)>> IsAssignableFrom; -final class JValue extends ffi.Union { - @JBooleanMarker() - external int z; + external ffi.Pointer< + ffi.NativeFunction< + JObjectPtr Function(ffi.Pointer env, JClassPtr cls, + JFieldIDPtr fieldID, JBooleanMarker isStatic)>> ToReflectedField; - @JByteMarker() - external int b; + external ffi.Pointer< + ffi.NativeFunction< + JIntMarker Function( + ffi.Pointer env, JThrowablePtr obj)>> Throw; - @JCharMarker() - external int c; + external ffi.Pointer< + ffi.NativeFunction< + JIntMarker Function(ffi.Pointer env, JClassPtr clazz, + ffi.Pointer message)>> ThrowNew; - @JShortMarker() - external int s; + external ffi.Pointer< + ffi.NativeFunction env)>> + ExceptionOccurred; - @JIntMarker() - external int i; + external ffi + .Pointer env)>> + ExceptionDescribe; - @JLongMarker() - external int j; + external ffi + .Pointer env)>> + ExceptionClear; - @JFloatMarker() - external double f; + external ffi.Pointer< + ffi.NativeFunction< + ffi.Void Function( + ffi.Pointer env, ffi.Pointer msg)>> + FatalError; - @JDoubleMarker() - external double d; + external ffi.Pointer< + ffi.NativeFunction< + JIntMarker Function( + ffi.Pointer env, JIntMarker capacity)>> PushLocalFrame; - external JObjectPtr l; -} + external ffi.Pointer< + ffi.NativeFunction< + JObjectPtr Function( + ffi.Pointer env, JObjectPtr result)>> PopLocalFrame; -typedef JWeakPtr = JObjectPtr; -typedef JavaVM = ffi.Pointer; -typedef JavaVM$1 = ffi.Pointer; + external ffi.Pointer< + ffi.NativeFunction< + JObjectPtr Function(ffi.Pointer env, JObjectPtr obj)>> + NewGlobalRef; -final class JavaVMInitArgs extends ffi.Struct { - /// use JNI_VERSION_1_2 or later - @JIntMarker() - external int version; + external ffi.Pointer< + ffi.NativeFunction< + ffi.Void Function( + ffi.Pointer env, JObjectPtr globalRef)>> + DeleteGlobalRef; - @JIntMarker() - external int nOptions; + external ffi.Pointer< + ffi.NativeFunction< + ffi.Void Function( + ffi.Pointer env, JObjectPtr localRef)>> DeleteLocalRef; - external ffi.Pointer options; + external ffi.Pointer< + ffi.NativeFunction< + JBooleanMarker Function( + ffi.Pointer env, JObjectPtr ref1, JObjectPtr ref2)>> + IsSameObject; - @JBooleanMarker() - external int ignoreUnrecognized; + external ffi.Pointer< + ffi.NativeFunction< + JObjectPtr Function(ffi.Pointer env, JObjectPtr obj)>> + NewLocalRef; - static ffi.Pointer $allocate( - ffi.Allocator $allocator, { - required int version, - required int nOptions, - required ffi.Pointer options, - required int ignoreUnrecognized, - }) => - $allocator() - ..ref.version = version - ..ref.nOptions = nOptions - ..ref.options = options - ..ref.ignoreUnrecognized = ignoreUnrecognized; -} + external ffi.Pointer< + ffi.NativeFunction< + JIntMarker Function( + ffi.Pointer env, JIntMarker capacity)>> + EnsureLocalCapacity; -/// JNI 1.2+ initialization. (As of 1.6, the pre-1.2 structures are no -/// longer supported.) -final class JavaVMOption extends ffi.Struct { - external ffi.Pointer optionString; + external ffi.Pointer< + ffi.NativeFunction< + JObjectPtr Function(ffi.Pointer env, JClassPtr clazz)>> + AllocObject; - external ffi.Pointer extraInfo; + external ffi.Pointer< + ffi.NativeFunction< + JObjectPtr Function(ffi.Pointer env, JClassPtr clazz, + JMethodIDPtr methodID)>> NewObject; - static ffi.Pointer $allocate( - ffi.Allocator $allocator, { - required ffi.Pointer optionString, - required ffi.Pointer extraInfo, - }) => - $allocator() - ..ref.optionString = optionString - ..ref.extraInfo = extraInfo; -} + external ffi.Pointer< + ffi.NativeFunction< + JObjectPtr Function(ffi.Pointer, JClassPtr, JMethodIDPtr, + ffi.Pointer)>> NewObjectV; -enum JniBooleanValues { - FALSE(0), - TRUE(1); + external ffi.Pointer< + ffi.NativeFunction< + JObjectPtr Function(ffi.Pointer env, JClassPtr clazz, + JMethodIDPtr methodID, ffi.Pointer args)>> NewObjectA; - final int value; - const JniBooleanValues(this.value); + external ffi.Pointer< + ffi.NativeFunction< + JClassPtr Function(ffi.Pointer env, JObjectPtr obj)>> + GetObjectClass; - static JniBooleanValues fromValue(int value) => switch (value) { - 0 => FALSE, - 1 => TRUE, - _ => throw ArgumentError('Unknown value for JniBooleanValues: $value'), - }; -} + external ffi.Pointer< + ffi.NativeFunction< + JBooleanMarker Function( + ffi.Pointer env, JObjectPtr obj, JClassPtr clazz)>> + IsInstanceOf; -enum JniBufferWriteBack { - /// copy content, do not free buffer - COMMIT(1), + external ffi.Pointer< + ffi.NativeFunction< + JMethodIDPtr Function( + ffi.Pointer env, + JClassPtr clazz, + ffi.Pointer name, + ffi.Pointer sig)>> GetMethodID; - /// free buffer w/o copying back - ABORT(2); + external ffi.Pointer< + ffi.NativeFunction< + JObjectPtr Function(ffi.Pointer env, JObjectPtr obj, + JMethodIDPtr methodID)>> CallObjectMethod; - final int value; - const JniBufferWriteBack(this.value); + external ffi.Pointer< + ffi.NativeFunction< + JObjectPtr Function(ffi.Pointer, JObjectPtr, JMethodIDPtr, + ffi.Pointer)>> CallObjectMethodV; - static JniBufferWriteBack fromValue(int value) => switch (value) { - 1 => COMMIT, - 2 => ABORT, - _ => - throw ArgumentError('Unknown value for JniBufferWriteBack: $value'), - }; -} + external ffi.Pointer< + ffi.NativeFunction< + JObjectPtr Function( + ffi.Pointer env, + JObjectPtr obj, + JMethodIDPtr methodID, + ffi.Pointer args)>> CallObjectMethodA; -/// Types used by JNI API to distinguish between primitive types. -enum JniCallType { - booleanType(0), - byteType(1), - shortType(2), - charType(3), - intType(4), - longType(5), - floatType(6), - doubleType(7), - objectType(8), - voidType(9); + external ffi.Pointer< + ffi.NativeFunction< + JBooleanMarker Function(ffi.Pointer env, JObjectPtr obj, + JMethodIDPtr methodID)>> CallBooleanMethod; - final int value; - const JniCallType(this.value); + external ffi.Pointer< + ffi.NativeFunction< + JBooleanMarker Function(ffi.Pointer, JObjectPtr, + JMethodIDPtr, ffi.Pointer)>> CallBooleanMethodV; - static JniCallType fromValue(int value) => switch (value) { - 0 => booleanType, - 1 => byteType, - 2 => shortType, - 3 => charType, - 4 => intType, - 5 => longType, - 6 => floatType, - 7 => doubleType, - 8 => objectType, - 9 => voidType, - _ => throw ArgumentError('Unknown value for JniCallType: $value'), - }; -} + external ffi.Pointer< + ffi.NativeFunction< + JBooleanMarker Function( + ffi.Pointer env, + JObjectPtr obj, + JMethodIDPtr methodId, + ffi.Pointer args)>> CallBooleanMethodA; -/// Similar to [JniResult] but for class lookups. -final class JniClassLookupResult extends ffi.Struct { - external JClassPtr value; + external ffi.Pointer< + ffi.NativeFunction< + JByteMarker Function(ffi.Pointer env, JObjectPtr obj, + JMethodIDPtr methodID)>> CallByteMethod; - external JThrowablePtr exception; + external ffi.Pointer< + ffi.NativeFunction< + JByteMarker Function(ffi.Pointer, JObjectPtr, JMethodIDPtr, + ffi.Pointer)>> CallByteMethodV; + + external ffi.Pointer< + ffi.NativeFunction< + JByteMarker Function( + ffi.Pointer env, + JObjectPtr obj, + JMethodIDPtr methodID, + ffi.Pointer args)>> CallByteMethodA; + + external ffi.Pointer< + ffi.NativeFunction< + JCharMarker Function(ffi.Pointer env, JObjectPtr obj, + JMethodIDPtr methodID)>> CallCharMethod; + + external ffi.Pointer< + ffi.NativeFunction< + JCharMarker Function(ffi.Pointer, JObjectPtr, JMethodIDPtr, + ffi.Pointer)>> CallCharMethodV; + + external ffi.Pointer< + ffi.NativeFunction< + JCharMarker Function( + ffi.Pointer env, + JObjectPtr obj, + JMethodIDPtr methodID, + ffi.Pointer args)>> CallCharMethodA; + + external ffi.Pointer< + ffi.NativeFunction< + JShortMarker Function(ffi.Pointer env, JObjectPtr obj, + JMethodIDPtr methodID)>> CallShortMethod; + + external ffi.Pointer< + ffi.NativeFunction< + JShortMarker Function(ffi.Pointer, JObjectPtr, JMethodIDPtr, + ffi.Pointer)>> CallShortMethodV; + + external ffi.Pointer< + ffi.NativeFunction< + JShortMarker Function( + ffi.Pointer env, + JObjectPtr obj, + JMethodIDPtr methodID, + ffi.Pointer args)>> CallShortMethodA; + + external ffi.Pointer< + ffi.NativeFunction< + JIntMarker Function(ffi.Pointer env, JObjectPtr obj, + JMethodIDPtr methodID)>> CallIntMethod; + + external ffi.Pointer< + ffi.NativeFunction< + JIntMarker Function(ffi.Pointer, JObjectPtr, JMethodIDPtr, + ffi.Pointer)>> CallIntMethodV; + + external ffi.Pointer< + ffi.NativeFunction< + JIntMarker Function(ffi.Pointer env, JObjectPtr obj, + JMethodIDPtr methodID, ffi.Pointer args)>> CallIntMethodA; + + external ffi.Pointer< + ffi.NativeFunction< + JLongMarker Function(ffi.Pointer env, JObjectPtr obj, + JMethodIDPtr methodID)>> CallLongMethod; + + external ffi.Pointer< + ffi.NativeFunction< + JLongMarker Function(ffi.Pointer, JObjectPtr, JMethodIDPtr, + ffi.Pointer)>> CallLongMethodV; + + external ffi.Pointer< + ffi.NativeFunction< + JLongMarker Function( + ffi.Pointer env, + JObjectPtr obj, + JMethodIDPtr methodID, + ffi.Pointer args)>> CallLongMethodA; + + external ffi.Pointer< + ffi.NativeFunction< + JFloatMarker Function(ffi.Pointer env, JObjectPtr obj, + JMethodIDPtr methodID)>> CallFloatMethod; + + external ffi.Pointer< + ffi.NativeFunction< + JFloatMarker Function(ffi.Pointer, JObjectPtr, JMethodIDPtr, + ffi.Pointer)>> CallFloatMethodV; + + external ffi.Pointer< + ffi.NativeFunction< + JFloatMarker Function( + ffi.Pointer env, + JObjectPtr obj, + JMethodIDPtr methodID, + ffi.Pointer args)>> CallFloatMethodA; + + external ffi.Pointer< + ffi.NativeFunction< + JDoubleMarker Function(ffi.Pointer env, JObjectPtr obj, + JMethodIDPtr methodID)>> CallDoubleMethod; + + external ffi.Pointer< + ffi.NativeFunction< + JDoubleMarker Function(ffi.Pointer, JObjectPtr, + JMethodIDPtr, ffi.Pointer)>> CallDoubleMethodV; + + external ffi.Pointer< + ffi.NativeFunction< + JDoubleMarker Function( + ffi.Pointer env, + JObjectPtr obj, + JMethodIDPtr methodID, + ffi.Pointer args)>> CallDoubleMethodA; + + external ffi.Pointer< + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer env, JObjectPtr obj, + JMethodIDPtr methodID)>> CallVoidMethod; + + external ffi.Pointer< + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer, JObjectPtr, JMethodIDPtr, + ffi.Pointer)>> CallVoidMethodV; + + external ffi.Pointer< + ffi.NativeFunction< + ffi.Void Function( + ffi.Pointer env, + JObjectPtr obj, + JMethodIDPtr methodID, + ffi.Pointer args)>> CallVoidMethodA; + + external ffi.Pointer< + ffi.NativeFunction< + JObjectPtr Function( + ffi.Pointer env, + JObjectPtr obj, + JClassPtr clazz, + JMethodIDPtr methodID)>> CallNonvirtualObjectMethod; + + external ffi.Pointer< + ffi.NativeFunction< + JObjectPtr Function( + ffi.Pointer, + JObjectPtr, + JClassPtr, + JMethodIDPtr, + ffi.Pointer)>> CallNonvirtualObjectMethodV; + + external ffi.Pointer< + ffi.NativeFunction< + JObjectPtr Function( + ffi.Pointer env, + JObjectPtr obj, + JClassPtr clazz, + JMethodIDPtr methodID, + ffi.Pointer args)>> CallNonvirtualObjectMethodA; + + external ffi.Pointer< + ffi.NativeFunction< + JBooleanMarker Function( + ffi.Pointer env, + JObjectPtr obj, + JClassPtr clazz, + JMethodIDPtr methodID)>> CallNonvirtualBooleanMethod; + + external ffi.Pointer< + ffi.NativeFunction< + JBooleanMarker Function( + ffi.Pointer, + JObjectPtr, + JClassPtr, + JMethodIDPtr, + ffi.Pointer)>> CallNonvirtualBooleanMethodV; + + external ffi.Pointer< + ffi.NativeFunction< + JBooleanMarker Function( + ffi.Pointer env, + JObjectPtr obj, + JClassPtr clazz, + JMethodIDPtr methodID, + ffi.Pointer args)>> CallNonvirtualBooleanMethodA; + + external ffi.Pointer< + ffi.NativeFunction< + JByteMarker Function( + ffi.Pointer env, + JObjectPtr obj, + JClassPtr clazz, + JMethodIDPtr methodID)>> CallNonvirtualByteMethod; + + external ffi.Pointer< + ffi.NativeFunction< + JByteMarker Function(ffi.Pointer, JObjectPtr, JClassPtr, + JMethodIDPtr, ffi.Pointer)>> CallNonvirtualByteMethodV; + + external ffi.Pointer< + ffi.NativeFunction< + JByteMarker Function( + ffi.Pointer env, + JObjectPtr obj, + JClassPtr clazz, + JMethodIDPtr methodID, + ffi.Pointer args)>> CallNonvirtualByteMethodA; + + external ffi.Pointer< + ffi.NativeFunction< + JCharMarker Function( + ffi.Pointer env, + JObjectPtr obj, + JClassPtr clazz, + JMethodIDPtr methodID)>> CallNonvirtualCharMethod; + + external ffi.Pointer< + ffi.NativeFunction< + JCharMarker Function(ffi.Pointer, JObjectPtr, JClassPtr, + JMethodIDPtr, ffi.Pointer)>> CallNonvirtualCharMethodV; + + external ffi.Pointer< + ffi.NativeFunction< + JCharMarker Function( + ffi.Pointer env, + JObjectPtr obj, + JClassPtr clazz, + JMethodIDPtr methodID, + ffi.Pointer args)>> CallNonvirtualCharMethodA; + + external ffi.Pointer< + ffi.NativeFunction< + JShortMarker Function( + ffi.Pointer env, + JObjectPtr obj, + JClassPtr clazz, + JMethodIDPtr methodID)>> CallNonvirtualShortMethod; + + external ffi.Pointer< + ffi.NativeFunction< + JShortMarker Function(ffi.Pointer, JObjectPtr, JClassPtr, + JMethodIDPtr, ffi.Pointer)>> CallNonvirtualShortMethodV; + + external ffi.Pointer< + ffi.NativeFunction< + JShortMarker Function( + ffi.Pointer env, + JObjectPtr obj, + JClassPtr clazz, + JMethodIDPtr methodID, + ffi.Pointer args)>> CallNonvirtualShortMethodA; + + external ffi.Pointer< + ffi.NativeFunction< + JIntMarker Function(ffi.Pointer env, JObjectPtr obj, + JClassPtr clazz, JMethodIDPtr methodID)>> CallNonvirtualIntMethod; + + external ffi.Pointer< + ffi.NativeFunction< + JIntMarker Function(ffi.Pointer, JObjectPtr, JClassPtr, + JMethodIDPtr, ffi.Pointer)>> CallNonvirtualIntMethodV; + + external ffi.Pointer< + ffi.NativeFunction< + JIntMarker Function( + ffi.Pointer env, + JObjectPtr obj, + JClassPtr clazz, + JMethodIDPtr methodID, + ffi.Pointer args)>> CallNonvirtualIntMethodA; + + external ffi.Pointer< + ffi.NativeFunction< + JLongMarker Function( + ffi.Pointer env, + JObjectPtr obj, + JClassPtr clazz, + JMethodIDPtr methodID)>> CallNonvirtualLongMethod; + + external ffi.Pointer< + ffi.NativeFunction< + JLongMarker Function(ffi.Pointer, JObjectPtr, JClassPtr, + JMethodIDPtr, ffi.Pointer)>> CallNonvirtualLongMethodV; + + external ffi.Pointer< + ffi.NativeFunction< + JLongMarker Function( + ffi.Pointer env, + JObjectPtr obj, + JClassPtr clazz, + JMethodIDPtr methodID, + ffi.Pointer args)>> CallNonvirtualLongMethodA; + + external ffi.Pointer< + ffi.NativeFunction< + JFloatMarker Function( + ffi.Pointer env, + JObjectPtr obj, + JClassPtr clazz, + JMethodIDPtr methodID)>> CallNonvirtualFloatMethod; + + external ffi.Pointer< + ffi.NativeFunction< + JFloatMarker Function(ffi.Pointer, JObjectPtr, JClassPtr, + JMethodIDPtr, ffi.Pointer)>> CallNonvirtualFloatMethodV; + + external ffi.Pointer< + ffi.NativeFunction< + JFloatMarker Function( + ffi.Pointer env, + JObjectPtr obj, + JClassPtr clazz, + JMethodIDPtr methodID, + ffi.Pointer args)>> CallNonvirtualFloatMethodA; + + external ffi.Pointer< + ffi.NativeFunction< + JDoubleMarker Function( + ffi.Pointer env, + JObjectPtr obj, + JClassPtr clazz, + JMethodIDPtr methodID)>> CallNonvirtualDoubleMethod; + + external ffi.Pointer< + ffi.NativeFunction< + JDoubleMarker Function( + ffi.Pointer, + JObjectPtr, + JClassPtr, + JMethodIDPtr, + ffi.Pointer)>> CallNonvirtualDoubleMethodV; + + external ffi.Pointer< + ffi.NativeFunction< + JDoubleMarker Function( + ffi.Pointer env, + JObjectPtr obj, + JClassPtr clazz, + JMethodIDPtr methodID, + ffi.Pointer args)>> CallNonvirtualDoubleMethodA; + + external ffi.Pointer< + ffi.NativeFunction< + ffi.Void Function( + ffi.Pointer env, + JObjectPtr obj, + JClassPtr clazz, + JMethodIDPtr methodID)>> CallNonvirtualVoidMethod; + + external ffi.Pointer< + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer, JObjectPtr, JClassPtr, + JMethodIDPtr, ffi.Pointer)>> CallNonvirtualVoidMethodV; + + external ffi.Pointer< + ffi.NativeFunction< + ffi.Void Function( + ffi.Pointer env, + JObjectPtr obj, + JClassPtr clazz, + JMethodIDPtr methodID, + ffi.Pointer args)>> CallNonvirtualVoidMethodA; + + external ffi.Pointer< + ffi.NativeFunction< + JFieldIDPtr Function( + ffi.Pointer env, + JClassPtr clazz, + ffi.Pointer name, + ffi.Pointer sig)>> GetFieldID; + + external ffi.Pointer< + ffi.NativeFunction< + JObjectPtr Function(ffi.Pointer env, JObjectPtr obj, + JFieldIDPtr fieldID)>> GetObjectField; + + external ffi.Pointer< + ffi.NativeFunction< + JBooleanMarker Function(ffi.Pointer env, JObjectPtr obj, + JFieldIDPtr fieldID)>> GetBooleanField; + + external ffi.Pointer< + ffi.NativeFunction< + JByteMarker Function(ffi.Pointer env, JObjectPtr obj, + JFieldIDPtr fieldID)>> GetByteField; + + external ffi.Pointer< + ffi.NativeFunction< + JCharMarker Function(ffi.Pointer env, JObjectPtr obj, + JFieldIDPtr fieldID)>> GetCharField; + + external ffi.Pointer< + ffi.NativeFunction< + JShortMarker Function(ffi.Pointer env, JObjectPtr obj, + JFieldIDPtr fieldID)>> GetShortField; + + external ffi.Pointer< + ffi.NativeFunction< + JIntMarker Function(ffi.Pointer env, JObjectPtr obj, + JFieldIDPtr fieldID)>> GetIntField; + + external ffi.Pointer< + ffi.NativeFunction< + JLongMarker Function(ffi.Pointer env, JObjectPtr obj, + JFieldIDPtr fieldID)>> GetLongField; + + external ffi.Pointer< + ffi.NativeFunction< + JFloatMarker Function(ffi.Pointer env, JObjectPtr obj, + JFieldIDPtr fieldID)>> GetFloatField; + + external ffi.Pointer< + ffi.NativeFunction< + JDoubleMarker Function(ffi.Pointer env, JObjectPtr obj, + JFieldIDPtr fieldID)>> GetDoubleField; + + external ffi.Pointer< + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer env, JObjectPtr obj, + JFieldIDPtr fieldID, JObjectPtr val)>> SetObjectField; + + external ffi.Pointer< + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer env, JObjectPtr obj, + JFieldIDPtr fieldID, JBooleanMarker val)>> SetBooleanField; + + external ffi.Pointer< + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer env, JObjectPtr obj, + JFieldIDPtr fieldID, JByteMarker val)>> SetByteField; + + external ffi.Pointer< + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer env, JObjectPtr obj, + JFieldIDPtr fieldID, JCharMarker val)>> SetCharField; + + external ffi.Pointer< + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer env, JObjectPtr obj, + JFieldIDPtr fieldID, JShortMarker val)>> SetShortField; + + external ffi.Pointer< + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer env, JObjectPtr obj, + JFieldIDPtr fieldID, JIntMarker val)>> SetIntField; + + external ffi.Pointer< + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer env, JObjectPtr obj, + JFieldIDPtr fieldID, JLongMarker val)>> SetLongField; + + external ffi.Pointer< + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer env, JObjectPtr obj, + JFieldIDPtr fieldID, JFloatMarker val)>> SetFloatField; + + external ffi.Pointer< + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer env, JObjectPtr obj, + JFieldIDPtr fieldID, JDoubleMarker val)>> SetDoubleField; + + external ffi.Pointer< + ffi.NativeFunction< + JMethodIDPtr Function( + ffi.Pointer env, + JClassPtr clazz, + ffi.Pointer name, + ffi.Pointer sig)>> GetStaticMethodID; + + external ffi.Pointer< + ffi.NativeFunction< + JObjectPtr Function(ffi.Pointer env, JClassPtr clazz, + JMethodIDPtr methodID)>> CallStaticObjectMethod; + + external ffi.Pointer< + ffi.NativeFunction< + JObjectPtr Function(ffi.Pointer, JClassPtr, JMethodIDPtr, + ffi.Pointer)>> CallStaticObjectMethodV; + + external ffi.Pointer< + ffi.NativeFunction< + JObjectPtr Function( + ffi.Pointer env, + JClassPtr clazz, + JMethodIDPtr methodID, + ffi.Pointer args)>> CallStaticObjectMethodA; + + external ffi.Pointer< + ffi.NativeFunction< + JBooleanMarker Function(ffi.Pointer env, JClassPtr clazz, + JMethodIDPtr methodID)>> CallStaticBooleanMethod; + + external ffi.Pointer< + ffi.NativeFunction< + JBooleanMarker Function(ffi.Pointer, JClassPtr, + JMethodIDPtr, ffi.Pointer)>> CallStaticBooleanMethodV; + + external ffi.Pointer< + ffi.NativeFunction< + JBooleanMarker Function( + ffi.Pointer env, + JClassPtr clazz, + JMethodIDPtr methodID, + ffi.Pointer args)>> CallStaticBooleanMethodA; + + external ffi.Pointer< + ffi.NativeFunction< + JByteMarker Function(ffi.Pointer env, JClassPtr clazz, + JMethodIDPtr methodID)>> CallStaticByteMethod; + + external ffi.Pointer< + ffi.NativeFunction< + JByteMarker Function(ffi.Pointer, JClassPtr, JMethodIDPtr, + ffi.Pointer)>> CallStaticByteMethodV; + + external ffi.Pointer< + ffi.NativeFunction< + JByteMarker Function( + ffi.Pointer env, + JClassPtr clazz, + JMethodIDPtr methodID, + ffi.Pointer args)>> CallStaticByteMethodA; + + external ffi.Pointer< + ffi.NativeFunction< + JCharMarker Function(ffi.Pointer env, JClassPtr clazz, + JMethodIDPtr methodID)>> CallStaticCharMethod; + + external ffi.Pointer< + ffi.NativeFunction< + JCharMarker Function(ffi.Pointer, JClassPtr, JMethodIDPtr, + ffi.Pointer)>> CallStaticCharMethodV; + + external ffi.Pointer< + ffi.NativeFunction< + JCharMarker Function( + ffi.Pointer env, + JClassPtr clazz, + JMethodIDPtr methodID, + ffi.Pointer args)>> CallStaticCharMethodA; + + external ffi.Pointer< + ffi.NativeFunction< + JShortMarker Function(ffi.Pointer env, JClassPtr clazz, + JMethodIDPtr methodID)>> CallStaticShortMethod; + + external ffi.Pointer< + ffi.NativeFunction< + JShortMarker Function(ffi.Pointer, JClassPtr, JMethodIDPtr, + ffi.Pointer)>> CallStaticShortMethodV; + + external ffi.Pointer< + ffi.NativeFunction< + JShortMarker Function( + ffi.Pointer env, + JClassPtr clazz, + JMethodIDPtr methodID, + ffi.Pointer args)>> CallStaticShortMethodA; + + external ffi.Pointer< + ffi.NativeFunction< + JIntMarker Function(ffi.Pointer env, JClassPtr clazz, + JMethodIDPtr methodID)>> CallStaticIntMethod; + + external ffi.Pointer< + ffi.NativeFunction< + JIntMarker Function(ffi.Pointer, JClassPtr, JMethodIDPtr, + ffi.Pointer)>> CallStaticIntMethodV; + + external ffi.Pointer< + ffi.NativeFunction< + JIntMarker Function( + ffi.Pointer env, + JClassPtr clazz, + JMethodIDPtr methodID, + ffi.Pointer args)>> CallStaticIntMethodA; + + external ffi.Pointer< + ffi.NativeFunction< + JLongMarker Function(ffi.Pointer env, JClassPtr clazz, + JMethodIDPtr methodID)>> CallStaticLongMethod; + + external ffi.Pointer< + ffi.NativeFunction< + JLongMarker Function(ffi.Pointer, JClassPtr, JMethodIDPtr, + ffi.Pointer)>> CallStaticLongMethodV; + + external ffi.Pointer< + ffi.NativeFunction< + JLongMarker Function( + ffi.Pointer env, + JClassPtr clazz, + JMethodIDPtr methodID, + ffi.Pointer args)>> CallStaticLongMethodA; + + external ffi.Pointer< + ffi.NativeFunction< + JFloatMarker Function(ffi.Pointer env, JClassPtr clazz, + JMethodIDPtr methodID)>> CallStaticFloatMethod; + + external ffi.Pointer< + ffi.NativeFunction< + JFloatMarker Function(ffi.Pointer, JClassPtr, JMethodIDPtr, + ffi.Pointer)>> CallStaticFloatMethodV; + + external ffi.Pointer< + ffi.NativeFunction< + JFloatMarker Function( + ffi.Pointer env, + JClassPtr clazz, + JMethodIDPtr methodID, + ffi.Pointer args)>> CallStaticFloatMethodA; + + external ffi.Pointer< + ffi.NativeFunction< + JDoubleMarker Function(ffi.Pointer env, JClassPtr clazz, + JMethodIDPtr methodID)>> CallStaticDoubleMethod; + + external ffi.Pointer< + ffi.NativeFunction< + JDoubleMarker Function(ffi.Pointer, JClassPtr, JMethodIDPtr, + ffi.Pointer)>> CallStaticDoubleMethodV; + + external ffi.Pointer< + ffi.NativeFunction< + JDoubleMarker Function( + ffi.Pointer env, + JClassPtr clazz, + JMethodIDPtr methodID, + ffi.Pointer args)>> CallStaticDoubleMethodA; + + external ffi.Pointer< + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer env, JClassPtr clazz, + JMethodIDPtr methodID)>> CallStaticVoidMethod; + + external ffi.Pointer< + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer, JClassPtr, JMethodIDPtr, + ffi.Pointer)>> CallStaticVoidMethodV; + + external ffi.Pointer< + ffi.NativeFunction< + ffi.Void Function( + ffi.Pointer env, + JClassPtr clazz, + JMethodIDPtr methodID, + ffi.Pointer args)>> CallStaticVoidMethodA; + + external ffi.Pointer< + ffi.NativeFunction< + JFieldIDPtr Function( + ffi.Pointer env, + JClassPtr clazz, + ffi.Pointer name, + ffi.Pointer sig)>> GetStaticFieldID; + + external ffi.Pointer< + ffi.NativeFunction< + JObjectPtr Function(ffi.Pointer env, JClassPtr clazz, + JFieldIDPtr fieldID)>> GetStaticObjectField; + + external ffi.Pointer< + ffi.NativeFunction< + JBooleanMarker Function(ffi.Pointer env, JClassPtr clazz, + JFieldIDPtr fieldID)>> GetStaticBooleanField; + + external ffi.Pointer< + ffi.NativeFunction< + JByteMarker Function(ffi.Pointer env, JClassPtr clazz, + JFieldIDPtr fieldID)>> GetStaticByteField; + + external ffi.Pointer< + ffi.NativeFunction< + JCharMarker Function(ffi.Pointer env, JClassPtr clazz, + JFieldIDPtr fieldID)>> GetStaticCharField; + + external ffi.Pointer< + ffi.NativeFunction< + JShortMarker Function(ffi.Pointer env, JClassPtr clazz, + JFieldIDPtr fieldID)>> GetStaticShortField; + + external ffi.Pointer< + ffi.NativeFunction< + JIntMarker Function(ffi.Pointer env, JClassPtr clazz, + JFieldIDPtr fieldID)>> GetStaticIntField; + + external ffi.Pointer< + ffi.NativeFunction< + JLongMarker Function(ffi.Pointer env, JClassPtr clazz, + JFieldIDPtr fieldID)>> GetStaticLongField; + + external ffi.Pointer< + ffi.NativeFunction< + JFloatMarker Function(ffi.Pointer env, JClassPtr clazz, + JFieldIDPtr fieldID)>> GetStaticFloatField; + + external ffi.Pointer< + ffi.NativeFunction< + JDoubleMarker Function(ffi.Pointer env, JClassPtr clazz, + JFieldIDPtr fieldID)>> GetStaticDoubleField; + + external ffi.Pointer< + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer env, JClassPtr clazz, + JFieldIDPtr fieldID, JObjectPtr val)>> SetStaticObjectField; + + external ffi.Pointer< + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer env, JClassPtr clazz, + JFieldIDPtr fieldID, JBooleanMarker val)>> SetStaticBooleanField; + + external ffi.Pointer< + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer env, JClassPtr clazz, + JFieldIDPtr fieldID, JByteMarker val)>> SetStaticByteField; + + external ffi.Pointer< + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer env, JClassPtr clazz, + JFieldIDPtr fieldID, JCharMarker val)>> SetStaticCharField; + + external ffi.Pointer< + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer env, JClassPtr clazz, + JFieldIDPtr fieldID, JShortMarker val)>> SetStaticShortField; + + external ffi.Pointer< + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer env, JClassPtr clazz, + JFieldIDPtr fieldID, JIntMarker val)>> SetStaticIntField; + + external ffi.Pointer< + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer env, JClassPtr clazz, + JFieldIDPtr fieldID, JLongMarker val)>> SetStaticLongField; + + external ffi.Pointer< + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer env, JClassPtr clazz, + JFieldIDPtr fieldID, JFloatMarker val)>> SetStaticFloatField; + + external ffi.Pointer< + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer env, JClassPtr clazz, + JFieldIDPtr fieldID, JDoubleMarker val)>> SetStaticDoubleField; + + external ffi.Pointer< + ffi.NativeFunction< + JStringPtr Function( + ffi.Pointer env, + ffi.Pointer unicodeChars, + JSizeMarker len)>> NewString; + + external ffi.Pointer< + ffi.NativeFunction< + JSizeMarker Function( + ffi.Pointer env, JStringPtr string)>> GetStringLength; + + external ffi.Pointer< + ffi.NativeFunction< + ffi.Pointer Function( + ffi.Pointer env, + JStringPtr string, + ffi.Pointer isCopy)>> GetStringChars; + + external ffi.Pointer< + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer env, JStringPtr string, + ffi.Pointer isCopy)>> ReleaseStringChars; + + external ffi.Pointer< + ffi.NativeFunction< + JStringPtr Function( + ffi.Pointer env, ffi.Pointer bytes)>> + NewStringUTF; + + external ffi.Pointer< + ffi.NativeFunction< + JSizeMarker Function( + ffi.Pointer env, JStringPtr string)>> + GetStringUTFLength; + + external ffi.Pointer< + ffi.NativeFunction< + ffi.Pointer Function( + ffi.Pointer env, + JStringPtr string, + ffi.Pointer isCopy)>> GetStringUTFChars; + + external ffi.Pointer< + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer env, JStringPtr string, + ffi.Pointer utf)>> ReleaseStringUTFChars; + + external ffi.Pointer< + ffi.NativeFunction< + JSizeMarker Function(ffi.Pointer env, JArrayPtr array)>> + GetArrayLength; + + external ffi.Pointer< + ffi.NativeFunction< + JObjectArrayPtr Function( + ffi.Pointer env, + JSizeMarker length, + JClassPtr elementClass, + JObjectPtr initialElement)>> NewObjectArray; + + external ffi.Pointer< + ffi.NativeFunction< + JObjectPtr Function(ffi.Pointer env, JObjectArrayPtr array, + JSizeMarker index)>> GetObjectArrayElement; + + external ffi.Pointer< + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer env, JObjectArrayPtr array, + JSizeMarker index, JObjectPtr val)>> SetObjectArrayElement; + + external ffi.Pointer< + ffi.NativeFunction< + JBooleanArrayPtr Function( + ffi.Pointer env, JSizeMarker length)>> NewBooleanArray; + + external ffi.Pointer< + ffi.NativeFunction< + JByteArrayPtr Function( + ffi.Pointer env, JSizeMarker length)>> NewByteArray; + + external ffi.Pointer< + ffi.NativeFunction< + JCharArrayPtr Function( + ffi.Pointer env, JSizeMarker length)>> NewCharArray; + + external ffi.Pointer< + ffi.NativeFunction< + JShortArrayPtr Function( + ffi.Pointer env, JSizeMarker length)>> NewShortArray; + + external ffi.Pointer< + ffi.NativeFunction< + JIntArrayPtr Function( + ffi.Pointer env, JSizeMarker length)>> NewIntArray; + + external ffi.Pointer< + ffi.NativeFunction< + JLongArrayPtr Function( + ffi.Pointer env, JSizeMarker length)>> NewLongArray; + + external ffi.Pointer< + ffi.NativeFunction< + JFloatArrayPtr Function( + ffi.Pointer env, JSizeMarker length)>> NewFloatArray; + + external ffi.Pointer< + ffi.NativeFunction< + JDoubleArrayPtr Function( + ffi.Pointer env, JSizeMarker length)>> NewDoubleArray; + + external ffi.Pointer< + ffi.NativeFunction< + ffi.Pointer Function( + ffi.Pointer env, + JBooleanArrayPtr array, + ffi.Pointer isCopy)>> GetBooleanArrayElements; + + external ffi.Pointer< + ffi.NativeFunction< + ffi.Pointer Function( + ffi.Pointer env, + JByteArrayPtr array, + ffi.Pointer isCopy)>> GetByteArrayElements; + + external ffi.Pointer< + ffi.NativeFunction< + ffi.Pointer Function( + ffi.Pointer env, + JCharArrayPtr array, + ffi.Pointer isCopy)>> GetCharArrayElements; + + external ffi.Pointer< + ffi.NativeFunction< + ffi.Pointer Function( + ffi.Pointer env, + JShortArrayPtr array, + ffi.Pointer isCopy)>> GetShortArrayElements; + + external ffi.Pointer< + ffi.NativeFunction< + ffi.Pointer Function( + ffi.Pointer env, + JIntArrayPtr array, + ffi.Pointer isCopy)>> GetIntArrayElements; + + external ffi.Pointer< + ffi.NativeFunction< + ffi.Pointer Function( + ffi.Pointer env, + JLongArrayPtr array, + ffi.Pointer isCopy)>> GetLongArrayElements; + + external ffi.Pointer< + ffi.NativeFunction< + ffi.Pointer Function( + ffi.Pointer env, + JFloatArrayPtr array, + ffi.Pointer isCopy)>> GetFloatArrayElements; + + external ffi.Pointer< + ffi.NativeFunction< + ffi.Pointer Function( + ffi.Pointer env, + JDoubleArrayPtr array, + ffi.Pointer isCopy)>> GetDoubleArrayElements; + + external ffi.Pointer< + ffi.NativeFunction< + ffi.Void Function( + ffi.Pointer env, + JBooleanArrayPtr array, + ffi.Pointer elems, + JIntMarker mode)>> ReleaseBooleanArrayElements; + + external ffi.Pointer< + ffi.NativeFunction< + ffi.Void Function( + ffi.Pointer env, + JByteArrayPtr array, + ffi.Pointer elems, + JIntMarker mode)>> ReleaseByteArrayElements; + + external ffi.Pointer< + ffi.NativeFunction< + ffi.Void Function( + ffi.Pointer env, + JCharArrayPtr array, + ffi.Pointer elems, + JIntMarker mode)>> ReleaseCharArrayElements; + + external ffi.Pointer< + ffi.NativeFunction< + ffi.Void Function( + ffi.Pointer env, + JShortArrayPtr array, + ffi.Pointer elems, + JIntMarker mode)>> ReleaseShortArrayElements; + + external ffi.Pointer< + ffi.NativeFunction< + ffi.Void Function( + ffi.Pointer env, + JIntArrayPtr array, + ffi.Pointer elems, + JIntMarker mode)>> ReleaseIntArrayElements; + + external ffi.Pointer< + ffi.NativeFunction< + ffi.Void Function( + ffi.Pointer env, + JLongArrayPtr array, + ffi.Pointer elems, + JIntMarker mode)>> ReleaseLongArrayElements; + + external ffi.Pointer< + ffi.NativeFunction< + ffi.Void Function( + ffi.Pointer env, + JFloatArrayPtr array, + ffi.Pointer elems, + JIntMarker mode)>> ReleaseFloatArrayElements; + + external ffi.Pointer< + ffi.NativeFunction< + ffi.Void Function( + ffi.Pointer env, + JDoubleArrayPtr array, + ffi.Pointer elems, + JIntMarker mode)>> ReleaseDoubleArrayElements; + + external ffi.Pointer< + ffi.NativeFunction< + ffi.Void Function( + ffi.Pointer env, + JBooleanArrayPtr array, + JSizeMarker start, + JSizeMarker len, + ffi.Pointer buf)>> GetBooleanArrayRegion; + + external ffi.Pointer< + ffi.NativeFunction< + ffi.Void Function( + ffi.Pointer env, + JByteArrayPtr array, + JSizeMarker start, + JSizeMarker len, + ffi.Pointer buf)>> GetByteArrayRegion; + + external ffi.Pointer< + ffi.NativeFunction< + ffi.Void Function( + ffi.Pointer env, + JCharArrayPtr array, + JSizeMarker start, + JSizeMarker len, + ffi.Pointer buf)>> GetCharArrayRegion; + + external ffi.Pointer< + ffi.NativeFunction< + ffi.Void Function( + ffi.Pointer env, + JShortArrayPtr array, + JSizeMarker start, + JSizeMarker len, + ffi.Pointer buf)>> GetShortArrayRegion; + + external ffi.Pointer< + ffi.NativeFunction< + ffi.Void Function( + ffi.Pointer env, + JIntArrayPtr array, + JSizeMarker start, + JSizeMarker len, + ffi.Pointer buf)>> GetIntArrayRegion; + + external ffi.Pointer< + ffi.NativeFunction< + ffi.Void Function( + ffi.Pointer env, + JLongArrayPtr array, + JSizeMarker start, + JSizeMarker len, + ffi.Pointer buf)>> GetLongArrayRegion; + + external ffi.Pointer< + ffi.NativeFunction< + ffi.Void Function( + ffi.Pointer env, + JFloatArrayPtr array, + JSizeMarker start, + JSizeMarker len, + ffi.Pointer buf)>> GetFloatArrayRegion; + + external ffi.Pointer< + ffi.NativeFunction< + ffi.Void Function( + ffi.Pointer env, + JDoubleArrayPtr array, + JSizeMarker start, + JSizeMarker len, + ffi.Pointer buf)>> GetDoubleArrayRegion; + + external ffi.Pointer< + ffi.NativeFunction< + ffi.Void Function( + ffi.Pointer env, + JBooleanArrayPtr array, + JSizeMarker start, + JSizeMarker len, + ffi.Pointer buf)>> SetBooleanArrayRegion; + + external ffi.Pointer< + ffi.NativeFunction< + ffi.Void Function( + ffi.Pointer env, + JByteArrayPtr array, + JSizeMarker start, + JSizeMarker len, + ffi.Pointer buf)>> SetByteArrayRegion; + + external ffi.Pointer< + ffi.NativeFunction< + ffi.Void Function( + ffi.Pointer env, + JCharArrayPtr array, + JSizeMarker start, + JSizeMarker len, + ffi.Pointer buf)>> SetCharArrayRegion; + + external ffi.Pointer< + ffi.NativeFunction< + ffi.Void Function( + ffi.Pointer env, + JShortArrayPtr array, + JSizeMarker start, + JSizeMarker len, + ffi.Pointer buf)>> SetShortArrayRegion; + + external ffi.Pointer< + ffi.NativeFunction< + ffi.Void Function( + ffi.Pointer env, + JIntArrayPtr array, + JSizeMarker start, + JSizeMarker len, + ffi.Pointer buf)>> SetIntArrayRegion; + + external ffi.Pointer< + ffi.NativeFunction< + ffi.Void Function( + ffi.Pointer env, + JLongArrayPtr array, + JSizeMarker start, + JSizeMarker len, + ffi.Pointer buf)>> SetLongArrayRegion; + + external ffi.Pointer< + ffi.NativeFunction< + ffi.Void Function( + ffi.Pointer env, + JFloatArrayPtr array, + JSizeMarker start, + JSizeMarker len, + ffi.Pointer buf)>> SetFloatArrayRegion; + + external ffi.Pointer< + ffi.NativeFunction< + ffi.Void Function( + ffi.Pointer env, + JDoubleArrayPtr array, + JSizeMarker start, + JSizeMarker len, + ffi.Pointer buf)>> SetDoubleArrayRegion; + + external ffi.Pointer< + ffi.NativeFunction< + JIntMarker Function( + ffi.Pointer env, + JClassPtr clazz, + ffi.Pointer methods, + JIntMarker nMethods)>> RegisterNatives; + + external ffi.Pointer< + ffi.NativeFunction< + JIntMarker Function(ffi.Pointer env, JClassPtr clazz)>> + UnregisterNatives; + + external ffi.Pointer< + ffi.NativeFunction< + JIntMarker Function(ffi.Pointer env, JObjectPtr obj)>> + MonitorEnter; + + external ffi.Pointer< + ffi.NativeFunction< + JIntMarker Function(ffi.Pointer env, JObjectPtr obj)>> + MonitorExit; + + external ffi.Pointer< + ffi.NativeFunction< + JIntMarker Function(ffi.Pointer env, + ffi.Pointer> vm)>> GetJavaVM; + + external ffi.Pointer< + ffi.NativeFunction< + ffi.Void Function( + ffi.Pointer env, + JStringPtr str, + JSizeMarker start, + JSizeMarker len, + ffi.Pointer buf)>> GetStringRegion; + + external ffi.Pointer< + ffi.NativeFunction< + ffi.Void Function( + ffi.Pointer env, + JStringPtr str, + JSizeMarker start, + JSizeMarker len, + ffi.Pointer buf)>> GetStringUTFRegion; + + external ffi.Pointer< + ffi.NativeFunction< + ffi.Pointer Function( + ffi.Pointer env, + JArrayPtr array, + ffi.Pointer isCopy)>> GetPrimitiveArrayCritical; + + external ffi.Pointer< + ffi.NativeFunction< + ffi.Void Function( + ffi.Pointer env, + JArrayPtr array, + ffi.Pointer carray, + JIntMarker mode)>> ReleasePrimitiveArrayCritical; + + external ffi.Pointer< + ffi.NativeFunction< + ffi.Pointer Function( + ffi.Pointer env, + JStringPtr str, + ffi.Pointer isCopy)>> GetStringCritical; + + external ffi.Pointer< + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer env, JStringPtr str, + ffi.Pointer carray)>> ReleaseStringCritical; + + external ffi.Pointer< + ffi.NativeFunction< + JWeakPtr Function(ffi.Pointer env, JObjectPtr obj)>> + NewWeakGlobalRef; + + external ffi.Pointer< + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer env, JWeakPtr obj)>> + DeleteWeakGlobalRef; + + external ffi.Pointer< + ffi + .NativeFunction env)>> + ExceptionCheck; + + external ffi.Pointer< + ffi.NativeFunction< + JObjectPtr Function( + ffi.Pointer env, + ffi.Pointer address, + JLongMarker capacity)>> NewDirectByteBuffer; + + external ffi.Pointer< + ffi.NativeFunction< + ffi.Pointer Function( + ffi.Pointer env, JObjectPtr buf)>> + GetDirectBufferAddress; + + external ffi.Pointer< + ffi.NativeFunction< + JLongMarker Function(ffi.Pointer env, JObjectPtr buf)>> + GetDirectBufferCapacity; + + external ffi.Pointer< + ffi.NativeFunction< + ffi.UnsignedInt Function( + ffi.Pointer env, JObjectPtr obj)>> GetObjectRefType; + + static ffi.Pointer $allocate( + ffi.Allocator $allocator, { + required ffi.Pointer reserved0, + required ffi.Pointer reserved1, + required ffi.Pointer reserved2, + required ffi.Pointer reserved3, + required ffi.Pointer< + ffi.NativeFunction env)>> + GetVersion, + required ffi.Pointer< + ffi.NativeFunction< + JClassPtr Function( + ffi.Pointer env, + ffi.Pointer name, + JObjectPtr loader, + ffi.Pointer buf, + JSizeMarker bufLen)>> + DefineClass, + required ffi.Pointer< + ffi.NativeFunction< + JClassPtr Function( + ffi.Pointer env, ffi.Pointer name)>> + FindClass, + required ffi.Pointer< + ffi.NativeFunction< + JMethodIDPtr Function( + ffi.Pointer env, JObjectPtr method)>> + FromReflectedMethod, + required ffi.Pointer< + ffi.NativeFunction< + JFieldIDPtr Function( + ffi.Pointer env, JObjectPtr field)>> + FromReflectedField, + required ffi.Pointer< + ffi.NativeFunction< + JObjectPtr Function(ffi.Pointer env, JClassPtr cls, + JMethodIDPtr methodId, JBooleanMarker isStatic)>> + ToReflectedMethod, + required ffi.Pointer< + ffi.NativeFunction< + JClassPtr Function(ffi.Pointer env, JClassPtr clazz)>> + GetSuperclass, + required ffi.Pointer< + ffi.NativeFunction< + JBooleanMarker Function(ffi.Pointer env, + JClassPtr clazz1, JClassPtr clazz2)>> + IsAssignableFrom, + required ffi.Pointer< + ffi.NativeFunction< + JObjectPtr Function(ffi.Pointer env, JClassPtr cls, + JFieldIDPtr fieldID, JBooleanMarker isStatic)>> + ToReflectedField, + required ffi.Pointer< + ffi.NativeFunction< + JIntMarker Function( + ffi.Pointer env, JThrowablePtr obj)>> + Throw, + required ffi.Pointer< + ffi.NativeFunction< + JIntMarker Function(ffi.Pointer env, JClassPtr clazz, + ffi.Pointer message)>> + ThrowNew, + required ffi.Pointer< + ffi + .NativeFunction env)>> + ExceptionOccurred, + required ffi.Pointer< + ffi.NativeFunction env)>> + ExceptionDescribe, + required ffi.Pointer< + ffi.NativeFunction env)>> + ExceptionClear, + required ffi.Pointer< + ffi.NativeFunction< + ffi.Void Function( + ffi.Pointer env, ffi.Pointer msg)>> + FatalError, + required ffi.Pointer< + ffi.NativeFunction< + JIntMarker Function( + ffi.Pointer env, JIntMarker capacity)>> + PushLocalFrame, + required ffi.Pointer< + ffi.NativeFunction< + JObjectPtr Function( + ffi.Pointer env, JObjectPtr result)>> + PopLocalFrame, + required ffi.Pointer< + ffi.NativeFunction< + JObjectPtr Function(ffi.Pointer env, JObjectPtr obj)>> + NewGlobalRef, + required ffi.Pointer< + ffi.NativeFunction< + ffi.Void Function( + ffi.Pointer env, JObjectPtr globalRef)>> + DeleteGlobalRef, + required ffi.Pointer< + ffi.NativeFunction< + ffi.Void Function( + ffi.Pointer env, JObjectPtr localRef)>> + DeleteLocalRef, + required ffi.Pointer< + ffi.NativeFunction< + JBooleanMarker Function(ffi.Pointer env, + JObjectPtr ref1, JObjectPtr ref2)>> + IsSameObject, + required ffi.Pointer< + ffi.NativeFunction< + JObjectPtr Function(ffi.Pointer env, JObjectPtr obj)>> + NewLocalRef, + required ffi.Pointer< + ffi.NativeFunction< + JIntMarker Function( + ffi.Pointer env, JIntMarker capacity)>> + EnsureLocalCapacity, + required ffi.Pointer< + ffi.NativeFunction< + JObjectPtr Function( + ffi.Pointer env, JClassPtr clazz)>> + AllocObject, + required ffi.Pointer< + ffi.NativeFunction< + JObjectPtr Function(ffi.Pointer env, JClassPtr clazz, + JMethodIDPtr methodID)>> + NewObject, + required ffi.Pointer< + ffi.NativeFunction< + JObjectPtr Function(ffi.Pointer, JClassPtr, + JMethodIDPtr, ffi.Pointer)>> + NewObjectV, + required ffi.Pointer< + ffi.NativeFunction< + JObjectPtr Function(ffi.Pointer env, JClassPtr clazz, + JMethodIDPtr methodID, ffi.Pointer args)>> + NewObjectA, + required ffi.Pointer< + ffi.NativeFunction< + JClassPtr Function(ffi.Pointer env, JObjectPtr obj)>> + GetObjectClass, + required ffi.Pointer< + ffi.NativeFunction< + JBooleanMarker Function(ffi.Pointer env, + JObjectPtr obj, JClassPtr clazz)>> + IsInstanceOf, + required ffi.Pointer< + ffi.NativeFunction< + JMethodIDPtr Function( + ffi.Pointer env, + JClassPtr clazz, + ffi.Pointer name, + ffi.Pointer sig)>> + GetMethodID, + required ffi.Pointer< + ffi.NativeFunction< + JObjectPtr Function(ffi.Pointer env, JObjectPtr obj, + JMethodIDPtr methodID)>> + CallObjectMethod, + required ffi.Pointer< + ffi.NativeFunction< + JObjectPtr Function(ffi.Pointer, JObjectPtr, + JMethodIDPtr, ffi.Pointer)>> + CallObjectMethodV, + required ffi.Pointer< + ffi.NativeFunction< + JObjectPtr Function(ffi.Pointer env, JObjectPtr obj, + JMethodIDPtr methodID, ffi.Pointer args)>> + CallObjectMethodA, + required ffi.Pointer< + ffi.NativeFunction< + JBooleanMarker Function(ffi.Pointer env, + JObjectPtr obj, JMethodIDPtr methodID)>> + CallBooleanMethod, + required ffi.Pointer< + ffi.NativeFunction< + JBooleanMarker Function(ffi.Pointer, JObjectPtr, + JMethodIDPtr, ffi.Pointer)>> + CallBooleanMethodV, + required ffi.Pointer< + ffi.NativeFunction< + JBooleanMarker Function( + ffi.Pointer env, + JObjectPtr obj, + JMethodIDPtr methodId, + ffi.Pointer args)>> + CallBooleanMethodA, + required ffi.Pointer< + ffi.NativeFunction< + JByteMarker Function(ffi.Pointer env, JObjectPtr obj, + JMethodIDPtr methodID)>> + CallByteMethod, + required ffi.Pointer< + ffi.NativeFunction< + JByteMarker Function(ffi.Pointer, JObjectPtr, + JMethodIDPtr, ffi.Pointer)>> + CallByteMethodV, + required ffi.Pointer< + ffi.NativeFunction< + JByteMarker Function(ffi.Pointer env, JObjectPtr obj, + JMethodIDPtr methodID, ffi.Pointer args)>> + CallByteMethodA, + required ffi.Pointer< + ffi.NativeFunction< + JCharMarker Function(ffi.Pointer env, JObjectPtr obj, + JMethodIDPtr methodID)>> + CallCharMethod, + required ffi.Pointer< + ffi.NativeFunction< + JCharMarker Function(ffi.Pointer, JObjectPtr, + JMethodIDPtr, ffi.Pointer)>> + CallCharMethodV, + required ffi.Pointer< + ffi.NativeFunction< + JCharMarker Function(ffi.Pointer env, JObjectPtr obj, + JMethodIDPtr methodID, ffi.Pointer args)>> + CallCharMethodA, + required ffi.Pointer< + ffi.NativeFunction< + JShortMarker Function(ffi.Pointer env, JObjectPtr obj, + JMethodIDPtr methodID)>> + CallShortMethod, + required ffi.Pointer< + ffi.NativeFunction< + JShortMarker Function(ffi.Pointer, JObjectPtr, + JMethodIDPtr, ffi.Pointer)>> + CallShortMethodV, + required ffi.Pointer< + ffi.NativeFunction< + JShortMarker Function(ffi.Pointer env, JObjectPtr obj, + JMethodIDPtr methodID, ffi.Pointer args)>> + CallShortMethodA, + required ffi.Pointer< + ffi.NativeFunction< + JIntMarker Function(ffi.Pointer env, JObjectPtr obj, + JMethodIDPtr methodID)>> + CallIntMethod, + required ffi.Pointer< + ffi.NativeFunction< + JIntMarker Function(ffi.Pointer, JObjectPtr, + JMethodIDPtr, ffi.Pointer)>> + CallIntMethodV, + required ffi.Pointer< + ffi.NativeFunction< + JIntMarker Function(ffi.Pointer env, JObjectPtr obj, + JMethodIDPtr methodID, ffi.Pointer args)>> + CallIntMethodA, + required ffi.Pointer< + ffi.NativeFunction< + JLongMarker Function(ffi.Pointer env, JObjectPtr obj, + JMethodIDPtr methodID)>> + CallLongMethod, + required ffi.Pointer< + ffi.NativeFunction< + JLongMarker Function(ffi.Pointer, JObjectPtr, + JMethodIDPtr, ffi.Pointer)>> + CallLongMethodV, + required ffi.Pointer< + ffi.NativeFunction< + JLongMarker Function(ffi.Pointer env, JObjectPtr obj, + JMethodIDPtr methodID, ffi.Pointer args)>> + CallLongMethodA, + required ffi.Pointer< + ffi.NativeFunction< + JFloatMarker Function(ffi.Pointer env, JObjectPtr obj, + JMethodIDPtr methodID)>> + CallFloatMethod, + required ffi.Pointer< + ffi.NativeFunction< + JFloatMarker Function(ffi.Pointer, JObjectPtr, + JMethodIDPtr, ffi.Pointer)>> + CallFloatMethodV, + required ffi.Pointer< + ffi.NativeFunction< + JFloatMarker Function(ffi.Pointer env, JObjectPtr obj, + JMethodIDPtr methodID, ffi.Pointer args)>> + CallFloatMethodA, + required ffi.Pointer< + ffi.NativeFunction< + JDoubleMarker Function(ffi.Pointer env, + JObjectPtr obj, JMethodIDPtr methodID)>> + CallDoubleMethod, + required ffi.Pointer< + ffi.NativeFunction< + JDoubleMarker Function(ffi.Pointer, JObjectPtr, + JMethodIDPtr, ffi.Pointer)>> + CallDoubleMethodV, + required ffi.Pointer< + ffi.NativeFunction< + JDoubleMarker Function( + ffi.Pointer env, + JObjectPtr obj, + JMethodIDPtr methodID, + ffi.Pointer args)>> + CallDoubleMethodA, + required ffi.Pointer< + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer env, JObjectPtr obj, + JMethodIDPtr methodID)>> + CallVoidMethod, + required ffi.Pointer< + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer, JObjectPtr, + JMethodIDPtr, ffi.Pointer)>> + CallVoidMethodV, + required ffi.Pointer< + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer env, JObjectPtr obj, + JMethodIDPtr methodID, ffi.Pointer args)>> + CallVoidMethodA, + required ffi.Pointer< + ffi.NativeFunction< + JObjectPtr Function(ffi.Pointer env, JObjectPtr obj, + JClassPtr clazz, JMethodIDPtr methodID)>> + CallNonvirtualObjectMethod, + required ffi.Pointer< + ffi.NativeFunction< + JObjectPtr Function(ffi.Pointer, JObjectPtr, + JClassPtr, JMethodIDPtr, ffi.Pointer)>> + CallNonvirtualObjectMethodV, + required ffi.Pointer< + ffi.NativeFunction< + JObjectPtr Function( + ffi.Pointer env, + JObjectPtr obj, + JClassPtr clazz, + JMethodIDPtr methodID, + ffi.Pointer args)>> + CallNonvirtualObjectMethodA, + required ffi.Pointer< + ffi.NativeFunction< + JBooleanMarker Function(ffi.Pointer env, + JObjectPtr obj, JClassPtr clazz, JMethodIDPtr methodID)>> + CallNonvirtualBooleanMethod, + required ffi.Pointer< + ffi.NativeFunction< + JBooleanMarker Function(ffi.Pointer, JObjectPtr, + JClassPtr, JMethodIDPtr, ffi.Pointer)>> + CallNonvirtualBooleanMethodV, + required ffi.Pointer< + ffi.NativeFunction< + JBooleanMarker Function( + ffi.Pointer env, + JObjectPtr obj, + JClassPtr clazz, + JMethodIDPtr methodID, + ffi.Pointer args)>> + CallNonvirtualBooleanMethodA, + required ffi.Pointer< + ffi.NativeFunction< + JByteMarker Function(ffi.Pointer env, JObjectPtr obj, + JClassPtr clazz, JMethodIDPtr methodID)>> + CallNonvirtualByteMethod, + required ffi.Pointer< + ffi.NativeFunction< + JByteMarker Function(ffi.Pointer, JObjectPtr, + JClassPtr, JMethodIDPtr, ffi.Pointer)>> + CallNonvirtualByteMethodV, + required ffi.Pointer< + ffi.NativeFunction< + JByteMarker Function( + ffi.Pointer env, + JObjectPtr obj, + JClassPtr clazz, + JMethodIDPtr methodID, + ffi.Pointer args)>> + CallNonvirtualByteMethodA, + required ffi.Pointer< + ffi.NativeFunction< + JCharMarker Function(ffi.Pointer env, JObjectPtr obj, + JClassPtr clazz, JMethodIDPtr methodID)>> + CallNonvirtualCharMethod, + required ffi.Pointer< + ffi.NativeFunction< + JCharMarker Function(ffi.Pointer, JObjectPtr, + JClassPtr, JMethodIDPtr, ffi.Pointer)>> + CallNonvirtualCharMethodV, + required ffi.Pointer< + ffi.NativeFunction< + JCharMarker Function( + ffi.Pointer env, + JObjectPtr obj, + JClassPtr clazz, + JMethodIDPtr methodID, + ffi.Pointer args)>> + CallNonvirtualCharMethodA, + required ffi.Pointer< + ffi.NativeFunction< + JShortMarker Function(ffi.Pointer env, JObjectPtr obj, + JClassPtr clazz, JMethodIDPtr methodID)>> + CallNonvirtualShortMethod, + required ffi.Pointer< + ffi.NativeFunction< + JShortMarker Function(ffi.Pointer, JObjectPtr, + JClassPtr, JMethodIDPtr, ffi.Pointer)>> + CallNonvirtualShortMethodV, + required ffi.Pointer< + ffi.NativeFunction< + JShortMarker Function( + ffi.Pointer env, + JObjectPtr obj, + JClassPtr clazz, + JMethodIDPtr methodID, + ffi.Pointer args)>> + CallNonvirtualShortMethodA, + required ffi.Pointer< + ffi.NativeFunction< + JIntMarker Function(ffi.Pointer env, JObjectPtr obj, + JClassPtr clazz, JMethodIDPtr methodID)>> + CallNonvirtualIntMethod, + required ffi.Pointer< + ffi.NativeFunction< + JIntMarker Function(ffi.Pointer, JObjectPtr, + JClassPtr, JMethodIDPtr, ffi.Pointer)>> + CallNonvirtualIntMethodV, + required ffi.Pointer< + ffi.NativeFunction< + JIntMarker Function( + ffi.Pointer env, + JObjectPtr obj, + JClassPtr clazz, + JMethodIDPtr methodID, + ffi.Pointer args)>> + CallNonvirtualIntMethodA, + required ffi.Pointer< + ffi.NativeFunction< + JLongMarker Function(ffi.Pointer env, JObjectPtr obj, + JClassPtr clazz, JMethodIDPtr methodID)>> + CallNonvirtualLongMethod, + required ffi.Pointer< + ffi.NativeFunction< + JLongMarker Function(ffi.Pointer, JObjectPtr, + JClassPtr, JMethodIDPtr, ffi.Pointer)>> + CallNonvirtualLongMethodV, + required ffi.Pointer< + ffi.NativeFunction< + JLongMarker Function( + ffi.Pointer env, + JObjectPtr obj, + JClassPtr clazz, + JMethodIDPtr methodID, + ffi.Pointer args)>> + CallNonvirtualLongMethodA, + required ffi.Pointer< + ffi.NativeFunction< + JFloatMarker Function(ffi.Pointer env, JObjectPtr obj, + JClassPtr clazz, JMethodIDPtr methodID)>> + CallNonvirtualFloatMethod, + required ffi.Pointer< + ffi.NativeFunction< + JFloatMarker Function(ffi.Pointer, JObjectPtr, + JClassPtr, JMethodIDPtr, ffi.Pointer)>> + CallNonvirtualFloatMethodV, + required ffi.Pointer< + ffi.NativeFunction< + JFloatMarker Function( + ffi.Pointer env, + JObjectPtr obj, + JClassPtr clazz, + JMethodIDPtr methodID, + ffi.Pointer args)>> + CallNonvirtualFloatMethodA, + required ffi.Pointer< + ffi.NativeFunction< + JDoubleMarker Function(ffi.Pointer env, + JObjectPtr obj, JClassPtr clazz, JMethodIDPtr methodID)>> + CallNonvirtualDoubleMethod, + required ffi.Pointer< + ffi.NativeFunction< + JDoubleMarker Function(ffi.Pointer, JObjectPtr, + JClassPtr, JMethodIDPtr, ffi.Pointer)>> + CallNonvirtualDoubleMethodV, + required ffi.Pointer< + ffi.NativeFunction< + JDoubleMarker Function( + ffi.Pointer env, + JObjectPtr obj, + JClassPtr clazz, + JMethodIDPtr methodID, + ffi.Pointer args)>> + CallNonvirtualDoubleMethodA, + required ffi.Pointer< + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer env, JObjectPtr obj, + JClassPtr clazz, JMethodIDPtr methodID)>> + CallNonvirtualVoidMethod, + required ffi.Pointer< + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer, JObjectPtr, JClassPtr, + JMethodIDPtr, ffi.Pointer)>> + CallNonvirtualVoidMethodV, + required ffi.Pointer< + ffi.NativeFunction< + ffi.Void Function( + ffi.Pointer env, + JObjectPtr obj, + JClassPtr clazz, + JMethodIDPtr methodID, + ffi.Pointer args)>> + CallNonvirtualVoidMethodA, + required ffi.Pointer< + ffi.NativeFunction< + JFieldIDPtr Function(ffi.Pointer env, JClassPtr clazz, + ffi.Pointer name, ffi.Pointer sig)>> + GetFieldID, + required ffi.Pointer< + ffi.NativeFunction< + JObjectPtr Function(ffi.Pointer env, JObjectPtr obj, + JFieldIDPtr fieldID)>> + GetObjectField, + required ffi.Pointer< + ffi.NativeFunction< + JBooleanMarker Function(ffi.Pointer env, + JObjectPtr obj, JFieldIDPtr fieldID)>> + GetBooleanField, + required ffi.Pointer< + ffi.NativeFunction< + JByteMarker Function(ffi.Pointer env, JObjectPtr obj, + JFieldIDPtr fieldID)>> + GetByteField, + required ffi.Pointer< + ffi.NativeFunction< + JCharMarker Function(ffi.Pointer env, JObjectPtr obj, + JFieldIDPtr fieldID)>> + GetCharField, + required ffi.Pointer< + ffi.NativeFunction< + JShortMarker Function(ffi.Pointer env, JObjectPtr obj, + JFieldIDPtr fieldID)>> + GetShortField, + required ffi.Pointer< + ffi.NativeFunction< + JIntMarker Function(ffi.Pointer env, JObjectPtr obj, + JFieldIDPtr fieldID)>> + GetIntField, + required ffi.Pointer< + ffi.NativeFunction< + JLongMarker Function(ffi.Pointer env, JObjectPtr obj, + JFieldIDPtr fieldID)>> + GetLongField, + required ffi.Pointer< + ffi.NativeFunction< + JFloatMarker Function(ffi.Pointer env, JObjectPtr obj, + JFieldIDPtr fieldID)>> + GetFloatField, + required ffi.Pointer< + ffi.NativeFunction< + JDoubleMarker Function(ffi.Pointer env, + JObjectPtr obj, JFieldIDPtr fieldID)>> + GetDoubleField, + required ffi.Pointer< + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer env, JObjectPtr obj, + JFieldIDPtr fieldID, JObjectPtr val)>> + SetObjectField, + required ffi.Pointer< + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer env, JObjectPtr obj, + JFieldIDPtr fieldID, JBooleanMarker val)>> + SetBooleanField, + required ffi.Pointer< + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer env, JObjectPtr obj, + JFieldIDPtr fieldID, JByteMarker val)>> + SetByteField, + required ffi.Pointer< + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer env, JObjectPtr obj, + JFieldIDPtr fieldID, JCharMarker val)>> + SetCharField, + required ffi.Pointer< + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer env, JObjectPtr obj, + JFieldIDPtr fieldID, JShortMarker val)>> + SetShortField, + required ffi.Pointer< + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer env, JObjectPtr obj, + JFieldIDPtr fieldID, JIntMarker val)>> + SetIntField, + required ffi.Pointer< + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer env, JObjectPtr obj, + JFieldIDPtr fieldID, JLongMarker val)>> + SetLongField, + required ffi.Pointer< + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer env, JObjectPtr obj, + JFieldIDPtr fieldID, JFloatMarker val)>> + SetFloatField, + required ffi.Pointer< + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer env, JObjectPtr obj, + JFieldIDPtr fieldID, JDoubleMarker val)>> + SetDoubleField, + required ffi.Pointer< + ffi.NativeFunction< + JMethodIDPtr Function( + ffi.Pointer env, + JClassPtr clazz, + ffi.Pointer name, + ffi.Pointer sig)>> + GetStaticMethodID, + required ffi.Pointer< + ffi.NativeFunction< + JObjectPtr Function(ffi.Pointer env, JClassPtr clazz, + JMethodIDPtr methodID)>> + CallStaticObjectMethod, + required ffi.Pointer< + ffi.NativeFunction< + JObjectPtr Function(ffi.Pointer, JClassPtr, + JMethodIDPtr, ffi.Pointer)>> + CallStaticObjectMethodV, + required ffi.Pointer< + ffi.NativeFunction< + JObjectPtr Function(ffi.Pointer env, JClassPtr clazz, + JMethodIDPtr methodID, ffi.Pointer args)>> + CallStaticObjectMethodA, + required ffi.Pointer< + ffi.NativeFunction< + JBooleanMarker Function(ffi.Pointer env, + JClassPtr clazz, JMethodIDPtr methodID)>> + CallStaticBooleanMethod, + required ffi.Pointer< + ffi.NativeFunction< + JBooleanMarker Function(ffi.Pointer, JClassPtr, + JMethodIDPtr, ffi.Pointer)>> + CallStaticBooleanMethodV, + required ffi.Pointer< + ffi.NativeFunction< + JBooleanMarker Function( + ffi.Pointer env, + JClassPtr clazz, + JMethodIDPtr methodID, + ffi.Pointer args)>> + CallStaticBooleanMethodA, + required ffi.Pointer< + ffi.NativeFunction< + JByteMarker Function(ffi.Pointer env, JClassPtr clazz, + JMethodIDPtr methodID)>> + CallStaticByteMethod, + required ffi.Pointer< + ffi.NativeFunction< + JByteMarker Function(ffi.Pointer, JClassPtr, + JMethodIDPtr, ffi.Pointer)>> + CallStaticByteMethodV, + required ffi.Pointer< + ffi.NativeFunction< + JByteMarker Function(ffi.Pointer env, JClassPtr clazz, + JMethodIDPtr methodID, ffi.Pointer args)>> + CallStaticByteMethodA, + required ffi.Pointer< + ffi.NativeFunction< + JCharMarker Function(ffi.Pointer env, JClassPtr clazz, + JMethodIDPtr methodID)>> + CallStaticCharMethod, + required ffi.Pointer< + ffi.NativeFunction< + JCharMarker Function(ffi.Pointer, JClassPtr, + JMethodIDPtr, ffi.Pointer)>> + CallStaticCharMethodV, + required ffi.Pointer< + ffi.NativeFunction< + JCharMarker Function(ffi.Pointer env, JClassPtr clazz, + JMethodIDPtr methodID, ffi.Pointer args)>> + CallStaticCharMethodA, + required ffi.Pointer< + ffi.NativeFunction< + JShortMarker Function(ffi.Pointer env, + JClassPtr clazz, JMethodIDPtr methodID)>> + CallStaticShortMethod, + required ffi.Pointer< + ffi.NativeFunction< + JShortMarker Function(ffi.Pointer, JClassPtr, + JMethodIDPtr, ffi.Pointer)>> + CallStaticShortMethodV, + required ffi.Pointer< + ffi.NativeFunction< + JShortMarker Function( + ffi.Pointer env, + JClassPtr clazz, + JMethodIDPtr methodID, + ffi.Pointer args)>> + CallStaticShortMethodA, + required ffi.Pointer< + ffi.NativeFunction< + JIntMarker Function(ffi.Pointer env, JClassPtr clazz, + JMethodIDPtr methodID)>> + CallStaticIntMethod, + required ffi.Pointer< + ffi.NativeFunction< + JIntMarker Function(ffi.Pointer, JClassPtr, + JMethodIDPtr, ffi.Pointer)>> + CallStaticIntMethodV, + required ffi.Pointer< + ffi.NativeFunction< + JIntMarker Function(ffi.Pointer env, JClassPtr clazz, + JMethodIDPtr methodID, ffi.Pointer args)>> + CallStaticIntMethodA, + required ffi.Pointer< + ffi.NativeFunction< + JLongMarker Function(ffi.Pointer env, JClassPtr clazz, + JMethodIDPtr methodID)>> + CallStaticLongMethod, + required ffi.Pointer< + ffi.NativeFunction< + JLongMarker Function(ffi.Pointer, JClassPtr, + JMethodIDPtr, ffi.Pointer)>> + CallStaticLongMethodV, + required ffi.Pointer< + ffi.NativeFunction< + JLongMarker Function(ffi.Pointer env, JClassPtr clazz, + JMethodIDPtr methodID, ffi.Pointer args)>> + CallStaticLongMethodA, + required ffi.Pointer< + ffi.NativeFunction< + JFloatMarker Function(ffi.Pointer env, + JClassPtr clazz, JMethodIDPtr methodID)>> + CallStaticFloatMethod, + required ffi.Pointer< + ffi.NativeFunction< + JFloatMarker Function(ffi.Pointer, JClassPtr, + JMethodIDPtr, ffi.Pointer)>> + CallStaticFloatMethodV, + required ffi.Pointer< + ffi.NativeFunction< + JFloatMarker Function( + ffi.Pointer env, + JClassPtr clazz, + JMethodIDPtr methodID, + ffi.Pointer args)>> + CallStaticFloatMethodA, + required ffi.Pointer< + ffi.NativeFunction< + JDoubleMarker Function(ffi.Pointer env, + JClassPtr clazz, JMethodIDPtr methodID)>> + CallStaticDoubleMethod, + required ffi.Pointer< + ffi.NativeFunction< + JDoubleMarker Function(ffi.Pointer, JClassPtr, + JMethodIDPtr, ffi.Pointer)>> + CallStaticDoubleMethodV, + required ffi.Pointer< + ffi.NativeFunction< + JDoubleMarker Function( + ffi.Pointer env, + JClassPtr clazz, + JMethodIDPtr methodID, + ffi.Pointer args)>> + CallStaticDoubleMethodA, + required ffi.Pointer< + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer env, JClassPtr clazz, + JMethodIDPtr methodID)>> + CallStaticVoidMethod, + required ffi.Pointer< + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer, JClassPtr, + JMethodIDPtr, ffi.Pointer)>> + CallStaticVoidMethodV, + required ffi.Pointer< + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer env, JClassPtr clazz, + JMethodIDPtr methodID, ffi.Pointer args)>> + CallStaticVoidMethodA, + required ffi.Pointer< + ffi.NativeFunction< + JFieldIDPtr Function(ffi.Pointer env, JClassPtr clazz, + ffi.Pointer name, ffi.Pointer sig)>> + GetStaticFieldID, + required ffi.Pointer< + ffi.NativeFunction< + JObjectPtr Function(ffi.Pointer env, JClassPtr clazz, + JFieldIDPtr fieldID)>> + GetStaticObjectField, + required ffi.Pointer< + ffi.NativeFunction< + JBooleanMarker Function(ffi.Pointer env, + JClassPtr clazz, JFieldIDPtr fieldID)>> + GetStaticBooleanField, + required ffi.Pointer< + ffi.NativeFunction< + JByteMarker Function(ffi.Pointer env, JClassPtr clazz, + JFieldIDPtr fieldID)>> + GetStaticByteField, + required ffi.Pointer< + ffi.NativeFunction< + JCharMarker Function(ffi.Pointer env, JClassPtr clazz, + JFieldIDPtr fieldID)>> + GetStaticCharField, + required ffi.Pointer< + ffi.NativeFunction< + JShortMarker Function(ffi.Pointer env, + JClassPtr clazz, JFieldIDPtr fieldID)>> + GetStaticShortField, + required ffi.Pointer< + ffi.NativeFunction< + JIntMarker Function(ffi.Pointer env, JClassPtr clazz, + JFieldIDPtr fieldID)>> + GetStaticIntField, + required ffi.Pointer< + ffi.NativeFunction< + JLongMarker Function(ffi.Pointer env, JClassPtr clazz, + JFieldIDPtr fieldID)>> + GetStaticLongField, + required ffi.Pointer< + ffi.NativeFunction< + JFloatMarker Function(ffi.Pointer env, + JClassPtr clazz, JFieldIDPtr fieldID)>> + GetStaticFloatField, + required ffi.Pointer< + ffi.NativeFunction< + JDoubleMarker Function(ffi.Pointer env, + JClassPtr clazz, JFieldIDPtr fieldID)>> + GetStaticDoubleField, + required ffi.Pointer< + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer env, JClassPtr clazz, + JFieldIDPtr fieldID, JObjectPtr val)>> + SetStaticObjectField, + required ffi.Pointer< + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer env, JClassPtr clazz, + JFieldIDPtr fieldID, JBooleanMarker val)>> + SetStaticBooleanField, + required ffi.Pointer< + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer env, JClassPtr clazz, + JFieldIDPtr fieldID, JByteMarker val)>> + SetStaticByteField, + required ffi.Pointer< + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer env, JClassPtr clazz, + JFieldIDPtr fieldID, JCharMarker val)>> + SetStaticCharField, + required ffi.Pointer< + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer env, JClassPtr clazz, + JFieldIDPtr fieldID, JShortMarker val)>> + SetStaticShortField, + required ffi.Pointer< + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer env, JClassPtr clazz, + JFieldIDPtr fieldID, JIntMarker val)>> + SetStaticIntField, + required ffi.Pointer< + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer env, JClassPtr clazz, + JFieldIDPtr fieldID, JLongMarker val)>> + SetStaticLongField, + required ffi.Pointer< + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer env, JClassPtr clazz, + JFieldIDPtr fieldID, JFloatMarker val)>> + SetStaticFloatField, + required ffi.Pointer< + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer env, JClassPtr clazz, + JFieldIDPtr fieldID, JDoubleMarker val)>> + SetStaticDoubleField, + required ffi.Pointer< + ffi.NativeFunction< + JStringPtr Function(ffi.Pointer env, + ffi.Pointer unicodeChars, JSizeMarker len)>> + NewString, + required ffi.Pointer< + ffi.NativeFunction< + JSizeMarker Function( + ffi.Pointer env, JStringPtr string)>> + GetStringLength, + required ffi.Pointer< + ffi.NativeFunction< + ffi.Pointer Function(ffi.Pointer env, + JStringPtr string, ffi.Pointer isCopy)>> + GetStringChars, + required ffi.Pointer< + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer env, JStringPtr string, + ffi.Pointer isCopy)>> + ReleaseStringChars, + required ffi.Pointer< + ffi.NativeFunction< + JStringPtr Function( + ffi.Pointer env, ffi.Pointer bytes)>> + NewStringUTF, + required ffi.Pointer< + ffi.NativeFunction< + JSizeMarker Function( + ffi.Pointer env, JStringPtr string)>> + GetStringUTFLength, + required ffi.Pointer< + ffi.NativeFunction< + ffi.Pointer Function(ffi.Pointer env, + JStringPtr string, ffi.Pointer isCopy)>> + GetStringUTFChars, + required ffi.Pointer< + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer env, JStringPtr string, + ffi.Pointer utf)>> + ReleaseStringUTFChars, + required ffi.Pointer< + ffi.NativeFunction< + JSizeMarker Function( + ffi.Pointer env, JArrayPtr array)>> + GetArrayLength, + required ffi.Pointer< + ffi.NativeFunction< + JObjectArrayPtr Function( + ffi.Pointer env, + JSizeMarker length, + JClassPtr elementClass, + JObjectPtr initialElement)>> + NewObjectArray, + required ffi.Pointer< + ffi.NativeFunction< + JObjectPtr Function(ffi.Pointer env, + JObjectArrayPtr array, JSizeMarker index)>> + GetObjectArrayElement, + required ffi.Pointer< + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer env, + JObjectArrayPtr array, JSizeMarker index, JObjectPtr val)>> + SetObjectArrayElement, + required ffi.Pointer< + ffi.NativeFunction< + JBooleanArrayPtr Function( + ffi.Pointer env, JSizeMarker length)>> + NewBooleanArray, + required ffi.Pointer< + ffi.NativeFunction< + JByteArrayPtr Function( + ffi.Pointer env, JSizeMarker length)>> + NewByteArray, + required ffi.Pointer< + ffi.NativeFunction< + JCharArrayPtr Function( + ffi.Pointer env, JSizeMarker length)>> + NewCharArray, + required ffi.Pointer< + ffi.NativeFunction< + JShortArrayPtr Function( + ffi.Pointer env, JSizeMarker length)>> + NewShortArray, + required ffi.Pointer< + ffi.NativeFunction< + JIntArrayPtr Function( + ffi.Pointer env, JSizeMarker length)>> + NewIntArray, + required ffi.Pointer< + ffi.NativeFunction< + JLongArrayPtr Function( + ffi.Pointer env, JSizeMarker length)>> + NewLongArray, + required ffi.Pointer< + ffi.NativeFunction< + JFloatArrayPtr Function( + ffi.Pointer env, JSizeMarker length)>> + NewFloatArray, + required ffi.Pointer< + ffi.NativeFunction< + JDoubleArrayPtr Function( + ffi.Pointer env, JSizeMarker length)>> + NewDoubleArray, + required ffi.Pointer< + ffi.NativeFunction< + ffi.Pointer Function( + ffi.Pointer env, + JBooleanArrayPtr array, + ffi.Pointer isCopy)>> + GetBooleanArrayElements, + required ffi.Pointer< + ffi.NativeFunction< + ffi.Pointer Function(ffi.Pointer env, + JByteArrayPtr array, ffi.Pointer isCopy)>> + GetByteArrayElements, + required ffi.Pointer< + ffi.NativeFunction< + ffi.Pointer Function(ffi.Pointer env, + JCharArrayPtr array, ffi.Pointer isCopy)>> + GetCharArrayElements, + required ffi.Pointer< + ffi.NativeFunction< + ffi.Pointer Function(ffi.Pointer env, + JShortArrayPtr array, ffi.Pointer isCopy)>> + GetShortArrayElements, + required ffi.Pointer< + ffi.NativeFunction< + ffi.Pointer Function(ffi.Pointer env, + JIntArrayPtr array, ffi.Pointer isCopy)>> + GetIntArrayElements, + required ffi.Pointer< + ffi.NativeFunction< + ffi.Pointer Function(ffi.Pointer env, + JLongArrayPtr array, ffi.Pointer isCopy)>> + GetLongArrayElements, + required ffi.Pointer< + ffi.NativeFunction< + ffi.Pointer Function(ffi.Pointer env, + JFloatArrayPtr array, ffi.Pointer isCopy)>> + GetFloatArrayElements, + required ffi.Pointer< + ffi.NativeFunction< + ffi.Pointer Function(ffi.Pointer env, + JDoubleArrayPtr array, ffi.Pointer isCopy)>> + GetDoubleArrayElements, + required ffi.Pointer< + ffi.NativeFunction< + ffi.Void Function( + ffi.Pointer env, + JBooleanArrayPtr array, + ffi.Pointer elems, + JIntMarker mode)>> + ReleaseBooleanArrayElements, + required ffi.Pointer< + ffi.NativeFunction< + ffi.Void Function( + ffi.Pointer env, + JByteArrayPtr array, + ffi.Pointer elems, + JIntMarker mode)>> + ReleaseByteArrayElements, + required ffi.Pointer< + ffi.NativeFunction< + ffi.Void Function( + ffi.Pointer env, + JCharArrayPtr array, + ffi.Pointer elems, + JIntMarker mode)>> + ReleaseCharArrayElements, + required ffi.Pointer< + ffi.NativeFunction< + ffi.Void Function( + ffi.Pointer env, + JShortArrayPtr array, + ffi.Pointer elems, + JIntMarker mode)>> + ReleaseShortArrayElements, + required ffi.Pointer< + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer env, JIntArrayPtr array, + ffi.Pointer elems, JIntMarker mode)>> + ReleaseIntArrayElements, + required ffi.Pointer< + ffi.NativeFunction< + ffi.Void Function( + ffi.Pointer env, + JLongArrayPtr array, + ffi.Pointer elems, + JIntMarker mode)>> + ReleaseLongArrayElements, + required ffi.Pointer< + ffi.NativeFunction< + ffi.Void Function( + ffi.Pointer env, + JFloatArrayPtr array, + ffi.Pointer elems, + JIntMarker mode)>> + ReleaseFloatArrayElements, + required ffi.Pointer< + ffi.NativeFunction< + ffi.Void Function( + ffi.Pointer env, + JDoubleArrayPtr array, + ffi.Pointer elems, + JIntMarker mode)>> + ReleaseDoubleArrayElements, + required ffi.Pointer< + ffi.NativeFunction< + ffi.Void Function( + ffi.Pointer env, + JBooleanArrayPtr array, + JSizeMarker start, + JSizeMarker len, + ffi.Pointer buf)>> + GetBooleanArrayRegion, + required ffi.Pointer< + ffi.NativeFunction< + ffi.Void Function( + ffi.Pointer env, + JByteArrayPtr array, + JSizeMarker start, + JSizeMarker len, + ffi.Pointer buf)>> + GetByteArrayRegion, + required ffi.Pointer< + ffi.NativeFunction< + ffi.Void Function( + ffi.Pointer env, + JCharArrayPtr array, + JSizeMarker start, + JSizeMarker len, + ffi.Pointer buf)>> + GetCharArrayRegion, + required ffi.Pointer< + ffi.NativeFunction< + ffi.Void Function( + ffi.Pointer env, + JShortArrayPtr array, + JSizeMarker start, + JSizeMarker len, + ffi.Pointer buf)>> + GetShortArrayRegion, + required ffi.Pointer< + ffi.NativeFunction< + ffi.Void Function( + ffi.Pointer env, + JIntArrayPtr array, + JSizeMarker start, + JSizeMarker len, + ffi.Pointer buf)>> + GetIntArrayRegion, + required ffi.Pointer< + ffi.NativeFunction< + ffi.Void Function( + ffi.Pointer env, + JLongArrayPtr array, + JSizeMarker start, + JSizeMarker len, + ffi.Pointer buf)>> + GetLongArrayRegion, + required ffi.Pointer< + ffi.NativeFunction< + ffi.Void Function( + ffi.Pointer env, + JFloatArrayPtr array, + JSizeMarker start, + JSizeMarker len, + ffi.Pointer buf)>> + GetFloatArrayRegion, + required ffi.Pointer< + ffi.NativeFunction< + ffi.Void Function( + ffi.Pointer env, + JDoubleArrayPtr array, + JSizeMarker start, + JSizeMarker len, + ffi.Pointer buf)>> + GetDoubleArrayRegion, + required ffi.Pointer< + ffi.NativeFunction< + ffi.Void Function( + ffi.Pointer env, + JBooleanArrayPtr array, + JSizeMarker start, + JSizeMarker len, + ffi.Pointer buf)>> + SetBooleanArrayRegion, + required ffi.Pointer< + ffi.NativeFunction< + ffi.Void Function( + ffi.Pointer env, + JByteArrayPtr array, + JSizeMarker start, + JSizeMarker len, + ffi.Pointer buf)>> + SetByteArrayRegion, + required ffi.Pointer< + ffi.NativeFunction< + ffi.Void Function( + ffi.Pointer env, + JCharArrayPtr array, + JSizeMarker start, + JSizeMarker len, + ffi.Pointer buf)>> + SetCharArrayRegion, + required ffi.Pointer< + ffi.NativeFunction< + ffi.Void Function( + ffi.Pointer env, + JShortArrayPtr array, + JSizeMarker start, + JSizeMarker len, + ffi.Pointer buf)>> + SetShortArrayRegion, + required ffi.Pointer< + ffi.NativeFunction< + ffi.Void Function( + ffi.Pointer env, + JIntArrayPtr array, + JSizeMarker start, + JSizeMarker len, + ffi.Pointer buf)>> + SetIntArrayRegion, + required ffi.Pointer< + ffi.NativeFunction< + ffi.Void Function( + ffi.Pointer env, + JLongArrayPtr array, + JSizeMarker start, + JSizeMarker len, + ffi.Pointer buf)>> + SetLongArrayRegion, + required ffi.Pointer< + ffi.NativeFunction< + ffi.Void Function( + ffi.Pointer env, + JFloatArrayPtr array, + JSizeMarker start, + JSizeMarker len, + ffi.Pointer buf)>> + SetFloatArrayRegion, + required ffi.Pointer< + ffi.NativeFunction< + ffi.Void Function( + ffi.Pointer env, + JDoubleArrayPtr array, + JSizeMarker start, + JSizeMarker len, + ffi.Pointer buf)>> + SetDoubleArrayRegion, + required ffi.Pointer< + ffi.NativeFunction< + JIntMarker Function(ffi.Pointer env, JClassPtr clazz, + ffi.Pointer methods, JIntMarker nMethods)>> + RegisterNatives, + required ffi.Pointer< + ffi.NativeFunction< + JIntMarker Function( + ffi.Pointer env, JClassPtr clazz)>> + UnregisterNatives, + required ffi.Pointer< + ffi.NativeFunction< + JIntMarker Function(ffi.Pointer env, JObjectPtr obj)>> + MonitorEnter, + required ffi.Pointer< + ffi.NativeFunction< + JIntMarker Function(ffi.Pointer env, JObjectPtr obj)>> + MonitorExit, + required ffi.Pointer< + ffi.NativeFunction< + JIntMarker Function(ffi.Pointer env, + ffi.Pointer> vm)>> + GetJavaVM, + required ffi.Pointer< + ffi.NativeFunction< + ffi.Void Function( + ffi.Pointer env, + JStringPtr str, + JSizeMarker start, + JSizeMarker len, + ffi.Pointer buf)>> + GetStringRegion, + required ffi.Pointer< + ffi.NativeFunction< + ffi.Void Function( + ffi.Pointer env, + JStringPtr str, + JSizeMarker start, + JSizeMarker len, + ffi.Pointer buf)>> + GetStringUTFRegion, + required ffi.Pointer< + ffi.NativeFunction< + ffi.Pointer Function(ffi.Pointer env, + JArrayPtr array, ffi.Pointer isCopy)>> + GetPrimitiveArrayCritical, + required ffi.Pointer< + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer env, JArrayPtr array, + ffi.Pointer carray, JIntMarker mode)>> + ReleasePrimitiveArrayCritical, + required ffi.Pointer< + ffi.NativeFunction< + ffi.Pointer Function(ffi.Pointer env, + JStringPtr str, ffi.Pointer isCopy)>> + GetStringCritical, + required ffi.Pointer< + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer env, JStringPtr str, + ffi.Pointer carray)>> + ReleaseStringCritical, + required ffi.Pointer< + ffi.NativeFunction< + JWeakPtr Function(ffi.Pointer env, JObjectPtr obj)>> + NewWeakGlobalRef, + required ffi.Pointer< + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer env, JWeakPtr obj)>> + DeleteWeakGlobalRef, + required ffi.Pointer< + ffi + .NativeFunction env)>> + ExceptionCheck, + required ffi.Pointer< + ffi.NativeFunction< + JObjectPtr Function(ffi.Pointer env, + ffi.Pointer address, JLongMarker capacity)>> + NewDirectByteBuffer, + required ffi.Pointer< + ffi.NativeFunction< + ffi.Pointer Function( + ffi.Pointer env, JObjectPtr buf)>> + GetDirectBufferAddress, + required ffi.Pointer< + ffi.NativeFunction< + JLongMarker Function( + ffi.Pointer env, JObjectPtr buf)>> + GetDirectBufferCapacity, + required ffi.Pointer< + ffi.NativeFunction< + ffi.UnsignedInt Function( + ffi.Pointer env, JObjectPtr obj)>> + GetObjectRefType, + }) => + $allocator() + ..ref.reserved0 = reserved0 + ..ref.reserved1 = reserved1 + ..ref.reserved2 = reserved2 + ..ref.reserved3 = reserved3 + ..ref.GetVersion = GetVersion + ..ref.DefineClass = DefineClass + ..ref.FindClass = FindClass + ..ref.FromReflectedMethod = FromReflectedMethod + ..ref.FromReflectedField = FromReflectedField + ..ref.ToReflectedMethod = ToReflectedMethod + ..ref.GetSuperclass = GetSuperclass + ..ref.IsAssignableFrom = IsAssignableFrom + ..ref.ToReflectedField = ToReflectedField + ..ref.Throw = Throw + ..ref.ThrowNew = ThrowNew + ..ref.ExceptionOccurred = ExceptionOccurred + ..ref.ExceptionDescribe = ExceptionDescribe + ..ref.ExceptionClear = ExceptionClear + ..ref.FatalError = FatalError + ..ref.PushLocalFrame = PushLocalFrame + ..ref.PopLocalFrame = PopLocalFrame + ..ref.NewGlobalRef = NewGlobalRef + ..ref.DeleteGlobalRef = DeleteGlobalRef + ..ref.DeleteLocalRef = DeleteLocalRef + ..ref.IsSameObject = IsSameObject + ..ref.NewLocalRef = NewLocalRef + ..ref.EnsureLocalCapacity = EnsureLocalCapacity + ..ref.AllocObject = AllocObject + ..ref.NewObject = NewObject + ..ref.NewObjectV = NewObjectV + ..ref.NewObjectA = NewObjectA + ..ref.GetObjectClass = GetObjectClass + ..ref.IsInstanceOf = IsInstanceOf + ..ref.GetMethodID = GetMethodID + ..ref.CallObjectMethod = CallObjectMethod + ..ref.CallObjectMethodV = CallObjectMethodV + ..ref.CallObjectMethodA = CallObjectMethodA + ..ref.CallBooleanMethod = CallBooleanMethod + ..ref.CallBooleanMethodV = CallBooleanMethodV + ..ref.CallBooleanMethodA = CallBooleanMethodA + ..ref.CallByteMethod = CallByteMethod + ..ref.CallByteMethodV = CallByteMethodV + ..ref.CallByteMethodA = CallByteMethodA + ..ref.CallCharMethod = CallCharMethod + ..ref.CallCharMethodV = CallCharMethodV + ..ref.CallCharMethodA = CallCharMethodA + ..ref.CallShortMethod = CallShortMethod + ..ref.CallShortMethodV = CallShortMethodV + ..ref.CallShortMethodA = CallShortMethodA + ..ref.CallIntMethod = CallIntMethod + ..ref.CallIntMethodV = CallIntMethodV + ..ref.CallIntMethodA = CallIntMethodA + ..ref.CallLongMethod = CallLongMethod + ..ref.CallLongMethodV = CallLongMethodV + ..ref.CallLongMethodA = CallLongMethodA + ..ref.CallFloatMethod = CallFloatMethod + ..ref.CallFloatMethodV = CallFloatMethodV + ..ref.CallFloatMethodA = CallFloatMethodA + ..ref.CallDoubleMethod = CallDoubleMethod + ..ref.CallDoubleMethodV = CallDoubleMethodV + ..ref.CallDoubleMethodA = CallDoubleMethodA + ..ref.CallVoidMethod = CallVoidMethod + ..ref.CallVoidMethodV = CallVoidMethodV + ..ref.CallVoidMethodA = CallVoidMethodA + ..ref.CallNonvirtualObjectMethod = CallNonvirtualObjectMethod + ..ref.CallNonvirtualObjectMethodV = CallNonvirtualObjectMethodV + ..ref.CallNonvirtualObjectMethodA = CallNonvirtualObjectMethodA + ..ref.CallNonvirtualBooleanMethod = CallNonvirtualBooleanMethod + ..ref.CallNonvirtualBooleanMethodV = CallNonvirtualBooleanMethodV + ..ref.CallNonvirtualBooleanMethodA = CallNonvirtualBooleanMethodA + ..ref.CallNonvirtualByteMethod = CallNonvirtualByteMethod + ..ref.CallNonvirtualByteMethodV = CallNonvirtualByteMethodV + ..ref.CallNonvirtualByteMethodA = CallNonvirtualByteMethodA + ..ref.CallNonvirtualCharMethod = CallNonvirtualCharMethod + ..ref.CallNonvirtualCharMethodV = CallNonvirtualCharMethodV + ..ref.CallNonvirtualCharMethodA = CallNonvirtualCharMethodA + ..ref.CallNonvirtualShortMethod = CallNonvirtualShortMethod + ..ref.CallNonvirtualShortMethodV = CallNonvirtualShortMethodV + ..ref.CallNonvirtualShortMethodA = CallNonvirtualShortMethodA + ..ref.CallNonvirtualIntMethod = CallNonvirtualIntMethod + ..ref.CallNonvirtualIntMethodV = CallNonvirtualIntMethodV + ..ref.CallNonvirtualIntMethodA = CallNonvirtualIntMethodA + ..ref.CallNonvirtualLongMethod = CallNonvirtualLongMethod + ..ref.CallNonvirtualLongMethodV = CallNonvirtualLongMethodV + ..ref.CallNonvirtualLongMethodA = CallNonvirtualLongMethodA + ..ref.CallNonvirtualFloatMethod = CallNonvirtualFloatMethod + ..ref.CallNonvirtualFloatMethodV = CallNonvirtualFloatMethodV + ..ref.CallNonvirtualFloatMethodA = CallNonvirtualFloatMethodA + ..ref.CallNonvirtualDoubleMethod = CallNonvirtualDoubleMethod + ..ref.CallNonvirtualDoubleMethodV = CallNonvirtualDoubleMethodV + ..ref.CallNonvirtualDoubleMethodA = CallNonvirtualDoubleMethodA + ..ref.CallNonvirtualVoidMethod = CallNonvirtualVoidMethod + ..ref.CallNonvirtualVoidMethodV = CallNonvirtualVoidMethodV + ..ref.CallNonvirtualVoidMethodA = CallNonvirtualVoidMethodA + ..ref.GetFieldID = GetFieldID + ..ref.GetObjectField = GetObjectField + ..ref.GetBooleanField = GetBooleanField + ..ref.GetByteField = GetByteField + ..ref.GetCharField = GetCharField + ..ref.GetShortField = GetShortField + ..ref.GetIntField = GetIntField + ..ref.GetLongField = GetLongField + ..ref.GetFloatField = GetFloatField + ..ref.GetDoubleField = GetDoubleField + ..ref.SetObjectField = SetObjectField + ..ref.SetBooleanField = SetBooleanField + ..ref.SetByteField = SetByteField + ..ref.SetCharField = SetCharField + ..ref.SetShortField = SetShortField + ..ref.SetIntField = SetIntField + ..ref.SetLongField = SetLongField + ..ref.SetFloatField = SetFloatField + ..ref.SetDoubleField = SetDoubleField + ..ref.GetStaticMethodID = GetStaticMethodID + ..ref.CallStaticObjectMethod = CallStaticObjectMethod + ..ref.CallStaticObjectMethodV = CallStaticObjectMethodV + ..ref.CallStaticObjectMethodA = CallStaticObjectMethodA + ..ref.CallStaticBooleanMethod = CallStaticBooleanMethod + ..ref.CallStaticBooleanMethodV = CallStaticBooleanMethodV + ..ref.CallStaticBooleanMethodA = CallStaticBooleanMethodA + ..ref.CallStaticByteMethod = CallStaticByteMethod + ..ref.CallStaticByteMethodV = CallStaticByteMethodV + ..ref.CallStaticByteMethodA = CallStaticByteMethodA + ..ref.CallStaticCharMethod = CallStaticCharMethod + ..ref.CallStaticCharMethodV = CallStaticCharMethodV + ..ref.CallStaticCharMethodA = CallStaticCharMethodA + ..ref.CallStaticShortMethod = CallStaticShortMethod + ..ref.CallStaticShortMethodV = CallStaticShortMethodV + ..ref.CallStaticShortMethodA = CallStaticShortMethodA + ..ref.CallStaticIntMethod = CallStaticIntMethod + ..ref.CallStaticIntMethodV = CallStaticIntMethodV + ..ref.CallStaticIntMethodA = CallStaticIntMethodA + ..ref.CallStaticLongMethod = CallStaticLongMethod + ..ref.CallStaticLongMethodV = CallStaticLongMethodV + ..ref.CallStaticLongMethodA = CallStaticLongMethodA + ..ref.CallStaticFloatMethod = CallStaticFloatMethod + ..ref.CallStaticFloatMethodV = CallStaticFloatMethodV + ..ref.CallStaticFloatMethodA = CallStaticFloatMethodA + ..ref.CallStaticDoubleMethod = CallStaticDoubleMethod + ..ref.CallStaticDoubleMethodV = CallStaticDoubleMethodV + ..ref.CallStaticDoubleMethodA = CallStaticDoubleMethodA + ..ref.CallStaticVoidMethod = CallStaticVoidMethod + ..ref.CallStaticVoidMethodV = CallStaticVoidMethodV + ..ref.CallStaticVoidMethodA = CallStaticVoidMethodA + ..ref.GetStaticFieldID = GetStaticFieldID + ..ref.GetStaticObjectField = GetStaticObjectField + ..ref.GetStaticBooleanField = GetStaticBooleanField + ..ref.GetStaticByteField = GetStaticByteField + ..ref.GetStaticCharField = GetStaticCharField + ..ref.GetStaticShortField = GetStaticShortField + ..ref.GetStaticIntField = GetStaticIntField + ..ref.GetStaticLongField = GetStaticLongField + ..ref.GetStaticFloatField = GetStaticFloatField + ..ref.GetStaticDoubleField = GetStaticDoubleField + ..ref.SetStaticObjectField = SetStaticObjectField + ..ref.SetStaticBooleanField = SetStaticBooleanField + ..ref.SetStaticByteField = SetStaticByteField + ..ref.SetStaticCharField = SetStaticCharField + ..ref.SetStaticShortField = SetStaticShortField + ..ref.SetStaticIntField = SetStaticIntField + ..ref.SetStaticLongField = SetStaticLongField + ..ref.SetStaticFloatField = SetStaticFloatField + ..ref.SetStaticDoubleField = SetStaticDoubleField + ..ref.NewString = NewString + ..ref.GetStringLength = GetStringLength + ..ref.GetStringChars = GetStringChars + ..ref.ReleaseStringChars = ReleaseStringChars + ..ref.NewStringUTF = NewStringUTF + ..ref.GetStringUTFLength = GetStringUTFLength + ..ref.GetStringUTFChars = GetStringUTFChars + ..ref.ReleaseStringUTFChars = ReleaseStringUTFChars + ..ref.GetArrayLength = GetArrayLength + ..ref.NewObjectArray = NewObjectArray + ..ref.GetObjectArrayElement = GetObjectArrayElement + ..ref.SetObjectArrayElement = SetObjectArrayElement + ..ref.NewBooleanArray = NewBooleanArray + ..ref.NewByteArray = NewByteArray + ..ref.NewCharArray = NewCharArray + ..ref.NewShortArray = NewShortArray + ..ref.NewIntArray = NewIntArray + ..ref.NewLongArray = NewLongArray + ..ref.NewFloatArray = NewFloatArray + ..ref.NewDoubleArray = NewDoubleArray + ..ref.GetBooleanArrayElements = GetBooleanArrayElements + ..ref.GetByteArrayElements = GetByteArrayElements + ..ref.GetCharArrayElements = GetCharArrayElements + ..ref.GetShortArrayElements = GetShortArrayElements + ..ref.GetIntArrayElements = GetIntArrayElements + ..ref.GetLongArrayElements = GetLongArrayElements + ..ref.GetFloatArrayElements = GetFloatArrayElements + ..ref.GetDoubleArrayElements = GetDoubleArrayElements + ..ref.ReleaseBooleanArrayElements = ReleaseBooleanArrayElements + ..ref.ReleaseByteArrayElements = ReleaseByteArrayElements + ..ref.ReleaseCharArrayElements = ReleaseCharArrayElements + ..ref.ReleaseShortArrayElements = ReleaseShortArrayElements + ..ref.ReleaseIntArrayElements = ReleaseIntArrayElements + ..ref.ReleaseLongArrayElements = ReleaseLongArrayElements + ..ref.ReleaseFloatArrayElements = ReleaseFloatArrayElements + ..ref.ReleaseDoubleArrayElements = ReleaseDoubleArrayElements + ..ref.GetBooleanArrayRegion = GetBooleanArrayRegion + ..ref.GetByteArrayRegion = GetByteArrayRegion + ..ref.GetCharArrayRegion = GetCharArrayRegion + ..ref.GetShortArrayRegion = GetShortArrayRegion + ..ref.GetIntArrayRegion = GetIntArrayRegion + ..ref.GetLongArrayRegion = GetLongArrayRegion + ..ref.GetFloatArrayRegion = GetFloatArrayRegion + ..ref.GetDoubleArrayRegion = GetDoubleArrayRegion + ..ref.SetBooleanArrayRegion = SetBooleanArrayRegion + ..ref.SetByteArrayRegion = SetByteArrayRegion + ..ref.SetCharArrayRegion = SetCharArrayRegion + ..ref.SetShortArrayRegion = SetShortArrayRegion + ..ref.SetIntArrayRegion = SetIntArrayRegion + ..ref.SetLongArrayRegion = SetLongArrayRegion + ..ref.SetFloatArrayRegion = SetFloatArrayRegion + ..ref.SetDoubleArrayRegion = SetDoubleArrayRegion + ..ref.RegisterNatives = RegisterNatives + ..ref.UnregisterNatives = UnregisterNatives + ..ref.MonitorEnter = MonitorEnter + ..ref.MonitorExit = MonitorExit + ..ref.GetJavaVM = GetJavaVM + ..ref.GetStringRegion = GetStringRegion + ..ref.GetStringUTFRegion = GetStringUTFRegion + ..ref.GetPrimitiveArrayCritical = GetPrimitiveArrayCritical + ..ref.ReleasePrimitiveArrayCritical = ReleasePrimitiveArrayCritical + ..ref.GetStringCritical = GetStringCritical + ..ref.ReleaseStringCritical = ReleaseStringCritical + ..ref.NewWeakGlobalRef = NewWeakGlobalRef + ..ref.DeleteWeakGlobalRef = DeleteWeakGlobalRef + ..ref.ExceptionCheck = ExceptionCheck + ..ref.NewDirectByteBuffer = NewDirectByteBuffer + ..ref.GetDirectBufferAddress = GetDirectBufferAddress + ..ref.GetDirectBufferCapacity = GetDirectBufferCapacity + ..ref.GetObjectRefType = GetObjectRefType; +} + +final class JNINativeMethod extends ffi.Struct { + external ffi.Pointer name; + + external ffi.Pointer signature; + + external ffi.Pointer fnPtr; + + static ffi.Pointer $allocate( + ffi.Allocator $allocator, { + required ffi.Pointer name, + required ffi.Pointer signature, + required ffi.Pointer fnPtr, + }) => + $allocator() + ..ref.name = name + ..ref.signature = signature + ..ref.fnPtr = fnPtr; +} + +typedef JObjectArrayPtr = JArrayPtr; +typedef JObjectPtr = ffi.Pointer; + +enum JObjectRefType { + JNIInvalidRefType(0), + JNILocalRefType(1), + JNIGlobalRefType(2), + JNIWeakGlobalRefType(3); + + final int value; + const JObjectRefType(this.value); + + static JObjectRefType fromValue(int value) => switch (value) { + 0 => JNIInvalidRefType, + 1 => JNILocalRefType, + 2 => JNIGlobalRefType, + 3 => JNIWeakGlobalRefType, + _ => throw ArgumentError('Unknown value for JObjectRefType: $value'), + }; +} + +typedef JShortArrayPtr = JArrayPtr; +typedef JShortMarker = ffi.Int16; +typedef Dartjshort = int; +typedef JSizeMarker = JIntMarker; +typedef JStringPtr = JObjectPtr; +typedef JThrowablePtr = JObjectPtr; + +final class JValue extends ffi.Union { + @JBooleanMarker() + external int z; + + @JByteMarker() + external int b; + + @JCharMarker() + external int c; + + @JShortMarker() + external int s; + + @JIntMarker() + external int i; + + @JLongMarker() + external int j; + + @JFloatMarker() + external double f; + + @JDoubleMarker() + external double d; + + external JObjectPtr l; +} + +typedef JWeakPtr = JObjectPtr; +typedef JavaVM = ffi.Pointer; + +final class JavaVMAttachArgs extends ffi.Struct { + @JIntMarker() + external int version; + + external ffi.Pointer name; + + external JObjectPtr group; + + static ffi.Pointer $allocate( + ffi.Allocator $allocator, { + required int version, + required ffi.Pointer name, + required JObjectPtr group, + }) => + $allocator() + ..ref.version = version + ..ref.name = name + ..ref.group = group; +} + +final class JavaVMInitArgs extends ffi.Struct { + @JIntMarker() + external int version; + + @JIntMarker() + external int nOptions; + + external ffi.Pointer options; + + @JBooleanMarker() + external int ignoreUnrecognized; + + static ffi.Pointer $allocate( + ffi.Allocator $allocator, { + required int version, + required int nOptions, + required ffi.Pointer options, + required int ignoreUnrecognized, + }) => + $allocator() + ..ref.version = version + ..ref.nOptions = nOptions + ..ref.options = options + ..ref.ignoreUnrecognized = ignoreUnrecognized; +} + +final class JavaVMOption extends ffi.Struct { + external ffi.Pointer optionString; + + external ffi.Pointer extraInfo; + + static ffi.Pointer $allocate( + ffi.Allocator $allocator, { + required ffi.Pointer optionString, + required ffi.Pointer extraInfo, + }) => + $allocator() + ..ref.optionString = optionString + ..ref.extraInfo = extraInfo; +} + +enum JniBooleanValues { + FALSE(0), + TRUE(1); + + final int value; + const JniBooleanValues(this.value); + + static JniBooleanValues fromValue(int value) => switch (value) { + 0 => FALSE, + 1 => TRUE, + _ => throw ArgumentError('Unknown value for JniBooleanValues: $value'), + }; +} + +enum JniBufferWriteBack { + COMMIT(1), + ABORT(2); + + final int value; + const JniBufferWriteBack(this.value); + + static JniBufferWriteBack fromValue(int value) => switch (value) { + 1 => COMMIT, + 2 => ABORT, + _ => + throw ArgumentError('Unknown value for JniBufferWriteBack: $value'), + }; +} + +/// Types used by JNI API to distinguish between primitive types. +enum JniCallType { + booleanType(0), + byteType(1), + shortType(2), + charType(3), + intType(4), + longType(5), + floatType(6), + doubleType(7), + objectType(8), + voidType(9); + + final int value; + const JniCallType(this.value); + + static JniCallType fromValue(int value) => switch (value) { + 0 => booleanType, + 1 => byteType, + 2 => shortType, + 3 => charType, + 4 => intType, + 5 => longType, + 6 => floatType, + 7 => doubleType, + 8 => objectType, + 9 => voidType, + _ => throw ArgumentError('Unknown value for JniCallType: $value'), + }; +} + +/// Similar to [JniResult] but for class lookups. +final class JniClassLookupResult extends ffi.Struct { + external JClassPtr value; + + external JThrowablePtr exception; static ffi.Pointer $allocate( ffi.Allocator $allocator, { @@ -2933,25 +5916,12 @@ typedef JniEnv = ffi.Pointer; typedef JniEnv$1 = ffi.Pointer; enum JniErrorCode { - /// no error OK(0), - - /// generic error ERR(-1), - - /// thread detached from the VM EDETACHED(-2), - - /// JNI version error EVERSION(-3), - - /// Out of memory ENOMEM(-4), - - /// VM already created EEXIST(-5), - - /// Invalid argument EINVAL(-6), SINGLETON_EXISTS(-99); @@ -3032,20 +6002,13 @@ enum JniVersions { }; } -typedef MutexLock = pthread_mutex_t; -typedef __darwin_pthread_cond_t = _opaque_pthread_cond_t; -typedef __darwin_pthread_key_t = ffi.UnsignedLong; -typedef Dart__darwin_pthread_key_t = int; -typedef __darwin_pthread_mutex_t = _opaque_pthread_mutex_t; - -final class _opaque_pthread_cond_t extends ffi.Opaque {} +typedef MutexLock = ffi.Int; +typedef DartMutexLock = int; -final class _opaque_pthread_mutex_t extends ffi.Opaque {} +final class _JavaVM extends ffi.Struct { + external ffi.Pointer functions; +} final class jfieldID_ extends ffi.Opaque {} final class jmethodID_ extends ffi.Opaque {} - -typedef pthread_cond_t = __darwin_pthread_cond_t; -typedef pthread_key_t = __darwin_pthread_key_t; -typedef pthread_mutex_t = __darwin_pthread_mutex_t; diff --git a/pkgs/jni/tool/generate_ffi_bindings.dart b/pkgs/jni/tool/generate_ffi_bindings.dart index f61d2e8a6b..d0dbe51458 100644 --- a/pkgs/jni/tool/generate_ffi_bindings.dart +++ b/pkgs/jni/tool/generate_ffi_bindings.dart @@ -9,6 +9,7 @@ import 'dart:io'; import 'package:args/args.dart'; import 'package:ffigen/ffigen.dart' as ffigen; +import 'package:ffigen/src/config_provider/config.dart' as ffigen; import 'package:ffigen/src/context.dart' as ffigen; import 'package:ffigen/src/header_parser.dart' as ffigen; import 'package:logging/logging.dart'; @@ -61,8 +62,221 @@ void main(List args) { logger.info('Generating FFI bindings for package:jni'); - final config = - ffigen.YamlConfig.fromFile(File('ffigen.yaml'), logger).configAdapter(); + final generator = ffigen.FfiGenerator( + input: ffigen.Input( + entryPoints: [ + Uri.file('src/dartjni.h'), + Uri.file('src/third_party/global_jni_env.h'), + Uri.file('src/jni_constants.h'), + ], + include: (uri) { + final path = uri.toFilePath(); + return path.endsWith('src/dartjni.h') || + path.endsWith('src/third_party/global_jni_env.h') || + path.endsWith('third_party/jni.h') || + path.endsWith('src/jni_constants.h'); + }, + compilerOptions: ['-Ithird_party/'], + ignoreSourceErrors: true, + ), + visitors: [ + ffigen.Visitor.callback( + visitEnum: (node) { + const enumRenames = { + 'JniType': 'JniCallType', + 'jobjectRefType': 'JObjectRefType', + }; + final renamed = enumRenames[node.originalName]; + if (renamed != null) { + node.name = renamed; + } + node.isIncluded = true; + }, + visitFunc: (node) { + const excludedFuncs = { + 'GetJniContextPtr', + 'setJniGetters', + 'jni_log', + 'acquire_lock', + 'attach_thread', + 'check_exception', + 'destroy_cond', + 'destroy_lock', + 'init_cond', + 'init_lock', + 'load_class', + 'load_class_global_ref', + 'load_class_local_ref', + 'load_class_platform', + 'load_env', + 'load_field', + 'load_method', + 'load_static_field', + 'load_static_method', + 'release_lock', + 'signal_cond', + 'thread_id', + 'to_global_ref', + 'to_global_ref_result', + 'wait_for', + }; + final globalEnvNewObjectRegExp = RegExp(r'^globalEnv_NewObject$'); + final globalEnvCallRegExp = RegExp( + r'^globalEnv_Call(Static|Nonvirtual|)[A-Z][a-z]+Method$', + ); + const funcRenames = { + 'FindClass': 'JniFindClass', + 'GetJavaVM': 'JniGetJavaVM', + }; + if (node.originalName.startsWith('JNI_') || + excludedFuncs.contains(node.originalName) || + globalEnvNewObjectRegExp.hasMatch(node.originalName) || + globalEnvCallRegExp.hasMatch(node.originalName)) { + node.isIncluded = false; + return; + } + final renamed = funcRenames[node.originalName]; + if (renamed != null) { + node.name = renamed; + } + node.isIncluded = true; + }, + visitStruct: (node) { + node.dependencies = ffigen.CompoundDependencies.opaque; + const excludedStructs = { + 'JniContext', + 'JniLocks', + 'JNIEnv', + '_JNIEnv', + 'JNIInvokeInterface', + '__va_list_tag', + 'CallbackResult', + }; + const structRenames = { + '_Dart_FinalizableHandle': 'Dart_FinalizableHandle_', + '_jfieldID': 'jfieldID_', + '_jmethodID': 'jmethodID_', + }; + if (excludedStructs.contains(node.originalName)) { + node.isIncluded = false; + return; + } + final renamed = structRenames[node.originalName]; + if (renamed != null) { + node.name = renamed; + } + node.isIncluded = true; + }, + visitUnion: (node) { + if (node.originalName == 'jvalue') { + node.name = 'JValue'; + } + node.isIncluded = true; + }, + visitGlobal: (node) { + const excludedGlobals = { + 'jni', + 'jniEnv', + 'context_getter', + 'env_getter', + }; + if (excludedGlobals.contains(node.originalName)) { + node.isIncluded = false; + return; + } + node.isIncluded = true; + }, + visitTypealias: (node) { + const excludedTypeDefs = { + 'va_list', + '__builtin_va_list', + }; + const typedefRenames = { + 'jbyte': 'JByteMarker', + 'jboolean': 'JBooleanMarker', + 'jchar': 'JCharMarker', + 'jshort': 'JShortMarker', + 'jint': 'JIntMarker', + 'jlong': 'JLongMarker', + 'jfloat': 'JFloatMarker', + 'jdouble': 'JDoubleMarker', + 'jsize': 'JSizeMarker', + 'jclass': 'JClassPtr', + 'jobject': 'JObjectPtr', + 'jmethodID': 'JMethodIDPtr', + 'jfieldID': 'JFieldIDPtr', + 'jthrowable': 'JThrowablePtr', + 'jstring': 'JStringPtr', + 'jarray': 'JArrayPtr', + 'jobjectArray': 'JObjectArrayPtr', + 'jbooleanArray': 'JBooleanArrayPtr', + 'jbyteArray': 'JByteArrayPtr', + 'jcharArray': 'JCharArrayPtr', + 'jshortArray': 'JShortArrayPtr', + 'jintArray': 'JIntArrayPtr', + 'jlongArray': 'JLongArrayPtr', + 'jfloatArray': 'JFloatArrayPtr', + 'jdoubleArray': 'JDoubleArrayPtr', + 'jweak': 'JWeakPtr', + 'jvalue': 'JValue', + }; + if (excludedTypeDefs.contains(node.originalName)) { + node.isIncluded = false; + return; + } + final renamed = typedefRenames[node.originalName]; + if (renamed != null) { + node.name = renamed; + } else if (node.originalName.startsWith('JNI')) { + node.name = 'Jni${node.originalName.substring(3)}'; + } + node.isIncluded = true; + }, + ), + ], + output: ffigen.Output( + style: const ffigen.DynamicLibraryBindings(wrapperName: 'JniBindings'), + preamble: ''' +// Autogenerated file. Do not edit. +// Generated from an annotated version of jni.h provided in Android NDK. +// (NDK Version 23.1.7779620) +// The license for original file is provided below: + +/* + * Copyright (C) 2006 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/* + * JNI specification, as defined by Sun: + * http://java.sun.com/javase/6/docs/technotes/guides/jni/spec/jniTOC.html + * + * Everything here is expected to be VM-neutral. + */ + +// ignore_for_file: always_specify_types +// ignore_for_file: camel_case_types +// ignore_for_file: non_constant_identifier_names +// ignore_for_file: constant_identifier_names +// ignore_for_file: unused_field +// ignore_for_file: unused_element +// coverage:ignore-file +''', + dartFile: Uri.file('lib/src/third_party/jni_bindings_generated.dart'), + ), + ); + final config = ffigen.Config(generator); final library = ffigen.parse(ffigen.Context(logger, config)); final outputFile = File(config.output.dartFile.toFilePath()); library.generateFile(outputFile); diff --git a/pkgs/objective_c/ffigen_objc.yaml b/pkgs/objective_c/ffigen_objc.yaml deleted file mode 100644 index 3dc2299304..0000000000 --- a/pkgs/objective_c/ffigen_objc.yaml +++ /dev/null @@ -1,192 +0,0 @@ -# Generate bindings for the ObjC headers. -# Regenerate bindings with `dart run tool/generate_code.dart`. -name: ObjectiveCBindings -language: objc -output: - bindings: 'lib/src/objective_c_bindings_generated.dart' - objc-bindings: 'src/objective_c_bindings_generated.m' -headers: - entry-points: - - 'src/foundation.h' - - 'src/input_stream_adapter.h' - - 'src/ns_number.h' - - 'src/observer.h' - - 'src/protocol.h' -ffi-native: - asset-id: 'package:objective_c/objective_c.dylib' -exclude-all-by-default: true -include-transitive-objc-categories: false -generate-for-package-objective-c: true -sort: true -library-imports: - collection: 'dart:collection' -external-versions: - # See https://docs.flutter.dev/reference/supported-platforms. - ios: - min: 12.0.0 - macos: - min: 10.14.0 -objc-interfaces: - # Keep in sync with FFIgen's ObjCBuiltInFunctions.builtInInterfaces. - include: - - DOBJCDartInputStreamAdapter - - DOBJCDartInputStreamAdapterWeakHolder - - DOBJCObservation - - DOBJCDartProtocolBuilder - - DOBJCDartProtocol - - NSArray - - NSAttributedString - - NSAttributedStringMarkdownParsingOptions - - NSBundle - - NSCharacterSet - - NSCoder - - NSData - - NSDate - - NSDictionary - - NSEnumerator - - NSError - - NSIndexSet - - NSInputStream - - NSInvocation - - NSItemProvider - - NSLocale - - NSMethodSignature - - NSMutableArray - - NSMutableData - - NSMutableDictionary - - NSMutableIndexSet - - NSMutableOrderedSet - - NSMutableSet - - NSMutableString - - NSNotification - - NSNull - - NSNumber - - NSObject - - NSOutputStream - - NSOrderedCollectionChange - - NSOrderedCollectionDifference - - NSOrderedSet - - NSPort - - NSPortMessage - - NSProgress - - NSRunLoop - - NSSet - - NSStream - - NSString - - NSTimer - - NSURL - - NSURLHandle - - NSValue - - Protocol - rename: - 'DOBJCDartInputStreamAdapter': 'DartInputStreamAdapter' - 'DOBJCDartInputStreamAdapterWeakHolder' : 'DartInputStreamAdapterWeakHolder' - 'DOBJCDartProtocolBuilder': 'DartProtocolBuilder' - 'DOBJCDartProtocol': 'DartProtocol' - member-filter: - NSBundle: - exclude: - # This method is only present in some SDKs, leading to inconsistent - # code generation. - - 'localizedStringForKey:value:table:localizations:' -objc-protocols: - include: - - NSCoding - - NSCopying - - NSFastEnumeration - - NSItemProviderReading - - NSItemProviderWriting - - NSMutableCopying - - NSObject - - NSPortDelegate - - NSSecureCoding - - NSStreamDelegate - - Observer - rename: - 'NSObject': 'NSObjectProtocol' -objc-categories: - include: - - NSDataCreation - - NSExtendedArray - - NSExtendedData - - NSExtendedDate - - NSExtendedDictionary - - NSExtendedEnumerator - - NSExtendedMutableArray - - NSExtendedMutableData - - NSExtendedMutableDictionary - - NSExtendedMutableOrderedSet - - NSExtendedMutableSet - - NSExtendedOrderedSet - - NSExtendedSet - - NSNumberCreation - - NSNumberIsFloat - - NSNumberIsBool - - NSStringExtensionMethods -structs: - include: - - AEDesc - - __CFRunLoop - - __CFString - - CGPoint - - CGRect - - CGSize - - NSEdgeInsets - - NSFastEnumerationState - - _NSRange - - _NSZone - - OpaqueAEDataStorageType - rename: - __CFRunLoop: CFRunLoop - __CFString: CFString - _NSRange: NSRange - _NSZone: NSZone -enums: - include: - - NSAppleEventSendOptions - - NSAttributedStringEnumerationOptions - - NSAttributedStringFormattingOptions - - NSAttributedStringMarkdownInterpretedSyntax - - NSAttributedStringMarkdownParsingFailurePolicy - - NSBinarySearchingOptions - - NSCollectionChangeType - - NSComparisonResult - - NSDataBase64DecodingOptions - - NSDataBase64EncodingOptions - - NSDataCompressionAlgorithm - - NSDataReadingOptions - - NSDataSearchOptions - - NSDataWritingOptions - - NSDecodingFailurePolicy - - NSEnumerationOptions - - NSItemProviderFileOptions - - NSItemProviderRepresentationVisibility - - NSKeyValueChange - - NSKeyValueObservingOptions - - NSKeyValueSetMutationKind - - NSLinguisticTaggerOptions - - NSLocaleLanguageDirection - - NSOrderedCollectionDifferenceCalculationOptions - - NSPropertyListFormat - - NSQualityOfService - - NSSortOptions - - NSStreamEvent - - NSStreamStatus - - NSStringCompareOptions - - NSStringEncodingConversionOptions - - NSStringEnumerationOptions - - NSURLBookmarkCreationOptions - - NSURLBookmarkResolutionOptions - - NSURLHandleStatus -typedefs: - include: - - 'CFStringRef' -preamble: | - // 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. - - // Bindings for package:objective_c's ObjC code and the Foundation framework. - // Regenerate bindings with `dart run tool/generate_code.dart`. - - // coverage:ignore-file diff --git a/pkgs/objective_c/ffigen_runtime.yaml b/pkgs/objective_c/ffigen_runtime.yaml deleted file mode 100644 index 5d14eeaf7d..0000000000 --- a/pkgs/objective_c/ffigen_runtime.yaml +++ /dev/null @@ -1,71 +0,0 @@ -# Generate bindings for the ObjC runtime headers. -# Regenerate bindings with `dart run tool/generate_code.dart`. -name: RuntimeBindings -output: 'lib/src/runtime_bindings_generated.dart' -headers: - entry-points: - - 'src/objective_c_runtime.h' -ffi-native: -exclude-all-by-default: true -generate-for-package-objective-c: true -sort: true -functions: - include: - - 'objc_.*' - - 'object_getClass' - - 'sel_registerName' - - 'sel_getName' - - 'protocol_getMethodDescription' - - 'protocol_getName' - leaf: - include: - - '.*' - exclude: - - 'objc_msgSend.*' - rename: - 'sel_registerName': 'registerName' - 'sel_getName': 'getName' - 'objc_getClass': 'getClass' - 'objc_retain': 'objectRetain' - 'objc_retainBlock': 'blockRetain' - 'objc_release': 'objectRelease' - 'objc_autorelease': 'objectAutorelease' - 'objc_msgSend': 'msgSend' - 'objc_msgSend_fpret': 'msgSendFpret' - 'objc_msgSend_stret': 'msgSendStret' - 'object_getClass': 'getObjectClass' - 'objc_copyClassList': 'copyClassList' - 'objc_getProtocol': 'getProtocol' - 'objc_autoreleasePoolPush': 'autoreleasePoolPush' - 'objc_autoreleasePoolPop': 'autoreleasePoolPop' - 'protocol_getMethodDescription': 'getMethodDescription' - 'protocol_getName': 'getProtocolName' -globals: - include: - - '_NSConcrete.*Block' - - NSKeyValueChangeIndexesKey - - NSKeyValueChangeKindKey - - NSKeyValueChangeNewKey - - NSKeyValueChangeNotificationIsPriorKey - - NSKeyValueChangeOldKey - - NSLocalizedDescriptionKey - rename: - '_(.*)': '$1' -structs: - include: - - '_ObjC.*' - rename: - '_ObjC(.*)': 'ObjC$1' -preamble: | - // 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. - - // Bindings for `src/objective_c_runtime.h`. - // Regenerate bindings with `dart run tool/generate_code.dart`. - - // ignore_for_file: always_specify_types - // ignore_for_file: camel_case_types - // ignore_for_file: non_constant_identifier_names - // ignore_for_file: unused_element - // coverage:ignore-file diff --git a/pkgs/objective_c/lib/src/c_bindings_generated.dart b/pkgs/objective_c/lib/src/c_bindings_generated.dart index e0e5763676..0163d7a5b0 100644 --- a/pkgs/objective_c/lib/src/c_bindings_generated.dart +++ b/pkgs/objective_c/lib/src/c_bindings_generated.dart @@ -58,7 +58,7 @@ external int initializeApi(ffi.Pointer data); @ffi.Native< ffi.Void Function(ffi.Int64, ffi.Pointer, ffi.Pointer) ->(symbol: 'DOBJC_invokeBlockingPortBlock') +>(symbol: 'DOBJC_invokeBlockingPortBlock', isLeaf: true) external void invokeBlockingPortBlock( int port, ffi.Pointer args, @@ -67,6 +67,7 @@ external void invokeBlockingPortBlock( @ffi.Native)>( symbol: 'DOBJC_invokeListenerPortBlock', + isLeaf: true, ) external void invokeListenerPortBlock(int port, ffi.Pointer args); @@ -112,7 +113,95 @@ external void runOnMainThread( ) external void signalWaiter(ffi.Pointer waiter); -final class DOBJC_Context extends ffi.Opaque {} +final class DOBJC_Context extends ffi.Struct { + @ffi.Int64() + external int version; + + external ffi.Pointer Function()>> + newWaiter$1; + + external ffi.Pointer< + ffi.NativeFunction)> + > + awaitWaiter$1; + + external ffi.Pointer< + ffi.NativeFunction Function()> + > + currentIsolate; + + external ffi.Pointer< + ffi.NativeFunction)> + > + enterIsolate; + + external ffi.Pointer> exitIsolate; + + external ffi.Pointer> getMainPortId; + + external ffi.Pointer> + getCurrentThreadOwnsIsolate; + + external ffi.Pointer< + ffi.NativeFunction)> + > + invokeListenerPortBlock$1; + + external ffi.Pointer< + ffi.NativeFunction< + ffi.Void Function(ffi.Int64, ffi.Pointer, ffi.Pointer) + > + > + invokeBlockingPortBlock$1; + + static ffi.Pointer $allocate( + ffi.Allocator $allocator, { + required int version, + required ffi.Pointer Function()>> + newWaiter$1, + required ffi.Pointer< + ffi.NativeFunction)> + > + awaitWaiter$1, + required ffi.Pointer< + ffi.NativeFunction Function()> + > + currentIsolate, + required ffi.Pointer< + ffi.NativeFunction)> + > + enterIsolate, + required ffi.Pointer> exitIsolate, + required ffi.Pointer> + getMainPortId, + required ffi.Pointer> + getCurrentThreadOwnsIsolate, + required ffi.Pointer< + ffi.NativeFunction)> + > + invokeListenerPortBlock$1, + required ffi.Pointer< + ffi.NativeFunction< + ffi.Void Function( + ffi.Int64, + ffi.Pointer, + ffi.Pointer, + ) + > + > + invokeBlockingPortBlock$1, + }) => $allocator() + ..ref.version = version + ..ref.newWaiter$1 = newWaiter$1 + ..ref.awaitWaiter$1 = awaitWaiter$1 + ..ref.currentIsolate = currentIsolate + ..ref.enterIsolate = enterIsolate + ..ref.exitIsolate = exitIsolate + ..ref.getMainPortId = getMainPortId + ..ref.getCurrentThreadOwnsIsolate = getCurrentThreadOwnsIsolate + ..ref.invokeListenerPortBlock$1 = invokeListenerPortBlock$1 + ..ref.invokeBlockingPortBlock$1 = invokeBlockingPortBlock$1; +} typedef Dart_FinalizableHandle = ffi.Pointer; @@ -203,6 +292,8 @@ final class ObjCBlockImpl extends ffi.Struct { final class ObjCObjectImpl extends ffi.Opaque {} +final class _Dart_Isolate extends ffi.Opaque {} + final class _Version extends ffi.Struct { @ffi.Int() external int major; diff --git a/pkgs/objective_c/lib/src/objc_built_in_types.dart b/pkgs/objective_c/lib/src/objc_built_in_types.dart new file mode 100644 index 0000000000..5010cbd13b --- /dev/null +++ b/pkgs/objective_c/lib/src/objc_built_in_types.dart @@ -0,0 +1,146 @@ +// Copyright (c) 2025, 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. + +// Generated by package:objective_c's tool/generate_code.dart. + +const objCBuiltInInterfaces = { + 'DOBJCObservation': 'DOBJCObservation', + 'DOBJCDartInputStreamAdapter': 'DartInputStreamAdapter', + 'DOBJCDartInputStreamAdapterWeakHolder': 'DartInputStreamAdapterWeakHolder', + 'DOBJCDartProtocol': 'DartProtocol', + 'DOBJCDartProtocolBuilder': 'DartProtocolBuilder', + 'NSArray': 'NSArray', + 'NSAttributedString': 'NSAttributedString', + 'NSAttributedStringMarkdownParsingOptions': + 'NSAttributedStringMarkdownParsingOptions', + 'NSBundle': 'NSBundle', + 'NSCharacterSet': 'NSCharacterSet', + 'NSCoder': 'NSCoder', + 'NSConnection': 'NSConnection', + 'NSData': 'NSData', + 'NSDate': 'NSDate', + 'NSDictionary': 'NSDictionary', + 'NSEnumerator': 'NSEnumerator', + 'NSError': 'NSError', + 'NSIndexSet': 'NSIndexSet', + 'NSInputStream': 'NSInputStream', + 'NSInvocation': 'NSInvocation', + 'NSItemProvider': 'NSItemProvider', + 'NSLocale': 'NSLocale', + 'NSMethodSignature': 'NSMethodSignature', + 'NSMutableArray': 'NSMutableArray', + 'NSMutableData': 'NSMutableData', + 'NSMutableDictionary': 'NSMutableDictionary', + 'NSMutableIndexSet': 'NSMutableIndexSet', + 'NSMutableOrderedSet': 'NSMutableOrderedSet', + 'NSMutableSet': 'NSMutableSet', + 'NSMutableString': 'NSMutableString', + 'NSNotification': 'NSNotification', + 'NSNull': 'NSNull', + 'NSNumber': 'NSNumber', + 'NSObject': 'NSObject', + 'NSOrderedCollectionChange': 'NSOrderedCollectionChange', + 'NSOrderedCollectionDifference': 'NSOrderedCollectionDifference', + 'NSOrderedSet': 'NSOrderedSet', + 'NSOutputStream': 'NSOutputStream', + 'NSPort': 'NSPort', + 'NSPortMessage': 'NSPortMessage', + 'NSProgress': 'NSProgress', + 'NSRunLoop': 'NSRunLoop', + 'NSSet': 'NSSet', + 'NSStream': 'NSStream', + 'NSString': 'NSString', + 'NSTimer': 'NSTimer', + 'NSURL': 'NSURL', + 'NSURLHandle': 'NSURLHandle', + 'NSValue': 'NSValue', + 'Protocol': 'Protocol', +}; + +const objCBuiltInCompounds = { + 'AEDesc': 'AEDesc', + '__CFRunLoop': 'CFRunLoop', + '__CFString': 'CFString', + 'CGPoint': 'CGPoint', + 'CGRect': 'CGRect', + 'CGSize': 'CGSize', + 'NSEdgeInsets': 'NSEdgeInsets', + 'NSFastEnumerationState': 'NSFastEnumerationState', + '_NSRange': 'NSRange', + '_NSZone': 'NSZone', + 'OpaqueAEDataStorageType': 'OpaqueAEDataStorageType', +}; + +const objCBuiltInEnums = { + 'NSAppleEventSendOptions', + 'NSAttributedStringEnumerationOptions', + 'NSAttributedStringFormattingOptions', + 'NSAttributedStringMarkdownInterpretedSyntax', + 'NSAttributedStringMarkdownParsingFailurePolicy', + 'NSBinarySearchingOptions', + 'NSCollectionChangeType', + 'NSComparisonResult', + 'NSDataBase64DecodingOptions', + 'NSDataBase64EncodingOptions', + 'NSDataCompressionAlgorithm', + 'NSDataReadingOptions', + 'NSDataSearchOptions', + 'NSDataWritingOptions', + 'NSDecodingFailurePolicy', + 'NSEnumerationOptions', + 'NSItemProviderFileOptions', + 'NSItemProviderRepresentationVisibility', + 'NSKeyValueChange', + 'NSKeyValueObservingOptions', + 'NSKeyValueSetMutationKind', + 'NSLinguisticTaggerOptions', + 'NSLocaleLanguageDirection', + 'NSOrderedCollectionDifferenceCalculationOptions', + 'NSPropertyListFormat', + 'NSQualityOfService', + 'NSSortOptions', + 'NSStreamEvent', + 'NSStreamStatus', + 'NSStringCompareOptions', + 'NSStringEncodingConversionOptions', + 'NSStringEnumerationOptions', + 'NSURLBookmarkCreationOptions', + 'NSURLBookmarkResolutionOptions', + 'NSURLHandleStatus', +}; + +const objCBuiltInProtocols = { + 'NSCoding': 'NSCoding', + 'NSCopying': 'NSCopying', + 'NSFastEnumeration': 'NSFastEnumeration', + 'NSItemProviderReading': 'NSItemProviderReading', + 'NSItemProviderWriting': 'NSItemProviderWriting', + 'NSMutableCopying': 'NSMutableCopying', + 'NSObject': 'NSObjectProtocol', + 'NSPortDelegate': 'NSPortDelegate', + 'NSSecureCoding': 'NSSecureCoding', + 'NSStreamDelegate': 'NSStreamDelegate', + 'NSURLHandleClient': 'NSURLHandleClient', + 'Observer': 'Observer', +}; + +const objCBuiltInCategories = { + 'NSDataCreation', + 'NSExtendedArray', + 'NSExtendedData', + 'NSExtendedDate', + 'NSExtendedDictionary', + 'NSExtendedEnumerator', + 'NSExtendedMutableArray', + 'NSExtendedMutableData', + 'NSExtendedMutableDictionary', + 'NSExtendedMutableOrderedSet', + 'NSExtendedMutableSet', + 'NSExtendedOrderedSet', + 'NSExtendedSet', + 'NSNumberCreation', + 'NSNumberIsBool', + 'NSNumberIsFloat', + 'NSStringExtensionMethods', +}; 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 0d49bca8ec..d22ac6b7ec 100644 --- a/pkgs/objective_c/lib/src/objective_c_bindings_generated.dart +++ b/pkgs/objective_c/lib/src/objective_c_bindings_generated.dart @@ -15712,7 +15712,7 @@ extension type NSObjectProtocol._(objc.ObjCProtocol object$) return _objc_msgSend_e3qsqz( obj.ref.pointer, _sel_conformsToProtocol_, - _protocol_NSObject, + _protocol_NSObjectProtocol, ); } } @@ -15907,7 +15907,7 @@ extension NSObjectProtocol$Methods on NSObjectProtocol { interface class NSObjectProtocol$Builder { /// Returns the [objc.Protocol] object for this protocol. static objc.Protocol get $protocol => - objc.Protocol.fromPointer(_protocol_NSObject.cast()); + objc.Protocol.fromPointer(_protocol_NSObjectProtocol.cast()); /// Builds an object that implements the NSObject protocol. To implement /// multiple protocols, use [addToBuilder] or [objc.ObjCProtocolBuilder] directly. @@ -16420,7 +16420,7 @@ interface class NSObjectProtocol$Builder { /// autorelease static final autorelease = objc.ObjCProtocolMethod( - _protocol_NSObject, + _protocol_NSObjectProtocol, _sel_autorelease, ffi.Native.addressOf< ffi.NativeFunction< @@ -16432,7 +16432,7 @@ interface class NSObjectProtocol$Builder { >(_1wx624s_protocolTrampoline_1mbt9g9) .cast(), objc.getProtocolMethodSignature( - _protocol_NSObject, + _protocol_NSObjectProtocol, _sel_autorelease, isRequired: true, isInstanceMethod: true, @@ -16445,7 +16445,7 @@ interface class NSObjectProtocol$Builder { /// class static final class$ = objc.ObjCProtocolMethod( - _protocol_NSObject, + _protocol_NSObjectProtocol, _sel_class, ffi.Native.addressOf< ffi.NativeFunction< @@ -16457,7 +16457,7 @@ interface class NSObjectProtocol$Builder { >(_1wx624s_protocolTrampoline_1mbt9g9) .cast(), objc.getProtocolMethodSignature( - _protocol_NSObject, + _protocol_NSObjectProtocol, _sel_class, isRequired: true, isInstanceMethod: true, @@ -16471,7 +16471,7 @@ interface class NSObjectProtocol$Builder { /// conformsToProtocol: static final conformsToProtocol_ = objc.ObjCProtocolMethod( - _protocol_NSObject, + _protocol_NSObjectProtocol, _sel_conformsToProtocol_, ffi.Native.addressOf< ffi.NativeFunction< @@ -16484,7 +16484,7 @@ interface class NSObjectProtocol$Builder { >(_1wx624s_protocolTrampoline_3su7tt) .cast(), objc.getProtocolMethodSignature( - _protocol_NSObject, + _protocol_NSObjectProtocol, _sel_conformsToProtocol_, isRequired: true, isInstanceMethod: true, @@ -16497,7 +16497,7 @@ interface class NSObjectProtocol$Builder { /// debugDescription static final debugDescription = objc.ObjCProtocolMethod( - _protocol_NSObject, + _protocol_NSObjectProtocol, _sel_debugDescription, ffi.Native.addressOf< ffi.NativeFunction< @@ -16509,7 +16509,7 @@ interface class NSObjectProtocol$Builder { >(_1wx624s_protocolTrampoline_1mbt9g9) .cast(), objc.getProtocolMethodSignature( - _protocol_NSObject, + _protocol_NSObjectProtocol, _sel_debugDescription, isRequired: false, isInstanceMethod: true, @@ -16521,7 +16521,7 @@ interface class NSObjectProtocol$Builder { /// description static final description = objc.ObjCProtocolMethod( - _protocol_NSObject, + _protocol_NSObjectProtocol, _sel_description, ffi.Native.addressOf< ffi.NativeFunction< @@ -16533,7 +16533,7 @@ interface class NSObjectProtocol$Builder { >(_1wx624s_protocolTrampoline_1mbt9g9) .cast(), objc.getProtocolMethodSignature( - _protocol_NSObject, + _protocol_NSObjectProtocol, _sel_description, isRequired: true, isInstanceMethod: true, @@ -16545,7 +16545,7 @@ interface class NSObjectProtocol$Builder { /// hash static final hash = objc.ObjCProtocolMethod( - _protocol_NSObject, + _protocol_NSObjectProtocol, _sel_hash, ffi.Native.addressOf< ffi.NativeFunction< @@ -16557,7 +16557,7 @@ interface class NSObjectProtocol$Builder { >(_1wx624s_protocolTrampoline_1ckyi24) .cast(), objc.getProtocolMethodSignature( - _protocol_NSObject, + _protocol_NSObjectProtocol, _sel_hash, isRequired: true, isInstanceMethod: true, @@ -16571,7 +16571,7 @@ interface class NSObjectProtocol$Builder { /// isEqual: static final isEqual_ = objc.ObjCProtocolMethod( - _protocol_NSObject, + _protocol_NSObjectProtocol, _sel_isEqual_, ffi.Native.addressOf< ffi.NativeFunction< @@ -16584,7 +16584,7 @@ interface class NSObjectProtocol$Builder { >(_1wx624s_protocolTrampoline_3su7tt) .cast(), objc.getProtocolMethodSignature( - _protocol_NSObject, + _protocol_NSObjectProtocol, _sel_isEqual_, isRequired: true, isInstanceMethod: true, @@ -16598,7 +16598,7 @@ interface class NSObjectProtocol$Builder { /// isKindOfClass: static final isKindOfClass_ = objc.ObjCProtocolMethod( - _protocol_NSObject, + _protocol_NSObjectProtocol, _sel_isKindOfClass_, ffi.Native.addressOf< ffi.NativeFunction< @@ -16611,7 +16611,7 @@ interface class NSObjectProtocol$Builder { >(_1wx624s_protocolTrampoline_3su7tt) .cast(), objc.getProtocolMethodSignature( - _protocol_NSObject, + _protocol_NSObjectProtocol, _sel_isKindOfClass_, isRequired: true, isInstanceMethod: true, @@ -16625,7 +16625,7 @@ interface class NSObjectProtocol$Builder { /// isMemberOfClass: static final isMemberOfClass_ = objc.ObjCProtocolMethod( - _protocol_NSObject, + _protocol_NSObjectProtocol, _sel_isMemberOfClass_, ffi.Native.addressOf< ffi.NativeFunction< @@ -16638,7 +16638,7 @@ interface class NSObjectProtocol$Builder { >(_1wx624s_protocolTrampoline_3su7tt) .cast(), objc.getProtocolMethodSignature( - _protocol_NSObject, + _protocol_NSObjectProtocol, _sel_isMemberOfClass_, isRequired: true, isInstanceMethod: true, @@ -16651,7 +16651,7 @@ interface class NSObjectProtocol$Builder { /// isProxy static final isProxy = objc.ObjCProtocolMethod( - _protocol_NSObject, + _protocol_NSObjectProtocol, _sel_isProxy, ffi.Native.addressOf< ffi.NativeFunction< @@ -16663,7 +16663,7 @@ interface class NSObjectProtocol$Builder { >(_1wx624s_protocolTrampoline_e3qsqz) .cast(), objc.getProtocolMethodSignature( - _protocol_NSObject, + _protocol_NSObjectProtocol, _sel_isProxy, isRequired: true, isInstanceMethod: true, @@ -16678,7 +16678,7 @@ interface class NSObjectProtocol$Builder { objc.ObjCProtocolMethod< objc.ObjCObject Function(ffi.Pointer) >( - _protocol_NSObject, + _protocol_NSObjectProtocol, _sel_performSelector_, ffi.Native.addressOf< ffi.NativeFunction< @@ -16691,7 +16691,7 @@ interface class NSObjectProtocol$Builder { >(_1wx624s_protocolTrampoline_50as9u) .cast(), objc.getProtocolMethodSignature( - _protocol_NSObject, + _protocol_NSObjectProtocol, _sel_performSelector_, isRequired: true, isInstanceMethod: true, @@ -16711,7 +16711,7 @@ interface class NSObjectProtocol$Builder { objc.ObjCObject, ) >( - _protocol_NSObject, + _protocol_NSObjectProtocol, _sel_performSelector_withObject_, ffi.Native.addressOf< ffi.NativeFunction< @@ -16725,7 +16725,7 @@ interface class NSObjectProtocol$Builder { >(_1wx624s_protocolTrampoline_1mllhpc) .cast(), objc.getProtocolMethodSignature( - _protocol_NSObject, + _protocol_NSObjectProtocol, _sel_performSelector_withObject_, isRequired: true, isInstanceMethod: true, @@ -16755,7 +16755,7 @@ interface class NSObjectProtocol$Builder { objc.ObjCObject, ) >( - _protocol_NSObject, + _protocol_NSObjectProtocol, _sel_performSelector_withObject_withObject_, ffi.Native.addressOf< ffi.NativeFunction< @@ -16770,7 +16770,7 @@ interface class NSObjectProtocol$Builder { >(_1wx624s_protocolTrampoline_c7gk2u) .cast(), objc.getProtocolMethodSignature( - _protocol_NSObject, + _protocol_NSObjectProtocol, _sel_performSelector_withObject_withObject_, isRequired: true, isInstanceMethod: true, @@ -16795,7 +16795,7 @@ interface class NSObjectProtocol$Builder { /// release static final release = objc.ObjCProtocolListenableMethod( - _protocol_NSObject, + _protocol_NSObjectProtocol, _sel_release, ffi.Native.addressOf< ffi.NativeFunction< @@ -16807,7 +16807,7 @@ interface class NSObjectProtocol$Builder { >(_1wx624s_protocolTrampoline_ovsamd) .cast(), objc.getProtocolMethodSignature( - _protocol_NSObject, + _protocol_NSObjectProtocol, _sel_release, isRequired: true, isInstanceMethod: true, @@ -16824,7 +16824,7 @@ interface class NSObjectProtocol$Builder { /// respondsToSelector: static final respondsToSelector_ = objc.ObjCProtocolMethod)>( - _protocol_NSObject, + _protocol_NSObjectProtocol, _sel_respondsToSelector_, ffi.Native.addressOf< ffi.NativeFunction< @@ -16837,7 +16837,7 @@ interface class NSObjectProtocol$Builder { >(_1wx624s_protocolTrampoline_w1e3k0) .cast(), objc.getProtocolMethodSignature( - _protocol_NSObject, + _protocol_NSObjectProtocol, _sel_respondsToSelector_, isRequired: true, isInstanceMethod: true, @@ -16851,7 +16851,7 @@ interface class NSObjectProtocol$Builder { /// retain static final retain = objc.ObjCProtocolMethod( - _protocol_NSObject, + _protocol_NSObjectProtocol, _sel_retain, ffi.Native.addressOf< ffi.NativeFunction< @@ -16863,7 +16863,7 @@ interface class NSObjectProtocol$Builder { >(_1wx624s_protocolTrampoline_1mbt9g9) .cast(), objc.getProtocolMethodSignature( - _protocol_NSObject, + _protocol_NSObjectProtocol, _sel_retain, isRequired: true, isInstanceMethod: true, @@ -16876,7 +16876,7 @@ interface class NSObjectProtocol$Builder { /// retainCount static final retainCount = objc.ObjCProtocolMethod( - _protocol_NSObject, + _protocol_NSObjectProtocol, _sel_retainCount, ffi.Native.addressOf< ffi.NativeFunction< @@ -16888,7 +16888,7 @@ interface class NSObjectProtocol$Builder { >(_1wx624s_protocolTrampoline_1ckyi24) .cast(), objc.getProtocolMethodSignature( - _protocol_NSObject, + _protocol_NSObjectProtocol, _sel_retainCount, isRequired: true, isInstanceMethod: true, @@ -16901,7 +16901,7 @@ interface class NSObjectProtocol$Builder { /// self static final self = objc.ObjCProtocolMethod( - _protocol_NSObject, + _protocol_NSObjectProtocol, _sel_self, ffi.Native.addressOf< ffi.NativeFunction< @@ -16913,7 +16913,7 @@ interface class NSObjectProtocol$Builder { >(_1wx624s_protocolTrampoline_1mbt9g9) .cast(), objc.getProtocolMethodSignature( - _protocol_NSObject, + _protocol_NSObjectProtocol, _sel_self, isRequired: true, isInstanceMethod: true, @@ -16926,7 +16926,7 @@ interface class NSObjectProtocol$Builder { /// superclass static final superclass = objc.ObjCProtocolMethod( - _protocol_NSObject, + _protocol_NSObjectProtocol, _sel_superclass, ffi.Native.addressOf< ffi.NativeFunction< @@ -16938,7 +16938,7 @@ interface class NSObjectProtocol$Builder { >(_1wx624s_protocolTrampoline_1mbt9g9) .cast(), objc.getProtocolMethodSignature( - _protocol_NSObject, + _protocol_NSObjectProtocol, _sel_superclass, isRequired: true, isInstanceMethod: true, @@ -16951,7 +16951,7 @@ interface class NSObjectProtocol$Builder { /// zone static final zone = objc.ObjCProtocolMethod Function()>( - _protocol_NSObject, + _protocol_NSObjectProtocol, _sel_zone, ffi.Native.addressOf< ffi.NativeFunction< @@ -16963,7 +16963,7 @@ interface class NSObjectProtocol$Builder { >(_1wx624s_protocolTrampoline_1a8cl66) .cast(), objc.getProtocolMethodSignature( - _protocol_NSObject, + _protocol_NSObjectProtocol, _sel_zone, isRequired: true, isInstanceMethod: true, @@ -41103,8 +41103,11 @@ final _protocol_NSMutableCopying = objc.getProtocol( @ffi.Native Function()>( symbol: '_1wx624s_NSObject', ) -external ffi.Pointer _protocol_NSObject_raw(); -final _protocol_NSObject = objc.getProtocol("NSObject", _protocol_NSObject_raw); +external ffi.Pointer _protocol_NSObjectProtocol_raw(); +final _protocol_NSObjectProtocol = objc.getProtocol( + "NSObject", + _protocol_NSObjectProtocol_raw, +); @ffi.Native Function()>( symbol: '_1wx624s_NSPortDelegate', ) diff --git a/pkgs/objective_c/test/interface_lists_test.dart b/pkgs/objective_c/test/interface_lists_test.dart index 19837be516..aafae401b7 100644 --- a/pkgs/objective_c/test/interface_lists_test.dart +++ b/pkgs/objective_c/test/interface_lists_test.dart @@ -32,7 +32,9 @@ void expectSetsEqual(String name, Set expected, Set actual) { void mergeLinewithNext(List lines, String toMerge) { final i = lines.indexOf(toMerge); - lines[i] += lines.removeAt(i + 1); + if (i != -1) { + lines[i] += lines.removeAt(i + 1); + } } void main() { @@ -50,6 +52,10 @@ void main() { bindings, 'extension type NSAttributedStringMarkdownParsingOptions._(', ); + mergeLinewithNext( + bindings, + 'extension type NSAttributedStringMarkdownSourcePosition._(', + ); }); Set findBindings(RegExp re) => diff --git a/pkgs/objective_c/tool/generate_code.dart b/pkgs/objective_c/tool/generate_code.dart index 3e90345299..ae6c0866f6 100644 --- a/pkgs/objective_c/tool/generate_code.dart +++ b/pkgs/objective_c/tool/generate_code.dart @@ -2,18 +2,17 @@ // 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. -// Runs the FFIgen configs, then merges tool/data/extra_methods.dart.in into the +// Re-compile trigger. + +// Runs the FFIgen visitors, then merges tool/data/extra_methods.dart.in into the // Objective C bindings. import 'dart:io'; +import 'dart:isolate'; import 'package:args/args.dart'; -import 'package:ffigen/src/executables/ffigen.dart' as ffigen; -import 'package:yaml/yaml.dart'; +import 'package:ffigen/ffigen.dart'; -const runtimeConfig = 'ffigen_runtime.yaml'; -const cConfig = 'ffigen_c.yaml'; -const objcConfig = 'ffigen_objc.yaml'; const runtimeBindings = 'lib/src/runtime_bindings_generated.dart'; const cBindings = 'lib/src/c_bindings_generated.dart'; const objcBindings = 'lib/src/objective_c_bindings_generated.dart'; @@ -23,8 +22,6 @@ const builtInTypes = '../ffigen/lib/src/code_generator/objc_built_in_types.dart'; const interfaceListTest = 'test/interface_lists_test.dart'; -const ffigenFlags = ['--no-format', '-v', 'severe', '--config']; - void dartCmd(List args) { final exec = Platform.resolvedExecutable; final proc = Process.runSync(exec, args, runInShell: true); @@ -64,13 +61,30 @@ Map parseExtraMethods(String filename) { void mergeExtraMethods(String filename, Map extraMethods) { final out = StringBuffer(); + String? pendingClass; + String? pendingExtra; + for (final line in File(filename).readAsLinesSync()) { out.writeln(line); - final cls = parseClassDecl(line); - final extra = cls == null ? null : extraMethods[cls]; - if (cls != null && extra != null) { - out.writeln(extra); - extraMethods.remove(cls); + if (pendingClass != null) { + if (line.contains('{')) { + out.writeln(pendingExtra); + pendingClass = null; + pendingExtra = null; + } + } else { + final cls = parseClassDecl(line); + final extra = cls == null ? null : extraMethods[cls]; + if (cls != null && extra != null) { + if (line.contains('{')) { + out.writeln(extra); + extraMethods.remove(cls); + } else { + pendingClass = cls; + pendingExtra = extra; + extraMethods.remove(cls); + } + } } } assert(extraMethods.isEmpty); @@ -78,8 +92,513 @@ void mergeExtraMethods(String filename, Map extraMethods) { File(filename).writeAsStringSync(out.toString()); } -List writeBuiltInTypes(String config, String out) { - final yaml = loadYaml(File(config).readAsStringSync()) as YamlMap; +String renameRuntimeFunction(String name) { + const custom = { + 'objc_retain': 'objectRetain', + 'objc_retainBlock': 'blockRetain', + 'objc_release': 'objectRelease', + 'objc_autorelease': 'objectAutorelease', + 'objc_msgSend_fpret': 'msgSendFpret', + 'objc_msgSend_stret': 'msgSendStret', + 'object_getClass': 'getObjectClass', + 'protocol_getName': 'getProtocolName', + }; + if (custom.containsKey(name)) return custom[name]!; + for (final prefix in ['sel_', 'objc_', 'protocol_', 'object_']) { + if (name.startsWith(prefix)) { + return name.substring(prefix.length); + } + } + return name; +} + +String renameInterface(String name) => + name.startsWith('DOBJCDart') ? name.substring(5) : name; + +String renameProtocol(String name) => + name == 'NSObject' ? 'NSObjectProtocol' : name; + +String renameStruct(String name) => name.startsWith('__') + ? name.substring(2) + : (name.startsWith('_') ? name.substring(1) : name); + +void generateRuntimeBindings(Uri root) { + const functions = { + 'object_getClass', + 'sel_registerName', + 'sel_getName', + 'protocol_getMethodDescription', + 'protocol_getName', + }; + + const globals = { + 'NSKeyValueChangeIndexesKey', + 'NSKeyValueChangeKindKey', + 'NSKeyValueChangeNewKey', + 'NSKeyValueChangeNotificationIsPriorKey', + 'NSKeyValueChangeOldKey', + 'NSLocalizedDescriptionKey', + }; + + FfiGenerator( + input: Input(entryPoints: [root.resolve('src/objective_c_runtime.h')]), + visitors: [ + Visitor.callback( + visitFunc: (node) { + final isObjc = node.originalName.startsWith('objc_'); + if (!isObjc && !functions.contains(node.originalName)) { + node.isIncluded = false; + return; + } + node.isIncluded = true; + if (!node.originalName.startsWith('objc_msgSend')) { + node.isLeaf = true; + } + node.name = renameRuntimeFunction(node.originalName); + }, + visitGlobal: (node) { + if (node.originalName.startsWith('_') && + node.originalName.endsWith('Block')) { + node.isIncluded = true; + node.name = node.originalName.substring(1); + } else if (globals.contains(node.originalName)) { + node.isIncluded = true; + if (node.originalName.startsWith('_')) { + node.name = node.originalName.substring(1); + } + } else { + node.isIncluded = false; + } + }, + visitStruct: (node) { + if (node.originalName.startsWith('_ObjC')) { + node.isIncluded = true; + node.name = 'ObjC${node.originalName.substring(5)}'; + } + }, + visitEnum: (node) => node.isIncluded = false, + visitMacroConstant: (node) => node.isIncluded = false, + visitUnnamedEnumConstant: (node) => node.isIncluded = false, + visitUnion: (node) => node.isIncluded = false, + ), + ], + output: Output( + preamble: ''' +// 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. + +// Bindings for `src/objective_c_runtime.h`. +// Regenerate bindings with `dart run tool/generate_code.dart`. + +// ignore_for_file: always_specify_types +// ignore_for_file: camel_case_types +// ignore_for_file: non_constant_identifier_names +// ignore_for_file: unused_element +// coverage:ignore-file +''', + style: const NativeExternalBindings(), + dartFile: root.resolve(runtimeBindings), + ), + ).generate(); +} + +void generateCBindings(Uri root) { + const structs = {'_ObjCBlockDesc', '_ObjCBlockImpl', '_ObjCObjectImpl'}; + + const nonLeaf = { + 'DOBJC_deleteFinalizableHandle', + 'DOBJC_disposeObjCBlockWithClosure', + 'DOBJC_newFinalizableBool', + 'DOBJC_newFinalizableHandle', + 'DOBJC_awaitWaiter', + }; + + FfiGenerator( + input: Input( + entryPoints: [ + root.resolve('src/include/dart_api_dl.h'), + root.resolve('src/objective_c.h'), + root.resolve('src/os_version.h'), + ], + ), + visitors: [ + Visitor.callback( + visitFunc: (node) { + final isDobjc = node.originalName.startsWith('DOBJC_'); + final isNewFinalizable = node.originalName == 'newFinalizableHandle'; + if (!isDobjc && !isNewFinalizable) { + node.isIncluded = false; + return; + } + node.isIncluded = true; + if (!nonLeaf.contains(node.originalName)) { + node.isLeaf = true; + } + if (isDobjc) { + node.name = node.originalName.substring(6); + } + }, + visitTypealias: (node) { + if (node.originalName == 'Dart_FinalizableHandle') { + node.isIncluded = true; + } + }, + visitStruct: (node) { + if (node.originalName == '_DOBJC_Context') { + node.isIncluded = true; + node.name = 'DOBJC_Context'; + } else if (node.originalName == '_Dart_FinalizableHandle') { + node.isIncluded = true; + node.name = 'Dart_FinalizableHandle_'; + } else if (structs.contains(node.originalName)) { + node.isIncluded = true; + node.name = 'ObjC${node.originalName.substring(5)}'; + } else { + node.isIncluded = false; + } + }, + visitMacroConstant: (node) { + if (node.originalName == 'ILLEGAL_PORT') { + node.isIncluded = true; + } else { + node.isIncluded = false; + } + }, + visitEnum: (node) => node.isIncluded = false, + visitGlobal: (node) => node.isIncluded = false, + visitUnnamedEnumConstant: (node) => node.isIncluded = false, + visitUnion: (node) => node.isIncluded = false, + ), + ], + output: Output( + preamble: ''' +// 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. + +// Bindings for `src/objective_c.h` etc. +// Regenerate bindings with `dart run tool/generate_code.dart`. + +// coverage:ignore-file +''', + style: const NativeExternalBindings( + assetId: 'package:objective_c/objective_c.dylib', + ), + dartFile: root.resolve(cBindings), + ), + ).generate(); +} + +void generateObjCBindings(Uri root) { + const interfaces = { + 'DOBJCDartInputStreamAdapter', + 'DOBJCDartInputStreamAdapterWeakHolder', + 'DOBJCObservation', + 'DOBJCDartProtocolBuilder', + 'DOBJCDartProtocol', + 'NSArray', + 'NSAttributedString', + 'NSAttributedStringMarkdownParsingOptions', + 'NSBundle', + 'NSCharacterSet', + 'NSCoder', + 'NSData', + 'NSDate', + 'NSDictionary', + 'NSEnumerator', + 'NSError', + 'NSIndexSet', + 'NSInputStream', + 'NSInvocation', + 'NSItemProvider', + 'NSLocale', + 'NSMethodSignature', + 'NSMutableArray', + 'NSMutableData', + 'NSMutableDictionary', + 'NSMutableIndexSet', + 'NSMutableOrderedSet', + 'NSMutableSet', + 'NSMutableString', + 'NSNotification', + 'NSNull', + 'NSNumber', + 'NSObject', + 'NSOutputStream', + 'NSOrderedCollectionChange', + 'NSOrderedCollectionDifference', + 'NSOrderedSet', + 'NSPort', + 'NSPortMessage', + 'NSProgress', + 'NSRunLoop', + 'NSSet', + 'NSStream', + 'NSString', + 'NSTimer', + 'NSURL', + 'NSURLHandle', + 'NSValue', + 'Protocol', + }; + + const protocols = { + 'NSCoding', + 'NSCopying', + 'NSFastEnumeration', + 'NSItemProviderReading', + 'NSItemProviderWriting', + 'NSMutableCopying', + 'NSObject', + 'NSPortDelegate', + 'NSSecureCoding', + 'NSStreamDelegate', + 'NSURLHandleClient', + 'Observer', + }; + + const categories = { + 'NSDataCreation', + 'NSExtendedArray', + 'NSExtendedData', + 'NSExtendedDate', + 'NSExtendedDictionary', + 'NSExtendedEnumerator', + 'NSExtendedMutableArray', + 'NSExtendedMutableData', + 'NSExtendedMutableDictionary', + 'NSExtendedMutableOrderedSet', + 'NSExtendedMutableSet', + 'NSExtendedOrderedSet', + 'NSExtendedSet', + 'NSNumberCreation', + 'NSNumberIsFloat', + 'NSNumberIsBool', + 'NSStringExtensionMethods', + }; + + const structs = { + 'AEDesc', + '__CFRunLoop', + '__CFString', + 'CGPoint', + '_CGPoint', + 'CGRect', + '_CGRect', + 'CGSize', + '_CGSize', + 'NSEdgeInsets', + '_NSEdgeInsets', + 'NSFastEnumerationState', + '_NSFastEnumerationState', + '_NSRange', + 'NSRange', + '_NSZone', + 'NSZone', + 'OpaqueAEDataStorageType', + }; + + const enums = { + 'NSAppleEventSendOptions', + 'NSAttributedStringEnumerationOptions', + 'NSAttributedStringFormattingOptions', + 'NSAttributedStringMarkdownInterpretedSyntax', + 'NSAttributedStringMarkdownParsingFailurePolicy', + 'NSBinarySearchingOptions', + 'NSCollectionChangeType', + 'NSComparisonResult', + 'NSDataBase64DecodingOptions', + 'NSDataBase64EncodingOptions', + 'NSDataCompressionAlgorithm', + 'NSDataReadingOptions', + 'NSDataSearchOptions', + 'NSDataWritingOptions', + 'NSDecodingFailurePolicy', + 'NSEnumerationOptions', + 'NSItemProviderFileOptions', + 'NSItemProviderRepresentationVisibility', + 'NSKeyValueChange', + 'NSKeyValueObservingOptions', + 'NSKeyValueSetMutationKind', + 'NSLinguisticTaggerOptions', + 'NSLocaleLanguageDirection', + 'NSOrderedCollectionDifferenceCalculationOptions', + 'NSPropertyListFormat', + 'NSQualityOfService', + 'NSSortOptions', + 'NSStreamEvent', + 'NSStreamStatus', + 'NSStringCompareOptions', + 'NSStringEncodingConversionOptions', + 'NSStringEnumerationOptions', + 'NSURLBookmarkCreationOptions', + 'NSURLBookmarkResolutionOptions', + 'NSURLHandleStatus', + }; + + FfiGenerator( + input: Input( + entryPoints: [ + root.resolve('src/foundation.h'), + root.resolve('src/input_stream_adapter.h'), + root.resolve('src/ns_number.h'), + root.resolve('src/observer.h'), + root.resolve('src/protocol.h'), + ], + ), + objectiveC: ObjectiveC( + // ignore: deprecated_member_use, deprecated_member_use_from_same_package + generateForPackageObjectiveC: true, + externalVersions: ExternalVersions( + ios: Versions(min: Version(12, 0, 0)), + macos: Versions(min: Version(10, 14, 0)), + ), + ), + visitors: [ + Visitor.callback( + visitFunc: (node) => node.isIncluded = false, + visitObjCInterface: (node) { + node.includeCategories = false; + if (interfaces.contains(node.originalName)) { + node.isIncluded = true; + node.name = renameInterface(node.originalName); + } else { + node.isIncluded = false; + } + if (node.originalName == 'NSBundle') { + for (final method in node.methods) { + if (method.originalName == + 'localizedStringForKey:value:table:localizations:') { + method.isIncluded = false; + } + } + } + }, + visitObjCProtocol: (node) { + if (protocols.contains(node.originalName)) { + node.isIncluded = true; + node.name = renameProtocol(node.originalName); + } else { + node.isIncluded = false; + } + }, + visitObjCCategory: (node) { + node.isIncluded = categories.contains(node.originalName); + }, + visitStruct: (node) { + node.dependencies = CompoundDependencies.opaque; + if (node.originalName.isNotEmpty && + structs.contains(node.originalName)) { + node.isIncluded = true; + node.name = renameStruct(node.originalName); + } else { + node.isIncluded = false; + } + }, + visitEnum: (node) { + node.isIncluded = enums.contains(node.originalName); + }, + visitTypealias: (node) { + if (node.originalName == 'CFStringRef') { + node.isIncluded = true; + } else { + node.isIncluded = false; + } + }, + visitGlobal: (node) => node.isIncluded = false, + visitMacroConstant: (node) => node.isIncluded = false, + visitUnnamedEnumConstant: (node) => node.isIncluded = false, + visitUnion: (node) => node.isIncluded = false, + ), + ], + output: Output( + preamble: ''' +// 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. + +// Bindings for package:objective_c's ObjC code and the Foundation framework. +// Regenerate bindings with `dart run tool/generate_code.dart`. + +// coverage:ignore-file +''', + format: false, + style: const NativeExternalBindings( + assetId: 'package:objective_c/objective_c.dylib', + ), + dartFile: root.resolve(objcBindings), + objectiveCFile: root.resolve('src/objective_c_bindings_generated.m'), + ), + ).generate(); + + mergeExtraMethods(objcBindings, parseExtraMethods(extraMethodsFile)); + + print('Generating objc_built_in_types.dart...'); + final exports = writeBuiltInTypes( + builtInTypes, + objcBindings, + interfaces: interfaces, + structs: structs, + protocols: protocols, + ); + + print('Generating objc_bindings_exported.dart...'); + writeExports(exports, objcExports); +} + +List writeBuiltInTypes( + String out, + String bindingsFile, { + required Set interfaces, + required Set structs, + required Set protocols, +}) { + final bindingsLines = File(bindingsFile).readAsLinesSync(); + Set findBindings(RegExp re) => bindingsLines + .map(re.firstMatch) + .nonNulls + .map((match) => match[1]!) + .toSet(); + + final genInterfaces = findBindings( + RegExp(r'^extension type ([^_]\w*)\._\( *objc\.ObjCObject '), + ).toList()..sort(); + final genStructs = findBindings( + RegExp(r'^final class (\w+) extends ffi\.(Struct|Opaque)'), + ).toList()..sort(); + final genEnums = findBindings( + RegExp(r'^(?:enum|sealed class) (\w+) {'), + ).toList()..sort(); + final genProtocols = findBindings( + RegExp(r'^extension type ([^_]\w*)\._\(objc\.ObjCProtocol '), + ).toList()..sort(); + final genCategories = findBindings( + RegExp(r'^extension (\w+) on \w+ {'), + ).toList()..sort(); + final genAllExtensions = findBindings( + RegExp(r'^extension (?!type\b)([\w\$]+)'), + ).toSet(); + + final interfacesMap = { + for (final name in genInterfaces) + interfaces.firstWhere( + (i) => renameInterface(i) == name, + orElse: () => name, + ): name, + }; + final structsMap = { + for (final name in genStructs) + structs.firstWhere((s) => renameStruct(s) == name, orElse: () => name): + name, + }; + final protocolsMap = { + for (final name in genProtocols) + protocols.firstWhere( + (p) => renameProtocol(p) == name, + orElse: () => name, + ): name, + }; final s = StringBuffer(); final exports = {}; @@ -92,20 +611,24 @@ List writeBuiltInTypes(String config, String out) { // Generated by package:objective_c's tool/generate_code.dart. '''); - Iterable writeDecls(String name, String key) { - final decls = yaml[key] as YamlMap; - final renames = decls['rename'] as YamlMap? ?? YamlMap(); - final includes = decls['include'] as YamlList; - - final names = { - for (final inc in includes.map((i) => i as String)) - inc: renames[inc] as String? ?? inc, - }; - exports.addAll(names.values); - final anyRenames = names.entries.any((kv) => kv.key != kv.value); + void writeDecls( + String name, + Map namesMap, [ + Iterable? namesIterable, + ]) { + final keys = namesIterable ?? namesMap.keys; + final map = namesIterable != null + ? {for (final k in keys) k: k} + : Map.from(namesMap); + exports.addAll(map.values); + final anyRenames = map.entries.any((kv) => kv.key != kv.value); final elements = anyRenames - ? names.entries.map((kv) => " '${kv.key}': '${kv.value}',") - : names.keys.map((key) => " '$key',"); + ? map.entries.map( + (kv) => + " '${kv.key.replaceAll(r'$', r'\$')}': " + "'${kv.value.replaceAll(r'$', r'\$')}',", + ) + : map.keys.map((key) => " '${key.replaceAll(r'$', r'\$')}',"); s.write(''' @@ -113,17 +636,22 @@ const $name = { ${elements.join('\n')} }; '''); - return names.values; } - final interfaces = writeDecls('objCBuiltInInterfaces', 'objc-interfaces'); - exports.addAll([for (final name in interfaces) '$name\$Methods']); - writeDecls('objCBuiltInCompounds', 'structs'); - writeDecls('objCBuiltInEnums', 'enums'); - final protocols = writeDecls('objCBuiltInProtocols', 'objc-protocols'); - exports.addAll([for (final name in protocols) '$name\$Methods']); - exports.addAll([for (final name in protocols) '$name\$Builder']); - writeDecls('objCBuiltInCategories', 'objc-categories'); + writeDecls('objCBuiltInInterfaces', interfacesMap); + exports.addAll([ + for (final name in interfacesMap.values) + if (genAllExtensions.contains('$name\$Methods')) '$name\$Methods', + ]); + writeDecls('objCBuiltInCompounds', structsMap); + writeDecls('objCBuiltInEnums', {}, genEnums); + writeDecls('objCBuiltInProtocols', protocolsMap); + exports.addAll([ + for (final name in protocolsMap.values) + if (genAllExtensions.contains('$name\$Methods')) '$name\$Methods', + ]); + exports.addAll([for (final name in protocolsMap.values) '$name\$Builder']); + writeDecls('objCBuiltInCategories', {}, genCategories); File(out).writeAsStringSync(s.toString()); @@ -145,21 +673,19 @@ export 'objective_c_bindings_generated.dart' } Future run({required bool format}) async { + final pkgUri = await Isolate.resolvePackageUri( + Uri.parse('package:objective_c/objective_c.dart'), + ); + final root = (pkgUri ?? Platform.script).resolve('../'); + print('Generating runtime bindings...'); - await ffigen.main([...ffigenFlags, runtimeConfig]); + generateRuntimeBindings(root); print('Generating C bindings...'); - await ffigen.main([...ffigenFlags, cConfig]); + generateCBindings(root); print('Generating ObjC bindings...'); - await ffigen.main([...ffigenFlags, objcConfig]); - mergeExtraMethods(objcBindings, parseExtraMethods(extraMethodsFile)); - - print('Generating objc_built_in_types.dart...'); - final exports = writeBuiltInTypes(objcConfig, builtInTypes); - - print('Generating objc_bindings_exported.dart...'); - writeExports(exports, objcExports); + generateObjCBindings(root); if (format) { print('Formatting bindings...'); diff --git a/pkgs/swiftgen/example/generate_code.dart b/pkgs/swiftgen/example/generate_code.dart index f85b532e19..b0bd019747 100644 --- a/pkgs/swiftgen/example/generate_code.dart +++ b/pkgs/swiftgen/example/generate_code.dart @@ -46,10 +46,14 @@ Future main() async { ios: fg.Versions(min: Version(12, 0, 0)), macos: fg.Versions(min: Version(10, 14, 0)), ), - interfaces: fg.Interfaces( - include: (decl) => decl.originalName == 'AVAudioPlayerWrapper', - ), ), + visitors: [ + fg.Visitor.callback( + visitObjCInterface: (node) { + node.isIncluded = node.originalName == 'AVAudioPlayerWrapper'; + }, + ), + ], ), ).generate(logger: logger, tempDirectory: Uri.directory('temp')); diff --git a/pkgs/swiftgen/lib/src/config.dart b/pkgs/swiftgen/lib/src/config.dart index d2ff5f86c0..f035e0ffbc 100644 --- a/pkgs/swiftgen/lib/src/config.dart +++ b/pkgs/swiftgen/lib/src/config.dart @@ -216,46 +216,14 @@ class SwiftModuleInput implements SwiftGenInput { /// Selected options from [ffigen.FfiGenerator]. class FfiGeneratorOptions { - /// [ffigen.FfiGenerator.functions] - final ffigen.Functions functions; - - /// [ffigen.FfiGenerator.structs] - final ffigen.Structs structs; - - /// [ffigen.FfiGenerator.unions] - final ffigen.Unions unions; - - /// [ffigen.FfiGenerator.enums] - final ffigen.Enums enums; - - /// [ffigen.FfiGenerator.unnamedEnums] - final ffigen.UnnamedEnums unnamedEnums; - - /// [ffigen.FfiGenerator.globals] - final ffigen.Globals globals; - - /// Configuration for integer types. - final ffigen.Integers integers; - - /// [ffigen.FfiGenerator.macros] - final ffigen.Macros macros; - - /// [ffigen.FfiGenerator.typedefs] - final ffigen.Typedefs typedefs; + /// User custom visitors to modify/filter AST elements. + final List visitors; /// [ffigen.FfiGenerator.objectiveC] final ffigen.ObjectiveC objectiveC; const FfiGeneratorOptions({ - this.functions = ffigen.Functions.excludeAll, - this.structs = ffigen.Structs.excludeAll, - this.unions = ffigen.Unions.excludeAll, - this.enums = ffigen.Enums.excludeAll, - this.unnamedEnums = ffigen.UnnamedEnums.excludeAll, - this.globals = ffigen.Globals.excludeAll, - this.integers = const ffigen.Integers(), - this.macros = ffigen.Macros.excludeAll, - this.typedefs = ffigen.Typedefs.excludeAll, + this.visitors = const [], this.objectiveC = const ffigen.ObjectiveC(), }); } diff --git a/pkgs/swiftgen/lib/src/generator.dart b/pkgs/swiftgen/lib/src/generator.dart index 53f3a20b61..70219d05be 100644 --- a/pkgs/swiftgen/lib/src/generator.dart +++ b/pkgs/swiftgen/lib/src/generator.dart @@ -78,8 +78,6 @@ extension SwiftGenGenerator on SwiftGenerator { ], absTempDir); void _generateDartFile(Logger logger, String objcHeader) { - final interfaces = ffigen.objectiveC.interfaces; - final protocols = ffigen.objectiveC.protocols; fg.FfiGenerator( output: fg.Output( dartFile: output.dartFile, @@ -87,40 +85,23 @@ extension SwiftGenGenerator on SwiftGenerator { preamble: output.preamble, style: fg.NativeExternalBindings(assetId: output.assetId), ), - functions: ffigen.functions, - structs: ffigen.structs, - unions: ffigen.unions, - enums: ffigen.enums, - unnamedEnums: ffigen.unnamedEnums, - globals: ffigen.globals, - integers: ffigen.integers, - macros: ffigen.macros, - typedefs: ffigen.typedefs, - objectiveC: fg.ObjectiveC( - interfaces: fg.Interfaces( - include: interfaces.include, - includeMember: interfaces.includeMember, - rename: interfaces.rename, - renameMember: interfaces.renameMember, - includeTransitive: interfaces.includeTransitive, - module: interfaces.module != fg.Interfaces.noModule - ? interfaces.module - : (_) => output.module, + objectiveC: ffigen.objectiveC, + visitors: [ + fg.Visitor.callback( + visitObjCInterface: (node) { + if (!node.originalName.startsWith('_')) { + node.module ??= output.module; + } + }, + visitObjCProtocol: (node) { + if (!node.originalName.startsWith('_')) { + node.module ??= output.module; + } + }, ), - protocols: fg.Protocols( - include: protocols.include, - includeMember: protocols.includeMember, - rename: protocols.rename, - renameMember: protocols.renameMember, - includeTransitive: protocols.includeTransitive, - module: protocols.module != fg.Protocols.noModule - ? protocols.module - : (_) => output.module, - ), - categories: ffigen.objectiveC.categories, - externalVersions: ffigen.objectiveC.externalVersions, - ), - headers: fg.Headers( + ...ffigen.visitors, + ], + input: fg.Input( entryPoints: [Uri.file(objcHeader)], compilerOptions: [ ...fg.defaultCompilerOpts(logger), diff --git a/pkgs/swiftgen/test/integration/util.dart b/pkgs/swiftgen/test/integration/util.dart index 790ed60c0e..d8d7b17e8d 100644 --- a/pkgs/swiftgen/test/integration/util.dart +++ b/pkgs/swiftgen/test/integration/util.dart @@ -60,7 +60,10 @@ class TestGenerator { inputs: [ isObjCCompatible ? ObjCCompatibleSwiftFileInput(files: [Uri.file(inputFile)]) - : SwiftFileInput(files: [Uri.file(inputFile)]), + : SwiftFileInput( + files: [Uri.file(inputFile)], + tempModuleName: name, + ), ], output: Output( swiftWrapperFile: isObjCCompatible @@ -78,14 +81,16 @@ class TestGenerator { ''', ), ffigen: FfiGeneratorOptions( - objectiveC: fg.ObjectiveC( - interfaces: fg.Interfaces( - include: (decl) => decl.originalName.startsWith('Test'), + visitors: [ + fg.Visitor.callback( + visitObjCInterface: (node) { + node.isIncluded = node.originalName.startsWith('Test'); + }, + visitObjCProtocol: (node) { + node.isIncluded = node.originalName.startsWith('Test'); + }, ), - protocols: fg.Protocols( - include: (decl) => decl.originalName.startsWith('Test'), - ), - ), + ], ), ).generate( logger: Logger.root..level = Level.SEVERE,