Added wrapper over lookUpbindings, fixed merge conflicts, migrated code (#25)

Closes #10.

Moves the functions from toplevel to a class to facilitate being able to use the bindings more flexibly.

* Replaced config init-function-name with name and description.
* Handled name conflicts - Function-Function, Typedef - Function - Struct/Enum.
* Updated examples and clang_bindings, Updated tests.
diff --git a/example/c_json/cjson_generated_bindings.dart b/example/c_json/cjson_generated_bindings.dart
index e26ed6a..25900b1 100644
--- a/example/c_json/cjson_generated_bindings.dart
+++ b/example/c_json/cjson_generated_bindings.dart
@@ -3,12 +3,1037 @@
 /// Generated by `package:ffigen`.
 import 'dart:ffi' as ffi;
 
-/// Holds the Dynamic library.
-ffi.DynamicLibrary _dylib;
+/// Holds bindings to cJSON.
+class CJson {
+  /// Holds the Dynamic library.
+  final ffi.DynamicLibrary _dylib;
 
-/// Initialises the Dynamic library.
-void init(ffi.DynamicLibrary dynamicLibrary) {
-  _dylib = dynamicLibrary;
+  /// The symbols are looked up in [dynamicLibrary].
+  CJson(ffi.DynamicLibrary dynamicLibrary) : _dylib = dynamicLibrary;
+
+  ffi.Pointer<ffi.Int8> cJSON_Version() {
+    _cJSON_Version ??= _dylib
+        .lookupFunction<_c_cJSON_Version, _dart_cJSON_Version>('cJSON_Version');
+    return _cJSON_Version();
+  }
+
+  _dart_cJSON_Version _cJSON_Version;
+
+  void cJSON_InitHooks(
+    ffi.Pointer<cJSON_Hooks> hooks,
+  ) {
+    _cJSON_InitHooks ??=
+        _dylib.lookupFunction<_c_cJSON_InitHooks, _dart_cJSON_InitHooks>(
+            'cJSON_InitHooks');
+    return _cJSON_InitHooks(
+      hooks,
+    );
+  }
+
+  _dart_cJSON_InitHooks _cJSON_InitHooks;
+
+  ffi.Pointer<cJSON> cJSON_Parse(
+    ffi.Pointer<ffi.Int8> value,
+  ) {
+    _cJSON_Parse ??=
+        _dylib.lookupFunction<_c_cJSON_Parse, _dart_cJSON_Parse>('cJSON_Parse');
+    return _cJSON_Parse(
+      value,
+    );
+  }
+
+  _dart_cJSON_Parse _cJSON_Parse;
+
+  ffi.Pointer<cJSON> cJSON_ParseWithOpts(
+    ffi.Pointer<ffi.Int8> value,
+    ffi.Pointer<ffi.Pointer<ffi.Int8>> return_parse_end,
+    int require_null_terminated,
+  ) {
+    _cJSON_ParseWithOpts ??= _dylib.lookupFunction<_c_cJSON_ParseWithOpts,
+        _dart_cJSON_ParseWithOpts>('cJSON_ParseWithOpts');
+    return _cJSON_ParseWithOpts(
+      value,
+      return_parse_end,
+      require_null_terminated,
+    );
+  }
+
+  _dart_cJSON_ParseWithOpts _cJSON_ParseWithOpts;
+
+  ffi.Pointer<ffi.Int8> cJSON_Print(
+    ffi.Pointer<cJSON> item,
+  ) {
+    _cJSON_Print ??=
+        _dylib.lookupFunction<_c_cJSON_Print, _dart_cJSON_Print>('cJSON_Print');
+    return _cJSON_Print(
+      item,
+    );
+  }
+
+  _dart_cJSON_Print _cJSON_Print;
+
+  ffi.Pointer<ffi.Int8> cJSON_PrintUnformatted(
+    ffi.Pointer<cJSON> item,
+  ) {
+    _cJSON_PrintUnformatted ??= _dylib.lookupFunction<_c_cJSON_PrintUnformatted,
+        _dart_cJSON_PrintUnformatted>('cJSON_PrintUnformatted');
+    return _cJSON_PrintUnformatted(
+      item,
+    );
+  }
+
+  _dart_cJSON_PrintUnformatted _cJSON_PrintUnformatted;
+
+  ffi.Pointer<ffi.Int8> cJSON_PrintBuffered(
+    ffi.Pointer<cJSON> item,
+    int prebuffer,
+    int fmt,
+  ) {
+    _cJSON_PrintBuffered ??= _dylib.lookupFunction<_c_cJSON_PrintBuffered,
+        _dart_cJSON_PrintBuffered>('cJSON_PrintBuffered');
+    return _cJSON_PrintBuffered(
+      item,
+      prebuffer,
+      fmt,
+    );
+  }
+
+  _dart_cJSON_PrintBuffered _cJSON_PrintBuffered;
+
+  int cJSON_PrintPreallocated(
+    ffi.Pointer<cJSON> item,
+    ffi.Pointer<ffi.Int8> buffer,
+    int length,
+    int format,
+  ) {
+    _cJSON_PrintPreallocated ??= _dylib.lookupFunction<
+        _c_cJSON_PrintPreallocated,
+        _dart_cJSON_PrintPreallocated>('cJSON_PrintPreallocated');
+    return _cJSON_PrintPreallocated(
+      item,
+      buffer,
+      length,
+      format,
+    );
+  }
+
+  _dart_cJSON_PrintPreallocated _cJSON_PrintPreallocated;
+
+  void cJSON_Delete(
+    ffi.Pointer<cJSON> item,
+  ) {
+    _cJSON_Delete ??= _dylib
+        .lookupFunction<_c_cJSON_Delete, _dart_cJSON_Delete>('cJSON_Delete');
+    return _cJSON_Delete(
+      item,
+    );
+  }
+
+  _dart_cJSON_Delete _cJSON_Delete;
+
+  int cJSON_GetArraySize(
+    ffi.Pointer<cJSON> array,
+  ) {
+    _cJSON_GetArraySize ??=
+        _dylib.lookupFunction<_c_cJSON_GetArraySize, _dart_cJSON_GetArraySize>(
+            'cJSON_GetArraySize');
+    return _cJSON_GetArraySize(
+      array,
+    );
+  }
+
+  _dart_cJSON_GetArraySize _cJSON_GetArraySize;
+
+  ffi.Pointer<cJSON> cJSON_GetArrayItem(
+    ffi.Pointer<cJSON> array,
+    int index,
+  ) {
+    _cJSON_GetArrayItem ??=
+        _dylib.lookupFunction<_c_cJSON_GetArrayItem, _dart_cJSON_GetArrayItem>(
+            'cJSON_GetArrayItem');
+    return _cJSON_GetArrayItem(
+      array,
+      index,
+    );
+  }
+
+  _dart_cJSON_GetArrayItem _cJSON_GetArrayItem;
+
+  ffi.Pointer<cJSON> cJSON_GetObjectItem(
+    ffi.Pointer<cJSON> object,
+    ffi.Pointer<ffi.Int8> string,
+  ) {
+    _cJSON_GetObjectItem ??= _dylib.lookupFunction<_c_cJSON_GetObjectItem,
+        _dart_cJSON_GetObjectItem>('cJSON_GetObjectItem');
+    return _cJSON_GetObjectItem(
+      object,
+      string,
+    );
+  }
+
+  _dart_cJSON_GetObjectItem _cJSON_GetObjectItem;
+
+  ffi.Pointer<cJSON> cJSON_GetObjectItemCaseSensitive(
+    ffi.Pointer<cJSON> object,
+    ffi.Pointer<ffi.Int8> string,
+  ) {
+    _cJSON_GetObjectItemCaseSensitive ??= _dylib.lookupFunction<
+            _c_cJSON_GetObjectItemCaseSensitive,
+            _dart_cJSON_GetObjectItemCaseSensitive>(
+        'cJSON_GetObjectItemCaseSensitive');
+    return _cJSON_GetObjectItemCaseSensitive(
+      object,
+      string,
+    );
+  }
+
+  _dart_cJSON_GetObjectItemCaseSensitive _cJSON_GetObjectItemCaseSensitive;
+
+  int cJSON_HasObjectItem(
+    ffi.Pointer<cJSON> object,
+    ffi.Pointer<ffi.Int8> string,
+  ) {
+    _cJSON_HasObjectItem ??= _dylib.lookupFunction<_c_cJSON_HasObjectItem,
+        _dart_cJSON_HasObjectItem>('cJSON_HasObjectItem');
+    return _cJSON_HasObjectItem(
+      object,
+      string,
+    );
+  }
+
+  _dart_cJSON_HasObjectItem _cJSON_HasObjectItem;
+
+  ffi.Pointer<ffi.Int8> cJSON_GetErrorPtr() {
+    _cJSON_GetErrorPtr ??=
+        _dylib.lookupFunction<_c_cJSON_GetErrorPtr, _dart_cJSON_GetErrorPtr>(
+            'cJSON_GetErrorPtr');
+    return _cJSON_GetErrorPtr();
+  }
+
+  _dart_cJSON_GetErrorPtr _cJSON_GetErrorPtr;
+
+  ffi.Pointer<ffi.Int8> cJSON_GetStringValue(
+    ffi.Pointer<cJSON> item,
+  ) {
+    _cJSON_GetStringValue ??= _dylib.lookupFunction<_c_cJSON_GetStringValue,
+        _dart_cJSON_GetStringValue>('cJSON_GetStringValue');
+    return _cJSON_GetStringValue(
+      item,
+    );
+  }
+
+  _dart_cJSON_GetStringValue _cJSON_GetStringValue;
+
+  int cJSON_IsInvalid(
+    ffi.Pointer<cJSON> item,
+  ) {
+    _cJSON_IsInvalid ??=
+        _dylib.lookupFunction<_c_cJSON_IsInvalid, _dart_cJSON_IsInvalid>(
+            'cJSON_IsInvalid');
+    return _cJSON_IsInvalid(
+      item,
+    );
+  }
+
+  _dart_cJSON_IsInvalid _cJSON_IsInvalid;
+
+  int cJSON_IsFalse(
+    ffi.Pointer<cJSON> item,
+  ) {
+    _cJSON_IsFalse ??= _dylib
+        .lookupFunction<_c_cJSON_IsFalse, _dart_cJSON_IsFalse>('cJSON_IsFalse');
+    return _cJSON_IsFalse(
+      item,
+    );
+  }
+
+  _dart_cJSON_IsFalse _cJSON_IsFalse;
+
+  int cJSON_IsTrue(
+    ffi.Pointer<cJSON> item,
+  ) {
+    _cJSON_IsTrue ??= _dylib
+        .lookupFunction<_c_cJSON_IsTrue, _dart_cJSON_IsTrue>('cJSON_IsTrue');
+    return _cJSON_IsTrue(
+      item,
+    );
+  }
+
+  _dart_cJSON_IsTrue _cJSON_IsTrue;
+
+  int cJSON_IsBool(
+    ffi.Pointer<cJSON> item,
+  ) {
+    _cJSON_IsBool ??= _dylib
+        .lookupFunction<_c_cJSON_IsBool, _dart_cJSON_IsBool>('cJSON_IsBool');
+    return _cJSON_IsBool(
+      item,
+    );
+  }
+
+  _dart_cJSON_IsBool _cJSON_IsBool;
+
+  int cJSON_IsNull(
+    ffi.Pointer<cJSON> item,
+  ) {
+    _cJSON_IsNull ??= _dylib
+        .lookupFunction<_c_cJSON_IsNull, _dart_cJSON_IsNull>('cJSON_IsNull');
+    return _cJSON_IsNull(
+      item,
+    );
+  }
+
+  _dart_cJSON_IsNull _cJSON_IsNull;
+
+  int cJSON_IsNumber(
+    ffi.Pointer<cJSON> item,
+  ) {
+    _cJSON_IsNumber ??=
+        _dylib.lookupFunction<_c_cJSON_IsNumber, _dart_cJSON_IsNumber>(
+            'cJSON_IsNumber');
+    return _cJSON_IsNumber(
+      item,
+    );
+  }
+
+  _dart_cJSON_IsNumber _cJSON_IsNumber;
+
+  int cJSON_IsString(
+    ffi.Pointer<cJSON> item,
+  ) {
+    _cJSON_IsString ??=
+        _dylib.lookupFunction<_c_cJSON_IsString, _dart_cJSON_IsString>(
+            'cJSON_IsString');
+    return _cJSON_IsString(
+      item,
+    );
+  }
+
+  _dart_cJSON_IsString _cJSON_IsString;
+
+  int cJSON_IsArray(
+    ffi.Pointer<cJSON> item,
+  ) {
+    _cJSON_IsArray ??= _dylib
+        .lookupFunction<_c_cJSON_IsArray, _dart_cJSON_IsArray>('cJSON_IsArray');
+    return _cJSON_IsArray(
+      item,
+    );
+  }
+
+  _dart_cJSON_IsArray _cJSON_IsArray;
+
+  int cJSON_IsObject(
+    ffi.Pointer<cJSON> item,
+  ) {
+    _cJSON_IsObject ??=
+        _dylib.lookupFunction<_c_cJSON_IsObject, _dart_cJSON_IsObject>(
+            'cJSON_IsObject');
+    return _cJSON_IsObject(
+      item,
+    );
+  }
+
+  _dart_cJSON_IsObject _cJSON_IsObject;
+
+  int cJSON_IsRaw(
+    ffi.Pointer<cJSON> item,
+  ) {
+    _cJSON_IsRaw ??=
+        _dylib.lookupFunction<_c_cJSON_IsRaw, _dart_cJSON_IsRaw>('cJSON_IsRaw');
+    return _cJSON_IsRaw(
+      item,
+    );
+  }
+
+  _dart_cJSON_IsRaw _cJSON_IsRaw;
+
+  ffi.Pointer<cJSON> cJSON_CreateNull() {
+    _cJSON_CreateNull ??=
+        _dylib.lookupFunction<_c_cJSON_CreateNull, _dart_cJSON_CreateNull>(
+            'cJSON_CreateNull');
+    return _cJSON_CreateNull();
+  }
+
+  _dart_cJSON_CreateNull _cJSON_CreateNull;
+
+  ffi.Pointer<cJSON> cJSON_CreateTrue() {
+    _cJSON_CreateTrue ??=
+        _dylib.lookupFunction<_c_cJSON_CreateTrue, _dart_cJSON_CreateTrue>(
+            'cJSON_CreateTrue');
+    return _cJSON_CreateTrue();
+  }
+
+  _dart_cJSON_CreateTrue _cJSON_CreateTrue;
+
+  ffi.Pointer<cJSON> cJSON_CreateFalse() {
+    _cJSON_CreateFalse ??=
+        _dylib.lookupFunction<_c_cJSON_CreateFalse, _dart_cJSON_CreateFalse>(
+            'cJSON_CreateFalse');
+    return _cJSON_CreateFalse();
+  }
+
+  _dart_cJSON_CreateFalse _cJSON_CreateFalse;
+
+  ffi.Pointer<cJSON> cJSON_CreateBool(
+    int boolean,
+  ) {
+    _cJSON_CreateBool ??=
+        _dylib.lookupFunction<_c_cJSON_CreateBool, _dart_cJSON_CreateBool>(
+            'cJSON_CreateBool');
+    return _cJSON_CreateBool(
+      boolean,
+    );
+  }
+
+  _dart_cJSON_CreateBool _cJSON_CreateBool;
+
+  ffi.Pointer<cJSON> cJSON_CreateNumber(
+    double num,
+  ) {
+    _cJSON_CreateNumber ??=
+        _dylib.lookupFunction<_c_cJSON_CreateNumber, _dart_cJSON_CreateNumber>(
+            'cJSON_CreateNumber');
+    return _cJSON_CreateNumber(
+      num,
+    );
+  }
+
+  _dart_cJSON_CreateNumber _cJSON_CreateNumber;
+
+  ffi.Pointer<cJSON> cJSON_CreateString(
+    ffi.Pointer<ffi.Int8> string,
+  ) {
+    _cJSON_CreateString ??=
+        _dylib.lookupFunction<_c_cJSON_CreateString, _dart_cJSON_CreateString>(
+            'cJSON_CreateString');
+    return _cJSON_CreateString(
+      string,
+    );
+  }
+
+  _dart_cJSON_CreateString _cJSON_CreateString;
+
+  ffi.Pointer<cJSON> cJSON_CreateRaw(
+    ffi.Pointer<ffi.Int8> raw,
+  ) {
+    _cJSON_CreateRaw ??=
+        _dylib.lookupFunction<_c_cJSON_CreateRaw, _dart_cJSON_CreateRaw>(
+            'cJSON_CreateRaw');
+    return _cJSON_CreateRaw(
+      raw,
+    );
+  }
+
+  _dart_cJSON_CreateRaw _cJSON_CreateRaw;
+
+  ffi.Pointer<cJSON> cJSON_CreateArray() {
+    _cJSON_CreateArray ??=
+        _dylib.lookupFunction<_c_cJSON_CreateArray, _dart_cJSON_CreateArray>(
+            'cJSON_CreateArray');
+    return _cJSON_CreateArray();
+  }
+
+  _dart_cJSON_CreateArray _cJSON_CreateArray;
+
+  ffi.Pointer<cJSON> cJSON_CreateObject() {
+    _cJSON_CreateObject ??=
+        _dylib.lookupFunction<_c_cJSON_CreateObject, _dart_cJSON_CreateObject>(
+            'cJSON_CreateObject');
+    return _cJSON_CreateObject();
+  }
+
+  _dart_cJSON_CreateObject _cJSON_CreateObject;
+
+  ffi.Pointer<cJSON> cJSON_CreateStringReference(
+    ffi.Pointer<ffi.Int8> string,
+  ) {
+    _cJSON_CreateStringReference ??= _dylib.lookupFunction<
+        _c_cJSON_CreateStringReference,
+        _dart_cJSON_CreateStringReference>('cJSON_CreateStringReference');
+    return _cJSON_CreateStringReference(
+      string,
+    );
+  }
+
+  _dart_cJSON_CreateStringReference _cJSON_CreateStringReference;
+
+  ffi.Pointer<cJSON> cJSON_CreateObjectReference(
+    ffi.Pointer<cJSON> child,
+  ) {
+    _cJSON_CreateObjectReference ??= _dylib.lookupFunction<
+        _c_cJSON_CreateObjectReference,
+        _dart_cJSON_CreateObjectReference>('cJSON_CreateObjectReference');
+    return _cJSON_CreateObjectReference(
+      child,
+    );
+  }
+
+  _dart_cJSON_CreateObjectReference _cJSON_CreateObjectReference;
+
+  ffi.Pointer<cJSON> cJSON_CreateArrayReference(
+    ffi.Pointer<cJSON> child,
+  ) {
+    _cJSON_CreateArrayReference ??= _dylib.lookupFunction<
+        _c_cJSON_CreateArrayReference,
+        _dart_cJSON_CreateArrayReference>('cJSON_CreateArrayReference');
+    return _cJSON_CreateArrayReference(
+      child,
+    );
+  }
+
+  _dart_cJSON_CreateArrayReference _cJSON_CreateArrayReference;
+
+  ffi.Pointer<cJSON> cJSON_CreateIntArray(
+    ffi.Pointer<ffi.Int32> numbers,
+    int count,
+  ) {
+    _cJSON_CreateIntArray ??= _dylib.lookupFunction<_c_cJSON_CreateIntArray,
+        _dart_cJSON_CreateIntArray>('cJSON_CreateIntArray');
+    return _cJSON_CreateIntArray(
+      numbers,
+      count,
+    );
+  }
+
+  _dart_cJSON_CreateIntArray _cJSON_CreateIntArray;
+
+  ffi.Pointer<cJSON> cJSON_CreateFloatArray(
+    ffi.Pointer<ffi.Float> numbers,
+    int count,
+  ) {
+    _cJSON_CreateFloatArray ??= _dylib.lookupFunction<_c_cJSON_CreateFloatArray,
+        _dart_cJSON_CreateFloatArray>('cJSON_CreateFloatArray');
+    return _cJSON_CreateFloatArray(
+      numbers,
+      count,
+    );
+  }
+
+  _dart_cJSON_CreateFloatArray _cJSON_CreateFloatArray;
+
+  ffi.Pointer<cJSON> cJSON_CreateDoubleArray(
+    ffi.Pointer<ffi.Double> numbers,
+    int count,
+  ) {
+    _cJSON_CreateDoubleArray ??= _dylib.lookupFunction<
+        _c_cJSON_CreateDoubleArray,
+        _dart_cJSON_CreateDoubleArray>('cJSON_CreateDoubleArray');
+    return _cJSON_CreateDoubleArray(
+      numbers,
+      count,
+    );
+  }
+
+  _dart_cJSON_CreateDoubleArray _cJSON_CreateDoubleArray;
+
+  ffi.Pointer<cJSON> cJSON_CreateStringArray(
+    ffi.Pointer<ffi.Pointer<ffi.Int8>> strings,
+    int count,
+  ) {
+    _cJSON_CreateStringArray ??= _dylib.lookupFunction<
+        _c_cJSON_CreateStringArray,
+        _dart_cJSON_CreateStringArray>('cJSON_CreateStringArray');
+    return _cJSON_CreateStringArray(
+      strings,
+      count,
+    );
+  }
+
+  _dart_cJSON_CreateStringArray _cJSON_CreateStringArray;
+
+  void cJSON_AddItemToArray(
+    ffi.Pointer<cJSON> array,
+    ffi.Pointer<cJSON> item,
+  ) {
+    _cJSON_AddItemToArray ??= _dylib.lookupFunction<_c_cJSON_AddItemToArray,
+        _dart_cJSON_AddItemToArray>('cJSON_AddItemToArray');
+    return _cJSON_AddItemToArray(
+      array,
+      item,
+    );
+  }
+
+  _dart_cJSON_AddItemToArray _cJSON_AddItemToArray;
+
+  void cJSON_AddItemToObject(
+    ffi.Pointer<cJSON> object,
+    ffi.Pointer<ffi.Int8> string,
+    ffi.Pointer<cJSON> item,
+  ) {
+    _cJSON_AddItemToObject ??= _dylib.lookupFunction<_c_cJSON_AddItemToObject,
+        _dart_cJSON_AddItemToObject>('cJSON_AddItemToObject');
+    return _cJSON_AddItemToObject(
+      object,
+      string,
+      item,
+    );
+  }
+
+  _dart_cJSON_AddItemToObject _cJSON_AddItemToObject;
+
+  void cJSON_AddItemToObjectCS(
+    ffi.Pointer<cJSON> object,
+    ffi.Pointer<ffi.Int8> string,
+    ffi.Pointer<cJSON> item,
+  ) {
+    _cJSON_AddItemToObjectCS ??= _dylib.lookupFunction<
+        _c_cJSON_AddItemToObjectCS,
+        _dart_cJSON_AddItemToObjectCS>('cJSON_AddItemToObjectCS');
+    return _cJSON_AddItemToObjectCS(
+      object,
+      string,
+      item,
+    );
+  }
+
+  _dart_cJSON_AddItemToObjectCS _cJSON_AddItemToObjectCS;
+
+  void cJSON_AddItemReferenceToArray(
+    ffi.Pointer<cJSON> array,
+    ffi.Pointer<cJSON> item,
+  ) {
+    _cJSON_AddItemReferenceToArray ??= _dylib.lookupFunction<
+        _c_cJSON_AddItemReferenceToArray,
+        _dart_cJSON_AddItemReferenceToArray>('cJSON_AddItemReferenceToArray');
+    return _cJSON_AddItemReferenceToArray(
+      array,
+      item,
+    );
+  }
+
+  _dart_cJSON_AddItemReferenceToArray _cJSON_AddItemReferenceToArray;
+
+  void cJSON_AddItemReferenceToObject(
+    ffi.Pointer<cJSON> object,
+    ffi.Pointer<ffi.Int8> string,
+    ffi.Pointer<cJSON> item,
+  ) {
+    _cJSON_AddItemReferenceToObject ??= _dylib.lookupFunction<
+        _c_cJSON_AddItemReferenceToObject,
+        _dart_cJSON_AddItemReferenceToObject>('cJSON_AddItemReferenceToObject');
+    return _cJSON_AddItemReferenceToObject(
+      object,
+      string,
+      item,
+    );
+  }
+
+  _dart_cJSON_AddItemReferenceToObject _cJSON_AddItemReferenceToObject;
+
+  ffi.Pointer<cJSON> cJSON_DetachItemViaPointer(
+    ffi.Pointer<cJSON> parent,
+    ffi.Pointer<cJSON> item,
+  ) {
+    _cJSON_DetachItemViaPointer ??= _dylib.lookupFunction<
+        _c_cJSON_DetachItemViaPointer,
+        _dart_cJSON_DetachItemViaPointer>('cJSON_DetachItemViaPointer');
+    return _cJSON_DetachItemViaPointer(
+      parent,
+      item,
+    );
+  }
+
+  _dart_cJSON_DetachItemViaPointer _cJSON_DetachItemViaPointer;
+
+  ffi.Pointer<cJSON> cJSON_DetachItemFromArray(
+    ffi.Pointer<cJSON> array,
+    int which,
+  ) {
+    _cJSON_DetachItemFromArray ??= _dylib.lookupFunction<
+        _c_cJSON_DetachItemFromArray,
+        _dart_cJSON_DetachItemFromArray>('cJSON_DetachItemFromArray');
+    return _cJSON_DetachItemFromArray(
+      array,
+      which,
+    );
+  }
+
+  _dart_cJSON_DetachItemFromArray _cJSON_DetachItemFromArray;
+
+  void cJSON_DeleteItemFromArray(
+    ffi.Pointer<cJSON> array,
+    int which,
+  ) {
+    _cJSON_DeleteItemFromArray ??= _dylib.lookupFunction<
+        _c_cJSON_DeleteItemFromArray,
+        _dart_cJSON_DeleteItemFromArray>('cJSON_DeleteItemFromArray');
+    return _cJSON_DeleteItemFromArray(
+      array,
+      which,
+    );
+  }
+
+  _dart_cJSON_DeleteItemFromArray _cJSON_DeleteItemFromArray;
+
+  ffi.Pointer<cJSON> cJSON_DetachItemFromObject(
+    ffi.Pointer<cJSON> object,
+    ffi.Pointer<ffi.Int8> string,
+  ) {
+    _cJSON_DetachItemFromObject ??= _dylib.lookupFunction<
+        _c_cJSON_DetachItemFromObject,
+        _dart_cJSON_DetachItemFromObject>('cJSON_DetachItemFromObject');
+    return _cJSON_DetachItemFromObject(
+      object,
+      string,
+    );
+  }
+
+  _dart_cJSON_DetachItemFromObject _cJSON_DetachItemFromObject;
+
+  ffi.Pointer<cJSON> cJSON_DetachItemFromObjectCaseSensitive(
+    ffi.Pointer<cJSON> object,
+    ffi.Pointer<ffi.Int8> string,
+  ) {
+    _cJSON_DetachItemFromObjectCaseSensitive ??= _dylib.lookupFunction<
+            _c_cJSON_DetachItemFromObjectCaseSensitive,
+            _dart_cJSON_DetachItemFromObjectCaseSensitive>(
+        'cJSON_DetachItemFromObjectCaseSensitive');
+    return _cJSON_DetachItemFromObjectCaseSensitive(
+      object,
+      string,
+    );
+  }
+
+  _dart_cJSON_DetachItemFromObjectCaseSensitive
+      _cJSON_DetachItemFromObjectCaseSensitive;
+
+  void cJSON_DeleteItemFromObject(
+    ffi.Pointer<cJSON> object,
+    ffi.Pointer<ffi.Int8> string,
+  ) {
+    _cJSON_DeleteItemFromObject ??= _dylib.lookupFunction<
+        _c_cJSON_DeleteItemFromObject,
+        _dart_cJSON_DeleteItemFromObject>('cJSON_DeleteItemFromObject');
+    return _cJSON_DeleteItemFromObject(
+      object,
+      string,
+    );
+  }
+
+  _dart_cJSON_DeleteItemFromObject _cJSON_DeleteItemFromObject;
+
+  void cJSON_DeleteItemFromObjectCaseSensitive(
+    ffi.Pointer<cJSON> object,
+    ffi.Pointer<ffi.Int8> string,
+  ) {
+    _cJSON_DeleteItemFromObjectCaseSensitive ??= _dylib.lookupFunction<
+            _c_cJSON_DeleteItemFromObjectCaseSensitive,
+            _dart_cJSON_DeleteItemFromObjectCaseSensitive>(
+        'cJSON_DeleteItemFromObjectCaseSensitive');
+    return _cJSON_DeleteItemFromObjectCaseSensitive(
+      object,
+      string,
+    );
+  }
+
+  _dart_cJSON_DeleteItemFromObjectCaseSensitive
+      _cJSON_DeleteItemFromObjectCaseSensitive;
+
+  void cJSON_InsertItemInArray(
+    ffi.Pointer<cJSON> array,
+    int which,
+    ffi.Pointer<cJSON> newitem,
+  ) {
+    _cJSON_InsertItemInArray ??= _dylib.lookupFunction<
+        _c_cJSON_InsertItemInArray,
+        _dart_cJSON_InsertItemInArray>('cJSON_InsertItemInArray');
+    return _cJSON_InsertItemInArray(
+      array,
+      which,
+      newitem,
+    );
+  }
+
+  _dart_cJSON_InsertItemInArray _cJSON_InsertItemInArray;
+
+  int cJSON_ReplaceItemViaPointer(
+    ffi.Pointer<cJSON> parent,
+    ffi.Pointer<cJSON> item,
+    ffi.Pointer<cJSON> replacement,
+  ) {
+    _cJSON_ReplaceItemViaPointer ??= _dylib.lookupFunction<
+        _c_cJSON_ReplaceItemViaPointer,
+        _dart_cJSON_ReplaceItemViaPointer>('cJSON_ReplaceItemViaPointer');
+    return _cJSON_ReplaceItemViaPointer(
+      parent,
+      item,
+      replacement,
+    );
+  }
+
+  _dart_cJSON_ReplaceItemViaPointer _cJSON_ReplaceItemViaPointer;
+
+  void cJSON_ReplaceItemInArray(
+    ffi.Pointer<cJSON> array,
+    int which,
+    ffi.Pointer<cJSON> newitem,
+  ) {
+    _cJSON_ReplaceItemInArray ??= _dylib.lookupFunction<
+        _c_cJSON_ReplaceItemInArray,
+        _dart_cJSON_ReplaceItemInArray>('cJSON_ReplaceItemInArray');
+    return _cJSON_ReplaceItemInArray(
+      array,
+      which,
+      newitem,
+    );
+  }
+
+  _dart_cJSON_ReplaceItemInArray _cJSON_ReplaceItemInArray;
+
+  void cJSON_ReplaceItemInObject(
+    ffi.Pointer<cJSON> object,
+    ffi.Pointer<ffi.Int8> string,
+    ffi.Pointer<cJSON> newitem,
+  ) {
+    _cJSON_ReplaceItemInObject ??= _dylib.lookupFunction<
+        _c_cJSON_ReplaceItemInObject,
+        _dart_cJSON_ReplaceItemInObject>('cJSON_ReplaceItemInObject');
+    return _cJSON_ReplaceItemInObject(
+      object,
+      string,
+      newitem,
+    );
+  }
+
+  _dart_cJSON_ReplaceItemInObject _cJSON_ReplaceItemInObject;
+
+  void cJSON_ReplaceItemInObjectCaseSensitive(
+    ffi.Pointer<cJSON> object,
+    ffi.Pointer<ffi.Int8> string,
+    ffi.Pointer<cJSON> newitem,
+  ) {
+    _cJSON_ReplaceItemInObjectCaseSensitive ??= _dylib.lookupFunction<
+            _c_cJSON_ReplaceItemInObjectCaseSensitive,
+            _dart_cJSON_ReplaceItemInObjectCaseSensitive>(
+        'cJSON_ReplaceItemInObjectCaseSensitive');
+    return _cJSON_ReplaceItemInObjectCaseSensitive(
+      object,
+      string,
+      newitem,
+    );
+  }
+
+  _dart_cJSON_ReplaceItemInObjectCaseSensitive
+      _cJSON_ReplaceItemInObjectCaseSensitive;
+
+  ffi.Pointer<cJSON> cJSON_Duplicate(
+    ffi.Pointer<cJSON> item,
+    int recurse,
+  ) {
+    _cJSON_Duplicate ??=
+        _dylib.lookupFunction<_c_cJSON_Duplicate, _dart_cJSON_Duplicate>(
+            'cJSON_Duplicate');
+    return _cJSON_Duplicate(
+      item,
+      recurse,
+    );
+  }
+
+  _dart_cJSON_Duplicate _cJSON_Duplicate;
+
+  int cJSON_Compare(
+    ffi.Pointer<cJSON> a,
+    ffi.Pointer<cJSON> b,
+    int case_sensitive,
+  ) {
+    _cJSON_Compare ??= _dylib
+        .lookupFunction<_c_cJSON_Compare, _dart_cJSON_Compare>('cJSON_Compare');
+    return _cJSON_Compare(
+      a,
+      b,
+      case_sensitive,
+    );
+  }
+
+  _dart_cJSON_Compare _cJSON_Compare;
+
+  void cJSON_Minify(
+    ffi.Pointer<ffi.Int8> json,
+  ) {
+    _cJSON_Minify ??= _dylib
+        .lookupFunction<_c_cJSON_Minify, _dart_cJSON_Minify>('cJSON_Minify');
+    return _cJSON_Minify(
+      json,
+    );
+  }
+
+  _dart_cJSON_Minify _cJSON_Minify;
+
+  ffi.Pointer<cJSON> cJSON_AddNullToObject(
+    ffi.Pointer<cJSON> object,
+    ffi.Pointer<ffi.Int8> name,
+  ) {
+    _cJSON_AddNullToObject ??= _dylib.lookupFunction<_c_cJSON_AddNullToObject,
+        _dart_cJSON_AddNullToObject>('cJSON_AddNullToObject');
+    return _cJSON_AddNullToObject(
+      object,
+      name,
+    );
+  }
+
+  _dart_cJSON_AddNullToObject _cJSON_AddNullToObject;
+
+  ffi.Pointer<cJSON> cJSON_AddTrueToObject(
+    ffi.Pointer<cJSON> object,
+    ffi.Pointer<ffi.Int8> name,
+  ) {
+    _cJSON_AddTrueToObject ??= _dylib.lookupFunction<_c_cJSON_AddTrueToObject,
+        _dart_cJSON_AddTrueToObject>('cJSON_AddTrueToObject');
+    return _cJSON_AddTrueToObject(
+      object,
+      name,
+    );
+  }
+
+  _dart_cJSON_AddTrueToObject _cJSON_AddTrueToObject;
+
+  ffi.Pointer<cJSON> cJSON_AddFalseToObject(
+    ffi.Pointer<cJSON> object,
+    ffi.Pointer<ffi.Int8> name,
+  ) {
+    _cJSON_AddFalseToObject ??= _dylib.lookupFunction<_c_cJSON_AddFalseToObject,
+        _dart_cJSON_AddFalseToObject>('cJSON_AddFalseToObject');
+    return _cJSON_AddFalseToObject(
+      object,
+      name,
+    );
+  }
+
+  _dart_cJSON_AddFalseToObject _cJSON_AddFalseToObject;
+
+  ffi.Pointer<cJSON> cJSON_AddBoolToObject(
+    ffi.Pointer<cJSON> object,
+    ffi.Pointer<ffi.Int8> name,
+    int boolean,
+  ) {
+    _cJSON_AddBoolToObject ??= _dylib.lookupFunction<_c_cJSON_AddBoolToObject,
+        _dart_cJSON_AddBoolToObject>('cJSON_AddBoolToObject');
+    return _cJSON_AddBoolToObject(
+      object,
+      name,
+      boolean,
+    );
+  }
+
+  _dart_cJSON_AddBoolToObject _cJSON_AddBoolToObject;
+
+  ffi.Pointer<cJSON> cJSON_AddNumberToObject(
+    ffi.Pointer<cJSON> object,
+    ffi.Pointer<ffi.Int8> name,
+    double number,
+  ) {
+    _cJSON_AddNumberToObject ??= _dylib.lookupFunction<
+        _c_cJSON_AddNumberToObject,
+        _dart_cJSON_AddNumberToObject>('cJSON_AddNumberToObject');
+    return _cJSON_AddNumberToObject(
+      object,
+      name,
+      number,
+    );
+  }
+
+  _dart_cJSON_AddNumberToObject _cJSON_AddNumberToObject;
+
+  ffi.Pointer<cJSON> cJSON_AddStringToObject(
+    ffi.Pointer<cJSON> object,
+    ffi.Pointer<ffi.Int8> name,
+    ffi.Pointer<ffi.Int8> string,
+  ) {
+    _cJSON_AddStringToObject ??= _dylib.lookupFunction<
+        _c_cJSON_AddStringToObject,
+        _dart_cJSON_AddStringToObject>('cJSON_AddStringToObject');
+    return _cJSON_AddStringToObject(
+      object,
+      name,
+      string,
+    );
+  }
+
+  _dart_cJSON_AddStringToObject _cJSON_AddStringToObject;
+
+  ffi.Pointer<cJSON> cJSON_AddRawToObject(
+    ffi.Pointer<cJSON> object,
+    ffi.Pointer<ffi.Int8> name,
+    ffi.Pointer<ffi.Int8> raw,
+  ) {
+    _cJSON_AddRawToObject ??= _dylib.lookupFunction<_c_cJSON_AddRawToObject,
+        _dart_cJSON_AddRawToObject>('cJSON_AddRawToObject');
+    return _cJSON_AddRawToObject(
+      object,
+      name,
+      raw,
+    );
+  }
+
+  _dart_cJSON_AddRawToObject _cJSON_AddRawToObject;
+
+  ffi.Pointer<cJSON> cJSON_AddObjectToObject(
+    ffi.Pointer<cJSON> object,
+    ffi.Pointer<ffi.Int8> name,
+  ) {
+    _cJSON_AddObjectToObject ??= _dylib.lookupFunction<
+        _c_cJSON_AddObjectToObject,
+        _dart_cJSON_AddObjectToObject>('cJSON_AddObjectToObject');
+    return _cJSON_AddObjectToObject(
+      object,
+      name,
+    );
+  }
+
+  _dart_cJSON_AddObjectToObject _cJSON_AddObjectToObject;
+
+  ffi.Pointer<cJSON> cJSON_AddArrayToObject(
+    ffi.Pointer<cJSON> object,
+    ffi.Pointer<ffi.Int8> name,
+  ) {
+    _cJSON_AddArrayToObject ??= _dylib.lookupFunction<_c_cJSON_AddArrayToObject,
+        _dart_cJSON_AddArrayToObject>('cJSON_AddArrayToObject');
+    return _cJSON_AddArrayToObject(
+      object,
+      name,
+    );
+  }
+
+  _dart_cJSON_AddArrayToObject _cJSON_AddArrayToObject;
+
+  double cJSON_SetNumberHelper(
+    ffi.Pointer<cJSON> object,
+    double number,
+  ) {
+    _cJSON_SetNumberHelper ??= _dylib.lookupFunction<_c_cJSON_SetNumberHelper,
+        _dart_cJSON_SetNumberHelper>('cJSON_SetNumberHelper');
+    return _cJSON_SetNumberHelper(
+      object,
+      number,
+    );
+  }
+
+  _dart_cJSON_SetNumberHelper _cJSON_SetNumberHelper;
+
+  ffi.Pointer<ffi.Void> cJSON_malloc(
+    int size,
+  ) {
+    _cJSON_malloc ??= _dylib
+        .lookupFunction<_c_cJSON_malloc, _dart_cJSON_malloc>('cJSON_malloc');
+    return _cJSON_malloc(
+      size,
+    );
+  }
+
+  _dart_cJSON_malloc _cJSON_malloc;
+
+  void cJSON_free(
+    ffi.Pointer<ffi.Void> object,
+  ) {
+    _cJSON_free ??=
+        _dylib.lookupFunction<_c_cJSON_free, _dart_cJSON_free>('cJSON_free');
+    return _cJSON_free(
+      object,
+    );
+  }
+
+  _dart_cJSON_free _cJSON_free;
 }
 
 class cJSON extends ffi.Struct {
@@ -32,43 +1057,16 @@
   ffi.Pointer<ffi.Int8> string;
 }
 
-typedef _typedefC_1 = ffi.Pointer<ffi.Void> Function(
-  ffi.Uint64,
-);
-
-typedef _typedefC_2 = ffi.Void Function(
-  ffi.Pointer<ffi.Void>,
-);
-
 class cJSON_Hooks extends ffi.Struct {
   ffi.Pointer<ffi.NativeFunction<_typedefC_1>> malloc_fn;
 
   ffi.Pointer<ffi.NativeFunction<_typedefC_2>> free_fn;
 }
 
-ffi.Pointer<ffi.Int8> cJSON_Version() {
-  return _cJSON_Version();
-}
-
-final _dart_cJSON_Version _cJSON_Version = _dylib
-    .lookupFunction<_c_cJSON_Version, _dart_cJSON_Version>('cJSON_Version');
-
 typedef _c_cJSON_Version = ffi.Pointer<ffi.Int8> Function();
 
 typedef _dart_cJSON_Version = ffi.Pointer<ffi.Int8> Function();
 
-void cJSON_InitHooks(
-  ffi.Pointer<cJSON_Hooks> hooks,
-) {
-  return _cJSON_InitHooks(
-    hooks,
-  );
-}
-
-final _dart_cJSON_InitHooks _cJSON_InitHooks =
-    _dylib.lookupFunction<_c_cJSON_InitHooks, _dart_cJSON_InitHooks>(
-        'cJSON_InitHooks');
-
 typedef _c_cJSON_InitHooks = ffi.Void Function(
   ffi.Pointer<cJSON_Hooks> hooks,
 );
@@ -77,17 +1075,6 @@
   ffi.Pointer<cJSON_Hooks> hooks,
 );
 
-ffi.Pointer<cJSON> cJSON_Parse(
-  ffi.Pointer<ffi.Int8> value,
-) {
-  return _cJSON_Parse(
-    value,
-  );
-}
-
-final _dart_cJSON_Parse _cJSON_Parse =
-    _dylib.lookupFunction<_c_cJSON_Parse, _dart_cJSON_Parse>('cJSON_Parse');
-
 typedef _c_cJSON_Parse = ffi.Pointer<cJSON> Function(
   ffi.Pointer<ffi.Int8> value,
 );
@@ -96,22 +1083,6 @@
   ffi.Pointer<ffi.Int8> value,
 );
 
-ffi.Pointer<cJSON> cJSON_ParseWithOpts(
-  ffi.Pointer<ffi.Int8> value,
-  ffi.Pointer<ffi.Pointer<ffi.Int8>> return_parse_end,
-  int require_null_terminated,
-) {
-  return _cJSON_ParseWithOpts(
-    value,
-    return_parse_end,
-    require_null_terminated,
-  );
-}
-
-final _dart_cJSON_ParseWithOpts _cJSON_ParseWithOpts =
-    _dylib.lookupFunction<_c_cJSON_ParseWithOpts, _dart_cJSON_ParseWithOpts>(
-        'cJSON_ParseWithOpts');
-
 typedef _c_cJSON_ParseWithOpts = ffi.Pointer<cJSON> Function(
   ffi.Pointer<ffi.Int8> value,
   ffi.Pointer<ffi.Pointer<ffi.Int8>> return_parse_end,
@@ -124,17 +1095,6 @@
   int require_null_terminated,
 );
 
-ffi.Pointer<ffi.Int8> cJSON_Print(
-  ffi.Pointer<cJSON> item,
-) {
-  return _cJSON_Print(
-    item,
-  );
-}
-
-final _dart_cJSON_Print _cJSON_Print =
-    _dylib.lookupFunction<_c_cJSON_Print, _dart_cJSON_Print>('cJSON_Print');
-
 typedef _c_cJSON_Print = ffi.Pointer<ffi.Int8> Function(
   ffi.Pointer<cJSON> item,
 );
@@ -143,18 +1103,6 @@
   ffi.Pointer<cJSON> item,
 );
 
-ffi.Pointer<ffi.Int8> cJSON_PrintUnformatted(
-  ffi.Pointer<cJSON> item,
-) {
-  return _cJSON_PrintUnformatted(
-    item,
-  );
-}
-
-final _dart_cJSON_PrintUnformatted _cJSON_PrintUnformatted = _dylib
-    .lookupFunction<_c_cJSON_PrintUnformatted, _dart_cJSON_PrintUnformatted>(
-        'cJSON_PrintUnformatted');
-
 typedef _c_cJSON_PrintUnformatted = ffi.Pointer<ffi.Int8> Function(
   ffi.Pointer<cJSON> item,
 );
@@ -163,22 +1111,6 @@
   ffi.Pointer<cJSON> item,
 );
 
-ffi.Pointer<ffi.Int8> cJSON_PrintBuffered(
-  ffi.Pointer<cJSON> item,
-  int prebuffer,
-  int fmt,
-) {
-  return _cJSON_PrintBuffered(
-    item,
-    prebuffer,
-    fmt,
-  );
-}
-
-final _dart_cJSON_PrintBuffered _cJSON_PrintBuffered =
-    _dylib.lookupFunction<_c_cJSON_PrintBuffered, _dart_cJSON_PrintBuffered>(
-        'cJSON_PrintBuffered');
-
 typedef _c_cJSON_PrintBuffered = ffi.Pointer<ffi.Int8> Function(
   ffi.Pointer<cJSON> item,
   ffi.Int32 prebuffer,
@@ -191,24 +1123,6 @@
   int fmt,
 );
 
-int cJSON_PrintPreallocated(
-  ffi.Pointer<cJSON> item,
-  ffi.Pointer<ffi.Int8> buffer,
-  int length,
-  int format,
-) {
-  return _cJSON_PrintPreallocated(
-    item,
-    buffer,
-    length,
-    format,
-  );
-}
-
-final _dart_cJSON_PrintPreallocated _cJSON_PrintPreallocated = _dylib
-    .lookupFunction<_c_cJSON_PrintPreallocated, _dart_cJSON_PrintPreallocated>(
-        'cJSON_PrintPreallocated');
-
 typedef _c_cJSON_PrintPreallocated = ffi.Int32 Function(
   ffi.Pointer<cJSON> item,
   ffi.Pointer<ffi.Int8> buffer,
@@ -223,17 +1137,6 @@
   int format,
 );
 
-void cJSON_Delete(
-  ffi.Pointer<cJSON> item,
-) {
-  return _cJSON_Delete(
-    item,
-  );
-}
-
-final _dart_cJSON_Delete _cJSON_Delete =
-    _dylib.lookupFunction<_c_cJSON_Delete, _dart_cJSON_Delete>('cJSON_Delete');
-
 typedef _c_cJSON_Delete = ffi.Void Function(
   ffi.Pointer<cJSON> item,
 );
@@ -242,18 +1145,6 @@
   ffi.Pointer<cJSON> item,
 );
 
-int cJSON_GetArraySize(
-  ffi.Pointer<cJSON> array,
-) {
-  return _cJSON_GetArraySize(
-    array,
-  );
-}
-
-final _dart_cJSON_GetArraySize _cJSON_GetArraySize =
-    _dylib.lookupFunction<_c_cJSON_GetArraySize, _dart_cJSON_GetArraySize>(
-        'cJSON_GetArraySize');
-
 typedef _c_cJSON_GetArraySize = ffi.Int32 Function(
   ffi.Pointer<cJSON> array,
 );
@@ -262,20 +1153,6 @@
   ffi.Pointer<cJSON> array,
 );
 
-ffi.Pointer<cJSON> cJSON_GetArrayItem(
-  ffi.Pointer<cJSON> array,
-  int index,
-) {
-  return _cJSON_GetArrayItem(
-    array,
-    index,
-  );
-}
-
-final _dart_cJSON_GetArrayItem _cJSON_GetArrayItem =
-    _dylib.lookupFunction<_c_cJSON_GetArrayItem, _dart_cJSON_GetArrayItem>(
-        'cJSON_GetArrayItem');
-
 typedef _c_cJSON_GetArrayItem = ffi.Pointer<cJSON> Function(
   ffi.Pointer<cJSON> array,
   ffi.Int32 index,
@@ -286,20 +1163,6 @@
   int index,
 );
 
-ffi.Pointer<cJSON> cJSON_GetObjectItem(
-  ffi.Pointer<cJSON> object,
-  ffi.Pointer<ffi.Int8> string,
-) {
-  return _cJSON_GetObjectItem(
-    object,
-    string,
-  );
-}
-
-final _dart_cJSON_GetObjectItem _cJSON_GetObjectItem =
-    _dylib.lookupFunction<_c_cJSON_GetObjectItem, _dart_cJSON_GetObjectItem>(
-        'cJSON_GetObjectItem');
-
 typedef _c_cJSON_GetObjectItem = ffi.Pointer<cJSON> Function(
   ffi.Pointer<cJSON> object,
   ffi.Pointer<ffi.Int8> string,
@@ -310,21 +1173,6 @@
   ffi.Pointer<ffi.Int8> string,
 );
 
-ffi.Pointer<cJSON> cJSON_GetObjectItemCaseSensitive(
-  ffi.Pointer<cJSON> object,
-  ffi.Pointer<ffi.Int8> string,
-) {
-  return _cJSON_GetObjectItemCaseSensitive(
-    object,
-    string,
-  );
-}
-
-final _dart_cJSON_GetObjectItemCaseSensitive _cJSON_GetObjectItemCaseSensitive =
-    _dylib.lookupFunction<_c_cJSON_GetObjectItemCaseSensitive,
-            _dart_cJSON_GetObjectItemCaseSensitive>(
-        'cJSON_GetObjectItemCaseSensitive');
-
 typedef _c_cJSON_GetObjectItemCaseSensitive = ffi.Pointer<cJSON> Function(
   ffi.Pointer<cJSON> object,
   ffi.Pointer<ffi.Int8> string,
@@ -335,20 +1183,6 @@
   ffi.Pointer<ffi.Int8> string,
 );
 
-int cJSON_HasObjectItem(
-  ffi.Pointer<cJSON> object,
-  ffi.Pointer<ffi.Int8> string,
-) {
-  return _cJSON_HasObjectItem(
-    object,
-    string,
-  );
-}
-
-final _dart_cJSON_HasObjectItem _cJSON_HasObjectItem =
-    _dylib.lookupFunction<_c_cJSON_HasObjectItem, _dart_cJSON_HasObjectItem>(
-        'cJSON_HasObjectItem');
-
 typedef _c_cJSON_HasObjectItem = ffi.Int32 Function(
   ffi.Pointer<cJSON> object,
   ffi.Pointer<ffi.Int8> string,
@@ -359,30 +1193,10 @@
   ffi.Pointer<ffi.Int8> string,
 );
 
-ffi.Pointer<ffi.Int8> cJSON_GetErrorPtr() {
-  return _cJSON_GetErrorPtr();
-}
-
-final _dart_cJSON_GetErrorPtr _cJSON_GetErrorPtr =
-    _dylib.lookupFunction<_c_cJSON_GetErrorPtr, _dart_cJSON_GetErrorPtr>(
-        'cJSON_GetErrorPtr');
-
 typedef _c_cJSON_GetErrorPtr = ffi.Pointer<ffi.Int8> Function();
 
 typedef _dart_cJSON_GetErrorPtr = ffi.Pointer<ffi.Int8> Function();
 
-ffi.Pointer<ffi.Int8> cJSON_GetStringValue(
-  ffi.Pointer<cJSON> item,
-) {
-  return _cJSON_GetStringValue(
-    item,
-  );
-}
-
-final _dart_cJSON_GetStringValue _cJSON_GetStringValue =
-    _dylib.lookupFunction<_c_cJSON_GetStringValue, _dart_cJSON_GetStringValue>(
-        'cJSON_GetStringValue');
-
 typedef _c_cJSON_GetStringValue = ffi.Pointer<ffi.Int8> Function(
   ffi.Pointer<cJSON> item,
 );
@@ -391,18 +1205,6 @@
   ffi.Pointer<cJSON> item,
 );
 
-int cJSON_IsInvalid(
-  ffi.Pointer<cJSON> item,
-) {
-  return _cJSON_IsInvalid(
-    item,
-  );
-}
-
-final _dart_cJSON_IsInvalid _cJSON_IsInvalid =
-    _dylib.lookupFunction<_c_cJSON_IsInvalid, _dart_cJSON_IsInvalid>(
-        'cJSON_IsInvalid');
-
 typedef _c_cJSON_IsInvalid = ffi.Int32 Function(
   ffi.Pointer<cJSON> item,
 );
@@ -411,17 +1213,6 @@
   ffi.Pointer<cJSON> item,
 );
 
-int cJSON_IsFalse(
-  ffi.Pointer<cJSON> item,
-) {
-  return _cJSON_IsFalse(
-    item,
-  );
-}
-
-final _dart_cJSON_IsFalse _cJSON_IsFalse = _dylib
-    .lookupFunction<_c_cJSON_IsFalse, _dart_cJSON_IsFalse>('cJSON_IsFalse');
-
 typedef _c_cJSON_IsFalse = ffi.Int32 Function(
   ffi.Pointer<cJSON> item,
 );
@@ -430,17 +1221,6 @@
   ffi.Pointer<cJSON> item,
 );
 
-int cJSON_IsTrue(
-  ffi.Pointer<cJSON> item,
-) {
-  return _cJSON_IsTrue(
-    item,
-  );
-}
-
-final _dart_cJSON_IsTrue _cJSON_IsTrue =
-    _dylib.lookupFunction<_c_cJSON_IsTrue, _dart_cJSON_IsTrue>('cJSON_IsTrue');
-
 typedef _c_cJSON_IsTrue = ffi.Int32 Function(
   ffi.Pointer<cJSON> item,
 );
@@ -449,17 +1229,6 @@
   ffi.Pointer<cJSON> item,
 );
 
-int cJSON_IsBool(
-  ffi.Pointer<cJSON> item,
-) {
-  return _cJSON_IsBool(
-    item,
-  );
-}
-
-final _dart_cJSON_IsBool _cJSON_IsBool =
-    _dylib.lookupFunction<_c_cJSON_IsBool, _dart_cJSON_IsBool>('cJSON_IsBool');
-
 typedef _c_cJSON_IsBool = ffi.Int32 Function(
   ffi.Pointer<cJSON> item,
 );
@@ -468,17 +1237,6 @@
   ffi.Pointer<cJSON> item,
 );
 
-int cJSON_IsNull(
-  ffi.Pointer<cJSON> item,
-) {
-  return _cJSON_IsNull(
-    item,
-  );
-}
-
-final _dart_cJSON_IsNull _cJSON_IsNull =
-    _dylib.lookupFunction<_c_cJSON_IsNull, _dart_cJSON_IsNull>('cJSON_IsNull');
-
 typedef _c_cJSON_IsNull = ffi.Int32 Function(
   ffi.Pointer<cJSON> item,
 );
@@ -487,17 +1245,6 @@
   ffi.Pointer<cJSON> item,
 );
 
-int cJSON_IsNumber(
-  ffi.Pointer<cJSON> item,
-) {
-  return _cJSON_IsNumber(
-    item,
-  );
-}
-
-final _dart_cJSON_IsNumber _cJSON_IsNumber = _dylib
-    .lookupFunction<_c_cJSON_IsNumber, _dart_cJSON_IsNumber>('cJSON_IsNumber');
-
 typedef _c_cJSON_IsNumber = ffi.Int32 Function(
   ffi.Pointer<cJSON> item,
 );
@@ -506,17 +1253,6 @@
   ffi.Pointer<cJSON> item,
 );
 
-int cJSON_IsString(
-  ffi.Pointer<cJSON> item,
-) {
-  return _cJSON_IsString(
-    item,
-  );
-}
-
-final _dart_cJSON_IsString _cJSON_IsString = _dylib
-    .lookupFunction<_c_cJSON_IsString, _dart_cJSON_IsString>('cJSON_IsString');
-
 typedef _c_cJSON_IsString = ffi.Int32 Function(
   ffi.Pointer<cJSON> item,
 );
@@ -525,17 +1261,6 @@
   ffi.Pointer<cJSON> item,
 );
 
-int cJSON_IsArray(
-  ffi.Pointer<cJSON> item,
-) {
-  return _cJSON_IsArray(
-    item,
-  );
-}
-
-final _dart_cJSON_IsArray _cJSON_IsArray = _dylib
-    .lookupFunction<_c_cJSON_IsArray, _dart_cJSON_IsArray>('cJSON_IsArray');
-
 typedef _c_cJSON_IsArray = ffi.Int32 Function(
   ffi.Pointer<cJSON> item,
 );
@@ -544,17 +1269,6 @@
   ffi.Pointer<cJSON> item,
 );
 
-int cJSON_IsObject(
-  ffi.Pointer<cJSON> item,
-) {
-  return _cJSON_IsObject(
-    item,
-  );
-}
-
-final _dart_cJSON_IsObject _cJSON_IsObject = _dylib
-    .lookupFunction<_c_cJSON_IsObject, _dart_cJSON_IsObject>('cJSON_IsObject');
-
 typedef _c_cJSON_IsObject = ffi.Int32 Function(
   ffi.Pointer<cJSON> item,
 );
@@ -563,17 +1277,6 @@
   ffi.Pointer<cJSON> item,
 );
 
-int cJSON_IsRaw(
-  ffi.Pointer<cJSON> item,
-) {
-  return _cJSON_IsRaw(
-    item,
-  );
-}
-
-final _dart_cJSON_IsRaw _cJSON_IsRaw =
-    _dylib.lookupFunction<_c_cJSON_IsRaw, _dart_cJSON_IsRaw>('cJSON_IsRaw');
-
 typedef _c_cJSON_IsRaw = ffi.Int32 Function(
   ffi.Pointer<cJSON> item,
 );
@@ -582,54 +1285,18 @@
   ffi.Pointer<cJSON> item,
 );
 
-ffi.Pointer<cJSON> cJSON_CreateNull() {
-  return _cJSON_CreateNull();
-}
-
-final _dart_cJSON_CreateNull _cJSON_CreateNull =
-    _dylib.lookupFunction<_c_cJSON_CreateNull, _dart_cJSON_CreateNull>(
-        'cJSON_CreateNull');
-
 typedef _c_cJSON_CreateNull = ffi.Pointer<cJSON> Function();
 
 typedef _dart_cJSON_CreateNull = ffi.Pointer<cJSON> Function();
 
-ffi.Pointer<cJSON> cJSON_CreateTrue() {
-  return _cJSON_CreateTrue();
-}
-
-final _dart_cJSON_CreateTrue _cJSON_CreateTrue =
-    _dylib.lookupFunction<_c_cJSON_CreateTrue, _dart_cJSON_CreateTrue>(
-        'cJSON_CreateTrue');
-
 typedef _c_cJSON_CreateTrue = ffi.Pointer<cJSON> Function();
 
 typedef _dart_cJSON_CreateTrue = ffi.Pointer<cJSON> Function();
 
-ffi.Pointer<cJSON> cJSON_CreateFalse() {
-  return _cJSON_CreateFalse();
-}
-
-final _dart_cJSON_CreateFalse _cJSON_CreateFalse =
-    _dylib.lookupFunction<_c_cJSON_CreateFalse, _dart_cJSON_CreateFalse>(
-        'cJSON_CreateFalse');
-
 typedef _c_cJSON_CreateFalse = ffi.Pointer<cJSON> Function();
 
 typedef _dart_cJSON_CreateFalse = ffi.Pointer<cJSON> Function();
 
-ffi.Pointer<cJSON> cJSON_CreateBool(
-  int boolean,
-) {
-  return _cJSON_CreateBool(
-    boolean,
-  );
-}
-
-final _dart_cJSON_CreateBool _cJSON_CreateBool =
-    _dylib.lookupFunction<_c_cJSON_CreateBool, _dart_cJSON_CreateBool>(
-        'cJSON_CreateBool');
-
 typedef _c_cJSON_CreateBool = ffi.Pointer<cJSON> Function(
   ffi.Int32 boolean,
 );
@@ -638,18 +1305,6 @@
   int boolean,
 );
 
-ffi.Pointer<cJSON> cJSON_CreateNumber(
-  double num,
-) {
-  return _cJSON_CreateNumber(
-    num,
-  );
-}
-
-final _dart_cJSON_CreateNumber _cJSON_CreateNumber =
-    _dylib.lookupFunction<_c_cJSON_CreateNumber, _dart_cJSON_CreateNumber>(
-        'cJSON_CreateNumber');
-
 typedef _c_cJSON_CreateNumber = ffi.Pointer<cJSON> Function(
   ffi.Double num,
 );
@@ -658,18 +1313,6 @@
   double num,
 );
 
-ffi.Pointer<cJSON> cJSON_CreateString(
-  ffi.Pointer<ffi.Int8> string,
-) {
-  return _cJSON_CreateString(
-    string,
-  );
-}
-
-final _dart_cJSON_CreateString _cJSON_CreateString =
-    _dylib.lookupFunction<_c_cJSON_CreateString, _dart_cJSON_CreateString>(
-        'cJSON_CreateString');
-
 typedef _c_cJSON_CreateString = ffi.Pointer<cJSON> Function(
   ffi.Pointer<ffi.Int8> string,
 );
@@ -678,18 +1321,6 @@
   ffi.Pointer<ffi.Int8> string,
 );
 
-ffi.Pointer<cJSON> cJSON_CreateRaw(
-  ffi.Pointer<ffi.Int8> raw,
-) {
-  return _cJSON_CreateRaw(
-    raw,
-  );
-}
-
-final _dart_cJSON_CreateRaw _cJSON_CreateRaw =
-    _dylib.lookupFunction<_c_cJSON_CreateRaw, _dart_cJSON_CreateRaw>(
-        'cJSON_CreateRaw');
-
 typedef _c_cJSON_CreateRaw = ffi.Pointer<cJSON> Function(
   ffi.Pointer<ffi.Int8> raw,
 );
@@ -698,42 +1329,14 @@
   ffi.Pointer<ffi.Int8> raw,
 );
 
-ffi.Pointer<cJSON> cJSON_CreateArray() {
-  return _cJSON_CreateArray();
-}
-
-final _dart_cJSON_CreateArray _cJSON_CreateArray =
-    _dylib.lookupFunction<_c_cJSON_CreateArray, _dart_cJSON_CreateArray>(
-        'cJSON_CreateArray');
-
 typedef _c_cJSON_CreateArray = ffi.Pointer<cJSON> Function();
 
 typedef _dart_cJSON_CreateArray = ffi.Pointer<cJSON> Function();
 
-ffi.Pointer<cJSON> cJSON_CreateObject() {
-  return _cJSON_CreateObject();
-}
-
-final _dart_cJSON_CreateObject _cJSON_CreateObject =
-    _dylib.lookupFunction<_c_cJSON_CreateObject, _dart_cJSON_CreateObject>(
-        'cJSON_CreateObject');
-
 typedef _c_cJSON_CreateObject = ffi.Pointer<cJSON> Function();
 
 typedef _dart_cJSON_CreateObject = ffi.Pointer<cJSON> Function();
 
-ffi.Pointer<cJSON> cJSON_CreateStringReference(
-  ffi.Pointer<ffi.Int8> string,
-) {
-  return _cJSON_CreateStringReference(
-    string,
-  );
-}
-
-final _dart_cJSON_CreateStringReference _cJSON_CreateStringReference =
-    _dylib.lookupFunction<_c_cJSON_CreateStringReference,
-        _dart_cJSON_CreateStringReference>('cJSON_CreateStringReference');
-
 typedef _c_cJSON_CreateStringReference = ffi.Pointer<cJSON> Function(
   ffi.Pointer<ffi.Int8> string,
 );
@@ -742,18 +1345,6 @@
   ffi.Pointer<ffi.Int8> string,
 );
 
-ffi.Pointer<cJSON> cJSON_CreateObjectReference(
-  ffi.Pointer<cJSON> child,
-) {
-  return _cJSON_CreateObjectReference(
-    child,
-  );
-}
-
-final _dart_cJSON_CreateObjectReference _cJSON_CreateObjectReference =
-    _dylib.lookupFunction<_c_cJSON_CreateObjectReference,
-        _dart_cJSON_CreateObjectReference>('cJSON_CreateObjectReference');
-
 typedef _c_cJSON_CreateObjectReference = ffi.Pointer<cJSON> Function(
   ffi.Pointer<cJSON> child,
 );
@@ -762,18 +1353,6 @@
   ffi.Pointer<cJSON> child,
 );
 
-ffi.Pointer<cJSON> cJSON_CreateArrayReference(
-  ffi.Pointer<cJSON> child,
-) {
-  return _cJSON_CreateArrayReference(
-    child,
-  );
-}
-
-final _dart_cJSON_CreateArrayReference _cJSON_CreateArrayReference =
-    _dylib.lookupFunction<_c_cJSON_CreateArrayReference,
-        _dart_cJSON_CreateArrayReference>('cJSON_CreateArrayReference');
-
 typedef _c_cJSON_CreateArrayReference = ffi.Pointer<cJSON> Function(
   ffi.Pointer<cJSON> child,
 );
@@ -782,20 +1361,6 @@
   ffi.Pointer<cJSON> child,
 );
 
-ffi.Pointer<cJSON> cJSON_CreateIntArray(
-  ffi.Pointer<ffi.Int32> numbers,
-  int count,
-) {
-  return _cJSON_CreateIntArray(
-    numbers,
-    count,
-  );
-}
-
-final _dart_cJSON_CreateIntArray _cJSON_CreateIntArray =
-    _dylib.lookupFunction<_c_cJSON_CreateIntArray, _dart_cJSON_CreateIntArray>(
-        'cJSON_CreateIntArray');
-
 typedef _c_cJSON_CreateIntArray = ffi.Pointer<cJSON> Function(
   ffi.Pointer<ffi.Int32> numbers,
   ffi.Int32 count,
@@ -806,20 +1371,6 @@
   int count,
 );
 
-ffi.Pointer<cJSON> cJSON_CreateFloatArray(
-  ffi.Pointer<ffi.Float> numbers,
-  int count,
-) {
-  return _cJSON_CreateFloatArray(
-    numbers,
-    count,
-  );
-}
-
-final _dart_cJSON_CreateFloatArray _cJSON_CreateFloatArray = _dylib
-    .lookupFunction<_c_cJSON_CreateFloatArray, _dart_cJSON_CreateFloatArray>(
-        'cJSON_CreateFloatArray');
-
 typedef _c_cJSON_CreateFloatArray = ffi.Pointer<cJSON> Function(
   ffi.Pointer<ffi.Float> numbers,
   ffi.Int32 count,
@@ -830,20 +1381,6 @@
   int count,
 );
 
-ffi.Pointer<cJSON> cJSON_CreateDoubleArray(
-  ffi.Pointer<ffi.Double> numbers,
-  int count,
-) {
-  return _cJSON_CreateDoubleArray(
-    numbers,
-    count,
-  );
-}
-
-final _dart_cJSON_CreateDoubleArray _cJSON_CreateDoubleArray = _dylib
-    .lookupFunction<_c_cJSON_CreateDoubleArray, _dart_cJSON_CreateDoubleArray>(
-        'cJSON_CreateDoubleArray');
-
 typedef _c_cJSON_CreateDoubleArray = ffi.Pointer<cJSON> Function(
   ffi.Pointer<ffi.Double> numbers,
   ffi.Int32 count,
@@ -854,20 +1391,6 @@
   int count,
 );
 
-ffi.Pointer<cJSON> cJSON_CreateStringArray(
-  ffi.Pointer<ffi.Pointer<ffi.Int8>> strings,
-  int count,
-) {
-  return _cJSON_CreateStringArray(
-    strings,
-    count,
-  );
-}
-
-final _dart_cJSON_CreateStringArray _cJSON_CreateStringArray = _dylib
-    .lookupFunction<_c_cJSON_CreateStringArray, _dart_cJSON_CreateStringArray>(
-        'cJSON_CreateStringArray');
-
 typedef _c_cJSON_CreateStringArray = ffi.Pointer<cJSON> Function(
   ffi.Pointer<ffi.Pointer<ffi.Int8>> strings,
   ffi.Int32 count,
@@ -878,20 +1401,6 @@
   int count,
 );
 
-void cJSON_AddItemToArray(
-  ffi.Pointer<cJSON> array,
-  ffi.Pointer<cJSON> item,
-) {
-  return _cJSON_AddItemToArray(
-    array,
-    item,
-  );
-}
-
-final _dart_cJSON_AddItemToArray _cJSON_AddItemToArray =
-    _dylib.lookupFunction<_c_cJSON_AddItemToArray, _dart_cJSON_AddItemToArray>(
-        'cJSON_AddItemToArray');
-
 typedef _c_cJSON_AddItemToArray = ffi.Void Function(
   ffi.Pointer<cJSON> array,
   ffi.Pointer<cJSON> item,
@@ -902,22 +1411,6 @@
   ffi.Pointer<cJSON> item,
 );
 
-void cJSON_AddItemToObject(
-  ffi.Pointer<cJSON> object,
-  ffi.Pointer<ffi.Int8> string,
-  ffi.Pointer<cJSON> item,
-) {
-  return _cJSON_AddItemToObject(
-    object,
-    string,
-    item,
-  );
-}
-
-final _dart_cJSON_AddItemToObject _cJSON_AddItemToObject = _dylib
-    .lookupFunction<_c_cJSON_AddItemToObject, _dart_cJSON_AddItemToObject>(
-        'cJSON_AddItemToObject');
-
 typedef _c_cJSON_AddItemToObject = ffi.Void Function(
   ffi.Pointer<cJSON> object,
   ffi.Pointer<ffi.Int8> string,
@@ -930,22 +1423,6 @@
   ffi.Pointer<cJSON> item,
 );
 
-void cJSON_AddItemToObjectCS(
-  ffi.Pointer<cJSON> object,
-  ffi.Pointer<ffi.Int8> string,
-  ffi.Pointer<cJSON> item,
-) {
-  return _cJSON_AddItemToObjectCS(
-    object,
-    string,
-    item,
-  );
-}
-
-final _dart_cJSON_AddItemToObjectCS _cJSON_AddItemToObjectCS = _dylib
-    .lookupFunction<_c_cJSON_AddItemToObjectCS, _dart_cJSON_AddItemToObjectCS>(
-        'cJSON_AddItemToObjectCS');
-
 typedef _c_cJSON_AddItemToObjectCS = ffi.Void Function(
   ffi.Pointer<cJSON> object,
   ffi.Pointer<ffi.Int8> string,
@@ -958,20 +1435,6 @@
   ffi.Pointer<cJSON> item,
 );
 
-void cJSON_AddItemReferenceToArray(
-  ffi.Pointer<cJSON> array,
-  ffi.Pointer<cJSON> item,
-) {
-  return _cJSON_AddItemReferenceToArray(
-    array,
-    item,
-  );
-}
-
-final _dart_cJSON_AddItemReferenceToArray _cJSON_AddItemReferenceToArray =
-    _dylib.lookupFunction<_c_cJSON_AddItemReferenceToArray,
-        _dart_cJSON_AddItemReferenceToArray>('cJSON_AddItemReferenceToArray');
-
 typedef _c_cJSON_AddItemReferenceToArray = ffi.Void Function(
   ffi.Pointer<cJSON> array,
   ffi.Pointer<cJSON> item,
@@ -982,22 +1445,6 @@
   ffi.Pointer<cJSON> item,
 );
 
-void cJSON_AddItemReferenceToObject(
-  ffi.Pointer<cJSON> object,
-  ffi.Pointer<ffi.Int8> string,
-  ffi.Pointer<cJSON> item,
-) {
-  return _cJSON_AddItemReferenceToObject(
-    object,
-    string,
-    item,
-  );
-}
-
-final _dart_cJSON_AddItemReferenceToObject _cJSON_AddItemReferenceToObject =
-    _dylib.lookupFunction<_c_cJSON_AddItemReferenceToObject,
-        _dart_cJSON_AddItemReferenceToObject>('cJSON_AddItemReferenceToObject');
-
 typedef _c_cJSON_AddItemReferenceToObject = ffi.Void Function(
   ffi.Pointer<cJSON> object,
   ffi.Pointer<ffi.Int8> string,
@@ -1010,20 +1457,6 @@
   ffi.Pointer<cJSON> item,
 );
 
-ffi.Pointer<cJSON> cJSON_DetachItemViaPointer(
-  ffi.Pointer<cJSON> parent,
-  ffi.Pointer<cJSON> item,
-) {
-  return _cJSON_DetachItemViaPointer(
-    parent,
-    item,
-  );
-}
-
-final _dart_cJSON_DetachItemViaPointer _cJSON_DetachItemViaPointer =
-    _dylib.lookupFunction<_c_cJSON_DetachItemViaPointer,
-        _dart_cJSON_DetachItemViaPointer>('cJSON_DetachItemViaPointer');
-
 typedef _c_cJSON_DetachItemViaPointer = ffi.Pointer<cJSON> Function(
   ffi.Pointer<cJSON> parent,
   ffi.Pointer<cJSON> item,
@@ -1034,20 +1467,6 @@
   ffi.Pointer<cJSON> item,
 );
 
-ffi.Pointer<cJSON> cJSON_DetachItemFromArray(
-  ffi.Pointer<cJSON> array,
-  int which,
-) {
-  return _cJSON_DetachItemFromArray(
-    array,
-    which,
-  );
-}
-
-final _dart_cJSON_DetachItemFromArray _cJSON_DetachItemFromArray =
-    _dylib.lookupFunction<_c_cJSON_DetachItemFromArray,
-        _dart_cJSON_DetachItemFromArray>('cJSON_DetachItemFromArray');
-
 typedef _c_cJSON_DetachItemFromArray = ffi.Pointer<cJSON> Function(
   ffi.Pointer<cJSON> array,
   ffi.Int32 which,
@@ -1058,20 +1477,6 @@
   int which,
 );
 
-void cJSON_DeleteItemFromArray(
-  ffi.Pointer<cJSON> array,
-  int which,
-) {
-  return _cJSON_DeleteItemFromArray(
-    array,
-    which,
-  );
-}
-
-final _dart_cJSON_DeleteItemFromArray _cJSON_DeleteItemFromArray =
-    _dylib.lookupFunction<_c_cJSON_DeleteItemFromArray,
-        _dart_cJSON_DeleteItemFromArray>('cJSON_DeleteItemFromArray');
-
 typedef _c_cJSON_DeleteItemFromArray = ffi.Void Function(
   ffi.Pointer<cJSON> array,
   ffi.Int32 which,
@@ -1082,20 +1487,6 @@
   int which,
 );
 
-ffi.Pointer<cJSON> cJSON_DetachItemFromObject(
-  ffi.Pointer<cJSON> object,
-  ffi.Pointer<ffi.Int8> string,
-) {
-  return _cJSON_DetachItemFromObject(
-    object,
-    string,
-  );
-}
-
-final _dart_cJSON_DetachItemFromObject _cJSON_DetachItemFromObject =
-    _dylib.lookupFunction<_c_cJSON_DetachItemFromObject,
-        _dart_cJSON_DetachItemFromObject>('cJSON_DetachItemFromObject');
-
 typedef _c_cJSON_DetachItemFromObject = ffi.Pointer<cJSON> Function(
   ffi.Pointer<cJSON> object,
   ffi.Pointer<ffi.Int8> string,
@@ -1106,22 +1497,6 @@
   ffi.Pointer<ffi.Int8> string,
 );
 
-ffi.Pointer<cJSON> cJSON_DetachItemFromObjectCaseSensitive(
-  ffi.Pointer<cJSON> object,
-  ffi.Pointer<ffi.Int8> string,
-) {
-  return _cJSON_DetachItemFromObjectCaseSensitive(
-    object,
-    string,
-  );
-}
-
-final _dart_cJSON_DetachItemFromObjectCaseSensitive
-    _cJSON_DetachItemFromObjectCaseSensitive = _dylib.lookupFunction<
-            _c_cJSON_DetachItemFromObjectCaseSensitive,
-            _dart_cJSON_DetachItemFromObjectCaseSensitive>(
-        'cJSON_DetachItemFromObjectCaseSensitive');
-
 typedef _c_cJSON_DetachItemFromObjectCaseSensitive = ffi.Pointer<cJSON>
     Function(
   ffi.Pointer<cJSON> object,
@@ -1134,20 +1509,6 @@
   ffi.Pointer<ffi.Int8> string,
 );
 
-void cJSON_DeleteItemFromObject(
-  ffi.Pointer<cJSON> object,
-  ffi.Pointer<ffi.Int8> string,
-) {
-  return _cJSON_DeleteItemFromObject(
-    object,
-    string,
-  );
-}
-
-final _dart_cJSON_DeleteItemFromObject _cJSON_DeleteItemFromObject =
-    _dylib.lookupFunction<_c_cJSON_DeleteItemFromObject,
-        _dart_cJSON_DeleteItemFromObject>('cJSON_DeleteItemFromObject');
-
 typedef _c_cJSON_DeleteItemFromObject = ffi.Void Function(
   ffi.Pointer<cJSON> object,
   ffi.Pointer<ffi.Int8> string,
@@ -1158,22 +1519,6 @@
   ffi.Pointer<ffi.Int8> string,
 );
 
-void cJSON_DeleteItemFromObjectCaseSensitive(
-  ffi.Pointer<cJSON> object,
-  ffi.Pointer<ffi.Int8> string,
-) {
-  return _cJSON_DeleteItemFromObjectCaseSensitive(
-    object,
-    string,
-  );
-}
-
-final _dart_cJSON_DeleteItemFromObjectCaseSensitive
-    _cJSON_DeleteItemFromObjectCaseSensitive = _dylib.lookupFunction<
-            _c_cJSON_DeleteItemFromObjectCaseSensitive,
-            _dart_cJSON_DeleteItemFromObjectCaseSensitive>(
-        'cJSON_DeleteItemFromObjectCaseSensitive');
-
 typedef _c_cJSON_DeleteItemFromObjectCaseSensitive = ffi.Void Function(
   ffi.Pointer<cJSON> object,
   ffi.Pointer<ffi.Int8> string,
@@ -1184,22 +1529,6 @@
   ffi.Pointer<ffi.Int8> string,
 );
 
-void cJSON_InsertItemInArray(
-  ffi.Pointer<cJSON> array,
-  int which,
-  ffi.Pointer<cJSON> newitem,
-) {
-  return _cJSON_InsertItemInArray(
-    array,
-    which,
-    newitem,
-  );
-}
-
-final _dart_cJSON_InsertItemInArray _cJSON_InsertItemInArray = _dylib
-    .lookupFunction<_c_cJSON_InsertItemInArray, _dart_cJSON_InsertItemInArray>(
-        'cJSON_InsertItemInArray');
-
 typedef _c_cJSON_InsertItemInArray = ffi.Void Function(
   ffi.Pointer<cJSON> array,
   ffi.Int32 which,
@@ -1212,22 +1541,6 @@
   ffi.Pointer<cJSON> newitem,
 );
 
-int cJSON_ReplaceItemViaPointer(
-  ffi.Pointer<cJSON> parent,
-  ffi.Pointer<cJSON> item,
-  ffi.Pointer<cJSON> replacement,
-) {
-  return _cJSON_ReplaceItemViaPointer(
-    parent,
-    item,
-    replacement,
-  );
-}
-
-final _dart_cJSON_ReplaceItemViaPointer _cJSON_ReplaceItemViaPointer =
-    _dylib.lookupFunction<_c_cJSON_ReplaceItemViaPointer,
-        _dart_cJSON_ReplaceItemViaPointer>('cJSON_ReplaceItemViaPointer');
-
 typedef _c_cJSON_ReplaceItemViaPointer = ffi.Int32 Function(
   ffi.Pointer<cJSON> parent,
   ffi.Pointer<cJSON> item,
@@ -1240,22 +1553,6 @@
   ffi.Pointer<cJSON> replacement,
 );
 
-void cJSON_ReplaceItemInArray(
-  ffi.Pointer<cJSON> array,
-  int which,
-  ffi.Pointer<cJSON> newitem,
-) {
-  return _cJSON_ReplaceItemInArray(
-    array,
-    which,
-    newitem,
-  );
-}
-
-final _dart_cJSON_ReplaceItemInArray _cJSON_ReplaceItemInArray =
-    _dylib.lookupFunction<_c_cJSON_ReplaceItemInArray,
-        _dart_cJSON_ReplaceItemInArray>('cJSON_ReplaceItemInArray');
-
 typedef _c_cJSON_ReplaceItemInArray = ffi.Void Function(
   ffi.Pointer<cJSON> array,
   ffi.Int32 which,
@@ -1268,22 +1565,6 @@
   ffi.Pointer<cJSON> newitem,
 );
 
-void cJSON_ReplaceItemInObject(
-  ffi.Pointer<cJSON> object,
-  ffi.Pointer<ffi.Int8> string,
-  ffi.Pointer<cJSON> newitem,
-) {
-  return _cJSON_ReplaceItemInObject(
-    object,
-    string,
-    newitem,
-  );
-}
-
-final _dart_cJSON_ReplaceItemInObject _cJSON_ReplaceItemInObject =
-    _dylib.lookupFunction<_c_cJSON_ReplaceItemInObject,
-        _dart_cJSON_ReplaceItemInObject>('cJSON_ReplaceItemInObject');
-
 typedef _c_cJSON_ReplaceItemInObject = ffi.Void Function(
   ffi.Pointer<cJSON> object,
   ffi.Pointer<ffi.Int8> string,
@@ -1296,24 +1577,6 @@
   ffi.Pointer<cJSON> newitem,
 );
 
-void cJSON_ReplaceItemInObjectCaseSensitive(
-  ffi.Pointer<cJSON> object,
-  ffi.Pointer<ffi.Int8> string,
-  ffi.Pointer<cJSON> newitem,
-) {
-  return _cJSON_ReplaceItemInObjectCaseSensitive(
-    object,
-    string,
-    newitem,
-  );
-}
-
-final _dart_cJSON_ReplaceItemInObjectCaseSensitive
-    _cJSON_ReplaceItemInObjectCaseSensitive = _dylib.lookupFunction<
-            _c_cJSON_ReplaceItemInObjectCaseSensitive,
-            _dart_cJSON_ReplaceItemInObjectCaseSensitive>(
-        'cJSON_ReplaceItemInObjectCaseSensitive');
-
 typedef _c_cJSON_ReplaceItemInObjectCaseSensitive = ffi.Void Function(
   ffi.Pointer<cJSON> object,
   ffi.Pointer<ffi.Int8> string,
@@ -1326,20 +1589,6 @@
   ffi.Pointer<cJSON> newitem,
 );
 
-ffi.Pointer<cJSON> cJSON_Duplicate(
-  ffi.Pointer<cJSON> item,
-  int recurse,
-) {
-  return _cJSON_Duplicate(
-    item,
-    recurse,
-  );
-}
-
-final _dart_cJSON_Duplicate _cJSON_Duplicate =
-    _dylib.lookupFunction<_c_cJSON_Duplicate, _dart_cJSON_Duplicate>(
-        'cJSON_Duplicate');
-
 typedef _c_cJSON_Duplicate = ffi.Pointer<cJSON> Function(
   ffi.Pointer<cJSON> item,
   ffi.Int32 recurse,
@@ -1350,21 +1599,6 @@
   int recurse,
 );
 
-int cJSON_Compare(
-  ffi.Pointer<cJSON> a,
-  ffi.Pointer<cJSON> b,
-  int case_sensitive,
-) {
-  return _cJSON_Compare(
-    a,
-    b,
-    case_sensitive,
-  );
-}
-
-final _dart_cJSON_Compare _cJSON_Compare = _dylib
-    .lookupFunction<_c_cJSON_Compare, _dart_cJSON_Compare>('cJSON_Compare');
-
 typedef _c_cJSON_Compare = ffi.Int32 Function(
   ffi.Pointer<cJSON> a,
   ffi.Pointer<cJSON> b,
@@ -1377,17 +1611,6 @@
   int case_sensitive,
 );
 
-void cJSON_Minify(
-  ffi.Pointer<ffi.Int8> json,
-) {
-  return _cJSON_Minify(
-    json,
-  );
-}
-
-final _dart_cJSON_Minify _cJSON_Minify =
-    _dylib.lookupFunction<_c_cJSON_Minify, _dart_cJSON_Minify>('cJSON_Minify');
-
 typedef _c_cJSON_Minify = ffi.Void Function(
   ffi.Pointer<ffi.Int8> json,
 );
@@ -1396,20 +1619,6 @@
   ffi.Pointer<ffi.Int8> json,
 );
 
-ffi.Pointer<cJSON> cJSON_AddNullToObject(
-  ffi.Pointer<cJSON> object,
-  ffi.Pointer<ffi.Int8> name,
-) {
-  return _cJSON_AddNullToObject(
-    object,
-    name,
-  );
-}
-
-final _dart_cJSON_AddNullToObject _cJSON_AddNullToObject = _dylib
-    .lookupFunction<_c_cJSON_AddNullToObject, _dart_cJSON_AddNullToObject>(
-        'cJSON_AddNullToObject');
-
 typedef _c_cJSON_AddNullToObject = ffi.Pointer<cJSON> Function(
   ffi.Pointer<cJSON> object,
   ffi.Pointer<ffi.Int8> name,
@@ -1420,20 +1629,6 @@
   ffi.Pointer<ffi.Int8> name,
 );
 
-ffi.Pointer<cJSON> cJSON_AddTrueToObject(
-  ffi.Pointer<cJSON> object,
-  ffi.Pointer<ffi.Int8> name,
-) {
-  return _cJSON_AddTrueToObject(
-    object,
-    name,
-  );
-}
-
-final _dart_cJSON_AddTrueToObject _cJSON_AddTrueToObject = _dylib
-    .lookupFunction<_c_cJSON_AddTrueToObject, _dart_cJSON_AddTrueToObject>(
-        'cJSON_AddTrueToObject');
-
 typedef _c_cJSON_AddTrueToObject = ffi.Pointer<cJSON> Function(
   ffi.Pointer<cJSON> object,
   ffi.Pointer<ffi.Int8> name,
@@ -1444,20 +1639,6 @@
   ffi.Pointer<ffi.Int8> name,
 );
 
-ffi.Pointer<cJSON> cJSON_AddFalseToObject(
-  ffi.Pointer<cJSON> object,
-  ffi.Pointer<ffi.Int8> name,
-) {
-  return _cJSON_AddFalseToObject(
-    object,
-    name,
-  );
-}
-
-final _dart_cJSON_AddFalseToObject _cJSON_AddFalseToObject = _dylib
-    .lookupFunction<_c_cJSON_AddFalseToObject, _dart_cJSON_AddFalseToObject>(
-        'cJSON_AddFalseToObject');
-
 typedef _c_cJSON_AddFalseToObject = ffi.Pointer<cJSON> Function(
   ffi.Pointer<cJSON> object,
   ffi.Pointer<ffi.Int8> name,
@@ -1468,22 +1649,6 @@
   ffi.Pointer<ffi.Int8> name,
 );
 
-ffi.Pointer<cJSON> cJSON_AddBoolToObject(
-  ffi.Pointer<cJSON> object,
-  ffi.Pointer<ffi.Int8> name,
-  int boolean,
-) {
-  return _cJSON_AddBoolToObject(
-    object,
-    name,
-    boolean,
-  );
-}
-
-final _dart_cJSON_AddBoolToObject _cJSON_AddBoolToObject = _dylib
-    .lookupFunction<_c_cJSON_AddBoolToObject, _dart_cJSON_AddBoolToObject>(
-        'cJSON_AddBoolToObject');
-
 typedef _c_cJSON_AddBoolToObject = ffi.Pointer<cJSON> Function(
   ffi.Pointer<cJSON> object,
   ffi.Pointer<ffi.Int8> name,
@@ -1496,22 +1661,6 @@
   int boolean,
 );
 
-ffi.Pointer<cJSON> cJSON_AddNumberToObject(
-  ffi.Pointer<cJSON> object,
-  ffi.Pointer<ffi.Int8> name,
-  double number,
-) {
-  return _cJSON_AddNumberToObject(
-    object,
-    name,
-    number,
-  );
-}
-
-final _dart_cJSON_AddNumberToObject _cJSON_AddNumberToObject = _dylib
-    .lookupFunction<_c_cJSON_AddNumberToObject, _dart_cJSON_AddNumberToObject>(
-        'cJSON_AddNumberToObject');
-
 typedef _c_cJSON_AddNumberToObject = ffi.Pointer<cJSON> Function(
   ffi.Pointer<cJSON> object,
   ffi.Pointer<ffi.Int8> name,
@@ -1524,22 +1673,6 @@
   double number,
 );
 
-ffi.Pointer<cJSON> cJSON_AddStringToObject(
-  ffi.Pointer<cJSON> object,
-  ffi.Pointer<ffi.Int8> name,
-  ffi.Pointer<ffi.Int8> string,
-) {
-  return _cJSON_AddStringToObject(
-    object,
-    name,
-    string,
-  );
-}
-
-final _dart_cJSON_AddStringToObject _cJSON_AddStringToObject = _dylib
-    .lookupFunction<_c_cJSON_AddStringToObject, _dart_cJSON_AddStringToObject>(
-        'cJSON_AddStringToObject');
-
 typedef _c_cJSON_AddStringToObject = ffi.Pointer<cJSON> Function(
   ffi.Pointer<cJSON> object,
   ffi.Pointer<ffi.Int8> name,
@@ -1552,22 +1685,6 @@
   ffi.Pointer<ffi.Int8> string,
 );
 
-ffi.Pointer<cJSON> cJSON_AddRawToObject(
-  ffi.Pointer<cJSON> object,
-  ffi.Pointer<ffi.Int8> name,
-  ffi.Pointer<ffi.Int8> raw,
-) {
-  return _cJSON_AddRawToObject(
-    object,
-    name,
-    raw,
-  );
-}
-
-final _dart_cJSON_AddRawToObject _cJSON_AddRawToObject =
-    _dylib.lookupFunction<_c_cJSON_AddRawToObject, _dart_cJSON_AddRawToObject>(
-        'cJSON_AddRawToObject');
-
 typedef _c_cJSON_AddRawToObject = ffi.Pointer<cJSON> Function(
   ffi.Pointer<cJSON> object,
   ffi.Pointer<ffi.Int8> name,
@@ -1580,20 +1697,6 @@
   ffi.Pointer<ffi.Int8> raw,
 );
 
-ffi.Pointer<cJSON> cJSON_AddObjectToObject(
-  ffi.Pointer<cJSON> object,
-  ffi.Pointer<ffi.Int8> name,
-) {
-  return _cJSON_AddObjectToObject(
-    object,
-    name,
-  );
-}
-
-final _dart_cJSON_AddObjectToObject _cJSON_AddObjectToObject = _dylib
-    .lookupFunction<_c_cJSON_AddObjectToObject, _dart_cJSON_AddObjectToObject>(
-        'cJSON_AddObjectToObject');
-
 typedef _c_cJSON_AddObjectToObject = ffi.Pointer<cJSON> Function(
   ffi.Pointer<cJSON> object,
   ffi.Pointer<ffi.Int8> name,
@@ -1604,20 +1707,6 @@
   ffi.Pointer<ffi.Int8> name,
 );
 
-ffi.Pointer<cJSON> cJSON_AddArrayToObject(
-  ffi.Pointer<cJSON> object,
-  ffi.Pointer<ffi.Int8> name,
-) {
-  return _cJSON_AddArrayToObject(
-    object,
-    name,
-  );
-}
-
-final _dart_cJSON_AddArrayToObject _cJSON_AddArrayToObject = _dylib
-    .lookupFunction<_c_cJSON_AddArrayToObject, _dart_cJSON_AddArrayToObject>(
-        'cJSON_AddArrayToObject');
-
 typedef _c_cJSON_AddArrayToObject = ffi.Pointer<cJSON> Function(
   ffi.Pointer<cJSON> object,
   ffi.Pointer<ffi.Int8> name,
@@ -1628,20 +1717,6 @@
   ffi.Pointer<ffi.Int8> name,
 );
 
-double cJSON_SetNumberHelper(
-  ffi.Pointer<cJSON> object,
-  double number,
-) {
-  return _cJSON_SetNumberHelper(
-    object,
-    number,
-  );
-}
-
-final _dart_cJSON_SetNumberHelper _cJSON_SetNumberHelper = _dylib
-    .lookupFunction<_c_cJSON_SetNumberHelper, _dart_cJSON_SetNumberHelper>(
-        'cJSON_SetNumberHelper');
-
 typedef _c_cJSON_SetNumberHelper = ffi.Double Function(
   ffi.Pointer<cJSON> object,
   ffi.Double number,
@@ -1652,17 +1727,6 @@
   double number,
 );
 
-ffi.Pointer<ffi.Void> cJSON_malloc(
-  int size,
-) {
-  return _cJSON_malloc(
-    size,
-  );
-}
-
-final _dart_cJSON_malloc _cJSON_malloc =
-    _dylib.lookupFunction<_c_cJSON_malloc, _dart_cJSON_malloc>('cJSON_malloc');
-
 typedef _c_cJSON_malloc = ffi.Pointer<ffi.Void> Function(
   ffi.Uint64 size,
 );
@@ -1671,17 +1735,6 @@
   int size,
 );
 
-void cJSON_free(
-  ffi.Pointer<ffi.Void> object,
-) {
-  return _cJSON_free(
-    object,
-  );
-}
-
-final _dart_cJSON_free _cJSON_free =
-    _dylib.lookupFunction<_c_cJSON_free, _dart_cJSON_free>('cJSON_free');
-
 typedef _c_cJSON_free = ffi.Void Function(
   ffi.Pointer<ffi.Void> object,
 );
@@ -1689,3 +1742,11 @@
 typedef _dart_cJSON_free = void Function(
   ffi.Pointer<ffi.Void> object,
 );
+
+typedef _typedefC_1 = ffi.Pointer<ffi.Void> Function(
+  ffi.Uint64,
+);
+
+typedef _typedefC_2 = ffi.Void Function(
+  ffi.Pointer<ffi.Void>,
+);
diff --git a/example/c_json/main.dart b/example/c_json/main.dart
index 22db183..fa4bbbc 100644
--- a/example/c_json/main.dart
+++ b/example/c_json/main.dart
@@ -8,13 +8,12 @@
 
 import 'package:ffi/ffi.dart';
 
-import 'cjson_generated_bindings.dart' as cjson;
+import 'cjson_generated_bindings.dart' as cj;
+
+final cjson = cj.CJson(DynamicLibrary.open(_getPath()));
 
 /// Using the generated C_JSON bindings.
 void main() {
-  // Initialise cjson bindings.
-  cjson.init(DynamicLibrary.open(_getPath()));
-
   // Load json from [example.json] file.
   final jsonString = File('./example.json').readAsStringSync();
 
@@ -56,12 +55,12 @@
   return path;
 }
 
-dynamic convertCJsonToDartObj(Pointer<cjson.cJSON> parsedcjson) {
+dynamic convertCJsonToDartObj(Pointer<cj.cJSON> parsedcjson) {
   dynamic obj;
   if (cjson.cJSON_IsObject(parsedcjson.cast()) == 1) {
     obj = <String, dynamic>{};
 
-    Pointer<cjson.cJSON> ptr;
+    Pointer<cj.cJSON> ptr;
     ptr = parsedcjson.ref.child;
     while (ptr != nullptr) {
       final dynamic o = convertCJsonToDartObj(ptr);
@@ -71,7 +70,7 @@
   } else if (cjson.cJSON_IsArray(parsedcjson.cast()) == 1) {
     obj = <dynamic>[];
 
-    Pointer<cjson.cJSON> ptr;
+    Pointer<cj.cJSON> ptr;
     ptr = parsedcjson.ref.child;
     while (ptr != nullptr) {
       final dynamic o = convertCJsonToDartObj(ptr);
diff --git a/example/c_json/pubspec.yaml b/example/c_json/pubspec.yaml
index 7e913b6..22d64ad 100644
--- a/example/c_json/pubspec.yaml
+++ b/example/c_json/pubspec.yaml
@@ -16,6 +16,8 @@
 
 ffigen:
   output: 'cjson_generated_bindings.dart'
+  name: 'CJson'
+  description: 'Holds bindings to cJSON.'
   headers:
     - '../../third_party/cjson_library/cJSON.h'
   header-filter:
diff --git a/example/libclang-example/generated_bindings.dart b/example/libclang-example/generated_bindings.dart
index 6a0d1d3..eee8d52 100644
--- a/example/libclang-example/generated_bindings.dart
+++ b/example/libclang-example/generated_bindings.dart
@@ -4,140 +4,3004 @@
 
 import 'dart:ffi' as ffi;
 
-/// Holds the Dynamic library.
-ffi.DynamicLibrary _dylib;
+/// Holds bindings to LibClang.
+class LibClang {
+  /// Holds the Dynamic library.
+  final ffi.DynamicLibrary _dylib;
 
-/// Initialises the Dynamic library.
-void init(ffi.DynamicLibrary dynamicLibrary) {
-  _dylib = dynamicLibrary;
+  /// The symbols are looked up in [dynamicLibrary].
+  LibClang(ffi.DynamicLibrary dynamicLibrary) : _dylib = dynamicLibrary;
+
+  /// Free the given string set.
+  void clang_disposeStringSet(
+    ffi.Pointer<CXStringSet> set,
+  ) {
+    _clang_disposeStringSet ??= _dylib.lookupFunction<_c_clang_disposeStringSet,
+        _dart_clang_disposeStringSet>('clang_disposeStringSet');
+    return _clang_disposeStringSet(
+      set,
+    );
+  }
+
+  _dart_clang_disposeStringSet _clang_disposeStringSet;
+
+  /// Provides a shared context for creating translation units.
+  ///
+  /// It provides two options:
+  ///
+  /// - excludeDeclarationsFromPCH: When non-zero, allows enumeration of "local"
+  /// declarations (when loading any new translation units). A "local" declaration
+  /// is one that belongs in the translation unit itself and not in a precompiled
+  /// header that was used by the translation unit. If zero, all declarations
+  /// will be enumerated.
+  ///
+  /// Here is an example:
+  ///
+  /// \code
+  /// // excludeDeclsFromPCH = 1, displayDiagnostics=1
+  /// Idx = clang_createIndex(1, 1);
+  ///
+  /// // IndexTest.pch was produced with the following command:
+  /// // "clang -x c IndexTest.h -emit-ast -o IndexTest.pch"
+  /// TU = clang_createTranslationUnit(Idx, "IndexTest.pch");
+  ///
+  /// // This will load all the symbols from 'IndexTest.pch'
+  /// clang_visitChildren(clang_getTranslationUnitCursor(TU),
+  /// TranslationUnitVisitor, 0);
+  /// clang_disposeTranslationUnit(TU);
+  ///
+  /// // This will load all the symbols from 'IndexTest.c', excluding symbols
+  /// // from 'IndexTest.pch'.
+  /// char *args[] = { "-Xclang", "-include-pch=IndexTest.pch" };
+  /// TU = clang_createTranslationUnitFromSourceFile(Idx, "IndexTest.c", 2, args,
+  /// 0, 0);
+  /// clang_visitChildren(clang_getTranslationUnitCursor(TU),
+  /// TranslationUnitVisitor, 0);
+  /// clang_disposeTranslationUnit(TU);
+  /// \endcode
+  ///
+  /// This process of creating the 'pch', loading it separately, and using it (via
+  /// -include-pch) allows 'excludeDeclsFromPCH' to remove redundant callbacks
+  /// (which gives the indexer the same performance benefit as the compiler).
+  ffi.Pointer<ffi.Void> clang_createIndex(
+    int excludeDeclarationsFromPCH,
+    int displayDiagnostics,
+  ) {
+    _clang_createIndex ??=
+        _dylib.lookupFunction<_c_clang_createIndex, _dart_clang_createIndex>(
+            'clang_createIndex');
+    return _clang_createIndex(
+      excludeDeclarationsFromPCH,
+      displayDiagnostics,
+    );
+  }
+
+  _dart_clang_createIndex _clang_createIndex;
+
+  /// Destroy the given index.
+  ///
+  /// The index must not be destroyed until all of the translation units created
+  /// within that index have been destroyed.
+  void clang_disposeIndex(
+    ffi.Pointer<ffi.Void> index,
+  ) {
+    _clang_disposeIndex ??=
+        _dylib.lookupFunction<_c_clang_disposeIndex, _dart_clang_disposeIndex>(
+            'clang_disposeIndex');
+    return _clang_disposeIndex(
+      index,
+    );
+  }
+
+  _dart_clang_disposeIndex _clang_disposeIndex;
+
+  /// Sets general options associated with a CXIndex.
+  ///
+  /// For example:
+  /// \code
+  /// CXIndex idx = ...;
+  /// clang_CXIndex_setGlobalOptions(idx,
+  /// clang_CXIndex_getGlobalOptions(idx) |
+  /// CXGlobalOpt_ThreadBackgroundPriorityForIndexing);
+  /// \endcode
+  ///
+  /// \param options A bitmask of options, a bitwise OR of CXGlobalOpt_XXX flags.
+  void clang_CXIndex_setGlobalOptions(
+    ffi.Pointer<ffi.Void> arg0,
+    int options,
+  ) {
+    _clang_CXIndex_setGlobalOptions ??= _dylib.lookupFunction<
+        _c_clang_CXIndex_setGlobalOptions,
+        _dart_clang_CXIndex_setGlobalOptions>('clang_CXIndex_setGlobalOptions');
+    return _clang_CXIndex_setGlobalOptions(
+      arg0,
+      options,
+    );
+  }
+
+  _dart_clang_CXIndex_setGlobalOptions _clang_CXIndex_setGlobalOptions;
+
+  /// Gets the general options associated with a CXIndex.
+  ///
+  /// \returns A bitmask of options, a bitwise OR of CXGlobalOpt_XXX flags that
+  /// are associated with the given CXIndex object.
+  int clang_CXIndex_getGlobalOptions(
+    ffi.Pointer<ffi.Void> arg0,
+  ) {
+    _clang_CXIndex_getGlobalOptions ??= _dylib.lookupFunction<
+        _c_clang_CXIndex_getGlobalOptions,
+        _dart_clang_CXIndex_getGlobalOptions>('clang_CXIndex_getGlobalOptions');
+    return _clang_CXIndex_getGlobalOptions(
+      arg0,
+    );
+  }
+
+  _dart_clang_CXIndex_getGlobalOptions _clang_CXIndex_getGlobalOptions;
+
+  /// Sets the invocation emission path option in a CXIndex.
+  ///
+  /// The invocation emission path specifies a path which will contain log
+  /// files for certain libclang invocations. A null value (default) implies that
+  /// libclang invocations are not logged..
+  void clang_CXIndex_setInvocationEmissionPathOption(
+    ffi.Pointer<ffi.Void> arg0,
+    ffi.Pointer<ffi.Int8> Path,
+  ) {
+    _clang_CXIndex_setInvocationEmissionPathOption ??= _dylib.lookupFunction<
+            _c_clang_CXIndex_setInvocationEmissionPathOption,
+            _dart_clang_CXIndex_setInvocationEmissionPathOption>(
+        'clang_CXIndex_setInvocationEmissionPathOption');
+    return _clang_CXIndex_setInvocationEmissionPathOption(
+      arg0,
+      Path,
+    );
+  }
+
+  _dart_clang_CXIndex_setInvocationEmissionPathOption
+      _clang_CXIndex_setInvocationEmissionPathOption;
+
+  /// Retrieve the last modification time of the given file.
+  int clang_getFileTime(
+    ffi.Pointer<ffi.Void> SFile,
+  ) {
+    _clang_getFileTime ??=
+        _dylib.lookupFunction<_c_clang_getFileTime, _dart_clang_getFileTime>(
+            'clang_getFileTime');
+    return _clang_getFileTime(
+      SFile,
+    );
+  }
+
+  _dart_clang_getFileTime _clang_getFileTime;
+
+  /// Retrieve the unique ID for the given \c file.
+  ///
+  /// \param file the file to get the ID for.
+  /// \param outID stores the returned CXFileUniqueID.
+  /// \returns If there was a failure getting the unique ID, returns non-zero,
+  /// otherwise returns 0.
+  int clang_getFileUniqueID(
+    ffi.Pointer<ffi.Void> file,
+    ffi.Pointer<CXFileUniqueID> outID,
+  ) {
+    _clang_getFileUniqueID ??= _dylib.lookupFunction<_c_clang_getFileUniqueID,
+        _dart_clang_getFileUniqueID>('clang_getFileUniqueID');
+    return _clang_getFileUniqueID(
+      file,
+      outID,
+    );
+  }
+
+  _dart_clang_getFileUniqueID _clang_getFileUniqueID;
+
+  /// Determine whether the given header is guarded against
+  /// multiple inclusions, either with the conventional
+  /// \#ifndef/\#define/\#endif macro guards or with \#pragma once.
+  int clang_isFileMultipleIncludeGuarded(
+    ffi.Pointer<CXTranslationUnitImpl> tu,
+    ffi.Pointer<ffi.Void> file,
+  ) {
+    _clang_isFileMultipleIncludeGuarded ??= _dylib.lookupFunction<
+            _c_clang_isFileMultipleIncludeGuarded,
+            _dart_clang_isFileMultipleIncludeGuarded>(
+        'clang_isFileMultipleIncludeGuarded');
+    return _clang_isFileMultipleIncludeGuarded(
+      tu,
+      file,
+    );
+  }
+
+  _dart_clang_isFileMultipleIncludeGuarded _clang_isFileMultipleIncludeGuarded;
+
+  /// Retrieve a file handle within the given translation unit.
+  ///
+  /// \param tu the translation unit
+  ///
+  /// \param file_name the name of the file.
+  ///
+  /// \returns the file handle for the named file in the translation unit \p tu,
+  /// or a NULL file handle if the file was not a part of this translation unit.
+  ffi.Pointer<ffi.Void> clang_getFile(
+    ffi.Pointer<CXTranslationUnitImpl> tu,
+    ffi.Pointer<ffi.Int8> file_name,
+  ) {
+    _clang_getFile ??= _dylib
+        .lookupFunction<_c_clang_getFile, _dart_clang_getFile>('clang_getFile');
+    return _clang_getFile(
+      tu,
+      file_name,
+    );
+  }
+
+  _dart_clang_getFile _clang_getFile;
+
+  /// Retrieve the buffer associated with the given file.
+  ///
+  /// \param tu the translation unit
+  ///
+  /// \param file the file for which to retrieve the buffer.
+  ///
+  /// \param size [out] if non-NULL, will be set to the size of the buffer.
+  ///
+  /// \returns a pointer to the buffer in memory that holds the contents of
+  /// \p file, or a NULL pointer when the file is not loaded.
+  ffi.Pointer<ffi.Int8> clang_getFileContents(
+    ffi.Pointer<CXTranslationUnitImpl> tu,
+    ffi.Pointer<ffi.Void> file,
+    ffi.Pointer<ffi.Uint64> size,
+  ) {
+    _clang_getFileContents ??= _dylib.lookupFunction<_c_clang_getFileContents,
+        _dart_clang_getFileContents>('clang_getFileContents');
+    return _clang_getFileContents(
+      tu,
+      file,
+      size,
+    );
+  }
+
+  _dart_clang_getFileContents _clang_getFileContents;
+
+  /// Returns non-zero if the \c file1 and \c file2 point to the same file,
+  /// or they are both NULL.
+  int clang_File_isEqual(
+    ffi.Pointer<ffi.Void> file1,
+    ffi.Pointer<ffi.Void> file2,
+  ) {
+    _clang_File_isEqual ??=
+        _dylib.lookupFunction<_c_clang_File_isEqual, _dart_clang_File_isEqual>(
+            'clang_File_isEqual');
+    return _clang_File_isEqual(
+      file1,
+      file2,
+    );
+  }
+
+  _dart_clang_File_isEqual _clang_File_isEqual;
+
+  /// Retrieve all ranges that were skipped by the preprocessor.
+  ///
+  /// The preprocessor will skip lines when they are surrounded by an
+  /// if/ifdef/ifndef directive whose condition does not evaluate to true.
+  ffi.Pointer<CXSourceRangeList> clang_getSkippedRanges(
+    ffi.Pointer<CXTranslationUnitImpl> tu,
+    ffi.Pointer<ffi.Void> file,
+  ) {
+    _clang_getSkippedRanges ??= _dylib.lookupFunction<_c_clang_getSkippedRanges,
+        _dart_clang_getSkippedRanges>('clang_getSkippedRanges');
+    return _clang_getSkippedRanges(
+      tu,
+      file,
+    );
+  }
+
+  _dart_clang_getSkippedRanges _clang_getSkippedRanges;
+
+  /// Retrieve all ranges from all files that were skipped by the
+  /// preprocessor.
+  ///
+  /// The preprocessor will skip lines when they are surrounded by an
+  /// if/ifdef/ifndef directive whose condition does not evaluate to true.
+  ffi.Pointer<CXSourceRangeList> clang_getAllSkippedRanges(
+    ffi.Pointer<CXTranslationUnitImpl> tu,
+  ) {
+    _clang_getAllSkippedRanges ??= _dylib.lookupFunction<
+        _c_clang_getAllSkippedRanges,
+        _dart_clang_getAllSkippedRanges>('clang_getAllSkippedRanges');
+    return _clang_getAllSkippedRanges(
+      tu,
+    );
+  }
+
+  _dart_clang_getAllSkippedRanges _clang_getAllSkippedRanges;
+
+  /// Destroy the given \c CXSourceRangeList.
+  void clang_disposeSourceRangeList(
+    ffi.Pointer<CXSourceRangeList> ranges,
+  ) {
+    _clang_disposeSourceRangeList ??= _dylib.lookupFunction<
+        _c_clang_disposeSourceRangeList,
+        _dart_clang_disposeSourceRangeList>('clang_disposeSourceRangeList');
+    return _clang_disposeSourceRangeList(
+      ranges,
+    );
+  }
+
+  _dart_clang_disposeSourceRangeList _clang_disposeSourceRangeList;
+
+  /// Determine the number of diagnostics in a CXDiagnosticSet.
+  int clang_getNumDiagnosticsInSet(
+    ffi.Pointer<ffi.Void> Diags,
+  ) {
+    _clang_getNumDiagnosticsInSet ??= _dylib.lookupFunction<
+        _c_clang_getNumDiagnosticsInSet,
+        _dart_clang_getNumDiagnosticsInSet>('clang_getNumDiagnosticsInSet');
+    return _clang_getNumDiagnosticsInSet(
+      Diags,
+    );
+  }
+
+  _dart_clang_getNumDiagnosticsInSet _clang_getNumDiagnosticsInSet;
+
+  /// Retrieve a diagnostic associated with the given CXDiagnosticSet.
+  ///
+  /// \param Diags the CXDiagnosticSet to query.
+  /// \param Index the zero-based diagnostic number to retrieve.
+  ///
+  /// \returns the requested diagnostic. This diagnostic must be freed
+  /// via a call to \c clang_disposeDiagnostic().
+  ffi.Pointer<ffi.Void> clang_getDiagnosticInSet(
+    ffi.Pointer<ffi.Void> Diags,
+    int Index,
+  ) {
+    _clang_getDiagnosticInSet ??= _dylib.lookupFunction<
+        _c_clang_getDiagnosticInSet,
+        _dart_clang_getDiagnosticInSet>('clang_getDiagnosticInSet');
+    return _clang_getDiagnosticInSet(
+      Diags,
+      Index,
+    );
+  }
+
+  _dart_clang_getDiagnosticInSet _clang_getDiagnosticInSet;
+
+  /// Deserialize a set of diagnostics from a Clang diagnostics bitcode
+  /// file.
+  ///
+  /// \param file The name of the file to deserialize.
+  /// \param error A pointer to a enum value recording if there was a problem
+  /// deserializing the diagnostics.
+  /// \param errorString A pointer to a CXString for recording the error string
+  /// if the file was not successfully loaded.
+  ///
+  /// \returns A loaded CXDiagnosticSet if successful, and NULL otherwise.  These
+  /// diagnostics should be released using clang_disposeDiagnosticSet().
+  ffi.Pointer<ffi.Void> clang_loadDiagnostics(
+    ffi.Pointer<ffi.Int8> file,
+    ffi.Pointer<ffi.Int32> error,
+    ffi.Pointer<CXString> errorString,
+  ) {
+    _clang_loadDiagnostics ??= _dylib.lookupFunction<_c_clang_loadDiagnostics,
+        _dart_clang_loadDiagnostics>('clang_loadDiagnostics');
+    return _clang_loadDiagnostics(
+      file,
+      error,
+      errorString,
+    );
+  }
+
+  _dart_clang_loadDiagnostics _clang_loadDiagnostics;
+
+  /// Release a CXDiagnosticSet and all of its contained diagnostics.
+  void clang_disposeDiagnosticSet(
+    ffi.Pointer<ffi.Void> Diags,
+  ) {
+    _clang_disposeDiagnosticSet ??= _dylib.lookupFunction<
+        _c_clang_disposeDiagnosticSet,
+        _dart_clang_disposeDiagnosticSet>('clang_disposeDiagnosticSet');
+    return _clang_disposeDiagnosticSet(
+      Diags,
+    );
+  }
+
+  _dart_clang_disposeDiagnosticSet _clang_disposeDiagnosticSet;
+
+  /// Retrieve the child diagnostics of a CXDiagnostic.
+  ///
+  /// This CXDiagnosticSet does not need to be released by
+  /// clang_disposeDiagnosticSet.
+  ffi.Pointer<ffi.Void> clang_getChildDiagnostics(
+    ffi.Pointer<ffi.Void> D,
+  ) {
+    _clang_getChildDiagnostics ??= _dylib.lookupFunction<
+        _c_clang_getChildDiagnostics,
+        _dart_clang_getChildDiagnostics>('clang_getChildDiagnostics');
+    return _clang_getChildDiagnostics(
+      D,
+    );
+  }
+
+  _dart_clang_getChildDiagnostics _clang_getChildDiagnostics;
+
+  /// Determine the number of diagnostics produced for the given
+  /// translation unit.
+  int clang_getNumDiagnostics(
+    ffi.Pointer<CXTranslationUnitImpl> Unit,
+  ) {
+    _clang_getNumDiagnostics ??= _dylib.lookupFunction<
+        _c_clang_getNumDiagnostics,
+        _dart_clang_getNumDiagnostics>('clang_getNumDiagnostics');
+    return _clang_getNumDiagnostics(
+      Unit,
+    );
+  }
+
+  _dart_clang_getNumDiagnostics _clang_getNumDiagnostics;
+
+  /// Retrieve a diagnostic associated with the given translation unit.
+  ///
+  /// \param Unit the translation unit to query.
+  /// \param Index the zero-based diagnostic number to retrieve.
+  ///
+  /// \returns the requested diagnostic. This diagnostic must be freed
+  /// via a call to \c clang_disposeDiagnostic().
+  ffi.Pointer<ffi.Void> clang_getDiagnostic(
+    ffi.Pointer<CXTranslationUnitImpl> Unit,
+    int Index,
+  ) {
+    _clang_getDiagnostic ??= _dylib.lookupFunction<_c_clang_getDiagnostic,
+        _dart_clang_getDiagnostic>('clang_getDiagnostic');
+    return _clang_getDiagnostic(
+      Unit,
+      Index,
+    );
+  }
+
+  _dart_clang_getDiagnostic _clang_getDiagnostic;
+
+  /// Retrieve the complete set of diagnostics associated with a
+  /// translation unit.
+  ///
+  /// \param Unit the translation unit to query.
+  ffi.Pointer<ffi.Void> clang_getDiagnosticSetFromTU(
+    ffi.Pointer<CXTranslationUnitImpl> Unit,
+  ) {
+    _clang_getDiagnosticSetFromTU ??= _dylib.lookupFunction<
+        _c_clang_getDiagnosticSetFromTU,
+        _dart_clang_getDiagnosticSetFromTU>('clang_getDiagnosticSetFromTU');
+    return _clang_getDiagnosticSetFromTU(
+      Unit,
+    );
+  }
+
+  _dart_clang_getDiagnosticSetFromTU _clang_getDiagnosticSetFromTU;
+
+  /// Destroy a diagnostic.
+  void clang_disposeDiagnostic(
+    ffi.Pointer<ffi.Void> Diagnostic,
+  ) {
+    _clang_disposeDiagnostic ??= _dylib.lookupFunction<
+        _c_clang_disposeDiagnostic,
+        _dart_clang_disposeDiagnostic>('clang_disposeDiagnostic');
+    return _clang_disposeDiagnostic(
+      Diagnostic,
+    );
+  }
+
+  _dart_clang_disposeDiagnostic _clang_disposeDiagnostic;
+
+  /// Retrieve the set of display options most similar to the
+  /// default behavior of the clang compiler.
+  ///
+  /// \returns A set of display options suitable for use with \c
+  /// clang_formatDiagnostic().
+  int clang_defaultDiagnosticDisplayOptions() {
+    _clang_defaultDiagnosticDisplayOptions ??= _dylib.lookupFunction<
+            _c_clang_defaultDiagnosticDisplayOptions,
+            _dart_clang_defaultDiagnosticDisplayOptions>(
+        'clang_defaultDiagnosticDisplayOptions');
+    return _clang_defaultDiagnosticDisplayOptions();
+  }
+
+  _dart_clang_defaultDiagnosticDisplayOptions
+      _clang_defaultDiagnosticDisplayOptions;
+
+  /// Determine the severity of the given diagnostic.
+  int clang_getDiagnosticSeverity(
+    ffi.Pointer<ffi.Void> arg0,
+  ) {
+    _clang_getDiagnosticSeverity ??= _dylib.lookupFunction<
+        _c_clang_getDiagnosticSeverity,
+        _dart_clang_getDiagnosticSeverity>('clang_getDiagnosticSeverity');
+    return _clang_getDiagnosticSeverity(
+      arg0,
+    );
+  }
+
+  _dart_clang_getDiagnosticSeverity _clang_getDiagnosticSeverity;
+
+  /// Retrieve the category number for this diagnostic.
+  ///
+  /// Diagnostics can be categorized into groups along with other, related
+  /// diagnostics (e.g., diagnostics under the same warning flag). This routine
+  /// retrieves the category number for the given diagnostic.
+  ///
+  /// \returns The number of the category that contains this diagnostic, or zero
+  /// if this diagnostic is uncategorized.
+  int clang_getDiagnosticCategory(
+    ffi.Pointer<ffi.Void> arg0,
+  ) {
+    _clang_getDiagnosticCategory ??= _dylib.lookupFunction<
+        _c_clang_getDiagnosticCategory,
+        _dart_clang_getDiagnosticCategory>('clang_getDiagnosticCategory');
+    return _clang_getDiagnosticCategory(
+      arg0,
+    );
+  }
+
+  _dart_clang_getDiagnosticCategory _clang_getDiagnosticCategory;
+
+  /// Determine the number of source ranges associated with the given
+  /// diagnostic.
+  int clang_getDiagnosticNumRanges(
+    ffi.Pointer<ffi.Void> arg0,
+  ) {
+    _clang_getDiagnosticNumRanges ??= _dylib.lookupFunction<
+        _c_clang_getDiagnosticNumRanges,
+        _dart_clang_getDiagnosticNumRanges>('clang_getDiagnosticNumRanges');
+    return _clang_getDiagnosticNumRanges(
+      arg0,
+    );
+  }
+
+  _dart_clang_getDiagnosticNumRanges _clang_getDiagnosticNumRanges;
+
+  /// Determine the number of fix-it hints associated with the
+  /// given diagnostic.
+  int clang_getDiagnosticNumFixIts(
+    ffi.Pointer<ffi.Void> Diagnostic,
+  ) {
+    _clang_getDiagnosticNumFixIts ??= _dylib.lookupFunction<
+        _c_clang_getDiagnosticNumFixIts,
+        _dart_clang_getDiagnosticNumFixIts>('clang_getDiagnosticNumFixIts');
+    return _clang_getDiagnosticNumFixIts(
+      Diagnostic,
+    );
+  }
+
+  _dart_clang_getDiagnosticNumFixIts _clang_getDiagnosticNumFixIts;
+
+  /// Return the CXTranslationUnit for a given source file and the provided
+  /// command line arguments one would pass to the compiler.
+  ///
+  /// Note: The 'source_filename' argument is optional.  If the caller provides a
+  /// NULL pointer, the name of the source file is expected to reside in the
+  /// specified command line arguments.
+  ///
+  /// Note: When encountered in 'clang_command_line_args', the following options
+  /// are ignored:
+  ///
+  /// '-c'
+  /// '-emit-ast'
+  /// '-fsyntax-only'
+  /// '-o \<output file>'  (both '-o' and '\<output file>' are ignored)
+  ///
+  /// \param CIdx The index object with which the translation unit will be
+  /// associated.
+  ///
+  /// \param source_filename The name of the source file to load, or NULL if the
+  /// source file is included in \p clang_command_line_args.
+  ///
+  /// \param num_clang_command_line_args The number of command-line arguments in
+  /// \p clang_command_line_args.
+  ///
+  /// \param clang_command_line_args The command-line arguments that would be
+  /// passed to the \c clang executable if it were being invoked out-of-process.
+  /// These command-line options will be parsed and will affect how the translation
+  /// unit is parsed. Note that the following options are ignored: '-c',
+  /// '-emit-ast', '-fsyntax-only' (which is the default), and '-o \<output file>'.
+  ///
+  /// \param num_unsaved_files the number of unsaved file entries in \p
+  /// unsaved_files.
+  ///
+  /// \param unsaved_files the files that have not yet been saved to disk
+  /// but may be required for code completion, including the contents of
+  /// those files.  The contents and name of these files (as specified by
+  /// CXUnsavedFile) are copied when necessary, so the client only needs to
+  /// guarantee their validity until the call to this function returns.
+  ffi.Pointer<CXTranslationUnitImpl> clang_createTranslationUnitFromSourceFile(
+    ffi.Pointer<ffi.Void> 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,
+  ) {
+    _clang_createTranslationUnitFromSourceFile ??= _dylib.lookupFunction<
+            _c_clang_createTranslationUnitFromSourceFile,
+            _dart_clang_createTranslationUnitFromSourceFile>(
+        'clang_createTranslationUnitFromSourceFile');
+    return _clang_createTranslationUnitFromSourceFile(
+      CIdx,
+      source_filename,
+      num_clang_command_line_args,
+      clang_command_line_args,
+      num_unsaved_files,
+      unsaved_files,
+    );
+  }
+
+  _dart_clang_createTranslationUnitFromSourceFile
+      _clang_createTranslationUnitFromSourceFile;
+
+  /// Same as \c clang_createTranslationUnit2, but returns
+  /// the \c CXTranslationUnit instead of an error code.  In case of an error this
+  /// routine returns a \c NULL \c CXTranslationUnit, without further detailed
+  /// error codes.
+  ffi.Pointer<CXTranslationUnitImpl> clang_createTranslationUnit(
+    ffi.Pointer<ffi.Void> CIdx,
+    ffi.Pointer<ffi.Int8> ast_filename,
+  ) {
+    _clang_createTranslationUnit ??= _dylib.lookupFunction<
+        _c_clang_createTranslationUnit,
+        _dart_clang_createTranslationUnit>('clang_createTranslationUnit');
+    return _clang_createTranslationUnit(
+      CIdx,
+      ast_filename,
+    );
+  }
+
+  _dart_clang_createTranslationUnit _clang_createTranslationUnit;
+
+  /// Create a translation unit from an AST file (\c -emit-ast).
+  ///
+  /// \param[out] out_TU A non-NULL pointer to store the created
+  /// \c CXTranslationUnit.
+  ///
+  /// \returns Zero on success, otherwise returns an error code.
+  int clang_createTranslationUnit2(
+    ffi.Pointer<ffi.Void> CIdx,
+    ffi.Pointer<ffi.Int8> ast_filename,
+    ffi.Pointer<ffi.Pointer<CXTranslationUnitImpl>> out_TU,
+  ) {
+    _clang_createTranslationUnit2 ??= _dylib.lookupFunction<
+        _c_clang_createTranslationUnit2,
+        _dart_clang_createTranslationUnit2>('clang_createTranslationUnit2');
+    return _clang_createTranslationUnit2(
+      CIdx,
+      ast_filename,
+      out_TU,
+    );
+  }
+
+  _dart_clang_createTranslationUnit2 _clang_createTranslationUnit2;
+
+  /// Returns the set of flags that is suitable for parsing a translation
+  /// unit that is being edited.
+  ///
+  /// The set of flags returned provide options for \c clang_parseTranslationUnit()
+  /// to indicate that the translation unit is likely to be reparsed many times,
+  /// either explicitly (via \c clang_reparseTranslationUnit()) or implicitly
+  /// (e.g., by code completion (\c clang_codeCompletionAt())). The returned flag
+  /// set contains an unspecified set of optimizations (e.g., the precompiled
+  /// preamble) geared toward improving the performance of these routines. The
+  /// set of optimizations enabled may change from one version to the next.
+  int clang_defaultEditingTranslationUnitOptions() {
+    _clang_defaultEditingTranslationUnitOptions ??= _dylib.lookupFunction<
+            _c_clang_defaultEditingTranslationUnitOptions,
+            _dart_clang_defaultEditingTranslationUnitOptions>(
+        'clang_defaultEditingTranslationUnitOptions');
+    return _clang_defaultEditingTranslationUnitOptions();
+  }
+
+  _dart_clang_defaultEditingTranslationUnitOptions
+      _clang_defaultEditingTranslationUnitOptions;
+
+  /// Same as \c clang_parseTranslationUnit2, but returns
+  /// the \c CXTranslationUnit instead of an error code.  In case of an error this
+  /// routine returns a \c NULL \c CXTranslationUnit, without further detailed
+  /// error codes.
+  ffi.Pointer<CXTranslationUnitImpl> clang_parseTranslationUnit(
+    ffi.Pointer<ffi.Void> 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,
+  ) {
+    _clang_parseTranslationUnit ??= _dylib.lookupFunction<
+        _c_clang_parseTranslationUnit,
+        _dart_clang_parseTranslationUnit>('clang_parseTranslationUnit');
+    return _clang_parseTranslationUnit(
+      CIdx,
+      source_filename,
+      command_line_args,
+      num_command_line_args,
+      unsaved_files,
+      num_unsaved_files,
+      options,
+    );
+  }
+
+  _dart_clang_parseTranslationUnit _clang_parseTranslationUnit;
+
+  /// Parse the given source file and the translation unit corresponding
+  /// to that file.
+  ///
+  /// This routine is the main entry point for the Clang C API, providing the
+  /// ability to parse a source file into a translation unit that can then be
+  /// queried by other functions in the API. This routine accepts a set of
+  /// command-line arguments so that the compilation can be configured in the same
+  /// way that the compiler is configured on the command line.
+  ///
+  /// \param CIdx The index object with which the translation unit will be
+  /// associated.
+  ///
+  /// \param source_filename The name of the source file to load, or NULL if the
+  /// source file is included in \c command_line_args.
+  ///
+  /// \param command_line_args The command-line arguments that would be
+  /// passed to the \c clang executable if it were being invoked out-of-process.
+  /// These command-line options will be parsed and will affect how the translation
+  /// unit is parsed. Note that the following options are ignored: '-c',
+  /// '-emit-ast', '-fsyntax-only' (which is the default), and '-o \<output file>'.
+  ///
+  /// \param num_command_line_args The number of command-line arguments in
+  /// \c command_line_args.
+  ///
+  /// \param unsaved_files the files that have not yet been saved to disk
+  /// but may be required for parsing, including the contents of
+  /// those files.  The contents and name of these files (as specified by
+  /// CXUnsavedFile) are copied when necessary, so the client only needs to
+  /// guarantee their validity until the call to this function returns.
+  ///
+  /// \param num_unsaved_files the number of unsaved file entries in \p
+  /// unsaved_files.
+  ///
+  /// \param options A bitmask of options that affects how the translation unit
+  /// is managed but not its compilation. This should be a bitwise OR of the
+  /// CXTranslationUnit_XXX flags.
+  ///
+  /// \param[out] out_TU A non-NULL pointer to store the created
+  /// \c CXTranslationUnit, describing the parsed code and containing any
+  /// diagnostics produced by the compiler.
+  ///
+  /// \returns Zero on success, otherwise returns an error code.
+  int clang_parseTranslationUnit2(
+    ffi.Pointer<ffi.Void> 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<ffi.Pointer<CXTranslationUnitImpl>> out_TU,
+  ) {
+    _clang_parseTranslationUnit2 ??= _dylib.lookupFunction<
+        _c_clang_parseTranslationUnit2,
+        _dart_clang_parseTranslationUnit2>('clang_parseTranslationUnit2');
+    return _clang_parseTranslationUnit2(
+      CIdx,
+      source_filename,
+      command_line_args,
+      num_command_line_args,
+      unsaved_files,
+      num_unsaved_files,
+      options,
+      out_TU,
+    );
+  }
+
+  _dart_clang_parseTranslationUnit2 _clang_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
+  /// library paths are relative to the binary.
+  int clang_parseTranslationUnit2FullArgv(
+    ffi.Pointer<ffi.Void> 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<ffi.Pointer<CXTranslationUnitImpl>> out_TU,
+  ) {
+    _clang_parseTranslationUnit2FullArgv ??= _dylib.lookupFunction<
+            _c_clang_parseTranslationUnit2FullArgv,
+            _dart_clang_parseTranslationUnit2FullArgv>(
+        'clang_parseTranslationUnit2FullArgv');
+    return _clang_parseTranslationUnit2FullArgv(
+      CIdx,
+      source_filename,
+      command_line_args,
+      num_command_line_args,
+      unsaved_files,
+      num_unsaved_files,
+      options,
+      out_TU,
+    );
+  }
+
+  _dart_clang_parseTranslationUnit2FullArgv
+      _clang_parseTranslationUnit2FullArgv;
+
+  /// Returns the set of flags that is suitable for saving a translation
+  /// unit.
+  ///
+  /// The set of flags returned provide options for
+  /// \c clang_saveTranslationUnit() by default. The returned flag
+  /// set contains an unspecified set of options that save translation units with
+  /// the most commonly-requested data.
+  int clang_defaultSaveOptions(
+    ffi.Pointer<CXTranslationUnitImpl> TU,
+  ) {
+    _clang_defaultSaveOptions ??= _dylib.lookupFunction<
+        _c_clang_defaultSaveOptions,
+        _dart_clang_defaultSaveOptions>('clang_defaultSaveOptions');
+    return _clang_defaultSaveOptions(
+      TU,
+    );
+  }
+
+  _dart_clang_defaultSaveOptions _clang_defaultSaveOptions;
+
+  /// Saves a translation unit into a serialized representation of
+  /// that translation unit on disk.
+  ///
+  /// Any translation unit that was parsed without error can be saved
+  /// into a file. The translation unit can then be deserialized into a
+  /// new \c CXTranslationUnit with \c clang_createTranslationUnit() or,
+  /// if it is an incomplete translation unit that corresponds to a
+  /// header, used as a precompiled header when parsing other translation
+  /// units.
+  ///
+  /// \param TU The translation unit to save.
+  ///
+  /// \param FileName The file to which the translation unit will be saved.
+  ///
+  /// \param options A bitmask of options that affects how the translation unit
+  /// is saved. This should be a bitwise OR of the
+  /// CXSaveTranslationUnit_XXX flags.
+  ///
+  /// \returns A value that will match one of the enumerators of the CXSaveError
+  /// enumeration. Zero (CXSaveError_None) indicates that the translation unit was
+  /// saved successfully, while a non-zero value indicates that a problem occurred.
+  int clang_saveTranslationUnit(
+    ffi.Pointer<CXTranslationUnitImpl> TU,
+    ffi.Pointer<ffi.Int8> FileName,
+    int options,
+  ) {
+    _clang_saveTranslationUnit ??= _dylib.lookupFunction<
+        _c_clang_saveTranslationUnit,
+        _dart_clang_saveTranslationUnit>('clang_saveTranslationUnit');
+    return _clang_saveTranslationUnit(
+      TU,
+      FileName,
+      options,
+    );
+  }
+
+  _dart_clang_saveTranslationUnit _clang_saveTranslationUnit;
+
+  /// Suspend a translation unit in order to free memory associated with it.
+  ///
+  /// A suspended translation unit uses significantly less memory but on the other
+  /// side does not support any other calls than \c clang_reparseTranslationUnit
+  /// to resume it or \c clang_disposeTranslationUnit to dispose it completely.
+  int clang_suspendTranslationUnit(
+    ffi.Pointer<CXTranslationUnitImpl> arg0,
+  ) {
+    _clang_suspendTranslationUnit ??= _dylib.lookupFunction<
+        _c_clang_suspendTranslationUnit,
+        _dart_clang_suspendTranslationUnit>('clang_suspendTranslationUnit');
+    return _clang_suspendTranslationUnit(
+      arg0,
+    );
+  }
+
+  _dart_clang_suspendTranslationUnit _clang_suspendTranslationUnit;
+
+  /// Destroy the specified CXTranslationUnit object.
+  void clang_disposeTranslationUnit(
+    ffi.Pointer<CXTranslationUnitImpl> arg0,
+  ) {
+    _clang_disposeTranslationUnit ??= _dylib.lookupFunction<
+        _c_clang_disposeTranslationUnit,
+        _dart_clang_disposeTranslationUnit>('clang_disposeTranslationUnit');
+    return _clang_disposeTranslationUnit(
+      arg0,
+    );
+  }
+
+  _dart_clang_disposeTranslationUnit _clang_disposeTranslationUnit;
+
+  /// Returns the set of flags that is suitable for reparsing a translation
+  /// unit.
+  ///
+  /// The set of flags returned provide options for
+  /// \c clang_reparseTranslationUnit() by default. The returned flag
+  /// set contains an unspecified set of optimizations geared toward common uses
+  /// of reparsing. The set of optimizations enabled may change from one version
+  /// to the next.
+  int clang_defaultReparseOptions(
+    ffi.Pointer<CXTranslationUnitImpl> TU,
+  ) {
+    _clang_defaultReparseOptions ??= _dylib.lookupFunction<
+        _c_clang_defaultReparseOptions,
+        _dart_clang_defaultReparseOptions>('clang_defaultReparseOptions');
+    return _clang_defaultReparseOptions(
+      TU,
+    );
+  }
+
+  _dart_clang_defaultReparseOptions _clang_defaultReparseOptions;
+
+  /// Reparse the source files that produced this translation unit.
+  ///
+  /// This routine can be used to re-parse the source files that originally
+  /// created the given translation unit, for example because those source files
+  /// have changed (either on disk or as passed via \p unsaved_files). The
+  /// source code will be reparsed with the same command-line options as it
+  /// was originally parsed.
+  ///
+  /// Reparsing a translation unit invalidates all cursors and source locations
+  /// that refer into that translation unit. This makes reparsing a translation
+  /// unit semantically equivalent to destroying the translation unit and then
+  /// creating a new translation unit with the same command-line arguments.
+  /// However, it may be more efficient to reparse a translation
+  /// unit using this routine.
+  ///
+  /// \param TU The translation unit whose contents will be re-parsed. The
+  /// translation unit must originally have been built with
+  /// \c clang_createTranslationUnitFromSourceFile().
+  ///
+  /// \param num_unsaved_files The number of unsaved file entries in \p
+  /// unsaved_files.
+  ///
+  /// \param unsaved_files The files that have not yet been saved to disk
+  /// but may be required for parsing, including the contents of
+  /// those files.  The contents and name of these files (as specified by
+  /// CXUnsavedFile) are copied when necessary, so the client only needs to
+  /// guarantee their validity until the call to this function returns.
+  ///
+  /// \param options A bitset of options composed of the flags in CXReparse_Flags.
+  /// The function \c clang_defaultReparseOptions() produces a default set of
+  /// options recommended for most uses, based on the translation unit.
+  ///
+  /// \returns 0 if the sources could be reparsed.  A non-zero error code will be
+  /// returned if reparsing was impossible, such that the translation unit is
+  /// invalid. In such cases, the only valid call for \c TU is
+  /// \c clang_disposeTranslationUnit(TU).  The error codes returned by this
+  /// routine are described by the \c CXErrorCode enum.
+  int clang_reparseTranslationUnit(
+    ffi.Pointer<CXTranslationUnitImpl> TU,
+    int num_unsaved_files,
+    ffi.Pointer<CXUnsavedFile> unsaved_files,
+    int options,
+  ) {
+    _clang_reparseTranslationUnit ??= _dylib.lookupFunction<
+        _c_clang_reparseTranslationUnit,
+        _dart_clang_reparseTranslationUnit>('clang_reparseTranslationUnit');
+    return _clang_reparseTranslationUnit(
+      TU,
+      num_unsaved_files,
+      unsaved_files,
+      options,
+    );
+  }
+
+  _dart_clang_reparseTranslationUnit _clang_reparseTranslationUnit;
+
+  /// Returns the human-readable null-terminated C string that represents
+  /// the name of the memory category.  This string should never be freed.
+  ffi.Pointer<ffi.Int8> clang_getTUResourceUsageName(
+    int kind,
+  ) {
+    _clang_getTUResourceUsageName ??= _dylib.lookupFunction<
+        _c_clang_getTUResourceUsageName,
+        _dart_clang_getTUResourceUsageName>('clang_getTUResourceUsageName');
+    return _clang_getTUResourceUsageName(
+      kind,
+    );
+  }
+
+  _dart_clang_getTUResourceUsageName _clang_getTUResourceUsageName;
+
+  /// Get target information for this translation unit.
+  ///
+  /// The CXTargetInfo object cannot outlive the CXTranslationUnit object.
+  ffi.Pointer<CXTargetInfoImpl> clang_getTranslationUnitTargetInfo(
+    ffi.Pointer<CXTranslationUnitImpl> CTUnit,
+  ) {
+    _clang_getTranslationUnitTargetInfo ??= _dylib.lookupFunction<
+            _c_clang_getTranslationUnitTargetInfo,
+            _dart_clang_getTranslationUnitTargetInfo>(
+        'clang_getTranslationUnitTargetInfo');
+    return _clang_getTranslationUnitTargetInfo(
+      CTUnit,
+    );
+  }
+
+  _dart_clang_getTranslationUnitTargetInfo _clang_getTranslationUnitTargetInfo;
+
+  /// Destroy the CXTargetInfo object.
+  void clang_TargetInfo_dispose(
+    ffi.Pointer<CXTargetInfoImpl> Info,
+  ) {
+    _clang_TargetInfo_dispose ??= _dylib.lookupFunction<
+        _c_clang_TargetInfo_dispose,
+        _dart_clang_TargetInfo_dispose>('clang_TargetInfo_dispose');
+    return _clang_TargetInfo_dispose(
+      Info,
+    );
+  }
+
+  _dart_clang_TargetInfo_dispose _clang_TargetInfo_dispose;
+
+  /// Get the pointer width of the target in bits.
+  ///
+  /// Returns -1 in case of error.
+  int clang_TargetInfo_getPointerWidth(
+    ffi.Pointer<CXTargetInfoImpl> Info,
+  ) {
+    _clang_TargetInfo_getPointerWidth ??= _dylib.lookupFunction<
+            _c_clang_TargetInfo_getPointerWidth,
+            _dart_clang_TargetInfo_getPointerWidth>(
+        'clang_TargetInfo_getPointerWidth');
+    return _clang_TargetInfo_getPointerWidth(
+      Info,
+    );
+  }
+
+  _dart_clang_TargetInfo_getPointerWidth _clang_TargetInfo_getPointerWidth;
+
+  /// Determine whether the given cursor kind represents a declaration.
+  int clang_isDeclaration(
+    int arg0,
+  ) {
+    _clang_isDeclaration ??= _dylib.lookupFunction<_c_clang_isDeclaration,
+        _dart_clang_isDeclaration>('clang_isDeclaration');
+    return _clang_isDeclaration(
+      arg0,
+    );
+  }
+
+  _dart_clang_isDeclaration _clang_isDeclaration;
+
+  /// Determine whether the given cursor kind represents a simple
+  /// reference.
+  ///
+  /// Note that other kinds of cursors (such as expressions) can also refer to
+  /// other cursors. Use clang_getCursorReferenced() to determine whether a
+  /// particular cursor refers to another entity.
+  int clang_isReference(
+    int arg0,
+  ) {
+    _clang_isReference ??=
+        _dylib.lookupFunction<_c_clang_isReference, _dart_clang_isReference>(
+            'clang_isReference');
+    return _clang_isReference(
+      arg0,
+    );
+  }
+
+  _dart_clang_isReference _clang_isReference;
+
+  /// Determine whether the given cursor kind represents an expression.
+  int clang_isExpression(
+    int arg0,
+  ) {
+    _clang_isExpression ??=
+        _dylib.lookupFunction<_c_clang_isExpression, _dart_clang_isExpression>(
+            'clang_isExpression');
+    return _clang_isExpression(
+      arg0,
+    );
+  }
+
+  _dart_clang_isExpression _clang_isExpression;
+
+  /// Determine whether the given cursor kind represents a statement.
+  int clang_isStatement(
+    int arg0,
+  ) {
+    _clang_isStatement ??=
+        _dylib.lookupFunction<_c_clang_isStatement, _dart_clang_isStatement>(
+            'clang_isStatement');
+    return _clang_isStatement(
+      arg0,
+    );
+  }
+
+  _dart_clang_isStatement _clang_isStatement;
+
+  /// Determine whether the given cursor kind represents an attribute.
+  int clang_isAttribute(
+    int arg0,
+  ) {
+    _clang_isAttribute ??=
+        _dylib.lookupFunction<_c_clang_isAttribute, _dart_clang_isAttribute>(
+            'clang_isAttribute');
+    return _clang_isAttribute(
+      arg0,
+    );
+  }
+
+  _dart_clang_isAttribute _clang_isAttribute;
+
+  /// Determine whether the given cursor kind represents an invalid
+  /// cursor.
+  int clang_isInvalid(
+    int arg0,
+  ) {
+    _clang_isInvalid ??=
+        _dylib.lookupFunction<_c_clang_isInvalid, _dart_clang_isInvalid>(
+            'clang_isInvalid');
+    return _clang_isInvalid(
+      arg0,
+    );
+  }
+
+  _dart_clang_isInvalid _clang_isInvalid;
+
+  /// Determine whether the given cursor kind represents a translation
+  /// unit.
+  int clang_isTranslationUnit(
+    int arg0,
+  ) {
+    _clang_isTranslationUnit ??= _dylib.lookupFunction<
+        _c_clang_isTranslationUnit,
+        _dart_clang_isTranslationUnit>('clang_isTranslationUnit');
+    return _clang_isTranslationUnit(
+      arg0,
+    );
+  }
+
+  _dart_clang_isTranslationUnit _clang_isTranslationUnit;
+
+  /// Determine whether the given cursor represents a preprocessing
+  /// element, such as a preprocessor directive or macro instantiation.
+  int clang_isPreprocessing(
+    int arg0,
+  ) {
+    _clang_isPreprocessing ??= _dylib.lookupFunction<_c_clang_isPreprocessing,
+        _dart_clang_isPreprocessing>('clang_isPreprocessing');
+    return _clang_isPreprocessing(
+      arg0,
+    );
+  }
+
+  _dart_clang_isPreprocessing _clang_isPreprocessing;
+
+  /// Determine whether the given cursor represents a currently
+  /// unexposed piece of the AST (e.g., CXCursor_UnexposedStmt).
+  int clang_isUnexposed(
+    int arg0,
+  ) {
+    _clang_isUnexposed ??=
+        _dylib.lookupFunction<_c_clang_isUnexposed, _dart_clang_isUnexposed>(
+            'clang_isUnexposed');
+    return _clang_isUnexposed(
+      arg0,
+    );
+  }
+
+  _dart_clang_isUnexposed _clang_isUnexposed;
+
+  /// Free the memory associated with a \c CXPlatformAvailability structure.
+  void clang_disposeCXPlatformAvailability(
+    ffi.Pointer<CXPlatformAvailability> availability,
+  ) {
+    _clang_disposeCXPlatformAvailability ??= _dylib.lookupFunction<
+            _c_clang_disposeCXPlatformAvailability,
+            _dart_clang_disposeCXPlatformAvailability>(
+        'clang_disposeCXPlatformAvailability');
+    return _clang_disposeCXPlatformAvailability(
+      availability,
+    );
+  }
+
+  _dart_clang_disposeCXPlatformAvailability
+      _clang_disposeCXPlatformAvailability;
+
+  /// Creates an empty CXCursorSet.
+  ffi.Pointer<CXCursorSetImpl> clang_createCXCursorSet() {
+    _clang_createCXCursorSet ??= _dylib.lookupFunction<
+        _c_clang_createCXCursorSet,
+        _dart_clang_createCXCursorSet>('clang_createCXCursorSet');
+    return _clang_createCXCursorSet();
+  }
+
+  _dart_clang_createCXCursorSet _clang_createCXCursorSet;
+
+  /// Disposes a CXCursorSet and releases its associated memory.
+  void clang_disposeCXCursorSet(
+    ffi.Pointer<CXCursorSetImpl> cset,
+  ) {
+    _clang_disposeCXCursorSet ??= _dylib.lookupFunction<
+        _c_clang_disposeCXCursorSet,
+        _dart_clang_disposeCXCursorSet>('clang_disposeCXCursorSet');
+    return _clang_disposeCXCursorSet(
+      cset,
+    );
+  }
+
+  _dart_clang_disposeCXCursorSet _clang_disposeCXCursorSet;
+
+  /// Free the set of overridden cursors returned by \c
+  /// clang_getOverriddenCursors().
+  void clang_disposeOverriddenCursors(
+    ffi.Pointer<CXCursor> overridden,
+  ) {
+    _clang_disposeOverriddenCursors ??= _dylib.lookupFunction<
+        _c_clang_disposeOverriddenCursors,
+        _dart_clang_disposeOverriddenCursors>('clang_disposeOverriddenCursors');
+    return _clang_disposeOverriddenCursors(
+      overridden,
+    );
+  }
+
+  _dart_clang_disposeOverriddenCursors _clang_disposeOverriddenCursors;
+
+  /// Get a property value for the given printing policy.
+  int clang_PrintingPolicy_getProperty(
+    ffi.Pointer<ffi.Void> Policy,
+    int Property,
+  ) {
+    _clang_PrintingPolicy_getProperty ??= _dylib.lookupFunction<
+            _c_clang_PrintingPolicy_getProperty,
+            _dart_clang_PrintingPolicy_getProperty>(
+        'clang_PrintingPolicy_getProperty');
+    return _clang_PrintingPolicy_getProperty(
+      Policy,
+      Property,
+    );
+  }
+
+  _dart_clang_PrintingPolicy_getProperty _clang_PrintingPolicy_getProperty;
+
+  /// Set a property value for the given printing policy.
+  void clang_PrintingPolicy_setProperty(
+    ffi.Pointer<ffi.Void> Policy,
+    int Property,
+    int Value,
+  ) {
+    _clang_PrintingPolicy_setProperty ??= _dylib.lookupFunction<
+            _c_clang_PrintingPolicy_setProperty,
+            _dart_clang_PrintingPolicy_setProperty>(
+        'clang_PrintingPolicy_setProperty');
+    return _clang_PrintingPolicy_setProperty(
+      Policy,
+      Property,
+      Value,
+    );
+  }
+
+  _dart_clang_PrintingPolicy_setProperty _clang_PrintingPolicy_setProperty;
+
+  /// Release a printing policy.
+  void clang_PrintingPolicy_dispose(
+    ffi.Pointer<ffi.Void> Policy,
+  ) {
+    _clang_PrintingPolicy_dispose ??= _dylib.lookupFunction<
+        _c_clang_PrintingPolicy_dispose,
+        _dart_clang_PrintingPolicy_dispose>('clang_PrintingPolicy_dispose');
+    return _clang_PrintingPolicy_dispose(
+      Policy,
+    );
+  }
+
+  _dart_clang_PrintingPolicy_dispose _clang_PrintingPolicy_dispose;
+
+  /// Given a CXFile header file, return the module that contains it, if one
+  /// exists.
+  ffi.Pointer<ffi.Void> clang_getModuleForFile(
+    ffi.Pointer<CXTranslationUnitImpl> arg0,
+    ffi.Pointer<ffi.Void> arg1,
+  ) {
+    _clang_getModuleForFile ??= _dylib.lookupFunction<_c_clang_getModuleForFile,
+        _dart_clang_getModuleForFile>('clang_getModuleForFile');
+    return _clang_getModuleForFile(
+      arg0,
+      arg1,
+    );
+  }
+
+  _dart_clang_getModuleForFile _clang_getModuleForFile;
+
+  /// \param Module a module object.
+  ///
+  /// \returns the module file where the provided module object came from.
+  ffi.Pointer<ffi.Void> clang_Module_getASTFile(
+    ffi.Pointer<ffi.Void> Module,
+  ) {
+    _clang_Module_getASTFile ??= _dylib.lookupFunction<
+        _c_clang_Module_getASTFile,
+        _dart_clang_Module_getASTFile>('clang_Module_getASTFile');
+    return _clang_Module_getASTFile(
+      Module,
+    );
+  }
+
+  _dart_clang_Module_getASTFile _clang_Module_getASTFile;
+
+  /// \param Module a module object.
+  ///
+  /// \returns the parent of a sub-module or NULL if the given module is top-level,
+  /// e.g. for 'std.vector' it will return the 'std' module.
+  ffi.Pointer<ffi.Void> clang_Module_getParent(
+    ffi.Pointer<ffi.Void> Module,
+  ) {
+    _clang_Module_getParent ??= _dylib.lookupFunction<_c_clang_Module_getParent,
+        _dart_clang_Module_getParent>('clang_Module_getParent');
+    return _clang_Module_getParent(
+      Module,
+    );
+  }
+
+  _dart_clang_Module_getParent _clang_Module_getParent;
+
+  /// \param Module a module object.
+  ///
+  /// \returns non-zero if the module is a system one.
+  int clang_Module_isSystem(
+    ffi.Pointer<ffi.Void> Module,
+  ) {
+    _clang_Module_isSystem ??= _dylib.lookupFunction<_c_clang_Module_isSystem,
+        _dart_clang_Module_isSystem>('clang_Module_isSystem');
+    return _clang_Module_isSystem(
+      Module,
+    );
+  }
+
+  _dart_clang_Module_isSystem _clang_Module_isSystem;
+
+  /// \param Module a module object.
+  ///
+  /// \returns the number of top level headers associated with this module.
+  int clang_Module_getNumTopLevelHeaders(
+    ffi.Pointer<CXTranslationUnitImpl> arg0,
+    ffi.Pointer<ffi.Void> Module,
+  ) {
+    _clang_Module_getNumTopLevelHeaders ??= _dylib.lookupFunction<
+            _c_clang_Module_getNumTopLevelHeaders,
+            _dart_clang_Module_getNumTopLevelHeaders>(
+        'clang_Module_getNumTopLevelHeaders');
+    return _clang_Module_getNumTopLevelHeaders(
+      arg0,
+      Module,
+    );
+  }
+
+  _dart_clang_Module_getNumTopLevelHeaders _clang_Module_getNumTopLevelHeaders;
+
+  /// \param Module a module object.
+  ///
+  /// \param Index top level header index (zero-based).
+  ///
+  /// \returns the specified top level header associated with the module.
+  ffi.Pointer<ffi.Void> clang_Module_getTopLevelHeader(
+    ffi.Pointer<CXTranslationUnitImpl> arg0,
+    ffi.Pointer<ffi.Void> Module,
+    int Index,
+  ) {
+    _clang_Module_getTopLevelHeader ??= _dylib.lookupFunction<
+        _c_clang_Module_getTopLevelHeader,
+        _dart_clang_Module_getTopLevelHeader>('clang_Module_getTopLevelHeader');
+    return _clang_Module_getTopLevelHeader(
+      arg0,
+      Module,
+      Index,
+    );
+  }
+
+  _dart_clang_Module_getTopLevelHeader _clang_Module_getTopLevelHeader;
+
+  /// 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.
+  ///
+  /// This token-annotation routine is equivalent to invoking
+  /// clang_getCursor() for the source locations of each of the
+  /// tokens. The cursors provided are filtered, so that only those
+  /// cursors that have a direct correspondence to the token are
+  /// accepted. For example, given a function call \c f(x),
+  /// clang_getCursor() would provide the following cursors:
+  ///
+  /// * when the cursor is over the 'f', a DeclRefExpr cursor referring to 'f'.
+  /// * when the cursor is over the '(' or the ')', a CallExpr referring to 'f'.
+  /// * when the cursor is over the 'x', a DeclRefExpr cursor referring to 'x'.
+  ///
+  /// Only the first and last of these cursors will occur within the
+  /// annotate, since the tokens "f" and "x' directly refer to a function
+  /// and a variable, respectively, but the parentheses are just a small
+  /// part of the full syntax of the function call expression, which is
+  /// not provided as an annotation.
+  ///
+  /// \param TU the translation unit that owns the given tokens.
+  ///
+  /// \param Tokens the set of tokens to annotate.
+  ///
+  /// \param NumTokens the number of tokens in \p Tokens.
+  ///
+  /// \param Cursors an array of \p NumTokens cursors, whose contents will be
+  /// replaced with the cursors corresponding to each token.
+  void clang_annotateTokens(
+    ffi.Pointer<CXTranslationUnitImpl> TU,
+    ffi.Pointer<CXToken> Tokens,
+    int NumTokens,
+    ffi.Pointer<CXCursor> Cursors,
+  ) {
+    _clang_annotateTokens ??= _dylib.lookupFunction<_c_clang_annotateTokens,
+        _dart_clang_annotateTokens>('clang_annotateTokens');
+    return _clang_annotateTokens(
+      TU,
+      Tokens,
+      NumTokens,
+      Cursors,
+    );
+  }
+
+  _dart_clang_annotateTokens _clang_annotateTokens;
+
+  /// Free the given set of tokens.
+  void clang_disposeTokens(
+    ffi.Pointer<CXTranslationUnitImpl> TU,
+    ffi.Pointer<CXToken> Tokens,
+    int NumTokens,
+  ) {
+    _clang_disposeTokens ??= _dylib.lookupFunction<_c_clang_disposeTokens,
+        _dart_clang_disposeTokens>('clang_disposeTokens');
+    return _clang_disposeTokens(
+      TU,
+      Tokens,
+      NumTokens,
+    );
+  }
+
+  _dart_clang_disposeTokens _clang_disposeTokens;
+
+  void clang_enableStackTraces() {
+    _clang_enableStackTraces ??= _dylib.lookupFunction<
+        _c_clang_enableStackTraces,
+        _dart_clang_enableStackTraces>('clang_enableStackTraces');
+    return _clang_enableStackTraces();
+  }
+
+  _dart_clang_enableStackTraces _clang_enableStackTraces;
+
+  void clang_executeOnThread(
+    ffi.Pointer<ffi.NativeFunction<_typedefC_1>> fn,
+    ffi.Pointer<ffi.Void> user_data,
+    int stack_size,
+  ) {
+    _clang_executeOnThread ??= _dylib.lookupFunction<_c_clang_executeOnThread,
+        _dart_clang_executeOnThread>('clang_executeOnThread');
+    return _clang_executeOnThread(
+      fn,
+      user_data,
+      stack_size,
+    );
+  }
+
+  _dart_clang_executeOnThread _clang_executeOnThread;
+
+  /// Determine the kind of a particular chunk within a completion string.
+  ///
+  /// \param completion_string the completion string to query.
+  ///
+  /// \param chunk_number the 0-based index of the chunk in the completion string.
+  ///
+  /// \returns the kind of the chunk at the index \c chunk_number.
+  int clang_getCompletionChunkKind(
+    ffi.Pointer<ffi.Void> completion_string,
+    int chunk_number,
+  ) {
+    _clang_getCompletionChunkKind ??= _dylib.lookupFunction<
+        _c_clang_getCompletionChunkKind,
+        _dart_clang_getCompletionChunkKind>('clang_getCompletionChunkKind');
+    return _clang_getCompletionChunkKind(
+      completion_string,
+      chunk_number,
+    );
+  }
+
+  _dart_clang_getCompletionChunkKind _clang_getCompletionChunkKind;
+
+  /// Retrieve the completion string associated with a particular chunk
+  /// within a completion string.
+  ///
+  /// \param completion_string the completion string to query.
+  ///
+  /// \param chunk_number the 0-based index of the chunk in the completion string.
+  ///
+  /// \returns the completion string associated with the chunk at index
+  /// \c chunk_number.
+  ffi.Pointer<ffi.Void> clang_getCompletionChunkCompletionString(
+    ffi.Pointer<ffi.Void> completion_string,
+    int chunk_number,
+  ) {
+    _clang_getCompletionChunkCompletionString ??= _dylib.lookupFunction<
+            _c_clang_getCompletionChunkCompletionString,
+            _dart_clang_getCompletionChunkCompletionString>(
+        'clang_getCompletionChunkCompletionString');
+    return _clang_getCompletionChunkCompletionString(
+      completion_string,
+      chunk_number,
+    );
+  }
+
+  _dart_clang_getCompletionChunkCompletionString
+      _clang_getCompletionChunkCompletionString;
+
+  /// Retrieve the number of chunks in the given code-completion string.
+  int clang_getNumCompletionChunks(
+    ffi.Pointer<ffi.Void> completion_string,
+  ) {
+    _clang_getNumCompletionChunks ??= _dylib.lookupFunction<
+        _c_clang_getNumCompletionChunks,
+        _dart_clang_getNumCompletionChunks>('clang_getNumCompletionChunks');
+    return _clang_getNumCompletionChunks(
+      completion_string,
+    );
+  }
+
+  _dart_clang_getNumCompletionChunks _clang_getNumCompletionChunks;
+
+  /// Determine the priority of this code completion.
+  ///
+  /// The priority of a code completion indicates how likely it is that this
+  /// particular completion is the completion that the user will select. The
+  /// priority is selected by various internal heuristics.
+  ///
+  /// \param completion_string The completion string to query.
+  ///
+  /// \returns The priority of this completion string. Smaller values indicate
+  /// higher-priority (more likely) completions.
+  int clang_getCompletionPriority(
+    ffi.Pointer<ffi.Void> completion_string,
+  ) {
+    _clang_getCompletionPriority ??= _dylib.lookupFunction<
+        _c_clang_getCompletionPriority,
+        _dart_clang_getCompletionPriority>('clang_getCompletionPriority');
+    return _clang_getCompletionPriority(
+      completion_string,
+    );
+  }
+
+  _dart_clang_getCompletionPriority _clang_getCompletionPriority;
+
+  /// Determine the availability of the entity that this code-completion
+  /// string refers to.
+  ///
+  /// \param completion_string The completion string to query.
+  ///
+  /// \returns The availability of the completion string.
+  int clang_getCompletionAvailability(
+    ffi.Pointer<ffi.Void> completion_string,
+  ) {
+    _clang_getCompletionAvailability ??= _dylib.lookupFunction<
+            _c_clang_getCompletionAvailability,
+            _dart_clang_getCompletionAvailability>(
+        'clang_getCompletionAvailability');
+    return _clang_getCompletionAvailability(
+      completion_string,
+    );
+  }
+
+  _dart_clang_getCompletionAvailability _clang_getCompletionAvailability;
+
+  /// Retrieve the number of annotations associated with the given
+  /// completion string.
+  ///
+  /// \param completion_string the completion string to query.
+  ///
+  /// \returns the number of annotations associated with the given completion
+  /// string.
+  int clang_getCompletionNumAnnotations(
+    ffi.Pointer<ffi.Void> completion_string,
+  ) {
+    _clang_getCompletionNumAnnotations ??= _dylib.lookupFunction<
+            _c_clang_getCompletionNumAnnotations,
+            _dart_clang_getCompletionNumAnnotations>(
+        'clang_getCompletionNumAnnotations');
+    return _clang_getCompletionNumAnnotations(
+      completion_string,
+    );
+  }
+
+  _dart_clang_getCompletionNumAnnotations _clang_getCompletionNumAnnotations;
+
+  /// Retrieve the number of fix-its for the given completion index.
+  ///
+  /// Calling this makes sense only if CXCodeComplete_IncludeCompletionsWithFixIts
+  /// option was set.
+  ///
+  /// \param results The structure keeping all completion results
+  ///
+  /// \param completion_index The index of the completion
+  ///
+  /// \return The number of fix-its which must be applied before the completion at
+  /// completion_index can be applied
+  int clang_getCompletionNumFixIts(
+    ffi.Pointer<CXCodeCompleteResults> results,
+    int completion_index,
+  ) {
+    _clang_getCompletionNumFixIts ??= _dylib.lookupFunction<
+        _c_clang_getCompletionNumFixIts,
+        _dart_clang_getCompletionNumFixIts>('clang_getCompletionNumFixIts');
+    return _clang_getCompletionNumFixIts(
+      results,
+      completion_index,
+    );
+  }
+
+  _dart_clang_getCompletionNumFixIts _clang_getCompletionNumFixIts;
+
+  /// Returns a default set of code-completion options that can be
+  /// passed to\c clang_codeCompleteAt().
+  int clang_defaultCodeCompleteOptions() {
+    _clang_defaultCodeCompleteOptions ??= _dylib.lookupFunction<
+            _c_clang_defaultCodeCompleteOptions,
+            _dart_clang_defaultCodeCompleteOptions>(
+        'clang_defaultCodeCompleteOptions');
+    return _clang_defaultCodeCompleteOptions();
+  }
+
+  _dart_clang_defaultCodeCompleteOptions _clang_defaultCodeCompleteOptions;
+
+  /// Perform code completion at a given location in a translation unit.
+  ///
+  /// This function performs code completion at a particular file, line, and
+  /// column within source code, providing results that suggest potential
+  /// code snippets based on the context of the completion. The basic model
+  /// for code completion is that Clang will parse a complete source file,
+  /// performing syntax checking up to the location where code-completion has
+  /// been requested. At that point, a special code-completion token is passed
+  /// to the parser, which recognizes this token and determines, based on the
+  /// current location in the C/Objective-C/C++ grammar and the state of
+  /// semantic analysis, what completions to provide. These completions are
+  /// returned via a new \c CXCodeCompleteResults structure.
+  ///
+  /// Code completion itself is meant to be triggered by the client when the
+  /// user types punctuation characters or whitespace, at which point the
+  /// code-completion location will coincide with the cursor. For example, if \c p
+  /// is a pointer, code-completion might be triggered after the "-" and then
+  /// after the ">" in \c p->. When the code-completion location is after the ">",
+  /// the completion results will provide, e.g., the members of the struct that
+  /// "p" points to. The client is responsible for placing the cursor at the
+  /// beginning of the token currently being typed, then filtering the results
+  /// based on the contents of the token. For example, when code-completing for
+  /// the expression \c p->get, the client should provide the location just after
+  /// the ">" (e.g., pointing at the "g") to this code-completion hook. Then, the
+  /// client can filter the results based on the current token text ("get"), only
+  /// showing those results that start with "get". The intent of this interface
+  /// is to separate the relatively high-latency acquisition of code-completion
+  /// results from the filtering of results on a per-character basis, which must
+  /// have a lower latency.
+  ///
+  /// \param TU The translation unit in which code-completion should
+  /// occur. The source files for this translation unit need not be
+  /// completely up-to-date (and the contents of those source files may
+  /// be overridden via \p unsaved_files). Cursors referring into the
+  /// translation unit may be invalidated by this invocation.
+  ///
+  /// \param complete_filename The name of the source file where code
+  /// completion should be performed. This filename may be any file
+  /// included in the translation unit.
+  ///
+  /// \param complete_line The line at which code-completion should occur.
+  ///
+  /// \param complete_column The column at which code-completion should occur.
+  /// Note that the column should point just after the syntactic construct that
+  /// initiated code completion, and not in the middle of a lexical token.
+  ///
+  /// \param unsaved_files the Files that have not yet been saved to disk
+  /// but may be required for parsing or code completion, including the
+  /// contents of those files.  The contents and name of these files (as
+  /// specified by CXUnsavedFile) are copied when necessary, so the
+  /// client only needs to guarantee their validity until the call to
+  /// this function returns.
+  ///
+  /// \param num_unsaved_files The number of unsaved file entries in \p
+  /// unsaved_files.
+  ///
+  /// \param options Extra options that control the behavior of code
+  /// completion, expressed as a bitwise OR of the enumerators of the
+  /// CXCodeComplete_Flags enumeration. The
+  /// \c clang_defaultCodeCompleteOptions() function returns a default set
+  /// of code-completion options.
+  ///
+  /// \returns If successful, a new \c CXCodeCompleteResults structure
+  /// containing code-completion results, which should eventually be
+  /// freed with \c clang_disposeCodeCompleteResults(). If code
+  /// completion fails, returns NULL.
+  ffi.Pointer<CXCodeCompleteResults> clang_codeCompleteAt(
+    ffi.Pointer<CXTranslationUnitImpl> TU,
+    ffi.Pointer<ffi.Int8> complete_filename,
+    int complete_line,
+    int complete_column,
+    ffi.Pointer<CXUnsavedFile> unsaved_files,
+    int num_unsaved_files,
+    int options,
+  ) {
+    _clang_codeCompleteAt ??= _dylib.lookupFunction<_c_clang_codeCompleteAt,
+        _dart_clang_codeCompleteAt>('clang_codeCompleteAt');
+    return _clang_codeCompleteAt(
+      TU,
+      complete_filename,
+      complete_line,
+      complete_column,
+      unsaved_files,
+      num_unsaved_files,
+      options,
+    );
+  }
+
+  _dart_clang_codeCompleteAt _clang_codeCompleteAt;
+
+  /// Sort the code-completion results in case-insensitive alphabetical
+  /// order.
+  ///
+  /// \param Results The set of results to sort.
+  /// \param NumResults The number of results in \p Results.
+  void clang_sortCodeCompletionResults(
+    ffi.Pointer<CXCompletionResult> Results,
+    int NumResults,
+  ) {
+    _clang_sortCodeCompletionResults ??= _dylib.lookupFunction<
+            _c_clang_sortCodeCompletionResults,
+            _dart_clang_sortCodeCompletionResults>(
+        'clang_sortCodeCompletionResults');
+    return _clang_sortCodeCompletionResults(
+      Results,
+      NumResults,
+    );
+  }
+
+  _dart_clang_sortCodeCompletionResults _clang_sortCodeCompletionResults;
+
+  /// Free the given set of code-completion results.
+  void clang_disposeCodeCompleteResults(
+    ffi.Pointer<CXCodeCompleteResults> Results,
+  ) {
+    _clang_disposeCodeCompleteResults ??= _dylib.lookupFunction<
+            _c_clang_disposeCodeCompleteResults,
+            _dart_clang_disposeCodeCompleteResults>(
+        'clang_disposeCodeCompleteResults');
+    return _clang_disposeCodeCompleteResults(
+      Results,
+    );
+  }
+
+  _dart_clang_disposeCodeCompleteResults _clang_disposeCodeCompleteResults;
+
+  /// Determine the number of diagnostics produced prior to the
+  /// location where code completion was performed.
+  int clang_codeCompleteGetNumDiagnostics(
+    ffi.Pointer<CXCodeCompleteResults> Results,
+  ) {
+    _clang_codeCompleteGetNumDiagnostics ??= _dylib.lookupFunction<
+            _c_clang_codeCompleteGetNumDiagnostics,
+            _dart_clang_codeCompleteGetNumDiagnostics>(
+        'clang_codeCompleteGetNumDiagnostics');
+    return _clang_codeCompleteGetNumDiagnostics(
+      Results,
+    );
+  }
+
+  _dart_clang_codeCompleteGetNumDiagnostics
+      _clang_codeCompleteGetNumDiagnostics;
+
+  /// Retrieve a diagnostic associated with the given code completion.
+  ///
+  /// \param Results the code completion results to query.
+  /// \param Index the zero-based diagnostic number to retrieve.
+  ///
+  /// \returns the requested diagnostic. This diagnostic must be freed
+  /// via a call to \c clang_disposeDiagnostic().
+  ffi.Pointer<ffi.Void> clang_codeCompleteGetDiagnostic(
+    ffi.Pointer<CXCodeCompleteResults> Results,
+    int Index,
+  ) {
+    _clang_codeCompleteGetDiagnostic ??= _dylib.lookupFunction<
+            _c_clang_codeCompleteGetDiagnostic,
+            _dart_clang_codeCompleteGetDiagnostic>(
+        'clang_codeCompleteGetDiagnostic');
+    return _clang_codeCompleteGetDiagnostic(
+      Results,
+      Index,
+    );
+  }
+
+  _dart_clang_codeCompleteGetDiagnostic _clang_codeCompleteGetDiagnostic;
+
+  /// Determines what completions are appropriate for the context
+  /// the given code completion.
+  ///
+  /// \param Results the code completion results to query
+  ///
+  /// \returns the kinds of completions that are appropriate for use
+  /// along with the given code completion results.
+  int clang_codeCompleteGetContexts(
+    ffi.Pointer<CXCodeCompleteResults> Results,
+  ) {
+    _clang_codeCompleteGetContexts ??= _dylib.lookupFunction<
+        _c_clang_codeCompleteGetContexts,
+        _dart_clang_codeCompleteGetContexts>('clang_codeCompleteGetContexts');
+    return _clang_codeCompleteGetContexts(
+      Results,
+    );
+  }
+
+  _dart_clang_codeCompleteGetContexts _clang_codeCompleteGetContexts;
+
+  /// Returns the cursor kind for the container for the current code
+  /// completion context. The container is only guaranteed to be set for
+  /// contexts where a container exists (i.e. member accesses or Objective-C
+  /// message sends); if there is not a container, this function will return
+  /// CXCursor_InvalidCode.
+  ///
+  /// \param Results the code completion results to query
+  ///
+  /// \param IsIncomplete on return, this value will be false if Clang has complete
+  /// information about the container. If Clang does not have complete
+  /// information, this value will be true.
+  ///
+  /// \returns the container kind, or CXCursor_InvalidCode if there is not a
+  /// container
+  int clang_codeCompleteGetContainerKind(
+    ffi.Pointer<CXCodeCompleteResults> Results,
+    ffi.Pointer<ffi.Uint32> IsIncomplete,
+  ) {
+    _clang_codeCompleteGetContainerKind ??= _dylib.lookupFunction<
+            _c_clang_codeCompleteGetContainerKind,
+            _dart_clang_codeCompleteGetContainerKind>(
+        'clang_codeCompleteGetContainerKind');
+    return _clang_codeCompleteGetContainerKind(
+      Results,
+      IsIncomplete,
+    );
+  }
+
+  _dart_clang_codeCompleteGetContainerKind _clang_codeCompleteGetContainerKind;
+
+  /// Enable/disable crash recovery.
+  ///
+  /// \param isEnabled Flag to indicate if crash recovery is enabled.  A non-zero
+  /// value enables crash recovery, while 0 disables it.
+  void clang_toggleCrashRecovery(
+    int isEnabled,
+  ) {
+    _clang_toggleCrashRecovery ??= _dylib.lookupFunction<
+        _c_clang_toggleCrashRecovery,
+        _dart_clang_toggleCrashRecovery>('clang_toggleCrashRecovery');
+    return _clang_toggleCrashRecovery(
+      isEnabled,
+    );
+  }
+
+  _dart_clang_toggleCrashRecovery _clang_toggleCrashRecovery;
+
+  /// Visit the set of preprocessor inclusions in a translation unit.
+  /// The visitor function is called with the provided data for every included
+  /// file.  This does not include headers included by the PCH file (unless one
+  /// is inspecting the inclusions in the PCH file itself).
+  void clang_getInclusions(
+    ffi.Pointer<CXTranslationUnitImpl> tu,
+    ffi.Pointer<ffi.NativeFunction<CXInclusionVisitor_1>> visitor,
+    ffi.Pointer<ffi.Void> client_data,
+  ) {
+    _clang_getInclusions ??= _dylib.lookupFunction<_c_clang_getInclusions,
+        _dart_clang_getInclusions>('clang_getInclusions');
+    return _clang_getInclusions(
+      tu,
+      visitor,
+      client_data,
+    );
+  }
+
+  _dart_clang_getInclusions _clang_getInclusions;
+
+  /// Returns the kind of the evaluated result.
+  int clang_EvalResult_getKind(
+    ffi.Pointer<ffi.Void> E,
+  ) {
+    _clang_EvalResult_getKind ??= _dylib.lookupFunction<
+        _c_clang_EvalResult_getKind,
+        _dart_clang_EvalResult_getKind>('clang_EvalResult_getKind');
+    return _clang_EvalResult_getKind(
+      E,
+    );
+  }
+
+  _dart_clang_EvalResult_getKind _clang_EvalResult_getKind;
+
+  /// Returns the evaluation result as integer if the
+  /// kind is Int.
+  int clang_EvalResult_getAsInt(
+    ffi.Pointer<ffi.Void> E,
+  ) {
+    _clang_EvalResult_getAsInt ??= _dylib.lookupFunction<
+        _c_clang_EvalResult_getAsInt,
+        _dart_clang_EvalResult_getAsInt>('clang_EvalResult_getAsInt');
+    return _clang_EvalResult_getAsInt(
+      E,
+    );
+  }
+
+  _dart_clang_EvalResult_getAsInt _clang_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
+  /// returned with clang_EvalResult_getAsInt.
+  int clang_EvalResult_getAsLongLong(
+    ffi.Pointer<ffi.Void> E,
+  ) {
+    _clang_EvalResult_getAsLongLong ??= _dylib.lookupFunction<
+        _c_clang_EvalResult_getAsLongLong,
+        _dart_clang_EvalResult_getAsLongLong>('clang_EvalResult_getAsLongLong');
+    return _clang_EvalResult_getAsLongLong(
+      E,
+    );
+  }
+
+  _dart_clang_EvalResult_getAsLongLong _clang_EvalResult_getAsLongLong;
+
+  /// Returns a non-zero value if the kind is Int and the evaluation
+  /// result resulted in an unsigned integer.
+  int clang_EvalResult_isUnsignedInt(
+    ffi.Pointer<ffi.Void> E,
+  ) {
+    _clang_EvalResult_isUnsignedInt ??= _dylib.lookupFunction<
+        _c_clang_EvalResult_isUnsignedInt,
+        _dart_clang_EvalResult_isUnsignedInt>('clang_EvalResult_isUnsignedInt');
+    return _clang_EvalResult_isUnsignedInt(
+      E,
+    );
+  }
+
+  _dart_clang_EvalResult_isUnsignedInt _clang_EvalResult_isUnsignedInt;
+
+  /// Returns the evaluation result as an unsigned integer if
+  /// the kind is Int and clang_EvalResult_isUnsignedInt is non-zero.
+  int clang_EvalResult_getAsUnsigned(
+    ffi.Pointer<ffi.Void> E,
+  ) {
+    _clang_EvalResult_getAsUnsigned ??= _dylib.lookupFunction<
+        _c_clang_EvalResult_getAsUnsigned,
+        _dart_clang_EvalResult_getAsUnsigned>('clang_EvalResult_getAsUnsigned');
+    return _clang_EvalResult_getAsUnsigned(
+      E,
+    );
+  }
+
+  _dart_clang_EvalResult_getAsUnsigned _clang_EvalResult_getAsUnsigned;
+
+  /// Returns the evaluation result as double if the
+  /// kind is double.
+  double clang_EvalResult_getAsDouble(
+    ffi.Pointer<ffi.Void> E,
+  ) {
+    _clang_EvalResult_getAsDouble ??= _dylib.lookupFunction<
+        _c_clang_EvalResult_getAsDouble,
+        _dart_clang_EvalResult_getAsDouble>('clang_EvalResult_getAsDouble');
+    return _clang_EvalResult_getAsDouble(
+      E,
+    );
+  }
+
+  _dart_clang_EvalResult_getAsDouble _clang_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,
+  /// instead call clang_EvalResult_dispose on the CXEvalResult returned
+  /// by clang_Cursor_Evaluate.
+  ffi.Pointer<ffi.Int8> clang_EvalResult_getAsStr(
+    ffi.Pointer<ffi.Void> E,
+  ) {
+    _clang_EvalResult_getAsStr ??= _dylib.lookupFunction<
+        _c_clang_EvalResult_getAsStr,
+        _dart_clang_EvalResult_getAsStr>('clang_EvalResult_getAsStr');
+    return _clang_EvalResult_getAsStr(
+      E,
+    );
+  }
+
+  _dart_clang_EvalResult_getAsStr _clang_EvalResult_getAsStr;
+
+  /// Disposes the created Eval memory.
+  void clang_EvalResult_dispose(
+    ffi.Pointer<ffi.Void> E,
+  ) {
+    _clang_EvalResult_dispose ??= _dylib.lookupFunction<
+        _c_clang_EvalResult_dispose,
+        _dart_clang_EvalResult_dispose>('clang_EvalResult_dispose');
+    return _clang_EvalResult_dispose(
+      E,
+    );
+  }
+
+  _dart_clang_EvalResult_dispose _clang_EvalResult_dispose;
+
+  /// Retrieve a remapping.
+  ///
+  /// \param path the path that contains metadata about remappings.
+  ///
+  /// \returns the requested remapping. This remapping must be freed
+  /// via a call to \c clang_remap_dispose(). Can return NULL if an error occurred.
+  ffi.Pointer<ffi.Void> clang_getRemappings(
+    ffi.Pointer<ffi.Int8> path,
+  ) {
+    _clang_getRemappings ??= _dylib.lookupFunction<_c_clang_getRemappings,
+        _dart_clang_getRemappings>('clang_getRemappings');
+    return _clang_getRemappings(
+      path,
+    );
+  }
+
+  _dart_clang_getRemappings _clang_getRemappings;
+
+  /// Retrieve a remapping.
+  ///
+  /// \param filePaths pointer to an array of file paths containing remapping info.
+  ///
+  /// \param numFiles number of file paths.
+  ///
+  /// \returns the requested remapping. This remapping must be freed
+  /// via a call to \c clang_remap_dispose(). Can return NULL if an error occurred.
+  ffi.Pointer<ffi.Void> clang_getRemappingsFromFileList(
+    ffi.Pointer<ffi.Pointer<ffi.Int8>> filePaths,
+    int numFiles,
+  ) {
+    _clang_getRemappingsFromFileList ??= _dylib.lookupFunction<
+            _c_clang_getRemappingsFromFileList,
+            _dart_clang_getRemappingsFromFileList>(
+        'clang_getRemappingsFromFileList');
+    return _clang_getRemappingsFromFileList(
+      filePaths,
+      numFiles,
+    );
+  }
+
+  _dart_clang_getRemappingsFromFileList _clang_getRemappingsFromFileList;
+
+  /// Determine the number of remappings.
+  int clang_remap_getNumFiles(
+    ffi.Pointer<ffi.Void> arg0,
+  ) {
+    _clang_remap_getNumFiles ??= _dylib.lookupFunction<
+        _c_clang_remap_getNumFiles,
+        _dart_clang_remap_getNumFiles>('clang_remap_getNumFiles');
+    return _clang_remap_getNumFiles(
+      arg0,
+    );
+  }
+
+  _dart_clang_remap_getNumFiles _clang_remap_getNumFiles;
+
+  /// Get the original and the associated filename from the remapping.
+  ///
+  /// \param original If non-NULL, will be set to the original filename.
+  ///
+  /// \param transformed If non-NULL, will be set to the filename that the original
+  /// is associated with.
+  void clang_remap_getFilenames(
+    ffi.Pointer<ffi.Void> arg0,
+    int index,
+    ffi.Pointer<CXString> original,
+    ffi.Pointer<CXString> transformed,
+  ) {
+    _clang_remap_getFilenames ??= _dylib.lookupFunction<
+        _c_clang_remap_getFilenames,
+        _dart_clang_remap_getFilenames>('clang_remap_getFilenames');
+    return _clang_remap_getFilenames(
+      arg0,
+      index,
+      original,
+      transformed,
+    );
+  }
+
+  _dart_clang_remap_getFilenames _clang_remap_getFilenames;
+
+  /// Dispose the remapping.
+  void clang_remap_dispose(
+    ffi.Pointer<ffi.Void> arg0,
+  ) {
+    _clang_remap_dispose ??= _dylib.lookupFunction<_c_clang_remap_dispose,
+        _dart_clang_remap_dispose>('clang_remap_dispose');
+    return _clang_remap_dispose(
+      arg0,
+    );
+  }
+
+  _dart_clang_remap_dispose _clang_remap_dispose;
+
+  int clang_index_isEntityObjCContainerKind(
+    int arg0,
+  ) {
+    _clang_index_isEntityObjCContainerKind ??= _dylib.lookupFunction<
+            _c_clang_index_isEntityObjCContainerKind,
+            _dart_clang_index_isEntityObjCContainerKind>(
+        'clang_index_isEntityObjCContainerKind');
+    return _clang_index_isEntityObjCContainerKind(
+      arg0,
+    );
+  }
+
+  _dart_clang_index_isEntityObjCContainerKind
+      _clang_index_isEntityObjCContainerKind;
+
+  ffi.Pointer<CXIdxObjCContainerDeclInfo> clang_index_getObjCContainerDeclInfo(
+    ffi.Pointer<CXIdxDeclInfo> arg0,
+  ) {
+    _clang_index_getObjCContainerDeclInfo ??= _dylib.lookupFunction<
+            _c_clang_index_getObjCContainerDeclInfo,
+            _dart_clang_index_getObjCContainerDeclInfo>(
+        'clang_index_getObjCContainerDeclInfo');
+    return _clang_index_getObjCContainerDeclInfo(
+      arg0,
+    );
+  }
+
+  _dart_clang_index_getObjCContainerDeclInfo
+      _clang_index_getObjCContainerDeclInfo;
+
+  ffi.Pointer<CXIdxObjCInterfaceDeclInfo> clang_index_getObjCInterfaceDeclInfo(
+    ffi.Pointer<CXIdxDeclInfo> arg0,
+  ) {
+    _clang_index_getObjCInterfaceDeclInfo ??= _dylib.lookupFunction<
+            _c_clang_index_getObjCInterfaceDeclInfo,
+            _dart_clang_index_getObjCInterfaceDeclInfo>(
+        'clang_index_getObjCInterfaceDeclInfo');
+    return _clang_index_getObjCInterfaceDeclInfo(
+      arg0,
+    );
+  }
+
+  _dart_clang_index_getObjCInterfaceDeclInfo
+      _clang_index_getObjCInterfaceDeclInfo;
+
+  ffi.Pointer<CXIdxObjCCategoryDeclInfo> clang_index_getObjCCategoryDeclInfo(
+    ffi.Pointer<CXIdxDeclInfo> arg0,
+  ) {
+    _clang_index_getObjCCategoryDeclInfo ??= _dylib.lookupFunction<
+            _c_clang_index_getObjCCategoryDeclInfo,
+            _dart_clang_index_getObjCCategoryDeclInfo>(
+        'clang_index_getObjCCategoryDeclInfo');
+    return _clang_index_getObjCCategoryDeclInfo(
+      arg0,
+    );
+  }
+
+  _dart_clang_index_getObjCCategoryDeclInfo
+      _clang_index_getObjCCategoryDeclInfo;
+
+  ffi.Pointer<CXIdxObjCProtocolRefListInfo>
+      clang_index_getObjCProtocolRefListInfo(
+    ffi.Pointer<CXIdxDeclInfo> arg0,
+  ) {
+    _clang_index_getObjCProtocolRefListInfo ??= _dylib.lookupFunction<
+            _c_clang_index_getObjCProtocolRefListInfo,
+            _dart_clang_index_getObjCProtocolRefListInfo>(
+        'clang_index_getObjCProtocolRefListInfo');
+    return _clang_index_getObjCProtocolRefListInfo(
+      arg0,
+    );
+  }
+
+  _dart_clang_index_getObjCProtocolRefListInfo
+      _clang_index_getObjCProtocolRefListInfo;
+
+  ffi.Pointer<CXIdxObjCPropertyDeclInfo> clang_index_getObjCPropertyDeclInfo(
+    ffi.Pointer<CXIdxDeclInfo> arg0,
+  ) {
+    _clang_index_getObjCPropertyDeclInfo ??= _dylib.lookupFunction<
+            _c_clang_index_getObjCPropertyDeclInfo,
+            _dart_clang_index_getObjCPropertyDeclInfo>(
+        'clang_index_getObjCPropertyDeclInfo');
+    return _clang_index_getObjCPropertyDeclInfo(
+      arg0,
+    );
+  }
+
+  _dart_clang_index_getObjCPropertyDeclInfo
+      _clang_index_getObjCPropertyDeclInfo;
+
+  ffi.Pointer<CXIdxIBOutletCollectionAttrInfo>
+      clang_index_getIBOutletCollectionAttrInfo(
+    ffi.Pointer<CXIdxAttrInfo> arg0,
+  ) {
+    _clang_index_getIBOutletCollectionAttrInfo ??= _dylib.lookupFunction<
+            _c_clang_index_getIBOutletCollectionAttrInfo,
+            _dart_clang_index_getIBOutletCollectionAttrInfo>(
+        'clang_index_getIBOutletCollectionAttrInfo');
+    return _clang_index_getIBOutletCollectionAttrInfo(
+      arg0,
+    );
+  }
+
+  _dart_clang_index_getIBOutletCollectionAttrInfo
+      _clang_index_getIBOutletCollectionAttrInfo;
+
+  ffi.Pointer<CXIdxCXXClassDeclInfo> clang_index_getCXXClassDeclInfo(
+    ffi.Pointer<CXIdxDeclInfo> arg0,
+  ) {
+    _clang_index_getCXXClassDeclInfo ??= _dylib.lookupFunction<
+            _c_clang_index_getCXXClassDeclInfo,
+            _dart_clang_index_getCXXClassDeclInfo>(
+        'clang_index_getCXXClassDeclInfo');
+    return _clang_index_getCXXClassDeclInfo(
+      arg0,
+    );
+  }
+
+  _dart_clang_index_getCXXClassDeclInfo _clang_index_getCXXClassDeclInfo;
+
+  /// For retrieving a custom CXIdxClientContainer attached to a
+  /// container.
+  ffi.Pointer<ffi.Void> clang_index_getClientContainer(
+    ffi.Pointer<CXIdxContainerInfo> arg0,
+  ) {
+    _clang_index_getClientContainer ??= _dylib.lookupFunction<
+        _c_clang_index_getClientContainer,
+        _dart_clang_index_getClientContainer>('clang_index_getClientContainer');
+    return _clang_index_getClientContainer(
+      arg0,
+    );
+  }
+
+  _dart_clang_index_getClientContainer _clang_index_getClientContainer;
+
+  /// For setting a custom CXIdxClientContainer attached to a
+  /// container.
+  void clang_index_setClientContainer(
+    ffi.Pointer<CXIdxContainerInfo> arg0,
+    ffi.Pointer<ffi.Void> arg1,
+  ) {
+    _clang_index_setClientContainer ??= _dylib.lookupFunction<
+        _c_clang_index_setClientContainer,
+        _dart_clang_index_setClientContainer>('clang_index_setClientContainer');
+    return _clang_index_setClientContainer(
+      arg0,
+      arg1,
+    );
+  }
+
+  _dart_clang_index_setClientContainer _clang_index_setClientContainer;
+
+  /// For retrieving a custom CXIdxClientEntity attached to an entity.
+  ffi.Pointer<ffi.Void> clang_index_getClientEntity(
+    ffi.Pointer<CXIdxEntityInfo> arg0,
+  ) {
+    _clang_index_getClientEntity ??= _dylib.lookupFunction<
+        _c_clang_index_getClientEntity,
+        _dart_clang_index_getClientEntity>('clang_index_getClientEntity');
+    return _clang_index_getClientEntity(
+      arg0,
+    );
+  }
+
+  _dart_clang_index_getClientEntity _clang_index_getClientEntity;
+
+  /// For setting a custom CXIdxClientEntity attached to an entity.
+  void clang_index_setClientEntity(
+    ffi.Pointer<CXIdxEntityInfo> arg0,
+    ffi.Pointer<ffi.Void> arg1,
+  ) {
+    _clang_index_setClientEntity ??= _dylib.lookupFunction<
+        _c_clang_index_setClientEntity,
+        _dart_clang_index_setClientEntity>('clang_index_setClientEntity');
+    return _clang_index_setClientEntity(
+      arg0,
+      arg1,
+    );
+  }
+
+  _dart_clang_index_setClientEntity _clang_index_setClientEntity;
+
+  /// An indexing action/session, to be applied to one or multiple
+  /// translation units.
+  ///
+  /// \param CIdx The index object with which the index action will be associated.
+  ffi.Pointer<ffi.Void> clang_IndexAction_create(
+    ffi.Pointer<ffi.Void> CIdx,
+  ) {
+    _clang_IndexAction_create ??= _dylib.lookupFunction<
+        _c_clang_IndexAction_create,
+        _dart_clang_IndexAction_create>('clang_IndexAction_create');
+    return _clang_IndexAction_create(
+      CIdx,
+    );
+  }
+
+  _dart_clang_IndexAction_create _clang_IndexAction_create;
+
+  /// Destroy the given index action.
+  ///
+  /// The index action must not be destroyed until all of the translation units
+  /// created within that index action have been destroyed.
+  void clang_IndexAction_dispose(
+    ffi.Pointer<ffi.Void> arg0,
+  ) {
+    _clang_IndexAction_dispose ??= _dylib.lookupFunction<
+        _c_clang_IndexAction_dispose,
+        _dart_clang_IndexAction_dispose>('clang_IndexAction_dispose');
+    return _clang_IndexAction_dispose(
+      arg0,
+    );
+  }
+
+  _dart_clang_IndexAction_dispose _clang_IndexAction_dispose;
+
+  /// Index the given source file and the translation unit corresponding
+  /// to that file via callbacks implemented through #IndexerCallbacks.
+  ///
+  /// \param client_data pointer data supplied by the client, which will
+  /// be passed to the invoked callbacks.
+  ///
+  /// \param index_callbacks Pointer to indexing callbacks that the client
+  /// implements.
+  ///
+  /// \param index_callbacks_size Size of #IndexerCallbacks structure that gets
+  /// passed in index_callbacks.
+  ///
+  /// \param index_options A bitmask of options that affects how indexing is
+  /// performed. This should be a bitwise OR of the CXIndexOpt_XXX flags.
+  ///
+  /// \param[out] out_TU pointer to store a \c CXTranslationUnit that can be
+  /// reused after indexing is finished. Set to \c NULL if you do not require it.
+  ///
+  /// \returns 0 on success or if there were errors from which the compiler could
+  /// recover.  If there is a failure from which there is no recovery, returns
+  /// a non-zero \c CXErrorCode.
+  ///
+  /// The rest of the parameters are the same as #clang_parseTranslationUnit.
+  int clang_indexSourceFile(
+    ffi.Pointer<ffi.Void> arg0,
+    ffi.Pointer<ffi.Void> 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<ffi.Pointer<CXTranslationUnitImpl>> out_TU,
+    int TU_options,
+  ) {
+    _clang_indexSourceFile ??= _dylib.lookupFunction<_c_clang_indexSourceFile,
+        _dart_clang_indexSourceFile>('clang_indexSourceFile');
+    return _clang_indexSourceFile(
+      arg0,
+      client_data,
+      index_callbacks,
+      index_callbacks_size,
+      index_options,
+      source_filename,
+      command_line_args,
+      num_command_line_args,
+      unsaved_files,
+      num_unsaved_files,
+      out_TU,
+      TU_options,
+    );
+  }
+
+  _dart_clang_indexSourceFile _clang_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
+  /// library paths are relative to the binary.
+  int clang_indexSourceFileFullArgv(
+    ffi.Pointer<ffi.Void> arg0,
+    ffi.Pointer<ffi.Void> 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<ffi.Pointer<CXTranslationUnitImpl>> out_TU,
+    int TU_options,
+  ) {
+    _clang_indexSourceFileFullArgv ??= _dylib.lookupFunction<
+        _c_clang_indexSourceFileFullArgv,
+        _dart_clang_indexSourceFileFullArgv>('clang_indexSourceFileFullArgv');
+    return _clang_indexSourceFileFullArgv(
+      arg0,
+      client_data,
+      index_callbacks,
+      index_callbacks_size,
+      index_options,
+      source_filename,
+      command_line_args,
+      num_command_line_args,
+      unsaved_files,
+      num_unsaved_files,
+      out_TU,
+      TU_options,
+    );
+  }
+
+  _dart_clang_indexSourceFileFullArgv _clang_indexSourceFileFullArgv;
+
+  /// Index the given translation unit via callbacks implemented through
+  /// #IndexerCallbacks.
+  ///
+  /// The order of callback invocations is not guaranteed to be the same as
+  /// when indexing a source file. The high level order will be:
+  ///
+  /// -Preprocessor callbacks invocations
+  /// -Declaration/reference callbacks invocations
+  /// -Diagnostic callback invocations
+  ///
+  /// The parameters are the same as #clang_indexSourceFile.
+  ///
+  /// \returns If there is a failure from which there is no recovery, returns
+  /// non-zero, otherwise returns 0.
+  int clang_indexTranslationUnit(
+    ffi.Pointer<ffi.Void> arg0,
+    ffi.Pointer<ffi.Void> client_data,
+    ffi.Pointer<IndexerCallbacks> index_callbacks,
+    int index_callbacks_size,
+    int index_options,
+    ffi.Pointer<CXTranslationUnitImpl> arg5,
+  ) {
+    _clang_indexTranslationUnit ??= _dylib.lookupFunction<
+        _c_clang_indexTranslationUnit,
+        _dart_clang_indexTranslationUnit>('clang_indexTranslationUnit');
+    return _clang_indexTranslationUnit(
+      arg0,
+      client_data,
+      index_callbacks,
+      index_callbacks_size,
+      index_options,
+      arg5,
+    );
+  }
+
+  _dart_clang_indexTranslationUnit _clang_indexTranslationUnit;
+
+  ffi.Pointer<ffi.Int8> clang_getCString_wrap(
+    ffi.Pointer<CXString> string,
+  ) {
+    _clang_getCString_wrap ??= _dylib.lookupFunction<_c_clang_getCString_wrap,
+        _dart_clang_getCString_wrap>('clang_getCString_wrap');
+    return _clang_getCString_wrap(
+      string,
+    );
+  }
+
+  _dart_clang_getCString_wrap _clang_getCString_wrap;
+
+  void clang_disposeString_wrap(
+    ffi.Pointer<CXString> string,
+  ) {
+    _clang_disposeString_wrap ??= _dylib.lookupFunction<
+        _c_clang_disposeString_wrap,
+        _dart_clang_disposeString_wrap>('clang_disposeString_wrap');
+    return _clang_disposeString_wrap(
+      string,
+    );
+  }
+
+  _dart_clang_disposeString_wrap _clang_disposeString_wrap;
+
+  int clang_getCursorKind_wrap(
+    ffi.Pointer<CXCursor> cursor,
+  ) {
+    _clang_getCursorKind_wrap ??= _dylib.lookupFunction<
+        _c_clang_getCursorKind_wrap,
+        _dart_clang_getCursorKind_wrap>('clang_getCursorKind_wrap');
+    return _clang_getCursorKind_wrap(
+      cursor,
+    );
+  }
+
+  _dart_clang_getCursorKind_wrap _clang_getCursorKind_wrap;
+
+  ffi.Pointer<CXString> clang_getCursorKindSpelling_wrap(
+    int kind,
+  ) {
+    _clang_getCursorKindSpelling_wrap ??= _dylib.lookupFunction<
+            _c_clang_getCursorKindSpelling_wrap,
+            _dart_clang_getCursorKindSpelling_wrap>(
+        'clang_getCursorKindSpelling_wrap');
+    return _clang_getCursorKindSpelling_wrap(
+      kind,
+    );
+  }
+
+  _dart_clang_getCursorKindSpelling_wrap _clang_getCursorKindSpelling_wrap;
+
+  ffi.Pointer<CXType> clang_getCursorType_wrap(
+    ffi.Pointer<CXCursor> cursor,
+  ) {
+    _clang_getCursorType_wrap ??= _dylib.lookupFunction<
+        _c_clang_getCursorType_wrap,
+        _dart_clang_getCursorType_wrap>('clang_getCursorType_wrap');
+    return _clang_getCursorType_wrap(
+      cursor,
+    );
+  }
+
+  _dart_clang_getCursorType_wrap _clang_getCursorType_wrap;
+
+  ffi.Pointer<CXString> clang_getTypeSpelling_wrap(
+    ffi.Pointer<CXType> type,
+  ) {
+    _clang_getTypeSpelling_wrap ??= _dylib.lookupFunction<
+        _c_clang_getTypeSpelling_wrap,
+        _dart_clang_getTypeSpelling_wrap>('clang_getTypeSpelling_wrap');
+    return _clang_getTypeSpelling_wrap(
+      type,
+    );
+  }
+
+  _dart_clang_getTypeSpelling_wrap _clang_getTypeSpelling_wrap;
+
+  ffi.Pointer<CXString> clang_getTypeKindSpelling_wrap(
+    int typeKind,
+  ) {
+    _clang_getTypeKindSpelling_wrap ??= _dylib.lookupFunction<
+        _c_clang_getTypeKindSpelling_wrap,
+        _dart_clang_getTypeKindSpelling_wrap>('clang_getTypeKindSpelling_wrap');
+    return _clang_getTypeKindSpelling_wrap(
+      typeKind,
+    );
+  }
+
+  _dart_clang_getTypeKindSpelling_wrap _clang_getTypeKindSpelling_wrap;
+
+  ffi.Pointer<CXType> clang_getResultType_wrap(
+    ffi.Pointer<CXType> functionType,
+  ) {
+    _clang_getResultType_wrap ??= _dylib.lookupFunction<
+        _c_clang_getResultType_wrap,
+        _dart_clang_getResultType_wrap>('clang_getResultType_wrap');
+    return _clang_getResultType_wrap(
+      functionType,
+    );
+  }
+
+  _dart_clang_getResultType_wrap _clang_getResultType_wrap;
+
+  ffi.Pointer<CXType> clang_getPointeeType_wrap(
+    ffi.Pointer<CXType> pointerType,
+  ) {
+    _clang_getPointeeType_wrap ??= _dylib.lookupFunction<
+        _c_clang_getPointeeType_wrap,
+        _dart_clang_getPointeeType_wrap>('clang_getPointeeType_wrap');
+    return _clang_getPointeeType_wrap(
+      pointerType,
+    );
+  }
+
+  _dart_clang_getPointeeType_wrap _clang_getPointeeType_wrap;
+
+  ffi.Pointer<CXType> clang_getCanonicalType_wrap(
+    ffi.Pointer<CXType> typerefType,
+  ) {
+    _clang_getCanonicalType_wrap ??= _dylib.lookupFunction<
+        _c_clang_getCanonicalType_wrap,
+        _dart_clang_getCanonicalType_wrap>('clang_getCanonicalType_wrap');
+    return _clang_getCanonicalType_wrap(
+      typerefType,
+    );
+  }
+
+  _dart_clang_getCanonicalType_wrap _clang_getCanonicalType_wrap;
+
+  ffi.Pointer<CXType> clang_Type_getNamedType_wrap(
+    ffi.Pointer<CXType> elaboratedType,
+  ) {
+    _clang_Type_getNamedType_wrap ??= _dylib.lookupFunction<
+        _c_clang_Type_getNamedType_wrap,
+        _dart_clang_Type_getNamedType_wrap>('clang_Type_getNamedType_wrap');
+    return _clang_Type_getNamedType_wrap(
+      elaboratedType,
+    );
+  }
+
+  _dart_clang_Type_getNamedType_wrap _clang_Type_getNamedType_wrap;
+
+  ffi.Pointer<CXCursor> clang_getTypeDeclaration_wrap(
+    ffi.Pointer<CXType> cxtype,
+  ) {
+    _clang_getTypeDeclaration_wrap ??= _dylib.lookupFunction<
+        _c_clang_getTypeDeclaration_wrap,
+        _dart_clang_getTypeDeclaration_wrap>('clang_getTypeDeclaration_wrap');
+    return _clang_getTypeDeclaration_wrap(
+      cxtype,
+    );
+  }
+
+  _dart_clang_getTypeDeclaration_wrap _clang_getTypeDeclaration_wrap;
+
+  ffi.Pointer<CXType> clang_getTypedefDeclUnderlyingType_wrap(
+    ffi.Pointer<CXCursor> cxcursor,
+  ) {
+    _clang_getTypedefDeclUnderlyingType_wrap ??= _dylib.lookupFunction<
+            _c_clang_getTypedefDeclUnderlyingType_wrap,
+            _dart_clang_getTypedefDeclUnderlyingType_wrap>(
+        'clang_getTypedefDeclUnderlyingType_wrap');
+    return _clang_getTypedefDeclUnderlyingType_wrap(
+      cxcursor,
+    );
+  }
+
+  _dart_clang_getTypedefDeclUnderlyingType_wrap
+      _clang_getTypedefDeclUnderlyingType_wrap;
+
+  /// The name of parameter, struct, typedef.
+  ffi.Pointer<CXString> clang_getCursorSpelling_wrap(
+    ffi.Pointer<CXCursor> cursor,
+  ) {
+    _clang_getCursorSpelling_wrap ??= _dylib.lookupFunction<
+        _c_clang_getCursorSpelling_wrap,
+        _dart_clang_getCursorSpelling_wrap>('clang_getCursorSpelling_wrap');
+    return _clang_getCursorSpelling_wrap(
+      cursor,
+    );
+  }
+
+  _dart_clang_getCursorSpelling_wrap _clang_getCursorSpelling_wrap;
+
+  ffi.Pointer<CXCursor> clang_getTranslationUnitCursor_wrap(
+    ffi.Pointer<CXTranslationUnitImpl> tu,
+  ) {
+    _clang_getTranslationUnitCursor_wrap ??= _dylib.lookupFunction<
+            _c_clang_getTranslationUnitCursor_wrap,
+            _dart_clang_getTranslationUnitCursor_wrap>(
+        'clang_getTranslationUnitCursor_wrap');
+    return _clang_getTranslationUnitCursor_wrap(
+      tu,
+    );
+  }
+
+  _dart_clang_getTranslationUnitCursor_wrap
+      _clang_getTranslationUnitCursor_wrap;
+
+  ffi.Pointer<CXString> clang_formatDiagnostic_wrap(
+    ffi.Pointer<ffi.Void> diag,
+    int opts,
+  ) {
+    _clang_formatDiagnostic_wrap ??= _dylib.lookupFunction<
+        _c_clang_formatDiagnostic_wrap,
+        _dart_clang_formatDiagnostic_wrap>('clang_formatDiagnostic_wrap');
+    return _clang_formatDiagnostic_wrap(
+      diag,
+      opts,
+    );
+  }
+
+  _dart_clang_formatDiagnostic_wrap _clang_formatDiagnostic_wrap;
+
+  /// Visitor is a function pointer with parameters having pointers to cxcursor
+  /// instead of cxcursor by default.
+  int clang_visitChildren_wrap(
+    ffi.Pointer<CXCursor> parent,
+    ffi.Pointer<ffi.NativeFunction<ModifiedCXCursorVisitor_1>> _modifiedVisitor,
+    ffi.Pointer<ffi.Void> clientData,
+  ) {
+    _clang_visitChildren_wrap ??= _dylib.lookupFunction<
+        _c_clang_visitChildren_wrap,
+        _dart_clang_visitChildren_wrap>('clang_visitChildren_wrap');
+    return _clang_visitChildren_wrap(
+      parent,
+      _modifiedVisitor,
+      clientData,
+    );
+  }
+
+  _dart_clang_visitChildren_wrap _clang_visitChildren_wrap;
+
+  int clang_Cursor_getNumArguments_wrap(
+    ffi.Pointer<CXCursor> cursor,
+  ) {
+    _clang_Cursor_getNumArguments_wrap ??= _dylib.lookupFunction<
+            _c_clang_Cursor_getNumArguments_wrap,
+            _dart_clang_Cursor_getNumArguments_wrap>(
+        'clang_Cursor_getNumArguments_wrap');
+    return _clang_Cursor_getNumArguments_wrap(
+      cursor,
+    );
+  }
+
+  _dart_clang_Cursor_getNumArguments_wrap _clang_Cursor_getNumArguments_wrap;
+
+  ffi.Pointer<CXCursor> clang_Cursor_getArgument_wrap(
+    ffi.Pointer<CXCursor> cursor,
+    int i,
+  ) {
+    _clang_Cursor_getArgument_wrap ??= _dylib.lookupFunction<
+        _c_clang_Cursor_getArgument_wrap,
+        _dart_clang_Cursor_getArgument_wrap>('clang_Cursor_getArgument_wrap');
+    return _clang_Cursor_getArgument_wrap(
+      cursor,
+      i,
+    );
+  }
+
+  _dart_clang_Cursor_getArgument_wrap _clang_Cursor_getArgument_wrap;
+
+  int clang_getNumArgTypes_wrap(
+    ffi.Pointer<CXType> cxtype,
+  ) {
+    _clang_getNumArgTypes_wrap ??= _dylib.lookupFunction<
+        _c_clang_getNumArgTypes_wrap,
+        _dart_clang_getNumArgTypes_wrap>('clang_getNumArgTypes_wrap');
+    return _clang_getNumArgTypes_wrap(
+      cxtype,
+    );
+  }
+
+  _dart_clang_getNumArgTypes_wrap _clang_getNumArgTypes_wrap;
+
+  ffi.Pointer<CXType> clang_getArgType_wrap(
+    ffi.Pointer<CXType> cxtype,
+    int i,
+  ) {
+    _clang_getArgType_wrap ??= _dylib.lookupFunction<_c_clang_getArgType_wrap,
+        _dart_clang_getArgType_wrap>('clang_getArgType_wrap');
+    return _clang_getArgType_wrap(
+      cxtype,
+      i,
+    );
+  }
+
+  _dart_clang_getArgType_wrap _clang_getArgType_wrap;
+
+  int clang_getEnumConstantDeclValue_wrap(
+    ffi.Pointer<CXCursor> cursor,
+  ) {
+    _clang_getEnumConstantDeclValue_wrap ??= _dylib.lookupFunction<
+            _c_clang_getEnumConstantDeclValue_wrap,
+            _dart_clang_getEnumConstantDeclValue_wrap>(
+        'clang_getEnumConstantDeclValue_wrap');
+    return _clang_getEnumConstantDeclValue_wrap(
+      cursor,
+    );
+  }
+
+  _dart_clang_getEnumConstantDeclValue_wrap
+      _clang_getEnumConstantDeclValue_wrap;
+
+  /// Returns non-zero if the ranges are the same, zero if they differ.
+  int clang_equalRanges_wrap(
+    ffi.Pointer<CXSourceRange> c1,
+    ffi.Pointer<CXSourceRange> c2,
+  ) {
+    _clang_equalRanges_wrap ??= _dylib.lookupFunction<_c_clang_equalRanges_wrap,
+        _dart_clang_equalRanges_wrap>('clang_equalRanges_wrap');
+    return _clang_equalRanges_wrap(
+      c1,
+      c2,
+    );
+  }
+
+  _dart_clang_equalRanges_wrap _clang_equalRanges_wrap;
+
+  /// Returns the comment range.
+  ffi.Pointer<CXSourceRange> clang_Cursor_getCommentRange_wrap(
+    ffi.Pointer<CXCursor> cursor,
+  ) {
+    _clang_Cursor_getCommentRange_wrap ??= _dylib.lookupFunction<
+            _c_clang_Cursor_getCommentRange_wrap,
+            _dart_clang_Cursor_getCommentRange_wrap>(
+        'clang_Cursor_getCommentRange_wrap');
+    return _clang_Cursor_getCommentRange_wrap(
+      cursor,
+    );
+  }
+
+  _dart_clang_Cursor_getCommentRange_wrap _clang_Cursor_getCommentRange_wrap;
+
+  /// Returns the raw comment.
+  ffi.Pointer<CXString> clang_Cursor_getRawCommentText_wrap(
+    ffi.Pointer<CXCursor> cursor,
+  ) {
+    _clang_Cursor_getRawCommentText_wrap ??= _dylib.lookupFunction<
+            _c_clang_Cursor_getRawCommentText_wrap,
+            _dart_clang_Cursor_getRawCommentText_wrap>(
+        'clang_Cursor_getRawCommentText_wrap');
+    return _clang_Cursor_getRawCommentText_wrap(
+      cursor,
+    );
+  }
+
+  _dart_clang_Cursor_getRawCommentText_wrap
+      _clang_Cursor_getRawCommentText_wrap;
+
+  /// Returns the first paragraph of doxygen doc comment.
+  ffi.Pointer<CXString> clang_Cursor_getBriefCommentText_wrap(
+    ffi.Pointer<CXCursor> cursor,
+  ) {
+    _clang_Cursor_getBriefCommentText_wrap ??= _dylib.lookupFunction<
+            _c_clang_Cursor_getBriefCommentText_wrap,
+            _dart_clang_Cursor_getBriefCommentText_wrap>(
+        'clang_Cursor_getBriefCommentText_wrap');
+    return _clang_Cursor_getBriefCommentText_wrap(
+      cursor,
+    );
+  }
+
+  _dart_clang_Cursor_getBriefCommentText_wrap
+      _clang_Cursor_getBriefCommentText_wrap;
+
+  ffi.Pointer<CXSourceLocation> clang_getCursorLocation_wrap(
+    ffi.Pointer<CXCursor> cursor,
+  ) {
+    _clang_getCursorLocation_wrap ??= _dylib.lookupFunction<
+        _c_clang_getCursorLocation_wrap,
+        _dart_clang_getCursorLocation_wrap>('clang_getCursorLocation_wrap');
+    return _clang_getCursorLocation_wrap(
+      cursor,
+    );
+  }
+
+  _dart_clang_getCursorLocation_wrap _clang_getCursorLocation_wrap;
+
+  void clang_getFileLocation_wrap(
+    ffi.Pointer<CXSourceLocation> location,
+    ffi.Pointer<ffi.Pointer<ffi.Void>> file,
+    ffi.Pointer<ffi.Uint32> line,
+    ffi.Pointer<ffi.Uint32> column,
+    ffi.Pointer<ffi.Uint32> offset,
+  ) {
+    _clang_getFileLocation_wrap ??= _dylib.lookupFunction<
+        _c_clang_getFileLocation_wrap,
+        _dart_clang_getFileLocation_wrap>('clang_getFileLocation_wrap');
+    return _clang_getFileLocation_wrap(
+      location,
+      file,
+      line,
+      column,
+      offset,
+    );
+  }
+
+  _dart_clang_getFileLocation_wrap _clang_getFileLocation_wrap;
+
+  ffi.Pointer<CXString> clang_getFileName_wrap(
+    ffi.Pointer<ffi.Void> SFile,
+  ) {
+    _clang_getFileName_wrap ??= _dylib.lookupFunction<_c_clang_getFileName_wrap,
+        _dart_clang_getFileName_wrap>('clang_getFileName_wrap');
+    return _clang_getFileName_wrap(
+      SFile,
+    );
+  }
+
+  _dart_clang_getFileName_wrap _clang_getFileName_wrap;
+
+  int clang_getNumElements_wrap(
+    ffi.Pointer<CXType> cxtype,
+  ) {
+    _clang_getNumElements_wrap ??= _dylib.lookupFunction<
+        _c_clang_getNumElements_wrap,
+        _dart_clang_getNumElements_wrap>('clang_getNumElements_wrap');
+    return _clang_getNumElements_wrap(
+      cxtype,
+    );
+  }
+
+  _dart_clang_getNumElements_wrap _clang_getNumElements_wrap;
+
+  ffi.Pointer<CXType> clang_getArrayElementType_wrap(
+    ffi.Pointer<CXType> cxtype,
+  ) {
+    _clang_getArrayElementType_wrap ??= _dylib.lookupFunction<
+        _c_clang_getArrayElementType_wrap,
+        _dart_clang_getArrayElementType_wrap>('clang_getArrayElementType_wrap');
+    return _clang_getArrayElementType_wrap(
+      cxtype,
+    );
+  }
+
+  _dart_clang_getArrayElementType_wrap _clang_getArrayElementType_wrap;
 }
 
-/// Contains the results of code-completion.
+/// A character string.
 ///
-/// This data structure contains the results of code completion, as
-/// produced by \c clang_codeCompleteAt(). Its contents must be freed by
-/// \c clang_disposeCodeCompleteResults.
-class CXCodeCompleteResults extends ffi.Struct {
-  /// The code-completion results.
-  ffi.Pointer<CXCompletionResult> Results;
+/// The \c CXString type is used to return strings from the interface when
+/// the ownership of that string might differ from one call to the next.
+/// Use \c clang_getCString() to retrieve the string data and, once finished
+/// with the string data, call \c clang_disposeString() to free the string.
+class CXString extends ffi.Struct {
+  ffi.Pointer<ffi.Void> data;
 
-  /// The number of code-completion results stored in the
-  /// \c Results array.
   @ffi.Uint32()
-  int NumResults;
+  int private_flags;
 }
 
-/// A single result of code completion.
-class CXCompletionResult extends ffi.Struct {
-  /// The kind of entity that this completion refers to.
-  ///
-  /// The cursor kind will be a macro, keyword, or a declaration (one of the
-  /// *Decl cursor kinds), describing the entity that the completion is
-  /// referring to.
-  ///
-  /// \todo In the future, we would like to provide a full cursor, to allow
-  /// the client to extract additional information from declaration.
-  @ffi.Int32()
-  int CursorKind;
+class CXStringSet extends ffi.Struct {
+  ffi.Pointer<CXString> Strings;
 
-  /// The code-completion string that describes how to insert this
-  /// code-completion result into the editing buffer.
-  ffi.Pointer<ffi.Void> CompletionString;
+  @ffi.Uint32()
+  int Count;
 }
 
-/// A cursor representing some element in the abstract syntax tree for
-/// a translation unit.
+class CXTargetInfoImpl extends ffi.Struct {}
+
+class CXTranslationUnitImpl extends ffi.Struct {}
+
+/// Provides the contents of a file that has not yet been saved to disk.
 ///
-/// The cursor abstraction unifies the different kinds of entities in a
-/// program--declaration, statements, expressions, references to declarations,
-/// etc.--under a single "cursor" abstraction with a common set of operations.
-/// Common operation for a cursor include: getting the physical location in
-/// a source file where the cursor points, getting the name associated with a
-/// cursor, and retrieving cursors for any child nodes of a particular cursor.
-///
-/// Cursors can be produced in two specific ways.
-/// clang_getTranslationUnitCursor() produces a cursor for a translation unit,
-/// from which one can use clang_visitChildren() to explore the rest of the
-/// translation unit. clang_getCursor() maps from a physical source location
-/// to the entity that resides at that location, allowing one to map from the
-/// source code into the AST.
-class CXCursor extends ffi.Struct {
-  @ffi.Int32()
-  int kind;
+/// Each CXUnsavedFile instance provides the name of a file on the
+/// system along with the current contents of that file that have not
+/// yet been saved to disk.
+class CXUnsavedFile extends ffi.Struct {
+  /// The file whose contents have not yet been saved.
+  ///
+  /// This file must already exist in the file system.
+  ffi.Pointer<ffi.Int8> Filename;
 
-  @ffi.Int32()
-  int xdata;
+  /// A buffer containing the unsaved contents of this file.
+  ffi.Pointer<ffi.Int8> Contents;
 
-  ffi.Pointer<ffi.Void> _exp_workaround_data_item_0;
-  ffi.Pointer<ffi.Void> _exp_workaround_data_item_1;
-  ffi.Pointer<ffi.Void> _exp_workaround_data_item_2;
-
-  /// Helper for array `data`.
-  ArrayHelper_CXCursor_data_level0 get data =>
-      ArrayHelper_CXCursor_data_level0(this, [3], 0, 0);
+  /// The length of the unsaved contents of this buffer.
+  @ffi.Uint64()
+  int Length;
 }
 
-/// Helper for array `data` in struct `CXCursor`.
-class ArrayHelper_CXCursor_data_level0 {
-  final CXCursor _struct;
-  final List<int> dimensions;
-  final int level;
-  final int _absoluteIndex;
-  int get length => dimensions[level];
-  ArrayHelper_CXCursor_data_level0(
-      this._struct, this.dimensions, this.level, this._absoluteIndex);
-  void _checkBounds(int index) {
-    if (index >= length || index < 0) {
-      throw RangeError(
-          'Dimension $level: index not in range 0..${length} exclusive.');
-    }
-  }
+/// Describes a version number of the form major.minor.subminor.
+class CXVersion extends ffi.Struct {
+  /// The major version number, e.g., the '10' in '10.7.3'. A negative
+  /// value indicates that there is no version number at all.
+  @ffi.Int32()
+  int Major;
 
-  ffi.Pointer<ffi.Void> operator [](int index) {
-    _checkBounds(index);
-    switch (_absoluteIndex + index) {
-      case 0:
-        return _struct._exp_workaround_data_item_0;
-      case 1:
-        return _struct._exp_workaround_data_item_1;
-      case 2:
-        return _struct._exp_workaround_data_item_2;
-      default:
-        throw Exception('Invalid Array Helper generated.');
-    }
-  }
+  /// The minor version number, e.g., the '7' in '10.7.3'. This value
+  /// will be negative if no minor version number was provided, e.g., for
+  /// version '10'.
+  @ffi.Int32()
+  int Minor;
 
-  void operator []=(int index, ffi.Pointer<ffi.Void> value) {
-    _checkBounds(index);
-    switch (_absoluteIndex + index) {
-      case 0:
-        _struct._exp_workaround_data_item_0 = value;
-        break;
-      case 1:
-        _struct._exp_workaround_data_item_1 = value;
-        break;
-      case 2:
-        _struct._exp_workaround_data_item_2 = value;
-        break;
-      default:
-        throw Exception('Invalid Array Helper generated.');
-    }
-  }
+  /// The subminor version number, e.g., the '3' in '10.7.3'. This value
+  /// will be negative if no minor or subminor version number was provided,
+  /// e.g., in version '10' or '10.7'.
+  @ffi.Int32()
+  int Subminor;
 }
 
-class CXCursorAndRangeVisitor extends ffi.Struct {}
+class CXGlobalOptFlags {
+  /// Used to indicate that no special CXIndex options are needed.
+  static const int CXGlobalOpt_None = 0;
 
-class CXCursorSetImpl extends ffi.Struct {}
+  /// Used to indicate that threads that libclang creates for indexing
+  /// purposes should use background priority.
+  ///
+  /// Affects #clang_indexSourceFile, #clang_indexTranslationUnit,
+  /// #clang_parseTranslationUnit, #clang_saveTranslationUnit.
+  static const int CXGlobalOpt_ThreadBackgroundPriorityForIndexing = 1;
+
+  /// Used to indicate that threads that libclang creates for editing
+  /// purposes should use background priority.
+  ///
+  /// Affects #clang_reparseTranslationUnit, #clang_codeCompleteAt,
+  /// #clang_annotateTokens
+  static const int CXGlobalOpt_ThreadBackgroundPriorityForEditing = 2;
+
+  /// Used to indicate that all threads that libclang creates should use
+  /// background priority.
+  static const int CXGlobalOpt_ThreadBackgroundPriorityForAll = 3;
+}
 
 /// Uniquely identifies a CXFile, that refers to the same underlying file,
 /// across an indexing session.
 class CXFileUniqueID extends ffi.Struct {
   @ffi.Uint64()
-  int _exp_workaround_data_item_0;
+  int _unique_data_item_0;
   @ffi.Uint64()
-  int _exp_workaround_data_item_1;
+  int _unique_data_item_1;
   @ffi.Uint64()
-  int _exp_workaround_data_item_2;
+  int _unique_data_item_2;
 
   /// Helper for array `data`.
   ArrayHelper_CXFileUniqueID_data_level0 get data =>
@@ -164,11 +3028,11 @@
     _checkBounds(index);
     switch (_absoluteIndex + index) {
       case 0:
-        return _struct._exp_workaround_data_item_0;
+        return _struct._unique_data_item_0;
       case 1:
-        return _struct._exp_workaround_data_item_1;
+        return _struct._unique_data_item_1;
       case 2:
-        return _struct._exp_workaround_data_item_2;
+        return _struct._unique_data_item_2;
       default:
         throw Exception('Invalid Array Helper generated.');
     }
@@ -178,13 +3042,13 @@
     _checkBounds(index);
     switch (_absoluteIndex + index) {
       case 0:
-        _struct._exp_workaround_data_item_0 = value;
+        _struct._unique_data_item_0 = value;
         break;
       case 1:
-        _struct._exp_workaround_data_item_1 = value;
+        _struct._unique_data_item_1 = value;
         break;
       case 2:
-        _struct._exp_workaround_data_item_2 = value;
+        _struct._unique_data_item_2 = value;
         break;
       default:
         throw Exception('Invalid Array Helper generated.');
@@ -192,160 +3056,14 @@
   }
 }
 
-class CXGlobalOptFlags {
-  /// Used to indicate that no special CXIndex options are needed.
-  static const int CXGlobalOpt_None = 0;
-
-  /// Used to indicate that threads that libclang creates for indexing
-  /// purposes should use background priority.
-  ///
-  /// Affects #clang_indexSourceFile, #clang_indexTranslationUnit,
-  /// #clang_parseTranslationUnit, #clang_saveTranslationUnit.
-  static const int CXGlobalOpt_ThreadBackgroundPriorityForIndexing = 1;
-
-  /// Used to indicate that threads that libclang creates for editing
-  /// purposes should use background priority.
-  ///
-  /// Affects #clang_reparseTranslationUnit, #clang_codeCompleteAt,
-  /// #clang_annotateTokens
-  static const int CXGlobalOpt_ThreadBackgroundPriorityForEditing = 2;
-
-  /// Used to indicate that all threads that libclang creates should use
-  /// background priority.
-  static const int CXGlobalOpt_ThreadBackgroundPriorityForAll = 3;
-}
-
-class CXIdxAttrInfo extends ffi.Struct {}
-
-class CXIdxBaseClassInfo extends ffi.Struct {}
-
-class CXIdxCXXClassDeclInfo extends ffi.Struct {
-  ffi.Pointer<CXIdxDeclInfo> declInfo;
-
-  ffi.Pointer<ffi.Pointer<CXIdxBaseClassInfo>> bases;
-
-  @ffi.Uint32()
-  int numBases;
-}
-
-class CXIdxContainerInfo extends ffi.Struct {}
-
-class CXIdxDeclInfo extends ffi.Struct {}
-
-class CXIdxEntityInfo extends ffi.Struct {}
-
-/// Data for IndexerCallbacks#indexEntityReference.
-class CXIdxEntityRefInfo extends ffi.Struct {}
-
-class CXIdxIBOutletCollectionAttrInfo extends ffi.Struct {}
-
-/// Data for IndexerCallbacks#importedASTFile.
-class CXIdxImportedASTFileInfo extends ffi.Struct {}
-
-/// Data for ppIncludedFile callback.
-class CXIdxIncludedFileInfo extends ffi.Struct {}
-
-/// Source location passed to index callbacks.
-class CXIdxLoc extends ffi.Struct {
-  ffi.Pointer<ffi.Void> _exp_workaround_ptr_data_item_0;
-  ffi.Pointer<ffi.Void> _exp_workaround_ptr_data_item_1;
-
-  /// Helper for array `ptr_data`.
-  ArrayHelper_CXIdxLoc_ptr_data_level0 get ptr_data =>
-      ArrayHelper_CXIdxLoc_ptr_data_level0(this, [2], 0, 0);
-  @ffi.Uint32()
-  int int_data;
-}
-
-/// Helper for array `ptr_data` in struct `CXIdxLoc`.
-class ArrayHelper_CXIdxLoc_ptr_data_level0 {
-  final CXIdxLoc _struct;
-  final List<int> dimensions;
-  final int level;
-  final int _absoluteIndex;
-  int get length => dimensions[level];
-  ArrayHelper_CXIdxLoc_ptr_data_level0(
-      this._struct, this.dimensions, this.level, this._absoluteIndex);
-  void _checkBounds(int index) {
-    if (index >= length || index < 0) {
-      throw RangeError(
-          'Dimension $level: index not in range 0..${length} exclusive.');
-    }
-  }
-
-  ffi.Pointer<ffi.Void> operator [](int index) {
-    _checkBounds(index);
-    switch (_absoluteIndex + index) {
-      case 0:
-        return _struct._exp_workaround_ptr_data_item_0;
-      case 1:
-        return _struct._exp_workaround_ptr_data_item_1;
-      default:
-        throw Exception('Invalid Array Helper generated.');
-    }
-  }
-
-  void operator []=(int index, ffi.Pointer<ffi.Void> value) {
-    _checkBounds(index);
-    switch (_absoluteIndex + index) {
-      case 0:
-        _struct._exp_workaround_ptr_data_item_0 = value;
-        break;
-      case 1:
-        _struct._exp_workaround_ptr_data_item_1 = value;
-        break;
-      default:
-        throw Exception('Invalid Array Helper generated.');
-    }
-  }
-}
-
-class CXIdxObjCCategoryDeclInfo extends ffi.Struct {}
-
-class CXIdxObjCContainerDeclInfo extends ffi.Struct {
-  ffi.Pointer<CXIdxDeclInfo> declInfo;
-
-  @ffi.Int32()
-  int kind;
-}
-
-class CXIdxObjCInterfaceDeclInfo extends ffi.Struct {
-  ffi.Pointer<CXIdxObjCContainerDeclInfo> containerInfo;
-
-  ffi.Pointer<CXIdxBaseClassInfo> superInfo;
-
-  ffi.Pointer<CXIdxObjCProtocolRefListInfo> protocols;
-}
-
-class CXIdxObjCPropertyDeclInfo extends ffi.Struct {
-  ffi.Pointer<CXIdxDeclInfo> declInfo;
-
-  ffi.Pointer<CXIdxEntityInfo> getter;
-
-  ffi.Pointer<CXIdxEntityInfo> setter;
-}
-
-class CXIdxObjCProtocolRefInfo extends ffi.Struct {}
-
-class CXIdxObjCProtocolRefListInfo extends ffi.Struct {
-  ffi.Pointer<ffi.Pointer<CXIdxObjCProtocolRefInfo>> protocols;
-
-  @ffi.Uint32()
-  int numProtocols;
-}
-
-/// 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 {}
-
 /// Identifies a specific source location within a translation
 /// unit.
 ///
 /// Use clang_getExpansionLocation() or clang_getSpellingLocation()
 /// to map a source location to a particular file, line, and column.
 class CXSourceLocation extends ffi.Struct {
-  ffi.Pointer<ffi.Void> _exp_workaround_ptr_data_item_0;
-  ffi.Pointer<ffi.Void> _exp_workaround_ptr_data_item_1;
+  ffi.Pointer<ffi.Void> _unique_ptr_data_item_0;
+  ffi.Pointer<ffi.Void> _unique_ptr_data_item_1;
 
   /// Helper for array `ptr_data`.
   ArrayHelper_CXSourceLocation_ptr_data_level0 get ptr_data =>
@@ -374,9 +3092,9 @@
     _checkBounds(index);
     switch (_absoluteIndex + index) {
       case 0:
-        return _struct._exp_workaround_ptr_data_item_0;
+        return _struct._unique_ptr_data_item_0;
       case 1:
-        return _struct._exp_workaround_ptr_data_item_1;
+        return _struct._unique_ptr_data_item_1;
       default:
         throw Exception('Invalid Array Helper generated.');
     }
@@ -386,10 +3104,10 @@
     _checkBounds(index);
     switch (_absoluteIndex + index) {
       case 0:
-        _struct._exp_workaround_ptr_data_item_0 = value;
+        _struct._unique_ptr_data_item_0 = value;
         break;
       case 1:
-        _struct._exp_workaround_ptr_data_item_1 = value;
+        _struct._unique_ptr_data_item_1 = value;
         break;
       default:
         throw Exception('Invalid Array Helper generated.');
@@ -402,8 +3120,8 @@
 /// Use clang_getRangeStart() and clang_getRangeEnd() to retrieve the
 /// starting and end locations from a source range, respectively.
 class CXSourceRange extends ffi.Struct {
-  ffi.Pointer<ffi.Void> _exp_workaround_ptr_data_item_0;
-  ffi.Pointer<ffi.Void> _exp_workaround_ptr_data_item_1;
+  ffi.Pointer<ffi.Void> _unique_ptr_data_item_0;
+  ffi.Pointer<ffi.Void> _unique_ptr_data_item_1;
 
   /// Helper for array `ptr_data`.
   ArrayHelper_CXSourceRange_ptr_data_level0 get ptr_data =>
@@ -435,9 +3153,9 @@
     _checkBounds(index);
     switch (_absoluteIndex + index) {
       case 0:
-        return _struct._exp_workaround_ptr_data_item_0;
+        return _struct._unique_ptr_data_item_0;
       case 1:
-        return _struct._exp_workaround_ptr_data_item_1;
+        return _struct._unique_ptr_data_item_1;
       default:
         throw Exception('Invalid Array Helper generated.');
     }
@@ -447,10 +3165,10 @@
     _checkBounds(index);
     switch (_absoluteIndex + index) {
       case 0:
-        _struct._exp_workaround_ptr_data_item_0 = value;
+        _struct._unique_ptr_data_item_0 = value;
         break;
       case 1:
-        _struct._exp_workaround_ptr_data_item_1 = value;
+        _struct._unique_ptr_data_item_1 = value;
         break;
       default:
         throw Exception('Invalid Array Helper generated.');
@@ -468,24 +3186,12 @@
   ffi.Pointer<CXSourceRange> ranges;
 }
 
-/// A character string.
-///
-/// The \c CXString type is used to return strings from the interface when
-/// the ownership of that string might differ from one call to the next.
-/// Use \c clang_getCString() to retrieve the string data and, once finished
-/// with the string data, call \c clang_disposeString() to free the string.
-class CXString extends ffi.Struct {
-  ffi.Pointer<ffi.Void> data;
+class CXTUResourceUsageEntry extends ffi.Struct {
+  @ffi.Int32()
+  int kind;
 
-  @ffi.Uint32()
-  int private_flags;
-}
-
-class CXStringSet extends ffi.Struct {
-  ffi.Pointer<CXString> Strings;
-
-  @ffi.Uint32()
-  int Count;
+  @ffi.Uint64()
+  int amount;
 }
 
 /// The memory usage of a CXTranslationUnit, broken into categories.
@@ -498,109 +3204,46 @@
   ffi.Pointer<CXTUResourceUsageEntry> entries;
 }
 
-class CXTUResourceUsageEntry extends ffi.Struct {
+/// A cursor representing some element in the abstract syntax tree for
+/// a translation unit.
+///
+/// The cursor abstraction unifies the different kinds of entities in a
+/// program--declaration, statements, expressions, references to declarations,
+/// etc.--under a single "cursor" abstraction with a common set of operations.
+/// Common operation for a cursor include: getting the physical location in
+/// a source file where the cursor points, getting the name associated with a
+/// cursor, and retrieving cursors for any child nodes of a particular cursor.
+///
+/// Cursors can be produced in two specific ways.
+/// clang_getTranslationUnitCursor() produces a cursor for a translation unit,
+/// from which one can use clang_visitChildren() to explore the rest of the
+/// translation unit. clang_getCursor() maps from a physical source location
+/// to the entity that resides at that location, allowing one to map from the
+/// source code into the AST.
+class CXCursor extends ffi.Struct {
   @ffi.Int32()
   int kind;
 
-  @ffi.Uint64()
-  int amount;
-}
-
-class CXTargetInfoImpl extends ffi.Struct {}
-
-/// Describes a single preprocessing token.
-class CXToken extends ffi.Struct {
-  @ffi.Uint32()
-  int _exp_workaround_int_data_item_0;
-  @ffi.Uint32()
-  int _exp_workaround_int_data_item_1;
-  @ffi.Uint32()
-  int _exp_workaround_int_data_item_2;
-  @ffi.Uint32()
-  int _exp_workaround_int_data_item_3;
-
-  /// Helper for array `int_data`.
-  ArrayHelper_CXToken_int_data_level0 get int_data =>
-      ArrayHelper_CXToken_int_data_level0(this, [4], 0, 0);
-  ffi.Pointer<ffi.Void> ptr_data;
-}
-
-/// Helper for array `int_data` in struct `CXToken`.
-class ArrayHelper_CXToken_int_data_level0 {
-  final CXToken _struct;
-  final List<int> dimensions;
-  final int level;
-  final int _absoluteIndex;
-  int get length => dimensions[level];
-  ArrayHelper_CXToken_int_data_level0(
-      this._struct, this.dimensions, this.level, this._absoluteIndex);
-  void _checkBounds(int index) {
-    if (index >= length || index < 0) {
-      throw RangeError(
-          'Dimension $level: index not in range 0..${length} exclusive.');
-    }
-  }
-
-  int operator [](int index) {
-    _checkBounds(index);
-    switch (_absoluteIndex + index) {
-      case 0:
-        return _struct._exp_workaround_int_data_item_0;
-      case 1:
-        return _struct._exp_workaround_int_data_item_1;
-      case 2:
-        return _struct._exp_workaround_int_data_item_2;
-      case 3:
-        return _struct._exp_workaround_int_data_item_3;
-      default:
-        throw Exception('Invalid Array Helper generated.');
-    }
-  }
-
-  void operator []=(int index, int value) {
-    _checkBounds(index);
-    switch (_absoluteIndex + index) {
-      case 0:
-        _struct._exp_workaround_int_data_item_0 = value;
-        break;
-      case 1:
-        _struct._exp_workaround_int_data_item_1 = value;
-        break;
-      case 2:
-        _struct._exp_workaround_int_data_item_2 = value;
-        break;
-      case 3:
-        _struct._exp_workaround_int_data_item_3 = value;
-        break;
-      default:
-        throw Exception('Invalid Array Helper generated.');
-    }
-  }
-}
-
-class CXTranslationUnitImpl extends ffi.Struct {}
-
-/// The type of an element in the abstract syntax tree.
-class CXType extends ffi.Struct {
   @ffi.Int32()
-  int kind;
+  int xdata;
 
-  ffi.Pointer<ffi.Void> _exp_workaround_data_item_0;
-  ffi.Pointer<ffi.Void> _exp_workaround_data_item_1;
+  ffi.Pointer<ffi.Void> _unique_data_item_0;
+  ffi.Pointer<ffi.Void> _unique_data_item_1;
+  ffi.Pointer<ffi.Void> _unique_data_item_2;
 
   /// Helper for array `data`.
-  ArrayHelper_CXType_data_level0 get data =>
-      ArrayHelper_CXType_data_level0(this, [2], 0, 0);
+  ArrayHelper_CXCursor_data_level0 get data =>
+      ArrayHelper_CXCursor_data_level0(this, [3], 0, 0);
 }
 
-/// Helper for array `data` in struct `CXType`.
-class ArrayHelper_CXType_data_level0 {
-  final CXType _struct;
+/// Helper for array `data` in struct `CXCursor`.
+class ArrayHelper_CXCursor_data_level0 {
+  final CXCursor _struct;
   final List<int> dimensions;
   final int level;
   final int _absoluteIndex;
   int get length => dimensions[level];
-  ArrayHelper_CXType_data_level0(
+  ArrayHelper_CXCursor_data_level0(
       this._struct, this.dimensions, this.level, this._absoluteIndex);
   void _checkBounds(int index) {
     if (index >= length || index < 0) {
@@ -613,9 +3256,11 @@
     _checkBounds(index);
     switch (_absoluteIndex + index) {
       case 0:
-        return _struct._exp_workaround_data_item_0;
+        return _struct._unique_data_item_0;
       case 1:
-        return _struct._exp_workaround_data_item_1;
+        return _struct._unique_data_item_1;
+      case 2:
+        return _struct._unique_data_item_2;
       default:
         throw Exception('Invalid Array Helper generated.');
     }
@@ -625,10 +3270,13 @@
     _checkBounds(index);
     switch (_absoluteIndex + index) {
       case 0:
-        _struct._exp_workaround_data_item_0 = value;
+        _struct._unique_data_item_0 = value;
         break;
       case 1:
-        _struct._exp_workaround_data_item_1 = value;
+        _struct._unique_data_item_1 = value;
+        break;
+      case 2:
+        _struct._unique_data_item_2 = value;
         break;
       default:
         throw Exception('Invalid Array Helper generated.');
@@ -636,6 +3284,12 @@
   }
 }
 
+/// 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 {}
+
+class CXCursorSetImpl extends ffi.Struct {}
+
 /// Describes the kind of type
 class CXTypeKind {
   /// Represents an invalid type (e.g., where no type is available).
@@ -766,47 +3420,1787 @@
   static const int CXType_ExtVector = 176;
 }
 
-/// Provides the contents of a file that has not yet been saved to disk.
-///
-/// Each CXUnsavedFile instance provides the name of a file on the
-/// system along with the current contents of that file that have not
-/// yet been saved to disk.
-class CXUnsavedFile extends ffi.Struct {
-  /// The file whose contents have not yet been saved.
+/// The type of an element in the abstract syntax tree.
+class CXType extends ffi.Struct {
+  @ffi.Int32()
+  int kind;
+
+  ffi.Pointer<ffi.Void> _unique_data_item_0;
+  ffi.Pointer<ffi.Void> _unique_data_item_1;
+
+  /// Helper for array `data`.
+  ArrayHelper_CXType_data_level0 get data =>
+      ArrayHelper_CXType_data_level0(this, [2], 0, 0);
+}
+
+/// Helper for array `data` in struct `CXType`.
+class ArrayHelper_CXType_data_level0 {
+  final CXType _struct;
+  final List<int> dimensions;
+  final int level;
+  final int _absoluteIndex;
+  int get length => dimensions[level];
+  ArrayHelper_CXType_data_level0(
+      this._struct, this.dimensions, this.level, this._absoluteIndex);
+  void _checkBounds(int index) {
+    if (index >= length || index < 0) {
+      throw RangeError(
+          'Dimension $level: index not in range 0..${length} exclusive.');
+    }
+  }
+
+  ffi.Pointer<ffi.Void> operator [](int index) {
+    _checkBounds(index);
+    switch (_absoluteIndex + index) {
+      case 0:
+        return _struct._unique_data_item_0;
+      case 1:
+        return _struct._unique_data_item_1;
+      default:
+        throw Exception('Invalid Array Helper generated.');
+    }
+  }
+
+  void operator []=(int index, ffi.Pointer<ffi.Void> value) {
+    _checkBounds(index);
+    switch (_absoluteIndex + index) {
+      case 0:
+        _struct._unique_data_item_0 = value;
+        break;
+      case 1:
+        _struct._unique_data_item_1 = value;
+        break;
+      default:
+        throw Exception('Invalid Array Helper generated.');
+    }
+  }
+}
+
+/// Describes a single preprocessing token.
+class CXToken extends ffi.Struct {
+  @ffi.Uint32()
+  int _unique_int_data_item_0;
+  @ffi.Uint32()
+  int _unique_int_data_item_1;
+  @ffi.Uint32()
+  int _unique_int_data_item_2;
+  @ffi.Uint32()
+  int _unique_int_data_item_3;
+
+  /// Helper for array `int_data`.
+  ArrayHelper_CXToken_int_data_level0 get int_data =>
+      ArrayHelper_CXToken_int_data_level0(this, [4], 0, 0);
+  ffi.Pointer<ffi.Void> ptr_data;
+}
+
+/// Helper for array `int_data` in struct `CXToken`.
+class ArrayHelper_CXToken_int_data_level0 {
+  final CXToken _struct;
+  final List<int> dimensions;
+  final int level;
+  final int _absoluteIndex;
+  int get length => dimensions[level];
+  ArrayHelper_CXToken_int_data_level0(
+      this._struct, this.dimensions, this.level, this._absoluteIndex);
+  void _checkBounds(int index) {
+    if (index >= length || index < 0) {
+      throw RangeError(
+          'Dimension $level: index not in range 0..${length} exclusive.');
+    }
+  }
+
+  int operator [](int index) {
+    _checkBounds(index);
+    switch (_absoluteIndex + index) {
+      case 0:
+        return _struct._unique_int_data_item_0;
+      case 1:
+        return _struct._unique_int_data_item_1;
+      case 2:
+        return _struct._unique_int_data_item_2;
+      case 3:
+        return _struct._unique_int_data_item_3;
+      default:
+        throw Exception('Invalid Array Helper generated.');
+    }
+  }
+
+  void operator []=(int index, int value) {
+    _checkBounds(index);
+    switch (_absoluteIndex + index) {
+      case 0:
+        _struct._unique_int_data_item_0 = value;
+        break;
+      case 1:
+        _struct._unique_int_data_item_1 = value;
+        break;
+      case 2:
+        _struct._unique_int_data_item_2 = value;
+        break;
+      case 3:
+        _struct._unique_int_data_item_3 = value;
+        break;
+      default:
+        throw Exception('Invalid Array Helper generated.');
+    }
+  }
+}
+
+/// A single result of code completion.
+class CXCompletionResult extends ffi.Struct {
+  /// The kind of entity that this completion refers to.
   ///
-  /// This file must already exist in the file system.
-  ffi.Pointer<ffi.Int8> Filename;
+  /// The cursor kind will be a macro, keyword, or a declaration (one of the
+  /// *Decl cursor kinds), describing the entity that the completion is
+  /// referring to.
+  ///
+  /// \todo In the future, we would like to provide a full cursor, to allow
+  /// the client to extract additional information from declaration.
+  @ffi.Int32()
+  int CursorKind;
 
-  /// A buffer containing the unsaved contents of this file.
-  ffi.Pointer<ffi.Int8> Contents;
-
-  /// The length of the unsaved contents of this buffer.
-  @ffi.Uint64()
-  int Length;
+  /// The code-completion string that describes how to insert this
+  /// code-completion result into the editing buffer.
+  ffi.Pointer<ffi.Void> CompletionString;
 }
 
-/// Describes a version number of the form major.minor.subminor.
-class CXVersion extends ffi.Struct {
-  /// The major version number, e.g., the '10' in '10.7.3'. A negative
-  /// value indicates that there is no version number at all.
-  @ffi.Int32()
-  int Major;
+/// Contains the results of code-completion.
+///
+/// This data structure contains the results of code completion, as
+/// produced by \c clang_codeCompleteAt(). Its contents must be freed by
+/// \c clang_disposeCodeCompleteResults.
+class CXCodeCompleteResults extends ffi.Struct {
+  /// The code-completion results.
+  ffi.Pointer<CXCompletionResult> Results;
 
-  /// The minor version number, e.g., the '7' in '10.7.3'. This value
-  /// will be negative if no minor version number was provided, e.g., for
-  /// version '10'.
-  @ffi.Int32()
-  int Minor;
-
-  /// The subminor version number, e.g., the '3' in '10.7.3'. This value
-  /// will be negative if no minor or subminor version number was provided,
-  /// e.g., in version '10' or '10.7'.
-  @ffi.Int32()
-  int Subminor;
+  /// The number of code-completion results stored in the
+  /// \c Results array.
+  @ffi.Uint32()
+  int NumResults;
 }
 
+class CXCursorAndRangeVisitor extends ffi.Struct {}
+
+/// Source location passed to index callbacks.
+class CXIdxLoc extends ffi.Struct {
+  ffi.Pointer<ffi.Void> _unique_ptr_data_item_0;
+  ffi.Pointer<ffi.Void> _unique_ptr_data_item_1;
+
+  /// Helper for array `ptr_data`.
+  ArrayHelper_CXIdxLoc_ptr_data_level0 get ptr_data =>
+      ArrayHelper_CXIdxLoc_ptr_data_level0(this, [2], 0, 0);
+  @ffi.Uint32()
+  int int_data;
+}
+
+/// Helper for array `ptr_data` in struct `CXIdxLoc`.
+class ArrayHelper_CXIdxLoc_ptr_data_level0 {
+  final CXIdxLoc _struct;
+  final List<int> dimensions;
+  final int level;
+  final int _absoluteIndex;
+  int get length => dimensions[level];
+  ArrayHelper_CXIdxLoc_ptr_data_level0(
+      this._struct, this.dimensions, this.level, this._absoluteIndex);
+  void _checkBounds(int index) {
+    if (index >= length || index < 0) {
+      throw RangeError(
+          'Dimension $level: index not in range 0..${length} exclusive.');
+    }
+  }
+
+  ffi.Pointer<ffi.Void> operator [](int index) {
+    _checkBounds(index);
+    switch (_absoluteIndex + index) {
+      case 0:
+        return _struct._unique_ptr_data_item_0;
+      case 1:
+        return _struct._unique_ptr_data_item_1;
+      default:
+        throw Exception('Invalid Array Helper generated.');
+    }
+  }
+
+  void operator []=(int index, ffi.Pointer<ffi.Void> value) {
+    _checkBounds(index);
+    switch (_absoluteIndex + index) {
+      case 0:
+        _struct._unique_ptr_data_item_0 = value;
+        break;
+      case 1:
+        _struct._unique_ptr_data_item_1 = value;
+        break;
+      default:
+        throw Exception('Invalid Array Helper generated.');
+    }
+  }
+}
+
+/// Data for ppIncludedFile callback.
+class CXIdxIncludedFileInfo extends ffi.Struct {}
+
+/// Data for IndexerCallbacks#importedASTFile.
+class CXIdxImportedASTFileInfo extends ffi.Struct {}
+
+class CXIdxAttrInfo extends ffi.Struct {}
+
+class CXIdxEntityInfo extends ffi.Struct {}
+
+class CXIdxContainerInfo extends ffi.Struct {}
+
+class CXIdxIBOutletCollectionAttrInfo extends ffi.Struct {}
+
+class CXIdxDeclInfo extends ffi.Struct {}
+
+class CXIdxObjCContainerDeclInfo extends ffi.Struct {
+  ffi.Pointer<CXIdxDeclInfo> declInfo;
+
+  @ffi.Int32()
+  int kind;
+}
+
+class CXIdxBaseClassInfo extends ffi.Struct {}
+
+class CXIdxObjCProtocolRefInfo extends ffi.Struct {}
+
+class CXIdxObjCProtocolRefListInfo extends ffi.Struct {
+  ffi.Pointer<ffi.Pointer<CXIdxObjCProtocolRefInfo>> protocols;
+
+  @ffi.Uint32()
+  int numProtocols;
+}
+
+class CXIdxObjCInterfaceDeclInfo extends ffi.Struct {
+  ffi.Pointer<CXIdxObjCContainerDeclInfo> containerInfo;
+
+  ffi.Pointer<CXIdxBaseClassInfo> superInfo;
+
+  ffi.Pointer<CXIdxObjCProtocolRefListInfo> protocols;
+}
+
+class CXIdxObjCCategoryDeclInfo extends ffi.Struct {}
+
+class CXIdxObjCPropertyDeclInfo extends ffi.Struct {
+  ffi.Pointer<CXIdxDeclInfo> declInfo;
+
+  ffi.Pointer<CXIdxEntityInfo> getter;
+
+  ffi.Pointer<CXIdxEntityInfo> setter;
+}
+
+class CXIdxCXXClassDeclInfo extends ffi.Struct {
+  ffi.Pointer<CXIdxDeclInfo> declInfo;
+
+  ffi.Pointer<ffi.Pointer<CXIdxBaseClassInfo>> bases;
+
+  @ffi.Uint32()
+  int numBases;
+}
+
+/// Data for IndexerCallbacks#indexEntityReference.
+class CXIdxEntityRefInfo extends ffi.Struct {}
+
 /// A group of callbacks used by #clang_indexSourceFile and
 /// #clang_indexTranslationUnit.
+class IndexerCallbacks extends ffi.Struct {
+  /// Called periodically to check whether indexing should be aborted.
+  /// Should return 0 to continue, and non-zero to abort.
+  ffi.Pointer<ffi.NativeFunction<_typedefC_3>> abortQuery;
+
+  /// Called at the end of indexing; passes the complete diagnostic set.
+  ffi.Pointer<ffi.NativeFunction<_typedefC_4>> diagnostic;
+
+  ffi.Pointer<ffi.NativeFunction<_typedefC_5>> enteredMainFile;
+
+  /// Called when a file gets \#included/\#imported.
+  ffi.Pointer<ffi.NativeFunction<_typedefC_6>> ppIncludedFile;
+
+  /// Called when a AST file (PCH or module) gets imported.
+  ///
+  /// AST files will not get indexed (there will not be callbacks to index all
+  /// the entities in an AST file). The recommended action is that, if the AST
+  /// file is not already indexed, to initiate a new indexing job specific to
+  /// the AST file.
+  ffi.Pointer<ffi.NativeFunction<_typedefC_7>> importedASTFile;
+
+  /// Called at the beginning of indexing a translation unit.
+  ffi.Pointer<ffi.NativeFunction<_typedefC_8>> startedTranslationUnit;
+
+  ffi.Pointer<ffi.NativeFunction<_typedefC_9>> indexDeclaration;
+
+  /// Called to index a reference of an entity.
+  ffi.Pointer<ffi.NativeFunction<_typedefC_10>> indexEntityReference;
+}
+
+typedef _c_clang_disposeStringSet = ffi.Void Function(
+  ffi.Pointer<CXStringSet> set,
+);
+
+typedef _dart_clang_disposeStringSet = void Function(
+  ffi.Pointer<CXStringSet> set,
+);
+
+typedef _c_clang_createIndex = ffi.Pointer<ffi.Void> Function(
+  ffi.Int32 excludeDeclarationsFromPCH,
+  ffi.Int32 displayDiagnostics,
+);
+
+typedef _dart_clang_createIndex = ffi.Pointer<ffi.Void> Function(
+  int excludeDeclarationsFromPCH,
+  int displayDiagnostics,
+);
+
+typedef _c_clang_disposeIndex = ffi.Void Function(
+  ffi.Pointer<ffi.Void> index,
+);
+
+typedef _dart_clang_disposeIndex = void Function(
+  ffi.Pointer<ffi.Void> index,
+);
+
+typedef _c_clang_CXIndex_setGlobalOptions = ffi.Void Function(
+  ffi.Pointer<ffi.Void> arg0,
+  ffi.Uint32 options,
+);
+
+typedef _dart_clang_CXIndex_setGlobalOptions = void Function(
+  ffi.Pointer<ffi.Void> arg0,
+  int options,
+);
+
+typedef _c_clang_CXIndex_getGlobalOptions = ffi.Uint32 Function(
+  ffi.Pointer<ffi.Void> arg0,
+);
+
+typedef _dart_clang_CXIndex_getGlobalOptions = int Function(
+  ffi.Pointer<ffi.Void> arg0,
+);
+
+typedef _c_clang_CXIndex_setInvocationEmissionPathOption = ffi.Void Function(
+  ffi.Pointer<ffi.Void> arg0,
+  ffi.Pointer<ffi.Int8> Path,
+);
+
+typedef _dart_clang_CXIndex_setInvocationEmissionPathOption = void Function(
+  ffi.Pointer<ffi.Void> arg0,
+  ffi.Pointer<ffi.Int8> Path,
+);
+
+typedef _c_clang_getFileTime = ffi.Int64 Function(
+  ffi.Pointer<ffi.Void> SFile,
+);
+
+typedef _dart_clang_getFileTime = int Function(
+  ffi.Pointer<ffi.Void> SFile,
+);
+
+typedef _c_clang_getFileUniqueID = ffi.Int32 Function(
+  ffi.Pointer<ffi.Void> file,
+  ffi.Pointer<CXFileUniqueID> outID,
+);
+
+typedef _dart_clang_getFileUniqueID = int Function(
+  ffi.Pointer<ffi.Void> file,
+  ffi.Pointer<CXFileUniqueID> outID,
+);
+
+typedef _c_clang_isFileMultipleIncludeGuarded = ffi.Uint32 Function(
+  ffi.Pointer<CXTranslationUnitImpl> tu,
+  ffi.Pointer<ffi.Void> file,
+);
+
+typedef _dart_clang_isFileMultipleIncludeGuarded = int Function(
+  ffi.Pointer<CXTranslationUnitImpl> tu,
+  ffi.Pointer<ffi.Void> file,
+);
+
+typedef _c_clang_getFile = ffi.Pointer<ffi.Void> Function(
+  ffi.Pointer<CXTranslationUnitImpl> tu,
+  ffi.Pointer<ffi.Int8> file_name,
+);
+
+typedef _dart_clang_getFile = ffi.Pointer<ffi.Void> Function(
+  ffi.Pointer<CXTranslationUnitImpl> tu,
+  ffi.Pointer<ffi.Int8> file_name,
+);
+
+typedef _c_clang_getFileContents = ffi.Pointer<ffi.Int8> Function(
+  ffi.Pointer<CXTranslationUnitImpl> tu,
+  ffi.Pointer<ffi.Void> file,
+  ffi.Pointer<ffi.Uint64> size,
+);
+
+typedef _dart_clang_getFileContents = ffi.Pointer<ffi.Int8> Function(
+  ffi.Pointer<CXTranslationUnitImpl> tu,
+  ffi.Pointer<ffi.Void> file,
+  ffi.Pointer<ffi.Uint64> size,
+);
+
+typedef _c_clang_File_isEqual = ffi.Int32 Function(
+  ffi.Pointer<ffi.Void> file1,
+  ffi.Pointer<ffi.Void> file2,
+);
+
+typedef _dart_clang_File_isEqual = int Function(
+  ffi.Pointer<ffi.Void> file1,
+  ffi.Pointer<ffi.Void> file2,
+);
+
+typedef _c_clang_getSkippedRanges = ffi.Pointer<CXSourceRangeList> Function(
+  ffi.Pointer<CXTranslationUnitImpl> tu,
+  ffi.Pointer<ffi.Void> file,
+);
+
+typedef _dart_clang_getSkippedRanges = ffi.Pointer<CXSourceRangeList> Function(
+  ffi.Pointer<CXTranslationUnitImpl> tu,
+  ffi.Pointer<ffi.Void> file,
+);
+
+typedef _c_clang_getAllSkippedRanges = ffi.Pointer<CXSourceRangeList> Function(
+  ffi.Pointer<CXTranslationUnitImpl> tu,
+);
+
+typedef _dart_clang_getAllSkippedRanges = ffi.Pointer<CXSourceRangeList>
+    Function(
+  ffi.Pointer<CXTranslationUnitImpl> tu,
+);
+
+typedef _c_clang_disposeSourceRangeList = ffi.Void Function(
+  ffi.Pointer<CXSourceRangeList> ranges,
+);
+
+typedef _dart_clang_disposeSourceRangeList = void Function(
+  ffi.Pointer<CXSourceRangeList> ranges,
+);
+
+typedef _c_clang_getNumDiagnosticsInSet = ffi.Uint32 Function(
+  ffi.Pointer<ffi.Void> Diags,
+);
+
+typedef _dart_clang_getNumDiagnosticsInSet = int Function(
+  ffi.Pointer<ffi.Void> Diags,
+);
+
+typedef _c_clang_getDiagnosticInSet = ffi.Pointer<ffi.Void> Function(
+  ffi.Pointer<ffi.Void> Diags,
+  ffi.Uint32 Index,
+);
+
+typedef _dart_clang_getDiagnosticInSet = ffi.Pointer<ffi.Void> Function(
+  ffi.Pointer<ffi.Void> Diags,
+  int Index,
+);
+
+typedef _c_clang_loadDiagnostics = ffi.Pointer<ffi.Void> Function(
+  ffi.Pointer<ffi.Int8> file,
+  ffi.Pointer<ffi.Int32> error,
+  ffi.Pointer<CXString> errorString,
+);
+
+typedef _dart_clang_loadDiagnostics = ffi.Pointer<ffi.Void> Function(
+  ffi.Pointer<ffi.Int8> file,
+  ffi.Pointer<ffi.Int32> error,
+  ffi.Pointer<CXString> errorString,
+);
+
+typedef _c_clang_disposeDiagnosticSet = ffi.Void Function(
+  ffi.Pointer<ffi.Void> Diags,
+);
+
+typedef _dart_clang_disposeDiagnosticSet = void Function(
+  ffi.Pointer<ffi.Void> Diags,
+);
+
+typedef _c_clang_getChildDiagnostics = ffi.Pointer<ffi.Void> Function(
+  ffi.Pointer<ffi.Void> D,
+);
+
+typedef _dart_clang_getChildDiagnostics = ffi.Pointer<ffi.Void> Function(
+  ffi.Pointer<ffi.Void> D,
+);
+
+typedef _c_clang_getNumDiagnostics = ffi.Uint32 Function(
+  ffi.Pointer<CXTranslationUnitImpl> Unit,
+);
+
+typedef _dart_clang_getNumDiagnostics = int Function(
+  ffi.Pointer<CXTranslationUnitImpl> Unit,
+);
+
+typedef _c_clang_getDiagnostic = ffi.Pointer<ffi.Void> Function(
+  ffi.Pointer<CXTranslationUnitImpl> Unit,
+  ffi.Uint32 Index,
+);
+
+typedef _dart_clang_getDiagnostic = ffi.Pointer<ffi.Void> Function(
+  ffi.Pointer<CXTranslationUnitImpl> Unit,
+  int Index,
+);
+
+typedef _c_clang_getDiagnosticSetFromTU = ffi.Pointer<ffi.Void> Function(
+  ffi.Pointer<CXTranslationUnitImpl> Unit,
+);
+
+typedef _dart_clang_getDiagnosticSetFromTU = ffi.Pointer<ffi.Void> Function(
+  ffi.Pointer<CXTranslationUnitImpl> Unit,
+);
+
+typedef _c_clang_disposeDiagnostic = ffi.Void Function(
+  ffi.Pointer<ffi.Void> Diagnostic,
+);
+
+typedef _dart_clang_disposeDiagnostic = void Function(
+  ffi.Pointer<ffi.Void> Diagnostic,
+);
+
+typedef _c_clang_defaultDiagnosticDisplayOptions = ffi.Uint32 Function();
+
+typedef _dart_clang_defaultDiagnosticDisplayOptions = int Function();
+
+typedef _c_clang_getDiagnosticSeverity = ffi.Int32 Function(
+  ffi.Pointer<ffi.Void> arg0,
+);
+
+typedef _dart_clang_getDiagnosticSeverity = int Function(
+  ffi.Pointer<ffi.Void> arg0,
+);
+
+typedef _c_clang_getDiagnosticCategory = ffi.Uint32 Function(
+  ffi.Pointer<ffi.Void> arg0,
+);
+
+typedef _dart_clang_getDiagnosticCategory = int Function(
+  ffi.Pointer<ffi.Void> arg0,
+);
+
+typedef _c_clang_getDiagnosticNumRanges = ffi.Uint32 Function(
+  ffi.Pointer<ffi.Void> arg0,
+);
+
+typedef _dart_clang_getDiagnosticNumRanges = int Function(
+  ffi.Pointer<ffi.Void> arg0,
+);
+
+typedef _c_clang_getDiagnosticNumFixIts = ffi.Uint32 Function(
+  ffi.Pointer<ffi.Void> Diagnostic,
+);
+
+typedef _dart_clang_getDiagnosticNumFixIts = int Function(
+  ffi.Pointer<ffi.Void> Diagnostic,
+);
+
+typedef _c_clang_createTranslationUnitFromSourceFile
+    = ffi.Pointer<CXTranslationUnitImpl> Function(
+  ffi.Pointer<ffi.Void> CIdx,
+  ffi.Pointer<ffi.Int8> source_filename,
+  ffi.Int32 num_clang_command_line_args,
+  ffi.Pointer<ffi.Pointer<ffi.Int8>> clang_command_line_args,
+  ffi.Uint32 num_unsaved_files,
+  ffi.Pointer<CXUnsavedFile> unsaved_files,
+);
+
+typedef _dart_clang_createTranslationUnitFromSourceFile
+    = ffi.Pointer<CXTranslationUnitImpl> Function(
+  ffi.Pointer<ffi.Void> 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 _c_clang_createTranslationUnit = ffi.Pointer<CXTranslationUnitImpl>
+    Function(
+  ffi.Pointer<ffi.Void> CIdx,
+  ffi.Pointer<ffi.Int8> ast_filename,
+);
+
+typedef _dart_clang_createTranslationUnit = ffi.Pointer<CXTranslationUnitImpl>
+    Function(
+  ffi.Pointer<ffi.Void> CIdx,
+  ffi.Pointer<ffi.Int8> ast_filename,
+);
+
+typedef _c_clang_createTranslationUnit2 = ffi.Int32 Function(
+  ffi.Pointer<ffi.Void> CIdx,
+  ffi.Pointer<ffi.Int8> ast_filename,
+  ffi.Pointer<ffi.Pointer<CXTranslationUnitImpl>> out_TU,
+);
+
+typedef _dart_clang_createTranslationUnit2 = int Function(
+  ffi.Pointer<ffi.Void> CIdx,
+  ffi.Pointer<ffi.Int8> ast_filename,
+  ffi.Pointer<ffi.Pointer<CXTranslationUnitImpl>> out_TU,
+);
+
+typedef _c_clang_defaultEditingTranslationUnitOptions = ffi.Uint32 Function();
+
+typedef _dart_clang_defaultEditingTranslationUnitOptions = int Function();
+
+typedef _c_clang_parseTranslationUnit = ffi.Pointer<CXTranslationUnitImpl>
+    Function(
+  ffi.Pointer<ffi.Void> CIdx,
+  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.Uint32 options,
+);
+
+typedef _dart_clang_parseTranslationUnit = ffi.Pointer<CXTranslationUnitImpl>
+    Function(
+  ffi.Pointer<ffi.Void> 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 _c_clang_parseTranslationUnit2 = ffi.Int32 Function(
+  ffi.Pointer<ffi.Void> CIdx,
+  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.Uint32 options,
+  ffi.Pointer<ffi.Pointer<CXTranslationUnitImpl>> out_TU,
+);
+
+typedef _dart_clang_parseTranslationUnit2 = int Function(
+  ffi.Pointer<ffi.Void> 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<ffi.Pointer<CXTranslationUnitImpl>> out_TU,
+);
+
+typedef _c_clang_parseTranslationUnit2FullArgv = ffi.Int32 Function(
+  ffi.Pointer<ffi.Void> CIdx,
+  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.Uint32 options,
+  ffi.Pointer<ffi.Pointer<CXTranslationUnitImpl>> out_TU,
+);
+
+typedef _dart_clang_parseTranslationUnit2FullArgv = int Function(
+  ffi.Pointer<ffi.Void> 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<ffi.Pointer<CXTranslationUnitImpl>> out_TU,
+);
+
+typedef _c_clang_defaultSaveOptions = ffi.Uint32 Function(
+  ffi.Pointer<CXTranslationUnitImpl> TU,
+);
+
+typedef _dart_clang_defaultSaveOptions = int Function(
+  ffi.Pointer<CXTranslationUnitImpl> TU,
+);
+
+typedef _c_clang_saveTranslationUnit = ffi.Int32 Function(
+  ffi.Pointer<CXTranslationUnitImpl> TU,
+  ffi.Pointer<ffi.Int8> FileName,
+  ffi.Uint32 options,
+);
+
+typedef _dart_clang_saveTranslationUnit = int Function(
+  ffi.Pointer<CXTranslationUnitImpl> TU,
+  ffi.Pointer<ffi.Int8> FileName,
+  int options,
+);
+
+typedef _c_clang_suspendTranslationUnit = ffi.Uint32 Function(
+  ffi.Pointer<CXTranslationUnitImpl> arg0,
+);
+
+typedef _dart_clang_suspendTranslationUnit = int Function(
+  ffi.Pointer<CXTranslationUnitImpl> arg0,
+);
+
+typedef _c_clang_disposeTranslationUnit = ffi.Void Function(
+  ffi.Pointer<CXTranslationUnitImpl> arg0,
+);
+
+typedef _dart_clang_disposeTranslationUnit = void Function(
+  ffi.Pointer<CXTranslationUnitImpl> arg0,
+);
+
+typedef _c_clang_defaultReparseOptions = ffi.Uint32 Function(
+  ffi.Pointer<CXTranslationUnitImpl> TU,
+);
+
+typedef _dart_clang_defaultReparseOptions = int Function(
+  ffi.Pointer<CXTranslationUnitImpl> TU,
+);
+
+typedef _c_clang_reparseTranslationUnit = ffi.Int32 Function(
+  ffi.Pointer<CXTranslationUnitImpl> TU,
+  ffi.Uint32 num_unsaved_files,
+  ffi.Pointer<CXUnsavedFile> unsaved_files,
+  ffi.Uint32 options,
+);
+
+typedef _dart_clang_reparseTranslationUnit = int Function(
+  ffi.Pointer<CXTranslationUnitImpl> TU,
+  int num_unsaved_files,
+  ffi.Pointer<CXUnsavedFile> unsaved_files,
+  int options,
+);
+
+typedef _c_clang_getTUResourceUsageName = ffi.Pointer<ffi.Int8> Function(
+  ffi.Int32 kind,
+);
+
+typedef _dart_clang_getTUResourceUsageName = ffi.Pointer<ffi.Int8> Function(
+  int kind,
+);
+
+typedef _c_clang_getTranslationUnitTargetInfo = ffi.Pointer<CXTargetInfoImpl>
+    Function(
+  ffi.Pointer<CXTranslationUnitImpl> CTUnit,
+);
+
+typedef _dart_clang_getTranslationUnitTargetInfo = ffi.Pointer<CXTargetInfoImpl>
+    Function(
+  ffi.Pointer<CXTranslationUnitImpl> CTUnit,
+);
+
+typedef _c_clang_TargetInfo_dispose = ffi.Void Function(
+  ffi.Pointer<CXTargetInfoImpl> Info,
+);
+
+typedef _dart_clang_TargetInfo_dispose = void Function(
+  ffi.Pointer<CXTargetInfoImpl> Info,
+);
+
+typedef _c_clang_TargetInfo_getPointerWidth = ffi.Int32 Function(
+  ffi.Pointer<CXTargetInfoImpl> Info,
+);
+
+typedef _dart_clang_TargetInfo_getPointerWidth = int Function(
+  ffi.Pointer<CXTargetInfoImpl> Info,
+);
+
+typedef _c_clang_isDeclaration = ffi.Uint32 Function(
+  ffi.Int32 arg0,
+);
+
+typedef _dart_clang_isDeclaration = int Function(
+  int arg0,
+);
+
+typedef _c_clang_isReference = ffi.Uint32 Function(
+  ffi.Int32 arg0,
+);
+
+typedef _dart_clang_isReference = int Function(
+  int arg0,
+);
+
+typedef _c_clang_isExpression = ffi.Uint32 Function(
+  ffi.Int32 arg0,
+);
+
+typedef _dart_clang_isExpression = int Function(
+  int arg0,
+);
+
+typedef _c_clang_isStatement = ffi.Uint32 Function(
+  ffi.Int32 arg0,
+);
+
+typedef _dart_clang_isStatement = int Function(
+  int arg0,
+);
+
+typedef _c_clang_isAttribute = ffi.Uint32 Function(
+  ffi.Int32 arg0,
+);
+
+typedef _dart_clang_isAttribute = int Function(
+  int arg0,
+);
+
+typedef _c_clang_isInvalid = ffi.Uint32 Function(
+  ffi.Int32 arg0,
+);
+
+typedef _dart_clang_isInvalid = int Function(
+  int arg0,
+);
+
+typedef _c_clang_isTranslationUnit = ffi.Uint32 Function(
+  ffi.Int32 arg0,
+);
+
+typedef _dart_clang_isTranslationUnit = int Function(
+  int arg0,
+);
+
+typedef _c_clang_isPreprocessing = ffi.Uint32 Function(
+  ffi.Int32 arg0,
+);
+
+typedef _dart_clang_isPreprocessing = int Function(
+  int arg0,
+);
+
+typedef _c_clang_isUnexposed = ffi.Uint32 Function(
+  ffi.Int32 arg0,
+);
+
+typedef _dart_clang_isUnexposed = int Function(
+  int arg0,
+);
+
+typedef _c_clang_disposeCXPlatformAvailability = ffi.Void Function(
+  ffi.Pointer<CXPlatformAvailability> availability,
+);
+
+typedef _dart_clang_disposeCXPlatformAvailability = void Function(
+  ffi.Pointer<CXPlatformAvailability> availability,
+);
+
+typedef _c_clang_createCXCursorSet = ffi.Pointer<CXCursorSetImpl> Function();
+
+typedef _dart_clang_createCXCursorSet = ffi.Pointer<CXCursorSetImpl> Function();
+
+typedef _c_clang_disposeCXCursorSet = ffi.Void Function(
+  ffi.Pointer<CXCursorSetImpl> cset,
+);
+
+typedef _dart_clang_disposeCXCursorSet = void Function(
+  ffi.Pointer<CXCursorSetImpl> cset,
+);
+
+typedef _c_clang_disposeOverriddenCursors = ffi.Void Function(
+  ffi.Pointer<CXCursor> overridden,
+);
+
+typedef _dart_clang_disposeOverriddenCursors = void Function(
+  ffi.Pointer<CXCursor> overridden,
+);
+
+typedef _c_clang_PrintingPolicy_getProperty = ffi.Uint32 Function(
+  ffi.Pointer<ffi.Void> Policy,
+  ffi.Int32 Property,
+);
+
+typedef _dart_clang_PrintingPolicy_getProperty = int Function(
+  ffi.Pointer<ffi.Void> Policy,
+  int Property,
+);
+
+typedef _c_clang_PrintingPolicy_setProperty = ffi.Void Function(
+  ffi.Pointer<ffi.Void> Policy,
+  ffi.Int32 Property,
+  ffi.Uint32 Value,
+);
+
+typedef _dart_clang_PrintingPolicy_setProperty = void Function(
+  ffi.Pointer<ffi.Void> Policy,
+  int Property,
+  int Value,
+);
+
+typedef _c_clang_PrintingPolicy_dispose = ffi.Void Function(
+  ffi.Pointer<ffi.Void> Policy,
+);
+
+typedef _dart_clang_PrintingPolicy_dispose = void Function(
+  ffi.Pointer<ffi.Void> Policy,
+);
+
+typedef _c_clang_getModuleForFile = ffi.Pointer<ffi.Void> Function(
+  ffi.Pointer<CXTranslationUnitImpl> arg0,
+  ffi.Pointer<ffi.Void> arg1,
+);
+
+typedef _dart_clang_getModuleForFile = ffi.Pointer<ffi.Void> Function(
+  ffi.Pointer<CXTranslationUnitImpl> arg0,
+  ffi.Pointer<ffi.Void> arg1,
+);
+
+typedef _c_clang_Module_getASTFile = ffi.Pointer<ffi.Void> Function(
+  ffi.Pointer<ffi.Void> Module,
+);
+
+typedef _dart_clang_Module_getASTFile = ffi.Pointer<ffi.Void> Function(
+  ffi.Pointer<ffi.Void> Module,
+);
+
+typedef _c_clang_Module_getParent = ffi.Pointer<ffi.Void> Function(
+  ffi.Pointer<ffi.Void> Module,
+);
+
+typedef _dart_clang_Module_getParent = ffi.Pointer<ffi.Void> Function(
+  ffi.Pointer<ffi.Void> Module,
+);
+
+typedef _c_clang_Module_isSystem = ffi.Int32 Function(
+  ffi.Pointer<ffi.Void> Module,
+);
+
+typedef _dart_clang_Module_isSystem = int Function(
+  ffi.Pointer<ffi.Void> Module,
+);
+
+typedef _c_clang_Module_getNumTopLevelHeaders = ffi.Uint32 Function(
+  ffi.Pointer<CXTranslationUnitImpl> arg0,
+  ffi.Pointer<ffi.Void> Module,
+);
+
+typedef _dart_clang_Module_getNumTopLevelHeaders = int Function(
+  ffi.Pointer<CXTranslationUnitImpl> arg0,
+  ffi.Pointer<ffi.Void> Module,
+);
+
+typedef _c_clang_Module_getTopLevelHeader = ffi.Pointer<ffi.Void> Function(
+  ffi.Pointer<CXTranslationUnitImpl> arg0,
+  ffi.Pointer<ffi.Void> Module,
+  ffi.Uint32 Index,
+);
+
+typedef _dart_clang_Module_getTopLevelHeader = ffi.Pointer<ffi.Void> Function(
+  ffi.Pointer<CXTranslationUnitImpl> arg0,
+  ffi.Pointer<ffi.Void> Module,
+  int Index,
+);
+
+typedef _c_clang_annotateTokens = ffi.Void Function(
+  ffi.Pointer<CXTranslationUnitImpl> TU,
+  ffi.Pointer<CXToken> Tokens,
+  ffi.Uint32 NumTokens,
+  ffi.Pointer<CXCursor> Cursors,
+);
+
+typedef _dart_clang_annotateTokens = void Function(
+  ffi.Pointer<CXTranslationUnitImpl> TU,
+  ffi.Pointer<CXToken> Tokens,
+  int NumTokens,
+  ffi.Pointer<CXCursor> Cursors,
+);
+
+typedef _c_clang_disposeTokens = ffi.Void Function(
+  ffi.Pointer<CXTranslationUnitImpl> TU,
+  ffi.Pointer<CXToken> Tokens,
+  ffi.Uint32 NumTokens,
+);
+
+typedef _dart_clang_disposeTokens = void Function(
+  ffi.Pointer<CXTranslationUnitImpl> TU,
+  ffi.Pointer<CXToken> Tokens,
+  int NumTokens,
+);
+
+typedef _c_clang_enableStackTraces = ffi.Void Function();
+
+typedef _dart_clang_enableStackTraces = void Function();
+
+typedef _typedefC_1 = ffi.Void Function(
+  ffi.Pointer<ffi.Void>,
+);
+
+typedef _c_clang_executeOnThread = ffi.Void Function(
+  ffi.Pointer<ffi.NativeFunction<_typedefC_1>> fn,
+  ffi.Pointer<ffi.Void> user_data,
+  ffi.Uint32 stack_size,
+);
+
+typedef _dart_clang_executeOnThread = void Function(
+  ffi.Pointer<ffi.NativeFunction<_typedefC_1>> fn,
+  ffi.Pointer<ffi.Void> user_data,
+  int stack_size,
+);
+
+typedef _c_clang_getCompletionChunkKind = ffi.Int32 Function(
+  ffi.Pointer<ffi.Void> completion_string,
+  ffi.Uint32 chunk_number,
+);
+
+typedef _dart_clang_getCompletionChunkKind = int Function(
+  ffi.Pointer<ffi.Void> completion_string,
+  int chunk_number,
+);
+
+typedef _c_clang_getCompletionChunkCompletionString = ffi.Pointer<ffi.Void>
+    Function(
+  ffi.Pointer<ffi.Void> completion_string,
+  ffi.Uint32 chunk_number,
+);
+
+typedef _dart_clang_getCompletionChunkCompletionString = ffi.Pointer<ffi.Void>
+    Function(
+  ffi.Pointer<ffi.Void> completion_string,
+  int chunk_number,
+);
+
+typedef _c_clang_getNumCompletionChunks = ffi.Uint32 Function(
+  ffi.Pointer<ffi.Void> completion_string,
+);
+
+typedef _dart_clang_getNumCompletionChunks = int Function(
+  ffi.Pointer<ffi.Void> completion_string,
+);
+
+typedef _c_clang_getCompletionPriority = ffi.Uint32 Function(
+  ffi.Pointer<ffi.Void> completion_string,
+);
+
+typedef _dart_clang_getCompletionPriority = int Function(
+  ffi.Pointer<ffi.Void> completion_string,
+);
+
+typedef _c_clang_getCompletionAvailability = ffi.Int32 Function(
+  ffi.Pointer<ffi.Void> completion_string,
+);
+
+typedef _dart_clang_getCompletionAvailability = int Function(
+  ffi.Pointer<ffi.Void> completion_string,
+);
+
+typedef _c_clang_getCompletionNumAnnotations = ffi.Uint32 Function(
+  ffi.Pointer<ffi.Void> completion_string,
+);
+
+typedef _dart_clang_getCompletionNumAnnotations = int Function(
+  ffi.Pointer<ffi.Void> completion_string,
+);
+
+typedef _c_clang_getCompletionNumFixIts = ffi.Uint32 Function(
+  ffi.Pointer<CXCodeCompleteResults> results,
+  ffi.Uint32 completion_index,
+);
+
+typedef _dart_clang_getCompletionNumFixIts = int Function(
+  ffi.Pointer<CXCodeCompleteResults> results,
+  int completion_index,
+);
+
+typedef _c_clang_defaultCodeCompleteOptions = ffi.Uint32 Function();
+
+typedef _dart_clang_defaultCodeCompleteOptions = int Function();
+
+typedef _c_clang_codeCompleteAt = ffi.Pointer<CXCodeCompleteResults> Function(
+  ffi.Pointer<CXTranslationUnitImpl> TU,
+  ffi.Pointer<ffi.Int8> complete_filename,
+  ffi.Uint32 complete_line,
+  ffi.Uint32 complete_column,
+  ffi.Pointer<CXUnsavedFile> unsaved_files,
+  ffi.Uint32 num_unsaved_files,
+  ffi.Uint32 options,
+);
+
+typedef _dart_clang_codeCompleteAt = ffi.Pointer<CXCodeCompleteResults>
+    Function(
+  ffi.Pointer<CXTranslationUnitImpl> 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 _c_clang_sortCodeCompletionResults = ffi.Void Function(
+  ffi.Pointer<CXCompletionResult> Results,
+  ffi.Uint32 NumResults,
+);
+
+typedef _dart_clang_sortCodeCompletionResults = void Function(
+  ffi.Pointer<CXCompletionResult> Results,
+  int NumResults,
+);
+
+typedef _c_clang_disposeCodeCompleteResults = ffi.Void Function(
+  ffi.Pointer<CXCodeCompleteResults> Results,
+);
+
+typedef _dart_clang_disposeCodeCompleteResults = void Function(
+  ffi.Pointer<CXCodeCompleteResults> Results,
+);
+
+typedef _c_clang_codeCompleteGetNumDiagnostics = ffi.Uint32 Function(
+  ffi.Pointer<CXCodeCompleteResults> Results,
+);
+
+typedef _dart_clang_codeCompleteGetNumDiagnostics = int Function(
+  ffi.Pointer<CXCodeCompleteResults> Results,
+);
+
+typedef _c_clang_codeCompleteGetDiagnostic = ffi.Pointer<ffi.Void> Function(
+  ffi.Pointer<CXCodeCompleteResults> Results,
+  ffi.Uint32 Index,
+);
+
+typedef _dart_clang_codeCompleteGetDiagnostic = ffi.Pointer<ffi.Void> Function(
+  ffi.Pointer<CXCodeCompleteResults> Results,
+  int Index,
+);
+
+typedef _c_clang_codeCompleteGetContexts = ffi.Uint64 Function(
+  ffi.Pointer<CXCodeCompleteResults> Results,
+);
+
+typedef _dart_clang_codeCompleteGetContexts = int Function(
+  ffi.Pointer<CXCodeCompleteResults> Results,
+);
+
+typedef _c_clang_codeCompleteGetContainerKind = ffi.Int32 Function(
+  ffi.Pointer<CXCodeCompleteResults> Results,
+  ffi.Pointer<ffi.Uint32> IsIncomplete,
+);
+
+typedef _dart_clang_codeCompleteGetContainerKind = int Function(
+  ffi.Pointer<CXCodeCompleteResults> Results,
+  ffi.Pointer<ffi.Uint32> IsIncomplete,
+);
+
+typedef _c_clang_toggleCrashRecovery = ffi.Void Function(
+  ffi.Uint32 isEnabled,
+);
+
+typedef _dart_clang_toggleCrashRecovery = void Function(
+  int isEnabled,
+);
+
+typedef CXInclusionVisitor_1 = ffi.Void Function(
+  ffi.Pointer<ffi.Void>,
+  ffi.Pointer<CXSourceLocation>,
+  ffi.Uint32,
+  ffi.Pointer<ffi.Void>,
+);
+
+typedef _c_clang_getInclusions = ffi.Void Function(
+  ffi.Pointer<CXTranslationUnitImpl> tu,
+  ffi.Pointer<ffi.NativeFunction<CXInclusionVisitor_1>> visitor,
+  ffi.Pointer<ffi.Void> client_data,
+);
+
+typedef _dart_clang_getInclusions = void Function(
+  ffi.Pointer<CXTranslationUnitImpl> tu,
+  ffi.Pointer<ffi.NativeFunction<CXInclusionVisitor_1>> visitor,
+  ffi.Pointer<ffi.Void> client_data,
+);
+
+typedef _c_clang_EvalResult_getKind = ffi.Int32 Function(
+  ffi.Pointer<ffi.Void> E,
+);
+
+typedef _dart_clang_EvalResult_getKind = int Function(
+  ffi.Pointer<ffi.Void> E,
+);
+
+typedef _c_clang_EvalResult_getAsInt = ffi.Int32 Function(
+  ffi.Pointer<ffi.Void> E,
+);
+
+typedef _dart_clang_EvalResult_getAsInt = int Function(
+  ffi.Pointer<ffi.Void> E,
+);
+
+typedef _c_clang_EvalResult_getAsLongLong = ffi.Int64 Function(
+  ffi.Pointer<ffi.Void> E,
+);
+
+typedef _dart_clang_EvalResult_getAsLongLong = int Function(
+  ffi.Pointer<ffi.Void> E,
+);
+
+typedef _c_clang_EvalResult_isUnsignedInt = ffi.Uint32 Function(
+  ffi.Pointer<ffi.Void> E,
+);
+
+typedef _dart_clang_EvalResult_isUnsignedInt = int Function(
+  ffi.Pointer<ffi.Void> E,
+);
+
+typedef _c_clang_EvalResult_getAsUnsigned = ffi.Uint64 Function(
+  ffi.Pointer<ffi.Void> E,
+);
+
+typedef _dart_clang_EvalResult_getAsUnsigned = int Function(
+  ffi.Pointer<ffi.Void> E,
+);
+
+typedef _c_clang_EvalResult_getAsDouble = ffi.Double Function(
+  ffi.Pointer<ffi.Void> E,
+);
+
+typedef _dart_clang_EvalResult_getAsDouble = double Function(
+  ffi.Pointer<ffi.Void> E,
+);
+
+typedef _c_clang_EvalResult_getAsStr = ffi.Pointer<ffi.Int8> Function(
+  ffi.Pointer<ffi.Void> E,
+);
+
+typedef _dart_clang_EvalResult_getAsStr = ffi.Pointer<ffi.Int8> Function(
+  ffi.Pointer<ffi.Void> E,
+);
+
+typedef _c_clang_EvalResult_dispose = ffi.Void Function(
+  ffi.Pointer<ffi.Void> E,
+);
+
+typedef _dart_clang_EvalResult_dispose = void Function(
+  ffi.Pointer<ffi.Void> E,
+);
+
+typedef _c_clang_getRemappings = ffi.Pointer<ffi.Void> Function(
+  ffi.Pointer<ffi.Int8> path,
+);
+
+typedef _dart_clang_getRemappings = ffi.Pointer<ffi.Void> Function(
+  ffi.Pointer<ffi.Int8> path,
+);
+
+typedef _c_clang_getRemappingsFromFileList = ffi.Pointer<ffi.Void> Function(
+  ffi.Pointer<ffi.Pointer<ffi.Int8>> filePaths,
+  ffi.Uint32 numFiles,
+);
+
+typedef _dart_clang_getRemappingsFromFileList = ffi.Pointer<ffi.Void> Function(
+  ffi.Pointer<ffi.Pointer<ffi.Int8>> filePaths,
+  int numFiles,
+);
+
+typedef _c_clang_remap_getNumFiles = ffi.Uint32 Function(
+  ffi.Pointer<ffi.Void> arg0,
+);
+
+typedef _dart_clang_remap_getNumFiles = int Function(
+  ffi.Pointer<ffi.Void> arg0,
+);
+
+typedef _c_clang_remap_getFilenames = ffi.Void Function(
+  ffi.Pointer<ffi.Void> arg0,
+  ffi.Uint32 index,
+  ffi.Pointer<CXString> original,
+  ffi.Pointer<CXString> transformed,
+);
+
+typedef _dart_clang_remap_getFilenames = void Function(
+  ffi.Pointer<ffi.Void> arg0,
+  int index,
+  ffi.Pointer<CXString> original,
+  ffi.Pointer<CXString> transformed,
+);
+
+typedef _c_clang_remap_dispose = ffi.Void Function(
+  ffi.Pointer<ffi.Void> arg0,
+);
+
+typedef _dart_clang_remap_dispose = void Function(
+  ffi.Pointer<ffi.Void> arg0,
+);
+
+typedef _c_clang_index_isEntityObjCContainerKind = ffi.Int32 Function(
+  ffi.Int32 arg0,
+);
+
+typedef _dart_clang_index_isEntityObjCContainerKind = int Function(
+  int arg0,
+);
+
+typedef _c_clang_index_getObjCContainerDeclInfo
+    = ffi.Pointer<CXIdxObjCContainerDeclInfo> Function(
+  ffi.Pointer<CXIdxDeclInfo> arg0,
+);
+
+typedef _dart_clang_index_getObjCContainerDeclInfo
+    = ffi.Pointer<CXIdxObjCContainerDeclInfo> Function(
+  ffi.Pointer<CXIdxDeclInfo> arg0,
+);
+
+typedef _c_clang_index_getObjCInterfaceDeclInfo
+    = ffi.Pointer<CXIdxObjCInterfaceDeclInfo> Function(
+  ffi.Pointer<CXIdxDeclInfo> arg0,
+);
+
+typedef _dart_clang_index_getObjCInterfaceDeclInfo
+    = ffi.Pointer<CXIdxObjCInterfaceDeclInfo> Function(
+  ffi.Pointer<CXIdxDeclInfo> arg0,
+);
+
+typedef _c_clang_index_getObjCCategoryDeclInfo
+    = ffi.Pointer<CXIdxObjCCategoryDeclInfo> Function(
+  ffi.Pointer<CXIdxDeclInfo> arg0,
+);
+
+typedef _dart_clang_index_getObjCCategoryDeclInfo
+    = ffi.Pointer<CXIdxObjCCategoryDeclInfo> Function(
+  ffi.Pointer<CXIdxDeclInfo> arg0,
+);
+
+typedef _c_clang_index_getObjCProtocolRefListInfo
+    = ffi.Pointer<CXIdxObjCProtocolRefListInfo> Function(
+  ffi.Pointer<CXIdxDeclInfo> arg0,
+);
+
+typedef _dart_clang_index_getObjCProtocolRefListInfo
+    = ffi.Pointer<CXIdxObjCProtocolRefListInfo> Function(
+  ffi.Pointer<CXIdxDeclInfo> arg0,
+);
+
+typedef _c_clang_index_getObjCPropertyDeclInfo
+    = ffi.Pointer<CXIdxObjCPropertyDeclInfo> Function(
+  ffi.Pointer<CXIdxDeclInfo> arg0,
+);
+
+typedef _dart_clang_index_getObjCPropertyDeclInfo
+    = ffi.Pointer<CXIdxObjCPropertyDeclInfo> Function(
+  ffi.Pointer<CXIdxDeclInfo> arg0,
+);
+
+typedef _c_clang_index_getIBOutletCollectionAttrInfo
+    = ffi.Pointer<CXIdxIBOutletCollectionAttrInfo> Function(
+  ffi.Pointer<CXIdxAttrInfo> arg0,
+);
+
+typedef _dart_clang_index_getIBOutletCollectionAttrInfo
+    = ffi.Pointer<CXIdxIBOutletCollectionAttrInfo> Function(
+  ffi.Pointer<CXIdxAttrInfo> arg0,
+);
+
+typedef _c_clang_index_getCXXClassDeclInfo = ffi.Pointer<CXIdxCXXClassDeclInfo>
+    Function(
+  ffi.Pointer<CXIdxDeclInfo> arg0,
+);
+
+typedef _dart_clang_index_getCXXClassDeclInfo
+    = ffi.Pointer<CXIdxCXXClassDeclInfo> Function(
+  ffi.Pointer<CXIdxDeclInfo> arg0,
+);
+
+typedef _c_clang_index_getClientContainer = ffi.Pointer<ffi.Void> Function(
+  ffi.Pointer<CXIdxContainerInfo> arg0,
+);
+
+typedef _dart_clang_index_getClientContainer = ffi.Pointer<ffi.Void> Function(
+  ffi.Pointer<CXIdxContainerInfo> arg0,
+);
+
+typedef _c_clang_index_setClientContainer = ffi.Void Function(
+  ffi.Pointer<CXIdxContainerInfo> arg0,
+  ffi.Pointer<ffi.Void> arg1,
+);
+
+typedef _dart_clang_index_setClientContainer = void Function(
+  ffi.Pointer<CXIdxContainerInfo> arg0,
+  ffi.Pointer<ffi.Void> arg1,
+);
+
+typedef _c_clang_index_getClientEntity = ffi.Pointer<ffi.Void> Function(
+  ffi.Pointer<CXIdxEntityInfo> arg0,
+);
+
+typedef _dart_clang_index_getClientEntity = ffi.Pointer<ffi.Void> Function(
+  ffi.Pointer<CXIdxEntityInfo> arg0,
+);
+
+typedef _c_clang_index_setClientEntity = ffi.Void Function(
+  ffi.Pointer<CXIdxEntityInfo> arg0,
+  ffi.Pointer<ffi.Void> arg1,
+);
+
+typedef _dart_clang_index_setClientEntity = void Function(
+  ffi.Pointer<CXIdxEntityInfo> arg0,
+  ffi.Pointer<ffi.Void> arg1,
+);
+
+typedef _c_clang_IndexAction_create = ffi.Pointer<ffi.Void> Function(
+  ffi.Pointer<ffi.Void> CIdx,
+);
+
+typedef _dart_clang_IndexAction_create = ffi.Pointer<ffi.Void> Function(
+  ffi.Pointer<ffi.Void> CIdx,
+);
+
+typedef _c_clang_IndexAction_dispose = ffi.Void Function(
+  ffi.Pointer<ffi.Void> arg0,
+);
+
+typedef _dart_clang_IndexAction_dispose = void Function(
+  ffi.Pointer<ffi.Void> arg0,
+);
+
+typedef _c_clang_indexSourceFile = ffi.Int32 Function(
+  ffi.Pointer<ffi.Void> arg0,
+  ffi.Pointer<ffi.Void> 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<ffi.Pointer<CXTranslationUnitImpl>> out_TU,
+  ffi.Uint32 TU_options,
+);
+
+typedef _dart_clang_indexSourceFile = int Function(
+  ffi.Pointer<ffi.Void> arg0,
+  ffi.Pointer<ffi.Void> 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<ffi.Pointer<CXTranslationUnitImpl>> out_TU,
+  int TU_options,
+);
+
+typedef _c_clang_indexSourceFileFullArgv = ffi.Int32 Function(
+  ffi.Pointer<ffi.Void> arg0,
+  ffi.Pointer<ffi.Void> 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<ffi.Pointer<CXTranslationUnitImpl>> out_TU,
+  ffi.Uint32 TU_options,
+);
+
+typedef _dart_clang_indexSourceFileFullArgv = int Function(
+  ffi.Pointer<ffi.Void> arg0,
+  ffi.Pointer<ffi.Void> 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<ffi.Pointer<CXTranslationUnitImpl>> out_TU,
+  int TU_options,
+);
+
+typedef _c_clang_indexTranslationUnit = ffi.Int32 Function(
+  ffi.Pointer<ffi.Void> arg0,
+  ffi.Pointer<ffi.Void> client_data,
+  ffi.Pointer<IndexerCallbacks> index_callbacks,
+  ffi.Uint32 index_callbacks_size,
+  ffi.Uint32 index_options,
+  ffi.Pointer<CXTranslationUnitImpl> arg5,
+);
+
+typedef _dart_clang_indexTranslationUnit = int Function(
+  ffi.Pointer<ffi.Void> arg0,
+  ffi.Pointer<ffi.Void> client_data,
+  ffi.Pointer<IndexerCallbacks> index_callbacks,
+  int index_callbacks_size,
+  int index_options,
+  ffi.Pointer<CXTranslationUnitImpl> arg5,
+);
+
+typedef _c_clang_getCString_wrap = ffi.Pointer<ffi.Int8> Function(
+  ffi.Pointer<CXString> string,
+);
+
+typedef _dart_clang_getCString_wrap = ffi.Pointer<ffi.Int8> Function(
+  ffi.Pointer<CXString> string,
+);
+
+typedef _c_clang_disposeString_wrap = ffi.Void Function(
+  ffi.Pointer<CXString> string,
+);
+
+typedef _dart_clang_disposeString_wrap = void Function(
+  ffi.Pointer<CXString> string,
+);
+
+typedef _c_clang_getCursorKind_wrap = ffi.Int32 Function(
+  ffi.Pointer<CXCursor> cursor,
+);
+
+typedef _dart_clang_getCursorKind_wrap = int Function(
+  ffi.Pointer<CXCursor> cursor,
+);
+
+typedef _c_clang_getCursorKindSpelling_wrap = ffi.Pointer<CXString> Function(
+  ffi.Int32 kind,
+);
+
+typedef _dart_clang_getCursorKindSpelling_wrap = ffi.Pointer<CXString> Function(
+  int kind,
+);
+
+typedef _c_clang_getCursorType_wrap = ffi.Pointer<CXType> Function(
+  ffi.Pointer<CXCursor> cursor,
+);
+
+typedef _dart_clang_getCursorType_wrap = ffi.Pointer<CXType> Function(
+  ffi.Pointer<CXCursor> cursor,
+);
+
+typedef _c_clang_getTypeSpelling_wrap = ffi.Pointer<CXString> Function(
+  ffi.Pointer<CXType> type,
+);
+
+typedef _dart_clang_getTypeSpelling_wrap = ffi.Pointer<CXString> Function(
+  ffi.Pointer<CXType> type,
+);
+
+typedef _c_clang_getTypeKindSpelling_wrap = ffi.Pointer<CXString> Function(
+  ffi.Int32 typeKind,
+);
+
+typedef _dart_clang_getTypeKindSpelling_wrap = ffi.Pointer<CXString> Function(
+  int typeKind,
+);
+
+typedef _c_clang_getResultType_wrap = ffi.Pointer<CXType> Function(
+  ffi.Pointer<CXType> functionType,
+);
+
+typedef _dart_clang_getResultType_wrap = ffi.Pointer<CXType> Function(
+  ffi.Pointer<CXType> functionType,
+);
+
+typedef _c_clang_getPointeeType_wrap = ffi.Pointer<CXType> Function(
+  ffi.Pointer<CXType> pointerType,
+);
+
+typedef _dart_clang_getPointeeType_wrap = ffi.Pointer<CXType> Function(
+  ffi.Pointer<CXType> pointerType,
+);
+
+typedef _c_clang_getCanonicalType_wrap = ffi.Pointer<CXType> Function(
+  ffi.Pointer<CXType> typerefType,
+);
+
+typedef _dart_clang_getCanonicalType_wrap = ffi.Pointer<CXType> Function(
+  ffi.Pointer<CXType> typerefType,
+);
+
+typedef _c_clang_Type_getNamedType_wrap = ffi.Pointer<CXType> Function(
+  ffi.Pointer<CXType> elaboratedType,
+);
+
+typedef _dart_clang_Type_getNamedType_wrap = ffi.Pointer<CXType> Function(
+  ffi.Pointer<CXType> elaboratedType,
+);
+
+typedef _c_clang_getTypeDeclaration_wrap = ffi.Pointer<CXCursor> Function(
+  ffi.Pointer<CXType> cxtype,
+);
+
+typedef _dart_clang_getTypeDeclaration_wrap = ffi.Pointer<CXCursor> Function(
+  ffi.Pointer<CXType> cxtype,
+);
+
+typedef _c_clang_getTypedefDeclUnderlyingType_wrap = ffi.Pointer<CXType>
+    Function(
+  ffi.Pointer<CXCursor> cxcursor,
+);
+
+typedef _dart_clang_getTypedefDeclUnderlyingType_wrap = ffi.Pointer<CXType>
+    Function(
+  ffi.Pointer<CXCursor> cxcursor,
+);
+
+typedef _c_clang_getCursorSpelling_wrap = ffi.Pointer<CXString> Function(
+  ffi.Pointer<CXCursor> cursor,
+);
+
+typedef _dart_clang_getCursorSpelling_wrap = ffi.Pointer<CXString> Function(
+  ffi.Pointer<CXCursor> cursor,
+);
+
+typedef _c_clang_getTranslationUnitCursor_wrap = ffi.Pointer<CXCursor> Function(
+  ffi.Pointer<CXTranslationUnitImpl> tu,
+);
+
+typedef _dart_clang_getTranslationUnitCursor_wrap = ffi.Pointer<CXCursor>
+    Function(
+  ffi.Pointer<CXTranslationUnitImpl> tu,
+);
+
+typedef _c_clang_formatDiagnostic_wrap = ffi.Pointer<CXString> Function(
+  ffi.Pointer<ffi.Void> diag,
+  ffi.Int32 opts,
+);
+
+typedef _dart_clang_formatDiagnostic_wrap = ffi.Pointer<CXString> Function(
+  ffi.Pointer<ffi.Void> diag,
+  int opts,
+);
+
+typedef ModifiedCXCursorVisitor_1 = ffi.Int32 Function(
+  ffi.Pointer<CXCursor>,
+  ffi.Pointer<CXCursor>,
+  ffi.Pointer<ffi.Void>,
+);
+
+typedef _c_clang_visitChildren_wrap = ffi.Uint32 Function(
+  ffi.Pointer<CXCursor> parent,
+  ffi.Pointer<ffi.NativeFunction<ModifiedCXCursorVisitor_1>> _modifiedVisitor,
+  ffi.Pointer<ffi.Void> clientData,
+);
+
+typedef _dart_clang_visitChildren_wrap = int Function(
+  ffi.Pointer<CXCursor> parent,
+  ffi.Pointer<ffi.NativeFunction<ModifiedCXCursorVisitor_1>> _modifiedVisitor,
+  ffi.Pointer<ffi.Void> clientData,
+);
+
+typedef _c_clang_Cursor_getNumArguments_wrap = ffi.Int32 Function(
+  ffi.Pointer<CXCursor> cursor,
+);
+
+typedef _dart_clang_Cursor_getNumArguments_wrap = int Function(
+  ffi.Pointer<CXCursor> cursor,
+);
+
+typedef _c_clang_Cursor_getArgument_wrap = ffi.Pointer<CXCursor> Function(
+  ffi.Pointer<CXCursor> cursor,
+  ffi.Uint32 i,
+);
+
+typedef _dart_clang_Cursor_getArgument_wrap = ffi.Pointer<CXCursor> Function(
+  ffi.Pointer<CXCursor> cursor,
+  int i,
+);
+
+typedef _c_clang_getNumArgTypes_wrap = ffi.Int32 Function(
+  ffi.Pointer<CXType> cxtype,
+);
+
+typedef _dart_clang_getNumArgTypes_wrap = int Function(
+  ffi.Pointer<CXType> cxtype,
+);
+
+typedef _c_clang_getArgType_wrap = ffi.Pointer<CXType> Function(
+  ffi.Pointer<CXType> cxtype,
+  ffi.Uint32 i,
+);
+
+typedef _dart_clang_getArgType_wrap = ffi.Pointer<CXType> Function(
+  ffi.Pointer<CXType> cxtype,
+  int i,
+);
+
+typedef _c_clang_getEnumConstantDeclValue_wrap = ffi.Int64 Function(
+  ffi.Pointer<CXCursor> cursor,
+);
+
+typedef _dart_clang_getEnumConstantDeclValue_wrap = int Function(
+  ffi.Pointer<CXCursor> cursor,
+);
+
+typedef _c_clang_equalRanges_wrap = ffi.Uint32 Function(
+  ffi.Pointer<CXSourceRange> c1,
+  ffi.Pointer<CXSourceRange> c2,
+);
+
+typedef _dart_clang_equalRanges_wrap = int Function(
+  ffi.Pointer<CXSourceRange> c1,
+  ffi.Pointer<CXSourceRange> c2,
+);
+
+typedef _c_clang_Cursor_getCommentRange_wrap = ffi.Pointer<CXSourceRange>
+    Function(
+  ffi.Pointer<CXCursor> cursor,
+);
+
+typedef _dart_clang_Cursor_getCommentRange_wrap = ffi.Pointer<CXSourceRange>
+    Function(
+  ffi.Pointer<CXCursor> cursor,
+);
+
+typedef _c_clang_Cursor_getRawCommentText_wrap = ffi.Pointer<CXString> Function(
+  ffi.Pointer<CXCursor> cursor,
+);
+
+typedef _dart_clang_Cursor_getRawCommentText_wrap = ffi.Pointer<CXString>
+    Function(
+  ffi.Pointer<CXCursor> cursor,
+);
+
+typedef _c_clang_Cursor_getBriefCommentText_wrap = ffi.Pointer<CXString>
+    Function(
+  ffi.Pointer<CXCursor> cursor,
+);
+
+typedef _dart_clang_Cursor_getBriefCommentText_wrap = ffi.Pointer<CXString>
+    Function(
+  ffi.Pointer<CXCursor> cursor,
+);
+
+typedef _c_clang_getCursorLocation_wrap = ffi.Pointer<CXSourceLocation>
+    Function(
+  ffi.Pointer<CXCursor> cursor,
+);
+
+typedef _dart_clang_getCursorLocation_wrap = ffi.Pointer<CXSourceLocation>
+    Function(
+  ffi.Pointer<CXCursor> cursor,
+);
+
+typedef _c_clang_getFileLocation_wrap = ffi.Void Function(
+  ffi.Pointer<CXSourceLocation> location,
+  ffi.Pointer<ffi.Pointer<ffi.Void>> file,
+  ffi.Pointer<ffi.Uint32> line,
+  ffi.Pointer<ffi.Uint32> column,
+  ffi.Pointer<ffi.Uint32> offset,
+);
+
+typedef _dart_clang_getFileLocation_wrap = void Function(
+  ffi.Pointer<CXSourceLocation> location,
+  ffi.Pointer<ffi.Pointer<ffi.Void>> file,
+  ffi.Pointer<ffi.Uint32> line,
+  ffi.Pointer<ffi.Uint32> column,
+  ffi.Pointer<ffi.Uint32> offset,
+);
+
+typedef _c_clang_getFileName_wrap = ffi.Pointer<CXString> Function(
+  ffi.Pointer<ffi.Void> SFile,
+);
+
+typedef _dart_clang_getFileName_wrap = ffi.Pointer<CXString> Function(
+  ffi.Pointer<ffi.Void> SFile,
+);
+
+typedef _c_clang_getNumElements_wrap = ffi.Uint64 Function(
+  ffi.Pointer<CXType> cxtype,
+);
+
+typedef _dart_clang_getNumElements_wrap = int Function(
+  ffi.Pointer<CXType> cxtype,
+);
+
+typedef _c_clang_getArrayElementType_wrap = ffi.Pointer<CXType> Function(
+  ffi.Pointer<CXType> cxtype,
+);
+
+typedef _dart_clang_getArrayElementType_wrap = ffi.Pointer<CXType> Function(
+  ffi.Pointer<CXType> cxtype,
+);
+
 typedef _typedefC_3 = ffi.Int32 Function(
   ffi.Pointer<ffi.Void>,
   ffi.Pointer<ffi.Void>,
@@ -848,4276 +5242,3 @@
   ffi.Pointer<ffi.Void>,
   ffi.Pointer<CXIdxEntityRefInfo>,
 );
-
-class IndexerCallbacks extends ffi.Struct {
-  /// Called periodically to check whether indexing should be aborted.
-  /// Should return 0 to continue, and non-zero to abort.
-  ffi.Pointer<ffi.NativeFunction<_typedefC_3>> abortQuery;
-
-  /// Called at the end of indexing; passes the complete diagnostic set.
-  ffi.Pointer<ffi.NativeFunction<_typedefC_4>> diagnostic;
-
-  ffi.Pointer<ffi.NativeFunction<_typedefC_5>> enteredMainFile;
-
-  /// Called when a file gets \#included/\#imported.
-  ffi.Pointer<ffi.NativeFunction<_typedefC_6>> ppIncludedFile;
-
-  /// Called when a AST file (PCH or module) gets imported.
-  ///
-  /// AST files will not get indexed (there will not be callbacks to index all
-  /// the entities in an AST file). The recommended action is that, if the AST
-  /// file is not already indexed, to initiate a new indexing job specific to
-  /// the AST file.
-  ffi.Pointer<ffi.NativeFunction<_typedefC_7>> importedASTFile;
-
-  /// Called at the beginning of indexing a translation unit.
-  ffi.Pointer<ffi.NativeFunction<_typedefC_8>> startedTranslationUnit;
-
-  ffi.Pointer<ffi.NativeFunction<_typedefC_9>> indexDeclaration;
-
-  /// Called to index a reference of an entity.
-  ffi.Pointer<ffi.NativeFunction<_typedefC_10>> indexEntityReference;
-}
-
-/// Gets the general options associated with a CXIndex.
-///
-/// \returns A bitmask of options, a bitwise OR of CXGlobalOpt_XXX flags that
-/// are associated with the given CXIndex object.
-int clang_CXIndex_getGlobalOptions(
-  ffi.Pointer<ffi.Void> arg0,
-) {
-  return _clang_CXIndex_getGlobalOptions(
-    arg0,
-  );
-}
-
-final _dart_clang_CXIndex_getGlobalOptions _clang_CXIndex_getGlobalOptions =
-    _dylib.lookupFunction<_c_clang_CXIndex_getGlobalOptions,
-        _dart_clang_CXIndex_getGlobalOptions>('clang_CXIndex_getGlobalOptions');
-
-typedef _c_clang_CXIndex_getGlobalOptions = ffi.Uint32 Function(
-  ffi.Pointer<ffi.Void> arg0,
-);
-
-typedef _dart_clang_CXIndex_getGlobalOptions = int Function(
-  ffi.Pointer<ffi.Void> arg0,
-);
-
-/// Sets general options associated with a CXIndex.
-///
-/// For example:
-/// \code
-/// CXIndex idx = ...;
-/// clang_CXIndex_setGlobalOptions(idx,
-/// clang_CXIndex_getGlobalOptions(idx) |
-/// CXGlobalOpt_ThreadBackgroundPriorityForIndexing);
-/// \endcode
-///
-/// \param options A bitmask of options, a bitwise OR of CXGlobalOpt_XXX flags.
-void clang_CXIndex_setGlobalOptions(
-  ffi.Pointer<ffi.Void> arg0,
-  int options,
-) {
-  return _clang_CXIndex_setGlobalOptions(
-    arg0,
-    options,
-  );
-}
-
-final _dart_clang_CXIndex_setGlobalOptions _clang_CXIndex_setGlobalOptions =
-    _dylib.lookupFunction<_c_clang_CXIndex_setGlobalOptions,
-        _dart_clang_CXIndex_setGlobalOptions>('clang_CXIndex_setGlobalOptions');
-
-typedef _c_clang_CXIndex_setGlobalOptions = ffi.Void Function(
-  ffi.Pointer<ffi.Void> arg0,
-  ffi.Uint32 options,
-);
-
-typedef _dart_clang_CXIndex_setGlobalOptions = void Function(
-  ffi.Pointer<ffi.Void> arg0,
-  int options,
-);
-
-/// Sets the invocation emission path option in a CXIndex.
-///
-/// The invocation emission path specifies a path which will contain log
-/// files for certain libclang invocations. A null value (default) implies that
-/// libclang invocations are not logged..
-void clang_CXIndex_setInvocationEmissionPathOption(
-  ffi.Pointer<ffi.Void> arg0,
-  ffi.Pointer<ffi.Int8> Path,
-) {
-  return _clang_CXIndex_setInvocationEmissionPathOption(
-    arg0,
-    Path,
-  );
-}
-
-final _dart_clang_CXIndex_setInvocationEmissionPathOption
-    _clang_CXIndex_setInvocationEmissionPathOption = _dylib.lookupFunction<
-            _c_clang_CXIndex_setInvocationEmissionPathOption,
-            _dart_clang_CXIndex_setInvocationEmissionPathOption>(
-        'clang_CXIndex_setInvocationEmissionPathOption');
-
-typedef _c_clang_CXIndex_setInvocationEmissionPathOption = ffi.Void Function(
-  ffi.Pointer<ffi.Void> arg0,
-  ffi.Pointer<ffi.Int8> Path,
-);
-
-typedef _dart_clang_CXIndex_setInvocationEmissionPathOption = void Function(
-  ffi.Pointer<ffi.Void> arg0,
-  ffi.Pointer<ffi.Int8> Path,
-);
-
-ffi.Pointer<CXCursor> clang_Cursor_getArgument_wrap(
-  ffi.Pointer<CXCursor> cursor,
-  int i,
-) {
-  return _clang_Cursor_getArgument_wrap(
-    cursor,
-    i,
-  );
-}
-
-final _dart_clang_Cursor_getArgument_wrap _clang_Cursor_getArgument_wrap =
-    _dylib.lookupFunction<_c_clang_Cursor_getArgument_wrap,
-        _dart_clang_Cursor_getArgument_wrap>('clang_Cursor_getArgument_wrap');
-
-typedef _c_clang_Cursor_getArgument_wrap = ffi.Pointer<CXCursor> Function(
-  ffi.Pointer<CXCursor> cursor,
-  ffi.Uint32 i,
-);
-
-typedef _dart_clang_Cursor_getArgument_wrap = ffi.Pointer<CXCursor> Function(
-  ffi.Pointer<CXCursor> cursor,
-  int i,
-);
-
-/// Returns the first paragraph of doxygen doc comment.
-ffi.Pointer<CXString> clang_Cursor_getBriefCommentText_wrap(
-  ffi.Pointer<CXCursor> cursor,
-) {
-  return _clang_Cursor_getBriefCommentText_wrap(
-    cursor,
-  );
-}
-
-final _dart_clang_Cursor_getBriefCommentText_wrap
-    _clang_Cursor_getBriefCommentText_wrap = _dylib.lookupFunction<
-            _c_clang_Cursor_getBriefCommentText_wrap,
-            _dart_clang_Cursor_getBriefCommentText_wrap>(
-        'clang_Cursor_getBriefCommentText_wrap');
-
-typedef _c_clang_Cursor_getBriefCommentText_wrap = ffi.Pointer<CXString>
-    Function(
-  ffi.Pointer<CXCursor> cursor,
-);
-
-typedef _dart_clang_Cursor_getBriefCommentText_wrap = ffi.Pointer<CXString>
-    Function(
-  ffi.Pointer<CXCursor> cursor,
-);
-
-/// Returns the comment range.
-ffi.Pointer<CXSourceRange> clang_Cursor_getCommentRange_wrap(
-  ffi.Pointer<CXCursor> cursor,
-) {
-  return _clang_Cursor_getCommentRange_wrap(
-    cursor,
-  );
-}
-
-final _dart_clang_Cursor_getCommentRange_wrap
-    _clang_Cursor_getCommentRange_wrap = _dylib.lookupFunction<
-            _c_clang_Cursor_getCommentRange_wrap,
-            _dart_clang_Cursor_getCommentRange_wrap>(
-        'clang_Cursor_getCommentRange_wrap');
-
-typedef _c_clang_Cursor_getCommentRange_wrap = ffi.Pointer<CXSourceRange>
-    Function(
-  ffi.Pointer<CXCursor> cursor,
-);
-
-typedef _dart_clang_Cursor_getCommentRange_wrap = ffi.Pointer<CXSourceRange>
-    Function(
-  ffi.Pointer<CXCursor> cursor,
-);
-
-int clang_Cursor_getNumArguments_wrap(
-  ffi.Pointer<CXCursor> cursor,
-) {
-  return _clang_Cursor_getNumArguments_wrap(
-    cursor,
-  );
-}
-
-final _dart_clang_Cursor_getNumArguments_wrap
-    _clang_Cursor_getNumArguments_wrap = _dylib.lookupFunction<
-            _c_clang_Cursor_getNumArguments_wrap,
-            _dart_clang_Cursor_getNumArguments_wrap>(
-        'clang_Cursor_getNumArguments_wrap');
-
-typedef _c_clang_Cursor_getNumArguments_wrap = ffi.Int32 Function(
-  ffi.Pointer<CXCursor> cursor,
-);
-
-typedef _dart_clang_Cursor_getNumArguments_wrap = int Function(
-  ffi.Pointer<CXCursor> cursor,
-);
-
-/// Returns the raw comment.
-ffi.Pointer<CXString> clang_Cursor_getRawCommentText_wrap(
-  ffi.Pointer<CXCursor> cursor,
-) {
-  return _clang_Cursor_getRawCommentText_wrap(
-    cursor,
-  );
-}
-
-final _dart_clang_Cursor_getRawCommentText_wrap
-    _clang_Cursor_getRawCommentText_wrap = _dylib.lookupFunction<
-            _c_clang_Cursor_getRawCommentText_wrap,
-            _dart_clang_Cursor_getRawCommentText_wrap>(
-        'clang_Cursor_getRawCommentText_wrap');
-
-typedef _c_clang_Cursor_getRawCommentText_wrap = ffi.Pointer<CXString> Function(
-  ffi.Pointer<CXCursor> cursor,
-);
-
-typedef _dart_clang_Cursor_getRawCommentText_wrap = ffi.Pointer<CXString>
-    Function(
-  ffi.Pointer<CXCursor> cursor,
-);
-
-/// Disposes the created Eval memory.
-void clang_EvalResult_dispose(
-  ffi.Pointer<ffi.Void> E,
-) {
-  return _clang_EvalResult_dispose(
-    E,
-  );
-}
-
-final _dart_clang_EvalResult_dispose _clang_EvalResult_dispose =
-    _dylib.lookupFunction<_c_clang_EvalResult_dispose,
-        _dart_clang_EvalResult_dispose>('clang_EvalResult_dispose');
-
-typedef _c_clang_EvalResult_dispose = ffi.Void Function(
-  ffi.Pointer<ffi.Void> E,
-);
-
-typedef _dart_clang_EvalResult_dispose = void Function(
-  ffi.Pointer<ffi.Void> E,
-);
-
-/// Returns the evaluation result as double if the
-/// kind is double.
-double clang_EvalResult_getAsDouble(
-  ffi.Pointer<ffi.Void> E,
-) {
-  return _clang_EvalResult_getAsDouble(
-    E,
-  );
-}
-
-final _dart_clang_EvalResult_getAsDouble _clang_EvalResult_getAsDouble =
-    _dylib.lookupFunction<_c_clang_EvalResult_getAsDouble,
-        _dart_clang_EvalResult_getAsDouble>('clang_EvalResult_getAsDouble');
-
-typedef _c_clang_EvalResult_getAsDouble = ffi.Double Function(
-  ffi.Pointer<ffi.Void> E,
-);
-
-typedef _dart_clang_EvalResult_getAsDouble = double Function(
-  ffi.Pointer<ffi.Void> E,
-);
-
-/// Returns the evaluation result as integer if the
-/// kind is Int.
-int clang_EvalResult_getAsInt(
-  ffi.Pointer<ffi.Void> E,
-) {
-  return _clang_EvalResult_getAsInt(
-    E,
-  );
-}
-
-final _dart_clang_EvalResult_getAsInt _clang_EvalResult_getAsInt =
-    _dylib.lookupFunction<_c_clang_EvalResult_getAsInt,
-        _dart_clang_EvalResult_getAsInt>('clang_EvalResult_getAsInt');
-
-typedef _c_clang_EvalResult_getAsInt = ffi.Int32 Function(
-  ffi.Pointer<ffi.Void> E,
-);
-
-typedef _dart_clang_EvalResult_getAsInt = int Function(
-  ffi.Pointer<ffi.Void> E,
-);
-
-/// Returns the evaluation result as a long long integer if the
-/// kind is Int. This prevents overflows that may happen if the result is
-/// returned with clang_EvalResult_getAsInt.
-int clang_EvalResult_getAsLongLong(
-  ffi.Pointer<ffi.Void> E,
-) {
-  return _clang_EvalResult_getAsLongLong(
-    E,
-  );
-}
-
-final _dart_clang_EvalResult_getAsLongLong _clang_EvalResult_getAsLongLong =
-    _dylib.lookupFunction<_c_clang_EvalResult_getAsLongLong,
-        _dart_clang_EvalResult_getAsLongLong>('clang_EvalResult_getAsLongLong');
-
-typedef _c_clang_EvalResult_getAsLongLong = ffi.Int64 Function(
-  ffi.Pointer<ffi.Void> E,
-);
-
-typedef _dart_clang_EvalResult_getAsLongLong = int Function(
-  ffi.Pointer<ffi.Void> E,
-);
-
-/// Returns the evaluation result as a constant string if the
-/// kind is other than Int or float. User must not free this pointer,
-/// instead call clang_EvalResult_dispose on the CXEvalResult returned
-/// by clang_Cursor_Evaluate.
-ffi.Pointer<ffi.Int8> clang_EvalResult_getAsStr(
-  ffi.Pointer<ffi.Void> E,
-) {
-  return _clang_EvalResult_getAsStr(
-    E,
-  );
-}
-
-final _dart_clang_EvalResult_getAsStr _clang_EvalResult_getAsStr =
-    _dylib.lookupFunction<_c_clang_EvalResult_getAsStr,
-        _dart_clang_EvalResult_getAsStr>('clang_EvalResult_getAsStr');
-
-typedef _c_clang_EvalResult_getAsStr = ffi.Pointer<ffi.Int8> Function(
-  ffi.Pointer<ffi.Void> E,
-);
-
-typedef _dart_clang_EvalResult_getAsStr = ffi.Pointer<ffi.Int8> Function(
-  ffi.Pointer<ffi.Void> E,
-);
-
-/// Returns the evaluation result as an unsigned integer if
-/// the kind is Int and clang_EvalResult_isUnsignedInt is non-zero.
-int clang_EvalResult_getAsUnsigned(
-  ffi.Pointer<ffi.Void> E,
-) {
-  return _clang_EvalResult_getAsUnsigned(
-    E,
-  );
-}
-
-final _dart_clang_EvalResult_getAsUnsigned _clang_EvalResult_getAsUnsigned =
-    _dylib.lookupFunction<_c_clang_EvalResult_getAsUnsigned,
-        _dart_clang_EvalResult_getAsUnsigned>('clang_EvalResult_getAsUnsigned');
-
-typedef _c_clang_EvalResult_getAsUnsigned = ffi.Uint64 Function(
-  ffi.Pointer<ffi.Void> E,
-);
-
-typedef _dart_clang_EvalResult_getAsUnsigned = int Function(
-  ffi.Pointer<ffi.Void> E,
-);
-
-/// Returns the kind of the evaluated result.
-int clang_EvalResult_getKind(
-  ffi.Pointer<ffi.Void> E,
-) {
-  return _clang_EvalResult_getKind(
-    E,
-  );
-}
-
-final _dart_clang_EvalResult_getKind _clang_EvalResult_getKind =
-    _dylib.lookupFunction<_c_clang_EvalResult_getKind,
-        _dart_clang_EvalResult_getKind>('clang_EvalResult_getKind');
-
-typedef _c_clang_EvalResult_getKind = ffi.Int32 Function(
-  ffi.Pointer<ffi.Void> E,
-);
-
-typedef _dart_clang_EvalResult_getKind = int Function(
-  ffi.Pointer<ffi.Void> E,
-);
-
-/// Returns a non-zero value if the kind is Int and the evaluation
-/// result resulted in an unsigned integer.
-int clang_EvalResult_isUnsignedInt(
-  ffi.Pointer<ffi.Void> E,
-) {
-  return _clang_EvalResult_isUnsignedInt(
-    E,
-  );
-}
-
-final _dart_clang_EvalResult_isUnsignedInt _clang_EvalResult_isUnsignedInt =
-    _dylib.lookupFunction<_c_clang_EvalResult_isUnsignedInt,
-        _dart_clang_EvalResult_isUnsignedInt>('clang_EvalResult_isUnsignedInt');
-
-typedef _c_clang_EvalResult_isUnsignedInt = ffi.Uint32 Function(
-  ffi.Pointer<ffi.Void> E,
-);
-
-typedef _dart_clang_EvalResult_isUnsignedInt = int Function(
-  ffi.Pointer<ffi.Void> E,
-);
-
-/// Returns non-zero if the \c file1 and \c file2 point to the same file,
-/// or they are both NULL.
-int clang_File_isEqual(
-  ffi.Pointer<ffi.Void> file1,
-  ffi.Pointer<ffi.Void> file2,
-) {
-  return _clang_File_isEqual(
-    file1,
-    file2,
-  );
-}
-
-final _dart_clang_File_isEqual _clang_File_isEqual =
-    _dylib.lookupFunction<_c_clang_File_isEqual, _dart_clang_File_isEqual>(
-        'clang_File_isEqual');
-
-typedef _c_clang_File_isEqual = ffi.Int32 Function(
-  ffi.Pointer<ffi.Void> file1,
-  ffi.Pointer<ffi.Void> file2,
-);
-
-typedef _dart_clang_File_isEqual = int Function(
-  ffi.Pointer<ffi.Void> file1,
-  ffi.Pointer<ffi.Void> file2,
-);
-
-/// An indexing action/session, to be applied to one or multiple
-/// translation units.
-///
-/// \param CIdx The index object with which the index action will be associated.
-ffi.Pointer<ffi.Void> clang_IndexAction_create(
-  ffi.Pointer<ffi.Void> CIdx,
-) {
-  return _clang_IndexAction_create(
-    CIdx,
-  );
-}
-
-final _dart_clang_IndexAction_create _clang_IndexAction_create =
-    _dylib.lookupFunction<_c_clang_IndexAction_create,
-        _dart_clang_IndexAction_create>('clang_IndexAction_create');
-
-typedef _c_clang_IndexAction_create = ffi.Pointer<ffi.Void> Function(
-  ffi.Pointer<ffi.Void> CIdx,
-);
-
-typedef _dart_clang_IndexAction_create = ffi.Pointer<ffi.Void> Function(
-  ffi.Pointer<ffi.Void> CIdx,
-);
-
-/// Destroy the given index action.
-///
-/// The index action must not be destroyed until all of the translation units
-/// created within that index action have been destroyed.
-void clang_IndexAction_dispose(
-  ffi.Pointer<ffi.Void> arg0,
-) {
-  return _clang_IndexAction_dispose(
-    arg0,
-  );
-}
-
-final _dart_clang_IndexAction_dispose _clang_IndexAction_dispose =
-    _dylib.lookupFunction<_c_clang_IndexAction_dispose,
-        _dart_clang_IndexAction_dispose>('clang_IndexAction_dispose');
-
-typedef _c_clang_IndexAction_dispose = ffi.Void Function(
-  ffi.Pointer<ffi.Void> arg0,
-);
-
-typedef _dart_clang_IndexAction_dispose = void Function(
-  ffi.Pointer<ffi.Void> arg0,
-);
-
-/// \param Module a module object.
-///
-/// \returns the module file where the provided module object came from.
-ffi.Pointer<ffi.Void> clang_Module_getASTFile(
-  ffi.Pointer<ffi.Void> Module,
-) {
-  return _clang_Module_getASTFile(
-    Module,
-  );
-}
-
-final _dart_clang_Module_getASTFile _clang_Module_getASTFile = _dylib
-    .lookupFunction<_c_clang_Module_getASTFile, _dart_clang_Module_getASTFile>(
-        'clang_Module_getASTFile');
-
-typedef _c_clang_Module_getASTFile = ffi.Pointer<ffi.Void> Function(
-  ffi.Pointer<ffi.Void> Module,
-);
-
-typedef _dart_clang_Module_getASTFile = ffi.Pointer<ffi.Void> Function(
-  ffi.Pointer<ffi.Void> Module,
-);
-
-/// \param Module a module object.
-///
-/// \returns the number of top level headers associated with this module.
-int clang_Module_getNumTopLevelHeaders(
-  ffi.Pointer<CXTranslationUnitImpl> arg0,
-  ffi.Pointer<ffi.Void> Module,
-) {
-  return _clang_Module_getNumTopLevelHeaders(
-    arg0,
-    Module,
-  );
-}
-
-final _dart_clang_Module_getNumTopLevelHeaders
-    _clang_Module_getNumTopLevelHeaders = _dylib.lookupFunction<
-            _c_clang_Module_getNumTopLevelHeaders,
-            _dart_clang_Module_getNumTopLevelHeaders>(
-        'clang_Module_getNumTopLevelHeaders');
-
-typedef _c_clang_Module_getNumTopLevelHeaders = ffi.Uint32 Function(
-  ffi.Pointer<CXTranslationUnitImpl> arg0,
-  ffi.Pointer<ffi.Void> Module,
-);
-
-typedef _dart_clang_Module_getNumTopLevelHeaders = int Function(
-  ffi.Pointer<CXTranslationUnitImpl> arg0,
-  ffi.Pointer<ffi.Void> Module,
-);
-
-/// \param Module a module object.
-///
-/// \returns the parent of a sub-module or NULL if the given module is top-level,
-/// e.g. for 'std.vector' it will return the 'std' module.
-ffi.Pointer<ffi.Void> clang_Module_getParent(
-  ffi.Pointer<ffi.Void> Module,
-) {
-  return _clang_Module_getParent(
-    Module,
-  );
-}
-
-final _dart_clang_Module_getParent _clang_Module_getParent = _dylib
-    .lookupFunction<_c_clang_Module_getParent, _dart_clang_Module_getParent>(
-        'clang_Module_getParent');
-
-typedef _c_clang_Module_getParent = ffi.Pointer<ffi.Void> Function(
-  ffi.Pointer<ffi.Void> Module,
-);
-
-typedef _dart_clang_Module_getParent = ffi.Pointer<ffi.Void> Function(
-  ffi.Pointer<ffi.Void> Module,
-);
-
-/// \param Module a module object.
-///
-/// \param Index top level header index (zero-based).
-///
-/// \returns the specified top level header associated with the module.
-ffi.Pointer<ffi.Void> clang_Module_getTopLevelHeader(
-  ffi.Pointer<CXTranslationUnitImpl> arg0,
-  ffi.Pointer<ffi.Void> Module,
-  int Index,
-) {
-  return _clang_Module_getTopLevelHeader(
-    arg0,
-    Module,
-    Index,
-  );
-}
-
-final _dart_clang_Module_getTopLevelHeader _clang_Module_getTopLevelHeader =
-    _dylib.lookupFunction<_c_clang_Module_getTopLevelHeader,
-        _dart_clang_Module_getTopLevelHeader>('clang_Module_getTopLevelHeader');
-
-typedef _c_clang_Module_getTopLevelHeader = ffi.Pointer<ffi.Void> Function(
-  ffi.Pointer<CXTranslationUnitImpl> arg0,
-  ffi.Pointer<ffi.Void> Module,
-  ffi.Uint32 Index,
-);
-
-typedef _dart_clang_Module_getTopLevelHeader = ffi.Pointer<ffi.Void> Function(
-  ffi.Pointer<CXTranslationUnitImpl> arg0,
-  ffi.Pointer<ffi.Void> Module,
-  int Index,
-);
-
-/// \param Module a module object.
-///
-/// \returns non-zero if the module is a system one.
-int clang_Module_isSystem(
-  ffi.Pointer<ffi.Void> Module,
-) {
-  return _clang_Module_isSystem(
-    Module,
-  );
-}
-
-final _dart_clang_Module_isSystem _clang_Module_isSystem = _dylib
-    .lookupFunction<_c_clang_Module_isSystem, _dart_clang_Module_isSystem>(
-        'clang_Module_isSystem');
-
-typedef _c_clang_Module_isSystem = ffi.Int32 Function(
-  ffi.Pointer<ffi.Void> Module,
-);
-
-typedef _dart_clang_Module_isSystem = int Function(
-  ffi.Pointer<ffi.Void> Module,
-);
-
-/// Release a printing policy.
-void clang_PrintingPolicy_dispose(
-  ffi.Pointer<ffi.Void> Policy,
-) {
-  return _clang_PrintingPolicy_dispose(
-    Policy,
-  );
-}
-
-final _dart_clang_PrintingPolicy_dispose _clang_PrintingPolicy_dispose =
-    _dylib.lookupFunction<_c_clang_PrintingPolicy_dispose,
-        _dart_clang_PrintingPolicy_dispose>('clang_PrintingPolicy_dispose');
-
-typedef _c_clang_PrintingPolicy_dispose = ffi.Void Function(
-  ffi.Pointer<ffi.Void> Policy,
-);
-
-typedef _dart_clang_PrintingPolicy_dispose = void Function(
-  ffi.Pointer<ffi.Void> Policy,
-);
-
-/// Get a property value for the given printing policy.
-int clang_PrintingPolicy_getProperty(
-  ffi.Pointer<ffi.Void> Policy,
-  int Property,
-) {
-  return _clang_PrintingPolicy_getProperty(
-    Policy,
-    Property,
-  );
-}
-
-final _dart_clang_PrintingPolicy_getProperty _clang_PrintingPolicy_getProperty =
-    _dylib.lookupFunction<_c_clang_PrintingPolicy_getProperty,
-            _dart_clang_PrintingPolicy_getProperty>(
-        'clang_PrintingPolicy_getProperty');
-
-typedef _c_clang_PrintingPolicy_getProperty = ffi.Uint32 Function(
-  ffi.Pointer<ffi.Void> Policy,
-  ffi.Int32 Property,
-);
-
-typedef _dart_clang_PrintingPolicy_getProperty = int Function(
-  ffi.Pointer<ffi.Void> Policy,
-  int Property,
-);
-
-/// Set a property value for the given printing policy.
-void clang_PrintingPolicy_setProperty(
-  ffi.Pointer<ffi.Void> Policy,
-  int Property,
-  int Value,
-) {
-  return _clang_PrintingPolicy_setProperty(
-    Policy,
-    Property,
-    Value,
-  );
-}
-
-final _dart_clang_PrintingPolicy_setProperty _clang_PrintingPolicy_setProperty =
-    _dylib.lookupFunction<_c_clang_PrintingPolicy_setProperty,
-            _dart_clang_PrintingPolicy_setProperty>(
-        'clang_PrintingPolicy_setProperty');
-
-typedef _c_clang_PrintingPolicy_setProperty = ffi.Void Function(
-  ffi.Pointer<ffi.Void> Policy,
-  ffi.Int32 Property,
-  ffi.Uint32 Value,
-);
-
-typedef _dart_clang_PrintingPolicy_setProperty = void Function(
-  ffi.Pointer<ffi.Void> Policy,
-  int Property,
-  int Value,
-);
-
-/// Destroy the CXTargetInfo object.
-void clang_TargetInfo_dispose(
-  ffi.Pointer<CXTargetInfoImpl> Info,
-) {
-  return _clang_TargetInfo_dispose(
-    Info,
-  );
-}
-
-final _dart_clang_TargetInfo_dispose _clang_TargetInfo_dispose =
-    _dylib.lookupFunction<_c_clang_TargetInfo_dispose,
-        _dart_clang_TargetInfo_dispose>('clang_TargetInfo_dispose');
-
-typedef _c_clang_TargetInfo_dispose = ffi.Void Function(
-  ffi.Pointer<CXTargetInfoImpl> Info,
-);
-
-typedef _dart_clang_TargetInfo_dispose = void Function(
-  ffi.Pointer<CXTargetInfoImpl> Info,
-);
-
-/// Get the pointer width of the target in bits.
-///
-/// Returns -1 in case of error.
-int clang_TargetInfo_getPointerWidth(
-  ffi.Pointer<CXTargetInfoImpl> Info,
-) {
-  return _clang_TargetInfo_getPointerWidth(
-    Info,
-  );
-}
-
-final _dart_clang_TargetInfo_getPointerWidth _clang_TargetInfo_getPointerWidth =
-    _dylib.lookupFunction<_c_clang_TargetInfo_getPointerWidth,
-            _dart_clang_TargetInfo_getPointerWidth>(
-        'clang_TargetInfo_getPointerWidth');
-
-typedef _c_clang_TargetInfo_getPointerWidth = ffi.Int32 Function(
-  ffi.Pointer<CXTargetInfoImpl> Info,
-);
-
-typedef _dart_clang_TargetInfo_getPointerWidth = int Function(
-  ffi.Pointer<CXTargetInfoImpl> Info,
-);
-
-ffi.Pointer<CXType> clang_Type_getNamedType_wrap(
-  ffi.Pointer<CXType> elaboratedType,
-) {
-  return _clang_Type_getNamedType_wrap(
-    elaboratedType,
-  );
-}
-
-final _dart_clang_Type_getNamedType_wrap _clang_Type_getNamedType_wrap =
-    _dylib.lookupFunction<_c_clang_Type_getNamedType_wrap,
-        _dart_clang_Type_getNamedType_wrap>('clang_Type_getNamedType_wrap');
-
-typedef _c_clang_Type_getNamedType_wrap = ffi.Pointer<CXType> Function(
-  ffi.Pointer<CXType> elaboratedType,
-);
-
-typedef _dart_clang_Type_getNamedType_wrap = ffi.Pointer<CXType> Function(
-  ffi.Pointer<CXType> elaboratedType,
-);
-
-/// 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.
-///
-/// This token-annotation routine is equivalent to invoking
-/// clang_getCursor() for the source locations of each of the
-/// tokens. The cursors provided are filtered, so that only those
-/// cursors that have a direct correspondence to the token are
-/// accepted. For example, given a function call \c f(x),
-/// clang_getCursor() would provide the following cursors:
-///
-/// * when the cursor is over the 'f', a DeclRefExpr cursor referring to 'f'.
-/// * when the cursor is over the '(' or the ')', a CallExpr referring to 'f'.
-/// * when the cursor is over the 'x', a DeclRefExpr cursor referring to 'x'.
-///
-/// Only the first and last of these cursors will occur within the
-/// annotate, since the tokens "f" and "x' directly refer to a function
-/// and a variable, respectively, but the parentheses are just a small
-/// part of the full syntax of the function call expression, which is
-/// not provided as an annotation.
-///
-/// \param TU the translation unit that owns the given tokens.
-///
-/// \param Tokens the set of tokens to annotate.
-///
-/// \param NumTokens the number of tokens in \p Tokens.
-///
-/// \param Cursors an array of \p NumTokens cursors, whose contents will be
-/// replaced with the cursors corresponding to each token.
-void clang_annotateTokens(
-  ffi.Pointer<CXTranslationUnitImpl> TU,
-  ffi.Pointer<CXToken> Tokens,
-  int NumTokens,
-  ffi.Pointer<CXCursor> Cursors,
-) {
-  return _clang_annotateTokens(
-    TU,
-    Tokens,
-    NumTokens,
-    Cursors,
-  );
-}
-
-final _dart_clang_annotateTokens _clang_annotateTokens =
-    _dylib.lookupFunction<_c_clang_annotateTokens, _dart_clang_annotateTokens>(
-        'clang_annotateTokens');
-
-typedef _c_clang_annotateTokens = ffi.Void Function(
-  ffi.Pointer<CXTranslationUnitImpl> TU,
-  ffi.Pointer<CXToken> Tokens,
-  ffi.Uint32 NumTokens,
-  ffi.Pointer<CXCursor> Cursors,
-);
-
-typedef _dart_clang_annotateTokens = void Function(
-  ffi.Pointer<CXTranslationUnitImpl> TU,
-  ffi.Pointer<CXToken> Tokens,
-  int NumTokens,
-  ffi.Pointer<CXCursor> Cursors,
-);
-
-/// Perform code completion at a given location in a translation unit.
-///
-/// This function performs code completion at a particular file, line, and
-/// column within source code, providing results that suggest potential
-/// code snippets based on the context of the completion. The basic model
-/// for code completion is that Clang will parse a complete source file,
-/// performing syntax checking up to the location where code-completion has
-/// been requested. At that point, a special code-completion token is passed
-/// to the parser, which recognizes this token and determines, based on the
-/// current location in the C/Objective-C/C++ grammar and the state of
-/// semantic analysis, what completions to provide. These completions are
-/// returned via a new \c CXCodeCompleteResults structure.
-///
-/// Code completion itself is meant to be triggered by the client when the
-/// user types punctuation characters or whitespace, at which point the
-/// code-completion location will coincide with the cursor. For example, if \c p
-/// is a pointer, code-completion might be triggered after the "-" and then
-/// after the ">" in \c p->. When the code-completion location is after the ">",
-/// the completion results will provide, e.g., the members of the struct that
-/// "p" points to. The client is responsible for placing the cursor at the
-/// beginning of the token currently being typed, then filtering the results
-/// based on the contents of the token. For example, when code-completing for
-/// the expression \c p->get, the client should provide the location just after
-/// the ">" (e.g., pointing at the "g") to this code-completion hook. Then, the
-/// client can filter the results based on the current token text ("get"), only
-/// showing those results that start with "get". The intent of this interface
-/// is to separate the relatively high-latency acquisition of code-completion
-/// results from the filtering of results on a per-character basis, which must
-/// have a lower latency.
-///
-/// \param TU The translation unit in which code-completion should
-/// occur. The source files for this translation unit need not be
-/// completely up-to-date (and the contents of those source files may
-/// be overridden via \p unsaved_files). Cursors referring into the
-/// translation unit may be invalidated by this invocation.
-///
-/// \param complete_filename The name of the source file where code
-/// completion should be performed. This filename may be any file
-/// included in the translation unit.
-///
-/// \param complete_line The line at which code-completion should occur.
-///
-/// \param complete_column The column at which code-completion should occur.
-/// Note that the column should point just after the syntactic construct that
-/// initiated code completion, and not in the middle of a lexical token.
-///
-/// \param unsaved_files the Files that have not yet been saved to disk
-/// but may be required for parsing or code completion, including the
-/// contents of those files.  The contents and name of these files (as
-/// specified by CXUnsavedFile) are copied when necessary, so the
-/// client only needs to guarantee their validity until the call to
-/// this function returns.
-///
-/// \param num_unsaved_files The number of unsaved file entries in \p
-/// unsaved_files.
-///
-/// \param options Extra options that control the behavior of code
-/// completion, expressed as a bitwise OR of the enumerators of the
-/// CXCodeComplete_Flags enumeration. The
-/// \c clang_defaultCodeCompleteOptions() function returns a default set
-/// of code-completion options.
-///
-/// \returns If successful, a new \c CXCodeCompleteResults structure
-/// containing code-completion results, which should eventually be
-/// freed with \c clang_disposeCodeCompleteResults(). If code
-/// completion fails, returns NULL.
-ffi.Pointer<CXCodeCompleteResults> clang_codeCompleteAt(
-  ffi.Pointer<CXTranslationUnitImpl> TU,
-  ffi.Pointer<ffi.Int8> complete_filename,
-  int complete_line,
-  int complete_column,
-  ffi.Pointer<CXUnsavedFile> unsaved_files,
-  int num_unsaved_files,
-  int options,
-) {
-  return _clang_codeCompleteAt(
-    TU,
-    complete_filename,
-    complete_line,
-    complete_column,
-    unsaved_files,
-    num_unsaved_files,
-    options,
-  );
-}
-
-final _dart_clang_codeCompleteAt _clang_codeCompleteAt =
-    _dylib.lookupFunction<_c_clang_codeCompleteAt, _dart_clang_codeCompleteAt>(
-        'clang_codeCompleteAt');
-
-typedef _c_clang_codeCompleteAt = ffi.Pointer<CXCodeCompleteResults> Function(
-  ffi.Pointer<CXTranslationUnitImpl> TU,
-  ffi.Pointer<ffi.Int8> complete_filename,
-  ffi.Uint32 complete_line,
-  ffi.Uint32 complete_column,
-  ffi.Pointer<CXUnsavedFile> unsaved_files,
-  ffi.Uint32 num_unsaved_files,
-  ffi.Uint32 options,
-);
-
-typedef _dart_clang_codeCompleteAt = ffi.Pointer<CXCodeCompleteResults>
-    Function(
-  ffi.Pointer<CXTranslationUnitImpl> TU,
-  ffi.Pointer<ffi.Int8> complete_filename,
-  int complete_line,
-  int complete_column,
-  ffi.Pointer<CXUnsavedFile> unsaved_files,
-  int num_unsaved_files,
-  int options,
-);
-
-/// Returns the cursor kind for the container for the current code
-/// completion context. The container is only guaranteed to be set for
-/// contexts where a container exists (i.e. member accesses or Objective-C
-/// message sends); if there is not a container, this function will return
-/// CXCursor_InvalidCode.
-///
-/// \param Results the code completion results to query
-///
-/// \param IsIncomplete on return, this value will be false if Clang has complete
-/// information about the container. If Clang does not have complete
-/// information, this value will be true.
-///
-/// \returns the container kind, or CXCursor_InvalidCode if there is not a
-/// container
-int clang_codeCompleteGetContainerKind(
-  ffi.Pointer<CXCodeCompleteResults> Results,
-  ffi.Pointer<ffi.Uint32> IsIncomplete,
-) {
-  return _clang_codeCompleteGetContainerKind(
-    Results,
-    IsIncomplete,
-  );
-}
-
-final _dart_clang_codeCompleteGetContainerKind
-    _clang_codeCompleteGetContainerKind = _dylib.lookupFunction<
-            _c_clang_codeCompleteGetContainerKind,
-            _dart_clang_codeCompleteGetContainerKind>(
-        'clang_codeCompleteGetContainerKind');
-
-typedef _c_clang_codeCompleteGetContainerKind = ffi.Int32 Function(
-  ffi.Pointer<CXCodeCompleteResults> Results,
-  ffi.Pointer<ffi.Uint32> IsIncomplete,
-);
-
-typedef _dart_clang_codeCompleteGetContainerKind = int Function(
-  ffi.Pointer<CXCodeCompleteResults> Results,
-  ffi.Pointer<ffi.Uint32> IsIncomplete,
-);
-
-/// Determines what completions are appropriate for the context
-/// the given code completion.
-///
-/// \param Results the code completion results to query
-///
-/// \returns the kinds of completions that are appropriate for use
-/// along with the given code completion results.
-int clang_codeCompleteGetContexts(
-  ffi.Pointer<CXCodeCompleteResults> Results,
-) {
-  return _clang_codeCompleteGetContexts(
-    Results,
-  );
-}
-
-final _dart_clang_codeCompleteGetContexts _clang_codeCompleteGetContexts =
-    _dylib.lookupFunction<_c_clang_codeCompleteGetContexts,
-        _dart_clang_codeCompleteGetContexts>('clang_codeCompleteGetContexts');
-
-typedef _c_clang_codeCompleteGetContexts = ffi.Uint64 Function(
-  ffi.Pointer<CXCodeCompleteResults> Results,
-);
-
-typedef _dart_clang_codeCompleteGetContexts = int Function(
-  ffi.Pointer<CXCodeCompleteResults> Results,
-);
-
-/// Retrieve a diagnostic associated with the given code completion.
-///
-/// \param Results the code completion results to query.
-/// \param Index the zero-based diagnostic number to retrieve.
-///
-/// \returns the requested diagnostic. This diagnostic must be freed
-/// via a call to \c clang_disposeDiagnostic().
-ffi.Pointer<ffi.Void> clang_codeCompleteGetDiagnostic(
-  ffi.Pointer<CXCodeCompleteResults> Results,
-  int Index,
-) {
-  return _clang_codeCompleteGetDiagnostic(
-    Results,
-    Index,
-  );
-}
-
-final _dart_clang_codeCompleteGetDiagnostic _clang_codeCompleteGetDiagnostic =
-    _dylib.lookupFunction<_c_clang_codeCompleteGetDiagnostic,
-            _dart_clang_codeCompleteGetDiagnostic>(
-        'clang_codeCompleteGetDiagnostic');
-
-typedef _c_clang_codeCompleteGetDiagnostic = ffi.Pointer<ffi.Void> Function(
-  ffi.Pointer<CXCodeCompleteResults> Results,
-  ffi.Uint32 Index,
-);
-
-typedef _dart_clang_codeCompleteGetDiagnostic = ffi.Pointer<ffi.Void> Function(
-  ffi.Pointer<CXCodeCompleteResults> Results,
-  int Index,
-);
-
-/// Determine the number of diagnostics produced prior to the
-/// location where code completion was performed.
-int clang_codeCompleteGetNumDiagnostics(
-  ffi.Pointer<CXCodeCompleteResults> Results,
-) {
-  return _clang_codeCompleteGetNumDiagnostics(
-    Results,
-  );
-}
-
-final _dart_clang_codeCompleteGetNumDiagnostics
-    _clang_codeCompleteGetNumDiagnostics = _dylib.lookupFunction<
-            _c_clang_codeCompleteGetNumDiagnostics,
-            _dart_clang_codeCompleteGetNumDiagnostics>(
-        'clang_codeCompleteGetNumDiagnostics');
-
-typedef _c_clang_codeCompleteGetNumDiagnostics = ffi.Uint32 Function(
-  ffi.Pointer<CXCodeCompleteResults> Results,
-);
-
-typedef _dart_clang_codeCompleteGetNumDiagnostics = int Function(
-  ffi.Pointer<CXCodeCompleteResults> Results,
-);
-
-/// Creates an empty CXCursorSet.
-ffi.Pointer<CXCursorSetImpl> clang_createCXCursorSet() {
-  return _clang_createCXCursorSet();
-}
-
-final _dart_clang_createCXCursorSet _clang_createCXCursorSet = _dylib
-    .lookupFunction<_c_clang_createCXCursorSet, _dart_clang_createCXCursorSet>(
-        'clang_createCXCursorSet');
-
-typedef _c_clang_createCXCursorSet = ffi.Pointer<CXCursorSetImpl> Function();
-
-typedef _dart_clang_createCXCursorSet = ffi.Pointer<CXCursorSetImpl> Function();
-
-/// Provides a shared context for creating translation units.
-///
-/// It provides two options:
-///
-/// - excludeDeclarationsFromPCH: When non-zero, allows enumeration of "local"
-/// declarations (when loading any new translation units). A "local" declaration
-/// is one that belongs in the translation unit itself and not in a precompiled
-/// header that was used by the translation unit. If zero, all declarations
-/// will be enumerated.
-///
-/// Here is an example:
-///
-/// \code
-/// // excludeDeclsFromPCH = 1, displayDiagnostics=1
-/// Idx = clang_createIndex(1, 1);
-///
-/// // IndexTest.pch was produced with the following command:
-/// // "clang -x c IndexTest.h -emit-ast -o IndexTest.pch"
-/// TU = clang_createTranslationUnit(Idx, "IndexTest.pch");
-///
-/// // This will load all the symbols from 'IndexTest.pch'
-/// clang_visitChildren(clang_getTranslationUnitCursor(TU),
-/// TranslationUnitVisitor, 0);
-/// clang_disposeTranslationUnit(TU);
-///
-/// // This will load all the symbols from 'IndexTest.c', excluding symbols
-/// // from 'IndexTest.pch'.
-/// char *args[] = { "-Xclang", "-include-pch=IndexTest.pch" };
-/// TU = clang_createTranslationUnitFromSourceFile(Idx, "IndexTest.c", 2, args,
-/// 0, 0);
-/// clang_visitChildren(clang_getTranslationUnitCursor(TU),
-/// TranslationUnitVisitor, 0);
-/// clang_disposeTranslationUnit(TU);
-/// \endcode
-///
-/// This process of creating the 'pch', loading it separately, and using it (via
-/// -include-pch) allows 'excludeDeclsFromPCH' to remove redundant callbacks
-/// (which gives the indexer the same performance benefit as the compiler).
-ffi.Pointer<ffi.Void> clang_createIndex(
-  int excludeDeclarationsFromPCH,
-  int displayDiagnostics,
-) {
-  return _clang_createIndex(
-    excludeDeclarationsFromPCH,
-    displayDiagnostics,
-  );
-}
-
-final _dart_clang_createIndex _clang_createIndex =
-    _dylib.lookupFunction<_c_clang_createIndex, _dart_clang_createIndex>(
-        'clang_createIndex');
-
-typedef _c_clang_createIndex = ffi.Pointer<ffi.Void> Function(
-  ffi.Int32 excludeDeclarationsFromPCH,
-  ffi.Int32 displayDiagnostics,
-);
-
-typedef _dart_clang_createIndex = ffi.Pointer<ffi.Void> Function(
-  int excludeDeclarationsFromPCH,
-  int displayDiagnostics,
-);
-
-/// Same as \c clang_createTranslationUnit2, but returns
-/// the \c CXTranslationUnit instead of an error code.  In case of an error this
-/// routine returns a \c NULL \c CXTranslationUnit, without further detailed
-/// error codes.
-ffi.Pointer<CXTranslationUnitImpl> clang_createTranslationUnit(
-  ffi.Pointer<ffi.Void> CIdx,
-  ffi.Pointer<ffi.Int8> ast_filename,
-) {
-  return _clang_createTranslationUnit(
-    CIdx,
-    ast_filename,
-  );
-}
-
-final _dart_clang_createTranslationUnit _clang_createTranslationUnit =
-    _dylib.lookupFunction<_c_clang_createTranslationUnit,
-        _dart_clang_createTranslationUnit>('clang_createTranslationUnit');
-
-typedef _c_clang_createTranslationUnit = ffi.Pointer<CXTranslationUnitImpl>
-    Function(
-  ffi.Pointer<ffi.Void> CIdx,
-  ffi.Pointer<ffi.Int8> ast_filename,
-);
-
-typedef _dart_clang_createTranslationUnit = ffi.Pointer<CXTranslationUnitImpl>
-    Function(
-  ffi.Pointer<ffi.Void> CIdx,
-  ffi.Pointer<ffi.Int8> ast_filename,
-);
-
-/// Create a translation unit from an AST file (\c -emit-ast).
-///
-/// \param[out] out_TU A non-NULL pointer to store the created
-/// \c CXTranslationUnit.
-///
-/// \returns Zero on success, otherwise returns an error code.
-int clang_createTranslationUnit2(
-  ffi.Pointer<ffi.Void> CIdx,
-  ffi.Pointer<ffi.Int8> ast_filename,
-  ffi.Pointer<ffi.Pointer<CXTranslationUnitImpl>> out_TU,
-) {
-  return _clang_createTranslationUnit2(
-    CIdx,
-    ast_filename,
-    out_TU,
-  );
-}
-
-final _dart_clang_createTranslationUnit2 _clang_createTranslationUnit2 =
-    _dylib.lookupFunction<_c_clang_createTranslationUnit2,
-        _dart_clang_createTranslationUnit2>('clang_createTranslationUnit2');
-
-typedef _c_clang_createTranslationUnit2 = ffi.Int32 Function(
-  ffi.Pointer<ffi.Void> CIdx,
-  ffi.Pointer<ffi.Int8> ast_filename,
-  ffi.Pointer<ffi.Pointer<CXTranslationUnitImpl>> out_TU,
-);
-
-typedef _dart_clang_createTranslationUnit2 = int Function(
-  ffi.Pointer<ffi.Void> CIdx,
-  ffi.Pointer<ffi.Int8> ast_filename,
-  ffi.Pointer<ffi.Pointer<CXTranslationUnitImpl>> out_TU,
-);
-
-/// Return the CXTranslationUnit for a given source file and the provided
-/// command line arguments one would pass to the compiler.
-///
-/// Note: The 'source_filename' argument is optional.  If the caller provides a
-/// NULL pointer, the name of the source file is expected to reside in the
-/// specified command line arguments.
-///
-/// Note: When encountered in 'clang_command_line_args', the following options
-/// are ignored:
-///
-/// '-c'
-/// '-emit-ast'
-/// '-fsyntax-only'
-/// '-o \<output file>'  (both '-o' and '\<output file>' are ignored)
-///
-/// \param CIdx The index object with which the translation unit will be
-/// associated.
-///
-/// \param source_filename The name of the source file to load, or NULL if the
-/// source file is included in \p clang_command_line_args.
-///
-/// \param num_clang_command_line_args The number of command-line arguments in
-/// \p clang_command_line_args.
-///
-/// \param clang_command_line_args The command-line arguments that would be
-/// passed to the \c clang executable if it were being invoked out-of-process.
-/// These command-line options will be parsed and will affect how the translation
-/// unit is parsed. Note that the following options are ignored: '-c',
-/// '-emit-ast', '-fsyntax-only' (which is the default), and '-o \<output file>'.
-///
-/// \param num_unsaved_files the number of unsaved file entries in \p
-/// unsaved_files.
-///
-/// \param unsaved_files the files that have not yet been saved to disk
-/// but may be required for code completion, including the contents of
-/// those files.  The contents and name of these files (as specified by
-/// CXUnsavedFile) are copied when necessary, so the client only needs to
-/// guarantee their validity until the call to this function returns.
-ffi.Pointer<CXTranslationUnitImpl> clang_createTranslationUnitFromSourceFile(
-  ffi.Pointer<ffi.Void> 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,
-) {
-  return _clang_createTranslationUnitFromSourceFile(
-    CIdx,
-    source_filename,
-    num_clang_command_line_args,
-    clang_command_line_args,
-    num_unsaved_files,
-    unsaved_files,
-  );
-}
-
-final _dart_clang_createTranslationUnitFromSourceFile
-    _clang_createTranslationUnitFromSourceFile = _dylib.lookupFunction<
-            _c_clang_createTranslationUnitFromSourceFile,
-            _dart_clang_createTranslationUnitFromSourceFile>(
-        'clang_createTranslationUnitFromSourceFile');
-
-typedef _c_clang_createTranslationUnitFromSourceFile
-    = ffi.Pointer<CXTranslationUnitImpl> Function(
-  ffi.Pointer<ffi.Void> CIdx,
-  ffi.Pointer<ffi.Int8> source_filename,
-  ffi.Int32 num_clang_command_line_args,
-  ffi.Pointer<ffi.Pointer<ffi.Int8>> clang_command_line_args,
-  ffi.Uint32 num_unsaved_files,
-  ffi.Pointer<CXUnsavedFile> unsaved_files,
-);
-
-typedef _dart_clang_createTranslationUnitFromSourceFile
-    = ffi.Pointer<CXTranslationUnitImpl> Function(
-  ffi.Pointer<ffi.Void> 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,
-);
-
-/// Returns a default set of code-completion options that can be
-/// passed to\c clang_codeCompleteAt().
-int clang_defaultCodeCompleteOptions() {
-  return _clang_defaultCodeCompleteOptions();
-}
-
-final _dart_clang_defaultCodeCompleteOptions _clang_defaultCodeCompleteOptions =
-    _dylib.lookupFunction<_c_clang_defaultCodeCompleteOptions,
-            _dart_clang_defaultCodeCompleteOptions>(
-        'clang_defaultCodeCompleteOptions');
-
-typedef _c_clang_defaultCodeCompleteOptions = ffi.Uint32 Function();
-
-typedef _dart_clang_defaultCodeCompleteOptions = int Function();
-
-/// Retrieve the set of display options most similar to the
-/// default behavior of the clang compiler.
-///
-/// \returns A set of display options suitable for use with \c
-/// clang_formatDiagnostic().
-int clang_defaultDiagnosticDisplayOptions() {
-  return _clang_defaultDiagnosticDisplayOptions();
-}
-
-final _dart_clang_defaultDiagnosticDisplayOptions
-    _clang_defaultDiagnosticDisplayOptions = _dylib.lookupFunction<
-            _c_clang_defaultDiagnosticDisplayOptions,
-            _dart_clang_defaultDiagnosticDisplayOptions>(
-        'clang_defaultDiagnosticDisplayOptions');
-
-typedef _c_clang_defaultDiagnosticDisplayOptions = ffi.Uint32 Function();
-
-typedef _dart_clang_defaultDiagnosticDisplayOptions = int Function();
-
-/// Returns the set of flags that is suitable for parsing a translation
-/// unit that is being edited.
-///
-/// The set of flags returned provide options for \c clang_parseTranslationUnit()
-/// to indicate that the translation unit is likely to be reparsed many times,
-/// either explicitly (via \c clang_reparseTranslationUnit()) or implicitly
-/// (e.g., by code completion (\c clang_codeCompletionAt())). The returned flag
-/// set contains an unspecified set of optimizations (e.g., the precompiled
-/// preamble) geared toward improving the performance of these routines. The
-/// set of optimizations enabled may change from one version to the next.
-int clang_defaultEditingTranslationUnitOptions() {
-  return _clang_defaultEditingTranslationUnitOptions();
-}
-
-final _dart_clang_defaultEditingTranslationUnitOptions
-    _clang_defaultEditingTranslationUnitOptions = _dylib.lookupFunction<
-            _c_clang_defaultEditingTranslationUnitOptions,
-            _dart_clang_defaultEditingTranslationUnitOptions>(
-        'clang_defaultEditingTranslationUnitOptions');
-
-typedef _c_clang_defaultEditingTranslationUnitOptions = ffi.Uint32 Function();
-
-typedef _dart_clang_defaultEditingTranslationUnitOptions = int Function();
-
-/// Returns the set of flags that is suitable for reparsing a translation
-/// unit.
-///
-/// The set of flags returned provide options for
-/// \c clang_reparseTranslationUnit() by default. The returned flag
-/// set contains an unspecified set of optimizations geared toward common uses
-/// of reparsing. The set of optimizations enabled may change from one version
-/// to the next.
-int clang_defaultReparseOptions(
-  ffi.Pointer<CXTranslationUnitImpl> TU,
-) {
-  return _clang_defaultReparseOptions(
-    TU,
-  );
-}
-
-final _dart_clang_defaultReparseOptions _clang_defaultReparseOptions =
-    _dylib.lookupFunction<_c_clang_defaultReparseOptions,
-        _dart_clang_defaultReparseOptions>('clang_defaultReparseOptions');
-
-typedef _c_clang_defaultReparseOptions = ffi.Uint32 Function(
-  ffi.Pointer<CXTranslationUnitImpl> TU,
-);
-
-typedef _dart_clang_defaultReparseOptions = int Function(
-  ffi.Pointer<CXTranslationUnitImpl> TU,
-);
-
-/// Returns the set of flags that is suitable for saving a translation
-/// unit.
-///
-/// The set of flags returned provide options for
-/// \c clang_saveTranslationUnit() by default. The returned flag
-/// set contains an unspecified set of options that save translation units with
-/// the most commonly-requested data.
-int clang_defaultSaveOptions(
-  ffi.Pointer<CXTranslationUnitImpl> TU,
-) {
-  return _clang_defaultSaveOptions(
-    TU,
-  );
-}
-
-final _dart_clang_defaultSaveOptions _clang_defaultSaveOptions =
-    _dylib.lookupFunction<_c_clang_defaultSaveOptions,
-        _dart_clang_defaultSaveOptions>('clang_defaultSaveOptions');
-
-typedef _c_clang_defaultSaveOptions = ffi.Uint32 Function(
-  ffi.Pointer<CXTranslationUnitImpl> TU,
-);
-
-typedef _dart_clang_defaultSaveOptions = int Function(
-  ffi.Pointer<CXTranslationUnitImpl> TU,
-);
-
-/// Disposes a CXCursorSet and releases its associated memory.
-void clang_disposeCXCursorSet(
-  ffi.Pointer<CXCursorSetImpl> cset,
-) {
-  return _clang_disposeCXCursorSet(
-    cset,
-  );
-}
-
-final _dart_clang_disposeCXCursorSet _clang_disposeCXCursorSet =
-    _dylib.lookupFunction<_c_clang_disposeCXCursorSet,
-        _dart_clang_disposeCXCursorSet>('clang_disposeCXCursorSet');
-
-typedef _c_clang_disposeCXCursorSet = ffi.Void Function(
-  ffi.Pointer<CXCursorSetImpl> cset,
-);
-
-typedef _dart_clang_disposeCXCursorSet = void Function(
-  ffi.Pointer<CXCursorSetImpl> cset,
-);
-
-/// Free the memory associated with a \c CXPlatformAvailability structure.
-void clang_disposeCXPlatformAvailability(
-  ffi.Pointer<CXPlatformAvailability> availability,
-) {
-  return _clang_disposeCXPlatformAvailability(
-    availability,
-  );
-}
-
-final _dart_clang_disposeCXPlatformAvailability
-    _clang_disposeCXPlatformAvailability = _dylib.lookupFunction<
-            _c_clang_disposeCXPlatformAvailability,
-            _dart_clang_disposeCXPlatformAvailability>(
-        'clang_disposeCXPlatformAvailability');
-
-typedef _c_clang_disposeCXPlatformAvailability = ffi.Void Function(
-  ffi.Pointer<CXPlatformAvailability> availability,
-);
-
-typedef _dart_clang_disposeCXPlatformAvailability = void Function(
-  ffi.Pointer<CXPlatformAvailability> availability,
-);
-
-/// Free the given set of code-completion results.
-void clang_disposeCodeCompleteResults(
-  ffi.Pointer<CXCodeCompleteResults> Results,
-) {
-  return _clang_disposeCodeCompleteResults(
-    Results,
-  );
-}
-
-final _dart_clang_disposeCodeCompleteResults _clang_disposeCodeCompleteResults =
-    _dylib.lookupFunction<_c_clang_disposeCodeCompleteResults,
-            _dart_clang_disposeCodeCompleteResults>(
-        'clang_disposeCodeCompleteResults');
-
-typedef _c_clang_disposeCodeCompleteResults = ffi.Void Function(
-  ffi.Pointer<CXCodeCompleteResults> Results,
-);
-
-typedef _dart_clang_disposeCodeCompleteResults = void Function(
-  ffi.Pointer<CXCodeCompleteResults> Results,
-);
-
-/// Destroy a diagnostic.
-void clang_disposeDiagnostic(
-  ffi.Pointer<ffi.Void> Diagnostic,
-) {
-  return _clang_disposeDiagnostic(
-    Diagnostic,
-  );
-}
-
-final _dart_clang_disposeDiagnostic _clang_disposeDiagnostic = _dylib
-    .lookupFunction<_c_clang_disposeDiagnostic, _dart_clang_disposeDiagnostic>(
-        'clang_disposeDiagnostic');
-
-typedef _c_clang_disposeDiagnostic = ffi.Void Function(
-  ffi.Pointer<ffi.Void> Diagnostic,
-);
-
-typedef _dart_clang_disposeDiagnostic = void Function(
-  ffi.Pointer<ffi.Void> Diagnostic,
-);
-
-/// Release a CXDiagnosticSet and all of its contained diagnostics.
-void clang_disposeDiagnosticSet(
-  ffi.Pointer<ffi.Void> Diags,
-) {
-  return _clang_disposeDiagnosticSet(
-    Diags,
-  );
-}
-
-final _dart_clang_disposeDiagnosticSet _clang_disposeDiagnosticSet =
-    _dylib.lookupFunction<_c_clang_disposeDiagnosticSet,
-        _dart_clang_disposeDiagnosticSet>('clang_disposeDiagnosticSet');
-
-typedef _c_clang_disposeDiagnosticSet = ffi.Void Function(
-  ffi.Pointer<ffi.Void> Diags,
-);
-
-typedef _dart_clang_disposeDiagnosticSet = void Function(
-  ffi.Pointer<ffi.Void> Diags,
-);
-
-/// Destroy the given index.
-///
-/// The index must not be destroyed until all of the translation units created
-/// within that index have been destroyed.
-void clang_disposeIndex(
-  ffi.Pointer<ffi.Void> index,
-) {
-  return _clang_disposeIndex(
-    index,
-  );
-}
-
-final _dart_clang_disposeIndex _clang_disposeIndex =
-    _dylib.lookupFunction<_c_clang_disposeIndex, _dart_clang_disposeIndex>(
-        'clang_disposeIndex');
-
-typedef _c_clang_disposeIndex = ffi.Void Function(
-  ffi.Pointer<ffi.Void> index,
-);
-
-typedef _dart_clang_disposeIndex = void Function(
-  ffi.Pointer<ffi.Void> index,
-);
-
-/// Free the set of overridden cursors returned by \c
-/// clang_getOverriddenCursors().
-void clang_disposeOverriddenCursors(
-  ffi.Pointer<CXCursor> overridden,
-) {
-  return _clang_disposeOverriddenCursors(
-    overridden,
-  );
-}
-
-final _dart_clang_disposeOverriddenCursors _clang_disposeOverriddenCursors =
-    _dylib.lookupFunction<_c_clang_disposeOverriddenCursors,
-        _dart_clang_disposeOverriddenCursors>('clang_disposeOverriddenCursors');
-
-typedef _c_clang_disposeOverriddenCursors = ffi.Void Function(
-  ffi.Pointer<CXCursor> overridden,
-);
-
-typedef _dart_clang_disposeOverriddenCursors = void Function(
-  ffi.Pointer<CXCursor> overridden,
-);
-
-/// Destroy the given \c CXSourceRangeList.
-void clang_disposeSourceRangeList(
-  ffi.Pointer<CXSourceRangeList> ranges,
-) {
-  return _clang_disposeSourceRangeList(
-    ranges,
-  );
-}
-
-final _dart_clang_disposeSourceRangeList _clang_disposeSourceRangeList =
-    _dylib.lookupFunction<_c_clang_disposeSourceRangeList,
-        _dart_clang_disposeSourceRangeList>('clang_disposeSourceRangeList');
-
-typedef _c_clang_disposeSourceRangeList = ffi.Void Function(
-  ffi.Pointer<CXSourceRangeList> ranges,
-);
-
-typedef _dart_clang_disposeSourceRangeList = void Function(
-  ffi.Pointer<CXSourceRangeList> ranges,
-);
-
-/// Free the given string set.
-void clang_disposeStringSet(
-  ffi.Pointer<CXStringSet> set,
-) {
-  return _clang_disposeStringSet(
-    set,
-  );
-}
-
-final _dart_clang_disposeStringSet _clang_disposeStringSet = _dylib
-    .lookupFunction<_c_clang_disposeStringSet, _dart_clang_disposeStringSet>(
-        'clang_disposeStringSet');
-
-typedef _c_clang_disposeStringSet = ffi.Void Function(
-  ffi.Pointer<CXStringSet> set,
-);
-
-typedef _dart_clang_disposeStringSet = void Function(
-  ffi.Pointer<CXStringSet> set,
-);
-
-void clang_disposeString_wrap(
-  ffi.Pointer<CXString> string,
-) {
-  return _clang_disposeString_wrap(
-    string,
-  );
-}
-
-final _dart_clang_disposeString_wrap _clang_disposeString_wrap =
-    _dylib.lookupFunction<_c_clang_disposeString_wrap,
-        _dart_clang_disposeString_wrap>('clang_disposeString_wrap');
-
-typedef _c_clang_disposeString_wrap = ffi.Void Function(
-  ffi.Pointer<CXString> string,
-);
-
-typedef _dart_clang_disposeString_wrap = void Function(
-  ffi.Pointer<CXString> string,
-);
-
-/// Free the given set of tokens.
-void clang_disposeTokens(
-  ffi.Pointer<CXTranslationUnitImpl> TU,
-  ffi.Pointer<CXToken> Tokens,
-  int NumTokens,
-) {
-  return _clang_disposeTokens(
-    TU,
-    Tokens,
-    NumTokens,
-  );
-}
-
-final _dart_clang_disposeTokens _clang_disposeTokens =
-    _dylib.lookupFunction<_c_clang_disposeTokens, _dart_clang_disposeTokens>(
-        'clang_disposeTokens');
-
-typedef _c_clang_disposeTokens = ffi.Void Function(
-  ffi.Pointer<CXTranslationUnitImpl> TU,
-  ffi.Pointer<CXToken> Tokens,
-  ffi.Uint32 NumTokens,
-);
-
-typedef _dart_clang_disposeTokens = void Function(
-  ffi.Pointer<CXTranslationUnitImpl> TU,
-  ffi.Pointer<CXToken> Tokens,
-  int NumTokens,
-);
-
-/// Destroy the specified CXTranslationUnit object.
-void clang_disposeTranslationUnit(
-  ffi.Pointer<CXTranslationUnitImpl> arg0,
-) {
-  return _clang_disposeTranslationUnit(
-    arg0,
-  );
-}
-
-final _dart_clang_disposeTranslationUnit _clang_disposeTranslationUnit =
-    _dylib.lookupFunction<_c_clang_disposeTranslationUnit,
-        _dart_clang_disposeTranslationUnit>('clang_disposeTranslationUnit');
-
-typedef _c_clang_disposeTranslationUnit = ffi.Void Function(
-  ffi.Pointer<CXTranslationUnitImpl> arg0,
-);
-
-typedef _dart_clang_disposeTranslationUnit = void Function(
-  ffi.Pointer<CXTranslationUnitImpl> arg0,
-);
-
-void clang_enableStackTraces() {
-  return _clang_enableStackTraces();
-}
-
-final _dart_clang_enableStackTraces _clang_enableStackTraces = _dylib
-    .lookupFunction<_c_clang_enableStackTraces, _dart_clang_enableStackTraces>(
-        'clang_enableStackTraces');
-
-typedef _c_clang_enableStackTraces = ffi.Void Function();
-
-typedef _dart_clang_enableStackTraces = void Function();
-
-/// Returns non-zero if the ranges are the same, zero if they differ.
-int clang_equalRanges_wrap(
-  ffi.Pointer<CXSourceRange> c1,
-  ffi.Pointer<CXSourceRange> c2,
-) {
-  return _clang_equalRanges_wrap(
-    c1,
-    c2,
-  );
-}
-
-final _dart_clang_equalRanges_wrap _clang_equalRanges_wrap = _dylib
-    .lookupFunction<_c_clang_equalRanges_wrap, _dart_clang_equalRanges_wrap>(
-        'clang_equalRanges_wrap');
-
-typedef _c_clang_equalRanges_wrap = ffi.Uint32 Function(
-  ffi.Pointer<CXSourceRange> c1,
-  ffi.Pointer<CXSourceRange> c2,
-);
-
-typedef _dart_clang_equalRanges_wrap = int Function(
-  ffi.Pointer<CXSourceRange> c1,
-  ffi.Pointer<CXSourceRange> c2,
-);
-
-typedef _typedefC_1 = ffi.Void Function(
-  ffi.Pointer<ffi.Void>,
-);
-
-void clang_executeOnThread(
-  ffi.Pointer<ffi.NativeFunction<_typedefC_1>> fn,
-  ffi.Pointer<ffi.Void> user_data,
-  int stack_size,
-) {
-  return _clang_executeOnThread(
-    fn,
-    user_data,
-    stack_size,
-  );
-}
-
-final _dart_clang_executeOnThread _clang_executeOnThread = _dylib
-    .lookupFunction<_c_clang_executeOnThread, _dart_clang_executeOnThread>(
-        'clang_executeOnThread');
-
-typedef _c_clang_executeOnThread = ffi.Void Function(
-  ffi.Pointer<ffi.NativeFunction<_typedefC_1>> fn,
-  ffi.Pointer<ffi.Void> user_data,
-  ffi.Uint32 stack_size,
-);
-
-typedef _dart_clang_executeOnThread = void Function(
-  ffi.Pointer<ffi.NativeFunction<_typedefC_1>> fn,
-  ffi.Pointer<ffi.Void> user_data,
-  int stack_size,
-);
-
-ffi.Pointer<CXString> clang_formatDiagnostic_wrap(
-  ffi.Pointer<ffi.Void> diag,
-  int opts,
-) {
-  return _clang_formatDiagnostic_wrap(
-    diag,
-    opts,
-  );
-}
-
-final _dart_clang_formatDiagnostic_wrap _clang_formatDiagnostic_wrap =
-    _dylib.lookupFunction<_c_clang_formatDiagnostic_wrap,
-        _dart_clang_formatDiagnostic_wrap>('clang_formatDiagnostic_wrap');
-
-typedef _c_clang_formatDiagnostic_wrap = ffi.Pointer<CXString> Function(
-  ffi.Pointer<ffi.Void> diag,
-  ffi.Int32 opts,
-);
-
-typedef _dart_clang_formatDiagnostic_wrap = ffi.Pointer<CXString> Function(
-  ffi.Pointer<ffi.Void> diag,
-  int opts,
-);
-
-/// Retrieve all ranges from all files that were skipped by the
-/// preprocessor.
-///
-/// The preprocessor will skip lines when they are surrounded by an
-/// if/ifdef/ifndef directive whose condition does not evaluate to true.
-ffi.Pointer<CXSourceRangeList> clang_getAllSkippedRanges(
-  ffi.Pointer<CXTranslationUnitImpl> tu,
-) {
-  return _clang_getAllSkippedRanges(
-    tu,
-  );
-}
-
-final _dart_clang_getAllSkippedRanges _clang_getAllSkippedRanges =
-    _dylib.lookupFunction<_c_clang_getAllSkippedRanges,
-        _dart_clang_getAllSkippedRanges>('clang_getAllSkippedRanges');
-
-typedef _c_clang_getAllSkippedRanges = ffi.Pointer<CXSourceRangeList> Function(
-  ffi.Pointer<CXTranslationUnitImpl> tu,
-);
-
-typedef _dart_clang_getAllSkippedRanges = ffi.Pointer<CXSourceRangeList>
-    Function(
-  ffi.Pointer<CXTranslationUnitImpl> tu,
-);
-
-ffi.Pointer<CXType> clang_getArgType_wrap(
-  ffi.Pointer<CXType> cxtype,
-  int i,
-) {
-  return _clang_getArgType_wrap(
-    cxtype,
-    i,
-  );
-}
-
-final _dart_clang_getArgType_wrap _clang_getArgType_wrap = _dylib
-    .lookupFunction<_c_clang_getArgType_wrap, _dart_clang_getArgType_wrap>(
-        'clang_getArgType_wrap');
-
-typedef _c_clang_getArgType_wrap = ffi.Pointer<CXType> Function(
-  ffi.Pointer<CXType> cxtype,
-  ffi.Uint32 i,
-);
-
-typedef _dart_clang_getArgType_wrap = ffi.Pointer<CXType> Function(
-  ffi.Pointer<CXType> cxtype,
-  int i,
-);
-
-ffi.Pointer<CXType> clang_getArrayElementType_wrap(
-  ffi.Pointer<CXType> cxtype,
-) {
-  return _clang_getArrayElementType_wrap(
-    cxtype,
-  );
-}
-
-final _dart_clang_getArrayElementType_wrap _clang_getArrayElementType_wrap =
-    _dylib.lookupFunction<_c_clang_getArrayElementType_wrap,
-        _dart_clang_getArrayElementType_wrap>('clang_getArrayElementType_wrap');
-
-typedef _c_clang_getArrayElementType_wrap = ffi.Pointer<CXType> Function(
-  ffi.Pointer<CXType> cxtype,
-);
-
-typedef _dart_clang_getArrayElementType_wrap = ffi.Pointer<CXType> Function(
-  ffi.Pointer<CXType> cxtype,
-);
-
-ffi.Pointer<ffi.Int8> clang_getCString_wrap(
-  ffi.Pointer<CXString> string,
-) {
-  return _clang_getCString_wrap(
-    string,
-  );
-}
-
-final _dart_clang_getCString_wrap _clang_getCString_wrap = _dylib
-    .lookupFunction<_c_clang_getCString_wrap, _dart_clang_getCString_wrap>(
-        'clang_getCString_wrap');
-
-typedef _c_clang_getCString_wrap = ffi.Pointer<ffi.Int8> Function(
-  ffi.Pointer<CXString> string,
-);
-
-typedef _dart_clang_getCString_wrap = ffi.Pointer<ffi.Int8> Function(
-  ffi.Pointer<CXString> string,
-);
-
-ffi.Pointer<CXType> clang_getCanonicalType_wrap(
-  ffi.Pointer<CXType> typerefType,
-) {
-  return _clang_getCanonicalType_wrap(
-    typerefType,
-  );
-}
-
-final _dart_clang_getCanonicalType_wrap _clang_getCanonicalType_wrap =
-    _dylib.lookupFunction<_c_clang_getCanonicalType_wrap,
-        _dart_clang_getCanonicalType_wrap>('clang_getCanonicalType_wrap');
-
-typedef _c_clang_getCanonicalType_wrap = ffi.Pointer<CXType> Function(
-  ffi.Pointer<CXType> typerefType,
-);
-
-typedef _dart_clang_getCanonicalType_wrap = ffi.Pointer<CXType> Function(
-  ffi.Pointer<CXType> typerefType,
-);
-
-/// Retrieve the child diagnostics of a CXDiagnostic.
-///
-/// This CXDiagnosticSet does not need to be released by
-/// clang_disposeDiagnosticSet.
-ffi.Pointer<ffi.Void> clang_getChildDiagnostics(
-  ffi.Pointer<ffi.Void> D,
-) {
-  return _clang_getChildDiagnostics(
-    D,
-  );
-}
-
-final _dart_clang_getChildDiagnostics _clang_getChildDiagnostics =
-    _dylib.lookupFunction<_c_clang_getChildDiagnostics,
-        _dart_clang_getChildDiagnostics>('clang_getChildDiagnostics');
-
-typedef _c_clang_getChildDiagnostics = ffi.Pointer<ffi.Void> Function(
-  ffi.Pointer<ffi.Void> D,
-);
-
-typedef _dart_clang_getChildDiagnostics = ffi.Pointer<ffi.Void> Function(
-  ffi.Pointer<ffi.Void> D,
-);
-
-/// Determine the availability of the entity that this code-completion
-/// string refers to.
-///
-/// \param completion_string The completion string to query.
-///
-/// \returns The availability of the completion string.
-int clang_getCompletionAvailability(
-  ffi.Pointer<ffi.Void> completion_string,
-) {
-  return _clang_getCompletionAvailability(
-    completion_string,
-  );
-}
-
-final _dart_clang_getCompletionAvailability _clang_getCompletionAvailability =
-    _dylib.lookupFunction<_c_clang_getCompletionAvailability,
-            _dart_clang_getCompletionAvailability>(
-        'clang_getCompletionAvailability');
-
-typedef _c_clang_getCompletionAvailability = ffi.Int32 Function(
-  ffi.Pointer<ffi.Void> completion_string,
-);
-
-typedef _dart_clang_getCompletionAvailability = int Function(
-  ffi.Pointer<ffi.Void> completion_string,
-);
-
-/// Retrieve the completion string associated with a particular chunk
-/// within a completion string.
-///
-/// \param completion_string the completion string to query.
-///
-/// \param chunk_number the 0-based index of the chunk in the completion string.
-///
-/// \returns the completion string associated with the chunk at index
-/// \c chunk_number.
-ffi.Pointer<ffi.Void> clang_getCompletionChunkCompletionString(
-  ffi.Pointer<ffi.Void> completion_string,
-  int chunk_number,
-) {
-  return _clang_getCompletionChunkCompletionString(
-    completion_string,
-    chunk_number,
-  );
-}
-
-final _dart_clang_getCompletionChunkCompletionString
-    _clang_getCompletionChunkCompletionString = _dylib.lookupFunction<
-            _c_clang_getCompletionChunkCompletionString,
-            _dart_clang_getCompletionChunkCompletionString>(
-        'clang_getCompletionChunkCompletionString');
-
-typedef _c_clang_getCompletionChunkCompletionString = ffi.Pointer<ffi.Void>
-    Function(
-  ffi.Pointer<ffi.Void> completion_string,
-  ffi.Uint32 chunk_number,
-);
-
-typedef _dart_clang_getCompletionChunkCompletionString = ffi.Pointer<ffi.Void>
-    Function(
-  ffi.Pointer<ffi.Void> completion_string,
-  int chunk_number,
-);
-
-/// Determine the kind of a particular chunk within a completion string.
-///
-/// \param completion_string the completion string to query.
-///
-/// \param chunk_number the 0-based index of the chunk in the completion string.
-///
-/// \returns the kind of the chunk at the index \c chunk_number.
-int clang_getCompletionChunkKind(
-  ffi.Pointer<ffi.Void> completion_string,
-  int chunk_number,
-) {
-  return _clang_getCompletionChunkKind(
-    completion_string,
-    chunk_number,
-  );
-}
-
-final _dart_clang_getCompletionChunkKind _clang_getCompletionChunkKind =
-    _dylib.lookupFunction<_c_clang_getCompletionChunkKind,
-        _dart_clang_getCompletionChunkKind>('clang_getCompletionChunkKind');
-
-typedef _c_clang_getCompletionChunkKind = ffi.Int32 Function(
-  ffi.Pointer<ffi.Void> completion_string,
-  ffi.Uint32 chunk_number,
-);
-
-typedef _dart_clang_getCompletionChunkKind = int Function(
-  ffi.Pointer<ffi.Void> completion_string,
-  int chunk_number,
-);
-
-/// Retrieve the number of annotations associated with the given
-/// completion string.
-///
-/// \param completion_string the completion string to query.
-///
-/// \returns the number of annotations associated with the given completion
-/// string.
-int clang_getCompletionNumAnnotations(
-  ffi.Pointer<ffi.Void> completion_string,
-) {
-  return _clang_getCompletionNumAnnotations(
-    completion_string,
-  );
-}
-
-final _dart_clang_getCompletionNumAnnotations
-    _clang_getCompletionNumAnnotations = _dylib.lookupFunction<
-            _c_clang_getCompletionNumAnnotations,
-            _dart_clang_getCompletionNumAnnotations>(
-        'clang_getCompletionNumAnnotations');
-
-typedef _c_clang_getCompletionNumAnnotations = ffi.Uint32 Function(
-  ffi.Pointer<ffi.Void> completion_string,
-);
-
-typedef _dart_clang_getCompletionNumAnnotations = int Function(
-  ffi.Pointer<ffi.Void> completion_string,
-);
-
-/// Retrieve the number of fix-its for the given completion index.
-///
-/// Calling this makes sense only if CXCodeComplete_IncludeCompletionsWithFixIts
-/// option was set.
-///
-/// \param results The structure keeping all completion results
-///
-/// \param completion_index The index of the completion
-///
-/// \return The number of fix-its which must be applied before the completion at
-/// completion_index can be applied
-int clang_getCompletionNumFixIts(
-  ffi.Pointer<CXCodeCompleteResults> results,
-  int completion_index,
-) {
-  return _clang_getCompletionNumFixIts(
-    results,
-    completion_index,
-  );
-}
-
-final _dart_clang_getCompletionNumFixIts _clang_getCompletionNumFixIts =
-    _dylib.lookupFunction<_c_clang_getCompletionNumFixIts,
-        _dart_clang_getCompletionNumFixIts>('clang_getCompletionNumFixIts');
-
-typedef _c_clang_getCompletionNumFixIts = ffi.Uint32 Function(
-  ffi.Pointer<CXCodeCompleteResults> results,
-  ffi.Uint32 completion_index,
-);
-
-typedef _dart_clang_getCompletionNumFixIts = int Function(
-  ffi.Pointer<CXCodeCompleteResults> results,
-  int completion_index,
-);
-
-/// Determine the priority of this code completion.
-///
-/// The priority of a code completion indicates how likely it is that this
-/// particular completion is the completion that the user will select. The
-/// priority is selected by various internal heuristics.
-///
-/// \param completion_string The completion string to query.
-///
-/// \returns The priority of this completion string. Smaller values indicate
-/// higher-priority (more likely) completions.
-int clang_getCompletionPriority(
-  ffi.Pointer<ffi.Void> completion_string,
-) {
-  return _clang_getCompletionPriority(
-    completion_string,
-  );
-}
-
-final _dart_clang_getCompletionPriority _clang_getCompletionPriority =
-    _dylib.lookupFunction<_c_clang_getCompletionPriority,
-        _dart_clang_getCompletionPriority>('clang_getCompletionPriority');
-
-typedef _c_clang_getCompletionPriority = ffi.Uint32 Function(
-  ffi.Pointer<ffi.Void> completion_string,
-);
-
-typedef _dart_clang_getCompletionPriority = int Function(
-  ffi.Pointer<ffi.Void> completion_string,
-);
-
-ffi.Pointer<CXString> clang_getCursorKindSpelling_wrap(
-  int kind,
-) {
-  return _clang_getCursorKindSpelling_wrap(
-    kind,
-  );
-}
-
-final _dart_clang_getCursorKindSpelling_wrap _clang_getCursorKindSpelling_wrap =
-    _dylib.lookupFunction<_c_clang_getCursorKindSpelling_wrap,
-            _dart_clang_getCursorKindSpelling_wrap>(
-        'clang_getCursorKindSpelling_wrap');
-
-typedef _c_clang_getCursorKindSpelling_wrap = ffi.Pointer<CXString> Function(
-  ffi.Int32 kind,
-);
-
-typedef _dart_clang_getCursorKindSpelling_wrap = ffi.Pointer<CXString> Function(
-  int kind,
-);
-
-int clang_getCursorKind_wrap(
-  ffi.Pointer<CXCursor> cursor,
-) {
-  return _clang_getCursorKind_wrap(
-    cursor,
-  );
-}
-
-final _dart_clang_getCursorKind_wrap _clang_getCursorKind_wrap =
-    _dylib.lookupFunction<_c_clang_getCursorKind_wrap,
-        _dart_clang_getCursorKind_wrap>('clang_getCursorKind_wrap');
-
-typedef _c_clang_getCursorKind_wrap = ffi.Int32 Function(
-  ffi.Pointer<CXCursor> cursor,
-);
-
-typedef _dart_clang_getCursorKind_wrap = int Function(
-  ffi.Pointer<CXCursor> cursor,
-);
-
-ffi.Pointer<CXSourceLocation> clang_getCursorLocation_wrap(
-  ffi.Pointer<CXCursor> cursor,
-) {
-  return _clang_getCursorLocation_wrap(
-    cursor,
-  );
-}
-
-final _dart_clang_getCursorLocation_wrap _clang_getCursorLocation_wrap =
-    _dylib.lookupFunction<_c_clang_getCursorLocation_wrap,
-        _dart_clang_getCursorLocation_wrap>('clang_getCursorLocation_wrap');
-
-typedef _c_clang_getCursorLocation_wrap = ffi.Pointer<CXSourceLocation>
-    Function(
-  ffi.Pointer<CXCursor> cursor,
-);
-
-typedef _dart_clang_getCursorLocation_wrap = ffi.Pointer<CXSourceLocation>
-    Function(
-  ffi.Pointer<CXCursor> cursor,
-);
-
-/// The name of parameter, struct, typedef.
-ffi.Pointer<CXString> clang_getCursorSpelling_wrap(
-  ffi.Pointer<CXCursor> cursor,
-) {
-  return _clang_getCursorSpelling_wrap(
-    cursor,
-  );
-}
-
-final _dart_clang_getCursorSpelling_wrap _clang_getCursorSpelling_wrap =
-    _dylib.lookupFunction<_c_clang_getCursorSpelling_wrap,
-        _dart_clang_getCursorSpelling_wrap>('clang_getCursorSpelling_wrap');
-
-typedef _c_clang_getCursorSpelling_wrap = ffi.Pointer<CXString> Function(
-  ffi.Pointer<CXCursor> cursor,
-);
-
-typedef _dart_clang_getCursorSpelling_wrap = ffi.Pointer<CXString> Function(
-  ffi.Pointer<CXCursor> cursor,
-);
-
-ffi.Pointer<CXType> clang_getCursorType_wrap(
-  ffi.Pointer<CXCursor> cursor,
-) {
-  return _clang_getCursorType_wrap(
-    cursor,
-  );
-}
-
-final _dart_clang_getCursorType_wrap _clang_getCursorType_wrap =
-    _dylib.lookupFunction<_c_clang_getCursorType_wrap,
-        _dart_clang_getCursorType_wrap>('clang_getCursorType_wrap');
-
-typedef _c_clang_getCursorType_wrap = ffi.Pointer<CXType> Function(
-  ffi.Pointer<CXCursor> cursor,
-);
-
-typedef _dart_clang_getCursorType_wrap = ffi.Pointer<CXType> Function(
-  ffi.Pointer<CXCursor> cursor,
-);
-
-/// Retrieve a diagnostic associated with the given translation unit.
-///
-/// \param Unit the translation unit to query.
-/// \param Index the zero-based diagnostic number to retrieve.
-///
-/// \returns the requested diagnostic. This diagnostic must be freed
-/// via a call to \c clang_disposeDiagnostic().
-ffi.Pointer<ffi.Void> clang_getDiagnostic(
-  ffi.Pointer<CXTranslationUnitImpl> Unit,
-  int Index,
-) {
-  return _clang_getDiagnostic(
-    Unit,
-    Index,
-  );
-}
-
-final _dart_clang_getDiagnostic _clang_getDiagnostic =
-    _dylib.lookupFunction<_c_clang_getDiagnostic, _dart_clang_getDiagnostic>(
-        'clang_getDiagnostic');
-
-typedef _c_clang_getDiagnostic = ffi.Pointer<ffi.Void> Function(
-  ffi.Pointer<CXTranslationUnitImpl> Unit,
-  ffi.Uint32 Index,
-);
-
-typedef _dart_clang_getDiagnostic = ffi.Pointer<ffi.Void> Function(
-  ffi.Pointer<CXTranslationUnitImpl> Unit,
-  int Index,
-);
-
-/// Retrieve the category number for this diagnostic.
-///
-/// Diagnostics can be categorized into groups along with other, related
-/// diagnostics (e.g., diagnostics under the same warning flag). This routine
-/// retrieves the category number for the given diagnostic.
-///
-/// \returns The number of the category that contains this diagnostic, or zero
-/// if this diagnostic is uncategorized.
-int clang_getDiagnosticCategory(
-  ffi.Pointer<ffi.Void> arg0,
-) {
-  return _clang_getDiagnosticCategory(
-    arg0,
-  );
-}
-
-final _dart_clang_getDiagnosticCategory _clang_getDiagnosticCategory =
-    _dylib.lookupFunction<_c_clang_getDiagnosticCategory,
-        _dart_clang_getDiagnosticCategory>('clang_getDiagnosticCategory');
-
-typedef _c_clang_getDiagnosticCategory = ffi.Uint32 Function(
-  ffi.Pointer<ffi.Void> arg0,
-);
-
-typedef _dart_clang_getDiagnosticCategory = int Function(
-  ffi.Pointer<ffi.Void> arg0,
-);
-
-/// Retrieve a diagnostic associated with the given CXDiagnosticSet.
-///
-/// \param Diags the CXDiagnosticSet to query.
-/// \param Index the zero-based diagnostic number to retrieve.
-///
-/// \returns the requested diagnostic. This diagnostic must be freed
-/// via a call to \c clang_disposeDiagnostic().
-ffi.Pointer<ffi.Void> clang_getDiagnosticInSet(
-  ffi.Pointer<ffi.Void> Diags,
-  int Index,
-) {
-  return _clang_getDiagnosticInSet(
-    Diags,
-    Index,
-  );
-}
-
-final _dart_clang_getDiagnosticInSet _clang_getDiagnosticInSet =
-    _dylib.lookupFunction<_c_clang_getDiagnosticInSet,
-        _dart_clang_getDiagnosticInSet>('clang_getDiagnosticInSet');
-
-typedef _c_clang_getDiagnosticInSet = ffi.Pointer<ffi.Void> Function(
-  ffi.Pointer<ffi.Void> Diags,
-  ffi.Uint32 Index,
-);
-
-typedef _dart_clang_getDiagnosticInSet = ffi.Pointer<ffi.Void> Function(
-  ffi.Pointer<ffi.Void> Diags,
-  int Index,
-);
-
-/// Determine the number of fix-it hints associated with the
-/// given diagnostic.
-int clang_getDiagnosticNumFixIts(
-  ffi.Pointer<ffi.Void> Diagnostic,
-) {
-  return _clang_getDiagnosticNumFixIts(
-    Diagnostic,
-  );
-}
-
-final _dart_clang_getDiagnosticNumFixIts _clang_getDiagnosticNumFixIts =
-    _dylib.lookupFunction<_c_clang_getDiagnosticNumFixIts,
-        _dart_clang_getDiagnosticNumFixIts>('clang_getDiagnosticNumFixIts');
-
-typedef _c_clang_getDiagnosticNumFixIts = ffi.Uint32 Function(
-  ffi.Pointer<ffi.Void> Diagnostic,
-);
-
-typedef _dart_clang_getDiagnosticNumFixIts = int Function(
-  ffi.Pointer<ffi.Void> Diagnostic,
-);
-
-/// Determine the number of source ranges associated with the given
-/// diagnostic.
-int clang_getDiagnosticNumRanges(
-  ffi.Pointer<ffi.Void> arg0,
-) {
-  return _clang_getDiagnosticNumRanges(
-    arg0,
-  );
-}
-
-final _dart_clang_getDiagnosticNumRanges _clang_getDiagnosticNumRanges =
-    _dylib.lookupFunction<_c_clang_getDiagnosticNumRanges,
-        _dart_clang_getDiagnosticNumRanges>('clang_getDiagnosticNumRanges');
-
-typedef _c_clang_getDiagnosticNumRanges = ffi.Uint32 Function(
-  ffi.Pointer<ffi.Void> arg0,
-);
-
-typedef _dart_clang_getDiagnosticNumRanges = int Function(
-  ffi.Pointer<ffi.Void> arg0,
-);
-
-/// Retrieve the complete set of diagnostics associated with a
-/// translation unit.
-///
-/// \param Unit the translation unit to query.
-ffi.Pointer<ffi.Void> clang_getDiagnosticSetFromTU(
-  ffi.Pointer<CXTranslationUnitImpl> Unit,
-) {
-  return _clang_getDiagnosticSetFromTU(
-    Unit,
-  );
-}
-
-final _dart_clang_getDiagnosticSetFromTU _clang_getDiagnosticSetFromTU =
-    _dylib.lookupFunction<_c_clang_getDiagnosticSetFromTU,
-        _dart_clang_getDiagnosticSetFromTU>('clang_getDiagnosticSetFromTU');
-
-typedef _c_clang_getDiagnosticSetFromTU = ffi.Pointer<ffi.Void> Function(
-  ffi.Pointer<CXTranslationUnitImpl> Unit,
-);
-
-typedef _dart_clang_getDiagnosticSetFromTU = ffi.Pointer<ffi.Void> Function(
-  ffi.Pointer<CXTranslationUnitImpl> Unit,
-);
-
-/// Determine the severity of the given diagnostic.
-int clang_getDiagnosticSeverity(
-  ffi.Pointer<ffi.Void> arg0,
-) {
-  return _clang_getDiagnosticSeverity(
-    arg0,
-  );
-}
-
-final _dart_clang_getDiagnosticSeverity _clang_getDiagnosticSeverity =
-    _dylib.lookupFunction<_c_clang_getDiagnosticSeverity,
-        _dart_clang_getDiagnosticSeverity>('clang_getDiagnosticSeverity');
-
-typedef _c_clang_getDiagnosticSeverity = ffi.Int32 Function(
-  ffi.Pointer<ffi.Void> arg0,
-);
-
-typedef _dart_clang_getDiagnosticSeverity = int Function(
-  ffi.Pointer<ffi.Void> arg0,
-);
-
-int clang_getEnumConstantDeclValue_wrap(
-  ffi.Pointer<CXCursor> cursor,
-) {
-  return _clang_getEnumConstantDeclValue_wrap(
-    cursor,
-  );
-}
-
-final _dart_clang_getEnumConstantDeclValue_wrap
-    _clang_getEnumConstantDeclValue_wrap = _dylib.lookupFunction<
-            _c_clang_getEnumConstantDeclValue_wrap,
-            _dart_clang_getEnumConstantDeclValue_wrap>(
-        'clang_getEnumConstantDeclValue_wrap');
-
-typedef _c_clang_getEnumConstantDeclValue_wrap = ffi.Int64 Function(
-  ffi.Pointer<CXCursor> cursor,
-);
-
-typedef _dart_clang_getEnumConstantDeclValue_wrap = int Function(
-  ffi.Pointer<CXCursor> cursor,
-);
-
-/// Retrieve a file handle within the given translation unit.
-///
-/// \param tu the translation unit
-///
-/// \param file_name the name of the file.
-///
-/// \returns the file handle for the named file in the translation unit \p tu,
-/// or a NULL file handle if the file was not a part of this translation unit.
-ffi.Pointer<ffi.Void> clang_getFile(
-  ffi.Pointer<CXTranslationUnitImpl> tu,
-  ffi.Pointer<ffi.Int8> file_name,
-) {
-  return _clang_getFile(
-    tu,
-    file_name,
-  );
-}
-
-final _dart_clang_getFile _clang_getFile = _dylib
-    .lookupFunction<_c_clang_getFile, _dart_clang_getFile>('clang_getFile');
-
-typedef _c_clang_getFile = ffi.Pointer<ffi.Void> Function(
-  ffi.Pointer<CXTranslationUnitImpl> tu,
-  ffi.Pointer<ffi.Int8> file_name,
-);
-
-typedef _dart_clang_getFile = ffi.Pointer<ffi.Void> Function(
-  ffi.Pointer<CXTranslationUnitImpl> tu,
-  ffi.Pointer<ffi.Int8> file_name,
-);
-
-/// Retrieve the buffer associated with the given file.
-///
-/// \param tu the translation unit
-///
-/// \param file the file for which to retrieve the buffer.
-///
-/// \param size [out] if non-NULL, will be set to the size of the buffer.
-///
-/// \returns a pointer to the buffer in memory that holds the contents of
-/// \p file, or a NULL pointer when the file is not loaded.
-ffi.Pointer<ffi.Int8> clang_getFileContents(
-  ffi.Pointer<CXTranslationUnitImpl> tu,
-  ffi.Pointer<ffi.Void> file,
-  ffi.Pointer<ffi.Uint64> size,
-) {
-  return _clang_getFileContents(
-    tu,
-    file,
-    size,
-  );
-}
-
-final _dart_clang_getFileContents _clang_getFileContents = _dylib
-    .lookupFunction<_c_clang_getFileContents, _dart_clang_getFileContents>(
-        'clang_getFileContents');
-
-typedef _c_clang_getFileContents = ffi.Pointer<ffi.Int8> Function(
-  ffi.Pointer<CXTranslationUnitImpl> tu,
-  ffi.Pointer<ffi.Void> file,
-  ffi.Pointer<ffi.Uint64> size,
-);
-
-typedef _dart_clang_getFileContents = ffi.Pointer<ffi.Int8> Function(
-  ffi.Pointer<CXTranslationUnitImpl> tu,
-  ffi.Pointer<ffi.Void> file,
-  ffi.Pointer<ffi.Uint64> size,
-);
-
-void clang_getFileLocation_wrap(
-  ffi.Pointer<CXSourceLocation> location,
-  ffi.Pointer<ffi.Pointer<ffi.Void>> file,
-  ffi.Pointer<ffi.Uint32> line,
-  ffi.Pointer<ffi.Uint32> column,
-  ffi.Pointer<ffi.Uint32> offset,
-) {
-  return _clang_getFileLocation_wrap(
-    location,
-    file,
-    line,
-    column,
-    offset,
-  );
-}
-
-final _dart_clang_getFileLocation_wrap _clang_getFileLocation_wrap =
-    _dylib.lookupFunction<_c_clang_getFileLocation_wrap,
-        _dart_clang_getFileLocation_wrap>('clang_getFileLocation_wrap');
-
-typedef _c_clang_getFileLocation_wrap = ffi.Void Function(
-  ffi.Pointer<CXSourceLocation> location,
-  ffi.Pointer<ffi.Pointer<ffi.Void>> file,
-  ffi.Pointer<ffi.Uint32> line,
-  ffi.Pointer<ffi.Uint32> column,
-  ffi.Pointer<ffi.Uint32> offset,
-);
-
-typedef _dart_clang_getFileLocation_wrap = void Function(
-  ffi.Pointer<CXSourceLocation> location,
-  ffi.Pointer<ffi.Pointer<ffi.Void>> file,
-  ffi.Pointer<ffi.Uint32> line,
-  ffi.Pointer<ffi.Uint32> column,
-  ffi.Pointer<ffi.Uint32> offset,
-);
-
-ffi.Pointer<CXString> clang_getFileName_wrap(
-  ffi.Pointer<ffi.Void> SFile,
-) {
-  return _clang_getFileName_wrap(
-    SFile,
-  );
-}
-
-final _dart_clang_getFileName_wrap _clang_getFileName_wrap = _dylib
-    .lookupFunction<_c_clang_getFileName_wrap, _dart_clang_getFileName_wrap>(
-        'clang_getFileName_wrap');
-
-typedef _c_clang_getFileName_wrap = ffi.Pointer<CXString> Function(
-  ffi.Pointer<ffi.Void> SFile,
-);
-
-typedef _dart_clang_getFileName_wrap = ffi.Pointer<CXString> Function(
-  ffi.Pointer<ffi.Void> SFile,
-);
-
-/// Retrieve the last modification time of the given file.
-int clang_getFileTime(
-  ffi.Pointer<ffi.Void> SFile,
-) {
-  return _clang_getFileTime(
-    SFile,
-  );
-}
-
-final _dart_clang_getFileTime _clang_getFileTime =
-    _dylib.lookupFunction<_c_clang_getFileTime, _dart_clang_getFileTime>(
-        'clang_getFileTime');
-
-typedef _c_clang_getFileTime = ffi.Int64 Function(
-  ffi.Pointer<ffi.Void> SFile,
-);
-
-typedef _dart_clang_getFileTime = int Function(
-  ffi.Pointer<ffi.Void> SFile,
-);
-
-/// Retrieve the unique ID for the given \c file.
-///
-/// \param file the file to get the ID for.
-/// \param outID stores the returned CXFileUniqueID.
-/// \returns If there was a failure getting the unique ID, returns non-zero,
-/// otherwise returns 0.
-int clang_getFileUniqueID(
-  ffi.Pointer<ffi.Void> file,
-  ffi.Pointer<CXFileUniqueID> outID,
-) {
-  return _clang_getFileUniqueID(
-    file,
-    outID,
-  );
-}
-
-final _dart_clang_getFileUniqueID _clang_getFileUniqueID = _dylib
-    .lookupFunction<_c_clang_getFileUniqueID, _dart_clang_getFileUniqueID>(
-        'clang_getFileUniqueID');
-
-typedef _c_clang_getFileUniqueID = ffi.Int32 Function(
-  ffi.Pointer<ffi.Void> file,
-  ffi.Pointer<CXFileUniqueID> outID,
-);
-
-typedef _dart_clang_getFileUniqueID = int Function(
-  ffi.Pointer<ffi.Void> file,
-  ffi.Pointer<CXFileUniqueID> outID,
-);
-
-typedef CXInclusionVisitor_1 = ffi.Void Function(
-  ffi.Pointer<ffi.Void>,
-  ffi.Pointer<CXSourceLocation>,
-  ffi.Uint32,
-  ffi.Pointer<ffi.Void>,
-);
-
-/// Visit the set of preprocessor inclusions in a translation unit.
-/// The visitor function is called with the provided data for every included
-/// file.  This does not include headers included by the PCH file (unless one
-/// is inspecting the inclusions in the PCH file itself).
-void clang_getInclusions(
-  ffi.Pointer<CXTranslationUnitImpl> tu,
-  ffi.Pointer<ffi.NativeFunction<CXInclusionVisitor_1>> visitor,
-  ffi.Pointer<ffi.Void> client_data,
-) {
-  return _clang_getInclusions(
-    tu,
-    visitor,
-    client_data,
-  );
-}
-
-final _dart_clang_getInclusions _clang_getInclusions =
-    _dylib.lookupFunction<_c_clang_getInclusions, _dart_clang_getInclusions>(
-        'clang_getInclusions');
-
-typedef _c_clang_getInclusions = ffi.Void Function(
-  ffi.Pointer<CXTranslationUnitImpl> tu,
-  ffi.Pointer<ffi.NativeFunction<CXInclusionVisitor_1>> visitor,
-  ffi.Pointer<ffi.Void> client_data,
-);
-
-typedef _dart_clang_getInclusions = void Function(
-  ffi.Pointer<CXTranslationUnitImpl> tu,
-  ffi.Pointer<ffi.NativeFunction<CXInclusionVisitor_1>> visitor,
-  ffi.Pointer<ffi.Void> client_data,
-);
-
-/// Given a CXFile header file, return the module that contains it, if one
-/// exists.
-ffi.Pointer<ffi.Void> clang_getModuleForFile(
-  ffi.Pointer<CXTranslationUnitImpl> arg0,
-  ffi.Pointer<ffi.Void> arg1,
-) {
-  return _clang_getModuleForFile(
-    arg0,
-    arg1,
-  );
-}
-
-final _dart_clang_getModuleForFile _clang_getModuleForFile = _dylib
-    .lookupFunction<_c_clang_getModuleForFile, _dart_clang_getModuleForFile>(
-        'clang_getModuleForFile');
-
-typedef _c_clang_getModuleForFile = ffi.Pointer<ffi.Void> Function(
-  ffi.Pointer<CXTranslationUnitImpl> arg0,
-  ffi.Pointer<ffi.Void> arg1,
-);
-
-typedef _dart_clang_getModuleForFile = ffi.Pointer<ffi.Void> Function(
-  ffi.Pointer<CXTranslationUnitImpl> arg0,
-  ffi.Pointer<ffi.Void> arg1,
-);
-
-int clang_getNumArgTypes_wrap(
-  ffi.Pointer<CXType> cxtype,
-) {
-  return _clang_getNumArgTypes_wrap(
-    cxtype,
-  );
-}
-
-final _dart_clang_getNumArgTypes_wrap _clang_getNumArgTypes_wrap =
-    _dylib.lookupFunction<_c_clang_getNumArgTypes_wrap,
-        _dart_clang_getNumArgTypes_wrap>('clang_getNumArgTypes_wrap');
-
-typedef _c_clang_getNumArgTypes_wrap = ffi.Int32 Function(
-  ffi.Pointer<CXType> cxtype,
-);
-
-typedef _dart_clang_getNumArgTypes_wrap = int Function(
-  ffi.Pointer<CXType> cxtype,
-);
-
-/// Retrieve the number of chunks in the given code-completion string.
-int clang_getNumCompletionChunks(
-  ffi.Pointer<ffi.Void> completion_string,
-) {
-  return _clang_getNumCompletionChunks(
-    completion_string,
-  );
-}
-
-final _dart_clang_getNumCompletionChunks _clang_getNumCompletionChunks =
-    _dylib.lookupFunction<_c_clang_getNumCompletionChunks,
-        _dart_clang_getNumCompletionChunks>('clang_getNumCompletionChunks');
-
-typedef _c_clang_getNumCompletionChunks = ffi.Uint32 Function(
-  ffi.Pointer<ffi.Void> completion_string,
-);
-
-typedef _dart_clang_getNumCompletionChunks = int Function(
-  ffi.Pointer<ffi.Void> completion_string,
-);
-
-/// Determine the number of diagnostics produced for the given
-/// translation unit.
-int clang_getNumDiagnostics(
-  ffi.Pointer<CXTranslationUnitImpl> Unit,
-) {
-  return _clang_getNumDiagnostics(
-    Unit,
-  );
-}
-
-final _dart_clang_getNumDiagnostics _clang_getNumDiagnostics = _dylib
-    .lookupFunction<_c_clang_getNumDiagnostics, _dart_clang_getNumDiagnostics>(
-        'clang_getNumDiagnostics');
-
-typedef _c_clang_getNumDiagnostics = ffi.Uint32 Function(
-  ffi.Pointer<CXTranslationUnitImpl> Unit,
-);
-
-typedef _dart_clang_getNumDiagnostics = int Function(
-  ffi.Pointer<CXTranslationUnitImpl> Unit,
-);
-
-/// Determine the number of diagnostics in a CXDiagnosticSet.
-int clang_getNumDiagnosticsInSet(
-  ffi.Pointer<ffi.Void> Diags,
-) {
-  return _clang_getNumDiagnosticsInSet(
-    Diags,
-  );
-}
-
-final _dart_clang_getNumDiagnosticsInSet _clang_getNumDiagnosticsInSet =
-    _dylib.lookupFunction<_c_clang_getNumDiagnosticsInSet,
-        _dart_clang_getNumDiagnosticsInSet>('clang_getNumDiagnosticsInSet');
-
-typedef _c_clang_getNumDiagnosticsInSet = ffi.Uint32 Function(
-  ffi.Pointer<ffi.Void> Diags,
-);
-
-typedef _dart_clang_getNumDiagnosticsInSet = int Function(
-  ffi.Pointer<ffi.Void> Diags,
-);
-
-int clang_getNumElements_wrap(
-  ffi.Pointer<CXType> cxtype,
-) {
-  return _clang_getNumElements_wrap(
-    cxtype,
-  );
-}
-
-final _dart_clang_getNumElements_wrap _clang_getNumElements_wrap =
-    _dylib.lookupFunction<_c_clang_getNumElements_wrap,
-        _dart_clang_getNumElements_wrap>('clang_getNumElements_wrap');
-
-typedef _c_clang_getNumElements_wrap = ffi.Uint64 Function(
-  ffi.Pointer<CXType> cxtype,
-);
-
-typedef _dart_clang_getNumElements_wrap = int Function(
-  ffi.Pointer<CXType> cxtype,
-);
-
-ffi.Pointer<CXType> clang_getPointeeType_wrap(
-  ffi.Pointer<CXType> pointerType,
-) {
-  return _clang_getPointeeType_wrap(
-    pointerType,
-  );
-}
-
-final _dart_clang_getPointeeType_wrap _clang_getPointeeType_wrap =
-    _dylib.lookupFunction<_c_clang_getPointeeType_wrap,
-        _dart_clang_getPointeeType_wrap>('clang_getPointeeType_wrap');
-
-typedef _c_clang_getPointeeType_wrap = ffi.Pointer<CXType> Function(
-  ffi.Pointer<CXType> pointerType,
-);
-
-typedef _dart_clang_getPointeeType_wrap = ffi.Pointer<CXType> Function(
-  ffi.Pointer<CXType> pointerType,
-);
-
-/// Retrieve a remapping.
-///
-/// \param path the path that contains metadata about remappings.
-///
-/// \returns the requested remapping. This remapping must be freed
-/// via a call to \c clang_remap_dispose(). Can return NULL if an error occurred.
-ffi.Pointer<ffi.Void> clang_getRemappings(
-  ffi.Pointer<ffi.Int8> path,
-) {
-  return _clang_getRemappings(
-    path,
-  );
-}
-
-final _dart_clang_getRemappings _clang_getRemappings =
-    _dylib.lookupFunction<_c_clang_getRemappings, _dart_clang_getRemappings>(
-        'clang_getRemappings');
-
-typedef _c_clang_getRemappings = ffi.Pointer<ffi.Void> Function(
-  ffi.Pointer<ffi.Int8> path,
-);
-
-typedef _dart_clang_getRemappings = ffi.Pointer<ffi.Void> Function(
-  ffi.Pointer<ffi.Int8> path,
-);
-
-/// Retrieve a remapping.
-///
-/// \param filePaths pointer to an array of file paths containing remapping info.
-///
-/// \param numFiles number of file paths.
-///
-/// \returns the requested remapping. This remapping must be freed
-/// via a call to \c clang_remap_dispose(). Can return NULL if an error occurred.
-ffi.Pointer<ffi.Void> clang_getRemappingsFromFileList(
-  ffi.Pointer<ffi.Pointer<ffi.Int8>> filePaths,
-  int numFiles,
-) {
-  return _clang_getRemappingsFromFileList(
-    filePaths,
-    numFiles,
-  );
-}
-
-final _dart_clang_getRemappingsFromFileList _clang_getRemappingsFromFileList =
-    _dylib.lookupFunction<_c_clang_getRemappingsFromFileList,
-            _dart_clang_getRemappingsFromFileList>(
-        'clang_getRemappingsFromFileList');
-
-typedef _c_clang_getRemappingsFromFileList = ffi.Pointer<ffi.Void> Function(
-  ffi.Pointer<ffi.Pointer<ffi.Int8>> filePaths,
-  ffi.Uint32 numFiles,
-);
-
-typedef _dart_clang_getRemappingsFromFileList = ffi.Pointer<ffi.Void> Function(
-  ffi.Pointer<ffi.Pointer<ffi.Int8>> filePaths,
-  int numFiles,
-);
-
-ffi.Pointer<CXType> clang_getResultType_wrap(
-  ffi.Pointer<CXType> functionType,
-) {
-  return _clang_getResultType_wrap(
-    functionType,
-  );
-}
-
-final _dart_clang_getResultType_wrap _clang_getResultType_wrap =
-    _dylib.lookupFunction<_c_clang_getResultType_wrap,
-        _dart_clang_getResultType_wrap>('clang_getResultType_wrap');
-
-typedef _c_clang_getResultType_wrap = ffi.Pointer<CXType> Function(
-  ffi.Pointer<CXType> functionType,
-);
-
-typedef _dart_clang_getResultType_wrap = ffi.Pointer<CXType> Function(
-  ffi.Pointer<CXType> functionType,
-);
-
-/// Retrieve all ranges that were skipped by the preprocessor.
-///
-/// The preprocessor will skip lines when they are surrounded by an
-/// if/ifdef/ifndef directive whose condition does not evaluate to true.
-ffi.Pointer<CXSourceRangeList> clang_getSkippedRanges(
-  ffi.Pointer<CXTranslationUnitImpl> tu,
-  ffi.Pointer<ffi.Void> file,
-) {
-  return _clang_getSkippedRanges(
-    tu,
-    file,
-  );
-}
-
-final _dart_clang_getSkippedRanges _clang_getSkippedRanges = _dylib
-    .lookupFunction<_c_clang_getSkippedRanges, _dart_clang_getSkippedRanges>(
-        'clang_getSkippedRanges');
-
-typedef _c_clang_getSkippedRanges = ffi.Pointer<CXSourceRangeList> Function(
-  ffi.Pointer<CXTranslationUnitImpl> tu,
-  ffi.Pointer<ffi.Void> file,
-);
-
-typedef _dart_clang_getSkippedRanges = ffi.Pointer<CXSourceRangeList> Function(
-  ffi.Pointer<CXTranslationUnitImpl> tu,
-  ffi.Pointer<ffi.Void> file,
-);
-
-/// Returns the human-readable null-terminated C string that represents
-/// the name of the memory category.  This string should never be freed.
-ffi.Pointer<ffi.Int8> clang_getTUResourceUsageName(
-  int kind,
-) {
-  return _clang_getTUResourceUsageName(
-    kind,
-  );
-}
-
-final _dart_clang_getTUResourceUsageName _clang_getTUResourceUsageName =
-    _dylib.lookupFunction<_c_clang_getTUResourceUsageName,
-        _dart_clang_getTUResourceUsageName>('clang_getTUResourceUsageName');
-
-typedef _c_clang_getTUResourceUsageName = ffi.Pointer<ffi.Int8> Function(
-  ffi.Int32 kind,
-);
-
-typedef _dart_clang_getTUResourceUsageName = ffi.Pointer<ffi.Int8> Function(
-  int kind,
-);
-
-ffi.Pointer<CXCursor> clang_getTranslationUnitCursor_wrap(
-  ffi.Pointer<CXTranslationUnitImpl> tu,
-) {
-  return _clang_getTranslationUnitCursor_wrap(
-    tu,
-  );
-}
-
-final _dart_clang_getTranslationUnitCursor_wrap
-    _clang_getTranslationUnitCursor_wrap = _dylib.lookupFunction<
-            _c_clang_getTranslationUnitCursor_wrap,
-            _dart_clang_getTranslationUnitCursor_wrap>(
-        'clang_getTranslationUnitCursor_wrap');
-
-typedef _c_clang_getTranslationUnitCursor_wrap = ffi.Pointer<CXCursor> Function(
-  ffi.Pointer<CXTranslationUnitImpl> tu,
-);
-
-typedef _dart_clang_getTranslationUnitCursor_wrap = ffi.Pointer<CXCursor>
-    Function(
-  ffi.Pointer<CXTranslationUnitImpl> tu,
-);
-
-/// Get target information for this translation unit.
-///
-/// The CXTargetInfo object cannot outlive the CXTranslationUnit object.
-ffi.Pointer<CXTargetInfoImpl> clang_getTranslationUnitTargetInfo(
-  ffi.Pointer<CXTranslationUnitImpl> CTUnit,
-) {
-  return _clang_getTranslationUnitTargetInfo(
-    CTUnit,
-  );
-}
-
-final _dart_clang_getTranslationUnitTargetInfo
-    _clang_getTranslationUnitTargetInfo = _dylib.lookupFunction<
-            _c_clang_getTranslationUnitTargetInfo,
-            _dart_clang_getTranslationUnitTargetInfo>(
-        'clang_getTranslationUnitTargetInfo');
-
-typedef _c_clang_getTranslationUnitTargetInfo = ffi.Pointer<CXTargetInfoImpl>
-    Function(
-  ffi.Pointer<CXTranslationUnitImpl> CTUnit,
-);
-
-typedef _dart_clang_getTranslationUnitTargetInfo = ffi.Pointer<CXTargetInfoImpl>
-    Function(
-  ffi.Pointer<CXTranslationUnitImpl> CTUnit,
-);
-
-ffi.Pointer<CXCursor> clang_getTypeDeclaration_wrap(
-  ffi.Pointer<CXType> cxtype,
-) {
-  return _clang_getTypeDeclaration_wrap(
-    cxtype,
-  );
-}
-
-final _dart_clang_getTypeDeclaration_wrap _clang_getTypeDeclaration_wrap =
-    _dylib.lookupFunction<_c_clang_getTypeDeclaration_wrap,
-        _dart_clang_getTypeDeclaration_wrap>('clang_getTypeDeclaration_wrap');
-
-typedef _c_clang_getTypeDeclaration_wrap = ffi.Pointer<CXCursor> Function(
-  ffi.Pointer<CXType> cxtype,
-);
-
-typedef _dart_clang_getTypeDeclaration_wrap = ffi.Pointer<CXCursor> Function(
-  ffi.Pointer<CXType> cxtype,
-);
-
-ffi.Pointer<CXString> clang_getTypeKindSpelling_wrap(
-  int typeKind,
-) {
-  return _clang_getTypeKindSpelling_wrap(
-    typeKind,
-  );
-}
-
-final _dart_clang_getTypeKindSpelling_wrap _clang_getTypeKindSpelling_wrap =
-    _dylib.lookupFunction<_c_clang_getTypeKindSpelling_wrap,
-        _dart_clang_getTypeKindSpelling_wrap>('clang_getTypeKindSpelling_wrap');
-
-typedef _c_clang_getTypeKindSpelling_wrap = ffi.Pointer<CXString> Function(
-  ffi.Int32 typeKind,
-);
-
-typedef _dart_clang_getTypeKindSpelling_wrap = ffi.Pointer<CXString> Function(
-  int typeKind,
-);
-
-ffi.Pointer<CXString> clang_getTypeSpelling_wrap(
-  ffi.Pointer<CXType> type,
-) {
-  return _clang_getTypeSpelling_wrap(
-    type,
-  );
-}
-
-final _dart_clang_getTypeSpelling_wrap _clang_getTypeSpelling_wrap =
-    _dylib.lookupFunction<_c_clang_getTypeSpelling_wrap,
-        _dart_clang_getTypeSpelling_wrap>('clang_getTypeSpelling_wrap');
-
-typedef _c_clang_getTypeSpelling_wrap = ffi.Pointer<CXString> Function(
-  ffi.Pointer<CXType> type,
-);
-
-typedef _dart_clang_getTypeSpelling_wrap = ffi.Pointer<CXString> Function(
-  ffi.Pointer<CXType> type,
-);
-
-ffi.Pointer<CXType> clang_getTypedefDeclUnderlyingType_wrap(
-  ffi.Pointer<CXCursor> cxcursor,
-) {
-  return _clang_getTypedefDeclUnderlyingType_wrap(
-    cxcursor,
-  );
-}
-
-final _dart_clang_getTypedefDeclUnderlyingType_wrap
-    _clang_getTypedefDeclUnderlyingType_wrap = _dylib.lookupFunction<
-            _c_clang_getTypedefDeclUnderlyingType_wrap,
-            _dart_clang_getTypedefDeclUnderlyingType_wrap>(
-        'clang_getTypedefDeclUnderlyingType_wrap');
-
-typedef _c_clang_getTypedefDeclUnderlyingType_wrap = ffi.Pointer<CXType>
-    Function(
-  ffi.Pointer<CXCursor> cxcursor,
-);
-
-typedef _dart_clang_getTypedefDeclUnderlyingType_wrap = ffi.Pointer<CXType>
-    Function(
-  ffi.Pointer<CXCursor> cxcursor,
-);
-
-/// Index the given source file and the translation unit corresponding
-/// to that file via callbacks implemented through #IndexerCallbacks.
-///
-/// \param client_data pointer data supplied by the client, which will
-/// be passed to the invoked callbacks.
-///
-/// \param index_callbacks Pointer to indexing callbacks that the client
-/// implements.
-///
-/// \param index_callbacks_size Size of #IndexerCallbacks structure that gets
-/// passed in index_callbacks.
-///
-/// \param index_options A bitmask of options that affects how indexing is
-/// performed. This should be a bitwise OR of the CXIndexOpt_XXX flags.
-///
-/// \param[out] out_TU pointer to store a \c CXTranslationUnit that can be
-/// reused after indexing is finished. Set to \c NULL if you do not require it.
-///
-/// \returns 0 on success or if there were errors from which the compiler could
-/// recover.  If there is a failure from which there is no recovery, returns
-/// a non-zero \c CXErrorCode.
-///
-/// The rest of the parameters are the same as #clang_parseTranslationUnit.
-int clang_indexSourceFile(
-  ffi.Pointer<ffi.Void> arg0,
-  ffi.Pointer<ffi.Void> 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<ffi.Pointer<CXTranslationUnitImpl>> out_TU,
-  int TU_options,
-) {
-  return _clang_indexSourceFile(
-    arg0,
-    client_data,
-    index_callbacks,
-    index_callbacks_size,
-    index_options,
-    source_filename,
-    command_line_args,
-    num_command_line_args,
-    unsaved_files,
-    num_unsaved_files,
-    out_TU,
-    TU_options,
-  );
-}
-
-final _dart_clang_indexSourceFile _clang_indexSourceFile = _dylib
-    .lookupFunction<_c_clang_indexSourceFile, _dart_clang_indexSourceFile>(
-        'clang_indexSourceFile');
-
-typedef _c_clang_indexSourceFile = ffi.Int32 Function(
-  ffi.Pointer<ffi.Void> arg0,
-  ffi.Pointer<ffi.Void> 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<ffi.Pointer<CXTranslationUnitImpl>> out_TU,
-  ffi.Uint32 TU_options,
-);
-
-typedef _dart_clang_indexSourceFile = int Function(
-  ffi.Pointer<ffi.Void> arg0,
-  ffi.Pointer<ffi.Void> 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<ffi.Pointer<CXTranslationUnitImpl>> out_TU,
-  int TU_options,
-);
-
-/// Same as clang_indexSourceFile but requires a full command line
-/// for \c command_line_args including argv[0]. This is useful if the standard
-/// library paths are relative to the binary.
-int clang_indexSourceFileFullArgv(
-  ffi.Pointer<ffi.Void> arg0,
-  ffi.Pointer<ffi.Void> 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<ffi.Pointer<CXTranslationUnitImpl>> out_TU,
-  int TU_options,
-) {
-  return _clang_indexSourceFileFullArgv(
-    arg0,
-    client_data,
-    index_callbacks,
-    index_callbacks_size,
-    index_options,
-    source_filename,
-    command_line_args,
-    num_command_line_args,
-    unsaved_files,
-    num_unsaved_files,
-    out_TU,
-    TU_options,
-  );
-}
-
-final _dart_clang_indexSourceFileFullArgv _clang_indexSourceFileFullArgv =
-    _dylib.lookupFunction<_c_clang_indexSourceFileFullArgv,
-        _dart_clang_indexSourceFileFullArgv>('clang_indexSourceFileFullArgv');
-
-typedef _c_clang_indexSourceFileFullArgv = ffi.Int32 Function(
-  ffi.Pointer<ffi.Void> arg0,
-  ffi.Pointer<ffi.Void> 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<ffi.Pointer<CXTranslationUnitImpl>> out_TU,
-  ffi.Uint32 TU_options,
-);
-
-typedef _dart_clang_indexSourceFileFullArgv = int Function(
-  ffi.Pointer<ffi.Void> arg0,
-  ffi.Pointer<ffi.Void> 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<ffi.Pointer<CXTranslationUnitImpl>> out_TU,
-  int TU_options,
-);
-
-/// Index the given translation unit via callbacks implemented through
-/// #IndexerCallbacks.
-///
-/// The order of callback invocations is not guaranteed to be the same as
-/// when indexing a source file. The high level order will be:
-///
-/// -Preprocessor callbacks invocations
-/// -Declaration/reference callbacks invocations
-/// -Diagnostic callback invocations
-///
-/// The parameters are the same as #clang_indexSourceFile.
-///
-/// \returns If there is a failure from which there is no recovery, returns
-/// non-zero, otherwise returns 0.
-int clang_indexTranslationUnit(
-  ffi.Pointer<ffi.Void> arg0,
-  ffi.Pointer<ffi.Void> client_data,
-  ffi.Pointer<IndexerCallbacks> index_callbacks,
-  int index_callbacks_size,
-  int index_options,
-  ffi.Pointer<CXTranslationUnitImpl> arg5,
-) {
-  return _clang_indexTranslationUnit(
-    arg0,
-    client_data,
-    index_callbacks,
-    index_callbacks_size,
-    index_options,
-    arg5,
-  );
-}
-
-final _dart_clang_indexTranslationUnit _clang_indexTranslationUnit =
-    _dylib.lookupFunction<_c_clang_indexTranslationUnit,
-        _dart_clang_indexTranslationUnit>('clang_indexTranslationUnit');
-
-typedef _c_clang_indexTranslationUnit = ffi.Int32 Function(
-  ffi.Pointer<ffi.Void> arg0,
-  ffi.Pointer<ffi.Void> client_data,
-  ffi.Pointer<IndexerCallbacks> index_callbacks,
-  ffi.Uint32 index_callbacks_size,
-  ffi.Uint32 index_options,
-  ffi.Pointer<CXTranslationUnitImpl> arg5,
-);
-
-typedef _dart_clang_indexTranslationUnit = int Function(
-  ffi.Pointer<ffi.Void> arg0,
-  ffi.Pointer<ffi.Void> client_data,
-  ffi.Pointer<IndexerCallbacks> index_callbacks,
-  int index_callbacks_size,
-  int index_options,
-  ffi.Pointer<CXTranslationUnitImpl> arg5,
-);
-
-ffi.Pointer<CXIdxCXXClassDeclInfo> clang_index_getCXXClassDeclInfo(
-  ffi.Pointer<CXIdxDeclInfo> arg0,
-) {
-  return _clang_index_getCXXClassDeclInfo(
-    arg0,
-  );
-}
-
-final _dart_clang_index_getCXXClassDeclInfo _clang_index_getCXXClassDeclInfo =
-    _dylib.lookupFunction<_c_clang_index_getCXXClassDeclInfo,
-            _dart_clang_index_getCXXClassDeclInfo>(
-        'clang_index_getCXXClassDeclInfo');
-
-typedef _c_clang_index_getCXXClassDeclInfo = ffi.Pointer<CXIdxCXXClassDeclInfo>
-    Function(
-  ffi.Pointer<CXIdxDeclInfo> arg0,
-);
-
-typedef _dart_clang_index_getCXXClassDeclInfo
-    = ffi.Pointer<CXIdxCXXClassDeclInfo> Function(
-  ffi.Pointer<CXIdxDeclInfo> arg0,
-);
-
-/// For retrieving a custom CXIdxClientContainer attached to a
-/// container.
-ffi.Pointer<ffi.Void> clang_index_getClientContainer(
-  ffi.Pointer<CXIdxContainerInfo> arg0,
-) {
-  return _clang_index_getClientContainer(
-    arg0,
-  );
-}
-
-final _dart_clang_index_getClientContainer _clang_index_getClientContainer =
-    _dylib.lookupFunction<_c_clang_index_getClientContainer,
-        _dart_clang_index_getClientContainer>('clang_index_getClientContainer');
-
-typedef _c_clang_index_getClientContainer = ffi.Pointer<ffi.Void> Function(
-  ffi.Pointer<CXIdxContainerInfo> arg0,
-);
-
-typedef _dart_clang_index_getClientContainer = ffi.Pointer<ffi.Void> Function(
-  ffi.Pointer<CXIdxContainerInfo> arg0,
-);
-
-/// For retrieving a custom CXIdxClientEntity attached to an entity.
-ffi.Pointer<ffi.Void> clang_index_getClientEntity(
-  ffi.Pointer<CXIdxEntityInfo> arg0,
-) {
-  return _clang_index_getClientEntity(
-    arg0,
-  );
-}
-
-final _dart_clang_index_getClientEntity _clang_index_getClientEntity =
-    _dylib.lookupFunction<_c_clang_index_getClientEntity,
-        _dart_clang_index_getClientEntity>('clang_index_getClientEntity');
-
-typedef _c_clang_index_getClientEntity = ffi.Pointer<ffi.Void> Function(
-  ffi.Pointer<CXIdxEntityInfo> arg0,
-);
-
-typedef _dart_clang_index_getClientEntity = ffi.Pointer<ffi.Void> Function(
-  ffi.Pointer<CXIdxEntityInfo> arg0,
-);
-
-ffi.Pointer<CXIdxIBOutletCollectionAttrInfo>
-    clang_index_getIBOutletCollectionAttrInfo(
-  ffi.Pointer<CXIdxAttrInfo> arg0,
-) {
-  return _clang_index_getIBOutletCollectionAttrInfo(
-    arg0,
-  );
-}
-
-final _dart_clang_index_getIBOutletCollectionAttrInfo
-    _clang_index_getIBOutletCollectionAttrInfo = _dylib.lookupFunction<
-            _c_clang_index_getIBOutletCollectionAttrInfo,
-            _dart_clang_index_getIBOutletCollectionAttrInfo>(
-        'clang_index_getIBOutletCollectionAttrInfo');
-
-typedef _c_clang_index_getIBOutletCollectionAttrInfo
-    = ffi.Pointer<CXIdxIBOutletCollectionAttrInfo> Function(
-  ffi.Pointer<CXIdxAttrInfo> arg0,
-);
-
-typedef _dart_clang_index_getIBOutletCollectionAttrInfo
-    = ffi.Pointer<CXIdxIBOutletCollectionAttrInfo> Function(
-  ffi.Pointer<CXIdxAttrInfo> arg0,
-);
-
-ffi.Pointer<CXIdxObjCCategoryDeclInfo> clang_index_getObjCCategoryDeclInfo(
-  ffi.Pointer<CXIdxDeclInfo> arg0,
-) {
-  return _clang_index_getObjCCategoryDeclInfo(
-    arg0,
-  );
-}
-
-final _dart_clang_index_getObjCCategoryDeclInfo
-    _clang_index_getObjCCategoryDeclInfo = _dylib.lookupFunction<
-            _c_clang_index_getObjCCategoryDeclInfo,
-            _dart_clang_index_getObjCCategoryDeclInfo>(
-        'clang_index_getObjCCategoryDeclInfo');
-
-typedef _c_clang_index_getObjCCategoryDeclInfo
-    = ffi.Pointer<CXIdxObjCCategoryDeclInfo> Function(
-  ffi.Pointer<CXIdxDeclInfo> arg0,
-);
-
-typedef _dart_clang_index_getObjCCategoryDeclInfo
-    = ffi.Pointer<CXIdxObjCCategoryDeclInfo> Function(
-  ffi.Pointer<CXIdxDeclInfo> arg0,
-);
-
-ffi.Pointer<CXIdxObjCContainerDeclInfo> clang_index_getObjCContainerDeclInfo(
-  ffi.Pointer<CXIdxDeclInfo> arg0,
-) {
-  return _clang_index_getObjCContainerDeclInfo(
-    arg0,
-  );
-}
-
-final _dart_clang_index_getObjCContainerDeclInfo
-    _clang_index_getObjCContainerDeclInfo = _dylib.lookupFunction<
-            _c_clang_index_getObjCContainerDeclInfo,
-            _dart_clang_index_getObjCContainerDeclInfo>(
-        'clang_index_getObjCContainerDeclInfo');
-
-typedef _c_clang_index_getObjCContainerDeclInfo
-    = ffi.Pointer<CXIdxObjCContainerDeclInfo> Function(
-  ffi.Pointer<CXIdxDeclInfo> arg0,
-);
-
-typedef _dart_clang_index_getObjCContainerDeclInfo
-    = ffi.Pointer<CXIdxObjCContainerDeclInfo> Function(
-  ffi.Pointer<CXIdxDeclInfo> arg0,
-);
-
-ffi.Pointer<CXIdxObjCInterfaceDeclInfo> clang_index_getObjCInterfaceDeclInfo(
-  ffi.Pointer<CXIdxDeclInfo> arg0,
-) {
-  return _clang_index_getObjCInterfaceDeclInfo(
-    arg0,
-  );
-}
-
-final _dart_clang_index_getObjCInterfaceDeclInfo
-    _clang_index_getObjCInterfaceDeclInfo = _dylib.lookupFunction<
-            _c_clang_index_getObjCInterfaceDeclInfo,
-            _dart_clang_index_getObjCInterfaceDeclInfo>(
-        'clang_index_getObjCInterfaceDeclInfo');
-
-typedef _c_clang_index_getObjCInterfaceDeclInfo
-    = ffi.Pointer<CXIdxObjCInterfaceDeclInfo> Function(
-  ffi.Pointer<CXIdxDeclInfo> arg0,
-);
-
-typedef _dart_clang_index_getObjCInterfaceDeclInfo
-    = ffi.Pointer<CXIdxObjCInterfaceDeclInfo> Function(
-  ffi.Pointer<CXIdxDeclInfo> arg0,
-);
-
-ffi.Pointer<CXIdxObjCPropertyDeclInfo> clang_index_getObjCPropertyDeclInfo(
-  ffi.Pointer<CXIdxDeclInfo> arg0,
-) {
-  return _clang_index_getObjCPropertyDeclInfo(
-    arg0,
-  );
-}
-
-final _dart_clang_index_getObjCPropertyDeclInfo
-    _clang_index_getObjCPropertyDeclInfo = _dylib.lookupFunction<
-            _c_clang_index_getObjCPropertyDeclInfo,
-            _dart_clang_index_getObjCPropertyDeclInfo>(
-        'clang_index_getObjCPropertyDeclInfo');
-
-typedef _c_clang_index_getObjCPropertyDeclInfo
-    = ffi.Pointer<CXIdxObjCPropertyDeclInfo> Function(
-  ffi.Pointer<CXIdxDeclInfo> arg0,
-);
-
-typedef _dart_clang_index_getObjCPropertyDeclInfo
-    = ffi.Pointer<CXIdxObjCPropertyDeclInfo> Function(
-  ffi.Pointer<CXIdxDeclInfo> arg0,
-);
-
-ffi.Pointer<CXIdxObjCProtocolRefListInfo>
-    clang_index_getObjCProtocolRefListInfo(
-  ffi.Pointer<CXIdxDeclInfo> arg0,
-) {
-  return _clang_index_getObjCProtocolRefListInfo(
-    arg0,
-  );
-}
-
-final _dart_clang_index_getObjCProtocolRefListInfo
-    _clang_index_getObjCProtocolRefListInfo = _dylib.lookupFunction<
-            _c_clang_index_getObjCProtocolRefListInfo,
-            _dart_clang_index_getObjCProtocolRefListInfo>(
-        'clang_index_getObjCProtocolRefListInfo');
-
-typedef _c_clang_index_getObjCProtocolRefListInfo
-    = ffi.Pointer<CXIdxObjCProtocolRefListInfo> Function(
-  ffi.Pointer<CXIdxDeclInfo> arg0,
-);
-
-typedef _dart_clang_index_getObjCProtocolRefListInfo
-    = ffi.Pointer<CXIdxObjCProtocolRefListInfo> Function(
-  ffi.Pointer<CXIdxDeclInfo> arg0,
-);
-
-int clang_index_isEntityObjCContainerKind(
-  int arg0,
-) {
-  return _clang_index_isEntityObjCContainerKind(
-    arg0,
-  );
-}
-
-final _dart_clang_index_isEntityObjCContainerKind
-    _clang_index_isEntityObjCContainerKind = _dylib.lookupFunction<
-            _c_clang_index_isEntityObjCContainerKind,
-            _dart_clang_index_isEntityObjCContainerKind>(
-        'clang_index_isEntityObjCContainerKind');
-
-typedef _c_clang_index_isEntityObjCContainerKind = ffi.Int32 Function(
-  ffi.Int32 arg0,
-);
-
-typedef _dart_clang_index_isEntityObjCContainerKind = int Function(
-  int arg0,
-);
-
-/// For setting a custom CXIdxClientContainer attached to a
-/// container.
-void clang_index_setClientContainer(
-  ffi.Pointer<CXIdxContainerInfo> arg0,
-  ffi.Pointer<ffi.Void> arg1,
-) {
-  return _clang_index_setClientContainer(
-    arg0,
-    arg1,
-  );
-}
-
-final _dart_clang_index_setClientContainer _clang_index_setClientContainer =
-    _dylib.lookupFunction<_c_clang_index_setClientContainer,
-        _dart_clang_index_setClientContainer>('clang_index_setClientContainer');
-
-typedef _c_clang_index_setClientContainer = ffi.Void Function(
-  ffi.Pointer<CXIdxContainerInfo> arg0,
-  ffi.Pointer<ffi.Void> arg1,
-);
-
-typedef _dart_clang_index_setClientContainer = void Function(
-  ffi.Pointer<CXIdxContainerInfo> arg0,
-  ffi.Pointer<ffi.Void> arg1,
-);
-
-/// For setting a custom CXIdxClientEntity attached to an entity.
-void clang_index_setClientEntity(
-  ffi.Pointer<CXIdxEntityInfo> arg0,
-  ffi.Pointer<ffi.Void> arg1,
-) {
-  return _clang_index_setClientEntity(
-    arg0,
-    arg1,
-  );
-}
-
-final _dart_clang_index_setClientEntity _clang_index_setClientEntity =
-    _dylib.lookupFunction<_c_clang_index_setClientEntity,
-        _dart_clang_index_setClientEntity>('clang_index_setClientEntity');
-
-typedef _c_clang_index_setClientEntity = ffi.Void Function(
-  ffi.Pointer<CXIdxEntityInfo> arg0,
-  ffi.Pointer<ffi.Void> arg1,
-);
-
-typedef _dart_clang_index_setClientEntity = void Function(
-  ffi.Pointer<CXIdxEntityInfo> arg0,
-  ffi.Pointer<ffi.Void> arg1,
-);
-
-/// Determine whether the given cursor kind represents an attribute.
-int clang_isAttribute(
-  int arg0,
-) {
-  return _clang_isAttribute(
-    arg0,
-  );
-}
-
-final _dart_clang_isAttribute _clang_isAttribute =
-    _dylib.lookupFunction<_c_clang_isAttribute, _dart_clang_isAttribute>(
-        'clang_isAttribute');
-
-typedef _c_clang_isAttribute = ffi.Uint32 Function(
-  ffi.Int32 arg0,
-);
-
-typedef _dart_clang_isAttribute = int Function(
-  int arg0,
-);
-
-/// Determine whether the given cursor kind represents a declaration.
-int clang_isDeclaration(
-  int arg0,
-) {
-  return _clang_isDeclaration(
-    arg0,
-  );
-}
-
-final _dart_clang_isDeclaration _clang_isDeclaration =
-    _dylib.lookupFunction<_c_clang_isDeclaration, _dart_clang_isDeclaration>(
-        'clang_isDeclaration');
-
-typedef _c_clang_isDeclaration = ffi.Uint32 Function(
-  ffi.Int32 arg0,
-);
-
-typedef _dart_clang_isDeclaration = int Function(
-  int arg0,
-);
-
-/// Determine whether the given cursor kind represents an expression.
-int clang_isExpression(
-  int arg0,
-) {
-  return _clang_isExpression(
-    arg0,
-  );
-}
-
-final _dart_clang_isExpression _clang_isExpression =
-    _dylib.lookupFunction<_c_clang_isExpression, _dart_clang_isExpression>(
-        'clang_isExpression');
-
-typedef _c_clang_isExpression = ffi.Uint32 Function(
-  ffi.Int32 arg0,
-);
-
-typedef _dart_clang_isExpression = int Function(
-  int arg0,
-);
-
-/// Determine whether the given header is guarded against
-/// multiple inclusions, either with the conventional
-/// \#ifndef/\#define/\#endif macro guards or with \#pragma once.
-int clang_isFileMultipleIncludeGuarded(
-  ffi.Pointer<CXTranslationUnitImpl> tu,
-  ffi.Pointer<ffi.Void> file,
-) {
-  return _clang_isFileMultipleIncludeGuarded(
-    tu,
-    file,
-  );
-}
-
-final _dart_clang_isFileMultipleIncludeGuarded
-    _clang_isFileMultipleIncludeGuarded = _dylib.lookupFunction<
-            _c_clang_isFileMultipleIncludeGuarded,
-            _dart_clang_isFileMultipleIncludeGuarded>(
-        'clang_isFileMultipleIncludeGuarded');
-
-typedef _c_clang_isFileMultipleIncludeGuarded = ffi.Uint32 Function(
-  ffi.Pointer<CXTranslationUnitImpl> tu,
-  ffi.Pointer<ffi.Void> file,
-);
-
-typedef _dart_clang_isFileMultipleIncludeGuarded = int Function(
-  ffi.Pointer<CXTranslationUnitImpl> tu,
-  ffi.Pointer<ffi.Void> file,
-);
-
-/// Determine whether the given cursor kind represents an invalid
-/// cursor.
-int clang_isInvalid(
-  int arg0,
-) {
-  return _clang_isInvalid(
-    arg0,
-  );
-}
-
-final _dart_clang_isInvalid _clang_isInvalid =
-    _dylib.lookupFunction<_c_clang_isInvalid, _dart_clang_isInvalid>(
-        'clang_isInvalid');
-
-typedef _c_clang_isInvalid = ffi.Uint32 Function(
-  ffi.Int32 arg0,
-);
-
-typedef _dart_clang_isInvalid = int Function(
-  int arg0,
-);
-
-/// Determine whether the given cursor represents a preprocessing
-/// element, such as a preprocessor directive or macro instantiation.
-int clang_isPreprocessing(
-  int arg0,
-) {
-  return _clang_isPreprocessing(
-    arg0,
-  );
-}
-
-final _dart_clang_isPreprocessing _clang_isPreprocessing = _dylib
-    .lookupFunction<_c_clang_isPreprocessing, _dart_clang_isPreprocessing>(
-        'clang_isPreprocessing');
-
-typedef _c_clang_isPreprocessing = ffi.Uint32 Function(
-  ffi.Int32 arg0,
-);
-
-typedef _dart_clang_isPreprocessing = int Function(
-  int arg0,
-);
-
-/// Determine whether the given cursor kind represents a simple
-/// reference.
-///
-/// Note that other kinds of cursors (such as expressions) can also refer to
-/// other cursors. Use clang_getCursorReferenced() to determine whether a
-/// particular cursor refers to another entity.
-int clang_isReference(
-  int arg0,
-) {
-  return _clang_isReference(
-    arg0,
-  );
-}
-
-final _dart_clang_isReference _clang_isReference =
-    _dylib.lookupFunction<_c_clang_isReference, _dart_clang_isReference>(
-        'clang_isReference');
-
-typedef _c_clang_isReference = ffi.Uint32 Function(
-  ffi.Int32 arg0,
-);
-
-typedef _dart_clang_isReference = int Function(
-  int arg0,
-);
-
-/// Determine whether the given cursor kind represents a statement.
-int clang_isStatement(
-  int arg0,
-) {
-  return _clang_isStatement(
-    arg0,
-  );
-}
-
-final _dart_clang_isStatement _clang_isStatement =
-    _dylib.lookupFunction<_c_clang_isStatement, _dart_clang_isStatement>(
-        'clang_isStatement');
-
-typedef _c_clang_isStatement = ffi.Uint32 Function(
-  ffi.Int32 arg0,
-);
-
-typedef _dart_clang_isStatement = int Function(
-  int arg0,
-);
-
-/// Determine whether the given cursor kind represents a translation
-/// unit.
-int clang_isTranslationUnit(
-  int arg0,
-) {
-  return _clang_isTranslationUnit(
-    arg0,
-  );
-}
-
-final _dart_clang_isTranslationUnit _clang_isTranslationUnit = _dylib
-    .lookupFunction<_c_clang_isTranslationUnit, _dart_clang_isTranslationUnit>(
-        'clang_isTranslationUnit');
-
-typedef _c_clang_isTranslationUnit = ffi.Uint32 Function(
-  ffi.Int32 arg0,
-);
-
-typedef _dart_clang_isTranslationUnit = int Function(
-  int arg0,
-);
-
-/// Determine whether the given cursor represents a currently
-/// unexposed piece of the AST (e.g., CXCursor_UnexposedStmt).
-int clang_isUnexposed(
-  int arg0,
-) {
-  return _clang_isUnexposed(
-    arg0,
-  );
-}
-
-final _dart_clang_isUnexposed _clang_isUnexposed =
-    _dylib.lookupFunction<_c_clang_isUnexposed, _dart_clang_isUnexposed>(
-        'clang_isUnexposed');
-
-typedef _c_clang_isUnexposed = ffi.Uint32 Function(
-  ffi.Int32 arg0,
-);
-
-typedef _dart_clang_isUnexposed = int Function(
-  int arg0,
-);
-
-/// Deserialize a set of diagnostics from a Clang diagnostics bitcode
-/// file.
-///
-/// \param file The name of the file to deserialize.
-/// \param error A pointer to a enum value recording if there was a problem
-/// deserializing the diagnostics.
-/// \param errorString A pointer to a CXString for recording the error string
-/// if the file was not successfully loaded.
-///
-/// \returns A loaded CXDiagnosticSet if successful, and NULL otherwise.  These
-/// diagnostics should be released using clang_disposeDiagnosticSet().
-ffi.Pointer<ffi.Void> clang_loadDiagnostics(
-  ffi.Pointer<ffi.Int8> file,
-  ffi.Pointer<ffi.Int32> error,
-  ffi.Pointer<CXString> errorString,
-) {
-  return _clang_loadDiagnostics(
-    file,
-    error,
-    errorString,
-  );
-}
-
-final _dart_clang_loadDiagnostics _clang_loadDiagnostics = _dylib
-    .lookupFunction<_c_clang_loadDiagnostics, _dart_clang_loadDiagnostics>(
-        'clang_loadDiagnostics');
-
-typedef _c_clang_loadDiagnostics = ffi.Pointer<ffi.Void> Function(
-  ffi.Pointer<ffi.Int8> file,
-  ffi.Pointer<ffi.Int32> error,
-  ffi.Pointer<CXString> errorString,
-);
-
-typedef _dart_clang_loadDiagnostics = ffi.Pointer<ffi.Void> Function(
-  ffi.Pointer<ffi.Int8> file,
-  ffi.Pointer<ffi.Int32> error,
-  ffi.Pointer<CXString> errorString,
-);
-
-/// Same as \c clang_parseTranslationUnit2, but returns
-/// the \c CXTranslationUnit instead of an error code.  In case of an error this
-/// routine returns a \c NULL \c CXTranslationUnit, without further detailed
-/// error codes.
-ffi.Pointer<CXTranslationUnitImpl> clang_parseTranslationUnit(
-  ffi.Pointer<ffi.Void> 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,
-) {
-  return _clang_parseTranslationUnit(
-    CIdx,
-    source_filename,
-    command_line_args,
-    num_command_line_args,
-    unsaved_files,
-    num_unsaved_files,
-    options,
-  );
-}
-
-final _dart_clang_parseTranslationUnit _clang_parseTranslationUnit =
-    _dylib.lookupFunction<_c_clang_parseTranslationUnit,
-        _dart_clang_parseTranslationUnit>('clang_parseTranslationUnit');
-
-typedef _c_clang_parseTranslationUnit = ffi.Pointer<CXTranslationUnitImpl>
-    Function(
-  ffi.Pointer<ffi.Void> CIdx,
-  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.Uint32 options,
-);
-
-typedef _dart_clang_parseTranslationUnit = ffi.Pointer<CXTranslationUnitImpl>
-    Function(
-  ffi.Pointer<ffi.Void> 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,
-);
-
-/// Parse the given source file and the translation unit corresponding
-/// to that file.
-///
-/// This routine is the main entry point for the Clang C API, providing the
-/// ability to parse a source file into a translation unit that can then be
-/// queried by other functions in the API. This routine accepts a set of
-/// command-line arguments so that the compilation can be configured in the same
-/// way that the compiler is configured on the command line.
-///
-/// \param CIdx The index object with which the translation unit will be
-/// associated.
-///
-/// \param source_filename The name of the source file to load, or NULL if the
-/// source file is included in \c command_line_args.
-///
-/// \param command_line_args The command-line arguments that would be
-/// passed to the \c clang executable if it were being invoked out-of-process.
-/// These command-line options will be parsed and will affect how the translation
-/// unit is parsed. Note that the following options are ignored: '-c',
-/// '-emit-ast', '-fsyntax-only' (which is the default), and '-o \<output file>'.
-///
-/// \param num_command_line_args The number of command-line arguments in
-/// \c command_line_args.
-///
-/// \param unsaved_files the files that have not yet been saved to disk
-/// but may be required for parsing, including the contents of
-/// those files.  The contents and name of these files (as specified by
-/// CXUnsavedFile) are copied when necessary, so the client only needs to
-/// guarantee their validity until the call to this function returns.
-///
-/// \param num_unsaved_files the number of unsaved file entries in \p
-/// unsaved_files.
-///
-/// \param options A bitmask of options that affects how the translation unit
-/// is managed but not its compilation. This should be a bitwise OR of the
-/// CXTranslationUnit_XXX flags.
-///
-/// \param[out] out_TU A non-NULL pointer to store the created
-/// \c CXTranslationUnit, describing the parsed code and containing any
-/// diagnostics produced by the compiler.
-///
-/// \returns Zero on success, otherwise returns an error code.
-int clang_parseTranslationUnit2(
-  ffi.Pointer<ffi.Void> 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<ffi.Pointer<CXTranslationUnitImpl>> out_TU,
-) {
-  return _clang_parseTranslationUnit2(
-    CIdx,
-    source_filename,
-    command_line_args,
-    num_command_line_args,
-    unsaved_files,
-    num_unsaved_files,
-    options,
-    out_TU,
-  );
-}
-
-final _dart_clang_parseTranslationUnit2 _clang_parseTranslationUnit2 =
-    _dylib.lookupFunction<_c_clang_parseTranslationUnit2,
-        _dart_clang_parseTranslationUnit2>('clang_parseTranslationUnit2');
-
-typedef _c_clang_parseTranslationUnit2 = ffi.Int32 Function(
-  ffi.Pointer<ffi.Void> CIdx,
-  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.Uint32 options,
-  ffi.Pointer<ffi.Pointer<CXTranslationUnitImpl>> out_TU,
-);
-
-typedef _dart_clang_parseTranslationUnit2 = int Function(
-  ffi.Pointer<ffi.Void> 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<ffi.Pointer<CXTranslationUnitImpl>> out_TU,
-);
-
-/// Same as clang_parseTranslationUnit2 but requires a full command line
-/// for \c command_line_args including argv[0]. This is useful if the standard
-/// library paths are relative to the binary.
-int clang_parseTranslationUnit2FullArgv(
-  ffi.Pointer<ffi.Void> 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<ffi.Pointer<CXTranslationUnitImpl>> out_TU,
-) {
-  return _clang_parseTranslationUnit2FullArgv(
-    CIdx,
-    source_filename,
-    command_line_args,
-    num_command_line_args,
-    unsaved_files,
-    num_unsaved_files,
-    options,
-    out_TU,
-  );
-}
-
-final _dart_clang_parseTranslationUnit2FullArgv
-    _clang_parseTranslationUnit2FullArgv = _dylib.lookupFunction<
-            _c_clang_parseTranslationUnit2FullArgv,
-            _dart_clang_parseTranslationUnit2FullArgv>(
-        'clang_parseTranslationUnit2FullArgv');
-
-typedef _c_clang_parseTranslationUnit2FullArgv = ffi.Int32 Function(
-  ffi.Pointer<ffi.Void> CIdx,
-  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.Uint32 options,
-  ffi.Pointer<ffi.Pointer<CXTranslationUnitImpl>> out_TU,
-);
-
-typedef _dart_clang_parseTranslationUnit2FullArgv = int Function(
-  ffi.Pointer<ffi.Void> 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<ffi.Pointer<CXTranslationUnitImpl>> out_TU,
-);
-
-/// Dispose the remapping.
-void clang_remap_dispose(
-  ffi.Pointer<ffi.Void> arg0,
-) {
-  return _clang_remap_dispose(
-    arg0,
-  );
-}
-
-final _dart_clang_remap_dispose _clang_remap_dispose =
-    _dylib.lookupFunction<_c_clang_remap_dispose, _dart_clang_remap_dispose>(
-        'clang_remap_dispose');
-
-typedef _c_clang_remap_dispose = ffi.Void Function(
-  ffi.Pointer<ffi.Void> arg0,
-);
-
-typedef _dart_clang_remap_dispose = void Function(
-  ffi.Pointer<ffi.Void> arg0,
-);
-
-/// Get the original and the associated filename from the remapping.
-///
-/// \param original If non-NULL, will be set to the original filename.
-///
-/// \param transformed If non-NULL, will be set to the filename that the original
-/// is associated with.
-void clang_remap_getFilenames(
-  ffi.Pointer<ffi.Void> arg0,
-  int index,
-  ffi.Pointer<CXString> original,
-  ffi.Pointer<CXString> transformed,
-) {
-  return _clang_remap_getFilenames(
-    arg0,
-    index,
-    original,
-    transformed,
-  );
-}
-
-final _dart_clang_remap_getFilenames _clang_remap_getFilenames =
-    _dylib.lookupFunction<_c_clang_remap_getFilenames,
-        _dart_clang_remap_getFilenames>('clang_remap_getFilenames');
-
-typedef _c_clang_remap_getFilenames = ffi.Void Function(
-  ffi.Pointer<ffi.Void> arg0,
-  ffi.Uint32 index,
-  ffi.Pointer<CXString> original,
-  ffi.Pointer<CXString> transformed,
-);
-
-typedef _dart_clang_remap_getFilenames = void Function(
-  ffi.Pointer<ffi.Void> arg0,
-  int index,
-  ffi.Pointer<CXString> original,
-  ffi.Pointer<CXString> transformed,
-);
-
-/// Determine the number of remappings.
-int clang_remap_getNumFiles(
-  ffi.Pointer<ffi.Void> arg0,
-) {
-  return _clang_remap_getNumFiles(
-    arg0,
-  );
-}
-
-final _dart_clang_remap_getNumFiles _clang_remap_getNumFiles = _dylib
-    .lookupFunction<_c_clang_remap_getNumFiles, _dart_clang_remap_getNumFiles>(
-        'clang_remap_getNumFiles');
-
-typedef _c_clang_remap_getNumFiles = ffi.Uint32 Function(
-  ffi.Pointer<ffi.Void> arg0,
-);
-
-typedef _dart_clang_remap_getNumFiles = int Function(
-  ffi.Pointer<ffi.Void> arg0,
-);
-
-/// Reparse the source files that produced this translation unit.
-///
-/// This routine can be used to re-parse the source files that originally
-/// created the given translation unit, for example because those source files
-/// have changed (either on disk or as passed via \p unsaved_files). The
-/// source code will be reparsed with the same command-line options as it
-/// was originally parsed.
-///
-/// Reparsing a translation unit invalidates all cursors and source locations
-/// that refer into that translation unit. This makes reparsing a translation
-/// unit semantically equivalent to destroying the translation unit and then
-/// creating a new translation unit with the same command-line arguments.
-/// However, it may be more efficient to reparse a translation
-/// unit using this routine.
-///
-/// \param TU The translation unit whose contents will be re-parsed. The
-/// translation unit must originally have been built with
-/// \c clang_createTranslationUnitFromSourceFile().
-///
-/// \param num_unsaved_files The number of unsaved file entries in \p
-/// unsaved_files.
-///
-/// \param unsaved_files The files that have not yet been saved to disk
-/// but may be required for parsing, including the contents of
-/// those files.  The contents and name of these files (as specified by
-/// CXUnsavedFile) are copied when necessary, so the client only needs to
-/// guarantee their validity until the call to this function returns.
-///
-/// \param options A bitset of options composed of the flags in CXReparse_Flags.
-/// The function \c clang_defaultReparseOptions() produces a default set of
-/// options recommended for most uses, based on the translation unit.
-///
-/// \returns 0 if the sources could be reparsed.  A non-zero error code will be
-/// returned if reparsing was impossible, such that the translation unit is
-/// invalid. In such cases, the only valid call for \c TU is
-/// \c clang_disposeTranslationUnit(TU).  The error codes returned by this
-/// routine are described by the \c CXErrorCode enum.
-int clang_reparseTranslationUnit(
-  ffi.Pointer<CXTranslationUnitImpl> TU,
-  int num_unsaved_files,
-  ffi.Pointer<CXUnsavedFile> unsaved_files,
-  int options,
-) {
-  return _clang_reparseTranslationUnit(
-    TU,
-    num_unsaved_files,
-    unsaved_files,
-    options,
-  );
-}
-
-final _dart_clang_reparseTranslationUnit _clang_reparseTranslationUnit =
-    _dylib.lookupFunction<_c_clang_reparseTranslationUnit,
-        _dart_clang_reparseTranslationUnit>('clang_reparseTranslationUnit');
-
-typedef _c_clang_reparseTranslationUnit = ffi.Int32 Function(
-  ffi.Pointer<CXTranslationUnitImpl> TU,
-  ffi.Uint32 num_unsaved_files,
-  ffi.Pointer<CXUnsavedFile> unsaved_files,
-  ffi.Uint32 options,
-);
-
-typedef _dart_clang_reparseTranslationUnit = int Function(
-  ffi.Pointer<CXTranslationUnitImpl> TU,
-  int num_unsaved_files,
-  ffi.Pointer<CXUnsavedFile> unsaved_files,
-  int options,
-);
-
-/// Saves a translation unit into a serialized representation of
-/// that translation unit on disk.
-///
-/// Any translation unit that was parsed without error can be saved
-/// into a file. The translation unit can then be deserialized into a
-/// new \c CXTranslationUnit with \c clang_createTranslationUnit() or,
-/// if it is an incomplete translation unit that corresponds to a
-/// header, used as a precompiled header when parsing other translation
-/// units.
-///
-/// \param TU The translation unit to save.
-///
-/// \param FileName The file to which the translation unit will be saved.
-///
-/// \param options A bitmask of options that affects how the translation unit
-/// is saved. This should be a bitwise OR of the
-/// CXSaveTranslationUnit_XXX flags.
-///
-/// \returns A value that will match one of the enumerators of the CXSaveError
-/// enumeration. Zero (CXSaveError_None) indicates that the translation unit was
-/// saved successfully, while a non-zero value indicates that a problem occurred.
-int clang_saveTranslationUnit(
-  ffi.Pointer<CXTranslationUnitImpl> TU,
-  ffi.Pointer<ffi.Int8> FileName,
-  int options,
-) {
-  return _clang_saveTranslationUnit(
-    TU,
-    FileName,
-    options,
-  );
-}
-
-final _dart_clang_saveTranslationUnit _clang_saveTranslationUnit =
-    _dylib.lookupFunction<_c_clang_saveTranslationUnit,
-        _dart_clang_saveTranslationUnit>('clang_saveTranslationUnit');
-
-typedef _c_clang_saveTranslationUnit = ffi.Int32 Function(
-  ffi.Pointer<CXTranslationUnitImpl> TU,
-  ffi.Pointer<ffi.Int8> FileName,
-  ffi.Uint32 options,
-);
-
-typedef _dart_clang_saveTranslationUnit = int Function(
-  ffi.Pointer<CXTranslationUnitImpl> TU,
-  ffi.Pointer<ffi.Int8> FileName,
-  int options,
-);
-
-/// Sort the code-completion results in case-insensitive alphabetical
-/// order.
-///
-/// \param Results The set of results to sort.
-/// \param NumResults The number of results in \p Results.
-void clang_sortCodeCompletionResults(
-  ffi.Pointer<CXCompletionResult> Results,
-  int NumResults,
-) {
-  return _clang_sortCodeCompletionResults(
-    Results,
-    NumResults,
-  );
-}
-
-final _dart_clang_sortCodeCompletionResults _clang_sortCodeCompletionResults =
-    _dylib.lookupFunction<_c_clang_sortCodeCompletionResults,
-            _dart_clang_sortCodeCompletionResults>(
-        'clang_sortCodeCompletionResults');
-
-typedef _c_clang_sortCodeCompletionResults = ffi.Void Function(
-  ffi.Pointer<CXCompletionResult> Results,
-  ffi.Uint32 NumResults,
-);
-
-typedef _dart_clang_sortCodeCompletionResults = void Function(
-  ffi.Pointer<CXCompletionResult> Results,
-  int NumResults,
-);
-
-/// Suspend a translation unit in order to free memory associated with it.
-///
-/// A suspended translation unit uses significantly less memory but on the other
-/// side does not support any other calls than \c clang_reparseTranslationUnit
-/// to resume it or \c clang_disposeTranslationUnit to dispose it completely.
-int clang_suspendTranslationUnit(
-  ffi.Pointer<CXTranslationUnitImpl> arg0,
-) {
-  return _clang_suspendTranslationUnit(
-    arg0,
-  );
-}
-
-final _dart_clang_suspendTranslationUnit _clang_suspendTranslationUnit =
-    _dylib.lookupFunction<_c_clang_suspendTranslationUnit,
-        _dart_clang_suspendTranslationUnit>('clang_suspendTranslationUnit');
-
-typedef _c_clang_suspendTranslationUnit = ffi.Uint32 Function(
-  ffi.Pointer<CXTranslationUnitImpl> arg0,
-);
-
-typedef _dart_clang_suspendTranslationUnit = int Function(
-  ffi.Pointer<CXTranslationUnitImpl> arg0,
-);
-
-/// Enable/disable crash recovery.
-///
-/// \param isEnabled Flag to indicate if crash recovery is enabled.  A non-zero
-/// value enables crash recovery, while 0 disables it.
-void clang_toggleCrashRecovery(
-  int isEnabled,
-) {
-  return _clang_toggleCrashRecovery(
-    isEnabled,
-  );
-}
-
-final _dart_clang_toggleCrashRecovery _clang_toggleCrashRecovery =
-    _dylib.lookupFunction<_c_clang_toggleCrashRecovery,
-        _dart_clang_toggleCrashRecovery>('clang_toggleCrashRecovery');
-
-typedef _c_clang_toggleCrashRecovery = ffi.Void Function(
-  ffi.Uint32 isEnabled,
-);
-
-typedef _dart_clang_toggleCrashRecovery = void Function(
-  int isEnabled,
-);
-
-typedef ModifiedCXCursorVisitor_1 = ffi.Int32 Function(
-  ffi.Pointer<CXCursor>,
-  ffi.Pointer<CXCursor>,
-  ffi.Pointer<ffi.Void>,
-);
-
-/// Visitor is a function pointer with parameters having pointers to cxcursor
-/// instead of cxcursor by default.
-int clang_visitChildren_wrap(
-  ffi.Pointer<CXCursor> parent,
-  ffi.Pointer<ffi.NativeFunction<ModifiedCXCursorVisitor_1>> _modifiedVisitor,
-  ffi.Pointer<ffi.Void> clientData,
-) {
-  return _clang_visitChildren_wrap(
-    parent,
-    _modifiedVisitor,
-    clientData,
-  );
-}
-
-final _dart_clang_visitChildren_wrap _clang_visitChildren_wrap =
-    _dylib.lookupFunction<_c_clang_visitChildren_wrap,
-        _dart_clang_visitChildren_wrap>('clang_visitChildren_wrap');
-
-typedef _c_clang_visitChildren_wrap = ffi.Uint32 Function(
-  ffi.Pointer<CXCursor> parent,
-  ffi.Pointer<ffi.NativeFunction<ModifiedCXCursorVisitor_1>> _modifiedVisitor,
-  ffi.Pointer<ffi.Void> clientData,
-);
-
-typedef _dart_clang_visitChildren_wrap = int Function(
-  ffi.Pointer<CXCursor> parent,
-  ffi.Pointer<ffi.NativeFunction<ModifiedCXCursorVisitor_1>> _modifiedVisitor,
-  ffi.Pointer<ffi.Void> clientData,
-);
diff --git a/example/libclang-example/pubspec.yaml b/example/libclang-example/pubspec.yaml
index c29adb8..22acef7 100644
--- a/example/libclang-example/pubspec.yaml
+++ b/example/libclang-example/pubspec.yaml
@@ -59,8 +59,10 @@
     unsigned long long: 8
     enum: 4
 
-  # Default is 'init'
-  init-function-name: init
+  # Default is 'NativeLibrary'
+  name: 'LibClang'
+
+  description: 'Holds bindings to LibClang.'
 
   # False by default.
   array-workaround: true
diff --git a/example/simple/generated_bindings.dart b/example/simple/generated_bindings.dart
index 54409b1..1976074 100644
--- a/example/simple/generated_bindings.dart
+++ b/example/simple/generated_bindings.dart
@@ -3,27 +3,89 @@
 /// Generated by `package:ffigen`.
 import 'dart:ffi' as ffi;
 
-/// Holds the Dynamic library.
-ffi.DynamicLibrary _dylib;
+/// Bindings to `headers/example.h`.
+class NativeLibrary {
+  /// Holds the Dynamic library.
+  final ffi.DynamicLibrary _dylib;
 
-/// Initialises the Dynamic library.
-void init(ffi.DynamicLibrary dynamicLibrary) {
-  _dylib = dynamicLibrary;
+  /// The symbols are looked up in [dynamicLibrary].
+  NativeLibrary(ffi.DynamicLibrary dynamicLibrary) : _dylib = dynamicLibrary;
+
+  /// Adds 2 integers.
+  int sum(
+    int a,
+    int b,
+  ) {
+    _sum ??= _dylib.lookupFunction<_c_sum, _dart_sum>('sum');
+    return _sum(
+      a,
+      b,
+    );
+  }
+
+  _dart_sum _sum;
+
+  /// Subtracts 2 integers.
+  int subtract(
+    ffi.Pointer<ffi.Int32> a,
+    int b,
+  ) {
+    _subtract ??=
+        _dylib.lookupFunction<_c_subtract, _dart_subtract>('subtract');
+    return _subtract(
+      a,
+      b,
+    );
+  }
+
+  _dart_subtract _subtract;
+
+  /// Multiplies 2 integers, returns pointer to an integer,.
+  ffi.Pointer<ffi.Int32> multiply(
+    int a,
+    int b,
+  ) {
+    _multiply ??=
+        _dylib.lookupFunction<_c_multiply, _dart_multiply>('multiply');
+    return _multiply(
+      a,
+      b,
+    );
+  }
+
+  _dart_multiply _multiply;
+
+  /// Divides 2 integers, returns pointer to a float.
+  ffi.Pointer<ffi.Float> divide(
+    int a,
+    int b,
+  ) {
+    _divide ??= _dylib.lookupFunction<_c_divide, _dart_divide>('divide');
+    return _divide(
+      a,
+      b,
+    );
+  }
+
+  _dart_divide _divide;
+
+  /// Divides 2 floats, returns a pointer to double.
+  ffi.Pointer<ffi.Double> dividePercision(
+    ffi.Pointer<ffi.Float> a,
+    ffi.Pointer<ffi.Float> b,
+  ) {
+    _dividePercision ??=
+        _dylib.lookupFunction<_c_dividePercision, _dart_dividePercision>(
+            'dividePercision');
+    return _dividePercision(
+      a,
+      b,
+    );
+  }
+
+  _dart_dividePercision _dividePercision;
 }
 
-/// Adds 2 integers.
-int sum(
-  int a,
-  int b,
-) {
-  return _sum(
-    a,
-    b,
-  );
-}
-
-final _dart_sum _sum = _dylib.lookupFunction<_c_sum, _dart_sum>('sum');
-
 typedef _c_sum = ffi.Int32 Function(
   ffi.Int32 a,
   ffi.Int32 b,
@@ -34,20 +96,6 @@
   int b,
 );
 
-/// Subtracts 2 integers.
-int subtract(
-  ffi.Pointer<ffi.Int32> a,
-  int b,
-) {
-  return _subtract(
-    a,
-    b,
-  );
-}
-
-final _dart_subtract _subtract =
-    _dylib.lookupFunction<_c_subtract, _dart_subtract>('subtract');
-
 typedef _c_subtract = ffi.Int32 Function(
   ffi.Pointer<ffi.Int32> a,
   ffi.Int32 b,
@@ -58,20 +106,6 @@
   int b,
 );
 
-/// Multiplies 2 integers, returns pointer to an integer,.
-ffi.Pointer<ffi.Int32> multiply(
-  int a,
-  int b,
-) {
-  return _multiply(
-    a,
-    b,
-  );
-}
-
-final _dart_multiply _multiply =
-    _dylib.lookupFunction<_c_multiply, _dart_multiply>('multiply');
-
 typedef _c_multiply = ffi.Pointer<ffi.Int32> Function(
   ffi.Int32 a,
   ffi.Int32 b,
@@ -82,20 +116,6 @@
   int b,
 );
 
-/// Divides 2 integers, returns pointer to a float.
-ffi.Pointer<ffi.Float> divide(
-  int a,
-  int b,
-) {
-  return _divide(
-    a,
-    b,
-  );
-}
-
-final _dart_divide _divide =
-    _dylib.lookupFunction<_c_divide, _dart_divide>('divide');
-
 typedef _c_divide = ffi.Pointer<ffi.Float> Function(
   ffi.Int32 a,
   ffi.Int32 b,
@@ -106,21 +126,6 @@
   int b,
 );
 
-/// Divides 2 floats, returns a pointer to double.
-ffi.Pointer<ffi.Double> dividePercision(
-  ffi.Pointer<ffi.Float> a,
-  ffi.Pointer<ffi.Float> b,
-) {
-  return _dividePercision(
-    a,
-    b,
-  );
-}
-
-final _dart_dividePercision _dividePercision =
-    _dylib.lookupFunction<_c_dividePercision, _dart_dividePercision>(
-        'dividePercision');
-
 typedef _c_dividePercision = ffi.Pointer<ffi.Double> Function(
   ffi.Pointer<ffi.Float> a,
   ffi.Pointer<ffi.Float> b,
diff --git a/example/simple/pubspec.yaml b/example/simple/pubspec.yaml
index 454c138..58aaa7e 100644
--- a/example/simple/pubspec.yaml
+++ b/example/simple/pubspec.yaml
@@ -12,6 +12,8 @@
     path: '../../'
 
 ffigen:
+  name: NativeLibrary
+  description: Bindings to `headers/example.h`.
   output: 'generated_bindings.dart'
   headers:
     - 'headers/example.h'
diff --git a/lib/src/code_generator.dart b/lib/src/code_generator.dart
index 9af6dbe..9eb01b6 100644
--- a/lib/src/code_generator.dart
+++ b/lib/src/code_generator.dart
@@ -13,5 +13,5 @@
 export 'code_generator/library.dart';
 export 'code_generator/struc.dart';
 export 'code_generator/type.dart';
-export 'code_generator/typedefc.dart';
+export 'code_generator/typedef.dart';
 
diff --git a/lib/src/code_generator/binding.dart b/lib/src/code_generator/binding.dart
index f37c72c..507de6c 100644
--- a/lib/src/code_generator/binding.dart
+++ b/lib/src/code_generator/binding.dart
@@ -5,9 +5,12 @@
 import 'package:meta/meta.dart';
 
 import 'binding_string.dart';
+import 'typedef.dart';
 import 'writer.dart';
 
 /// Base class for all Bindings.
+///
+/// Do not extend directly, use [LookUpBinding] or [NoLookUpBinding].
 abstract class Binding {
   String name;
 
@@ -15,6 +18,24 @@
 
   Binding({@required this.name, this.dartDoc});
 
+  /// Return typedef dependencies.
+  List<Typedef> getTypedefDependencies(Writer w);
+
   /// Converts a Binding to its actual string representation.
+  ///
+  /// Note: This does not print the typedef dependencies.
+  /// Must call [getTypedefDependencies] first.
   BindingString toBindingString(Writer w);
 }
+
+/// Base class for bindings which look up symbols in dynamic library.
+abstract class LookUpBinding extends Binding {
+  LookUpBinding({String name, String dartDoc})
+      : super(name: name, dartDoc: dartDoc);
+}
+
+/// Base class for bindings which don't look up symbols in dynamic library.
+abstract class NoLookUpBinding extends Binding {
+  NoLookUpBinding({String name, String dartDoc})
+      : super(name: name, dartDoc: dartDoc);
+}
diff --git a/lib/src/code_generator/constant.dart b/lib/src/code_generator/constant.dart
index dd5c657..d64e7ac 100644
--- a/lib/src/code_generator/constant.dart
+++ b/lib/src/code_generator/constant.dart
@@ -2,11 +2,13 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+import 'package:ffigen/src/code_generator/typedef.dart';
 import 'package:meta/meta.dart';
 
 import 'binding.dart';
 import 'binding_string.dart';
 import 'type.dart';
+import 'utils.dart';
 import 'writer.dart';
 
 /// A simple Constant.
@@ -20,7 +22,7 @@
 /// ```dart
 /// const int name = 10;
 /// ```
-class Constant extends Binding {
+class Constant extends NoLookUpBinding {
   final Type type;
 
   /// The rawValue is pasted as it is.
@@ -41,9 +43,7 @@
     final constantName = name;
 
     if (dartDoc != null) {
-      s.write('/// ');
-      s.writeAll(dartDoc.split('\n'), '\n/// ');
-      s.write('\n');
+      s.write(makeDartDoc(dartDoc));
     }
 
     s.write('const ${type.getDartType(w)} $constantName = $rawValue;\n\n');
@@ -51,4 +51,7 @@
     return BindingString(
         type: BindingStringType.constant, string: s.toString());
   }
+
+  @override
+  List<Typedef> getTypedefDependencies(Writer w) => const [];
 }
diff --git a/lib/src/code_generator/enum_class.dart b/lib/src/code_generator/enum_class.dart
index 1baea18..f578793 100644
--- a/lib/src/code_generator/enum_class.dart
+++ b/lib/src/code_generator/enum_class.dart
@@ -2,6 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+import 'package:ffigen/src/code_generator/typedef.dart';
 import 'package:meta/meta.dart';
 
 import 'binding.dart';
@@ -23,7 +24,7 @@
 ///   static const banana = 10;
 /// }
 /// ```
-class EnumClass extends Binding {
+class EnumClass extends NoLookUpBinding {
   final List<EnumConstant> enumConstants;
 
   EnumClass({
@@ -39,9 +40,7 @@
     final enclosingClassName = name;
 
     if (dartDoc != null) {
-      s.write('/// ');
-      s.writeAll(dartDoc.split('\n'), '\n/// ');
-      s.write('\n');
+      s.write(makeDartDoc(dartDoc));
     }
 
     /// Adding [enclosingClassName] because dart doesn't allow class member
@@ -52,8 +51,7 @@
     s.write('class $enclosingClassName {\n');
     const depth = '  ';
     for (final ec in enumConstants) {
-      final enum_value_name =
-          localUniqueNamer.makeUnique(ec.name);
+      final enum_value_name = localUniqueNamer.makeUnique(ec.name);
       if (ec.dartDoc != null) {
         s.write(depth + '/// ');
         s.writeAll(ec.dartDoc.split('\n'), '\n' + depth + '/// ');
@@ -66,6 +64,9 @@
     return BindingString(
         type: BindingStringType.enumClass, string: s.toString());
   }
+
+  @override
+  List<Typedef> getTypedefDependencies(Writer w) => const [];
 }
 
 /// Represents a single value in an enum.
diff --git a/lib/src/code_generator/func.dart b/lib/src/code_generator/func.dart
index ffc1509..4c321be 100644
--- a/lib/src/code_generator/func.dart
+++ b/lib/src/code_generator/func.dart
@@ -2,11 +2,13 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+import 'package:ffigen/src/code_generator.dart';
 import 'package:meta/meta.dart';
 
 import 'binding.dart';
 import 'binding_string.dart';
 import 'type.dart';
+import 'utils.dart';
 import 'writer.dart';
 
 /// A binding for C function.
@@ -27,7 +29,7 @@
 ///
 /// typedef _dart_sum = int Function(int a, int b);
 /// ```
-class Func extends Binding {
+class Func extends LookUpBinding {
   final String lookupSymbolName;
   final Type returnType;
   final List<Parameter> parameters;
@@ -50,30 +52,70 @@
     }
   }
 
+  List<Typedef> _typedefDependencies;
+  @override
+  List<Typedef> getTypedefDependencies(Writer w) {
+    if (_typedefDependencies == null) {
+      _typedefDependencies = <Typedef>[];
+
+      /// Ensure name conflicts are resolved for [cType] and [dartType] typedefs.
+      cType.name = _uniqueTypedefName(cType.name, w);
+      dartType.name = _uniqueTypedefName(dartType.name, w);
+
+      // Add typedef's required by parameters.
+      for (final p in parameters) {
+        final base = p.type.getBaseType();
+        if (base.broadType == BroadType.NativeFunction) {
+          // Resolve name conflicts in typedef's required by parameters before using.
+          base.nativeFunc.name = _uniqueTypedefName(base.nativeFunc.name, w);
+          _typedefDependencies.add(base.nativeFunc);
+        }
+      }
+      // Add C function typedef.
+      _typedefDependencies.add(cType);
+      // Add Dart function typedef.
+      _typedefDependencies.add(dartType);
+    }
+    return _typedefDependencies;
+  }
+
+  /// Checks if typedef name is unique in both top level and wrapper level.
+  /// And only marks it as used at top-level.
+  String _uniqueTypedefName(String name, Writer w) {
+    final base = name;
+    String uniqueName = name;
+    int suffix = 0;
+    while (w.topLevelUniqueNamer.isUsed(uniqueName) ||
+        w.wrapperLevelUniqueNamer.isUsed(uniqueName)) {
+      suffix++;
+      uniqueName = base + suffix.toString();
+    }
+    w.topLevelUniqueNamer.markUsed(uniqueName);
+    return uniqueName;
+  }
+
+  Typedef _cType, _dartType;
+  Typedef get cType => _cType ??= Typedef(
+        name: '_c_$name',
+        returnType: returnType,
+        parameters: parameters,
+        typedefType: TypedefType.C,
+      );
+  Typedef get dartType => _dartType ??= Typedef(
+        name: '_dart_$name',
+        returnType: returnType,
+        parameters: parameters,
+        typedefType: TypedefType.Dart,
+      );
+
   @override
   BindingString toBindingString(Writer w) {
     final s = StringBuffer();
     final enclosingFuncName = name;
-
-    // Ensure name conflicts are resolved for typedefs generated.
-    final funcVarName = w.uniqueNamer.makeUnique('_$name');
-    final typedefC = w.uniqueNamer.makeUnique('_c_$name');
-    final typedefDart = w.uniqueNamer.makeUnique('_dart_$name');
-
-    // Write typedef's required by parameters and resolve name conflicts.
-    for (final p in parameters) {
-      final base = p.type.getBaseType();
-      if (base.broadType == BroadType.NativeFunction) {
-        base.nativeFunc.name =
-            w.uniqueNamer.makeUnique(base.nativeFunc.name);
-        s.write(base.nativeFunc.toTypedefString(w));
-      }
-    }
+    final funcVarName = w.wrapperLevelUniqueNamer.makeUnique('_$name');
 
     if (dartDoc != null) {
-      s.write('/// ');
-      s.writeAll(dartDoc.split('\n'), '\n/// ');
-      s.write('\n');
+      s.write(makeDartDoc(dartDoc));
     }
 
     // Write enclosing function.
@@ -82,30 +124,18 @@
       s.write('  ${p.type.getDartType(w)} ${p.name},\n');
     }
     s.write(') {\n');
+    s.write(
+        "$funcVarName ??= ${w.dylibIdentifier}.lookupFunction<${cType.name},${dartType.name}>('$lookupSymbolName');\n");
+
     s.write('  return $funcVarName(\n');
     for (final p in parameters) {
       s.write('    ${p.name},\n');
     }
     s.write('  );\n');
-    s.write('}\n\n');
+    s.write('}\n');
 
-    // Write function with dylib lookup.
-    s.write(
-        "final $typedefDart $funcVarName = ${w.dylibIdentifier}.lookupFunction<$typedefC,$typedefDart>('$lookupSymbolName');\n\n");
-
-    // Write typdef for C.
-    s.write('typedef $typedefC = ${returnType.getCType(w)} Function(\n');
-    for (final p in parameters) {
-      s.write('  ${p.type.getCType(w)} ${p.name},\n');
-    }
-    s.write(');\n\n');
-
-    // Write typdef for dart.
-    s.write('typedef $typedefDart = ${returnType.getDartType(w)} Function(\n');
-    for (final p in parameters) {
-      s.write('  ${p.type.getDartType(w)} ${p.name},\n');
-    }
-    s.write(');\n\n');
+    // Write function variable.
+    s.write('${dartType.name} $funcVarName;\n\n');
 
     return BindingString(type: BindingStringType.func, string: s.toString());
   }
diff --git a/lib/src/code_generator/global.dart b/lib/src/code_generator/global.dart
index 2e41d82..f1f919f 100644
--- a/lib/src/code_generator/global.dart
+++ b/lib/src/code_generator/global.dart
@@ -2,11 +2,13 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+import 'package:ffigen/src/code_generator/typedef.dart';
 import 'package:meta/meta.dart';
 
 import 'binding.dart';
 import 'binding_string.dart';
 import 'type.dart';
+import 'utils.dart';
 import 'writer.dart';
 
 /// A binding to a global variable
@@ -19,7 +21,7 @@
 /// ```dart
 /// final int a = _dylib.lookup<ffi.Int32>('a').value;
 /// ```
-class Global extends Binding {
+class Global extends LookUpBinding {
   final String lookupSymbolName;
   final Type type;
 
@@ -35,14 +37,19 @@
     final s = StringBuffer();
     final globalVarName = name;
     if (dartDoc != null) {
-      s.write('/// ');
-      s.writeAll(dartDoc.split('\n'), '\n/// ');
-      s.write('\n');
+      s.write(makeDartDoc(dartDoc));
     }
 
+    final holderVarName =
+        w.wrapperLevelUniqueNamer.makeUnique('_$globalVarName');
     s.write(
-        "final ${type.getDartType(w)} $globalVarName = ${w.dylibIdentifier}.lookup<${type.getCType(w)}>('$lookupSymbolName').value;\n\n");
+        '${w.ffiLibraryPrefix}.Pointer<${type.getCType(w)}> $holderVarName;\n');
+    s.write(
+        "${type.getDartType(w)} get $globalVarName => ($holderVarName ??= ${w.dylibIdentifier}.lookup<${type.getCType(w)}>('$lookupSymbolName')).value;\n\n");
 
     return BindingString(type: BindingStringType.global, string: s.toString());
   }
+
+  @override
+  List<Typedef> getTypedefDependencies(Writer w) => const [];
 }
diff --git a/lib/src/code_generator/library.dart b/lib/src/code_generator/library.dart
index 027c1f1..13a7340 100644
--- a/lib/src/code_generator/library.dart
+++ b/lib/src/code_generator/library.dart
@@ -22,29 +22,50 @@
   Writer get writer => _writer;
 
   Library({
+    @required String name,
+    String description,
     @required this.bindings,
     String header,
-    String initFunctionIdentifier = 'init',
   }) {
-    // Handle any declaration-declaration name conflict.
-    final declConflictHandler = UniqueNamer({});
-    for (final b in bindings) {
+    // Seperate bindings which require lookup.
+    final lookUpBindings = bindings.whereType<LookUpBinding>().toList();
+    final noLookUpBindings = bindings.whereType<NoLookUpBinding>().toList();
+
+    /// Handle any declaration-declaration name conflict in [lookUpBindings].
+    final lookUpDeclConflictHandler = UniqueNamer({});
+    for (final b in lookUpBindings) {
       // Print warning if name was conflicting and has been changed.
-      if (declConflictHandler.isUsed(b.name)) {
+      if (lookUpDeclConflictHandler.isUsed(b.name)) {
         final oldName = b.name;
-        b.name = declConflictHandler.makeUnique(b.name);
+        b.name = lookUpDeclConflictHandler.makeUnique(b.name);
 
         _logger.warning(
             "Resolved name conflict: Declaration '$oldName' and has been renamed to '${b.name}'.");
       } else {
-        declConflictHandler.markUsed(b.name);
+        lookUpDeclConflictHandler.markUsed(b.name);
       }
     }
 
-    final declarationNames = bindings.map((e) => e.name).toSet();
+    /// Handle any declaration-declaration name conflict in [noLookUpBindings].
+    final noLookUpDeclConflictHandler = UniqueNamer({});
+    for (final b in noLookUpBindings) {
+      // Print warning if name was conflicting and has been changed.
+      if (noLookUpDeclConflictHandler.isUsed(b.name)) {
+        final oldName = b.name;
+        b.name = noLookUpDeclConflictHandler.makeUnique(b.name);
+
+        _logger.warning(
+            "Resolved name conflict: Declaration '$oldName' and has been renamed to '${b.name}'.");
+      } else {
+        noLookUpDeclConflictHandler.markUsed(b.name);
+      }
+    }
+
     _writer = Writer(
-      usedUpNames: declarationNames,
-      initFunctionIdentifier: initFunctionIdentifier,
+      lookUpBindings: lookUpBindings,
+      noLookUpBindings: noLookUpBindings,
+      className: name,
+      classDocComment: description,
       header: header,
     );
   }
@@ -64,13 +85,6 @@
     }
   }
 
-  /// Generates bindings and stores it in given [Writer].
-  void _generate(Writer w) {
-    for (final b in bindings) {
-      w.addBindingString(b.toBindingString(w));
-    }
-  }
-
   /// Formats a file using `dartfmt`.
   void _dartFmt(String path) {
     final result = Process.runSync('dartfmt', ['-w', path],
@@ -83,7 +97,6 @@
   /// Generates the bindings.
   String generate() {
     final w = writer;
-    _generate(w);
     return w.generate();
   }
 
diff --git a/lib/src/code_generator/struc.dart b/lib/src/code_generator/struc.dart
index 949c239..7c41a47 100644
--- a/lib/src/code_generator/struc.dart
+++ b/lib/src/code_generator/struc.dart
@@ -2,6 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+import 'package:ffigen/src/code_generator/typedef.dart';
 import 'package:meta/meta.dart';
 
 import 'binding.dart';
@@ -34,7 +35,7 @@
 ///
 /// }
 /// ```
-class Struc extends Binding {
+class Struc extends NoLookUpBinding {
   List<Member> members;
 
   Struc({
@@ -54,29 +55,36 @@
     return array;
   }
 
+  List<Typedef> _typedefDependencies;
+  @override
+  List<Typedef> getTypedefDependencies(Writer w) {
+    if (_typedefDependencies == null) {
+      _typedefDependencies = <Typedef>[];
+
+      // Write typedef's required by members and resolve name conflicts.
+      for (final m in members) {
+        final base = m.type.getBaseType();
+        if (base.broadType == BroadType.NativeFunction) {
+          base.nativeFunc.name =
+              w.topLevelUniqueNamer.makeUnique(base.nativeFunc.name);
+          _typedefDependencies.add(base.nativeFunc);
+        }
+      }
+    }
+    return _typedefDependencies;
+  }
+
   @override
   BindingString toBindingString(Writer w) {
     members = members ?? [];
     final s = StringBuffer();
     final enclosingClassName = name;
     if (dartDoc != null) {
-      s.write('/// ');
-      s.writeAll(dartDoc.split('\n'), '\n/// ');
-      s.write('\n');
+      s.write(makeDartDoc(dartDoc));
     }
 
     final helpers = <ArrayHelper>[];
 
-    // Write typedef's required by members and resolve name conflicts.
-    for (final m in members) {
-      final base = m.type.getBaseType();
-      if (base.broadType == BroadType.NativeFunction) {
-        base.nativeFunc.name =
-            w.uniqueNamer.makeUnique(base.nativeFunc.name);
-        s.write(base.nativeFunc.toTypedefString(w));
-      }
-    }
-
     final expandedArrayItemPrefix = getUniqueExpandedArrayItemPrefix();
 
     /// Adding [enclosingClassName] because dart doesn't allow class member
diff --git a/lib/src/code_generator/type.dart b/lib/src/code_generator/type.dart
index a07b776..ad69ea4 100644
--- a/lib/src/code_generator/type.dart
+++ b/lib/src/code_generator/type.dart
@@ -5,7 +5,7 @@
 import 'package:meta/meta.dart';
 
 import 'struc.dart';
-import 'typedefc.dart';
+import 'typedef.dart';
 import 'writer.dart';
 
 class _SubType {
@@ -67,8 +67,8 @@
   /// Reference to the [Struc] binding this type refers to.
   Struc struc;
 
-  /// Reference to the [TypedefC] this type refers to.
-  TypedefC nativeFunc;
+  /// Reference to the [Typedef] this type refers to.
+  Typedef nativeFunc;
 
   /// For providing [SupportedNativeType] only.
   final SupportedNativeType nativeType;
@@ -101,7 +101,7 @@
   factory Type.struct(Struc struc) {
     return Type._(broadType: BroadType.Struct, struc: struc);
   }
-  factory Type.nativeFunc(TypedefC nativeFunc) {
+  factory Type.nativeFunc(Typedef nativeFunc) {
     return Type._(broadType: BroadType.NativeFunction, nativeFunc: nativeFunc);
   }
   factory Type.nativeType(SupportedNativeType nativeType) {
diff --git a/lib/src/code_generator/typedef.dart b/lib/src/code_generator/typedef.dart
new file mode 100644
index 0000000..17b6dee
--- /dev/null
+++ b/lib/src/code_generator/typedef.dart
@@ -0,0 +1,67 @@
+// Copyright (c) 2020, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:ffigen/src/code_generator.dart';
+import 'package:meta/meta.dart';
+
+import 'func.dart' show Parameter;
+import 'type.dart';
+import 'utils.dart';
+import 'writer.dart';
+
+/// A simple typedef, Expands to -
+///
+/// ```dart
+/// typedef $name = $returnType Function(
+///   $parameter1...,
+///   $parameter2...,
+///   .
+///   .
+/// );
+/// ```
+/// Return/Parameter types can be of for C/Dart signarture depending on [typedefType].
+///
+/// Note: re-set [name] after resolving name conflicts.
+class Typedef {
+  String name;
+  String dartDoc;
+  final Type returnType;
+  final TypedefType typedefType;
+  final List<Parameter> parameters;
+
+  Typedef({
+    @required this.name,
+    this.dartDoc,
+    @required this.returnType,
+    @required this.typedefType,
+    List<Parameter> parameters,
+  }) : parameters = parameters ?? [];
+
+  String toTypedefString(Writer w) {
+    final s = StringBuffer();
+    if (dartDoc != null) {
+      s.write(makeDartDoc(dartDoc));
+    }
+    final typedefName = name;
+
+    if (typedefType == TypedefType.C) {
+      s.write('typedef $typedefName = ${returnType.getCType(w)} Function(\n');
+      for (final p in parameters) {
+        s.write('  ${p.type.getCType(w)} ${p.name},\n');
+      }
+      s.write(');\n\n');
+    } else {
+      s.write(
+          'typedef $typedefName = ${returnType.getDartType(w)} Function(\n');
+      for (final p in parameters) {
+        s.write('  ${p.type.getDartType(w)} ${p.name},\n');
+      }
+      s.write(');\n\n');
+    }
+
+    return s.toString();
+  }
+}
+
+enum TypedefType { C, Dart }
diff --git a/lib/src/code_generator/typedefc.dart b/lib/src/code_generator/typedefc.dart
deleted file mode 100644
index 28075aa..0000000
--- a/lib/src/code_generator/typedefc.dart
+++ /dev/null
@@ -1,54 +0,0 @@
-// Copyright (c) 2020, the Dart project authors. Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-import 'package:meta/meta.dart';
-
-import 'func.dart' show Parameter;
-import 'type.dart';
-import 'writer.dart';
-
-/// A simple typedef function for C functions, Expands to -
-///
-/// ```dart
-/// typedef $name = $returnType Function(
-///   $parameter1...,
-///   $parameter2...,
-///   .
-///   .
-/// );
-/// ```
-/// Used for generating typedefs for `Pointer<NativeFunction>`.
-///
-/// Name conflict resolution must be done before using.
-class TypedefC {
-  String name;
-  String dartDoc;
-  final Type returnType;
-  final List<Parameter> parameters;
-
-  TypedefC({
-    @required this.name,
-    this.dartDoc,
-    @required this.returnType,
-    List<Parameter> parameters,
-  }) : parameters = parameters ?? [];
-
-  String toTypedefString(Writer w) {
-    final s = StringBuffer();
-
-    if (dartDoc != null) {
-      s.write('/// ');
-      s.writeAll(dartDoc.split('\n'), '\n/// ');
-      s.write('\n');
-    }
-
-    s.write('typedef $name = ${returnType.getCType(w)} Function(\n');
-    for (final p in parameters) {
-      s.write('  ${p.type.getCType(w)} ${p.name},\n');
-    }
-    s.write(');\n\n');
-
-    return s.toString();
-  }
-}
diff --git a/lib/src/code_generator/utils.dart b/lib/src/code_generator/utils.dart
index fbb1cce..800b7f8 100644
--- a/lib/src/code_generator/utils.dart
+++ b/lib/src/code_generator/utils.dart
@@ -35,3 +35,15 @@
     return !_usedUpNames.contains(name);
   }
 }
+
+/// Converts [text] to a dart doc comment.
+///
+/// Comment is split on new lines only.
+String makeDartDoc(String text) {
+  final s = StringBuffer();
+  s.write('/// ');
+  s.writeAll(text.split('\n'), '\n/// ');
+  s.write('\n');
+
+  return s.toString();
+}
diff --git a/lib/src/code_generator/writer.dart b/lib/src/code_generator/writer.dart
index aa8129c..55a451a 100644
--- a/lib/src/code_generator/writer.dart
+++ b/lib/src/code_generator/writer.dart
@@ -5,48 +5,74 @@
 import 'package:ffigen/src/code_generator/utils.dart';
 import 'package:meta/meta.dart';
 
-import 'binding_string.dart';
+import 'binding.dart';
+import 'typedef.dart';
 
 /// To store generated String bindings.
 class Writer {
   final String header;
-  String _initFunctionIdentifier;
 
-  final UniqueNamer uniqueNamer;
+  /// Holds bindings, which lookup symbols.
+  final List<Binding> lookUpBindings;
+
+  /// Holds bindings which don't lookup symbols.
+  final List<Binding> noLookUpBindings;
+
+  String _className;
+  final String classDocComment;
 
   String _ffiLibraryPrefix;
-  String get ffiLibraryPrefix =>
-      _ffiLibraryPrefix ??= uniqueNamer.makeUnique('ffi');
+  String get ffiLibraryPrefix => _ffiLibraryPrefix;
 
   String _dylibIdentifier;
-  String get dylibIdentifier =>
-      _dylibIdentifier ??= uniqueNamer.makeUnique('_dylib');
+  String get dylibIdentifier => _dylibIdentifier;
+
+  UniqueNamer _topLevelUniqueNamer, _wrapperLevelUniqueNamer;
+  UniqueNamer get topLevelUniqueNamer => _topLevelUniqueNamer;
+  UniqueNamer get wrapperLevelUniqueNamer => _wrapperLevelUniqueNamer;
 
   String _arrayHelperClassPrefix;
 
   /// Guaranteed to be a unique prefix.
   String get arrayHelperClassPrefix => _arrayHelperClassPrefix;
 
-  final List<BindingString> _bindings = [];
-
-  /// [usedUpNames] should contain names of all the declarations which are
+  /// [_usedUpNames] should contain names of all the declarations which are
   /// already used. This is used to avoid name collisions.
   Writer({
-    @required Set<String> usedUpNames,
-    String initFunctionIdentifier = 'init',
+    @required this.lookUpBindings,
+    @required this.noLookUpBindings,
+    @required String className,
+    this.classDocComment,
     this.header,
-  })  : uniqueNamer = UniqueNamer(usedUpNames),
-        assert(initFunctionIdentifier != null) {
-    _initFunctionIdentifier =
-        uniqueNamer.makeUnique(initFunctionIdentifier);
+  }) : assert(className != null) {
+    final globalLevelNameSet = noLookUpBindings.map((e) => e.name).toSet();
+    final wrapperLevelNameSet = lookUpBindings.map((e) => e.name).toSet();
+    final allNameSet = <String>{}
+      ..addAll(globalLevelNameSet)
+      ..addAll(wrapperLevelNameSet);
+
+    _topLevelUniqueNamer = UniqueNamer(globalLevelNameSet);
+    _wrapperLevelUniqueNamer = UniqueNamer(wrapperLevelNameSet);
+    final allLevelsUniqueNamer = UniqueNamer(allNameSet);
+
+    /// Wrapper class name must be unique among all names.
+    _className = allLevelsUniqueNamer.makeUnique(className);
+    wrapperLevelUniqueNamer.markUsed(_className);
+    topLevelUniqueNamer.markUsed(_className);
+
+    /// [_ffiLibraryPrefix] should be unique in top level.
+    _ffiLibraryPrefix = topLevelUniqueNamer.makeUnique('ffi');
+
+    /// [_dylibIdentifier] should be unique in top level.
+    _dylibIdentifier = wrapperLevelUniqueNamer.makeUnique('_dylib');
 
     /// Finding a unique prefix for Array Helper Classes and store into
     /// [_arrayHelperClassPrefix].
     final base = 'ArrayHelper';
     _arrayHelperClassPrefix = base;
     int suffixInt = 0;
-    for (int i = 0; i < usedUpNames.length; i++) {
-      if (usedUpNames.elementAt(i).startsWith(_arrayHelperClassPrefix)) {
+    for (int i = 0; i < allNameSet.length; i++) {
+      if (allNameSet.elementAt(i).startsWith(_arrayHelperClassPrefix)) {
         // Not a unique prefix, start over with a new suffix.
         i = -1;
         suffixInt++;
@@ -54,6 +80,8 @@
       }
     }
   }
+
+  /// Writes all bindings to a String.
   String generate() {
     final s = StringBuffer();
 
@@ -63,35 +91,57 @@
       s.write('\n');
     } else {
       // Write default header, in case none was provided.
-      s.write('''/// AUTO GENERATED FILE, DO NOT EDIT.
-///
-/// Generated by `package:ffigen`.
-''');
+      s.write(makeDartDoc(
+          'AUTO GENERATED FILE, DO NOT EDIT.\n\nGenerated by `package:ffigen`.'));
     }
 
     // Write neccesary imports.
     s.write("import 'dart:ffi' as $ffiLibraryPrefix;\n");
     s.write('\n');
 
-    // Write dylib.
-    s.write('/// Holds the Dynamic library.\n');
-    s.write('$ffiLibraryPrefix.DynamicLibrary ${dylibIdentifier};\n');
-    s.write('\n');
-    s.write('/// Initialises the Dynamic library.\n');
-    s.write(
-        'void $_initFunctionIdentifier($ffiLibraryPrefix.DynamicLibrary dynamicLibrary){\n');
-    s.write('  ${dylibIdentifier} = dynamicLibrary;\n');
-    s.write('}\n');
+    final dependencies = <Typedef>[];
 
-    // Write bindings.
-    for (final bs in _bindings) {
-      s.write(bs.string);
+    /// Get typedef dependencies, these will be written at the end.
+    for (final b in lookUpBindings) {
+      dependencies.addAll(b.getTypedefDependencies(this));
+    }
+    for (final b in noLookUpBindings) {
+      dependencies.addAll(b.getTypedefDependencies(this));
+    }
+
+    /// Write [lookUpBindings].
+    if (lookUpBindings.isNotEmpty) {
+      // Write doc comment for wrapper class.
+      if (classDocComment != null) {
+        s.write(makeDartDoc(classDocComment));
+      }
+      // Write wrapper classs.
+      s.write('class $_className{\n');
+      // Write dylib.
+      s.write('/// Holds the Dynamic library.\n');
+      s.write('final $ffiLibraryPrefix.DynamicLibrary ${dylibIdentifier};\n');
+      s.write('\n');
+      //Write doc comment for wrapper class constructor.
+      s.write(makeDartDoc('The symbols are looked up in [dynamicLibrary].'));
+      // Write wrapper class constructor.
+      s.write(
+          '${_className}($ffiLibraryPrefix.DynamicLibrary dynamicLibrary): $dylibIdentifier = dynamicLibrary;\n\n');
+      for (final b in lookUpBindings) {
+        s.write(b.toBindingString(this).string);
+      }
+      s.write('}\n\n');
+    }
+
+    /// Write [noLookUpBindings].
+    for (final b in noLookUpBindings) {
+      s.write(b.toBindingString(this).string);
+    }
+
+    // Write typedef dependencies.
+    for (final d in dependencies) {
+      s.write(d.toTypedefString(this));
     }
 
     return s.toString();
   }
-
-  void addBindingString(BindingString b) {
-    _bindings.add(b);
-  }
 }
diff --git a/lib/src/config_provider/config.dart b/lib/src/config_provider/config.dart
index 7abfb66..3e6e336 100644
--- a/lib/src/config_provider/config.dart
+++ b/lib/src/config_provider/config.dart
@@ -64,11 +64,15 @@
 
   /// If tool should generate array workarounds.
   ///
-  /// If false(default), structs with inline array members will have all its members removed.
+  /// If false(default), structs with inline array members will have all its
+  /// members removed.
   bool arrayWorkaround;
 
-  /// Name of the init function used to initialise the dynamic library.
-  String initFunctionName;
+  /// Name of the wrapper class.
+  String wrapperName;
+
+  /// Doc comment for the wrapper class.
+  String wrapperDocComment;
 
   /// Header of the generated bindings.
   String preamble;
@@ -99,11 +103,13 @@
     var _result = true;
     for (final key in specs.keys) {
       final spec = specs[key];
-      if (spec.isRequired && !map.containsKey(key)) {
+      if (map.containsKey(key)) {
+        _result = _result && spec.validator(key, map[key]);
+      } else if (spec.requirement == Requirement.yes) {
         _logger.severe("Key '${key}' is required.");
         _result = false;
-      } else if (map.containsKey(key)) {
-        _result = _result && spec.validator(key, map[key]);
+      } else if (spec.requirement == Requirement.prefer) {
+        _logger.warning("Prefer adding Key '$key' to your config.");
       }
     }
     // Warn about unknown keys.
@@ -137,7 +143,7 @@
     return <String, Specification>{
       strings.output: Specification<String>(
         description: 'Output file name',
-        isRequired: true,
+        requirement: Requirement.yes,
         validator: outputValidator,
         extractor: outputExtractor,
         extractedResult: (dynamic result) => output = result as String,
@@ -145,7 +151,7 @@
       strings.libclang_dylib_folder: Specification<String>(
         description:
             'Path to folder containing libclang dynamic library, used to parse C headers',
-        isRequired: false,
+        requirement: Requirement.no,
         defaultValue: () => getDylibPath(Platform.script
             .resolve(path.join('..', 'tool', 'wrapped_libclang'))
             .toFilePath()),
@@ -156,7 +162,7 @@
       ),
       strings.headers: Specification<List<String>>(
         description: 'List of C headers to generate bindings of',
-        isRequired: true,
+        requirement: Requirement.yes,
         validator: headersValidator,
         extractor: headersExtractor,
         extractedResult: (dynamic result) => headers = result as List<String>,
@@ -172,7 +178,7 @@
       ),
       strings.compilerOpts: Specification<List<String>>(
         description: 'Raw compiler options to pass to clang compiler',
-        isRequired: false,
+        requirement: Requirement.no,
         validator: compilerOptsValidator,
         extractor: compilerOptsExtractor,
         extractedResult: (dynamic result) =>
@@ -180,7 +186,7 @@
       ),
       strings.functions: Specification<Declaration>(
         description: 'Filter for functions',
-        isRequired: false,
+        requirement: Requirement.no,
         validator: declarationConfigValidator,
         extractor: declarationConfigExtractor,
         defaultValue: () => Declaration(declarationTypeName: 'Function'),
@@ -191,7 +197,7 @@
       ),
       strings.structs: Specification<Declaration>(
         description: 'Filter for Structs',
-        isRequired: false,
+        requirement: Requirement.no,
         validator: declarationConfigValidator,
         extractor: declarationConfigExtractor,
         defaultValue: () => Declaration(declarationTypeName: 'Struct'),
@@ -202,7 +208,7 @@
       ),
       strings.enums: Specification<Declaration>(
         description: 'Filter for enums',
-        isRequired: false,
+        requirement: Requirement.no,
         validator: declarationConfigValidator,
         extractor: declarationConfigExtractor,
         defaultValue: () => Declaration(declarationTypeName: 'Enum'),
@@ -227,7 +233,7 @@
       ),
       strings.sort: Specification<bool>(
         description: 'whether or not to sort the bindings alphabetically',
-        isRequired: false,
+        requirement: Requirement.no,
         validator: booleanValidator,
         extractor: booleanExtractor,
         defaultValue: () => false,
@@ -235,7 +241,7 @@
       ),
       strings.useSupportedTypedefs: Specification<bool>(
         description: 'whether or not to directly map supported typedef by name',
-        isRequired: false,
+        requirement: Requirement.no,
         validator: booleanValidator,
         extractor: booleanExtractor,
         defaultValue: () => true,
@@ -244,7 +250,7 @@
       ),
       strings.comments: Specification<String>(
         description: 'Type of comment to extract',
-        isRequired: false,
+        requirement: Requirement.no,
         validator: commentValidator,
         extractor: commentExtractor,
         defaultValue: () => strings.brief,
@@ -253,24 +259,32 @@
       strings.arrayWorkaround: Specification<bool>(
         description:
             'whether or not to generate workarounds for inline arrays in structures',
-        isRequired: false,
+        requirement: Requirement.no,
         validator: booleanValidator,
         extractor: booleanExtractor,
         defaultValue: () => false,
         extractedResult: (dynamic result) => arrayWorkaround = result as bool,
       ),
-      strings.initFunctionName: Specification<String>(
-        description: 'Name of the init function to use',
-        isRequired: false,
+      strings.name: Specification<String>(
+        description: 'Name of the wrapper class',
+        requirement: Requirement.prefer,
+        validator: dartClassNameValidator,
+        extractor: stringExtractor,
+        defaultValue: () => 'NativeLibrary',
+        extractedResult: (dynamic result) => wrapperName = result as String,
+      ),
+      strings.description: Specification<String>(
+        description: 'Doc comment for the wrapper class',
+        requirement: Requirement.prefer,
         validator: nonEmptyStringValidator,
         extractor: stringExtractor,
-        defaultValue: () => 'init',
+        defaultValue: () => null,
         extractedResult: (dynamic result) =>
-            initFunctionName = result as String,
+            wrapperDocComment = result as String,
       ),
       strings.preamble: Specification<String>(
-        description: 'Header String for the generated bindings',
-        isRequired: false,
+        description: 'Raw header string for the generated file',
+        requirement: Requirement.no,
         validator: nonEmptyStringValidator,
         extractor: stringExtractor,
         extractedResult: (dynamic result) => preamble = result as String,
@@ -288,7 +302,7 @@
   final E Function(dynamic map) extractor;
   final E Function() defaultValue;
 
-  final bool isRequired;
+  final Requirement requirement;
   final void Function(dynamic result) extractedResult;
 
   Specification({
@@ -297,10 +311,12 @@
     @required this.validator,
     @required this.extractor,
     this.defaultValue,
-    this.isRequired = false,
+    this.requirement = Requirement.no,
   });
 }
 
+enum Requirement { yes, prefer, no }
+
 class HeaderFilter {
   Set<String> includedInclusionHeaders;
   Set<String> excludedInclusionHeaders;
diff --git a/lib/src/config_provider/spec_utils.dart b/lib/src/config_provider/spec_utils.dart
index 560cc59..70cccdd 100644
--- a/lib/src/config_provider/spec_utils.dart
+++ b/lib/src/config_provider/spec_utils.dart
@@ -280,6 +280,17 @@
   }
 }
 
+bool dartClassNameValidator(String name, dynamic value) {
+  if (value is String &&
+      RegExp('[a-zA-Z]+[_a-zA-Z0-9]*').stringMatch(value) == value) {
+    return true;
+  } else {
+    _logger.severe(
+        "Expected value of key '$name' to be a valid public class name.");
+    return false;
+  }
+}
+
 String commentExtractor(dynamic value) => value as String;
 
 bool commentValidator(String name, dynamic value) {
diff --git a/lib/src/header_parser/clang_bindings/clang_bindings.dart b/lib/src/header_parser/clang_bindings/clang_bindings.dart
index e71a162..2e6469c 100644
--- a/lib/src/header_parser/clang_bindings/clang_bindings.dart
+++ b/lib/src/header_parser/clang_bindings/clang_bindings.dart
@@ -3,55 +3,613 @@
 /// Generated by `package:ffigen`.
 import 'dart:ffi' as ffi;
 
-/// Holds the Dynamic library.
-ffi.DynamicLibrary _dylib;
+/// Holds bindings to LibClang.
+class Clang {
+  /// Holds the Dynamic library.
+  final ffi.DynamicLibrary _dylib;
 
-/// Initialises the Dynamic library.
-void init(ffi.DynamicLibrary __dylib) {
-  _dylib = __dylib;
+  /// The symbols are looked up in [dynamicLIbrary].
+  Clang(ffi.DynamicLibrary dynamicLibrary) : _dylib = dynamicLibrary;
+
+  /// Provides a shared context for creating translation units.
+  ffi.Pointer<ffi.Void> clang_createIndex(
+    int excludeDeclarationsFromPCH,
+    int displayDiagnostics,
+  ) {
+    _clang_createIndex ??=
+        _dylib.lookupFunction<_c_clang_createIndex, _dart_clang_createIndex>(
+            'clang_createIndex');
+    return _clang_createIndex(
+      excludeDeclarationsFromPCH,
+      displayDiagnostics,
+    );
+  }
+
+  _dart_clang_createIndex _clang_createIndex;
+
+  /// Destroy the given index.
+  void clang_disposeIndex(
+    ffi.Pointer<ffi.Void> index,
+  ) {
+    _clang_disposeIndex ??=
+        _dylib.lookupFunction<_c_clang_disposeIndex, _dart_clang_disposeIndex>(
+            'clang_disposeIndex');
+    return _clang_disposeIndex(
+      index,
+    );
+  }
+
+  _dart_clang_disposeIndex _clang_disposeIndex;
+
+  /// Determine the number of diagnostics produced for the given translation
+  /// unit.
+  int clang_getNumDiagnostics(
+    ffi.Pointer<CXTranslationUnitImpl> Unit,
+  ) {
+    _clang_getNumDiagnostics ??= _dylib.lookupFunction<
+        _c_clang_getNumDiagnostics,
+        _dart_clang_getNumDiagnostics>('clang_getNumDiagnostics');
+    return _clang_getNumDiagnostics(
+      Unit,
+    );
+  }
+
+  _dart_clang_getNumDiagnostics _clang_getNumDiagnostics;
+
+  /// Retrieve a diagnostic associated with the given translation unit.
+  ffi.Pointer<ffi.Void> clang_getDiagnostic(
+    ffi.Pointer<CXTranslationUnitImpl> Unit,
+    int Index,
+  ) {
+    _clang_getDiagnostic ??= _dylib.lookupFunction<_c_clang_getDiagnostic,
+        _dart_clang_getDiagnostic>('clang_getDiagnostic');
+    return _clang_getDiagnostic(
+      Unit,
+      Index,
+    );
+  }
+
+  _dart_clang_getDiagnostic _clang_getDiagnostic;
+
+  /// Destroy a diagnostic.
+  void clang_disposeDiagnostic(
+    ffi.Pointer<ffi.Void> Diagnostic,
+  ) {
+    _clang_disposeDiagnostic ??= _dylib.lookupFunction<
+        _c_clang_disposeDiagnostic,
+        _dart_clang_disposeDiagnostic>('clang_disposeDiagnostic');
+    return _clang_disposeDiagnostic(
+      Diagnostic,
+    );
+  }
+
+  _dart_clang_disposeDiagnostic _clang_disposeDiagnostic;
+
+  /// Same as clang_parseTranslationUnit2, but returns the CXTranslationUnit
+  /// instead of an error code. In case of an error this routine returns a NULL
+  /// CXTranslationUnit, without further detailed error codes.
+  ffi.Pointer<CXTranslationUnitImpl> clang_parseTranslationUnit(
+    ffi.Pointer<ffi.Void> 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,
+  ) {
+    _clang_parseTranslationUnit ??= _dylib.lookupFunction<
+        _c_clang_parseTranslationUnit,
+        _dart_clang_parseTranslationUnit>('clang_parseTranslationUnit');
+    return _clang_parseTranslationUnit(
+      CIdx,
+      source_filename,
+      command_line_args,
+      num_command_line_args,
+      unsaved_files,
+      num_unsaved_files,
+      options,
+    );
+  }
+
+  _dart_clang_parseTranslationUnit _clang_parseTranslationUnit;
+
+  /// Destroy the specified CXTranslationUnit object.
+  void clang_disposeTranslationUnit(
+    ffi.Pointer<CXTranslationUnitImpl> arg0,
+  ) {
+    _clang_disposeTranslationUnit ??= _dylib.lookupFunction<
+        _c_clang_disposeTranslationUnit,
+        _dart_clang_disposeTranslationUnit>('clang_disposeTranslationUnit');
+    return _clang_disposeTranslationUnit(
+      arg0,
+    );
+  }
+
+  _dart_clang_disposeTranslationUnit _clang_disposeTranslationUnit;
+
+  ffi.Pointer<ffi.Int8> clang_getCString_wrap(
+    ffi.Pointer<CXString> string,
+  ) {
+    _clang_getCString_wrap ??= _dylib.lookupFunction<_c_clang_getCString_wrap,
+        _dart_clang_getCString_wrap>('clang_getCString_wrap');
+    return _clang_getCString_wrap(
+      string,
+    );
+  }
+
+  _dart_clang_getCString_wrap _clang_getCString_wrap;
+
+  void clang_disposeString_wrap(
+    ffi.Pointer<CXString> string,
+  ) {
+    _clang_disposeString_wrap ??= _dylib.lookupFunction<
+        _c_clang_disposeString_wrap,
+        _dart_clang_disposeString_wrap>('clang_disposeString_wrap');
+    return _clang_disposeString_wrap(
+      string,
+    );
+  }
+
+  _dart_clang_disposeString_wrap _clang_disposeString_wrap;
+
+  int clang_getCursorKind_wrap(
+    ffi.Pointer<CXCursor> cursor,
+  ) {
+    _clang_getCursorKind_wrap ??= _dylib.lookupFunction<
+        _c_clang_getCursorKind_wrap,
+        _dart_clang_getCursorKind_wrap>('clang_getCursorKind_wrap');
+    return _clang_getCursorKind_wrap(
+      cursor,
+    );
+  }
+
+  _dart_clang_getCursorKind_wrap _clang_getCursorKind_wrap;
+
+  ffi.Pointer<CXString> clang_getCursorKindSpelling_wrap(
+    int kind,
+  ) {
+    _clang_getCursorKindSpelling_wrap ??= _dylib.lookupFunction<
+            _c_clang_getCursorKindSpelling_wrap,
+            _dart_clang_getCursorKindSpelling_wrap>(
+        'clang_getCursorKindSpelling_wrap');
+    return _clang_getCursorKindSpelling_wrap(
+      kind,
+    );
+  }
+
+  _dart_clang_getCursorKindSpelling_wrap _clang_getCursorKindSpelling_wrap;
+
+  ffi.Pointer<CXType> clang_getCursorType_wrap(
+    ffi.Pointer<CXCursor> cursor,
+  ) {
+    _clang_getCursorType_wrap ??= _dylib.lookupFunction<
+        _c_clang_getCursorType_wrap,
+        _dart_clang_getCursorType_wrap>('clang_getCursorType_wrap');
+    return _clang_getCursorType_wrap(
+      cursor,
+    );
+  }
+
+  _dart_clang_getCursorType_wrap _clang_getCursorType_wrap;
+
+  ffi.Pointer<CXString> clang_getTypeSpelling_wrap(
+    ffi.Pointer<CXType> type,
+  ) {
+    _clang_getTypeSpelling_wrap ??= _dylib.lookupFunction<
+        _c_clang_getTypeSpelling_wrap,
+        _dart_clang_getTypeSpelling_wrap>('clang_getTypeSpelling_wrap');
+    return _clang_getTypeSpelling_wrap(
+      type,
+    );
+  }
+
+  _dart_clang_getTypeSpelling_wrap _clang_getTypeSpelling_wrap;
+
+  ffi.Pointer<CXString> clang_getTypeKindSpelling_wrap(
+    int typeKind,
+  ) {
+    _clang_getTypeKindSpelling_wrap ??= _dylib.lookupFunction<
+        _c_clang_getTypeKindSpelling_wrap,
+        _dart_clang_getTypeKindSpelling_wrap>('clang_getTypeKindSpelling_wrap');
+    return _clang_getTypeKindSpelling_wrap(
+      typeKind,
+    );
+  }
+
+  _dart_clang_getTypeKindSpelling_wrap _clang_getTypeKindSpelling_wrap;
+
+  ffi.Pointer<CXType> clang_getResultType_wrap(
+    ffi.Pointer<CXType> functionType,
+  ) {
+    _clang_getResultType_wrap ??= _dylib.lookupFunction<
+        _c_clang_getResultType_wrap,
+        _dart_clang_getResultType_wrap>('clang_getResultType_wrap');
+    return _clang_getResultType_wrap(
+      functionType,
+    );
+  }
+
+  _dart_clang_getResultType_wrap _clang_getResultType_wrap;
+
+  ffi.Pointer<CXType> clang_getPointeeType_wrap(
+    ffi.Pointer<CXType> pointerType,
+  ) {
+    _clang_getPointeeType_wrap ??= _dylib.lookupFunction<
+        _c_clang_getPointeeType_wrap,
+        _dart_clang_getPointeeType_wrap>('clang_getPointeeType_wrap');
+    return _clang_getPointeeType_wrap(
+      pointerType,
+    );
+  }
+
+  _dart_clang_getPointeeType_wrap _clang_getPointeeType_wrap;
+
+  ffi.Pointer<CXType> clang_getCanonicalType_wrap(
+    ffi.Pointer<CXType> typerefType,
+  ) {
+    _clang_getCanonicalType_wrap ??= _dylib.lookupFunction<
+        _c_clang_getCanonicalType_wrap,
+        _dart_clang_getCanonicalType_wrap>('clang_getCanonicalType_wrap');
+    return _clang_getCanonicalType_wrap(
+      typerefType,
+    );
+  }
+
+  _dart_clang_getCanonicalType_wrap _clang_getCanonicalType_wrap;
+
+  ffi.Pointer<CXType> clang_Type_getNamedType_wrap(
+    ffi.Pointer<CXType> elaboratedType,
+  ) {
+    _clang_Type_getNamedType_wrap ??= _dylib.lookupFunction<
+        _c_clang_Type_getNamedType_wrap,
+        _dart_clang_Type_getNamedType_wrap>('clang_Type_getNamedType_wrap');
+    return _clang_Type_getNamedType_wrap(
+      elaboratedType,
+    );
+  }
+
+  _dart_clang_Type_getNamedType_wrap _clang_Type_getNamedType_wrap;
+
+  ffi.Pointer<CXCursor> clang_getTypeDeclaration_wrap(
+    ffi.Pointer<CXType> cxtype,
+  ) {
+    _clang_getTypeDeclaration_wrap ??= _dylib.lookupFunction<
+        _c_clang_getTypeDeclaration_wrap,
+        _dart_clang_getTypeDeclaration_wrap>('clang_getTypeDeclaration_wrap');
+    return _clang_getTypeDeclaration_wrap(
+      cxtype,
+    );
+  }
+
+  _dart_clang_getTypeDeclaration_wrap _clang_getTypeDeclaration_wrap;
+
+  ffi.Pointer<CXType> clang_getTypedefDeclUnderlyingType_wrap(
+    ffi.Pointer<CXCursor> cxcursor,
+  ) {
+    _clang_getTypedefDeclUnderlyingType_wrap ??= _dylib.lookupFunction<
+            _c_clang_getTypedefDeclUnderlyingType_wrap,
+            _dart_clang_getTypedefDeclUnderlyingType_wrap>(
+        'clang_getTypedefDeclUnderlyingType_wrap');
+    return _clang_getTypedefDeclUnderlyingType_wrap(
+      cxcursor,
+    );
+  }
+
+  _dart_clang_getTypedefDeclUnderlyingType_wrap
+      _clang_getTypedefDeclUnderlyingType_wrap;
+
+  /// The name of parameter, struct, typedef.
+  ffi.Pointer<CXString> clang_getCursorSpelling_wrap(
+    ffi.Pointer<CXCursor> cursor,
+  ) {
+    _clang_getCursorSpelling_wrap ??= _dylib.lookupFunction<
+        _c_clang_getCursorSpelling_wrap,
+        _dart_clang_getCursorSpelling_wrap>('clang_getCursorSpelling_wrap');
+    return _clang_getCursorSpelling_wrap(
+      cursor,
+    );
+  }
+
+  _dart_clang_getCursorSpelling_wrap _clang_getCursorSpelling_wrap;
+
+  ffi.Pointer<CXCursor> clang_getTranslationUnitCursor_wrap(
+    ffi.Pointer<CXTranslationUnitImpl> tu,
+  ) {
+    _clang_getTranslationUnitCursor_wrap ??= _dylib.lookupFunction<
+            _c_clang_getTranslationUnitCursor_wrap,
+            _dart_clang_getTranslationUnitCursor_wrap>(
+        'clang_getTranslationUnitCursor_wrap');
+    return _clang_getTranslationUnitCursor_wrap(
+      tu,
+    );
+  }
+
+  _dart_clang_getTranslationUnitCursor_wrap
+      _clang_getTranslationUnitCursor_wrap;
+
+  ffi.Pointer<CXString> clang_formatDiagnostic_wrap(
+    ffi.Pointer<ffi.Void> diag,
+    int opts,
+  ) {
+    _clang_formatDiagnostic_wrap ??= _dylib.lookupFunction<
+        _c_clang_formatDiagnostic_wrap,
+        _dart_clang_formatDiagnostic_wrap>('clang_formatDiagnostic_wrap');
+    return _clang_formatDiagnostic_wrap(
+      diag,
+      opts,
+    );
+  }
+
+  _dart_clang_formatDiagnostic_wrap _clang_formatDiagnostic_wrap;
+
+  /// Visitor is a function pointer with parameters having pointers to cxcursor
+  /// instead of cxcursor by default.
+  int clang_visitChildren_wrap(
+    ffi.Pointer<CXCursor> parent,
+    ffi.Pointer<ffi.NativeFunction<ModifiedCXCursorVisitor_1>> _modifiedVisitor,
+    ffi.Pointer<ffi.Void> clientData,
+  ) {
+    _clang_visitChildren_wrap ??= _dylib.lookupFunction<
+        _c_clang_visitChildren_wrap,
+        _dart_clang_visitChildren_wrap>('clang_visitChildren_wrap');
+    return _clang_visitChildren_wrap(
+      parent,
+      _modifiedVisitor,
+      clientData,
+    );
+  }
+
+  _dart_clang_visitChildren_wrap _clang_visitChildren_wrap;
+
+  int clang_Cursor_getNumArguments_wrap(
+    ffi.Pointer<CXCursor> cursor,
+  ) {
+    _clang_Cursor_getNumArguments_wrap ??= _dylib.lookupFunction<
+            _c_clang_Cursor_getNumArguments_wrap,
+            _dart_clang_Cursor_getNumArguments_wrap>(
+        'clang_Cursor_getNumArguments_wrap');
+    return _clang_Cursor_getNumArguments_wrap(
+      cursor,
+    );
+  }
+
+  _dart_clang_Cursor_getNumArguments_wrap _clang_Cursor_getNumArguments_wrap;
+
+  ffi.Pointer<CXCursor> clang_Cursor_getArgument_wrap(
+    ffi.Pointer<CXCursor> cursor,
+    int i,
+  ) {
+    _clang_Cursor_getArgument_wrap ??= _dylib.lookupFunction<
+        _c_clang_Cursor_getArgument_wrap,
+        _dart_clang_Cursor_getArgument_wrap>('clang_Cursor_getArgument_wrap');
+    return _clang_Cursor_getArgument_wrap(
+      cursor,
+      i,
+    );
+  }
+
+  _dart_clang_Cursor_getArgument_wrap _clang_Cursor_getArgument_wrap;
+
+  int clang_getNumArgTypes_wrap(
+    ffi.Pointer<CXType> cxtype,
+  ) {
+    _clang_getNumArgTypes_wrap ??= _dylib.lookupFunction<
+        _c_clang_getNumArgTypes_wrap,
+        _dart_clang_getNumArgTypes_wrap>('clang_getNumArgTypes_wrap');
+    return _clang_getNumArgTypes_wrap(
+      cxtype,
+    );
+  }
+
+  _dart_clang_getNumArgTypes_wrap _clang_getNumArgTypes_wrap;
+
+  ffi.Pointer<CXType> clang_getArgType_wrap(
+    ffi.Pointer<CXType> cxtype,
+    int i,
+  ) {
+    _clang_getArgType_wrap ??= _dylib.lookupFunction<_c_clang_getArgType_wrap,
+        _dart_clang_getArgType_wrap>('clang_getArgType_wrap');
+    return _clang_getArgType_wrap(
+      cxtype,
+      i,
+    );
+  }
+
+  _dart_clang_getArgType_wrap _clang_getArgType_wrap;
+
+  int clang_getEnumConstantDeclValue_wrap(
+    ffi.Pointer<CXCursor> cursor,
+  ) {
+    _clang_getEnumConstantDeclValue_wrap ??= _dylib.lookupFunction<
+            _c_clang_getEnumConstantDeclValue_wrap,
+            _dart_clang_getEnumConstantDeclValue_wrap>(
+        'clang_getEnumConstantDeclValue_wrap');
+    return _clang_getEnumConstantDeclValue_wrap(
+      cursor,
+    );
+  }
+
+  _dart_clang_getEnumConstantDeclValue_wrap
+      _clang_getEnumConstantDeclValue_wrap;
+
+  /// Returns non-zero if the ranges are the same, zero if they differ.
+  int clang_equalRanges_wrap(
+    ffi.Pointer<CXSourceRange> c1,
+    ffi.Pointer<CXSourceRange> c2,
+  ) {
+    _clang_equalRanges_wrap ??= _dylib.lookupFunction<_c_clang_equalRanges_wrap,
+        _dart_clang_equalRanges_wrap>('clang_equalRanges_wrap');
+    return _clang_equalRanges_wrap(
+      c1,
+      c2,
+    );
+  }
+
+  _dart_clang_equalRanges_wrap _clang_equalRanges_wrap;
+
+  /// Returns the comment range.
+  ffi.Pointer<CXSourceRange> clang_Cursor_getCommentRange_wrap(
+    ffi.Pointer<CXCursor> cursor,
+  ) {
+    _clang_Cursor_getCommentRange_wrap ??= _dylib.lookupFunction<
+            _c_clang_Cursor_getCommentRange_wrap,
+            _dart_clang_Cursor_getCommentRange_wrap>(
+        'clang_Cursor_getCommentRange_wrap');
+    return _clang_Cursor_getCommentRange_wrap(
+      cursor,
+    );
+  }
+
+  _dart_clang_Cursor_getCommentRange_wrap _clang_Cursor_getCommentRange_wrap;
+
+  /// Returns the raw comment.
+  ffi.Pointer<CXString> clang_Cursor_getRawCommentText_wrap(
+    ffi.Pointer<CXCursor> cursor,
+  ) {
+    _clang_Cursor_getRawCommentText_wrap ??= _dylib.lookupFunction<
+            _c_clang_Cursor_getRawCommentText_wrap,
+            _dart_clang_Cursor_getRawCommentText_wrap>(
+        'clang_Cursor_getRawCommentText_wrap');
+    return _clang_Cursor_getRawCommentText_wrap(
+      cursor,
+    );
+  }
+
+  _dart_clang_Cursor_getRawCommentText_wrap
+      _clang_Cursor_getRawCommentText_wrap;
+
+  /// Returns the first paragraph of doxygen doc comment.
+  ffi.Pointer<CXString> clang_Cursor_getBriefCommentText_wrap(
+    ffi.Pointer<CXCursor> cursor,
+  ) {
+    _clang_Cursor_getBriefCommentText_wrap ??= _dylib.lookupFunction<
+            _c_clang_Cursor_getBriefCommentText_wrap,
+            _dart_clang_Cursor_getBriefCommentText_wrap>(
+        'clang_Cursor_getBriefCommentText_wrap');
+    return _clang_Cursor_getBriefCommentText_wrap(
+      cursor,
+    );
+  }
+
+  _dart_clang_Cursor_getBriefCommentText_wrap
+      _clang_Cursor_getBriefCommentText_wrap;
+
+  ffi.Pointer<CXSourceLocation> clang_getCursorLocation_wrap(
+    ffi.Pointer<CXCursor> cursor,
+  ) {
+    _clang_getCursorLocation_wrap ??= _dylib.lookupFunction<
+        _c_clang_getCursorLocation_wrap,
+        _dart_clang_getCursorLocation_wrap>('clang_getCursorLocation_wrap');
+    return _clang_getCursorLocation_wrap(
+      cursor,
+    );
+  }
+
+  _dart_clang_getCursorLocation_wrap _clang_getCursorLocation_wrap;
+
+  void clang_getFileLocation_wrap(
+    ffi.Pointer<CXSourceLocation> location,
+    ffi.Pointer<ffi.Pointer<ffi.Void>> file,
+    ffi.Pointer<ffi.Uint32> line,
+    ffi.Pointer<ffi.Uint32> column,
+    ffi.Pointer<ffi.Uint32> offset,
+  ) {
+    _clang_getFileLocation_wrap ??= _dylib.lookupFunction<
+        _c_clang_getFileLocation_wrap,
+        _dart_clang_getFileLocation_wrap>('clang_getFileLocation_wrap');
+    return _clang_getFileLocation_wrap(
+      location,
+      file,
+      line,
+      column,
+      offset,
+    );
+  }
+
+  _dart_clang_getFileLocation_wrap _clang_getFileLocation_wrap;
+
+  ffi.Pointer<CXString> clang_getFileName_wrap(
+    ffi.Pointer<ffi.Void> SFile,
+  ) {
+    _clang_getFileName_wrap ??= _dylib.lookupFunction<_c_clang_getFileName_wrap,
+        _dart_clang_getFileName_wrap>('clang_getFileName_wrap');
+    return _clang_getFileName_wrap(
+      SFile,
+    );
+  }
+
+  _dart_clang_getFileName_wrap _clang_getFileName_wrap;
+
+  int clang_getNumElements_wrap(
+    ffi.Pointer<CXType> cxtype,
+  ) {
+    _clang_getNumElements_wrap ??= _dylib.lookupFunction<
+        _c_clang_getNumElements_wrap,
+        _dart_clang_getNumElements_wrap>('clang_getNumElements_wrap');
+    return _clang_getNumElements_wrap(
+      cxtype,
+    );
+  }
+
+  _dart_clang_getNumElements_wrap _clang_getNumElements_wrap;
+
+  ffi.Pointer<CXType> clang_getArrayElementType_wrap(
+    ffi.Pointer<CXType> cxtype,
+  ) {
+    _clang_getArrayElementType_wrap ??= _dylib.lookupFunction<
+        _c_clang_getArrayElementType_wrap,
+        _dart_clang_getArrayElementType_wrap>('clang_getArrayElementType_wrap');
+    return _clang_getArrayElementType_wrap(
+      cxtype,
+    );
+  }
+
+  _dart_clang_getArrayElementType_wrap _clang_getArrayElementType_wrap;
 }
 
-/// Describes how the traversal of the children of a particular cursor should
-/// proceed after visiting a particular child cursor.
-class CXChildVisitResult {
-  /// Terminates the cursor traversal.
-  static const int CXChildVisit_Break = 0;
+/// A character string.
+class CXString extends ffi.Struct {
+  ffi.Pointer<ffi.Void> data;
 
-  /// Continues the cursor traversal with the next sibling of the cursor just
-  /// visited, without visiting its children.
-  static const int CXChildVisit_Continue = 1;
-
-  /// Recursively traverse the children of this cursor, using the same visitor
-  /// and client data.
-  static const int CXChildVisit_Recurse = 2;
+  @ffi.Uint32()
+  int private_flags;
 }
 
-/// A cursor representing some element in the abstract syntax tree for a
-/// translation unit.
-class CXCursor extends ffi.Struct {
-  @ffi.Int32()
-  int kind;
+class CXTranslationUnitImpl extends ffi.Struct {}
 
-  @ffi.Int32()
-  int xdata;
+/// Provides the contents of a file that has not yet been saved to disk.
+class CXUnsavedFile extends ffi.Struct {
+  /// The file whose contents have not yet been saved.
+  ffi.Pointer<ffi.Int8> Filename;
 
-  ffi.Pointer<ffi.Void> _exp_workaround_data_item_0;
-  ffi.Pointer<ffi.Void> _exp_workaround_data_item_1;
-  ffi.Pointer<ffi.Void> _exp_workaround_data_item_2;
+  /// A buffer containing the unsaved contents of this file.
+  ffi.Pointer<ffi.Int8> Contents;
 
-  /// Helper for array `data`.
-  ArrayHelper_CXCursor_data_level0 get data =>
-      ArrayHelper_CXCursor_data_level0(this, [3], 0, 0);
+  /// The length of the unsaved contents of this buffer.
+  @ffi.Uint64()
+  int Length;
 }
 
-/// Helper for array `data` in struct `CXCursor`.
-class ArrayHelper_CXCursor_data_level0 {
-  final CXCursor _struct;
+/// Identifies a specific source location within a translation unit.
+class CXSourceLocation extends ffi.Struct {
+  ffi.Pointer<ffi.Void> _unique_ptr_data_item_0;
+  ffi.Pointer<ffi.Void> _unique_ptr_data_item_1;
+
+  /// Helper for array `ptr_data`.
+  ArrayHelper_CXSourceLocation_ptr_data_level0 get ptr_data =>
+      ArrayHelper_CXSourceLocation_ptr_data_level0(this, [2], 0, 0);
+  @ffi.Uint32()
+  int int_data;
+}
+
+/// Helper for array `ptr_data` in struct `CXSourceLocation`.
+class ArrayHelper_CXSourceLocation_ptr_data_level0 {
+  final CXSourceLocation _struct;
   final List<int> dimensions;
   final int level;
   final int _absoluteIndex;
   int get length => dimensions[level];
-  ArrayHelper_CXCursor_data_level0(
+  ArrayHelper_CXSourceLocation_ptr_data_level0(
       this._struct, this.dimensions, this.level, this._absoluteIndex);
   void _checkBounds(int index) {
     if (index >= length || index < 0) {
@@ -64,11 +622,9 @@
     _checkBounds(index);
     switch (_absoluteIndex + index) {
       case 0:
-        return _struct._exp_workaround_data_item_0;
+        return _struct._unique_ptr_data_item_0;
       case 1:
-        return _struct._exp_workaround_data_item_1;
-      case 2:
-        return _struct._exp_workaround_data_item_2;
+        return _struct._unique_ptr_data_item_1;
       default:
         throw Exception('Invalid Array Helper generated.');
     }
@@ -78,13 +634,10 @@
     _checkBounds(index);
     switch (_absoluteIndex + index) {
       case 0:
-        _struct._exp_workaround_data_item_0 = value;
+        _struct._unique_ptr_data_item_0 = value;
         break;
       case 1:
-        _struct._exp_workaround_data_item_1 = value;
-        break;
-      case 2:
-        _struct._exp_workaround_data_item_2 = value;
+        _struct._unique_ptr_data_item_1 = value;
         break;
       default:
         throw Exception('Invalid Array Helper generated.');
@@ -92,6 +645,151 @@
   }
 }
 
+/// Identifies a half-open character range in the source code.
+class CXSourceRange extends ffi.Struct {
+  ffi.Pointer<ffi.Void> _unique_ptr_data_item_0;
+  ffi.Pointer<ffi.Void> _unique_ptr_data_item_1;
+
+  /// Helper for array `ptr_data`.
+  ArrayHelper_CXSourceRange_ptr_data_level0 get ptr_data =>
+      ArrayHelper_CXSourceRange_ptr_data_level0(this, [2], 0, 0);
+  @ffi.Uint32()
+  int begin_int_data;
+
+  @ffi.Uint32()
+  int end_int_data;
+}
+
+/// Helper for array `ptr_data` in struct `CXSourceRange`.
+class ArrayHelper_CXSourceRange_ptr_data_level0 {
+  final CXSourceRange _struct;
+  final List<int> dimensions;
+  final int level;
+  final int _absoluteIndex;
+  int get length => dimensions[level];
+  ArrayHelper_CXSourceRange_ptr_data_level0(
+      this._struct, this.dimensions, this.level, this._absoluteIndex);
+  void _checkBounds(int index) {
+    if (index >= length || index < 0) {
+      throw RangeError(
+          'Dimension $level: index not in range 0..${length} exclusive.');
+    }
+  }
+
+  ffi.Pointer<ffi.Void> operator [](int index) {
+    _checkBounds(index);
+    switch (_absoluteIndex + index) {
+      case 0:
+        return _struct._unique_ptr_data_item_0;
+      case 1:
+        return _struct._unique_ptr_data_item_1;
+      default:
+        throw Exception('Invalid Array Helper generated.');
+    }
+  }
+
+  void operator []=(int index, ffi.Pointer<ffi.Void> value) {
+    _checkBounds(index);
+    switch (_absoluteIndex + index) {
+      case 0:
+        _struct._unique_ptr_data_item_0 = value;
+        break;
+      case 1:
+        _struct._unique_ptr_data_item_1 = value;
+        break;
+      default:
+        throw Exception('Invalid Array Helper generated.');
+    }
+  }
+}
+
+/// Options to control the display of diagnostics.
+class CXDiagnosticDisplayOptions {
+  /// Display the source-location information where the diagnostic was located.
+  static const int CXDiagnostic_DisplaySourceLocation = 1;
+
+  /// If displaying the source-location information of the diagnostic, also
+  /// include the column number.
+  static const int CXDiagnostic_DisplayColumn = 2;
+
+  /// If displaying the source-location information of the diagnostic, also
+  /// include information about source ranges in a machine-parsable format.
+  static const int CXDiagnostic_DisplaySourceRanges = 4;
+
+  /// Display the option name associated with this diagnostic, if any.
+  static const int CXDiagnostic_DisplayOption = 8;
+
+  /// Display the category number associated with this diagnostic, if any.
+  static const int CXDiagnostic_DisplayCategoryId = 16;
+
+  /// Display the category name associated with this diagnostic, if any.
+  static const int CXDiagnostic_DisplayCategoryName = 32;
+}
+
+/// Flags that control the creation of translation units.
+class CXTranslationUnit_Flags {
+  /// Used to indicate that no special translation-unit options are needed.
+  static const int CXTranslationUnit_None = 0;
+
+  /// Used to indicate that the parser should construct a "detailed"
+  /// preprocessing record, including all macro definitions and instantiations.
+  static const int CXTranslationUnit_DetailedPreprocessingRecord = 1;
+
+  /// Used to indicate that the translation unit is incomplete.
+  static const int CXTranslationUnit_Incomplete = 2;
+
+  /// Used to indicate that the translation unit should be built with an
+  /// implicit precompiled header for the preamble.
+  static const int CXTranslationUnit_PrecompiledPreamble = 4;
+
+  /// Used to indicate that the translation unit should cache some
+  /// code-completion results with each reparse of the source file.
+  static const int CXTranslationUnit_CacheCompletionResults = 8;
+
+  /// Used to indicate that the translation unit will be serialized with
+  /// clang_saveTranslationUnit.
+  static const int CXTranslationUnit_ForSerialization = 16;
+
+  /// DEPRECATED: Enabled chained precompiled preambles in C++.
+  static const int CXTranslationUnit_CXXChainedPCH = 32;
+
+  /// Used to indicate that function/method bodies should be skipped while
+  /// parsing.
+  static const int CXTranslationUnit_SkipFunctionBodies = 64;
+
+  /// Used to indicate that brief documentation comments should be included into
+  /// the set of code completions returned from this translation unit.
+  static const int CXTranslationUnit_IncludeBriefCommentsInCodeCompletion = 128;
+
+  /// Used to indicate that the precompiled preamble should be created on the
+  /// first parse. Otherwise it will be created on the first reparse. This
+  /// trades runtime on the first parse (serializing the preamble takes time)
+  /// for reduced runtime on the second parse (can now reuse the preamble).
+  static const int CXTranslationUnit_CreatePreambleOnFirstParse = 256;
+
+  /// Do not stop processing when fatal errors are encountered.
+  static const int CXTranslationUnit_KeepGoing = 512;
+
+  /// Sets the preprocessor in a mode for parsing a single file only.
+  static const int CXTranslationUnit_SingleFileParse = 1024;
+
+  /// Used in combination with CXTranslationUnit_SkipFunctionBodies to constrain
+  /// the skipping of function bodies to the preamble.
+  static const int CXTranslationUnit_LimitSkipFunctionBodiesToPreamble = 2048;
+
+  /// Used to indicate that attributed types should be included in CXType.
+  static const int CXTranslationUnit_IncludeAttributedTypes = 4096;
+
+  /// Used to indicate that implicit attributes should be visited.
+  static const int CXTranslationUnit_VisitImplicitAttributes = 8192;
+
+  /// Used to indicate that non-errors from included files should be ignored.
+  static const int CXTranslationUnit_IgnoreNonErrorsFromIncludedFiles = 16384;
+
+  /// Tells the preprocessor not to skip excluded conditional blocks.
+  static const int CXTranslationUnit_RetainExcludedConditionalBlocks = 32768;
+}
+
 /// Describes the kind of entity that a cursor refers to.
 class CXCursorKind {
   /// A declaration whose specific kind is not exposed via this interface.
@@ -744,237 +1442,32 @@
   static const int CXCursor_OverloadCandidate = 700;
 }
 
-/// Options to control the display of diagnostics.
-class CXDiagnosticDisplayOptions {
-  /// Display the source-location information where the diagnostic was located.
-  static const int CXDiagnostic_DisplaySourceLocation = 1;
-
-  /// If displaying the source-location information of the diagnostic, also
-  /// include the column number.
-  static const int CXDiagnostic_DisplayColumn = 2;
-
-  /// If displaying the source-location information of the diagnostic, also
-  /// include information about source ranges in a machine-parsable format.
-  static const int CXDiagnostic_DisplaySourceRanges = 4;
-
-  /// Display the option name associated with this diagnostic, if any.
-  static const int CXDiagnostic_DisplayOption = 8;
-
-  /// Display the category number associated with this diagnostic, if any.
-  static const int CXDiagnostic_DisplayCategoryId = 16;
-
-  /// Display the category name associated with this diagnostic, if any.
-  static const int CXDiagnostic_DisplayCategoryName = 32;
-}
-
-/// Identifies a specific source location within a translation unit.
-class CXSourceLocation extends ffi.Struct {
-  ffi.Pointer<ffi.Void> _exp_workaround_ptr_data_item_0;
-  ffi.Pointer<ffi.Void> _exp_workaround_ptr_data_item_1;
-
-  /// Helper for array `ptr_data`.
-  ArrayHelper_CXSourceLocation_ptr_data_level0 get ptr_data =>
-      ArrayHelper_CXSourceLocation_ptr_data_level0(this, [2], 0, 0);
-  @ffi.Uint32()
-  int int_data;
-}
-
-/// Helper for array `ptr_data` in struct `CXSourceLocation`.
-class ArrayHelper_CXSourceLocation_ptr_data_level0 {
-  final CXSourceLocation _struct;
-  final List<int> dimensions;
-  final int level;
-  final int _absoluteIndex;
-  int get length => dimensions[level];
-  ArrayHelper_CXSourceLocation_ptr_data_level0(
-      this._struct, this.dimensions, this.level, this._absoluteIndex);
-  void _checkBounds(int index) {
-    if (index >= length || index < 0) {
-      throw RangeError(
-          'Dimension $level: index not in range 0..${length} exclusive.');
-    }
-  }
-
-  ffi.Pointer<ffi.Void> operator [](int index) {
-    _checkBounds(index);
-    switch (_absoluteIndex + index) {
-      case 0:
-        return _struct._exp_workaround_ptr_data_item_0;
-      case 1:
-        return _struct._exp_workaround_ptr_data_item_1;
-      default:
-        throw Exception('Invalid Array Helper generated.');
-    }
-  }
-
-  void operator []=(int index, ffi.Pointer<ffi.Void> value) {
-    _checkBounds(index);
-    switch (_absoluteIndex + index) {
-      case 0:
-        _struct._exp_workaround_ptr_data_item_0 = value;
-        break;
-      case 1:
-        _struct._exp_workaround_ptr_data_item_1 = value;
-        break;
-      default:
-        throw Exception('Invalid Array Helper generated.');
-    }
-  }
-}
-
-/// Identifies a half-open character range in the source code.
-class CXSourceRange extends ffi.Struct {
-  ffi.Pointer<ffi.Void> _exp_workaround_ptr_data_item_0;
-  ffi.Pointer<ffi.Void> _exp_workaround_ptr_data_item_1;
-
-  /// Helper for array `ptr_data`.
-  ArrayHelper_CXSourceRange_ptr_data_level0 get ptr_data =>
-      ArrayHelper_CXSourceRange_ptr_data_level0(this, [2], 0, 0);
-  @ffi.Uint32()
-  int begin_int_data;
-
-  @ffi.Uint32()
-  int end_int_data;
-}
-
-/// Helper for array `ptr_data` in struct `CXSourceRange`.
-class ArrayHelper_CXSourceRange_ptr_data_level0 {
-  final CXSourceRange _struct;
-  final List<int> dimensions;
-  final int level;
-  final int _absoluteIndex;
-  int get length => dimensions[level];
-  ArrayHelper_CXSourceRange_ptr_data_level0(
-      this._struct, this.dimensions, this.level, this._absoluteIndex);
-  void _checkBounds(int index) {
-    if (index >= length || index < 0) {
-      throw RangeError(
-          'Dimension $level: index not in range 0..${length} exclusive.');
-    }
-  }
-
-  ffi.Pointer<ffi.Void> operator [](int index) {
-    _checkBounds(index);
-    switch (_absoluteIndex + index) {
-      case 0:
-        return _struct._exp_workaround_ptr_data_item_0;
-      case 1:
-        return _struct._exp_workaround_ptr_data_item_1;
-      default:
-        throw Exception('Invalid Array Helper generated.');
-    }
-  }
-
-  void operator []=(int index, ffi.Pointer<ffi.Void> value) {
-    _checkBounds(index);
-    switch (_absoluteIndex + index) {
-      case 0:
-        _struct._exp_workaround_ptr_data_item_0 = value;
-        break;
-      case 1:
-        _struct._exp_workaround_ptr_data_item_1 = value;
-        break;
-      default:
-        throw Exception('Invalid Array Helper generated.');
-    }
-  }
-}
-
-/// A character string.
-class CXString extends ffi.Struct {
-  ffi.Pointer<ffi.Void> data;
-
-  @ffi.Uint32()
-  int private_flags;
-}
-
-class CXTranslationUnitImpl extends ffi.Struct {}
-
-/// Flags that control the creation of translation units.
-class CXTranslationUnit_Flags {
-  /// Used to indicate that no special translation-unit options are needed.
-  static const int CXTranslationUnit_None = 0;
-
-  /// Used to indicate that the parser should construct a "detailed"
-  /// preprocessing record, including all macro definitions and instantiations.
-  static const int CXTranslationUnit_DetailedPreprocessingRecord = 1;
-
-  /// Used to indicate that the translation unit is incomplete.
-  static const int CXTranslationUnit_Incomplete = 2;
-
-  /// Used to indicate that the translation unit should be built with an
-  /// implicit precompiled header for the preamble.
-  static const int CXTranslationUnit_PrecompiledPreamble = 4;
-
-  /// Used to indicate that the translation unit should cache some
-  /// code-completion results with each reparse of the source file.
-  static const int CXTranslationUnit_CacheCompletionResults = 8;
-
-  /// Used to indicate that the translation unit will be serialized with
-  /// clang_saveTranslationUnit.
-  static const int CXTranslationUnit_ForSerialization = 16;
-
-  /// DEPRECATED: Enabled chained precompiled preambles in C++.
-  static const int CXTranslationUnit_CXXChainedPCH = 32;
-
-  /// Used to indicate that function/method bodies should be skipped while
-  /// parsing.
-  static const int CXTranslationUnit_SkipFunctionBodies = 64;
-
-  /// Used to indicate that brief documentation comments should be included into
-  /// the set of code completions returned from this translation unit.
-  static const int CXTranslationUnit_IncludeBriefCommentsInCodeCompletion = 128;
-
-  /// Used to indicate that the precompiled preamble should be created on the
-  /// first parse. Otherwise it will be created on the first reparse. This
-  /// trades runtime on the first parse (serializing the preamble takes time)
-  /// for reduced runtime on the second parse (can now reuse the preamble).
-  static const int CXTranslationUnit_CreatePreambleOnFirstParse = 256;
-
-  /// Do not stop processing when fatal errors are encountered.
-  static const int CXTranslationUnit_KeepGoing = 512;
-
-  /// Sets the preprocessor in a mode for parsing a single file only.
-  static const int CXTranslationUnit_SingleFileParse = 1024;
-
-  /// Used in combination with CXTranslationUnit_SkipFunctionBodies to constrain
-  /// the skipping of function bodies to the preamble.
-  static const int CXTranslationUnit_LimitSkipFunctionBodiesToPreamble = 2048;
-
-  /// Used to indicate that attributed types should be included in CXType.
-  static const int CXTranslationUnit_IncludeAttributedTypes = 4096;
-
-  /// Used to indicate that implicit attributes should be visited.
-  static const int CXTranslationUnit_VisitImplicitAttributes = 8192;
-
-  /// Used to indicate that non-errors from included files should be ignored.
-  static const int CXTranslationUnit_IgnoreNonErrorsFromIncludedFiles = 16384;
-
-  /// Tells the preprocessor not to skip excluded conditional blocks.
-  static const int CXTranslationUnit_RetainExcludedConditionalBlocks = 32768;
-}
-
-/// The type of an element in the abstract syntax tree.
-class CXType extends ffi.Struct {
+/// A cursor representing some element in the abstract syntax tree for a
+/// translation unit.
+class CXCursor extends ffi.Struct {
   @ffi.Int32()
   int kind;
 
-  ffi.Pointer<ffi.Void> _exp_workaround_data_item_0;
-  ffi.Pointer<ffi.Void> _exp_workaround_data_item_1;
+  @ffi.Int32()
+  int xdata;
+
+  ffi.Pointer<ffi.Void> _unique_data_item_0;
+  ffi.Pointer<ffi.Void> _unique_data_item_1;
+  ffi.Pointer<ffi.Void> _unique_data_item_2;
 
   /// Helper for array `data`.
-  ArrayHelper_CXType_data_level0 get data =>
-      ArrayHelper_CXType_data_level0(this, [2], 0, 0);
+  ArrayHelper_CXCursor_data_level0 get data =>
+      ArrayHelper_CXCursor_data_level0(this, [3], 0, 0);
 }
 
-/// Helper for array `data` in struct `CXType`.
-class ArrayHelper_CXType_data_level0 {
-  final CXType _struct;
+/// Helper for array `data` in struct `CXCursor`.
+class ArrayHelper_CXCursor_data_level0 {
+  final CXCursor _struct;
   final List<int> dimensions;
   final int level;
   final int _absoluteIndex;
   int get length => dimensions[level];
-  ArrayHelper_CXType_data_level0(
+  ArrayHelper_CXCursor_data_level0(
       this._struct, this.dimensions, this.level, this._absoluteIndex);
   void _checkBounds(int index) {
     if (index >= length || index < 0) {
@@ -987,9 +1480,11 @@
     _checkBounds(index);
     switch (_absoluteIndex + index) {
       case 0:
-        return _struct._exp_workaround_data_item_0;
+        return _struct._unique_data_item_0;
       case 1:
-        return _struct._exp_workaround_data_item_1;
+        return _struct._unique_data_item_1;
+      case 2:
+        return _struct._unique_data_item_2;
       default:
         throw Exception('Invalid Array Helper generated.');
     }
@@ -999,10 +1494,13 @@
     _checkBounds(index);
     switch (_absoluteIndex + index) {
       case 0:
-        _struct._exp_workaround_data_item_0 = value;
+        _struct._unique_data_item_0 = value;
         break;
       case 1:
-        _struct._exp_workaround_data_item_1 = value;
+        _struct._unique_data_item_1 = value;
+        break;
+      case 2:
+        _struct._unique_data_item_2 = value;
         break;
       default:
         throw Exception('Invalid Array Helper generated.');
@@ -1137,174 +1635,77 @@
   static const int CXType_ExtVector = 176;
 }
 
-/// Provides the contents of a file that has not yet been saved to disk.
-class CXUnsavedFile extends ffi.Struct {
-  /// The file whose contents have not yet been saved.
-  ffi.Pointer<ffi.Int8> Filename;
+/// The type of an element in the abstract syntax tree.
+class CXType extends ffi.Struct {
+  @ffi.Int32()
+  int kind;
 
-  /// A buffer containing the unsaved contents of this file.
-  ffi.Pointer<ffi.Int8> Contents;
+  ffi.Pointer<ffi.Void> _unique_data_item_0;
+  ffi.Pointer<ffi.Void> _unique_data_item_1;
 
-  /// The length of the unsaved contents of this buffer.
-  @ffi.Uint64()
-  int Length;
+  /// Helper for array `data`.
+  ArrayHelper_CXType_data_level0 get data =>
+      ArrayHelper_CXType_data_level0(this, [2], 0, 0);
 }
 
-ffi.Pointer<CXCursor> clang_Cursor_getArgument_wrap(
-  ffi.Pointer<CXCursor> cursor,
-  int i,
-) {
-  return _clang_Cursor_getArgument_wrap(
-    cursor,
-    i,
-  );
+/// Helper for array `data` in struct `CXType`.
+class ArrayHelper_CXType_data_level0 {
+  final CXType _struct;
+  final List<int> dimensions;
+  final int level;
+  final int _absoluteIndex;
+  int get length => dimensions[level];
+  ArrayHelper_CXType_data_level0(
+      this._struct, this.dimensions, this.level, this._absoluteIndex);
+  void _checkBounds(int index) {
+    if (index >= length || index < 0) {
+      throw RangeError(
+          'Dimension $level: index not in range 0..${length} exclusive.');
+    }
+  }
+
+  ffi.Pointer<ffi.Void> operator [](int index) {
+    _checkBounds(index);
+    switch (_absoluteIndex + index) {
+      case 0:
+        return _struct._unique_data_item_0;
+      case 1:
+        return _struct._unique_data_item_1;
+      default:
+        throw Exception('Invalid Array Helper generated.');
+    }
+  }
+
+  void operator []=(int index, ffi.Pointer<ffi.Void> value) {
+    _checkBounds(index);
+    switch (_absoluteIndex + index) {
+      case 0:
+        _struct._unique_data_item_0 = value;
+        break;
+      case 1:
+        _struct._unique_data_item_1 = value;
+        break;
+      default:
+        throw Exception('Invalid Array Helper generated.');
+    }
+  }
 }
 
-final _dart_clang_Cursor_getArgument_wrap _clang_Cursor_getArgument_wrap =
-    _dylib.lookupFunction<_c_clang_Cursor_getArgument_wrap,
-        _dart_clang_Cursor_getArgument_wrap>('clang_Cursor_getArgument_wrap');
+/// Describes how the traversal of the children of a particular cursor should
+/// proceed after visiting a particular child cursor.
+class CXChildVisitResult {
+  /// Terminates the cursor traversal.
+  static const int CXChildVisit_Break = 0;
 
-typedef _c_clang_Cursor_getArgument_wrap = ffi.Pointer<CXCursor> Function(
-  ffi.Pointer<CXCursor> cursor,
-  ffi.Uint32 i,
-);
+  /// Continues the cursor traversal with the next sibling of the cursor just
+  /// visited, without visiting its children.
+  static const int CXChildVisit_Continue = 1;
 
-typedef _dart_clang_Cursor_getArgument_wrap = ffi.Pointer<CXCursor> Function(
-  ffi.Pointer<CXCursor> cursor,
-  int i,
-);
-
-/// Returns the first paragraph of doxygen doc comment.
-ffi.Pointer<CXString> clang_Cursor_getBriefCommentText_wrap(
-  ffi.Pointer<CXCursor> cursor,
-) {
-  return _clang_Cursor_getBriefCommentText_wrap(
-    cursor,
-  );
+  /// Recursively traverse the children of this cursor, using the same visitor
+  /// and client data.
+  static const int CXChildVisit_Recurse = 2;
 }
 
-final _dart_clang_Cursor_getBriefCommentText_wrap
-    _clang_Cursor_getBriefCommentText_wrap = _dylib.lookupFunction<
-            _c_clang_Cursor_getBriefCommentText_wrap,
-            _dart_clang_Cursor_getBriefCommentText_wrap>(
-        'clang_Cursor_getBriefCommentText_wrap');
-
-typedef _c_clang_Cursor_getBriefCommentText_wrap = ffi.Pointer<CXString>
-    Function(
-  ffi.Pointer<CXCursor> cursor,
-);
-
-typedef _dart_clang_Cursor_getBriefCommentText_wrap = ffi.Pointer<CXString>
-    Function(
-  ffi.Pointer<CXCursor> cursor,
-);
-
-/// Returns the comment range.
-ffi.Pointer<CXSourceRange> clang_Cursor_getCommentRange_wrap(
-  ffi.Pointer<CXCursor> cursor,
-) {
-  return _clang_Cursor_getCommentRange_wrap(
-    cursor,
-  );
-}
-
-final _dart_clang_Cursor_getCommentRange_wrap
-    _clang_Cursor_getCommentRange_wrap = _dylib.lookupFunction<
-            _c_clang_Cursor_getCommentRange_wrap,
-            _dart_clang_Cursor_getCommentRange_wrap>(
-        'clang_Cursor_getCommentRange_wrap');
-
-typedef _c_clang_Cursor_getCommentRange_wrap = ffi.Pointer<CXSourceRange>
-    Function(
-  ffi.Pointer<CXCursor> cursor,
-);
-
-typedef _dart_clang_Cursor_getCommentRange_wrap = ffi.Pointer<CXSourceRange>
-    Function(
-  ffi.Pointer<CXCursor> cursor,
-);
-
-int clang_Cursor_getNumArguments_wrap(
-  ffi.Pointer<CXCursor> cursor,
-) {
-  return _clang_Cursor_getNumArguments_wrap(
-    cursor,
-  );
-}
-
-final _dart_clang_Cursor_getNumArguments_wrap
-    _clang_Cursor_getNumArguments_wrap = _dylib.lookupFunction<
-            _c_clang_Cursor_getNumArguments_wrap,
-            _dart_clang_Cursor_getNumArguments_wrap>(
-        'clang_Cursor_getNumArguments_wrap');
-
-typedef _c_clang_Cursor_getNumArguments_wrap = ffi.Int32 Function(
-  ffi.Pointer<CXCursor> cursor,
-);
-
-typedef _dart_clang_Cursor_getNumArguments_wrap = int Function(
-  ffi.Pointer<CXCursor> cursor,
-);
-
-/// Returns the raw comment.
-ffi.Pointer<CXString> clang_Cursor_getRawCommentText_wrap(
-  ffi.Pointer<CXCursor> cursor,
-) {
-  return _clang_Cursor_getRawCommentText_wrap(
-    cursor,
-  );
-}
-
-final _dart_clang_Cursor_getRawCommentText_wrap
-    _clang_Cursor_getRawCommentText_wrap = _dylib.lookupFunction<
-            _c_clang_Cursor_getRawCommentText_wrap,
-            _dart_clang_Cursor_getRawCommentText_wrap>(
-        'clang_Cursor_getRawCommentText_wrap');
-
-typedef _c_clang_Cursor_getRawCommentText_wrap = ffi.Pointer<CXString> Function(
-  ffi.Pointer<CXCursor> cursor,
-);
-
-typedef _dart_clang_Cursor_getRawCommentText_wrap = ffi.Pointer<CXString>
-    Function(
-  ffi.Pointer<CXCursor> cursor,
-);
-
-ffi.Pointer<CXType> clang_Type_getNamedType_wrap(
-  ffi.Pointer<CXType> elaboratedType,
-) {
-  return _clang_Type_getNamedType_wrap(
-    elaboratedType,
-  );
-}
-
-final _dart_clang_Type_getNamedType_wrap _clang_Type_getNamedType_wrap =
-    _dylib.lookupFunction<_c_clang_Type_getNamedType_wrap,
-        _dart_clang_Type_getNamedType_wrap>('clang_Type_getNamedType_wrap');
-
-typedef _c_clang_Type_getNamedType_wrap = ffi.Pointer<CXType> Function(
-  ffi.Pointer<CXType> elaboratedType,
-);
-
-typedef _dart_clang_Type_getNamedType_wrap = ffi.Pointer<CXType> Function(
-  ffi.Pointer<CXType> elaboratedType,
-);
-
-/// Provides a shared context for creating translation units.
-ffi.Pointer<ffi.Void> clang_createIndex(
-  int excludeDeclarationsFromPCH,
-  int displayDiagnostics,
-) {
-  return _clang_createIndex(
-    excludeDeclarationsFromPCH,
-    displayDiagnostics,
-  );
-}
-
-final _dart_clang_createIndex _clang_createIndex =
-    _dylib.lookupFunction<_c_clang_createIndex, _dart_clang_createIndex>(
-        'clang_createIndex');
-
 typedef _c_clang_createIndex = ffi.Pointer<ffi.Void> Function(
   ffi.Int32 excludeDeclarationsFromPCH,
   ffi.Int32 displayDiagnostics,
@@ -1315,40 +1716,6 @@
   int displayDiagnostics,
 );
 
-/// Destroy a diagnostic.
-void clang_disposeDiagnostic(
-  ffi.Pointer<ffi.Void> Diagnostic,
-) {
-  return _clang_disposeDiagnostic(
-    Diagnostic,
-  );
-}
-
-final _dart_clang_disposeDiagnostic _clang_disposeDiagnostic = _dylib
-    .lookupFunction<_c_clang_disposeDiagnostic, _dart_clang_disposeDiagnostic>(
-        'clang_disposeDiagnostic');
-
-typedef _c_clang_disposeDiagnostic = ffi.Void Function(
-  ffi.Pointer<ffi.Void> Diagnostic,
-);
-
-typedef _dart_clang_disposeDiagnostic = void Function(
-  ffi.Pointer<ffi.Void> Diagnostic,
-);
-
-/// Destroy the given index.
-void clang_disposeIndex(
-  ffi.Pointer<ffi.Void> index,
-) {
-  return _clang_disposeIndex(
-    index,
-  );
-}
-
-final _dart_clang_disposeIndex _clang_disposeIndex =
-    _dylib.lookupFunction<_c_clang_disposeIndex, _dart_clang_disposeIndex>(
-        'clang_disposeIndex');
-
 typedef _c_clang_disposeIndex = ffi.Void Function(
   ffi.Pointer<ffi.Void> index,
 );
@@ -1357,298 +1724,13 @@
   ffi.Pointer<ffi.Void> index,
 );
 
-void clang_disposeString_wrap(
-  ffi.Pointer<CXString> string,
-) {
-  return _clang_disposeString_wrap(
-    string,
-  );
-}
-
-final _dart_clang_disposeString_wrap _clang_disposeString_wrap =
-    _dylib.lookupFunction<_c_clang_disposeString_wrap,
-        _dart_clang_disposeString_wrap>('clang_disposeString_wrap');
-
-typedef _c_clang_disposeString_wrap = ffi.Void Function(
-  ffi.Pointer<CXString> string,
-);
-
-typedef _dart_clang_disposeString_wrap = void Function(
-  ffi.Pointer<CXString> string,
-);
-
-/// Destroy the specified CXTranslationUnit object.
-void clang_disposeTranslationUnit(
-  ffi.Pointer<CXTranslationUnitImpl> arg0,
-) {
-  return _clang_disposeTranslationUnit(
-    arg0,
-  );
-}
-
-final _dart_clang_disposeTranslationUnit _clang_disposeTranslationUnit =
-    _dylib.lookupFunction<_c_clang_disposeTranslationUnit,
-        _dart_clang_disposeTranslationUnit>('clang_disposeTranslationUnit');
-
-typedef _c_clang_disposeTranslationUnit = ffi.Void Function(
-  ffi.Pointer<CXTranslationUnitImpl> arg0,
-);
-
-typedef _dart_clang_disposeTranslationUnit = void Function(
-  ffi.Pointer<CXTranslationUnitImpl> arg0,
-);
-
-/// Returns non-zero if the ranges are the same, zero if they differ.
-int clang_equalRanges_wrap(
-  ffi.Pointer<CXSourceRange> c1,
-  ffi.Pointer<CXSourceRange> c2,
-) {
-  return _clang_equalRanges_wrap(
-    c1,
-    c2,
-  );
-}
-
-final _dart_clang_equalRanges_wrap _clang_equalRanges_wrap = _dylib
-    .lookupFunction<_c_clang_equalRanges_wrap, _dart_clang_equalRanges_wrap>(
-        'clang_equalRanges_wrap');
-
-typedef _c_clang_equalRanges_wrap = ffi.Uint32 Function(
-  ffi.Pointer<CXSourceRange> c1,
-  ffi.Pointer<CXSourceRange> c2,
-);
-
-typedef _dart_clang_equalRanges_wrap = int Function(
-  ffi.Pointer<CXSourceRange> c1,
-  ffi.Pointer<CXSourceRange> c2,
-);
-
-ffi.Pointer<CXString> clang_formatDiagnostic_wrap(
-  ffi.Pointer<ffi.Void> diag,
-  int opts,
-) {
-  return _clang_formatDiagnostic_wrap(
-    diag,
-    opts,
-  );
-}
-
-final _dart_clang_formatDiagnostic_wrap _clang_formatDiagnostic_wrap =
-    _dylib.lookupFunction<_c_clang_formatDiagnostic_wrap,
-        _dart_clang_formatDiagnostic_wrap>('clang_formatDiagnostic_wrap');
-
-typedef _c_clang_formatDiagnostic_wrap = ffi.Pointer<CXString> Function(
-  ffi.Pointer<ffi.Void> diag,
-  ffi.Int32 opts,
-);
-
-typedef _dart_clang_formatDiagnostic_wrap = ffi.Pointer<CXString> Function(
-  ffi.Pointer<ffi.Void> diag,
-  int opts,
-);
-
-ffi.Pointer<CXType> clang_getArgType_wrap(
-  ffi.Pointer<CXType> cxtype,
-  int i,
-) {
-  return _clang_getArgType_wrap(
-    cxtype,
-    i,
-  );
-}
-
-final _dart_clang_getArgType_wrap _clang_getArgType_wrap = _dylib
-    .lookupFunction<_c_clang_getArgType_wrap, _dart_clang_getArgType_wrap>(
-        'clang_getArgType_wrap');
-
-typedef _c_clang_getArgType_wrap = ffi.Pointer<CXType> Function(
-  ffi.Pointer<CXType> cxtype,
-  ffi.Uint32 i,
-);
-
-typedef _dart_clang_getArgType_wrap = ffi.Pointer<CXType> Function(
-  ffi.Pointer<CXType> cxtype,
-  int i,
-);
-
-ffi.Pointer<CXType> clang_getArrayElementType_wrap(
-  ffi.Pointer<CXType> cxtype,
-) {
-  return _clang_getArrayElementType_wrap(
-    cxtype,
-  );
-}
-
-final _dart_clang_getArrayElementType_wrap _clang_getArrayElementType_wrap =
-    _dylib.lookupFunction<_c_clang_getArrayElementType_wrap,
-        _dart_clang_getArrayElementType_wrap>('clang_getArrayElementType_wrap');
-
-typedef _c_clang_getArrayElementType_wrap = ffi.Pointer<CXType> Function(
-  ffi.Pointer<CXType> cxtype,
-);
-
-typedef _dart_clang_getArrayElementType_wrap = ffi.Pointer<CXType> Function(
-  ffi.Pointer<CXType> cxtype,
-);
-
-ffi.Pointer<ffi.Int8> clang_getCString_wrap(
-  ffi.Pointer<CXString> string,
-) {
-  return _clang_getCString_wrap(
-    string,
-  );
-}
-
-final _dart_clang_getCString_wrap _clang_getCString_wrap = _dylib
-    .lookupFunction<_c_clang_getCString_wrap, _dart_clang_getCString_wrap>(
-        'clang_getCString_wrap');
-
-typedef _c_clang_getCString_wrap = ffi.Pointer<ffi.Int8> Function(
-  ffi.Pointer<CXString> string,
-);
-
-typedef _dart_clang_getCString_wrap = ffi.Pointer<ffi.Int8> Function(
-  ffi.Pointer<CXString> string,
-);
-
-ffi.Pointer<CXType> clang_getCanonicalType_wrap(
-  ffi.Pointer<CXType> typerefType,
-) {
-  return _clang_getCanonicalType_wrap(
-    typerefType,
-  );
-}
-
-final _dart_clang_getCanonicalType_wrap _clang_getCanonicalType_wrap =
-    _dylib.lookupFunction<_c_clang_getCanonicalType_wrap,
-        _dart_clang_getCanonicalType_wrap>('clang_getCanonicalType_wrap');
-
-typedef _c_clang_getCanonicalType_wrap = ffi.Pointer<CXType> Function(
-  ffi.Pointer<CXType> typerefType,
-);
-
-typedef _dart_clang_getCanonicalType_wrap = ffi.Pointer<CXType> Function(
-  ffi.Pointer<CXType> typerefType,
-);
-
-ffi.Pointer<CXString> clang_getCursorKindSpelling_wrap(
-  int kind,
-) {
-  return _clang_getCursorKindSpelling_wrap(
-    kind,
-  );
-}
-
-final _dart_clang_getCursorKindSpelling_wrap _clang_getCursorKindSpelling_wrap =
-    _dylib.lookupFunction<_c_clang_getCursorKindSpelling_wrap,
-            _dart_clang_getCursorKindSpelling_wrap>(
-        'clang_getCursorKindSpelling_wrap');
-
-typedef _c_clang_getCursorKindSpelling_wrap = ffi.Pointer<CXString> Function(
-  ffi.Int32 kind,
-);
-
-typedef _dart_clang_getCursorKindSpelling_wrap = ffi.Pointer<CXString> Function(
-  int kind,
-);
-
-int clang_getCursorKind_wrap(
-  ffi.Pointer<CXCursor> cursor,
-) {
-  return _clang_getCursorKind_wrap(
-    cursor,
-  );
-}
-
-final _dart_clang_getCursorKind_wrap _clang_getCursorKind_wrap =
-    _dylib.lookupFunction<_c_clang_getCursorKind_wrap,
-        _dart_clang_getCursorKind_wrap>('clang_getCursorKind_wrap');
-
-typedef _c_clang_getCursorKind_wrap = ffi.Int32 Function(
-  ffi.Pointer<CXCursor> cursor,
-);
-
-typedef _dart_clang_getCursorKind_wrap = int Function(
-  ffi.Pointer<CXCursor> cursor,
-);
-
-ffi.Pointer<CXSourceLocation> clang_getCursorLocation_wrap(
-  ffi.Pointer<CXCursor> cursor,
-) {
-  return _clang_getCursorLocation_wrap(
-    cursor,
-  );
-}
-
-final _dart_clang_getCursorLocation_wrap _clang_getCursorLocation_wrap =
-    _dylib.lookupFunction<_c_clang_getCursorLocation_wrap,
-        _dart_clang_getCursorLocation_wrap>('clang_getCursorLocation_wrap');
-
-typedef _c_clang_getCursorLocation_wrap = ffi.Pointer<CXSourceLocation>
-    Function(
-  ffi.Pointer<CXCursor> cursor,
-);
-
-typedef _dart_clang_getCursorLocation_wrap = ffi.Pointer<CXSourceLocation>
-    Function(
-  ffi.Pointer<CXCursor> cursor,
-);
-
-/// The name of parameter, struct, typedef.
-ffi.Pointer<CXString> clang_getCursorSpelling_wrap(
-  ffi.Pointer<CXCursor> cursor,
-) {
-  return _clang_getCursorSpelling_wrap(
-    cursor,
-  );
-}
-
-final _dart_clang_getCursorSpelling_wrap _clang_getCursorSpelling_wrap =
-    _dylib.lookupFunction<_c_clang_getCursorSpelling_wrap,
-        _dart_clang_getCursorSpelling_wrap>('clang_getCursorSpelling_wrap');
-
-typedef _c_clang_getCursorSpelling_wrap = ffi.Pointer<CXString> Function(
-  ffi.Pointer<CXCursor> cursor,
-);
-
-typedef _dart_clang_getCursorSpelling_wrap = ffi.Pointer<CXString> Function(
-  ffi.Pointer<CXCursor> cursor,
-);
-
-ffi.Pointer<CXType> clang_getCursorType_wrap(
-  ffi.Pointer<CXCursor> cursor,
-) {
-  return _clang_getCursorType_wrap(
-    cursor,
-  );
-}
-
-final _dart_clang_getCursorType_wrap _clang_getCursorType_wrap =
-    _dylib.lookupFunction<_c_clang_getCursorType_wrap,
-        _dart_clang_getCursorType_wrap>('clang_getCursorType_wrap');
-
-typedef _c_clang_getCursorType_wrap = ffi.Pointer<CXType> Function(
-  ffi.Pointer<CXCursor> cursor,
-);
-
-typedef _dart_clang_getCursorType_wrap = ffi.Pointer<CXType> Function(
-  ffi.Pointer<CXCursor> cursor,
-);
-
-/// Retrieve a diagnostic associated with the given translation unit.
-ffi.Pointer<ffi.Void> clang_getDiagnostic(
+typedef _c_clang_getNumDiagnostics = ffi.Uint32 Function(
   ffi.Pointer<CXTranslationUnitImpl> Unit,
-  int Index,
-) {
-  return _clang_getDiagnostic(
-    Unit,
-    Index,
-  );
-}
+);
 
-final _dart_clang_getDiagnostic _clang_getDiagnostic =
-    _dylib.lookupFunction<_c_clang_getDiagnostic, _dart_clang_getDiagnostic>(
-        'clang_getDiagnostic');
+typedef _dart_clang_getNumDiagnostics = int Function(
+  ffi.Pointer<CXTranslationUnitImpl> Unit,
+);
 
 typedef _c_clang_getDiagnostic = ffi.Pointer<ffi.Void> Function(
   ffi.Pointer<CXTranslationUnitImpl> Unit,
@@ -1660,319 +1742,14 @@
   int Index,
 );
 
-int clang_getEnumConstantDeclValue_wrap(
-  ffi.Pointer<CXCursor> cursor,
-) {
-  return _clang_getEnumConstantDeclValue_wrap(
-    cursor,
-  );
-}
-
-final _dart_clang_getEnumConstantDeclValue_wrap
-    _clang_getEnumConstantDeclValue_wrap = _dylib.lookupFunction<
-            _c_clang_getEnumConstantDeclValue_wrap,
-            _dart_clang_getEnumConstantDeclValue_wrap>(
-        'clang_getEnumConstantDeclValue_wrap');
-
-typedef _c_clang_getEnumConstantDeclValue_wrap = ffi.Int64 Function(
-  ffi.Pointer<CXCursor> cursor,
+typedef _c_clang_disposeDiagnostic = ffi.Void Function(
+  ffi.Pointer<ffi.Void> Diagnostic,
 );
 
-typedef _dart_clang_getEnumConstantDeclValue_wrap = int Function(
-  ffi.Pointer<CXCursor> cursor,
+typedef _dart_clang_disposeDiagnostic = void Function(
+  ffi.Pointer<ffi.Void> Diagnostic,
 );
 
-void clang_getFileLocation_wrap(
-  ffi.Pointer<CXSourceLocation> location,
-  ffi.Pointer<ffi.Pointer<ffi.Void>> file,
-  ffi.Pointer<ffi.Uint32> line,
-  ffi.Pointer<ffi.Uint32> column,
-  ffi.Pointer<ffi.Uint32> offset,
-) {
-  return _clang_getFileLocation_wrap(
-    location,
-    file,
-    line,
-    column,
-    offset,
-  );
-}
-
-final _dart_clang_getFileLocation_wrap _clang_getFileLocation_wrap =
-    _dylib.lookupFunction<_c_clang_getFileLocation_wrap,
-        _dart_clang_getFileLocation_wrap>('clang_getFileLocation_wrap');
-
-typedef _c_clang_getFileLocation_wrap = ffi.Void Function(
-  ffi.Pointer<CXSourceLocation> location,
-  ffi.Pointer<ffi.Pointer<ffi.Void>> file,
-  ffi.Pointer<ffi.Uint32> line,
-  ffi.Pointer<ffi.Uint32> column,
-  ffi.Pointer<ffi.Uint32> offset,
-);
-
-typedef _dart_clang_getFileLocation_wrap = void Function(
-  ffi.Pointer<CXSourceLocation> location,
-  ffi.Pointer<ffi.Pointer<ffi.Void>> file,
-  ffi.Pointer<ffi.Uint32> line,
-  ffi.Pointer<ffi.Uint32> column,
-  ffi.Pointer<ffi.Uint32> offset,
-);
-
-ffi.Pointer<CXString> clang_getFileName_wrap(
-  ffi.Pointer<ffi.Void> SFile,
-) {
-  return _clang_getFileName_wrap(
-    SFile,
-  );
-}
-
-final _dart_clang_getFileName_wrap _clang_getFileName_wrap = _dylib
-    .lookupFunction<_c_clang_getFileName_wrap, _dart_clang_getFileName_wrap>(
-        'clang_getFileName_wrap');
-
-typedef _c_clang_getFileName_wrap = ffi.Pointer<CXString> Function(
-  ffi.Pointer<ffi.Void> SFile,
-);
-
-typedef _dart_clang_getFileName_wrap = ffi.Pointer<CXString> Function(
-  ffi.Pointer<ffi.Void> SFile,
-);
-
-int clang_getNumArgTypes_wrap(
-  ffi.Pointer<CXType> cxtype,
-) {
-  return _clang_getNumArgTypes_wrap(
-    cxtype,
-  );
-}
-
-final _dart_clang_getNumArgTypes_wrap _clang_getNumArgTypes_wrap =
-    _dylib.lookupFunction<_c_clang_getNumArgTypes_wrap,
-        _dart_clang_getNumArgTypes_wrap>('clang_getNumArgTypes_wrap');
-
-typedef _c_clang_getNumArgTypes_wrap = ffi.Int32 Function(
-  ffi.Pointer<CXType> cxtype,
-);
-
-typedef _dart_clang_getNumArgTypes_wrap = int Function(
-  ffi.Pointer<CXType> cxtype,
-);
-
-/// Determine the number of diagnostics produced for the given translation unit.
-int clang_getNumDiagnostics(
-  ffi.Pointer<CXTranslationUnitImpl> Unit,
-) {
-  return _clang_getNumDiagnostics(
-    Unit,
-  );
-}
-
-final _dart_clang_getNumDiagnostics _clang_getNumDiagnostics = _dylib
-    .lookupFunction<_c_clang_getNumDiagnostics, _dart_clang_getNumDiagnostics>(
-        'clang_getNumDiagnostics');
-
-typedef _c_clang_getNumDiagnostics = ffi.Uint32 Function(
-  ffi.Pointer<CXTranslationUnitImpl> Unit,
-);
-
-typedef _dart_clang_getNumDiagnostics = int Function(
-  ffi.Pointer<CXTranslationUnitImpl> Unit,
-);
-
-int clang_getNumElements_wrap(
-  ffi.Pointer<CXType> cxtype,
-) {
-  return _clang_getNumElements_wrap(
-    cxtype,
-  );
-}
-
-final _dart_clang_getNumElements_wrap _clang_getNumElements_wrap =
-    _dylib.lookupFunction<_c_clang_getNumElements_wrap,
-        _dart_clang_getNumElements_wrap>('clang_getNumElements_wrap');
-
-typedef _c_clang_getNumElements_wrap = ffi.Uint64 Function(
-  ffi.Pointer<CXType> cxtype,
-);
-
-typedef _dart_clang_getNumElements_wrap = int Function(
-  ffi.Pointer<CXType> cxtype,
-);
-
-ffi.Pointer<CXType> clang_getPointeeType_wrap(
-  ffi.Pointer<CXType> pointerType,
-) {
-  return _clang_getPointeeType_wrap(
-    pointerType,
-  );
-}
-
-final _dart_clang_getPointeeType_wrap _clang_getPointeeType_wrap =
-    _dylib.lookupFunction<_c_clang_getPointeeType_wrap,
-        _dart_clang_getPointeeType_wrap>('clang_getPointeeType_wrap');
-
-typedef _c_clang_getPointeeType_wrap = ffi.Pointer<CXType> Function(
-  ffi.Pointer<CXType> pointerType,
-);
-
-typedef _dart_clang_getPointeeType_wrap = ffi.Pointer<CXType> Function(
-  ffi.Pointer<CXType> pointerType,
-);
-
-ffi.Pointer<CXType> clang_getResultType_wrap(
-  ffi.Pointer<CXType> functionType,
-) {
-  return _clang_getResultType_wrap(
-    functionType,
-  );
-}
-
-final _dart_clang_getResultType_wrap _clang_getResultType_wrap =
-    _dylib.lookupFunction<_c_clang_getResultType_wrap,
-        _dart_clang_getResultType_wrap>('clang_getResultType_wrap');
-
-typedef _c_clang_getResultType_wrap = ffi.Pointer<CXType> Function(
-  ffi.Pointer<CXType> functionType,
-);
-
-typedef _dart_clang_getResultType_wrap = ffi.Pointer<CXType> Function(
-  ffi.Pointer<CXType> functionType,
-);
-
-ffi.Pointer<CXCursor> clang_getTranslationUnitCursor_wrap(
-  ffi.Pointer<CXTranslationUnitImpl> tu,
-) {
-  return _clang_getTranslationUnitCursor_wrap(
-    tu,
-  );
-}
-
-final _dart_clang_getTranslationUnitCursor_wrap
-    _clang_getTranslationUnitCursor_wrap = _dylib.lookupFunction<
-            _c_clang_getTranslationUnitCursor_wrap,
-            _dart_clang_getTranslationUnitCursor_wrap>(
-        'clang_getTranslationUnitCursor_wrap');
-
-typedef _c_clang_getTranslationUnitCursor_wrap = ffi.Pointer<CXCursor> Function(
-  ffi.Pointer<CXTranslationUnitImpl> tu,
-);
-
-typedef _dart_clang_getTranslationUnitCursor_wrap = ffi.Pointer<CXCursor>
-    Function(
-  ffi.Pointer<CXTranslationUnitImpl> tu,
-);
-
-ffi.Pointer<CXCursor> clang_getTypeDeclaration_wrap(
-  ffi.Pointer<CXType> cxtype,
-) {
-  return _clang_getTypeDeclaration_wrap(
-    cxtype,
-  );
-}
-
-final _dart_clang_getTypeDeclaration_wrap _clang_getTypeDeclaration_wrap =
-    _dylib.lookupFunction<_c_clang_getTypeDeclaration_wrap,
-        _dart_clang_getTypeDeclaration_wrap>('clang_getTypeDeclaration_wrap');
-
-typedef _c_clang_getTypeDeclaration_wrap = ffi.Pointer<CXCursor> Function(
-  ffi.Pointer<CXType> cxtype,
-);
-
-typedef _dart_clang_getTypeDeclaration_wrap = ffi.Pointer<CXCursor> Function(
-  ffi.Pointer<CXType> cxtype,
-);
-
-ffi.Pointer<CXString> clang_getTypeKindSpelling_wrap(
-  int typeKind,
-) {
-  return _clang_getTypeKindSpelling_wrap(
-    typeKind,
-  );
-}
-
-final _dart_clang_getTypeKindSpelling_wrap _clang_getTypeKindSpelling_wrap =
-    _dylib.lookupFunction<_c_clang_getTypeKindSpelling_wrap,
-        _dart_clang_getTypeKindSpelling_wrap>('clang_getTypeKindSpelling_wrap');
-
-typedef _c_clang_getTypeKindSpelling_wrap = ffi.Pointer<CXString> Function(
-  ffi.Int32 typeKind,
-);
-
-typedef _dart_clang_getTypeKindSpelling_wrap = ffi.Pointer<CXString> Function(
-  int typeKind,
-);
-
-ffi.Pointer<CXString> clang_getTypeSpelling_wrap(
-  ffi.Pointer<CXType> type,
-) {
-  return _clang_getTypeSpelling_wrap(
-    type,
-  );
-}
-
-final _dart_clang_getTypeSpelling_wrap _clang_getTypeSpelling_wrap =
-    _dylib.lookupFunction<_c_clang_getTypeSpelling_wrap,
-        _dart_clang_getTypeSpelling_wrap>('clang_getTypeSpelling_wrap');
-
-typedef _c_clang_getTypeSpelling_wrap = ffi.Pointer<CXString> Function(
-  ffi.Pointer<CXType> type,
-);
-
-typedef _dart_clang_getTypeSpelling_wrap = ffi.Pointer<CXString> Function(
-  ffi.Pointer<CXType> type,
-);
-
-ffi.Pointer<CXType> clang_getTypedefDeclUnderlyingType_wrap(
-  ffi.Pointer<CXCursor> cxcursor,
-) {
-  return _clang_getTypedefDeclUnderlyingType_wrap(
-    cxcursor,
-  );
-}
-
-final _dart_clang_getTypedefDeclUnderlyingType_wrap
-    _clang_getTypedefDeclUnderlyingType_wrap = _dylib.lookupFunction<
-            _c_clang_getTypedefDeclUnderlyingType_wrap,
-            _dart_clang_getTypedefDeclUnderlyingType_wrap>(
-        'clang_getTypedefDeclUnderlyingType_wrap');
-
-typedef _c_clang_getTypedefDeclUnderlyingType_wrap = ffi.Pointer<CXType>
-    Function(
-  ffi.Pointer<CXCursor> cxcursor,
-);
-
-typedef _dart_clang_getTypedefDeclUnderlyingType_wrap = ffi.Pointer<CXType>
-    Function(
-  ffi.Pointer<CXCursor> cxcursor,
-);
-
-/// Same as clang_parseTranslationUnit2, but returns the CXTranslationUnit
-/// instead of an error code. In case of an error this routine returns a NULL
-/// CXTranslationUnit, without further detailed error codes.
-ffi.Pointer<CXTranslationUnitImpl> clang_parseTranslationUnit(
-  ffi.Pointer<ffi.Void> 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,
-) {
-  return _clang_parseTranslationUnit(
-    CIdx,
-    source_filename,
-    command_line_args,
-    num_command_line_args,
-    unsaved_files,
-    num_unsaved_files,
-    options,
-  );
-}
-
-final _dart_clang_parseTranslationUnit _clang_parseTranslationUnit =
-    _dylib.lookupFunction<_c_clang_parseTranslationUnit,
-        _dart_clang_parseTranslationUnit>('clang_parseTranslationUnit');
-
 typedef _c_clang_parseTranslationUnit = ffi.Pointer<CXTranslationUnitImpl>
     Function(
   ffi.Pointer<ffi.Void> CIdx,
@@ -1995,30 +1772,153 @@
   int options,
 );
 
+typedef _c_clang_disposeTranslationUnit = ffi.Void Function(
+  ffi.Pointer<CXTranslationUnitImpl> arg0,
+);
+
+typedef _dart_clang_disposeTranslationUnit = void Function(
+  ffi.Pointer<CXTranslationUnitImpl> arg0,
+);
+
+typedef _c_clang_getCString_wrap = ffi.Pointer<ffi.Int8> Function(
+  ffi.Pointer<CXString> string,
+);
+
+typedef _dart_clang_getCString_wrap = ffi.Pointer<ffi.Int8> Function(
+  ffi.Pointer<CXString> string,
+);
+
+typedef _c_clang_disposeString_wrap = ffi.Void Function(
+  ffi.Pointer<CXString> string,
+);
+
+typedef _dart_clang_disposeString_wrap = void Function(
+  ffi.Pointer<CXString> string,
+);
+
+typedef _c_clang_getCursorKind_wrap = ffi.Int32 Function(
+  ffi.Pointer<CXCursor> cursor,
+);
+
+typedef _dart_clang_getCursorKind_wrap = int Function(
+  ffi.Pointer<CXCursor> cursor,
+);
+
+typedef _c_clang_getCursorKindSpelling_wrap = ffi.Pointer<CXString> Function(
+  ffi.Int32 kind,
+);
+
+typedef _dart_clang_getCursorKindSpelling_wrap = ffi.Pointer<CXString> Function(
+  int kind,
+);
+
+typedef _c_clang_getCursorType_wrap = ffi.Pointer<CXType> Function(
+  ffi.Pointer<CXCursor> cursor,
+);
+
+typedef _dart_clang_getCursorType_wrap = ffi.Pointer<CXType> Function(
+  ffi.Pointer<CXCursor> cursor,
+);
+
+typedef _c_clang_getTypeSpelling_wrap = ffi.Pointer<CXString> Function(
+  ffi.Pointer<CXType> type,
+);
+
+typedef _dart_clang_getTypeSpelling_wrap = ffi.Pointer<CXString> Function(
+  ffi.Pointer<CXType> type,
+);
+
+typedef _c_clang_getTypeKindSpelling_wrap = ffi.Pointer<CXString> Function(
+  ffi.Int32 typeKind,
+);
+
+typedef _dart_clang_getTypeKindSpelling_wrap = ffi.Pointer<CXString> Function(
+  int typeKind,
+);
+
+typedef _c_clang_getResultType_wrap = ffi.Pointer<CXType> Function(
+  ffi.Pointer<CXType> functionType,
+);
+
+typedef _dart_clang_getResultType_wrap = ffi.Pointer<CXType> Function(
+  ffi.Pointer<CXType> functionType,
+);
+
+typedef _c_clang_getPointeeType_wrap = ffi.Pointer<CXType> Function(
+  ffi.Pointer<CXType> pointerType,
+);
+
+typedef _dart_clang_getPointeeType_wrap = ffi.Pointer<CXType> Function(
+  ffi.Pointer<CXType> pointerType,
+);
+
+typedef _c_clang_getCanonicalType_wrap = ffi.Pointer<CXType> Function(
+  ffi.Pointer<CXType> typerefType,
+);
+
+typedef _dart_clang_getCanonicalType_wrap = ffi.Pointer<CXType> Function(
+  ffi.Pointer<CXType> typerefType,
+);
+
+typedef _c_clang_Type_getNamedType_wrap = ffi.Pointer<CXType> Function(
+  ffi.Pointer<CXType> elaboratedType,
+);
+
+typedef _dart_clang_Type_getNamedType_wrap = ffi.Pointer<CXType> Function(
+  ffi.Pointer<CXType> elaboratedType,
+);
+
+typedef _c_clang_getTypeDeclaration_wrap = ffi.Pointer<CXCursor> Function(
+  ffi.Pointer<CXType> cxtype,
+);
+
+typedef _dart_clang_getTypeDeclaration_wrap = ffi.Pointer<CXCursor> Function(
+  ffi.Pointer<CXType> cxtype,
+);
+
+typedef _c_clang_getTypedefDeclUnderlyingType_wrap = ffi.Pointer<CXType>
+    Function(
+  ffi.Pointer<CXCursor> cxcursor,
+);
+
+typedef _dart_clang_getTypedefDeclUnderlyingType_wrap = ffi.Pointer<CXType>
+    Function(
+  ffi.Pointer<CXCursor> cxcursor,
+);
+
+typedef _c_clang_getCursorSpelling_wrap = ffi.Pointer<CXString> Function(
+  ffi.Pointer<CXCursor> cursor,
+);
+
+typedef _dart_clang_getCursorSpelling_wrap = ffi.Pointer<CXString> Function(
+  ffi.Pointer<CXCursor> cursor,
+);
+
+typedef _c_clang_getTranslationUnitCursor_wrap = ffi.Pointer<CXCursor> Function(
+  ffi.Pointer<CXTranslationUnitImpl> tu,
+);
+
+typedef _dart_clang_getTranslationUnitCursor_wrap = ffi.Pointer<CXCursor>
+    Function(
+  ffi.Pointer<CXTranslationUnitImpl> tu,
+);
+
+typedef _c_clang_formatDiagnostic_wrap = ffi.Pointer<CXString> Function(
+  ffi.Pointer<ffi.Void> diag,
+  ffi.Int32 opts,
+);
+
+typedef _dart_clang_formatDiagnostic_wrap = ffi.Pointer<CXString> Function(
+  ffi.Pointer<ffi.Void> diag,
+  int opts,
+);
+
 typedef ModifiedCXCursorVisitor_1 = ffi.Int32 Function(
   ffi.Pointer<CXCursor>,
   ffi.Pointer<CXCursor>,
   ffi.Pointer<ffi.Void>,
 );
 
-/// Visitor is a function pointer with parameters having pointers to cxcursor
-/// instead of cxcursor by default.
-int clang_visitChildren_wrap(
-  ffi.Pointer<CXCursor> parent,
-  ffi.Pointer<ffi.NativeFunction<ModifiedCXCursorVisitor_1>> _modifiedVisitor,
-  ffi.Pointer<ffi.Void> clientData,
-) {
-  return _clang_visitChildren_wrap(
-    parent,
-    _modifiedVisitor,
-    clientData,
-  );
-}
-
-final _dart_clang_visitChildren_wrap _clang_visitChildren_wrap =
-    _dylib.lookupFunction<_c_clang_visitChildren_wrap,
-        _dart_clang_visitChildren_wrap>('clang_visitChildren_wrap');
-
 typedef _c_clang_visitChildren_wrap = ffi.Uint32 Function(
   ffi.Pointer<CXCursor> parent,
   ffi.Pointer<ffi.NativeFunction<ModifiedCXCursorVisitor_1>> _modifiedVisitor,
@@ -2030,3 +1930,136 @@
   ffi.Pointer<ffi.NativeFunction<ModifiedCXCursorVisitor_1>> _modifiedVisitor,
   ffi.Pointer<ffi.Void> clientData,
 );
+
+typedef _c_clang_Cursor_getNumArguments_wrap = ffi.Int32 Function(
+  ffi.Pointer<CXCursor> cursor,
+);
+
+typedef _dart_clang_Cursor_getNumArguments_wrap = int Function(
+  ffi.Pointer<CXCursor> cursor,
+);
+
+typedef _c_clang_Cursor_getArgument_wrap = ffi.Pointer<CXCursor> Function(
+  ffi.Pointer<CXCursor> cursor,
+  ffi.Uint32 i,
+);
+
+typedef _dart_clang_Cursor_getArgument_wrap = ffi.Pointer<CXCursor> Function(
+  ffi.Pointer<CXCursor> cursor,
+  int i,
+);
+
+typedef _c_clang_getNumArgTypes_wrap = ffi.Int32 Function(
+  ffi.Pointer<CXType> cxtype,
+);
+
+typedef _dart_clang_getNumArgTypes_wrap = int Function(
+  ffi.Pointer<CXType> cxtype,
+);
+
+typedef _c_clang_getArgType_wrap = ffi.Pointer<CXType> Function(
+  ffi.Pointer<CXType> cxtype,
+  ffi.Uint32 i,
+);
+
+typedef _dart_clang_getArgType_wrap = ffi.Pointer<CXType> Function(
+  ffi.Pointer<CXType> cxtype,
+  int i,
+);
+
+typedef _c_clang_getEnumConstantDeclValue_wrap = ffi.Int64 Function(
+  ffi.Pointer<CXCursor> cursor,
+);
+
+typedef _dart_clang_getEnumConstantDeclValue_wrap = int Function(
+  ffi.Pointer<CXCursor> cursor,
+);
+
+typedef _c_clang_equalRanges_wrap = ffi.Uint32 Function(
+  ffi.Pointer<CXSourceRange> c1,
+  ffi.Pointer<CXSourceRange> c2,
+);
+
+typedef _dart_clang_equalRanges_wrap = int Function(
+  ffi.Pointer<CXSourceRange> c1,
+  ffi.Pointer<CXSourceRange> c2,
+);
+
+typedef _c_clang_Cursor_getCommentRange_wrap = ffi.Pointer<CXSourceRange>
+    Function(
+  ffi.Pointer<CXCursor> cursor,
+);
+
+typedef _dart_clang_Cursor_getCommentRange_wrap = ffi.Pointer<CXSourceRange>
+    Function(
+  ffi.Pointer<CXCursor> cursor,
+);
+
+typedef _c_clang_Cursor_getRawCommentText_wrap = ffi.Pointer<CXString> Function(
+  ffi.Pointer<CXCursor> cursor,
+);
+
+typedef _dart_clang_Cursor_getRawCommentText_wrap = ffi.Pointer<CXString>
+    Function(
+  ffi.Pointer<CXCursor> cursor,
+);
+
+typedef _c_clang_Cursor_getBriefCommentText_wrap = ffi.Pointer<CXString>
+    Function(
+  ffi.Pointer<CXCursor> cursor,
+);
+
+typedef _dart_clang_Cursor_getBriefCommentText_wrap = ffi.Pointer<CXString>
+    Function(
+  ffi.Pointer<CXCursor> cursor,
+);
+
+typedef _c_clang_getCursorLocation_wrap = ffi.Pointer<CXSourceLocation>
+    Function(
+  ffi.Pointer<CXCursor> cursor,
+);
+
+typedef _dart_clang_getCursorLocation_wrap = ffi.Pointer<CXSourceLocation>
+    Function(
+  ffi.Pointer<CXCursor> cursor,
+);
+
+typedef _c_clang_getFileLocation_wrap = ffi.Void Function(
+  ffi.Pointer<CXSourceLocation> location,
+  ffi.Pointer<ffi.Pointer<ffi.Void>> file,
+  ffi.Pointer<ffi.Uint32> line,
+  ffi.Pointer<ffi.Uint32> column,
+  ffi.Pointer<ffi.Uint32> offset,
+);
+
+typedef _dart_clang_getFileLocation_wrap = void Function(
+  ffi.Pointer<CXSourceLocation> location,
+  ffi.Pointer<ffi.Pointer<ffi.Void>> file,
+  ffi.Pointer<ffi.Uint32> line,
+  ffi.Pointer<ffi.Uint32> column,
+  ffi.Pointer<ffi.Uint32> offset,
+);
+
+typedef _c_clang_getFileName_wrap = ffi.Pointer<CXString> Function(
+  ffi.Pointer<ffi.Void> SFile,
+);
+
+typedef _dart_clang_getFileName_wrap = ffi.Pointer<CXString> Function(
+  ffi.Pointer<ffi.Void> SFile,
+);
+
+typedef _c_clang_getNumElements_wrap = ffi.Uint64 Function(
+  ffi.Pointer<CXType> cxtype,
+);
+
+typedef _dart_clang_getNumElements_wrap = int Function(
+  ffi.Pointer<CXType> cxtype,
+);
+
+typedef _c_clang_getArrayElementType_wrap = ffi.Pointer<CXType> Function(
+  ffi.Pointer<CXType> cxtype,
+);
+
+typedef _dart_clang_getArrayElementType_wrap = ffi.Pointer<CXType> Function(
+  ffi.Pointer<CXType> cxtype,
+);
diff --git a/lib/src/header_parser/data.dart b/lib/src/header_parser/data.dart
index 900c0ff..c1b57bf 100644
--- a/lib/src/header_parser/data.dart
+++ b/lib/src/header_parser/data.dart
@@ -3,7 +3,12 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:ffigen/src/config_provider.dart';
+import 'clang_bindings/clang_bindings.dart' show Clang;
+
 /// Holds all Global shared variables.
 
 /// Holds configurations.
 Config config;
+
+/// Holds clang functions.
+Clang clang;
diff --git a/lib/src/header_parser/parser.dart b/lib/src/header_parser/parser.dart
index f50e2e5..c35dd3c 100644
--- a/lib/src/header_parser/parser.dart
+++ b/lib/src/header_parser/parser.dart
@@ -10,8 +10,8 @@
 import 'package:ffigen/src/header_parser/translation_unit_parser.dart';
 import 'package:logging/logging.dart';
 
-import 'clang_bindings/clang_bindings.dart' as clang;
-import 'data.dart' as data;
+import 'clang_bindings/clang_bindings.dart' as clang_types;
+import 'data.dart';
 import 'utils.dart';
 
 /// Main entrypoint for header_parser.
@@ -22,8 +22,9 @@
 
   final library = Library(
     bindings: bindings,
-    initFunctionIdentifier: data.config.initFunctionName,
-    header: data.config.preamble,
+    name: config.wrapperName,
+    description: config.wrapperDocComment,
+    header: config.preamble,
   );
 
   if (sort) {
@@ -40,9 +41,9 @@
 
 /// initialises parser, clears any previous values.
 void initParser(Config c) {
-  data.config = c;
+  config = c;
 
-  clang.init(DynamicLibrary.open(data.config.libclang_dylib_path));
+  clang = clang_types.Clang(DynamicLibrary.open(config.libclang_dylib_path));
 }
 
 /// Parses source files and adds generated bindings to [bindings].
@@ -51,18 +52,18 @@
 
   Pointer<Pointer<Utf8>> clangCmdArgs = nullptr;
   var cmdLen = 0;
-  if (data.config.compilerOpts != null) {
-    clangCmdArgs = createDynamicStringArray(data.config.compilerOpts);
-    cmdLen = data.config.compilerOpts.length;
+  if (config.compilerOpts != null) {
+    clangCmdArgs = createDynamicStringArray(config.compilerOpts);
+    cmdLen = config.compilerOpts.length;
   }
 
   // Contains all bindings.
   final bindings = <Binding>[];
 
   // Log all headers for user.
-  _logger.info('Input Headers: ${data.config.headers}');
+  _logger.info('Input Headers: ${config.headers}');
 
-  for (final headerLocation in data.config.headers) {
+  for (final headerLocation in config.headers) {
     _logger.fine('Creating TranslationUnit for header: $headerLocation');
 
     final tu = clang.clang_parseTranslationUnit(
@@ -72,7 +73,7 @@
       cmdLen,
       nullptr,
       0,
-      clang.CXTranslationUnit_Flags.CXTranslationUnit_SkipFunctionBodies,
+      clang_types.CXTranslationUnit_Flags.CXTranslationUnit_SkipFunctionBodies,
     );
 
     if (tu == nullptr) {
@@ -92,8 +93,8 @@
     clang.clang_disposeTranslationUnit(tu);
   }
 
-  if (data.config.compilerOpts != null) {
-    clangCmdArgs.dispose(data.config.compilerOpts.length);
+  if (config.compilerOpts != null) {
+    clangCmdArgs.dispose(config.compilerOpts.length);
   }
   clang.clang_disposeIndex(index);
   return bindings;
diff --git a/lib/src/header_parser/sub_parsers/enumdecl_parser.dart b/lib/src/header_parser/sub_parsers/enumdecl_parser.dart
index 25266e1..a98738b 100644
--- a/lib/src/header_parser/sub_parsers/enumdecl_parser.dart
+++ b/lib/src/header_parser/sub_parsers/enumdecl_parser.dart
@@ -8,7 +8,8 @@
 import 'package:ffigen/src/header_parser/data.dart';
 import 'package:logging/logging.dart';
 
-import '../clang_bindings/clang_bindings.dart' as clang;
+import '../clang_bindings/clang_bindings.dart' as clang_types;
+import '../data.dart' show clang;
 import '../includer.dart';
 import '../utils.dart';
 
@@ -19,7 +20,7 @@
 
 /// Parses a function declaration.
 EnumClass parseEnumDeclaration(
-  Pointer<clang.CXCursor> cursor, {
+  Pointer<clang_types.CXCursor> cursor, {
 
   /// Optionally provide name to use (useful in case struct is inside a typedef).
   String name,
@@ -42,11 +43,11 @@
   return _enumClass;
 }
 
-void _addEnumConstant(Pointer<clang.CXCursor> cursor) {
+void _addEnumConstant(Pointer<clang_types.CXCursor> cursor) {
   final resultCode = clang.clang_visitChildren_wrap(
     cursor,
     Pointer.fromFunction(
-        _enumCursorVisitor, clang.CXChildVisitResult.CXChildVisit_Break),
+        _enumCursorVisitor, clang_types.CXChildVisitResult.CXChildVisit_Break),
     nullptr,
   );
 
@@ -57,12 +58,12 @@
 ///
 /// Invoked on every enum directly under rootCursor.
 /// Used for for extracting enum values.
-int _enumCursorVisitor(Pointer<clang.CXCursor> cursor,
-    Pointer<clang.CXCursor> parent, Pointer<Void> clientData) {
+int _enumCursorVisitor(Pointer<clang_types.CXCursor> cursor,
+    Pointer<clang_types.CXCursor> parent, Pointer<Void> clientData) {
   try {
     _logger.finest('  enumCursorVisitor: ${cursor.completeStringRepr()}');
     switch (clang.clang_getCursorKind_wrap(cursor)) {
-      case clang.CXCursorKind.CXCursor_EnumConstantDecl:
+      case clang_types.CXCursorKind.CXCursor_EnumConstantDecl:
         _addEnumConstantToEnumClass(cursor);
         break;
       default:
@@ -75,11 +76,11 @@
     _logger.severe(s);
     rethrow;
   }
-  return clang.CXChildVisitResult.CXChildVisit_Continue;
+  return clang_types.CXChildVisitResult.CXChildVisit_Continue;
 }
 
 /// Adds the parameter to func in [functiondecl_parser.dart].
-void _addEnumConstantToEnumClass(Pointer<clang.CXCursor> cursor) {
+void _addEnumConstantToEnumClass(Pointer<clang_types.CXCursor> cursor) {
   _enumClass.enumConstants.add(
     EnumConstant(
         dartDoc: getCursorDocComment(
diff --git a/lib/src/header_parser/sub_parsers/functiondecl_parser.dart b/lib/src/header_parser/sub_parsers/functiondecl_parser.dart
index 98b93d0..18c341b 100644
--- a/lib/src/header_parser/sub_parsers/functiondecl_parser.dart
+++ b/lib/src/header_parser/sub_parsers/functiondecl_parser.dart
@@ -8,7 +8,8 @@
 import 'package:ffigen/src/header_parser/data.dart';
 import 'package:logging/logging.dart';
 
-import '../clang_bindings/clang_bindings.dart' as clang;
+import '../clang_bindings/clang_bindings.dart' as clang_types;
+import '../data.dart' show clang;
 import '../includer.dart';
 import '../utils.dart';
 
@@ -18,7 +19,7 @@
 Func _func;
 
 /// Parses a function declaration.
-Func parseFunctionDeclaration(Pointer<clang.CXCursor> cursor) {
+Func parseFunctionDeclaration(Pointer<clang_types.CXCursor> cursor) {
   _func = null;
   structByValueParameter = false;
   unimplementedParameterType = false;
@@ -49,7 +50,10 @@
     }
 
     _func = Func(
-      dartDoc: getCursorDocComment(cursor),
+      dartDoc: getCursorDocComment(
+        cursor,
+        nesting.length + commentPrefix.length,
+      ),
       name: config.functionDecl.getPrefixedName(funcName),
       lookupSymbolName: funcName,
       returnType: rt,
@@ -63,11 +67,11 @@
 
 bool structByValueParameter = false;
 bool unimplementedParameterType = false;
-Type _getFunctionReturnType(Pointer<clang.CXCursor> cursor) {
+Type _getFunctionReturnType(Pointer<clang_types.CXCursor> cursor) {
   return cursor.returnType().toCodeGenTypeAndDispose();
 }
 
-List<Parameter> _getParameters(Pointer<clang.CXCursor> cursor) {
+List<Parameter> _getParameters(Pointer<clang_types.CXCursor> cursor) {
   final parameters = <Parameter>[];
 
   final totalArgs = clang.clang_Cursor_getNumArguments_wrap(cursor);
@@ -99,6 +103,6 @@
   return parameters;
 }
 
-Type _getParameterType(Pointer<clang.CXCursor> cursor) {
+Type _getParameterType(Pointer<clang_types.CXCursor> cursor) {
   return cursor.type().toCodeGenTypeAndDispose();
 }
diff --git a/lib/src/header_parser/sub_parsers/structdecl_parser.dart b/lib/src/header_parser/sub_parsers/structdecl_parser.dart
index a71f69e..309ab39 100644
--- a/lib/src/header_parser/sub_parsers/structdecl_parser.dart
+++ b/lib/src/header_parser/sub_parsers/structdecl_parser.dart
@@ -7,7 +7,7 @@
 import 'package:ffigen/src/code_generator.dart';
 import 'package:logging/logging.dart';
 
-import '../clang_bindings/clang_bindings.dart' as clang;
+import '../clang_bindings/clang_bindings.dart' as clang_types;
 import '../data.dart';
 import '../includer.dart';
 import '../utils.dart';
@@ -19,7 +19,7 @@
 
 /// Parses a struct declaration.
 Struc parseStructDeclaration(
-  Pointer<clang.CXCursor> cursor, {
+  Pointer<clang_types.CXCursor> cursor, {
 
   /// Optionally provide name (useful in case struct is inside a typedef).
   String name,
@@ -53,7 +53,7 @@
 }
 
 List<Member> _members;
-List<Member> _getMembers(Pointer<clang.CXCursor> cursor, String structName) {
+List<Member> _getMembers(Pointer<clang_types.CXCursor> cursor, String structName) {
   _members = [];
   arrayMember = false;
   nestedStructMember = false;
@@ -62,7 +62,7 @@
   final resultCode = clang.clang_visitChildren_wrap(
       cursor,
       Pointer.fromFunction(
-          _structMembersVisitor, clang.CXChildVisitResult.CXChildVisit_Break),
+          _structMembersVisitor, clang_types.CXChildVisitResult.CXChildVisit_Break),
       nullptr);
 
   visitChildrenResultChecker(resultCode);
@@ -98,10 +98,10 @@
 /// Visitor for the struct cursor [CXCursorKind.CXCursor_StructDecl].
 ///
 /// Child visitor invoked on struct cursor.
-int _structMembersVisitor(Pointer<clang.CXCursor> cursor,
-    Pointer<clang.CXCursor> parent, Pointer<Void> clientData) {
+int _structMembersVisitor(Pointer<clang_types.CXCursor> cursor,
+    Pointer<clang_types.CXCursor> parent, Pointer<Void> clientData) {
   try {
-    if (cursor.kind() == clang.CXCursorKind.CXCursor_FieldDecl) {
+    if (cursor.kind() == clang_types.CXCursorKind.CXCursor_FieldDecl) {
       _logger.finer('===== member: ${cursor.completeStringRepr()}');
 
       final mt = cursor.type().toCodeGenTypeAndDispose();
@@ -142,5 +142,5 @@
     _logger.severe(s);
     rethrow;
   }
-  return clang.CXChildVisitResult.CXChildVisit_Continue;
+  return clang_types.CXChildVisitResult.CXChildVisit_Continue;
 }
diff --git a/lib/src/header_parser/sub_parsers/typedefdecl_parser.dart b/lib/src/header_parser/sub_parsers/typedefdecl_parser.dart
index 30ec2ab..8d2a831 100644
--- a/lib/src/header_parser/sub_parsers/typedefdecl_parser.dart
+++ b/lib/src/header_parser/sub_parsers/typedefdecl_parser.dart
@@ -7,7 +7,8 @@
 import 'package:ffigen/src/code_generator.dart';
 import 'package:logging/logging.dart';
 
-import '../clang_bindings/clang_bindings.dart' as clang;
+import '../clang_bindings/clang_bindings.dart' as clang_types;
+import '../data.dart' show clang;
 import '../sub_parsers/enumdecl_parser.dart';
 import '../sub_parsers/structdecl_parser.dart';
 import '../utils.dart';
@@ -21,7 +22,7 @@
 String _typedefName;
 
 /// Parses a typedef declaration.
-Binding parseTypedefDeclaration(Pointer<clang.CXCursor> cursor) {
+Binding parseTypedefDeclaration(Pointer<clang_types.CXCursor> cursor) {
   _binding = null;
   // Name of typedef.
   _typedefName = cursor.spelling();
@@ -29,7 +30,7 @@
   final resultCode = clang.clang_visitChildren_wrap(
     cursor,
     Pointer.fromFunction(_typedefdeclarationCursorVisitor,
-        clang.CXChildVisitResult.CXChildVisit_Break),
+        clang_types.CXChildVisitResult.CXChildVisit_Break),
     nullptr,
   );
 
@@ -43,17 +44,17 @@
 ///
 /// Visitor invoked on cursor of type declaration returned by
 /// [clang.clang_getTypeDeclaration_wrap].
-int _typedefdeclarationCursorVisitor(Pointer<clang.CXCursor> cursor,
-    Pointer<clang.CXCursor> parent, Pointer<Void> clientData) {
+int _typedefdeclarationCursorVisitor(Pointer<clang_types.CXCursor> cursor,
+    Pointer<clang_types.CXCursor> parent, Pointer<Void> clientData) {
   try {
     _logger.finest(
         'typedefdeclarationCursorVisitor: ${cursor.completeStringRepr()}');
 
     switch (clang.clang_getCursorKind_wrap(cursor)) {
-      case clang.CXCursorKind.CXCursor_StructDecl:
+      case clang_types.CXCursorKind.CXCursor_StructDecl:
         _binding = parseStructDeclaration(cursor, name: _typedefName);
         break;
-      case clang.CXCursorKind.CXCursor_EnumDecl:
+      case clang_types.CXCursorKind.CXCursor_EnumDecl:
         _binding = parseEnumDeclaration(cursor, name: _typedefName);
         break;
       default:
@@ -67,5 +68,5 @@
     _logger.severe(s);
     rethrow;
   }
-  return clang.CXChildVisitResult.CXChildVisit_Continue;
+  return clang_types.CXChildVisitResult.CXChildVisit_Continue;
 }
diff --git a/lib/src/header_parser/translation_unit_parser.dart b/lib/src/header_parser/translation_unit_parser.dart
index a1b794b..73c8880 100644
--- a/lib/src/header_parser/translation_unit_parser.dart
+++ b/lib/src/header_parser/translation_unit_parser.dart
@@ -7,7 +7,8 @@
 import 'package:ffigen/src/code_generator.dart';
 import 'package:logging/logging.dart';
 
-import 'clang_bindings/clang_bindings.dart' as clang;
+import 'clang_bindings/clang_bindings.dart' as clang_types;
+import 'data.dart' show clang;
 import 'includer.dart';
 import 'sub_parsers/enumdecl_parser.dart';
 import 'sub_parsers/functiondecl_parser.dart';
@@ -20,13 +21,14 @@
 List<Binding> _bindings;
 
 /// Parses the translation unit and returns the generated bindings.
-List<Binding> parseTranslationUnit(Pointer<clang.CXCursor> translationUnitCursor) {
+List<Binding> parseTranslationUnit(
+    Pointer<clang_types.CXCursor> translationUnitCursor) {
   _bindings = [];
 
   final resultCode = clang.clang_visitChildren_wrap(
     translationUnitCursor,
     Pointer.fromFunction(
-        _rootCursorVisitor, clang.CXChildVisitResult.CXChildVisit_Break),
+        _rootCursorVisitor, clang_types.CXChildVisitResult.CXChildVisit_Break),
     nullptr,
   );
 
@@ -36,22 +38,22 @@
 }
 
 /// Child visitor invoked on translationUnitCursor [CXCursorKind.CXCursor_TranslationUnit].
-int _rootCursorVisitor(Pointer<clang.CXCursor> cursor,
-    Pointer<clang.CXCursor> parent, Pointer<Void> clientData) {
+int _rootCursorVisitor(Pointer<clang_types.CXCursor> cursor,
+    Pointer<clang_types.CXCursor> parent, Pointer<Void> clientData) {
   try {
     if (shouldIncludeRootCursor(cursor.sourceFileName())) {
       _logger.finest('rootCursorVisitor: ${cursor.completeStringRepr()}');
       switch (clang.clang_getCursorKind_wrap(cursor)) {
-        case clang.CXCursorKind.CXCursor_FunctionDecl:
+        case clang_types.CXCursorKind.CXCursor_FunctionDecl:
           addToBindings(parseFunctionDeclaration(cursor));
           break;
-        case clang.CXCursorKind.CXCursor_TypedefDecl:
+        case clang_types.CXCursorKind.CXCursor_TypedefDecl:
           addToBindings(parseTypedefDeclaration(cursor));
           break;
-        case clang.CXCursorKind.CXCursor_StructDecl:
+        case clang_types.CXCursorKind.CXCursor_StructDecl:
           addToBindings(parseStructDeclaration(cursor));
           break;
-        case clang.CXCursorKind.CXCursor_EnumDecl:
+        case clang_types.CXCursorKind.CXCursor_EnumDecl:
           addToBindings(parseEnumDeclaration(cursor));
           break;
         default:
@@ -69,7 +71,7 @@
     _logger.severe(s);
     rethrow;
   }
-  return clang.CXChildVisitResult.CXChildVisit_Continue;
+  return clang_types.CXChildVisitResult.CXChildVisit_Continue;
 }
 
 /// Adds to binding if not null.
diff --git a/lib/src/header_parser/type_extractor/extractor.dart b/lib/src/header_parser/type_extractor/extractor.dart
index 65fd6f0..6c59dd6 100644
--- a/lib/src/header_parser/type_extractor/extractor.dart
+++ b/lib/src/header_parser/type_extractor/extractor.dart
@@ -8,7 +8,7 @@
 import 'package:ffigen/src/code_generator.dart';
 import 'package:logging/logging.dart';
 
-import '../clang_bindings/clang_bindings.dart' as clang;
+import '../clang_bindings/clang_bindings.dart' as clang_types;
 import '../data.dart';
 import '../includer.dart';
 import '../sub_parsers/structdecl_parser.dart';
@@ -20,17 +20,17 @@
 const _padding = '  ';
 
 /// Converts cxtype to a typestring code_generator can accept.
-Type getCodeGenType(Pointer<clang.CXType> cxtype, {String parentName}) {
+Type getCodeGenType(Pointer<clang_types.CXType> cxtype, {String parentName}) {
   _logger.fine('${_padding}getCodeGenType ${cxtype.completeStringRepr()}');
   final kind = cxtype.kind();
 
   switch (kind) {
-    case clang.CXTypeKind.CXType_Pointer:
+    case clang_types.CXTypeKind.CXType_Pointer:
       final pt = clang.clang_getPointeeType_wrap(cxtype);
       final s = getCodeGenType(pt, parentName: parentName);
       pt.dispose();
       return Type.pointer(s);
-    case clang.CXTypeKind.CXType_Typedef:
+    case clang_types.CXTypeKind.CXType_Typedef:
       // Get name from typedef name if config allows.
       if (config.useSupportedTypedefs) {
         final spelling = cxtype.spelling();
@@ -46,30 +46,34 @@
       final s = getCodeGenType(ct, parentName: parentName ?? cxtype.spelling());
       ct.dispose();
       return s;
-    case clang.CXTypeKind.CXType_Elaborated:
+    case clang_types.CXTypeKind.CXType_Elaborated:
       final et = clang.clang_Type_getNamedType_wrap(cxtype);
       final s = getCodeGenType(et, parentName: parentName);
       et.dispose();
       return s;
-    case clang.CXTypeKind.CXType_Record:
+    case clang_types.CXTypeKind.CXType_Record:
       return _extractfromRecord(cxtype);
-    case clang.CXTypeKind.CXType_Enum:
+    case clang_types.CXTypeKind.CXType_Enum:
       return Type.nativeType(
         enumNativeType,
       );
-    case clang.CXTypeKind
+    case clang_types.CXTypeKind
         .CXType_FunctionProto: // Primarily used for function pointers.
       return _extractFromFunctionProto(cxtype, parentName);
-    case clang.CXTypeKind
+    case clang_types.CXTypeKind
         .CXType_ConstantArray: // Primarily used for constant array in struct members.
       return Type.constantArray(
         clang.clang_getNumElements_wrap(cxtype),
-        clang.clang_getArrayElementType_wrap(cxtype).toCodeGenTypeAndDispose(),
+        clang
+            .clang_getArrayElementType_wrap(cxtype)
+            .toCodeGenTypeAndDispose(),
       );
-    case clang.CXTypeKind
+    case clang_types.CXTypeKind
         .CXType_IncompleteArray: // Primarily used for incomplete array in function parameters.
       return Type.incompleteArray(
-        clang.clang_getArrayElementType_wrap(cxtype).toCodeGenTypeAndDispose(),
+        clang
+            .clang_getArrayElementType_wrap(cxtype)
+            .toCodeGenTypeAndDispose(),
       );
     default:
       if (cxTypeKindToSupportedNativeTypes.containsKey(kind)) {
@@ -85,14 +89,14 @@
   }
 }
 
-Type _extractfromRecord(Pointer<clang.CXType> cxtype) {
+Type _extractfromRecord(Pointer<clang_types.CXType> cxtype) {
   Type type;
 
   final cursor = clang.clang_getTypeDeclaration_wrap(cxtype);
   _logger.fine('${_padding}_extractfromRecord: ${cursor.completeStringRepr()}');
 
   switch (clang.clang_getCursorKind_wrap(cursor)) {
-    case clang.CXCursorKind.CXCursor_StructDecl:
+    case clang_types.CXCursorKind.CXCursor_StructDecl:
       final cxtype = cursor.type();
       var structName = cursor.spelling();
       if (structName == '') {
@@ -100,7 +104,8 @@
         structName = cxtype.spelling();
       }
 
-      final fixedStructName = config.structDecl.getPrefixedName(structName);
+      final fixedStructName =
+          config.structDecl.getPrefixedName(structName);
 
       // Also add a struct binding, if its unseen.
       // TODO(23): Check if we should auto add struct.
@@ -130,7 +135,7 @@
 
 // Used for function pointer arguments.
 Type _extractFromFunctionProto(
-    Pointer<clang.CXType> cxtype, String parentName) {
+    Pointer<clang_types.CXType> cxtype, String parentName) {
   var name = parentName;
 
   // Set a name for typedefc incase it was null or empty.
@@ -155,17 +160,19 @@
       Parameter(name: '', type: pt),
     );
   }
-  final typedefC = TypedefC(
+  final typedefC = Typedef(
     name: name,
+    typedefType: TypedefType.C,
     parameters: _parameters,
-    returnType:
-        clang.clang_getResultType_wrap(cxtype).toCodeGenTypeAndDispose(),
+    returnType: clang
+        .clang_getResultType_wrap(cxtype)
+        .toCodeGenTypeAndDispose(),
   );
 
   return Type.nativeFunc(typedefC);
 }
 
-/// Generate a unique string for naming in [TypedefC].
+/// Generate a unique string for naming in [Typedef].
 String _getNextUniqueString(String prefix) {
   int i = _uniqueStringCounters[prefix] ?? 0;
   i++;
diff --git a/lib/src/header_parser/utils.dart b/lib/src/header_parser/utils.dart
index c5b7f5f..dc7efcf 100644
--- a/lib/src/header_parser/utils.dart
+++ b/lib/src/header_parser/utils.dart
@@ -9,7 +9,7 @@
 import 'package:logging/logging.dart';
 
 import '../strings.dart' as strings;
-import 'clang_bindings/clang_bindings.dart' as clang;
+import 'clang_bindings/clang_bindings.dart' as clang_types;
 import 'data.dart';
 import 'type_extractor/extractor.dart';
 
@@ -25,7 +25,7 @@
 
 /// Logs the warnings/errors returned by clang for a translation unit.
 void logTuDiagnostics(
-  Pointer<clang.CXTranslationUnitImpl> tu,
+  Pointer<clang_types.CXTranslationUnitImpl> tu,
   Logger logger,
   String header,
 ) {
@@ -39,23 +39,25 @@
     final diag = clang.clang_getDiagnostic(tu, i);
     final cxstring = clang.clang_formatDiagnostic_wrap(
       diag,
-      clang.CXDiagnosticDisplayOptions.CXDiagnostic_DisplaySourceLocation |
-          clang.CXDiagnosticDisplayOptions.CXDiagnostic_DisplayColumn |
-          clang.CXDiagnosticDisplayOptions.CXDiagnostic_DisplayCategoryName,
+      clang_types
+              .CXDiagnosticDisplayOptions.CXDiagnostic_DisplaySourceLocation |
+          clang_types.CXDiagnosticDisplayOptions.CXDiagnostic_DisplayColumn |
+          clang_types
+              .CXDiagnosticDisplayOptions.CXDiagnostic_DisplayCategoryName,
     );
     logger.warning('    ' + cxstring.toStringAndDispose());
     clang.clang_disposeDiagnostic(diag);
   }
 }
 
-extension CXSourceRangeExt on Pointer<clang.CXSourceRange> {
+extension CXSourceRangeExt on Pointer<clang_types.CXSourceRange> {
   void dispose() {
     free(this);
   }
 }
 
-extension CXCursorExt on Pointer<clang.CXCursor> {
-  /// Returns the kind int from [clang.CXCursorKind].
+extension CXCursorExt on Pointer<clang_types.CXCursor> {
+  /// Returns the kind int from [clang_types.CXCursorKind].
   int kind() {
     return clang.clang_getCursorKind_wrap(this);
   }
@@ -65,7 +67,7 @@
     return clang.clang_getCursorSpelling_wrap(this).toStringAndDispose();
   }
 
-  /// Spelling for a [clang.CXCursorKind], useful for debug purposes.
+  /// Spelling for a [clang_types.CXCursorKind], useful for debug purposes.
   String kindSpelling() {
     return clang
         .clang_getCursorKindSpelling_wrap(clang.clang_getCursorKind_wrap(this))
@@ -82,14 +84,14 @@
   }
 
   /// Dispose type using [type.dispose].
-  Pointer<clang.CXType> type() {
+  Pointer<clang_types.CXType> type() {
     return clang.clang_getCursorType_wrap(this);
   }
 
   /// Only valid for [clang.CXCursorKind.CXCursor_FunctionDecl].
   ///
   /// Dispose type using [type.dispose].
-  Pointer<clang.CXType> returnType() {
+  Pointer<clang_types.CXType> returnType() {
     final t = type();
     final r = clang.clang_getResultType_wrap(t);
     t.dispose();
@@ -123,15 +125,15 @@
 const commentPrefix = '/// ';
 const nesting = '  ';
 
-/// Stores the [clang.CXSourceRange] of the last comment.
-Pointer<clang.CXSourceRange> lastCommentRange = nullptr;
+/// Stores the [clang_types.CXSourceRange] of the last comment.
+Pointer<clang_types.CXSourceRange> lastCommentRange = nullptr;
 
 /// Returns a cursor's associated comment.
 ///
 /// The given string is wrapped at line width = 80 - [indent]. The [indent] is
 /// [commentPrefix.dimensions] by default because a comment starts with
 /// [commentPrefix].
-String getCursorDocComment(Pointer<clang.CXCursor> cursor,
+String getCursorDocComment(Pointer<clang_types.CXCursor> cursor,
     [int indent = commentPrefix.length]) {
   String formattedDocComment;
   final currentCommentRange = clang.clang_Cursor_getCommentRange_wrap(cursor);
@@ -214,25 +216,25 @@
   return sb.toString().trim();
 }
 
-extension CXTypeExt on Pointer<clang.CXType> {
-  /// Get code_gen [Type] representation of [clang.CXType].
+extension CXTypeExt on Pointer<clang_types.CXType> {
+  /// Get code_gen [Type] representation of [clang_types.CXType].
   Type toCodeGenType() {
     return getCodeGenType(this);
   }
 
-  /// Get code_gen [Type] representation of [clang.CXType] and dispose the type.
+  /// Get code_gen [Type] representation of [clang_types.CXType] and dispose the type.
   Type toCodeGenTypeAndDispose() {
     final t = getCodeGenType(this);
     dispose();
     return t;
   }
 
-  /// Spelling for a [clang.CXTypeKind], useful for debug purposes.
+  /// Spelling for a [clang_types.CXTypeKind], useful for debug purposes.
   String spelling() {
     return clang.clang_getTypeSpelling_wrap(this).toStringAndDispose();
   }
 
-  /// Returns the typeKind int from [clang.CXTypeKind].
+  /// Returns the typeKind int from [clang_types.CXTypeKind].
   int kind() {
     return ref.kind;
   }
@@ -253,7 +255,7 @@
   }
 }
 
-extension CXStringExt on Pointer<clang.CXString> {
+extension CXStringExt on Pointer<clang_types.CXString> {
   /// Convert CXString to a Dart string
   ///
   /// Make sure to dispose CXstring using dispose method, or use the
diff --git a/lib/src/strings.dart b/lib/src/strings.dart
index 27e1d50..5951ef5 100644
--- a/lib/src/strings.dart
+++ b/lib/src/strings.dart
@@ -71,7 +71,8 @@
 const commentTypeSet = {brief, full, none};
 
 // Library input.
-const initFunctionName = 'init-function-name';
+const name = 'name';
+const description = 'description';
 const preamble = 'preamble';
 
 // Dynamic library names.
diff --git a/test/code_generator_test.dart b/test/code_generator_test.dart
index cddaab4..a7a66c9 100644
--- a/test/code_generator_test.dart
+++ b/test/code_generator_test.dart
@@ -11,6 +11,7 @@
   group('code_generator: ', () {
     test('Function Binding (primitives, pointers)', () {
       final library = Library(
+        name: 'Bindings',
         bindings: [
           Func(
             name: 'noParam',
@@ -81,26 +82,52 @@
       );
       try {
         expect(gen, '''/// AUTO GENERATED FILE, DO NOT EDIT.
-///
+/// 
 /// Generated by `package:ffigen`.
 import 'dart:ffi' as ffi;
 
+class Bindings{
 /// Holds the Dynamic library.
-ffi.DynamicLibrary _dylib;
+final ffi.DynamicLibrary _dylib;
 
-/// Initialises the Dynamic library.
-void init(ffi.DynamicLibrary dynamicLibrary){
-  _dylib = dynamicLibrary;
-}
+/// The symbols are looked up in [dynamicLibrary].
+Bindings(ffi.DynamicLibrary dynamicLibrary): _dylib = dynamicLibrary;
+
 /// Just a test function
 /// heres another line
 int noParam(
 ) {
+_noParam ??= _dylib.lookupFunction<_c_noParam,_dart_noParam>('noParam');
   return _noParam(
   );
 }
+_dart_noParam _noParam;
 
-final _dart_noParam _noParam = _dylib.lookupFunction<_c_noParam,_dart_noParam>('noParam');
+int withPrimitiveParam(
+  int a,
+  int b,
+) {
+_withPrimitiveParam ??= _dylib.lookupFunction<_c_withPrimitiveParam,_dart_withPrimitiveParam>('withPrimitiveParam');
+  return _withPrimitiveParam(
+    a,
+    b,
+  );
+}
+_dart_withPrimitiveParam _withPrimitiveParam;
+
+ffi.Pointer<ffi.Double> withPointerParam(
+  ffi.Pointer<ffi.Int32> a,
+  ffi.Pointer<ffi.Pointer<ffi.Uint8>> b,
+) {
+_withPointerParam ??= _dylib.lookupFunction<_c_withPointerParam,_dart_withPointerParam>('withPointerParam');
+  return _withPointerParam(
+    a,
+    b,
+  );
+}
+_dart_withPointerParam _withPointerParam;
+
+}
 
 typedef _c_noParam = ffi.Int32 Function(
 );
@@ -108,18 +135,6 @@
 typedef _dart_noParam = int Function(
 );
 
-int withPrimitiveParam(
-  int a,
-  int b,
-) {
-  return _withPrimitiveParam(
-    a,
-    b,
-  );
-}
-
-final _dart_withPrimitiveParam _withPrimitiveParam = _dylib.lookupFunction<_c_withPrimitiveParam,_dart_withPrimitiveParam>('withPrimitiveParam');
-
 typedef _c_withPrimitiveParam = ffi.Uint8 Function(
   ffi.Int32 a,
   ffi.Uint8 b,
@@ -130,18 +145,6 @@
   int b,
 );
 
-ffi.Pointer<ffi.Double> withPointerParam(
-  ffi.Pointer<ffi.Int32> a,
-  ffi.Pointer<ffi.Pointer<ffi.Uint8>> b,
-) {
-  return _withPointerParam(
-    a,
-    b,
-  );
-}
-
-final _dart_withPointerParam _withPointerParam = _dylib.lookupFunction<_c_withPointerParam,_dart_withPointerParam>('withPointerParam');
-
 typedef _c_withPointerParam = ffi.Pointer<ffi.Double> Function(
   ffi.Pointer<ffi.Int32> a,
   ffi.Pointer<ffi.Pointer<ffi.Uint8>> b,
@@ -165,6 +168,7 @@
 
     test('Struct Binding (primitives, pointers)', () {
       final library = Library(
+        name: 'Bindings',
         bindings: [
           Struc(
             name: 'NoMember',
@@ -232,17 +236,10 @@
 
       try {
         expect(gen, '''/// AUTO GENERATED FILE, DO NOT EDIT.
-///
+/// 
 /// Generated by `package:ffigen`.
 import 'dart:ffi' as ffi;
 
-/// Holds the Dynamic library.
-ffi.DynamicLibrary _dylib;
-
-/// Initialises the Dynamic library.
-void init(ffi.DynamicLibrary dynamicLibrary){
-  _dylib = dynamicLibrary;
-}
 /// Just a test struct
 /// heres another line
 class NoMember extends ffi.Struct{
@@ -306,6 +303,7 @@
         ],
       );
       final library = Library(
+        name: 'Bindings',
         bindings: [
           struct_some,
           Func(
@@ -340,17 +338,29 @@
       try {
         //expect
         expect(gen, '''/// AUTO GENERATED FILE, DO NOT EDIT.
-///
+/// 
 /// Generated by `package:ffigen`.
 import 'dart:ffi' as ffi;
 
+class Bindings{
 /// Holds the Dynamic library.
-ffi.DynamicLibrary _dylib;
+final ffi.DynamicLibrary _dylib;
 
-/// Initialises the Dynamic library.
-void init(ffi.DynamicLibrary dynamicLibrary){
-  _dylib = dynamicLibrary;
+/// The symbols are looked up in [dynamicLibrary].
+Bindings(ffi.DynamicLibrary dynamicLibrary): _dylib = dynamicLibrary;
+
+ffi.Pointer<SomeStruc> someFunc(
+  ffi.Pointer<ffi.Pointer<SomeStruc>> some,
+) {
+_someFunc ??= _dylib.lookupFunction<_c_someFunc,_dart_someFunc>('someFunc');
+  return _someFunc(
+    some,
+  );
 }
+_dart_someFunc _someFunc;
+
+}
+
 class SomeStruc extends ffi.Struct{
   @ffi.Int32()
   int a;
@@ -363,16 +373,6 @@
 
 }
 
-ffi.Pointer<SomeStruc> someFunc(
-  ffi.Pointer<ffi.Pointer<SomeStruc>> some,
-) {
-  return _someFunc(
-    some,
-  );
-}
-
-final _dart_someFunc _someFunc = _dylib.lookupFunction<_c_someFunc,_dart_someFunc>('someFunc');
-
 typedef _c_someFunc = ffi.Pointer<SomeStruc> Function(
   ffi.Pointer<ffi.Pointer<SomeStruc>> some,
 );
@@ -397,6 +397,7 @@
         name: 'Some',
       );
       final library = Library(
+        name: 'Bindings',
         bindings: [
           Global(
             name: 'test1',
@@ -435,26 +436,31 @@
       );
       try {
         expect(gen, '''/// AUTO GENERATED FILE, DO NOT EDIT.
-///
+/// 
 /// Generated by `package:ffigen`.
 import 'dart:ffi' as ffi;
 
+class Bindings{
 /// Holds the Dynamic library.
-ffi.DynamicLibrary _dylib;
+final ffi.DynamicLibrary _dylib;
 
-/// Initialises the Dynamic library.
-void init(ffi.DynamicLibrary dynamicLibrary){
-  _dylib = dynamicLibrary;
+/// The symbols are looked up in [dynamicLibrary].
+Bindings(ffi.DynamicLibrary dynamicLibrary): _dylib = dynamicLibrary;
+
+ffi.Pointer<ffi.Int32> _test1;
+int get test1 => (_test1 ??= _dylib.lookup<ffi.Int32>('test1')).value;
+
+ffi.Pointer<ffi.Pointer<ffi.Float>> _test2;
+ffi.Pointer<ffi.Float> get test2 => (_test2 ??= _dylib.lookup<ffi.Pointer<ffi.Float>>('test2')).value;
+
+ffi.Pointer<ffi.Pointer<Some>> _test5;
+ffi.Pointer<Some> get test5 => (_test5 ??= _dylib.lookup<ffi.Pointer<Some>>('test5')).value;
+
 }
-final int test1 = _dylib.lookup<ffi.Int32>('test1').value;
-
-final ffi.Pointer<ffi.Float> test2 = _dylib.lookup<ffi.Pointer<ffi.Float>>('test2').value;
 
 class Some extends ffi.Struct{
 }
 
-final ffi.Pointer<Some> test5 = _dylib.lookup<ffi.Pointer<Some>>('test5').value;
-
 ''');
         if (file.existsSync()) {
           file.delete();
@@ -468,6 +474,7 @@
 
     test('constant', () {
       final library = Library(
+        name: 'Bindings',
         bindings: [
           Constant(
             name: 'test1',
@@ -494,17 +501,10 @@
       );
       try {
         expect(gen, '''/// AUTO GENERATED FILE, DO NOT EDIT.
-///
+/// 
 /// Generated by `package:ffigen`.
 import 'dart:ffi' as ffi;
 
-/// Holds the Dynamic library.
-ffi.DynamicLibrary _dylib;
-
-/// Initialises the Dynamic library.
-void init(ffi.DynamicLibrary dynamicLibrary){
-  _dylib = dynamicLibrary;
-}
 const int test1 = 20;
 
 const double test2 = 20.0;
@@ -522,6 +522,7 @@
 
     test('enum_class', () {
       final library = Library(
+        name: 'Bindings',
         bindings: [
           EnumClass(
             name: 'Constants',
@@ -545,17 +546,10 @@
       );
       try {
         expect(gen, '''/// AUTO GENERATED FILE, DO NOT EDIT.
-///
+/// 
 /// Generated by `package:ffigen`.
 import 'dart:ffi' as ffi;
 
-/// Holds the Dynamic library.
-ffi.DynamicLibrary _dylib;
-
-/// Initialises the Dynamic library.
-void init(ffi.DynamicLibrary dynamicLibrary){
-  _dylib = dynamicLibrary;
-}
 /// test line 1
 /// test line 2
 class Constants {
@@ -576,7 +570,7 @@
     });
     test('Internal conflict resolution', () {
       final library = Library(
-        initFunctionIdentifier: 'init_dylib',
+        name: 'init_dylib',
         bindings: [
           Func(
             name: 'test',
@@ -631,78 +625,64 @@
       );
       try {
         expect(gen, r'''/// AUTO GENERATED FILE, DO NOT EDIT.
-///
+/// 
 /// Generated by `package:ffigen`.
 import 'dart:ffi' as ffi;
 
+class init_dylib_1{
 /// Holds the Dynamic library.
-ffi.DynamicLibrary _dylib;
+final ffi.DynamicLibrary _dylib;
 
-/// Initialises the Dynamic library.
-void init_dylib_1(ffi.DynamicLibrary dynamicLibrary){
-  _dylib = dynamicLibrary;
-}
+/// The symbols are looked up in [dynamicLibrary].
+init_dylib_1(ffi.DynamicLibrary dynamicLibrary): _dylib = dynamicLibrary;
+
 void test(
 ) {
+_test_1 ??= _dylib.lookupFunction<_c_test1,_dart_test1>('test');
   return _test_1(
   );
 }
-
-final _dart_test_1 _test_1 = _dylib.lookupFunction<_c_test_1,_dart_test_1>('test');
-
-typedef _c_test_1 = ffi.Void Function(
-);
-
-typedef _dart_test_1 = void Function(
-);
+_dart_test1 _test_1;
 
 void _test(
 ) {
+__test ??= _dylib.lookupFunction<_c__test,_dart__test>('_test');
   return __test(
   );
 }
-
-final _dart__test __test = _dylib.lookupFunction<_c__test,_dart__test>('_test');
-
-typedef _c__test = ffi.Void Function(
-);
-
-typedef _dart__test = void Function(
-);
+_dart__test __test;
 
 void _c_test(
 ) {
+__c_test ??= _dylib.lookupFunction<_c__c_test,_dart__c_test>('_c_test');
   return __c_test(
   );
 }
-
-final _dart__c_test __c_test = _dylib.lookupFunction<_c__c_test,_dart__c_test>('_c_test');
-
-typedef _c__c_test = ffi.Void Function(
-);
-
-typedef _dart__c_test = void Function(
-);
+_dart__c_test __c_test;
 
 void _dart_test(
 ) {
+__dart_test ??= _dylib.lookupFunction<_c__dart_test,_dart__dart_test>('_dart_test');
   return __dart_test(
   );
 }
+_dart__dart_test __dart_test;
 
-final _dart__dart_test __dart_test = _dylib.lookupFunction<_c__dart_test,_dart__dart_test>('_dart_test');
+void Test(
+) {
+_Test ??= _dylib.lookupFunction<_c_Test1,_dart_Test>('Test');
+  return _Test(
+  );
+}
+_dart_Test _Test;
 
-typedef _c__dart_test = ffi.Void Function(
-);
-
-typedef _dart__dart_test = void Function(
-);
+}
 
 class _Test extends ffi.Struct{
   @ffi.Int8()
-  int _exp_workaround_array_item_0;
+  int _unique_array_item_0;
   @ffi.Int8()
-  int _exp_workaround_array_item_1;
+  int _unique_array_item_1;
 /// Helper for array `array`.
 ArrayHelper1__Test_array_level0 get array => ArrayHelper1__Test_array_level0(this, [2], 0, 0);
 }
@@ -724,9 +704,9 @@
 _checkBounds(index);
 switch(_absoluteIndex+index){
 case 0:
-  return _struct._exp_workaround_array_item_0;
+  return _struct._unique_array_item_0;
 case 1:
-  return _struct._exp_workaround_array_item_1;
+  return _struct._unique_array_item_1;
 default:
   throw Exception('Invalid Array Helper generated.');}
 }
@@ -734,10 +714,10 @@
 _checkBounds(index);
 switch(_absoluteIndex+index){
 case 0:
-  _struct._exp_workaround_array_item_0 = value;
+  _struct._unique_array_item_0 = value;
   break;
 case 1:
-  _struct._exp_workaround_array_item_1 = value;
+  _struct._unique_array_item_1 = value;
   break;
 default:
   throw Exception('Invalid Array Helper generated.');
@@ -747,26 +727,42 @@
 class ArrayHelperPrefixCollisionTest extends ffi.Struct{
 }
 
-void Test(
-) {
-  return _Test_1(
-  );
-}
-
-final _dart_Test _Test_1 = _dylib.lookupFunction<_c_Test_1,_dart_Test>('Test');
-
-typedef _c_Test_1 = ffi.Void Function(
-);
-
-typedef _dart_Test = void Function(
-);
-
 class _c_Test {
 }
 
 class init_dylib {
 }
 
+typedef _c_test1 = ffi.Void Function(
+);
+
+typedef _dart_test1 = void Function(
+);
+
+typedef _c__test = ffi.Void Function(
+);
+
+typedef _dart__test = void Function(
+);
+
+typedef _c__c_test = ffi.Void Function(
+);
+
+typedef _dart__c_test = void Function(
+);
+
+typedef _c__dart_test = ffi.Void Function(
+);
+
+typedef _dart__dart_test = void Function(
+);
+
+typedef _c_Test1 = ffi.Void Function(
+);
+
+typedef _dart_Test = void Function(
+);
+
 ''');
         if (file.existsSync()) {
           file.delete();
diff --git a/test/collision_tests/decl_decl_collision_test.dart b/test/collision_tests/decl_decl_collision_test.dart
index a96d763..7e1bfd0 100644
--- a/test/collision_tests/decl_decl_collision_test.dart
+++ b/test/collision_tests/decl_decl_collision_test.dart
@@ -7,20 +7,32 @@
 
 void main() {
   group('Declaration-Declaration Collision', () {
-    test('struct-func', () {
-      final l1 = Library(bindings: [
+    test('declaration conflict', () {
+      final l1 = Library(name: 'Bindings', bindings: [
+        Struc(name: 'TestStruc'),
+        Struc(name: 'TestStruc'),
+        EnumClass(name: 'TestEnum'),
+        EnumClass(name: 'TestEnum'),
         Func(
-          name: 'test',
-          returnType: Type.nativeType(SupportedNativeType.Void),
-        ),
-        Struc(name: 'test'),
+            name: 'testFunc',
+            returnType: Type.nativeType(SupportedNativeType.Void)),
+        Func(
+            name: 'testFunc',
+            returnType: Type.nativeType(SupportedNativeType.Void)),
       ]);
-      final l2 = Library(bindings: [
+      final l2 = Library(name: 'Bindings', bindings: [
+        Struc(name: 'TestStruc'),
+        Struc(name: 'TestStruc_1'),
+        EnumClass(name: 'TestEnum'),
+        EnumClass(name: 'TestEnum_1'),
         Func(
-          name: 'test',
-          returnType: Type.nativeType(SupportedNativeType.Void),
-        ),
-        Struc(name: 'test_1'),
+            name: 'testFunc',
+            lookupSymbolName: 'testFunc',
+            returnType: Type.nativeType(SupportedNativeType.Void)),
+        Func(
+            name: 'testFunc_1',
+            lookupSymbolName: 'testFunc',
+            returnType: Type.nativeType(SupportedNativeType.Void)),
       ]);
 
       expect(l1.generate(), l2.generate());
diff --git a/test/header_parser_tests/functions_test.dart b/test/header_parser_tests/functions_test.dart
index fa09f9c..b566fb4 100644
--- a/test/header_parser_tests/functions_test.dart
+++ b/test/header_parser_tests/functions_test.dart
@@ -25,6 +25,8 @@
       });
       actual = parser.parse(
         Config.fromYaml(yaml.loadYaml('''
+${strings.name}: 'NativeLibrary'
+${strings.description}: 'Prefix Test'
 ${strings.output}: 'unused'
 ${strings.libclang_dylib_folder}: 'tool/wrapped_libclang'
 ${strings.headers}:
@@ -65,6 +67,7 @@
 
 Library expectedLibrary() {
   return Library(
+    name: 'Bindings',
     bindings: [
       Func(
         name: 'func1',
diff --git a/test/prefix_tests/prefix_test.dart b/test/prefix_tests/prefix_test.dart
index d0397e4..0f91327 100644
--- a/test/prefix_tests/prefix_test.dart
+++ b/test/prefix_tests/prefix_test.dart
@@ -29,6 +29,8 @@
       });
       expected = expectedLibrary();
       actual = parser.parse(Config.fromYaml(yaml.loadYaml('''
+${strings.name}: 'NativeLibrary'
+${strings.description}: 'Prefix Test'
 ${strings.output}: 'unused'
 ${strings.libclang_dylib_folder}: 'tool/wrapped_libclang'
 ${strings.headers}:
@@ -100,6 +102,7 @@
   final struc2 =
       Struc(name: '${structPrefix}${structPrefixReplacedWith}Struct2');
   return Library(
+    name: 'Bindings',
     bindings: [
       Func(
         name: '${functionPrefix}func1',
diff --git a/tool/libclang_config.yaml b/tool/libclang_config.yaml
index 9401a00..c9f5876 100644
--- a/tool/libclang_config.yaml
+++ b/tool/libclang_config.yaml
@@ -9,6 +9,8 @@
 #    dart ../bin/ffigen.dart --config libclang_config.yaml
 # ===============================================================
 
+name: Clang
+description: Holds bindings to LibClang.
 output: '../lib/src/header_parser/clang_bindings/clang_bindings.dart'
 libclang-dylib-folder: 'wrapped_libclang'
 sort: true