diff --git a/CHANGELOG.md b/CHANGELOG.md
index 82edf93..47b2a05 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,9 @@
+# 4.0.0-dev.2
+- Added config key `functions -> expose-typedefs` to expose the typedef
+to Native and Dart type.
+- Config key `function`->`symbol-address` no longer exposes the typedef
+to Native type. Use `expose-typedefs` to get the native type.
+
 # 4.0.0-dev.1
 - This package now targets package:lints for the generated code. The generated
 code uses C symbol names as is. Use either `// ignore_for_file: lintRule1, lintRule2`
diff --git a/README.md b/README.md
index 5fc7822..e89ceb2 100644
--- a/README.md
+++ b/README.md
@@ -188,7 +188,7 @@
     - Include/Exclude declarations.<br>
     - Rename declarations.<br>
     - Rename enum and struct members.<br>
-    - Expose symbol-address and typedef for functions and globals.<br>
+    - Expose symbol-address for functions and globals.<br>
     </td>
     <td>
 
@@ -210,7 +210,7 @@
     # Removes '_' from beginning.
     '_(.*)': '$1'
   symbol-address:
-    # Used to expose symbol and typedef.
+    # Used to expose symbol address.
     include:
       - myFunc
 structs:
@@ -269,6 +269,29 @@
   </td>
   </tr>
   <tr>
+    <td>functions -> expose-typedefs</td>
+    <td>Generate the typedefs to Native and Dart type of a function<br>
+    <b>Default: Inline types are used and no typedefs to Native/Dart
+    type are generated.</b>
+    </td>
+    <td>
+
+```yaml
+functions:
+  expose-typedefs:
+    include:
+      # Match function name.
+      - 'myFunc'
+       # Do this to expose types for all function.
+      - '.*'
+    exclude:
+      # If you only use exclude, then everything
+      # not excluded is generated.
+      - 'dispose'
+```
+  </td>
+  </tr>
+  <tr>
     <td>structs -> pack</td>
     <td>Override the @Packed(X) annotation for generated structs.<br><br>
     <i>Options - none, 1, 2, 4, 8, 16</i><br>
@@ -527,18 +550,38 @@
   dependency-only: opaque
 ```
 
-### How to expose the native pointers and typedefs?
+### How to expose the native pointers?
 
-By default all native pointers and typedefs are hidden, but you can use the
-`symbol-address` subkey for functions/globals and make them public by matching with its name. The pointers are then accesible via `nativeLibrary.addresses` and the native typedef are prefixed with `Native_`.
+By default the native pointers are private, but you can use the
+`symbol-address` subkey for functions/globals and make them public by matching with its name. The pointers are then accesible via `nativeLibrary.addresses`.
 
 Example -
 ```yaml
 functions:
   symbol-address:
     include:
-      - 'myFunc'
-      - '.*' # Do this to expose all pointers.
+      - 'myFunc' # Match function name.
+      - '.*' # Do this to expose all function pointers.
+    exclude: # If you only use exclude, then everything not excluded is generated.
+      - 'dispose'
+```
+
+### How to get typedefs to Native and Dart type of a function?
+
+By default these types are inline. But you can use the `expose-typedef` subkey
+for functions to generate them. This will expose the Native and Dart type.
+E.g - for a function named `hello`, the generated typedefs are named
+as `NativeHello` and `DartHello`.
+
+Example -
+```yaml
+functions:
+  expose-typedefs:
+    include:
+      - 'myFunc' # Match function name.
+      - '.*' # Do this to expose types for all function.
+    exclude: # If you only use exclude, then everything not excluded is generated.
+      - 'dispose'
 ```
 
 ### How are Structs/Unions/Enums that are reffered to via typedefs handled?
diff --git a/example/libclang-example/generated_bindings.dart b/example/libclang-example/generated_bindings.dart
index f77c7e6..1c7c15b 100644
--- a/example/libclang-example/generated_bindings.dart
+++ b/example/libclang-example/generated_bindings.dart
@@ -35,9 +35,9 @@
   }
 
   late final _clang_getCStringPtr =
-      _lookup<ffi.NativeFunction<Native_clang_getCString>>('clang_getCString');
-  late final _clang_getCString = _clang_getCStringPtr
-      .asFunction<ffi.Pointer<ffi.Int8> Function(CXString)>();
+      _lookup<ffi.NativeFunction<NativeClang_getCString>>('clang_getCString');
+  late final _clang_getCString =
+      _clang_getCStringPtr.asFunction<DartClang_getCString>();
 
   /// Free the given string.
   void clang_disposeString(
@@ -49,10 +49,10 @@
   }
 
   late final _clang_disposeStringPtr =
-      _lookup<ffi.NativeFunction<Native_clang_disposeString>>(
+      _lookup<ffi.NativeFunction<NativeClang_disposeString>>(
           'clang_disposeString');
   late final _clang_disposeString =
-      _clang_disposeStringPtr.asFunction<void Function(CXString)>();
+      _clang_disposeStringPtr.asFunction<DartClang_disposeString>();
 
   /// Free the given string set.
   void clang_disposeStringSet(
@@ -64,10 +64,10 @@
   }
 
   late final _clang_disposeStringSetPtr =
-      _lookup<ffi.NativeFunction<Native_clang_disposeStringSet>>(
+      _lookup<ffi.NativeFunction<NativeClang_disposeStringSet>>(
           'clang_disposeStringSet');
-  late final _clang_disposeStringSet = _clang_disposeStringSetPtr
-      .asFunction<void Function(ffi.Pointer<CXStringSet>)>();
+  late final _clang_disposeStringSet =
+      _clang_disposeStringSetPtr.asFunction<DartClang_disposeStringSet>();
 
   /// Provides a shared context for creating translation units.
   ///
@@ -118,10 +118,9 @@
   }
 
   late final _clang_createIndexPtr =
-      _lookup<ffi.NativeFunction<Native_clang_createIndex>>(
-          'clang_createIndex');
+      _lookup<ffi.NativeFunction<NativeClang_createIndex>>('clang_createIndex');
   late final _clang_createIndex =
-      _clang_createIndexPtr.asFunction<CXIndex Function(int, int)>();
+      _clang_createIndexPtr.asFunction<DartClang_createIndex>();
 
   /// Destroy the given index.
   ///
@@ -136,10 +135,10 @@
   }
 
   late final _clang_disposeIndexPtr =
-      _lookup<ffi.NativeFunction<Native_clang_disposeIndex>>(
+      _lookup<ffi.NativeFunction<NativeClang_disposeIndex>>(
           'clang_disposeIndex');
   late final _clang_disposeIndex =
-      _clang_disposeIndexPtr.asFunction<void Function(CXIndex)>();
+      _clang_disposeIndexPtr.asFunction<DartClang_disposeIndex>();
 
   /// Sets general options associated with a CXIndex.
   ///
@@ -163,11 +162,11 @@
   }
 
   late final _clang_CXIndex_setGlobalOptionsPtr =
-      _lookup<ffi.NativeFunction<Native_clang_CXIndex_setGlobalOptions>>(
+      _lookup<ffi.NativeFunction<NativeClang_CXIndex_setGlobalOptions>>(
           'clang_CXIndex_setGlobalOptions');
   late final _clang_CXIndex_setGlobalOptions =
       _clang_CXIndex_setGlobalOptionsPtr
-          .asFunction<void Function(CXIndex, int)>();
+          .asFunction<DartClang_CXIndex_setGlobalOptions>();
 
   /// Gets the general options associated with a CXIndex.
   ///
@@ -182,10 +181,11 @@
   }
 
   late final _clang_CXIndex_getGlobalOptionsPtr =
-      _lookup<ffi.NativeFunction<Native_clang_CXIndex_getGlobalOptions>>(
+      _lookup<ffi.NativeFunction<NativeClang_CXIndex_getGlobalOptions>>(
           'clang_CXIndex_getGlobalOptions');
   late final _clang_CXIndex_getGlobalOptions =
-      _clang_CXIndex_getGlobalOptionsPtr.asFunction<int Function(CXIndex)>();
+      _clang_CXIndex_getGlobalOptionsPtr
+          .asFunction<DartClang_CXIndex_getGlobalOptions>();
 
   /// Sets the invocation emission path option in a CXIndex.
   ///
@@ -204,11 +204,11 @@
 
   late final _clang_CXIndex_setInvocationEmissionPathOptionPtr = _lookup<
           ffi.NativeFunction<
-              Native_clang_CXIndex_setInvocationEmissionPathOption>>(
+              NativeClang_CXIndex_setInvocationEmissionPathOption>>(
       'clang_CXIndex_setInvocationEmissionPathOption');
   late final _clang_CXIndex_setInvocationEmissionPathOption =
       _clang_CXIndex_setInvocationEmissionPathOptionPtr
-          .asFunction<void Function(CXIndex, ffi.Pointer<ffi.Int8>)>();
+          .asFunction<DartClang_CXIndex_setInvocationEmissionPathOption>();
 
   /// Retrieve the complete file and path name of the given file.
   CXString clang_getFileName(
@@ -220,10 +220,9 @@
   }
 
   late final _clang_getFileNamePtr =
-      _lookup<ffi.NativeFunction<Native_clang_getFileName>>(
-          'clang_getFileName');
+      _lookup<ffi.NativeFunction<NativeClang_getFileName>>('clang_getFileName');
   late final _clang_getFileName =
-      _clang_getFileNamePtr.asFunction<CXString Function(CXFile)>();
+      _clang_getFileNamePtr.asFunction<DartClang_getFileName>();
 
   /// Retrieve the last modification time of the given file.
   int clang_getFileTime(
@@ -235,10 +234,9 @@
   }
 
   late final _clang_getFileTimePtr =
-      _lookup<ffi.NativeFunction<Native_clang_getFileTime>>(
-          'clang_getFileTime');
+      _lookup<ffi.NativeFunction<NativeClang_getFileTime>>('clang_getFileTime');
   late final _clang_getFileTime =
-      _clang_getFileTimePtr.asFunction<int Function(CXFile)>();
+      _clang_getFileTimePtr.asFunction<DartClang_getFileTime>();
 
   /// Retrieve the unique ID for the given \c file.
   ///
@@ -257,10 +255,10 @@
   }
 
   late final _clang_getFileUniqueIDPtr =
-      _lookup<ffi.NativeFunction<Native_clang_getFileUniqueID>>(
+      _lookup<ffi.NativeFunction<NativeClang_getFileUniqueID>>(
           'clang_getFileUniqueID');
-  late final _clang_getFileUniqueID = _clang_getFileUniqueIDPtr
-      .asFunction<int Function(CXFile, ffi.Pointer<CXFileUniqueID>)>();
+  late final _clang_getFileUniqueID =
+      _clang_getFileUniqueIDPtr.asFunction<DartClang_getFileUniqueID>();
 
   /// Determine whether the given header is guarded against
   /// multiple inclusions, either with the conventional
@@ -276,11 +274,11 @@
   }
 
   late final _clang_isFileMultipleIncludeGuardedPtr =
-      _lookup<ffi.NativeFunction<Native_clang_isFileMultipleIncludeGuarded>>(
+      _lookup<ffi.NativeFunction<NativeClang_isFileMultipleIncludeGuarded>>(
           'clang_isFileMultipleIncludeGuarded');
   late final _clang_isFileMultipleIncludeGuarded =
       _clang_isFileMultipleIncludeGuardedPtr
-          .asFunction<int Function(CXTranslationUnit, CXFile)>();
+          .asFunction<DartClang_isFileMultipleIncludeGuarded>();
 
   /// Retrieve a file handle within the given translation unit.
   ///
@@ -301,9 +299,8 @@
   }
 
   late final _clang_getFilePtr =
-      _lookup<ffi.NativeFunction<Native_clang_getFile>>('clang_getFile');
-  late final _clang_getFile = _clang_getFilePtr
-      .asFunction<CXFile Function(CXTranslationUnit, ffi.Pointer<ffi.Int8>)>();
+      _lookup<ffi.NativeFunction<NativeClang_getFile>>('clang_getFile');
+  late final _clang_getFile = _clang_getFilePtr.asFunction<DartClang_getFile>();
 
   /// Retrieve the buffer associated with the given file.
   ///
@@ -328,11 +325,10 @@
   }
 
   late final _clang_getFileContentsPtr =
-      _lookup<ffi.NativeFunction<Native_clang_getFileContents>>(
+      _lookup<ffi.NativeFunction<NativeClang_getFileContents>>(
           'clang_getFileContents');
-  late final _clang_getFileContents = _clang_getFileContentsPtr.asFunction<
-      ffi.Pointer<ffi.Int8> Function(
-          CXTranslationUnit, CXFile, ffi.Pointer<ffi.IntPtr>)>();
+  late final _clang_getFileContents =
+      _clang_getFileContentsPtr.asFunction<DartClang_getFileContents>();
 
   /// Returns non-zero if the \c file1 and \c file2 point to the same file,
   /// or they are both NULL.
@@ -347,10 +343,10 @@
   }
 
   late final _clang_File_isEqualPtr =
-      _lookup<ffi.NativeFunction<Native_clang_File_isEqual>>(
+      _lookup<ffi.NativeFunction<NativeClang_File_isEqual>>(
           'clang_File_isEqual');
   late final _clang_File_isEqual =
-      _clang_File_isEqualPtr.asFunction<int Function(CXFile, CXFile)>();
+      _clang_File_isEqualPtr.asFunction<DartClang_File_isEqual>();
 
   /// Returns the real path name of \c file.
   ///
@@ -364,10 +360,10 @@
   }
 
   late final _clang_File_tryGetRealPathNamePtr =
-      _lookup<ffi.NativeFunction<Native_clang_File_tryGetRealPathName>>(
+      _lookup<ffi.NativeFunction<NativeClang_File_tryGetRealPathName>>(
           'clang_File_tryGetRealPathName');
-  late final _clang_File_tryGetRealPathName =
-      _clang_File_tryGetRealPathNamePtr.asFunction<CXString Function(CXFile)>();
+  late final _clang_File_tryGetRealPathName = _clang_File_tryGetRealPathNamePtr
+      .asFunction<DartClang_File_tryGetRealPathName>();
 
   /// Retrieve a NULL (invalid) source location.
   CXSourceLocation clang_getNullLocation() {
@@ -375,10 +371,10 @@
   }
 
   late final _clang_getNullLocationPtr =
-      _lookup<ffi.NativeFunction<Native_clang_getNullLocation>>(
+      _lookup<ffi.NativeFunction<NativeClang_getNullLocation>>(
           'clang_getNullLocation');
   late final _clang_getNullLocation =
-      _clang_getNullLocationPtr.asFunction<CXSourceLocation Function()>();
+      _clang_getNullLocationPtr.asFunction<DartClang_getNullLocation>();
 
   /// Determine whether two source locations, which must refer into
   /// the same translation unit, refer to exactly the same point in the source
@@ -397,10 +393,10 @@
   }
 
   late final _clang_equalLocationsPtr =
-      _lookup<ffi.NativeFunction<Native_clang_equalLocations>>(
+      _lookup<ffi.NativeFunction<NativeClang_equalLocations>>(
           'clang_equalLocations');
-  late final _clang_equalLocations = _clang_equalLocationsPtr
-      .asFunction<int Function(CXSourceLocation, CXSourceLocation)>();
+  late final _clang_equalLocations =
+      _clang_equalLocationsPtr.asFunction<DartClang_equalLocations>();
 
   /// Retrieves the source location associated with a given file/line/column
   /// in a particular translation unit.
@@ -419,10 +415,9 @@
   }
 
   late final _clang_getLocationPtr =
-      _lookup<ffi.NativeFunction<Native_clang_getLocation>>(
-          'clang_getLocation');
-  late final _clang_getLocation = _clang_getLocationPtr.asFunction<
-      CXSourceLocation Function(CXTranslationUnit, CXFile, int, int)>();
+      _lookup<ffi.NativeFunction<NativeClang_getLocation>>('clang_getLocation');
+  late final _clang_getLocation =
+      _clang_getLocationPtr.asFunction<DartClang_getLocation>();
 
   /// Retrieves the source location associated with a given character offset
   /// in a particular translation unit.
@@ -439,10 +434,10 @@
   }
 
   late final _clang_getLocationForOffsetPtr =
-      _lookup<ffi.NativeFunction<Native_clang_getLocationForOffset>>(
+      _lookup<ffi.NativeFunction<NativeClang_getLocationForOffset>>(
           'clang_getLocationForOffset');
   late final _clang_getLocationForOffset = _clang_getLocationForOffsetPtr
-      .asFunction<CXSourceLocation Function(CXTranslationUnit, CXFile, int)>();
+      .asFunction<DartClang_getLocationForOffset>();
 
   /// Returns non-zero if the given source location is in a system header.
   int clang_Location_isInSystemHeader(
@@ -454,11 +449,11 @@
   }
 
   late final _clang_Location_isInSystemHeaderPtr =
-      _lookup<ffi.NativeFunction<Native_clang_Location_isInSystemHeader>>(
+      _lookup<ffi.NativeFunction<NativeClang_Location_isInSystemHeader>>(
           'clang_Location_isInSystemHeader');
   late final _clang_Location_isInSystemHeader =
       _clang_Location_isInSystemHeaderPtr
-          .asFunction<int Function(CXSourceLocation)>();
+          .asFunction<DartClang_Location_isInSystemHeader>();
 
   /// Returns non-zero if the given source location is in the main file of
   /// the corresponding translation unit.
@@ -471,10 +466,10 @@
   }
 
   late final _clang_Location_isFromMainFilePtr =
-      _lookup<ffi.NativeFunction<Native_clang_Location_isFromMainFile>>(
+      _lookup<ffi.NativeFunction<NativeClang_Location_isFromMainFile>>(
           'clang_Location_isFromMainFile');
   late final _clang_Location_isFromMainFile = _clang_Location_isFromMainFilePtr
-      .asFunction<int Function(CXSourceLocation)>();
+      .asFunction<DartClang_Location_isFromMainFile>();
 
   /// Retrieve a NULL (invalid) source range.
   CXSourceRange clang_getNullRange() {
@@ -482,10 +477,10 @@
   }
 
   late final _clang_getNullRangePtr =
-      _lookup<ffi.NativeFunction<Native_clang_getNullRange>>(
+      _lookup<ffi.NativeFunction<NativeClang_getNullRange>>(
           'clang_getNullRange');
   late final _clang_getNullRange =
-      _clang_getNullRangePtr.asFunction<CXSourceRange Function()>();
+      _clang_getNullRangePtr.asFunction<DartClang_getNullRange>();
 
   /// Retrieve a source range given the beginning and ending source
   /// locations.
@@ -500,9 +495,9 @@
   }
 
   late final _clang_getRangePtr =
-      _lookup<ffi.NativeFunction<Native_clang_getRange>>('clang_getRange');
-  late final _clang_getRange = _clang_getRangePtr
-      .asFunction<CXSourceRange Function(CXSourceLocation, CXSourceLocation)>();
+      _lookup<ffi.NativeFunction<NativeClang_getRange>>('clang_getRange');
+  late final _clang_getRange =
+      _clang_getRangePtr.asFunction<DartClang_getRange>();
 
   /// Determine whether two ranges are equivalent.
   ///
@@ -518,10 +513,9 @@
   }
 
   late final _clang_equalRangesPtr =
-      _lookup<ffi.NativeFunction<Native_clang_equalRanges>>(
-          'clang_equalRanges');
-  late final _clang_equalRanges = _clang_equalRangesPtr
-      .asFunction<int Function(CXSourceRange, CXSourceRange)>();
+      _lookup<ffi.NativeFunction<NativeClang_equalRanges>>('clang_equalRanges');
+  late final _clang_equalRanges =
+      _clang_equalRangesPtr.asFunction<DartClang_equalRanges>();
 
   /// Returns non-zero if \p range is null.
   int clang_Range_isNull(
@@ -533,10 +527,10 @@
   }
 
   late final _clang_Range_isNullPtr =
-      _lookup<ffi.NativeFunction<Native_clang_Range_isNull>>(
+      _lookup<ffi.NativeFunction<NativeClang_Range_isNull>>(
           'clang_Range_isNull');
   late final _clang_Range_isNull =
-      _clang_Range_isNullPtr.asFunction<int Function(CXSourceRange)>();
+      _clang_Range_isNullPtr.asFunction<DartClang_Range_isNull>();
 
   /// Retrieve the file, line, column, and offset represented by
   /// the given source location.
@@ -575,16 +569,10 @@
   }
 
   late final _clang_getExpansionLocationPtr =
-      _lookup<ffi.NativeFunction<Native_clang_getExpansionLocation>>(
+      _lookup<ffi.NativeFunction<NativeClang_getExpansionLocation>>(
           'clang_getExpansionLocation');
-  late final _clang_getExpansionLocation =
-      _clang_getExpansionLocationPtr.asFunction<
-          void Function(
-              CXSourceLocation,
-              ffi.Pointer<CXFile>,
-              ffi.Pointer<ffi.Uint32>,
-              ffi.Pointer<ffi.Uint32>,
-              ffi.Pointer<ffi.Uint32>)>();
+  late final _clang_getExpansionLocation = _clang_getExpansionLocationPtr
+      .asFunction<DartClang_getExpansionLocation>();
 
   /// Retrieve the file, line and column represented by the given source
   /// location, as specified in a # line directive.
@@ -639,12 +627,10 @@
   }
 
   late final _clang_getPresumedLocationPtr =
-      _lookup<ffi.NativeFunction<Native_clang_getPresumedLocation>>(
+      _lookup<ffi.NativeFunction<NativeClang_getPresumedLocation>>(
           'clang_getPresumedLocation');
   late final _clang_getPresumedLocation =
-      _clang_getPresumedLocationPtr.asFunction<
-          void Function(CXSourceLocation, ffi.Pointer<CXString>,
-              ffi.Pointer<ffi.Uint32>, ffi.Pointer<ffi.Uint32>)>();
+      _clang_getPresumedLocationPtr.asFunction<DartClang_getPresumedLocation>();
 
   /// Legacy API to retrieve the file, line, column, and offset represented
   /// by the given source location.
@@ -669,16 +655,11 @@
   }
 
   late final _clang_getInstantiationLocationPtr =
-      _lookup<ffi.NativeFunction<Native_clang_getInstantiationLocation>>(
+      _lookup<ffi.NativeFunction<NativeClang_getInstantiationLocation>>(
           'clang_getInstantiationLocation');
   late final _clang_getInstantiationLocation =
-      _clang_getInstantiationLocationPtr.asFunction<
-          void Function(
-              CXSourceLocation,
-              ffi.Pointer<CXFile>,
-              ffi.Pointer<ffi.Uint32>,
-              ffi.Pointer<ffi.Uint32>,
-              ffi.Pointer<ffi.Uint32>)>();
+      _clang_getInstantiationLocationPtr
+          .asFunction<DartClang_getInstantiationLocation>();
 
   /// Retrieve the file, line, column, and offset represented by
   /// the given source location.
@@ -717,16 +698,10 @@
   }
 
   late final _clang_getSpellingLocationPtr =
-      _lookup<ffi.NativeFunction<Native_clang_getSpellingLocation>>(
+      _lookup<ffi.NativeFunction<NativeClang_getSpellingLocation>>(
           'clang_getSpellingLocation');
   late final _clang_getSpellingLocation =
-      _clang_getSpellingLocationPtr.asFunction<
-          void Function(
-              CXSourceLocation,
-              ffi.Pointer<CXFile>,
-              ffi.Pointer<ffi.Uint32>,
-              ffi.Pointer<ffi.Uint32>,
-              ffi.Pointer<ffi.Uint32>)>();
+      _clang_getSpellingLocationPtr.asFunction<DartClang_getSpellingLocation>();
 
   /// Retrieve the file, line, column, and offset represented by
   /// the given source location.
@@ -766,15 +741,10 @@
   }
 
   late final _clang_getFileLocationPtr =
-      _lookup<ffi.NativeFunction<Native_clang_getFileLocation>>(
+      _lookup<ffi.NativeFunction<NativeClang_getFileLocation>>(
           'clang_getFileLocation');
-  late final _clang_getFileLocation = _clang_getFileLocationPtr.asFunction<
-      void Function(
-          CXSourceLocation,
-          ffi.Pointer<CXFile>,
-          ffi.Pointer<ffi.Uint32>,
-          ffi.Pointer<ffi.Uint32>,
-          ffi.Pointer<ffi.Uint32>)>();
+  late final _clang_getFileLocation =
+      _clang_getFileLocationPtr.asFunction<DartClang_getFileLocation>();
 
   /// Retrieve a source location representing the first character within a
   /// source range.
@@ -787,10 +757,10 @@
   }
 
   late final _clang_getRangeStartPtr =
-      _lookup<ffi.NativeFunction<Native_clang_getRangeStart>>(
+      _lookup<ffi.NativeFunction<NativeClang_getRangeStart>>(
           'clang_getRangeStart');
-  late final _clang_getRangeStart = _clang_getRangeStartPtr
-      .asFunction<CXSourceLocation Function(CXSourceRange)>();
+  late final _clang_getRangeStart =
+      _clang_getRangeStartPtr.asFunction<DartClang_getRangeStart>();
 
   /// Retrieve a source location representing the last character within a
   /// source range.
@@ -803,10 +773,9 @@
   }
 
   late final _clang_getRangeEndPtr =
-      _lookup<ffi.NativeFunction<Native_clang_getRangeEnd>>(
-          'clang_getRangeEnd');
-  late final _clang_getRangeEnd = _clang_getRangeEndPtr
-      .asFunction<CXSourceLocation Function(CXSourceRange)>();
+      _lookup<ffi.NativeFunction<NativeClang_getRangeEnd>>('clang_getRangeEnd');
+  late final _clang_getRangeEnd =
+      _clang_getRangeEndPtr.asFunction<DartClang_getRangeEnd>();
 
   /// Retrieve all ranges that were skipped by the preprocessor.
   ///
@@ -823,10 +792,10 @@
   }
 
   late final _clang_getSkippedRangesPtr =
-      _lookup<ffi.NativeFunction<Native_clang_getSkippedRanges>>(
+      _lookup<ffi.NativeFunction<NativeClang_getSkippedRanges>>(
           'clang_getSkippedRanges');
-  late final _clang_getSkippedRanges = _clang_getSkippedRangesPtr.asFunction<
-      ffi.Pointer<CXSourceRangeList> Function(CXTranslationUnit, CXFile)>();
+  late final _clang_getSkippedRanges =
+      _clang_getSkippedRangesPtr.asFunction<DartClang_getSkippedRanges>();
 
   /// Retrieve all ranges from all files that were skipped by the
   /// preprocessor.
@@ -842,10 +811,10 @@
   }
 
   late final _clang_getAllSkippedRangesPtr =
-      _lookup<ffi.NativeFunction<Native_clang_getAllSkippedRanges>>(
+      _lookup<ffi.NativeFunction<NativeClang_getAllSkippedRanges>>(
           'clang_getAllSkippedRanges');
-  late final _clang_getAllSkippedRanges = _clang_getAllSkippedRangesPtr
-      .asFunction<ffi.Pointer<CXSourceRangeList> Function(CXTranslationUnit)>();
+  late final _clang_getAllSkippedRanges =
+      _clang_getAllSkippedRangesPtr.asFunction<DartClang_getAllSkippedRanges>();
 
   /// Destroy the given \c CXSourceRangeList.
   void clang_disposeSourceRangeList(
@@ -857,10 +826,10 @@
   }
 
   late final _clang_disposeSourceRangeListPtr =
-      _lookup<ffi.NativeFunction<Native_clang_disposeSourceRangeList>>(
+      _lookup<ffi.NativeFunction<NativeClang_disposeSourceRangeList>>(
           'clang_disposeSourceRangeList');
   late final _clang_disposeSourceRangeList = _clang_disposeSourceRangeListPtr
-      .asFunction<void Function(ffi.Pointer<CXSourceRangeList>)>();
+      .asFunction<DartClang_disposeSourceRangeList>();
 
   /// Determine the number of diagnostics in a CXDiagnosticSet.
   int clang_getNumDiagnosticsInSet(
@@ -872,10 +841,10 @@
   }
 
   late final _clang_getNumDiagnosticsInSetPtr =
-      _lookup<ffi.NativeFunction<Native_clang_getNumDiagnosticsInSet>>(
+      _lookup<ffi.NativeFunction<NativeClang_getNumDiagnosticsInSet>>(
           'clang_getNumDiagnosticsInSet');
   late final _clang_getNumDiagnosticsInSet = _clang_getNumDiagnosticsInSetPtr
-      .asFunction<int Function(CXDiagnosticSet)>();
+      .asFunction<DartClang_getNumDiagnosticsInSet>();
 
   /// Retrieve a diagnostic associated with the given CXDiagnosticSet.
   ///
@@ -895,10 +864,10 @@
   }
 
   late final _clang_getDiagnosticInSetPtr =
-      _lookup<ffi.NativeFunction<Native_clang_getDiagnosticInSet>>(
+      _lookup<ffi.NativeFunction<NativeClang_getDiagnosticInSet>>(
           'clang_getDiagnosticInSet');
-  late final _clang_getDiagnosticInSet = _clang_getDiagnosticInSetPtr
-      .asFunction<CXDiagnostic Function(CXDiagnosticSet, int)>();
+  late final _clang_getDiagnosticInSet =
+      _clang_getDiagnosticInSetPtr.asFunction<DartClang_getDiagnosticInSet>();
 
   /// Deserialize a set of diagnostics from a Clang diagnostics bitcode
   /// file.
@@ -924,11 +893,10 @@
   }
 
   late final _clang_loadDiagnosticsPtr =
-      _lookup<ffi.NativeFunction<Native_clang_loadDiagnostics>>(
+      _lookup<ffi.NativeFunction<NativeClang_loadDiagnostics>>(
           'clang_loadDiagnostics');
-  late final _clang_loadDiagnostics = _clang_loadDiagnosticsPtr.asFunction<
-      CXDiagnosticSet Function(ffi.Pointer<ffi.Int8>, ffi.Pointer<ffi.Int32>,
-          ffi.Pointer<CXString>)>();
+  late final _clang_loadDiagnostics =
+      _clang_loadDiagnosticsPtr.asFunction<DartClang_loadDiagnostics>();
 
   /// Release a CXDiagnosticSet and all of its contained diagnostics.
   void clang_disposeDiagnosticSet(
@@ -940,10 +908,10 @@
   }
 
   late final _clang_disposeDiagnosticSetPtr =
-      _lookup<ffi.NativeFunction<Native_clang_disposeDiagnosticSet>>(
+      _lookup<ffi.NativeFunction<NativeClang_disposeDiagnosticSet>>(
           'clang_disposeDiagnosticSet');
   late final _clang_disposeDiagnosticSet = _clang_disposeDiagnosticSetPtr
-      .asFunction<void Function(CXDiagnosticSet)>();
+      .asFunction<DartClang_disposeDiagnosticSet>();
 
   /// Retrieve the child diagnostics of a CXDiagnostic.
   ///
@@ -958,10 +926,10 @@
   }
 
   late final _clang_getChildDiagnosticsPtr =
-      _lookup<ffi.NativeFunction<Native_clang_getChildDiagnostics>>(
+      _lookup<ffi.NativeFunction<NativeClang_getChildDiagnostics>>(
           'clang_getChildDiagnostics');
-  late final _clang_getChildDiagnostics = _clang_getChildDiagnosticsPtr
-      .asFunction<CXDiagnosticSet Function(CXDiagnostic)>();
+  late final _clang_getChildDiagnostics =
+      _clang_getChildDiagnosticsPtr.asFunction<DartClang_getChildDiagnostics>();
 
   /// Determine the number of diagnostics produced for the given
   /// translation unit.
@@ -974,10 +942,10 @@
   }
 
   late final _clang_getNumDiagnosticsPtr =
-      _lookup<ffi.NativeFunction<Native_clang_getNumDiagnostics>>(
+      _lookup<ffi.NativeFunction<NativeClang_getNumDiagnostics>>(
           'clang_getNumDiagnostics');
   late final _clang_getNumDiagnostics =
-      _clang_getNumDiagnosticsPtr.asFunction<int Function(CXTranslationUnit)>();
+      _clang_getNumDiagnosticsPtr.asFunction<DartClang_getNumDiagnostics>();
 
   /// Retrieve a diagnostic associated with the given translation unit.
   ///
@@ -997,10 +965,10 @@
   }
 
   late final _clang_getDiagnosticPtr =
-      _lookup<ffi.NativeFunction<Native_clang_getDiagnostic>>(
+      _lookup<ffi.NativeFunction<NativeClang_getDiagnostic>>(
           'clang_getDiagnostic');
-  late final _clang_getDiagnostic = _clang_getDiagnosticPtr
-      .asFunction<CXDiagnostic Function(CXTranslationUnit, int)>();
+  late final _clang_getDiagnostic =
+      _clang_getDiagnosticPtr.asFunction<DartClang_getDiagnostic>();
 
   /// Retrieve the complete set of diagnostics associated with a
   /// translation unit.
@@ -1015,10 +983,10 @@
   }
 
   late final _clang_getDiagnosticSetFromTUPtr =
-      _lookup<ffi.NativeFunction<Native_clang_getDiagnosticSetFromTU>>(
+      _lookup<ffi.NativeFunction<NativeClang_getDiagnosticSetFromTU>>(
           'clang_getDiagnosticSetFromTU');
   late final _clang_getDiagnosticSetFromTU = _clang_getDiagnosticSetFromTUPtr
-      .asFunction<CXDiagnosticSet Function(CXTranslationUnit)>();
+      .asFunction<DartClang_getDiagnosticSetFromTU>();
 
   /// Destroy a diagnostic.
   void clang_disposeDiagnostic(
@@ -1030,10 +998,10 @@
   }
 
   late final _clang_disposeDiagnosticPtr =
-      _lookup<ffi.NativeFunction<Native_clang_disposeDiagnostic>>(
+      _lookup<ffi.NativeFunction<NativeClang_disposeDiagnostic>>(
           'clang_disposeDiagnostic');
   late final _clang_disposeDiagnostic =
-      _clang_disposeDiagnosticPtr.asFunction<void Function(CXDiagnostic)>();
+      _clang_disposeDiagnosticPtr.asFunction<DartClang_disposeDiagnostic>();
 
   /// Format the given diagnostic in a manner that is suitable for display.
   ///
@@ -1059,10 +1027,10 @@
   }
 
   late final _clang_formatDiagnosticPtr =
-      _lookup<ffi.NativeFunction<Native_clang_formatDiagnostic>>(
+      _lookup<ffi.NativeFunction<NativeClang_formatDiagnostic>>(
           'clang_formatDiagnostic');
-  late final _clang_formatDiagnostic = _clang_formatDiagnosticPtr
-      .asFunction<CXString Function(CXDiagnostic, int)>();
+  late final _clang_formatDiagnostic =
+      _clang_formatDiagnosticPtr.asFunction<DartClang_formatDiagnostic>();
 
   /// Retrieve the set of display options most similar to the
   /// default behavior of the clang compiler.
@@ -1074,10 +1042,11 @@
   }
 
   late final _clang_defaultDiagnosticDisplayOptionsPtr =
-      _lookup<ffi.NativeFunction<Native_clang_defaultDiagnosticDisplayOptions>>(
+      _lookup<ffi.NativeFunction<NativeClang_defaultDiagnosticDisplayOptions>>(
           'clang_defaultDiagnosticDisplayOptions');
   late final _clang_defaultDiagnosticDisplayOptions =
-      _clang_defaultDiagnosticDisplayOptionsPtr.asFunction<int Function()>();
+      _clang_defaultDiagnosticDisplayOptionsPtr
+          .asFunction<DartClang_defaultDiagnosticDisplayOptions>();
 
   /// Determine the severity of the given diagnostic.
   int clang_getDiagnosticSeverity(
@@ -1089,10 +1058,10 @@
   }
 
   late final _clang_getDiagnosticSeverityPtr =
-      _lookup<ffi.NativeFunction<Native_clang_getDiagnosticSeverity>>(
+      _lookup<ffi.NativeFunction<NativeClang_getDiagnosticSeverity>>(
           'clang_getDiagnosticSeverity');
-  late final _clang_getDiagnosticSeverity =
-      _clang_getDiagnosticSeverityPtr.asFunction<int Function(CXDiagnostic)>();
+  late final _clang_getDiagnosticSeverity = _clang_getDiagnosticSeverityPtr
+      .asFunction<DartClang_getDiagnosticSeverity>();
 
   /// Retrieve the source location of the given diagnostic.
   ///
@@ -1107,10 +1076,10 @@
   }
 
   late final _clang_getDiagnosticLocationPtr =
-      _lookup<ffi.NativeFunction<Native_clang_getDiagnosticLocation>>(
+      _lookup<ffi.NativeFunction<NativeClang_getDiagnosticLocation>>(
           'clang_getDiagnosticLocation');
   late final _clang_getDiagnosticLocation = _clang_getDiagnosticLocationPtr
-      .asFunction<CXSourceLocation Function(CXDiagnostic)>();
+      .asFunction<DartClang_getDiagnosticLocation>();
 
   /// Retrieve the text of the given diagnostic.
   CXString clang_getDiagnosticSpelling(
@@ -1122,10 +1091,10 @@
   }
 
   late final _clang_getDiagnosticSpellingPtr =
-      _lookup<ffi.NativeFunction<Native_clang_getDiagnosticSpelling>>(
+      _lookup<ffi.NativeFunction<NativeClang_getDiagnosticSpelling>>(
           'clang_getDiagnosticSpelling');
   late final _clang_getDiagnosticSpelling = _clang_getDiagnosticSpellingPtr
-      .asFunction<CXString Function(CXDiagnostic)>();
+      .asFunction<DartClang_getDiagnosticSpelling>();
 
   /// Retrieve the name of the command-line option that enabled this
   /// diagnostic.
@@ -1148,10 +1117,10 @@
   }
 
   late final _clang_getDiagnosticOptionPtr =
-      _lookup<ffi.NativeFunction<Native_clang_getDiagnosticOption>>(
+      _lookup<ffi.NativeFunction<NativeClang_getDiagnosticOption>>(
           'clang_getDiagnosticOption');
-  late final _clang_getDiagnosticOption = _clang_getDiagnosticOptionPtr
-      .asFunction<CXString Function(CXDiagnostic, ffi.Pointer<CXString>)>();
+  late final _clang_getDiagnosticOption =
+      _clang_getDiagnosticOptionPtr.asFunction<DartClang_getDiagnosticOption>();
 
   /// Retrieve the category number for this diagnostic.
   ///
@@ -1170,10 +1139,10 @@
   }
 
   late final _clang_getDiagnosticCategoryPtr =
-      _lookup<ffi.NativeFunction<Native_clang_getDiagnosticCategory>>(
+      _lookup<ffi.NativeFunction<NativeClang_getDiagnosticCategory>>(
           'clang_getDiagnosticCategory');
-  late final _clang_getDiagnosticCategory =
-      _clang_getDiagnosticCategoryPtr.asFunction<int Function(CXDiagnostic)>();
+  late final _clang_getDiagnosticCategory = _clang_getDiagnosticCategoryPtr
+      .asFunction<DartClang_getDiagnosticCategory>();
 
   /// Retrieve the name of a particular diagnostic category.  This
   /// is now deprecated.  Use clang_getDiagnosticCategoryText()
@@ -1192,10 +1161,11 @@
   }
 
   late final _clang_getDiagnosticCategoryNamePtr =
-      _lookup<ffi.NativeFunction<Native_clang_getDiagnosticCategoryName>>(
+      _lookup<ffi.NativeFunction<NativeClang_getDiagnosticCategoryName>>(
           'clang_getDiagnosticCategoryName');
   late final _clang_getDiagnosticCategoryName =
-      _clang_getDiagnosticCategoryNamePtr.asFunction<CXString Function(int)>();
+      _clang_getDiagnosticCategoryNamePtr
+          .asFunction<DartClang_getDiagnosticCategoryName>();
 
   /// Retrieve the diagnostic category text for a given diagnostic.
   ///
@@ -1209,11 +1179,11 @@
   }
 
   late final _clang_getDiagnosticCategoryTextPtr =
-      _lookup<ffi.NativeFunction<Native_clang_getDiagnosticCategoryText>>(
+      _lookup<ffi.NativeFunction<NativeClang_getDiagnosticCategoryText>>(
           'clang_getDiagnosticCategoryText');
   late final _clang_getDiagnosticCategoryText =
       _clang_getDiagnosticCategoryTextPtr
-          .asFunction<CXString Function(CXDiagnostic)>();
+          .asFunction<DartClang_getDiagnosticCategoryText>();
 
   /// Determine the number of source ranges associated with the given
   /// diagnostic.
@@ -1226,10 +1196,10 @@
   }
 
   late final _clang_getDiagnosticNumRangesPtr =
-      _lookup<ffi.NativeFunction<Native_clang_getDiagnosticNumRanges>>(
+      _lookup<ffi.NativeFunction<NativeClang_getDiagnosticNumRanges>>(
           'clang_getDiagnosticNumRanges');
-  late final _clang_getDiagnosticNumRanges =
-      _clang_getDiagnosticNumRangesPtr.asFunction<int Function(CXDiagnostic)>();
+  late final _clang_getDiagnosticNumRanges = _clang_getDiagnosticNumRangesPtr
+      .asFunction<DartClang_getDiagnosticNumRanges>();
 
   /// Retrieve a source range associated with the diagnostic.
   ///
@@ -1253,10 +1223,10 @@
   }
 
   late final _clang_getDiagnosticRangePtr =
-      _lookup<ffi.NativeFunction<Native_clang_getDiagnosticRange>>(
+      _lookup<ffi.NativeFunction<NativeClang_getDiagnosticRange>>(
           'clang_getDiagnosticRange');
-  late final _clang_getDiagnosticRange = _clang_getDiagnosticRangePtr
-      .asFunction<CXSourceRange Function(CXDiagnostic, int)>();
+  late final _clang_getDiagnosticRange =
+      _clang_getDiagnosticRangePtr.asFunction<DartClang_getDiagnosticRange>();
 
   /// Determine the number of fix-it hints associated with the
   /// given diagnostic.
@@ -1269,10 +1239,10 @@
   }
 
   late final _clang_getDiagnosticNumFixItsPtr =
-      _lookup<ffi.NativeFunction<Native_clang_getDiagnosticNumFixIts>>(
+      _lookup<ffi.NativeFunction<NativeClang_getDiagnosticNumFixIts>>(
           'clang_getDiagnosticNumFixIts');
-  late final _clang_getDiagnosticNumFixIts =
-      _clang_getDiagnosticNumFixItsPtr.asFunction<int Function(CXDiagnostic)>();
+  late final _clang_getDiagnosticNumFixIts = _clang_getDiagnosticNumFixItsPtr
+      .asFunction<DartClang_getDiagnosticNumFixIts>();
 
   /// Retrieve the replacement information for a given fix-it.
   ///
@@ -1310,11 +1280,10 @@
   }
 
   late final _clang_getDiagnosticFixItPtr =
-      _lookup<ffi.NativeFunction<Native_clang_getDiagnosticFixIt>>(
+      _lookup<ffi.NativeFunction<NativeClang_getDiagnosticFixIt>>(
           'clang_getDiagnosticFixIt');
   late final _clang_getDiagnosticFixIt =
-      _clang_getDiagnosticFixItPtr.asFunction<
-          CXString Function(CXDiagnostic, int, ffi.Pointer<CXSourceRange>)>();
+      _clang_getDiagnosticFixItPtr.asFunction<DartClang_getDiagnosticFixIt>();
 
   /// Get the original translation unit source file name.
   CXString clang_getTranslationUnitSpelling(
@@ -1326,11 +1295,11 @@
   }
 
   late final _clang_getTranslationUnitSpellingPtr =
-      _lookup<ffi.NativeFunction<Native_clang_getTranslationUnitSpelling>>(
+      _lookup<ffi.NativeFunction<NativeClang_getTranslationUnitSpelling>>(
           'clang_getTranslationUnitSpelling');
   late final _clang_getTranslationUnitSpelling =
       _clang_getTranslationUnitSpellingPtr
-          .asFunction<CXString Function(CXTranslationUnit)>();
+          .asFunction<DartClang_getTranslationUnitSpelling>();
 
   /// Return the CXTranslationUnit for a given source file and the provided
   /// command line arguments one would pass to the compiler.
@@ -1389,17 +1358,11 @@
   }
 
   late final _clang_createTranslationUnitFromSourceFilePtr = _lookup<
-          ffi.NativeFunction<Native_clang_createTranslationUnitFromSourceFile>>(
+          ffi.NativeFunction<NativeClang_createTranslationUnitFromSourceFile>>(
       'clang_createTranslationUnitFromSourceFile');
   late final _clang_createTranslationUnitFromSourceFile =
-      _clang_createTranslationUnitFromSourceFilePtr.asFunction<
-          CXTranslationUnit Function(
-              CXIndex,
-              ffi.Pointer<ffi.Int8>,
-              int,
-              ffi.Pointer<ffi.Pointer<ffi.Int8>>,
-              int,
-              ffi.Pointer<CXUnsavedFile>)>();
+      _clang_createTranslationUnitFromSourceFilePtr
+          .asFunction<DartClang_createTranslationUnitFromSourceFile>();
 
   /// Same as \c clang_createTranslationUnit2, but returns
   /// the \c CXTranslationUnit instead of an error code.  In case of an error this
@@ -1416,10 +1379,10 @@
   }
 
   late final _clang_createTranslationUnitPtr =
-      _lookup<ffi.NativeFunction<Native_clang_createTranslationUnit>>(
+      _lookup<ffi.NativeFunction<NativeClang_createTranslationUnit>>(
           'clang_createTranslationUnit');
   late final _clang_createTranslationUnit = _clang_createTranslationUnitPtr
-      .asFunction<CXTranslationUnit Function(CXIndex, ffi.Pointer<ffi.Int8>)>();
+      .asFunction<DartClang_createTranslationUnit>();
 
   /// Create a translation unit from an AST file (\c -emit-ast).
   ///
@@ -1440,12 +1403,10 @@
   }
 
   late final _clang_createTranslationUnit2Ptr =
-      _lookup<ffi.NativeFunction<Native_clang_createTranslationUnit2>>(
+      _lookup<ffi.NativeFunction<NativeClang_createTranslationUnit2>>(
           'clang_createTranslationUnit2');
-  late final _clang_createTranslationUnit2 =
-      _clang_createTranslationUnit2Ptr.asFunction<
-          int Function(CXIndex, ffi.Pointer<ffi.Int8>,
-              ffi.Pointer<CXTranslationUnit>)>();
+  late final _clang_createTranslationUnit2 = _clang_createTranslationUnit2Ptr
+      .asFunction<DartClang_createTranslationUnit2>();
 
   /// Returns the set of flags that is suitable for parsing a translation
   /// unit that is being edited.
@@ -1462,12 +1423,11 @@
   }
 
   late final _clang_defaultEditingTranslationUnitOptionsPtr = _lookup<
-          ffi.NativeFunction<
-              Native_clang_defaultEditingTranslationUnitOptions>>(
+          ffi.NativeFunction<NativeClang_defaultEditingTranslationUnitOptions>>(
       'clang_defaultEditingTranslationUnitOptions');
   late final _clang_defaultEditingTranslationUnitOptions =
       _clang_defaultEditingTranslationUnitOptionsPtr
-          .asFunction<int Function()>();
+          .asFunction<DartClang_defaultEditingTranslationUnitOptions>();
 
   /// Same as \c clang_parseTranslationUnit2, but returns
   /// the \c CXTranslationUnit instead of an error code.  In case of an error this
@@ -1494,18 +1454,10 @@
   }
 
   late final _clang_parseTranslationUnitPtr =
-      _lookup<ffi.NativeFunction<Native_clang_parseTranslationUnit>>(
+      _lookup<ffi.NativeFunction<NativeClang_parseTranslationUnit>>(
           'clang_parseTranslationUnit');
-  late final _clang_parseTranslationUnit =
-      _clang_parseTranslationUnitPtr.asFunction<
-          CXTranslationUnit Function(
-              CXIndex,
-              ffi.Pointer<ffi.Int8>,
-              ffi.Pointer<ffi.Pointer<ffi.Int8>>,
-              int,
-              ffi.Pointer<CXUnsavedFile>,
-              int,
-              int)>();
+  late final _clang_parseTranslationUnit = _clang_parseTranslationUnitPtr
+      .asFunction<DartClang_parseTranslationUnit>();
 
   /// Parse the given source file and the translation unit corresponding
   /// to that file.
@@ -1572,19 +1524,10 @@
   }
 
   late final _clang_parseTranslationUnit2Ptr =
-      _lookup<ffi.NativeFunction<Native_clang_parseTranslationUnit2>>(
+      _lookup<ffi.NativeFunction<NativeClang_parseTranslationUnit2>>(
           'clang_parseTranslationUnit2');
-  late final _clang_parseTranslationUnit2 =
-      _clang_parseTranslationUnit2Ptr.asFunction<
-          int Function(
-              CXIndex,
-              ffi.Pointer<ffi.Int8>,
-              ffi.Pointer<ffi.Pointer<ffi.Int8>>,
-              int,
-              ffi.Pointer<CXUnsavedFile>,
-              int,
-              int,
-              ffi.Pointer<CXTranslationUnit>)>();
+  late final _clang_parseTranslationUnit2 = _clang_parseTranslationUnit2Ptr
+      .asFunction<DartClang_parseTranslationUnit2>();
 
   /// Same as clang_parseTranslationUnit2 but requires a full command line
   /// for \c command_line_args including argv[0]. This is useful if the standard
@@ -1612,19 +1555,11 @@
   }
 
   late final _clang_parseTranslationUnit2FullArgvPtr =
-      _lookup<ffi.NativeFunction<Native_clang_parseTranslationUnit2FullArgv>>(
+      _lookup<ffi.NativeFunction<NativeClang_parseTranslationUnit2FullArgv>>(
           'clang_parseTranslationUnit2FullArgv');
   late final _clang_parseTranslationUnit2FullArgv =
-      _clang_parseTranslationUnit2FullArgvPtr.asFunction<
-          int Function(
-              CXIndex,
-              ffi.Pointer<ffi.Int8>,
-              ffi.Pointer<ffi.Pointer<ffi.Int8>>,
-              int,
-              ffi.Pointer<CXUnsavedFile>,
-              int,
-              int,
-              ffi.Pointer<CXTranslationUnit>)>();
+      _clang_parseTranslationUnit2FullArgvPtr
+          .asFunction<DartClang_parseTranslationUnit2FullArgv>();
 
   /// Returns the set of flags that is suitable for saving a translation
   /// unit.
@@ -1642,10 +1577,10 @@
   }
 
   late final _clang_defaultSaveOptionsPtr =
-      _lookup<ffi.NativeFunction<Native_clang_defaultSaveOptions>>(
+      _lookup<ffi.NativeFunction<NativeClang_defaultSaveOptions>>(
           'clang_defaultSaveOptions');
-  late final _clang_defaultSaveOptions = _clang_defaultSaveOptionsPtr
-      .asFunction<int Function(CXTranslationUnit)>();
+  late final _clang_defaultSaveOptions =
+      _clang_defaultSaveOptionsPtr.asFunction<DartClang_defaultSaveOptions>();
 
   /// Saves a translation unit into a serialized representation of
   /// that translation unit on disk.
@@ -1681,11 +1616,10 @@
   }
 
   late final _clang_saveTranslationUnitPtr =
-      _lookup<ffi.NativeFunction<Native_clang_saveTranslationUnit>>(
+      _lookup<ffi.NativeFunction<NativeClang_saveTranslationUnit>>(
           'clang_saveTranslationUnit');
   late final _clang_saveTranslationUnit =
-      _clang_saveTranslationUnitPtr.asFunction<
-          int Function(CXTranslationUnit, ffi.Pointer<ffi.Int8>, int)>();
+      _clang_saveTranslationUnitPtr.asFunction<DartClang_saveTranslationUnit>();
 
   /// Suspend a translation unit in order to free memory associated with it.
   ///
@@ -1701,10 +1635,10 @@
   }
 
   late final _clang_suspendTranslationUnitPtr =
-      _lookup<ffi.NativeFunction<Native_clang_suspendTranslationUnit>>(
+      _lookup<ffi.NativeFunction<NativeClang_suspendTranslationUnit>>(
           'clang_suspendTranslationUnit');
   late final _clang_suspendTranslationUnit = _clang_suspendTranslationUnitPtr
-      .asFunction<int Function(CXTranslationUnit)>();
+      .asFunction<DartClang_suspendTranslationUnit>();
 
   /// Destroy the specified CXTranslationUnit object.
   void clang_disposeTranslationUnit(
@@ -1716,10 +1650,10 @@
   }
 
   late final _clang_disposeTranslationUnitPtr =
-      _lookup<ffi.NativeFunction<Native_clang_disposeTranslationUnit>>(
+      _lookup<ffi.NativeFunction<NativeClang_disposeTranslationUnit>>(
           'clang_disposeTranslationUnit');
   late final _clang_disposeTranslationUnit = _clang_disposeTranslationUnitPtr
-      .asFunction<void Function(CXTranslationUnit)>();
+      .asFunction<DartClang_disposeTranslationUnit>();
 
   /// Returns the set of flags that is suitable for reparsing a translation
   /// unit.
@@ -1738,10 +1672,10 @@
   }
 
   late final _clang_defaultReparseOptionsPtr =
-      _lookup<ffi.NativeFunction<Native_clang_defaultReparseOptions>>(
+      _lookup<ffi.NativeFunction<NativeClang_defaultReparseOptions>>(
           'clang_defaultReparseOptions');
   late final _clang_defaultReparseOptions = _clang_defaultReparseOptionsPtr
-      .asFunction<int Function(CXTranslationUnit)>();
+      .asFunction<DartClang_defaultReparseOptions>();
 
   /// Reparse the source files that produced this translation unit.
   ///
@@ -1795,12 +1729,10 @@
   }
 
   late final _clang_reparseTranslationUnitPtr =
-      _lookup<ffi.NativeFunction<Native_clang_reparseTranslationUnit>>(
+      _lookup<ffi.NativeFunction<NativeClang_reparseTranslationUnit>>(
           'clang_reparseTranslationUnit');
-  late final _clang_reparseTranslationUnit =
-      _clang_reparseTranslationUnitPtr.asFunction<
-          int Function(
-              CXTranslationUnit, int, ffi.Pointer<CXUnsavedFile>, int)>();
+  late final _clang_reparseTranslationUnit = _clang_reparseTranslationUnitPtr
+      .asFunction<DartClang_reparseTranslationUnit>();
 
   /// Returns the human-readable null-terminated C string that represents
   /// the name of the memory category.  This string should never be freed.
@@ -1813,10 +1745,10 @@
   }
 
   late final _clang_getTUResourceUsageNamePtr =
-      _lookup<ffi.NativeFunction<Native_clang_getTUResourceUsageName>>(
+      _lookup<ffi.NativeFunction<NativeClang_getTUResourceUsageName>>(
           'clang_getTUResourceUsageName');
   late final _clang_getTUResourceUsageName = _clang_getTUResourceUsageNamePtr
-      .asFunction<ffi.Pointer<ffi.Int8> Function(int)>();
+      .asFunction<DartClang_getTUResourceUsageName>();
 
   /// Return the memory usage of a translation unit.  This object
   /// should be released with clang_disposeCXTUResourceUsage().
@@ -1829,10 +1761,10 @@
   }
 
   late final _clang_getCXTUResourceUsagePtr =
-      _lookup<ffi.NativeFunction<Native_clang_getCXTUResourceUsage>>(
+      _lookup<ffi.NativeFunction<NativeClang_getCXTUResourceUsage>>(
           'clang_getCXTUResourceUsage');
   late final _clang_getCXTUResourceUsage = _clang_getCXTUResourceUsagePtr
-      .asFunction<CXTUResourceUsage Function(CXTranslationUnit)>();
+      .asFunction<DartClang_getCXTUResourceUsage>();
 
   void clang_disposeCXTUResourceUsage(
     CXTUResourceUsage usage,
@@ -1843,11 +1775,11 @@
   }
 
   late final _clang_disposeCXTUResourceUsagePtr =
-      _lookup<ffi.NativeFunction<Native_clang_disposeCXTUResourceUsage>>(
+      _lookup<ffi.NativeFunction<NativeClang_disposeCXTUResourceUsage>>(
           'clang_disposeCXTUResourceUsage');
   late final _clang_disposeCXTUResourceUsage =
       _clang_disposeCXTUResourceUsagePtr
-          .asFunction<void Function(CXTUResourceUsage)>();
+          .asFunction<DartClang_disposeCXTUResourceUsage>();
 
   /// Get target information for this translation unit.
   ///
@@ -1861,11 +1793,11 @@
   }
 
   late final _clang_getTranslationUnitTargetInfoPtr =
-      _lookup<ffi.NativeFunction<Native_clang_getTranslationUnitTargetInfo>>(
+      _lookup<ffi.NativeFunction<NativeClang_getTranslationUnitTargetInfo>>(
           'clang_getTranslationUnitTargetInfo');
   late final _clang_getTranslationUnitTargetInfo =
       _clang_getTranslationUnitTargetInfoPtr
-          .asFunction<CXTargetInfo Function(CXTranslationUnit)>();
+          .asFunction<DartClang_getTranslationUnitTargetInfo>();
 
   /// Destroy the CXTargetInfo object.
   void clang_TargetInfo_dispose(
@@ -1877,10 +1809,10 @@
   }
 
   late final _clang_TargetInfo_disposePtr =
-      _lookup<ffi.NativeFunction<Native_clang_TargetInfo_dispose>>(
+      _lookup<ffi.NativeFunction<NativeClang_TargetInfo_dispose>>(
           'clang_TargetInfo_dispose');
   late final _clang_TargetInfo_dispose =
-      _clang_TargetInfo_disposePtr.asFunction<void Function(CXTargetInfo)>();
+      _clang_TargetInfo_disposePtr.asFunction<DartClang_TargetInfo_dispose>();
 
   /// Get the normalized target triple as a string.
   ///
@@ -1894,10 +1826,10 @@
   }
 
   late final _clang_TargetInfo_getTriplePtr =
-      _lookup<ffi.NativeFunction<Native_clang_TargetInfo_getTriple>>(
+      _lookup<ffi.NativeFunction<NativeClang_TargetInfo_getTriple>>(
           'clang_TargetInfo_getTriple');
   late final _clang_TargetInfo_getTriple = _clang_TargetInfo_getTriplePtr
-      .asFunction<CXString Function(CXTargetInfo)>();
+      .asFunction<DartClang_TargetInfo_getTriple>();
 
   /// Get the pointer width of the target in bits.
   ///
@@ -1911,11 +1843,11 @@
   }
 
   late final _clang_TargetInfo_getPointerWidthPtr =
-      _lookup<ffi.NativeFunction<Native_clang_TargetInfo_getPointerWidth>>(
+      _lookup<ffi.NativeFunction<NativeClang_TargetInfo_getPointerWidth>>(
           'clang_TargetInfo_getPointerWidth');
   late final _clang_TargetInfo_getPointerWidth =
       _clang_TargetInfo_getPointerWidthPtr
-          .asFunction<int Function(CXTargetInfo)>();
+          .asFunction<DartClang_TargetInfo_getPointerWidth>();
 
   /// Retrieve the NULL cursor, which represents no entity.
   CXCursor clang_getNullCursor() {
@@ -1923,10 +1855,10 @@
   }
 
   late final _clang_getNullCursorPtr =
-      _lookup<ffi.NativeFunction<Native_clang_getNullCursor>>(
+      _lookup<ffi.NativeFunction<NativeClang_getNullCursor>>(
           'clang_getNullCursor');
   late final _clang_getNullCursor =
-      _clang_getNullCursorPtr.asFunction<CXCursor Function()>();
+      _clang_getNullCursorPtr.asFunction<DartClang_getNullCursor>();
 
   /// Retrieve the cursor that represents the given translation unit.
   ///
@@ -1941,11 +1873,11 @@
   }
 
   late final _clang_getTranslationUnitCursorPtr =
-      _lookup<ffi.NativeFunction<Native_clang_getTranslationUnitCursor>>(
+      _lookup<ffi.NativeFunction<NativeClang_getTranslationUnitCursor>>(
           'clang_getTranslationUnitCursor');
   late final _clang_getTranslationUnitCursor =
       _clang_getTranslationUnitCursorPtr
-          .asFunction<CXCursor Function(CXTranslationUnit)>();
+          .asFunction<DartClang_getTranslationUnitCursor>();
 
   /// Determine whether two cursors are equivalent.
   int clang_equalCursors(
@@ -1959,10 +1891,10 @@
   }
 
   late final _clang_equalCursorsPtr =
-      _lookup<ffi.NativeFunction<Native_clang_equalCursors>>(
+      _lookup<ffi.NativeFunction<NativeClang_equalCursors>>(
           'clang_equalCursors');
   late final _clang_equalCursors =
-      _clang_equalCursorsPtr.asFunction<int Function(CXCursor, CXCursor)>();
+      _clang_equalCursorsPtr.asFunction<DartClang_equalCursors>();
 
   /// Returns non-zero if \p cursor is null.
   int clang_Cursor_isNull(
@@ -1974,10 +1906,10 @@
   }
 
   late final _clang_Cursor_isNullPtr =
-      _lookup<ffi.NativeFunction<Native_clang_Cursor_isNull>>(
+      _lookup<ffi.NativeFunction<NativeClang_Cursor_isNull>>(
           'clang_Cursor_isNull');
   late final _clang_Cursor_isNull =
-      _clang_Cursor_isNullPtr.asFunction<int Function(CXCursor)>();
+      _clang_Cursor_isNullPtr.asFunction<DartClang_Cursor_isNull>();
 
   /// Compute a hash value for the given cursor.
   int clang_hashCursor(
@@ -1989,9 +1921,9 @@
   }
 
   late final _clang_hashCursorPtr =
-      _lookup<ffi.NativeFunction<Native_clang_hashCursor>>('clang_hashCursor');
+      _lookup<ffi.NativeFunction<NativeClang_hashCursor>>('clang_hashCursor');
   late final _clang_hashCursor =
-      _clang_hashCursorPtr.asFunction<int Function(CXCursor)>();
+      _clang_hashCursorPtr.asFunction<DartClang_hashCursor>();
 
   /// Retrieve the kind of the given cursor.
   int clang_getCursorKind(
@@ -2003,10 +1935,10 @@
   }
 
   late final _clang_getCursorKindPtr =
-      _lookup<ffi.NativeFunction<Native_clang_getCursorKind>>(
+      _lookup<ffi.NativeFunction<NativeClang_getCursorKind>>(
           'clang_getCursorKind');
   late final _clang_getCursorKind =
-      _clang_getCursorKindPtr.asFunction<int Function(CXCursor)>();
+      _clang_getCursorKindPtr.asFunction<DartClang_getCursorKind>();
 
   /// Determine whether the given cursor kind represents a declaration.
   int clang_isDeclaration(
@@ -2018,10 +1950,10 @@
   }
 
   late final _clang_isDeclarationPtr =
-      _lookup<ffi.NativeFunction<Native_clang_isDeclaration>>(
+      _lookup<ffi.NativeFunction<NativeClang_isDeclaration>>(
           'clang_isDeclaration');
   late final _clang_isDeclaration =
-      _clang_isDeclarationPtr.asFunction<int Function(int)>();
+      _clang_isDeclarationPtr.asFunction<DartClang_isDeclaration>();
 
   /// Determine whether the given declaration is invalid.
   ///
@@ -2038,10 +1970,10 @@
   }
 
   late final _clang_isInvalidDeclarationPtr =
-      _lookup<ffi.NativeFunction<Native_clang_isInvalidDeclaration>>(
+      _lookup<ffi.NativeFunction<NativeClang_isInvalidDeclaration>>(
           'clang_isInvalidDeclaration');
-  late final _clang_isInvalidDeclaration =
-      _clang_isInvalidDeclarationPtr.asFunction<int Function(CXCursor)>();
+  late final _clang_isInvalidDeclaration = _clang_isInvalidDeclarationPtr
+      .asFunction<DartClang_isInvalidDeclaration>();
 
   /// Determine whether the given cursor kind represents a simple
   /// reference.
@@ -2058,10 +1990,9 @@
   }
 
   late final _clang_isReferencePtr =
-      _lookup<ffi.NativeFunction<Native_clang_isReference>>(
-          'clang_isReference');
+      _lookup<ffi.NativeFunction<NativeClang_isReference>>('clang_isReference');
   late final _clang_isReference =
-      _clang_isReferencePtr.asFunction<int Function(int)>();
+      _clang_isReferencePtr.asFunction<DartClang_isReference>();
 
   /// Determine whether the given cursor kind represents an expression.
   int clang_isExpression(
@@ -2073,10 +2004,10 @@
   }
 
   late final _clang_isExpressionPtr =
-      _lookup<ffi.NativeFunction<Native_clang_isExpression>>(
+      _lookup<ffi.NativeFunction<NativeClang_isExpression>>(
           'clang_isExpression');
   late final _clang_isExpression =
-      _clang_isExpressionPtr.asFunction<int Function(int)>();
+      _clang_isExpressionPtr.asFunction<DartClang_isExpression>();
 
   /// Determine whether the given cursor kind represents a statement.
   int clang_isStatement(
@@ -2088,10 +2019,9 @@
   }
 
   late final _clang_isStatementPtr =
-      _lookup<ffi.NativeFunction<Native_clang_isStatement>>(
-          'clang_isStatement');
+      _lookup<ffi.NativeFunction<NativeClang_isStatement>>('clang_isStatement');
   late final _clang_isStatement =
-      _clang_isStatementPtr.asFunction<int Function(int)>();
+      _clang_isStatementPtr.asFunction<DartClang_isStatement>();
 
   /// Determine whether the given cursor kind represents an attribute.
   int clang_isAttribute(
@@ -2103,10 +2033,9 @@
   }
 
   late final _clang_isAttributePtr =
-      _lookup<ffi.NativeFunction<Native_clang_isAttribute>>(
-          'clang_isAttribute');
+      _lookup<ffi.NativeFunction<NativeClang_isAttribute>>('clang_isAttribute');
   late final _clang_isAttribute =
-      _clang_isAttributePtr.asFunction<int Function(int)>();
+      _clang_isAttributePtr.asFunction<DartClang_isAttribute>();
 
   /// Determine whether the given cursor has any attributes.
   int clang_Cursor_hasAttrs(
@@ -2118,10 +2047,10 @@
   }
 
   late final _clang_Cursor_hasAttrsPtr =
-      _lookup<ffi.NativeFunction<Native_clang_Cursor_hasAttrs>>(
+      _lookup<ffi.NativeFunction<NativeClang_Cursor_hasAttrs>>(
           'clang_Cursor_hasAttrs');
   late final _clang_Cursor_hasAttrs =
-      _clang_Cursor_hasAttrsPtr.asFunction<int Function(CXCursor)>();
+      _clang_Cursor_hasAttrsPtr.asFunction<DartClang_Cursor_hasAttrs>();
 
   /// Determine whether the given cursor kind represents an invalid
   /// cursor.
@@ -2134,9 +2063,9 @@
   }
 
   late final _clang_isInvalidPtr =
-      _lookup<ffi.NativeFunction<Native_clang_isInvalid>>('clang_isInvalid');
+      _lookup<ffi.NativeFunction<NativeClang_isInvalid>>('clang_isInvalid');
   late final _clang_isInvalid =
-      _clang_isInvalidPtr.asFunction<int Function(int)>();
+      _clang_isInvalidPtr.asFunction<DartClang_isInvalid>();
 
   /// Determine whether the given cursor kind represents a translation
   /// unit.
@@ -2149,10 +2078,10 @@
   }
 
   late final _clang_isTranslationUnitPtr =
-      _lookup<ffi.NativeFunction<Native_clang_isTranslationUnit>>(
+      _lookup<ffi.NativeFunction<NativeClang_isTranslationUnit>>(
           'clang_isTranslationUnit');
   late final _clang_isTranslationUnit =
-      _clang_isTranslationUnitPtr.asFunction<int Function(int)>();
+      _clang_isTranslationUnitPtr.asFunction<DartClang_isTranslationUnit>();
 
   /// Determine whether the given cursor represents a preprocessing
   /// element, such as a preprocessor directive or macro instantiation.
@@ -2165,10 +2094,10 @@
   }
 
   late final _clang_isPreprocessingPtr =
-      _lookup<ffi.NativeFunction<Native_clang_isPreprocessing>>(
+      _lookup<ffi.NativeFunction<NativeClang_isPreprocessing>>(
           'clang_isPreprocessing');
   late final _clang_isPreprocessing =
-      _clang_isPreprocessingPtr.asFunction<int Function(int)>();
+      _clang_isPreprocessingPtr.asFunction<DartClang_isPreprocessing>();
 
   /// Determine whether the given cursor represents a currently
   /// unexposed piece of the AST (e.g., CXCursor_UnexposedStmt).
@@ -2181,10 +2110,9 @@
   }
 
   late final _clang_isUnexposedPtr =
-      _lookup<ffi.NativeFunction<Native_clang_isUnexposed>>(
-          'clang_isUnexposed');
+      _lookup<ffi.NativeFunction<NativeClang_isUnexposed>>('clang_isUnexposed');
   late final _clang_isUnexposed =
-      _clang_isUnexposedPtr.asFunction<int Function(int)>();
+      _clang_isUnexposedPtr.asFunction<DartClang_isUnexposed>();
 
   /// Determine the linkage of the entity referred to by a given cursor.
   int clang_getCursorLinkage(
@@ -2196,10 +2124,10 @@
   }
 
   late final _clang_getCursorLinkagePtr =
-      _lookup<ffi.NativeFunction<Native_clang_getCursorLinkage>>(
+      _lookup<ffi.NativeFunction<NativeClang_getCursorLinkage>>(
           'clang_getCursorLinkage');
   late final _clang_getCursorLinkage =
-      _clang_getCursorLinkagePtr.asFunction<int Function(CXCursor)>();
+      _clang_getCursorLinkagePtr.asFunction<DartClang_getCursorLinkage>();
 
   /// Describe the visibility of the entity referred to by a cursor.
   ///
@@ -2219,10 +2147,10 @@
   }
 
   late final _clang_getCursorVisibilityPtr =
-      _lookup<ffi.NativeFunction<Native_clang_getCursorVisibility>>(
+      _lookup<ffi.NativeFunction<NativeClang_getCursorVisibility>>(
           'clang_getCursorVisibility');
   late final _clang_getCursorVisibility =
-      _clang_getCursorVisibilityPtr.asFunction<int Function(CXCursor)>();
+      _clang_getCursorVisibilityPtr.asFunction<DartClang_getCursorVisibility>();
 
   /// Determine the availability of the entity that this cursor refers to,
   /// taking the current target platform into account.
@@ -2239,10 +2167,10 @@
   }
 
   late final _clang_getCursorAvailabilityPtr =
-      _lookup<ffi.NativeFunction<Native_clang_getCursorAvailability>>(
+      _lookup<ffi.NativeFunction<NativeClang_getCursorAvailability>>(
           'clang_getCursorAvailability');
-  late final _clang_getCursorAvailability =
-      _clang_getCursorAvailabilityPtr.asFunction<int Function(CXCursor)>();
+  late final _clang_getCursorAvailability = _clang_getCursorAvailabilityPtr
+      .asFunction<DartClang_getCursorAvailability>();
 
   /// Determine the availability of the entity that this cursor refers to
   /// on any platforms for which availability information is known.
@@ -2299,18 +2227,11 @@
   }
 
   late final _clang_getCursorPlatformAvailabilityPtr =
-      _lookup<ffi.NativeFunction<Native_clang_getCursorPlatformAvailability>>(
+      _lookup<ffi.NativeFunction<NativeClang_getCursorPlatformAvailability>>(
           'clang_getCursorPlatformAvailability');
   late final _clang_getCursorPlatformAvailability =
-      _clang_getCursorPlatformAvailabilityPtr.asFunction<
-          int Function(
-              CXCursor,
-              ffi.Pointer<ffi.Int32>,
-              ffi.Pointer<CXString>,
-              ffi.Pointer<ffi.Int32>,
-              ffi.Pointer<CXString>,
-              ffi.Pointer<CXPlatformAvailability>,
-              int)>();
+      _clang_getCursorPlatformAvailabilityPtr
+          .asFunction<DartClang_getCursorPlatformAvailability>();
 
   /// Free the memory associated with a \c CXPlatformAvailability structure.
   void clang_disposeCXPlatformAvailability(
@@ -2322,11 +2243,11 @@
   }
 
   late final _clang_disposeCXPlatformAvailabilityPtr =
-      _lookup<ffi.NativeFunction<Native_clang_disposeCXPlatformAvailability>>(
+      _lookup<ffi.NativeFunction<NativeClang_disposeCXPlatformAvailability>>(
           'clang_disposeCXPlatformAvailability');
   late final _clang_disposeCXPlatformAvailability =
       _clang_disposeCXPlatformAvailabilityPtr
-          .asFunction<void Function(ffi.Pointer<CXPlatformAvailability>)>();
+          .asFunction<DartClang_disposeCXPlatformAvailability>();
 
   /// Determine the "language" of the entity referred to by a given cursor.
   int clang_getCursorLanguage(
@@ -2338,10 +2259,10 @@
   }
 
   late final _clang_getCursorLanguagePtr =
-      _lookup<ffi.NativeFunction<Native_clang_getCursorLanguage>>(
+      _lookup<ffi.NativeFunction<NativeClang_getCursorLanguage>>(
           'clang_getCursorLanguage');
   late final _clang_getCursorLanguage =
-      _clang_getCursorLanguagePtr.asFunction<int Function(CXCursor)>();
+      _clang_getCursorLanguagePtr.asFunction<DartClang_getCursorLanguage>();
 
   /// Determine the "thread-local storage (TLS) kind" of the declaration
   /// referred to by a cursor.
@@ -2354,10 +2275,10 @@
   }
 
   late final _clang_getCursorTLSKindPtr =
-      _lookup<ffi.NativeFunction<Native_clang_getCursorTLSKind>>(
+      _lookup<ffi.NativeFunction<NativeClang_getCursorTLSKind>>(
           'clang_getCursorTLSKind');
   late final _clang_getCursorTLSKind =
-      _clang_getCursorTLSKindPtr.asFunction<int Function(CXCursor)>();
+      _clang_getCursorTLSKindPtr.asFunction<DartClang_getCursorTLSKind>();
 
   /// Returns the translation unit that a cursor originated from.
   CXTranslationUnit clang_Cursor_getTranslationUnit(
@@ -2369,11 +2290,11 @@
   }
 
   late final _clang_Cursor_getTranslationUnitPtr =
-      _lookup<ffi.NativeFunction<Native_clang_Cursor_getTranslationUnit>>(
+      _lookup<ffi.NativeFunction<NativeClang_Cursor_getTranslationUnit>>(
           'clang_Cursor_getTranslationUnit');
   late final _clang_Cursor_getTranslationUnit =
       _clang_Cursor_getTranslationUnitPtr
-          .asFunction<CXTranslationUnit Function(CXCursor)>();
+          .asFunction<DartClang_Cursor_getTranslationUnit>();
 
   /// Creates an empty CXCursorSet.
   CXCursorSet clang_createCXCursorSet() {
@@ -2381,10 +2302,10 @@
   }
 
   late final _clang_createCXCursorSetPtr =
-      _lookup<ffi.NativeFunction<Native_clang_createCXCursorSet>>(
+      _lookup<ffi.NativeFunction<NativeClang_createCXCursorSet>>(
           'clang_createCXCursorSet');
   late final _clang_createCXCursorSet =
-      _clang_createCXCursorSetPtr.asFunction<CXCursorSet Function()>();
+      _clang_createCXCursorSetPtr.asFunction<DartClang_createCXCursorSet>();
 
   /// Disposes a CXCursorSet and releases its associated memory.
   void clang_disposeCXCursorSet(
@@ -2396,10 +2317,10 @@
   }
 
   late final _clang_disposeCXCursorSetPtr =
-      _lookup<ffi.NativeFunction<Native_clang_disposeCXCursorSet>>(
+      _lookup<ffi.NativeFunction<NativeClang_disposeCXCursorSet>>(
           'clang_disposeCXCursorSet');
   late final _clang_disposeCXCursorSet =
-      _clang_disposeCXCursorSetPtr.asFunction<void Function(CXCursorSet)>();
+      _clang_disposeCXCursorSetPtr.asFunction<DartClang_disposeCXCursorSet>();
 
   /// Queries a CXCursorSet to see if it contains a specific CXCursor.
   ///
@@ -2415,10 +2336,10 @@
   }
 
   late final _clang_CXCursorSet_containsPtr =
-      _lookup<ffi.NativeFunction<Native_clang_CXCursorSet_contains>>(
+      _lookup<ffi.NativeFunction<NativeClang_CXCursorSet_contains>>(
           'clang_CXCursorSet_contains');
   late final _clang_CXCursorSet_contains = _clang_CXCursorSet_containsPtr
-      .asFunction<int Function(CXCursorSet, CXCursor)>();
+      .asFunction<DartClang_CXCursorSet_contains>();
 
   /// Inserts a CXCursor into a CXCursorSet.
   ///
@@ -2434,10 +2355,10 @@
   }
 
   late final _clang_CXCursorSet_insertPtr =
-      _lookup<ffi.NativeFunction<Native_clang_CXCursorSet_insert>>(
+      _lookup<ffi.NativeFunction<NativeClang_CXCursorSet_insert>>(
           'clang_CXCursorSet_insert');
-  late final _clang_CXCursorSet_insert = _clang_CXCursorSet_insertPtr
-      .asFunction<int Function(CXCursorSet, CXCursor)>();
+  late final _clang_CXCursorSet_insert =
+      _clang_CXCursorSet_insertPtr.asFunction<DartClang_CXCursorSet_insert>();
 
   /// Determine the semantic parent of the given cursor.
   ///
@@ -2479,10 +2400,10 @@
   }
 
   late final _clang_getCursorSemanticParentPtr =
-      _lookup<ffi.NativeFunction<Native_clang_getCursorSemanticParent>>(
+      _lookup<ffi.NativeFunction<NativeClang_getCursorSemanticParent>>(
           'clang_getCursorSemanticParent');
   late final _clang_getCursorSemanticParent = _clang_getCursorSemanticParentPtr
-      .asFunction<CXCursor Function(CXCursor)>();
+      .asFunction<DartClang_getCursorSemanticParent>();
 
   /// Determine the lexical parent of the given cursor.
   ///
@@ -2525,10 +2446,10 @@
   }
 
   late final _clang_getCursorLexicalParentPtr =
-      _lookup<ffi.NativeFunction<Native_clang_getCursorLexicalParent>>(
+      _lookup<ffi.NativeFunction<NativeClang_getCursorLexicalParent>>(
           'clang_getCursorLexicalParent');
   late final _clang_getCursorLexicalParent = _clang_getCursorLexicalParentPtr
-      .asFunction<CXCursor Function(CXCursor)>();
+      .asFunction<DartClang_getCursorLexicalParent>();
 
   /// Determine the set of methods that are overridden by the given
   /// method.
@@ -2584,12 +2505,10 @@
   }
 
   late final _clang_getOverriddenCursorsPtr =
-      _lookup<ffi.NativeFunction<Native_clang_getOverriddenCursors>>(
+      _lookup<ffi.NativeFunction<NativeClang_getOverriddenCursors>>(
           'clang_getOverriddenCursors');
-  late final _clang_getOverriddenCursors =
-      _clang_getOverriddenCursorsPtr.asFunction<
-          void Function(CXCursor, ffi.Pointer<ffi.Pointer<CXCursor>>,
-              ffi.Pointer<ffi.Uint32>)>();
+  late final _clang_getOverriddenCursors = _clang_getOverriddenCursorsPtr
+      .asFunction<DartClang_getOverriddenCursors>();
 
   /// Free the set of overridden cursors returned by \c
   /// clang_getOverriddenCursors().
@@ -2602,11 +2521,11 @@
   }
 
   late final _clang_disposeOverriddenCursorsPtr =
-      _lookup<ffi.NativeFunction<Native_clang_disposeOverriddenCursors>>(
+      _lookup<ffi.NativeFunction<NativeClang_disposeOverriddenCursors>>(
           'clang_disposeOverriddenCursors');
   late final _clang_disposeOverriddenCursors =
       _clang_disposeOverriddenCursorsPtr
-          .asFunction<void Function(ffi.Pointer<CXCursor>)>();
+          .asFunction<DartClang_disposeOverriddenCursors>();
 
   /// Retrieve the file that is included by the given inclusion directive
   /// cursor.
@@ -2619,10 +2538,10 @@
   }
 
   late final _clang_getIncludedFilePtr =
-      _lookup<ffi.NativeFunction<Native_clang_getIncludedFile>>(
+      _lookup<ffi.NativeFunction<NativeClang_getIncludedFile>>(
           'clang_getIncludedFile');
   late final _clang_getIncludedFile =
-      _clang_getIncludedFilePtr.asFunction<CXFile Function(CXCursor)>();
+      _clang_getIncludedFilePtr.asFunction<DartClang_getIncludedFile>();
 
   /// Map a source location to the cursor that describes the entity at that
   /// location in the source code.
@@ -2648,9 +2567,9 @@
   }
 
   late final _clang_getCursorPtr =
-      _lookup<ffi.NativeFunction<Native_clang_getCursor>>('clang_getCursor');
-  late final _clang_getCursor = _clang_getCursorPtr
-      .asFunction<CXCursor Function(CXTranslationUnit, CXSourceLocation)>();
+      _lookup<ffi.NativeFunction<NativeClang_getCursor>>('clang_getCursor');
+  late final _clang_getCursor =
+      _clang_getCursorPtr.asFunction<DartClang_getCursor>();
 
   /// Retrieve the physical location of the source constructor referenced
   /// by the given cursor.
@@ -2669,10 +2588,10 @@
   }
 
   late final _clang_getCursorLocationPtr =
-      _lookup<ffi.NativeFunction<Native_clang_getCursorLocation>>(
+      _lookup<ffi.NativeFunction<NativeClang_getCursorLocation>>(
           'clang_getCursorLocation');
-  late final _clang_getCursorLocation = _clang_getCursorLocationPtr
-      .asFunction<CXSourceLocation Function(CXCursor)>();
+  late final _clang_getCursorLocation =
+      _clang_getCursorLocationPtr.asFunction<DartClang_getCursorLocation>();
 
   /// Retrieve the physical extent of the source construct referenced by
   /// the given cursor.
@@ -2692,10 +2611,10 @@
   }
 
   late final _clang_getCursorExtentPtr =
-      _lookup<ffi.NativeFunction<Native_clang_getCursorExtent>>(
+      _lookup<ffi.NativeFunction<NativeClang_getCursorExtent>>(
           'clang_getCursorExtent');
   late final _clang_getCursorExtent =
-      _clang_getCursorExtentPtr.asFunction<CXSourceRange Function(CXCursor)>();
+      _clang_getCursorExtentPtr.asFunction<DartClang_getCursorExtent>();
 
   /// Retrieve the type of a CXCursor (if any).
   CXType clang_getCursorType(
@@ -2707,10 +2626,10 @@
   }
 
   late final _clang_getCursorTypePtr =
-      _lookup<ffi.NativeFunction<Native_clang_getCursorType>>(
+      _lookup<ffi.NativeFunction<NativeClang_getCursorType>>(
           'clang_getCursorType');
   late final _clang_getCursorType =
-      _clang_getCursorTypePtr.asFunction<CXType Function(CXCursor)>();
+      _clang_getCursorTypePtr.asFunction<DartClang_getCursorType>();
 
   /// Pretty-print the underlying type using the rules of the
   /// language of the translation unit from which it came.
@@ -2725,10 +2644,10 @@
   }
 
   late final _clang_getTypeSpellingPtr =
-      _lookup<ffi.NativeFunction<Native_clang_getTypeSpelling>>(
+      _lookup<ffi.NativeFunction<NativeClang_getTypeSpelling>>(
           'clang_getTypeSpelling');
   late final _clang_getTypeSpelling =
-      _clang_getTypeSpellingPtr.asFunction<CXString Function(CXType)>();
+      _clang_getTypeSpellingPtr.asFunction<DartClang_getTypeSpelling>();
 
   /// Retrieve the underlying type of a typedef declaration.
   ///
@@ -2743,11 +2662,11 @@
   }
 
   late final _clang_getTypedefDeclUnderlyingTypePtr =
-      _lookup<ffi.NativeFunction<Native_clang_getTypedefDeclUnderlyingType>>(
+      _lookup<ffi.NativeFunction<NativeClang_getTypedefDeclUnderlyingType>>(
           'clang_getTypedefDeclUnderlyingType');
   late final _clang_getTypedefDeclUnderlyingType =
       _clang_getTypedefDeclUnderlyingTypePtr
-          .asFunction<CXType Function(CXCursor)>();
+          .asFunction<DartClang_getTypedefDeclUnderlyingType>();
 
   /// Retrieve the integer type of an enum declaration.
   ///
@@ -2762,10 +2681,10 @@
   }
 
   late final _clang_getEnumDeclIntegerTypePtr =
-      _lookup<ffi.NativeFunction<Native_clang_getEnumDeclIntegerType>>(
+      _lookup<ffi.NativeFunction<NativeClang_getEnumDeclIntegerType>>(
           'clang_getEnumDeclIntegerType');
-  late final _clang_getEnumDeclIntegerType =
-      _clang_getEnumDeclIntegerTypePtr.asFunction<CXType Function(CXCursor)>();
+  late final _clang_getEnumDeclIntegerType = _clang_getEnumDeclIntegerTypePtr
+      .asFunction<DartClang_getEnumDeclIntegerType>();
 
   /// Retrieve the integer value of an enum constant declaration as a signed
   /// long long.
@@ -2782,10 +2701,11 @@
   }
 
   late final _clang_getEnumConstantDeclValuePtr =
-      _lookup<ffi.NativeFunction<Native_clang_getEnumConstantDeclValue>>(
+      _lookup<ffi.NativeFunction<NativeClang_getEnumConstantDeclValue>>(
           'clang_getEnumConstantDeclValue');
   late final _clang_getEnumConstantDeclValue =
-      _clang_getEnumConstantDeclValuePtr.asFunction<int Function(CXCursor)>();
+      _clang_getEnumConstantDeclValuePtr
+          .asFunction<DartClang_getEnumConstantDeclValue>();
 
   /// Retrieve the integer value of an enum constant declaration as an unsigned
   /// long long.
@@ -2801,12 +2721,12 @@
     );
   }
 
-  late final _clang_getEnumConstantDeclUnsignedValuePtr = _lookup<
-          ffi.NativeFunction<Native_clang_getEnumConstantDeclUnsignedValue>>(
-      'clang_getEnumConstantDeclUnsignedValue');
+  late final _clang_getEnumConstantDeclUnsignedValuePtr =
+      _lookup<ffi.NativeFunction<NativeClang_getEnumConstantDeclUnsignedValue>>(
+          'clang_getEnumConstantDeclUnsignedValue');
   late final _clang_getEnumConstantDeclUnsignedValue =
       _clang_getEnumConstantDeclUnsignedValuePtr
-          .asFunction<int Function(CXCursor)>();
+          .asFunction<DartClang_getEnumConstantDeclUnsignedValue>();
 
   /// Retrieve the bit width of a bit field declaration as an integer.
   ///
@@ -2820,10 +2740,10 @@
   }
 
   late final _clang_getFieldDeclBitWidthPtr =
-      _lookup<ffi.NativeFunction<Native_clang_getFieldDeclBitWidth>>(
+      _lookup<ffi.NativeFunction<NativeClang_getFieldDeclBitWidth>>(
           'clang_getFieldDeclBitWidth');
-  late final _clang_getFieldDeclBitWidth =
-      _clang_getFieldDeclBitWidthPtr.asFunction<int Function(CXCursor)>();
+  late final _clang_getFieldDeclBitWidth = _clang_getFieldDeclBitWidthPtr
+      .asFunction<DartClang_getFieldDeclBitWidth>();
 
   /// Retrieve the number of non-variadic arguments associated with a given
   /// cursor.
@@ -2839,10 +2759,10 @@
   }
 
   late final _clang_Cursor_getNumArgumentsPtr =
-      _lookup<ffi.NativeFunction<Native_clang_Cursor_getNumArguments>>(
+      _lookup<ffi.NativeFunction<NativeClang_Cursor_getNumArguments>>(
           'clang_Cursor_getNumArguments');
-  late final _clang_Cursor_getNumArguments =
-      _clang_Cursor_getNumArgumentsPtr.asFunction<int Function(CXCursor)>();
+  late final _clang_Cursor_getNumArguments = _clang_Cursor_getNumArgumentsPtr
+      .asFunction<DartClang_Cursor_getNumArguments>();
 
   /// Retrieve the argument cursor of a function or method.
   ///
@@ -2860,10 +2780,10 @@
   }
 
   late final _clang_Cursor_getArgumentPtr =
-      _lookup<ffi.NativeFunction<Native_clang_Cursor_getArgument>>(
+      _lookup<ffi.NativeFunction<NativeClang_Cursor_getArgument>>(
           'clang_Cursor_getArgument');
-  late final _clang_Cursor_getArgument = _clang_Cursor_getArgumentPtr
-      .asFunction<CXCursor Function(CXCursor, int)>();
+  late final _clang_Cursor_getArgument =
+      _clang_Cursor_getArgumentPtr.asFunction<DartClang_Cursor_getArgument>();
 
   /// Returns the number of template args of a function decl representing a
   /// template specialization.
@@ -2888,11 +2808,11 @@
   }
 
   late final _clang_Cursor_getNumTemplateArgumentsPtr =
-      _lookup<ffi.NativeFunction<Native_clang_Cursor_getNumTemplateArguments>>(
+      _lookup<ffi.NativeFunction<NativeClang_Cursor_getNumTemplateArguments>>(
           'clang_Cursor_getNumTemplateArguments');
   late final _clang_Cursor_getNumTemplateArguments =
       _clang_Cursor_getNumTemplateArgumentsPtr
-          .asFunction<int Function(CXCursor)>();
+          .asFunction<DartClang_Cursor_getNumTemplateArguments>();
 
   /// Retrieve the kind of the I'th template argument of the CXCursor C.
   ///
@@ -2919,11 +2839,11 @@
   }
 
   late final _clang_Cursor_getTemplateArgumentKindPtr =
-      _lookup<ffi.NativeFunction<Native_clang_Cursor_getTemplateArgumentKind>>(
+      _lookup<ffi.NativeFunction<NativeClang_Cursor_getTemplateArgumentKind>>(
           'clang_Cursor_getTemplateArgumentKind');
   late final _clang_Cursor_getTemplateArgumentKind =
       _clang_Cursor_getTemplateArgumentKindPtr
-          .asFunction<int Function(CXCursor, int)>();
+          .asFunction<DartClang_Cursor_getTemplateArgumentKind>();
 
   /// Retrieve a CXType representing the type of a TemplateArgument of a
   /// function decl representing a template specialization.
@@ -2952,11 +2872,11 @@
   }
 
   late final _clang_Cursor_getTemplateArgumentTypePtr =
-      _lookup<ffi.NativeFunction<Native_clang_Cursor_getTemplateArgumentType>>(
+      _lookup<ffi.NativeFunction<NativeClang_Cursor_getTemplateArgumentType>>(
           'clang_Cursor_getTemplateArgumentType');
   late final _clang_Cursor_getTemplateArgumentType =
       _clang_Cursor_getTemplateArgumentTypePtr
-          .asFunction<CXType Function(CXCursor, int)>();
+          .asFunction<DartClang_Cursor_getTemplateArgumentType>();
 
   /// Retrieve the value of an Integral TemplateArgument (of a function
   /// decl representing a template specialization) as a signed long long.
@@ -2984,11 +2904,11 @@
   }
 
   late final _clang_Cursor_getTemplateArgumentValuePtr =
-      _lookup<ffi.NativeFunction<Native_clang_Cursor_getTemplateArgumentValue>>(
+      _lookup<ffi.NativeFunction<NativeClang_Cursor_getTemplateArgumentValue>>(
           'clang_Cursor_getTemplateArgumentValue');
   late final _clang_Cursor_getTemplateArgumentValue =
       _clang_Cursor_getTemplateArgumentValuePtr
-          .asFunction<int Function(CXCursor, int)>();
+          .asFunction<DartClang_Cursor_getTemplateArgumentValue>();
 
   /// Retrieve the value of an Integral TemplateArgument (of a function
   /// decl representing a template specialization) as an unsigned long long.
@@ -3017,11 +2937,11 @@
 
   late final _clang_Cursor_getTemplateArgumentUnsignedValuePtr = _lookup<
           ffi.NativeFunction<
-              Native_clang_Cursor_getTemplateArgumentUnsignedValue>>(
+              NativeClang_Cursor_getTemplateArgumentUnsignedValue>>(
       'clang_Cursor_getTemplateArgumentUnsignedValue');
   late final _clang_Cursor_getTemplateArgumentUnsignedValue =
       _clang_Cursor_getTemplateArgumentUnsignedValuePtr
-          .asFunction<int Function(CXCursor, int)>();
+          .asFunction<DartClang_Cursor_getTemplateArgumentUnsignedValue>();
 
   /// Determine whether two CXTypes represent the same type.
   ///
@@ -3038,9 +2958,9 @@
   }
 
   late final _clang_equalTypesPtr =
-      _lookup<ffi.NativeFunction<Native_clang_equalTypes>>('clang_equalTypes');
+      _lookup<ffi.NativeFunction<NativeClang_equalTypes>>('clang_equalTypes');
   late final _clang_equalTypes =
-      _clang_equalTypesPtr.asFunction<int Function(CXType, CXType)>();
+      _clang_equalTypesPtr.asFunction<DartClang_equalTypes>();
 
   /// Return the canonical type for a CXType.
   ///
@@ -3057,10 +2977,10 @@
   }
 
   late final _clang_getCanonicalTypePtr =
-      _lookup<ffi.NativeFunction<Native_clang_getCanonicalType>>(
+      _lookup<ffi.NativeFunction<NativeClang_getCanonicalType>>(
           'clang_getCanonicalType');
   late final _clang_getCanonicalType =
-      _clang_getCanonicalTypePtr.asFunction<CXType Function(CXType)>();
+      _clang_getCanonicalTypePtr.asFunction<DartClang_getCanonicalType>();
 
   /// Determine whether a CXType has the "const" qualifier set,
   /// without looking through typedefs that may have added "const" at a
@@ -3074,10 +2994,10 @@
   }
 
   late final _clang_isConstQualifiedTypePtr =
-      _lookup<ffi.NativeFunction<Native_clang_isConstQualifiedType>>(
+      _lookup<ffi.NativeFunction<NativeClang_isConstQualifiedType>>(
           'clang_isConstQualifiedType');
-  late final _clang_isConstQualifiedType =
-      _clang_isConstQualifiedTypePtr.asFunction<int Function(CXType)>();
+  late final _clang_isConstQualifiedType = _clang_isConstQualifiedTypePtr
+      .asFunction<DartClang_isConstQualifiedType>();
 
   /// Determine whether a  CXCursor that is a macro, is
   /// function like.
@@ -3090,10 +3010,11 @@
   }
 
   late final _clang_Cursor_isMacroFunctionLikePtr =
-      _lookup<ffi.NativeFunction<Native_clang_Cursor_isMacroFunctionLike>>(
+      _lookup<ffi.NativeFunction<NativeClang_Cursor_isMacroFunctionLike>>(
           'clang_Cursor_isMacroFunctionLike');
   late final _clang_Cursor_isMacroFunctionLike =
-      _clang_Cursor_isMacroFunctionLikePtr.asFunction<int Function(CXCursor)>();
+      _clang_Cursor_isMacroFunctionLikePtr
+          .asFunction<DartClang_Cursor_isMacroFunctionLike>();
 
   /// Determine whether a  CXCursor that is a macro, is a
   /// builtin one.
@@ -3106,10 +3027,10 @@
   }
 
   late final _clang_Cursor_isMacroBuiltinPtr =
-      _lookup<ffi.NativeFunction<Native_clang_Cursor_isMacroBuiltin>>(
+      _lookup<ffi.NativeFunction<NativeClang_Cursor_isMacroBuiltin>>(
           'clang_Cursor_isMacroBuiltin');
-  late final _clang_Cursor_isMacroBuiltin =
-      _clang_Cursor_isMacroBuiltinPtr.asFunction<int Function(CXCursor)>();
+  late final _clang_Cursor_isMacroBuiltin = _clang_Cursor_isMacroBuiltinPtr
+      .asFunction<DartClang_Cursor_isMacroBuiltin>();
 
   /// Determine whether a  CXCursor that is a function declaration, is an
   /// inline declaration.
@@ -3122,10 +3043,11 @@
   }
 
   late final _clang_Cursor_isFunctionInlinedPtr =
-      _lookup<ffi.NativeFunction<Native_clang_Cursor_isFunctionInlined>>(
+      _lookup<ffi.NativeFunction<NativeClang_Cursor_isFunctionInlined>>(
           'clang_Cursor_isFunctionInlined');
   late final _clang_Cursor_isFunctionInlined =
-      _clang_Cursor_isFunctionInlinedPtr.asFunction<int Function(CXCursor)>();
+      _clang_Cursor_isFunctionInlinedPtr
+          .asFunction<DartClang_Cursor_isFunctionInlined>();
 
   /// Determine whether a CXType has the "volatile" qualifier set,
   /// without looking through typedefs that may have added "volatile" at
@@ -3139,10 +3061,10 @@
   }
 
   late final _clang_isVolatileQualifiedTypePtr =
-      _lookup<ffi.NativeFunction<Native_clang_isVolatileQualifiedType>>(
+      _lookup<ffi.NativeFunction<NativeClang_isVolatileQualifiedType>>(
           'clang_isVolatileQualifiedType');
-  late final _clang_isVolatileQualifiedType =
-      _clang_isVolatileQualifiedTypePtr.asFunction<int Function(CXType)>();
+  late final _clang_isVolatileQualifiedType = _clang_isVolatileQualifiedTypePtr
+      .asFunction<DartClang_isVolatileQualifiedType>();
 
   /// Determine whether a CXType has the "restrict" qualifier set,
   /// without looking through typedefs that may have added "restrict" at a
@@ -3156,10 +3078,10 @@
   }
 
   late final _clang_isRestrictQualifiedTypePtr =
-      _lookup<ffi.NativeFunction<Native_clang_isRestrictQualifiedType>>(
+      _lookup<ffi.NativeFunction<NativeClang_isRestrictQualifiedType>>(
           'clang_isRestrictQualifiedType');
-  late final _clang_isRestrictQualifiedType =
-      _clang_isRestrictQualifiedTypePtr.asFunction<int Function(CXType)>();
+  late final _clang_isRestrictQualifiedType = _clang_isRestrictQualifiedTypePtr
+      .asFunction<DartClang_isRestrictQualifiedType>();
 
   /// Returns the address space of the given type.
   int clang_getAddressSpace(
@@ -3171,10 +3093,10 @@
   }
 
   late final _clang_getAddressSpacePtr =
-      _lookup<ffi.NativeFunction<Native_clang_getAddressSpace>>(
+      _lookup<ffi.NativeFunction<NativeClang_getAddressSpace>>(
           'clang_getAddressSpace');
   late final _clang_getAddressSpace =
-      _clang_getAddressSpacePtr.asFunction<int Function(CXType)>();
+      _clang_getAddressSpacePtr.asFunction<DartClang_getAddressSpace>();
 
   /// Returns the typedef name of the given type.
   CXString clang_getTypedefName(
@@ -3186,10 +3108,10 @@
   }
 
   late final _clang_getTypedefNamePtr =
-      _lookup<ffi.NativeFunction<Native_clang_getTypedefName>>(
+      _lookup<ffi.NativeFunction<NativeClang_getTypedefName>>(
           'clang_getTypedefName');
   late final _clang_getTypedefName =
-      _clang_getTypedefNamePtr.asFunction<CXString Function(CXType)>();
+      _clang_getTypedefNamePtr.asFunction<DartClang_getTypedefName>();
 
   /// For pointer types, returns the type of the pointee.
   CXType clang_getPointeeType(
@@ -3201,10 +3123,10 @@
   }
 
   late final _clang_getPointeeTypePtr =
-      _lookup<ffi.NativeFunction<Native_clang_getPointeeType>>(
+      _lookup<ffi.NativeFunction<NativeClang_getPointeeType>>(
           'clang_getPointeeType');
   late final _clang_getPointeeType =
-      _clang_getPointeeTypePtr.asFunction<CXType Function(CXType)>();
+      _clang_getPointeeTypePtr.asFunction<DartClang_getPointeeType>();
 
   /// Return the cursor for the declaration of the given type.
   CXCursor clang_getTypeDeclaration(
@@ -3216,10 +3138,10 @@
   }
 
   late final _clang_getTypeDeclarationPtr =
-      _lookup<ffi.NativeFunction<Native_clang_getTypeDeclaration>>(
+      _lookup<ffi.NativeFunction<NativeClang_getTypeDeclaration>>(
           'clang_getTypeDeclaration');
   late final _clang_getTypeDeclaration =
-      _clang_getTypeDeclarationPtr.asFunction<CXCursor Function(CXType)>();
+      _clang_getTypeDeclarationPtr.asFunction<DartClang_getTypeDeclaration>();
 
   /// Returns the Objective-C type encoding for the specified declaration.
   CXString clang_getDeclObjCTypeEncoding(
@@ -3231,10 +3153,10 @@
   }
 
   late final _clang_getDeclObjCTypeEncodingPtr =
-      _lookup<ffi.NativeFunction<Native_clang_getDeclObjCTypeEncoding>>(
+      _lookup<ffi.NativeFunction<NativeClang_getDeclObjCTypeEncoding>>(
           'clang_getDeclObjCTypeEncoding');
   late final _clang_getDeclObjCTypeEncoding = _clang_getDeclObjCTypeEncodingPtr
-      .asFunction<CXString Function(CXCursor)>();
+      .asFunction<DartClang_getDeclObjCTypeEncoding>();
 
   /// Returns the Objective-C type encoding for the specified CXType.
   CXString clang_Type_getObjCEncoding(
@@ -3246,10 +3168,10 @@
   }
 
   late final _clang_Type_getObjCEncodingPtr =
-      _lookup<ffi.NativeFunction<Native_clang_Type_getObjCEncoding>>(
+      _lookup<ffi.NativeFunction<NativeClang_Type_getObjCEncoding>>(
           'clang_Type_getObjCEncoding');
-  late final _clang_Type_getObjCEncoding =
-      _clang_Type_getObjCEncodingPtr.asFunction<CXString Function(CXType)>();
+  late final _clang_Type_getObjCEncoding = _clang_Type_getObjCEncodingPtr
+      .asFunction<DartClang_Type_getObjCEncoding>();
 
   /// Retrieve the spelling of a given CXTypeKind.
   CXString clang_getTypeKindSpelling(
@@ -3261,10 +3183,10 @@
   }
 
   late final _clang_getTypeKindSpellingPtr =
-      _lookup<ffi.NativeFunction<Native_clang_getTypeKindSpelling>>(
+      _lookup<ffi.NativeFunction<NativeClang_getTypeKindSpelling>>(
           'clang_getTypeKindSpelling');
   late final _clang_getTypeKindSpelling =
-      _clang_getTypeKindSpellingPtr.asFunction<CXString Function(int)>();
+      _clang_getTypeKindSpellingPtr.asFunction<DartClang_getTypeKindSpelling>();
 
   /// Retrieve the calling convention associated with a function type.
   ///
@@ -3278,10 +3200,11 @@
   }
 
   late final _clang_getFunctionTypeCallingConvPtr =
-      _lookup<ffi.NativeFunction<Native_clang_getFunctionTypeCallingConv>>(
+      _lookup<ffi.NativeFunction<NativeClang_getFunctionTypeCallingConv>>(
           'clang_getFunctionTypeCallingConv');
   late final _clang_getFunctionTypeCallingConv =
-      _clang_getFunctionTypeCallingConvPtr.asFunction<int Function(CXType)>();
+      _clang_getFunctionTypeCallingConvPtr
+          .asFunction<DartClang_getFunctionTypeCallingConv>();
 
   /// Retrieve the return type associated with a function type.
   ///
@@ -3295,10 +3218,10 @@
   }
 
   late final _clang_getResultTypePtr =
-      _lookup<ffi.NativeFunction<Native_clang_getResultType>>(
+      _lookup<ffi.NativeFunction<NativeClang_getResultType>>(
           'clang_getResultType');
   late final _clang_getResultType =
-      _clang_getResultTypePtr.asFunction<CXType Function(CXType)>();
+      _clang_getResultTypePtr.asFunction<DartClang_getResultType>();
 
   /// Retrieve the exception specification type associated with a function type.
   /// This is a value of type CXCursor_ExceptionSpecificationKind.
@@ -3313,11 +3236,11 @@
   }
 
   late final _clang_getExceptionSpecificationTypePtr =
-      _lookup<ffi.NativeFunction<Native_clang_getExceptionSpecificationType>>(
+      _lookup<ffi.NativeFunction<NativeClang_getExceptionSpecificationType>>(
           'clang_getExceptionSpecificationType');
   late final _clang_getExceptionSpecificationType =
       _clang_getExceptionSpecificationTypePtr
-          .asFunction<int Function(CXType)>();
+          .asFunction<DartClang_getExceptionSpecificationType>();
 
   /// Retrieve the number of non-variadic parameters associated with a
   /// function type.
@@ -3332,10 +3255,10 @@
   }
 
   late final _clang_getNumArgTypesPtr =
-      _lookup<ffi.NativeFunction<Native_clang_getNumArgTypes>>(
+      _lookup<ffi.NativeFunction<NativeClang_getNumArgTypes>>(
           'clang_getNumArgTypes');
   late final _clang_getNumArgTypes =
-      _clang_getNumArgTypesPtr.asFunction<int Function(CXType)>();
+      _clang_getNumArgTypesPtr.asFunction<DartClang_getNumArgTypes>();
 
   /// Retrieve the type of a parameter of a function type.
   ///
@@ -3352,9 +3275,9 @@
   }
 
   late final _clang_getArgTypePtr =
-      _lookup<ffi.NativeFunction<Native_clang_getArgType>>('clang_getArgType');
+      _lookup<ffi.NativeFunction<NativeClang_getArgType>>('clang_getArgType');
   late final _clang_getArgType =
-      _clang_getArgTypePtr.asFunction<CXType Function(CXType, int)>();
+      _clang_getArgTypePtr.asFunction<DartClang_getArgType>();
 
   /// Retrieves the base type of the ObjCObjectType.
   ///
@@ -3368,11 +3291,11 @@
   }
 
   late final _clang_Type_getObjCObjectBaseTypePtr =
-      _lookup<ffi.NativeFunction<Native_clang_Type_getObjCObjectBaseType>>(
+      _lookup<ffi.NativeFunction<NativeClang_Type_getObjCObjectBaseType>>(
           'clang_Type_getObjCObjectBaseType');
   late final _clang_Type_getObjCObjectBaseType =
       _clang_Type_getObjCObjectBaseTypePtr
-          .asFunction<CXType Function(CXType)>();
+          .asFunction<DartClang_Type_getObjCObjectBaseType>();
 
   /// Retrieve the number of protocol references associated with an ObjC object/id.
   ///
@@ -3386,10 +3309,11 @@
   }
 
   late final _clang_Type_getNumObjCProtocolRefsPtr =
-      _lookup<ffi.NativeFunction<Native_clang_Type_getNumObjCProtocolRefs>>(
+      _lookup<ffi.NativeFunction<NativeClang_Type_getNumObjCProtocolRefs>>(
           'clang_Type_getNumObjCProtocolRefs');
   late final _clang_Type_getNumObjCProtocolRefs =
-      _clang_Type_getNumObjCProtocolRefsPtr.asFunction<int Function(CXType)>();
+      _clang_Type_getNumObjCProtocolRefsPtr
+          .asFunction<DartClang_Type_getNumObjCProtocolRefs>();
 
   /// Retrieve the decl for a protocol reference for an ObjC object/id.
   ///
@@ -3406,11 +3330,11 @@
   }
 
   late final _clang_Type_getObjCProtocolDeclPtr =
-      _lookup<ffi.NativeFunction<Native_clang_Type_getObjCProtocolDecl>>(
+      _lookup<ffi.NativeFunction<NativeClang_Type_getObjCProtocolDecl>>(
           'clang_Type_getObjCProtocolDecl');
   late final _clang_Type_getObjCProtocolDecl =
       _clang_Type_getObjCProtocolDeclPtr
-          .asFunction<CXCursor Function(CXType, int)>();
+          .asFunction<DartClang_Type_getObjCProtocolDecl>();
 
   /// Retreive the number of type arguments associated with an ObjC object.
   ///
@@ -3424,10 +3348,10 @@
   }
 
   late final _clang_Type_getNumObjCTypeArgsPtr =
-      _lookup<ffi.NativeFunction<Native_clang_Type_getNumObjCTypeArgs>>(
+      _lookup<ffi.NativeFunction<NativeClang_Type_getNumObjCTypeArgs>>(
           'clang_Type_getNumObjCTypeArgs');
-  late final _clang_Type_getNumObjCTypeArgs =
-      _clang_Type_getNumObjCTypeArgsPtr.asFunction<int Function(CXType)>();
+  late final _clang_Type_getNumObjCTypeArgs = _clang_Type_getNumObjCTypeArgsPtr
+      .asFunction<DartClang_Type_getNumObjCTypeArgs>();
 
   /// Retrieve a type argument associated with an ObjC object.
   ///
@@ -3444,10 +3368,10 @@
   }
 
   late final _clang_Type_getObjCTypeArgPtr =
-      _lookup<ffi.NativeFunction<Native_clang_Type_getObjCTypeArg>>(
+      _lookup<ffi.NativeFunction<NativeClang_Type_getObjCTypeArg>>(
           'clang_Type_getObjCTypeArg');
   late final _clang_Type_getObjCTypeArg =
-      _clang_Type_getObjCTypeArgPtr.asFunction<CXType Function(CXType, int)>();
+      _clang_Type_getObjCTypeArgPtr.asFunction<DartClang_Type_getObjCTypeArg>();
 
   /// Return 1 if the CXType is a variadic function type, and 0 otherwise.
   int clang_isFunctionTypeVariadic(
@@ -3459,10 +3383,10 @@
   }
 
   late final _clang_isFunctionTypeVariadicPtr =
-      _lookup<ffi.NativeFunction<Native_clang_isFunctionTypeVariadic>>(
+      _lookup<ffi.NativeFunction<NativeClang_isFunctionTypeVariadic>>(
           'clang_isFunctionTypeVariadic');
-  late final _clang_isFunctionTypeVariadic =
-      _clang_isFunctionTypeVariadicPtr.asFunction<int Function(CXType)>();
+  late final _clang_isFunctionTypeVariadic = _clang_isFunctionTypeVariadicPtr
+      .asFunction<DartClang_isFunctionTypeVariadic>();
 
   /// Retrieve the return type associated with a given cursor.
   ///
@@ -3476,10 +3400,10 @@
   }
 
   late final _clang_getCursorResultTypePtr =
-      _lookup<ffi.NativeFunction<Native_clang_getCursorResultType>>(
+      _lookup<ffi.NativeFunction<NativeClang_getCursorResultType>>(
           'clang_getCursorResultType');
   late final _clang_getCursorResultType =
-      _clang_getCursorResultTypePtr.asFunction<CXType Function(CXCursor)>();
+      _clang_getCursorResultTypePtr.asFunction<DartClang_getCursorResultType>();
 
   /// Retrieve the exception specification type associated with a given cursor.
   /// This is a value of type CXCursor_ExceptionSpecificationKind.
@@ -3494,11 +3418,11 @@
   }
 
   late final _clang_getCursorExceptionSpecificationTypePtr = _lookup<
-          ffi.NativeFunction<Native_clang_getCursorExceptionSpecificationType>>(
+          ffi.NativeFunction<NativeClang_getCursorExceptionSpecificationType>>(
       'clang_getCursorExceptionSpecificationType');
   late final _clang_getCursorExceptionSpecificationType =
       _clang_getCursorExceptionSpecificationTypePtr
-          .asFunction<int Function(CXCursor)>();
+          .asFunction<DartClang_getCursorExceptionSpecificationType>();
 
   /// Return 1 if the CXType is a POD (plain old data) type, and 0
   /// otherwise.
@@ -3511,9 +3435,9 @@
   }
 
   late final _clang_isPODTypePtr =
-      _lookup<ffi.NativeFunction<Native_clang_isPODType>>('clang_isPODType');
+      _lookup<ffi.NativeFunction<NativeClang_isPODType>>('clang_isPODType');
   late final _clang_isPODType =
-      _clang_isPODTypePtr.asFunction<int Function(CXType)>();
+      _clang_isPODTypePtr.asFunction<DartClang_isPODType>();
 
   /// Return the element type of an array, complex, or vector type.
   ///
@@ -3528,10 +3452,10 @@
   }
 
   late final _clang_getElementTypePtr =
-      _lookup<ffi.NativeFunction<Native_clang_getElementType>>(
+      _lookup<ffi.NativeFunction<NativeClang_getElementType>>(
           'clang_getElementType');
   late final _clang_getElementType =
-      _clang_getElementTypePtr.asFunction<CXType Function(CXType)>();
+      _clang_getElementTypePtr.asFunction<DartClang_getElementType>();
 
   /// Return the number of elements of an array or vector type.
   ///
@@ -3546,10 +3470,10 @@
   }
 
   late final _clang_getNumElementsPtr =
-      _lookup<ffi.NativeFunction<Native_clang_getNumElements>>(
+      _lookup<ffi.NativeFunction<NativeClang_getNumElements>>(
           'clang_getNumElements');
   late final _clang_getNumElements =
-      _clang_getNumElementsPtr.asFunction<int Function(CXType)>();
+      _clang_getNumElementsPtr.asFunction<DartClang_getNumElements>();
 
   /// Return the element type of an array type.
   ///
@@ -3563,10 +3487,10 @@
   }
 
   late final _clang_getArrayElementTypePtr =
-      _lookup<ffi.NativeFunction<Native_clang_getArrayElementType>>(
+      _lookup<ffi.NativeFunction<NativeClang_getArrayElementType>>(
           'clang_getArrayElementType');
   late final _clang_getArrayElementType =
-      _clang_getArrayElementTypePtr.asFunction<CXType Function(CXType)>();
+      _clang_getArrayElementTypePtr.asFunction<DartClang_getArrayElementType>();
 
   /// Return the array size of a constant array.
   ///
@@ -3580,10 +3504,10 @@
   }
 
   late final _clang_getArraySizePtr =
-      _lookup<ffi.NativeFunction<Native_clang_getArraySize>>(
+      _lookup<ffi.NativeFunction<NativeClang_getArraySize>>(
           'clang_getArraySize');
   late final _clang_getArraySize =
-      _clang_getArraySizePtr.asFunction<int Function(CXType)>();
+      _clang_getArraySizePtr.asFunction<DartClang_getArraySize>();
 
   /// Retrieve the type named by the qualified-id.
   ///
@@ -3597,10 +3521,10 @@
   }
 
   late final _clang_Type_getNamedTypePtr =
-      _lookup<ffi.NativeFunction<Native_clang_Type_getNamedType>>(
+      _lookup<ffi.NativeFunction<NativeClang_Type_getNamedType>>(
           'clang_Type_getNamedType');
   late final _clang_Type_getNamedType =
-      _clang_Type_getNamedTypePtr.asFunction<CXType Function(CXType)>();
+      _clang_Type_getNamedTypePtr.asFunction<DartClang_Type_getNamedType>();
 
   /// Determine if a typedef is 'transparent' tag.
   ///
@@ -3617,10 +3541,11 @@
   }
 
   late final _clang_Type_isTransparentTagTypedefPtr =
-      _lookup<ffi.NativeFunction<Native_clang_Type_isTransparentTagTypedef>>(
+      _lookup<ffi.NativeFunction<NativeClang_Type_isTransparentTagTypedef>>(
           'clang_Type_isTransparentTagTypedef');
   late final _clang_Type_isTransparentTagTypedef =
-      _clang_Type_isTransparentTagTypedefPtr.asFunction<int Function(CXType)>();
+      _clang_Type_isTransparentTagTypedefPtr
+          .asFunction<DartClang_Type_isTransparentTagTypedef>();
 
   /// Retrieve the nullability kind of a pointer type.
   int clang_Type_getNullability(
@@ -3632,10 +3557,10 @@
   }
 
   late final _clang_Type_getNullabilityPtr =
-      _lookup<ffi.NativeFunction<Native_clang_Type_getNullability>>(
+      _lookup<ffi.NativeFunction<NativeClang_Type_getNullability>>(
           'clang_Type_getNullability');
   late final _clang_Type_getNullability =
-      _clang_Type_getNullabilityPtr.asFunction<int Function(CXType)>();
+      _clang_Type_getNullabilityPtr.asFunction<DartClang_Type_getNullability>();
 
   /// Return the alignment of a type in bytes as per C++[expr.alignof]
   /// standard.
@@ -3656,10 +3581,10 @@
   }
 
   late final _clang_Type_getAlignOfPtr =
-      _lookup<ffi.NativeFunction<Native_clang_Type_getAlignOf>>(
+      _lookup<ffi.NativeFunction<NativeClang_Type_getAlignOf>>(
           'clang_Type_getAlignOf');
   late final _clang_Type_getAlignOf =
-      _clang_Type_getAlignOfPtr.asFunction<int Function(CXType)>();
+      _clang_Type_getAlignOfPtr.asFunction<DartClang_Type_getAlignOf>();
 
   /// Return the class type of an member pointer type.
   ///
@@ -3673,10 +3598,10 @@
   }
 
   late final _clang_Type_getClassTypePtr =
-      _lookup<ffi.NativeFunction<Native_clang_Type_getClassType>>(
+      _lookup<ffi.NativeFunction<NativeClang_Type_getClassType>>(
           'clang_Type_getClassType');
   late final _clang_Type_getClassType =
-      _clang_Type_getClassTypePtr.asFunction<CXType Function(CXType)>();
+      _clang_Type_getClassTypePtr.asFunction<DartClang_Type_getClassType>();
 
   /// Return the size of a type in bytes as per C++[expr.sizeof] standard.
   ///
@@ -3694,10 +3619,10 @@
   }
 
   late final _clang_Type_getSizeOfPtr =
-      _lookup<ffi.NativeFunction<Native_clang_Type_getSizeOf>>(
+      _lookup<ffi.NativeFunction<NativeClang_Type_getSizeOf>>(
           'clang_Type_getSizeOf');
   late final _clang_Type_getSizeOf =
-      _clang_Type_getSizeOfPtr.asFunction<int Function(CXType)>();
+      _clang_Type_getSizeOfPtr.asFunction<DartClang_Type_getSizeOf>();
 
   /// 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]
@@ -3721,10 +3646,10 @@
   }
 
   late final _clang_Type_getOffsetOfPtr =
-      _lookup<ffi.NativeFunction<Native_clang_Type_getOffsetOf>>(
+      _lookup<ffi.NativeFunction<NativeClang_Type_getOffsetOf>>(
           'clang_Type_getOffsetOf');
-  late final _clang_Type_getOffsetOf = _clang_Type_getOffsetOfPtr
-      .asFunction<int Function(CXType, ffi.Pointer<ffi.Int8>)>();
+  late final _clang_Type_getOffsetOf =
+      _clang_Type_getOffsetOfPtr.asFunction<DartClang_Type_getOffsetOf>();
 
   /// Return the type that was modified by this attributed type.
   ///
@@ -3738,10 +3663,10 @@
   }
 
   late final _clang_Type_getModifiedTypePtr =
-      _lookup<ffi.NativeFunction<Native_clang_Type_getModifiedType>>(
+      _lookup<ffi.NativeFunction<NativeClang_Type_getModifiedType>>(
           'clang_Type_getModifiedType');
-  late final _clang_Type_getModifiedType =
-      _clang_Type_getModifiedTypePtr.asFunction<CXType Function(CXType)>();
+  late final _clang_Type_getModifiedType = _clang_Type_getModifiedTypePtr
+      .asFunction<DartClang_Type_getModifiedType>();
 
   /// Return the offset of the field represented by the Cursor.
   ///
@@ -3763,10 +3688,10 @@
   }
 
   late final _clang_Cursor_getOffsetOfFieldPtr =
-      _lookup<ffi.NativeFunction<Native_clang_Cursor_getOffsetOfField>>(
+      _lookup<ffi.NativeFunction<NativeClang_Cursor_getOffsetOfField>>(
           'clang_Cursor_getOffsetOfField');
-  late final _clang_Cursor_getOffsetOfField =
-      _clang_Cursor_getOffsetOfFieldPtr.asFunction<int Function(CXCursor)>();
+  late final _clang_Cursor_getOffsetOfField = _clang_Cursor_getOffsetOfFieldPtr
+      .asFunction<DartClang_Cursor_getOffsetOfField>();
 
   /// Determine whether the given cursor represents an anonymous
   /// tag or namespace
@@ -3779,10 +3704,10 @@
   }
 
   late final _clang_Cursor_isAnonymousPtr =
-      _lookup<ffi.NativeFunction<Native_clang_Cursor_isAnonymous>>(
+      _lookup<ffi.NativeFunction<NativeClang_Cursor_isAnonymous>>(
           'clang_Cursor_isAnonymous');
   late final _clang_Cursor_isAnonymous =
-      _clang_Cursor_isAnonymousPtr.asFunction<int Function(CXCursor)>();
+      _clang_Cursor_isAnonymousPtr.asFunction<DartClang_Cursor_isAnonymous>();
 
   /// Determine whether the given cursor represents an anonymous record
   /// declaration.
@@ -3795,11 +3720,11 @@
   }
 
   late final _clang_Cursor_isAnonymousRecordDeclPtr =
-      _lookup<ffi.NativeFunction<Native_clang_Cursor_isAnonymousRecordDecl>>(
+      _lookup<ffi.NativeFunction<NativeClang_Cursor_isAnonymousRecordDecl>>(
           'clang_Cursor_isAnonymousRecordDecl');
   late final _clang_Cursor_isAnonymousRecordDecl =
       _clang_Cursor_isAnonymousRecordDeclPtr
-          .asFunction<int Function(CXCursor)>();
+          .asFunction<DartClang_Cursor_isAnonymousRecordDecl>();
 
   /// Determine whether the given cursor represents an inline namespace
   /// declaration.
@@ -3812,10 +3737,11 @@
   }
 
   late final _clang_Cursor_isInlineNamespacePtr =
-      _lookup<ffi.NativeFunction<Native_clang_Cursor_isInlineNamespace>>(
+      _lookup<ffi.NativeFunction<NativeClang_Cursor_isInlineNamespace>>(
           'clang_Cursor_isInlineNamespace');
   late final _clang_Cursor_isInlineNamespace =
-      _clang_Cursor_isInlineNamespacePtr.asFunction<int Function(CXCursor)>();
+      _clang_Cursor_isInlineNamespacePtr
+          .asFunction<DartClang_Cursor_isInlineNamespace>();
 
   /// Returns the number of template arguments for given template
   /// specialization, or -1 if type \c T is not a template specialization.
@@ -3828,10 +3754,11 @@
   }
 
   late final _clang_Type_getNumTemplateArgumentsPtr =
-      _lookup<ffi.NativeFunction<Native_clang_Type_getNumTemplateArguments>>(
+      _lookup<ffi.NativeFunction<NativeClang_Type_getNumTemplateArguments>>(
           'clang_Type_getNumTemplateArguments');
   late final _clang_Type_getNumTemplateArguments =
-      _clang_Type_getNumTemplateArgumentsPtr.asFunction<int Function(CXType)>();
+      _clang_Type_getNumTemplateArgumentsPtr
+          .asFunction<DartClang_Type_getNumTemplateArguments>();
 
   /// Returns the type template argument of a template class specialization
   /// at given index.
@@ -3849,11 +3776,11 @@
   }
 
   late final _clang_Type_getTemplateArgumentAsTypePtr =
-      _lookup<ffi.NativeFunction<Native_clang_Type_getTemplateArgumentAsType>>(
+      _lookup<ffi.NativeFunction<NativeClang_Type_getTemplateArgumentAsType>>(
           'clang_Type_getTemplateArgumentAsType');
   late final _clang_Type_getTemplateArgumentAsType =
       _clang_Type_getTemplateArgumentAsTypePtr
-          .asFunction<CXType Function(CXType, int)>();
+          .asFunction<DartClang_Type_getTemplateArgumentAsType>();
 
   /// Retrieve the ref-qualifier kind of a function or method.
   ///
@@ -3868,10 +3795,10 @@
   }
 
   late final _clang_Type_getCXXRefQualifierPtr =
-      _lookup<ffi.NativeFunction<Native_clang_Type_getCXXRefQualifier>>(
+      _lookup<ffi.NativeFunction<NativeClang_Type_getCXXRefQualifier>>(
           'clang_Type_getCXXRefQualifier');
-  late final _clang_Type_getCXXRefQualifier =
-      _clang_Type_getCXXRefQualifierPtr.asFunction<int Function(CXType)>();
+  late final _clang_Type_getCXXRefQualifier = _clang_Type_getCXXRefQualifierPtr
+      .asFunction<DartClang_Type_getCXXRefQualifier>();
 
   /// Returns non-zero if the cursor specifies a Record member that is a
   /// bitfield.
@@ -3884,10 +3811,10 @@
   }
 
   late final _clang_Cursor_isBitFieldPtr =
-      _lookup<ffi.NativeFunction<Native_clang_Cursor_isBitField>>(
+      _lookup<ffi.NativeFunction<NativeClang_Cursor_isBitField>>(
           'clang_Cursor_isBitField');
   late final _clang_Cursor_isBitField =
-      _clang_Cursor_isBitFieldPtr.asFunction<int Function(CXCursor)>();
+      _clang_Cursor_isBitFieldPtr.asFunction<DartClang_Cursor_isBitField>();
 
   /// Returns 1 if the base class specified by the cursor with kind
   /// CX_CXXBaseSpecifier is virtual.
@@ -3900,10 +3827,10 @@
   }
 
   late final _clang_isVirtualBasePtr =
-      _lookup<ffi.NativeFunction<Native_clang_isVirtualBase>>(
+      _lookup<ffi.NativeFunction<NativeClang_isVirtualBase>>(
           'clang_isVirtualBase');
   late final _clang_isVirtualBase =
-      _clang_isVirtualBasePtr.asFunction<int Function(CXCursor)>();
+      _clang_isVirtualBasePtr.asFunction<DartClang_isVirtualBase>();
 
   /// Returns the access control level for the referenced object.
   ///
@@ -3919,10 +3846,10 @@
   }
 
   late final _clang_getCXXAccessSpecifierPtr =
-      _lookup<ffi.NativeFunction<Native_clang_getCXXAccessSpecifier>>(
+      _lookup<ffi.NativeFunction<NativeClang_getCXXAccessSpecifier>>(
           'clang_getCXXAccessSpecifier');
-  late final _clang_getCXXAccessSpecifier =
-      _clang_getCXXAccessSpecifierPtr.asFunction<int Function(CXCursor)>();
+  late final _clang_getCXXAccessSpecifier = _clang_getCXXAccessSpecifierPtr
+      .asFunction<DartClang_getCXXAccessSpecifier>();
 
   /// Returns the storage class for a function or variable declaration.
   ///
@@ -3937,10 +3864,10 @@
   }
 
   late final _clang_Cursor_getStorageClassPtr =
-      _lookup<ffi.NativeFunction<Native_clang_Cursor_getStorageClass>>(
+      _lookup<ffi.NativeFunction<NativeClang_Cursor_getStorageClass>>(
           'clang_Cursor_getStorageClass');
-  late final _clang_Cursor_getStorageClass =
-      _clang_Cursor_getStorageClassPtr.asFunction<int Function(CXCursor)>();
+  late final _clang_Cursor_getStorageClass = _clang_Cursor_getStorageClassPtr
+      .asFunction<DartClang_Cursor_getStorageClass>();
 
   /// Determine the number of overloaded declarations referenced by a
   /// \c CXCursor_OverloadedDeclRef cursor.
@@ -3958,10 +3885,10 @@
   }
 
   late final _clang_getNumOverloadedDeclsPtr =
-      _lookup<ffi.NativeFunction<Native_clang_getNumOverloadedDecls>>(
+      _lookup<ffi.NativeFunction<NativeClang_getNumOverloadedDecls>>(
           'clang_getNumOverloadedDecls');
-  late final _clang_getNumOverloadedDecls =
-      _clang_getNumOverloadedDeclsPtr.asFunction<int Function(CXCursor)>();
+  late final _clang_getNumOverloadedDecls = _clang_getNumOverloadedDeclsPtr
+      .asFunction<DartClang_getNumOverloadedDecls>();
 
   /// Retrieve a cursor for one of the overloaded declarations referenced
   /// by a \c CXCursor_OverloadedDeclRef cursor.
@@ -3986,10 +3913,10 @@
   }
 
   late final _clang_getOverloadedDeclPtr =
-      _lookup<ffi.NativeFunction<Native_clang_getOverloadedDecl>>(
+      _lookup<ffi.NativeFunction<NativeClang_getOverloadedDecl>>(
           'clang_getOverloadedDecl');
-  late final _clang_getOverloadedDecl = _clang_getOverloadedDeclPtr
-      .asFunction<CXCursor Function(CXCursor, int)>();
+  late final _clang_getOverloadedDecl =
+      _clang_getOverloadedDeclPtr.asFunction<DartClang_getOverloadedDecl>();
 
   /// For cursors representing an iboutletcollection attribute,
   /// this function returns the collection element type.
@@ -4002,11 +3929,11 @@
   }
 
   late final _clang_getIBOutletCollectionTypePtr =
-      _lookup<ffi.NativeFunction<Native_clang_getIBOutletCollectionType>>(
+      _lookup<ffi.NativeFunction<NativeClang_getIBOutletCollectionType>>(
           'clang_getIBOutletCollectionType');
   late final _clang_getIBOutletCollectionType =
       _clang_getIBOutletCollectionTypePtr
-          .asFunction<CXType Function(CXCursor)>();
+          .asFunction<DartClang_getIBOutletCollectionType>();
 
   /// Visit the children of a particular cursor.
   ///
@@ -4041,10 +3968,10 @@
   }
 
   late final _clang_visitChildrenPtr =
-      _lookup<ffi.NativeFunction<Native_clang_visitChildren>>(
+      _lookup<ffi.NativeFunction<NativeClang_visitChildren>>(
           'clang_visitChildren');
-  late final _clang_visitChildren = _clang_visitChildrenPtr
-      .asFunction<int Function(CXCursor, CXCursorVisitor, CXClientData)>();
+  late final _clang_visitChildren =
+      _clang_visitChildrenPtr.asFunction<DartClang_visitChildren>();
 
   /// Retrieve a Unified Symbol Resolution (USR) for the entity referenced
   /// by the given cursor.
@@ -4062,10 +3989,10 @@
   }
 
   late final _clang_getCursorUSRPtr =
-      _lookup<ffi.NativeFunction<Native_clang_getCursorUSR>>(
+      _lookup<ffi.NativeFunction<NativeClang_getCursorUSR>>(
           'clang_getCursorUSR');
   late final _clang_getCursorUSR =
-      _clang_getCursorUSRPtr.asFunction<CXString Function(CXCursor)>();
+      _clang_getCursorUSRPtr.asFunction<DartClang_getCursorUSR>();
 
   /// Construct a USR for a specified Objective-C class.
   CXString clang_constructUSR_ObjCClass(
@@ -4077,10 +4004,10 @@
   }
 
   late final _clang_constructUSR_ObjCClassPtr =
-      _lookup<ffi.NativeFunction<Native_clang_constructUSR_ObjCClass>>(
+      _lookup<ffi.NativeFunction<NativeClang_constructUSR_ObjCClass>>(
           'clang_constructUSR_ObjCClass');
   late final _clang_constructUSR_ObjCClass = _clang_constructUSR_ObjCClassPtr
-      .asFunction<CXString Function(ffi.Pointer<ffi.Int8>)>();
+      .asFunction<DartClang_constructUSR_ObjCClass>();
 
   /// Construct a USR for a specified Objective-C category.
   CXString clang_constructUSR_ObjCCategory(
@@ -4094,11 +4021,11 @@
   }
 
   late final _clang_constructUSR_ObjCCategoryPtr =
-      _lookup<ffi.NativeFunction<Native_clang_constructUSR_ObjCCategory>>(
+      _lookup<ffi.NativeFunction<NativeClang_constructUSR_ObjCCategory>>(
           'clang_constructUSR_ObjCCategory');
   late final _clang_constructUSR_ObjCCategory =
-      _clang_constructUSR_ObjCCategoryPtr.asFunction<
-          CXString Function(ffi.Pointer<ffi.Int8>, ffi.Pointer<ffi.Int8>)>();
+      _clang_constructUSR_ObjCCategoryPtr
+          .asFunction<DartClang_constructUSR_ObjCCategory>();
 
   /// Construct a USR for a specified Objective-C protocol.
   CXString clang_constructUSR_ObjCProtocol(
@@ -4110,11 +4037,11 @@
   }
 
   late final _clang_constructUSR_ObjCProtocolPtr =
-      _lookup<ffi.NativeFunction<Native_clang_constructUSR_ObjCProtocol>>(
+      _lookup<ffi.NativeFunction<NativeClang_constructUSR_ObjCProtocol>>(
           'clang_constructUSR_ObjCProtocol');
   late final _clang_constructUSR_ObjCProtocol =
       _clang_constructUSR_ObjCProtocolPtr
-          .asFunction<CXString Function(ffi.Pointer<ffi.Int8>)>();
+          .asFunction<DartClang_constructUSR_ObjCProtocol>();
 
   /// Construct a USR for a specified Objective-C instance variable and
   /// the USR for its containing class.
@@ -4129,10 +4056,10 @@
   }
 
   late final _clang_constructUSR_ObjCIvarPtr =
-      _lookup<ffi.NativeFunction<Native_clang_constructUSR_ObjCIvar>>(
+      _lookup<ffi.NativeFunction<NativeClang_constructUSR_ObjCIvar>>(
           'clang_constructUSR_ObjCIvar');
   late final _clang_constructUSR_ObjCIvar = _clang_constructUSR_ObjCIvarPtr
-      .asFunction<CXString Function(ffi.Pointer<ffi.Int8>, CXString)>();
+      .asFunction<DartClang_constructUSR_ObjCIvar>();
 
   /// Construct a USR for a specified Objective-C method and
   /// the USR for its containing class.
@@ -4149,10 +4076,10 @@
   }
 
   late final _clang_constructUSR_ObjCMethodPtr =
-      _lookup<ffi.NativeFunction<Native_clang_constructUSR_ObjCMethod>>(
+      _lookup<ffi.NativeFunction<NativeClang_constructUSR_ObjCMethod>>(
           'clang_constructUSR_ObjCMethod');
   late final _clang_constructUSR_ObjCMethod = _clang_constructUSR_ObjCMethodPtr
-      .asFunction<CXString Function(ffi.Pointer<ffi.Int8>, int, CXString)>();
+      .asFunction<DartClang_constructUSR_ObjCMethod>();
 
   /// Construct a USR for a specified Objective-C property and the USR
   /// for its containing class.
@@ -4167,11 +4094,11 @@
   }
 
   late final _clang_constructUSR_ObjCPropertyPtr =
-      _lookup<ffi.NativeFunction<Native_clang_constructUSR_ObjCProperty>>(
+      _lookup<ffi.NativeFunction<NativeClang_constructUSR_ObjCProperty>>(
           'clang_constructUSR_ObjCProperty');
   late final _clang_constructUSR_ObjCProperty =
       _clang_constructUSR_ObjCPropertyPtr
-          .asFunction<CXString Function(ffi.Pointer<ffi.Int8>, CXString)>();
+          .asFunction<DartClang_constructUSR_ObjCProperty>();
 
   /// Retrieve a name for the entity referenced by this cursor.
   CXString clang_getCursorSpelling(
@@ -4183,10 +4110,10 @@
   }
 
   late final _clang_getCursorSpellingPtr =
-      _lookup<ffi.NativeFunction<Native_clang_getCursorSpelling>>(
+      _lookup<ffi.NativeFunction<NativeClang_getCursorSpelling>>(
           'clang_getCursorSpelling');
   late final _clang_getCursorSpelling =
-      _clang_getCursorSpellingPtr.asFunction<CXString Function(CXCursor)>();
+      _clang_getCursorSpellingPtr.asFunction<DartClang_getCursorSpelling>();
 
   /// 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
@@ -4210,11 +4137,11 @@
   }
 
   late final _clang_Cursor_getSpellingNameRangePtr =
-      _lookup<ffi.NativeFunction<Native_clang_Cursor_getSpellingNameRange>>(
+      _lookup<ffi.NativeFunction<NativeClang_Cursor_getSpellingNameRange>>(
           'clang_Cursor_getSpellingNameRange');
   late final _clang_Cursor_getSpellingNameRange =
       _clang_Cursor_getSpellingNameRangePtr
-          .asFunction<CXSourceRange Function(CXCursor, int, int)>();
+          .asFunction<DartClang_Cursor_getSpellingNameRange>();
 
   /// Get a property value for the given printing policy.
   int clang_PrintingPolicy_getProperty(
@@ -4228,11 +4155,11 @@
   }
 
   late final _clang_PrintingPolicy_getPropertyPtr =
-      _lookup<ffi.NativeFunction<Native_clang_PrintingPolicy_getProperty>>(
+      _lookup<ffi.NativeFunction<NativeClang_PrintingPolicy_getProperty>>(
           'clang_PrintingPolicy_getProperty');
   late final _clang_PrintingPolicy_getProperty =
       _clang_PrintingPolicy_getPropertyPtr
-          .asFunction<int Function(CXPrintingPolicy, int)>();
+          .asFunction<DartClang_PrintingPolicy_getProperty>();
 
   /// Set a property value for the given printing policy.
   void clang_PrintingPolicy_setProperty(
@@ -4248,11 +4175,11 @@
   }
 
   late final _clang_PrintingPolicy_setPropertyPtr =
-      _lookup<ffi.NativeFunction<Native_clang_PrintingPolicy_setProperty>>(
+      _lookup<ffi.NativeFunction<NativeClang_PrintingPolicy_setProperty>>(
           'clang_PrintingPolicy_setProperty');
   late final _clang_PrintingPolicy_setProperty =
       _clang_PrintingPolicy_setPropertyPtr
-          .asFunction<void Function(CXPrintingPolicy, int, int)>();
+          .asFunction<DartClang_PrintingPolicy_setProperty>();
 
   /// Retrieve the default policy for the cursor.
   ///
@@ -4267,10 +4194,10 @@
   }
 
   late final _clang_getCursorPrintingPolicyPtr =
-      _lookup<ffi.NativeFunction<Native_clang_getCursorPrintingPolicy>>(
+      _lookup<ffi.NativeFunction<NativeClang_getCursorPrintingPolicy>>(
           'clang_getCursorPrintingPolicy');
   late final _clang_getCursorPrintingPolicy = _clang_getCursorPrintingPolicyPtr
-      .asFunction<CXPrintingPolicy Function(CXCursor)>();
+      .asFunction<DartClang_getCursorPrintingPolicy>();
 
   /// Release a printing policy.
   void clang_PrintingPolicy_dispose(
@@ -4282,10 +4209,10 @@
   }
 
   late final _clang_PrintingPolicy_disposePtr =
-      _lookup<ffi.NativeFunction<Native_clang_PrintingPolicy_dispose>>(
+      _lookup<ffi.NativeFunction<NativeClang_PrintingPolicy_dispose>>(
           'clang_PrintingPolicy_dispose');
   late final _clang_PrintingPolicy_dispose = _clang_PrintingPolicy_disposePtr
-      .asFunction<void Function(CXPrintingPolicy)>();
+      .asFunction<DartClang_PrintingPolicy_dispose>();
 
   /// Pretty print declarations.
   ///
@@ -4307,10 +4234,10 @@
   }
 
   late final _clang_getCursorPrettyPrintedPtr =
-      _lookup<ffi.NativeFunction<Native_clang_getCursorPrettyPrinted>>(
+      _lookup<ffi.NativeFunction<NativeClang_getCursorPrettyPrinted>>(
           'clang_getCursorPrettyPrinted');
   late final _clang_getCursorPrettyPrinted = _clang_getCursorPrettyPrintedPtr
-      .asFunction<CXString Function(CXCursor, CXPrintingPolicy)>();
+      .asFunction<DartClang_getCursorPrettyPrinted>();
 
   /// Retrieve the display name for the entity referenced by this cursor.
   ///
@@ -4326,10 +4253,10 @@
   }
 
   late final _clang_getCursorDisplayNamePtr =
-      _lookup<ffi.NativeFunction<Native_clang_getCursorDisplayName>>(
+      _lookup<ffi.NativeFunction<NativeClang_getCursorDisplayName>>(
           'clang_getCursorDisplayName');
-  late final _clang_getCursorDisplayName =
-      _clang_getCursorDisplayNamePtr.asFunction<CXString Function(CXCursor)>();
+  late final _clang_getCursorDisplayName = _clang_getCursorDisplayNamePtr
+      .asFunction<DartClang_getCursorDisplayName>();
 
   /// For a cursor that is a reference, retrieve a cursor representing the
   /// entity that it references.
@@ -4349,10 +4276,10 @@
   }
 
   late final _clang_getCursorReferencedPtr =
-      _lookup<ffi.NativeFunction<Native_clang_getCursorReferenced>>(
+      _lookup<ffi.NativeFunction<NativeClang_getCursorReferenced>>(
           'clang_getCursorReferenced');
   late final _clang_getCursorReferenced =
-      _clang_getCursorReferencedPtr.asFunction<CXCursor Function(CXCursor)>();
+      _clang_getCursorReferencedPtr.asFunction<DartClang_getCursorReferenced>();
 
   /// For a cursor that is either a reference to or a declaration
   /// of some entity, retrieve a cursor that describes the definition of
@@ -4389,10 +4316,10 @@
   }
 
   late final _clang_getCursorDefinitionPtr =
-      _lookup<ffi.NativeFunction<Native_clang_getCursorDefinition>>(
+      _lookup<ffi.NativeFunction<NativeClang_getCursorDefinition>>(
           'clang_getCursorDefinition');
   late final _clang_getCursorDefinition =
-      _clang_getCursorDefinitionPtr.asFunction<CXCursor Function(CXCursor)>();
+      _clang_getCursorDefinitionPtr.asFunction<DartClang_getCursorDefinition>();
 
   /// Determine whether the declaration pointed to by this cursor
   /// is also a definition of that entity.
@@ -4405,10 +4332,10 @@
   }
 
   late final _clang_isCursorDefinitionPtr =
-      _lookup<ffi.NativeFunction<Native_clang_isCursorDefinition>>(
+      _lookup<ffi.NativeFunction<NativeClang_isCursorDefinition>>(
           'clang_isCursorDefinition');
   late final _clang_isCursorDefinition =
-      _clang_isCursorDefinitionPtr.asFunction<int Function(CXCursor)>();
+      _clang_isCursorDefinitionPtr.asFunction<DartClang_isCursorDefinition>();
 
   /// Retrieve the canonical cursor corresponding to the given cursor.
   ///
@@ -4441,10 +4368,10 @@
   }
 
   late final _clang_getCanonicalCursorPtr =
-      _lookup<ffi.NativeFunction<Native_clang_getCanonicalCursor>>(
+      _lookup<ffi.NativeFunction<NativeClang_getCanonicalCursor>>(
           'clang_getCanonicalCursor');
   late final _clang_getCanonicalCursor =
-      _clang_getCanonicalCursorPtr.asFunction<CXCursor Function(CXCursor)>();
+      _clang_getCanonicalCursorPtr.asFunction<DartClang_getCanonicalCursor>();
 
   /// If the cursor points to a selector identifier in an Objective-C
   /// method or message expression, this returns the selector index.
@@ -4464,11 +4391,11 @@
   }
 
   late final _clang_Cursor_getObjCSelectorIndexPtr =
-      _lookup<ffi.NativeFunction<Native_clang_Cursor_getObjCSelectorIndex>>(
+      _lookup<ffi.NativeFunction<NativeClang_Cursor_getObjCSelectorIndex>>(
           'clang_Cursor_getObjCSelectorIndex');
   late final _clang_Cursor_getObjCSelectorIndex =
       _clang_Cursor_getObjCSelectorIndexPtr
-          .asFunction<int Function(CXCursor)>();
+          .asFunction<DartClang_Cursor_getObjCSelectorIndex>();
 
   /// Given a cursor pointing to a C++ method call or an Objective-C
   /// message, returns non-zero if the method/message is "dynamic", meaning:
@@ -4488,10 +4415,10 @@
   }
 
   late final _clang_Cursor_isDynamicCallPtr =
-      _lookup<ffi.NativeFunction<Native_clang_Cursor_isDynamicCall>>(
+      _lookup<ffi.NativeFunction<NativeClang_Cursor_isDynamicCall>>(
           'clang_Cursor_isDynamicCall');
-  late final _clang_Cursor_isDynamicCall =
-      _clang_Cursor_isDynamicCallPtr.asFunction<int Function(CXCursor)>();
+  late final _clang_Cursor_isDynamicCall = _clang_Cursor_isDynamicCallPtr
+      .asFunction<DartClang_Cursor_isDynamicCall>();
 
   /// Given a cursor pointing to an Objective-C message or property
   /// reference, or C++ method call, returns the CXType of the receiver.
@@ -4504,10 +4431,10 @@
   }
 
   late final _clang_Cursor_getReceiverTypePtr =
-      _lookup<ffi.NativeFunction<Native_clang_Cursor_getReceiverType>>(
+      _lookup<ffi.NativeFunction<NativeClang_Cursor_getReceiverType>>(
           'clang_Cursor_getReceiverType');
-  late final _clang_Cursor_getReceiverType =
-      _clang_Cursor_getReceiverTypePtr.asFunction<CXType Function(CXCursor)>();
+  late final _clang_Cursor_getReceiverType = _clang_Cursor_getReceiverTypePtr
+      .asFunction<DartClang_Cursor_getReceiverType>();
 
   /// Given a cursor that represents a property declaration, return the
   /// associated property attributes. The bits are formed from
@@ -4524,12 +4451,12 @@
     );
   }
 
-  late final _clang_Cursor_getObjCPropertyAttributesPtr = _lookup<
-          ffi.NativeFunction<Native_clang_Cursor_getObjCPropertyAttributes>>(
-      'clang_Cursor_getObjCPropertyAttributes');
+  late final _clang_Cursor_getObjCPropertyAttributesPtr =
+      _lookup<ffi.NativeFunction<NativeClang_Cursor_getObjCPropertyAttributes>>(
+          'clang_Cursor_getObjCPropertyAttributes');
   late final _clang_Cursor_getObjCPropertyAttributes =
       _clang_Cursor_getObjCPropertyAttributesPtr
-          .asFunction<int Function(CXCursor, int)>();
+          .asFunction<DartClang_Cursor_getObjCPropertyAttributes>();
 
   /// Given a cursor that represents a property declaration, return the
   /// name of the method that implements the getter.
@@ -4541,12 +4468,12 @@
     );
   }
 
-  late final _clang_Cursor_getObjCPropertyGetterNamePtr = _lookup<
-          ffi.NativeFunction<Native_clang_Cursor_getObjCPropertyGetterName>>(
-      'clang_Cursor_getObjCPropertyGetterName');
+  late final _clang_Cursor_getObjCPropertyGetterNamePtr =
+      _lookup<ffi.NativeFunction<NativeClang_Cursor_getObjCPropertyGetterName>>(
+          'clang_Cursor_getObjCPropertyGetterName');
   late final _clang_Cursor_getObjCPropertyGetterName =
       _clang_Cursor_getObjCPropertyGetterNamePtr
-          .asFunction<CXString Function(CXCursor)>();
+          .asFunction<DartClang_Cursor_getObjCPropertyGetterName>();
 
   /// Given a cursor that represents a property declaration, return the
   /// name of the method that implements the setter, if any.
@@ -4558,12 +4485,12 @@
     );
   }
 
-  late final _clang_Cursor_getObjCPropertySetterNamePtr = _lookup<
-          ffi.NativeFunction<Native_clang_Cursor_getObjCPropertySetterName>>(
-      'clang_Cursor_getObjCPropertySetterName');
+  late final _clang_Cursor_getObjCPropertySetterNamePtr =
+      _lookup<ffi.NativeFunction<NativeClang_Cursor_getObjCPropertySetterName>>(
+          'clang_Cursor_getObjCPropertySetterName');
   late final _clang_Cursor_getObjCPropertySetterName =
       _clang_Cursor_getObjCPropertySetterNamePtr
-          .asFunction<CXString Function(CXCursor)>();
+          .asFunction<DartClang_Cursor_getObjCPropertySetterName>();
 
   /// Given a cursor that represents an Objective-C method or parameter
   /// declaration, return the associated Objective-C qualifiers for the return
@@ -4578,11 +4505,11 @@
   }
 
   late final _clang_Cursor_getObjCDeclQualifiersPtr =
-      _lookup<ffi.NativeFunction<Native_clang_Cursor_getObjCDeclQualifiers>>(
+      _lookup<ffi.NativeFunction<NativeClang_Cursor_getObjCDeclQualifiers>>(
           'clang_Cursor_getObjCDeclQualifiers');
   late final _clang_Cursor_getObjCDeclQualifiers =
       _clang_Cursor_getObjCDeclQualifiersPtr
-          .asFunction<int Function(CXCursor)>();
+          .asFunction<DartClang_Cursor_getObjCDeclQualifiers>();
 
   /// Given a cursor that represents an Objective-C method or property
   /// declaration, return non-zero if the declaration was affected by "\@optional".
@@ -4596,10 +4523,10 @@
   }
 
   late final _clang_Cursor_isObjCOptionalPtr =
-      _lookup<ffi.NativeFunction<Native_clang_Cursor_isObjCOptional>>(
+      _lookup<ffi.NativeFunction<NativeClang_Cursor_isObjCOptional>>(
           'clang_Cursor_isObjCOptional');
-  late final _clang_Cursor_isObjCOptional =
-      _clang_Cursor_isObjCOptionalPtr.asFunction<int Function(CXCursor)>();
+  late final _clang_Cursor_isObjCOptional = _clang_Cursor_isObjCOptionalPtr
+      .asFunction<DartClang_Cursor_isObjCOptional>();
 
   /// Returns non-zero if the given cursor is a variadic function or method.
   int clang_Cursor_isVariadic(
@@ -4611,10 +4538,10 @@
   }
 
   late final _clang_Cursor_isVariadicPtr =
-      _lookup<ffi.NativeFunction<Native_clang_Cursor_isVariadic>>(
+      _lookup<ffi.NativeFunction<NativeClang_Cursor_isVariadic>>(
           'clang_Cursor_isVariadic');
   late final _clang_Cursor_isVariadic =
-      _clang_Cursor_isVariadicPtr.asFunction<int Function(CXCursor)>();
+      _clang_Cursor_isVariadicPtr.asFunction<DartClang_Cursor_isVariadic>();
 
   /// Returns non-zero if the given cursor points to a symbol marked with
   /// external_source_symbol attribute.
@@ -4642,12 +4569,10 @@
   }
 
   late final _clang_Cursor_isExternalSymbolPtr =
-      _lookup<ffi.NativeFunction<Native_clang_Cursor_isExternalSymbol>>(
+      _lookup<ffi.NativeFunction<NativeClang_Cursor_isExternalSymbol>>(
           'clang_Cursor_isExternalSymbol');
-  late final _clang_Cursor_isExternalSymbol =
-      _clang_Cursor_isExternalSymbolPtr.asFunction<
-          int Function(CXCursor, ffi.Pointer<CXString>, ffi.Pointer<CXString>,
-              ffi.Pointer<ffi.Uint32>)>();
+  late final _clang_Cursor_isExternalSymbol = _clang_Cursor_isExternalSymbolPtr
+      .asFunction<DartClang_Cursor_isExternalSymbol>();
 
   /// Given a cursor that represents a declaration, return the associated
   /// comment's source range.  The range may include multiple consecutive comments
@@ -4661,10 +4586,10 @@
   }
 
   late final _clang_Cursor_getCommentRangePtr =
-      _lookup<ffi.NativeFunction<Native_clang_Cursor_getCommentRange>>(
+      _lookup<ffi.NativeFunction<NativeClang_Cursor_getCommentRange>>(
           'clang_Cursor_getCommentRange');
   late final _clang_Cursor_getCommentRange = _clang_Cursor_getCommentRangePtr
-      .asFunction<CXSourceRange Function(CXCursor)>();
+      .asFunction<DartClang_Cursor_getCommentRange>();
 
   /// Given a cursor that represents a declaration, return the associated
   /// comment text, including comment markers.
@@ -4677,11 +4602,11 @@
   }
 
   late final _clang_Cursor_getRawCommentTextPtr =
-      _lookup<ffi.NativeFunction<Native_clang_Cursor_getRawCommentText>>(
+      _lookup<ffi.NativeFunction<NativeClang_Cursor_getRawCommentText>>(
           'clang_Cursor_getRawCommentText');
   late final _clang_Cursor_getRawCommentText =
       _clang_Cursor_getRawCommentTextPtr
-          .asFunction<CXString Function(CXCursor)>();
+          .asFunction<DartClang_Cursor_getRawCommentText>();
 
   /// Given a cursor that represents a documentable entity (e.g.,
   /// declaration), return the associated \paragraph; otherwise return the
@@ -4695,11 +4620,11 @@
   }
 
   late final _clang_Cursor_getBriefCommentTextPtr =
-      _lookup<ffi.NativeFunction<Native_clang_Cursor_getBriefCommentText>>(
+      _lookup<ffi.NativeFunction<NativeClang_Cursor_getBriefCommentText>>(
           'clang_Cursor_getBriefCommentText');
   late final _clang_Cursor_getBriefCommentText =
       _clang_Cursor_getBriefCommentTextPtr
-          .asFunction<CXString Function(CXCursor)>();
+          .asFunction<DartClang_Cursor_getBriefCommentText>();
 
   /// Retrieve the CXString representing the mangled name of the cursor.
   CXString clang_Cursor_getMangling(
@@ -4711,10 +4636,10 @@
   }
 
   late final _clang_Cursor_getManglingPtr =
-      _lookup<ffi.NativeFunction<Native_clang_Cursor_getMangling>>(
+      _lookup<ffi.NativeFunction<NativeClang_Cursor_getMangling>>(
           'clang_Cursor_getMangling');
   late final _clang_Cursor_getMangling =
-      _clang_Cursor_getManglingPtr.asFunction<CXString Function(CXCursor)>();
+      _clang_Cursor_getManglingPtr.asFunction<DartClang_Cursor_getMangling>();
 
   /// Retrieve the CXStrings representing the mangled symbols of the C++
   /// constructor or destructor at the cursor.
@@ -4727,10 +4652,10 @@
   }
 
   late final _clang_Cursor_getCXXManglingsPtr =
-      _lookup<ffi.NativeFunction<Native_clang_Cursor_getCXXManglings>>(
+      _lookup<ffi.NativeFunction<NativeClang_Cursor_getCXXManglings>>(
           'clang_Cursor_getCXXManglings');
   late final _clang_Cursor_getCXXManglings = _clang_Cursor_getCXXManglingsPtr
-      .asFunction<ffi.Pointer<CXStringSet> Function(CXCursor)>();
+      .asFunction<DartClang_Cursor_getCXXManglings>();
 
   /// Retrieve the CXStrings representing the mangled symbols of the ObjC
   /// class interface or implementation at the cursor.
@@ -4743,10 +4668,10 @@
   }
 
   late final _clang_Cursor_getObjCManglingsPtr =
-      _lookup<ffi.NativeFunction<Native_clang_Cursor_getObjCManglings>>(
+      _lookup<ffi.NativeFunction<NativeClang_Cursor_getObjCManglings>>(
           'clang_Cursor_getObjCManglings');
   late final _clang_Cursor_getObjCManglings = _clang_Cursor_getObjCManglingsPtr
-      .asFunction<ffi.Pointer<CXStringSet> Function(CXCursor)>();
+      .asFunction<DartClang_Cursor_getObjCManglings>();
 
   /// Given a CXCursor_ModuleImportDecl cursor, return the associated module.
   CXModule clang_Cursor_getModule(
@@ -4758,10 +4683,10 @@
   }
 
   late final _clang_Cursor_getModulePtr =
-      _lookup<ffi.NativeFunction<Native_clang_Cursor_getModule>>(
+      _lookup<ffi.NativeFunction<NativeClang_Cursor_getModule>>(
           'clang_Cursor_getModule');
   late final _clang_Cursor_getModule =
-      _clang_Cursor_getModulePtr.asFunction<CXModule Function(CXCursor)>();
+      _clang_Cursor_getModulePtr.asFunction<DartClang_Cursor_getModule>();
 
   /// Given a CXFile header file, return the module that contains it, if one
   /// exists.
@@ -4776,10 +4701,10 @@
   }
 
   late final _clang_getModuleForFilePtr =
-      _lookup<ffi.NativeFunction<Native_clang_getModuleForFile>>(
+      _lookup<ffi.NativeFunction<NativeClang_getModuleForFile>>(
           'clang_getModuleForFile');
-  late final _clang_getModuleForFile = _clang_getModuleForFilePtr
-      .asFunction<CXModule Function(CXTranslationUnit, CXFile)>();
+  late final _clang_getModuleForFile =
+      _clang_getModuleForFilePtr.asFunction<DartClang_getModuleForFile>();
 
   /// \param Module a module object.
   ///
@@ -4793,10 +4718,10 @@
   }
 
   late final _clang_Module_getASTFilePtr =
-      _lookup<ffi.NativeFunction<Native_clang_Module_getASTFile>>(
+      _lookup<ffi.NativeFunction<NativeClang_Module_getASTFile>>(
           'clang_Module_getASTFile');
   late final _clang_Module_getASTFile =
-      _clang_Module_getASTFilePtr.asFunction<CXFile Function(CXModule)>();
+      _clang_Module_getASTFilePtr.asFunction<DartClang_Module_getASTFile>();
 
   /// \param Module a module object.
   ///
@@ -4811,10 +4736,10 @@
   }
 
   late final _clang_Module_getParentPtr =
-      _lookup<ffi.NativeFunction<Native_clang_Module_getParent>>(
+      _lookup<ffi.NativeFunction<NativeClang_Module_getParent>>(
           'clang_Module_getParent');
   late final _clang_Module_getParent =
-      _clang_Module_getParentPtr.asFunction<CXModule Function(CXModule)>();
+      _clang_Module_getParentPtr.asFunction<DartClang_Module_getParent>();
 
   /// \param Module a module object.
   ///
@@ -4829,10 +4754,10 @@
   }
 
   late final _clang_Module_getNamePtr =
-      _lookup<ffi.NativeFunction<Native_clang_Module_getName>>(
+      _lookup<ffi.NativeFunction<NativeClang_Module_getName>>(
           'clang_Module_getName');
   late final _clang_Module_getName =
-      _clang_Module_getNamePtr.asFunction<CXString Function(CXModule)>();
+      _clang_Module_getNamePtr.asFunction<DartClang_Module_getName>();
 
   /// \param Module a module object.
   ///
@@ -4846,10 +4771,10 @@
   }
 
   late final _clang_Module_getFullNamePtr =
-      _lookup<ffi.NativeFunction<Native_clang_Module_getFullName>>(
+      _lookup<ffi.NativeFunction<NativeClang_Module_getFullName>>(
           'clang_Module_getFullName');
   late final _clang_Module_getFullName =
-      _clang_Module_getFullNamePtr.asFunction<CXString Function(CXModule)>();
+      _clang_Module_getFullNamePtr.asFunction<DartClang_Module_getFullName>();
 
   /// \param Module a module object.
   ///
@@ -4863,10 +4788,10 @@
   }
 
   late final _clang_Module_isSystemPtr =
-      _lookup<ffi.NativeFunction<Native_clang_Module_isSystem>>(
+      _lookup<ffi.NativeFunction<NativeClang_Module_isSystem>>(
           'clang_Module_isSystem');
   late final _clang_Module_isSystem =
-      _clang_Module_isSystemPtr.asFunction<int Function(CXModule)>();
+      _clang_Module_isSystemPtr.asFunction<DartClang_Module_isSystem>();
 
   /// \param Module a module object.
   ///
@@ -4882,11 +4807,11 @@
   }
 
   late final _clang_Module_getNumTopLevelHeadersPtr =
-      _lookup<ffi.NativeFunction<Native_clang_Module_getNumTopLevelHeaders>>(
+      _lookup<ffi.NativeFunction<NativeClang_Module_getNumTopLevelHeaders>>(
           'clang_Module_getNumTopLevelHeaders');
   late final _clang_Module_getNumTopLevelHeaders =
       _clang_Module_getNumTopLevelHeadersPtr
-          .asFunction<int Function(CXTranslationUnit, CXModule)>();
+          .asFunction<DartClang_Module_getNumTopLevelHeaders>();
 
   /// \param Module a module object.
   ///
@@ -4906,11 +4831,11 @@
   }
 
   late final _clang_Module_getTopLevelHeaderPtr =
-      _lookup<ffi.NativeFunction<Native_clang_Module_getTopLevelHeader>>(
+      _lookup<ffi.NativeFunction<NativeClang_Module_getTopLevelHeader>>(
           'clang_Module_getTopLevelHeader');
   late final _clang_Module_getTopLevelHeader =
       _clang_Module_getTopLevelHeaderPtr
-          .asFunction<CXFile Function(CXTranslationUnit, CXModule, int)>();
+          .asFunction<DartClang_Module_getTopLevelHeader>();
 
   /// Determine if a C++ constructor is a converting constructor.
   int clang_CXXConstructor_isConvertingConstructor(
@@ -4923,11 +4848,11 @@
 
   late final _clang_CXXConstructor_isConvertingConstructorPtr = _lookup<
           ffi.NativeFunction<
-              Native_clang_CXXConstructor_isConvertingConstructor>>(
+              NativeClang_CXXConstructor_isConvertingConstructor>>(
       'clang_CXXConstructor_isConvertingConstructor');
   late final _clang_CXXConstructor_isConvertingConstructor =
       _clang_CXXConstructor_isConvertingConstructorPtr
-          .asFunction<int Function(CXCursor)>();
+          .asFunction<DartClang_CXXConstructor_isConvertingConstructor>();
 
   /// Determine if a C++ constructor is a copy constructor.
   int clang_CXXConstructor_isCopyConstructor(
@@ -4938,12 +4863,12 @@
     );
   }
 
-  late final _clang_CXXConstructor_isCopyConstructorPtr = _lookup<
-          ffi.NativeFunction<Native_clang_CXXConstructor_isCopyConstructor>>(
-      'clang_CXXConstructor_isCopyConstructor');
+  late final _clang_CXXConstructor_isCopyConstructorPtr =
+      _lookup<ffi.NativeFunction<NativeClang_CXXConstructor_isCopyConstructor>>(
+          'clang_CXXConstructor_isCopyConstructor');
   late final _clang_CXXConstructor_isCopyConstructor =
       _clang_CXXConstructor_isCopyConstructorPtr
-          .asFunction<int Function(CXCursor)>();
+          .asFunction<DartClang_CXXConstructor_isCopyConstructor>();
 
   /// Determine if a C++ constructor is the default constructor.
   int clang_CXXConstructor_isDefaultConstructor(
@@ -4955,11 +4880,11 @@
   }
 
   late final _clang_CXXConstructor_isDefaultConstructorPtr = _lookup<
-          ffi.NativeFunction<Native_clang_CXXConstructor_isDefaultConstructor>>(
+          ffi.NativeFunction<NativeClang_CXXConstructor_isDefaultConstructor>>(
       'clang_CXXConstructor_isDefaultConstructor');
   late final _clang_CXXConstructor_isDefaultConstructor =
       _clang_CXXConstructor_isDefaultConstructorPtr
-          .asFunction<int Function(CXCursor)>();
+          .asFunction<DartClang_CXXConstructor_isDefaultConstructor>();
 
   /// Determine if a C++ constructor is a move constructor.
   int clang_CXXConstructor_isMoveConstructor(
@@ -4970,12 +4895,12 @@
     );
   }
 
-  late final _clang_CXXConstructor_isMoveConstructorPtr = _lookup<
-          ffi.NativeFunction<Native_clang_CXXConstructor_isMoveConstructor>>(
-      'clang_CXXConstructor_isMoveConstructor');
+  late final _clang_CXXConstructor_isMoveConstructorPtr =
+      _lookup<ffi.NativeFunction<NativeClang_CXXConstructor_isMoveConstructor>>(
+          'clang_CXXConstructor_isMoveConstructor');
   late final _clang_CXXConstructor_isMoveConstructor =
       _clang_CXXConstructor_isMoveConstructorPtr
-          .asFunction<int Function(CXCursor)>();
+          .asFunction<DartClang_CXXConstructor_isMoveConstructor>();
 
   /// Determine if a C++ field is declared 'mutable'.
   int clang_CXXField_isMutable(
@@ -4987,10 +4912,10 @@
   }
 
   late final _clang_CXXField_isMutablePtr =
-      _lookup<ffi.NativeFunction<Native_clang_CXXField_isMutable>>(
+      _lookup<ffi.NativeFunction<NativeClang_CXXField_isMutable>>(
           'clang_CXXField_isMutable');
   late final _clang_CXXField_isMutable =
-      _clang_CXXField_isMutablePtr.asFunction<int Function(CXCursor)>();
+      _clang_CXXField_isMutablePtr.asFunction<DartClang_CXXField_isMutable>();
 
   /// Determine if a C++ method is declared '= default'.
   int clang_CXXMethod_isDefaulted(
@@ -5002,10 +4927,10 @@
   }
 
   late final _clang_CXXMethod_isDefaultedPtr =
-      _lookup<ffi.NativeFunction<Native_clang_CXXMethod_isDefaulted>>(
+      _lookup<ffi.NativeFunction<NativeClang_CXXMethod_isDefaulted>>(
           'clang_CXXMethod_isDefaulted');
-  late final _clang_CXXMethod_isDefaulted =
-      _clang_CXXMethod_isDefaultedPtr.asFunction<int Function(CXCursor)>();
+  late final _clang_CXXMethod_isDefaulted = _clang_CXXMethod_isDefaultedPtr
+      .asFunction<DartClang_CXXMethod_isDefaulted>();
 
   /// Determine if a C++ member function or member function template is
   /// pure virtual.
@@ -5018,10 +4943,10 @@
   }
 
   late final _clang_CXXMethod_isPureVirtualPtr =
-      _lookup<ffi.NativeFunction<Native_clang_CXXMethod_isPureVirtual>>(
+      _lookup<ffi.NativeFunction<NativeClang_CXXMethod_isPureVirtual>>(
           'clang_CXXMethod_isPureVirtual');
-  late final _clang_CXXMethod_isPureVirtual =
-      _clang_CXXMethod_isPureVirtualPtr.asFunction<int Function(CXCursor)>();
+  late final _clang_CXXMethod_isPureVirtual = _clang_CXXMethod_isPureVirtualPtr
+      .asFunction<DartClang_CXXMethod_isPureVirtual>();
 
   /// Determine if a C++ member function or member function template is
   /// declared 'static'.
@@ -5034,10 +4959,10 @@
   }
 
   late final _clang_CXXMethod_isStaticPtr =
-      _lookup<ffi.NativeFunction<Native_clang_CXXMethod_isStatic>>(
+      _lookup<ffi.NativeFunction<NativeClang_CXXMethod_isStatic>>(
           'clang_CXXMethod_isStatic');
   late final _clang_CXXMethod_isStatic =
-      _clang_CXXMethod_isStaticPtr.asFunction<int Function(CXCursor)>();
+      _clang_CXXMethod_isStaticPtr.asFunction<DartClang_CXXMethod_isStatic>();
 
   /// Determine if a C++ member function or member function template is
   /// explicitly declared 'virtual' or if it overrides a virtual method from
@@ -5051,10 +4976,10 @@
   }
 
   late final _clang_CXXMethod_isVirtualPtr =
-      _lookup<ffi.NativeFunction<Native_clang_CXXMethod_isVirtual>>(
+      _lookup<ffi.NativeFunction<NativeClang_CXXMethod_isVirtual>>(
           'clang_CXXMethod_isVirtual');
   late final _clang_CXXMethod_isVirtual =
-      _clang_CXXMethod_isVirtualPtr.asFunction<int Function(CXCursor)>();
+      _clang_CXXMethod_isVirtualPtr.asFunction<DartClang_CXXMethod_isVirtual>();
 
   /// Determine if a C++ record is abstract, i.e. whether a class or struct
   /// has a pure virtual member function.
@@ -5067,10 +4992,10 @@
   }
 
   late final _clang_CXXRecord_isAbstractPtr =
-      _lookup<ffi.NativeFunction<Native_clang_CXXRecord_isAbstract>>(
+      _lookup<ffi.NativeFunction<NativeClang_CXXRecord_isAbstract>>(
           'clang_CXXRecord_isAbstract');
-  late final _clang_CXXRecord_isAbstract =
-      _clang_CXXRecord_isAbstractPtr.asFunction<int Function(CXCursor)>();
+  late final _clang_CXXRecord_isAbstract = _clang_CXXRecord_isAbstractPtr
+      .asFunction<DartClang_CXXRecord_isAbstract>();
 
   /// Determine if an enum declaration refers to a scoped enum.
   int clang_EnumDecl_isScoped(
@@ -5082,10 +5007,10 @@
   }
 
   late final _clang_EnumDecl_isScopedPtr =
-      _lookup<ffi.NativeFunction<Native_clang_EnumDecl_isScoped>>(
+      _lookup<ffi.NativeFunction<NativeClang_EnumDecl_isScoped>>(
           'clang_EnumDecl_isScoped');
   late final _clang_EnumDecl_isScoped =
-      _clang_EnumDecl_isScopedPtr.asFunction<int Function(CXCursor)>();
+      _clang_EnumDecl_isScopedPtr.asFunction<DartClang_EnumDecl_isScoped>();
 
   /// Determine if a C++ member function or member function template is
   /// declared 'const'.
@@ -5098,10 +5023,10 @@
   }
 
   late final _clang_CXXMethod_isConstPtr =
-      _lookup<ffi.NativeFunction<Native_clang_CXXMethod_isConst>>(
+      _lookup<ffi.NativeFunction<NativeClang_CXXMethod_isConst>>(
           'clang_CXXMethod_isConst');
   late final _clang_CXXMethod_isConst =
-      _clang_CXXMethod_isConstPtr.asFunction<int Function(CXCursor)>();
+      _clang_CXXMethod_isConstPtr.asFunction<DartClang_CXXMethod_isConst>();
 
   /// Given a cursor that represents a template, determine
   /// the cursor kind of the specializations would be generated by instantiating
@@ -5127,10 +5052,10 @@
   }
 
   late final _clang_getTemplateCursorKindPtr =
-      _lookup<ffi.NativeFunction<Native_clang_getTemplateCursorKind>>(
+      _lookup<ffi.NativeFunction<NativeClang_getTemplateCursorKind>>(
           'clang_getTemplateCursorKind');
-  late final _clang_getTemplateCursorKind =
-      _clang_getTemplateCursorKindPtr.asFunction<int Function(CXCursor)>();
+  late final _clang_getTemplateCursorKind = _clang_getTemplateCursorKindPtr
+      .asFunction<DartClang_getTemplateCursorKind>();
 
   /// Given a cursor that may represent a specialization or instantiation
   /// of a template, retrieve the cursor that represents the template that it
@@ -5167,11 +5092,11 @@
   }
 
   late final _clang_getSpecializedCursorTemplatePtr =
-      _lookup<ffi.NativeFunction<Native_clang_getSpecializedCursorTemplate>>(
+      _lookup<ffi.NativeFunction<NativeClang_getSpecializedCursorTemplate>>(
           'clang_getSpecializedCursorTemplate');
   late final _clang_getSpecializedCursorTemplate =
       _clang_getSpecializedCursorTemplatePtr
-          .asFunction<CXCursor Function(CXCursor)>();
+          .asFunction<DartClang_getSpecializedCursorTemplate>();
 
   /// Given a cursor that references something else, return the source range
   /// covering that reference.
@@ -5202,11 +5127,11 @@
   }
 
   late final _clang_getCursorReferenceNameRangePtr =
-      _lookup<ffi.NativeFunction<Native_clang_getCursorReferenceNameRange>>(
+      _lookup<ffi.NativeFunction<NativeClang_getCursorReferenceNameRange>>(
           'clang_getCursorReferenceNameRange');
   late final _clang_getCursorReferenceNameRange =
       _clang_getCursorReferenceNameRangePtr
-          .asFunction<CXSourceRange Function(CXCursor, int, int)>();
+          .asFunction<DartClang_getCursorReferenceNameRange>();
 
   /// Get the raw lexical token starting with the given location.
   ///
@@ -5228,9 +5153,9 @@
   }
 
   late final _clang_getTokenPtr =
-      _lookup<ffi.NativeFunction<Native_clang_getToken>>('clang_getToken');
-  late final _clang_getToken = _clang_getTokenPtr.asFunction<
-      ffi.Pointer<CXToken> Function(CXTranslationUnit, CXSourceLocation)>();
+      _lookup<ffi.NativeFunction<NativeClang_getToken>>('clang_getToken');
+  late final _clang_getToken =
+      _clang_getTokenPtr.asFunction<DartClang_getToken>();
 
   /// Determine the kind of the given token.
   int clang_getTokenKind(
@@ -5242,10 +5167,10 @@
   }
 
   late final _clang_getTokenKindPtr =
-      _lookup<ffi.NativeFunction<Native_clang_getTokenKind>>(
+      _lookup<ffi.NativeFunction<NativeClang_getTokenKind>>(
           'clang_getTokenKind');
   late final _clang_getTokenKind =
-      _clang_getTokenKindPtr.asFunction<int Function(CXToken)>();
+      _clang_getTokenKindPtr.asFunction<DartClang_getTokenKind>();
 
   /// Determine the spelling of the given token.
   ///
@@ -5262,10 +5187,10 @@
   }
 
   late final _clang_getTokenSpellingPtr =
-      _lookup<ffi.NativeFunction<Native_clang_getTokenSpelling>>(
+      _lookup<ffi.NativeFunction<NativeClang_getTokenSpelling>>(
           'clang_getTokenSpelling');
-  late final _clang_getTokenSpelling = _clang_getTokenSpellingPtr
-      .asFunction<CXString Function(CXTranslationUnit, CXToken)>();
+  late final _clang_getTokenSpelling =
+      _clang_getTokenSpellingPtr.asFunction<DartClang_getTokenSpelling>();
 
   /// Retrieve the source location of the given token.
   CXSourceLocation clang_getTokenLocation(
@@ -5279,10 +5204,10 @@
   }
 
   late final _clang_getTokenLocationPtr =
-      _lookup<ffi.NativeFunction<Native_clang_getTokenLocation>>(
+      _lookup<ffi.NativeFunction<NativeClang_getTokenLocation>>(
           'clang_getTokenLocation');
-  late final _clang_getTokenLocation = _clang_getTokenLocationPtr
-      .asFunction<CXSourceLocation Function(CXTranslationUnit, CXToken)>();
+  late final _clang_getTokenLocation =
+      _clang_getTokenLocationPtr.asFunction<DartClang_getTokenLocation>();
 
   /// Retrieve a source range that covers the given token.
   CXSourceRange clang_getTokenExtent(
@@ -5296,10 +5221,10 @@
   }
 
   late final _clang_getTokenExtentPtr =
-      _lookup<ffi.NativeFunction<Native_clang_getTokenExtent>>(
+      _lookup<ffi.NativeFunction<NativeClang_getTokenExtent>>(
           'clang_getTokenExtent');
-  late final _clang_getTokenExtent = _clang_getTokenExtentPtr
-      .asFunction<CXSourceRange Function(CXTranslationUnit, CXToken)>();
+  late final _clang_getTokenExtent =
+      _clang_getTokenExtentPtr.asFunction<DartClang_getTokenExtent>();
 
   /// Tokenize the source code described by the given range into raw
   /// lexical tokens.
@@ -5330,10 +5255,9 @@
   }
 
   late final _clang_tokenizePtr =
-      _lookup<ffi.NativeFunction<Native_clang_tokenize>>('clang_tokenize');
-  late final _clang_tokenize = _clang_tokenizePtr.asFunction<
-      void Function(CXTranslationUnit, CXSourceRange,
-          ffi.Pointer<ffi.Pointer<CXToken>>, ffi.Pointer<ffi.Uint32>)>();
+      _lookup<ffi.NativeFunction<NativeClang_tokenize>>('clang_tokenize');
+  late final _clang_tokenize =
+      _clang_tokenizePtr.asFunction<DartClang_tokenize>();
 
   /// 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.
@@ -5378,11 +5302,10 @@
   }
 
   late final _clang_annotateTokensPtr =
-      _lookup<ffi.NativeFunction<Native_clang_annotateTokens>>(
+      _lookup<ffi.NativeFunction<NativeClang_annotateTokens>>(
           'clang_annotateTokens');
-  late final _clang_annotateTokens = _clang_annotateTokensPtr.asFunction<
-      void Function(CXTranslationUnit, ffi.Pointer<CXToken>, int,
-          ffi.Pointer<CXCursor>)>();
+  late final _clang_annotateTokens =
+      _clang_annotateTokensPtr.asFunction<DartClang_annotateTokens>();
 
   /// Free the given set of tokens.
   void clang_disposeTokens(
@@ -5398,10 +5321,10 @@
   }
 
   late final _clang_disposeTokensPtr =
-      _lookup<ffi.NativeFunction<Native_clang_disposeTokens>>(
+      _lookup<ffi.NativeFunction<NativeClang_disposeTokens>>(
           'clang_disposeTokens');
-  late final _clang_disposeTokens = _clang_disposeTokensPtr.asFunction<
-      void Function(CXTranslationUnit, ffi.Pointer<CXToken>, int)>();
+  late final _clang_disposeTokens =
+      _clang_disposeTokensPtr.asFunction<DartClang_disposeTokens>();
 
   /// \defgroup CINDEX_DEBUG Debugging facilities
   ///
@@ -5418,10 +5341,10 @@
   }
 
   late final _clang_getCursorKindSpellingPtr =
-      _lookup<ffi.NativeFunction<Native_clang_getCursorKindSpelling>>(
+      _lookup<ffi.NativeFunction<NativeClang_getCursorKindSpelling>>(
           'clang_getCursorKindSpelling');
-  late final _clang_getCursorKindSpelling =
-      _clang_getCursorKindSpellingPtr.asFunction<CXString Function(int)>();
+  late final _clang_getCursorKindSpelling = _clang_getCursorKindSpellingPtr
+      .asFunction<DartClang_getCursorKindSpelling>();
 
   void clang_getDefinitionSpellingAndExtent(
     CXCursor arg0,
@@ -5444,28 +5367,21 @@
   }
 
   late final _clang_getDefinitionSpellingAndExtentPtr =
-      _lookup<ffi.NativeFunction<Native_clang_getDefinitionSpellingAndExtent>>(
+      _lookup<ffi.NativeFunction<NativeClang_getDefinitionSpellingAndExtent>>(
           'clang_getDefinitionSpellingAndExtent');
   late final _clang_getDefinitionSpellingAndExtent =
-      _clang_getDefinitionSpellingAndExtentPtr.asFunction<
-          void Function(
-              CXCursor,
-              ffi.Pointer<ffi.Pointer<ffi.Int8>>,
-              ffi.Pointer<ffi.Pointer<ffi.Int8>>,
-              ffi.Pointer<ffi.Uint32>,
-              ffi.Pointer<ffi.Uint32>,
-              ffi.Pointer<ffi.Uint32>,
-              ffi.Pointer<ffi.Uint32>)>();
+      _clang_getDefinitionSpellingAndExtentPtr
+          .asFunction<DartClang_getDefinitionSpellingAndExtent>();
 
   void clang_enableStackTraces() {
     return _clang_enableStackTraces();
   }
 
   late final _clang_enableStackTracesPtr =
-      _lookup<ffi.NativeFunction<Native_clang_enableStackTraces>>(
+      _lookup<ffi.NativeFunction<NativeClang_enableStackTraces>>(
           'clang_enableStackTraces');
   late final _clang_enableStackTraces =
-      _clang_enableStackTracesPtr.asFunction<void Function()>();
+      _clang_enableStackTracesPtr.asFunction<DartClang_enableStackTraces>();
 
   void clang_executeOnThread(
     ffi.Pointer<ffi.NativeFunction<ffi.Void Function(ffi.Pointer<ffi.Void>)>>
@@ -5481,14 +5397,10 @@
   }
 
   late final _clang_executeOnThreadPtr =
-      _lookup<ffi.NativeFunction<Native_clang_executeOnThread>>(
+      _lookup<ffi.NativeFunction<NativeClang_executeOnThread>>(
           'clang_executeOnThread');
-  late final _clang_executeOnThread = _clang_executeOnThreadPtr.asFunction<
-      void Function(
-          ffi.Pointer<
-              ffi.NativeFunction<ffi.Void Function(ffi.Pointer<ffi.Void>)>>,
-          ffi.Pointer<ffi.Void>,
-          int)>();
+  late final _clang_executeOnThread =
+      _clang_executeOnThreadPtr.asFunction<DartClang_executeOnThread>();
 
   /// Determine the kind of a particular chunk within a completion string.
   ///
@@ -5508,10 +5420,10 @@
   }
 
   late final _clang_getCompletionChunkKindPtr =
-      _lookup<ffi.NativeFunction<Native_clang_getCompletionChunkKind>>(
+      _lookup<ffi.NativeFunction<NativeClang_getCompletionChunkKind>>(
           'clang_getCompletionChunkKind');
   late final _clang_getCompletionChunkKind = _clang_getCompletionChunkKindPtr
-      .asFunction<int Function(CXCompletionString, int)>();
+      .asFunction<DartClang_getCompletionChunkKind>();
 
   /// Retrieve the text associated with a particular chunk within a
   /// completion string.
@@ -5532,10 +5444,10 @@
   }
 
   late final _clang_getCompletionChunkTextPtr =
-      _lookup<ffi.NativeFunction<Native_clang_getCompletionChunkText>>(
+      _lookup<ffi.NativeFunction<NativeClang_getCompletionChunkText>>(
           'clang_getCompletionChunkText');
   late final _clang_getCompletionChunkText = _clang_getCompletionChunkTextPtr
-      .asFunction<CXString Function(CXCompletionString, int)>();
+      .asFunction<DartClang_getCompletionChunkText>();
 
   /// Retrieve the completion string associated with a particular chunk
   /// within a completion string.
@@ -5557,11 +5469,11 @@
   }
 
   late final _clang_getCompletionChunkCompletionStringPtr = _lookup<
-          ffi.NativeFunction<Native_clang_getCompletionChunkCompletionString>>(
+          ffi.NativeFunction<NativeClang_getCompletionChunkCompletionString>>(
       'clang_getCompletionChunkCompletionString');
   late final _clang_getCompletionChunkCompletionString =
       _clang_getCompletionChunkCompletionStringPtr
-          .asFunction<CXCompletionString Function(CXCompletionString, int)>();
+          .asFunction<DartClang_getCompletionChunkCompletionString>();
 
   /// Retrieve the number of chunks in the given code-completion string.
   int clang_getNumCompletionChunks(
@@ -5573,10 +5485,10 @@
   }
 
   late final _clang_getNumCompletionChunksPtr =
-      _lookup<ffi.NativeFunction<Native_clang_getNumCompletionChunks>>(
+      _lookup<ffi.NativeFunction<NativeClang_getNumCompletionChunks>>(
           'clang_getNumCompletionChunks');
   late final _clang_getNumCompletionChunks = _clang_getNumCompletionChunksPtr
-      .asFunction<int Function(CXCompletionString)>();
+      .asFunction<DartClang_getNumCompletionChunks>();
 
   /// Determine the priority of this code completion.
   ///
@@ -5597,10 +5509,10 @@
   }
 
   late final _clang_getCompletionPriorityPtr =
-      _lookup<ffi.NativeFunction<Native_clang_getCompletionPriority>>(
+      _lookup<ffi.NativeFunction<NativeClang_getCompletionPriority>>(
           'clang_getCompletionPriority');
   late final _clang_getCompletionPriority = _clang_getCompletionPriorityPtr
-      .asFunction<int Function(CXCompletionString)>();
+      .asFunction<DartClang_getCompletionPriority>();
 
   /// Determine the availability of the entity that this code-completion
   /// string refers to.
@@ -5617,11 +5529,11 @@
   }
 
   late final _clang_getCompletionAvailabilityPtr =
-      _lookup<ffi.NativeFunction<Native_clang_getCompletionAvailability>>(
+      _lookup<ffi.NativeFunction<NativeClang_getCompletionAvailability>>(
           'clang_getCompletionAvailability');
   late final _clang_getCompletionAvailability =
       _clang_getCompletionAvailabilityPtr
-          .asFunction<int Function(CXCompletionString)>();
+          .asFunction<DartClang_getCompletionAvailability>();
 
   /// Retrieve the number of annotations associated with the given
   /// completion string.
@@ -5639,11 +5551,11 @@
   }
 
   late final _clang_getCompletionNumAnnotationsPtr =
-      _lookup<ffi.NativeFunction<Native_clang_getCompletionNumAnnotations>>(
+      _lookup<ffi.NativeFunction<NativeClang_getCompletionNumAnnotations>>(
           'clang_getCompletionNumAnnotations');
   late final _clang_getCompletionNumAnnotations =
       _clang_getCompletionNumAnnotationsPtr
-          .asFunction<int Function(CXCompletionString)>();
+          .asFunction<DartClang_getCompletionNumAnnotations>();
 
   /// Retrieve the annotation associated with the given completion string.
   ///
@@ -5665,10 +5577,10 @@
   }
 
   late final _clang_getCompletionAnnotationPtr =
-      _lookup<ffi.NativeFunction<Native_clang_getCompletionAnnotation>>(
+      _lookup<ffi.NativeFunction<NativeClang_getCompletionAnnotation>>(
           'clang_getCompletionAnnotation');
   late final _clang_getCompletionAnnotation = _clang_getCompletionAnnotationPtr
-      .asFunction<CXString Function(CXCompletionString, int)>();
+      .asFunction<DartClang_getCompletionAnnotation>();
 
   /// Retrieve the parent context of the given completion string.
   ///
@@ -5695,11 +5607,10 @@
   }
 
   late final _clang_getCompletionParentPtr =
-      _lookup<ffi.NativeFunction<Native_clang_getCompletionParent>>(
+      _lookup<ffi.NativeFunction<NativeClang_getCompletionParent>>(
           'clang_getCompletionParent');
   late final _clang_getCompletionParent =
-      _clang_getCompletionParentPtr.asFunction<
-          CXString Function(CXCompletionString, ffi.Pointer<ffi.Int32>)>();
+      _clang_getCompletionParentPtr.asFunction<DartClang_getCompletionParent>();
 
   /// Retrieve the brief documentation comment attached to the declaration
   /// that corresponds to the given completion string.
@@ -5712,11 +5623,11 @@
   }
 
   late final _clang_getCompletionBriefCommentPtr =
-      _lookup<ffi.NativeFunction<Native_clang_getCompletionBriefComment>>(
+      _lookup<ffi.NativeFunction<NativeClang_getCompletionBriefComment>>(
           'clang_getCompletionBriefComment');
   late final _clang_getCompletionBriefComment =
       _clang_getCompletionBriefCommentPtr
-          .asFunction<CXString Function(CXCompletionString)>();
+          .asFunction<DartClang_getCompletionBriefComment>();
 
   /// Retrieve a completion string for an arbitrary declaration or macro
   /// definition cursor.
@@ -5734,11 +5645,11 @@
   }
 
   late final _clang_getCursorCompletionStringPtr =
-      _lookup<ffi.NativeFunction<Native_clang_getCursorCompletionString>>(
+      _lookup<ffi.NativeFunction<NativeClang_getCursorCompletionString>>(
           'clang_getCursorCompletionString');
   late final _clang_getCursorCompletionString =
       _clang_getCursorCompletionStringPtr
-          .asFunction<CXCompletionString Function(CXCursor)>();
+          .asFunction<DartClang_getCursorCompletionString>();
 
   /// Retrieve the number of fix-its for the given completion index.
   ///
@@ -5762,10 +5673,10 @@
   }
 
   late final _clang_getCompletionNumFixItsPtr =
-      _lookup<ffi.NativeFunction<Native_clang_getCompletionNumFixIts>>(
+      _lookup<ffi.NativeFunction<NativeClang_getCompletionNumFixIts>>(
           'clang_getCompletionNumFixIts');
   late final _clang_getCompletionNumFixIts = _clang_getCompletionNumFixItsPtr
-      .asFunction<int Function(ffi.Pointer<CXCodeCompleteResults>, int)>();
+      .asFunction<DartClang_getCompletionNumFixIts>();
 
   /// Fix-its that *must* be applied before inserting the text for the
   /// corresponding completion.
@@ -5823,12 +5734,10 @@
   }
 
   late final _clang_getCompletionFixItPtr =
-      _lookup<ffi.NativeFunction<Native_clang_getCompletionFixIt>>(
+      _lookup<ffi.NativeFunction<NativeClang_getCompletionFixIt>>(
           'clang_getCompletionFixIt');
   late final _clang_getCompletionFixIt =
-      _clang_getCompletionFixItPtr.asFunction<
-          CXString Function(ffi.Pointer<CXCodeCompleteResults>, int, int,
-              ffi.Pointer<CXSourceRange>)>();
+      _clang_getCompletionFixItPtr.asFunction<DartClang_getCompletionFixIt>();
 
   /// Returns a default set of code-completion options that can be
   /// passed to\c clang_codeCompleteAt().
@@ -5837,10 +5746,11 @@
   }
 
   late final _clang_defaultCodeCompleteOptionsPtr =
-      _lookup<ffi.NativeFunction<Native_clang_defaultCodeCompleteOptions>>(
+      _lookup<ffi.NativeFunction<NativeClang_defaultCodeCompleteOptions>>(
           'clang_defaultCodeCompleteOptions');
   late final _clang_defaultCodeCompleteOptions =
-      _clang_defaultCodeCompleteOptionsPtr.asFunction<int Function()>();
+      _clang_defaultCodeCompleteOptionsPtr
+          .asFunction<DartClang_defaultCodeCompleteOptions>();
 
   /// Perform code completion at a given location in a translation unit.
   ///
@@ -5929,17 +5839,10 @@
   }
 
   late final _clang_codeCompleteAtPtr =
-      _lookup<ffi.NativeFunction<Native_clang_codeCompleteAt>>(
+      _lookup<ffi.NativeFunction<NativeClang_codeCompleteAt>>(
           'clang_codeCompleteAt');
-  late final _clang_codeCompleteAt = _clang_codeCompleteAtPtr.asFunction<
-      ffi.Pointer<CXCodeCompleteResults> Function(
-          CXTranslationUnit,
-          ffi.Pointer<ffi.Int8>,
-          int,
-          int,
-          ffi.Pointer<CXUnsavedFile>,
-          int,
-          int)>();
+  late final _clang_codeCompleteAt =
+      _clang_codeCompleteAtPtr.asFunction<DartClang_codeCompleteAt>();
 
   /// Sort the code-completion results in case-insensitive alphabetical
   /// order.
@@ -5957,11 +5860,11 @@
   }
 
   late final _clang_sortCodeCompletionResultsPtr =
-      _lookup<ffi.NativeFunction<Native_clang_sortCodeCompletionResults>>(
+      _lookup<ffi.NativeFunction<NativeClang_sortCodeCompletionResults>>(
           'clang_sortCodeCompletionResults');
   late final _clang_sortCodeCompletionResults =
       _clang_sortCodeCompletionResultsPtr
-          .asFunction<void Function(ffi.Pointer<CXCompletionResult>, int)>();
+          .asFunction<DartClang_sortCodeCompletionResults>();
 
   /// Free the given set of code-completion results.
   void clang_disposeCodeCompleteResults(
@@ -5973,11 +5876,11 @@
   }
 
   late final _clang_disposeCodeCompleteResultsPtr =
-      _lookup<ffi.NativeFunction<Native_clang_disposeCodeCompleteResults>>(
+      _lookup<ffi.NativeFunction<NativeClang_disposeCodeCompleteResults>>(
           'clang_disposeCodeCompleteResults');
   late final _clang_disposeCodeCompleteResults =
       _clang_disposeCodeCompleteResultsPtr
-          .asFunction<void Function(ffi.Pointer<CXCodeCompleteResults>)>();
+          .asFunction<DartClang_disposeCodeCompleteResults>();
 
   /// Determine the number of diagnostics produced prior to the
   /// location where code completion was performed.
@@ -5990,11 +5893,11 @@
   }
 
   late final _clang_codeCompleteGetNumDiagnosticsPtr =
-      _lookup<ffi.NativeFunction<Native_clang_codeCompleteGetNumDiagnostics>>(
+      _lookup<ffi.NativeFunction<NativeClang_codeCompleteGetNumDiagnostics>>(
           'clang_codeCompleteGetNumDiagnostics');
   late final _clang_codeCompleteGetNumDiagnostics =
       _clang_codeCompleteGetNumDiagnosticsPtr
-          .asFunction<int Function(ffi.Pointer<CXCodeCompleteResults>)>();
+          .asFunction<DartClang_codeCompleteGetNumDiagnostics>();
 
   /// Retrieve a diagnostic associated with the given code completion.
   ///
@@ -6014,11 +5917,11 @@
   }
 
   late final _clang_codeCompleteGetDiagnosticPtr =
-      _lookup<ffi.NativeFunction<Native_clang_codeCompleteGetDiagnostic>>(
+      _lookup<ffi.NativeFunction<NativeClang_codeCompleteGetDiagnostic>>(
           'clang_codeCompleteGetDiagnostic');
   late final _clang_codeCompleteGetDiagnostic =
-      _clang_codeCompleteGetDiagnosticPtr.asFunction<
-          CXDiagnostic Function(ffi.Pointer<CXCodeCompleteResults>, int)>();
+      _clang_codeCompleteGetDiagnosticPtr
+          .asFunction<DartClang_codeCompleteGetDiagnostic>();
 
   /// Determines what completions are appropriate for the context
   /// the given code completion.
@@ -6036,10 +5939,10 @@
   }
 
   late final _clang_codeCompleteGetContextsPtr =
-      _lookup<ffi.NativeFunction<Native_clang_codeCompleteGetContexts>>(
+      _lookup<ffi.NativeFunction<NativeClang_codeCompleteGetContexts>>(
           'clang_codeCompleteGetContexts');
   late final _clang_codeCompleteGetContexts = _clang_codeCompleteGetContextsPtr
-      .asFunction<int Function(ffi.Pointer<CXCodeCompleteResults>)>();
+      .asFunction<DartClang_codeCompleteGetContexts>();
 
   /// Returns the cursor kind for the container for the current code
   /// completion context. The container is only guaranteed to be set for
@@ -6066,12 +5969,11 @@
   }
 
   late final _clang_codeCompleteGetContainerKindPtr =
-      _lookup<ffi.NativeFunction<Native_clang_codeCompleteGetContainerKind>>(
+      _lookup<ffi.NativeFunction<NativeClang_codeCompleteGetContainerKind>>(
           'clang_codeCompleteGetContainerKind');
   late final _clang_codeCompleteGetContainerKind =
-      _clang_codeCompleteGetContainerKindPtr.asFunction<
-          int Function(
-              ffi.Pointer<CXCodeCompleteResults>, ffi.Pointer<ffi.Uint32>)>();
+      _clang_codeCompleteGetContainerKindPtr
+          .asFunction<DartClang_codeCompleteGetContainerKind>();
 
   /// Returns the USR for the container for the current code completion
   /// context. If there is not a container for the current context, this
@@ -6089,11 +5991,11 @@
   }
 
   late final _clang_codeCompleteGetContainerUSRPtr =
-      _lookup<ffi.NativeFunction<Native_clang_codeCompleteGetContainerUSR>>(
+      _lookup<ffi.NativeFunction<NativeClang_codeCompleteGetContainerUSR>>(
           'clang_codeCompleteGetContainerUSR');
   late final _clang_codeCompleteGetContainerUSR =
       _clang_codeCompleteGetContainerUSRPtr
-          .asFunction<CXString Function(ffi.Pointer<CXCodeCompleteResults>)>();
+          .asFunction<DartClang_codeCompleteGetContainerUSR>();
 
   /// Returns the currently-entered selector for an Objective-C message
   /// send, formatted like "initWithFoo:bar:". Only guaranteed to return a
@@ -6113,11 +6015,11 @@
   }
 
   late final _clang_codeCompleteGetObjCSelectorPtr =
-      _lookup<ffi.NativeFunction<Native_clang_codeCompleteGetObjCSelector>>(
+      _lookup<ffi.NativeFunction<NativeClang_codeCompleteGetObjCSelector>>(
           'clang_codeCompleteGetObjCSelector');
   late final _clang_codeCompleteGetObjCSelector =
       _clang_codeCompleteGetObjCSelectorPtr
-          .asFunction<CXString Function(ffi.Pointer<CXCodeCompleteResults>)>();
+          .asFunction<DartClang_codeCompleteGetObjCSelector>();
 
   /// Return a version string, suitable for showing to a user, but not
   /// intended to be parsed (the format is not guaranteed to be stable).
@@ -6126,10 +6028,10 @@
   }
 
   late final _clang_getClangVersionPtr =
-      _lookup<ffi.NativeFunction<Native_clang_getClangVersion>>(
+      _lookup<ffi.NativeFunction<NativeClang_getClangVersion>>(
           'clang_getClangVersion');
   late final _clang_getClangVersion =
-      _clang_getClangVersionPtr.asFunction<CXString Function()>();
+      _clang_getClangVersionPtr.asFunction<DartClang_getClangVersion>();
 
   /// Enable/disable crash recovery.
   ///
@@ -6144,10 +6046,10 @@
   }
 
   late final _clang_toggleCrashRecoveryPtr =
-      _lookup<ffi.NativeFunction<Native_clang_toggleCrashRecovery>>(
+      _lookup<ffi.NativeFunction<NativeClang_toggleCrashRecovery>>(
           'clang_toggleCrashRecovery');
   late final _clang_toggleCrashRecovery =
-      _clang_toggleCrashRecoveryPtr.asFunction<void Function(int)>();
+      _clang_toggleCrashRecoveryPtr.asFunction<DartClang_toggleCrashRecovery>();
 
   /// Visit the set of preprocessor inclusions in a translation unit.
   /// The visitor function is called with the provided data for every included
@@ -6166,10 +6068,10 @@
   }
 
   late final _clang_getInclusionsPtr =
-      _lookup<ffi.NativeFunction<Native_clang_getInclusions>>(
+      _lookup<ffi.NativeFunction<NativeClang_getInclusions>>(
           'clang_getInclusions');
-  late final _clang_getInclusions = _clang_getInclusionsPtr.asFunction<
-      void Function(CXTranslationUnit, CXInclusionVisitor, CXClientData)>();
+  late final _clang_getInclusions =
+      _clang_getInclusionsPtr.asFunction<DartClang_getInclusions>();
 
   /// If cursor is a statement declaration tries to evaluate the
   /// statement and if its variable, tries to evaluate its initializer,
@@ -6183,10 +6085,10 @@
   }
 
   late final _clang_Cursor_EvaluatePtr =
-      _lookup<ffi.NativeFunction<Native_clang_Cursor_Evaluate>>(
+      _lookup<ffi.NativeFunction<NativeClang_Cursor_Evaluate>>(
           'clang_Cursor_Evaluate');
   late final _clang_Cursor_Evaluate =
-      _clang_Cursor_EvaluatePtr.asFunction<CXEvalResult Function(CXCursor)>();
+      _clang_Cursor_EvaluatePtr.asFunction<DartClang_Cursor_Evaluate>();
 
   /// Returns the kind of the evaluated result.
   int clang_EvalResult_getKind(
@@ -6198,10 +6100,10 @@
   }
 
   late final _clang_EvalResult_getKindPtr =
-      _lookup<ffi.NativeFunction<Native_clang_EvalResult_getKind>>(
+      _lookup<ffi.NativeFunction<NativeClang_EvalResult_getKind>>(
           'clang_EvalResult_getKind');
   late final _clang_EvalResult_getKind =
-      _clang_EvalResult_getKindPtr.asFunction<int Function(CXEvalResult)>();
+      _clang_EvalResult_getKindPtr.asFunction<DartClang_EvalResult_getKind>();
 
   /// Returns the evaluation result as integer if the
   /// kind is Int.
@@ -6214,10 +6116,10 @@
   }
 
   late final _clang_EvalResult_getAsIntPtr =
-      _lookup<ffi.NativeFunction<Native_clang_EvalResult_getAsInt>>(
+      _lookup<ffi.NativeFunction<NativeClang_EvalResult_getAsInt>>(
           'clang_EvalResult_getAsInt');
   late final _clang_EvalResult_getAsInt =
-      _clang_EvalResult_getAsIntPtr.asFunction<int Function(CXEvalResult)>();
+      _clang_EvalResult_getAsIntPtr.asFunction<DartClang_EvalResult_getAsInt>();
 
   /// Returns the evaluation result as a long long integer if the
   /// kind is Int. This prevents overflows that may happen if the result is
@@ -6231,11 +6133,11 @@
   }
 
   late final _clang_EvalResult_getAsLongLongPtr =
-      _lookup<ffi.NativeFunction<Native_clang_EvalResult_getAsLongLong>>(
+      _lookup<ffi.NativeFunction<NativeClang_EvalResult_getAsLongLong>>(
           'clang_EvalResult_getAsLongLong');
   late final _clang_EvalResult_getAsLongLong =
       _clang_EvalResult_getAsLongLongPtr
-          .asFunction<int Function(CXEvalResult)>();
+          .asFunction<DartClang_EvalResult_getAsLongLong>();
 
   /// Returns a non-zero value if the kind is Int and the evaluation
   /// result resulted in an unsigned integer.
@@ -6248,11 +6150,11 @@
   }
 
   late final _clang_EvalResult_isUnsignedIntPtr =
-      _lookup<ffi.NativeFunction<Native_clang_EvalResult_isUnsignedInt>>(
+      _lookup<ffi.NativeFunction<NativeClang_EvalResult_isUnsignedInt>>(
           'clang_EvalResult_isUnsignedInt');
   late final _clang_EvalResult_isUnsignedInt =
       _clang_EvalResult_isUnsignedIntPtr
-          .asFunction<int Function(CXEvalResult)>();
+          .asFunction<DartClang_EvalResult_isUnsignedInt>();
 
   /// Returns the evaluation result as an unsigned integer if
   /// the kind is Int and clang_EvalResult_isUnsignedInt is non-zero.
@@ -6265,11 +6167,11 @@
   }
 
   late final _clang_EvalResult_getAsUnsignedPtr =
-      _lookup<ffi.NativeFunction<Native_clang_EvalResult_getAsUnsigned>>(
+      _lookup<ffi.NativeFunction<NativeClang_EvalResult_getAsUnsigned>>(
           'clang_EvalResult_getAsUnsigned');
   late final _clang_EvalResult_getAsUnsigned =
       _clang_EvalResult_getAsUnsignedPtr
-          .asFunction<int Function(CXEvalResult)>();
+          .asFunction<DartClang_EvalResult_getAsUnsigned>();
 
   /// Returns the evaluation result as double if the
   /// kind is double.
@@ -6282,10 +6184,10 @@
   }
 
   late final _clang_EvalResult_getAsDoublePtr =
-      _lookup<ffi.NativeFunction<Native_clang_EvalResult_getAsDouble>>(
+      _lookup<ffi.NativeFunction<NativeClang_EvalResult_getAsDouble>>(
           'clang_EvalResult_getAsDouble');
   late final _clang_EvalResult_getAsDouble = _clang_EvalResult_getAsDoublePtr
-      .asFunction<double Function(CXEvalResult)>();
+      .asFunction<DartClang_EvalResult_getAsDouble>();
 
   /// Returns the evaluation result as a constant string if the
   /// kind is other than Int or float. User must not free this pointer,
@@ -6300,10 +6202,10 @@
   }
 
   late final _clang_EvalResult_getAsStrPtr =
-      _lookup<ffi.NativeFunction<Native_clang_EvalResult_getAsStr>>(
+      _lookup<ffi.NativeFunction<NativeClang_EvalResult_getAsStr>>(
           'clang_EvalResult_getAsStr');
-  late final _clang_EvalResult_getAsStr = _clang_EvalResult_getAsStrPtr
-      .asFunction<ffi.Pointer<ffi.Int8> Function(CXEvalResult)>();
+  late final _clang_EvalResult_getAsStr =
+      _clang_EvalResult_getAsStrPtr.asFunction<DartClang_EvalResult_getAsStr>();
 
   /// Disposes the created Eval memory.
   void clang_EvalResult_dispose(
@@ -6315,10 +6217,10 @@
   }
 
   late final _clang_EvalResult_disposePtr =
-      _lookup<ffi.NativeFunction<Native_clang_EvalResult_dispose>>(
+      _lookup<ffi.NativeFunction<NativeClang_EvalResult_dispose>>(
           'clang_EvalResult_dispose');
   late final _clang_EvalResult_dispose =
-      _clang_EvalResult_disposePtr.asFunction<void Function(CXEvalResult)>();
+      _clang_EvalResult_disposePtr.asFunction<DartClang_EvalResult_dispose>();
 
   /// Retrieve a remapping.
   ///
@@ -6335,10 +6237,10 @@
   }
 
   late final _clang_getRemappingsPtr =
-      _lookup<ffi.NativeFunction<Native_clang_getRemappings>>(
+      _lookup<ffi.NativeFunction<NativeClang_getRemappings>>(
           'clang_getRemappings');
-  late final _clang_getRemappings = _clang_getRemappingsPtr
-      .asFunction<CXRemapping Function(ffi.Pointer<ffi.Int8>)>();
+  late final _clang_getRemappings =
+      _clang_getRemappingsPtr.asFunction<DartClang_getRemappings>();
 
   /// Retrieve a remapping.
   ///
@@ -6359,11 +6261,11 @@
   }
 
   late final _clang_getRemappingsFromFileListPtr =
-      _lookup<ffi.NativeFunction<Native_clang_getRemappingsFromFileList>>(
+      _lookup<ffi.NativeFunction<NativeClang_getRemappingsFromFileList>>(
           'clang_getRemappingsFromFileList');
   late final _clang_getRemappingsFromFileList =
-      _clang_getRemappingsFromFileListPtr.asFunction<
-          CXRemapping Function(ffi.Pointer<ffi.Pointer<ffi.Int8>>, int)>();
+      _clang_getRemappingsFromFileListPtr
+          .asFunction<DartClang_getRemappingsFromFileList>();
 
   /// Determine the number of remappings.
   int clang_remap_getNumFiles(
@@ -6375,10 +6277,10 @@
   }
 
   late final _clang_remap_getNumFilesPtr =
-      _lookup<ffi.NativeFunction<Native_clang_remap_getNumFiles>>(
+      _lookup<ffi.NativeFunction<NativeClang_remap_getNumFiles>>(
           'clang_remap_getNumFiles');
   late final _clang_remap_getNumFiles =
-      _clang_remap_getNumFilesPtr.asFunction<int Function(CXRemapping)>();
+      _clang_remap_getNumFilesPtr.asFunction<DartClang_remap_getNumFiles>();
 
   /// Get the original and the associated filename from the remapping.
   ///
@@ -6401,12 +6303,10 @@
   }
 
   late final _clang_remap_getFilenamesPtr =
-      _lookup<ffi.NativeFunction<Native_clang_remap_getFilenames>>(
+      _lookup<ffi.NativeFunction<NativeClang_remap_getFilenames>>(
           'clang_remap_getFilenames');
   late final _clang_remap_getFilenames =
-      _clang_remap_getFilenamesPtr.asFunction<
-          void Function(CXRemapping, int, ffi.Pointer<CXString>,
-              ffi.Pointer<CXString>)>();
+      _clang_remap_getFilenamesPtr.asFunction<DartClang_remap_getFilenames>();
 
   /// Dispose the remapping.
   void clang_remap_dispose(
@@ -6418,10 +6318,10 @@
   }
 
   late final _clang_remap_disposePtr =
-      _lookup<ffi.NativeFunction<Native_clang_remap_dispose>>(
+      _lookup<ffi.NativeFunction<NativeClang_remap_dispose>>(
           'clang_remap_dispose');
   late final _clang_remap_dispose =
-      _clang_remap_disposePtr.asFunction<void Function(CXRemapping)>();
+      _clang_remap_disposePtr.asFunction<DartClang_remap_dispose>();
 
   /// Find references of a declaration in a specific file.
   ///
@@ -6448,10 +6348,10 @@
   }
 
   late final _clang_findReferencesInFilePtr =
-      _lookup<ffi.NativeFunction<Native_clang_findReferencesInFile>>(
+      _lookup<ffi.NativeFunction<NativeClang_findReferencesInFile>>(
           'clang_findReferencesInFile');
   late final _clang_findReferencesInFile = _clang_findReferencesInFilePtr
-      .asFunction<int Function(CXCursor, CXFile, CXCursorAndRangeVisitor)>();
+      .asFunction<DartClang_findReferencesInFile>();
 
   /// Find #import/#include directives in a specific file.
   ///
@@ -6476,11 +6376,10 @@
   }
 
   late final _clang_findIncludesInFilePtr =
-      _lookup<ffi.NativeFunction<Native_clang_findIncludesInFile>>(
+      _lookup<ffi.NativeFunction<NativeClang_findIncludesInFile>>(
           'clang_findIncludesInFile');
   late final _clang_findIncludesInFile =
-      _clang_findIncludesInFilePtr.asFunction<
-          int Function(CXTranslationUnit, CXFile, CXCursorAndRangeVisitor)>();
+      _clang_findIncludesInFilePtr.asFunction<DartClang_findIncludesInFile>();
 
   int clang_index_isEntityObjCContainerKind(
     int arg0,
@@ -6491,10 +6390,11 @@
   }
 
   late final _clang_index_isEntityObjCContainerKindPtr =
-      _lookup<ffi.NativeFunction<Native_clang_index_isEntityObjCContainerKind>>(
+      _lookup<ffi.NativeFunction<NativeClang_index_isEntityObjCContainerKind>>(
           'clang_index_isEntityObjCContainerKind');
   late final _clang_index_isEntityObjCContainerKind =
-      _clang_index_isEntityObjCContainerKindPtr.asFunction<int Function(int)>();
+      _clang_index_isEntityObjCContainerKindPtr
+          .asFunction<DartClang_index_isEntityObjCContainerKind>();
 
   ffi.Pointer<CXIdxObjCContainerDeclInfo> clang_index_getObjCContainerDeclInfo(
     ffi.Pointer<CXIdxDeclInfo> arg0,
@@ -6505,12 +6405,11 @@
   }
 
   late final _clang_index_getObjCContainerDeclInfoPtr =
-      _lookup<ffi.NativeFunction<Native_clang_index_getObjCContainerDeclInfo>>(
+      _lookup<ffi.NativeFunction<NativeClang_index_getObjCContainerDeclInfo>>(
           'clang_index_getObjCContainerDeclInfo');
   late final _clang_index_getObjCContainerDeclInfo =
-      _clang_index_getObjCContainerDeclInfoPtr.asFunction<
-          ffi.Pointer<CXIdxObjCContainerDeclInfo> Function(
-              ffi.Pointer<CXIdxDeclInfo>)>();
+      _clang_index_getObjCContainerDeclInfoPtr
+          .asFunction<DartClang_index_getObjCContainerDeclInfo>();
 
   ffi.Pointer<CXIdxObjCInterfaceDeclInfo> clang_index_getObjCInterfaceDeclInfo(
     ffi.Pointer<CXIdxDeclInfo> arg0,
@@ -6521,12 +6420,11 @@
   }
 
   late final _clang_index_getObjCInterfaceDeclInfoPtr =
-      _lookup<ffi.NativeFunction<Native_clang_index_getObjCInterfaceDeclInfo>>(
+      _lookup<ffi.NativeFunction<NativeClang_index_getObjCInterfaceDeclInfo>>(
           'clang_index_getObjCInterfaceDeclInfo');
   late final _clang_index_getObjCInterfaceDeclInfo =
-      _clang_index_getObjCInterfaceDeclInfoPtr.asFunction<
-          ffi.Pointer<CXIdxObjCInterfaceDeclInfo> Function(
-              ffi.Pointer<CXIdxDeclInfo>)>();
+      _clang_index_getObjCInterfaceDeclInfoPtr
+          .asFunction<DartClang_index_getObjCInterfaceDeclInfo>();
 
   ffi.Pointer<CXIdxObjCCategoryDeclInfo> clang_index_getObjCCategoryDeclInfo(
     ffi.Pointer<CXIdxDeclInfo> arg0,
@@ -6537,12 +6435,11 @@
   }
 
   late final _clang_index_getObjCCategoryDeclInfoPtr =
-      _lookup<ffi.NativeFunction<Native_clang_index_getObjCCategoryDeclInfo>>(
+      _lookup<ffi.NativeFunction<NativeClang_index_getObjCCategoryDeclInfo>>(
           'clang_index_getObjCCategoryDeclInfo');
   late final _clang_index_getObjCCategoryDeclInfo =
-      _clang_index_getObjCCategoryDeclInfoPtr.asFunction<
-          ffi.Pointer<CXIdxObjCCategoryDeclInfo> Function(
-              ffi.Pointer<CXIdxDeclInfo>)>();
+      _clang_index_getObjCCategoryDeclInfoPtr
+          .asFunction<DartClang_index_getObjCCategoryDeclInfo>();
 
   ffi.Pointer<CXIdxObjCProtocolRefListInfo>
       clang_index_getObjCProtocolRefListInfo(
@@ -6553,13 +6450,12 @@
     );
   }
 
-  late final _clang_index_getObjCProtocolRefListInfoPtr = _lookup<
-          ffi.NativeFunction<Native_clang_index_getObjCProtocolRefListInfo>>(
-      'clang_index_getObjCProtocolRefListInfo');
+  late final _clang_index_getObjCProtocolRefListInfoPtr =
+      _lookup<ffi.NativeFunction<NativeClang_index_getObjCProtocolRefListInfo>>(
+          'clang_index_getObjCProtocolRefListInfo');
   late final _clang_index_getObjCProtocolRefListInfo =
-      _clang_index_getObjCProtocolRefListInfoPtr.asFunction<
-          ffi.Pointer<CXIdxObjCProtocolRefListInfo> Function(
-              ffi.Pointer<CXIdxDeclInfo>)>();
+      _clang_index_getObjCProtocolRefListInfoPtr
+          .asFunction<DartClang_index_getObjCProtocolRefListInfo>();
 
   ffi.Pointer<CXIdxObjCPropertyDeclInfo> clang_index_getObjCPropertyDeclInfo(
     ffi.Pointer<CXIdxDeclInfo> arg0,
@@ -6570,12 +6466,11 @@
   }
 
   late final _clang_index_getObjCPropertyDeclInfoPtr =
-      _lookup<ffi.NativeFunction<Native_clang_index_getObjCPropertyDeclInfo>>(
+      _lookup<ffi.NativeFunction<NativeClang_index_getObjCPropertyDeclInfo>>(
           'clang_index_getObjCPropertyDeclInfo');
   late final _clang_index_getObjCPropertyDeclInfo =
-      _clang_index_getObjCPropertyDeclInfoPtr.asFunction<
-          ffi.Pointer<CXIdxObjCPropertyDeclInfo> Function(
-              ffi.Pointer<CXIdxDeclInfo>)>();
+      _clang_index_getObjCPropertyDeclInfoPtr
+          .asFunction<DartClang_index_getObjCPropertyDeclInfo>();
 
   ffi.Pointer<CXIdxIBOutletCollectionAttrInfo>
       clang_index_getIBOutletCollectionAttrInfo(
@@ -6587,12 +6482,11 @@
   }
 
   late final _clang_index_getIBOutletCollectionAttrInfoPtr = _lookup<
-          ffi.NativeFunction<Native_clang_index_getIBOutletCollectionAttrInfo>>(
+          ffi.NativeFunction<NativeClang_index_getIBOutletCollectionAttrInfo>>(
       'clang_index_getIBOutletCollectionAttrInfo');
   late final _clang_index_getIBOutletCollectionAttrInfo =
-      _clang_index_getIBOutletCollectionAttrInfoPtr.asFunction<
-          ffi.Pointer<CXIdxIBOutletCollectionAttrInfo> Function(
-              ffi.Pointer<CXIdxAttrInfo>)>();
+      _clang_index_getIBOutletCollectionAttrInfoPtr
+          .asFunction<DartClang_index_getIBOutletCollectionAttrInfo>();
 
   ffi.Pointer<CXIdxCXXClassDeclInfo> clang_index_getCXXClassDeclInfo(
     ffi.Pointer<CXIdxDeclInfo> arg0,
@@ -6603,12 +6497,11 @@
   }
 
   late final _clang_index_getCXXClassDeclInfoPtr =
-      _lookup<ffi.NativeFunction<Native_clang_index_getCXXClassDeclInfo>>(
+      _lookup<ffi.NativeFunction<NativeClang_index_getCXXClassDeclInfo>>(
           'clang_index_getCXXClassDeclInfo');
   late final _clang_index_getCXXClassDeclInfo =
-      _clang_index_getCXXClassDeclInfoPtr.asFunction<
-          ffi.Pointer<CXIdxCXXClassDeclInfo> Function(
-              ffi.Pointer<CXIdxDeclInfo>)>();
+      _clang_index_getCXXClassDeclInfoPtr
+          .asFunction<DartClang_index_getCXXClassDeclInfo>();
 
   /// For retrieving a custom CXIdxClientContainer attached to a
   /// container.
@@ -6621,11 +6514,11 @@
   }
 
   late final _clang_index_getClientContainerPtr =
-      _lookup<ffi.NativeFunction<Native_clang_index_getClientContainer>>(
+      _lookup<ffi.NativeFunction<NativeClang_index_getClientContainer>>(
           'clang_index_getClientContainer');
   late final _clang_index_getClientContainer =
-      _clang_index_getClientContainerPtr.asFunction<
-          CXIdxClientContainer Function(ffi.Pointer<CXIdxContainerInfo>)>();
+      _clang_index_getClientContainerPtr
+          .asFunction<DartClang_index_getClientContainer>();
 
   /// For setting a custom CXIdxClientContainer attached to a
   /// container.
@@ -6640,12 +6533,11 @@
   }
 
   late final _clang_index_setClientContainerPtr =
-      _lookup<ffi.NativeFunction<Native_clang_index_setClientContainer>>(
+      _lookup<ffi.NativeFunction<NativeClang_index_setClientContainer>>(
           'clang_index_setClientContainer');
   late final _clang_index_setClientContainer =
-      _clang_index_setClientContainerPtr.asFunction<
-          void Function(
-              ffi.Pointer<CXIdxContainerInfo>, CXIdxClientContainer)>();
+      _clang_index_setClientContainerPtr
+          .asFunction<DartClang_index_setClientContainer>();
 
   /// For retrieving a custom CXIdxClientEntity attached to an entity.
   CXIdxClientEntity clang_index_getClientEntity(
@@ -6657,10 +6549,10 @@
   }
 
   late final _clang_index_getClientEntityPtr =
-      _lookup<ffi.NativeFunction<Native_clang_index_getClientEntity>>(
+      _lookup<ffi.NativeFunction<NativeClang_index_getClientEntity>>(
           'clang_index_getClientEntity');
   late final _clang_index_getClientEntity = _clang_index_getClientEntityPtr
-      .asFunction<CXIdxClientEntity Function(ffi.Pointer<CXIdxEntityInfo>)>();
+      .asFunction<DartClang_index_getClientEntity>();
 
   /// For setting a custom CXIdxClientEntity attached to an entity.
   void clang_index_setClientEntity(
@@ -6674,11 +6566,10 @@
   }
 
   late final _clang_index_setClientEntityPtr =
-      _lookup<ffi.NativeFunction<Native_clang_index_setClientEntity>>(
+      _lookup<ffi.NativeFunction<NativeClang_index_setClientEntity>>(
           'clang_index_setClientEntity');
-  late final _clang_index_setClientEntity =
-      _clang_index_setClientEntityPtr.asFunction<
-          void Function(ffi.Pointer<CXIdxEntityInfo>, CXIdxClientEntity)>();
+  late final _clang_index_setClientEntity = _clang_index_setClientEntityPtr
+      .asFunction<DartClang_index_setClientEntity>();
 
   /// An indexing action/session, to be applied to one or multiple
   /// translation units.
@@ -6693,10 +6584,10 @@
   }
 
   late final _clang_IndexAction_createPtr =
-      _lookup<ffi.NativeFunction<Native_clang_IndexAction_create>>(
+      _lookup<ffi.NativeFunction<NativeClang_IndexAction_create>>(
           'clang_IndexAction_create');
-  late final _clang_IndexAction_create = _clang_IndexAction_createPtr
-      .asFunction<CXIndexAction Function(CXIndex)>();
+  late final _clang_IndexAction_create =
+      _clang_IndexAction_createPtr.asFunction<DartClang_IndexAction_create>();
 
   /// Destroy the given index action.
   ///
@@ -6711,10 +6602,10 @@
   }
 
   late final _clang_IndexAction_disposePtr =
-      _lookup<ffi.NativeFunction<Native_clang_IndexAction_dispose>>(
+      _lookup<ffi.NativeFunction<NativeClang_IndexAction_dispose>>(
           'clang_IndexAction_dispose');
   late final _clang_IndexAction_dispose =
-      _clang_IndexAction_disposePtr.asFunction<void Function(CXIndexAction)>();
+      _clang_IndexAction_disposePtr.asFunction<DartClang_IndexAction_dispose>();
 
   /// Index the given source file and the translation unit corresponding
   /// to that file via callbacks implemented through #IndexerCallbacks.
@@ -6770,22 +6661,10 @@
   }
 
   late final _clang_indexSourceFilePtr =
-      _lookup<ffi.NativeFunction<Native_clang_indexSourceFile>>(
+      _lookup<ffi.NativeFunction<NativeClang_indexSourceFile>>(
           'clang_indexSourceFile');
-  late final _clang_indexSourceFile = _clang_indexSourceFilePtr.asFunction<
-      int Function(
-          CXIndexAction,
-          CXClientData,
-          ffi.Pointer<IndexerCallbacks>,
-          int,
-          int,
-          ffi.Pointer<ffi.Int8>,
-          ffi.Pointer<ffi.Pointer<ffi.Int8>>,
-          int,
-          ffi.Pointer<CXUnsavedFile>,
-          int,
-          ffi.Pointer<CXTranslationUnit>,
-          int)>();
+  late final _clang_indexSourceFile =
+      _clang_indexSourceFilePtr.asFunction<DartClang_indexSourceFile>();
 
   /// Same as clang_indexSourceFile but requires a full command line
   /// for \c command_line_args including argv[0]. This is useful if the standard
@@ -6821,23 +6700,10 @@
   }
 
   late final _clang_indexSourceFileFullArgvPtr =
-      _lookup<ffi.NativeFunction<Native_clang_indexSourceFileFullArgv>>(
+      _lookup<ffi.NativeFunction<NativeClang_indexSourceFileFullArgv>>(
           'clang_indexSourceFileFullArgv');
-  late final _clang_indexSourceFileFullArgv =
-      _clang_indexSourceFileFullArgvPtr.asFunction<
-          int Function(
-              CXIndexAction,
-              CXClientData,
-              ffi.Pointer<IndexerCallbacks>,
-              int,
-              int,
-              ffi.Pointer<ffi.Int8>,
-              ffi.Pointer<ffi.Pointer<ffi.Int8>>,
-              int,
-              ffi.Pointer<CXUnsavedFile>,
-              int,
-              ffi.Pointer<CXTranslationUnit>,
-              int)>();
+  late final _clang_indexSourceFileFullArgv = _clang_indexSourceFileFullArgvPtr
+      .asFunction<DartClang_indexSourceFileFullArgv>();
 
   /// Index the given translation unit via callbacks implemented through
   /// #IndexerCallbacks.
@@ -6872,12 +6738,10 @@
   }
 
   late final _clang_indexTranslationUnitPtr =
-      _lookup<ffi.NativeFunction<Native_clang_indexTranslationUnit>>(
+      _lookup<ffi.NativeFunction<NativeClang_indexTranslationUnit>>(
           'clang_indexTranslationUnit');
-  late final _clang_indexTranslationUnit =
-      _clang_indexTranslationUnitPtr.asFunction<
-          int Function(CXIndexAction, CXClientData,
-              ffi.Pointer<IndexerCallbacks>, int, int, CXTranslationUnit)>();
+  late final _clang_indexTranslationUnit = _clang_indexTranslationUnitPtr
+      .asFunction<DartClang_indexTranslationUnit>();
 
   /// Retrieve the CXIdxFile, file, line, column, and offset represented by
   /// the given CXIdxLoc.
@@ -6904,17 +6768,11 @@
   }
 
   late final _clang_indexLoc_getFileLocationPtr =
-      _lookup<ffi.NativeFunction<Native_clang_indexLoc_getFileLocation>>(
+      _lookup<ffi.NativeFunction<NativeClang_indexLoc_getFileLocation>>(
           'clang_indexLoc_getFileLocation');
   late final _clang_indexLoc_getFileLocation =
-      _clang_indexLoc_getFileLocationPtr.asFunction<
-          void Function(
-              CXIdxLoc,
-              ffi.Pointer<CXIdxClientFile>,
-              ffi.Pointer<CXFile>,
-              ffi.Pointer<ffi.Uint32>,
-              ffi.Pointer<ffi.Uint32>,
-              ffi.Pointer<ffi.Uint32>)>();
+      _clang_indexLoc_getFileLocationPtr
+          .asFunction<DartClang_indexLoc_getFileLocation>();
 
   /// Retrieve the CXSourceLocation represented by the given CXIdxLoc.
   CXSourceLocation clang_indexLoc_getCXSourceLocation(
@@ -6926,11 +6784,11 @@
   }
 
   late final _clang_indexLoc_getCXSourceLocationPtr =
-      _lookup<ffi.NativeFunction<Native_clang_indexLoc_getCXSourceLocation>>(
+      _lookup<ffi.NativeFunction<NativeClang_indexLoc_getCXSourceLocation>>(
           'clang_indexLoc_getCXSourceLocation');
   late final _clang_indexLoc_getCXSourceLocation =
       _clang_indexLoc_getCXSourceLocationPtr
-          .asFunction<CXSourceLocation Function(CXIdxLoc)>();
+          .asFunction<DartClang_indexLoc_getCXSourceLocation>();
 
   /// Visit the fields of a particular type.
   ///
@@ -6962,10 +6820,10 @@
   }
 
   late final _clang_Type_visitFieldsPtr =
-      _lookup<ffi.NativeFunction<Native_clang_Type_visitFields>>(
+      _lookup<ffi.NativeFunction<NativeClang_Type_visitFields>>(
           'clang_Type_visitFields');
-  late final _clang_Type_visitFields = _clang_Type_visitFieldsPtr
-      .asFunction<int Function(CXType, CXFieldVisitor, CXClientData)>();
+  late final _clang_Type_visitFields =
+      _clang_Type_visitFieldsPtr.asFunction<DartClang_Type_visitFields>();
 
   late final addresses = _SymbolAddresses(this);
 }
@@ -6973,811 +6831,811 @@
 class _SymbolAddresses {
   final LibClang _library;
   _SymbolAddresses(this._library);
-  ffi.Pointer<ffi.NativeFunction<Native_clang_getCString>>
+  ffi.Pointer<ffi.NativeFunction<NativeClang_getCString>>
       get clang_getCString => _library._clang_getCStringPtr;
-  ffi.Pointer<ffi.NativeFunction<Native_clang_disposeString>>
+  ffi.Pointer<ffi.NativeFunction<NativeClang_disposeString>>
       get clang_disposeString => _library._clang_disposeStringPtr;
-  ffi.Pointer<ffi.NativeFunction<Native_clang_disposeStringSet>>
+  ffi.Pointer<ffi.NativeFunction<NativeClang_disposeStringSet>>
       get clang_disposeStringSet => _library._clang_disposeStringSetPtr;
-  ffi.Pointer<ffi.NativeFunction<Native_clang_createIndex>>
+  ffi.Pointer<ffi.NativeFunction<NativeClang_createIndex>>
       get clang_createIndex => _library._clang_createIndexPtr;
-  ffi.Pointer<ffi.NativeFunction<Native_clang_disposeIndex>>
+  ffi.Pointer<ffi.NativeFunction<NativeClang_disposeIndex>>
       get clang_disposeIndex => _library._clang_disposeIndexPtr;
-  ffi.Pointer<ffi.NativeFunction<Native_clang_CXIndex_setGlobalOptions>>
+  ffi.Pointer<ffi.NativeFunction<NativeClang_CXIndex_setGlobalOptions>>
       get clang_CXIndex_setGlobalOptions =>
           _library._clang_CXIndex_setGlobalOptionsPtr;
-  ffi.Pointer<ffi.NativeFunction<Native_clang_CXIndex_getGlobalOptions>>
+  ffi.Pointer<ffi.NativeFunction<NativeClang_CXIndex_getGlobalOptions>>
       get clang_CXIndex_getGlobalOptions =>
           _library._clang_CXIndex_getGlobalOptionsPtr;
   ffi.Pointer<
           ffi.NativeFunction<
-              Native_clang_CXIndex_setInvocationEmissionPathOption>>
+              NativeClang_CXIndex_setInvocationEmissionPathOption>>
       get clang_CXIndex_setInvocationEmissionPathOption =>
           _library._clang_CXIndex_setInvocationEmissionPathOptionPtr;
-  ffi.Pointer<ffi.NativeFunction<Native_clang_getFileName>>
+  ffi.Pointer<ffi.NativeFunction<NativeClang_getFileName>>
       get clang_getFileName => _library._clang_getFileNamePtr;
-  ffi.Pointer<ffi.NativeFunction<Native_clang_getFileTime>>
+  ffi.Pointer<ffi.NativeFunction<NativeClang_getFileTime>>
       get clang_getFileTime => _library._clang_getFileTimePtr;
-  ffi.Pointer<ffi.NativeFunction<Native_clang_getFileUniqueID>>
+  ffi.Pointer<ffi.NativeFunction<NativeClang_getFileUniqueID>>
       get clang_getFileUniqueID => _library._clang_getFileUniqueIDPtr;
-  ffi.Pointer<ffi.NativeFunction<Native_clang_isFileMultipleIncludeGuarded>>
+  ffi.Pointer<ffi.NativeFunction<NativeClang_isFileMultipleIncludeGuarded>>
       get clang_isFileMultipleIncludeGuarded =>
           _library._clang_isFileMultipleIncludeGuardedPtr;
-  ffi.Pointer<ffi.NativeFunction<Native_clang_getFile>> get clang_getFile =>
+  ffi.Pointer<ffi.NativeFunction<NativeClang_getFile>> get clang_getFile =>
       _library._clang_getFilePtr;
-  ffi.Pointer<ffi.NativeFunction<Native_clang_getFileContents>>
+  ffi.Pointer<ffi.NativeFunction<NativeClang_getFileContents>>
       get clang_getFileContents => _library._clang_getFileContentsPtr;
-  ffi.Pointer<ffi.NativeFunction<Native_clang_File_isEqual>>
+  ffi.Pointer<ffi.NativeFunction<NativeClang_File_isEqual>>
       get clang_File_isEqual => _library._clang_File_isEqualPtr;
-  ffi.Pointer<ffi.NativeFunction<Native_clang_File_tryGetRealPathName>>
+  ffi.Pointer<ffi.NativeFunction<NativeClang_File_tryGetRealPathName>>
       get clang_File_tryGetRealPathName =>
           _library._clang_File_tryGetRealPathNamePtr;
-  ffi.Pointer<ffi.NativeFunction<Native_clang_getNullLocation>>
+  ffi.Pointer<ffi.NativeFunction<NativeClang_getNullLocation>>
       get clang_getNullLocation => _library._clang_getNullLocationPtr;
-  ffi.Pointer<ffi.NativeFunction<Native_clang_equalLocations>>
+  ffi.Pointer<ffi.NativeFunction<NativeClang_equalLocations>>
       get clang_equalLocations => _library._clang_equalLocationsPtr;
-  ffi.Pointer<ffi.NativeFunction<Native_clang_getLocation>>
+  ffi.Pointer<ffi.NativeFunction<NativeClang_getLocation>>
       get clang_getLocation => _library._clang_getLocationPtr;
-  ffi.Pointer<ffi.NativeFunction<Native_clang_getLocationForOffset>>
+  ffi.Pointer<ffi.NativeFunction<NativeClang_getLocationForOffset>>
       get clang_getLocationForOffset => _library._clang_getLocationForOffsetPtr;
-  ffi.Pointer<ffi.NativeFunction<Native_clang_Location_isInSystemHeader>>
+  ffi.Pointer<ffi.NativeFunction<NativeClang_Location_isInSystemHeader>>
       get clang_Location_isInSystemHeader =>
           _library._clang_Location_isInSystemHeaderPtr;
-  ffi.Pointer<ffi.NativeFunction<Native_clang_Location_isFromMainFile>>
+  ffi.Pointer<ffi.NativeFunction<NativeClang_Location_isFromMainFile>>
       get clang_Location_isFromMainFile =>
           _library._clang_Location_isFromMainFilePtr;
-  ffi.Pointer<ffi.NativeFunction<Native_clang_getNullRange>>
+  ffi.Pointer<ffi.NativeFunction<NativeClang_getNullRange>>
       get clang_getNullRange => _library._clang_getNullRangePtr;
-  ffi.Pointer<ffi.NativeFunction<Native_clang_getRange>> get clang_getRange =>
+  ffi.Pointer<ffi.NativeFunction<NativeClang_getRange>> get clang_getRange =>
       _library._clang_getRangePtr;
-  ffi.Pointer<ffi.NativeFunction<Native_clang_equalRanges>>
+  ffi.Pointer<ffi.NativeFunction<NativeClang_equalRanges>>
       get clang_equalRanges => _library._clang_equalRangesPtr;
-  ffi.Pointer<ffi.NativeFunction<Native_clang_Range_isNull>>
+  ffi.Pointer<ffi.NativeFunction<NativeClang_Range_isNull>>
       get clang_Range_isNull => _library._clang_Range_isNullPtr;
-  ffi.Pointer<ffi.NativeFunction<Native_clang_getExpansionLocation>>
+  ffi.Pointer<ffi.NativeFunction<NativeClang_getExpansionLocation>>
       get clang_getExpansionLocation => _library._clang_getExpansionLocationPtr;
-  ffi.Pointer<ffi.NativeFunction<Native_clang_getPresumedLocation>>
+  ffi.Pointer<ffi.NativeFunction<NativeClang_getPresumedLocation>>
       get clang_getPresumedLocation => _library._clang_getPresumedLocationPtr;
-  ffi.Pointer<ffi.NativeFunction<Native_clang_getInstantiationLocation>>
+  ffi.Pointer<ffi.NativeFunction<NativeClang_getInstantiationLocation>>
       get clang_getInstantiationLocation =>
           _library._clang_getInstantiationLocationPtr;
-  ffi.Pointer<ffi.NativeFunction<Native_clang_getSpellingLocation>>
+  ffi.Pointer<ffi.NativeFunction<NativeClang_getSpellingLocation>>
       get clang_getSpellingLocation => _library._clang_getSpellingLocationPtr;
-  ffi.Pointer<ffi.NativeFunction<Native_clang_getFileLocation>>
+  ffi.Pointer<ffi.NativeFunction<NativeClang_getFileLocation>>
       get clang_getFileLocation => _library._clang_getFileLocationPtr;
-  ffi.Pointer<ffi.NativeFunction<Native_clang_getRangeStart>>
+  ffi.Pointer<ffi.NativeFunction<NativeClang_getRangeStart>>
       get clang_getRangeStart => _library._clang_getRangeStartPtr;
-  ffi.Pointer<ffi.NativeFunction<Native_clang_getRangeEnd>>
+  ffi.Pointer<ffi.NativeFunction<NativeClang_getRangeEnd>>
       get clang_getRangeEnd => _library._clang_getRangeEndPtr;
-  ffi.Pointer<ffi.NativeFunction<Native_clang_getSkippedRanges>>
+  ffi.Pointer<ffi.NativeFunction<NativeClang_getSkippedRanges>>
       get clang_getSkippedRanges => _library._clang_getSkippedRangesPtr;
-  ffi.Pointer<ffi.NativeFunction<Native_clang_getAllSkippedRanges>>
+  ffi.Pointer<ffi.NativeFunction<NativeClang_getAllSkippedRanges>>
       get clang_getAllSkippedRanges => _library._clang_getAllSkippedRangesPtr;
-  ffi.Pointer<ffi.NativeFunction<Native_clang_disposeSourceRangeList>>
+  ffi.Pointer<ffi.NativeFunction<NativeClang_disposeSourceRangeList>>
       get clang_disposeSourceRangeList =>
           _library._clang_disposeSourceRangeListPtr;
-  ffi.Pointer<ffi.NativeFunction<Native_clang_getNumDiagnosticsInSet>>
+  ffi.Pointer<ffi.NativeFunction<NativeClang_getNumDiagnosticsInSet>>
       get clang_getNumDiagnosticsInSet =>
           _library._clang_getNumDiagnosticsInSetPtr;
-  ffi.Pointer<ffi.NativeFunction<Native_clang_getDiagnosticInSet>>
+  ffi.Pointer<ffi.NativeFunction<NativeClang_getDiagnosticInSet>>
       get clang_getDiagnosticInSet => _library._clang_getDiagnosticInSetPtr;
-  ffi.Pointer<ffi.NativeFunction<Native_clang_loadDiagnostics>>
+  ffi.Pointer<ffi.NativeFunction<NativeClang_loadDiagnostics>>
       get clang_loadDiagnostics => _library._clang_loadDiagnosticsPtr;
-  ffi.Pointer<ffi.NativeFunction<Native_clang_disposeDiagnosticSet>>
+  ffi.Pointer<ffi.NativeFunction<NativeClang_disposeDiagnosticSet>>
       get clang_disposeDiagnosticSet => _library._clang_disposeDiagnosticSetPtr;
-  ffi.Pointer<ffi.NativeFunction<Native_clang_getChildDiagnostics>>
+  ffi.Pointer<ffi.NativeFunction<NativeClang_getChildDiagnostics>>
       get clang_getChildDiagnostics => _library._clang_getChildDiagnosticsPtr;
-  ffi.Pointer<ffi.NativeFunction<Native_clang_getNumDiagnostics>>
+  ffi.Pointer<ffi.NativeFunction<NativeClang_getNumDiagnostics>>
       get clang_getNumDiagnostics => _library._clang_getNumDiagnosticsPtr;
-  ffi.Pointer<ffi.NativeFunction<Native_clang_getDiagnostic>>
+  ffi.Pointer<ffi.NativeFunction<NativeClang_getDiagnostic>>
       get clang_getDiagnostic => _library._clang_getDiagnosticPtr;
-  ffi.Pointer<ffi.NativeFunction<Native_clang_getDiagnosticSetFromTU>>
+  ffi.Pointer<ffi.NativeFunction<NativeClang_getDiagnosticSetFromTU>>
       get clang_getDiagnosticSetFromTU =>
           _library._clang_getDiagnosticSetFromTUPtr;
-  ffi.Pointer<ffi.NativeFunction<Native_clang_disposeDiagnostic>>
+  ffi.Pointer<ffi.NativeFunction<NativeClang_disposeDiagnostic>>
       get clang_disposeDiagnostic => _library._clang_disposeDiagnosticPtr;
-  ffi.Pointer<ffi.NativeFunction<Native_clang_formatDiagnostic>>
+  ffi.Pointer<ffi.NativeFunction<NativeClang_formatDiagnostic>>
       get clang_formatDiagnostic => _library._clang_formatDiagnosticPtr;
-  ffi.Pointer<ffi.NativeFunction<Native_clang_defaultDiagnosticDisplayOptions>>
+  ffi.Pointer<ffi.NativeFunction<NativeClang_defaultDiagnosticDisplayOptions>>
       get clang_defaultDiagnosticDisplayOptions =>
           _library._clang_defaultDiagnosticDisplayOptionsPtr;
-  ffi.Pointer<ffi.NativeFunction<Native_clang_getDiagnosticSeverity>>
+  ffi.Pointer<ffi.NativeFunction<NativeClang_getDiagnosticSeverity>>
       get clang_getDiagnosticSeverity =>
           _library._clang_getDiagnosticSeverityPtr;
-  ffi.Pointer<ffi.NativeFunction<Native_clang_getDiagnosticLocation>>
+  ffi.Pointer<ffi.NativeFunction<NativeClang_getDiagnosticLocation>>
       get clang_getDiagnosticLocation =>
           _library._clang_getDiagnosticLocationPtr;
-  ffi.Pointer<ffi.NativeFunction<Native_clang_getDiagnosticSpelling>>
+  ffi.Pointer<ffi.NativeFunction<NativeClang_getDiagnosticSpelling>>
       get clang_getDiagnosticSpelling =>
           _library._clang_getDiagnosticSpellingPtr;
-  ffi.Pointer<ffi.NativeFunction<Native_clang_getDiagnosticOption>>
+  ffi.Pointer<ffi.NativeFunction<NativeClang_getDiagnosticOption>>
       get clang_getDiagnosticOption => _library._clang_getDiagnosticOptionPtr;
-  ffi.Pointer<ffi.NativeFunction<Native_clang_getDiagnosticCategory>>
+  ffi.Pointer<ffi.NativeFunction<NativeClang_getDiagnosticCategory>>
       get clang_getDiagnosticCategory =>
           _library._clang_getDiagnosticCategoryPtr;
-  ffi.Pointer<ffi.NativeFunction<Native_clang_getDiagnosticCategoryName>>
+  ffi.Pointer<ffi.NativeFunction<NativeClang_getDiagnosticCategoryName>>
       get clang_getDiagnosticCategoryName =>
           _library._clang_getDiagnosticCategoryNamePtr;
-  ffi.Pointer<ffi.NativeFunction<Native_clang_getDiagnosticCategoryText>>
+  ffi.Pointer<ffi.NativeFunction<NativeClang_getDiagnosticCategoryText>>
       get clang_getDiagnosticCategoryText =>
           _library._clang_getDiagnosticCategoryTextPtr;
-  ffi.Pointer<ffi.NativeFunction<Native_clang_getDiagnosticNumRanges>>
+  ffi.Pointer<ffi.NativeFunction<NativeClang_getDiagnosticNumRanges>>
       get clang_getDiagnosticNumRanges =>
           _library._clang_getDiagnosticNumRangesPtr;
-  ffi.Pointer<ffi.NativeFunction<Native_clang_getDiagnosticRange>>
+  ffi.Pointer<ffi.NativeFunction<NativeClang_getDiagnosticRange>>
       get clang_getDiagnosticRange => _library._clang_getDiagnosticRangePtr;
-  ffi.Pointer<ffi.NativeFunction<Native_clang_getDiagnosticNumFixIts>>
+  ffi.Pointer<ffi.NativeFunction<NativeClang_getDiagnosticNumFixIts>>
       get clang_getDiagnosticNumFixIts =>
           _library._clang_getDiagnosticNumFixItsPtr;
-  ffi.Pointer<ffi.NativeFunction<Native_clang_getDiagnosticFixIt>>
+  ffi.Pointer<ffi.NativeFunction<NativeClang_getDiagnosticFixIt>>
       get clang_getDiagnosticFixIt => _library._clang_getDiagnosticFixItPtr;
-  ffi.Pointer<ffi.NativeFunction<Native_clang_getTranslationUnitSpelling>>
+  ffi.Pointer<ffi.NativeFunction<NativeClang_getTranslationUnitSpelling>>
       get clang_getTranslationUnitSpelling =>
           _library._clang_getTranslationUnitSpellingPtr;
   ffi.Pointer<
-          ffi.NativeFunction<Native_clang_createTranslationUnitFromSourceFile>>
+          ffi.NativeFunction<NativeClang_createTranslationUnitFromSourceFile>>
       get clang_createTranslationUnitFromSourceFile =>
           _library._clang_createTranslationUnitFromSourceFilePtr;
-  ffi.Pointer<ffi.NativeFunction<Native_clang_createTranslationUnit>>
+  ffi.Pointer<ffi.NativeFunction<NativeClang_createTranslationUnit>>
       get clang_createTranslationUnit =>
           _library._clang_createTranslationUnitPtr;
-  ffi.Pointer<ffi.NativeFunction<Native_clang_createTranslationUnit2>>
+  ffi.Pointer<ffi.NativeFunction<NativeClang_createTranslationUnit2>>
       get clang_createTranslationUnit2 =>
           _library._clang_createTranslationUnit2Ptr;
   ffi.Pointer<
-          ffi.NativeFunction<Native_clang_defaultEditingTranslationUnitOptions>>
+          ffi.NativeFunction<NativeClang_defaultEditingTranslationUnitOptions>>
       get clang_defaultEditingTranslationUnitOptions =>
           _library._clang_defaultEditingTranslationUnitOptionsPtr;
-  ffi.Pointer<ffi.NativeFunction<Native_clang_parseTranslationUnit>>
+  ffi.Pointer<ffi.NativeFunction<NativeClang_parseTranslationUnit>>
       get clang_parseTranslationUnit => _library._clang_parseTranslationUnitPtr;
-  ffi.Pointer<ffi.NativeFunction<Native_clang_parseTranslationUnit2>>
+  ffi.Pointer<ffi.NativeFunction<NativeClang_parseTranslationUnit2>>
       get clang_parseTranslationUnit2 =>
           _library._clang_parseTranslationUnit2Ptr;
-  ffi.Pointer<ffi.NativeFunction<Native_clang_parseTranslationUnit2FullArgv>>
+  ffi.Pointer<ffi.NativeFunction<NativeClang_parseTranslationUnit2FullArgv>>
       get clang_parseTranslationUnit2FullArgv =>
           _library._clang_parseTranslationUnit2FullArgvPtr;
-  ffi.Pointer<ffi.NativeFunction<Native_clang_defaultSaveOptions>>
+  ffi.Pointer<ffi.NativeFunction<NativeClang_defaultSaveOptions>>
       get clang_defaultSaveOptions => _library._clang_defaultSaveOptionsPtr;
-  ffi.Pointer<ffi.NativeFunction<Native_clang_saveTranslationUnit>>
+  ffi.Pointer<ffi.NativeFunction<NativeClang_saveTranslationUnit>>
       get clang_saveTranslationUnit => _library._clang_saveTranslationUnitPtr;
-  ffi.Pointer<ffi.NativeFunction<Native_clang_suspendTranslationUnit>>
+  ffi.Pointer<ffi.NativeFunction<NativeClang_suspendTranslationUnit>>
       get clang_suspendTranslationUnit =>
           _library._clang_suspendTranslationUnitPtr;
-  ffi.Pointer<ffi.NativeFunction<Native_clang_disposeTranslationUnit>>
+  ffi.Pointer<ffi.NativeFunction<NativeClang_disposeTranslationUnit>>
       get clang_disposeTranslationUnit =>
           _library._clang_disposeTranslationUnitPtr;
-  ffi.Pointer<ffi.NativeFunction<Native_clang_defaultReparseOptions>>
+  ffi.Pointer<ffi.NativeFunction<NativeClang_defaultReparseOptions>>
       get clang_defaultReparseOptions =>
           _library._clang_defaultReparseOptionsPtr;
-  ffi.Pointer<ffi.NativeFunction<Native_clang_reparseTranslationUnit>>
+  ffi.Pointer<ffi.NativeFunction<NativeClang_reparseTranslationUnit>>
       get clang_reparseTranslationUnit =>
           _library._clang_reparseTranslationUnitPtr;
-  ffi.Pointer<ffi.NativeFunction<Native_clang_getTUResourceUsageName>>
+  ffi.Pointer<ffi.NativeFunction<NativeClang_getTUResourceUsageName>>
       get clang_getTUResourceUsageName =>
           _library._clang_getTUResourceUsageNamePtr;
-  ffi.Pointer<ffi.NativeFunction<Native_clang_getCXTUResourceUsage>>
+  ffi.Pointer<ffi.NativeFunction<NativeClang_getCXTUResourceUsage>>
       get clang_getCXTUResourceUsage => _library._clang_getCXTUResourceUsagePtr;
-  ffi.Pointer<ffi.NativeFunction<Native_clang_disposeCXTUResourceUsage>>
+  ffi.Pointer<ffi.NativeFunction<NativeClang_disposeCXTUResourceUsage>>
       get clang_disposeCXTUResourceUsage =>
           _library._clang_disposeCXTUResourceUsagePtr;
-  ffi.Pointer<ffi.NativeFunction<Native_clang_getTranslationUnitTargetInfo>>
+  ffi.Pointer<ffi.NativeFunction<NativeClang_getTranslationUnitTargetInfo>>
       get clang_getTranslationUnitTargetInfo =>
           _library._clang_getTranslationUnitTargetInfoPtr;
-  ffi.Pointer<ffi.NativeFunction<Native_clang_TargetInfo_dispose>>
+  ffi.Pointer<ffi.NativeFunction<NativeClang_TargetInfo_dispose>>
       get clang_TargetInfo_dispose => _library._clang_TargetInfo_disposePtr;
-  ffi.Pointer<ffi.NativeFunction<Native_clang_TargetInfo_getTriple>>
+  ffi.Pointer<ffi.NativeFunction<NativeClang_TargetInfo_getTriple>>
       get clang_TargetInfo_getTriple => _library._clang_TargetInfo_getTriplePtr;
-  ffi.Pointer<ffi.NativeFunction<Native_clang_TargetInfo_getPointerWidth>>
+  ffi.Pointer<ffi.NativeFunction<NativeClang_TargetInfo_getPointerWidth>>
       get clang_TargetInfo_getPointerWidth =>
           _library._clang_TargetInfo_getPointerWidthPtr;
-  ffi.Pointer<ffi.NativeFunction<Native_clang_getNullCursor>>
+  ffi.Pointer<ffi.NativeFunction<NativeClang_getNullCursor>>
       get clang_getNullCursor => _library._clang_getNullCursorPtr;
-  ffi.Pointer<ffi.NativeFunction<Native_clang_getTranslationUnitCursor>>
+  ffi.Pointer<ffi.NativeFunction<NativeClang_getTranslationUnitCursor>>
       get clang_getTranslationUnitCursor =>
           _library._clang_getTranslationUnitCursorPtr;
-  ffi.Pointer<ffi.NativeFunction<Native_clang_equalCursors>>
+  ffi.Pointer<ffi.NativeFunction<NativeClang_equalCursors>>
       get clang_equalCursors => _library._clang_equalCursorsPtr;
-  ffi.Pointer<ffi.NativeFunction<Native_clang_Cursor_isNull>>
+  ffi.Pointer<ffi.NativeFunction<NativeClang_Cursor_isNull>>
       get clang_Cursor_isNull => _library._clang_Cursor_isNullPtr;
-  ffi.Pointer<ffi.NativeFunction<Native_clang_hashCursor>>
+  ffi.Pointer<ffi.NativeFunction<NativeClang_hashCursor>>
       get clang_hashCursor => _library._clang_hashCursorPtr;
-  ffi.Pointer<ffi.NativeFunction<Native_clang_getCursorKind>>
+  ffi.Pointer<ffi.NativeFunction<NativeClang_getCursorKind>>
       get clang_getCursorKind => _library._clang_getCursorKindPtr;
-  ffi.Pointer<ffi.NativeFunction<Native_clang_isDeclaration>>
+  ffi.Pointer<ffi.NativeFunction<NativeClang_isDeclaration>>
       get clang_isDeclaration => _library._clang_isDeclarationPtr;
-  ffi.Pointer<ffi.NativeFunction<Native_clang_isInvalidDeclaration>>
+  ffi.Pointer<ffi.NativeFunction<NativeClang_isInvalidDeclaration>>
       get clang_isInvalidDeclaration => _library._clang_isInvalidDeclarationPtr;
-  ffi.Pointer<ffi.NativeFunction<Native_clang_isReference>>
+  ffi.Pointer<ffi.NativeFunction<NativeClang_isReference>>
       get clang_isReference => _library._clang_isReferencePtr;
-  ffi.Pointer<ffi.NativeFunction<Native_clang_isExpression>>
+  ffi.Pointer<ffi.NativeFunction<NativeClang_isExpression>>
       get clang_isExpression => _library._clang_isExpressionPtr;
-  ffi.Pointer<ffi.NativeFunction<Native_clang_isStatement>>
+  ffi.Pointer<ffi.NativeFunction<NativeClang_isStatement>>
       get clang_isStatement => _library._clang_isStatementPtr;
-  ffi.Pointer<ffi.NativeFunction<Native_clang_isAttribute>>
+  ffi.Pointer<ffi.NativeFunction<NativeClang_isAttribute>>
       get clang_isAttribute => _library._clang_isAttributePtr;
-  ffi.Pointer<ffi.NativeFunction<Native_clang_Cursor_hasAttrs>>
+  ffi.Pointer<ffi.NativeFunction<NativeClang_Cursor_hasAttrs>>
       get clang_Cursor_hasAttrs => _library._clang_Cursor_hasAttrsPtr;
-  ffi.Pointer<ffi.NativeFunction<Native_clang_isInvalid>> get clang_isInvalid =>
+  ffi.Pointer<ffi.NativeFunction<NativeClang_isInvalid>> get clang_isInvalid =>
       _library._clang_isInvalidPtr;
-  ffi.Pointer<ffi.NativeFunction<Native_clang_isTranslationUnit>>
+  ffi.Pointer<ffi.NativeFunction<NativeClang_isTranslationUnit>>
       get clang_isTranslationUnit => _library._clang_isTranslationUnitPtr;
-  ffi.Pointer<ffi.NativeFunction<Native_clang_isPreprocessing>>
+  ffi.Pointer<ffi.NativeFunction<NativeClang_isPreprocessing>>
       get clang_isPreprocessing => _library._clang_isPreprocessingPtr;
-  ffi.Pointer<ffi.NativeFunction<Native_clang_isUnexposed>>
+  ffi.Pointer<ffi.NativeFunction<NativeClang_isUnexposed>>
       get clang_isUnexposed => _library._clang_isUnexposedPtr;
-  ffi.Pointer<ffi.NativeFunction<Native_clang_getCursorLinkage>>
+  ffi.Pointer<ffi.NativeFunction<NativeClang_getCursorLinkage>>
       get clang_getCursorLinkage => _library._clang_getCursorLinkagePtr;
-  ffi.Pointer<ffi.NativeFunction<Native_clang_getCursorVisibility>>
+  ffi.Pointer<ffi.NativeFunction<NativeClang_getCursorVisibility>>
       get clang_getCursorVisibility => _library._clang_getCursorVisibilityPtr;
-  ffi.Pointer<ffi.NativeFunction<Native_clang_getCursorAvailability>>
+  ffi.Pointer<ffi.NativeFunction<NativeClang_getCursorAvailability>>
       get clang_getCursorAvailability =>
           _library._clang_getCursorAvailabilityPtr;
-  ffi.Pointer<ffi.NativeFunction<Native_clang_getCursorPlatformAvailability>>
+  ffi.Pointer<ffi.NativeFunction<NativeClang_getCursorPlatformAvailability>>
       get clang_getCursorPlatformAvailability =>
           _library._clang_getCursorPlatformAvailabilityPtr;
-  ffi.Pointer<ffi.NativeFunction<Native_clang_disposeCXPlatformAvailability>>
+  ffi.Pointer<ffi.NativeFunction<NativeClang_disposeCXPlatformAvailability>>
       get clang_disposeCXPlatformAvailability =>
           _library._clang_disposeCXPlatformAvailabilityPtr;
-  ffi.Pointer<ffi.NativeFunction<Native_clang_getCursorLanguage>>
+  ffi.Pointer<ffi.NativeFunction<NativeClang_getCursorLanguage>>
       get clang_getCursorLanguage => _library._clang_getCursorLanguagePtr;
-  ffi.Pointer<ffi.NativeFunction<Native_clang_getCursorTLSKind>>
+  ffi.Pointer<ffi.NativeFunction<NativeClang_getCursorTLSKind>>
       get clang_getCursorTLSKind => _library._clang_getCursorTLSKindPtr;
-  ffi.Pointer<ffi.NativeFunction<Native_clang_Cursor_getTranslationUnit>>
+  ffi.Pointer<ffi.NativeFunction<NativeClang_Cursor_getTranslationUnit>>
       get clang_Cursor_getTranslationUnit =>
           _library._clang_Cursor_getTranslationUnitPtr;
-  ffi.Pointer<ffi.NativeFunction<Native_clang_createCXCursorSet>>
+  ffi.Pointer<ffi.NativeFunction<NativeClang_createCXCursorSet>>
       get clang_createCXCursorSet => _library._clang_createCXCursorSetPtr;
-  ffi.Pointer<ffi.NativeFunction<Native_clang_disposeCXCursorSet>>
+  ffi.Pointer<ffi.NativeFunction<NativeClang_disposeCXCursorSet>>
       get clang_disposeCXCursorSet => _library._clang_disposeCXCursorSetPtr;
-  ffi.Pointer<ffi.NativeFunction<Native_clang_CXCursorSet_contains>>
+  ffi.Pointer<ffi.NativeFunction<NativeClang_CXCursorSet_contains>>
       get clang_CXCursorSet_contains => _library._clang_CXCursorSet_containsPtr;
-  ffi.Pointer<ffi.NativeFunction<Native_clang_CXCursorSet_insert>>
+  ffi.Pointer<ffi.NativeFunction<NativeClang_CXCursorSet_insert>>
       get clang_CXCursorSet_insert => _library._clang_CXCursorSet_insertPtr;
-  ffi.Pointer<ffi.NativeFunction<Native_clang_getCursorSemanticParent>>
+  ffi.Pointer<ffi.NativeFunction<NativeClang_getCursorSemanticParent>>
       get clang_getCursorSemanticParent =>
           _library._clang_getCursorSemanticParentPtr;
-  ffi.Pointer<ffi.NativeFunction<Native_clang_getCursorLexicalParent>>
+  ffi.Pointer<ffi.NativeFunction<NativeClang_getCursorLexicalParent>>
       get clang_getCursorLexicalParent =>
           _library._clang_getCursorLexicalParentPtr;
-  ffi.Pointer<ffi.NativeFunction<Native_clang_getOverriddenCursors>>
+  ffi.Pointer<ffi.NativeFunction<NativeClang_getOverriddenCursors>>
       get clang_getOverriddenCursors => _library._clang_getOverriddenCursorsPtr;
-  ffi.Pointer<ffi.NativeFunction<Native_clang_disposeOverriddenCursors>>
+  ffi.Pointer<ffi.NativeFunction<NativeClang_disposeOverriddenCursors>>
       get clang_disposeOverriddenCursors =>
           _library._clang_disposeOverriddenCursorsPtr;
-  ffi.Pointer<ffi.NativeFunction<Native_clang_getIncludedFile>>
+  ffi.Pointer<ffi.NativeFunction<NativeClang_getIncludedFile>>
       get clang_getIncludedFile => _library._clang_getIncludedFilePtr;
-  ffi.Pointer<ffi.NativeFunction<Native_clang_getCursor>> get clang_getCursor =>
+  ffi.Pointer<ffi.NativeFunction<NativeClang_getCursor>> get clang_getCursor =>
       _library._clang_getCursorPtr;
-  ffi.Pointer<ffi.NativeFunction<Native_clang_getCursorLocation>>
+  ffi.Pointer<ffi.NativeFunction<NativeClang_getCursorLocation>>
       get clang_getCursorLocation => _library._clang_getCursorLocationPtr;
-  ffi.Pointer<ffi.NativeFunction<Native_clang_getCursorExtent>>
+  ffi.Pointer<ffi.NativeFunction<NativeClang_getCursorExtent>>
       get clang_getCursorExtent => _library._clang_getCursorExtentPtr;
-  ffi.Pointer<ffi.NativeFunction<Native_clang_getCursorType>>
+  ffi.Pointer<ffi.NativeFunction<NativeClang_getCursorType>>
       get clang_getCursorType => _library._clang_getCursorTypePtr;
-  ffi.Pointer<ffi.NativeFunction<Native_clang_getTypeSpelling>>
+  ffi.Pointer<ffi.NativeFunction<NativeClang_getTypeSpelling>>
       get clang_getTypeSpelling => _library._clang_getTypeSpellingPtr;
-  ffi.Pointer<ffi.NativeFunction<Native_clang_getTypedefDeclUnderlyingType>>
+  ffi.Pointer<ffi.NativeFunction<NativeClang_getTypedefDeclUnderlyingType>>
       get clang_getTypedefDeclUnderlyingType =>
           _library._clang_getTypedefDeclUnderlyingTypePtr;
-  ffi.Pointer<ffi.NativeFunction<Native_clang_getEnumDeclIntegerType>>
+  ffi.Pointer<ffi.NativeFunction<NativeClang_getEnumDeclIntegerType>>
       get clang_getEnumDeclIntegerType =>
           _library._clang_getEnumDeclIntegerTypePtr;
-  ffi.Pointer<ffi.NativeFunction<Native_clang_getEnumConstantDeclValue>>
+  ffi.Pointer<ffi.NativeFunction<NativeClang_getEnumConstantDeclValue>>
       get clang_getEnumConstantDeclValue =>
           _library._clang_getEnumConstantDeclValuePtr;
-  ffi.Pointer<ffi.NativeFunction<Native_clang_getEnumConstantDeclUnsignedValue>>
+  ffi.Pointer<ffi.NativeFunction<NativeClang_getEnumConstantDeclUnsignedValue>>
       get clang_getEnumConstantDeclUnsignedValue =>
           _library._clang_getEnumConstantDeclUnsignedValuePtr;
-  ffi.Pointer<ffi.NativeFunction<Native_clang_getFieldDeclBitWidth>>
+  ffi.Pointer<ffi.NativeFunction<NativeClang_getFieldDeclBitWidth>>
       get clang_getFieldDeclBitWidth => _library._clang_getFieldDeclBitWidthPtr;
-  ffi.Pointer<ffi.NativeFunction<Native_clang_Cursor_getNumArguments>>
+  ffi.Pointer<ffi.NativeFunction<NativeClang_Cursor_getNumArguments>>
       get clang_Cursor_getNumArguments =>
           _library._clang_Cursor_getNumArgumentsPtr;
-  ffi.Pointer<ffi.NativeFunction<Native_clang_Cursor_getArgument>>
+  ffi.Pointer<ffi.NativeFunction<NativeClang_Cursor_getArgument>>
       get clang_Cursor_getArgument => _library._clang_Cursor_getArgumentPtr;
-  ffi.Pointer<ffi.NativeFunction<Native_clang_Cursor_getNumTemplateArguments>>
+  ffi.Pointer<ffi.NativeFunction<NativeClang_Cursor_getNumTemplateArguments>>
       get clang_Cursor_getNumTemplateArguments =>
           _library._clang_Cursor_getNumTemplateArgumentsPtr;
-  ffi.Pointer<ffi.NativeFunction<Native_clang_Cursor_getTemplateArgumentKind>>
+  ffi.Pointer<ffi.NativeFunction<NativeClang_Cursor_getTemplateArgumentKind>>
       get clang_Cursor_getTemplateArgumentKind =>
           _library._clang_Cursor_getTemplateArgumentKindPtr;
-  ffi.Pointer<ffi.NativeFunction<Native_clang_Cursor_getTemplateArgumentType>>
+  ffi.Pointer<ffi.NativeFunction<NativeClang_Cursor_getTemplateArgumentType>>
       get clang_Cursor_getTemplateArgumentType =>
           _library._clang_Cursor_getTemplateArgumentTypePtr;
-  ffi.Pointer<ffi.NativeFunction<Native_clang_Cursor_getTemplateArgumentValue>>
+  ffi.Pointer<ffi.NativeFunction<NativeClang_Cursor_getTemplateArgumentValue>>
       get clang_Cursor_getTemplateArgumentValue =>
           _library._clang_Cursor_getTemplateArgumentValuePtr;
   ffi.Pointer<
           ffi.NativeFunction<
-              Native_clang_Cursor_getTemplateArgumentUnsignedValue>>
+              NativeClang_Cursor_getTemplateArgumentUnsignedValue>>
       get clang_Cursor_getTemplateArgumentUnsignedValue =>
           _library._clang_Cursor_getTemplateArgumentUnsignedValuePtr;
-  ffi.Pointer<ffi.NativeFunction<Native_clang_equalTypes>>
+  ffi.Pointer<ffi.NativeFunction<NativeClang_equalTypes>>
       get clang_equalTypes => _library._clang_equalTypesPtr;
-  ffi.Pointer<ffi.NativeFunction<Native_clang_getCanonicalType>>
+  ffi.Pointer<ffi.NativeFunction<NativeClang_getCanonicalType>>
       get clang_getCanonicalType => _library._clang_getCanonicalTypePtr;
-  ffi.Pointer<ffi.NativeFunction<Native_clang_isConstQualifiedType>>
+  ffi.Pointer<ffi.NativeFunction<NativeClang_isConstQualifiedType>>
       get clang_isConstQualifiedType => _library._clang_isConstQualifiedTypePtr;
-  ffi.Pointer<ffi.NativeFunction<Native_clang_Cursor_isMacroFunctionLike>>
+  ffi.Pointer<ffi.NativeFunction<NativeClang_Cursor_isMacroFunctionLike>>
       get clang_Cursor_isMacroFunctionLike =>
           _library._clang_Cursor_isMacroFunctionLikePtr;
-  ffi.Pointer<ffi.NativeFunction<Native_clang_Cursor_isMacroBuiltin>>
+  ffi.Pointer<ffi.NativeFunction<NativeClang_Cursor_isMacroBuiltin>>
       get clang_Cursor_isMacroBuiltin =>
           _library._clang_Cursor_isMacroBuiltinPtr;
-  ffi.Pointer<ffi.NativeFunction<Native_clang_Cursor_isFunctionInlined>>
+  ffi.Pointer<ffi.NativeFunction<NativeClang_Cursor_isFunctionInlined>>
       get clang_Cursor_isFunctionInlined =>
           _library._clang_Cursor_isFunctionInlinedPtr;
-  ffi.Pointer<ffi.NativeFunction<Native_clang_isVolatileQualifiedType>>
+  ffi.Pointer<ffi.NativeFunction<NativeClang_isVolatileQualifiedType>>
       get clang_isVolatileQualifiedType =>
           _library._clang_isVolatileQualifiedTypePtr;
-  ffi.Pointer<ffi.NativeFunction<Native_clang_isRestrictQualifiedType>>
+  ffi.Pointer<ffi.NativeFunction<NativeClang_isRestrictQualifiedType>>
       get clang_isRestrictQualifiedType =>
           _library._clang_isRestrictQualifiedTypePtr;
-  ffi.Pointer<ffi.NativeFunction<Native_clang_getAddressSpace>>
+  ffi.Pointer<ffi.NativeFunction<NativeClang_getAddressSpace>>
       get clang_getAddressSpace => _library._clang_getAddressSpacePtr;
-  ffi.Pointer<ffi.NativeFunction<Native_clang_getTypedefName>>
+  ffi.Pointer<ffi.NativeFunction<NativeClang_getTypedefName>>
       get clang_getTypedefName => _library._clang_getTypedefNamePtr;
-  ffi.Pointer<ffi.NativeFunction<Native_clang_getPointeeType>>
+  ffi.Pointer<ffi.NativeFunction<NativeClang_getPointeeType>>
       get clang_getPointeeType => _library._clang_getPointeeTypePtr;
-  ffi.Pointer<ffi.NativeFunction<Native_clang_getTypeDeclaration>>
+  ffi.Pointer<ffi.NativeFunction<NativeClang_getTypeDeclaration>>
       get clang_getTypeDeclaration => _library._clang_getTypeDeclarationPtr;
-  ffi.Pointer<ffi.NativeFunction<Native_clang_getDeclObjCTypeEncoding>>
+  ffi.Pointer<ffi.NativeFunction<NativeClang_getDeclObjCTypeEncoding>>
       get clang_getDeclObjCTypeEncoding =>
           _library._clang_getDeclObjCTypeEncodingPtr;
-  ffi.Pointer<ffi.NativeFunction<Native_clang_Type_getObjCEncoding>>
+  ffi.Pointer<ffi.NativeFunction<NativeClang_Type_getObjCEncoding>>
       get clang_Type_getObjCEncoding => _library._clang_Type_getObjCEncodingPtr;
-  ffi.Pointer<ffi.NativeFunction<Native_clang_getTypeKindSpelling>>
+  ffi.Pointer<ffi.NativeFunction<NativeClang_getTypeKindSpelling>>
       get clang_getTypeKindSpelling => _library._clang_getTypeKindSpellingPtr;
-  ffi.Pointer<ffi.NativeFunction<Native_clang_getFunctionTypeCallingConv>>
+  ffi.Pointer<ffi.NativeFunction<NativeClang_getFunctionTypeCallingConv>>
       get clang_getFunctionTypeCallingConv =>
           _library._clang_getFunctionTypeCallingConvPtr;
-  ffi.Pointer<ffi.NativeFunction<Native_clang_getResultType>>
+  ffi.Pointer<ffi.NativeFunction<NativeClang_getResultType>>
       get clang_getResultType => _library._clang_getResultTypePtr;
-  ffi.Pointer<ffi.NativeFunction<Native_clang_getExceptionSpecificationType>>
+  ffi.Pointer<ffi.NativeFunction<NativeClang_getExceptionSpecificationType>>
       get clang_getExceptionSpecificationType =>
           _library._clang_getExceptionSpecificationTypePtr;
-  ffi.Pointer<ffi.NativeFunction<Native_clang_getNumArgTypes>>
+  ffi.Pointer<ffi.NativeFunction<NativeClang_getNumArgTypes>>
       get clang_getNumArgTypes => _library._clang_getNumArgTypesPtr;
-  ffi.Pointer<ffi.NativeFunction<Native_clang_getArgType>>
+  ffi.Pointer<ffi.NativeFunction<NativeClang_getArgType>>
       get clang_getArgType => _library._clang_getArgTypePtr;
-  ffi.Pointer<ffi.NativeFunction<Native_clang_Type_getObjCObjectBaseType>>
+  ffi.Pointer<ffi.NativeFunction<NativeClang_Type_getObjCObjectBaseType>>
       get clang_Type_getObjCObjectBaseType =>
           _library._clang_Type_getObjCObjectBaseTypePtr;
-  ffi.Pointer<ffi.NativeFunction<Native_clang_Type_getNumObjCProtocolRefs>>
+  ffi.Pointer<ffi.NativeFunction<NativeClang_Type_getNumObjCProtocolRefs>>
       get clang_Type_getNumObjCProtocolRefs =>
           _library._clang_Type_getNumObjCProtocolRefsPtr;
-  ffi.Pointer<ffi.NativeFunction<Native_clang_Type_getObjCProtocolDecl>>
+  ffi.Pointer<ffi.NativeFunction<NativeClang_Type_getObjCProtocolDecl>>
       get clang_Type_getObjCProtocolDecl =>
           _library._clang_Type_getObjCProtocolDeclPtr;
-  ffi.Pointer<ffi.NativeFunction<Native_clang_Type_getNumObjCTypeArgs>>
+  ffi.Pointer<ffi.NativeFunction<NativeClang_Type_getNumObjCTypeArgs>>
       get clang_Type_getNumObjCTypeArgs =>
           _library._clang_Type_getNumObjCTypeArgsPtr;
-  ffi.Pointer<ffi.NativeFunction<Native_clang_Type_getObjCTypeArg>>
+  ffi.Pointer<ffi.NativeFunction<NativeClang_Type_getObjCTypeArg>>
       get clang_Type_getObjCTypeArg => _library._clang_Type_getObjCTypeArgPtr;
-  ffi.Pointer<ffi.NativeFunction<Native_clang_isFunctionTypeVariadic>>
+  ffi.Pointer<ffi.NativeFunction<NativeClang_isFunctionTypeVariadic>>
       get clang_isFunctionTypeVariadic =>
           _library._clang_isFunctionTypeVariadicPtr;
-  ffi.Pointer<ffi.NativeFunction<Native_clang_getCursorResultType>>
+  ffi.Pointer<ffi.NativeFunction<NativeClang_getCursorResultType>>
       get clang_getCursorResultType => _library._clang_getCursorResultTypePtr;
   ffi.Pointer<
-          ffi.NativeFunction<Native_clang_getCursorExceptionSpecificationType>>
+          ffi.NativeFunction<NativeClang_getCursorExceptionSpecificationType>>
       get clang_getCursorExceptionSpecificationType =>
           _library._clang_getCursorExceptionSpecificationTypePtr;
-  ffi.Pointer<ffi.NativeFunction<Native_clang_isPODType>> get clang_isPODType =>
+  ffi.Pointer<ffi.NativeFunction<NativeClang_isPODType>> get clang_isPODType =>
       _library._clang_isPODTypePtr;
-  ffi.Pointer<ffi.NativeFunction<Native_clang_getElementType>>
+  ffi.Pointer<ffi.NativeFunction<NativeClang_getElementType>>
       get clang_getElementType => _library._clang_getElementTypePtr;
-  ffi.Pointer<ffi.NativeFunction<Native_clang_getNumElements>>
+  ffi.Pointer<ffi.NativeFunction<NativeClang_getNumElements>>
       get clang_getNumElements => _library._clang_getNumElementsPtr;
-  ffi.Pointer<ffi.NativeFunction<Native_clang_getArrayElementType>>
+  ffi.Pointer<ffi.NativeFunction<NativeClang_getArrayElementType>>
       get clang_getArrayElementType => _library._clang_getArrayElementTypePtr;
-  ffi.Pointer<ffi.NativeFunction<Native_clang_getArraySize>>
+  ffi.Pointer<ffi.NativeFunction<NativeClang_getArraySize>>
       get clang_getArraySize => _library._clang_getArraySizePtr;
-  ffi.Pointer<ffi.NativeFunction<Native_clang_Type_getNamedType>>
+  ffi.Pointer<ffi.NativeFunction<NativeClang_Type_getNamedType>>
       get clang_Type_getNamedType => _library._clang_Type_getNamedTypePtr;
-  ffi.Pointer<ffi.NativeFunction<Native_clang_Type_isTransparentTagTypedef>>
+  ffi.Pointer<ffi.NativeFunction<NativeClang_Type_isTransparentTagTypedef>>
       get clang_Type_isTransparentTagTypedef =>
           _library._clang_Type_isTransparentTagTypedefPtr;
-  ffi.Pointer<ffi.NativeFunction<Native_clang_Type_getNullability>>
+  ffi.Pointer<ffi.NativeFunction<NativeClang_Type_getNullability>>
       get clang_Type_getNullability => _library._clang_Type_getNullabilityPtr;
-  ffi.Pointer<ffi.NativeFunction<Native_clang_Type_getAlignOf>>
+  ffi.Pointer<ffi.NativeFunction<NativeClang_Type_getAlignOf>>
       get clang_Type_getAlignOf => _library._clang_Type_getAlignOfPtr;
-  ffi.Pointer<ffi.NativeFunction<Native_clang_Type_getClassType>>
+  ffi.Pointer<ffi.NativeFunction<NativeClang_Type_getClassType>>
       get clang_Type_getClassType => _library._clang_Type_getClassTypePtr;
-  ffi.Pointer<ffi.NativeFunction<Native_clang_Type_getSizeOf>>
+  ffi.Pointer<ffi.NativeFunction<NativeClang_Type_getSizeOf>>
       get clang_Type_getSizeOf => _library._clang_Type_getSizeOfPtr;
-  ffi.Pointer<ffi.NativeFunction<Native_clang_Type_getOffsetOf>>
+  ffi.Pointer<ffi.NativeFunction<NativeClang_Type_getOffsetOf>>
       get clang_Type_getOffsetOf => _library._clang_Type_getOffsetOfPtr;
-  ffi.Pointer<ffi.NativeFunction<Native_clang_Type_getModifiedType>>
+  ffi.Pointer<ffi.NativeFunction<NativeClang_Type_getModifiedType>>
       get clang_Type_getModifiedType => _library._clang_Type_getModifiedTypePtr;
-  ffi.Pointer<ffi.NativeFunction<Native_clang_Cursor_getOffsetOfField>>
+  ffi.Pointer<ffi.NativeFunction<NativeClang_Cursor_getOffsetOfField>>
       get clang_Cursor_getOffsetOfField =>
           _library._clang_Cursor_getOffsetOfFieldPtr;
-  ffi.Pointer<ffi.NativeFunction<Native_clang_Cursor_isAnonymous>>
+  ffi.Pointer<ffi.NativeFunction<NativeClang_Cursor_isAnonymous>>
       get clang_Cursor_isAnonymous => _library._clang_Cursor_isAnonymousPtr;
-  ffi.Pointer<ffi.NativeFunction<Native_clang_Cursor_isAnonymousRecordDecl>>
+  ffi.Pointer<ffi.NativeFunction<NativeClang_Cursor_isAnonymousRecordDecl>>
       get clang_Cursor_isAnonymousRecordDecl =>
           _library._clang_Cursor_isAnonymousRecordDeclPtr;
-  ffi.Pointer<ffi.NativeFunction<Native_clang_Cursor_isInlineNamespace>>
+  ffi.Pointer<ffi.NativeFunction<NativeClang_Cursor_isInlineNamespace>>
       get clang_Cursor_isInlineNamespace =>
           _library._clang_Cursor_isInlineNamespacePtr;
-  ffi.Pointer<ffi.NativeFunction<Native_clang_Type_getNumTemplateArguments>>
+  ffi.Pointer<ffi.NativeFunction<NativeClang_Type_getNumTemplateArguments>>
       get clang_Type_getNumTemplateArguments =>
           _library._clang_Type_getNumTemplateArgumentsPtr;
-  ffi.Pointer<ffi.NativeFunction<Native_clang_Type_getTemplateArgumentAsType>>
+  ffi.Pointer<ffi.NativeFunction<NativeClang_Type_getTemplateArgumentAsType>>
       get clang_Type_getTemplateArgumentAsType =>
           _library._clang_Type_getTemplateArgumentAsTypePtr;
-  ffi.Pointer<ffi.NativeFunction<Native_clang_Type_getCXXRefQualifier>>
+  ffi.Pointer<ffi.NativeFunction<NativeClang_Type_getCXXRefQualifier>>
       get clang_Type_getCXXRefQualifier =>
           _library._clang_Type_getCXXRefQualifierPtr;
-  ffi.Pointer<ffi.NativeFunction<Native_clang_Cursor_isBitField>>
+  ffi.Pointer<ffi.NativeFunction<NativeClang_Cursor_isBitField>>
       get clang_Cursor_isBitField => _library._clang_Cursor_isBitFieldPtr;
-  ffi.Pointer<ffi.NativeFunction<Native_clang_isVirtualBase>>
+  ffi.Pointer<ffi.NativeFunction<NativeClang_isVirtualBase>>
       get clang_isVirtualBase => _library._clang_isVirtualBasePtr;
-  ffi.Pointer<ffi.NativeFunction<Native_clang_getCXXAccessSpecifier>>
+  ffi.Pointer<ffi.NativeFunction<NativeClang_getCXXAccessSpecifier>>
       get clang_getCXXAccessSpecifier =>
           _library._clang_getCXXAccessSpecifierPtr;
-  ffi.Pointer<ffi.NativeFunction<Native_clang_Cursor_getStorageClass>>
+  ffi.Pointer<ffi.NativeFunction<NativeClang_Cursor_getStorageClass>>
       get clang_Cursor_getStorageClass =>
           _library._clang_Cursor_getStorageClassPtr;
-  ffi.Pointer<ffi.NativeFunction<Native_clang_getNumOverloadedDecls>>
+  ffi.Pointer<ffi.NativeFunction<NativeClang_getNumOverloadedDecls>>
       get clang_getNumOverloadedDecls =>
           _library._clang_getNumOverloadedDeclsPtr;
-  ffi.Pointer<ffi.NativeFunction<Native_clang_getOverloadedDecl>>
+  ffi.Pointer<ffi.NativeFunction<NativeClang_getOverloadedDecl>>
       get clang_getOverloadedDecl => _library._clang_getOverloadedDeclPtr;
-  ffi.Pointer<ffi.NativeFunction<Native_clang_getIBOutletCollectionType>>
+  ffi.Pointer<ffi.NativeFunction<NativeClang_getIBOutletCollectionType>>
       get clang_getIBOutletCollectionType =>
           _library._clang_getIBOutletCollectionTypePtr;
-  ffi.Pointer<ffi.NativeFunction<Native_clang_visitChildren>>
+  ffi.Pointer<ffi.NativeFunction<NativeClang_visitChildren>>
       get clang_visitChildren => _library._clang_visitChildrenPtr;
-  ffi.Pointer<ffi.NativeFunction<Native_clang_getCursorUSR>>
+  ffi.Pointer<ffi.NativeFunction<NativeClang_getCursorUSR>>
       get clang_getCursorUSR => _library._clang_getCursorUSRPtr;
-  ffi.Pointer<ffi.NativeFunction<Native_clang_constructUSR_ObjCClass>>
+  ffi.Pointer<ffi.NativeFunction<NativeClang_constructUSR_ObjCClass>>
       get clang_constructUSR_ObjCClass =>
           _library._clang_constructUSR_ObjCClassPtr;
-  ffi.Pointer<ffi.NativeFunction<Native_clang_constructUSR_ObjCCategory>>
+  ffi.Pointer<ffi.NativeFunction<NativeClang_constructUSR_ObjCCategory>>
       get clang_constructUSR_ObjCCategory =>
           _library._clang_constructUSR_ObjCCategoryPtr;
-  ffi.Pointer<ffi.NativeFunction<Native_clang_constructUSR_ObjCProtocol>>
+  ffi.Pointer<ffi.NativeFunction<NativeClang_constructUSR_ObjCProtocol>>
       get clang_constructUSR_ObjCProtocol =>
           _library._clang_constructUSR_ObjCProtocolPtr;
-  ffi.Pointer<ffi.NativeFunction<Native_clang_constructUSR_ObjCIvar>>
+  ffi.Pointer<ffi.NativeFunction<NativeClang_constructUSR_ObjCIvar>>
       get clang_constructUSR_ObjCIvar =>
           _library._clang_constructUSR_ObjCIvarPtr;
-  ffi.Pointer<ffi.NativeFunction<Native_clang_constructUSR_ObjCMethod>>
+  ffi.Pointer<ffi.NativeFunction<NativeClang_constructUSR_ObjCMethod>>
       get clang_constructUSR_ObjCMethod =>
           _library._clang_constructUSR_ObjCMethodPtr;
-  ffi.Pointer<ffi.NativeFunction<Native_clang_constructUSR_ObjCProperty>>
+  ffi.Pointer<ffi.NativeFunction<NativeClang_constructUSR_ObjCProperty>>
       get clang_constructUSR_ObjCProperty =>
           _library._clang_constructUSR_ObjCPropertyPtr;
-  ffi.Pointer<ffi.NativeFunction<Native_clang_getCursorSpelling>>
+  ffi.Pointer<ffi.NativeFunction<NativeClang_getCursorSpelling>>
       get clang_getCursorSpelling => _library._clang_getCursorSpellingPtr;
-  ffi.Pointer<ffi.NativeFunction<Native_clang_Cursor_getSpellingNameRange>>
+  ffi.Pointer<ffi.NativeFunction<NativeClang_Cursor_getSpellingNameRange>>
       get clang_Cursor_getSpellingNameRange =>
           _library._clang_Cursor_getSpellingNameRangePtr;
-  ffi.Pointer<ffi.NativeFunction<Native_clang_PrintingPolicy_getProperty>>
+  ffi.Pointer<ffi.NativeFunction<NativeClang_PrintingPolicy_getProperty>>
       get clang_PrintingPolicy_getProperty =>
           _library._clang_PrintingPolicy_getPropertyPtr;
-  ffi.Pointer<ffi.NativeFunction<Native_clang_PrintingPolicy_setProperty>>
+  ffi.Pointer<ffi.NativeFunction<NativeClang_PrintingPolicy_setProperty>>
       get clang_PrintingPolicy_setProperty =>
           _library._clang_PrintingPolicy_setPropertyPtr;
-  ffi.Pointer<ffi.NativeFunction<Native_clang_getCursorPrintingPolicy>>
+  ffi.Pointer<ffi.NativeFunction<NativeClang_getCursorPrintingPolicy>>
       get clang_getCursorPrintingPolicy =>
           _library._clang_getCursorPrintingPolicyPtr;
-  ffi.Pointer<ffi.NativeFunction<Native_clang_PrintingPolicy_dispose>>
+  ffi.Pointer<ffi.NativeFunction<NativeClang_PrintingPolicy_dispose>>
       get clang_PrintingPolicy_dispose =>
           _library._clang_PrintingPolicy_disposePtr;
-  ffi.Pointer<ffi.NativeFunction<Native_clang_getCursorPrettyPrinted>>
+  ffi.Pointer<ffi.NativeFunction<NativeClang_getCursorPrettyPrinted>>
       get clang_getCursorPrettyPrinted =>
           _library._clang_getCursorPrettyPrintedPtr;
-  ffi.Pointer<ffi.NativeFunction<Native_clang_getCursorDisplayName>>
+  ffi.Pointer<ffi.NativeFunction<NativeClang_getCursorDisplayName>>
       get clang_getCursorDisplayName => _library._clang_getCursorDisplayNamePtr;
-  ffi.Pointer<ffi.NativeFunction<Native_clang_getCursorReferenced>>
+  ffi.Pointer<ffi.NativeFunction<NativeClang_getCursorReferenced>>
       get clang_getCursorReferenced => _library._clang_getCursorReferencedPtr;
-  ffi.Pointer<ffi.NativeFunction<Native_clang_getCursorDefinition>>
+  ffi.Pointer<ffi.NativeFunction<NativeClang_getCursorDefinition>>
       get clang_getCursorDefinition => _library._clang_getCursorDefinitionPtr;
-  ffi.Pointer<ffi.NativeFunction<Native_clang_isCursorDefinition>>
+  ffi.Pointer<ffi.NativeFunction<NativeClang_isCursorDefinition>>
       get clang_isCursorDefinition => _library._clang_isCursorDefinitionPtr;
-  ffi.Pointer<ffi.NativeFunction<Native_clang_getCanonicalCursor>>
+  ffi.Pointer<ffi.NativeFunction<NativeClang_getCanonicalCursor>>
       get clang_getCanonicalCursor => _library._clang_getCanonicalCursorPtr;
-  ffi.Pointer<ffi.NativeFunction<Native_clang_Cursor_getObjCSelectorIndex>>
+  ffi.Pointer<ffi.NativeFunction<NativeClang_Cursor_getObjCSelectorIndex>>
       get clang_Cursor_getObjCSelectorIndex =>
           _library._clang_Cursor_getObjCSelectorIndexPtr;
-  ffi.Pointer<ffi.NativeFunction<Native_clang_Cursor_isDynamicCall>>
+  ffi.Pointer<ffi.NativeFunction<NativeClang_Cursor_isDynamicCall>>
       get clang_Cursor_isDynamicCall => _library._clang_Cursor_isDynamicCallPtr;
-  ffi.Pointer<ffi.NativeFunction<Native_clang_Cursor_getReceiverType>>
+  ffi.Pointer<ffi.NativeFunction<NativeClang_Cursor_getReceiverType>>
       get clang_Cursor_getReceiverType =>
           _library._clang_Cursor_getReceiverTypePtr;
-  ffi.Pointer<ffi.NativeFunction<Native_clang_Cursor_getObjCPropertyAttributes>>
+  ffi.Pointer<ffi.NativeFunction<NativeClang_Cursor_getObjCPropertyAttributes>>
       get clang_Cursor_getObjCPropertyAttributes =>
           _library._clang_Cursor_getObjCPropertyAttributesPtr;
-  ffi.Pointer<ffi.NativeFunction<Native_clang_Cursor_getObjCPropertyGetterName>>
+  ffi.Pointer<ffi.NativeFunction<NativeClang_Cursor_getObjCPropertyGetterName>>
       get clang_Cursor_getObjCPropertyGetterName =>
           _library._clang_Cursor_getObjCPropertyGetterNamePtr;
-  ffi.Pointer<ffi.NativeFunction<Native_clang_Cursor_getObjCPropertySetterName>>
+  ffi.Pointer<ffi.NativeFunction<NativeClang_Cursor_getObjCPropertySetterName>>
       get clang_Cursor_getObjCPropertySetterName =>
           _library._clang_Cursor_getObjCPropertySetterNamePtr;
-  ffi.Pointer<ffi.NativeFunction<Native_clang_Cursor_getObjCDeclQualifiers>>
+  ffi.Pointer<ffi.NativeFunction<NativeClang_Cursor_getObjCDeclQualifiers>>
       get clang_Cursor_getObjCDeclQualifiers =>
           _library._clang_Cursor_getObjCDeclQualifiersPtr;
-  ffi.Pointer<ffi.NativeFunction<Native_clang_Cursor_isObjCOptional>>
+  ffi.Pointer<ffi.NativeFunction<NativeClang_Cursor_isObjCOptional>>
       get clang_Cursor_isObjCOptional =>
           _library._clang_Cursor_isObjCOptionalPtr;
-  ffi.Pointer<ffi.NativeFunction<Native_clang_Cursor_isVariadic>>
+  ffi.Pointer<ffi.NativeFunction<NativeClang_Cursor_isVariadic>>
       get clang_Cursor_isVariadic => _library._clang_Cursor_isVariadicPtr;
-  ffi.Pointer<ffi.NativeFunction<Native_clang_Cursor_isExternalSymbol>>
+  ffi.Pointer<ffi.NativeFunction<NativeClang_Cursor_isExternalSymbol>>
       get clang_Cursor_isExternalSymbol =>
           _library._clang_Cursor_isExternalSymbolPtr;
-  ffi.Pointer<ffi.NativeFunction<Native_clang_Cursor_getCommentRange>>
+  ffi.Pointer<ffi.NativeFunction<NativeClang_Cursor_getCommentRange>>
       get clang_Cursor_getCommentRange =>
           _library._clang_Cursor_getCommentRangePtr;
-  ffi.Pointer<ffi.NativeFunction<Native_clang_Cursor_getRawCommentText>>
+  ffi.Pointer<ffi.NativeFunction<NativeClang_Cursor_getRawCommentText>>
       get clang_Cursor_getRawCommentText =>
           _library._clang_Cursor_getRawCommentTextPtr;
-  ffi.Pointer<ffi.NativeFunction<Native_clang_Cursor_getBriefCommentText>>
+  ffi.Pointer<ffi.NativeFunction<NativeClang_Cursor_getBriefCommentText>>
       get clang_Cursor_getBriefCommentText =>
           _library._clang_Cursor_getBriefCommentTextPtr;
-  ffi.Pointer<ffi.NativeFunction<Native_clang_Cursor_getMangling>>
+  ffi.Pointer<ffi.NativeFunction<NativeClang_Cursor_getMangling>>
       get clang_Cursor_getMangling => _library._clang_Cursor_getManglingPtr;
-  ffi.Pointer<ffi.NativeFunction<Native_clang_Cursor_getCXXManglings>>
+  ffi.Pointer<ffi.NativeFunction<NativeClang_Cursor_getCXXManglings>>
       get clang_Cursor_getCXXManglings =>
           _library._clang_Cursor_getCXXManglingsPtr;
-  ffi.Pointer<ffi.NativeFunction<Native_clang_Cursor_getObjCManglings>>
+  ffi.Pointer<ffi.NativeFunction<NativeClang_Cursor_getObjCManglings>>
       get clang_Cursor_getObjCManglings =>
           _library._clang_Cursor_getObjCManglingsPtr;
-  ffi.Pointer<ffi.NativeFunction<Native_clang_Cursor_getModule>>
+  ffi.Pointer<ffi.NativeFunction<NativeClang_Cursor_getModule>>
       get clang_Cursor_getModule => _library._clang_Cursor_getModulePtr;
-  ffi.Pointer<ffi.NativeFunction<Native_clang_getModuleForFile>>
+  ffi.Pointer<ffi.NativeFunction<NativeClang_getModuleForFile>>
       get clang_getModuleForFile => _library._clang_getModuleForFilePtr;
-  ffi.Pointer<ffi.NativeFunction<Native_clang_Module_getASTFile>>
+  ffi.Pointer<ffi.NativeFunction<NativeClang_Module_getASTFile>>
       get clang_Module_getASTFile => _library._clang_Module_getASTFilePtr;
-  ffi.Pointer<ffi.NativeFunction<Native_clang_Module_getParent>>
+  ffi.Pointer<ffi.NativeFunction<NativeClang_Module_getParent>>
       get clang_Module_getParent => _library._clang_Module_getParentPtr;
-  ffi.Pointer<ffi.NativeFunction<Native_clang_Module_getName>>
+  ffi.Pointer<ffi.NativeFunction<NativeClang_Module_getName>>
       get clang_Module_getName => _library._clang_Module_getNamePtr;
-  ffi.Pointer<ffi.NativeFunction<Native_clang_Module_getFullName>>
+  ffi.Pointer<ffi.NativeFunction<NativeClang_Module_getFullName>>
       get clang_Module_getFullName => _library._clang_Module_getFullNamePtr;
-  ffi.Pointer<ffi.NativeFunction<Native_clang_Module_isSystem>>
+  ffi.Pointer<ffi.NativeFunction<NativeClang_Module_isSystem>>
       get clang_Module_isSystem => _library._clang_Module_isSystemPtr;
-  ffi.Pointer<ffi.NativeFunction<Native_clang_Module_getNumTopLevelHeaders>>
+  ffi.Pointer<ffi.NativeFunction<NativeClang_Module_getNumTopLevelHeaders>>
       get clang_Module_getNumTopLevelHeaders =>
           _library._clang_Module_getNumTopLevelHeadersPtr;
-  ffi.Pointer<ffi.NativeFunction<Native_clang_Module_getTopLevelHeader>>
+  ffi.Pointer<ffi.NativeFunction<NativeClang_Module_getTopLevelHeader>>
       get clang_Module_getTopLevelHeader =>
           _library._clang_Module_getTopLevelHeaderPtr;
   ffi.Pointer<
           ffi.NativeFunction<
-              Native_clang_CXXConstructor_isConvertingConstructor>>
+              NativeClang_CXXConstructor_isConvertingConstructor>>
       get clang_CXXConstructor_isConvertingConstructor =>
           _library._clang_CXXConstructor_isConvertingConstructorPtr;
-  ffi.Pointer<ffi.NativeFunction<Native_clang_CXXConstructor_isCopyConstructor>>
+  ffi.Pointer<ffi.NativeFunction<NativeClang_CXXConstructor_isCopyConstructor>>
       get clang_CXXConstructor_isCopyConstructor =>
           _library._clang_CXXConstructor_isCopyConstructorPtr;
   ffi.Pointer<
-          ffi.NativeFunction<Native_clang_CXXConstructor_isDefaultConstructor>>
+          ffi.NativeFunction<NativeClang_CXXConstructor_isDefaultConstructor>>
       get clang_CXXConstructor_isDefaultConstructor =>
           _library._clang_CXXConstructor_isDefaultConstructorPtr;
-  ffi.Pointer<ffi.NativeFunction<Native_clang_CXXConstructor_isMoveConstructor>>
+  ffi.Pointer<ffi.NativeFunction<NativeClang_CXXConstructor_isMoveConstructor>>
       get clang_CXXConstructor_isMoveConstructor =>
           _library._clang_CXXConstructor_isMoveConstructorPtr;
-  ffi.Pointer<ffi.NativeFunction<Native_clang_CXXField_isMutable>>
+  ffi.Pointer<ffi.NativeFunction<NativeClang_CXXField_isMutable>>
       get clang_CXXField_isMutable => _library._clang_CXXField_isMutablePtr;
-  ffi.Pointer<ffi.NativeFunction<Native_clang_CXXMethod_isDefaulted>>
+  ffi.Pointer<ffi.NativeFunction<NativeClang_CXXMethod_isDefaulted>>
       get clang_CXXMethod_isDefaulted =>
           _library._clang_CXXMethod_isDefaultedPtr;
-  ffi.Pointer<ffi.NativeFunction<Native_clang_CXXMethod_isPureVirtual>>
+  ffi.Pointer<ffi.NativeFunction<NativeClang_CXXMethod_isPureVirtual>>
       get clang_CXXMethod_isPureVirtual =>
           _library._clang_CXXMethod_isPureVirtualPtr;
-  ffi.Pointer<ffi.NativeFunction<Native_clang_CXXMethod_isStatic>>
+  ffi.Pointer<ffi.NativeFunction<NativeClang_CXXMethod_isStatic>>
       get clang_CXXMethod_isStatic => _library._clang_CXXMethod_isStaticPtr;
-  ffi.Pointer<ffi.NativeFunction<Native_clang_CXXMethod_isVirtual>>
+  ffi.Pointer<ffi.NativeFunction<NativeClang_CXXMethod_isVirtual>>
       get clang_CXXMethod_isVirtual => _library._clang_CXXMethod_isVirtualPtr;
-  ffi.Pointer<ffi.NativeFunction<Native_clang_CXXRecord_isAbstract>>
+  ffi.Pointer<ffi.NativeFunction<NativeClang_CXXRecord_isAbstract>>
       get clang_CXXRecord_isAbstract => _library._clang_CXXRecord_isAbstractPtr;
-  ffi.Pointer<ffi.NativeFunction<Native_clang_EnumDecl_isScoped>>
+  ffi.Pointer<ffi.NativeFunction<NativeClang_EnumDecl_isScoped>>
       get clang_EnumDecl_isScoped => _library._clang_EnumDecl_isScopedPtr;
-  ffi.Pointer<ffi.NativeFunction<Native_clang_CXXMethod_isConst>>
+  ffi.Pointer<ffi.NativeFunction<NativeClang_CXXMethod_isConst>>
       get clang_CXXMethod_isConst => _library._clang_CXXMethod_isConstPtr;
-  ffi.Pointer<ffi.NativeFunction<Native_clang_getTemplateCursorKind>>
+  ffi.Pointer<ffi.NativeFunction<NativeClang_getTemplateCursorKind>>
       get clang_getTemplateCursorKind =>
           _library._clang_getTemplateCursorKindPtr;
-  ffi.Pointer<ffi.NativeFunction<Native_clang_getSpecializedCursorTemplate>>
+  ffi.Pointer<ffi.NativeFunction<NativeClang_getSpecializedCursorTemplate>>
       get clang_getSpecializedCursorTemplate =>
           _library._clang_getSpecializedCursorTemplatePtr;
-  ffi.Pointer<ffi.NativeFunction<Native_clang_getCursorReferenceNameRange>>
+  ffi.Pointer<ffi.NativeFunction<NativeClang_getCursorReferenceNameRange>>
       get clang_getCursorReferenceNameRange =>
           _library._clang_getCursorReferenceNameRangePtr;
-  ffi.Pointer<ffi.NativeFunction<Native_clang_getToken>> get clang_getToken =>
+  ffi.Pointer<ffi.NativeFunction<NativeClang_getToken>> get clang_getToken =>
       _library._clang_getTokenPtr;
-  ffi.Pointer<ffi.NativeFunction<Native_clang_getTokenKind>>
+  ffi.Pointer<ffi.NativeFunction<NativeClang_getTokenKind>>
       get clang_getTokenKind => _library._clang_getTokenKindPtr;
-  ffi.Pointer<ffi.NativeFunction<Native_clang_getTokenSpelling>>
+  ffi.Pointer<ffi.NativeFunction<NativeClang_getTokenSpelling>>
       get clang_getTokenSpelling => _library._clang_getTokenSpellingPtr;
-  ffi.Pointer<ffi.NativeFunction<Native_clang_getTokenLocation>>
+  ffi.Pointer<ffi.NativeFunction<NativeClang_getTokenLocation>>
       get clang_getTokenLocation => _library._clang_getTokenLocationPtr;
-  ffi.Pointer<ffi.NativeFunction<Native_clang_getTokenExtent>>
+  ffi.Pointer<ffi.NativeFunction<NativeClang_getTokenExtent>>
       get clang_getTokenExtent => _library._clang_getTokenExtentPtr;
-  ffi.Pointer<ffi.NativeFunction<Native_clang_tokenize>> get clang_tokenize =>
+  ffi.Pointer<ffi.NativeFunction<NativeClang_tokenize>> get clang_tokenize =>
       _library._clang_tokenizePtr;
-  ffi.Pointer<ffi.NativeFunction<Native_clang_annotateTokens>>
+  ffi.Pointer<ffi.NativeFunction<NativeClang_annotateTokens>>
       get clang_annotateTokens => _library._clang_annotateTokensPtr;
-  ffi.Pointer<ffi.NativeFunction<Native_clang_disposeTokens>>
+  ffi.Pointer<ffi.NativeFunction<NativeClang_disposeTokens>>
       get clang_disposeTokens => _library._clang_disposeTokensPtr;
-  ffi.Pointer<ffi.NativeFunction<Native_clang_getCursorKindSpelling>>
+  ffi.Pointer<ffi.NativeFunction<NativeClang_getCursorKindSpelling>>
       get clang_getCursorKindSpelling =>
           _library._clang_getCursorKindSpellingPtr;
-  ffi.Pointer<ffi.NativeFunction<Native_clang_getDefinitionSpellingAndExtent>>
+  ffi.Pointer<ffi.NativeFunction<NativeClang_getDefinitionSpellingAndExtent>>
       get clang_getDefinitionSpellingAndExtent =>
           _library._clang_getDefinitionSpellingAndExtentPtr;
-  ffi.Pointer<ffi.NativeFunction<Native_clang_enableStackTraces>>
+  ffi.Pointer<ffi.NativeFunction<NativeClang_enableStackTraces>>
       get clang_enableStackTraces => _library._clang_enableStackTracesPtr;
-  ffi.Pointer<ffi.NativeFunction<Native_clang_executeOnThread>>
+  ffi.Pointer<ffi.NativeFunction<NativeClang_executeOnThread>>
       get clang_executeOnThread => _library._clang_executeOnThreadPtr;
-  ffi.Pointer<ffi.NativeFunction<Native_clang_getCompletionChunkKind>>
+  ffi.Pointer<ffi.NativeFunction<NativeClang_getCompletionChunkKind>>
       get clang_getCompletionChunkKind =>
           _library._clang_getCompletionChunkKindPtr;
-  ffi.Pointer<ffi.NativeFunction<Native_clang_getCompletionChunkText>>
+  ffi.Pointer<ffi.NativeFunction<NativeClang_getCompletionChunkText>>
       get clang_getCompletionChunkText =>
           _library._clang_getCompletionChunkTextPtr;
   ffi.Pointer<
-          ffi.NativeFunction<Native_clang_getCompletionChunkCompletionString>>
+          ffi.NativeFunction<NativeClang_getCompletionChunkCompletionString>>
       get clang_getCompletionChunkCompletionString =>
           _library._clang_getCompletionChunkCompletionStringPtr;
-  ffi.Pointer<ffi.NativeFunction<Native_clang_getNumCompletionChunks>>
+  ffi.Pointer<ffi.NativeFunction<NativeClang_getNumCompletionChunks>>
       get clang_getNumCompletionChunks =>
           _library._clang_getNumCompletionChunksPtr;
-  ffi.Pointer<ffi.NativeFunction<Native_clang_getCompletionPriority>>
+  ffi.Pointer<ffi.NativeFunction<NativeClang_getCompletionPriority>>
       get clang_getCompletionPriority =>
           _library._clang_getCompletionPriorityPtr;
-  ffi.Pointer<ffi.NativeFunction<Native_clang_getCompletionAvailability>>
+  ffi.Pointer<ffi.NativeFunction<NativeClang_getCompletionAvailability>>
       get clang_getCompletionAvailability =>
           _library._clang_getCompletionAvailabilityPtr;
-  ffi.Pointer<ffi.NativeFunction<Native_clang_getCompletionNumAnnotations>>
+  ffi.Pointer<ffi.NativeFunction<NativeClang_getCompletionNumAnnotations>>
       get clang_getCompletionNumAnnotations =>
           _library._clang_getCompletionNumAnnotationsPtr;
-  ffi.Pointer<ffi.NativeFunction<Native_clang_getCompletionAnnotation>>
+  ffi.Pointer<ffi.NativeFunction<NativeClang_getCompletionAnnotation>>
       get clang_getCompletionAnnotation =>
           _library._clang_getCompletionAnnotationPtr;
-  ffi.Pointer<ffi.NativeFunction<Native_clang_getCompletionParent>>
+  ffi.Pointer<ffi.NativeFunction<NativeClang_getCompletionParent>>
       get clang_getCompletionParent => _library._clang_getCompletionParentPtr;
-  ffi.Pointer<ffi.NativeFunction<Native_clang_getCompletionBriefComment>>
+  ffi.Pointer<ffi.NativeFunction<NativeClang_getCompletionBriefComment>>
       get clang_getCompletionBriefComment =>
           _library._clang_getCompletionBriefCommentPtr;
-  ffi.Pointer<ffi.NativeFunction<Native_clang_getCursorCompletionString>>
+  ffi.Pointer<ffi.NativeFunction<NativeClang_getCursorCompletionString>>
       get clang_getCursorCompletionString =>
           _library._clang_getCursorCompletionStringPtr;
-  ffi.Pointer<ffi.NativeFunction<Native_clang_getCompletionNumFixIts>>
+  ffi.Pointer<ffi.NativeFunction<NativeClang_getCompletionNumFixIts>>
       get clang_getCompletionNumFixIts =>
           _library._clang_getCompletionNumFixItsPtr;
-  ffi.Pointer<ffi.NativeFunction<Native_clang_getCompletionFixIt>>
+  ffi.Pointer<ffi.NativeFunction<NativeClang_getCompletionFixIt>>
       get clang_getCompletionFixIt => _library._clang_getCompletionFixItPtr;
-  ffi.Pointer<ffi.NativeFunction<Native_clang_defaultCodeCompleteOptions>>
+  ffi.Pointer<ffi.NativeFunction<NativeClang_defaultCodeCompleteOptions>>
       get clang_defaultCodeCompleteOptions =>
           _library._clang_defaultCodeCompleteOptionsPtr;
-  ffi.Pointer<ffi.NativeFunction<Native_clang_codeCompleteAt>>
+  ffi.Pointer<ffi.NativeFunction<NativeClang_codeCompleteAt>>
       get clang_codeCompleteAt => _library._clang_codeCompleteAtPtr;
-  ffi.Pointer<ffi.NativeFunction<Native_clang_sortCodeCompletionResults>>
+  ffi.Pointer<ffi.NativeFunction<NativeClang_sortCodeCompletionResults>>
       get clang_sortCodeCompletionResults =>
           _library._clang_sortCodeCompletionResultsPtr;
-  ffi.Pointer<ffi.NativeFunction<Native_clang_disposeCodeCompleteResults>>
+  ffi.Pointer<ffi.NativeFunction<NativeClang_disposeCodeCompleteResults>>
       get clang_disposeCodeCompleteResults =>
           _library._clang_disposeCodeCompleteResultsPtr;
-  ffi.Pointer<ffi.NativeFunction<Native_clang_codeCompleteGetNumDiagnostics>>
+  ffi.Pointer<ffi.NativeFunction<NativeClang_codeCompleteGetNumDiagnostics>>
       get clang_codeCompleteGetNumDiagnostics =>
           _library._clang_codeCompleteGetNumDiagnosticsPtr;
-  ffi.Pointer<ffi.NativeFunction<Native_clang_codeCompleteGetDiagnostic>>
+  ffi.Pointer<ffi.NativeFunction<NativeClang_codeCompleteGetDiagnostic>>
       get clang_codeCompleteGetDiagnostic =>
           _library._clang_codeCompleteGetDiagnosticPtr;
-  ffi.Pointer<ffi.NativeFunction<Native_clang_codeCompleteGetContexts>>
+  ffi.Pointer<ffi.NativeFunction<NativeClang_codeCompleteGetContexts>>
       get clang_codeCompleteGetContexts =>
           _library._clang_codeCompleteGetContextsPtr;
-  ffi.Pointer<ffi.NativeFunction<Native_clang_codeCompleteGetContainerKind>>
+  ffi.Pointer<ffi.NativeFunction<NativeClang_codeCompleteGetContainerKind>>
       get clang_codeCompleteGetContainerKind =>
           _library._clang_codeCompleteGetContainerKindPtr;
-  ffi.Pointer<ffi.NativeFunction<Native_clang_codeCompleteGetContainerUSR>>
+  ffi.Pointer<ffi.NativeFunction<NativeClang_codeCompleteGetContainerUSR>>
       get clang_codeCompleteGetContainerUSR =>
           _library._clang_codeCompleteGetContainerUSRPtr;
-  ffi.Pointer<ffi.NativeFunction<Native_clang_codeCompleteGetObjCSelector>>
+  ffi.Pointer<ffi.NativeFunction<NativeClang_codeCompleteGetObjCSelector>>
       get clang_codeCompleteGetObjCSelector =>
           _library._clang_codeCompleteGetObjCSelectorPtr;
-  ffi.Pointer<ffi.NativeFunction<Native_clang_getClangVersion>>
+  ffi.Pointer<ffi.NativeFunction<NativeClang_getClangVersion>>
       get clang_getClangVersion => _library._clang_getClangVersionPtr;
-  ffi.Pointer<ffi.NativeFunction<Native_clang_toggleCrashRecovery>>
+  ffi.Pointer<ffi.NativeFunction<NativeClang_toggleCrashRecovery>>
       get clang_toggleCrashRecovery => _library._clang_toggleCrashRecoveryPtr;
-  ffi.Pointer<ffi.NativeFunction<Native_clang_getInclusions>>
+  ffi.Pointer<ffi.NativeFunction<NativeClang_getInclusions>>
       get clang_getInclusions => _library._clang_getInclusionsPtr;
-  ffi.Pointer<ffi.NativeFunction<Native_clang_Cursor_Evaluate>>
+  ffi.Pointer<ffi.NativeFunction<NativeClang_Cursor_Evaluate>>
       get clang_Cursor_Evaluate => _library._clang_Cursor_EvaluatePtr;
-  ffi.Pointer<ffi.NativeFunction<Native_clang_EvalResult_getKind>>
+  ffi.Pointer<ffi.NativeFunction<NativeClang_EvalResult_getKind>>
       get clang_EvalResult_getKind => _library._clang_EvalResult_getKindPtr;
-  ffi.Pointer<ffi.NativeFunction<Native_clang_EvalResult_getAsInt>>
+  ffi.Pointer<ffi.NativeFunction<NativeClang_EvalResult_getAsInt>>
       get clang_EvalResult_getAsInt => _library._clang_EvalResult_getAsIntPtr;
-  ffi.Pointer<ffi.NativeFunction<Native_clang_EvalResult_getAsLongLong>>
+  ffi.Pointer<ffi.NativeFunction<NativeClang_EvalResult_getAsLongLong>>
       get clang_EvalResult_getAsLongLong =>
           _library._clang_EvalResult_getAsLongLongPtr;
-  ffi.Pointer<ffi.NativeFunction<Native_clang_EvalResult_isUnsignedInt>>
+  ffi.Pointer<ffi.NativeFunction<NativeClang_EvalResult_isUnsignedInt>>
       get clang_EvalResult_isUnsignedInt =>
           _library._clang_EvalResult_isUnsignedIntPtr;
-  ffi.Pointer<ffi.NativeFunction<Native_clang_EvalResult_getAsUnsigned>>
+  ffi.Pointer<ffi.NativeFunction<NativeClang_EvalResult_getAsUnsigned>>
       get clang_EvalResult_getAsUnsigned =>
           _library._clang_EvalResult_getAsUnsignedPtr;
-  ffi.Pointer<ffi.NativeFunction<Native_clang_EvalResult_getAsDouble>>
+  ffi.Pointer<ffi.NativeFunction<NativeClang_EvalResult_getAsDouble>>
       get clang_EvalResult_getAsDouble =>
           _library._clang_EvalResult_getAsDoublePtr;
-  ffi.Pointer<ffi.NativeFunction<Native_clang_EvalResult_getAsStr>>
+  ffi.Pointer<ffi.NativeFunction<NativeClang_EvalResult_getAsStr>>
       get clang_EvalResult_getAsStr => _library._clang_EvalResult_getAsStrPtr;
-  ffi.Pointer<ffi.NativeFunction<Native_clang_EvalResult_dispose>>
+  ffi.Pointer<ffi.NativeFunction<NativeClang_EvalResult_dispose>>
       get clang_EvalResult_dispose => _library._clang_EvalResult_disposePtr;
-  ffi.Pointer<ffi.NativeFunction<Native_clang_getRemappings>>
+  ffi.Pointer<ffi.NativeFunction<NativeClang_getRemappings>>
       get clang_getRemappings => _library._clang_getRemappingsPtr;
-  ffi.Pointer<ffi.NativeFunction<Native_clang_getRemappingsFromFileList>>
+  ffi.Pointer<ffi.NativeFunction<NativeClang_getRemappingsFromFileList>>
       get clang_getRemappingsFromFileList =>
           _library._clang_getRemappingsFromFileListPtr;
-  ffi.Pointer<ffi.NativeFunction<Native_clang_remap_getNumFiles>>
+  ffi.Pointer<ffi.NativeFunction<NativeClang_remap_getNumFiles>>
       get clang_remap_getNumFiles => _library._clang_remap_getNumFilesPtr;
-  ffi.Pointer<ffi.NativeFunction<Native_clang_remap_getFilenames>>
+  ffi.Pointer<ffi.NativeFunction<NativeClang_remap_getFilenames>>
       get clang_remap_getFilenames => _library._clang_remap_getFilenamesPtr;
-  ffi.Pointer<ffi.NativeFunction<Native_clang_remap_dispose>>
+  ffi.Pointer<ffi.NativeFunction<NativeClang_remap_dispose>>
       get clang_remap_dispose => _library._clang_remap_disposePtr;
-  ffi.Pointer<ffi.NativeFunction<Native_clang_findReferencesInFile>>
+  ffi.Pointer<ffi.NativeFunction<NativeClang_findReferencesInFile>>
       get clang_findReferencesInFile => _library._clang_findReferencesInFilePtr;
-  ffi.Pointer<ffi.NativeFunction<Native_clang_findIncludesInFile>>
+  ffi.Pointer<ffi.NativeFunction<NativeClang_findIncludesInFile>>
       get clang_findIncludesInFile => _library._clang_findIncludesInFilePtr;
-  ffi.Pointer<ffi.NativeFunction<Native_clang_index_isEntityObjCContainerKind>>
+  ffi.Pointer<ffi.NativeFunction<NativeClang_index_isEntityObjCContainerKind>>
       get clang_index_isEntityObjCContainerKind =>
           _library._clang_index_isEntityObjCContainerKindPtr;
-  ffi.Pointer<ffi.NativeFunction<Native_clang_index_getObjCContainerDeclInfo>>
+  ffi.Pointer<ffi.NativeFunction<NativeClang_index_getObjCContainerDeclInfo>>
       get clang_index_getObjCContainerDeclInfo =>
           _library._clang_index_getObjCContainerDeclInfoPtr;
-  ffi.Pointer<ffi.NativeFunction<Native_clang_index_getObjCInterfaceDeclInfo>>
+  ffi.Pointer<ffi.NativeFunction<NativeClang_index_getObjCInterfaceDeclInfo>>
       get clang_index_getObjCInterfaceDeclInfo =>
           _library._clang_index_getObjCInterfaceDeclInfoPtr;
-  ffi.Pointer<ffi.NativeFunction<Native_clang_index_getObjCCategoryDeclInfo>>
+  ffi.Pointer<ffi.NativeFunction<NativeClang_index_getObjCCategoryDeclInfo>>
       get clang_index_getObjCCategoryDeclInfo =>
           _library._clang_index_getObjCCategoryDeclInfoPtr;
-  ffi.Pointer<ffi.NativeFunction<Native_clang_index_getObjCProtocolRefListInfo>>
+  ffi.Pointer<ffi.NativeFunction<NativeClang_index_getObjCProtocolRefListInfo>>
       get clang_index_getObjCProtocolRefListInfo =>
           _library._clang_index_getObjCProtocolRefListInfoPtr;
-  ffi.Pointer<ffi.NativeFunction<Native_clang_index_getObjCPropertyDeclInfo>>
+  ffi.Pointer<ffi.NativeFunction<NativeClang_index_getObjCPropertyDeclInfo>>
       get clang_index_getObjCPropertyDeclInfo =>
           _library._clang_index_getObjCPropertyDeclInfoPtr;
   ffi.Pointer<
-          ffi.NativeFunction<Native_clang_index_getIBOutletCollectionAttrInfo>>
+          ffi.NativeFunction<NativeClang_index_getIBOutletCollectionAttrInfo>>
       get clang_index_getIBOutletCollectionAttrInfo =>
           _library._clang_index_getIBOutletCollectionAttrInfoPtr;
-  ffi.Pointer<ffi.NativeFunction<Native_clang_index_getCXXClassDeclInfo>>
+  ffi.Pointer<ffi.NativeFunction<NativeClang_index_getCXXClassDeclInfo>>
       get clang_index_getCXXClassDeclInfo =>
           _library._clang_index_getCXXClassDeclInfoPtr;
-  ffi.Pointer<ffi.NativeFunction<Native_clang_index_getClientContainer>>
+  ffi.Pointer<ffi.NativeFunction<NativeClang_index_getClientContainer>>
       get clang_index_getClientContainer =>
           _library._clang_index_getClientContainerPtr;
-  ffi.Pointer<ffi.NativeFunction<Native_clang_index_setClientContainer>>
+  ffi.Pointer<ffi.NativeFunction<NativeClang_index_setClientContainer>>
       get clang_index_setClientContainer =>
           _library._clang_index_setClientContainerPtr;
-  ffi.Pointer<ffi.NativeFunction<Native_clang_index_getClientEntity>>
+  ffi.Pointer<ffi.NativeFunction<NativeClang_index_getClientEntity>>
       get clang_index_getClientEntity =>
           _library._clang_index_getClientEntityPtr;
-  ffi.Pointer<ffi.NativeFunction<Native_clang_index_setClientEntity>>
+  ffi.Pointer<ffi.NativeFunction<NativeClang_index_setClientEntity>>
       get clang_index_setClientEntity =>
           _library._clang_index_setClientEntityPtr;
-  ffi.Pointer<ffi.NativeFunction<Native_clang_IndexAction_create>>
+  ffi.Pointer<ffi.NativeFunction<NativeClang_IndexAction_create>>
       get clang_IndexAction_create => _library._clang_IndexAction_createPtr;
-  ffi.Pointer<ffi.NativeFunction<Native_clang_IndexAction_dispose>>
+  ffi.Pointer<ffi.NativeFunction<NativeClang_IndexAction_dispose>>
       get clang_IndexAction_dispose => _library._clang_IndexAction_disposePtr;
-  ffi.Pointer<ffi.NativeFunction<Native_clang_indexSourceFile>>
+  ffi.Pointer<ffi.NativeFunction<NativeClang_indexSourceFile>>
       get clang_indexSourceFile => _library._clang_indexSourceFilePtr;
-  ffi.Pointer<ffi.NativeFunction<Native_clang_indexSourceFileFullArgv>>
+  ffi.Pointer<ffi.NativeFunction<NativeClang_indexSourceFileFullArgv>>
       get clang_indexSourceFileFullArgv =>
           _library._clang_indexSourceFileFullArgvPtr;
-  ffi.Pointer<ffi.NativeFunction<Native_clang_indexTranslationUnit>>
+  ffi.Pointer<ffi.NativeFunction<NativeClang_indexTranslationUnit>>
       get clang_indexTranslationUnit => _library._clang_indexTranslationUnitPtr;
-  ffi.Pointer<ffi.NativeFunction<Native_clang_indexLoc_getFileLocation>>
+  ffi.Pointer<ffi.NativeFunction<NativeClang_indexLoc_getFileLocation>>
       get clang_indexLoc_getFileLocation =>
           _library._clang_indexLoc_getFileLocationPtr;
-  ffi.Pointer<ffi.NativeFunction<Native_clang_indexLoc_getCXSourceLocation>>
+  ffi.Pointer<ffi.NativeFunction<NativeClang_indexLoc_getCXSourceLocation>>
       get clang_indexLoc_getCXSourceLocation =>
           _library._clang_indexLoc_getCXSourceLocationPtr;
-  ffi.Pointer<ffi.NativeFunction<Native_clang_Type_visitFields>>
+  ffi.Pointer<ffi.NativeFunction<NativeClang_Type_visitFields>>
       get clang_Type_visitFields => _library._clang_Type_visitFieldsPtr;
 }
 
@@ -7801,10 +7659,14 @@
   external int Count;
 }
 
-typedef Native_clang_getCString = ffi.Pointer<ffi.Int8> Function(
+typedef NativeClang_getCString = ffi.Pointer<ffi.Int8> Function(
     CXString string);
-typedef Native_clang_disposeString = ffi.Void Function(CXString string);
-typedef Native_clang_disposeStringSet = ffi.Void Function(
+typedef DartClang_getCString = ffi.Pointer<ffi.Int8> Function(CXString string);
+typedef NativeClang_disposeString = ffi.Void Function(CXString string);
+typedef DartClang_disposeString = void Function(CXString string);
+typedef NativeClang_disposeStringSet = ffi.Void Function(
+    ffi.Pointer<CXStringSet> set1);
+typedef DartClang_disposeStringSet = void Function(
     ffi.Pointer<CXStringSet> set1);
 
 class CXTargetInfoImpl extends ffi.Opaque {}
@@ -7850,13 +7712,15 @@
   external int Subminor;
 }
 
-typedef Native_clang_createIndex = CXIndex Function(
-    ffi.Int32 excludeDeclarationsFromPCH, ffi.Int32 displayDiagnostics);
-
 /// An "index" that consists of a set of translation units that would
 /// typically be linked together into an executable or library.
 typedef CXIndex = ffi.Pointer<ffi.Void>;
-typedef Native_clang_disposeIndex = ffi.Void Function(CXIndex index);
+typedef NativeClang_createIndex = CXIndex Function(
+    ffi.Int32 excludeDeclarationsFromPCH, ffi.Int32 displayDiagnostics);
+typedef DartClang_createIndex = CXIndex Function(
+    int excludeDeclarationsFromPCH, int displayDiagnostics);
+typedef NativeClang_disposeIndex = ffi.Void Function(CXIndex index);
+typedef DartClang_disposeIndex = void Function(CXIndex index);
 
 abstract class CXGlobalOptFlags {
   /// Used to indicate that no special CXIndex options are needed.
@@ -7881,17 +7745,24 @@
   static const int CXGlobalOpt_ThreadBackgroundPriorityForAll = 3;
 }
 
-typedef Native_clang_CXIndex_setGlobalOptions = ffi.Void Function(
+typedef NativeClang_CXIndex_setGlobalOptions = ffi.Void Function(
     CXIndex arg0, ffi.Uint32 options);
-typedef Native_clang_CXIndex_getGlobalOptions = ffi.Uint32 Function(
+typedef DartClang_CXIndex_setGlobalOptions = void Function(
+    CXIndex arg0, int options);
+typedef NativeClang_CXIndex_getGlobalOptions = ffi.Uint32 Function(
     CXIndex arg0);
-typedef Native_clang_CXIndex_setInvocationEmissionPathOption = ffi.Void
-    Function(CXIndex arg0, ffi.Pointer<ffi.Int8> Path);
-typedef Native_clang_getFileName = CXString Function(CXFile SFile);
+typedef DartClang_CXIndex_getGlobalOptions = int Function(CXIndex arg0);
+typedef NativeClang_CXIndex_setInvocationEmissionPathOption = ffi.Void Function(
+    CXIndex arg0, ffi.Pointer<ffi.Int8> Path);
+typedef DartClang_CXIndex_setInvocationEmissionPathOption = void Function(
+    CXIndex arg0, ffi.Pointer<ffi.Int8> Path);
 
 /// A particular source file that is part of a translation unit.
 typedef CXFile = ffi.Pointer<ffi.Void>;
-typedef Native_clang_getFileTime = ffi.Int64 Function(CXFile SFile);
+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);
 
 /// Uniquely identifies a CXFile, that refers to the same underlying file,
 /// across an indexing session.
@@ -7900,20 +7771,30 @@
   external ffi.Array<ffi.Uint64> data;
 }
 
-typedef Native_clang_getFileUniqueID = ffi.Int32 Function(
+typedef NativeClang_getFileUniqueID = ffi.Int32 Function(
     CXFile file, ffi.Pointer<CXFileUniqueID> outID);
-typedef Native_clang_isFileMultipleIncludeGuarded = ffi.Uint32 Function(
-    CXTranslationUnit tu, CXFile file);
+typedef DartClang_getFileUniqueID = int Function(
+    CXFile file, ffi.Pointer<CXFileUniqueID> outID);
 
 /// A single translation unit, which resides in an index.
 typedef CXTranslationUnit = ffi.Pointer<CXTranslationUnitImpl>;
-typedef Native_clang_getFile = CXFile Function(
+typedef NativeClang_isFileMultipleIncludeGuarded = ffi.Uint32 Function(
+    CXTranslationUnit tu, CXFile file);
+typedef DartClang_isFileMultipleIncludeGuarded = int Function(
+    CXTranslationUnit tu, CXFile file);
+typedef NativeClang_getFile = CXFile Function(
     CXTranslationUnit tu, ffi.Pointer<ffi.Int8> file_name);
-typedef Native_clang_getFileContents = ffi.Pointer<ffi.Int8> Function(
+typedef DartClang_getFile = CXFile Function(
+    CXTranslationUnit tu, ffi.Pointer<ffi.Int8> file_name);
+typedef NativeClang_getFileContents = ffi.Pointer<ffi.Int8> Function(
     CXTranslationUnit tu, CXFile file, ffi.Pointer<ffi.IntPtr> size);
-typedef Native_clang_File_isEqual = ffi.Int32 Function(
+typedef DartClang_getFileContents = ffi.Pointer<ffi.Int8> Function(
+    CXTranslationUnit tu, CXFile file, ffi.Pointer<ffi.IntPtr> size);
+typedef NativeClang_File_isEqual = ffi.Int32 Function(
     CXFile file1, CXFile file2);
-typedef Native_clang_File_tryGetRealPathName = CXString Function(CXFile file);
+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);
 
 /// Identifies a specific source location within a translation
 /// unit.
@@ -7943,56 +7824,105 @@
   external int end_int_data;
 }
 
-typedef Native_clang_getNullLocation = CXSourceLocation Function();
-typedef Native_clang_equalLocations = ffi.Uint32 Function(
+typedef NativeClang_getNullLocation = CXSourceLocation Function();
+typedef DartClang_getNullLocation = CXSourceLocation Function();
+typedef NativeClang_equalLocations = ffi.Uint32 Function(
     CXSourceLocation loc1, CXSourceLocation loc2);
-typedef Native_clang_getLocation = CXSourceLocation Function(
+typedef DartClang_equalLocations = int Function(
+    CXSourceLocation loc1, CXSourceLocation loc2);
+typedef NativeClang_getLocation = CXSourceLocation Function(
     CXTranslationUnit tu, CXFile file, ffi.Uint32 line, ffi.Uint32 column);
-typedef Native_clang_getLocationForOffset = CXSourceLocation Function(
+typedef DartClang_getLocation = CXSourceLocation Function(
+    CXTranslationUnit tu, CXFile file, int line, int column);
+typedef NativeClang_getLocationForOffset = CXSourceLocation Function(
     CXTranslationUnit tu, CXFile file, ffi.Uint32 offset);
-typedef Native_clang_Location_isInSystemHeader = ffi.Int32 Function(
+typedef DartClang_getLocationForOffset = CXSourceLocation Function(
+    CXTranslationUnit tu, CXFile file, int offset);
+typedef NativeClang_Location_isInSystemHeader = ffi.Int32 Function(
     CXSourceLocation location);
-typedef Native_clang_Location_isFromMainFile = ffi.Int32 Function(
+typedef DartClang_Location_isInSystemHeader = int Function(
     CXSourceLocation location);
-typedef Native_clang_getNullRange = CXSourceRange Function();
-typedef Native_clang_getRange = CXSourceRange Function(
+typedef NativeClang_Location_isFromMainFile = ffi.Int32 Function(
+    CXSourceLocation location);
+typedef DartClang_Location_isFromMainFile = int Function(
+    CXSourceLocation location);
+typedef NativeClang_getNullRange = CXSourceRange Function();
+typedef DartClang_getNullRange = CXSourceRange Function();
+typedef NativeClang_getRange = CXSourceRange Function(
     CXSourceLocation begin, CXSourceLocation end);
-typedef Native_clang_equalRanges = ffi.Uint32 Function(
+typedef DartClang_getRange = CXSourceRange Function(
+    CXSourceLocation begin, CXSourceLocation end);
+typedef NativeClang_equalRanges = ffi.Uint32 Function(
     CXSourceRange range1, CXSourceRange range2);
-typedef Native_clang_Range_isNull = ffi.Int32 Function(CXSourceRange range);
-typedef Native_clang_getExpansionLocation = ffi.Void Function(
+typedef DartClang_equalRanges = int Function(
+    CXSourceRange range1, CXSourceRange range2);
+typedef NativeClang_Range_isNull = ffi.Int32 Function(CXSourceRange range);
+typedef DartClang_Range_isNull = int Function(CXSourceRange range);
+typedef NativeClang_getExpansionLocation = ffi.Void Function(
     CXSourceLocation location,
     ffi.Pointer<CXFile> file,
     ffi.Pointer<ffi.Uint32> line,
     ffi.Pointer<ffi.Uint32> column,
     ffi.Pointer<ffi.Uint32> offset);
-typedef Native_clang_getPresumedLocation = ffi.Void Function(
+typedef DartClang_getExpansionLocation = void Function(
+    CXSourceLocation location,
+    ffi.Pointer<CXFile> file,
+    ffi.Pointer<ffi.Uint32> line,
+    ffi.Pointer<ffi.Uint32> column,
+    ffi.Pointer<ffi.Uint32> offset);
+typedef NativeClang_getPresumedLocation = ffi.Void Function(
     CXSourceLocation location,
     ffi.Pointer<CXString> filename,
     ffi.Pointer<ffi.Uint32> line,
     ffi.Pointer<ffi.Uint32> column);
-typedef Native_clang_getInstantiationLocation = ffi.Void Function(
+typedef DartClang_getPresumedLocation = void Function(
+    CXSourceLocation location,
+    ffi.Pointer<CXString> filename,
+    ffi.Pointer<ffi.Uint32> line,
+    ffi.Pointer<ffi.Uint32> column);
+typedef NativeClang_getInstantiationLocation = ffi.Void Function(
     CXSourceLocation location,
     ffi.Pointer<CXFile> file,
     ffi.Pointer<ffi.Uint32> line,
     ffi.Pointer<ffi.Uint32> column,
     ffi.Pointer<ffi.Uint32> offset);
-typedef Native_clang_getSpellingLocation = ffi.Void Function(
+typedef DartClang_getInstantiationLocation = void Function(
     CXSourceLocation location,
     ffi.Pointer<CXFile> file,
     ffi.Pointer<ffi.Uint32> line,
     ffi.Pointer<ffi.Uint32> column,
     ffi.Pointer<ffi.Uint32> offset);
-typedef Native_clang_getFileLocation = ffi.Void Function(
+typedef NativeClang_getSpellingLocation = ffi.Void Function(
     CXSourceLocation location,
     ffi.Pointer<CXFile> file,
     ffi.Pointer<ffi.Uint32> line,
     ffi.Pointer<ffi.Uint32> column,
     ffi.Pointer<ffi.Uint32> offset);
-typedef Native_clang_getRangeStart = CXSourceLocation Function(
+typedef DartClang_getSpellingLocation = void Function(
+    CXSourceLocation location,
+    ffi.Pointer<CXFile> file,
+    ffi.Pointer<ffi.Uint32> line,
+    ffi.Pointer<ffi.Uint32> column,
+    ffi.Pointer<ffi.Uint32> offset);
+typedef NativeClang_getFileLocation = ffi.Void Function(
+    CXSourceLocation location,
+    ffi.Pointer<CXFile> file,
+    ffi.Pointer<ffi.Uint32> line,
+    ffi.Pointer<ffi.Uint32> column,
+    ffi.Pointer<ffi.Uint32> offset);
+typedef DartClang_getFileLocation = void Function(
+    CXSourceLocation location,
+    ffi.Pointer<CXFile> file,
+    ffi.Pointer<ffi.Uint32> line,
+    ffi.Pointer<ffi.Uint32> column,
+    ffi.Pointer<ffi.Uint32> offset);
+typedef NativeClang_getRangeStart = CXSourceLocation Function(
     CXSourceRange range);
-typedef Native_clang_getRangeEnd = CXSourceLocation Function(
+typedef DartClang_getRangeStart = CXSourceLocation Function(
     CXSourceRange range);
+typedef NativeClang_getRangeEnd = CXSourceLocation Function(
+    CXSourceRange range);
+typedef DartClang_getRangeEnd = CXSourceLocation Function(CXSourceRange range);
 
 /// Identifies an array of ranges.
 class CXSourceRangeList extends ffi.Struct {
@@ -8004,27 +7934,32 @@
   external ffi.Pointer<CXSourceRange> ranges;
 }
 
-typedef Native_clang_getSkippedRanges = ffi.Pointer<CXSourceRangeList> Function(
+typedef NativeClang_getSkippedRanges = ffi.Pointer<CXSourceRangeList> Function(
     CXTranslationUnit tu, CXFile file);
-typedef Native_clang_getAllSkippedRanges = ffi.Pointer<CXSourceRangeList>
+typedef DartClang_getSkippedRanges = ffi.Pointer<CXSourceRangeList> Function(
+    CXTranslationUnit tu, CXFile file);
+typedef NativeClang_getAllSkippedRanges = ffi.Pointer<CXSourceRangeList>
     Function(CXTranslationUnit tu);
-typedef Native_clang_disposeSourceRangeList = ffi.Void Function(
+typedef DartClang_getAllSkippedRanges = ffi.Pointer<CXSourceRangeList> Function(
+    CXTranslationUnit tu);
+typedef NativeClang_disposeSourceRangeList = ffi.Void Function(
     ffi.Pointer<CXSourceRangeList> ranges);
-typedef Native_clang_getNumDiagnosticsInSet = ffi.Uint32 Function(
-    CXDiagnosticSet Diags);
+typedef DartClang_disposeSourceRangeList = void Function(
+    ffi.Pointer<CXSourceRangeList> ranges);
 
 /// A group of CXDiagnostics.
 typedef CXDiagnosticSet = ffi.Pointer<ffi.Void>;
-typedef Native_clang_getDiagnosticInSet = CXDiagnostic Function(
-    CXDiagnosticSet Diags, ffi.Uint32 Index);
+typedef NativeClang_getNumDiagnosticsInSet = ffi.Uint32 Function(
+    CXDiagnosticSet Diags);
+typedef DartClang_getNumDiagnosticsInSet = int Function(CXDiagnosticSet Diags);
 
 /// A single diagnostic, containing the diagnostic's severity,
 /// location, text, source ranges, and fix-it hints.
 typedef CXDiagnostic = ffi.Pointer<ffi.Void>;
-typedef Native_clang_loadDiagnostics = CXDiagnosticSet Function(
-    ffi.Pointer<ffi.Int8> file,
-    ffi.Pointer<ffi.Int32> error,
-    ffi.Pointer<CXString> errorString);
+typedef NativeClang_getDiagnosticInSet = CXDiagnostic Function(
+    CXDiagnosticSet Diags, ffi.Uint32 Index);
+typedef DartClang_getDiagnosticInSet = CXDiagnostic Function(
+    CXDiagnosticSet Diags, int Index);
 
 /// Describes the kind of error that occurred (if any) in a call to
 /// \c clang_loadDiagnostics.
@@ -8045,23 +7980,41 @@
   static const int CXLoadDiag_InvalidFile = 3;
 }
 
-typedef Native_clang_disposeDiagnosticSet = ffi.Void Function(
+typedef NativeClang_loadDiagnostics = CXDiagnosticSet Function(
+    ffi.Pointer<ffi.Int8> file,
+    ffi.Pointer<ffi.Int32> error,
+    ffi.Pointer<CXString> errorString);
+typedef DartClang_loadDiagnostics = CXDiagnosticSet Function(
+    ffi.Pointer<ffi.Int8> file,
+    ffi.Pointer<ffi.Int32> error,
+    ffi.Pointer<CXString> errorString);
+typedef NativeClang_disposeDiagnosticSet = ffi.Void Function(
     CXDiagnosticSet Diags);
-typedef Native_clang_getChildDiagnostics = CXDiagnosticSet Function(
+typedef DartClang_disposeDiagnosticSet = void Function(CXDiagnosticSet Diags);
+typedef NativeClang_getChildDiagnostics = CXDiagnosticSet Function(
     CXDiagnostic D);
-typedef Native_clang_getNumDiagnostics = ffi.Uint32 Function(
+typedef DartClang_getChildDiagnostics = CXDiagnosticSet Function(
+    CXDiagnostic D);
+typedef NativeClang_getNumDiagnostics = ffi.Uint32 Function(
     CXTranslationUnit Unit);
-typedef Native_clang_getDiagnostic = CXDiagnostic Function(
+typedef DartClang_getNumDiagnostics = int Function(CXTranslationUnit Unit);
+typedef NativeClang_getDiagnostic = CXDiagnostic Function(
     CXTranslationUnit Unit, ffi.Uint32 Index);
-typedef Native_clang_getDiagnosticSetFromTU = CXDiagnosticSet Function(
+typedef DartClang_getDiagnostic = CXDiagnostic Function(
+    CXTranslationUnit Unit, int Index);
+typedef NativeClang_getDiagnosticSetFromTU = CXDiagnosticSet Function(
     CXTranslationUnit Unit);
-typedef Native_clang_disposeDiagnostic = ffi.Void Function(
+typedef DartClang_getDiagnosticSetFromTU = CXDiagnosticSet Function(
+    CXTranslationUnit Unit);
+typedef NativeClang_disposeDiagnostic = ffi.Void Function(
     CXDiagnostic Diagnostic);
-typedef Native_clang_formatDiagnostic = CXString Function(
+typedef DartClang_disposeDiagnostic = void Function(CXDiagnostic Diagnostic);
+typedef NativeClang_formatDiagnostic = CXString Function(
     CXDiagnostic Diagnostic, ffi.Uint32 Options);
-typedef Native_clang_defaultDiagnosticDisplayOptions = ffi.Uint32 Function();
-typedef Native_clang_getDiagnosticSeverity = ffi.Int32 Function(
-    CXDiagnostic arg0);
+typedef DartClang_formatDiagnostic = CXString Function(
+    CXDiagnostic Diagnostic, int Options);
+typedef NativeClang_defaultDiagnosticDisplayOptions = ffi.Uint32 Function();
+typedef DartClang_defaultDiagnosticDisplayOptions = int Function();
 
 /// Describes the severity of a particular diagnostic.
 abstract class CXDiagnosticSeverity {
@@ -8086,31 +8039,54 @@
   static const int CXDiagnostic_Fatal = 4;
 }
 
-typedef Native_clang_getDiagnosticLocation = CXSourceLocation Function(
+typedef NativeClang_getDiagnosticSeverity = ffi.Int32 Function(
     CXDiagnostic arg0);
-typedef Native_clang_getDiagnosticSpelling = CXString Function(
+typedef DartClang_getDiagnosticSeverity = int Function(CXDiagnostic arg0);
+typedef NativeClang_getDiagnosticLocation = CXSourceLocation Function(
     CXDiagnostic arg0);
-typedef Native_clang_getDiagnosticOption = CXString Function(
+typedef DartClang_getDiagnosticLocation = CXSourceLocation Function(
+    CXDiagnostic arg0);
+typedef NativeClang_getDiagnosticSpelling = CXString Function(
+    CXDiagnostic arg0);
+typedef DartClang_getDiagnosticSpelling = CXString Function(CXDiagnostic arg0);
+typedef NativeClang_getDiagnosticOption = CXString Function(
     CXDiagnostic Diag, ffi.Pointer<CXString> Disable);
-typedef Native_clang_getDiagnosticCategory = ffi.Uint32 Function(
+typedef DartClang_getDiagnosticOption = CXString Function(
+    CXDiagnostic Diag, ffi.Pointer<CXString> Disable);
+typedef NativeClang_getDiagnosticCategory = ffi.Uint32 Function(
     CXDiagnostic arg0);
-typedef Native_clang_getDiagnosticCategoryName = CXString Function(
+typedef DartClang_getDiagnosticCategory = int Function(CXDiagnostic arg0);
+typedef NativeClang_getDiagnosticCategoryName = CXString Function(
     ffi.Uint32 Category);
-typedef Native_clang_getDiagnosticCategoryText = CXString Function(
+typedef DartClang_getDiagnosticCategoryName = CXString Function(int Category);
+typedef NativeClang_getDiagnosticCategoryText = CXString Function(
     CXDiagnostic arg0);
-typedef Native_clang_getDiagnosticNumRanges = ffi.Uint32 Function(
+typedef DartClang_getDiagnosticCategoryText = CXString Function(
     CXDiagnostic arg0);
-typedef Native_clang_getDiagnosticRange = CXSourceRange Function(
+typedef NativeClang_getDiagnosticNumRanges = ffi.Uint32 Function(
+    CXDiagnostic arg0);
+typedef DartClang_getDiagnosticNumRanges = int Function(CXDiagnostic arg0);
+typedef NativeClang_getDiagnosticRange = CXSourceRange Function(
     CXDiagnostic Diagnostic, ffi.Uint32 Range);
-typedef Native_clang_getDiagnosticNumFixIts = ffi.Uint32 Function(
+typedef DartClang_getDiagnosticRange = CXSourceRange Function(
+    CXDiagnostic Diagnostic, int Range);
+typedef NativeClang_getDiagnosticNumFixIts = ffi.Uint32 Function(
     CXDiagnostic Diagnostic);
-typedef Native_clang_getDiagnosticFixIt = CXString Function(
+typedef DartClang_getDiagnosticNumFixIts = int Function(
+    CXDiagnostic Diagnostic);
+typedef NativeClang_getDiagnosticFixIt = CXString Function(
     CXDiagnostic Diagnostic,
     ffi.Uint32 FixIt,
     ffi.Pointer<CXSourceRange> ReplacementRange);
-typedef Native_clang_getTranslationUnitSpelling = CXString Function(
+typedef DartClang_getDiagnosticFixIt = CXString Function(
+    CXDiagnostic Diagnostic,
+    int FixIt,
+    ffi.Pointer<CXSourceRange> ReplacementRange);
+typedef NativeClang_getTranslationUnitSpelling = CXString Function(
     CXTranslationUnit CTUnit);
-typedef Native_clang_createTranslationUnitFromSourceFile
+typedef DartClang_getTranslationUnitSpelling = CXString Function(
+    CXTranslationUnit CTUnit);
+typedef NativeClang_createTranslationUnitFromSourceFile
     = CXTranslationUnit Function(
         CXIndex CIdx,
         ffi.Pointer<ffi.Int8> source_filename,
@@ -8118,10 +8094,18 @@
         ffi.Pointer<ffi.Pointer<ffi.Int8>> clang_command_line_args,
         ffi.Uint32 num_unsaved_files,
         ffi.Pointer<CXUnsavedFile> unsaved_files);
-typedef Native_clang_createTranslationUnit = CXTranslationUnit Function(
+typedef DartClang_createTranslationUnitFromSourceFile
+    = CXTranslationUnit Function(
+        CXIndex CIdx,
+        ffi.Pointer<ffi.Int8> source_filename,
+        int num_clang_command_line_args,
+        ffi.Pointer<ffi.Pointer<ffi.Int8>> clang_command_line_args,
+        int num_unsaved_files,
+        ffi.Pointer<CXUnsavedFile> unsaved_files);
+typedef NativeClang_createTranslationUnit = CXTranslationUnit Function(
     CXIndex CIdx, ffi.Pointer<ffi.Int8> ast_filename);
-typedef Native_clang_createTranslationUnit2 = ffi.Int32 Function(CXIndex CIdx,
-    ffi.Pointer<ffi.Int8> ast_filename, ffi.Pointer<CXTranslationUnit> out_TU);
+typedef DartClang_createTranslationUnit = CXTranslationUnit Function(
+    CXIndex CIdx, ffi.Pointer<ffi.Int8> ast_filename);
 
 /// Error codes returned by libclang routines.
 ///
@@ -8148,9 +8132,14 @@
   static const int CXError_ASTReadError = 4;
 }
 
-typedef Native_clang_defaultEditingTranslationUnitOptions = ffi.Uint32
+typedef NativeClang_createTranslationUnit2 = ffi.Int32 Function(CXIndex CIdx,
+    ffi.Pointer<ffi.Int8> ast_filename, ffi.Pointer<CXTranslationUnit> out_TU);
+typedef DartClang_createTranslationUnit2 = int Function(CXIndex CIdx,
+    ffi.Pointer<ffi.Int8> ast_filename, ffi.Pointer<CXTranslationUnit> out_TU);
+typedef NativeClang_defaultEditingTranslationUnitOptions = ffi.Uint32
     Function();
-typedef Native_clang_parseTranslationUnit = CXTranslationUnit Function(
+typedef DartClang_defaultEditingTranslationUnitOptions = int Function();
+typedef NativeClang_parseTranslationUnit = CXTranslationUnit Function(
     CXIndex CIdx,
     ffi.Pointer<ffi.Int8> source_filename,
     ffi.Pointer<ffi.Pointer<ffi.Int8>> command_line_args,
@@ -8158,7 +8147,15 @@
     ffi.Pointer<CXUnsavedFile> unsaved_files,
     ffi.Uint32 num_unsaved_files,
     ffi.Uint32 options);
-typedef Native_clang_parseTranslationUnit2 = ffi.Int32 Function(
+typedef DartClang_parseTranslationUnit = CXTranslationUnit Function(
+    CXIndex CIdx,
+    ffi.Pointer<ffi.Int8> source_filename,
+    ffi.Pointer<ffi.Pointer<ffi.Int8>> command_line_args,
+    int num_command_line_args,
+    ffi.Pointer<CXUnsavedFile> unsaved_files,
+    int num_unsaved_files,
+    int options);
+typedef NativeClang_parseTranslationUnit2 = ffi.Int32 Function(
     CXIndex CIdx,
     ffi.Pointer<ffi.Int8> source_filename,
     ffi.Pointer<ffi.Pointer<ffi.Int8>> command_line_args,
@@ -8167,7 +8164,16 @@
     ffi.Uint32 num_unsaved_files,
     ffi.Uint32 options,
     ffi.Pointer<CXTranslationUnit> out_TU);
-typedef Native_clang_parseTranslationUnit2FullArgv = ffi.Int32 Function(
+typedef DartClang_parseTranslationUnit2 = int Function(
+    CXIndex CIdx,
+    ffi.Pointer<ffi.Int8> source_filename,
+    ffi.Pointer<ffi.Pointer<ffi.Int8>> command_line_args,
+    int num_command_line_args,
+    ffi.Pointer<CXUnsavedFile> unsaved_files,
+    int num_unsaved_files,
+    int options,
+    ffi.Pointer<CXTranslationUnit> out_TU);
+typedef NativeClang_parseTranslationUnit2FullArgv = ffi.Int32 Function(
     CXIndex CIdx,
     ffi.Pointer<ffi.Int8> source_filename,
     ffi.Pointer<ffi.Pointer<ffi.Int8>> command_line_args,
@@ -8176,23 +8182,42 @@
     ffi.Uint32 num_unsaved_files,
     ffi.Uint32 options,
     ffi.Pointer<CXTranslationUnit> out_TU);
-typedef Native_clang_defaultSaveOptions = ffi.Uint32 Function(
+typedef DartClang_parseTranslationUnit2FullArgv = int Function(
+    CXIndex CIdx,
+    ffi.Pointer<ffi.Int8> source_filename,
+    ffi.Pointer<ffi.Pointer<ffi.Int8>> command_line_args,
+    int num_command_line_args,
+    ffi.Pointer<CXUnsavedFile> unsaved_files,
+    int num_unsaved_files,
+    int options,
+    ffi.Pointer<CXTranslationUnit> out_TU);
+typedef NativeClang_defaultSaveOptions = ffi.Uint32 Function(
     CXTranslationUnit TU);
-typedef Native_clang_saveTranslationUnit = ffi.Int32 Function(
+typedef DartClang_defaultSaveOptions = int Function(CXTranslationUnit TU);
+typedef NativeClang_saveTranslationUnit = ffi.Int32 Function(
     CXTranslationUnit TU, ffi.Pointer<ffi.Int8> FileName, ffi.Uint32 options);
-typedef Native_clang_suspendTranslationUnit = ffi.Uint32 Function(
+typedef DartClang_saveTranslationUnit = int Function(
+    CXTranslationUnit TU, ffi.Pointer<ffi.Int8> FileName, int options);
+typedef NativeClang_suspendTranslationUnit = ffi.Uint32 Function(
     CXTranslationUnit arg0);
-typedef Native_clang_disposeTranslationUnit = ffi.Void Function(
+typedef DartClang_suspendTranslationUnit = int Function(CXTranslationUnit arg0);
+typedef NativeClang_disposeTranslationUnit = ffi.Void Function(
     CXTranslationUnit arg0);
-typedef Native_clang_defaultReparseOptions = ffi.Uint32 Function(
+typedef DartClang_disposeTranslationUnit = void Function(
+    CXTranslationUnit arg0);
+typedef NativeClang_defaultReparseOptions = ffi.Uint32 Function(
     CXTranslationUnit TU);
-typedef Native_clang_reparseTranslationUnit = ffi.Int32 Function(
+typedef DartClang_defaultReparseOptions = int Function(CXTranslationUnit TU);
+typedef NativeClang_reparseTranslationUnit = ffi.Int32 Function(
     CXTranslationUnit TU,
     ffi.Uint32 num_unsaved_files,
     ffi.Pointer<CXUnsavedFile> unsaved_files,
     ffi.Uint32 options);
-typedef Native_clang_getTUResourceUsageName = ffi.Pointer<ffi.Int8> Function(
-    ffi.Int32 kind);
+typedef DartClang_reparseTranslationUnit = int Function(
+    CXTranslationUnit TU,
+    int num_unsaved_files,
+    ffi.Pointer<CXUnsavedFile> unsaved_files,
+    int options);
 
 /// Categorizes how memory is being used by a translation unit.
 abstract class CXTUResourceUsageKind {
@@ -8216,6 +8241,11 @@
   static const int CXTUResourceUsage_Last = 14;
 }
 
+typedef NativeClang_getTUResourceUsageName = ffi.Pointer<ffi.Int8> Function(
+    ffi.Int32 kind);
+typedef DartClang_getTUResourceUsageName = ffi.Pointer<ffi.Int8> Function(
+    int kind);
+
 class CXTUResourceUsageEntry extends ffi.Struct {
   @ffi.Int32()
   external int kind;
@@ -8234,21 +8264,29 @@
   external ffi.Pointer<CXTUResourceUsageEntry> entries;
 }
 
-typedef Native_clang_getCXTUResourceUsage = CXTUResourceUsage Function(
+typedef NativeClang_getCXTUResourceUsage = CXTUResourceUsage Function(
     CXTranslationUnit TU);
-typedef Native_clang_disposeCXTUResourceUsage = ffi.Void Function(
+typedef DartClang_getCXTUResourceUsage = CXTUResourceUsage Function(
+    CXTranslationUnit TU);
+typedef NativeClang_disposeCXTUResourceUsage = ffi.Void Function(
     CXTUResourceUsage usage);
-typedef Native_clang_getTranslationUnitTargetInfo = CXTargetInfo Function(
-    CXTranslationUnit CTUnit);
+typedef DartClang_disposeCXTUResourceUsage = void Function(
+    CXTUResourceUsage usage);
 
 /// An opaque type representing target information for a given translation
 /// unit.
 typedef CXTargetInfo = ffi.Pointer<CXTargetInfoImpl>;
-typedef Native_clang_TargetInfo_dispose = ffi.Void Function(CXTargetInfo Info);
-typedef Native_clang_TargetInfo_getTriple = CXString Function(
+typedef NativeClang_getTranslationUnitTargetInfo = CXTargetInfo Function(
+    CXTranslationUnit CTUnit);
+typedef DartClang_getTranslationUnitTargetInfo = CXTargetInfo Function(
+    CXTranslationUnit CTUnit);
+typedef NativeClang_TargetInfo_dispose = ffi.Void Function(CXTargetInfo Info);
+typedef DartClang_TargetInfo_dispose = void Function(CXTargetInfo Info);
+typedef NativeClang_TargetInfo_getTriple = CXString Function(CXTargetInfo Info);
+typedef DartClang_TargetInfo_getTriple = CXString Function(CXTargetInfo Info);
+typedef NativeClang_TargetInfo_getPointerWidth = ffi.Int32 Function(
     CXTargetInfo Info);
-typedef Native_clang_TargetInfo_getPointerWidth = ffi.Int32 Function(
-    CXTargetInfo Info);
+typedef DartClang_TargetInfo_getPointerWidth = int Function(CXTargetInfo Info);
 
 /// A cursor representing some element in the abstract syntax tree for
 /// a translation unit.
@@ -9063,26 +9101,43 @@
   static const int CXCursor_OverloadCandidate = 700;
 }
 
-typedef Native_clang_getNullCursor = CXCursor Function();
-typedef Native_clang_getTranslationUnitCursor = CXCursor Function(
+typedef NativeClang_getNullCursor = CXCursor Function();
+typedef DartClang_getNullCursor = CXCursor Function();
+typedef NativeClang_getTranslationUnitCursor = CXCursor Function(
     CXTranslationUnit arg0);
-typedef Native_clang_equalCursors = ffi.Uint32 Function(
+typedef DartClang_getTranslationUnitCursor = CXCursor Function(
+    CXTranslationUnit arg0);
+typedef NativeClang_equalCursors = ffi.Uint32 Function(
     CXCursor arg0, CXCursor arg1);
-typedef Native_clang_Cursor_isNull = ffi.Int32 Function(CXCursor cursor);
-typedef Native_clang_hashCursor = ffi.Uint32 Function(CXCursor arg0);
-typedef Native_clang_getCursorKind = ffi.Int32 Function(CXCursor arg0);
-typedef Native_clang_isDeclaration = ffi.Uint32 Function(ffi.Int32 arg0);
-typedef Native_clang_isInvalidDeclaration = ffi.Uint32 Function(CXCursor arg0);
-typedef Native_clang_isReference = ffi.Uint32 Function(ffi.Int32 arg0);
-typedef Native_clang_isExpression = ffi.Uint32 Function(ffi.Int32 arg0);
-typedef Native_clang_isStatement = ffi.Uint32 Function(ffi.Int32 arg0);
-typedef Native_clang_isAttribute = ffi.Uint32 Function(ffi.Int32 arg0);
-typedef Native_clang_Cursor_hasAttrs = ffi.Uint32 Function(CXCursor C);
-typedef Native_clang_isInvalid = ffi.Uint32 Function(ffi.Int32 arg0);
-typedef Native_clang_isTranslationUnit = ffi.Uint32 Function(ffi.Int32 arg0);
-typedef Native_clang_isPreprocessing = ffi.Uint32 Function(ffi.Int32 arg0);
-typedef Native_clang_isUnexposed = ffi.Uint32 Function(ffi.Int32 arg0);
-typedef Native_clang_getCursorLinkage = ffi.Int32 Function(CXCursor cursor);
+typedef DartClang_equalCursors = int Function(CXCursor arg0, CXCursor arg1);
+typedef NativeClang_Cursor_isNull = ffi.Int32 Function(CXCursor cursor);
+typedef DartClang_Cursor_isNull = int Function(CXCursor cursor);
+typedef NativeClang_hashCursor = ffi.Uint32 Function(CXCursor arg0);
+typedef DartClang_hashCursor = int Function(CXCursor arg0);
+typedef NativeClang_getCursorKind = ffi.Int32 Function(CXCursor arg0);
+typedef DartClang_getCursorKind = int Function(CXCursor arg0);
+typedef NativeClang_isDeclaration = ffi.Uint32 Function(ffi.Int32 arg0);
+typedef DartClang_isDeclaration = int Function(int arg0);
+typedef NativeClang_isInvalidDeclaration = ffi.Uint32 Function(CXCursor arg0);
+typedef DartClang_isInvalidDeclaration = int Function(CXCursor arg0);
+typedef NativeClang_isReference = ffi.Uint32 Function(ffi.Int32 arg0);
+typedef DartClang_isReference = int Function(int arg0);
+typedef NativeClang_isExpression = ffi.Uint32 Function(ffi.Int32 arg0);
+typedef DartClang_isExpression = int Function(int arg0);
+typedef NativeClang_isStatement = ffi.Uint32 Function(ffi.Int32 arg0);
+typedef DartClang_isStatement = int Function(int arg0);
+typedef NativeClang_isAttribute = ffi.Uint32 Function(ffi.Int32 arg0);
+typedef DartClang_isAttribute = int Function(int arg0);
+typedef NativeClang_Cursor_hasAttrs = ffi.Uint32 Function(CXCursor C);
+typedef DartClang_Cursor_hasAttrs = int Function(CXCursor C);
+typedef NativeClang_isInvalid = ffi.Uint32 Function(ffi.Int32 arg0);
+typedef DartClang_isInvalid = int Function(int arg0);
+typedef NativeClang_isTranslationUnit = ffi.Uint32 Function(ffi.Int32 arg0);
+typedef DartClang_isTranslationUnit = int Function(int arg0);
+typedef NativeClang_isPreprocessing = ffi.Uint32 Function(ffi.Int32 arg0);
+typedef DartClang_isPreprocessing = int Function(int arg0);
+typedef NativeClang_isUnexposed = ffi.Uint32 Function(ffi.Int32 arg0);
+typedef DartClang_isUnexposed = int Function(int arg0);
 
 /// Describe the linkage of the entity referred to by a cursor.
 abstract class CXLinkageKind {
@@ -9105,7 +9160,8 @@
   static const int CXLinkage_External = 4;
 }
 
-typedef Native_clang_getCursorVisibility = ffi.Int32 Function(CXCursor cursor);
+typedef NativeClang_getCursorLinkage = ffi.Int32 Function(CXCursor cursor);
+typedef DartClang_getCursorLinkage = int Function(CXCursor cursor);
 
 abstract class CXVisibilityKind {
   /// This value indicates that no visibility information is available
@@ -9122,8 +9178,8 @@
   static const int CXVisibility_Default = 3;
 }
 
-typedef Native_clang_getCursorAvailability = ffi.Int32 Function(
-    CXCursor cursor);
+typedef NativeClang_getCursorVisibility = ffi.Int32 Function(CXCursor cursor);
+typedef DartClang_getCursorVisibility = int Function(CXCursor cursor);
 
 /// Describes the availability of a particular entity, which indicates
 /// whether the use of this entity will result in a warning or error due to
@@ -9144,6 +9200,9 @@
   static const int CXAvailability_NotAccessible = 3;
 }
 
+typedef NativeClang_getCursorAvailability = ffi.Int32 Function(CXCursor cursor);
+typedef DartClang_getCursorAvailability = int Function(CXCursor cursor);
+
 /// Describes the availability of a given entity on a particular platform, e.g.,
 /// a particular class might only be available on Mac OS 10.7 or newer.
 class CXPlatformAvailability extends ffi.Struct {
@@ -9173,7 +9232,7 @@
   external CXString Message;
 }
 
-typedef Native_clang_getCursorPlatformAvailability = ffi.Int32 Function(
+typedef NativeClang_getCursorPlatformAvailability = ffi.Int32 Function(
     CXCursor cursor,
     ffi.Pointer<ffi.Int32> always_deprecated,
     ffi.Pointer<CXString> deprecated_message,
@@ -9181,9 +9240,18 @@
     ffi.Pointer<CXString> unavailable_message,
     ffi.Pointer<CXPlatformAvailability> availability,
     ffi.Int32 availability_size);
-typedef Native_clang_disposeCXPlatformAvailability = ffi.Void Function(
+typedef DartClang_getCursorPlatformAvailability = int Function(
+    CXCursor cursor,
+    ffi.Pointer<ffi.Int32> always_deprecated,
+    ffi.Pointer<CXString> deprecated_message,
+    ffi.Pointer<ffi.Int32> always_unavailable,
+    ffi.Pointer<CXString> unavailable_message,
+    ffi.Pointer<CXPlatformAvailability> availability,
+    int availability_size);
+typedef NativeClang_disposeCXPlatformAvailability = ffi.Void Function(
     ffi.Pointer<CXPlatformAvailability> availability);
-typedef Native_clang_getCursorLanguage = ffi.Int32 Function(CXCursor cursor);
+typedef DartClang_disposeCXPlatformAvailability = void Function(
+    ffi.Pointer<CXPlatformAvailability> availability);
 
 /// Describe the "language" of the entity referred to by a cursor.
 abstract class CXLanguageKind {
@@ -9193,7 +9261,8 @@
   static const int CXLanguage_CPlusPlus = 3;
 }
 
-typedef Native_clang_getCursorTLSKind = ffi.Int32 Function(CXCursor cursor);
+typedef NativeClang_getCursorLanguage = ffi.Int32 Function(CXCursor cursor);
+typedef DartClang_getCursorLanguage = int Function(CXCursor cursor);
 
 /// Describe the "thread-local storage (TLS) kind" of the declaration
 /// referred to by a cursor.
@@ -9203,36 +9272,57 @@
   static const int CXTLS_Static = 2;
 }
 
-typedef Native_clang_Cursor_getTranslationUnit = CXTranslationUnit Function(
+typedef NativeClang_getCursorTLSKind = ffi.Int32 Function(CXCursor cursor);
+typedef DartClang_getCursorTLSKind = int Function(CXCursor cursor);
+typedef NativeClang_Cursor_getTranslationUnit = CXTranslationUnit Function(
+    CXCursor arg0);
+typedef DartClang_Cursor_getTranslationUnit = CXTranslationUnit Function(
     CXCursor arg0);
 
 class CXCursorSetImpl extends ffi.Opaque {}
 
-typedef Native_clang_createCXCursorSet = CXCursorSet Function();
-
 /// A fast container representing a set of CXCursors.
 typedef CXCursorSet = ffi.Pointer<CXCursorSetImpl>;
-typedef Native_clang_disposeCXCursorSet = ffi.Void Function(CXCursorSet cset);
-typedef Native_clang_CXCursorSet_contains = ffi.Uint32 Function(
+typedef NativeClang_createCXCursorSet = CXCursorSet Function();
+typedef DartClang_createCXCursorSet = CXCursorSet Function();
+typedef NativeClang_disposeCXCursorSet = ffi.Void Function(CXCursorSet cset);
+typedef DartClang_disposeCXCursorSet = void Function(CXCursorSet cset);
+typedef NativeClang_CXCursorSet_contains = ffi.Uint32 Function(
     CXCursorSet cset, CXCursor cursor);
-typedef Native_clang_CXCursorSet_insert = ffi.Uint32 Function(
+typedef DartClang_CXCursorSet_contains = int Function(
     CXCursorSet cset, CXCursor cursor);
-typedef Native_clang_getCursorSemanticParent = CXCursor Function(
+typedef NativeClang_CXCursorSet_insert = ffi.Uint32 Function(
+    CXCursorSet cset, CXCursor cursor);
+typedef DartClang_CXCursorSet_insert = int Function(
+    CXCursorSet cset, CXCursor cursor);
+typedef NativeClang_getCursorSemanticParent = CXCursor Function(
     CXCursor cursor);
-typedef Native_clang_getCursorLexicalParent = CXCursor Function(
-    CXCursor cursor);
-typedef Native_clang_getOverriddenCursors = ffi.Void Function(
+typedef DartClang_getCursorSemanticParent = CXCursor Function(CXCursor cursor);
+typedef NativeClang_getCursorLexicalParent = CXCursor Function(CXCursor cursor);
+typedef DartClang_getCursorLexicalParent = CXCursor Function(CXCursor cursor);
+typedef NativeClang_getOverriddenCursors = ffi.Void Function(
     CXCursor cursor,
     ffi.Pointer<ffi.Pointer<CXCursor>> overridden,
     ffi.Pointer<ffi.Uint32> num_overridden);
-typedef Native_clang_disposeOverriddenCursors = ffi.Void Function(
+typedef DartClang_getOverriddenCursors = void Function(
+    CXCursor cursor,
+    ffi.Pointer<ffi.Pointer<CXCursor>> overridden,
+    ffi.Pointer<ffi.Uint32> num_overridden);
+typedef NativeClang_disposeOverriddenCursors = ffi.Void Function(
     ffi.Pointer<CXCursor> overridden);
-typedef Native_clang_getIncludedFile = CXFile Function(CXCursor cursor);
-typedef Native_clang_getCursor = CXCursor Function(
+typedef DartClang_disposeOverriddenCursors = void Function(
+    ffi.Pointer<CXCursor> overridden);
+typedef NativeClang_getIncludedFile = CXFile Function(CXCursor cursor);
+typedef DartClang_getIncludedFile = CXFile Function(CXCursor cursor);
+typedef NativeClang_getCursor = CXCursor Function(
     CXTranslationUnit arg0, CXSourceLocation arg1);
-typedef Native_clang_getCursorLocation = CXSourceLocation Function(
+typedef DartClang_getCursor = CXCursor Function(
+    CXTranslationUnit arg0, CXSourceLocation arg1);
+typedef NativeClang_getCursorLocation = CXSourceLocation Function(
     CXCursor arg0);
-typedef Native_clang_getCursorExtent = CXSourceRange Function(CXCursor arg0);
+typedef DartClang_getCursorLocation = CXSourceLocation Function(CXCursor arg0);
+typedef NativeClang_getCursorExtent = CXSourceRange Function(CXCursor arg0);
+typedef DartClang_getCursorExtent = CXSourceRange Function(CXCursor arg0);
 
 /// Describes the kind of type
 abstract class CXTypeKind {
@@ -9373,21 +9463,29 @@
   external ffi.Array<ffi.Pointer<ffi.Void>> data;
 }
 
-typedef Native_clang_getCursorType = CXType Function(CXCursor C);
-typedef Native_clang_getTypeSpelling = CXString Function(CXType CT);
-typedef Native_clang_getTypedefDeclUnderlyingType = CXType Function(CXCursor C);
-typedef Native_clang_getEnumDeclIntegerType = CXType Function(CXCursor C);
-typedef Native_clang_getEnumConstantDeclValue = ffi.Int64 Function(CXCursor C);
-typedef Native_clang_getEnumConstantDeclUnsignedValue = ffi.Uint64 Function(
+typedef NativeClang_getCursorType = CXType Function(CXCursor C);
+typedef DartClang_getCursorType = CXType Function(CXCursor C);
+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_getEnumDeclIntegerType = CXType Function(CXCursor C);
+typedef DartClang_getEnumDeclIntegerType = CXType Function(CXCursor C);
+typedef NativeClang_getEnumConstantDeclValue = ffi.Int64 Function(CXCursor C);
+typedef DartClang_getEnumConstantDeclValue = int Function(CXCursor C);
+typedef NativeClang_getEnumConstantDeclUnsignedValue = ffi.Uint64 Function(
     CXCursor C);
-typedef Native_clang_getFieldDeclBitWidth = ffi.Int32 Function(CXCursor C);
-typedef Native_clang_Cursor_getNumArguments = ffi.Int32 Function(CXCursor C);
-typedef Native_clang_Cursor_getArgument = CXCursor Function(
+typedef DartClang_getEnumConstantDeclUnsignedValue = int Function(CXCursor C);
+typedef NativeClang_getFieldDeclBitWidth = ffi.Int32 Function(CXCursor C);
+typedef DartClang_getFieldDeclBitWidth = int Function(CXCursor C);
+typedef NativeClang_Cursor_getNumArguments = ffi.Int32 Function(CXCursor C);
+typedef DartClang_Cursor_getNumArguments = int Function(CXCursor C);
+typedef NativeClang_Cursor_getArgument = CXCursor Function(
     CXCursor C, ffi.Uint32 i);
-typedef Native_clang_Cursor_getNumTemplateArguments = ffi.Int32 Function(
+typedef DartClang_Cursor_getArgument = CXCursor Function(CXCursor C, int i);
+typedef NativeClang_Cursor_getNumTemplateArguments = ffi.Int32 Function(
     CXCursor C);
-typedef Native_clang_Cursor_getTemplateArgumentKind = ffi.Int32 Function(
-    CXCursor C, ffi.Uint32 I);
+typedef DartClang_Cursor_getNumTemplateArguments = int Function(CXCursor C);
 
 /// Describes the kind of a template argument.
 ///
@@ -9406,29 +9504,53 @@
   static const int CXTemplateArgumentKind_Invalid = 9;
 }
 
-typedef Native_clang_Cursor_getTemplateArgumentType = CXType Function(
+typedef NativeClang_Cursor_getTemplateArgumentKind = ffi.Int32 Function(
     CXCursor C, ffi.Uint32 I);
-typedef Native_clang_Cursor_getTemplateArgumentValue = ffi.Int64 Function(
+typedef DartClang_Cursor_getTemplateArgumentKind = int Function(
+    CXCursor C, int I);
+typedef NativeClang_Cursor_getTemplateArgumentType = CXType Function(
     CXCursor C, ffi.Uint32 I);
-typedef Native_clang_Cursor_getTemplateArgumentUnsignedValue = ffi.Uint64
+typedef DartClang_Cursor_getTemplateArgumentType = CXType Function(
+    CXCursor C, int I);
+typedef NativeClang_Cursor_getTemplateArgumentValue = ffi.Int64 Function(
+    CXCursor C, ffi.Uint32 I);
+typedef DartClang_Cursor_getTemplateArgumentValue = int Function(
+    CXCursor C, int I);
+typedef NativeClang_Cursor_getTemplateArgumentUnsignedValue = ffi.Uint64
     Function(CXCursor C, ffi.Uint32 I);
-typedef Native_clang_equalTypes = ffi.Uint32 Function(CXType A, CXType B);
-typedef Native_clang_getCanonicalType = CXType Function(CXType T);
-typedef Native_clang_isConstQualifiedType = ffi.Uint32 Function(CXType T);
-typedef Native_clang_Cursor_isMacroFunctionLike = ffi.Uint32 Function(
+typedef DartClang_Cursor_getTemplateArgumentUnsignedValue = int Function(
+    CXCursor C, int I);
+typedef NativeClang_equalTypes = ffi.Uint32 Function(CXType A, CXType B);
+typedef DartClang_equalTypes = int Function(CXType A, CXType B);
+typedef NativeClang_getCanonicalType = CXType Function(CXType T);
+typedef DartClang_getCanonicalType = CXType Function(CXType T);
+typedef NativeClang_isConstQualifiedType = ffi.Uint32 Function(CXType T);
+typedef DartClang_isConstQualifiedType = int Function(CXType T);
+typedef NativeClang_Cursor_isMacroFunctionLike = ffi.Uint32 Function(
     CXCursor C);
-typedef Native_clang_Cursor_isMacroBuiltin = ffi.Uint32 Function(CXCursor C);
-typedef Native_clang_Cursor_isFunctionInlined = ffi.Uint32 Function(CXCursor C);
-typedef Native_clang_isVolatileQualifiedType = ffi.Uint32 Function(CXType T);
-typedef Native_clang_isRestrictQualifiedType = ffi.Uint32 Function(CXType T);
-typedef Native_clang_getAddressSpace = ffi.Uint32 Function(CXType T);
-typedef Native_clang_getTypedefName = CXString Function(CXType CT);
-typedef Native_clang_getPointeeType = CXType Function(CXType T);
-typedef Native_clang_getTypeDeclaration = CXCursor Function(CXType T);
-typedef Native_clang_getDeclObjCTypeEncoding = CXString Function(CXCursor C);
-typedef Native_clang_Type_getObjCEncoding = CXString Function(CXType type);
-typedef Native_clang_getTypeKindSpelling = CXString Function(ffi.Int32 K);
-typedef Native_clang_getFunctionTypeCallingConv = ffi.Int32 Function(CXType T);
+typedef DartClang_Cursor_isMacroFunctionLike = int Function(CXCursor C);
+typedef NativeClang_Cursor_isMacroBuiltin = ffi.Uint32 Function(CXCursor C);
+typedef DartClang_Cursor_isMacroBuiltin = int Function(CXCursor C);
+typedef NativeClang_Cursor_isFunctionInlined = ffi.Uint32 Function(CXCursor C);
+typedef DartClang_Cursor_isFunctionInlined = int Function(CXCursor C);
+typedef NativeClang_isVolatileQualifiedType = ffi.Uint32 Function(CXType T);
+typedef DartClang_isVolatileQualifiedType = int Function(CXType T);
+typedef NativeClang_isRestrictQualifiedType = ffi.Uint32 Function(CXType T);
+typedef DartClang_isRestrictQualifiedType = int Function(CXType T);
+typedef NativeClang_getAddressSpace = ffi.Uint32 Function(CXType T);
+typedef DartClang_getAddressSpace = int Function(CXType T);
+typedef NativeClang_getTypedefName = CXString Function(CXType CT);
+typedef DartClang_getTypedefName = CXString Function(CXType CT);
+typedef NativeClang_getPointeeType = CXType Function(CXType T);
+typedef DartClang_getPointeeType = CXType Function(CXType T);
+typedef NativeClang_getTypeDeclaration = CXCursor Function(CXType T);
+typedef DartClang_getTypeDeclaration = CXCursor Function(CXType T);
+typedef NativeClang_getDeclObjCTypeEncoding = CXString Function(CXCursor C);
+typedef DartClang_getDeclObjCTypeEncoding = CXString Function(CXCursor C);
+typedef NativeClang_Type_getObjCEncoding = CXString Function(CXType type);
+typedef DartClang_Type_getObjCEncoding = CXString Function(CXType type);
+typedef NativeClang_getTypeKindSpelling = CXString Function(ffi.Int32 K);
+typedef DartClang_getTypeKindSpelling = CXString Function(int K);
 
 /// Describes the calling convention of a function type
 abstract class CXCallingConv {
@@ -9454,32 +9576,52 @@
   static const int CXCallingConv_Unexposed = 200;
 }
 
-typedef Native_clang_getResultType = CXType Function(CXType T);
-typedef Native_clang_getExceptionSpecificationType = ffi.Int32 Function(
+typedef NativeClang_getFunctionTypeCallingConv = ffi.Int32 Function(CXType T);
+typedef DartClang_getFunctionTypeCallingConv = int Function(CXType T);
+typedef NativeClang_getResultType = CXType Function(CXType T);
+typedef DartClang_getResultType = CXType Function(CXType T);
+typedef NativeClang_getExceptionSpecificationType = ffi.Int32 Function(
     CXType T);
-typedef Native_clang_getNumArgTypes = ffi.Int32 Function(CXType T);
-typedef Native_clang_getArgType = CXType Function(CXType T, ffi.Uint32 i);
-typedef Native_clang_Type_getObjCObjectBaseType = CXType Function(CXType T);
-typedef Native_clang_Type_getNumObjCProtocolRefs = ffi.Uint32 Function(
-    CXType T);
-typedef Native_clang_Type_getObjCProtocolDecl = CXCursor Function(
+typedef DartClang_getExceptionSpecificationType = int Function(CXType T);
+typedef NativeClang_getNumArgTypes = ffi.Int32 Function(CXType T);
+typedef DartClang_getNumArgTypes = int Function(CXType T);
+typedef NativeClang_getArgType = CXType Function(CXType T, ffi.Uint32 i);
+typedef DartClang_getArgType = CXType Function(CXType T, int i);
+typedef NativeClang_Type_getObjCObjectBaseType = CXType Function(CXType T);
+typedef DartClang_Type_getObjCObjectBaseType = CXType Function(CXType T);
+typedef NativeClang_Type_getNumObjCProtocolRefs = ffi.Uint32 Function(CXType T);
+typedef DartClang_Type_getNumObjCProtocolRefs = int Function(CXType T);
+typedef NativeClang_Type_getObjCProtocolDecl = CXCursor Function(
     CXType T, ffi.Uint32 i);
-typedef Native_clang_Type_getNumObjCTypeArgs = ffi.Uint32 Function(CXType T);
-typedef Native_clang_Type_getObjCTypeArg = CXType Function(
+typedef DartClang_Type_getObjCProtocolDecl = CXCursor Function(CXType T, int i);
+typedef NativeClang_Type_getNumObjCTypeArgs = ffi.Uint32 Function(CXType T);
+typedef DartClang_Type_getNumObjCTypeArgs = int Function(CXType T);
+typedef NativeClang_Type_getObjCTypeArg = CXType Function(
     CXType T, ffi.Uint32 i);
-typedef Native_clang_isFunctionTypeVariadic = ffi.Uint32 Function(CXType T);
-typedef Native_clang_getCursorResultType = CXType Function(CXCursor C);
-typedef Native_clang_getCursorExceptionSpecificationType = ffi.Int32 Function(
+typedef DartClang_Type_getObjCTypeArg = CXType Function(CXType T, int i);
+typedef NativeClang_isFunctionTypeVariadic = ffi.Uint32 Function(CXType T);
+typedef DartClang_isFunctionTypeVariadic = int Function(CXType T);
+typedef NativeClang_getCursorResultType = CXType Function(CXCursor C);
+typedef DartClang_getCursorResultType = CXType Function(CXCursor C);
+typedef NativeClang_getCursorExceptionSpecificationType = ffi.Int32 Function(
     CXCursor C);
-typedef Native_clang_isPODType = ffi.Uint32 Function(CXType T);
-typedef Native_clang_getElementType = CXType Function(CXType T);
-typedef Native_clang_getNumElements = ffi.Int64 Function(CXType T);
-typedef Native_clang_getArrayElementType = CXType Function(CXType T);
-typedef Native_clang_getArraySize = ffi.Int64 Function(CXType T);
-typedef Native_clang_Type_getNamedType = CXType Function(CXType T);
-typedef Native_clang_Type_isTransparentTagTypedef = ffi.Uint32 Function(
+typedef DartClang_getCursorExceptionSpecificationType = int Function(
+    CXCursor C);
+typedef NativeClang_isPODType = ffi.Uint32 Function(CXType T);
+typedef DartClang_isPODType = int Function(CXType T);
+typedef NativeClang_getElementType = CXType Function(CXType T);
+typedef DartClang_getElementType = CXType Function(CXType T);
+typedef NativeClang_getNumElements = ffi.Int64 Function(CXType T);
+typedef DartClang_getNumElements = int Function(CXType T);
+typedef NativeClang_getArrayElementType = CXType Function(CXType T);
+typedef DartClang_getArrayElementType = CXType Function(CXType T);
+typedef NativeClang_getArraySize = ffi.Int64 Function(CXType T);
+typedef DartClang_getArraySize = int Function(CXType T);
+typedef NativeClang_Type_getNamedType = CXType Function(CXType T);
+typedef DartClang_Type_getNamedType = CXType Function(CXType T);
+typedef NativeClang_Type_isTransparentTagTypedef = ffi.Uint32 Function(
     CXType T);
-typedef Native_clang_Type_getNullability = ffi.Int32 Function(CXType T);
+typedef DartClang_Type_isTransparentTagTypedef = int Function(CXType T);
 
 abstract class CXTypeNullabilityKind {
   /// Values of this type can never be null.
@@ -9498,22 +9640,35 @@
   static const int CXTypeNullability_Invalid = 3;
 }
 
-typedef Native_clang_Type_getAlignOf = ffi.Int64 Function(CXType T);
-typedef Native_clang_Type_getClassType = CXType Function(CXType T);
-typedef Native_clang_Type_getSizeOf = ffi.Int64 Function(CXType T);
-typedef Native_clang_Type_getOffsetOf = ffi.Int64 Function(
+typedef NativeClang_Type_getNullability = ffi.Int32 Function(CXType T);
+typedef DartClang_Type_getNullability = int Function(CXType T);
+typedef NativeClang_Type_getAlignOf = ffi.Int64 Function(CXType T);
+typedef DartClang_Type_getAlignOf = int Function(CXType T);
+typedef NativeClang_Type_getClassType = CXType Function(CXType T);
+typedef DartClang_Type_getClassType = CXType Function(CXType T);
+typedef NativeClang_Type_getSizeOf = ffi.Int64 Function(CXType T);
+typedef DartClang_Type_getSizeOf = int Function(CXType T);
+typedef NativeClang_Type_getOffsetOf = ffi.Int64 Function(
     CXType T, ffi.Pointer<ffi.Int8> S);
-typedef Native_clang_Type_getModifiedType = CXType Function(CXType T);
-typedef Native_clang_Cursor_getOffsetOfField = ffi.Int64 Function(CXCursor C);
-typedef Native_clang_Cursor_isAnonymous = ffi.Uint32 Function(CXCursor C);
-typedef Native_clang_Cursor_isAnonymousRecordDecl = ffi.Uint32 Function(
+typedef DartClang_Type_getOffsetOf = int Function(
+    CXType T, ffi.Pointer<ffi.Int8> S);
+typedef NativeClang_Type_getModifiedType = CXType Function(CXType T);
+typedef DartClang_Type_getModifiedType = CXType Function(CXType T);
+typedef NativeClang_Cursor_getOffsetOfField = ffi.Int64 Function(CXCursor C);
+typedef DartClang_Cursor_getOffsetOfField = int Function(CXCursor C);
+typedef NativeClang_Cursor_isAnonymous = ffi.Uint32 Function(CXCursor C);
+typedef DartClang_Cursor_isAnonymous = int Function(CXCursor C);
+typedef NativeClang_Cursor_isAnonymousRecordDecl = ffi.Uint32 Function(
     CXCursor C);
-typedef Native_clang_Cursor_isInlineNamespace = ffi.Uint32 Function(CXCursor C);
-typedef Native_clang_Type_getNumTemplateArguments = ffi.Int32 Function(
-    CXType T);
-typedef Native_clang_Type_getTemplateArgumentAsType = CXType Function(
+typedef DartClang_Cursor_isAnonymousRecordDecl = int Function(CXCursor C);
+typedef NativeClang_Cursor_isInlineNamespace = ffi.Uint32 Function(CXCursor C);
+typedef DartClang_Cursor_isInlineNamespace = int Function(CXCursor C);
+typedef NativeClang_Type_getNumTemplateArguments = ffi.Int32 Function(CXType T);
+typedef DartClang_Type_getNumTemplateArguments = int Function(CXType T);
+typedef NativeClang_Type_getTemplateArgumentAsType = CXType Function(
     CXType T, ffi.Uint32 i);
-typedef Native_clang_Type_getCXXRefQualifier = ffi.Int32 Function(CXType T);
+typedef DartClang_Type_getTemplateArgumentAsType = CXType Function(
+    CXType T, int i);
 
 abstract class CXRefQualifierKind {
   /// No ref-qualifier was provided.
@@ -9526,9 +9681,12 @@
   static const int CXRefQualifier_RValue = 2;
 }
 
-typedef Native_clang_Cursor_isBitField = ffi.Uint32 Function(CXCursor C);
-typedef Native_clang_isVirtualBase = ffi.Uint32 Function(CXCursor arg0);
-typedef Native_clang_getCXXAccessSpecifier = ffi.Int32 Function(CXCursor arg0);
+typedef NativeClang_Type_getCXXRefQualifier = ffi.Int32 Function(CXType T);
+typedef DartClang_Type_getCXXRefQualifier = int Function(CXType T);
+typedef NativeClang_Cursor_isBitField = ffi.Uint32 Function(CXCursor C);
+typedef DartClang_Cursor_isBitField = int Function(CXCursor C);
+typedef NativeClang_isVirtualBase = ffi.Uint32 Function(CXCursor arg0);
+typedef DartClang_isVirtualBase = int Function(CXCursor arg0);
 
 /// Represents the C++ access control level to a base class for a
 /// cursor with kind CX_CXXBaseSpecifier.
@@ -9539,7 +9697,8 @@
   static const int CX_CXXPrivate = 3;
 }
 
-typedef Native_clang_Cursor_getStorageClass = ffi.Int32 Function(CXCursor arg0);
+typedef NativeClang_getCXXAccessSpecifier = ffi.Int32 Function(CXCursor arg0);
+typedef DartClang_getCXXAccessSpecifier = int Function(CXCursor arg0);
 
 /// Represents the storage classes as declared in the source. CX_SC_Invalid
 /// was added for the case that the passed cursor in not a declaration.
@@ -9554,13 +9713,17 @@
   static const int CX_SC_Register = 7;
 }
 
-typedef Native_clang_getNumOverloadedDecls = ffi.Uint32 Function(
+typedef NativeClang_Cursor_getStorageClass = ffi.Int32 Function(CXCursor arg0);
+typedef DartClang_Cursor_getStorageClass = int Function(CXCursor arg0);
+typedef NativeClang_getNumOverloadedDecls = ffi.Uint32 Function(
     CXCursor cursor);
-typedef Native_clang_getOverloadedDecl = CXCursor Function(
+typedef DartClang_getNumOverloadedDecls = int Function(CXCursor cursor);
+typedef NativeClang_getOverloadedDecl = CXCursor Function(
     CXCursor cursor, ffi.Uint32 index);
-typedef Native_clang_getIBOutletCollectionType = CXType Function(CXCursor arg0);
-typedef Native_clang_visitChildren = ffi.Uint32 Function(
-    CXCursor parent, CXCursorVisitor visitor, CXClientData client_data);
+typedef DartClang_getOverloadedDecl = CXCursor Function(
+    CXCursor cursor, int index);
+typedef NativeClang_getIBOutletCollectionType = CXType Function(CXCursor arg0);
+typedef DartClang_getIBOutletCollectionType = CXType Function(CXCursor arg0);
 
 /// Visitor invoked for each cursor found by a traversal.
 ///
@@ -9596,24 +9759,42 @@
 /// Opaque pointer representing client data that will be passed through
 /// to various callbacks and visitors.
 typedef CXClientData = ffi.Pointer<ffi.Void>;
-typedef Native_clang_getCursorUSR = CXString Function(CXCursor arg0);
-typedef Native_clang_constructUSR_ObjCClass = CXString Function(
+typedef NativeClang_visitChildren = ffi.Uint32 Function(
+    CXCursor parent, CXCursorVisitor visitor, CXClientData client_data);
+typedef DartClang_visitChildren = int Function(
+    CXCursor parent, CXCursorVisitor visitor, CXClientData client_data);
+typedef NativeClang_getCursorUSR = CXString Function(CXCursor arg0);
+typedef DartClang_getCursorUSR = CXString Function(CXCursor arg0);
+typedef NativeClang_constructUSR_ObjCClass = CXString Function(
     ffi.Pointer<ffi.Int8> class_name);
-typedef Native_clang_constructUSR_ObjCCategory = CXString Function(
+typedef DartClang_constructUSR_ObjCClass = CXString Function(
+    ffi.Pointer<ffi.Int8> class_name);
+typedef NativeClang_constructUSR_ObjCCategory = CXString Function(
     ffi.Pointer<ffi.Int8> class_name, ffi.Pointer<ffi.Int8> category_name);
-typedef Native_clang_constructUSR_ObjCProtocol = CXString Function(
+typedef DartClang_constructUSR_ObjCCategory = CXString Function(
+    ffi.Pointer<ffi.Int8> class_name, ffi.Pointer<ffi.Int8> category_name);
+typedef NativeClang_constructUSR_ObjCProtocol = CXString Function(
     ffi.Pointer<ffi.Int8> protocol_name);
-typedef Native_clang_constructUSR_ObjCIvar = CXString Function(
+typedef DartClang_constructUSR_ObjCProtocol = CXString Function(
+    ffi.Pointer<ffi.Int8> protocol_name);
+typedef NativeClang_constructUSR_ObjCIvar = CXString Function(
     ffi.Pointer<ffi.Int8> name, CXString classUSR);
-typedef Native_clang_constructUSR_ObjCMethod = CXString Function(
+typedef DartClang_constructUSR_ObjCIvar = CXString Function(
+    ffi.Pointer<ffi.Int8> name, CXString classUSR);
+typedef NativeClang_constructUSR_ObjCMethod = CXString Function(
     ffi.Pointer<ffi.Int8> name, ffi.Uint32 isInstanceMethod, CXString classUSR);
-typedef Native_clang_constructUSR_ObjCProperty = CXString Function(
+typedef DartClang_constructUSR_ObjCMethod = CXString Function(
+    ffi.Pointer<ffi.Int8> name, int isInstanceMethod, CXString classUSR);
+typedef NativeClang_constructUSR_ObjCProperty = CXString Function(
     ffi.Pointer<ffi.Int8> property, CXString classUSR);
-typedef Native_clang_getCursorSpelling = CXString Function(CXCursor arg0);
-typedef Native_clang_Cursor_getSpellingNameRange = CXSourceRange Function(
+typedef DartClang_constructUSR_ObjCProperty = CXString Function(
+    ffi.Pointer<ffi.Int8> property, CXString classUSR);
+typedef NativeClang_getCursorSpelling = CXString Function(CXCursor arg0);
+typedef DartClang_getCursorSpelling = CXString Function(CXCursor arg0);
+typedef NativeClang_Cursor_getSpellingNameRange = CXSourceRange Function(
     CXCursor arg0, ffi.Uint32 pieceIndex, ffi.Uint32 options);
-typedef Native_clang_PrintingPolicy_getProperty = ffi.Uint32 Function(
-    CXPrintingPolicy Policy, ffi.Int32 Property);
+typedef DartClang_Cursor_getSpellingNameRange = CXSourceRange Function(
+    CXCursor arg0, int pieceIndex, int options);
 
 /// Opaque pointer representing a policy that controls pretty printing
 /// for \c clang_getCursorPrettyPrinted.
@@ -9652,48 +9833,88 @@
   static const int CXPrintingPolicy_LastProperty = 25;
 }
 
-typedef Native_clang_PrintingPolicy_setProperty = ffi.Void Function(
+typedef NativeClang_PrintingPolicy_getProperty = ffi.Uint32 Function(
+    CXPrintingPolicy Policy, ffi.Int32 Property);
+typedef DartClang_PrintingPolicy_getProperty = int Function(
+    CXPrintingPolicy Policy, int Property);
+typedef NativeClang_PrintingPolicy_setProperty = ffi.Void Function(
     CXPrintingPolicy Policy, ffi.Int32 Property, ffi.Uint32 Value);
-typedef Native_clang_getCursorPrintingPolicy = CXPrintingPolicy Function(
+typedef DartClang_PrintingPolicy_setProperty = void Function(
+    CXPrintingPolicy Policy, int Property, int Value);
+typedef NativeClang_getCursorPrintingPolicy = CXPrintingPolicy Function(
     CXCursor arg0);
-typedef Native_clang_PrintingPolicy_dispose = ffi.Void Function(
+typedef DartClang_getCursorPrintingPolicy = CXPrintingPolicy Function(
+    CXCursor arg0);
+typedef NativeClang_PrintingPolicy_dispose = ffi.Void Function(
     CXPrintingPolicy Policy);
-typedef Native_clang_getCursorPrettyPrinted = CXString Function(
+typedef DartClang_PrintingPolicy_dispose = void Function(
+    CXPrintingPolicy Policy);
+typedef NativeClang_getCursorPrettyPrinted = CXString Function(
     CXCursor Cursor, CXPrintingPolicy Policy);
-typedef Native_clang_getCursorDisplayName = CXString Function(CXCursor arg0);
-typedef Native_clang_getCursorReferenced = CXCursor Function(CXCursor arg0);
-typedef Native_clang_getCursorDefinition = CXCursor Function(CXCursor arg0);
-typedef Native_clang_isCursorDefinition = ffi.Uint32 Function(CXCursor arg0);
-typedef Native_clang_getCanonicalCursor = CXCursor Function(CXCursor arg0);
-typedef Native_clang_Cursor_getObjCSelectorIndex = ffi.Int32 Function(
+typedef DartClang_getCursorPrettyPrinted = CXString Function(
+    CXCursor Cursor, CXPrintingPolicy Policy);
+typedef NativeClang_getCursorDisplayName = CXString Function(CXCursor arg0);
+typedef DartClang_getCursorDisplayName = CXString Function(CXCursor arg0);
+typedef NativeClang_getCursorReferenced = CXCursor Function(CXCursor arg0);
+typedef DartClang_getCursorReferenced = CXCursor Function(CXCursor arg0);
+typedef NativeClang_getCursorDefinition = CXCursor Function(CXCursor arg0);
+typedef DartClang_getCursorDefinition = CXCursor Function(CXCursor arg0);
+typedef NativeClang_isCursorDefinition = ffi.Uint32 Function(CXCursor arg0);
+typedef DartClang_isCursorDefinition = int Function(CXCursor arg0);
+typedef NativeClang_getCanonicalCursor = CXCursor Function(CXCursor arg0);
+typedef DartClang_getCanonicalCursor = CXCursor Function(CXCursor arg0);
+typedef NativeClang_Cursor_getObjCSelectorIndex = ffi.Int32 Function(
     CXCursor arg0);
-typedef Native_clang_Cursor_isDynamicCall = ffi.Int32 Function(CXCursor C);
-typedef Native_clang_Cursor_getReceiverType = CXType Function(CXCursor C);
-typedef Native_clang_Cursor_getObjCPropertyAttributes = ffi.Uint32 Function(
+typedef DartClang_Cursor_getObjCSelectorIndex = int Function(CXCursor arg0);
+typedef NativeClang_Cursor_isDynamicCall = ffi.Int32 Function(CXCursor C);
+typedef DartClang_Cursor_isDynamicCall = int Function(CXCursor C);
+typedef NativeClang_Cursor_getReceiverType = CXType Function(CXCursor C);
+typedef DartClang_Cursor_getReceiverType = CXType Function(CXCursor C);
+typedef NativeClang_Cursor_getObjCPropertyAttributes = ffi.Uint32 Function(
     CXCursor C, ffi.Uint32 reserved);
-typedef Native_clang_Cursor_getObjCPropertyGetterName = CXString Function(
+typedef DartClang_Cursor_getObjCPropertyAttributes = int Function(
+    CXCursor C, int reserved);
+typedef NativeClang_Cursor_getObjCPropertyGetterName = CXString Function(
     CXCursor C);
-typedef Native_clang_Cursor_getObjCPropertySetterName = CXString Function(
+typedef DartClang_Cursor_getObjCPropertyGetterName = CXString Function(
     CXCursor C);
-typedef Native_clang_Cursor_getObjCDeclQualifiers = ffi.Uint32 Function(
+typedef NativeClang_Cursor_getObjCPropertySetterName = CXString Function(
     CXCursor C);
-typedef Native_clang_Cursor_isObjCOptional = ffi.Uint32 Function(CXCursor C);
-typedef Native_clang_Cursor_isVariadic = ffi.Uint32 Function(CXCursor C);
-typedef Native_clang_Cursor_isExternalSymbol = ffi.Uint32 Function(
+typedef DartClang_Cursor_getObjCPropertySetterName = CXString Function(
+    CXCursor C);
+typedef NativeClang_Cursor_getObjCDeclQualifiers = ffi.Uint32 Function(
+    CXCursor C);
+typedef DartClang_Cursor_getObjCDeclQualifiers = int Function(CXCursor C);
+typedef NativeClang_Cursor_isObjCOptional = ffi.Uint32 Function(CXCursor C);
+typedef DartClang_Cursor_isObjCOptional = int Function(CXCursor C);
+typedef NativeClang_Cursor_isVariadic = ffi.Uint32 Function(CXCursor C);
+typedef DartClang_Cursor_isVariadic = int Function(CXCursor C);
+typedef NativeClang_Cursor_isExternalSymbol = ffi.Uint32 Function(
     CXCursor C,
     ffi.Pointer<CXString> language,
     ffi.Pointer<CXString> definedIn,
     ffi.Pointer<ffi.Uint32> isGenerated);
-typedef Native_clang_Cursor_getCommentRange = CXSourceRange Function(
-    CXCursor C);
-typedef Native_clang_Cursor_getRawCommentText = CXString Function(CXCursor C);
-typedef Native_clang_Cursor_getBriefCommentText = CXString Function(CXCursor C);
-typedef Native_clang_Cursor_getMangling = CXString Function(CXCursor arg0);
-typedef Native_clang_Cursor_getCXXManglings = ffi.Pointer<CXStringSet> Function(
+typedef DartClang_Cursor_isExternalSymbol = int Function(
+    CXCursor C,
+    ffi.Pointer<CXString> language,
+    ffi.Pointer<CXString> definedIn,
+    ffi.Pointer<ffi.Uint32> isGenerated);
+typedef NativeClang_Cursor_getCommentRange = CXSourceRange Function(CXCursor C);
+typedef DartClang_Cursor_getCommentRange = CXSourceRange Function(CXCursor C);
+typedef NativeClang_Cursor_getRawCommentText = CXString Function(CXCursor C);
+typedef DartClang_Cursor_getRawCommentText = CXString Function(CXCursor C);
+typedef NativeClang_Cursor_getBriefCommentText = CXString Function(CXCursor C);
+typedef DartClang_Cursor_getBriefCommentText = CXString Function(CXCursor C);
+typedef NativeClang_Cursor_getMangling = CXString Function(CXCursor arg0);
+typedef DartClang_Cursor_getMangling = CXString Function(CXCursor arg0);
+typedef NativeClang_Cursor_getCXXManglings = ffi.Pointer<CXStringSet> Function(
     CXCursor arg0);
-typedef Native_clang_Cursor_getObjCManglings = ffi.Pointer<CXStringSet>
-    Function(CXCursor arg0);
-typedef Native_clang_Cursor_getModule = CXModule Function(CXCursor C);
+typedef DartClang_Cursor_getCXXManglings = ffi.Pointer<CXStringSet> Function(
+    CXCursor arg0);
+typedef NativeClang_Cursor_getObjCManglings = ffi.Pointer<CXStringSet> Function(
+    CXCursor arg0);
+typedef DartClang_Cursor_getObjCManglings = ffi.Pointer<CXStringSet> Function(
+    CXCursor arg0);
 
 /// \defgroup CINDEX_MODULE Module introspection
 ///
@@ -9701,38 +9922,69 @@
 ///
 /// @{
 typedef CXModule = ffi.Pointer<ffi.Void>;
-typedef Native_clang_getModuleForFile = CXModule Function(
+typedef NativeClang_Cursor_getModule = CXModule Function(CXCursor C);
+typedef DartClang_Cursor_getModule = CXModule Function(CXCursor C);
+typedef NativeClang_getModuleForFile = CXModule Function(
     CXTranslationUnit arg0, CXFile arg1);
-typedef Native_clang_Module_getASTFile = CXFile Function(CXModule Module);
-typedef Native_clang_Module_getParent = CXModule Function(CXModule Module);
-typedef Native_clang_Module_getName = CXString Function(CXModule Module);
-typedef Native_clang_Module_getFullName = CXString Function(CXModule Module);
-typedef Native_clang_Module_isSystem = ffi.Int32 Function(CXModule Module);
-typedef Native_clang_Module_getNumTopLevelHeaders = ffi.Uint32 Function(
+typedef DartClang_getModuleForFile = CXModule Function(
+    CXTranslationUnit arg0, CXFile arg1);
+typedef NativeClang_Module_getASTFile = CXFile Function(CXModule Module);
+typedef DartClang_Module_getASTFile = CXFile Function(CXModule Module);
+typedef NativeClang_Module_getParent = CXModule Function(CXModule Module);
+typedef DartClang_Module_getParent = CXModule Function(CXModule Module);
+typedef NativeClang_Module_getName = CXString Function(CXModule Module);
+typedef DartClang_Module_getName = CXString Function(CXModule Module);
+typedef NativeClang_Module_getFullName = CXString Function(CXModule Module);
+typedef DartClang_Module_getFullName = CXString Function(CXModule Module);
+typedef NativeClang_Module_isSystem = ffi.Int32 Function(CXModule Module);
+typedef DartClang_Module_isSystem = int Function(CXModule Module);
+typedef NativeClang_Module_getNumTopLevelHeaders = ffi.Uint32 Function(
     CXTranslationUnit arg0, CXModule Module);
-typedef Native_clang_Module_getTopLevelHeader = CXFile Function(
+typedef DartClang_Module_getNumTopLevelHeaders = int Function(
+    CXTranslationUnit arg0, CXModule Module);
+typedef NativeClang_Module_getTopLevelHeader = CXFile Function(
     CXTranslationUnit arg0, CXModule Module, ffi.Uint32 Index);
-typedef Native_clang_CXXConstructor_isConvertingConstructor = ffi.Uint32
+typedef DartClang_Module_getTopLevelHeader = CXFile Function(
+    CXTranslationUnit arg0, CXModule Module, int Index);
+typedef NativeClang_CXXConstructor_isConvertingConstructor = ffi.Uint32
     Function(CXCursor C);
-typedef Native_clang_CXXConstructor_isCopyConstructor = ffi.Uint32 Function(
+typedef DartClang_CXXConstructor_isConvertingConstructor = int Function(
     CXCursor C);
-typedef Native_clang_CXXConstructor_isDefaultConstructor = ffi.Uint32 Function(
+typedef NativeClang_CXXConstructor_isCopyConstructor = ffi.Uint32 Function(
     CXCursor C);
-typedef Native_clang_CXXConstructor_isMoveConstructor = ffi.Uint32 Function(
+typedef DartClang_CXXConstructor_isCopyConstructor = int Function(CXCursor C);
+typedef NativeClang_CXXConstructor_isDefaultConstructor = ffi.Uint32 Function(
     CXCursor C);
-typedef Native_clang_CXXField_isMutable = ffi.Uint32 Function(CXCursor C);
-typedef Native_clang_CXXMethod_isDefaulted = ffi.Uint32 Function(CXCursor C);
-typedef Native_clang_CXXMethod_isPureVirtual = ffi.Uint32 Function(CXCursor C);
-typedef Native_clang_CXXMethod_isStatic = ffi.Uint32 Function(CXCursor C);
-typedef Native_clang_CXXMethod_isVirtual = ffi.Uint32 Function(CXCursor C);
-typedef Native_clang_CXXRecord_isAbstract = ffi.Uint32 Function(CXCursor C);
-typedef Native_clang_EnumDecl_isScoped = ffi.Uint32 Function(CXCursor C);
-typedef Native_clang_CXXMethod_isConst = ffi.Uint32 Function(CXCursor C);
-typedef Native_clang_getTemplateCursorKind = ffi.Int32 Function(CXCursor C);
-typedef Native_clang_getSpecializedCursorTemplate = CXCursor Function(
+typedef DartClang_CXXConstructor_isDefaultConstructor = int Function(
     CXCursor C);
-typedef Native_clang_getCursorReferenceNameRange = CXSourceRange Function(
+typedef NativeClang_CXXConstructor_isMoveConstructor = ffi.Uint32 Function(
+    CXCursor C);
+typedef DartClang_CXXConstructor_isMoveConstructor = int Function(CXCursor C);
+typedef NativeClang_CXXField_isMutable = ffi.Uint32 Function(CXCursor C);
+typedef DartClang_CXXField_isMutable = int Function(CXCursor C);
+typedef NativeClang_CXXMethod_isDefaulted = ffi.Uint32 Function(CXCursor C);
+typedef DartClang_CXXMethod_isDefaulted = int Function(CXCursor C);
+typedef NativeClang_CXXMethod_isPureVirtual = ffi.Uint32 Function(CXCursor C);
+typedef DartClang_CXXMethod_isPureVirtual = int Function(CXCursor C);
+typedef NativeClang_CXXMethod_isStatic = ffi.Uint32 Function(CXCursor C);
+typedef DartClang_CXXMethod_isStatic = int Function(CXCursor C);
+typedef NativeClang_CXXMethod_isVirtual = ffi.Uint32 Function(CXCursor C);
+typedef DartClang_CXXMethod_isVirtual = int Function(CXCursor C);
+typedef NativeClang_CXXRecord_isAbstract = ffi.Uint32 Function(CXCursor C);
+typedef DartClang_CXXRecord_isAbstract = int Function(CXCursor C);
+typedef NativeClang_EnumDecl_isScoped = ffi.Uint32 Function(CXCursor C);
+typedef DartClang_EnumDecl_isScoped = int Function(CXCursor C);
+typedef NativeClang_CXXMethod_isConst = ffi.Uint32 Function(CXCursor C);
+typedef DartClang_CXXMethod_isConst = int Function(CXCursor C);
+typedef NativeClang_getTemplateCursorKind = ffi.Int32 Function(CXCursor C);
+typedef DartClang_getTemplateCursorKind = int Function(CXCursor C);
+typedef NativeClang_getSpecializedCursorTemplate = CXCursor Function(
+    CXCursor C);
+typedef DartClang_getSpecializedCursorTemplate = CXCursor Function(CXCursor C);
+typedef NativeClang_getCursorReferenceNameRange = CXSourceRange Function(
     CXCursor C, ffi.Uint32 NameFlags, ffi.Uint32 PieceIndex);
+typedef DartClang_getCursorReferenceNameRange = CXSourceRange Function(
+    CXCursor C, int NameFlags, int PieceIndex);
 
 /// Describes a single preprocessing token.
 class CXToken extends ffi.Struct {
@@ -9742,9 +9994,10 @@
   external ffi.Pointer<ffi.Void> ptr_data;
 }
 
-typedef Native_clang_getToken = ffi.Pointer<CXToken> Function(
+typedef NativeClang_getToken = ffi.Pointer<CXToken> Function(
     CXTranslationUnit TU, CXSourceLocation Location);
-typedef Native_clang_getTokenKind = ffi.Int32 Function(CXToken arg0);
+typedef DartClang_getToken = ffi.Pointer<CXToken> Function(
+    CXTranslationUnit TU, CXSourceLocation Location);
 
 /// Describes a kind of token.
 abstract class CXTokenKind {
@@ -9764,26 +10017,44 @@
   static const int CXToken_Comment = 4;
 }
 
-typedef Native_clang_getTokenSpelling = CXString Function(
+typedef NativeClang_getTokenKind = ffi.Int32 Function(CXToken arg0);
+typedef DartClang_getTokenKind = int Function(CXToken arg0);
+typedef NativeClang_getTokenSpelling = CXString Function(
     CXTranslationUnit arg0, CXToken arg1);
-typedef Native_clang_getTokenLocation = CXSourceLocation Function(
+typedef DartClang_getTokenSpelling = CXString Function(
     CXTranslationUnit arg0, CXToken arg1);
-typedef Native_clang_getTokenExtent = CXSourceRange Function(
+typedef NativeClang_getTokenLocation = CXSourceLocation Function(
     CXTranslationUnit arg0, CXToken arg1);
-typedef Native_clang_tokenize = ffi.Void Function(
+typedef DartClang_getTokenLocation = CXSourceLocation Function(
+    CXTranslationUnit arg0, CXToken arg1);
+typedef NativeClang_getTokenExtent = CXSourceRange Function(
+    CXTranslationUnit arg0, CXToken arg1);
+typedef DartClang_getTokenExtent = CXSourceRange Function(
+    CXTranslationUnit arg0, CXToken arg1);
+typedef NativeClang_tokenize = ffi.Void Function(
     CXTranslationUnit TU,
     CXSourceRange Range,
     ffi.Pointer<ffi.Pointer<CXToken>> Tokens,
     ffi.Pointer<ffi.Uint32> NumTokens);
-typedef Native_clang_annotateTokens = ffi.Void Function(
+typedef DartClang_tokenize = void Function(
+    CXTranslationUnit TU,
+    CXSourceRange Range,
+    ffi.Pointer<ffi.Pointer<CXToken>> Tokens,
+    ffi.Pointer<ffi.Uint32> NumTokens);
+typedef NativeClang_annotateTokens = ffi.Void Function(
     CXTranslationUnit TU,
     ffi.Pointer<CXToken> Tokens,
     ffi.Uint32 NumTokens,
     ffi.Pointer<CXCursor> Cursors);
-typedef Native_clang_disposeTokens = ffi.Void Function(
+typedef DartClang_annotateTokens = void Function(CXTranslationUnit TU,
+    ffi.Pointer<CXToken> Tokens, int NumTokens, ffi.Pointer<CXCursor> Cursors);
+typedef NativeClang_disposeTokens = ffi.Void Function(
     CXTranslationUnit TU, ffi.Pointer<CXToken> Tokens, ffi.Uint32 NumTokens);
-typedef Native_clang_getCursorKindSpelling = CXString Function(ffi.Int32 Kind);
-typedef Native_clang_getDefinitionSpellingAndExtent = ffi.Void Function(
+typedef DartClang_disposeTokens = void Function(
+    CXTranslationUnit TU, ffi.Pointer<CXToken> Tokens, int NumTokens);
+typedef NativeClang_getCursorKindSpelling = CXString Function(ffi.Int32 Kind);
+typedef DartClang_getCursorKindSpelling = CXString Function(int Kind);
+typedef NativeClang_getDefinitionSpellingAndExtent = ffi.Void Function(
     CXCursor arg0,
     ffi.Pointer<ffi.Pointer<ffi.Int8>> startBuf,
     ffi.Pointer<ffi.Pointer<ffi.Int8>> endBuf,
@@ -9791,12 +10062,26 @@
     ffi.Pointer<ffi.Uint32> startColumn,
     ffi.Pointer<ffi.Uint32> endLine,
     ffi.Pointer<ffi.Uint32> endColumn);
-typedef Native_clang_enableStackTraces = ffi.Void Function();
-typedef Native_clang_executeOnThread = ffi.Void Function(
+typedef DartClang_getDefinitionSpellingAndExtent = void Function(
+    CXCursor arg0,
+    ffi.Pointer<ffi.Pointer<ffi.Int8>> startBuf,
+    ffi.Pointer<ffi.Pointer<ffi.Int8>> endBuf,
+    ffi.Pointer<ffi.Uint32> startLine,
+    ffi.Pointer<ffi.Uint32> startColumn,
+    ffi.Pointer<ffi.Uint32> endLine,
+    ffi.Pointer<ffi.Uint32> endColumn);
+typedef NativeClang_enableStackTraces = ffi.Void Function();
+typedef DartClang_enableStackTraces = void Function();
+typedef NativeClang_executeOnThread = ffi.Void Function(
     ffi.Pointer<ffi.NativeFunction<ffi.Void Function(ffi.Pointer<ffi.Void>)>>
         fn,
     ffi.Pointer<ffi.Void> user_data,
     ffi.Uint32 stack_size);
+typedef DartClang_executeOnThread = void Function(
+    ffi.Pointer<ffi.NativeFunction<ffi.Void Function(ffi.Pointer<ffi.Void>)>>
+        fn,
+    ffi.Pointer<ffi.Void> user_data,
+    int stack_size);
 
 /// A single result of code completion.
 class CXCompletionResult extends ffi.Struct {
@@ -9828,8 +10113,6 @@
 /// with actual code,of a specific kind. See \c CXCompletionChunkKind for a
 /// description of the different kinds of chunks.
 typedef CXCompletionString = ffi.Pointer<ffi.Void>;
-typedef Native_clang_getCompletionChunkKind = ffi.Int32 Function(
-    CXCompletionString completion_string, ffi.Uint32 chunk_number);
 
 /// Describes a single piece of text within a code-completion string.
 ///
@@ -9978,25 +10261,49 @@
   static const int CXCompletionChunk_VerticalSpace = 20;
 }
 
-typedef Native_clang_getCompletionChunkText = CXString Function(
+typedef NativeClang_getCompletionChunkKind = ffi.Int32 Function(
     CXCompletionString completion_string, ffi.Uint32 chunk_number);
-typedef Native_clang_getCompletionChunkCompletionString = CXCompletionString
+typedef DartClang_getCompletionChunkKind = int Function(
+    CXCompletionString completion_string, int chunk_number);
+typedef NativeClang_getCompletionChunkText = CXString Function(
+    CXCompletionString completion_string, ffi.Uint32 chunk_number);
+typedef DartClang_getCompletionChunkText = CXString Function(
+    CXCompletionString completion_string, int chunk_number);
+typedef NativeClang_getCompletionChunkCompletionString = CXCompletionString
     Function(CXCompletionString completion_string, ffi.Uint32 chunk_number);
-typedef Native_clang_getNumCompletionChunks = ffi.Uint32 Function(
+typedef DartClang_getCompletionChunkCompletionString = CXCompletionString
+    Function(CXCompletionString completion_string, int chunk_number);
+typedef NativeClang_getNumCompletionChunks = ffi.Uint32 Function(
     CXCompletionString completion_string);
-typedef Native_clang_getCompletionPriority = ffi.Uint32 Function(
+typedef DartClang_getNumCompletionChunks = int Function(
     CXCompletionString completion_string);
-typedef Native_clang_getCompletionAvailability = ffi.Int32 Function(
+typedef NativeClang_getCompletionPriority = ffi.Uint32 Function(
     CXCompletionString completion_string);
-typedef Native_clang_getCompletionNumAnnotations = ffi.Uint32 Function(
+typedef DartClang_getCompletionPriority = int Function(
     CXCompletionString completion_string);
-typedef Native_clang_getCompletionAnnotation = CXString Function(
+typedef NativeClang_getCompletionAvailability = ffi.Int32 Function(
+    CXCompletionString completion_string);
+typedef DartClang_getCompletionAvailability = int Function(
+    CXCompletionString completion_string);
+typedef NativeClang_getCompletionNumAnnotations = ffi.Uint32 Function(
+    CXCompletionString completion_string);
+typedef DartClang_getCompletionNumAnnotations = int Function(
+    CXCompletionString completion_string);
+typedef NativeClang_getCompletionAnnotation = CXString Function(
     CXCompletionString completion_string, ffi.Uint32 annotation_number);
-typedef Native_clang_getCompletionParent = CXString Function(
+typedef DartClang_getCompletionAnnotation = CXString Function(
+    CXCompletionString completion_string, int annotation_number);
+typedef NativeClang_getCompletionParent = CXString Function(
     CXCompletionString completion_string, ffi.Pointer<ffi.Int32> kind);
-typedef Native_clang_getCompletionBriefComment = CXString Function(
+typedef DartClang_getCompletionParent = CXString Function(
+    CXCompletionString completion_string, ffi.Pointer<ffi.Int32> kind);
+typedef NativeClang_getCompletionBriefComment = CXString Function(
     CXCompletionString completion_string);
-typedef Native_clang_getCursorCompletionString = CXCompletionString Function(
+typedef DartClang_getCompletionBriefComment = CXString Function(
+    CXCompletionString completion_string);
+typedef NativeClang_getCursorCompletionString = CXCompletionString Function(
+    CXCursor cursor);
+typedef DartClang_getCursorCompletionString = CXCompletionString Function(
     CXCursor cursor);
 
 /// Contains the results of code-completion.
@@ -10014,15 +10321,23 @@
   external int NumResults;
 }
 
-typedef Native_clang_getCompletionNumFixIts = ffi.Uint32 Function(
+typedef NativeClang_getCompletionNumFixIts = ffi.Uint32 Function(
     ffi.Pointer<CXCodeCompleteResults> results, ffi.Uint32 completion_index);
-typedef Native_clang_getCompletionFixIt = CXString Function(
+typedef DartClang_getCompletionNumFixIts = int Function(
+    ffi.Pointer<CXCodeCompleteResults> results, int completion_index);
+typedef NativeClang_getCompletionFixIt = CXString Function(
     ffi.Pointer<CXCodeCompleteResults> results,
     ffi.Uint32 completion_index,
     ffi.Uint32 fixit_index,
     ffi.Pointer<CXSourceRange> replacement_range);
-typedef Native_clang_defaultCodeCompleteOptions = ffi.Uint32 Function();
-typedef Native_clang_codeCompleteAt
+typedef DartClang_getCompletionFixIt = CXString Function(
+    ffi.Pointer<CXCodeCompleteResults> results,
+    int completion_index,
+    int fixit_index,
+    ffi.Pointer<CXSourceRange> replacement_range);
+typedef NativeClang_defaultCodeCompleteOptions = ffi.Uint32 Function();
+typedef DartClang_defaultCodeCompleteOptions = int Function();
+typedef NativeClang_codeCompleteAt
     = ffi.Pointer<CXCodeCompleteResults> Function(
         CXTranslationUnit TU,
         ffi.Pointer<ffi.Int8> complete_filename,
@@ -10031,28 +10346,53 @@
         ffi.Pointer<CXUnsavedFile> unsaved_files,
         ffi.Uint32 num_unsaved_files,
         ffi.Uint32 options);
-typedef Native_clang_sortCodeCompletionResults = ffi.Void Function(
+typedef DartClang_codeCompleteAt = ffi.Pointer<CXCodeCompleteResults> Function(
+    CXTranslationUnit TU,
+    ffi.Pointer<ffi.Int8> complete_filename,
+    int complete_line,
+    int complete_column,
+    ffi.Pointer<CXUnsavedFile> unsaved_files,
+    int num_unsaved_files,
+    int options);
+typedef NativeClang_sortCodeCompletionResults = ffi.Void Function(
     ffi.Pointer<CXCompletionResult> Results, ffi.Uint32 NumResults);
-typedef Native_clang_disposeCodeCompleteResults = ffi.Void Function(
+typedef DartClang_sortCodeCompletionResults = void Function(
+    ffi.Pointer<CXCompletionResult> Results, int NumResults);
+typedef NativeClang_disposeCodeCompleteResults = ffi.Void Function(
     ffi.Pointer<CXCodeCompleteResults> Results);
-typedef Native_clang_codeCompleteGetNumDiagnostics = ffi.Uint32 Function(
+typedef DartClang_disposeCodeCompleteResults = void Function(
     ffi.Pointer<CXCodeCompleteResults> Results);
-typedef Native_clang_codeCompleteGetDiagnostic = CXDiagnostic Function(
+typedef NativeClang_codeCompleteGetNumDiagnostics = ffi.Uint32 Function(
+    ffi.Pointer<CXCodeCompleteResults> Results);
+typedef DartClang_codeCompleteGetNumDiagnostics = int Function(
+    ffi.Pointer<CXCodeCompleteResults> Results);
+typedef NativeClang_codeCompleteGetDiagnostic = CXDiagnostic Function(
     ffi.Pointer<CXCodeCompleteResults> Results, ffi.Uint32 Index);
-typedef Native_clang_codeCompleteGetContexts = ffi.Uint64 Function(
+typedef DartClang_codeCompleteGetDiagnostic = CXDiagnostic Function(
+    ffi.Pointer<CXCodeCompleteResults> Results, int Index);
+typedef NativeClang_codeCompleteGetContexts = ffi.Uint64 Function(
     ffi.Pointer<CXCodeCompleteResults> Results);
-typedef Native_clang_codeCompleteGetContainerKind = ffi.Int32 Function(
+typedef DartClang_codeCompleteGetContexts = int Function(
+    ffi.Pointer<CXCodeCompleteResults> Results);
+typedef NativeClang_codeCompleteGetContainerKind = ffi.Int32 Function(
     ffi.Pointer<CXCodeCompleteResults> Results,
     ffi.Pointer<ffi.Uint32> IsIncomplete);
-typedef Native_clang_codeCompleteGetContainerUSR = CXString Function(
+typedef DartClang_codeCompleteGetContainerKind = int Function(
+    ffi.Pointer<CXCodeCompleteResults> Results,
+    ffi.Pointer<ffi.Uint32> IsIncomplete);
+typedef NativeClang_codeCompleteGetContainerUSR = CXString Function(
     ffi.Pointer<CXCodeCompleteResults> Results);
-typedef Native_clang_codeCompleteGetObjCSelector = CXString Function(
+typedef DartClang_codeCompleteGetContainerUSR = CXString Function(
     ffi.Pointer<CXCodeCompleteResults> Results);
-typedef Native_clang_getClangVersion = CXString Function();
-typedef Native_clang_toggleCrashRecovery = ffi.Void Function(
+typedef NativeClang_codeCompleteGetObjCSelector = CXString Function(
+    ffi.Pointer<CXCodeCompleteResults> Results);
+typedef DartClang_codeCompleteGetObjCSelector = CXString Function(
+    ffi.Pointer<CXCodeCompleteResults> Results);
+typedef NativeClang_getClangVersion = CXString Function();
+typedef DartClang_getClangVersion = CXString Function();
+typedef NativeClang_toggleCrashRecovery = ffi.Void Function(
     ffi.Uint32 isEnabled);
-typedef Native_clang_getInclusions = ffi.Void Function(
-    CXTranslationUnit tu, CXInclusionVisitor visitor, CXClientData client_data);
+typedef DartClang_toggleCrashRecovery = void Function(int isEnabled);
 
 /// Visitor invoked for each file in a translation unit
 /// (used with clang_getInclusions()).
@@ -10067,11 +10407,15 @@
     ffi.NativeFunction<
         ffi.Void Function(
             CXFile, ffi.Pointer<CXSourceLocation>, ffi.Uint32, CXClientData)>>;
-typedef Native_clang_Cursor_Evaluate = CXEvalResult Function(CXCursor C);
+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);
 
 /// Evaluation result of a cursor
 typedef CXEvalResult = ffi.Pointer<ffi.Void>;
-typedef Native_clang_EvalResult_getKind = ffi.Int32 Function(CXEvalResult E);
+typedef NativeClang_Cursor_Evaluate = CXEvalResult Function(CXCursor C);
+typedef DartClang_Cursor_Evaluate = CXEvalResult Function(CXCursor C);
 
 abstract class CXEvalResultKind {
   static const int CXEval_Int = 1;
@@ -10083,32 +10427,53 @@
   static const int CXEval_UnExposed = 0;
 }
 
-typedef Native_clang_EvalResult_getAsInt = ffi.Int32 Function(CXEvalResult E);
-typedef Native_clang_EvalResult_getAsLongLong = ffi.Int64 Function(
+typedef NativeClang_EvalResult_getKind = ffi.Int32 Function(CXEvalResult E);
+typedef DartClang_EvalResult_getKind = int Function(CXEvalResult E);
+typedef NativeClang_EvalResult_getAsInt = ffi.Int32 Function(CXEvalResult E);
+typedef DartClang_EvalResult_getAsInt = int Function(CXEvalResult E);
+typedef NativeClang_EvalResult_getAsLongLong = ffi.Int64 Function(
     CXEvalResult E);
-typedef Native_clang_EvalResult_isUnsignedInt = ffi.Uint32 Function(
+typedef DartClang_EvalResult_getAsLongLong = int Function(CXEvalResult E);
+typedef NativeClang_EvalResult_isUnsignedInt = ffi.Uint32 Function(
     CXEvalResult E);
-typedef Native_clang_EvalResult_getAsUnsigned = ffi.Uint64 Function(
+typedef DartClang_EvalResult_isUnsignedInt = int Function(CXEvalResult E);
+typedef NativeClang_EvalResult_getAsUnsigned = ffi.Uint64 Function(
     CXEvalResult E);
-typedef Native_clang_EvalResult_getAsDouble = ffi.Double Function(
+typedef DartClang_EvalResult_getAsUnsigned = int Function(CXEvalResult E);
+typedef NativeClang_EvalResult_getAsDouble = ffi.Double Function(
     CXEvalResult E);
-typedef Native_clang_EvalResult_getAsStr = ffi.Pointer<ffi.Int8> Function(
+typedef DartClang_EvalResult_getAsDouble = double Function(CXEvalResult E);
+typedef NativeClang_EvalResult_getAsStr = ffi.Pointer<ffi.Int8> Function(
     CXEvalResult E);
-typedef Native_clang_EvalResult_dispose = ffi.Void Function(CXEvalResult E);
-typedef Native_clang_getRemappings = CXRemapping Function(
-    ffi.Pointer<ffi.Int8> path);
+typedef DartClang_EvalResult_getAsStr = ffi.Pointer<ffi.Int8> Function(
+    CXEvalResult E);
+typedef NativeClang_EvalResult_dispose = ffi.Void Function(CXEvalResult E);
+typedef DartClang_EvalResult_dispose = void Function(CXEvalResult E);
 
 /// A remapping of original source files and their translated files.
 typedef CXRemapping = ffi.Pointer<ffi.Void>;
-typedef Native_clang_getRemappingsFromFileList = CXRemapping Function(
+typedef NativeClang_getRemappings = CXRemapping Function(
+    ffi.Pointer<ffi.Int8> path);
+typedef DartClang_getRemappings = CXRemapping Function(
+    ffi.Pointer<ffi.Int8> path);
+typedef NativeClang_getRemappingsFromFileList = CXRemapping Function(
     ffi.Pointer<ffi.Pointer<ffi.Int8>> filePaths, ffi.Uint32 numFiles);
-typedef Native_clang_remap_getNumFiles = ffi.Uint32 Function(CXRemapping arg0);
-typedef Native_clang_remap_getFilenames = ffi.Void Function(
+typedef DartClang_getRemappingsFromFileList = CXRemapping Function(
+    ffi.Pointer<ffi.Pointer<ffi.Int8>> filePaths, int numFiles);
+typedef NativeClang_remap_getNumFiles = ffi.Uint32 Function(CXRemapping arg0);
+typedef DartClang_remap_getNumFiles = int Function(CXRemapping arg0);
+typedef NativeClang_remap_getFilenames = ffi.Void Function(
     CXRemapping arg0,
     ffi.Uint32 index,
     ffi.Pointer<CXString> original,
     ffi.Pointer<CXString> transformed);
-typedef Native_clang_remap_dispose = ffi.Void Function(CXRemapping arg0);
+typedef DartClang_remap_getFilenames = void Function(
+    CXRemapping arg0,
+    int index,
+    ffi.Pointer<CXString> original,
+    ffi.Pointer<CXString> transformed);
+typedef NativeClang_remap_dispose = ffi.Void Function(CXRemapping arg0);
+typedef DartClang_remap_dispose = void Function(CXRemapping arg0);
 
 class CXCursorAndRangeVisitor extends ffi.Struct {
   external ffi.Pointer<ffi.Void> context;
@@ -10127,9 +10492,6 @@
   static const int CXVisit_Continue = 1;
 }
 
-typedef Native_clang_findReferencesInFile = ffi.Int32 Function(
-    CXCursor cursor, CXFile file, CXCursorAndRangeVisitor visitor);
-
 abstract class CXResult {
   /// Function returned successfully.
   static const int CXResult_Success = 0;
@@ -10142,7 +10504,13 @@
   static const int CXResult_VisitBreak = 2;
 }
 
-typedef Native_clang_findIncludesInFile = ffi.Int32 Function(
+typedef NativeClang_findReferencesInFile = ffi.Int32 Function(
+    CXCursor cursor, CXFile file, CXCursorAndRangeVisitor visitor);
+typedef DartClang_findReferencesInFile = int Function(
+    CXCursor cursor, CXFile file, CXCursorAndRangeVisitor visitor);
+typedef NativeClang_findIncludesInFile = ffi.Int32 Function(
+    CXTranslationUnit TU, CXFile file, CXCursorAndRangeVisitor visitor);
+typedef DartClang_findIncludesInFile = int Function(
     CXTranslationUnit TU, CXFile file, CXCursorAndRangeVisitor visitor);
 
 /// Source location passed to index callbacks.
@@ -10472,64 +10840,81 @@
   static const int CXSymbolRole_Implicit = 256;
 }
 
-typedef Native_clang_index_isEntityObjCContainerKind = ffi.Int32 Function(
+typedef NativeClang_index_isEntityObjCContainerKind = ffi.Int32 Function(
     ffi.Int32 arg0);
-typedef Native_clang_index_getObjCContainerDeclInfo
+typedef DartClang_index_isEntityObjCContainerKind = int Function(int arg0);
+typedef NativeClang_index_getObjCContainerDeclInfo
     = ffi.Pointer<CXIdxObjCContainerDeclInfo> Function(
         ffi.Pointer<CXIdxDeclInfo> arg0);
-typedef Native_clang_index_getObjCInterfaceDeclInfo
+typedef DartClang_index_getObjCContainerDeclInfo
+    = ffi.Pointer<CXIdxObjCContainerDeclInfo> Function(
+        ffi.Pointer<CXIdxDeclInfo> arg0);
+typedef NativeClang_index_getObjCInterfaceDeclInfo
     = ffi.Pointer<CXIdxObjCInterfaceDeclInfo> Function(
         ffi.Pointer<CXIdxDeclInfo> arg0);
-typedef Native_clang_index_getObjCCategoryDeclInfo
+typedef DartClang_index_getObjCInterfaceDeclInfo
+    = ffi.Pointer<CXIdxObjCInterfaceDeclInfo> Function(
+        ffi.Pointer<CXIdxDeclInfo> arg0);
+typedef NativeClang_index_getObjCCategoryDeclInfo
     = ffi.Pointer<CXIdxObjCCategoryDeclInfo> Function(
         ffi.Pointer<CXIdxDeclInfo> arg0);
-typedef Native_clang_index_getObjCProtocolRefListInfo
+typedef DartClang_index_getObjCCategoryDeclInfo
+    = ffi.Pointer<CXIdxObjCCategoryDeclInfo> Function(
+        ffi.Pointer<CXIdxDeclInfo> arg0);
+typedef NativeClang_index_getObjCProtocolRefListInfo
     = ffi.Pointer<CXIdxObjCProtocolRefListInfo> Function(
         ffi.Pointer<CXIdxDeclInfo> arg0);
-typedef Native_clang_index_getObjCPropertyDeclInfo
+typedef DartClang_index_getObjCProtocolRefListInfo
+    = ffi.Pointer<CXIdxObjCProtocolRefListInfo> Function(
+        ffi.Pointer<CXIdxDeclInfo> arg0);
+typedef NativeClang_index_getObjCPropertyDeclInfo
     = ffi.Pointer<CXIdxObjCPropertyDeclInfo> Function(
         ffi.Pointer<CXIdxDeclInfo> arg0);
-typedef Native_clang_index_getIBOutletCollectionAttrInfo
+typedef DartClang_index_getObjCPropertyDeclInfo
+    = ffi.Pointer<CXIdxObjCPropertyDeclInfo> Function(
+        ffi.Pointer<CXIdxDeclInfo> arg0);
+typedef NativeClang_index_getIBOutletCollectionAttrInfo
     = ffi.Pointer<CXIdxIBOutletCollectionAttrInfo> Function(
         ffi.Pointer<CXIdxAttrInfo> arg0);
-typedef Native_clang_index_getCXXClassDeclInfo
+typedef DartClang_index_getIBOutletCollectionAttrInfo
+    = ffi.Pointer<CXIdxIBOutletCollectionAttrInfo> Function(
+        ffi.Pointer<CXIdxAttrInfo> arg0);
+typedef NativeClang_index_getCXXClassDeclInfo
     = ffi.Pointer<CXIdxCXXClassDeclInfo> Function(
         ffi.Pointer<CXIdxDeclInfo> arg0);
-typedef Native_clang_index_getClientContainer = CXIdxClientContainer Function(
-    ffi.Pointer<CXIdxContainerInfo> arg0);
+typedef DartClang_index_getCXXClassDeclInfo = ffi.Pointer<CXIdxCXXClassDeclInfo>
+    Function(ffi.Pointer<CXIdxDeclInfo> arg0);
 
 /// The client's data object that is associated with a semantic container
 /// of entities.
 typedef CXIdxClientContainer = ffi.Pointer<ffi.Void>;
-typedef Native_clang_index_setClientContainer = ffi.Void Function(
+typedef NativeClang_index_getClientContainer = CXIdxClientContainer Function(
+    ffi.Pointer<CXIdxContainerInfo> arg0);
+typedef DartClang_index_getClientContainer = CXIdxClientContainer Function(
+    ffi.Pointer<CXIdxContainerInfo> arg0);
+typedef NativeClang_index_setClientContainer = ffi.Void Function(
     ffi.Pointer<CXIdxContainerInfo> arg0, CXIdxClientContainer arg1);
-typedef Native_clang_index_getClientEntity = CXIdxClientEntity Function(
-    ffi.Pointer<CXIdxEntityInfo> arg0);
+typedef DartClang_index_setClientContainer = void Function(
+    ffi.Pointer<CXIdxContainerInfo> arg0, CXIdxClientContainer arg1);
 
 /// The client's data object that is associated with a semantic entity.
 typedef CXIdxClientEntity = ffi.Pointer<ffi.Void>;
-typedef Native_clang_index_setClientEntity = ffi.Void Function(
+typedef NativeClang_index_getClientEntity = CXIdxClientEntity Function(
+    ffi.Pointer<CXIdxEntityInfo> arg0);
+typedef DartClang_index_getClientEntity = CXIdxClientEntity Function(
+    ffi.Pointer<CXIdxEntityInfo> arg0);
+typedef NativeClang_index_setClientEntity = ffi.Void Function(
     ffi.Pointer<CXIdxEntityInfo> arg0, CXIdxClientEntity arg1);
-typedef Native_clang_IndexAction_create = CXIndexAction Function(CXIndex CIdx);
+typedef DartClang_index_setClientEntity = void Function(
+    ffi.Pointer<CXIdxEntityInfo> arg0, CXIdxClientEntity arg1);
 
 /// An indexing action/session, to be applied to one or multiple
 /// translation units.
 typedef CXIndexAction = ffi.Pointer<ffi.Void>;
-typedef Native_clang_IndexAction_dispose = ffi.Void Function(
-    CXIndexAction arg0);
-typedef Native_clang_indexSourceFile = ffi.Int32 Function(
-    CXIndexAction arg0,
-    CXClientData client_data,
-    ffi.Pointer<IndexerCallbacks> index_callbacks,
-    ffi.Uint32 index_callbacks_size,
-    ffi.Uint32 index_options,
-    ffi.Pointer<ffi.Int8> source_filename,
-    ffi.Pointer<ffi.Pointer<ffi.Int8>> command_line_args,
-    ffi.Int32 num_command_line_args,
-    ffi.Pointer<CXUnsavedFile> unsaved_files,
-    ffi.Uint32 num_unsaved_files,
-    ffi.Pointer<CXTranslationUnit> out_TU,
-    ffi.Uint32 TU_options);
+typedef NativeClang_IndexAction_create = CXIndexAction Function(CXIndex CIdx);
+typedef DartClang_IndexAction_create = CXIndexAction Function(CXIndex CIdx);
+typedef NativeClang_IndexAction_dispose = ffi.Void Function(CXIndexAction arg0);
+typedef DartClang_IndexAction_dispose = void Function(CXIndexAction arg0);
 
 /// A group of callbacks used by #clang_indexSourceFile and
 /// #clang_indexTranslationUnit.
@@ -10595,7 +10980,7 @@
 /// The client's data object that is associated with an AST file (PCH
 /// or module).
 typedef CXIdxClientASTFile = ffi.Pointer<ffi.Void>;
-typedef Native_clang_indexSourceFileFullArgv = ffi.Int32 Function(
+typedef NativeClang_indexSourceFile = ffi.Int32 Function(
     CXIndexAction arg0,
     CXClientData client_data,
     ffi.Pointer<IndexerCallbacks> index_callbacks,
@@ -10608,24 +10993,77 @@
     ffi.Uint32 num_unsaved_files,
     ffi.Pointer<CXTranslationUnit> out_TU,
     ffi.Uint32 TU_options);
-typedef Native_clang_indexTranslationUnit = ffi.Int32 Function(
+typedef DartClang_indexSourceFile = int Function(
+    CXIndexAction arg0,
+    CXClientData client_data,
+    ffi.Pointer<IndexerCallbacks> index_callbacks,
+    int index_callbacks_size,
+    int index_options,
+    ffi.Pointer<ffi.Int8> source_filename,
+    ffi.Pointer<ffi.Pointer<ffi.Int8>> command_line_args,
+    int num_command_line_args,
+    ffi.Pointer<CXUnsavedFile> unsaved_files,
+    int num_unsaved_files,
+    ffi.Pointer<CXTranslationUnit> out_TU,
+    int TU_options);
+typedef NativeClang_indexSourceFileFullArgv = ffi.Int32 Function(
+    CXIndexAction arg0,
+    CXClientData client_data,
+    ffi.Pointer<IndexerCallbacks> index_callbacks,
+    ffi.Uint32 index_callbacks_size,
+    ffi.Uint32 index_options,
+    ffi.Pointer<ffi.Int8> source_filename,
+    ffi.Pointer<ffi.Pointer<ffi.Int8>> command_line_args,
+    ffi.Int32 num_command_line_args,
+    ffi.Pointer<CXUnsavedFile> unsaved_files,
+    ffi.Uint32 num_unsaved_files,
+    ffi.Pointer<CXTranslationUnit> out_TU,
+    ffi.Uint32 TU_options);
+typedef DartClang_indexSourceFileFullArgv = int Function(
+    CXIndexAction arg0,
+    CXClientData client_data,
+    ffi.Pointer<IndexerCallbacks> index_callbacks,
+    int index_callbacks_size,
+    int index_options,
+    ffi.Pointer<ffi.Int8> source_filename,
+    ffi.Pointer<ffi.Pointer<ffi.Int8>> command_line_args,
+    int num_command_line_args,
+    ffi.Pointer<CXUnsavedFile> unsaved_files,
+    int num_unsaved_files,
+    ffi.Pointer<CXTranslationUnit> out_TU,
+    int TU_options);
+typedef NativeClang_indexTranslationUnit = ffi.Int32 Function(
     CXIndexAction arg0,
     CXClientData client_data,
     ffi.Pointer<IndexerCallbacks> index_callbacks,
     ffi.Uint32 index_callbacks_size,
     ffi.Uint32 index_options,
     CXTranslationUnit arg5);
-typedef Native_clang_indexLoc_getFileLocation = ffi.Void Function(
+typedef DartClang_indexTranslationUnit = int Function(
+    CXIndexAction arg0,
+    CXClientData client_data,
+    ffi.Pointer<IndexerCallbacks> index_callbacks,
+    int index_callbacks_size,
+    int index_options,
+    CXTranslationUnit arg5);
+typedef NativeClang_indexLoc_getFileLocation = ffi.Void Function(
     CXIdxLoc loc,
     ffi.Pointer<CXIdxClientFile> indexFile,
     ffi.Pointer<CXFile> file,
     ffi.Pointer<ffi.Uint32> line,
     ffi.Pointer<ffi.Uint32> column,
     ffi.Pointer<ffi.Uint32> offset);
-typedef Native_clang_indexLoc_getCXSourceLocation = CXSourceLocation Function(
+typedef DartClang_indexLoc_getFileLocation = void Function(
+    CXIdxLoc loc,
+    ffi.Pointer<CXIdxClientFile> indexFile,
+    ffi.Pointer<CXFile> file,
+    ffi.Pointer<ffi.Uint32> line,
+    ffi.Pointer<ffi.Uint32> column,
+    ffi.Pointer<ffi.Uint32> offset);
+typedef NativeClang_indexLoc_getCXSourceLocation = CXSourceLocation Function(
     CXIdxLoc loc);
-typedef Native_clang_Type_visitFields = ffi.Uint32 Function(
-    CXType T, CXFieldVisitor visitor, CXClientData client_data);
+typedef DartClang_indexLoc_getCXSourceLocation = CXSourceLocation Function(
+    CXIdxLoc loc);
 
 /// Visitor invoked for each field found by a traversal.
 ///
@@ -10638,6 +11076,10 @@
 /// to direct \c clang_Type_visitFields.
 typedef CXFieldVisitor = ffi
     .Pointer<ffi.NativeFunction<ffi.Int32 Function(CXCursor, CXClientData)>>;
+typedef NativeClang_Type_visitFields = ffi.Uint32 Function(
+    CXType T, CXFieldVisitor visitor, CXClientData client_data);
+typedef DartClang_Type_visitFields = int Function(
+    CXType T, CXFieldVisitor visitor, CXClientData client_data);
 
 const int CINDEX_VERSION_MAJOR = 0;
 
diff --git a/example/libclang-example/pubspec.yaml b/example/libclang-example/pubspec.yaml
index 7e22ee0..f10498b 100644
--- a/example/libclang-example/pubspec.yaml
+++ b/example/libclang-example/pubspec.yaml
@@ -39,7 +39,10 @@
       - 'clang_.*' # Can be a regexp, '.' matches any character.
     symbol-address:
       include:
-        - 'clang_.*' # Symbol Address and Typedefs for these functions will be exposed via addresses.
+        - 'clang_.*' # Symbol Address for these functions will be exposed via addresses.
+    expose-typedefs:
+      include:
+        - 'clang_.*' # Typedefs for Native and Dart type for these functions will be generated.
   structs:
     include:
         - 'CX.*'
diff --git a/lib/src/code_generator/func.dart b/lib/src/code_generator/func.dart
index fd679b8..e779c77 100644
--- a/lib/src/code_generator/func.dart
+++ b/lib/src/code_generator/func.dart
@@ -31,9 +31,10 @@
 class Func extends LookUpBinding {
   final FunctionType functionType;
   final bool exposeSymbolAddress;
+  final bool exposeFunctionTypedefs;
 
-  /// Contains typealias for function type if [exposeSymbolAddress] is true.
-  Type? _exposedFunctionType;
+  /// Contains typealias for function type if [exposeFunctionTypedefs] is true.
+  Typealias? _exposedCFunctionTypealias, _exposedDartFunctionTypealias;
 
   /// [originalName] is looked up in dynamic library, if not
   /// provided, takes the value of [name].
@@ -45,6 +46,7 @@
     required Type returnType,
     List<Parameter>? parameters,
     this.exposeSymbolAddress = false,
+    this.exposeFunctionTypedefs = false,
   })  : functionType = FunctionType(
           returnType: returnType,
           parameters: parameters ?? const [],
@@ -61,8 +63,19 @@
       }
     }
 
-    _exposedFunctionType = Type.typealias(
-        Typealias(name: 'Native_$name', type: Type.functionType(functionType)));
+    // Get function name with first letter in upper case.
+    final upperCaseName = name[0].toUpperCase() + name.substring(1);
+    if (exposeFunctionTypedefs) {
+      _exposedCFunctionTypealias = Typealias(
+        name: 'Native$upperCaseName',
+        type: Type.functionType(functionType),
+      );
+      _exposedDartFunctionTypealias = Typealias(
+        name: 'Dart$upperCaseName',
+        type: Type.functionType(functionType),
+        useDartType: true,
+      );
+    }
   }
 
   @override
@@ -120,10 +133,12 @@
     }
     s.write('}\n');
 
-    final cType = exposeSymbolAddress
-        ? _exposedFunctionType!.getCType(w)
+    final cType = exposeFunctionTypedefs
+        ? _exposedCFunctionTypealias!.name
         : functionType.getCType(w, writeArgumentNames: false);
-    final dartType = functionType.getDartType(w, writeArgumentNames: false);
+    final dartType = exposeFunctionTypedefs
+        ? _exposedDartFunctionTypealias!.name
+        : functionType.getDartType(w, writeArgumentNames: false);
 
     if (exposeSymbolAddress) {
       // Add to SymbolAddress in writer.
@@ -148,10 +163,11 @@
     if (dependencies.contains(this)) return;
 
     dependencies.add(this);
-    if (exposeSymbolAddress) {
-      _exposedFunctionType!.addDependencies(dependencies);
-    }
     functionType.addDependencies(dependencies);
+    if (exposeFunctionTypedefs) {
+      _exposedCFunctionTypealias!.addDependencies(dependencies);
+      _exposedDartFunctionTypealias!.addDependencies(dependencies);
+    }
   }
 }
 
diff --git a/lib/src/code_generator/typealias.dart b/lib/src/code_generator/typealias.dart
index ada848e..7320957 100644
--- a/lib/src/code_generator/typealias.dart
+++ b/lib/src/code_generator/typealias.dart
@@ -17,6 +17,7 @@
 /// ```
 class Typealias extends NoLookUpBinding {
   final Type type;
+  final bool _useDartType;
 
   Typealias({
     String? usr,
@@ -24,7 +25,13 @@
     String? dartDoc,
     required String name,
     required this.type,
-  }) : super(
+
+    /// If true, the binding string uses Dart type instead of C type.
+    ///
+    /// E.g if C type is ffi.Void func(ffi.Int32), Dart type is void func(int).
+    bool useDartType = false,
+  })  : _useDartType = useDartType,
+        super(
           usr: usr,
           name: name,
           dartDoc: dartDoc,
@@ -45,7 +52,8 @@
     if (dartDoc != null) {
       sb.write(makeDartDoc(dartDoc!));
     }
-    sb.write('typedef $name = ${type.getCType(w)};\n');
+    sb.write(
+        'typedef $name = ${_useDartType ? type.getDartType(w) : type.getCType(w)};\n');
     return BindingString(
         type: BindingStringType.typeDef, string: sb.toString());
   }
diff --git a/lib/src/config_provider/config.dart b/lib/src/config_provider/config.dart
index 57c0019..7d8c261 100644
--- a/lib/src/config_provider/config.dart
+++ b/lib/src/config_provider/config.dart
@@ -116,6 +116,9 @@
   bool get useDartHandle => _useDartHandle;
   late bool _useDartHandle;
 
+  Includer get exposeFunctionTypedefs => _exposeFunctionTypedefs;
+  late Includer _exposeFunctionTypedefs;
+
   Config._();
 
   /// Create config from Yaml map.
@@ -404,6 +407,15 @@
         defaultValue: () => true,
         extractedResult: (dynamic result) => _useDartHandle = result as bool,
       ),
+      [strings.functions, strings.exposeFunctionTypedefs]:
+          Specification<Includer>(
+        requirement: Requirement.no,
+        validator: exposeFunctionTypeValidator,
+        extractor: exposeFunctionTypeExtractor,
+        defaultValue: () => Includer.excludeByDefault(),
+        extractedResult: (dynamic result) =>
+            _exposeFunctionTypedefs = result as Includer,
+      ),
     };
   }
 }
diff --git a/lib/src/config_provider/spec_utils.dart b/lib/src/config_provider/spec_utils.dart
index 52a5df9..5acd29e 100644
--- a/lib/src/config_provider/spec_utils.dart
+++ b/lib/src/config_provider/spec_utils.dart
@@ -567,6 +567,31 @@
   return _result;
 }
 
+Includer exposeFunctionTypeExtractor(dynamic value) =>
+    _extractIncluderFromYaml(value);
+
+bool exposeFunctionTypeValidator(List<String> name, dynamic value) {
+  var _result = true;
+
+  if (!checkType<YamlMap>(name, value)) {
+    _result = false;
+  } else {
+    final mp = value as YamlMap;
+    for (final key in mp.keys) {
+      if (key == strings.include || key == strings.exclude) {
+        if (!checkType<YamlList>([...name, key as String], value[key])) {
+          _result = false;
+        }
+      } else {
+        _logger.severe("Unknown subkey '$key' in '$name'.");
+        _result = false;
+      }
+    }
+  }
+
+  return _result;
+}
+
 SupportedNativeType nativeSupportedType(int value, {bool signed = true}) {
   switch (value) {
     case 1:
diff --git a/lib/src/header_parser/sub_parsers/functiondecl_parser.dart b/lib/src/header_parser/sub_parsers/functiondecl_parser.dart
index a715f0e..7a0bb20 100644
--- a/lib/src/header_parser/sub_parsers/functiondecl_parser.dart
+++ b/lib/src/header_parser/sub_parsers/functiondecl_parser.dart
@@ -78,6 +78,8 @@
       parameters: parameters,
       exposeSymbolAddress:
           config.functionDecl.shouldIncludeSymbolAddress(funcName),
+      exposeFunctionTypedefs:
+          config.exposeFunctionTypedefs.shouldInclude(funcName),
     );
     bindingsIndex.addFuncToSeen(funcUsr, _stack.top.func!);
   } else if (bindingsIndex.isSeenFunc(funcUsr)) {
diff --git a/lib/src/strings.dart b/lib/src/strings.dart
index 46bdb09..84e767c 100644
--- a/lib/src/strings.dart
+++ b/lib/src/strings.dart
@@ -60,6 +60,9 @@
 const memberRename = 'member-rename';
 const symbolAddress = 'symbol-address';
 
+// Nested under `functions`
+const exposeFunctionTypedefs = 'expose-typedefs';
+
 const dependencyOnly = 'dependency-only';
 // Values for `compoundDependencies`.
 const fullCompoundDependencies = 'full';
diff --git a/pubspec.yaml b/pubspec.yaml
index 93239f4..3633464 100644
--- a/pubspec.yaml
+++ b/pubspec.yaml
@@ -3,7 +3,7 @@
 # BSD-style license that can be found in the LICENSE file.
 
 name: ffigen
-version: 4.0.0-dev.1
+version: 4.0.0-dev.2
 homepage: https://github.com/dart-lang/ffigen
 description: Generator for FFI bindings, using LibClang to parse C header files.
 
diff --git a/test/collision_tests/decl_symbol_address_collision_test.dart b/test/collision_tests/decl_symbol_address_collision_test.dart
index 52cad51..9520139 100644
--- a/test/collision_tests/decl_symbol_address_collision_test.dart
+++ b/test/collision_tests/decl_symbol_address_collision_test.dart
@@ -24,6 +24,7 @@
             name: '_library',
             returnType: Type.nativeType(SupportedNativeType.Void),
             exposeSymbolAddress: true,
+            exposeFunctionTypedefs: true,
           ),
           Func(
             name: '_SymbolAddresses_1',
diff --git a/test/collision_tests/expected_bindings/_expected_decl_symbol_address_collision_bindings.dart b/test/collision_tests/expected_bindings/_expected_decl_symbol_address_collision_bindings.dart
index 2f74f02..b45cdcd 100644
--- a/test/collision_tests/expected_bindings/_expected_decl_symbol_address_collision_bindings.dart
+++ b/test/collision_tests/expected_bindings/_expected_decl_symbol_address_collision_bindings.dart
@@ -25,16 +25,15 @@
   }
 
   late final __libraryPtr =
-      _lookup<ffi.NativeFunction<Native__library>>('_library');
-  late final __library = __libraryPtr.asFunction<void Function()>();
+      _lookup<ffi.NativeFunction<Native_library>>('_library');
+  late final __library = __libraryPtr.asFunction<Dart_library>();
 
   void _SymbolAddresses_1() {
     return __SymbolAddresses_1();
   }
 
   late final __SymbolAddresses_1Ptr =
-      _lookup<ffi.NativeFunction<Native__SymbolAddresses_1>>(
-          '_SymbolAddresses_1');
+      _lookup<ffi.NativeFunction<ffi.Void Function()>>('_SymbolAddresses_1');
   late final __SymbolAddresses_1 =
       __SymbolAddresses_1Ptr.asFunction<void Function()>();
 
@@ -44,10 +43,10 @@
 class _SymbolAddresses1 {
   final Bindings1 _library1;
   _SymbolAddresses1(this._library1);
-  ffi.Pointer<ffi.NativeFunction<Native__library>> get _library =>
+  ffi.Pointer<ffi.NativeFunction<Native_library>> get _library =>
       _library1.__libraryPtr;
-  ffi.Pointer<ffi.NativeFunction<Native__SymbolAddresses_1>>
-      get _SymbolAddresses_1 => _library1.__SymbolAddresses_1Ptr;
+  ffi.Pointer<ffi.NativeFunction<ffi.Void Function()>> get _SymbolAddresses_1 =>
+      _library1.__SymbolAddresses_1Ptr;
 }
 
 class addresses extends ffi.Opaque {}
@@ -56,5 +55,5 @@
 
 abstract class Bindings {}
 
-typedef Native__library = ffi.Void Function();
-typedef Native__SymbolAddresses_1 = ffi.Void Function();
+typedef Native_library = ffi.Void Function();
+typedef Dart_library = void Function();
diff --git a/test/example_tests/libclang_example_test.dart b/test/example_tests/libclang_example_test.dart
index 7ba17c5..1ca9600 100644
--- a/test/example_tests/libclang_example_test.dart
+++ b/test/example_tests/libclang_example_test.dart
@@ -33,6 +33,9 @@
   ${strings.symbolAddress}:
       ${strings.include}:
         - 'clang_.*'
+  ${strings.exposeFunctionTypedefs}:
+      ${strings.include}:
+        - 'clang_.*'
 ${strings.structs}:
   ${strings.include}:
       - 'CX.*'
diff --git a/test/header_parser_tests/expected_bindings/_expected_functions_bindings.dart b/test/header_parser_tests/expected_bindings/_expected_functions_bindings.dart
index 01c1fde..a5e3276 100644
--- a/test/header_parser_tests/expected_bindings/_expected_functions_bindings.dart
+++ b/test/header_parser_tests/expected_bindings/_expected_functions_bindings.dart
@@ -55,7 +55,10 @@
     );
   }
 
-  late final _func3Ptr = _lookup<ffi.NativeFunction<Native_func3>>('func3');
+  late final _func3Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Double Function(
+              ffi.Float, ffi.Int8, ffi.Int64, ffi.Int32)>>('func3');
   late final _func3 =
       _func3Ptr.asFunction<double Function(double, int, int, int)>();
 
@@ -71,7 +74,12 @@
     );
   }
 
-  late final _func4Ptr = _lookup<ffi.NativeFunction<Native_func4>>('func4');
+  late final _func4Ptr = _lookup<
+      ffi.NativeFunction<
+          ffi.Pointer<ffi.Void> Function(
+              ffi.Pointer<ffi.Pointer<ffi.Int8>>,
+              ffi.Double,
+              ffi.Pointer<ffi.Pointer<ffi.Pointer<ffi.Int32>>>)>>('func4');
   late final _func4 = _func4Ptr.asFunction<
       ffi.Pointer<ffi.Void> Function(ffi.Pointer<ffi.Pointer<ffi.Int8>>, double,
           ffi.Pointer<ffi.Pointer<ffi.Pointer<ffi.Int32>>>)>();
@@ -100,15 +108,18 @@
 class _SymbolAddresses {
   final NativeLibrary _library;
   _SymbolAddresses(this._library);
-  ffi.Pointer<ffi.NativeFunction<Native_func3>> get func3 => _library._func3Ptr;
-  ffi.Pointer<ffi.NativeFunction<Native_func4>> get func4 => _library._func4Ptr;
+  ffi.Pointer<
+          ffi.NativeFunction<
+              ffi.Double Function(ffi.Float, ffi.Int8, ffi.Int64, ffi.Int32)>>
+      get func3 => _library._func3Ptr;
+  ffi.Pointer<
+      ffi.NativeFunction<
+          ffi.Pointer<ffi.Void> Function(
+              ffi.Pointer<ffi.Pointer<ffi.Int8>>,
+              ffi.Double,
+              ffi.Pointer<ffi.Pointer<ffi.Pointer<ffi.Int32>>>)>> get func4 =>
+      _library._func4Ptr;
 }
 
-typedef Native_func3 = ffi.Double Function(
-    ffi.Float arg0, ffi.Int8 a, ffi.Int64 arg2, ffi.Int32 b);
-typedef Native_func4 = ffi.Pointer<ffi.Void> Function(
-    ffi.Pointer<ffi.Pointer<ffi.Int8>> arg0,
-    ffi.Double arg1,
-    ffi.Pointer<ffi.Pointer<ffi.Pointer<ffi.Int32>>> arg2);
 typedef shortHand = ffi.NativeFunction<
     ffi.Void Function(ffi.Pointer<ffi.NativeFunction<ffi.Void Function()>>)>;
