// AUTO GENERATED FILE, DO NOT EDIT.
//
// Generated by `package:ffigen`.
import 'dart:ffi' as ffi;

/// Bindings to LibClang.
class LibClang {
  /// Holds the symbol lookup function.
  final ffi.Pointer<T> Function<T extends ffi.NativeType>(String symbolName)
      _lookup;

  /// The symbols are looked up in [dynamicLibrary].
  LibClang(ffi.DynamicLibrary dynamicLibrary) : _lookup = dynamicLibrary.lookup;

  /// The symbols are looked up with [lookup].
  LibClang.fromLookup(
      ffi.Pointer<T> Function<T extends ffi.NativeType>(String symbolName)
          lookup)
      : _lookup = lookup;

  /// Retrieve the character data associated with the given string.
  ffi.Pointer<ffi.Int8> clang_getCString(
    CXString string,
  ) {
    return _clang_getCString(
      string,
    );
  }

  late final _clang_getCString_ptr =
      _lookup<ffi.NativeFunction<ffi.Pointer<ffi.Int8> Function(CXString)>>(
          'clang_getCString');
  late final _clang_getCString = _clang_getCString_ptr
      .asFunction<ffi.Pointer<ffi.Int8> Function(CXString)>();

  /// Free the given string.
  void clang_disposeString(
    CXString string,
  ) {
    return _clang_disposeString(
      string,
    );
  }

  late final _clang_disposeString_ptr =
      _lookup<ffi.NativeFunction<ffi.Void Function(CXString)>>(
          'clang_disposeString');
  late final _clang_disposeString =
      _clang_disposeString_ptr.asFunction<void Function(CXString)>();

  /// Free the given string set.
  void clang_disposeStringSet(
    ffi.Pointer<CXStringSet> set_1,
  ) {
    return _clang_disposeStringSet(
      set_1,
    );
  }

  late final _clang_disposeStringSet_ptr =
      _lookup<ffi.NativeFunction<ffi.Void Function(ffi.Pointer<CXStringSet>)>>(
          'clang_disposeStringSet');
  late final _clang_disposeStringSet = _clang_disposeStringSet_ptr
      .asFunction<void Function(ffi.Pointer<CXStringSet>)>();

  /// Return the timestamp for use with Clang's -fbuild-session-timestamp=
  /// option.
  int clang_getBuildSessionTimestamp() {
    return _clang_getBuildSessionTimestamp();
  }

  late final _clang_getBuildSessionTimestamp_ptr =
      _lookup<ffi.NativeFunction<ffi.Uint64 Function()>>(
          'clang_getBuildSessionTimestamp');
  late final _clang_getBuildSessionTimestamp =
      _clang_getBuildSessionTimestamp_ptr.asFunction<int Function()>();

  /// Create a CXVirtualFileOverlay object. Must be disposed with
  /// clang_VirtualFileOverlay_dispose().
  CXVirtualFileOverlay clang_VirtualFileOverlay_create(
    int options,
  ) {
    return _clang_VirtualFileOverlay_create(
      options,
    );
  }

  late final _clang_VirtualFileOverlay_create_ptr =
      _lookup<ffi.NativeFunction<CXVirtualFileOverlay Function(ffi.Uint32)>>(
          'clang_VirtualFileOverlay_create');
  late final _clang_VirtualFileOverlay_create =
      _clang_VirtualFileOverlay_create_ptr
          .asFunction<CXVirtualFileOverlay Function(int)>();

  /// Map an absolute virtual file path to an absolute real one. The virtual
  /// path must be canonicalized (not contain "."/"..").
  int clang_VirtualFileOverlay_addFileMapping(
    CXVirtualFileOverlay arg0,
    ffi.Pointer<ffi.Int8> virtualPath,
    ffi.Pointer<ffi.Int8> realPath,
  ) {
    return _clang_VirtualFileOverlay_addFileMapping(
      arg0,
      virtualPath,
      realPath,
    );
  }

  late final _clang_VirtualFileOverlay_addFileMapping_ptr = _lookup<
          ffi.NativeFunction<
              ffi.Int32 Function(CXVirtualFileOverlay, ffi.Pointer<ffi.Int8>,
                  ffi.Pointer<ffi.Int8>)>>(
      'clang_VirtualFileOverlay_addFileMapping');
  late final _clang_VirtualFileOverlay_addFileMapping =
      _clang_VirtualFileOverlay_addFileMapping_ptr.asFunction<
          int Function(CXVirtualFileOverlay, ffi.Pointer<ffi.Int8>,
              ffi.Pointer<ffi.Int8>)>();

  /// Set the case sensitivity for the CXVirtualFileOverlay object. The
  /// CXVirtualFileOverlay object is case-sensitive by default, this option can
  /// be used to override the default.
  int clang_VirtualFileOverlay_setCaseSensitivity(
    CXVirtualFileOverlay arg0,
    int caseSensitive,
  ) {
    return _clang_VirtualFileOverlay_setCaseSensitivity(
      arg0,
      caseSensitive,
    );
  }

  late final _clang_VirtualFileOverlay_setCaseSensitivity_ptr = _lookup<
      ffi.NativeFunction<
          ffi.Int32 Function(CXVirtualFileOverlay,
              ffi.Int32)>>('clang_VirtualFileOverlay_setCaseSensitivity');
  late final _clang_VirtualFileOverlay_setCaseSensitivity =
      _clang_VirtualFileOverlay_setCaseSensitivity_ptr
          .asFunction<int Function(CXVirtualFileOverlay, int)>();

  /// Write out the CXVirtualFileOverlay object to a char buffer.
  int clang_VirtualFileOverlay_writeToBuffer(
    CXVirtualFileOverlay arg0,
    int options,
    ffi.Pointer<ffi.Pointer<ffi.Int8>> out_buffer_ptr,
    ffi.Pointer<ffi.Uint32> out_buffer_size,
  ) {
    return _clang_VirtualFileOverlay_writeToBuffer(
      arg0,
      options,
      out_buffer_ptr,
      out_buffer_size,
    );
  }

  late final _clang_VirtualFileOverlay_writeToBuffer_ptr = _lookup<
          ffi.NativeFunction<
              ffi.Int32 Function(
                  CXVirtualFileOverlay,
                  ffi.Uint32,
                  ffi.Pointer<ffi.Pointer<ffi.Int8>>,
                  ffi.Pointer<ffi.Uint32>)>>(
      'clang_VirtualFileOverlay_writeToBuffer');
  late final _clang_VirtualFileOverlay_writeToBuffer =
      _clang_VirtualFileOverlay_writeToBuffer_ptr.asFunction<
          int Function(CXVirtualFileOverlay, int,
              ffi.Pointer<ffi.Pointer<ffi.Int8>>, ffi.Pointer<ffi.Uint32>)>();

  /// free memory allocated by libclang, such as the buffer returned by
  /// CXVirtualFileOverlay() or clang_ModuleMapDescriptor_writeToBuffer().
  void clang_free(
    ffi.Pointer<ffi.Void> buffer,
  ) {
    return _clang_free(
      buffer,
    );
  }

  late final _clang_free_ptr =
      _lookup<ffi.NativeFunction<ffi.Void Function(ffi.Pointer<ffi.Void>)>>(
          'clang_free');
  late final _clang_free =
      _clang_free_ptr.asFunction<void Function(ffi.Pointer<ffi.Void>)>();

  /// Dispose a CXVirtualFileOverlay object.
  void clang_VirtualFileOverlay_dispose(
    CXVirtualFileOverlay arg0,
  ) {
    return _clang_VirtualFileOverlay_dispose(
      arg0,
    );
  }

  late final _clang_VirtualFileOverlay_dispose_ptr =
      _lookup<ffi.NativeFunction<ffi.Void Function(CXVirtualFileOverlay)>>(
          'clang_VirtualFileOverlay_dispose');
  late final _clang_VirtualFileOverlay_dispose =
      _clang_VirtualFileOverlay_dispose_ptr
          .asFunction<void Function(CXVirtualFileOverlay)>();

  /// Create a CXModuleMapDescriptor object. Must be disposed with
  /// clang_ModuleMapDescriptor_dispose().
  CXModuleMapDescriptor clang_ModuleMapDescriptor_create(
    int options,
  ) {
    return _clang_ModuleMapDescriptor_create(
      options,
    );
  }

  late final _clang_ModuleMapDescriptor_create_ptr =
      _lookup<ffi.NativeFunction<CXModuleMapDescriptor Function(ffi.Uint32)>>(
          'clang_ModuleMapDescriptor_create');
  late final _clang_ModuleMapDescriptor_create =
      _clang_ModuleMapDescriptor_create_ptr
          .asFunction<CXModuleMapDescriptor Function(int)>();

  /// Sets the framework module name that the module.map describes.
  int clang_ModuleMapDescriptor_setFrameworkModuleName(
    CXModuleMapDescriptor arg0,
    ffi.Pointer<ffi.Int8> name,
  ) {
    return _clang_ModuleMapDescriptor_setFrameworkModuleName(
      arg0,
      name,
    );
  }

  late final _clang_ModuleMapDescriptor_setFrameworkModuleName_ptr = _lookup<
          ffi.NativeFunction<
              ffi.Int32 Function(
                  CXModuleMapDescriptor, ffi.Pointer<ffi.Int8>)>>(
      'clang_ModuleMapDescriptor_setFrameworkModuleName');
  late final _clang_ModuleMapDescriptor_setFrameworkModuleName =
      _clang_ModuleMapDescriptor_setFrameworkModuleName_ptr.asFunction<
          int Function(CXModuleMapDescriptor, ffi.Pointer<ffi.Int8>)>();

  /// Sets the umbrealla header name that the module.map describes.
  int clang_ModuleMapDescriptor_setUmbrellaHeader(
    CXModuleMapDescriptor arg0,
    ffi.Pointer<ffi.Int8> name,
  ) {
    return _clang_ModuleMapDescriptor_setUmbrellaHeader(
      arg0,
      name,
    );
  }

  late final _clang_ModuleMapDescriptor_setUmbrellaHeader_ptr = _lookup<
          ffi.NativeFunction<
              ffi.Int32 Function(
                  CXModuleMapDescriptor, ffi.Pointer<ffi.Int8>)>>(
      'clang_ModuleMapDescriptor_setUmbrellaHeader');
  late final _clang_ModuleMapDescriptor_setUmbrellaHeader =
      _clang_ModuleMapDescriptor_setUmbrellaHeader_ptr.asFunction<
          int Function(CXModuleMapDescriptor, ffi.Pointer<ffi.Int8>)>();

  /// Write out the CXModuleMapDescriptor object to a char buffer.
  int clang_ModuleMapDescriptor_writeToBuffer(
    CXModuleMapDescriptor arg0,
    int options,
    ffi.Pointer<ffi.Pointer<ffi.Int8>> out_buffer_ptr,
    ffi.Pointer<ffi.Uint32> out_buffer_size,
  ) {
    return _clang_ModuleMapDescriptor_writeToBuffer(
      arg0,
      options,
      out_buffer_ptr,
      out_buffer_size,
    );
  }

  late final _clang_ModuleMapDescriptor_writeToBuffer_ptr = _lookup<
          ffi.NativeFunction<
              ffi.Int32 Function(
                  CXModuleMapDescriptor,
                  ffi.Uint32,
                  ffi.Pointer<ffi.Pointer<ffi.Int8>>,
                  ffi.Pointer<ffi.Uint32>)>>(
      'clang_ModuleMapDescriptor_writeToBuffer');
  late final _clang_ModuleMapDescriptor_writeToBuffer =
      _clang_ModuleMapDescriptor_writeToBuffer_ptr.asFunction<
          int Function(CXModuleMapDescriptor, int,
              ffi.Pointer<ffi.Pointer<ffi.Int8>>, ffi.Pointer<ffi.Uint32>)>();

  /// Dispose a CXModuleMapDescriptor object.
  void clang_ModuleMapDescriptor_dispose(
    CXModuleMapDescriptor arg0,
  ) {
    return _clang_ModuleMapDescriptor_dispose(
      arg0,
    );
  }

  late final _clang_ModuleMapDescriptor_dispose_ptr =
      _lookup<ffi.NativeFunction<ffi.Void Function(CXModuleMapDescriptor)>>(
          'clang_ModuleMapDescriptor_dispose');
  late final _clang_ModuleMapDescriptor_dispose =
      _clang_ModuleMapDescriptor_dispose_ptr
          .asFunction<void Function(CXModuleMapDescriptor)>();

  /// Provides a shared context for creating translation units.
  CXIndex clang_createIndex(
    int excludeDeclarationsFromPCH,
    int displayDiagnostics,
  ) {
    return _clang_createIndex(
      excludeDeclarationsFromPCH,
      displayDiagnostics,
    );
  }

  late final _clang_createIndex_ptr =
      _lookup<ffi.NativeFunction<CXIndex Function(ffi.Int32, ffi.Int32)>>(
          'clang_createIndex');
  late final _clang_createIndex =
      _clang_createIndex_ptr.asFunction<CXIndex Function(int, int)>();

  /// Destroy the given index.
  void clang_disposeIndex(
    CXIndex index,
  ) {
    return _clang_disposeIndex(
      index,
    );
  }

  late final _clang_disposeIndex_ptr =
      _lookup<ffi.NativeFunction<ffi.Void Function(CXIndex)>>(
          'clang_disposeIndex');
  late final _clang_disposeIndex =
      _clang_disposeIndex_ptr.asFunction<void Function(CXIndex)>();

  /// Sets general options associated with a CXIndex.
  void clang_CXIndex_setGlobalOptions(
    CXIndex arg0,
    int options,
  ) {
    return _clang_CXIndex_setGlobalOptions(
      arg0,
      options,
    );
  }

  late final _clang_CXIndex_setGlobalOptions_ptr =
      _lookup<ffi.NativeFunction<ffi.Void Function(CXIndex, ffi.Uint32)>>(
          'clang_CXIndex_setGlobalOptions');
  late final _clang_CXIndex_setGlobalOptions =
      _clang_CXIndex_setGlobalOptions_ptr
          .asFunction<void Function(CXIndex, int)>();

  /// Gets the general options associated with a CXIndex.
  int clang_CXIndex_getGlobalOptions(
    CXIndex arg0,
  ) {
    return _clang_CXIndex_getGlobalOptions(
      arg0,
    );
  }

  late final _clang_CXIndex_getGlobalOptions_ptr =
      _lookup<ffi.NativeFunction<ffi.Uint32 Function(CXIndex)>>(
          'clang_CXIndex_getGlobalOptions');
  late final _clang_CXIndex_getGlobalOptions =
      _clang_CXIndex_getGlobalOptions_ptr.asFunction<int Function(CXIndex)>();

  /// Sets the invocation emission path option in a CXIndex.
  void clang_CXIndex_setInvocationEmissionPathOption(
    CXIndex arg0,
    ffi.Pointer<ffi.Int8> Path,
  ) {
    return _clang_CXIndex_setInvocationEmissionPathOption(
      arg0,
      Path,
    );
  }

  late final _clang_CXIndex_setInvocationEmissionPathOption_ptr = _lookup<
          ffi.NativeFunction<
              ffi.Void Function(CXIndex, ffi.Pointer<ffi.Int8>)>>(
      'clang_CXIndex_setInvocationEmissionPathOption');
  late final _clang_CXIndex_setInvocationEmissionPathOption =
      _clang_CXIndex_setInvocationEmissionPathOption_ptr
          .asFunction<void Function(CXIndex, ffi.Pointer<ffi.Int8>)>();

  /// Retrieve the complete file and path name of the given file.
  CXString clang_getFileName(
    CXFile SFile,
  ) {
    return _clang_getFileName(
      SFile,
    );
  }

  late final _clang_getFileName_ptr =
      _lookup<ffi.NativeFunction<CXString Function(CXFile)>>(
          'clang_getFileName');
  late final _clang_getFileName =
      _clang_getFileName_ptr.asFunction<CXString Function(CXFile)>();

  /// Retrieve the last modification time of the given file.
  int clang_getFileTime(
    CXFile SFile,
  ) {
    return _clang_getFileTime(
      SFile,
    );
  }

  late final _clang_getFileTime_ptr =
      _lookup<ffi.NativeFunction<ffi.Int64 Function(CXFile)>>(
          'clang_getFileTime');
  late final _clang_getFileTime =
      _clang_getFileTime_ptr.asFunction<int Function(CXFile)>();

  /// Retrieve the unique ID for the given file.
  int clang_getFileUniqueID(
    CXFile file,
    ffi.Pointer<CXFileUniqueID> outID,
  ) {
    return _clang_getFileUniqueID(
      file,
      outID,
    );
  }

  late final _clang_getFileUniqueID_ptr = _lookup<
      ffi.NativeFunction<
          ffi.Int32 Function(
              CXFile, ffi.Pointer<CXFileUniqueID>)>>('clang_getFileUniqueID');
  late final _clang_getFileUniqueID = _clang_getFileUniqueID_ptr
      .asFunction<int Function(CXFile, ffi.Pointer<CXFileUniqueID>)>();

  /// 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(
    CXTranslationUnit tu,
    CXFile file,
  ) {
    return _clang_isFileMultipleIncludeGuarded(
      tu,
      file,
    );
  }

  late final _clang_isFileMultipleIncludeGuarded_ptr = _lookup<
          ffi.NativeFunction<ffi.Uint32 Function(CXTranslationUnit, CXFile)>>(
      'clang_isFileMultipleIncludeGuarded');
  late final _clang_isFileMultipleIncludeGuarded =
      _clang_isFileMultipleIncludeGuarded_ptr
          .asFunction<int Function(CXTranslationUnit, CXFile)>();

  /// Retrieve a file handle within the given translation unit.
  CXFile clang_getFile(
    CXTranslationUnit tu,
    ffi.Pointer<ffi.Int8> file_name,
  ) {
    return _clang_getFile(
      tu,
      file_name,
    );
  }

  late final _clang_getFile_ptr = _lookup<
      ffi.NativeFunction<
          CXFile Function(
              CXTranslationUnit, ffi.Pointer<ffi.Int8>)>>('clang_getFile');
  late final _clang_getFile = _clang_getFile_ptr
      .asFunction<CXFile Function(CXTranslationUnit, ffi.Pointer<ffi.Int8>)>();

  /// Retrieve the buffer associated with the given file.
  ffi.Pointer<ffi.Int8> clang_getFileContents(
    CXTranslationUnit tu,
    CXFile file,
    ffi.Pointer<ffi.IntPtr> size,
  ) {
    return _clang_getFileContents(
      tu,
      file,
      size,
    );
  }

  late final _clang_getFileContents_ptr = _lookup<
      ffi.NativeFunction<
          ffi.Pointer<ffi.Int8> Function(CXTranslationUnit, CXFile,
              ffi.Pointer<ffi.IntPtr>)>>('clang_getFileContents');
  late final _clang_getFileContents = _clang_getFileContents_ptr.asFunction<
      ffi.Pointer<ffi.Int8> Function(
          CXTranslationUnit, CXFile, ffi.Pointer<ffi.IntPtr>)>();

  /// Returns non-zero if the file1 and file2 point to the same file, or they
  /// are both NULL.
  int clang_File_isEqual(
    CXFile file1,
    CXFile file2,
  ) {
    return _clang_File_isEqual(
      file1,
      file2,
    );
  }

  late final _clang_File_isEqual_ptr =
      _lookup<ffi.NativeFunction<ffi.Int32 Function(CXFile, CXFile)>>(
          'clang_File_isEqual');
  late final _clang_File_isEqual =
      _clang_File_isEqual_ptr.asFunction<int Function(CXFile, CXFile)>();

  /// Returns the real path name of file.
  CXString clang_File_tryGetRealPathName(
    CXFile file,
  ) {
    return _clang_File_tryGetRealPathName(
      file,
    );
  }

  late final _clang_File_tryGetRealPathName_ptr =
      _lookup<ffi.NativeFunction<CXString Function(CXFile)>>(
          'clang_File_tryGetRealPathName');
  late final _clang_File_tryGetRealPathName = _clang_File_tryGetRealPathName_ptr
      .asFunction<CXString Function(CXFile)>();

  /// Retrieve a NULL (invalid) source location.
  CXSourceLocation clang_getNullLocation() {
    return _clang_getNullLocation();
  }

  late final _clang_getNullLocation_ptr =
      _lookup<ffi.NativeFunction<CXSourceLocation Function()>>(
          'clang_getNullLocation');
  late final _clang_getNullLocation =
      _clang_getNullLocation_ptr.asFunction<CXSourceLocation Function()>();

  /// Determine whether two source locations, which must refer into the same
  /// translation unit, refer to exactly the same point in the source code.
  int clang_equalLocations(
    CXSourceLocation loc1,
    CXSourceLocation loc2,
  ) {
    return _clang_equalLocations(
      loc1,
      loc2,
    );
  }

  late final _clang_equalLocations_ptr = _lookup<
      ffi.NativeFunction<
          ffi.Uint32 Function(
              CXSourceLocation, CXSourceLocation)>>('clang_equalLocations');
  late final _clang_equalLocations = _clang_equalLocations_ptr
      .asFunction<int Function(CXSourceLocation, CXSourceLocation)>();

  /// Retrieves the source location associated with a given file/line/column in
  /// a particular translation unit.
  CXSourceLocation clang_getLocation(
    CXTranslationUnit tu,
    CXFile file,
    int line,
    int column,
  ) {
    return _clang_getLocation(
      tu,
      file,
      line,
      column,
    );
  }

  late final _clang_getLocation_ptr = _lookup<
      ffi.NativeFunction<
          CXSourceLocation Function(CXTranslationUnit, CXFile, ffi.Uint32,
              ffi.Uint32)>>('clang_getLocation');
  late final _clang_getLocation = _clang_getLocation_ptr.asFunction<
      CXSourceLocation Function(CXTranslationUnit, CXFile, int, int)>();

  /// Retrieves the source location associated with a given character offset in
  /// a particular translation unit.
  CXSourceLocation clang_getLocationForOffset(
    CXTranslationUnit tu,
    CXFile file,
    int offset,
  ) {
    return _clang_getLocationForOffset(
      tu,
      file,
      offset,
    );
  }

  late final _clang_getLocationForOffset_ptr = _lookup<
      ffi.NativeFunction<
          CXSourceLocation Function(CXTranslationUnit, CXFile,
              ffi.Uint32)>>('clang_getLocationForOffset');
  late final _clang_getLocationForOffset = _clang_getLocationForOffset_ptr
      .asFunction<CXSourceLocation Function(CXTranslationUnit, CXFile, int)>();

  /// Returns non-zero if the given source location is in a system header.
  int clang_Location_isInSystemHeader(
    CXSourceLocation location,
  ) {
    return _clang_Location_isInSystemHeader(
      location,
    );
  }

  late final _clang_Location_isInSystemHeader_ptr =
      _lookup<ffi.NativeFunction<ffi.Int32 Function(CXSourceLocation)>>(
          'clang_Location_isInSystemHeader');
  late final _clang_Location_isInSystemHeader =
      _clang_Location_isInSystemHeader_ptr
          .asFunction<int Function(CXSourceLocation)>();

  /// Returns non-zero if the given source location is in the main file of the
  /// corresponding translation unit.
  int clang_Location_isFromMainFile(
    CXSourceLocation location,
  ) {
    return _clang_Location_isFromMainFile(
      location,
    );
  }

  late final _clang_Location_isFromMainFile_ptr =
      _lookup<ffi.NativeFunction<ffi.Int32 Function(CXSourceLocation)>>(
          'clang_Location_isFromMainFile');
  late final _clang_Location_isFromMainFile = _clang_Location_isFromMainFile_ptr
      .asFunction<int Function(CXSourceLocation)>();

  /// Retrieve a NULL (invalid) source range.
  CXSourceRange clang_getNullRange() {
    return _clang_getNullRange();
  }

  late final _clang_getNullRange_ptr =
      _lookup<ffi.NativeFunction<CXSourceRange Function()>>(
          'clang_getNullRange');
  late final _clang_getNullRange =
      _clang_getNullRange_ptr.asFunction<CXSourceRange Function()>();

  /// Retrieve a source range given the beginning and ending source locations.
  CXSourceRange clang_getRange(
    CXSourceLocation begin,
    CXSourceLocation end,
  ) {
    return _clang_getRange(
      begin,
      end,
    );
  }

  late final _clang_getRange_ptr = _lookup<
      ffi.NativeFunction<
          CXSourceRange Function(
              CXSourceLocation, CXSourceLocation)>>('clang_getRange');
  late final _clang_getRange = _clang_getRange_ptr
      .asFunction<CXSourceRange Function(CXSourceLocation, CXSourceLocation)>();

  /// Determine whether two ranges are equivalent.
  int clang_equalRanges(
    CXSourceRange range1,
    CXSourceRange range2,
  ) {
    return _clang_equalRanges(
      range1,
      range2,
    );
  }

  late final _clang_equalRanges_ptr = _lookup<
      ffi.NativeFunction<
          ffi.Uint32 Function(
              CXSourceRange, CXSourceRange)>>('clang_equalRanges');
  late final _clang_equalRanges = _clang_equalRanges_ptr
      .asFunction<int Function(CXSourceRange, CXSourceRange)>();

  /// Returns non-zero if range is null.
  int clang_Range_isNull(
    CXSourceRange range,
  ) {
    return _clang_Range_isNull(
      range,
    );
  }

  late final _clang_Range_isNull_ptr =
      _lookup<ffi.NativeFunction<ffi.Int32 Function(CXSourceRange)>>(
          'clang_Range_isNull');
  late final _clang_Range_isNull =
      _clang_Range_isNull_ptr.asFunction<int Function(CXSourceRange)>();

  /// Retrieve the file, line, column, and offset represented by the given
  /// source location.
  void clang_getExpansionLocation(
    CXSourceLocation location,
    ffi.Pointer<CXFile> file,
    ffi.Pointer<ffi.Uint32> line,
    ffi.Pointer<ffi.Uint32> column,
    ffi.Pointer<ffi.Uint32> offset,
  ) {
    return _clang_getExpansionLocation(
      location,
      file,
      line,
      column,
      offset,
    );
  }

  late final _clang_getExpansionLocation_ptr = _lookup<
      ffi.NativeFunction<
          ffi.Void Function(
              CXSourceLocation,
              ffi.Pointer<CXFile>,
              ffi.Pointer<ffi.Uint32>,
              ffi.Pointer<ffi.Uint32>,
              ffi.Pointer<ffi.Uint32>)>>('clang_getExpansionLocation');
  late final _clang_getExpansionLocation =
      _clang_getExpansionLocation_ptr.asFunction<
          void Function(
              CXSourceLocation,
              ffi.Pointer<CXFile>,
              ffi.Pointer<ffi.Uint32>,
              ffi.Pointer<ffi.Uint32>,
              ffi.Pointer<ffi.Uint32>)>();

  /// Retrieve the file, line and column represented by the given source
  /// location, as specified in a # line directive.
  void clang_getPresumedLocation(
    CXSourceLocation location,
    ffi.Pointer<CXString> filename,
    ffi.Pointer<ffi.Uint32> line,
    ffi.Pointer<ffi.Uint32> column,
  ) {
    return _clang_getPresumedLocation(
      location,
      filename,
      line,
      column,
    );
  }

  late final _clang_getPresumedLocation_ptr = _lookup<
      ffi.NativeFunction<
          ffi.Void Function(
              CXSourceLocation,
              ffi.Pointer<CXString>,
              ffi.Pointer<ffi.Uint32>,
              ffi.Pointer<ffi.Uint32>)>>('clang_getPresumedLocation');
  late final _clang_getPresumedLocation =
      _clang_getPresumedLocation_ptr.asFunction<
          void Function(CXSourceLocation, ffi.Pointer<CXString>,
              ffi.Pointer<ffi.Uint32>, ffi.Pointer<ffi.Uint32>)>();

  /// Legacy API to retrieve the file, line, column, and offset represented by
  /// the given source location.
  void clang_getInstantiationLocation(
    CXSourceLocation location,
    ffi.Pointer<CXFile> file,
    ffi.Pointer<ffi.Uint32> line,
    ffi.Pointer<ffi.Uint32> column,
    ffi.Pointer<ffi.Uint32> offset,
  ) {
    return _clang_getInstantiationLocation(
      location,
      file,
      line,
      column,
      offset,
    );
  }

  late final _clang_getInstantiationLocation_ptr = _lookup<
      ffi.NativeFunction<
          ffi.Void Function(
              CXSourceLocation,
              ffi.Pointer<CXFile>,
              ffi.Pointer<ffi.Uint32>,
              ffi.Pointer<ffi.Uint32>,
              ffi.Pointer<ffi.Uint32>)>>('clang_getInstantiationLocation');
  late final _clang_getInstantiationLocation =
      _clang_getInstantiationLocation_ptr.asFunction<
          void Function(
              CXSourceLocation,
              ffi.Pointer<CXFile>,
              ffi.Pointer<ffi.Uint32>,
              ffi.Pointer<ffi.Uint32>,
              ffi.Pointer<ffi.Uint32>)>();

  /// Retrieve the file, line, column, and offset represented by the given
  /// source location.
  void clang_getSpellingLocation(
    CXSourceLocation location,
    ffi.Pointer<CXFile> file,
    ffi.Pointer<ffi.Uint32> line,
    ffi.Pointer<ffi.Uint32> column,
    ffi.Pointer<ffi.Uint32> offset,
  ) {
    return _clang_getSpellingLocation(
      location,
      file,
      line,
      column,
      offset,
    );
  }

  late final _clang_getSpellingLocation_ptr = _lookup<
      ffi.NativeFunction<
          ffi.Void Function(
              CXSourceLocation,
              ffi.Pointer<CXFile>,
              ffi.Pointer<ffi.Uint32>,
              ffi.Pointer<ffi.Uint32>,
              ffi.Pointer<ffi.Uint32>)>>('clang_getSpellingLocation');
  late final _clang_getSpellingLocation =
      _clang_getSpellingLocation_ptr.asFunction<
          void Function(
              CXSourceLocation,
              ffi.Pointer<CXFile>,
              ffi.Pointer<ffi.Uint32>,
              ffi.Pointer<ffi.Uint32>,
              ffi.Pointer<ffi.Uint32>)>();

  /// Retrieve the file, line, column, and offset represented by the given
  /// source location.
  void clang_getFileLocation(
    CXSourceLocation location,
    ffi.Pointer<CXFile> file,
    ffi.Pointer<ffi.Uint32> line,
    ffi.Pointer<ffi.Uint32> column,
    ffi.Pointer<ffi.Uint32> offset,
  ) {
    return _clang_getFileLocation(
      location,
      file,
      line,
      column,
      offset,
    );
  }

  late final _clang_getFileLocation_ptr = _lookup<
      ffi.NativeFunction<
          ffi.Void Function(
              CXSourceLocation,
              ffi.Pointer<CXFile>,
              ffi.Pointer<ffi.Uint32>,
              ffi.Pointer<ffi.Uint32>,
              ffi.Pointer<ffi.Uint32>)>>('clang_getFileLocation');
  late final _clang_getFileLocation = _clang_getFileLocation_ptr.asFunction<
      void Function(
          CXSourceLocation,
          ffi.Pointer<CXFile>,
          ffi.Pointer<ffi.Uint32>,
          ffi.Pointer<ffi.Uint32>,
          ffi.Pointer<ffi.Uint32>)>();

  /// Retrieve a source location representing the first character within a
  /// source range.
  CXSourceLocation clang_getRangeStart(
    CXSourceRange range,
  ) {
    return _clang_getRangeStart(
      range,
    );
  }

  late final _clang_getRangeStart_ptr =
      _lookup<ffi.NativeFunction<CXSourceLocation Function(CXSourceRange)>>(
          'clang_getRangeStart');
  late final _clang_getRangeStart = _clang_getRangeStart_ptr
      .asFunction<CXSourceLocation Function(CXSourceRange)>();

  /// Retrieve a source location representing the last character within a source
  /// range.
  CXSourceLocation clang_getRangeEnd(
    CXSourceRange range,
  ) {
    return _clang_getRangeEnd(
      range,
    );
  }

  late final _clang_getRangeEnd_ptr =
      _lookup<ffi.NativeFunction<CXSourceLocation Function(CXSourceRange)>>(
          'clang_getRangeEnd');
  late final _clang_getRangeEnd = _clang_getRangeEnd_ptr
      .asFunction<CXSourceLocation Function(CXSourceRange)>();

  /// Retrieve all ranges that were skipped by the preprocessor.
  ffi.Pointer<CXSourceRangeList> clang_getSkippedRanges(
    CXTranslationUnit tu,
    CXFile file,
  ) {
    return _clang_getSkippedRanges(
      tu,
      file,
    );
  }

  late final _clang_getSkippedRanges_ptr = _lookup<
      ffi.NativeFunction<
          ffi.Pointer<CXSourceRangeList> Function(
              CXTranslationUnit, CXFile)>>('clang_getSkippedRanges');
  late final _clang_getSkippedRanges = _clang_getSkippedRanges_ptr.asFunction<
      ffi.Pointer<CXSourceRangeList> Function(CXTranslationUnit, CXFile)>();

  /// Retrieve all ranges from all files that were skipped by the preprocessor.
  ffi.Pointer<CXSourceRangeList> clang_getAllSkippedRanges(
    CXTranslationUnit tu,
  ) {
    return _clang_getAllSkippedRanges(
      tu,
    );
  }

  late final _clang_getAllSkippedRanges_ptr = _lookup<
      ffi.NativeFunction<
          ffi.Pointer<CXSourceRangeList> Function(
              CXTranslationUnit)>>('clang_getAllSkippedRanges');
  late final _clang_getAllSkippedRanges = _clang_getAllSkippedRanges_ptr
      .asFunction<ffi.Pointer<CXSourceRangeList> Function(CXTranslationUnit)>();

  /// Destroy the given CXSourceRangeList.
  void clang_disposeSourceRangeList(
    ffi.Pointer<CXSourceRangeList> ranges,
  ) {
    return _clang_disposeSourceRangeList(
      ranges,
    );
  }

  late final _clang_disposeSourceRangeList_ptr = _lookup<
      ffi.NativeFunction<
          ffi.Void Function(
              ffi.Pointer<CXSourceRangeList>)>>('clang_disposeSourceRangeList');
  late final _clang_disposeSourceRangeList = _clang_disposeSourceRangeList_ptr
      .asFunction<void Function(ffi.Pointer<CXSourceRangeList>)>();

  /// Determine the number of diagnostics in a CXDiagnosticSet.
  int clang_getNumDiagnosticsInSet(
    CXDiagnosticSet Diags,
  ) {
    return _clang_getNumDiagnosticsInSet(
      Diags,
    );
  }

  late final _clang_getNumDiagnosticsInSet_ptr =
      _lookup<ffi.NativeFunction<ffi.Uint32 Function(CXDiagnosticSet)>>(
          'clang_getNumDiagnosticsInSet');
  late final _clang_getNumDiagnosticsInSet = _clang_getNumDiagnosticsInSet_ptr
      .asFunction<int Function(CXDiagnosticSet)>();

  /// Retrieve a diagnostic associated with the given CXDiagnosticSet.
  CXDiagnostic clang_getDiagnosticInSet(
    CXDiagnosticSet Diags,
    int Index,
  ) {
    return _clang_getDiagnosticInSet(
      Diags,
      Index,
    );
  }

  late final _clang_getDiagnosticInSet_ptr = _lookup<
      ffi.NativeFunction<
          CXDiagnostic Function(
              CXDiagnosticSet, ffi.Uint32)>>('clang_getDiagnosticInSet');
  late final _clang_getDiagnosticInSet = _clang_getDiagnosticInSet_ptr
      .asFunction<CXDiagnostic Function(CXDiagnosticSet, int)>();

  /// Deserialize a set of diagnostics from a Clang diagnostics bitcode file.
  CXDiagnosticSet clang_loadDiagnostics(
    ffi.Pointer<ffi.Int8> file,
    ffi.Pointer<ffi.Int32> error,
    ffi.Pointer<CXString> errorString,
  ) {
    return _clang_loadDiagnostics(
      file,
      error,
      errorString,
    );
  }

  late final _clang_loadDiagnostics_ptr = _lookup<
      ffi.NativeFunction<
          CXDiagnosticSet Function(
              ffi.Pointer<ffi.Int8>,
              ffi.Pointer<ffi.Int32>,
              ffi.Pointer<CXString>)>>('clang_loadDiagnostics');
  late final _clang_loadDiagnostics = _clang_loadDiagnostics_ptr.asFunction<
      CXDiagnosticSet Function(ffi.Pointer<ffi.Int8>, ffi.Pointer<ffi.Int32>,
          ffi.Pointer<CXString>)>();

  /// Release a CXDiagnosticSet and all of its contained diagnostics.
  void clang_disposeDiagnosticSet(
    CXDiagnosticSet Diags,
  ) {
    return _clang_disposeDiagnosticSet(
      Diags,
    );
  }

  late final _clang_disposeDiagnosticSet_ptr =
      _lookup<ffi.NativeFunction<ffi.Void Function(CXDiagnosticSet)>>(
          'clang_disposeDiagnosticSet');
  late final _clang_disposeDiagnosticSet = _clang_disposeDiagnosticSet_ptr
      .asFunction<void Function(CXDiagnosticSet)>();

  /// Retrieve the child diagnostics of a CXDiagnostic.
  CXDiagnosticSet clang_getChildDiagnostics(
    CXDiagnostic D,
  ) {
    return _clang_getChildDiagnostics(
      D,
    );
  }

  late final _clang_getChildDiagnostics_ptr =
      _lookup<ffi.NativeFunction<CXDiagnosticSet Function(CXDiagnostic)>>(
          'clang_getChildDiagnostics');
  late final _clang_getChildDiagnostics = _clang_getChildDiagnostics_ptr
      .asFunction<CXDiagnosticSet Function(CXDiagnostic)>();

  /// Determine the number of diagnostics produced for the given translation
  /// unit.
  int clang_getNumDiagnostics(
    CXTranslationUnit Unit,
  ) {
    return _clang_getNumDiagnostics(
      Unit,
    );
  }

  late final _clang_getNumDiagnostics_ptr =
      _lookup<ffi.NativeFunction<ffi.Uint32 Function(CXTranslationUnit)>>(
          'clang_getNumDiagnostics');
  late final _clang_getNumDiagnostics = _clang_getNumDiagnostics_ptr
      .asFunction<int Function(CXTranslationUnit)>();

  /// Retrieve a diagnostic associated with the given translation unit.
  CXDiagnostic clang_getDiagnostic(
    CXTranslationUnit Unit,
    int Index,
  ) {
    return _clang_getDiagnostic(
      Unit,
      Index,
    );
  }

  late final _clang_getDiagnostic_ptr = _lookup<
      ffi.NativeFunction<
          CXDiagnostic Function(
              CXTranslationUnit, ffi.Uint32)>>('clang_getDiagnostic');
  late final _clang_getDiagnostic = _clang_getDiagnostic_ptr
      .asFunction<CXDiagnostic Function(CXTranslationUnit, int)>();

  /// Retrieve the complete set of diagnostics associated with a translation
  /// unit.
  CXDiagnosticSet clang_getDiagnosticSetFromTU(
    CXTranslationUnit Unit,
  ) {
    return _clang_getDiagnosticSetFromTU(
      Unit,
    );
  }

  late final _clang_getDiagnosticSetFromTU_ptr =
      _lookup<ffi.NativeFunction<CXDiagnosticSet Function(CXTranslationUnit)>>(
          'clang_getDiagnosticSetFromTU');
  late final _clang_getDiagnosticSetFromTU = _clang_getDiagnosticSetFromTU_ptr
      .asFunction<CXDiagnosticSet Function(CXTranslationUnit)>();

  /// Destroy a diagnostic.
  void clang_disposeDiagnostic(
    CXDiagnostic Diagnostic,
  ) {
    return _clang_disposeDiagnostic(
      Diagnostic,
    );
  }

  late final _clang_disposeDiagnostic_ptr =
      _lookup<ffi.NativeFunction<ffi.Void Function(CXDiagnostic)>>(
          'clang_disposeDiagnostic');
  late final _clang_disposeDiagnostic =
      _clang_disposeDiagnostic_ptr.asFunction<void Function(CXDiagnostic)>();

  /// Format the given diagnostic in a manner that is suitable for display.
  CXString clang_formatDiagnostic(
    CXDiagnostic Diagnostic,
    int Options,
  ) {
    return _clang_formatDiagnostic(
      Diagnostic,
      Options,
    );
  }

  late final _clang_formatDiagnostic_ptr =
      _lookup<ffi.NativeFunction<CXString Function(CXDiagnostic, ffi.Uint32)>>(
          'clang_formatDiagnostic');
  late final _clang_formatDiagnostic = _clang_formatDiagnostic_ptr
      .asFunction<CXString Function(CXDiagnostic, int)>();

  /// Retrieve the set of display options most similar to the default behavior
  /// of the clang compiler.
  int clang_defaultDiagnosticDisplayOptions() {
    return _clang_defaultDiagnosticDisplayOptions();
  }

  late final _clang_defaultDiagnosticDisplayOptions_ptr =
      _lookup<ffi.NativeFunction<ffi.Uint32 Function()>>(
          'clang_defaultDiagnosticDisplayOptions');
  late final _clang_defaultDiagnosticDisplayOptions =
      _clang_defaultDiagnosticDisplayOptions_ptr.asFunction<int Function()>();

  /// Determine the severity of the given diagnostic.
  int clang_getDiagnosticSeverity(
    CXDiagnostic arg0,
  ) {
    return _clang_getDiagnosticSeverity(
      arg0,
    );
  }

  late final _clang_getDiagnosticSeverity_ptr =
      _lookup<ffi.NativeFunction<ffi.Int32 Function(CXDiagnostic)>>(
          'clang_getDiagnosticSeverity');
  late final _clang_getDiagnosticSeverity =
      _clang_getDiagnosticSeverity_ptr.asFunction<int Function(CXDiagnostic)>();

  /// Retrieve the source location of the given diagnostic.
  CXSourceLocation clang_getDiagnosticLocation(
    CXDiagnostic arg0,
  ) {
    return _clang_getDiagnosticLocation(
      arg0,
    );
  }

  late final _clang_getDiagnosticLocation_ptr =
      _lookup<ffi.NativeFunction<CXSourceLocation Function(CXDiagnostic)>>(
          'clang_getDiagnosticLocation');
  late final _clang_getDiagnosticLocation = _clang_getDiagnosticLocation_ptr
      .asFunction<CXSourceLocation Function(CXDiagnostic)>();

  /// Retrieve the text of the given diagnostic.
  CXString clang_getDiagnosticSpelling(
    CXDiagnostic arg0,
  ) {
    return _clang_getDiagnosticSpelling(
      arg0,
    );
  }

  late final _clang_getDiagnosticSpelling_ptr =
      _lookup<ffi.NativeFunction<CXString Function(CXDiagnostic)>>(
          'clang_getDiagnosticSpelling');
  late final _clang_getDiagnosticSpelling = _clang_getDiagnosticSpelling_ptr
      .asFunction<CXString Function(CXDiagnostic)>();

  /// Retrieve the name of the command-line option that enabled this diagnostic.
  CXString clang_getDiagnosticOption(
    CXDiagnostic Diag,
    ffi.Pointer<CXString> Disable,
  ) {
    return _clang_getDiagnosticOption(
      Diag,
      Disable,
    );
  }

  late final _clang_getDiagnosticOption_ptr = _lookup<
      ffi.NativeFunction<
          CXString Function(CXDiagnostic,
              ffi.Pointer<CXString>)>>('clang_getDiagnosticOption');
  late final _clang_getDiagnosticOption = _clang_getDiagnosticOption_ptr
      .asFunction<CXString Function(CXDiagnostic, ffi.Pointer<CXString>)>();

  /// Retrieve the category number for this diagnostic.
  int clang_getDiagnosticCategory(
    CXDiagnostic arg0,
  ) {
    return _clang_getDiagnosticCategory(
      arg0,
    );
  }

  late final _clang_getDiagnosticCategory_ptr =
      _lookup<ffi.NativeFunction<ffi.Uint32 Function(CXDiagnostic)>>(
          'clang_getDiagnosticCategory');
  late final _clang_getDiagnosticCategory =
      _clang_getDiagnosticCategory_ptr.asFunction<int Function(CXDiagnostic)>();

  /// Retrieve the name of a particular diagnostic category. This is now
  /// deprecated. Use clang_getDiagnosticCategoryText() instead.
  CXString clang_getDiagnosticCategoryName(
    int Category,
  ) {
    return _clang_getDiagnosticCategoryName(
      Category,
    );
  }

  late final _clang_getDiagnosticCategoryName_ptr =
      _lookup<ffi.NativeFunction<CXString Function(ffi.Uint32)>>(
          'clang_getDiagnosticCategoryName');
  late final _clang_getDiagnosticCategoryName =
      _clang_getDiagnosticCategoryName_ptr.asFunction<CXString Function(int)>();

  /// Retrieve the diagnostic category text for a given diagnostic.
  CXString clang_getDiagnosticCategoryText(
    CXDiagnostic arg0,
  ) {
    return _clang_getDiagnosticCategoryText(
      arg0,
    );
  }

  late final _clang_getDiagnosticCategoryText_ptr =
      _lookup<ffi.NativeFunction<CXString Function(CXDiagnostic)>>(
          'clang_getDiagnosticCategoryText');
  late final _clang_getDiagnosticCategoryText =
      _clang_getDiagnosticCategoryText_ptr
          .asFunction<CXString Function(CXDiagnostic)>();

  /// Determine the number of source ranges associated with the given
  /// diagnostic.
  int clang_getDiagnosticNumRanges(
    CXDiagnostic arg0,
  ) {
    return _clang_getDiagnosticNumRanges(
      arg0,
    );
  }

  late final _clang_getDiagnosticNumRanges_ptr =
      _lookup<ffi.NativeFunction<ffi.Uint32 Function(CXDiagnostic)>>(
          'clang_getDiagnosticNumRanges');
  late final _clang_getDiagnosticNumRanges = _clang_getDiagnosticNumRanges_ptr
      .asFunction<int Function(CXDiagnostic)>();

  /// Retrieve a source range associated with the diagnostic.
  CXSourceRange clang_getDiagnosticRange(
    CXDiagnostic Diagnostic,
    int Range,
  ) {
    return _clang_getDiagnosticRange(
      Diagnostic,
      Range,
    );
  }

  late final _clang_getDiagnosticRange_ptr = _lookup<
          ffi.NativeFunction<CXSourceRange Function(CXDiagnostic, ffi.Uint32)>>(
      'clang_getDiagnosticRange');
  late final _clang_getDiagnosticRange = _clang_getDiagnosticRange_ptr
      .asFunction<CXSourceRange Function(CXDiagnostic, int)>();

  /// Determine the number of fix-it hints associated with the given diagnostic.
  int clang_getDiagnosticNumFixIts(
    CXDiagnostic Diagnostic,
  ) {
    return _clang_getDiagnosticNumFixIts(
      Diagnostic,
    );
  }

  late final _clang_getDiagnosticNumFixIts_ptr =
      _lookup<ffi.NativeFunction<ffi.Uint32 Function(CXDiagnostic)>>(
          'clang_getDiagnosticNumFixIts');
  late final _clang_getDiagnosticNumFixIts = _clang_getDiagnosticNumFixIts_ptr
      .asFunction<int Function(CXDiagnostic)>();

  /// Retrieve the replacement information for a given fix-it.
  CXString clang_getDiagnosticFixIt(
    CXDiagnostic Diagnostic,
    int FixIt,
    ffi.Pointer<CXSourceRange> ReplacementRange,
  ) {
    return _clang_getDiagnosticFixIt(
      Diagnostic,
      FixIt,
      ReplacementRange,
    );
  }

  late final _clang_getDiagnosticFixIt_ptr = _lookup<
      ffi.NativeFunction<
          CXString Function(CXDiagnostic, ffi.Uint32,
              ffi.Pointer<CXSourceRange>)>>('clang_getDiagnosticFixIt');
  late final _clang_getDiagnosticFixIt =
      _clang_getDiagnosticFixIt_ptr.asFunction<
          CXString Function(CXDiagnostic, int, ffi.Pointer<CXSourceRange>)>();

  /// Get the original translation unit source file name.
  CXString clang_getTranslationUnitSpelling(
    CXTranslationUnit CTUnit,
  ) {
    return _clang_getTranslationUnitSpelling(
      CTUnit,
    );
  }

  late final _clang_getTranslationUnitSpelling_ptr =
      _lookup<ffi.NativeFunction<CXString Function(CXTranslationUnit)>>(
          'clang_getTranslationUnitSpelling');
  late final _clang_getTranslationUnitSpelling =
      _clang_getTranslationUnitSpelling_ptr
          .asFunction<CXString Function(CXTranslationUnit)>();

  /// Return the CXTranslationUnit for a given source file and the provided
  /// command line arguments one would pass to the compiler.
  CXTranslationUnit clang_createTranslationUnitFromSourceFile(
    CXIndex CIdx,
    ffi.Pointer<ffi.Int8> source_filename,
    int num_clang_command_line_args,
    ffi.Pointer<ffi.Pointer<ffi.Int8>> clang_command_line_args,
    int num_unsaved_files,
    ffi.Pointer<CXUnsavedFile> unsaved_files,
  ) {
    return _clang_createTranslationUnitFromSourceFile(
      CIdx,
      source_filename,
      num_clang_command_line_args,
      clang_command_line_args,
      num_unsaved_files,
      unsaved_files,
    );
  }

  late final _clang_createTranslationUnitFromSourceFile_ptr = _lookup<
          ffi.NativeFunction<
              CXTranslationUnit Function(
                  CXIndex,
                  ffi.Pointer<ffi.Int8>,
                  ffi.Int32,
                  ffi.Pointer<ffi.Pointer<ffi.Int8>>,
                  ffi.Uint32,
                  ffi.Pointer<CXUnsavedFile>)>>(
      'clang_createTranslationUnitFromSourceFile');
  late final _clang_createTranslationUnitFromSourceFile =
      _clang_createTranslationUnitFromSourceFile_ptr.asFunction<
          CXTranslationUnit Function(
              CXIndex,
              ffi.Pointer<ffi.Int8>,
              int,
              ffi.Pointer<ffi.Pointer<ffi.Int8>>,
              int,
              ffi.Pointer<CXUnsavedFile>)>();

  /// Same as clang_createTranslationUnit2, 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.
  CXTranslationUnit clang_createTranslationUnit(
    CXIndex CIdx,
    ffi.Pointer<ffi.Int8> ast_filename,
  ) {
    return _clang_createTranslationUnit(
      CIdx,
      ast_filename,
    );
  }

  late final _clang_createTranslationUnit_ptr = _lookup<
      ffi.NativeFunction<
          CXTranslationUnit Function(
              CXIndex, ffi.Pointer<ffi.Int8>)>>('clang_createTranslationUnit');
  late final _clang_createTranslationUnit = _clang_createTranslationUnit_ptr
      .asFunction<CXTranslationUnit Function(CXIndex, ffi.Pointer<ffi.Int8>)>();

  /// Create a translation unit from an AST file ( -emit-ast).
  int clang_createTranslationUnit2(
    CXIndex CIdx,
    ffi.Pointer<ffi.Int8> ast_filename,
    ffi.Pointer<CXTranslationUnit> out_TU,
  ) {
    return _clang_createTranslationUnit2(
      CIdx,
      ast_filename,
      out_TU,
    );
  }

  late final _clang_createTranslationUnit2_ptr = _lookup<
      ffi.NativeFunction<
          ffi.Int32 Function(CXIndex, ffi.Pointer<ffi.Int8>,
              ffi.Pointer<CXTranslationUnit>)>>('clang_createTranslationUnit2');
  late final _clang_createTranslationUnit2 =
      _clang_createTranslationUnit2_ptr.asFunction<
          int Function(CXIndex, ffi.Pointer<ffi.Int8>,
              ffi.Pointer<CXTranslationUnit>)>();

  /// Returns the set of flags that is suitable for parsing a translation unit
  /// that is being edited.
  int clang_defaultEditingTranslationUnitOptions() {
    return _clang_defaultEditingTranslationUnitOptions();
  }

  late final _clang_defaultEditingTranslationUnitOptions_ptr =
      _lookup<ffi.NativeFunction<ffi.Uint32 Function()>>(
          'clang_defaultEditingTranslationUnitOptions');
  late final _clang_defaultEditingTranslationUnitOptions =
      _clang_defaultEditingTranslationUnitOptions_ptr
          .asFunction<int Function()>();

  /// 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.
  CXTranslationUnit clang_parseTranslationUnit(
    CXIndex CIdx,
    ffi.Pointer<ffi.Int8> source_filename,
    ffi.Pointer<ffi.Pointer<ffi.Int8>> command_line_args,
    int num_command_line_args,
    ffi.Pointer<CXUnsavedFile> unsaved_files,
    int num_unsaved_files,
    int options,
  ) {
    return _clang_parseTranslationUnit(
      CIdx,
      source_filename,
      command_line_args,
      num_command_line_args,
      unsaved_files,
      num_unsaved_files,
      options,
    );
  }

  late final _clang_parseTranslationUnit_ptr = _lookup<
      ffi.NativeFunction<
          CXTranslationUnit Function(
              CXIndex,
              ffi.Pointer<ffi.Int8>,
              ffi.Pointer<ffi.Pointer<ffi.Int8>>,
              ffi.Int32,
              ffi.Pointer<CXUnsavedFile>,
              ffi.Uint32,
              ffi.Uint32)>>('clang_parseTranslationUnit');
  late final _clang_parseTranslationUnit =
      _clang_parseTranslationUnit_ptr.asFunction<
          CXTranslationUnit Function(
              CXIndex,
              ffi.Pointer<ffi.Int8>,
              ffi.Pointer<ffi.Pointer<ffi.Int8>>,
              int,
              ffi.Pointer<CXUnsavedFile>,
              int,
              int)>();

  /// Parse the given source file and the translation unit corresponding to that
  /// file.
  int clang_parseTranslationUnit2(
    CXIndex CIdx,
    ffi.Pointer<ffi.Int8> source_filename,
    ffi.Pointer<ffi.Pointer<ffi.Int8>> command_line_args,
    int num_command_line_args,
    ffi.Pointer<CXUnsavedFile> unsaved_files,
    int num_unsaved_files,
    int options,
    ffi.Pointer<CXTranslationUnit> out_TU,
  ) {
    return _clang_parseTranslationUnit2(
      CIdx,
      source_filename,
      command_line_args,
      num_command_line_args,
      unsaved_files,
      num_unsaved_files,
      options,
      out_TU,
    );
  }

  late final _clang_parseTranslationUnit2_ptr = _lookup<
      ffi.NativeFunction<
          ffi.Int32 Function(
              CXIndex,
              ffi.Pointer<ffi.Int8>,
              ffi.Pointer<ffi.Pointer<ffi.Int8>>,
              ffi.Int32,
              ffi.Pointer<CXUnsavedFile>,
              ffi.Uint32,
              ffi.Uint32,
              ffi.Pointer<CXTranslationUnit>)>>('clang_parseTranslationUnit2');
  late final _clang_parseTranslationUnit2 =
      _clang_parseTranslationUnit2_ptr.asFunction<
          int Function(
              CXIndex,
              ffi.Pointer<ffi.Int8>,
              ffi.Pointer<ffi.Pointer<ffi.Int8>>,
              int,
              ffi.Pointer<CXUnsavedFile>,
              int,
              int,
              ffi.Pointer<CXTranslationUnit>)>();

  /// Same as clang_parseTranslationUnit2 but requires a full command line for
  /// command_line_args including argv[0]. This is useful if the standard
  /// library paths are relative to the binary.
  int clang_parseTranslationUnit2FullArgv(
    CXIndex CIdx,
    ffi.Pointer<ffi.Int8> source_filename,
    ffi.Pointer<ffi.Pointer<ffi.Int8>> command_line_args,
    int num_command_line_args,
    ffi.Pointer<CXUnsavedFile> unsaved_files,
    int num_unsaved_files,
    int options,
    ffi.Pointer<CXTranslationUnit> out_TU,
  ) {
    return _clang_parseTranslationUnit2FullArgv(
      CIdx,
      source_filename,
      command_line_args,
      num_command_line_args,
      unsaved_files,
      num_unsaved_files,
      options,
      out_TU,
    );
  }

  late final _clang_parseTranslationUnit2FullArgv_ptr = _lookup<
          ffi.NativeFunction<
              ffi.Int32 Function(
                  CXIndex,
                  ffi.Pointer<ffi.Int8>,
                  ffi.Pointer<ffi.Pointer<ffi.Int8>>,
                  ffi.Int32,
                  ffi.Pointer<CXUnsavedFile>,
                  ffi.Uint32,
                  ffi.Uint32,
                  ffi.Pointer<CXTranslationUnit>)>>(
      'clang_parseTranslationUnit2FullArgv');
  late final _clang_parseTranslationUnit2FullArgv =
      _clang_parseTranslationUnit2FullArgv_ptr.asFunction<
          int Function(
              CXIndex,
              ffi.Pointer<ffi.Int8>,
              ffi.Pointer<ffi.Pointer<ffi.Int8>>,
              int,
              ffi.Pointer<CXUnsavedFile>,
              int,
              int,
              ffi.Pointer<CXTranslationUnit>)>();

  /// Returns the set of flags that is suitable for saving a translation unit.
  int clang_defaultSaveOptions(
    CXTranslationUnit TU,
  ) {
    return _clang_defaultSaveOptions(
      TU,
    );
  }

  late final _clang_defaultSaveOptions_ptr =
      _lookup<ffi.NativeFunction<ffi.Uint32 Function(CXTranslationUnit)>>(
          'clang_defaultSaveOptions');
  late final _clang_defaultSaveOptions = _clang_defaultSaveOptions_ptr
      .asFunction<int Function(CXTranslationUnit)>();

  /// Saves a translation unit into a serialized representation of that
  /// translation unit on disk.
  int clang_saveTranslationUnit(
    CXTranslationUnit TU,
    ffi.Pointer<ffi.Int8> FileName,
    int options,
  ) {
    return _clang_saveTranslationUnit(
      TU,
      FileName,
      options,
    );
  }

  late final _clang_saveTranslationUnit_ptr = _lookup<
      ffi.NativeFunction<
          ffi.Int32 Function(CXTranslationUnit, ffi.Pointer<ffi.Int8>,
              ffi.Uint32)>>('clang_saveTranslationUnit');
  late final _clang_saveTranslationUnit =
      _clang_saveTranslationUnit_ptr.asFunction<
          int Function(CXTranslationUnit, ffi.Pointer<ffi.Int8>, int)>();

  /// Suspend a translation unit in order to free memory associated with it.
  int clang_suspendTranslationUnit(
    CXTranslationUnit arg0,
  ) {
    return _clang_suspendTranslationUnit(
      arg0,
    );
  }

  late final _clang_suspendTranslationUnit_ptr =
      _lookup<ffi.NativeFunction<ffi.Uint32 Function(CXTranslationUnit)>>(
          'clang_suspendTranslationUnit');
  late final _clang_suspendTranslationUnit = _clang_suspendTranslationUnit_ptr
      .asFunction<int Function(CXTranslationUnit)>();

  /// Destroy the specified CXTranslationUnit object.
  void clang_disposeTranslationUnit(
    CXTranslationUnit arg0,
  ) {
    return _clang_disposeTranslationUnit(
      arg0,
    );
  }

  late final _clang_disposeTranslationUnit_ptr =
      _lookup<ffi.NativeFunction<ffi.Void Function(CXTranslationUnit)>>(
          'clang_disposeTranslationUnit');
  late final _clang_disposeTranslationUnit = _clang_disposeTranslationUnit_ptr
      .asFunction<void Function(CXTranslationUnit)>();

  /// Returns the set of flags that is suitable for reparsing a translation
  /// unit.
  int clang_defaultReparseOptions(
    CXTranslationUnit TU,
  ) {
    return _clang_defaultReparseOptions(
      TU,
    );
  }

  late final _clang_defaultReparseOptions_ptr =
      _lookup<ffi.NativeFunction<ffi.Uint32 Function(CXTranslationUnit)>>(
          'clang_defaultReparseOptions');
  late final _clang_defaultReparseOptions = _clang_defaultReparseOptions_ptr
      .asFunction<int Function(CXTranslationUnit)>();

  /// Reparse the source files that produced this translation unit.
  int clang_reparseTranslationUnit(
    CXTranslationUnit TU,
    int num_unsaved_files,
    ffi.Pointer<CXUnsavedFile> unsaved_files,
    int options,
  ) {
    return _clang_reparseTranslationUnit(
      TU,
      num_unsaved_files,
      unsaved_files,
      options,
    );
  }

  late final _clang_reparseTranslationUnit_ptr = _lookup<
      ffi.NativeFunction<
          ffi.Int32 Function(
              CXTranslationUnit,
              ffi.Uint32,
              ffi.Pointer<CXUnsavedFile>,
              ffi.Uint32)>>('clang_reparseTranslationUnit');
  late final _clang_reparseTranslationUnit =
      _clang_reparseTranslationUnit_ptr.asFunction<
          int Function(
              CXTranslationUnit, int, ffi.Pointer<CXUnsavedFile>, int)>();

  /// 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,
    );
  }

  late final _clang_getTUResourceUsageName_ptr =
      _lookup<ffi.NativeFunction<ffi.Pointer<ffi.Int8> Function(ffi.Int32)>>(
          'clang_getTUResourceUsageName');
  late final _clang_getTUResourceUsageName = _clang_getTUResourceUsageName_ptr
      .asFunction<ffi.Pointer<ffi.Int8> Function(int)>();

  /// Return the memory usage of a translation unit. This object should be
  /// released with clang_disposeCXTUResourceUsage().
  CXTUResourceUsage clang_getCXTUResourceUsage(
    CXTranslationUnit TU,
  ) {
    return _clang_getCXTUResourceUsage(
      TU,
    );
  }

  late final _clang_getCXTUResourceUsage_ptr = _lookup<
          ffi.NativeFunction<CXTUResourceUsage Function(CXTranslationUnit)>>(
      'clang_getCXTUResourceUsage');
  late final _clang_getCXTUResourceUsage = _clang_getCXTUResourceUsage_ptr
      .asFunction<CXTUResourceUsage Function(CXTranslationUnit)>();

  void clang_disposeCXTUResourceUsage(
    CXTUResourceUsage usage,
  ) {
    return _clang_disposeCXTUResourceUsage(
      usage,
    );
  }

  late final _clang_disposeCXTUResourceUsage_ptr =
      _lookup<ffi.NativeFunction<ffi.Void Function(CXTUResourceUsage)>>(
          'clang_disposeCXTUResourceUsage');
  late final _clang_disposeCXTUResourceUsage =
      _clang_disposeCXTUResourceUsage_ptr
          .asFunction<void Function(CXTUResourceUsage)>();

  /// Get target information for this translation unit.
  CXTargetInfo clang_getTranslationUnitTargetInfo(
    CXTranslationUnit CTUnit,
  ) {
    return _clang_getTranslationUnitTargetInfo(
      CTUnit,
    );
  }

  late final _clang_getTranslationUnitTargetInfo_ptr =
      _lookup<ffi.NativeFunction<CXTargetInfo Function(CXTranslationUnit)>>(
          'clang_getTranslationUnitTargetInfo');
  late final _clang_getTranslationUnitTargetInfo =
      _clang_getTranslationUnitTargetInfo_ptr
          .asFunction<CXTargetInfo Function(CXTranslationUnit)>();

  /// Destroy the CXTargetInfo object.
  void clang_TargetInfo_dispose(
    CXTargetInfo Info,
  ) {
    return _clang_TargetInfo_dispose(
      Info,
    );
  }

  late final _clang_TargetInfo_dispose_ptr =
      _lookup<ffi.NativeFunction<ffi.Void Function(CXTargetInfo)>>(
          'clang_TargetInfo_dispose');
  late final _clang_TargetInfo_dispose =
      _clang_TargetInfo_dispose_ptr.asFunction<void Function(CXTargetInfo)>();

  /// Get the normalized target triple as a string.
  CXString clang_TargetInfo_getTriple(
    CXTargetInfo Info,
  ) {
    return _clang_TargetInfo_getTriple(
      Info,
    );
  }

  late final _clang_TargetInfo_getTriple_ptr =
      _lookup<ffi.NativeFunction<CXString Function(CXTargetInfo)>>(
          'clang_TargetInfo_getTriple');
  late final _clang_TargetInfo_getTriple = _clang_TargetInfo_getTriple_ptr
      .asFunction<CXString Function(CXTargetInfo)>();

  /// Get the pointer width of the target in bits.
  int clang_TargetInfo_getPointerWidth(
    CXTargetInfo Info,
  ) {
    return _clang_TargetInfo_getPointerWidth(
      Info,
    );
  }

  late final _clang_TargetInfo_getPointerWidth_ptr =
      _lookup<ffi.NativeFunction<ffi.Int32 Function(CXTargetInfo)>>(
          'clang_TargetInfo_getPointerWidth');
  late final _clang_TargetInfo_getPointerWidth =
      _clang_TargetInfo_getPointerWidth_ptr
          .asFunction<int Function(CXTargetInfo)>();

  /// Retrieve the NULL cursor, which represents no entity.
  CXCursor clang_getNullCursor() {
    return _clang_getNullCursor();
  }

  late final _clang_getNullCursor_ptr =
      _lookup<ffi.NativeFunction<CXCursor Function()>>('clang_getNullCursor');
  late final _clang_getNullCursor =
      _clang_getNullCursor_ptr.asFunction<CXCursor Function()>();

  /// Retrieve the cursor that represents the given translation unit.
  CXCursor clang_getTranslationUnitCursor(
    CXTranslationUnit arg0,
  ) {
    return _clang_getTranslationUnitCursor(
      arg0,
    );
  }

  late final _clang_getTranslationUnitCursor_ptr =
      _lookup<ffi.NativeFunction<CXCursor Function(CXTranslationUnit)>>(
          'clang_getTranslationUnitCursor');
  late final _clang_getTranslationUnitCursor =
      _clang_getTranslationUnitCursor_ptr
          .asFunction<CXCursor Function(CXTranslationUnit)>();

  /// Determine whether two cursors are equivalent.
  int clang_equalCursors(
    CXCursor arg0,
    CXCursor arg1,
  ) {
    return _clang_equalCursors(
      arg0,
      arg1,
    );
  }

  late final _clang_equalCursors_ptr =
      _lookup<ffi.NativeFunction<ffi.Uint32 Function(CXCursor, CXCursor)>>(
          'clang_equalCursors');
  late final _clang_equalCursors =
      _clang_equalCursors_ptr.asFunction<int Function(CXCursor, CXCursor)>();

  /// Returns non-zero if cursor is null.
  int clang_Cursor_isNull(
    CXCursor cursor,
  ) {
    return _clang_Cursor_isNull(
      cursor,
    );
  }

  late final _clang_Cursor_isNull_ptr =
      _lookup<ffi.NativeFunction<ffi.Int32 Function(CXCursor)>>(
          'clang_Cursor_isNull');
  late final _clang_Cursor_isNull =
      _clang_Cursor_isNull_ptr.asFunction<int Function(CXCursor)>();

  /// Compute a hash value for the given cursor.
  int clang_hashCursor(
    CXCursor arg0,
  ) {
    return _clang_hashCursor(
      arg0,
    );
  }

  late final _clang_hashCursor_ptr =
      _lookup<ffi.NativeFunction<ffi.Uint32 Function(CXCursor)>>(
          'clang_hashCursor');
  late final _clang_hashCursor =
      _clang_hashCursor_ptr.asFunction<int Function(CXCursor)>();

  /// Retrieve the kind of the given cursor.
  int clang_getCursorKind(
    CXCursor arg0,
  ) {
    return _clang_getCursorKind(
      arg0,
    );
  }

  late final _clang_getCursorKind_ptr =
      _lookup<ffi.NativeFunction<ffi.Int32 Function(CXCursor)>>(
          'clang_getCursorKind');
  late final _clang_getCursorKind =
      _clang_getCursorKind_ptr.asFunction<int Function(CXCursor)>();

  /// Determine whether the given cursor kind represents a declaration.
  int clang_isDeclaration(
    int arg0,
  ) {
    return _clang_isDeclaration(
      arg0,
    );
  }

  late final _clang_isDeclaration_ptr =
      _lookup<ffi.NativeFunction<ffi.Uint32 Function(ffi.Int32)>>(
          'clang_isDeclaration');
  late final _clang_isDeclaration =
      _clang_isDeclaration_ptr.asFunction<int Function(int)>();

  /// Determine whether the given declaration is invalid.
  int clang_isInvalidDeclaration(
    CXCursor arg0,
  ) {
    return _clang_isInvalidDeclaration(
      arg0,
    );
  }

  late final _clang_isInvalidDeclaration_ptr =
      _lookup<ffi.NativeFunction<ffi.Uint32 Function(CXCursor)>>(
          'clang_isInvalidDeclaration');
  late final _clang_isInvalidDeclaration =
      _clang_isInvalidDeclaration_ptr.asFunction<int Function(CXCursor)>();

  /// Determine whether the given cursor kind represents a simple reference.
  int clang_isReference(
    int arg0,
  ) {
    return _clang_isReference(
      arg0,
    );
  }

  late final _clang_isReference_ptr =
      _lookup<ffi.NativeFunction<ffi.Uint32 Function(ffi.Int32)>>(
          'clang_isReference');
  late final _clang_isReference =
      _clang_isReference_ptr.asFunction<int Function(int)>();

  /// Determine whether the given cursor kind represents an expression.
  int clang_isExpression(
    int arg0,
  ) {
    return _clang_isExpression(
      arg0,
    );
  }

  late final _clang_isExpression_ptr =
      _lookup<ffi.NativeFunction<ffi.Uint32 Function(ffi.Int32)>>(
          'clang_isExpression');
  late final _clang_isExpression =
      _clang_isExpression_ptr.asFunction<int Function(int)>();

  /// Determine whether the given cursor kind represents a statement.
  int clang_isStatement(
    int arg0,
  ) {
    return _clang_isStatement(
      arg0,
    );
  }

  late final _clang_isStatement_ptr =
      _lookup<ffi.NativeFunction<ffi.Uint32 Function(ffi.Int32)>>(
          'clang_isStatement');
  late final _clang_isStatement =
      _clang_isStatement_ptr.asFunction<int Function(int)>();

  /// Determine whether the given cursor kind represents an attribute.
  int clang_isAttribute(
    int arg0,
  ) {
    return _clang_isAttribute(
      arg0,
    );
  }

  late final _clang_isAttribute_ptr =
      _lookup<ffi.NativeFunction<ffi.Uint32 Function(ffi.Int32)>>(
          'clang_isAttribute');
  late final _clang_isAttribute =
      _clang_isAttribute_ptr.asFunction<int Function(int)>();

  /// Determine whether the given cursor has any attributes.
  int clang_Cursor_hasAttrs(
    CXCursor C,
  ) {
    return _clang_Cursor_hasAttrs(
      C,
    );
  }

  late final _clang_Cursor_hasAttrs_ptr =
      _lookup<ffi.NativeFunction<ffi.Uint32 Function(CXCursor)>>(
          'clang_Cursor_hasAttrs');
  late final _clang_Cursor_hasAttrs =
      _clang_Cursor_hasAttrs_ptr.asFunction<int Function(CXCursor)>();

  /// Determine whether the given cursor kind represents an invalid cursor.
  int clang_isInvalid(
    int arg0,
  ) {
    return _clang_isInvalid(
      arg0,
    );
  }

  late final _clang_isInvalid_ptr =
      _lookup<ffi.NativeFunction<ffi.Uint32 Function(ffi.Int32)>>(
          'clang_isInvalid');
  late final _clang_isInvalid =
      _clang_isInvalid_ptr.asFunction<int Function(int)>();

  /// Determine whether the given cursor kind represents a translation unit.
  int clang_isTranslationUnit(
    int arg0,
  ) {
    return _clang_isTranslationUnit(
      arg0,
    );
  }

  late final _clang_isTranslationUnit_ptr =
      _lookup<ffi.NativeFunction<ffi.Uint32 Function(ffi.Int32)>>(
          'clang_isTranslationUnit');
  late final _clang_isTranslationUnit =
      _clang_isTranslationUnit_ptr.asFunction<int Function(int)>();

  /// * 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,
    );
  }

  late final _clang_isPreprocessing_ptr =
      _lookup<ffi.NativeFunction<ffi.Uint32 Function(ffi.Int32)>>(
          'clang_isPreprocessing');
  late final _clang_isPreprocessing =
      _clang_isPreprocessing_ptr.asFunction<int Function(int)>();

  /// * 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,
    );
  }

  late final _clang_isUnexposed_ptr =
      _lookup<ffi.NativeFunction<ffi.Uint32 Function(ffi.Int32)>>(
          'clang_isUnexposed');
  late final _clang_isUnexposed =
      _clang_isUnexposed_ptr.asFunction<int Function(int)>();

  /// Determine the linkage of the entity referred to by a given cursor.
  int clang_getCursorLinkage(
    CXCursor cursor,
  ) {
    return _clang_getCursorLinkage(
      cursor,
    );
  }

  late final _clang_getCursorLinkage_ptr =
      _lookup<ffi.NativeFunction<ffi.Int32 Function(CXCursor)>>(
          'clang_getCursorLinkage');
  late final _clang_getCursorLinkage =
      _clang_getCursorLinkage_ptr.asFunction<int Function(CXCursor)>();

  /// Describe the visibility of the entity referred to by a cursor.
  int clang_getCursorVisibility(
    CXCursor cursor,
  ) {
    return _clang_getCursorVisibility(
      cursor,
    );
  }

  late final _clang_getCursorVisibility_ptr =
      _lookup<ffi.NativeFunction<ffi.Int32 Function(CXCursor)>>(
          'clang_getCursorVisibility');
  late final _clang_getCursorVisibility =
      _clang_getCursorVisibility_ptr.asFunction<int Function(CXCursor)>();

  /// Determine the availability of the entity that this cursor refers to,
  /// taking the current target platform into account.
  int clang_getCursorAvailability(
    CXCursor cursor,
  ) {
    return _clang_getCursorAvailability(
      cursor,
    );
  }

  late final _clang_getCursorAvailability_ptr =
      _lookup<ffi.NativeFunction<ffi.Int32 Function(CXCursor)>>(
          'clang_getCursorAvailability');
  late final _clang_getCursorAvailability =
      _clang_getCursorAvailability_ptr.asFunction<int Function(CXCursor)>();

  /// Determine the availability of the entity that this cursor refers to on any
  /// platforms for which availability information is known.
  int clang_getCursorPlatformAvailability(
    CXCursor cursor,
    ffi.Pointer<ffi.Int32> always_deprecated,
    ffi.Pointer<CXString> deprecated_message,
    ffi.Pointer<ffi.Int32> always_unavailable,
    ffi.Pointer<CXString> unavailable_message,
    ffi.Pointer<CXPlatformAvailability> availability,
    int availability_size,
  ) {
    return _clang_getCursorPlatformAvailability(
      cursor,
      always_deprecated,
      deprecated_message,
      always_unavailable,
      unavailable_message,
      availability,
      availability_size,
    );
  }

  late final _clang_getCursorPlatformAvailability_ptr = _lookup<
      ffi.NativeFunction<
          ffi.Int32 Function(
              CXCursor,
              ffi.Pointer<ffi.Int32>,
              ffi.Pointer<CXString>,
              ffi.Pointer<ffi.Int32>,
              ffi.Pointer<CXString>,
              ffi.Pointer<CXPlatformAvailability>,
              ffi.Int32)>>('clang_getCursorPlatformAvailability');
  late final _clang_getCursorPlatformAvailability =
      _clang_getCursorPlatformAvailability_ptr.asFunction<
          int Function(
              CXCursor,
              ffi.Pointer<ffi.Int32>,
              ffi.Pointer<CXString>,
              ffi.Pointer<ffi.Int32>,
              ffi.Pointer<CXString>,
              ffi.Pointer<CXPlatformAvailability>,
              int)>();

  /// Free the memory associated with a CXPlatformAvailability structure.
  void clang_disposeCXPlatformAvailability(
    ffi.Pointer<CXPlatformAvailability> availability,
  ) {
    return _clang_disposeCXPlatformAvailability(
      availability,
    );
  }

  late final _clang_disposeCXPlatformAvailability_ptr = _lookup<
          ffi.NativeFunction<
              ffi.Void Function(ffi.Pointer<CXPlatformAvailability>)>>(
      'clang_disposeCXPlatformAvailability');
  late final _clang_disposeCXPlatformAvailability =
      _clang_disposeCXPlatformAvailability_ptr
          .asFunction<void Function(ffi.Pointer<CXPlatformAvailability>)>();

  /// Determine the "language" of the entity referred to by a given cursor.
  int clang_getCursorLanguage(
    CXCursor cursor,
  ) {
    return _clang_getCursorLanguage(
      cursor,
    );
  }

  late final _clang_getCursorLanguage_ptr =
      _lookup<ffi.NativeFunction<ffi.Int32 Function(CXCursor)>>(
          'clang_getCursorLanguage');
  late final _clang_getCursorLanguage =
      _clang_getCursorLanguage_ptr.asFunction<int Function(CXCursor)>();

  /// Determine the "thread-local storage (TLS) kind" of the declaration
  /// referred to by a cursor.
  int clang_getCursorTLSKind(
    CXCursor cursor,
  ) {
    return _clang_getCursorTLSKind(
      cursor,
    );
  }

  late final _clang_getCursorTLSKind_ptr =
      _lookup<ffi.NativeFunction<ffi.Int32 Function(CXCursor)>>(
          'clang_getCursorTLSKind');
  late final _clang_getCursorTLSKind =
      _clang_getCursorTLSKind_ptr.asFunction<int Function(CXCursor)>();

  /// Returns the translation unit that a cursor originated from.
  CXTranslationUnit clang_Cursor_getTranslationUnit(
    CXCursor arg0,
  ) {
    return _clang_Cursor_getTranslationUnit(
      arg0,
    );
  }

  late final _clang_Cursor_getTranslationUnit_ptr =
      _lookup<ffi.NativeFunction<CXTranslationUnit Function(CXCursor)>>(
          'clang_Cursor_getTranslationUnit');
  late final _clang_Cursor_getTranslationUnit =
      _clang_Cursor_getTranslationUnit_ptr
          .asFunction<CXTranslationUnit Function(CXCursor)>();

  /// Creates an empty CXCursorSet.
  CXCursorSet clang_createCXCursorSet() {
    return _clang_createCXCursorSet();
  }

  late final _clang_createCXCursorSet_ptr =
      _lookup<ffi.NativeFunction<CXCursorSet Function()>>(
          'clang_createCXCursorSet');
  late final _clang_createCXCursorSet =
      _clang_createCXCursorSet_ptr.asFunction<CXCursorSet Function()>();

  /// Disposes a CXCursorSet and releases its associated memory.
  void clang_disposeCXCursorSet(
    CXCursorSet cset,
  ) {
    return _clang_disposeCXCursorSet(
      cset,
    );
  }

  late final _clang_disposeCXCursorSet_ptr =
      _lookup<ffi.NativeFunction<ffi.Void Function(CXCursorSet)>>(
          'clang_disposeCXCursorSet');
  late final _clang_disposeCXCursorSet =
      _clang_disposeCXCursorSet_ptr.asFunction<void Function(CXCursorSet)>();

  /// Queries a CXCursorSet to see if it contains a specific CXCursor.
  int clang_CXCursorSet_contains(
    CXCursorSet cset,
    CXCursor cursor,
  ) {
    return _clang_CXCursorSet_contains(
      cset,
      cursor,
    );
  }

  late final _clang_CXCursorSet_contains_ptr =
      _lookup<ffi.NativeFunction<ffi.Uint32 Function(CXCursorSet, CXCursor)>>(
          'clang_CXCursorSet_contains');
  late final _clang_CXCursorSet_contains = _clang_CXCursorSet_contains_ptr
      .asFunction<int Function(CXCursorSet, CXCursor)>();

  /// Inserts a CXCursor into a CXCursorSet.
  int clang_CXCursorSet_insert(
    CXCursorSet cset,
    CXCursor cursor,
  ) {
    return _clang_CXCursorSet_insert(
      cset,
      cursor,
    );
  }

  late final _clang_CXCursorSet_insert_ptr =
      _lookup<ffi.NativeFunction<ffi.Uint32 Function(CXCursorSet, CXCursor)>>(
          'clang_CXCursorSet_insert');
  late final _clang_CXCursorSet_insert = _clang_CXCursorSet_insert_ptr
      .asFunction<int Function(CXCursorSet, CXCursor)>();

  /// Determine the semantic parent of the given cursor.
  CXCursor clang_getCursorSemanticParent(
    CXCursor cursor,
  ) {
    return _clang_getCursorSemanticParent(
      cursor,
    );
  }

  late final _clang_getCursorSemanticParent_ptr =
      _lookup<ffi.NativeFunction<CXCursor Function(CXCursor)>>(
          'clang_getCursorSemanticParent');
  late final _clang_getCursorSemanticParent = _clang_getCursorSemanticParent_ptr
      .asFunction<CXCursor Function(CXCursor)>();

  /// Determine the lexical parent of the given cursor.
  CXCursor clang_getCursorLexicalParent(
    CXCursor cursor,
  ) {
    return _clang_getCursorLexicalParent(
      cursor,
    );
  }

  late final _clang_getCursorLexicalParent_ptr =
      _lookup<ffi.NativeFunction<CXCursor Function(CXCursor)>>(
          'clang_getCursorLexicalParent');
  late final _clang_getCursorLexicalParent = _clang_getCursorLexicalParent_ptr
      .asFunction<CXCursor Function(CXCursor)>();

  /// Determine the set of methods that are overridden by the given method.
  void clang_getOverriddenCursors(
    CXCursor cursor,
    ffi.Pointer<ffi.Pointer<CXCursor>> overridden,
    ffi.Pointer<ffi.Uint32> num_overridden,
  ) {
    return _clang_getOverriddenCursors(
      cursor,
      overridden,
      num_overridden,
    );
  }

  late final _clang_getOverriddenCursors_ptr = _lookup<
      ffi.NativeFunction<
          ffi.Void Function(CXCursor, ffi.Pointer<ffi.Pointer<CXCursor>>,
              ffi.Pointer<ffi.Uint32>)>>('clang_getOverriddenCursors');
  late final _clang_getOverriddenCursors =
      _clang_getOverriddenCursors_ptr.asFunction<
          void Function(CXCursor, ffi.Pointer<ffi.Pointer<CXCursor>>,
              ffi.Pointer<ffi.Uint32>)>();

  /// Free the set of overridden cursors returned by
  /// clang_getOverriddenCursors().
  void clang_disposeOverriddenCursors(
    ffi.Pointer<CXCursor> overridden,
  ) {
    return _clang_disposeOverriddenCursors(
      overridden,
    );
  }

  late final _clang_disposeOverriddenCursors_ptr =
      _lookup<ffi.NativeFunction<ffi.Void Function(ffi.Pointer<CXCursor>)>>(
          'clang_disposeOverriddenCursors');
  late final _clang_disposeOverriddenCursors =
      _clang_disposeOverriddenCursors_ptr
          .asFunction<void Function(ffi.Pointer<CXCursor>)>();

  /// Retrieve the file that is included by the given inclusion directive
  /// cursor.
  CXFile clang_getIncludedFile(
    CXCursor cursor,
  ) {
    return _clang_getIncludedFile(
      cursor,
    );
  }

  late final _clang_getIncludedFile_ptr =
      _lookup<ffi.NativeFunction<CXFile Function(CXCursor)>>(
          'clang_getIncludedFile');
  late final _clang_getIncludedFile =
      _clang_getIncludedFile_ptr.asFunction<CXFile Function(CXCursor)>();

  /// Map a source location to the cursor that describes the entity at that
  /// location in the source code.
  CXCursor clang_getCursor(
    CXTranslationUnit arg0,
    CXSourceLocation arg1,
  ) {
    return _clang_getCursor(
      arg0,
      arg1,
    );
  }

  late final _clang_getCursor_ptr = _lookup<
      ffi.NativeFunction<
          CXCursor Function(
              CXTranslationUnit, CXSourceLocation)>>('clang_getCursor');
  late final _clang_getCursor = _clang_getCursor_ptr
      .asFunction<CXCursor Function(CXTranslationUnit, CXSourceLocation)>();

  /// Retrieve the physical location of the source constructor referenced by the
  /// given cursor.
  CXSourceLocation clang_getCursorLocation(
    CXCursor arg0,
  ) {
    return _clang_getCursorLocation(
      arg0,
    );
  }

  late final _clang_getCursorLocation_ptr =
      _lookup<ffi.NativeFunction<CXSourceLocation Function(CXCursor)>>(
          'clang_getCursorLocation');
  late final _clang_getCursorLocation = _clang_getCursorLocation_ptr
      .asFunction<CXSourceLocation Function(CXCursor)>();

  /// Retrieve the physical extent of the source construct referenced by the
  /// given cursor.
  CXSourceRange clang_getCursorExtent(
    CXCursor arg0,
  ) {
    return _clang_getCursorExtent(
      arg0,
    );
  }

  late final _clang_getCursorExtent_ptr =
      _lookup<ffi.NativeFunction<CXSourceRange Function(CXCursor)>>(
          'clang_getCursorExtent');
  late final _clang_getCursorExtent =
      _clang_getCursorExtent_ptr.asFunction<CXSourceRange Function(CXCursor)>();

  /// Retrieve the type of a CXCursor (if any).
  CXType clang_getCursorType(
    CXCursor C,
  ) {
    return _clang_getCursorType(
      C,
    );
  }

  late final _clang_getCursorType_ptr =
      _lookup<ffi.NativeFunction<CXType Function(CXCursor)>>(
          'clang_getCursorType');
  late final _clang_getCursorType =
      _clang_getCursorType_ptr.asFunction<CXType Function(CXCursor)>();

  /// Pretty-print the underlying type using the rules of the language of the
  /// translation unit from which it came.
  CXString clang_getTypeSpelling(
    CXType CT,
  ) {
    return _clang_getTypeSpelling(
      CT,
    );
  }

  late final _clang_getTypeSpelling_ptr =
      _lookup<ffi.NativeFunction<CXString Function(CXType)>>(
          'clang_getTypeSpelling');
  late final _clang_getTypeSpelling =
      _clang_getTypeSpelling_ptr.asFunction<CXString Function(CXType)>();

  /// Retrieve the underlying type of a typedef declaration.
  CXType clang_getTypedefDeclUnderlyingType(
    CXCursor C,
  ) {
    return _clang_getTypedefDeclUnderlyingType(
      C,
    );
  }

  late final _clang_getTypedefDeclUnderlyingType_ptr =
      _lookup<ffi.NativeFunction<CXType Function(CXCursor)>>(
          'clang_getTypedefDeclUnderlyingType');
  late final _clang_getTypedefDeclUnderlyingType =
      _clang_getTypedefDeclUnderlyingType_ptr
          .asFunction<CXType Function(CXCursor)>();

  /// Retrieve the integer type of an enum declaration.
  CXType clang_getEnumDeclIntegerType(
    CXCursor C,
  ) {
    return _clang_getEnumDeclIntegerType(
      C,
    );
  }

  late final _clang_getEnumDeclIntegerType_ptr =
      _lookup<ffi.NativeFunction<CXType Function(CXCursor)>>(
          'clang_getEnumDeclIntegerType');
  late final _clang_getEnumDeclIntegerType =
      _clang_getEnumDeclIntegerType_ptr.asFunction<CXType Function(CXCursor)>();

  /// Retrieve the integer value of an enum constant declaration as a signed
  /// long long.
  int clang_getEnumConstantDeclValue(
    CXCursor C,
  ) {
    return _clang_getEnumConstantDeclValue(
      C,
    );
  }

  late final _clang_getEnumConstantDeclValue_ptr =
      _lookup<ffi.NativeFunction<ffi.Int64 Function(CXCursor)>>(
          'clang_getEnumConstantDeclValue');
  late final _clang_getEnumConstantDeclValue =
      _clang_getEnumConstantDeclValue_ptr.asFunction<int Function(CXCursor)>();

  /// Retrieve the integer value of an enum constant declaration as an unsigned
  /// long long.
  int clang_getEnumConstantDeclUnsignedValue(
    CXCursor C,
  ) {
    return _clang_getEnumConstantDeclUnsignedValue(
      C,
    );
  }

  late final _clang_getEnumConstantDeclUnsignedValue_ptr =
      _lookup<ffi.NativeFunction<ffi.Uint64 Function(CXCursor)>>(
          'clang_getEnumConstantDeclUnsignedValue');
  late final _clang_getEnumConstantDeclUnsignedValue =
      _clang_getEnumConstantDeclUnsignedValue_ptr
          .asFunction<int Function(CXCursor)>();

  /// Retrieve the bit width of a bit field declaration as an integer.
  int clang_getFieldDeclBitWidth(
    CXCursor C,
  ) {
    return _clang_getFieldDeclBitWidth(
      C,
    );
  }

  late final _clang_getFieldDeclBitWidth_ptr =
      _lookup<ffi.NativeFunction<ffi.Int32 Function(CXCursor)>>(
          'clang_getFieldDeclBitWidth');
  late final _clang_getFieldDeclBitWidth =
      _clang_getFieldDeclBitWidth_ptr.asFunction<int Function(CXCursor)>();

  /// Retrieve the number of non-variadic arguments associated with a given
  /// cursor.
  int clang_Cursor_getNumArguments(
    CXCursor C,
  ) {
    return _clang_Cursor_getNumArguments(
      C,
    );
  }

  late final _clang_Cursor_getNumArguments_ptr =
      _lookup<ffi.NativeFunction<ffi.Int32 Function(CXCursor)>>(
          'clang_Cursor_getNumArguments');
  late final _clang_Cursor_getNumArguments =
      _clang_Cursor_getNumArguments_ptr.asFunction<int Function(CXCursor)>();

  /// Retrieve the argument cursor of a function or method.
  CXCursor clang_Cursor_getArgument(
    CXCursor C,
    int i,
  ) {
    return _clang_Cursor_getArgument(
      C,
      i,
    );
  }

  late final _clang_Cursor_getArgument_ptr =
      _lookup<ffi.NativeFunction<CXCursor Function(CXCursor, ffi.Uint32)>>(
          'clang_Cursor_getArgument');
  late final _clang_Cursor_getArgument = _clang_Cursor_getArgument_ptr
      .asFunction<CXCursor Function(CXCursor, int)>();

  /// Returns the number of template args of a function decl representing a
  /// template specialization.
  int clang_Cursor_getNumTemplateArguments(
    CXCursor C,
  ) {
    return _clang_Cursor_getNumTemplateArguments(
      C,
    );
  }

  late final _clang_Cursor_getNumTemplateArguments_ptr =
      _lookup<ffi.NativeFunction<ffi.Int32 Function(CXCursor)>>(
          'clang_Cursor_getNumTemplateArguments');
  late final _clang_Cursor_getNumTemplateArguments =
      _clang_Cursor_getNumTemplateArguments_ptr
          .asFunction<int Function(CXCursor)>();

  /// Retrieve the kind of the I'th template argument of the CXCursor C.
  int clang_Cursor_getTemplateArgumentKind(
    CXCursor C,
    int I,
  ) {
    return _clang_Cursor_getTemplateArgumentKind(
      C,
      I,
    );
  }

  late final _clang_Cursor_getTemplateArgumentKind_ptr =
      _lookup<ffi.NativeFunction<ffi.Int32 Function(CXCursor, ffi.Uint32)>>(
          'clang_Cursor_getTemplateArgumentKind');
  late final _clang_Cursor_getTemplateArgumentKind =
      _clang_Cursor_getTemplateArgumentKind_ptr
          .asFunction<int Function(CXCursor, int)>();

  /// Retrieve a CXType representing the type of a TemplateArgument of a
  /// function decl representing a template specialization.
  CXType clang_Cursor_getTemplateArgumentType(
    CXCursor C,
    int I,
  ) {
    return _clang_Cursor_getTemplateArgumentType(
      C,
      I,
    );
  }

  late final _clang_Cursor_getTemplateArgumentType_ptr =
      _lookup<ffi.NativeFunction<CXType Function(CXCursor, ffi.Uint32)>>(
          'clang_Cursor_getTemplateArgumentType');
  late final _clang_Cursor_getTemplateArgumentType =
      _clang_Cursor_getTemplateArgumentType_ptr
          .asFunction<CXType Function(CXCursor, int)>();

  /// Retrieve the value of an Integral TemplateArgument (of a function decl
  /// representing a template specialization) as a signed long long.
  int clang_Cursor_getTemplateArgumentValue(
    CXCursor C,
    int I,
  ) {
    return _clang_Cursor_getTemplateArgumentValue(
      C,
      I,
    );
  }

  late final _clang_Cursor_getTemplateArgumentValue_ptr =
      _lookup<ffi.NativeFunction<ffi.Int64 Function(CXCursor, ffi.Uint32)>>(
          'clang_Cursor_getTemplateArgumentValue');
  late final _clang_Cursor_getTemplateArgumentValue =
      _clang_Cursor_getTemplateArgumentValue_ptr
          .asFunction<int Function(CXCursor, int)>();

  /// Retrieve the value of an Integral TemplateArgument (of a function decl
  /// representing a template specialization) as an unsigned long long.
  int clang_Cursor_getTemplateArgumentUnsignedValue(
    CXCursor C,
    int I,
  ) {
    return _clang_Cursor_getTemplateArgumentUnsignedValue(
      C,
      I,
    );
  }

  late final _clang_Cursor_getTemplateArgumentUnsignedValue_ptr =
      _lookup<ffi.NativeFunction<ffi.Uint64 Function(CXCursor, ffi.Uint32)>>(
          'clang_Cursor_getTemplateArgumentUnsignedValue');
  late final _clang_Cursor_getTemplateArgumentUnsignedValue =
      _clang_Cursor_getTemplateArgumentUnsignedValue_ptr
          .asFunction<int Function(CXCursor, int)>();

  /// Determine whether two CXTypes represent the same type.
  int clang_equalTypes(
    CXType A,
    CXType B,
  ) {
    return _clang_equalTypes(
      A,
      B,
    );
  }

  late final _clang_equalTypes_ptr =
      _lookup<ffi.NativeFunction<ffi.Uint32 Function(CXType, CXType)>>(
          'clang_equalTypes');
  late final _clang_equalTypes =
      _clang_equalTypes_ptr.asFunction<int Function(CXType, CXType)>();

  /// Return the canonical type for a CXType.
  CXType clang_getCanonicalType(
    CXType T,
  ) {
    return _clang_getCanonicalType(
      T,
    );
  }

  late final _clang_getCanonicalType_ptr =
      _lookup<ffi.NativeFunction<CXType Function(CXType)>>(
          'clang_getCanonicalType');
  late final _clang_getCanonicalType =
      _clang_getCanonicalType_ptr.asFunction<CXType Function(CXType)>();

  /// Determine whether a CXType has the "const" qualifier set, without looking
  /// through typedefs that may have added "const" at a different level.
  int clang_isConstQualifiedType(
    CXType T,
  ) {
    return _clang_isConstQualifiedType(
      T,
    );
  }

  late final _clang_isConstQualifiedType_ptr =
      _lookup<ffi.NativeFunction<ffi.Uint32 Function(CXType)>>(
          'clang_isConstQualifiedType');
  late final _clang_isConstQualifiedType =
      _clang_isConstQualifiedType_ptr.asFunction<int Function(CXType)>();

  /// Determine whether a CXCursor that is a macro, is function like.
  int clang_Cursor_isMacroFunctionLike(
    CXCursor C,
  ) {
    return _clang_Cursor_isMacroFunctionLike(
      C,
    );
  }

  late final _clang_Cursor_isMacroFunctionLike_ptr =
      _lookup<ffi.NativeFunction<ffi.Uint32 Function(CXCursor)>>(
          'clang_Cursor_isMacroFunctionLike');
  late final _clang_Cursor_isMacroFunctionLike =
      _clang_Cursor_isMacroFunctionLike_ptr
          .asFunction<int Function(CXCursor)>();

  /// Determine whether a CXCursor that is a macro, is a builtin one.
  int clang_Cursor_isMacroBuiltin(
    CXCursor C,
  ) {
    return _clang_Cursor_isMacroBuiltin(
      C,
    );
  }

  late final _clang_Cursor_isMacroBuiltin_ptr =
      _lookup<ffi.NativeFunction<ffi.Uint32 Function(CXCursor)>>(
          'clang_Cursor_isMacroBuiltin');
  late final _clang_Cursor_isMacroBuiltin =
      _clang_Cursor_isMacroBuiltin_ptr.asFunction<int Function(CXCursor)>();

  /// Determine whether a CXCursor that is a function declaration, is an inline
  /// declaration.
  int clang_Cursor_isFunctionInlined(
    CXCursor C,
  ) {
    return _clang_Cursor_isFunctionInlined(
      C,
    );
  }

  late final _clang_Cursor_isFunctionInlined_ptr =
      _lookup<ffi.NativeFunction<ffi.Uint32 Function(CXCursor)>>(
          'clang_Cursor_isFunctionInlined');
  late final _clang_Cursor_isFunctionInlined =
      _clang_Cursor_isFunctionInlined_ptr.asFunction<int Function(CXCursor)>();

  /// Determine whether a CXType has the "volatile" qualifier set, without
  /// looking through typedefs that may have added "volatile" at a different
  /// level.
  int clang_isVolatileQualifiedType(
    CXType T,
  ) {
    return _clang_isVolatileQualifiedType(
      T,
    );
  }

  late final _clang_isVolatileQualifiedType_ptr =
      _lookup<ffi.NativeFunction<ffi.Uint32 Function(CXType)>>(
          'clang_isVolatileQualifiedType');
  late final _clang_isVolatileQualifiedType =
      _clang_isVolatileQualifiedType_ptr.asFunction<int Function(CXType)>();

  /// Determine whether a CXType has the "restrict" qualifier set, without
  /// looking through typedefs that may have added "restrict" at a different
  /// level.
  int clang_isRestrictQualifiedType(
    CXType T,
  ) {
    return _clang_isRestrictQualifiedType(
      T,
    );
  }

  late final _clang_isRestrictQualifiedType_ptr =
      _lookup<ffi.NativeFunction<ffi.Uint32 Function(CXType)>>(
          'clang_isRestrictQualifiedType');
  late final _clang_isRestrictQualifiedType =
      _clang_isRestrictQualifiedType_ptr.asFunction<int Function(CXType)>();

  /// Returns the address space of the given type.
  int clang_getAddressSpace(
    CXType T,
  ) {
    return _clang_getAddressSpace(
      T,
    );
  }

  late final _clang_getAddressSpace_ptr =
      _lookup<ffi.NativeFunction<ffi.Uint32 Function(CXType)>>(
          'clang_getAddressSpace');
  late final _clang_getAddressSpace =
      _clang_getAddressSpace_ptr.asFunction<int Function(CXType)>();

  /// Returns the typedef name of the given type.
  CXString clang_getTypedefName(
    CXType CT,
  ) {
    return _clang_getTypedefName(
      CT,
    );
  }

  late final _clang_getTypedefName_ptr =
      _lookup<ffi.NativeFunction<CXString Function(CXType)>>(
          'clang_getTypedefName');
  late final _clang_getTypedefName =
      _clang_getTypedefName_ptr.asFunction<CXString Function(CXType)>();

  /// For pointer types, returns the type of the pointee.
  CXType clang_getPointeeType(
    CXType T,
  ) {
    return _clang_getPointeeType(
      T,
    );
  }

  late final _clang_getPointeeType_ptr =
      _lookup<ffi.NativeFunction<CXType Function(CXType)>>(
          'clang_getPointeeType');
  late final _clang_getPointeeType =
      _clang_getPointeeType_ptr.asFunction<CXType Function(CXType)>();

  /// Return the cursor for the declaration of the given type.
  CXCursor clang_getTypeDeclaration(
    CXType T,
  ) {
    return _clang_getTypeDeclaration(
      T,
    );
  }

  late final _clang_getTypeDeclaration_ptr =
      _lookup<ffi.NativeFunction<CXCursor Function(CXType)>>(
          'clang_getTypeDeclaration');
  late final _clang_getTypeDeclaration =
      _clang_getTypeDeclaration_ptr.asFunction<CXCursor Function(CXType)>();

  /// Returns the Objective-C type encoding for the specified declaration.
  CXString clang_getDeclObjCTypeEncoding(
    CXCursor C,
  ) {
    return _clang_getDeclObjCTypeEncoding(
      C,
    );
  }

  late final _clang_getDeclObjCTypeEncoding_ptr =
      _lookup<ffi.NativeFunction<CXString Function(CXCursor)>>(
          'clang_getDeclObjCTypeEncoding');
  late final _clang_getDeclObjCTypeEncoding = _clang_getDeclObjCTypeEncoding_ptr
      .asFunction<CXString Function(CXCursor)>();

  /// Returns the Objective-C type encoding for the specified CXType.
  CXString clang_Type_getObjCEncoding(
    CXType type,
  ) {
    return _clang_Type_getObjCEncoding(
      type,
    );
  }

  late final _clang_Type_getObjCEncoding_ptr =
      _lookup<ffi.NativeFunction<CXString Function(CXType)>>(
          'clang_Type_getObjCEncoding');
  late final _clang_Type_getObjCEncoding =
      _clang_Type_getObjCEncoding_ptr.asFunction<CXString Function(CXType)>();

  /// Retrieve the spelling of a given CXTypeKind.
  CXString clang_getTypeKindSpelling(
    int K,
  ) {
    return _clang_getTypeKindSpelling(
      K,
    );
  }

  late final _clang_getTypeKindSpelling_ptr =
      _lookup<ffi.NativeFunction<CXString Function(ffi.Int32)>>(
          'clang_getTypeKindSpelling');
  late final _clang_getTypeKindSpelling =
      _clang_getTypeKindSpelling_ptr.asFunction<CXString Function(int)>();

  /// Retrieve the calling convention associated with a function type.
  int clang_getFunctionTypeCallingConv(
    CXType T,
  ) {
    return _clang_getFunctionTypeCallingConv(
      T,
    );
  }

  late final _clang_getFunctionTypeCallingConv_ptr =
      _lookup<ffi.NativeFunction<ffi.Int32 Function(CXType)>>(
          'clang_getFunctionTypeCallingConv');
  late final _clang_getFunctionTypeCallingConv =
      _clang_getFunctionTypeCallingConv_ptr.asFunction<int Function(CXType)>();

  /// Retrieve the return type associated with a function type.
  CXType clang_getResultType(
    CXType T,
  ) {
    return _clang_getResultType(
      T,
    );
  }

  late final _clang_getResultType_ptr =
      _lookup<ffi.NativeFunction<CXType Function(CXType)>>(
          'clang_getResultType');
  late final _clang_getResultType =
      _clang_getResultType_ptr.asFunction<CXType Function(CXType)>();

  /// Retrieve the exception specification type associated with a function type.
  /// This is a value of type CXCursor_ExceptionSpecificationKind.
  int clang_getExceptionSpecificationType(
    CXType T,
  ) {
    return _clang_getExceptionSpecificationType(
      T,
    );
  }

  late final _clang_getExceptionSpecificationType_ptr =
      _lookup<ffi.NativeFunction<ffi.Int32 Function(CXType)>>(
          'clang_getExceptionSpecificationType');
  late final _clang_getExceptionSpecificationType =
      _clang_getExceptionSpecificationType_ptr
          .asFunction<int Function(CXType)>();

  /// Retrieve the number of non-variadic parameters associated with a function
  /// type.
  int clang_getNumArgTypes(
    CXType T,
  ) {
    return _clang_getNumArgTypes(
      T,
    );
  }

  late final _clang_getNumArgTypes_ptr =
      _lookup<ffi.NativeFunction<ffi.Int32 Function(CXType)>>(
          'clang_getNumArgTypes');
  late final _clang_getNumArgTypes =
      _clang_getNumArgTypes_ptr.asFunction<int Function(CXType)>();

  /// Retrieve the type of a parameter of a function type.
  CXType clang_getArgType(
    CXType T,
    int i,
  ) {
    return _clang_getArgType(
      T,
      i,
    );
  }

  late final _clang_getArgType_ptr =
      _lookup<ffi.NativeFunction<CXType Function(CXType, ffi.Uint32)>>(
          'clang_getArgType');
  late final _clang_getArgType =
      _clang_getArgType_ptr.asFunction<CXType Function(CXType, int)>();

  /// Retrieves the base type of the ObjCObjectType.
  CXType clang_Type_getObjCObjectBaseType(
    CXType T,
  ) {
    return _clang_Type_getObjCObjectBaseType(
      T,
    );
  }

  late final _clang_Type_getObjCObjectBaseType_ptr =
      _lookup<ffi.NativeFunction<CXType Function(CXType)>>(
          'clang_Type_getObjCObjectBaseType');
  late final _clang_Type_getObjCObjectBaseType =
      _clang_Type_getObjCObjectBaseType_ptr
          .asFunction<CXType Function(CXType)>();

  /// Retrieve the number of protocol references associated with an ObjC
  /// object/id.
  int clang_Type_getNumObjCProtocolRefs(
    CXType T,
  ) {
    return _clang_Type_getNumObjCProtocolRefs(
      T,
    );
  }

  late final _clang_Type_getNumObjCProtocolRefs_ptr =
      _lookup<ffi.NativeFunction<ffi.Uint32 Function(CXType)>>(
          'clang_Type_getNumObjCProtocolRefs');
  late final _clang_Type_getNumObjCProtocolRefs =
      _clang_Type_getNumObjCProtocolRefs_ptr.asFunction<int Function(CXType)>();

  /// Retrieve the decl for a protocol reference for an ObjC object/id.
  CXCursor clang_Type_getObjCProtocolDecl(
    CXType T,
    int i,
  ) {
    return _clang_Type_getObjCProtocolDecl(
      T,
      i,
    );
  }

  late final _clang_Type_getObjCProtocolDecl_ptr =
      _lookup<ffi.NativeFunction<CXCursor Function(CXType, ffi.Uint32)>>(
          'clang_Type_getObjCProtocolDecl');
  late final _clang_Type_getObjCProtocolDecl =
      _clang_Type_getObjCProtocolDecl_ptr
          .asFunction<CXCursor Function(CXType, int)>();

  /// Retreive the number of type arguments associated with an ObjC object.
  int clang_Type_getNumObjCTypeArgs(
    CXType T,
  ) {
    return _clang_Type_getNumObjCTypeArgs(
      T,
    );
  }

  late final _clang_Type_getNumObjCTypeArgs_ptr =
      _lookup<ffi.NativeFunction<ffi.Uint32 Function(CXType)>>(
          'clang_Type_getNumObjCTypeArgs');
  late final _clang_Type_getNumObjCTypeArgs =
      _clang_Type_getNumObjCTypeArgs_ptr.asFunction<int Function(CXType)>();

  /// Retrieve a type argument associated with an ObjC object.
  CXType clang_Type_getObjCTypeArg(
    CXType T,
    int i,
  ) {
    return _clang_Type_getObjCTypeArg(
      T,
      i,
    );
  }

  late final _clang_Type_getObjCTypeArg_ptr =
      _lookup<ffi.NativeFunction<CXType Function(CXType, ffi.Uint32)>>(
          'clang_Type_getObjCTypeArg');
  late final _clang_Type_getObjCTypeArg =
      _clang_Type_getObjCTypeArg_ptr.asFunction<CXType Function(CXType, int)>();

  /// Return 1 if the CXType is a variadic function type, and 0 otherwise.
  int clang_isFunctionTypeVariadic(
    CXType T,
  ) {
    return _clang_isFunctionTypeVariadic(
      T,
    );
  }

  late final _clang_isFunctionTypeVariadic_ptr =
      _lookup<ffi.NativeFunction<ffi.Uint32 Function(CXType)>>(
          'clang_isFunctionTypeVariadic');
  late final _clang_isFunctionTypeVariadic =
      _clang_isFunctionTypeVariadic_ptr.asFunction<int Function(CXType)>();

  /// Retrieve the return type associated with a given cursor.
  CXType clang_getCursorResultType(
    CXCursor C,
  ) {
    return _clang_getCursorResultType(
      C,
    );
  }

  late final _clang_getCursorResultType_ptr =
      _lookup<ffi.NativeFunction<CXType Function(CXCursor)>>(
          'clang_getCursorResultType');
  late final _clang_getCursorResultType =
      _clang_getCursorResultType_ptr.asFunction<CXType Function(CXCursor)>();

  /// Retrieve the exception specification type associated with a given cursor.
  /// This is a value of type CXCursor_ExceptionSpecificationKind.
  int clang_getCursorExceptionSpecificationType(
    CXCursor C,
  ) {
    return _clang_getCursorExceptionSpecificationType(
      C,
    );
  }

  late final _clang_getCursorExceptionSpecificationType_ptr =
      _lookup<ffi.NativeFunction<ffi.Int32 Function(CXCursor)>>(
          'clang_getCursorExceptionSpecificationType');
  late final _clang_getCursorExceptionSpecificationType =
      _clang_getCursorExceptionSpecificationType_ptr
          .asFunction<int Function(CXCursor)>();

  /// Return 1 if the CXType is a POD (plain old data) type, and 0 otherwise.
  int clang_isPODType(
    CXType T,
  ) {
    return _clang_isPODType(
      T,
    );
  }

  late final _clang_isPODType_ptr =
      _lookup<ffi.NativeFunction<ffi.Uint32 Function(CXType)>>(
          'clang_isPODType');
  late final _clang_isPODType =
      _clang_isPODType_ptr.asFunction<int Function(CXType)>();

  /// Return the element type of an array, complex, or vector type.
  CXType clang_getElementType(
    CXType T,
  ) {
    return _clang_getElementType(
      T,
    );
  }

  late final _clang_getElementType_ptr =
      _lookup<ffi.NativeFunction<CXType Function(CXType)>>(
          'clang_getElementType');
  late final _clang_getElementType =
      _clang_getElementType_ptr.asFunction<CXType Function(CXType)>();

  /// Return the number of elements of an array or vector type.
  int clang_getNumElements(
    CXType T,
  ) {
    return _clang_getNumElements(
      T,
    );
  }

  late final _clang_getNumElements_ptr =
      _lookup<ffi.NativeFunction<ffi.Int64 Function(CXType)>>(
          'clang_getNumElements');
  late final _clang_getNumElements =
      _clang_getNumElements_ptr.asFunction<int Function(CXType)>();

  /// Return the element type of an array type.
  CXType clang_getArrayElementType(
    CXType T,
  ) {
    return _clang_getArrayElementType(
      T,
    );
  }

  late final _clang_getArrayElementType_ptr =
      _lookup<ffi.NativeFunction<CXType Function(CXType)>>(
          'clang_getArrayElementType');
  late final _clang_getArrayElementType =
      _clang_getArrayElementType_ptr.asFunction<CXType Function(CXType)>();

  /// Return the array size of a constant array.
  int clang_getArraySize(
    CXType T,
  ) {
    return _clang_getArraySize(
      T,
    );
  }

  late final _clang_getArraySize_ptr =
      _lookup<ffi.NativeFunction<ffi.Int64 Function(CXType)>>(
          'clang_getArraySize');
  late final _clang_getArraySize =
      _clang_getArraySize_ptr.asFunction<int Function(CXType)>();

  /// Retrieve the type named by the qualified-id.
  CXType clang_Type_getNamedType(
    CXType T,
  ) {
    return _clang_Type_getNamedType(
      T,
    );
  }

  late final _clang_Type_getNamedType_ptr =
      _lookup<ffi.NativeFunction<CXType Function(CXType)>>(
          'clang_Type_getNamedType');
  late final _clang_Type_getNamedType =
      _clang_Type_getNamedType_ptr.asFunction<CXType Function(CXType)>();

  /// Determine if a typedef is 'transparent' tag.
  int clang_Type_isTransparentTagTypedef(
    CXType T,
  ) {
    return _clang_Type_isTransparentTagTypedef(
      T,
    );
  }

  late final _clang_Type_isTransparentTagTypedef_ptr =
      _lookup<ffi.NativeFunction<ffi.Uint32 Function(CXType)>>(
          'clang_Type_isTransparentTagTypedef');
  late final _clang_Type_isTransparentTagTypedef =
      _clang_Type_isTransparentTagTypedef_ptr
          .asFunction<int Function(CXType)>();

  /// Retrieve the nullability kind of a pointer type.
  int clang_Type_getNullability(
    CXType T,
  ) {
    return _clang_Type_getNullability(
      T,
    );
  }

  late final _clang_Type_getNullability_ptr =
      _lookup<ffi.NativeFunction<ffi.Int32 Function(CXType)>>(
          'clang_Type_getNullability');
  late final _clang_Type_getNullability =
      _clang_Type_getNullability_ptr.asFunction<int Function(CXType)>();

  /// Return the alignment of a type in bytes as per C++[expr.alignof] standard.
  int clang_Type_getAlignOf(
    CXType T,
  ) {
    return _clang_Type_getAlignOf(
      T,
    );
  }

  late final _clang_Type_getAlignOf_ptr =
      _lookup<ffi.NativeFunction<ffi.Int64 Function(CXType)>>(
          'clang_Type_getAlignOf');
  late final _clang_Type_getAlignOf =
      _clang_Type_getAlignOf_ptr.asFunction<int Function(CXType)>();

  /// Return the class type of an member pointer type.
  CXType clang_Type_getClassType(
    CXType T,
  ) {
    return _clang_Type_getClassType(
      T,
    );
  }

  late final _clang_Type_getClassType_ptr =
      _lookup<ffi.NativeFunction<CXType Function(CXType)>>(
          'clang_Type_getClassType');
  late final _clang_Type_getClassType =
      _clang_Type_getClassType_ptr.asFunction<CXType Function(CXType)>();

  /// Return the size of a type in bytes as per C++[expr.sizeof] standard.
  int clang_Type_getSizeOf(
    CXType T,
  ) {
    return _clang_Type_getSizeOf(
      T,
    );
  }

  late final _clang_Type_getSizeOf_ptr =
      _lookup<ffi.NativeFunction<ffi.Int64 Function(CXType)>>(
          'clang_Type_getSizeOf');
  late final _clang_Type_getSizeOf =
      _clang_Type_getSizeOf_ptr.asFunction<int Function(CXType)>();

  /// Return the offset of a field named S in a record of type T in bits as it
  /// would be returned by __offsetof__ as per C++11[18.2p4]
  int clang_Type_getOffsetOf(
    CXType T,
    ffi.Pointer<ffi.Int8> S,
  ) {
    return _clang_Type_getOffsetOf(
      T,
      S,
    );
  }

  late final _clang_Type_getOffsetOf_ptr = _lookup<
      ffi.NativeFunction<
          ffi.Int64 Function(
              CXType, ffi.Pointer<ffi.Int8>)>>('clang_Type_getOffsetOf');
  late final _clang_Type_getOffsetOf = _clang_Type_getOffsetOf_ptr
      .asFunction<int Function(CXType, ffi.Pointer<ffi.Int8>)>();

  /// Return the type that was modified by this attributed type.
  CXType clang_Type_getModifiedType(
    CXType T,
  ) {
    return _clang_Type_getModifiedType(
      T,
    );
  }

  late final _clang_Type_getModifiedType_ptr =
      _lookup<ffi.NativeFunction<CXType Function(CXType)>>(
          'clang_Type_getModifiedType');
  late final _clang_Type_getModifiedType =
      _clang_Type_getModifiedType_ptr.asFunction<CXType Function(CXType)>();

  /// Return the offset of the field represented by the Cursor.
  int clang_Cursor_getOffsetOfField(
    CXCursor C,
  ) {
    return _clang_Cursor_getOffsetOfField(
      C,
    );
  }

  late final _clang_Cursor_getOffsetOfField_ptr =
      _lookup<ffi.NativeFunction<ffi.Int64 Function(CXCursor)>>(
          'clang_Cursor_getOffsetOfField');
  late final _clang_Cursor_getOffsetOfField =
      _clang_Cursor_getOffsetOfField_ptr.asFunction<int Function(CXCursor)>();

  /// Determine whether the given cursor represents an anonymous tag or
  /// namespace
  int clang_Cursor_isAnonymous(
    CXCursor C,
  ) {
    return _clang_Cursor_isAnonymous(
      C,
    );
  }

  late final _clang_Cursor_isAnonymous_ptr =
      _lookup<ffi.NativeFunction<ffi.Uint32 Function(CXCursor)>>(
          'clang_Cursor_isAnonymous');
  late final _clang_Cursor_isAnonymous =
      _clang_Cursor_isAnonymous_ptr.asFunction<int Function(CXCursor)>();

  /// Determine whether the given cursor represents an anonymous record
  /// declaration.
  int clang_Cursor_isAnonymousRecordDecl(
    CXCursor C,
  ) {
    return _clang_Cursor_isAnonymousRecordDecl(
      C,
    );
  }

  late final _clang_Cursor_isAnonymousRecordDecl_ptr =
      _lookup<ffi.NativeFunction<ffi.Uint32 Function(CXCursor)>>(
          'clang_Cursor_isAnonymousRecordDecl');
  late final _clang_Cursor_isAnonymousRecordDecl =
      _clang_Cursor_isAnonymousRecordDecl_ptr
          .asFunction<int Function(CXCursor)>();

  /// Determine whether the given cursor represents an inline namespace
  /// declaration.
  int clang_Cursor_isInlineNamespace(
    CXCursor C,
  ) {
    return _clang_Cursor_isInlineNamespace(
      C,
    );
  }

  late final _clang_Cursor_isInlineNamespace_ptr =
      _lookup<ffi.NativeFunction<ffi.Uint32 Function(CXCursor)>>(
          'clang_Cursor_isInlineNamespace');
  late final _clang_Cursor_isInlineNamespace =
      _clang_Cursor_isInlineNamespace_ptr.asFunction<int Function(CXCursor)>();

  /// Returns the number of template arguments for given template
  /// specialization, or -1 if type T is not a template specialization.
  int clang_Type_getNumTemplateArguments(
    CXType T,
  ) {
    return _clang_Type_getNumTemplateArguments(
      T,
    );
  }

  late final _clang_Type_getNumTemplateArguments_ptr =
      _lookup<ffi.NativeFunction<ffi.Int32 Function(CXType)>>(
          'clang_Type_getNumTemplateArguments');
  late final _clang_Type_getNumTemplateArguments =
      _clang_Type_getNumTemplateArguments_ptr
          .asFunction<int Function(CXType)>();

  /// Returns the type template argument of a template class specialization at
  /// given index.
  CXType clang_Type_getTemplateArgumentAsType(
    CXType T,
    int i,
  ) {
    return _clang_Type_getTemplateArgumentAsType(
      T,
      i,
    );
  }

  late final _clang_Type_getTemplateArgumentAsType_ptr =
      _lookup<ffi.NativeFunction<CXType Function(CXType, ffi.Uint32)>>(
          'clang_Type_getTemplateArgumentAsType');
  late final _clang_Type_getTemplateArgumentAsType =
      _clang_Type_getTemplateArgumentAsType_ptr
          .asFunction<CXType Function(CXType, int)>();

  /// Retrieve the ref-qualifier kind of a function or method.
  int clang_Type_getCXXRefQualifier(
    CXType T,
  ) {
    return _clang_Type_getCXXRefQualifier(
      T,
    );
  }

  late final _clang_Type_getCXXRefQualifier_ptr =
      _lookup<ffi.NativeFunction<ffi.Int32 Function(CXType)>>(
          'clang_Type_getCXXRefQualifier');
  late final _clang_Type_getCXXRefQualifier =
      _clang_Type_getCXXRefQualifier_ptr.asFunction<int Function(CXType)>();

  /// Returns non-zero if the cursor specifies a Record member that is a
  /// bitfield.
  int clang_Cursor_isBitField(
    CXCursor C,
  ) {
    return _clang_Cursor_isBitField(
      C,
    );
  }

  late final _clang_Cursor_isBitField_ptr =
      _lookup<ffi.NativeFunction<ffi.Uint32 Function(CXCursor)>>(
          'clang_Cursor_isBitField');
  late final _clang_Cursor_isBitField =
      _clang_Cursor_isBitField_ptr.asFunction<int Function(CXCursor)>();

  /// Returns 1 if the base class specified by the cursor with kind
  /// CX_CXXBaseSpecifier is virtual.
  int clang_isVirtualBase(
    CXCursor arg0,
  ) {
    return _clang_isVirtualBase(
      arg0,
    );
  }

  late final _clang_isVirtualBase_ptr =
      _lookup<ffi.NativeFunction<ffi.Uint32 Function(CXCursor)>>(
          'clang_isVirtualBase');
  late final _clang_isVirtualBase =
      _clang_isVirtualBase_ptr.asFunction<int Function(CXCursor)>();

  /// Returns the access control level for the referenced object.
  int clang_getCXXAccessSpecifier(
    CXCursor arg0,
  ) {
    return _clang_getCXXAccessSpecifier(
      arg0,
    );
  }

  late final _clang_getCXXAccessSpecifier_ptr =
      _lookup<ffi.NativeFunction<ffi.Int32 Function(CXCursor)>>(
          'clang_getCXXAccessSpecifier');
  late final _clang_getCXXAccessSpecifier =
      _clang_getCXXAccessSpecifier_ptr.asFunction<int Function(CXCursor)>();

  /// Returns the storage class for a function or variable declaration.
  int clang_Cursor_getStorageClass(
    CXCursor arg0,
  ) {
    return _clang_Cursor_getStorageClass(
      arg0,
    );
  }

  late final _clang_Cursor_getStorageClass_ptr =
      _lookup<ffi.NativeFunction<ffi.Int32 Function(CXCursor)>>(
          'clang_Cursor_getStorageClass');
  late final _clang_Cursor_getStorageClass =
      _clang_Cursor_getStorageClass_ptr.asFunction<int Function(CXCursor)>();

  /// Determine the number of overloaded declarations referenced by a
  /// CXCursor_OverloadedDeclRef cursor.
  int clang_getNumOverloadedDecls(
    CXCursor cursor,
  ) {
    return _clang_getNumOverloadedDecls(
      cursor,
    );
  }

  late final _clang_getNumOverloadedDecls_ptr =
      _lookup<ffi.NativeFunction<ffi.Uint32 Function(CXCursor)>>(
          'clang_getNumOverloadedDecls');
  late final _clang_getNumOverloadedDecls =
      _clang_getNumOverloadedDecls_ptr.asFunction<int Function(CXCursor)>();

  /// Retrieve a cursor for one of the overloaded declarations referenced by a
  /// CXCursor_OverloadedDeclRef cursor.
  CXCursor clang_getOverloadedDecl(
    CXCursor cursor,
    int index,
  ) {
    return _clang_getOverloadedDecl(
      cursor,
      index,
    );
  }

  late final _clang_getOverloadedDecl_ptr =
      _lookup<ffi.NativeFunction<CXCursor Function(CXCursor, ffi.Uint32)>>(
          'clang_getOverloadedDecl');
  late final _clang_getOverloadedDecl = _clang_getOverloadedDecl_ptr
      .asFunction<CXCursor Function(CXCursor, int)>();

  /// For cursors representing an iboutletcollection attribute, this function
  /// returns the collection element type.
  CXType clang_getIBOutletCollectionType(
    CXCursor arg0,
  ) {
    return _clang_getIBOutletCollectionType(
      arg0,
    );
  }

  late final _clang_getIBOutletCollectionType_ptr =
      _lookup<ffi.NativeFunction<CXType Function(CXCursor)>>(
          'clang_getIBOutletCollectionType');
  late final _clang_getIBOutletCollectionType =
      _clang_getIBOutletCollectionType_ptr
          .asFunction<CXType Function(CXCursor)>();

  /// Visit the children of a particular cursor.
  int clang_visitChildren(
    CXCursor parent,
    CXCursorVisitor visitor,
    CXClientData client_data,
  ) {
    return _clang_visitChildren(
      parent,
      visitor,
      client_data,
    );
  }

  late final _clang_visitChildren_ptr = _lookup<
      ffi.NativeFunction<
          ffi.Uint32 Function(
              CXCursor, CXCursorVisitor, CXClientData)>>('clang_visitChildren');
  late final _clang_visitChildren = _clang_visitChildren_ptr
      .asFunction<int Function(CXCursor, CXCursorVisitor, CXClientData)>();

  /// Retrieve a Unified Symbol Resolution (USR) for the entity referenced by
  /// the given cursor.
  CXString clang_getCursorUSR(
    CXCursor arg0,
  ) {
    return _clang_getCursorUSR(
      arg0,
    );
  }

  late final _clang_getCursorUSR_ptr =
      _lookup<ffi.NativeFunction<CXString Function(CXCursor)>>(
          'clang_getCursorUSR');
  late final _clang_getCursorUSR =
      _clang_getCursorUSR_ptr.asFunction<CXString Function(CXCursor)>();

  /// Construct a USR for a specified Objective-C class.
  CXString clang_constructUSR_ObjCClass(
    ffi.Pointer<ffi.Int8> class_name,
  ) {
    return _clang_constructUSR_ObjCClass(
      class_name,
    );
  }

  late final _clang_constructUSR_ObjCClass_ptr =
      _lookup<ffi.NativeFunction<CXString Function(ffi.Pointer<ffi.Int8>)>>(
          'clang_constructUSR_ObjCClass');
  late final _clang_constructUSR_ObjCClass = _clang_constructUSR_ObjCClass_ptr
      .asFunction<CXString Function(ffi.Pointer<ffi.Int8>)>();

  /// Construct a USR for a specified Objective-C category.
  CXString clang_constructUSR_ObjCCategory(
    ffi.Pointer<ffi.Int8> class_name,
    ffi.Pointer<ffi.Int8> category_name,
  ) {
    return _clang_constructUSR_ObjCCategory(
      class_name,
      category_name,
    );
  }

  late final _clang_constructUSR_ObjCCategory_ptr = _lookup<
      ffi.NativeFunction<
          CXString Function(ffi.Pointer<ffi.Int8>,
              ffi.Pointer<ffi.Int8>)>>('clang_constructUSR_ObjCCategory');
  late final _clang_constructUSR_ObjCCategory =
      _clang_constructUSR_ObjCCategory_ptr.asFunction<
          CXString Function(ffi.Pointer<ffi.Int8>, ffi.Pointer<ffi.Int8>)>();

  /// Construct a USR for a specified Objective-C protocol.
  CXString clang_constructUSR_ObjCProtocol(
    ffi.Pointer<ffi.Int8> protocol_name,
  ) {
    return _clang_constructUSR_ObjCProtocol(
      protocol_name,
    );
  }

  late final _clang_constructUSR_ObjCProtocol_ptr =
      _lookup<ffi.NativeFunction<CXString Function(ffi.Pointer<ffi.Int8>)>>(
          'clang_constructUSR_ObjCProtocol');
  late final _clang_constructUSR_ObjCProtocol =
      _clang_constructUSR_ObjCProtocol_ptr
          .asFunction<CXString Function(ffi.Pointer<ffi.Int8>)>();

  /// Construct a USR for a specified Objective-C instance variable and the USR
  /// for its containing class.
  CXString clang_constructUSR_ObjCIvar(
    ffi.Pointer<ffi.Int8> name,
    CXString classUSR,
  ) {
    return _clang_constructUSR_ObjCIvar(
      name,
      classUSR,
    );
  }

  late final _clang_constructUSR_ObjCIvar_ptr = _lookup<
      ffi.NativeFunction<
          CXString Function(
              ffi.Pointer<ffi.Int8>, CXString)>>('clang_constructUSR_ObjCIvar');
  late final _clang_constructUSR_ObjCIvar = _clang_constructUSR_ObjCIvar_ptr
      .asFunction<CXString Function(ffi.Pointer<ffi.Int8>, CXString)>();

  /// Construct a USR for a specified Objective-C method and the USR for its
  /// containing class.
  CXString clang_constructUSR_ObjCMethod(
    ffi.Pointer<ffi.Int8> name,
    int isInstanceMethod,
    CXString classUSR,
  ) {
    return _clang_constructUSR_ObjCMethod(
      name,
      isInstanceMethod,
      classUSR,
    );
  }

  late final _clang_constructUSR_ObjCMethod_ptr = _lookup<
      ffi.NativeFunction<
          CXString Function(ffi.Pointer<ffi.Int8>, ffi.Uint32,
              CXString)>>('clang_constructUSR_ObjCMethod');
  late final _clang_constructUSR_ObjCMethod = _clang_constructUSR_ObjCMethod_ptr
      .asFunction<CXString Function(ffi.Pointer<ffi.Int8>, int, CXString)>();

  /// Construct a USR for a specified Objective-C property and the USR for its
  /// containing class.
  CXString clang_constructUSR_ObjCProperty(
    ffi.Pointer<ffi.Int8> property,
    CXString classUSR,
  ) {
    return _clang_constructUSR_ObjCProperty(
      property,
      classUSR,
    );
  }

  late final _clang_constructUSR_ObjCProperty_ptr = _lookup<
      ffi.NativeFunction<
          CXString Function(ffi.Pointer<ffi.Int8>,
              CXString)>>('clang_constructUSR_ObjCProperty');
  late final _clang_constructUSR_ObjCProperty =
      _clang_constructUSR_ObjCProperty_ptr
          .asFunction<CXString Function(ffi.Pointer<ffi.Int8>, CXString)>();

  /// Retrieve a name for the entity referenced by this cursor.
  CXString clang_getCursorSpelling(
    CXCursor arg0,
  ) {
    return _clang_getCursorSpelling(
      arg0,
    );
  }

  late final _clang_getCursorSpelling_ptr =
      _lookup<ffi.NativeFunction<CXString Function(CXCursor)>>(
          'clang_getCursorSpelling');
  late final _clang_getCursorSpelling =
      _clang_getCursorSpelling_ptr.asFunction<CXString Function(CXCursor)>();

  /// Retrieve a range for a piece that forms the cursors spelling name. Most of
  /// the times there is only one range for the complete spelling but for
  /// Objective-C methods and Objective-C message expressions, there are
  /// multiple pieces for each selector identifier.
  CXSourceRange clang_Cursor_getSpellingNameRange(
    CXCursor arg0,
    int pieceIndex,
    int options,
  ) {
    return _clang_Cursor_getSpellingNameRange(
      arg0,
      pieceIndex,
      options,
    );
  }

  late final _clang_Cursor_getSpellingNameRange_ptr = _lookup<
      ffi.NativeFunction<
          CXSourceRange Function(CXCursor, ffi.Uint32,
              ffi.Uint32)>>('clang_Cursor_getSpellingNameRange');
  late final _clang_Cursor_getSpellingNameRange =
      _clang_Cursor_getSpellingNameRange_ptr
          .asFunction<CXSourceRange Function(CXCursor, int, int)>();

  /// Get a property value for the given printing policy.
  int clang_PrintingPolicy_getProperty(
    CXPrintingPolicy Policy,
    int Property,
  ) {
    return _clang_PrintingPolicy_getProperty(
      Policy,
      Property,
    );
  }

  late final _clang_PrintingPolicy_getProperty_ptr = _lookup<
          ffi.NativeFunction<ffi.Uint32 Function(CXPrintingPolicy, ffi.Int32)>>(
      'clang_PrintingPolicy_getProperty');
  late final _clang_PrintingPolicy_getProperty =
      _clang_PrintingPolicy_getProperty_ptr
          .asFunction<int Function(CXPrintingPolicy, int)>();

  /// Set a property value for the given printing policy.
  void clang_PrintingPolicy_setProperty(
    CXPrintingPolicy Policy,
    int Property,
    int Value,
  ) {
    return _clang_PrintingPolicy_setProperty(
      Policy,
      Property,
      Value,
    );
  }

  late final _clang_PrintingPolicy_setProperty_ptr = _lookup<
      ffi.NativeFunction<
          ffi.Void Function(CXPrintingPolicy, ffi.Int32,
              ffi.Uint32)>>('clang_PrintingPolicy_setProperty');
  late final _clang_PrintingPolicy_setProperty =
      _clang_PrintingPolicy_setProperty_ptr
          .asFunction<void Function(CXPrintingPolicy, int, int)>();

  /// Retrieve the default policy for the cursor.
  CXPrintingPolicy clang_getCursorPrintingPolicy(
    CXCursor arg0,
  ) {
    return _clang_getCursorPrintingPolicy(
      arg0,
    );
  }

  late final _clang_getCursorPrintingPolicy_ptr =
      _lookup<ffi.NativeFunction<CXPrintingPolicy Function(CXCursor)>>(
          'clang_getCursorPrintingPolicy');
  late final _clang_getCursorPrintingPolicy = _clang_getCursorPrintingPolicy_ptr
      .asFunction<CXPrintingPolicy Function(CXCursor)>();

  /// Release a printing policy.
  void clang_PrintingPolicy_dispose(
    CXPrintingPolicy Policy,
  ) {
    return _clang_PrintingPolicy_dispose(
      Policy,
    );
  }

  late final _clang_PrintingPolicy_dispose_ptr =
      _lookup<ffi.NativeFunction<ffi.Void Function(CXPrintingPolicy)>>(
          'clang_PrintingPolicy_dispose');
  late final _clang_PrintingPolicy_dispose = _clang_PrintingPolicy_dispose_ptr
      .asFunction<void Function(CXPrintingPolicy)>();

  /// Pretty print declarations.
  CXString clang_getCursorPrettyPrinted(
    CXCursor Cursor,
    CXPrintingPolicy Policy,
  ) {
    return _clang_getCursorPrettyPrinted(
      Cursor,
      Policy,
    );
  }

  late final _clang_getCursorPrettyPrinted_ptr = _lookup<
          ffi.NativeFunction<CXString Function(CXCursor, CXPrintingPolicy)>>(
      'clang_getCursorPrettyPrinted');
  late final _clang_getCursorPrettyPrinted = _clang_getCursorPrettyPrinted_ptr
      .asFunction<CXString Function(CXCursor, CXPrintingPolicy)>();

  /// Retrieve the display name for the entity referenced by this cursor.
  CXString clang_getCursorDisplayName(
    CXCursor arg0,
  ) {
    return _clang_getCursorDisplayName(
      arg0,
    );
  }

  late final _clang_getCursorDisplayName_ptr =
      _lookup<ffi.NativeFunction<CXString Function(CXCursor)>>(
          'clang_getCursorDisplayName');
  late final _clang_getCursorDisplayName =
      _clang_getCursorDisplayName_ptr.asFunction<CXString Function(CXCursor)>();

  /// For a cursor that is a reference, retrieve a cursor representing the
  /// entity that it references.
  CXCursor clang_getCursorReferenced(
    CXCursor arg0,
  ) {
    return _clang_getCursorReferenced(
      arg0,
    );
  }

  late final _clang_getCursorReferenced_ptr =
      _lookup<ffi.NativeFunction<CXCursor Function(CXCursor)>>(
          'clang_getCursorReferenced');
  late final _clang_getCursorReferenced =
      _clang_getCursorReferenced_ptr.asFunction<CXCursor Function(CXCursor)>();

  /// For a cursor that is either a reference to or a declaration of some
  /// entity, retrieve a cursor that describes the definition of that entity.
  CXCursor clang_getCursorDefinition(
    CXCursor arg0,
  ) {
    return _clang_getCursorDefinition(
      arg0,
    );
  }

  late final _clang_getCursorDefinition_ptr =
      _lookup<ffi.NativeFunction<CXCursor Function(CXCursor)>>(
          'clang_getCursorDefinition');
  late final _clang_getCursorDefinition =
      _clang_getCursorDefinition_ptr.asFunction<CXCursor Function(CXCursor)>();

  /// Determine whether the declaration pointed to by this cursor is also a
  /// definition of that entity.
  int clang_isCursorDefinition(
    CXCursor arg0,
  ) {
    return _clang_isCursorDefinition(
      arg0,
    );
  }

  late final _clang_isCursorDefinition_ptr =
      _lookup<ffi.NativeFunction<ffi.Uint32 Function(CXCursor)>>(
          'clang_isCursorDefinition');
  late final _clang_isCursorDefinition =
      _clang_isCursorDefinition_ptr.asFunction<int Function(CXCursor)>();

  /// Retrieve the canonical cursor corresponding to the given cursor.
  CXCursor clang_getCanonicalCursor(
    CXCursor arg0,
  ) {
    return _clang_getCanonicalCursor(
      arg0,
    );
  }

  late final _clang_getCanonicalCursor_ptr =
      _lookup<ffi.NativeFunction<CXCursor Function(CXCursor)>>(
          'clang_getCanonicalCursor');
  late final _clang_getCanonicalCursor =
      _clang_getCanonicalCursor_ptr.asFunction<CXCursor Function(CXCursor)>();

  /// If the cursor points to a selector identifier in an Objective-C method or
  /// message expression, this returns the selector index.
  int clang_Cursor_getObjCSelectorIndex(
    CXCursor arg0,
  ) {
    return _clang_Cursor_getObjCSelectorIndex(
      arg0,
    );
  }

  late final _clang_Cursor_getObjCSelectorIndex_ptr =
      _lookup<ffi.NativeFunction<ffi.Int32 Function(CXCursor)>>(
          'clang_Cursor_getObjCSelectorIndex');
  late final _clang_Cursor_getObjCSelectorIndex =
      _clang_Cursor_getObjCSelectorIndex_ptr
          .asFunction<int Function(CXCursor)>();

  /// Given a cursor pointing to a C++ method call or an Objective-C message,
  /// returns non-zero if the method/message is "dynamic", meaning:
  int clang_Cursor_isDynamicCall(
    CXCursor C,
  ) {
    return _clang_Cursor_isDynamicCall(
      C,
    );
  }

  late final _clang_Cursor_isDynamicCall_ptr =
      _lookup<ffi.NativeFunction<ffi.Int32 Function(CXCursor)>>(
          'clang_Cursor_isDynamicCall');
  late final _clang_Cursor_isDynamicCall =
      _clang_Cursor_isDynamicCall_ptr.asFunction<int Function(CXCursor)>();

  /// Given a cursor pointing to an Objective-C message or property reference,
  /// or C++ method call, returns the CXType of the receiver.
  CXType clang_Cursor_getReceiverType(
    CXCursor C,
  ) {
    return _clang_Cursor_getReceiverType(
      C,
    );
  }

  late final _clang_Cursor_getReceiverType_ptr =
      _lookup<ffi.NativeFunction<CXType Function(CXCursor)>>(
          'clang_Cursor_getReceiverType');
  late final _clang_Cursor_getReceiverType =
      _clang_Cursor_getReceiverType_ptr.asFunction<CXType Function(CXCursor)>();

  /// Given a cursor that represents a property declaration, return the
  /// associated property attributes. The bits are formed from
  /// CXObjCPropertyAttrKind.
  int clang_Cursor_getObjCPropertyAttributes(
    CXCursor C,
    int reserved,
  ) {
    return _clang_Cursor_getObjCPropertyAttributes(
      C,
      reserved,
    );
  }

  late final _clang_Cursor_getObjCPropertyAttributes_ptr =
      _lookup<ffi.NativeFunction<ffi.Uint32 Function(CXCursor, ffi.Uint32)>>(
          'clang_Cursor_getObjCPropertyAttributes');
  late final _clang_Cursor_getObjCPropertyAttributes =
      _clang_Cursor_getObjCPropertyAttributes_ptr
          .asFunction<int Function(CXCursor, int)>();

  /// Given a cursor that represents a property declaration, return the name of
  /// the method that implements the getter.
  CXString clang_Cursor_getObjCPropertyGetterName(
    CXCursor C,
  ) {
    return _clang_Cursor_getObjCPropertyGetterName(
      C,
    );
  }

  late final _clang_Cursor_getObjCPropertyGetterName_ptr =
      _lookup<ffi.NativeFunction<CXString Function(CXCursor)>>(
          'clang_Cursor_getObjCPropertyGetterName');
  late final _clang_Cursor_getObjCPropertyGetterName =
      _clang_Cursor_getObjCPropertyGetterName_ptr
          .asFunction<CXString Function(CXCursor)>();

  /// Given a cursor that represents a property declaration, return the name of
  /// the method that implements the setter, if any.
  CXString clang_Cursor_getObjCPropertySetterName(
    CXCursor C,
  ) {
    return _clang_Cursor_getObjCPropertySetterName(
      C,
    );
  }

  late final _clang_Cursor_getObjCPropertySetterName_ptr =
      _lookup<ffi.NativeFunction<CXString Function(CXCursor)>>(
          'clang_Cursor_getObjCPropertySetterName');
  late final _clang_Cursor_getObjCPropertySetterName =
      _clang_Cursor_getObjCPropertySetterName_ptr
          .asFunction<CXString Function(CXCursor)>();

  /// Given a cursor that represents an Objective-C method or parameter
  /// declaration, return the associated Objective-C qualifiers for the return
  /// type or the parameter respectively. The bits are formed from
  /// CXObjCDeclQualifierKind.
  int clang_Cursor_getObjCDeclQualifiers(
    CXCursor C,
  ) {
    return _clang_Cursor_getObjCDeclQualifiers(
      C,
    );
  }

  late final _clang_Cursor_getObjCDeclQualifiers_ptr =
      _lookup<ffi.NativeFunction<ffi.Uint32 Function(CXCursor)>>(
          'clang_Cursor_getObjCDeclQualifiers');
  late final _clang_Cursor_getObjCDeclQualifiers =
      _clang_Cursor_getObjCDeclQualifiers_ptr
          .asFunction<int Function(CXCursor)>();

  /// Given a cursor that represents an Objective-C method or property
  /// declaration, return non-zero if the declaration was affected by
  /// "@optional". Returns zero if the cursor is not such a declaration or it is
  /// "@required".
  int clang_Cursor_isObjCOptional(
    CXCursor C,
  ) {
    return _clang_Cursor_isObjCOptional(
      C,
    );
  }

  late final _clang_Cursor_isObjCOptional_ptr =
      _lookup<ffi.NativeFunction<ffi.Uint32 Function(CXCursor)>>(
          'clang_Cursor_isObjCOptional');
  late final _clang_Cursor_isObjCOptional =
      _clang_Cursor_isObjCOptional_ptr.asFunction<int Function(CXCursor)>();

  /// Returns non-zero if the given cursor is a variadic function or method.
  int clang_Cursor_isVariadic(
    CXCursor C,
  ) {
    return _clang_Cursor_isVariadic(
      C,
    );
  }

  late final _clang_Cursor_isVariadic_ptr =
      _lookup<ffi.NativeFunction<ffi.Uint32 Function(CXCursor)>>(
          'clang_Cursor_isVariadic');
  late final _clang_Cursor_isVariadic =
      _clang_Cursor_isVariadic_ptr.asFunction<int Function(CXCursor)>();

  /// Returns non-zero if the given cursor points to a symbol marked with
  /// external_source_symbol attribute.
  int clang_Cursor_isExternalSymbol(
    CXCursor C,
    ffi.Pointer<CXString> language,
    ffi.Pointer<CXString> definedIn,
    ffi.Pointer<ffi.Uint32> isGenerated,
  ) {
    return _clang_Cursor_isExternalSymbol(
      C,
      language,
      definedIn,
      isGenerated,
    );
  }

  late final _clang_Cursor_isExternalSymbol_ptr = _lookup<
      ffi.NativeFunction<
          ffi.Uint32 Function(
              CXCursor,
              ffi.Pointer<CXString>,
              ffi.Pointer<CXString>,
              ffi.Pointer<ffi.Uint32>)>>('clang_Cursor_isExternalSymbol');
  late final _clang_Cursor_isExternalSymbol =
      _clang_Cursor_isExternalSymbol_ptr.asFunction<
          int Function(CXCursor, ffi.Pointer<CXString>, ffi.Pointer<CXString>,
              ffi.Pointer<ffi.Uint32>)>();

  /// Given a cursor that represents a declaration, return the associated
  /// comment's source range. The range may include multiple consecutive
  /// comments with whitespace in between.
  CXSourceRange clang_Cursor_getCommentRange(
    CXCursor C,
  ) {
    return _clang_Cursor_getCommentRange(
      C,
    );
  }

  late final _clang_Cursor_getCommentRange_ptr =
      _lookup<ffi.NativeFunction<CXSourceRange Function(CXCursor)>>(
          'clang_Cursor_getCommentRange');
  late final _clang_Cursor_getCommentRange = _clang_Cursor_getCommentRange_ptr
      .asFunction<CXSourceRange Function(CXCursor)>();

  /// Given a cursor that represents a declaration, return the associated
  /// comment text, including comment markers.
  CXString clang_Cursor_getRawCommentText(
    CXCursor C,
  ) {
    return _clang_Cursor_getRawCommentText(
      C,
    );
  }

  late final _clang_Cursor_getRawCommentText_ptr =
      _lookup<ffi.NativeFunction<CXString Function(CXCursor)>>(
          'clang_Cursor_getRawCommentText');
  late final _clang_Cursor_getRawCommentText =
      _clang_Cursor_getRawCommentText_ptr
          .asFunction<CXString Function(CXCursor)>();

  /// Given a cursor that represents a documentable entity (e.g., declaration),
  /// return the associated first paragraph.
  CXString clang_Cursor_getBriefCommentText(
    CXCursor C,
  ) {
    return _clang_Cursor_getBriefCommentText(
      C,
    );
  }

  late final _clang_Cursor_getBriefCommentText_ptr =
      _lookup<ffi.NativeFunction<CXString Function(CXCursor)>>(
          'clang_Cursor_getBriefCommentText');
  late final _clang_Cursor_getBriefCommentText =
      _clang_Cursor_getBriefCommentText_ptr
          .asFunction<CXString Function(CXCursor)>();

  /// Retrieve the CXString representing the mangled name of the cursor.
  CXString clang_Cursor_getMangling(
    CXCursor arg0,
  ) {
    return _clang_Cursor_getMangling(
      arg0,
    );
  }

  late final _clang_Cursor_getMangling_ptr =
      _lookup<ffi.NativeFunction<CXString Function(CXCursor)>>(
          'clang_Cursor_getMangling');
  late final _clang_Cursor_getMangling =
      _clang_Cursor_getMangling_ptr.asFunction<CXString Function(CXCursor)>();

  /// Retrieve the CXStrings representing the mangled symbols of the C++
  /// constructor or destructor at the cursor.
  ffi.Pointer<CXStringSet> clang_Cursor_getCXXManglings(
    CXCursor arg0,
  ) {
    return _clang_Cursor_getCXXManglings(
      arg0,
    );
  }

  late final _clang_Cursor_getCXXManglings_ptr =
      _lookup<ffi.NativeFunction<ffi.Pointer<CXStringSet> Function(CXCursor)>>(
          'clang_Cursor_getCXXManglings');
  late final _clang_Cursor_getCXXManglings = _clang_Cursor_getCXXManglings_ptr
      .asFunction<ffi.Pointer<CXStringSet> Function(CXCursor)>();

  /// Retrieve the CXStrings representing the mangled symbols of the ObjC class
  /// interface or implementation at the cursor.
  ffi.Pointer<CXStringSet> clang_Cursor_getObjCManglings(
    CXCursor arg0,
  ) {
    return _clang_Cursor_getObjCManglings(
      arg0,
    );
  }

  late final _clang_Cursor_getObjCManglings_ptr =
      _lookup<ffi.NativeFunction<ffi.Pointer<CXStringSet> Function(CXCursor)>>(
          'clang_Cursor_getObjCManglings');
  late final _clang_Cursor_getObjCManglings = _clang_Cursor_getObjCManglings_ptr
      .asFunction<ffi.Pointer<CXStringSet> Function(CXCursor)>();

  /// Given a CXCursor_ModuleImportDecl cursor, return the associated module.
  CXModule clang_Cursor_getModule(
    CXCursor C,
  ) {
    return _clang_Cursor_getModule(
      C,
    );
  }

  late final _clang_Cursor_getModule_ptr =
      _lookup<ffi.NativeFunction<CXModule Function(CXCursor)>>(
          'clang_Cursor_getModule');
  late final _clang_Cursor_getModule =
      _clang_Cursor_getModule_ptr.asFunction<CXModule Function(CXCursor)>();

  /// Given a CXFile header file, return the module that contains it, if one
  /// exists.
  CXModule clang_getModuleForFile(
    CXTranslationUnit arg0,
    CXFile arg1,
  ) {
    return _clang_getModuleForFile(
      arg0,
      arg1,
    );
  }

  late final _clang_getModuleForFile_ptr =
      _lookup<ffi.NativeFunction<CXModule Function(CXTranslationUnit, CXFile)>>(
          'clang_getModuleForFile');
  late final _clang_getModuleForFile = _clang_getModuleForFile_ptr
      .asFunction<CXModule Function(CXTranslationUnit, CXFile)>();

  /// Returns the module file where the provided module object came from.
  CXFile clang_Module_getASTFile(
    CXModule Module,
  ) {
    return _clang_Module_getASTFile(
      Module,
    );
  }

  late final _clang_Module_getASTFile_ptr =
      _lookup<ffi.NativeFunction<CXFile Function(CXModule)>>(
          'clang_Module_getASTFile');
  late final _clang_Module_getASTFile =
      _clang_Module_getASTFile_ptr.asFunction<CXFile Function(CXModule)>();

  /// 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.
  CXModule clang_Module_getParent(
    CXModule Module,
  ) {
    return _clang_Module_getParent(
      Module,
    );
  }

  late final _clang_Module_getParent_ptr =
      _lookup<ffi.NativeFunction<CXModule Function(CXModule)>>(
          'clang_Module_getParent');
  late final _clang_Module_getParent =
      _clang_Module_getParent_ptr.asFunction<CXModule Function(CXModule)>();

  /// Returns the name of the module, e.g. for the 'std.vector' sub-module it
  /// will return "vector".
  CXString clang_Module_getName(
    CXModule Module,
  ) {
    return _clang_Module_getName(
      Module,
    );
  }

  late final _clang_Module_getName_ptr =
      _lookup<ffi.NativeFunction<CXString Function(CXModule)>>(
          'clang_Module_getName');
  late final _clang_Module_getName =
      _clang_Module_getName_ptr.asFunction<CXString Function(CXModule)>();

  /// Returns the full name of the module, e.g. "std.vector".
  CXString clang_Module_getFullName(
    CXModule Module,
  ) {
    return _clang_Module_getFullName(
      Module,
    );
  }

  late final _clang_Module_getFullName_ptr =
      _lookup<ffi.NativeFunction<CXString Function(CXModule)>>(
          'clang_Module_getFullName');
  late final _clang_Module_getFullName =
      _clang_Module_getFullName_ptr.asFunction<CXString Function(CXModule)>();

  /// Returns non-zero if the module is a system one.
  int clang_Module_isSystem(
    CXModule Module,
  ) {
    return _clang_Module_isSystem(
      Module,
    );
  }

  late final _clang_Module_isSystem_ptr =
      _lookup<ffi.NativeFunction<ffi.Int32 Function(CXModule)>>(
          'clang_Module_isSystem');
  late final _clang_Module_isSystem =
      _clang_Module_isSystem_ptr.asFunction<int Function(CXModule)>();

  /// Returns the number of top level headers associated with this module.
  int clang_Module_getNumTopLevelHeaders(
    CXTranslationUnit arg0,
    CXModule Module,
  ) {
    return _clang_Module_getNumTopLevelHeaders(
      arg0,
      Module,
    );
  }

  late final _clang_Module_getNumTopLevelHeaders_ptr = _lookup<
          ffi.NativeFunction<ffi.Uint32 Function(CXTranslationUnit, CXModule)>>(
      'clang_Module_getNumTopLevelHeaders');
  late final _clang_Module_getNumTopLevelHeaders =
      _clang_Module_getNumTopLevelHeaders_ptr
          .asFunction<int Function(CXTranslationUnit, CXModule)>();

  /// Returns the specified top level header associated with the module.
  CXFile clang_Module_getTopLevelHeader(
    CXTranslationUnit arg0,
    CXModule Module,
    int Index,
  ) {
    return _clang_Module_getTopLevelHeader(
      arg0,
      Module,
      Index,
    );
  }

  late final _clang_Module_getTopLevelHeader_ptr = _lookup<
      ffi.NativeFunction<
          CXFile Function(CXTranslationUnit, CXModule,
              ffi.Uint32)>>('clang_Module_getTopLevelHeader');
  late final _clang_Module_getTopLevelHeader =
      _clang_Module_getTopLevelHeader_ptr
          .asFunction<CXFile Function(CXTranslationUnit, CXModule, int)>();

  /// Determine if a C++ constructor is a converting constructor.
  int clang_CXXConstructor_isConvertingConstructor(
    CXCursor C,
  ) {
    return _clang_CXXConstructor_isConvertingConstructor(
      C,
    );
  }

  late final _clang_CXXConstructor_isConvertingConstructor_ptr =
      _lookup<ffi.NativeFunction<ffi.Uint32 Function(CXCursor)>>(
          'clang_CXXConstructor_isConvertingConstructor');
  late final _clang_CXXConstructor_isConvertingConstructor =
      _clang_CXXConstructor_isConvertingConstructor_ptr
          .asFunction<int Function(CXCursor)>();

  /// Determine if a C++ constructor is a copy constructor.
  int clang_CXXConstructor_isCopyConstructor(
    CXCursor C,
  ) {
    return _clang_CXXConstructor_isCopyConstructor(
      C,
    );
  }

  late final _clang_CXXConstructor_isCopyConstructor_ptr =
      _lookup<ffi.NativeFunction<ffi.Uint32 Function(CXCursor)>>(
          'clang_CXXConstructor_isCopyConstructor');
  late final _clang_CXXConstructor_isCopyConstructor =
      _clang_CXXConstructor_isCopyConstructor_ptr
          .asFunction<int Function(CXCursor)>();

  /// Determine if a C++ constructor is the default constructor.
  int clang_CXXConstructor_isDefaultConstructor(
    CXCursor C,
  ) {
    return _clang_CXXConstructor_isDefaultConstructor(
      C,
    );
  }

  late final _clang_CXXConstructor_isDefaultConstructor_ptr =
      _lookup<ffi.NativeFunction<ffi.Uint32 Function(CXCursor)>>(
          'clang_CXXConstructor_isDefaultConstructor');
  late final _clang_CXXConstructor_isDefaultConstructor =
      _clang_CXXConstructor_isDefaultConstructor_ptr
          .asFunction<int Function(CXCursor)>();

  /// Determine if a C++ constructor is a move constructor.
  int clang_CXXConstructor_isMoveConstructor(
    CXCursor C,
  ) {
    return _clang_CXXConstructor_isMoveConstructor(
      C,
    );
  }

  late final _clang_CXXConstructor_isMoveConstructor_ptr =
      _lookup<ffi.NativeFunction<ffi.Uint32 Function(CXCursor)>>(
          'clang_CXXConstructor_isMoveConstructor');
  late final _clang_CXXConstructor_isMoveConstructor =
      _clang_CXXConstructor_isMoveConstructor_ptr
          .asFunction<int Function(CXCursor)>();

  /// Determine if a C++ field is declared 'mutable'.
  int clang_CXXField_isMutable(
    CXCursor C,
  ) {
    return _clang_CXXField_isMutable(
      C,
    );
  }

  late final _clang_CXXField_isMutable_ptr =
      _lookup<ffi.NativeFunction<ffi.Uint32 Function(CXCursor)>>(
          'clang_CXXField_isMutable');
  late final _clang_CXXField_isMutable =
      _clang_CXXField_isMutable_ptr.asFunction<int Function(CXCursor)>();

  /// Determine if a C++ method is declared '= default'.
  int clang_CXXMethod_isDefaulted(
    CXCursor C,
  ) {
    return _clang_CXXMethod_isDefaulted(
      C,
    );
  }

  late final _clang_CXXMethod_isDefaulted_ptr =
      _lookup<ffi.NativeFunction<ffi.Uint32 Function(CXCursor)>>(
          'clang_CXXMethod_isDefaulted');
  late final _clang_CXXMethod_isDefaulted =
      _clang_CXXMethod_isDefaulted_ptr.asFunction<int Function(CXCursor)>();

  /// Determine if a C++ member function or member function template is pure
  /// virtual.
  int clang_CXXMethod_isPureVirtual(
    CXCursor C,
  ) {
    return _clang_CXXMethod_isPureVirtual(
      C,
    );
  }

  late final _clang_CXXMethod_isPureVirtual_ptr =
      _lookup<ffi.NativeFunction<ffi.Uint32 Function(CXCursor)>>(
          'clang_CXXMethod_isPureVirtual');
  late final _clang_CXXMethod_isPureVirtual =
      _clang_CXXMethod_isPureVirtual_ptr.asFunction<int Function(CXCursor)>();

  /// Determine if a C++ member function or member function template is declared
  /// 'static'.
  int clang_CXXMethod_isStatic(
    CXCursor C,
  ) {
    return _clang_CXXMethod_isStatic(
      C,
    );
  }

  late final _clang_CXXMethod_isStatic_ptr =
      _lookup<ffi.NativeFunction<ffi.Uint32 Function(CXCursor)>>(
          'clang_CXXMethod_isStatic');
  late final _clang_CXXMethod_isStatic =
      _clang_CXXMethod_isStatic_ptr.asFunction<int Function(CXCursor)>();

  /// Determine if a C++ member function or member function template is
  /// explicitly declared 'virtual' or if it overrides a virtual method from one
  /// of the base classes.
  int clang_CXXMethod_isVirtual(
    CXCursor C,
  ) {
    return _clang_CXXMethod_isVirtual(
      C,
    );
  }

  late final _clang_CXXMethod_isVirtual_ptr =
      _lookup<ffi.NativeFunction<ffi.Uint32 Function(CXCursor)>>(
          'clang_CXXMethod_isVirtual');
  late final _clang_CXXMethod_isVirtual =
      _clang_CXXMethod_isVirtual_ptr.asFunction<int Function(CXCursor)>();

  /// Determine if a C++ record is abstract, i.e. whether a class or struct has
  /// a pure virtual member function.
  int clang_CXXRecord_isAbstract(
    CXCursor C,
  ) {
    return _clang_CXXRecord_isAbstract(
      C,
    );
  }

  late final _clang_CXXRecord_isAbstract_ptr =
      _lookup<ffi.NativeFunction<ffi.Uint32 Function(CXCursor)>>(
          'clang_CXXRecord_isAbstract');
  late final _clang_CXXRecord_isAbstract =
      _clang_CXXRecord_isAbstract_ptr.asFunction<int Function(CXCursor)>();

  /// Determine if an enum declaration refers to a scoped enum.
  int clang_EnumDecl_isScoped(
    CXCursor C,
  ) {
    return _clang_EnumDecl_isScoped(
      C,
    );
  }

  late final _clang_EnumDecl_isScoped_ptr =
      _lookup<ffi.NativeFunction<ffi.Uint32 Function(CXCursor)>>(
          'clang_EnumDecl_isScoped');
  late final _clang_EnumDecl_isScoped =
      _clang_EnumDecl_isScoped_ptr.asFunction<int Function(CXCursor)>();

  /// Determine if a C++ member function or member function template is declared
  /// 'const'.
  int clang_CXXMethod_isConst(
    CXCursor C,
  ) {
    return _clang_CXXMethod_isConst(
      C,
    );
  }

  late final _clang_CXXMethod_isConst_ptr =
      _lookup<ffi.NativeFunction<ffi.Uint32 Function(CXCursor)>>(
          'clang_CXXMethod_isConst');
  late final _clang_CXXMethod_isConst =
      _clang_CXXMethod_isConst_ptr.asFunction<int Function(CXCursor)>();

  /// Given a cursor that represents a template, determine the cursor kind of
  /// the specializations would be generated by instantiating the template.
  int clang_getTemplateCursorKind(
    CXCursor C,
  ) {
    return _clang_getTemplateCursorKind(
      C,
    );
  }

  late final _clang_getTemplateCursorKind_ptr =
      _lookup<ffi.NativeFunction<ffi.Int32 Function(CXCursor)>>(
          'clang_getTemplateCursorKind');
  late final _clang_getTemplateCursorKind =
      _clang_getTemplateCursorKind_ptr.asFunction<int Function(CXCursor)>();

  /// Given a cursor that may represent a specialization or instantiation of a
  /// template, retrieve the cursor that represents the template that it
  /// specializes or from which it was instantiated.
  CXCursor clang_getSpecializedCursorTemplate(
    CXCursor C,
  ) {
    return _clang_getSpecializedCursorTemplate(
      C,
    );
  }

  late final _clang_getSpecializedCursorTemplate_ptr =
      _lookup<ffi.NativeFunction<CXCursor Function(CXCursor)>>(
          'clang_getSpecializedCursorTemplate');
  late final _clang_getSpecializedCursorTemplate =
      _clang_getSpecializedCursorTemplate_ptr
          .asFunction<CXCursor Function(CXCursor)>();

  /// Given a cursor that references something else, return the source range
  /// covering that reference.
  CXSourceRange clang_getCursorReferenceNameRange(
    CXCursor C,
    int NameFlags,
    int PieceIndex,
  ) {
    return _clang_getCursorReferenceNameRange(
      C,
      NameFlags,
      PieceIndex,
    );
  }

  late final _clang_getCursorReferenceNameRange_ptr = _lookup<
      ffi.NativeFunction<
          CXSourceRange Function(CXCursor, ffi.Uint32,
              ffi.Uint32)>>('clang_getCursorReferenceNameRange');
  late final _clang_getCursorReferenceNameRange =
      _clang_getCursorReferenceNameRange_ptr
          .asFunction<CXSourceRange Function(CXCursor, int, int)>();

  /// Get the raw lexical token starting with the given location.
  ffi.Pointer<CXToken> clang_getToken(
    CXTranslationUnit TU,
    CXSourceLocation Location,
  ) {
    return _clang_getToken(
      TU,
      Location,
    );
  }

  late final _clang_getToken_ptr = _lookup<
      ffi.NativeFunction<
          ffi.Pointer<CXToken> Function(
              CXTranslationUnit, CXSourceLocation)>>('clang_getToken');
  late final _clang_getToken = _clang_getToken_ptr.asFunction<
      ffi.Pointer<CXToken> Function(CXTranslationUnit, CXSourceLocation)>();

  /// Determine the kind of the given token.
  int clang_getTokenKind(
    CXToken arg0,
  ) {
    return _clang_getTokenKind(
      arg0,
    );
  }

  late final _clang_getTokenKind_ptr =
      _lookup<ffi.NativeFunction<ffi.Int32 Function(CXToken)>>(
          'clang_getTokenKind');
  late final _clang_getTokenKind =
      _clang_getTokenKind_ptr.asFunction<int Function(CXToken)>();

  /// Determine the spelling of the given token.
  CXString clang_getTokenSpelling(
    CXTranslationUnit arg0,
    CXToken arg1,
  ) {
    return _clang_getTokenSpelling(
      arg0,
      arg1,
    );
  }

  late final _clang_getTokenSpelling_ptr = _lookup<
          ffi.NativeFunction<CXString Function(CXTranslationUnit, CXToken)>>(
      'clang_getTokenSpelling');
  late final _clang_getTokenSpelling = _clang_getTokenSpelling_ptr
      .asFunction<CXString Function(CXTranslationUnit, CXToken)>();

  /// Retrieve the source location of the given token.
  CXSourceLocation clang_getTokenLocation(
    CXTranslationUnit arg0,
    CXToken arg1,
  ) {
    return _clang_getTokenLocation(
      arg0,
      arg1,
    );
  }

  late final _clang_getTokenLocation_ptr = _lookup<
      ffi.NativeFunction<
          CXSourceLocation Function(
              CXTranslationUnit, CXToken)>>('clang_getTokenLocation');
  late final _clang_getTokenLocation = _clang_getTokenLocation_ptr
      .asFunction<CXSourceLocation Function(CXTranslationUnit, CXToken)>();

  /// Retrieve a source range that covers the given token.
  CXSourceRange clang_getTokenExtent(
    CXTranslationUnit arg0,
    CXToken arg1,
  ) {
    return _clang_getTokenExtent(
      arg0,
      arg1,
    );
  }

  late final _clang_getTokenExtent_ptr = _lookup<
      ffi.NativeFunction<
          CXSourceRange Function(
              CXTranslationUnit, CXToken)>>('clang_getTokenExtent');
  late final _clang_getTokenExtent = _clang_getTokenExtent_ptr
      .asFunction<CXSourceRange Function(CXTranslationUnit, CXToken)>();

  /// Tokenize the source code described by the given range into raw lexical
  /// tokens.
  void clang_tokenize(
    CXTranslationUnit TU,
    CXSourceRange Range,
    ffi.Pointer<ffi.Pointer<CXToken>> Tokens,
    ffi.Pointer<ffi.Uint32> NumTokens,
  ) {
    return _clang_tokenize(
      TU,
      Range,
      Tokens,
      NumTokens,
    );
  }

  late final _clang_tokenize_ptr = _lookup<
      ffi.NativeFunction<
          ffi.Void Function(
              CXTranslationUnit,
              CXSourceRange,
              ffi.Pointer<ffi.Pointer<CXToken>>,
              ffi.Pointer<ffi.Uint32>)>>('clang_tokenize');
  late final _clang_tokenize = _clang_tokenize_ptr.asFunction<
      void Function(CXTranslationUnit, CXSourceRange,
          ffi.Pointer<ffi.Pointer<CXToken>>, ffi.Pointer<ffi.Uint32>)>();

  /// 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.
  void clang_annotateTokens(
    CXTranslationUnit TU,
    ffi.Pointer<CXToken> Tokens,
    int NumTokens,
    ffi.Pointer<CXCursor> Cursors,
  ) {
    return _clang_annotateTokens(
      TU,
      Tokens,
      NumTokens,
      Cursors,
    );
  }

  late final _clang_annotateTokens_ptr = _lookup<
      ffi.NativeFunction<
          ffi.Void Function(CXTranslationUnit, ffi.Pointer<CXToken>, ffi.Uint32,
              ffi.Pointer<CXCursor>)>>('clang_annotateTokens');
  late final _clang_annotateTokens = _clang_annotateTokens_ptr.asFunction<
      void Function(CXTranslationUnit, ffi.Pointer<CXToken>, int,
          ffi.Pointer<CXCursor>)>();

  /// Free the given set of tokens.
  void clang_disposeTokens(
    CXTranslationUnit TU,
    ffi.Pointer<CXToken> Tokens,
    int NumTokens,
  ) {
    return _clang_disposeTokens(
      TU,
      Tokens,
      NumTokens,
    );
  }

  late final _clang_disposeTokens_ptr = _lookup<
      ffi.NativeFunction<
          ffi.Void Function(CXTranslationUnit, ffi.Pointer<CXToken>,
              ffi.Uint32)>>('clang_disposeTokens');
  late final _clang_disposeTokens = _clang_disposeTokens_ptr.asFunction<
      void Function(CXTranslationUnit, ffi.Pointer<CXToken>, int)>();

  /// These routines are used for testing and debugging, only, and should not be
  /// relied upon.
  CXString clang_getCursorKindSpelling(
    int Kind,
  ) {
    return _clang_getCursorKindSpelling(
      Kind,
    );
  }

  late final _clang_getCursorKindSpelling_ptr =
      _lookup<ffi.NativeFunction<CXString Function(ffi.Int32)>>(
          'clang_getCursorKindSpelling');
  late final _clang_getCursorKindSpelling =
      _clang_getCursorKindSpelling_ptr.asFunction<CXString Function(int)>();

  void clang_getDefinitionSpellingAndExtent(
    CXCursor arg0,
    ffi.Pointer<ffi.Pointer<ffi.Int8>> startBuf,
    ffi.Pointer<ffi.Pointer<ffi.Int8>> endBuf,
    ffi.Pointer<ffi.Uint32> startLine,
    ffi.Pointer<ffi.Uint32> startColumn,
    ffi.Pointer<ffi.Uint32> endLine,
    ffi.Pointer<ffi.Uint32> endColumn,
  ) {
    return _clang_getDefinitionSpellingAndExtent(
      arg0,
      startBuf,
      endBuf,
      startLine,
      startColumn,
      endLine,
      endColumn,
    );
  }

  late final _clang_getDefinitionSpellingAndExtent_ptr = _lookup<
          ffi.NativeFunction<
              ffi.Void Function(
                  CXCursor,
                  ffi.Pointer<ffi.Pointer<ffi.Int8>>,
                  ffi.Pointer<ffi.Pointer<ffi.Int8>>,
                  ffi.Pointer<ffi.Uint32>,
                  ffi.Pointer<ffi.Uint32>,
                  ffi.Pointer<ffi.Uint32>,
                  ffi.Pointer<ffi.Uint32>)>>(
      'clang_getDefinitionSpellingAndExtent');
  late final _clang_getDefinitionSpellingAndExtent =
      _clang_getDefinitionSpellingAndExtent_ptr.asFunction<
          void Function(
              CXCursor,
              ffi.Pointer<ffi.Pointer<ffi.Int8>>,
              ffi.Pointer<ffi.Pointer<ffi.Int8>>,
              ffi.Pointer<ffi.Uint32>,
              ffi.Pointer<ffi.Uint32>,
              ffi.Pointer<ffi.Uint32>,
              ffi.Pointer<ffi.Uint32>)>();

  void clang_enableStackTraces() {
    return _clang_enableStackTraces();
  }

  late final _clang_enableStackTraces_ptr =
      _lookup<ffi.NativeFunction<ffi.Void Function()>>(
          'clang_enableStackTraces');
  late final _clang_enableStackTraces =
      _clang_enableStackTraces_ptr.asFunction<void Function()>();

  void clang_executeOnThread(
    ffi.Pointer<ffi.NativeFunction<ffi.Void Function(ffi.Pointer<ffi.Void>)>>
        fn,
    ffi.Pointer<ffi.Void> user_data,
    int stack_size,
  ) {
    return _clang_executeOnThread(
      fn,
      user_data,
      stack_size,
    );
  }

  late final _clang_executeOnThread_ptr = _lookup<
      ffi.NativeFunction<
          ffi.Void Function(
              ffi.Pointer<
                  ffi.NativeFunction<ffi.Void Function(ffi.Pointer<ffi.Void>)>>,
              ffi.Pointer<ffi.Void>,
              ffi.Uint32)>>('clang_executeOnThread');
  late final _clang_executeOnThread = _clang_executeOnThread_ptr.asFunction<
      void Function(
          ffi.Pointer<
              ffi.NativeFunction<ffi.Void Function(ffi.Pointer<ffi.Void>)>>,
          ffi.Pointer<ffi.Void>,
          int)>();

  /// Determine the kind of a particular chunk within a completion string.
  int clang_getCompletionChunkKind(
    CXCompletionString completion_string,
    int chunk_number,
  ) {
    return _clang_getCompletionChunkKind(
      completion_string,
      chunk_number,
    );
  }

  late final _clang_getCompletionChunkKind_ptr = _lookup<
      ffi.NativeFunction<
          ffi.Int32 Function(
              CXCompletionString, ffi.Uint32)>>('clang_getCompletionChunkKind');
  late final _clang_getCompletionChunkKind = _clang_getCompletionChunkKind_ptr
      .asFunction<int Function(CXCompletionString, int)>();

  /// Retrieve the text associated with a particular chunk within a completion
  /// string.
  CXString clang_getCompletionChunkText(
    CXCompletionString completion_string,
    int chunk_number,
  ) {
    return _clang_getCompletionChunkText(
      completion_string,
      chunk_number,
    );
  }

  late final _clang_getCompletionChunkText_ptr = _lookup<
      ffi.NativeFunction<
          CXString Function(
              CXCompletionString, ffi.Uint32)>>('clang_getCompletionChunkText');
  late final _clang_getCompletionChunkText = _clang_getCompletionChunkText_ptr
      .asFunction<CXString Function(CXCompletionString, int)>();

  /// Retrieve the completion string associated with a particular chunk within a
  /// completion string.
  CXCompletionString clang_getCompletionChunkCompletionString(
    CXCompletionString completion_string,
    int chunk_number,
  ) {
    return _clang_getCompletionChunkCompletionString(
      completion_string,
      chunk_number,
    );
  }

  late final _clang_getCompletionChunkCompletionString_ptr = _lookup<
      ffi.NativeFunction<
          CXCompletionString Function(CXCompletionString,
              ffi.Uint32)>>('clang_getCompletionChunkCompletionString');
  late final _clang_getCompletionChunkCompletionString =
      _clang_getCompletionChunkCompletionString_ptr
          .asFunction<CXCompletionString Function(CXCompletionString, int)>();

  /// Retrieve the number of chunks in the given code-completion string.
  int clang_getNumCompletionChunks(
    CXCompletionString completion_string,
  ) {
    return _clang_getNumCompletionChunks(
      completion_string,
    );
  }

  late final _clang_getNumCompletionChunks_ptr =
      _lookup<ffi.NativeFunction<ffi.Uint32 Function(CXCompletionString)>>(
          'clang_getNumCompletionChunks');
  late final _clang_getNumCompletionChunks = _clang_getNumCompletionChunks_ptr
      .asFunction<int Function(CXCompletionString)>();

  /// Determine the priority of this code completion.
  int clang_getCompletionPriority(
    CXCompletionString completion_string,
  ) {
    return _clang_getCompletionPriority(
      completion_string,
    );
  }

  late final _clang_getCompletionPriority_ptr =
      _lookup<ffi.NativeFunction<ffi.Uint32 Function(CXCompletionString)>>(
          'clang_getCompletionPriority');
  late final _clang_getCompletionPriority = _clang_getCompletionPriority_ptr
      .asFunction<int Function(CXCompletionString)>();

  /// Determine the availability of the entity that this code-completion string
  /// refers to.
  int clang_getCompletionAvailability(
    CXCompletionString completion_string,
  ) {
    return _clang_getCompletionAvailability(
      completion_string,
    );
  }

  late final _clang_getCompletionAvailability_ptr =
      _lookup<ffi.NativeFunction<ffi.Int32 Function(CXCompletionString)>>(
          'clang_getCompletionAvailability');
  late final _clang_getCompletionAvailability =
      _clang_getCompletionAvailability_ptr
          .asFunction<int Function(CXCompletionString)>();

  /// Retrieve the number of annotations associated with the given completion
  /// string.
  int clang_getCompletionNumAnnotations(
    CXCompletionString completion_string,
  ) {
    return _clang_getCompletionNumAnnotations(
      completion_string,
    );
  }

  late final _clang_getCompletionNumAnnotations_ptr =
      _lookup<ffi.NativeFunction<ffi.Uint32 Function(CXCompletionString)>>(
          'clang_getCompletionNumAnnotations');
  late final _clang_getCompletionNumAnnotations =
      _clang_getCompletionNumAnnotations_ptr
          .asFunction<int Function(CXCompletionString)>();

  /// Retrieve the annotation associated with the given completion string.
  CXString clang_getCompletionAnnotation(
    CXCompletionString completion_string,
    int annotation_number,
  ) {
    return _clang_getCompletionAnnotation(
      completion_string,
      annotation_number,
    );
  }

  late final _clang_getCompletionAnnotation_ptr = _lookup<
      ffi.NativeFunction<
          CXString Function(CXCompletionString,
              ffi.Uint32)>>('clang_getCompletionAnnotation');
  late final _clang_getCompletionAnnotation = _clang_getCompletionAnnotation_ptr
      .asFunction<CXString Function(CXCompletionString, int)>();

  /// Retrieve the parent context of the given completion string.
  CXString clang_getCompletionParent(
    CXCompletionString completion_string,
    ffi.Pointer<ffi.Int32> kind,
  ) {
    return _clang_getCompletionParent(
      completion_string,
      kind,
    );
  }

  late final _clang_getCompletionParent_ptr = _lookup<
      ffi.NativeFunction<
          CXString Function(CXCompletionString,
              ffi.Pointer<ffi.Int32>)>>('clang_getCompletionParent');
  late final _clang_getCompletionParent =
      _clang_getCompletionParent_ptr.asFunction<
          CXString Function(CXCompletionString, ffi.Pointer<ffi.Int32>)>();

  /// Retrieve the brief documentation comment attached to the declaration that
  /// corresponds to the given completion string.
  CXString clang_getCompletionBriefComment(
    CXCompletionString completion_string,
  ) {
    return _clang_getCompletionBriefComment(
      completion_string,
    );
  }

  late final _clang_getCompletionBriefComment_ptr =
      _lookup<ffi.NativeFunction<CXString Function(CXCompletionString)>>(
          'clang_getCompletionBriefComment');
  late final _clang_getCompletionBriefComment =
      _clang_getCompletionBriefComment_ptr
          .asFunction<CXString Function(CXCompletionString)>();

  /// Retrieve a completion string for an arbitrary declaration or macro
  /// definition cursor.
  CXCompletionString clang_getCursorCompletionString(
    CXCursor cursor,
  ) {
    return _clang_getCursorCompletionString(
      cursor,
    );
  }

  late final _clang_getCursorCompletionString_ptr =
      _lookup<ffi.NativeFunction<CXCompletionString Function(CXCursor)>>(
          'clang_getCursorCompletionString');
  late final _clang_getCursorCompletionString =
      _clang_getCursorCompletionString_ptr
          .asFunction<CXCompletionString Function(CXCursor)>();

  /// Retrieve the number of fix-its for the given completion index.
  int clang_getCompletionNumFixIts(
    ffi.Pointer<CXCodeCompleteResults> results,
    int completion_index,
  ) {
    return _clang_getCompletionNumFixIts(
      results,
      completion_index,
    );
  }

  late final _clang_getCompletionNumFixIts_ptr = _lookup<
      ffi.NativeFunction<
          ffi.Uint32 Function(ffi.Pointer<CXCodeCompleteResults>,
              ffi.Uint32)>>('clang_getCompletionNumFixIts');
  late final _clang_getCompletionNumFixIts = _clang_getCompletionNumFixIts_ptr
      .asFunction<int Function(ffi.Pointer<CXCodeCompleteResults>, int)>();

  /// Fix-its that *must* be applied before inserting the text for the
  /// corresponding completion.
  CXString clang_getCompletionFixIt(
    ffi.Pointer<CXCodeCompleteResults> results,
    int completion_index,
    int fixit_index,
    ffi.Pointer<CXSourceRange> replacement_range,
  ) {
    return _clang_getCompletionFixIt(
      results,
      completion_index,
      fixit_index,
      replacement_range,
    );
  }

  late final _clang_getCompletionFixIt_ptr = _lookup<
      ffi.NativeFunction<
          CXString Function(
              ffi.Pointer<CXCodeCompleteResults>,
              ffi.Uint32,
              ffi.Uint32,
              ffi.Pointer<CXSourceRange>)>>('clang_getCompletionFixIt');
  late final _clang_getCompletionFixIt =
      _clang_getCompletionFixIt_ptr.asFunction<
          CXString Function(ffi.Pointer<CXCodeCompleteResults>, int, int,
              ffi.Pointer<CXSourceRange>)>();

  /// Returns a default set of code-completion options that can be passed to
  /// clang_codeCompleteAt().
  int clang_defaultCodeCompleteOptions() {
    return _clang_defaultCodeCompleteOptions();
  }

  late final _clang_defaultCodeCompleteOptions_ptr =
      _lookup<ffi.NativeFunction<ffi.Uint32 Function()>>(
          'clang_defaultCodeCompleteOptions');
  late final _clang_defaultCodeCompleteOptions =
      _clang_defaultCodeCompleteOptions_ptr.asFunction<int Function()>();

  /// Perform code completion at a given location in a translation unit.
  ffi.Pointer<CXCodeCompleteResults> clang_codeCompleteAt(
    CXTranslationUnit TU,
    ffi.Pointer<ffi.Int8> complete_filename,
    int complete_line,
    int complete_column,
    ffi.Pointer<CXUnsavedFile> unsaved_files,
    int num_unsaved_files,
    int options,
  ) {
    return _clang_codeCompleteAt(
      TU,
      complete_filename,
      complete_line,
      complete_column,
      unsaved_files,
      num_unsaved_files,
      options,
    );
  }

  late final _clang_codeCompleteAt_ptr = _lookup<
      ffi.NativeFunction<
          ffi.Pointer<CXCodeCompleteResults> Function(
              CXTranslationUnit,
              ffi.Pointer<ffi.Int8>,
              ffi.Uint32,
              ffi.Uint32,
              ffi.Pointer<CXUnsavedFile>,
              ffi.Uint32,
              ffi.Uint32)>>('clang_codeCompleteAt');
  late final _clang_codeCompleteAt = _clang_codeCompleteAt_ptr.asFunction<
      ffi.Pointer<CXCodeCompleteResults> Function(
          CXTranslationUnit,
          ffi.Pointer<ffi.Int8>,
          int,
          int,
          ffi.Pointer<CXUnsavedFile>,
          int,
          int)>();

  /// Sort the code-completion results in case-insensitive alphabetical order.
  void clang_sortCodeCompletionResults(
    ffi.Pointer<CXCompletionResult> Results,
    int NumResults,
  ) {
    return _clang_sortCodeCompletionResults(
      Results,
      NumResults,
    );
  }

  late final _clang_sortCodeCompletionResults_ptr = _lookup<
      ffi.NativeFunction<
          ffi.Void Function(ffi.Pointer<CXCompletionResult>,
              ffi.Uint32)>>('clang_sortCodeCompletionResults');
  late final _clang_sortCodeCompletionResults =
      _clang_sortCodeCompletionResults_ptr
          .asFunction<void Function(ffi.Pointer<CXCompletionResult>, int)>();

  /// Free the given set of code-completion results.
  void clang_disposeCodeCompleteResults(
    ffi.Pointer<CXCodeCompleteResults> Results,
  ) {
    return _clang_disposeCodeCompleteResults(
      Results,
    );
  }

  late final _clang_disposeCodeCompleteResults_ptr = _lookup<
          ffi.NativeFunction<
              ffi.Void Function(ffi.Pointer<CXCodeCompleteResults>)>>(
      'clang_disposeCodeCompleteResults');
  late final _clang_disposeCodeCompleteResults =
      _clang_disposeCodeCompleteResults_ptr
          .asFunction<void Function(ffi.Pointer<CXCodeCompleteResults>)>();

  /// 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,
    );
  }

  late final _clang_codeCompleteGetNumDiagnostics_ptr = _lookup<
          ffi.NativeFunction<
              ffi.Uint32 Function(ffi.Pointer<CXCodeCompleteResults>)>>(
      'clang_codeCompleteGetNumDiagnostics');
  late final _clang_codeCompleteGetNumDiagnostics =
      _clang_codeCompleteGetNumDiagnostics_ptr
          .asFunction<int Function(ffi.Pointer<CXCodeCompleteResults>)>();

  /// Retrieve a diagnostic associated with the given code completion.
  CXDiagnostic clang_codeCompleteGetDiagnostic(
    ffi.Pointer<CXCodeCompleteResults> Results,
    int Index,
  ) {
    return _clang_codeCompleteGetDiagnostic(
      Results,
      Index,
    );
  }

  late final _clang_codeCompleteGetDiagnostic_ptr = _lookup<
      ffi.NativeFunction<
          CXDiagnostic Function(ffi.Pointer<CXCodeCompleteResults>,
              ffi.Uint32)>>('clang_codeCompleteGetDiagnostic');
  late final _clang_codeCompleteGetDiagnostic =
      _clang_codeCompleteGetDiagnostic_ptr.asFunction<
          CXDiagnostic Function(ffi.Pointer<CXCodeCompleteResults>, int)>();

  /// Determines what completions are appropriate for the context the given code
  /// completion.
  int clang_codeCompleteGetContexts(
    ffi.Pointer<CXCodeCompleteResults> Results,
  ) {
    return _clang_codeCompleteGetContexts(
      Results,
    );
  }

  late final _clang_codeCompleteGetContexts_ptr = _lookup<
          ffi.NativeFunction<
              ffi.Uint64 Function(ffi.Pointer<CXCodeCompleteResults>)>>(
      'clang_codeCompleteGetContexts');
  late final _clang_codeCompleteGetContexts = _clang_codeCompleteGetContexts_ptr
      .asFunction<int Function(ffi.Pointer<CXCodeCompleteResults>)>();

  /// 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.
  int clang_codeCompleteGetContainerKind(
    ffi.Pointer<CXCodeCompleteResults> Results,
    ffi.Pointer<ffi.Uint32> IsIncomplete,
  ) {
    return _clang_codeCompleteGetContainerKind(
      Results,
      IsIncomplete,
    );
  }

  late final _clang_codeCompleteGetContainerKind_ptr = _lookup<
      ffi.NativeFunction<
          ffi.Int32 Function(ffi.Pointer<CXCodeCompleteResults>,
              ffi.Pointer<ffi.Uint32>)>>('clang_codeCompleteGetContainerKind');
  late final _clang_codeCompleteGetContainerKind =
      _clang_codeCompleteGetContainerKind_ptr.asFunction<
          int Function(
              ffi.Pointer<CXCodeCompleteResults>, ffi.Pointer<ffi.Uint32>)>();

  /// Returns the USR for the container for the current code completion context.
  /// If there is not a container for the current context, this function will
  /// return the empty string.
  CXString clang_codeCompleteGetContainerUSR(
    ffi.Pointer<CXCodeCompleteResults> Results,
  ) {
    return _clang_codeCompleteGetContainerUSR(
      Results,
    );
  }

  late final _clang_codeCompleteGetContainerUSR_ptr = _lookup<
          ffi.NativeFunction<
              CXString Function(ffi.Pointer<CXCodeCompleteResults>)>>(
      'clang_codeCompleteGetContainerUSR');
  late final _clang_codeCompleteGetContainerUSR =
      _clang_codeCompleteGetContainerUSR_ptr
          .asFunction<CXString Function(ffi.Pointer<CXCodeCompleteResults>)>();

  /// Returns the currently-entered selector for an Objective-C message send,
  /// formatted like "initWithFoo:bar:". Only guaranteed to return a non-empty
  /// string for CXCompletionContext_ObjCInstanceMessage and
  /// CXCompletionContext_ObjCClassMessage.
  CXString clang_codeCompleteGetObjCSelector(
    ffi.Pointer<CXCodeCompleteResults> Results,
  ) {
    return _clang_codeCompleteGetObjCSelector(
      Results,
    );
  }

  late final _clang_codeCompleteGetObjCSelector_ptr = _lookup<
          ffi.NativeFunction<
              CXString Function(ffi.Pointer<CXCodeCompleteResults>)>>(
      'clang_codeCompleteGetObjCSelector');
  late final _clang_codeCompleteGetObjCSelector =
      _clang_codeCompleteGetObjCSelector_ptr
          .asFunction<CXString Function(ffi.Pointer<CXCodeCompleteResults>)>();

  /// Return a version string, suitable for showing to a user, but not intended
  /// to be parsed (the format is not guaranteed to be stable).
  CXString clang_getClangVersion() {
    return _clang_getClangVersion();
  }

  late final _clang_getClangVersion_ptr =
      _lookup<ffi.NativeFunction<CXString Function()>>('clang_getClangVersion');
  late final _clang_getClangVersion =
      _clang_getClangVersion_ptr.asFunction<CXString Function()>();

  /// Enable/disable crash recovery.
  void clang_toggleCrashRecovery(
    int isEnabled,
  ) {
    return _clang_toggleCrashRecovery(
      isEnabled,
    );
  }

  late final _clang_toggleCrashRecovery_ptr =
      _lookup<ffi.NativeFunction<ffi.Void Function(ffi.Uint32)>>(
          'clang_toggleCrashRecovery');
  late final _clang_toggleCrashRecovery =
      _clang_toggleCrashRecovery_ptr.asFunction<void Function(int)>();

  /// 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(
    CXTranslationUnit tu,
    CXInclusionVisitor visitor,
    CXClientData client_data,
  ) {
    return _clang_getInclusions(
      tu,
      visitor,
      client_data,
    );
  }

  late final _clang_getInclusions_ptr = _lookup<
      ffi.NativeFunction<
          ffi.Void Function(CXTranslationUnit, CXInclusionVisitor,
              CXClientData)>>('clang_getInclusions');
  late final _clang_getInclusions = _clang_getInclusions_ptr.asFunction<
      void Function(CXTranslationUnit, CXInclusionVisitor, CXClientData)>();

  /// If cursor is a statement declaration tries to evaluate the statement and
  /// if its variable, tries to evaluate its initializer, into its corresponding
  /// type.
  CXEvalResult clang_Cursor_Evaluate(
    CXCursor C,
  ) {
    return _clang_Cursor_Evaluate(
      C,
    );
  }

  late final _clang_Cursor_Evaluate_ptr =
      _lookup<ffi.NativeFunction<CXEvalResult Function(CXCursor)>>(
          'clang_Cursor_Evaluate');
  late final _clang_Cursor_Evaluate =
      _clang_Cursor_Evaluate_ptr.asFunction<CXEvalResult Function(CXCursor)>();

  /// Returns the kind of the evaluated result.
  int clang_EvalResult_getKind(
    CXEvalResult E,
  ) {
    return _clang_EvalResult_getKind(
      E,
    );
  }

  late final _clang_EvalResult_getKind_ptr =
      _lookup<ffi.NativeFunction<ffi.Int32 Function(CXEvalResult)>>(
          'clang_EvalResult_getKind');
  late final _clang_EvalResult_getKind =
      _clang_EvalResult_getKind_ptr.asFunction<int Function(CXEvalResult)>();

  /// Returns the evaluation result as integer if the kind is Int.
  int clang_EvalResult_getAsInt(
    CXEvalResult E,
  ) {
    return _clang_EvalResult_getAsInt(
      E,
    );
  }

  late final _clang_EvalResult_getAsInt_ptr =
      _lookup<ffi.NativeFunction<ffi.Int32 Function(CXEvalResult)>>(
          'clang_EvalResult_getAsInt');
  late final _clang_EvalResult_getAsInt =
      _clang_EvalResult_getAsInt_ptr.asFunction<int Function(CXEvalResult)>();

  /// 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(
    CXEvalResult E,
  ) {
    return _clang_EvalResult_getAsLongLong(
      E,
    );
  }

  late final _clang_EvalResult_getAsLongLong_ptr =
      _lookup<ffi.NativeFunction<ffi.Int64 Function(CXEvalResult)>>(
          'clang_EvalResult_getAsLongLong');
  late final _clang_EvalResult_getAsLongLong =
      _clang_EvalResult_getAsLongLong_ptr
          .asFunction<int Function(CXEvalResult)>();

  /// Returns a non-zero value if the kind is Int and the evaluation result
  /// resulted in an unsigned integer.
  int clang_EvalResult_isUnsignedInt(
    CXEvalResult E,
  ) {
    return _clang_EvalResult_isUnsignedInt(
      E,
    );
  }

  late final _clang_EvalResult_isUnsignedInt_ptr =
      _lookup<ffi.NativeFunction<ffi.Uint32 Function(CXEvalResult)>>(
          'clang_EvalResult_isUnsignedInt');
  late final _clang_EvalResult_isUnsignedInt =
      _clang_EvalResult_isUnsignedInt_ptr
          .asFunction<int Function(CXEvalResult)>();

  /// Returns the evaluation result as an unsigned integer if the kind is Int
  /// and clang_EvalResult_isUnsignedInt is non-zero.
  int clang_EvalResult_getAsUnsigned(
    CXEvalResult E,
  ) {
    return _clang_EvalResult_getAsUnsigned(
      E,
    );
  }

  late final _clang_EvalResult_getAsUnsigned_ptr =
      _lookup<ffi.NativeFunction<ffi.Uint64 Function(CXEvalResult)>>(
          'clang_EvalResult_getAsUnsigned');
  late final _clang_EvalResult_getAsUnsigned =
      _clang_EvalResult_getAsUnsigned_ptr
          .asFunction<int Function(CXEvalResult)>();

  /// Returns the evaluation result as double if the kind is double.
  double clang_EvalResult_getAsDouble(
    CXEvalResult E,
  ) {
    return _clang_EvalResult_getAsDouble(
      E,
    );
  }

  late final _clang_EvalResult_getAsDouble_ptr =
      _lookup<ffi.NativeFunction<ffi.Double Function(CXEvalResult)>>(
          'clang_EvalResult_getAsDouble');
  late final _clang_EvalResult_getAsDouble = _clang_EvalResult_getAsDouble_ptr
      .asFunction<double Function(CXEvalResult)>();

  /// 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(
    CXEvalResult E,
  ) {
    return _clang_EvalResult_getAsStr(
      E,
    );
  }

  late final _clang_EvalResult_getAsStr_ptr =
      _lookup<ffi.NativeFunction<ffi.Pointer<ffi.Int8> Function(CXEvalResult)>>(
          'clang_EvalResult_getAsStr');
  late final _clang_EvalResult_getAsStr = _clang_EvalResult_getAsStr_ptr
      .asFunction<ffi.Pointer<ffi.Int8> Function(CXEvalResult)>();

  /// Disposes the created Eval memory.
  void clang_EvalResult_dispose(
    CXEvalResult E,
  ) {
    return _clang_EvalResult_dispose(
      E,
    );
  }

  late final _clang_EvalResult_dispose_ptr =
      _lookup<ffi.NativeFunction<ffi.Void Function(CXEvalResult)>>(
          'clang_EvalResult_dispose');
  late final _clang_EvalResult_dispose =
      _clang_EvalResult_dispose_ptr.asFunction<void Function(CXEvalResult)>();

  /// Retrieve a remapping.
  CXRemapping clang_getRemappings(
    ffi.Pointer<ffi.Int8> path,
  ) {
    return _clang_getRemappings(
      path,
    );
  }

  late final _clang_getRemappings_ptr =
      _lookup<ffi.NativeFunction<CXRemapping Function(ffi.Pointer<ffi.Int8>)>>(
          'clang_getRemappings');
  late final _clang_getRemappings = _clang_getRemappings_ptr
      .asFunction<CXRemapping Function(ffi.Pointer<ffi.Int8>)>();

  /// Retrieve a remapping.
  CXRemapping clang_getRemappingsFromFileList(
    ffi.Pointer<ffi.Pointer<ffi.Int8>> filePaths,
    int numFiles,
  ) {
    return _clang_getRemappingsFromFileList(
      filePaths,
      numFiles,
    );
  }

  late final _clang_getRemappingsFromFileList_ptr = _lookup<
      ffi.NativeFunction<
          CXRemapping Function(ffi.Pointer<ffi.Pointer<ffi.Int8>>,
              ffi.Uint32)>>('clang_getRemappingsFromFileList');
  late final _clang_getRemappingsFromFileList =
      _clang_getRemappingsFromFileList_ptr.asFunction<
          CXRemapping Function(ffi.Pointer<ffi.Pointer<ffi.Int8>>, int)>();

  /// Determine the number of remappings.
  int clang_remap_getNumFiles(
    CXRemapping arg0,
  ) {
    return _clang_remap_getNumFiles(
      arg0,
    );
  }

  late final _clang_remap_getNumFiles_ptr =
      _lookup<ffi.NativeFunction<ffi.Uint32 Function(CXRemapping)>>(
          'clang_remap_getNumFiles');
  late final _clang_remap_getNumFiles =
      _clang_remap_getNumFiles_ptr.asFunction<int Function(CXRemapping)>();

  /// Get the original and the associated filename from the remapping.
  void clang_remap_getFilenames(
    CXRemapping arg0,
    int index,
    ffi.Pointer<CXString> original,
    ffi.Pointer<CXString> transformed,
  ) {
    return _clang_remap_getFilenames(
      arg0,
      index,
      original,
      transformed,
    );
  }

  late final _clang_remap_getFilenames_ptr = _lookup<
      ffi.NativeFunction<
          ffi.Void Function(CXRemapping, ffi.Uint32, ffi.Pointer<CXString>,
              ffi.Pointer<CXString>)>>('clang_remap_getFilenames');
  late final _clang_remap_getFilenames =
      _clang_remap_getFilenames_ptr.asFunction<
          void Function(CXRemapping, int, ffi.Pointer<CXString>,
              ffi.Pointer<CXString>)>();

  /// Dispose the remapping.
  void clang_remap_dispose(
    CXRemapping arg0,
  ) {
    return _clang_remap_dispose(
      arg0,
    );
  }

  late final _clang_remap_dispose_ptr =
      _lookup<ffi.NativeFunction<ffi.Void Function(CXRemapping)>>(
          'clang_remap_dispose');
  late final _clang_remap_dispose =
      _clang_remap_dispose_ptr.asFunction<void Function(CXRemapping)>();

  /// Find references of a declaration in a specific file.
  int clang_findReferencesInFile(
    CXCursor cursor,
    CXFile file,
    CXCursorAndRangeVisitor visitor,
  ) {
    return _clang_findReferencesInFile(
      cursor,
      file,
      visitor,
    );
  }

  late final _clang_findReferencesInFile_ptr = _lookup<
      ffi.NativeFunction<
          ffi.Int32 Function(CXCursor, CXFile,
              CXCursorAndRangeVisitor)>>('clang_findReferencesInFile');
  late final _clang_findReferencesInFile = _clang_findReferencesInFile_ptr
      .asFunction<int Function(CXCursor, CXFile, CXCursorAndRangeVisitor)>();

  /// Find #import/#include directives in a specific file.
  int clang_findIncludesInFile(
    CXTranslationUnit TU,
    CXFile file,
    CXCursorAndRangeVisitor visitor,
  ) {
    return _clang_findIncludesInFile(
      TU,
      file,
      visitor,
    );
  }

  late final _clang_findIncludesInFile_ptr = _lookup<
      ffi.NativeFunction<
          ffi.Int32 Function(CXTranslationUnit, CXFile,
              CXCursorAndRangeVisitor)>>('clang_findIncludesInFile');
  late final _clang_findIncludesInFile =
      _clang_findIncludesInFile_ptr.asFunction<
          int Function(CXTranslationUnit, CXFile, CXCursorAndRangeVisitor)>();

  int clang_index_isEntityObjCContainerKind(
    int arg0,
  ) {
    return _clang_index_isEntityObjCContainerKind(
      arg0,
    );
  }

  late final _clang_index_isEntityObjCContainerKind_ptr =
      _lookup<ffi.NativeFunction<ffi.Int32 Function(ffi.Int32)>>(
          'clang_index_isEntityObjCContainerKind');
  late final _clang_index_isEntityObjCContainerKind =
      _clang_index_isEntityObjCContainerKind_ptr
          .asFunction<int Function(int)>();

  ffi.Pointer<CXIdxObjCContainerDeclInfo> clang_index_getObjCContainerDeclInfo(
    ffi.Pointer<CXIdxDeclInfo> arg0,
  ) {
    return _clang_index_getObjCContainerDeclInfo(
      arg0,
    );
  }

  late final _clang_index_getObjCContainerDeclInfo_ptr = _lookup<
          ffi.NativeFunction<
              ffi.Pointer<CXIdxObjCContainerDeclInfo> Function(
                  ffi.Pointer<CXIdxDeclInfo>)>>(
      'clang_index_getObjCContainerDeclInfo');
  late final _clang_index_getObjCContainerDeclInfo =
      _clang_index_getObjCContainerDeclInfo_ptr.asFunction<
          ffi.Pointer<CXIdxObjCContainerDeclInfo> Function(
              ffi.Pointer<CXIdxDeclInfo>)>();

  ffi.Pointer<CXIdxObjCInterfaceDeclInfo> clang_index_getObjCInterfaceDeclInfo(
    ffi.Pointer<CXIdxDeclInfo> arg0,
  ) {
    return _clang_index_getObjCInterfaceDeclInfo(
      arg0,
    );
  }

  late final _clang_index_getObjCInterfaceDeclInfo_ptr = _lookup<
          ffi.NativeFunction<
              ffi.Pointer<CXIdxObjCInterfaceDeclInfo> Function(
                  ffi.Pointer<CXIdxDeclInfo>)>>(
      'clang_index_getObjCInterfaceDeclInfo');
  late final _clang_index_getObjCInterfaceDeclInfo =
      _clang_index_getObjCInterfaceDeclInfo_ptr.asFunction<
          ffi.Pointer<CXIdxObjCInterfaceDeclInfo> Function(
              ffi.Pointer<CXIdxDeclInfo>)>();

  ffi.Pointer<CXIdxObjCCategoryDeclInfo> clang_index_getObjCCategoryDeclInfo(
    ffi.Pointer<CXIdxDeclInfo> arg0,
  ) {
    return _clang_index_getObjCCategoryDeclInfo(
      arg0,
    );
  }

  late final _clang_index_getObjCCategoryDeclInfo_ptr = _lookup<
          ffi.NativeFunction<
              ffi.Pointer<CXIdxObjCCategoryDeclInfo> Function(
                  ffi.Pointer<CXIdxDeclInfo>)>>(
      'clang_index_getObjCCategoryDeclInfo');
  late final _clang_index_getObjCCategoryDeclInfo =
      _clang_index_getObjCCategoryDeclInfo_ptr.asFunction<
          ffi.Pointer<CXIdxObjCCategoryDeclInfo> Function(
              ffi.Pointer<CXIdxDeclInfo>)>();

  ffi.Pointer<CXIdxObjCProtocolRefListInfo>
      clang_index_getObjCProtocolRefListInfo(
    ffi.Pointer<CXIdxDeclInfo> arg0,
  ) {
    return _clang_index_getObjCProtocolRefListInfo(
      arg0,
    );
  }

  late final _clang_index_getObjCProtocolRefListInfo_ptr = _lookup<
          ffi.NativeFunction<
              ffi.Pointer<CXIdxObjCProtocolRefListInfo> Function(
                  ffi.Pointer<CXIdxDeclInfo>)>>(
      'clang_index_getObjCProtocolRefListInfo');
  late final _clang_index_getObjCProtocolRefListInfo =
      _clang_index_getObjCProtocolRefListInfo_ptr.asFunction<
          ffi.Pointer<CXIdxObjCProtocolRefListInfo> Function(
              ffi.Pointer<CXIdxDeclInfo>)>();

  ffi.Pointer<CXIdxObjCPropertyDeclInfo> clang_index_getObjCPropertyDeclInfo(
    ffi.Pointer<CXIdxDeclInfo> arg0,
  ) {
    return _clang_index_getObjCPropertyDeclInfo(
      arg0,
    );
  }

  late final _clang_index_getObjCPropertyDeclInfo_ptr = _lookup<
          ffi.NativeFunction<
              ffi.Pointer<CXIdxObjCPropertyDeclInfo> Function(
                  ffi.Pointer<CXIdxDeclInfo>)>>(
      'clang_index_getObjCPropertyDeclInfo');
  late final _clang_index_getObjCPropertyDeclInfo =
      _clang_index_getObjCPropertyDeclInfo_ptr.asFunction<
          ffi.Pointer<CXIdxObjCPropertyDeclInfo> Function(
              ffi.Pointer<CXIdxDeclInfo>)>();

  ffi.Pointer<CXIdxIBOutletCollectionAttrInfo>
      clang_index_getIBOutletCollectionAttrInfo(
    ffi.Pointer<CXIdxAttrInfo> arg0,
  ) {
    return _clang_index_getIBOutletCollectionAttrInfo(
      arg0,
    );
  }

  late final _clang_index_getIBOutletCollectionAttrInfo_ptr = _lookup<
          ffi.NativeFunction<
              ffi.Pointer<CXIdxIBOutletCollectionAttrInfo> Function(
                  ffi.Pointer<CXIdxAttrInfo>)>>(
      'clang_index_getIBOutletCollectionAttrInfo');
  late final _clang_index_getIBOutletCollectionAttrInfo =
      _clang_index_getIBOutletCollectionAttrInfo_ptr.asFunction<
          ffi.Pointer<CXIdxIBOutletCollectionAttrInfo> Function(
              ffi.Pointer<CXIdxAttrInfo>)>();

  ffi.Pointer<CXIdxCXXClassDeclInfo> clang_index_getCXXClassDeclInfo(
    ffi.Pointer<CXIdxDeclInfo> arg0,
  ) {
    return _clang_index_getCXXClassDeclInfo(
      arg0,
    );
  }

  late final _clang_index_getCXXClassDeclInfo_ptr = _lookup<
      ffi.NativeFunction<
          ffi.Pointer<CXIdxCXXClassDeclInfo> Function(
              ffi.Pointer<CXIdxDeclInfo>)>>('clang_index_getCXXClassDeclInfo');
  late final _clang_index_getCXXClassDeclInfo =
      _clang_index_getCXXClassDeclInfo_ptr.asFunction<
          ffi.Pointer<CXIdxCXXClassDeclInfo> Function(
              ffi.Pointer<CXIdxDeclInfo>)>();

  /// For retrieving a custom CXIdxClientContainer attached to a container.
  CXIdxClientContainer clang_index_getClientContainer(
    ffi.Pointer<CXIdxContainerInfo> arg0,
  ) {
    return _clang_index_getClientContainer(
      arg0,
    );
  }

  late final _clang_index_getClientContainer_ptr = _lookup<
          ffi.NativeFunction<
              CXIdxClientContainer Function(ffi.Pointer<CXIdxContainerInfo>)>>(
      'clang_index_getClientContainer');
  late final _clang_index_getClientContainer =
      _clang_index_getClientContainer_ptr.asFunction<
          CXIdxClientContainer Function(ffi.Pointer<CXIdxContainerInfo>)>();

  /// For setting a custom CXIdxClientContainer attached to a container.
  void clang_index_setClientContainer(
    ffi.Pointer<CXIdxContainerInfo> arg0,
    CXIdxClientContainer arg1,
  ) {
    return _clang_index_setClientContainer(
      arg0,
      arg1,
    );
  }

  late final _clang_index_setClientContainer_ptr = _lookup<
      ffi.NativeFunction<
          ffi.Void Function(ffi.Pointer<CXIdxContainerInfo>,
              CXIdxClientContainer)>>('clang_index_setClientContainer');
  late final _clang_index_setClientContainer =
      _clang_index_setClientContainer_ptr.asFunction<
          void Function(
              ffi.Pointer<CXIdxContainerInfo>, CXIdxClientContainer)>();

  /// For retrieving a custom CXIdxClientEntity attached to an entity.
  CXIdxClientEntity clang_index_getClientEntity(
    ffi.Pointer<CXIdxEntityInfo> arg0,
  ) {
    return _clang_index_getClientEntity(
      arg0,
    );
  }

  late final _clang_index_getClientEntity_ptr = _lookup<
      ffi.NativeFunction<
          CXIdxClientEntity Function(
              ffi.Pointer<CXIdxEntityInfo>)>>('clang_index_getClientEntity');
  late final _clang_index_getClientEntity = _clang_index_getClientEntity_ptr
      .asFunction<CXIdxClientEntity Function(ffi.Pointer<CXIdxEntityInfo>)>();

  /// For setting a custom CXIdxClientEntity attached to an entity.
  void clang_index_setClientEntity(
    ffi.Pointer<CXIdxEntityInfo> arg0,
    CXIdxClientEntity arg1,
  ) {
    return _clang_index_setClientEntity(
      arg0,
      arg1,
    );
  }

  late final _clang_index_setClientEntity_ptr = _lookup<
      ffi.NativeFunction<
          ffi.Void Function(ffi.Pointer<CXIdxEntityInfo>,
              CXIdxClientEntity)>>('clang_index_setClientEntity');
  late final _clang_index_setClientEntity =
      _clang_index_setClientEntity_ptr.asFunction<
          void Function(ffi.Pointer<CXIdxEntityInfo>, CXIdxClientEntity)>();

  /// An indexing action/session, to be applied to one or multiple translation
  /// units.
  CXIndexAction clang_IndexAction_create(
    CXIndex CIdx,
  ) {
    return _clang_IndexAction_create(
      CIdx,
    );
  }

  late final _clang_IndexAction_create_ptr =
      _lookup<ffi.NativeFunction<CXIndexAction Function(CXIndex)>>(
          'clang_IndexAction_create');
  late final _clang_IndexAction_create = _clang_IndexAction_create_ptr
      .asFunction<CXIndexAction Function(CXIndex)>();

  /// Destroy the given index action.
  void clang_IndexAction_dispose(
    CXIndexAction arg0,
  ) {
    return _clang_IndexAction_dispose(
      arg0,
    );
  }

  late final _clang_IndexAction_dispose_ptr =
      _lookup<ffi.NativeFunction<ffi.Void Function(CXIndexAction)>>(
          'clang_IndexAction_dispose');
  late final _clang_IndexAction_dispose =
      _clang_IndexAction_dispose_ptr.asFunction<void Function(CXIndexAction)>();

  /// Index the given source file and the translation unit corresponding to that
  /// file via callbacks implemented through #IndexerCallbacks.
  int clang_indexSourceFile(
    CXIndexAction arg0,
    CXClientData client_data,
    ffi.Pointer<IndexerCallbacks> index_callbacks,
    int index_callbacks_size,
    int index_options,
    ffi.Pointer<ffi.Int8> source_filename,
    ffi.Pointer<ffi.Pointer<ffi.Int8>> command_line_args,
    int num_command_line_args,
    ffi.Pointer<CXUnsavedFile> unsaved_files,
    int num_unsaved_files,
    ffi.Pointer<CXTranslationUnit> out_TU,
    int TU_options,
  ) {
    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,
    );
  }

  late final _clang_indexSourceFile_ptr = _lookup<
      ffi.NativeFunction<
          ffi.Int32 Function(
              CXIndexAction,
              CXClientData,
              ffi.Pointer<IndexerCallbacks>,
              ffi.Uint32,
              ffi.Uint32,
              ffi.Pointer<ffi.Int8>,
              ffi.Pointer<ffi.Pointer<ffi.Int8>>,
              ffi.Int32,
              ffi.Pointer<CXUnsavedFile>,
              ffi.Uint32,
              ffi.Pointer<CXTranslationUnit>,
              ffi.Uint32)>>('clang_indexSourceFile');
  late final _clang_indexSourceFile = _clang_indexSourceFile_ptr.asFunction<
      int Function(
          CXIndexAction,
          CXClientData,
          ffi.Pointer<IndexerCallbacks>,
          int,
          int,
          ffi.Pointer<ffi.Int8>,
          ffi.Pointer<ffi.Pointer<ffi.Int8>>,
          int,
          ffi.Pointer<CXUnsavedFile>,
          int,
          ffi.Pointer<CXTranslationUnit>,
          int)>();

  /// Same as clang_indexSourceFile but requires a full command line for
  /// command_line_args including argv[0]. This is useful if the standard
  /// library paths are relative to the binary.
  int clang_indexSourceFileFullArgv(
    CXIndexAction arg0,
    CXClientData client_data,
    ffi.Pointer<IndexerCallbacks> index_callbacks,
    int index_callbacks_size,
    int index_options,
    ffi.Pointer<ffi.Int8> source_filename,
    ffi.Pointer<ffi.Pointer<ffi.Int8>> command_line_args,
    int num_command_line_args,
    ffi.Pointer<CXUnsavedFile> unsaved_files,
    int num_unsaved_files,
    ffi.Pointer<CXTranslationUnit> out_TU,
    int TU_options,
  ) {
    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,
    );
  }

  late final _clang_indexSourceFileFullArgv_ptr = _lookup<
      ffi.NativeFunction<
          ffi.Int32 Function(
              CXIndexAction,
              CXClientData,
              ffi.Pointer<IndexerCallbacks>,
              ffi.Uint32,
              ffi.Uint32,
              ffi.Pointer<ffi.Int8>,
              ffi.Pointer<ffi.Pointer<ffi.Int8>>,
              ffi.Int32,
              ffi.Pointer<CXUnsavedFile>,
              ffi.Uint32,
              ffi.Pointer<CXTranslationUnit>,
              ffi.Uint32)>>('clang_indexSourceFileFullArgv');
  late final _clang_indexSourceFileFullArgv =
      _clang_indexSourceFileFullArgv_ptr.asFunction<
          int Function(
              CXIndexAction,
              CXClientData,
              ffi.Pointer<IndexerCallbacks>,
              int,
              int,
              ffi.Pointer<ffi.Int8>,
              ffi.Pointer<ffi.Pointer<ffi.Int8>>,
              int,
              ffi.Pointer<CXUnsavedFile>,
              int,
              ffi.Pointer<CXTranslationUnit>,
              int)>();

  /// Index the given translation unit via callbacks implemented through
  /// #IndexerCallbacks.
  int clang_indexTranslationUnit(
    CXIndexAction arg0,
    CXClientData client_data,
    ffi.Pointer<IndexerCallbacks> index_callbacks,
    int index_callbacks_size,
    int index_options,
    CXTranslationUnit arg5,
  ) {
    return _clang_indexTranslationUnit(
      arg0,
      client_data,
      index_callbacks,
      index_callbacks_size,
      index_options,
      arg5,
    );
  }

  late final _clang_indexTranslationUnit_ptr = _lookup<
      ffi.NativeFunction<
          ffi.Int32 Function(
              CXIndexAction,
              CXClientData,
              ffi.Pointer<IndexerCallbacks>,
              ffi.Uint32,
              ffi.Uint32,
              CXTranslationUnit)>>('clang_indexTranslationUnit');
  late final _clang_indexTranslationUnit =
      _clang_indexTranslationUnit_ptr.asFunction<
          int Function(CXIndexAction, CXClientData,
              ffi.Pointer<IndexerCallbacks>, int, int, CXTranslationUnit)>();

  /// Retrieve the CXIdxFile, file, line, column, and offset represented by the
  /// given CXIdxLoc.
  void clang_indexLoc_getFileLocation(
    CXIdxLoc loc,
    ffi.Pointer<CXIdxClientFile> indexFile,
    ffi.Pointer<CXFile> file,
    ffi.Pointer<ffi.Uint32> line,
    ffi.Pointer<ffi.Uint32> column,
    ffi.Pointer<ffi.Uint32> offset,
  ) {
    return _clang_indexLoc_getFileLocation(
      loc,
      indexFile,
      file,
      line,
      column,
      offset,
    );
  }

  late final _clang_indexLoc_getFileLocation_ptr = _lookup<
      ffi.NativeFunction<
          ffi.Void Function(
              CXIdxLoc,
              ffi.Pointer<CXIdxClientFile>,
              ffi.Pointer<CXFile>,
              ffi.Pointer<ffi.Uint32>,
              ffi.Pointer<ffi.Uint32>,
              ffi.Pointer<ffi.Uint32>)>>('clang_indexLoc_getFileLocation');
  late final _clang_indexLoc_getFileLocation =
      _clang_indexLoc_getFileLocation_ptr.asFunction<
          void Function(
              CXIdxLoc,
              ffi.Pointer<CXIdxClientFile>,
              ffi.Pointer<CXFile>,
              ffi.Pointer<ffi.Uint32>,
              ffi.Pointer<ffi.Uint32>,
              ffi.Pointer<ffi.Uint32>)>();

  /// Retrieve the CXSourceLocation represented by the given CXIdxLoc.
  CXSourceLocation clang_indexLoc_getCXSourceLocation(
    CXIdxLoc loc,
  ) {
    return _clang_indexLoc_getCXSourceLocation(
      loc,
    );
  }

  late final _clang_indexLoc_getCXSourceLocation_ptr =
      _lookup<ffi.NativeFunction<CXSourceLocation Function(CXIdxLoc)>>(
          'clang_indexLoc_getCXSourceLocation');
  late final _clang_indexLoc_getCXSourceLocation =
      _clang_indexLoc_getCXSourceLocation_ptr
          .asFunction<CXSourceLocation Function(CXIdxLoc)>();

  /// Visit the fields of a particular type.
  int clang_Type_visitFields(
    CXType T,
    CXFieldVisitor visitor,
    CXClientData client_data,
  ) {
    return _clang_Type_visitFields(
      T,
      visitor,
      client_data,
    );
  }

  late final _clang_Type_visitFields_ptr = _lookup<
      ffi.NativeFunction<
          ffi.Uint32 Function(
              CXType, CXFieldVisitor, CXClientData)>>('clang_Type_visitFields');
  late final _clang_Type_visitFields = _clang_Type_visitFields_ptr
      .asFunction<int Function(CXType, CXFieldVisitor, CXClientData)>();
}

/// Error codes returned by libclang routines.
abstract class CXErrorCode {
  /// No error.
  static const int CXError_Success = 0;

  /// A generic error code, no further details are available.
  static const int CXError_Failure = 1;

  /// libclang crashed while performing the requested operation.
  static const int CXError_Crashed = 2;

  /// The function detected that the arguments violate the function contract.
  static const int CXError_InvalidArguments = 3;

  /// An AST deserialization error has occurred.
  static const int CXError_ASTReadError = 4;
}

/// A character string.
class CXString extends ffi.Struct {
  external ffi.Pointer<ffi.Void> data;

  @ffi.Uint32()
  external int private_flags;
}

class CXStringSet extends ffi.Struct {
  external ffi.Pointer<CXString> Strings;

  @ffi.Uint32()
  external int Count;
}

class CXVirtualFileOverlayImpl extends ffi.Opaque {}

/// Object encapsulating information about overlaying virtual file/directories
/// over the real file system.
typedef CXVirtualFileOverlay = ffi.Pointer<CXVirtualFileOverlayImpl>;

class CXModuleMapDescriptorImpl extends ffi.Opaque {}

/// Object encapsulating information about a module.map file.
typedef CXModuleMapDescriptor = ffi.Pointer<CXModuleMapDescriptorImpl>;

class CXTargetInfoImpl extends ffi.Opaque {}

class CXTranslationUnitImpl extends ffi.Opaque {}

/// 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.
  external ffi.Pointer<ffi.Int8> Filename;

  /// A buffer containing the unsaved contents of this file.
  external ffi.Pointer<ffi.Int8> Contents;

  /// The length of the unsaved contents of this buffer.
  @ffi.Uint64()
  external int Length;
}

/// Describes the availability of a particular entity, which indicates whether
/// the use of this entity will result in a warning or error due to it being
/// deprecated or unavailable.
abstract class CXAvailabilityKind {
  /// The entity is available.
  static const int CXAvailability_Available = 0;

  /// The entity is available, but has been deprecated (and its use is not
  /// recommended).
  static const int CXAvailability_Deprecated = 1;

  /// The entity is not available; any use of it will be an error.
  static const int CXAvailability_NotAvailable = 2;

  /// The entity is available, but not accessible; any use of it will be an
  /// error.
  static const int CXAvailability_NotAccessible = 3;
}

/// 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()
  external int Major;

  /// 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()
  external 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()
  external int Subminor;
}

/// Describes the exception specification of a cursor.
abstract class CXCursor_ExceptionSpecificationKind {
  /// The cursor has no exception specification.
  static const int CXCursor_ExceptionSpecificationKind_None = 0;

  /// The cursor has exception specification throw()
  static const int CXCursor_ExceptionSpecificationKind_DynamicNone = 1;

  /// The cursor has exception specification throw(T1, T2)
  static const int CXCursor_ExceptionSpecificationKind_Dynamic = 2;

  /// The cursor has exception specification throw(...).
  static const int CXCursor_ExceptionSpecificationKind_MSAny = 3;

  /// The cursor has exception specification basic noexcept.
  static const int CXCursor_ExceptionSpecificationKind_BasicNoexcept = 4;

  /// The cursor has exception specification computed noexcept.
  static const int CXCursor_ExceptionSpecificationKind_ComputedNoexcept = 5;

  /// The exception specification has not yet been evaluated.
  static const int CXCursor_ExceptionSpecificationKind_Unevaluated = 6;

  /// The exception specification has not yet been instantiated.
  static const int CXCursor_ExceptionSpecificationKind_Uninstantiated = 7;

  /// The exception specification has not been parsed yet.
  static const int CXCursor_ExceptionSpecificationKind_Unparsed = 8;

  /// The cursor has a __declspec(nothrow) exception specification.
  static const int CXCursor_ExceptionSpecificationKind_NoThrow = 9;
}

/// An "index" that consists of a set of translation units that would typically
/// be linked together into an executable or library.
typedef CXIndex = ffi.Pointer<ffi.Void>;

abstract 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.
  static const int CXGlobalOpt_ThreadBackgroundPriorityForIndexing = 1;

  /// Used to indicate that threads that libclang creates for editing purposes
  /// should use background priority.
  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;
}

/// A particular source file that is part of a translation unit.
typedef CXFile = ffi.Pointer<ffi.Void>;

/// Uniquely identifies a CXFile, that refers to the same underlying file,
/// across an indexing session.
class CXFileUniqueID extends ffi.Struct {
  @ffi.Array.multi([3])
  external ffi.Array<ffi.Uint64> data;
}

/// A single translation unit, which resides in an index.
typedef CXTranslationUnit = ffi.Pointer<CXTranslationUnitImpl>;

/// Identifies a specific source location within a translation unit.
class CXSourceLocation extends ffi.Struct {
  @ffi.Array.multi([2])
  external ffi.Array<ffi.Pointer<ffi.Void>> ptr_data;

  @ffi.Uint32()
  external int int_data;
}

/// Identifies a half-open character range in the source code.
class CXSourceRange extends ffi.Struct {
  @ffi.Array.multi([2])
  external ffi.Array<ffi.Pointer<ffi.Void>> ptr_data;

  @ffi.Uint32()
  external int begin_int_data;

  @ffi.Uint32()
  external int end_int_data;
}

/// Identifies an array of ranges.
class CXSourceRangeList extends ffi.Struct {
  /// The number of ranges in the ranges array.
  @ffi.Uint32()
  external int count;

  /// An array of CXSourceRanges.
  external ffi.Pointer<CXSourceRange> ranges;
}

/// Describes the severity of a particular diagnostic.
abstract class CXDiagnosticSeverity {
  /// A diagnostic that has been suppressed, e.g., by a command-line option.
  static const int CXDiagnostic_Ignored = 0;

  /// This diagnostic is a note that should be attached to the previous
  /// (non-note) diagnostic.
  static const int CXDiagnostic_Note = 1;

  /// This diagnostic indicates suspicious code that may not be wrong.
  static const int CXDiagnostic_Warning = 2;

  /// This diagnostic indicates that the code is ill-formed.
  static const int CXDiagnostic_Error = 3;

  /// This diagnostic indicates that the code is ill-formed such that future
  /// parser recovery is unlikely to produce useful results.
  static const int CXDiagnostic_Fatal = 4;
}

/// A group of CXDiagnostics.
typedef CXDiagnosticSet = ffi.Pointer<ffi.Void>;

/// A single diagnostic, containing the diagnostic's severity, location, text,
/// source ranges, and fix-it hints.
typedef CXDiagnostic = ffi.Pointer<ffi.Void>;

/// Describes the kind of error that occurred (if any) in a call to
/// clang_loadDiagnostics.
abstract class CXLoadDiag_Error {
  /// Indicates that no error occurred.
  static const int CXLoadDiag_None = 0;

  /// Indicates that an unknown error occurred while attempting to deserialize
  /// diagnostics.
  static const int CXLoadDiag_Unknown = 1;

  /// Indicates that the file containing the serialized diagnostics could not be
  /// opened.
  static const int CXLoadDiag_CannotLoad = 2;

  /// Indicates that the serialized diagnostics file is invalid or corrupt.
  static const int CXLoadDiag_InvalidFile = 3;
}

/// Options to control the display of diagnostics.
abstract 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.
abstract 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;
}

/// Flags that control how translation units are saved.
abstract class CXSaveTranslationUnit_Flags {
  /// Used to indicate that no special saving options are needed.
  static const int CXSaveTranslationUnit_None = 0;
}

/// Describes the kind of error that occurred (if any) in a call to
/// clang_saveTranslationUnit().
abstract class CXSaveError {
  /// Indicates that no error occurred while saving a translation unit.
  static const int CXSaveError_None = 0;

  /// Indicates that an unknown error occurred while attempting to save the
  /// file.
  static const int CXSaveError_Unknown = 1;

  /// Indicates that errors during translation prevented this attempt to save
  /// the translation unit.
  static const int CXSaveError_TranslationErrors = 2;

  /// Indicates that the translation unit to be saved was somehow invalid (e.g.,
  /// NULL).
  static const int CXSaveError_InvalidTU = 3;
}

/// Flags that control the reparsing of translation units.
abstract class CXReparse_Flags {
  /// Used to indicate that no special reparsing options are needed.
  static const int CXReparse_None = 0;
}

/// Categorizes how memory is being used by a translation unit.
abstract class CXTUResourceUsageKind {
  static const int CXTUResourceUsage_AST = 1;
  static const int CXTUResourceUsage_Identifiers = 2;
  static const int CXTUResourceUsage_Selectors = 3;
  static const int CXTUResourceUsage_GlobalCompletionResults = 4;
  static const int CXTUResourceUsage_SourceManagerContentCache = 5;
  static const int CXTUResourceUsage_AST_SideTables = 6;
  static const int CXTUResourceUsage_SourceManager_Membuffer_Malloc = 7;
  static const int CXTUResourceUsage_SourceManager_Membuffer_MMap = 8;
  static const int CXTUResourceUsage_ExternalASTSource_Membuffer_Malloc = 9;
  static const int CXTUResourceUsage_ExternalASTSource_Membuffer_MMap = 10;
  static const int CXTUResourceUsage_Preprocessor = 11;
  static const int CXTUResourceUsage_PreprocessingRecord = 12;
  static const int CXTUResourceUsage_SourceManager_DataStructures = 13;
  static const int CXTUResourceUsage_Preprocessor_HeaderSearch = 14;
  static const int CXTUResourceUsage_MEMORY_IN_BYTES_BEGIN = 1;
  static const int CXTUResourceUsage_MEMORY_IN_BYTES_END = 14;
  static const int CXTUResourceUsage_First = 1;
  static const int CXTUResourceUsage_Last = 14;
}

class CXTUResourceUsageEntry extends ffi.Struct {
  @ffi.Int32()
  external int kind;

  @ffi.Uint64()
  external int amount;
}

/// The memory usage of a CXTranslationUnit, broken into categories.
class CXTUResourceUsage extends ffi.Struct {
  external ffi.Pointer<ffi.Void> data;

  @ffi.Uint32()
  external int numEntries;

  external ffi.Pointer<CXTUResourceUsageEntry> entries;
}

/// An opaque type representing target information for a given translation unit.
typedef CXTargetInfo = ffi.Pointer<CXTargetInfoImpl>;

/// Describes the kind of entity that a cursor refers to.
abstract class CXCursorKind {
  /// A declaration whose specific kind is not exposed via this interface.
  static const int CXCursor_UnexposedDecl = 1;

  /// A C or C++ struct.
  static const int CXCursor_StructDecl = 2;

  /// A C or C++ union.
  static const int CXCursor_UnionDecl = 3;

  /// A C++ class.
  static const int CXCursor_ClassDecl = 4;

  /// An enumeration.
  static const int CXCursor_EnumDecl = 5;

  /// A field (in C) or non-static data member (in C++) in a struct, union, or
  /// C++ class.
  static const int CXCursor_FieldDecl = 6;

  /// An enumerator constant.
  static const int CXCursor_EnumConstantDecl = 7;

  /// A function.
  static const int CXCursor_FunctionDecl = 8;

  /// A variable.
  static const int CXCursor_VarDecl = 9;

  /// A function or method parameter.
  static const int CXCursor_ParmDecl = 10;

  /// An Objective-C @interface.
  static const int CXCursor_ObjCInterfaceDecl = 11;

  /// An Objective-C @interface for a category.
  static const int CXCursor_ObjCCategoryDecl = 12;

  /// An Objective-C @protocol declaration.
  static const int CXCursor_ObjCProtocolDecl = 13;

  /// An Objective-C @property declaration.
  static const int CXCursor_ObjCPropertyDecl = 14;

  /// An Objective-C instance variable.
  static const int CXCursor_ObjCIvarDecl = 15;

  /// An Objective-C instance method.
  static const int CXCursor_ObjCInstanceMethodDecl = 16;

  /// An Objective-C class method.
  static const int CXCursor_ObjCClassMethodDecl = 17;

  /// An Objective-C @implementation.
  static const int CXCursor_ObjCImplementationDecl = 18;

  /// An Objective-C @implementation for a category.
  static const int CXCursor_ObjCCategoryImplDecl = 19;

  /// A typedef.
  static const int CXCursor_TypedefDecl = 20;

  /// A C++ class method.
  static const int CXCursor_CXXMethod = 21;

  /// A C++ namespace.
  static const int CXCursor_Namespace = 22;

  /// A linkage specification, e.g. 'extern "C"'.
  static const int CXCursor_LinkageSpec = 23;

  /// A C++ constructor.
  static const int CXCursor_Constructor = 24;

  /// A C++ destructor.
  static const int CXCursor_Destructor = 25;

  /// A C++ conversion function.
  static const int CXCursor_ConversionFunction = 26;

  /// A C++ template type parameter.
  static const int CXCursor_TemplateTypeParameter = 27;

  /// A C++ non-type template parameter.
  static const int CXCursor_NonTypeTemplateParameter = 28;

  /// A C++ template template parameter.
  static const int CXCursor_TemplateTemplateParameter = 29;

  /// A C++ function template.
  static const int CXCursor_FunctionTemplate = 30;

  /// A C++ class template.
  static const int CXCursor_ClassTemplate = 31;

  /// A C++ class template partial specialization.
  static const int CXCursor_ClassTemplatePartialSpecialization = 32;

  /// A C++ namespace alias declaration.
  static const int CXCursor_NamespaceAlias = 33;

  /// A C++ using directive.
  static const int CXCursor_UsingDirective = 34;

  /// A C++ using declaration.
  static const int CXCursor_UsingDeclaration = 35;

  /// A C++ alias declaration
  static const int CXCursor_TypeAliasDecl = 36;

  /// An Objective-C @synthesize definition.
  static const int CXCursor_ObjCSynthesizeDecl = 37;

  /// An Objective-C @dynamic definition.
  static const int CXCursor_ObjCDynamicDecl = 38;

  /// An access specifier.
  static const int CXCursor_CXXAccessSpecifier = 39;
  static const int CXCursor_FirstDecl = 1;
  static const int CXCursor_LastDecl = 39;
  static const int CXCursor_FirstRef = 40;
  static const int CXCursor_ObjCSuperClassRef = 40;
  static const int CXCursor_ObjCProtocolRef = 41;
  static const int CXCursor_ObjCClassRef = 42;

  /// A reference to a type declaration.
  static const int CXCursor_TypeRef = 43;
  static const int CXCursor_CXXBaseSpecifier = 44;

  /// A reference to a class template, function template, template template
  /// parameter, or class template partial specialization.
  static const int CXCursor_TemplateRef = 45;

  /// A reference to a namespace or namespace alias.
  static const int CXCursor_NamespaceRef = 46;

  /// A reference to a member of a struct, union, or class that occurs in some
  /// non-expression context, e.g., a designated initializer.
  static const int CXCursor_MemberRef = 47;

  /// A reference to a labeled statement.
  static const int CXCursor_LabelRef = 48;

  /// A reference to a set of overloaded functions or function templates that
  /// has not yet been resolved to a specific function or function template.
  static const int CXCursor_OverloadedDeclRef = 49;

  /// A reference to a variable that occurs in some non-expression context,
  /// e.g., a C++ lambda capture list.
  static const int CXCursor_VariableRef = 50;
  static const int CXCursor_LastRef = 50;
  static const int CXCursor_FirstInvalid = 70;
  static const int CXCursor_InvalidFile = 70;
  static const int CXCursor_NoDeclFound = 71;
  static const int CXCursor_NotImplemented = 72;
  static const int CXCursor_InvalidCode = 73;
  static const int CXCursor_LastInvalid = 73;
  static const int CXCursor_FirstExpr = 100;

  /// An expression whose specific kind is not exposed via this interface.
  static const int CXCursor_UnexposedExpr = 100;

  /// An expression that refers to some value declaration, such as a function,
  /// variable, or enumerator.
  static const int CXCursor_DeclRefExpr = 101;

  /// An expression that refers to a member of a struct, union, class,
  /// Objective-C class, etc.
  static const int CXCursor_MemberRefExpr = 102;

  /// An expression that calls a function.
  static const int CXCursor_CallExpr = 103;

  /// An expression that sends a message to an Objective-C object or class.
  static const int CXCursor_ObjCMessageExpr = 104;

  /// An expression that represents a block literal.
  static const int CXCursor_BlockExpr = 105;

  /// An integer literal.
  static const int CXCursor_IntegerLiteral = 106;

  /// A floating point number literal.
  static const int CXCursor_FloatingLiteral = 107;

  /// An imaginary number literal.
  static const int CXCursor_ImaginaryLiteral = 108;

  /// A string literal.
  static const int CXCursor_StringLiteral = 109;

  /// A character literal.
  static const int CXCursor_CharacterLiteral = 110;

  /// A parenthesized expression, e.g. "(1)".
  static const int CXCursor_ParenExpr = 111;

  /// This represents the unary-expression's (except sizeof and alignof).
  static const int CXCursor_UnaryOperator = 112;

  /// [C99 6.5.2.1] Array Subscripting.
  static const int CXCursor_ArraySubscriptExpr = 113;

  /// A builtin binary operation expression such as "x + y" or "x <= y".
  static const int CXCursor_BinaryOperator = 114;

  /// Compound assignment such as "+=".
  static const int CXCursor_CompoundAssignOperator = 115;

  /// The ?: ternary operator.
  static const int CXCursor_ConditionalOperator = 116;

  /// An explicit cast in C (C99 6.5.4) or a C-style cast in C++ (C++
  /// [expr.cast]), which uses the syntax (Type)expr.
  static const int CXCursor_CStyleCastExpr = 117;

  /// [C99 6.5.2.5]
  static const int CXCursor_CompoundLiteralExpr = 118;

  /// Describes an C or C++ initializer list.
  static const int CXCursor_InitListExpr = 119;

  /// The GNU address of label extension, representing &&label.
  static const int CXCursor_AddrLabelExpr = 120;

  /// This is the GNU Statement Expression extension: ({int X=4; X;})
  static const int CXCursor_StmtExpr = 121;

  /// Represents a C11 generic selection.
  static const int CXCursor_GenericSelectionExpr = 122;

  /// Implements the GNU __null extension, which is a name for a null pointer
  /// constant that has integral type (e.g., int or long) and is the same size
  /// and alignment as a pointer.
  static const int CXCursor_GNUNullExpr = 123;

  /// C++'s static_cast<> expression.
  static const int CXCursor_CXXStaticCastExpr = 124;

  /// C++'s dynamic_cast<> expression.
  static const int CXCursor_CXXDynamicCastExpr = 125;

  /// C++'s reinterpret_cast<> expression.
  static const int CXCursor_CXXReinterpretCastExpr = 126;

  /// C++'s const_cast<> expression.
  static const int CXCursor_CXXConstCastExpr = 127;

  /// Represents an explicit C++ type conversion that uses "functional" notion
  /// (C++ [expr.type.conv]).
  static const int CXCursor_CXXFunctionalCastExpr = 128;

  /// A C++ typeid expression (C++ [expr.typeid]).
  static const int CXCursor_CXXTypeidExpr = 129;

  /// [C++ 2.13.5] C++ Boolean Literal.
  static const int CXCursor_CXXBoolLiteralExpr = 130;

  /// [C++0x 2.14.7] C++ Pointer Literal.
  static const int CXCursor_CXXNullPtrLiteralExpr = 131;

  /// Represents the "this" expression in C++
  static const int CXCursor_CXXThisExpr = 132;

  /// [C++ 15] C++ Throw Expression.
  static const int CXCursor_CXXThrowExpr = 133;

  /// A new expression for memory allocation and constructor calls, e.g: "new
  /// CXXNewExpr(foo)".
  static const int CXCursor_CXXNewExpr = 134;

  /// A delete expression for memory deallocation and destructor calls, e.g.
  /// "delete[] pArray".
  static const int CXCursor_CXXDeleteExpr = 135;

  /// A unary expression. (noexcept, sizeof, or other traits)
  static const int CXCursor_UnaryExpr = 136;

  /// An Objective-C string literal i.e. "foo".
  static const int CXCursor_ObjCStringLiteral = 137;

  /// An Objective-C @encode expression.
  static const int CXCursor_ObjCEncodeExpr = 138;

  /// An Objective-C @selector expression.
  static const int CXCursor_ObjCSelectorExpr = 139;

  /// An Objective-C @protocol expression.
  static const int CXCursor_ObjCProtocolExpr = 140;

  /// An Objective-C "bridged" cast expression, which casts between Objective-C
  /// pointers and C pointers, transferring ownership in the process.
  static const int CXCursor_ObjCBridgedCastExpr = 141;

  /// Represents a C++0x pack expansion that produces a sequence of expressions.
  static const int CXCursor_PackExpansionExpr = 142;

  /// Represents an expression that computes the length of a parameter pack.
  static const int CXCursor_SizeOfPackExpr = 143;
  static const int CXCursor_LambdaExpr = 144;

  /// Objective-c Boolean Literal.
  static const int CXCursor_ObjCBoolLiteralExpr = 145;

  /// Represents the "self" expression in an Objective-C method.
  static const int CXCursor_ObjCSelfExpr = 146;

  /// OpenMP 4.0 [2.4, Array Section].
  static const int CXCursor_OMPArraySectionExpr = 147;

  /// Represents an (...) check.
  static const int CXCursor_ObjCAvailabilityCheckExpr = 148;

  /// Fixed point literal
  static const int CXCursor_FixedPointLiteral = 149;
  static const int CXCursor_LastExpr = 149;
  static const int CXCursor_FirstStmt = 200;

  /// A statement whose specific kind is not exposed via this interface.
  static const int CXCursor_UnexposedStmt = 200;

  /// A labelled statement in a function.
  static const int CXCursor_LabelStmt = 201;

  /// A group of statements like { stmt stmt }.
  static const int CXCursor_CompoundStmt = 202;

  /// A case statement.
  static const int CXCursor_CaseStmt = 203;

  /// A default statement.
  static const int CXCursor_DefaultStmt = 204;

  /// An if statement
  static const int CXCursor_IfStmt = 205;

  /// A switch statement.
  static const int CXCursor_SwitchStmt = 206;

  /// A while statement.
  static const int CXCursor_WhileStmt = 207;

  /// A do statement.
  static const int CXCursor_DoStmt = 208;

  /// A for statement.
  static const int CXCursor_ForStmt = 209;

  /// A goto statement.
  static const int CXCursor_GotoStmt = 210;

  /// An indirect goto statement.
  static const int CXCursor_IndirectGotoStmt = 211;

  /// A continue statement.
  static const int CXCursor_ContinueStmt = 212;

  /// A break statement.
  static const int CXCursor_BreakStmt = 213;

  /// A return statement.
  static const int CXCursor_ReturnStmt = 214;

  /// A GCC inline assembly statement extension.
  static const int CXCursor_GCCAsmStmt = 215;
  static const int CXCursor_AsmStmt = 215;

  /// Objective-C's overall @try-@catch-@finally statement.
  static const int CXCursor_ObjCAtTryStmt = 216;

  /// Objective-C's @catch statement.
  static const int CXCursor_ObjCAtCatchStmt = 217;

  /// Objective-C's @finally statement.
  static const int CXCursor_ObjCAtFinallyStmt = 218;

  /// Objective-C's @throw statement.
  static const int CXCursor_ObjCAtThrowStmt = 219;

  /// Objective-C's @synchronized statement.
  static const int CXCursor_ObjCAtSynchronizedStmt = 220;

  /// Objective-C's autorelease pool statement.
  static const int CXCursor_ObjCAutoreleasePoolStmt = 221;

  /// Objective-C's collection statement.
  static const int CXCursor_ObjCForCollectionStmt = 222;

  /// C++'s catch statement.
  static const int CXCursor_CXXCatchStmt = 223;

  /// C++'s try statement.
  static const int CXCursor_CXXTryStmt = 224;

  /// C++'s for (* : *) statement.
  static const int CXCursor_CXXForRangeStmt = 225;

  /// Windows Structured Exception Handling's try statement.
  static const int CXCursor_SEHTryStmt = 226;

  /// Windows Structured Exception Handling's except statement.
  static const int CXCursor_SEHExceptStmt = 227;

  /// Windows Structured Exception Handling's finally statement.
  static const int CXCursor_SEHFinallyStmt = 228;

  /// A MS inline assembly statement extension.
  static const int CXCursor_MSAsmStmt = 229;

  /// The null statement ";": C99 6.8.3p3.
  static const int CXCursor_NullStmt = 230;

  /// Adaptor class for mixing declarations with statements and expressions.
  static const int CXCursor_DeclStmt = 231;

  /// OpenMP parallel directive.
  static const int CXCursor_OMPParallelDirective = 232;

  /// OpenMP SIMD directive.
  static const int CXCursor_OMPSimdDirective = 233;

  /// OpenMP for directive.
  static const int CXCursor_OMPForDirective = 234;

  /// OpenMP sections directive.
  static const int CXCursor_OMPSectionsDirective = 235;

  /// OpenMP section directive.
  static const int CXCursor_OMPSectionDirective = 236;

  /// OpenMP single directive.
  static const int CXCursor_OMPSingleDirective = 237;

  /// OpenMP parallel for directive.
  static const int CXCursor_OMPParallelForDirective = 238;

  /// OpenMP parallel sections directive.
  static const int CXCursor_OMPParallelSectionsDirective = 239;

  /// OpenMP task directive.
  static const int CXCursor_OMPTaskDirective = 240;

  /// OpenMP master directive.
  static const int CXCursor_OMPMasterDirective = 241;

  /// OpenMP critical directive.
  static const int CXCursor_OMPCriticalDirective = 242;

  /// OpenMP taskyield directive.
  static const int CXCursor_OMPTaskyieldDirective = 243;

  /// OpenMP barrier directive.
  static const int CXCursor_OMPBarrierDirective = 244;

  /// OpenMP taskwait directive.
  static const int CXCursor_OMPTaskwaitDirective = 245;

  /// OpenMP flush directive.
  static const int CXCursor_OMPFlushDirective = 246;

  /// Windows Structured Exception Handling's leave statement.
  static const int CXCursor_SEHLeaveStmt = 247;

  /// OpenMP ordered directive.
  static const int CXCursor_OMPOrderedDirective = 248;

  /// OpenMP atomic directive.
  static const int CXCursor_OMPAtomicDirective = 249;

  /// OpenMP for SIMD directive.
  static const int CXCursor_OMPForSimdDirective = 250;

  /// OpenMP parallel for SIMD directive.
  static const int CXCursor_OMPParallelForSimdDirective = 251;

  /// OpenMP target directive.
  static const int CXCursor_OMPTargetDirective = 252;

  /// OpenMP teams directive.
  static const int CXCursor_OMPTeamsDirective = 253;

  /// OpenMP taskgroup directive.
  static const int CXCursor_OMPTaskgroupDirective = 254;

  /// OpenMP cancellation point directive.
  static const int CXCursor_OMPCancellationPointDirective = 255;

  /// OpenMP cancel directive.
  static const int CXCursor_OMPCancelDirective = 256;

  /// OpenMP target data directive.
  static const int CXCursor_OMPTargetDataDirective = 257;

  /// OpenMP taskloop directive.
  static const int CXCursor_OMPTaskLoopDirective = 258;

  /// OpenMP taskloop simd directive.
  static const int CXCursor_OMPTaskLoopSimdDirective = 259;

  /// OpenMP distribute directive.
  static const int CXCursor_OMPDistributeDirective = 260;

  /// OpenMP target enter data directive.
  static const int CXCursor_OMPTargetEnterDataDirective = 261;

  /// OpenMP target exit data directive.
  static const int CXCursor_OMPTargetExitDataDirective = 262;

  /// OpenMP target parallel directive.
  static const int CXCursor_OMPTargetParallelDirective = 263;

  /// OpenMP target parallel for directive.
  static const int CXCursor_OMPTargetParallelForDirective = 264;

  /// OpenMP target update directive.
  static const int CXCursor_OMPTargetUpdateDirective = 265;

  /// OpenMP distribute parallel for directive.
  static const int CXCursor_OMPDistributeParallelForDirective = 266;

  /// OpenMP distribute parallel for simd directive.
  static const int CXCursor_OMPDistributeParallelForSimdDirective = 267;

  /// OpenMP distribute simd directive.
  static const int CXCursor_OMPDistributeSimdDirective = 268;

  /// OpenMP target parallel for simd directive.
  static const int CXCursor_OMPTargetParallelForSimdDirective = 269;

  /// OpenMP target simd directive.
  static const int CXCursor_OMPTargetSimdDirective = 270;

  /// OpenMP teams distribute directive.
  static const int CXCursor_OMPTeamsDistributeDirective = 271;

  /// OpenMP teams distribute simd directive.
  static const int CXCursor_OMPTeamsDistributeSimdDirective = 272;

  /// OpenMP teams distribute parallel for simd directive.
  static const int CXCursor_OMPTeamsDistributeParallelForSimdDirective = 273;

  /// OpenMP teams distribute parallel for directive.
  static const int CXCursor_OMPTeamsDistributeParallelForDirective = 274;

  /// OpenMP target teams directive.
  static const int CXCursor_OMPTargetTeamsDirective = 275;

  /// OpenMP target teams distribute directive.
  static const int CXCursor_OMPTargetTeamsDistributeDirective = 276;

  /// OpenMP target teams distribute parallel for directive.
  static const int CXCursor_OMPTargetTeamsDistributeParallelForDirective = 277;

  /// OpenMP target teams distribute parallel for simd directive.
  static const int CXCursor_OMPTargetTeamsDistributeParallelForSimdDirective =
      278;

  /// OpenMP target teams distribute simd directive.
  static const int CXCursor_OMPTargetTeamsDistributeSimdDirective = 279;

  /// C++2a std::bit_cast expression.
  static const int CXCursor_BuiltinBitCastExpr = 280;

  /// OpenMP master taskloop directive.
  static const int CXCursor_OMPMasterTaskLoopDirective = 281;

  /// OpenMP parallel master taskloop directive.
  static const int CXCursor_OMPParallelMasterTaskLoopDirective = 282;

  /// OpenMP master taskloop simd directive.
  static const int CXCursor_OMPMasterTaskLoopSimdDirective = 283;

  /// OpenMP parallel master taskloop simd directive.
  static const int CXCursor_OMPParallelMasterTaskLoopSimdDirective = 284;

  /// OpenMP parallel master directive.
  static const int CXCursor_OMPParallelMasterDirective = 285;
  static const int CXCursor_LastStmt = 285;

  /// Cursor that represents the translation unit itself.
  static const int CXCursor_TranslationUnit = 300;
  static const int CXCursor_FirstAttr = 400;

  /// An attribute whose specific kind is not exposed via this interface.
  static const int CXCursor_UnexposedAttr = 400;
  static const int CXCursor_IBActionAttr = 401;
  static const int CXCursor_IBOutletAttr = 402;
  static const int CXCursor_IBOutletCollectionAttr = 403;
  static const int CXCursor_CXXFinalAttr = 404;
  static const int CXCursor_CXXOverrideAttr = 405;
  static const int CXCursor_AnnotateAttr = 406;
  static const int CXCursor_AsmLabelAttr = 407;
  static const int CXCursor_PackedAttr = 408;
  static const int CXCursor_PureAttr = 409;
  static const int CXCursor_ConstAttr = 410;
  static const int CXCursor_NoDuplicateAttr = 411;
  static const int CXCursor_CUDAConstantAttr = 412;
  static const int CXCursor_CUDADeviceAttr = 413;
  static const int CXCursor_CUDAGlobalAttr = 414;
  static const int CXCursor_CUDAHostAttr = 415;
  static const int CXCursor_CUDASharedAttr = 416;
  static const int CXCursor_VisibilityAttr = 417;
  static const int CXCursor_DLLExport = 418;
  static const int CXCursor_DLLImport = 419;
  static const int CXCursor_NSReturnsRetained = 420;
  static const int CXCursor_NSReturnsNotRetained = 421;
  static const int CXCursor_NSReturnsAutoreleased = 422;
  static const int CXCursor_NSConsumesSelf = 423;
  static const int CXCursor_NSConsumed = 424;
  static const int CXCursor_ObjCException = 425;
  static const int CXCursor_ObjCNSObject = 426;
  static const int CXCursor_ObjCIndependentClass = 427;
  static const int CXCursor_ObjCPreciseLifetime = 428;
  static const int CXCursor_ObjCReturnsInnerPointer = 429;
  static const int CXCursor_ObjCRequiresSuper = 430;
  static const int CXCursor_ObjCRootClass = 431;
  static const int CXCursor_ObjCSubclassingRestricted = 432;
  static const int CXCursor_ObjCExplicitProtocolImpl = 433;
  static const int CXCursor_ObjCDesignatedInitializer = 434;
  static const int CXCursor_ObjCRuntimeVisible = 435;
  static const int CXCursor_ObjCBoxable = 436;
  static const int CXCursor_FlagEnum = 437;
  static const int CXCursor_ConvergentAttr = 438;
  static const int CXCursor_WarnUnusedAttr = 439;
  static const int CXCursor_WarnUnusedResultAttr = 440;
  static const int CXCursor_AlignedAttr = 441;
  static const int CXCursor_LastAttr = 441;
  static const int CXCursor_PreprocessingDirective = 500;
  static const int CXCursor_MacroDefinition = 501;
  static const int CXCursor_MacroExpansion = 502;
  static const int CXCursor_MacroInstantiation = 502;
  static const int CXCursor_InclusionDirective = 503;
  static const int CXCursor_FirstPreprocessing = 500;
  static const int CXCursor_LastPreprocessing = 503;

  /// A module import declaration.
  static const int CXCursor_ModuleImportDecl = 600;
  static const int CXCursor_TypeAliasTemplateDecl = 601;

  /// A static_assert or _Static_assert node
  static const int CXCursor_StaticAssert = 602;

  /// a friend declaration.
  static const int CXCursor_FriendDecl = 603;
  static const int CXCursor_FirstExtraDecl = 600;
  static const int CXCursor_LastExtraDecl = 603;

  /// A code completion overload candidate.
  static const int CXCursor_OverloadCandidate = 700;
}

/// A cursor representing some element in the abstract syntax tree for a
/// translation unit.
class CXCursor extends ffi.Struct {
  @ffi.Int32()
  external int kind;

  @ffi.Int32()
  external int xdata;

  @ffi.Array.multi([3])
  external ffi.Array<ffi.Pointer<ffi.Void>> data;
}

/// Describe the linkage of the entity referred to by a cursor.
abstract class CXLinkageKind {
  /// This value indicates that no linkage information is available for a
  /// provided CXCursor.
  static const int CXLinkage_Invalid = 0;

  /// This is the linkage for variables, parameters, and so on that have
  /// automatic storage. This covers normal (non-extern) local variables.
  static const int CXLinkage_NoLinkage = 1;

  /// This is the linkage for static variables and static functions.
  static const int CXLinkage_Internal = 2;

  /// This is the linkage for entities with external linkage that live in C++
  /// anonymous namespaces.
  static const int CXLinkage_UniqueExternal = 3;

  /// This is the linkage for entities with true, external linkage.
  static const int CXLinkage_External = 4;
}

abstract class CXVisibilityKind {
  /// This value indicates that no visibility information is available for a
  /// provided CXCursor.
  static const int CXVisibility_Invalid = 0;

  /// Symbol not seen by the linker.
  static const int CXVisibility_Hidden = 1;

  /// Symbol seen by the linker but resolves to a symbol inside this object.
  static const int CXVisibility_Protected = 2;

  /// Symbol seen by the linker and acts like a normal symbol.
  static const int CXVisibility_Default = 3;
}

/// 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 {
  /// A string that describes the platform for which this structure provides
  /// availability information.
  external CXString Platform;

  /// The version number in which this entity was introduced.
  external CXVersion Introduced;

  /// The version number in which this entity was deprecated (but is still
  /// available).
  external CXVersion Deprecated;

  /// The version number in which this entity was obsoleted, and therefore is no
  /// longer available.
  external CXVersion Obsoleted;

  /// Whether the entity is unconditionally unavailable on this platform.
  @ffi.Int32()
  external int Unavailable;

  /// An optional message to provide to a user of this API, e.g., to suggest
  /// replacement APIs.
  external CXString Message;
}

/// Describe the "language" of the entity referred to by a cursor.
abstract class CXLanguageKind {
  static const int CXLanguage_Invalid = 0;
  static const int CXLanguage_C = 1;
  static const int CXLanguage_ObjC = 2;
  static const int CXLanguage_CPlusPlus = 3;
}

/// Describe the "thread-local storage (TLS) kind" of the declaration referred
/// to by a cursor.
abstract class CXTLSKind {
  static const int CXTLS_None = 0;
  static const int CXTLS_Dynamic = 1;
  static const int CXTLS_Static = 2;
}

class CXCursorSetImpl extends ffi.Opaque {}

/// A fast container representing a set of CXCursors.
typedef CXCursorSet = ffi.Pointer<CXCursorSetImpl>;

/// Describes the kind of type
abstract class CXTypeKind {
  /// Represents an invalid type (e.g., where no type is available).
  static const int CXType_Invalid = 0;

  /// A type whose specific kind is not exposed via this interface.
  static const int CXType_Unexposed = 1;
  static const int CXType_Void = 2;
  static const int CXType_Bool = 3;
  static const int CXType_Char_U = 4;
  static const int CXType_UChar = 5;
  static const int CXType_Char16 = 6;
  static const int CXType_Char32 = 7;
  static const int CXType_UShort = 8;
  static const int CXType_UInt = 9;
  static const int CXType_ULong = 10;
  static const int CXType_ULongLong = 11;
  static const int CXType_UInt128 = 12;
  static const int CXType_Char_S = 13;
  static const int CXType_SChar = 14;
  static const int CXType_WChar = 15;
  static const int CXType_Short = 16;
  static const int CXType_Int = 17;
  static const int CXType_Long = 18;
  static const int CXType_LongLong = 19;
  static const int CXType_Int128 = 20;
  static const int CXType_Float = 21;
  static const int CXType_Double = 22;
  static const int CXType_LongDouble = 23;
  static const int CXType_NullPtr = 24;
  static const int CXType_Overload = 25;
  static const int CXType_Dependent = 26;
  static const int CXType_ObjCId = 27;
  static const int CXType_ObjCClass = 28;
  static const int CXType_ObjCSel = 29;
  static const int CXType_Float128 = 30;
  static const int CXType_Half = 31;
  static const int CXType_Float16 = 32;
  static const int CXType_ShortAccum = 33;
  static const int CXType_Accum = 34;
  static const int CXType_LongAccum = 35;
  static const int CXType_UShortAccum = 36;
  static const int CXType_UAccum = 37;
  static const int CXType_ULongAccum = 38;
  static const int CXType_FirstBuiltin = 2;
  static const int CXType_LastBuiltin = 38;
  static const int CXType_Complex = 100;
  static const int CXType_Pointer = 101;
  static const int CXType_BlockPointer = 102;
  static const int CXType_LValueReference = 103;
  static const int CXType_RValueReference = 104;
  static const int CXType_Record = 105;
  static const int CXType_Enum = 106;
  static const int CXType_Typedef = 107;
  static const int CXType_ObjCInterface = 108;
  static const int CXType_ObjCObjectPointer = 109;
  static const int CXType_FunctionNoProto = 110;
  static const int CXType_FunctionProto = 111;
  static const int CXType_ConstantArray = 112;
  static const int CXType_Vector = 113;
  static const int CXType_IncompleteArray = 114;
  static const int CXType_VariableArray = 115;
  static const int CXType_DependentSizedArray = 116;
  static const int CXType_MemberPointer = 117;
  static const int CXType_Auto = 118;

  /// Represents a type that was referred to using an elaborated type keyword.
  static const int CXType_Elaborated = 119;
  static const int CXType_Pipe = 120;
  static const int CXType_OCLImage1dRO = 121;
  static const int CXType_OCLImage1dArrayRO = 122;
  static const int CXType_OCLImage1dBufferRO = 123;
  static const int CXType_OCLImage2dRO = 124;
  static const int CXType_OCLImage2dArrayRO = 125;
  static const int CXType_OCLImage2dDepthRO = 126;
  static const int CXType_OCLImage2dArrayDepthRO = 127;
  static const int CXType_OCLImage2dMSAARO = 128;
  static const int CXType_OCLImage2dArrayMSAARO = 129;
  static const int CXType_OCLImage2dMSAADepthRO = 130;
  static const int CXType_OCLImage2dArrayMSAADepthRO = 131;
  static const int CXType_OCLImage3dRO = 132;
  static const int CXType_OCLImage1dWO = 133;
  static const int CXType_OCLImage1dArrayWO = 134;
  static const int CXType_OCLImage1dBufferWO = 135;
  static const int CXType_OCLImage2dWO = 136;
  static const int CXType_OCLImage2dArrayWO = 137;
  static const int CXType_OCLImage2dDepthWO = 138;
  static const int CXType_OCLImage2dArrayDepthWO = 139;
  static const int CXType_OCLImage2dMSAAWO = 140;
  static const int CXType_OCLImage2dArrayMSAAWO = 141;
  static const int CXType_OCLImage2dMSAADepthWO = 142;
  static const int CXType_OCLImage2dArrayMSAADepthWO = 143;
  static const int CXType_OCLImage3dWO = 144;
  static const int CXType_OCLImage1dRW = 145;
  static const int CXType_OCLImage1dArrayRW = 146;
  static const int CXType_OCLImage1dBufferRW = 147;
  static const int CXType_OCLImage2dRW = 148;
  static const int CXType_OCLImage2dArrayRW = 149;
  static const int CXType_OCLImage2dDepthRW = 150;
  static const int CXType_OCLImage2dArrayDepthRW = 151;
  static const int CXType_OCLImage2dMSAARW = 152;
  static const int CXType_OCLImage2dArrayMSAARW = 153;
  static const int CXType_OCLImage2dMSAADepthRW = 154;
  static const int CXType_OCLImage2dArrayMSAADepthRW = 155;
  static const int CXType_OCLImage3dRW = 156;
  static const int CXType_OCLSampler = 157;
  static const int CXType_OCLEvent = 158;
  static const int CXType_OCLQueue = 159;
  static const int CXType_OCLReserveID = 160;
  static const int CXType_ObjCObject = 161;
  static const int CXType_ObjCTypeParam = 162;
  static const int CXType_Attributed = 163;
  static const int CXType_OCLIntelSubgroupAVCMcePayload = 164;
  static const int CXType_OCLIntelSubgroupAVCImePayload = 165;
  static const int CXType_OCLIntelSubgroupAVCRefPayload = 166;
  static const int CXType_OCLIntelSubgroupAVCSicPayload = 167;
  static const int CXType_OCLIntelSubgroupAVCMceResult = 168;
  static const int CXType_OCLIntelSubgroupAVCImeResult = 169;
  static const int CXType_OCLIntelSubgroupAVCRefResult = 170;
  static const int CXType_OCLIntelSubgroupAVCSicResult = 171;
  static const int CXType_OCLIntelSubgroupAVCImeResultSingleRefStreamout = 172;
  static const int CXType_OCLIntelSubgroupAVCImeResultDualRefStreamout = 173;
  static const int CXType_OCLIntelSubgroupAVCImeSingleRefStreamin = 174;
  static const int CXType_OCLIntelSubgroupAVCImeDualRefStreamin = 175;
  static const int CXType_ExtVector = 176;
}

/// Describes the calling convention of a function type
abstract class CXCallingConv {
  static const int CXCallingConv_Default = 0;
  static const int CXCallingConv_C = 1;
  static const int CXCallingConv_X86StdCall = 2;
  static const int CXCallingConv_X86FastCall = 3;
  static const int CXCallingConv_X86ThisCall = 4;
  static const int CXCallingConv_X86Pascal = 5;
  static const int CXCallingConv_AAPCS = 6;
  static const int CXCallingConv_AAPCS_VFP = 7;
  static const int CXCallingConv_X86RegCall = 8;
  static const int CXCallingConv_IntelOclBicc = 9;
  static const int CXCallingConv_Win64 = 10;
  static const int CXCallingConv_X86_64Win64 = 10;
  static const int CXCallingConv_X86_64SysV = 11;
  static const int CXCallingConv_X86VectorCall = 12;
  static const int CXCallingConv_Swift = 13;
  static const int CXCallingConv_PreserveMost = 14;
  static const int CXCallingConv_PreserveAll = 15;
  static const int CXCallingConv_AArch64VectorCall = 16;
  static const int CXCallingConv_Invalid = 100;
  static const int CXCallingConv_Unexposed = 200;
}

/// The type of an element in the abstract syntax tree.
class CXType extends ffi.Struct {
  @ffi.Int32()
  external int kind;

  @ffi.Array.multi([2])
  external ffi.Array<ffi.Pointer<ffi.Void>> data;
}

/// Describes the kind of a template argument.
abstract class CXTemplateArgumentKind {
  static const int CXTemplateArgumentKind_Null = 0;
  static const int CXTemplateArgumentKind_Type = 1;
  static const int CXTemplateArgumentKind_Declaration = 2;
  static const int CXTemplateArgumentKind_NullPtr = 3;
  static const int CXTemplateArgumentKind_Integral = 4;
  static const int CXTemplateArgumentKind_Template = 5;
  static const int CXTemplateArgumentKind_TemplateExpansion = 6;
  static const int CXTemplateArgumentKind_Expression = 7;
  static const int CXTemplateArgumentKind_Pack = 8;
  static const int CXTemplateArgumentKind_Invalid = 9;
}

abstract class CXTypeNullabilityKind {
  /// Values of this type can never be null.
  static const int CXTypeNullability_NonNull = 0;

  /// Values of this type can be null.
  static const int CXTypeNullability_Nullable = 1;

  /// Whether values of this type can be null is (explicitly) unspecified. This
  /// captures a (fairly rare) case where we can't conclude anything about the
  /// nullability of the type even though it has been considered.
  static const int CXTypeNullability_Unspecified = 2;

  /// Nullability is not applicable to this type.
  static const int CXTypeNullability_Invalid = 3;
}

/// List the possible error codes for clang_Type_getSizeOf,
/// clang_Type_getAlignOf, clang_Type_getOffsetOf and clang_Cursor_getOffsetOf.
abstract class CXTypeLayoutError {
  /// Type is of kind CXType_Invalid.
  static const int CXTypeLayoutError_Invalid = -1;

  /// The type is an incomplete Type.
  static const int CXTypeLayoutError_Incomplete = -2;

  /// The type is a dependent Type.
  static const int CXTypeLayoutError_Dependent = -3;

  /// The type is not a constant size type.
  static const int CXTypeLayoutError_NotConstantSize = -4;

  /// The Field name is not valid for this record.
  static const int CXTypeLayoutError_InvalidFieldName = -5;

  /// The type is undeduced.
  static const int CXTypeLayoutError_Undeduced = -6;
}

abstract class CXRefQualifierKind {
  /// No ref-qualifier was provided.
  static const int CXRefQualifier_None = 0;

  /// An lvalue ref-qualifier was provided ( &).
  static const int CXRefQualifier_LValue = 1;

  /// An rvalue ref-qualifier was provided ( &&).
  static const int CXRefQualifier_RValue = 2;
}

/// Represents the C++ access control level to a base class for a cursor with
/// kind CX_CXXBaseSpecifier.
abstract class CX_CXXAccessSpecifier {
  static const int CX_CXXInvalidAccessSpecifier = 0;
  static const int CX_CXXPublic = 1;
  static const int CX_CXXProtected = 2;
  static const int CX_CXXPrivate = 3;
}

/// Represents the storage classes as declared in the source. CX_SC_Invalid was
/// added for the case that the passed cursor in not a declaration.
abstract class CX_StorageClass {
  static const int CX_SC_Invalid = 0;
  static const int CX_SC_None = 1;
  static const int CX_SC_Extern = 2;
  static const int CX_SC_Static = 3;
  static const int CX_SC_PrivateExtern = 4;
  static const int CX_SC_OpenCLWorkGroupLocal = 5;
  static const int CX_SC_Auto = 6;
  static const int CX_SC_Register = 7;
}

/// Describes how the traversal of the children of a particular cursor should
/// proceed after visiting a particular child cursor.
abstract class CXChildVisitResult {
  /// Terminates the cursor traversal.
  static const int CXChildVisit_Break = 0;

  /// 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;
}

/// Visitor invoked for each cursor found by a traversal.
typedef CXCursorVisitor = ffi.Pointer<
    ffi.NativeFunction<ffi.Int32 Function(CXCursor, CXCursor, CXClientData)>>;

/// Opaque pointer representing client data that will be passed through to
/// various callbacks and visitors.
typedef CXClientData = ffi.Pointer<ffi.Void>;

/// Properties for the printing policy.
abstract class CXPrintingPolicyProperty {
  static const int CXPrintingPolicy_Indentation = 0;
  static const int CXPrintingPolicy_SuppressSpecifiers = 1;
  static const int CXPrintingPolicy_SuppressTagKeyword = 2;
  static const int CXPrintingPolicy_IncludeTagDefinition = 3;
  static const int CXPrintingPolicy_SuppressScope = 4;
  static const int CXPrintingPolicy_SuppressUnwrittenScope = 5;
  static const int CXPrintingPolicy_SuppressInitializers = 6;
  static const int CXPrintingPolicy_ConstantArraySizeAsWritten = 7;
  static const int CXPrintingPolicy_AnonymousTagLocations = 8;
  static const int CXPrintingPolicy_SuppressStrongLifetime = 9;
  static const int CXPrintingPolicy_SuppressLifetimeQualifiers = 10;
  static const int CXPrintingPolicy_SuppressTemplateArgsInCXXConstructors = 11;
  static const int CXPrintingPolicy_Bool = 12;
  static const int CXPrintingPolicy_Restrict = 13;
  static const int CXPrintingPolicy_Alignof = 14;
  static const int CXPrintingPolicy_UnderscoreAlignof = 15;
  static const int CXPrintingPolicy_UseVoidForZeroParams = 16;
  static const int CXPrintingPolicy_TerseOutput = 17;
  static const int CXPrintingPolicy_PolishForDeclaration = 18;
  static const int CXPrintingPolicy_Half = 19;
  static const int CXPrintingPolicy_MSWChar = 20;
  static const int CXPrintingPolicy_IncludeNewlines = 21;
  static const int CXPrintingPolicy_MSVCFormatting = 22;
  static const int CXPrintingPolicy_ConstantsAsWritten = 23;
  static const int CXPrintingPolicy_SuppressImplicitBase = 24;
  static const int CXPrintingPolicy_FullyQualifiedName = 25;
  static const int CXPrintingPolicy_LastProperty = 25;
}

/// Opaque pointer representing a policy that controls pretty printing for
/// clang_getCursorPrettyPrinted.
typedef CXPrintingPolicy = ffi.Pointer<ffi.Void>;

/// Property attributes for a CXCursor_ObjCPropertyDecl.
abstract class CXObjCPropertyAttrKind {
  static const int CXObjCPropertyAttr_noattr = 0;
  static const int CXObjCPropertyAttr_readonly = 1;
  static const int CXObjCPropertyAttr_getter = 2;
  static const int CXObjCPropertyAttr_assign = 4;
  static const int CXObjCPropertyAttr_readwrite = 8;
  static const int CXObjCPropertyAttr_retain = 16;
  static const int CXObjCPropertyAttr_copy = 32;
  static const int CXObjCPropertyAttr_nonatomic = 64;
  static const int CXObjCPropertyAttr_setter = 128;
  static const int CXObjCPropertyAttr_atomic = 256;
  static const int CXObjCPropertyAttr_weak = 512;
  static const int CXObjCPropertyAttr_strong = 1024;
  static const int CXObjCPropertyAttr_unsafe_unretained = 2048;
  static const int CXObjCPropertyAttr_class = 4096;
}

/// 'Qualifiers' written next to the return and parameter types in Objective-C
/// method declarations.
abstract class CXObjCDeclQualifierKind {
  static const int CXObjCDeclQualifier_None = 0;
  static const int CXObjCDeclQualifier_In = 1;
  static const int CXObjCDeclQualifier_Inout = 2;
  static const int CXObjCDeclQualifier_Out = 4;
  static const int CXObjCDeclQualifier_Bycopy = 8;
  static const int CXObjCDeclQualifier_Byref = 16;
  static const int CXObjCDeclQualifier_Oneway = 32;
}

/// The functions in this group provide access to information about modules.
typedef CXModule = ffi.Pointer<ffi.Void>;

abstract class CXNameRefFlags {
  /// Include the nested-name-specifier, e.g. Foo:: in x.Foo::y, in the range.
  static const int CXNameRange_WantQualifier = 1;

  /// Include the explicit template arguments, e.g. <int> in x.f<int>, in the
  /// range.
  static const int CXNameRange_WantTemplateArgs = 2;

  /// If the name is non-contiguous, return the full spanning range.
  static const int CXNameRange_WantSinglePiece = 4;
}

/// Describes a kind of token.
abstract class CXTokenKind {
  /// A token that contains some kind of punctuation.
  static const int CXToken_Punctuation = 0;

  /// A language keyword.
  static const int CXToken_Keyword = 1;

  /// An identifier (that is not a keyword).
  static const int CXToken_Identifier = 2;

  /// A numeric, string, or character literal.
  static const int CXToken_Literal = 3;

  /// A comment.
  static const int CXToken_Comment = 4;
}

/// Describes a single preprocessing token.
class CXToken extends ffi.Struct {
  @ffi.Array.multi([4])
  external ffi.Array<ffi.Uint32> int_data;

  external ffi.Pointer<ffi.Void> ptr_data;
}

/// A single result of code completion.
class CXCompletionResult extends ffi.Struct {
  /// The kind of entity that this completion refers to.
  @ffi.Int32()
  external int CursorKind;

  /// The code-completion string that describes how to insert this
  /// code-completion result into the editing buffer.
  external CXCompletionString CompletionString;
}

/// A semantic string that describes a code-completion result.
typedef CXCompletionString = ffi.Pointer<ffi.Void>;

/// Describes a single piece of text within a code-completion string.
abstract class CXCompletionChunkKind {
  /// A code-completion string that describes "optional" text that could be a
  /// part of the template (but is not required).
  static const int CXCompletionChunk_Optional = 0;

  /// Text that a user would be expected to type to get this code-completion
  /// result.
  static const int CXCompletionChunk_TypedText = 1;

  /// Text that should be inserted as part of a code-completion result.
  static const int CXCompletionChunk_Text = 2;

  /// Placeholder text that should be replaced by the user.
  static const int CXCompletionChunk_Placeholder = 3;

  /// Informative text that should be displayed but never inserted as part of
  /// the template.
  static const int CXCompletionChunk_Informative = 4;

  /// Text that describes the current parameter when code-completion is
  /// referring to function call, message send, or template specialization.
  static const int CXCompletionChunk_CurrentParameter = 5;

  /// A left parenthesis ('('), used to initiate a function call or signal the
  /// beginning of a function parameter list.
  static const int CXCompletionChunk_LeftParen = 6;

  /// A right parenthesis (')'), used to finish a function call or signal the
  /// end of a function parameter list.
  static const int CXCompletionChunk_RightParen = 7;

  /// A left bracket ('[').
  static const int CXCompletionChunk_LeftBracket = 8;

  /// A right bracket (']').
  static const int CXCompletionChunk_RightBracket = 9;

  /// A left brace ('{').
  static const int CXCompletionChunk_LeftBrace = 10;

  /// A right brace ('}').
  static const int CXCompletionChunk_RightBrace = 11;

  /// A left angle bracket ('<').
  static const int CXCompletionChunk_LeftAngle = 12;

  /// A right angle bracket ('>').
  static const int CXCompletionChunk_RightAngle = 13;

  /// A comma separator (',').
  static const int CXCompletionChunk_Comma = 14;

  /// Text that specifies the result type of a given result.
  static const int CXCompletionChunk_ResultType = 15;

  /// A colon (':').
  static const int CXCompletionChunk_Colon = 16;

  /// A semicolon (';').
  static const int CXCompletionChunk_SemiColon = 17;

  /// An '=' sign.
  static const int CXCompletionChunk_Equal = 18;

  /// Horizontal space (' ').
  static const int CXCompletionChunk_HorizontalSpace = 19;

  /// Vertical space ('\n'), after which it is generally a good idea to perform
  /// indentation.
  static const int CXCompletionChunk_VerticalSpace = 20;
}

/// Contains the results of code-completion.
class CXCodeCompleteResults extends ffi.Struct {
  /// The code-completion results.
  external ffi.Pointer<CXCompletionResult> Results;

  /// The number of code-completion results stored in the Results array.
  @ffi.Uint32()
  external int NumResults;
}

/// Flags that can be passed to clang_codeCompleteAt() to modify its behavior.
abstract class CXCodeComplete_Flags {
  /// Whether to include macros within the set of code completions returned.
  static const int CXCodeComplete_IncludeMacros = 1;

  /// Whether to include code patterns for language constructs within the set of
  /// code completions, e.g., for loops.
  static const int CXCodeComplete_IncludeCodePatterns = 2;

  /// Whether to include brief documentation within the set of code completions
  /// returned.
  static const int CXCodeComplete_IncludeBriefComments = 4;

  /// Whether to speed up completion by omitting top- or namespace-level
  /// entities defined in the preamble. There's no guarantee any particular
  /// entity is omitted. This may be useful if the headers are indexed
  /// externally.
  static const int CXCodeComplete_SkipPreamble = 8;

  /// Whether to include completions with small fix-its, e.g. change '.' to '->'
  /// on member access, etc.
  static const int CXCodeComplete_IncludeCompletionsWithFixIts = 16;
}

/// Bits that represent the context under which completion is occurring.
abstract class CXCompletionContext {
  /// The context for completions is unexposed, as only Clang results should be
  /// included. (This is equivalent to having no context bits set.)
  static const int CXCompletionContext_Unexposed = 0;

  /// Completions for any possible type should be included in the results.
  static const int CXCompletionContext_AnyType = 1;

  /// Completions for any possible value (variables, function calls, etc.)
  /// should be included in the results.
  static const int CXCompletionContext_AnyValue = 2;

  /// Completions for values that resolve to an Objective-C object should be
  /// included in the results.
  static const int CXCompletionContext_ObjCObjectValue = 4;

  /// Completions for values that resolve to an Objective-C selector should be
  /// included in the results.
  static const int CXCompletionContext_ObjCSelectorValue = 8;

  /// Completions for values that resolve to a C++ class type should be included
  /// in the results.
  static const int CXCompletionContext_CXXClassTypeValue = 16;

  /// Completions for fields of the member being accessed using the dot operator
  /// should be included in the results.
  static const int CXCompletionContext_DotMemberAccess = 32;

  /// Completions for fields of the member being accessed using the arrow
  /// operator should be included in the results.
  static const int CXCompletionContext_ArrowMemberAccess = 64;

  /// Completions for properties of the Objective-C object being accessed using
  /// the dot operator should be included in the results.
  static const int CXCompletionContext_ObjCPropertyAccess = 128;

  /// Completions for enum tags should be included in the results.
  static const int CXCompletionContext_EnumTag = 256;

  /// Completions for union tags should be included in the results.
  static const int CXCompletionContext_UnionTag = 512;

  /// Completions for struct tags should be included in the results.
  static const int CXCompletionContext_StructTag = 1024;

  /// Completions for C++ class names should be included in the results.
  static const int CXCompletionContext_ClassTag = 2048;

  /// Completions for C++ namespaces and namespace aliases should be included in
  /// the results.
  static const int CXCompletionContext_Namespace = 4096;

  /// Completions for C++ nested name specifiers should be included in the
  /// results.
  static const int CXCompletionContext_NestedNameSpecifier = 8192;

  /// Completions for Objective-C interfaces (classes) should be included in the
  /// results.
  static const int CXCompletionContext_ObjCInterface = 16384;

  /// Completions for Objective-C protocols should be included in the results.
  static const int CXCompletionContext_ObjCProtocol = 32768;

  /// Completions for Objective-C categories should be included in the results.
  static const int CXCompletionContext_ObjCCategory = 65536;

  /// Completions for Objective-C instance messages should be included in the
  /// results.
  static const int CXCompletionContext_ObjCInstanceMessage = 131072;

  /// Completions for Objective-C class messages should be included in the
  /// results.
  static const int CXCompletionContext_ObjCClassMessage = 262144;

  /// Completions for Objective-C selector names should be included in the
  /// results.
  static const int CXCompletionContext_ObjCSelectorName = 524288;

  /// Completions for preprocessor macro names should be included in the
  /// results.
  static const int CXCompletionContext_MacroName = 1048576;

  /// Natural language completions should be included in the results.
  static const int CXCompletionContext_NaturalLanguage = 2097152;

  /// #include file completions should be included in the results.
  static const int CXCompletionContext_IncludedFile = 4194304;

  /// The current context is unknown, so set all contexts.
  static const int CXCompletionContext_Unknown = 8388607;
}

/// Visitor invoked for each file in a translation unit (used with
/// clang_getInclusions()).
typedef CXInclusionVisitor = ffi.Pointer<
    ffi.NativeFunction<
        ffi.Void Function(
            CXFile, ffi.Pointer<CXSourceLocation>, ffi.Uint32, CXClientData)>>;

abstract class CXEvalResultKind {
  static const int CXEval_Int = 1;
  static const int CXEval_Float = 2;
  static const int CXEval_ObjCStrLiteral = 3;
  static const int CXEval_StrLiteral = 4;
  static const int CXEval_CFStr = 5;
  static const int CXEval_Other = 6;
  static const int CXEval_UnExposed = 0;
}

/// Evaluation result of a cursor
typedef CXEvalResult = ffi.Pointer<ffi.Void>;

/// A remapping of original source files and their translated files.
typedef CXRemapping = ffi.Pointer<ffi.Void>;

/// @{
abstract class CXVisitorResult {
  static const int CXVisit_Break = 0;
  static const int CXVisit_Continue = 1;
}

class CXCursorAndRangeVisitor extends ffi.Struct {
  external ffi.Pointer<ffi.Void> context;

  external ffi.Pointer<
      ffi.NativeFunction<
          ffi.Int32 Function(
              ffi.Pointer<ffi.Void>, CXCursor, CXSourceRange)>> visit;
}

abstract class CXResult {
  /// Function returned successfully.
  static const int CXResult_Success = 0;

  /// One of the parameters was invalid for the function.
  static const int CXResult_Invalid = 1;

  /// The function was terminated by a callback (e.g. it returned CXVisit_Break)
  static const int CXResult_VisitBreak = 2;
}

/// Source location passed to index callbacks.
class CXIdxLoc extends ffi.Struct {
  @ffi.Array.multi([2])
  external ffi.Array<ffi.Pointer<ffi.Void>> ptr_data;

  @ffi.Uint32()
  external int int_data;
}

/// Data for ppIncludedFile callback.
class CXIdxIncludedFileInfo extends ffi.Struct {
  /// Location of '#' in the #include/#import directive.
  external CXIdxLoc hashLoc;

  /// Filename as written in the #include/#import directive.
  external ffi.Pointer<ffi.Int8> filename;

  /// The actual file that the #include/#import directive resolved to.
  external CXFile file;

  @ffi.Int32()
  external int isImport;

  @ffi.Int32()
  external int isAngled;

  /// Non-zero if the directive was automatically turned into a module import.
  @ffi.Int32()
  external int isModuleImport;
}

/// Data for IndexerCallbacks#importedASTFile.
class CXIdxImportedASTFileInfo extends ffi.Struct {
  /// Top level AST file containing the imported PCH, module or submodule.
  external CXFile file;

  /// The imported module or NULL if the AST file is a PCH.
  external CXModule module;

  /// Location where the file is imported. Applicable only for modules.
  external CXIdxLoc loc;

  /// Non-zero if an inclusion directive was automatically turned into a module
  /// import. Applicable only for modules.
  @ffi.Int32()
  external int isImplicit;
}

abstract class CXIdxEntityKind {
  static const int CXIdxEntity_Unexposed = 0;
  static const int CXIdxEntity_Typedef = 1;
  static const int CXIdxEntity_Function = 2;
  static const int CXIdxEntity_Variable = 3;
  static const int CXIdxEntity_Field = 4;
  static const int CXIdxEntity_EnumConstant = 5;
  static const int CXIdxEntity_ObjCClass = 6;
  static const int CXIdxEntity_ObjCProtocol = 7;
  static const int CXIdxEntity_ObjCCategory = 8;
  static const int CXIdxEntity_ObjCInstanceMethod = 9;
  static const int CXIdxEntity_ObjCClassMethod = 10;
  static const int CXIdxEntity_ObjCProperty = 11;
  static const int CXIdxEntity_ObjCIvar = 12;
  static const int CXIdxEntity_Enum = 13;
  static const int CXIdxEntity_Struct = 14;
  static const int CXIdxEntity_Union = 15;
  static const int CXIdxEntity_CXXClass = 16;
  static const int CXIdxEntity_CXXNamespace = 17;
  static const int CXIdxEntity_CXXNamespaceAlias = 18;
  static const int CXIdxEntity_CXXStaticVariable = 19;
  static const int CXIdxEntity_CXXStaticMethod = 20;
  static const int CXIdxEntity_CXXInstanceMethod = 21;
  static const int CXIdxEntity_CXXConstructor = 22;
  static const int CXIdxEntity_CXXDestructor = 23;
  static const int CXIdxEntity_CXXConversionFunction = 24;
  static const int CXIdxEntity_CXXTypeAlias = 25;
  static const int CXIdxEntity_CXXInterface = 26;
}

abstract class CXIdxEntityLanguage {
  static const int CXIdxEntityLang_None = 0;
  static const int CXIdxEntityLang_C = 1;
  static const int CXIdxEntityLang_ObjC = 2;
  static const int CXIdxEntityLang_CXX = 3;
  static const int CXIdxEntityLang_Swift = 4;
}

/// Extra C++ template information for an entity. This can apply to:
/// CXIdxEntity_Function CXIdxEntity_CXXClass CXIdxEntity_CXXStaticMethod
/// CXIdxEntity_CXXInstanceMethod CXIdxEntity_CXXConstructor
/// CXIdxEntity_CXXConversionFunction CXIdxEntity_CXXTypeAlias
abstract class CXIdxEntityCXXTemplateKind {
  static const int CXIdxEntity_NonTemplate = 0;
  static const int CXIdxEntity_Template = 1;
  static const int CXIdxEntity_TemplatePartialSpecialization = 2;
  static const int CXIdxEntity_TemplateSpecialization = 3;
}

abstract class CXIdxAttrKind {
  static const int CXIdxAttr_Unexposed = 0;
  static const int CXIdxAttr_IBAction = 1;
  static const int CXIdxAttr_IBOutlet = 2;
  static const int CXIdxAttr_IBOutletCollection = 3;
}

class CXIdxAttrInfo extends ffi.Struct {
  @ffi.Int32()
  external int kind;

  external CXCursor cursor;

  external CXIdxLoc loc;
}

class CXIdxEntityInfo extends ffi.Struct {
  @ffi.Int32()
  external int kind;

  @ffi.Int32()
  external int templateKind;

  @ffi.Int32()
  external int lang;

  external ffi.Pointer<ffi.Int8> name;

  external ffi.Pointer<ffi.Int8> USR;

  external CXCursor cursor;

  external ffi.Pointer<ffi.Pointer<CXIdxAttrInfo>> attributes;

  @ffi.Uint32()
  external int numAttributes;
}

class CXIdxContainerInfo extends ffi.Struct {
  external CXCursor cursor;
}

class CXIdxIBOutletCollectionAttrInfo extends ffi.Struct {
  external ffi.Pointer<CXIdxAttrInfo> attrInfo;

  external ffi.Pointer<CXIdxEntityInfo> objcClass;

  external CXCursor classCursor;

  external CXIdxLoc classLoc;
}

abstract class CXIdxDeclInfoFlags {
  static const int CXIdxDeclFlag_Skipped = 1;
}

class CXIdxDeclInfo extends ffi.Struct {
  external ffi.Pointer<CXIdxEntityInfo> entityInfo;

  external CXCursor cursor;

  external CXIdxLoc loc;

  external ffi.Pointer<CXIdxContainerInfo> semanticContainer;

  /// Generally same as #semanticContainer but can be different in cases like
  /// out-of-line C++ member functions.
  external ffi.Pointer<CXIdxContainerInfo> lexicalContainer;

  @ffi.Int32()
  external int isRedeclaration;

  @ffi.Int32()
  external int isDefinition;

  @ffi.Int32()
  external int isContainer;

  external ffi.Pointer<CXIdxContainerInfo> declAsContainer;

  /// Whether the declaration exists in code or was created implicitly by the
  /// compiler, e.g. implicit Objective-C methods for properties.
  @ffi.Int32()
  external int isImplicit;

  external ffi.Pointer<ffi.Pointer<CXIdxAttrInfo>> attributes;

  @ffi.Uint32()
  external int numAttributes;

  @ffi.Uint32()
  external int flags;
}

abstract class CXIdxObjCContainerKind {
  static const int CXIdxObjCContainer_ForwardRef = 0;
  static const int CXIdxObjCContainer_Interface = 1;
  static const int CXIdxObjCContainer_Implementation = 2;
}

class CXIdxObjCContainerDeclInfo extends ffi.Struct {
  external ffi.Pointer<CXIdxDeclInfo> declInfo;

  @ffi.Int32()
  external int kind;
}

class CXIdxBaseClassInfo extends ffi.Struct {
  external ffi.Pointer<CXIdxEntityInfo> base;

  external CXCursor cursor;

  external CXIdxLoc loc;
}

class CXIdxObjCProtocolRefInfo extends ffi.Struct {
  external ffi.Pointer<CXIdxEntityInfo> protocol;

  external CXCursor cursor;

  external CXIdxLoc loc;
}

class CXIdxObjCProtocolRefListInfo extends ffi.Struct {
  external ffi.Pointer<ffi.Pointer<CXIdxObjCProtocolRefInfo>> protocols;

  @ffi.Uint32()
  external int numProtocols;
}

class CXIdxObjCInterfaceDeclInfo extends ffi.Struct {
  external ffi.Pointer<CXIdxObjCContainerDeclInfo> containerInfo;

  external ffi.Pointer<CXIdxBaseClassInfo> superInfo;

  external ffi.Pointer<CXIdxObjCProtocolRefListInfo> protocols;
}

class CXIdxObjCCategoryDeclInfo extends ffi.Struct {
  external ffi.Pointer<CXIdxObjCContainerDeclInfo> containerInfo;

  external ffi.Pointer<CXIdxEntityInfo> objcClass;

  external CXCursor classCursor;

  external CXIdxLoc classLoc;

  external ffi.Pointer<CXIdxObjCProtocolRefListInfo> protocols;
}

class CXIdxObjCPropertyDeclInfo extends ffi.Struct {
  external ffi.Pointer<CXIdxDeclInfo> declInfo;

  external ffi.Pointer<CXIdxEntityInfo> getter;

  external ffi.Pointer<CXIdxEntityInfo> setter;
}

class CXIdxCXXClassDeclInfo extends ffi.Struct {
  external ffi.Pointer<CXIdxDeclInfo> declInfo;

  external ffi.Pointer<ffi.Pointer<CXIdxBaseClassInfo>> bases;

  @ffi.Uint32()
  external int numBases;
}

/// Data for IndexerCallbacks#indexEntityReference.
abstract class CXIdxEntityRefKind {
  /// The entity is referenced directly in user's code.
  static const int CXIdxEntityRef_Direct = 1;

  /// An implicit reference, e.g. a reference of an Objective-C method via the
  /// dot syntax.
  static const int CXIdxEntityRef_Implicit = 2;
}

/// Roles that are attributed to symbol occurrences.
abstract class CXSymbolRole {
  static const int CXSymbolRole_None = 0;
  static const int CXSymbolRole_Declaration = 1;
  static const int CXSymbolRole_Definition = 2;
  static const int CXSymbolRole_Reference = 4;
  static const int CXSymbolRole_Read = 8;
  static const int CXSymbolRole_Write = 16;
  static const int CXSymbolRole_Call = 32;
  static const int CXSymbolRole_Dynamic = 64;
  static const int CXSymbolRole_AddressOf = 128;
  static const int CXSymbolRole_Implicit = 256;
}

/// Data for IndexerCallbacks#indexEntityReference.
class CXIdxEntityRefInfo extends ffi.Struct {
  @ffi.Int32()
  external int kind;

  /// Reference cursor.
  external CXCursor cursor;

  external CXIdxLoc loc;

  /// The entity that gets referenced.
  external ffi.Pointer<CXIdxEntityInfo> referencedEntity;

  /// Immediate "parent" of the reference. For example:
  external ffi.Pointer<CXIdxEntityInfo> parentEntity;

  /// Lexical container context of the reference.
  external ffi.Pointer<CXIdxContainerInfo> container;

  /// Sets of symbol roles of the reference.
  @ffi.Int32()
  external int role;
}

/// 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.
  external ffi.Pointer<
      ffi.NativeFunction<
          ffi.Int32 Function(CXClientData, ffi.Pointer<ffi.Void>)>> abortQuery;

  /// Called at the end of indexing; passes the complete diagnostic set.
  external ffi.Pointer<
          ffi.NativeFunction<
              ffi.Void Function(
                  CXClientData, CXDiagnosticSet, ffi.Pointer<ffi.Void>)>>
      diagnostic;

  external ffi.Pointer<
      ffi.NativeFunction<
          CXIdxClientFile Function(
              CXClientData, CXFile, ffi.Pointer<ffi.Void>)>> enteredMainFile;

  /// Called when a file gets #included/#imported.
  external ffi.Pointer<
          ffi.NativeFunction<
              CXIdxClientFile Function(
                  CXClientData, ffi.Pointer<CXIdxIncludedFileInfo>)>>
      ppIncludedFile;

  /// Called when a AST file (PCH or module) gets imported.
  external ffi.Pointer<
          ffi.NativeFunction<
              CXIdxClientASTFile Function(
                  CXClientData, ffi.Pointer<CXIdxImportedASTFileInfo>)>>
      importedASTFile;

  /// Called at the beginning of indexing a translation unit.
  external ffi.Pointer<
      ffi.NativeFunction<
          CXIdxClientContainer Function(
              CXClientData, ffi.Pointer<ffi.Void>)>> startedTranslationUnit;

  external ffi.Pointer<
          ffi.NativeFunction<
              ffi.Void Function(CXClientData, ffi.Pointer<CXIdxDeclInfo>)>>
      indexDeclaration;

  /// Called to index a reference of an entity.
  external ffi.Pointer<
          ffi.NativeFunction<
              ffi.Void Function(CXClientData, ffi.Pointer<CXIdxEntityRefInfo>)>>
      indexEntityReference;
}

/// The client's data object that is associated with a CXFile.
typedef CXIdxClientFile = ffi.Pointer<ffi.Void>;

/// The client's data object that is associated with an AST file (PCH or
/// module).
typedef CXIdxClientASTFile = ffi.Pointer<ffi.Void>;

/// The client's data object that is associated with a semantic container of
/// entities.
typedef CXIdxClientContainer = ffi.Pointer<ffi.Void>;

/// The client's data object that is associated with a semantic entity.
typedef CXIdxClientEntity = ffi.Pointer<ffi.Void>;

/// An indexing action/session, to be applied to one or multiple translation
/// units.
typedef CXIndexAction = ffi.Pointer<ffi.Void>;

abstract class CXIndexOptFlags {
  /// Used to indicate that no special indexing options are needed.
  static const int CXIndexOpt_None = 0;

  /// Used to indicate that IndexerCallbacks#indexEntityReference should be
  /// invoked for only one reference of an entity per source file that does not
  /// also include a declaration/definition of the entity.
  static const int CXIndexOpt_SuppressRedundantRefs = 1;

  /// Function-local symbols should be indexed. If this is not set
  /// function-local symbols will be ignored.
  static const int CXIndexOpt_IndexFunctionLocalSymbols = 2;

  /// Implicit function/class template instantiations should be indexed. If this
  /// is not set, implicit instantiations will be ignored.
  static const int CXIndexOpt_IndexImplicitTemplateInstantiations = 4;

  /// Suppress all compiler warnings when parsing for indexing.
  static const int CXIndexOpt_SuppressWarnings = 8;

  /// Skip a function/method body that was already parsed during an indexing
  /// session associated with a CXIndexAction object. Bodies in system headers
  /// are always skipped.
  static const int CXIndexOpt_SkipParsedBodiesInSession = 16;
}

/// Visitor invoked for each field found by a traversal.
typedef CXFieldVisitor = ffi
    .Pointer<ffi.NativeFunction<ffi.Int32 Function(CXCursor, CXClientData)>>;

const int CINDEX_VERSION_MAJOR = 0;

const int CINDEX_VERSION_MINOR = 59;

const int CINDEX_VERSION = 59;

const String CINDEX_VERSION_STRING = '0.59';
