// Part of the LLVM Project, under the Apache License v2.0 with LLVM
// Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception

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

/// Holds 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<Native_clang_getCString>>('clang_getCString');
  late final _dart_clang_getCString _clang_getCString =
      _clang_getCString_ptr.asFunction<_dart_clang_getCString>();

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

  late final _clang_disposeString_ptr =
      _lookup<ffi.NativeFunction<Native_clang_disposeString>>(
          'clang_disposeString');
  late final _dart_clang_disposeString _clang_disposeString =
      _clang_disposeString_ptr.asFunction<_dart_clang_disposeString>();

  /// 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<Native_clang_disposeStringSet>>(
          'clang_disposeStringSet');
  late final _dart_clang_disposeStringSet _clang_disposeStringSet =
      _clang_disposeStringSet_ptr.asFunction<_dart_clang_disposeStringSet>();

  /// Provides a shared context for creating translation units.
  ///
  /// It provides two options:
  ///
  /// - excludeDeclarationsFromPCH: When non-zero, allows enumeration of "local"
  /// declarations (when loading any new translation units). A "local" declaration
  /// is one that belongs in the translation unit itself and not in a precompiled
  /// header that was used by the translation unit. If zero, all declarations
  /// will be enumerated.
  ///
  /// Here is an example:
  ///
  /// \code
  /// // excludeDeclsFromPCH = 1, displayDiagnostics=1
  /// Idx = clang_createIndex(1, 1);
  ///
  /// // IndexTest.pch was produced with the following command:
  /// // "clang -x c IndexTest.h -emit-ast -o IndexTest.pch"
  /// TU = clang_createTranslationUnit(Idx, "IndexTest.pch");
  ///
  /// // This will load all the symbols from 'IndexTest.pch'
  /// clang_visitChildren(clang_getTranslationUnitCursor(TU),
  /// TranslationUnitVisitor, 0);
  /// clang_disposeTranslationUnit(TU);
  ///
  /// // This will load all the symbols from 'IndexTest.c', excluding symbols
  /// // from 'IndexTest.pch'.
  /// char *args[] = { "-Xclang", "-include-pch=IndexTest.pch" };
  /// TU = clang_createTranslationUnitFromSourceFile(Idx, "IndexTest.c", 2, args,
  /// 0, 0);
  /// clang_visitChildren(clang_getTranslationUnitCursor(TU),
  /// TranslationUnitVisitor, 0);
  /// clang_disposeTranslationUnit(TU);
  /// \endcode
  ///
  /// This process of creating the 'pch', loading it separately, and using it (via
  /// -include-pch) allows 'excludeDeclsFromPCH' to remove redundant callbacks
  /// (which gives the indexer the same performance benefit as the compiler).
  ffi.Pointer<ffi.Void> clang_createIndex(
    int excludeDeclarationsFromPCH,
    int displayDiagnostics,
  ) {
    return _clang_createIndex(
      excludeDeclarationsFromPCH,
      displayDiagnostics,
    );
  }

  late final _clang_createIndex_ptr =
      _lookup<ffi.NativeFunction<Native_clang_createIndex>>(
          'clang_createIndex');
  late final _dart_clang_createIndex _clang_createIndex =
      _clang_createIndex_ptr.asFunction<_dart_clang_createIndex>();

  /// Destroy the given index.
  ///
  /// The index must not be destroyed until all of the translation units created
  /// within that index have been destroyed.
  void clang_disposeIndex(
    ffi.Pointer<ffi.Void> index,
  ) {
    return _clang_disposeIndex(
      index,
    );
  }

  late final _clang_disposeIndex_ptr =
      _lookup<ffi.NativeFunction<Native_clang_disposeIndex>>(
          'clang_disposeIndex');
  late final _dart_clang_disposeIndex _clang_disposeIndex =
      _clang_disposeIndex_ptr.asFunction<_dart_clang_disposeIndex>();

  /// Sets general options associated with a CXIndex.
  ///
  /// For example:
  /// \code
  /// CXIndex idx = ...;
  /// clang_CXIndex_setGlobalOptions(idx,
  /// clang_CXIndex_getGlobalOptions(idx) |
  /// CXGlobalOpt_ThreadBackgroundPriorityForIndexing);
  /// \endcode
  ///
  /// \param options A bitmask of options, a bitwise OR of CXGlobalOpt_XXX flags.
  void clang_CXIndex_setGlobalOptions(
    ffi.Pointer<ffi.Void> arg0,
    int options,
  ) {
    return _clang_CXIndex_setGlobalOptions(
      arg0,
      options,
    );
  }

  late final _clang_CXIndex_setGlobalOptions_ptr =
      _lookup<ffi.NativeFunction<Native_clang_CXIndex_setGlobalOptions>>(
          'clang_CXIndex_setGlobalOptions');
  late final _dart_clang_CXIndex_setGlobalOptions
      _clang_CXIndex_setGlobalOptions = _clang_CXIndex_setGlobalOptions_ptr
          .asFunction<_dart_clang_CXIndex_setGlobalOptions>();

  /// Gets the general options associated with a CXIndex.
  ///
  /// \returns A bitmask of options, a bitwise OR of CXGlobalOpt_XXX flags that
  /// are associated with the given CXIndex object.
  int clang_CXIndex_getGlobalOptions(
    ffi.Pointer<ffi.Void> arg0,
  ) {
    return _clang_CXIndex_getGlobalOptions(
      arg0,
    );
  }

  late final _clang_CXIndex_getGlobalOptions_ptr =
      _lookup<ffi.NativeFunction<Native_clang_CXIndex_getGlobalOptions>>(
          'clang_CXIndex_getGlobalOptions');
  late final _dart_clang_CXIndex_getGlobalOptions
      _clang_CXIndex_getGlobalOptions = _clang_CXIndex_getGlobalOptions_ptr
          .asFunction<_dart_clang_CXIndex_getGlobalOptions>();

  /// Sets the invocation emission path option in a CXIndex.
  ///
  /// The invocation emission path specifies a path which will contain log
  /// files for certain libclang invocations. A null value (default) implies that
  /// libclang invocations are not logged..
  void clang_CXIndex_setInvocationEmissionPathOption(
    ffi.Pointer<ffi.Void> arg0,
    ffi.Pointer<ffi.Int8> Path,
  ) {
    return _clang_CXIndex_setInvocationEmissionPathOption(
      arg0,
      Path,
    );
  }

  late final _clang_CXIndex_setInvocationEmissionPathOption_ptr = _lookup<
          ffi.NativeFunction<
              Native_clang_CXIndex_setInvocationEmissionPathOption>>(
      'clang_CXIndex_setInvocationEmissionPathOption');
  late final _dart_clang_CXIndex_setInvocationEmissionPathOption
      _clang_CXIndex_setInvocationEmissionPathOption =
      _clang_CXIndex_setInvocationEmissionPathOption_ptr
          .asFunction<_dart_clang_CXIndex_setInvocationEmissionPathOption>();

  /// Retrieve the complete file and path name of the given file.
  CXString clang_getFileName(
    ffi.Pointer<ffi.Void> SFile,
  ) {
    return _clang_getFileName(
      SFile,
    );
  }

  late final _clang_getFileName_ptr =
      _lookup<ffi.NativeFunction<Native_clang_getFileName>>(
          'clang_getFileName');
  late final _dart_clang_getFileName _clang_getFileName =
      _clang_getFileName_ptr.asFunction<_dart_clang_getFileName>();

  /// Retrieve the last modification time of the given file.
  int clang_getFileTime(
    ffi.Pointer<ffi.Void> SFile,
  ) {
    return _clang_getFileTime(
      SFile,
    );
  }

  late final _clang_getFileTime_ptr =
      _lookup<ffi.NativeFunction<Native_clang_getFileTime>>(
          'clang_getFileTime');
  late final _dart_clang_getFileTime _clang_getFileTime =
      _clang_getFileTime_ptr.asFunction<_dart_clang_getFileTime>();

  /// Retrieve the unique ID for the given \c file.
  ///
  /// \param file the file to get the ID for.
  /// \param outID stores the returned CXFileUniqueID.
  /// \returns If there was a failure getting the unique ID, returns non-zero,
  /// otherwise returns 0.
  int clang_getFileUniqueID(
    ffi.Pointer<ffi.Void> file,
    ffi.Pointer<CXFileUniqueID> outID,
  ) {
    return _clang_getFileUniqueID(
      file,
      outID,
    );
  }

  late final _clang_getFileUniqueID_ptr =
      _lookup<ffi.NativeFunction<Native_clang_getFileUniqueID>>(
          'clang_getFileUniqueID');
  late final _dart_clang_getFileUniqueID _clang_getFileUniqueID =
      _clang_getFileUniqueID_ptr.asFunction<_dart_clang_getFileUniqueID>();

  /// Determine whether the given header is guarded against
  /// multiple inclusions, either with the conventional
  /// \#ifndef/\#define/\#endif macro guards or with \#pragma once.
  int clang_isFileMultipleIncludeGuarded(
    ffi.Pointer<CXTranslationUnitImpl> tu,
    ffi.Pointer<ffi.Void> file,
  ) {
    return _clang_isFileMultipleIncludeGuarded(
      tu,
      file,
    );
  }

  late final _clang_isFileMultipleIncludeGuarded_ptr =
      _lookup<ffi.NativeFunction<Native_clang_isFileMultipleIncludeGuarded>>(
          'clang_isFileMultipleIncludeGuarded');
  late final _dart_clang_isFileMultipleIncludeGuarded
      _clang_isFileMultipleIncludeGuarded =
      _clang_isFileMultipleIncludeGuarded_ptr
          .asFunction<_dart_clang_isFileMultipleIncludeGuarded>();

  /// Retrieve a file handle within the given translation unit.
  ///
  /// \param tu the translation unit
  ///
  /// \param file_name the name of the file.
  ///
  /// \returns the file handle for the named file in the translation unit \p tu,
  /// or a NULL file handle if the file was not a part of this translation unit.
  ffi.Pointer<ffi.Void> clang_getFile(
    ffi.Pointer<CXTranslationUnitImpl> tu,
    ffi.Pointer<ffi.Int8> file_name,
  ) {
    return _clang_getFile(
      tu,
      file_name,
    );
  }

  late final _clang_getFile_ptr =
      _lookup<ffi.NativeFunction<Native_clang_getFile>>('clang_getFile');
  late final _dart_clang_getFile _clang_getFile =
      _clang_getFile_ptr.asFunction<_dart_clang_getFile>();

  /// Retrieve the buffer associated with the given file.
  ///
  /// \param tu the translation unit
  ///
  /// \param file the file for which to retrieve the buffer.
  ///
  /// \param size [out] if non-NULL, will be set to the size of the buffer.
  ///
  /// \returns a pointer to the buffer in memory that holds the contents of
  /// \p file, or a NULL pointer when the file is not loaded.
  ffi.Pointer<ffi.Int8> clang_getFileContents(
    ffi.Pointer<CXTranslationUnitImpl> tu,
    ffi.Pointer<ffi.Void> file,
    ffi.Pointer<ffi.Uint64> size,
  ) {
    return _clang_getFileContents(
      tu,
      file,
      size,
    );
  }

  late final _clang_getFileContents_ptr =
      _lookup<ffi.NativeFunction<Native_clang_getFileContents>>(
          'clang_getFileContents');
  late final _dart_clang_getFileContents _clang_getFileContents =
      _clang_getFileContents_ptr.asFunction<_dart_clang_getFileContents>();

  /// Returns non-zero if the \c file1 and \c file2 point to the same file,
  /// or they are both NULL.
  int clang_File_isEqual(
    ffi.Pointer<ffi.Void> file1,
    ffi.Pointer<ffi.Void> file2,
  ) {
    return _clang_File_isEqual(
      file1,
      file2,
    );
  }

  late final _clang_File_isEqual_ptr =
      _lookup<ffi.NativeFunction<Native_clang_File_isEqual>>(
          'clang_File_isEqual');
  late final _dart_clang_File_isEqual _clang_File_isEqual =
      _clang_File_isEqual_ptr.asFunction<_dart_clang_File_isEqual>();

  /// Returns the real path name of \c file.
  ///
  /// An empty string may be returned. Use \c clang_getFileName() in that case.
  CXString clang_File_tryGetRealPathName(
    ffi.Pointer<ffi.Void> file,
  ) {
    return _clang_File_tryGetRealPathName(
      file,
    );
  }

  late final _clang_File_tryGetRealPathName_ptr =
      _lookup<ffi.NativeFunction<Native_clang_File_tryGetRealPathName>>(
          'clang_File_tryGetRealPathName');
  late final _dart_clang_File_tryGetRealPathName
      _clang_File_tryGetRealPathName = _clang_File_tryGetRealPathName_ptr
          .asFunction<_dart_clang_File_tryGetRealPathName>();

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

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

  /// Determine whether two source locations, which must refer into
  /// the same translation unit, refer to exactly the same point in the source
  /// code.
  ///
  /// \returns non-zero if the source locations refer to the same location, zero
  /// if they refer to different locations.
  int clang_equalLocations(
    CXSourceLocation loc1,
    CXSourceLocation loc2,
  ) {
    return _clang_equalLocations(
      loc1,
      loc2,
    );
  }

  late final _clang_equalLocations_ptr =
      _lookup<ffi.NativeFunction<Native_clang_equalLocations>>(
          'clang_equalLocations');
  late final _dart_clang_equalLocations _clang_equalLocations =
      _clang_equalLocations_ptr.asFunction<_dart_clang_equalLocations>();

  /// Retrieves the source location associated with a given file/line/column
  /// in a particular translation unit.
  CXSourceLocation clang_getLocation(
    ffi.Pointer<CXTranslationUnitImpl> tu,
    ffi.Pointer<ffi.Void> file,
    int line,
    int column,
  ) {
    return _clang_getLocation(
      tu,
      file,
      line,
      column,
    );
  }

  late final _clang_getLocation_ptr =
      _lookup<ffi.NativeFunction<Native_clang_getLocation>>(
          'clang_getLocation');
  late final _dart_clang_getLocation _clang_getLocation =
      _clang_getLocation_ptr.asFunction<_dart_clang_getLocation>();

  /// Retrieves the source location associated with a given character offset
  /// in a particular translation unit.
  CXSourceLocation clang_getLocationForOffset(
    ffi.Pointer<CXTranslationUnitImpl> tu,
    ffi.Pointer<ffi.Void> file,
    int offset,
  ) {
    return _clang_getLocationForOffset(
      tu,
      file,
      offset,
    );
  }

  late final _clang_getLocationForOffset_ptr =
      _lookup<ffi.NativeFunction<Native_clang_getLocationForOffset>>(
          'clang_getLocationForOffset');
  late final _dart_clang_getLocationForOffset _clang_getLocationForOffset =
      _clang_getLocationForOffset_ptr
          .asFunction<_dart_clang_getLocationForOffset>();

  /// 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<Native_clang_Location_isInSystemHeader>>(
          'clang_Location_isInSystemHeader');
  late final _dart_clang_Location_isInSystemHeader
      _clang_Location_isInSystemHeader = _clang_Location_isInSystemHeader_ptr
          .asFunction<_dart_clang_Location_isInSystemHeader>();

  /// 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<Native_clang_Location_isFromMainFile>>(
          'clang_Location_isFromMainFile');
  late final _dart_clang_Location_isFromMainFile
      _clang_Location_isFromMainFile = _clang_Location_isFromMainFile_ptr
          .asFunction<_dart_clang_Location_isFromMainFile>();

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

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

  /// 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<Native_clang_getRange>>('clang_getRange');
  late final _dart_clang_getRange _clang_getRange =
      _clang_getRange_ptr.asFunction<_dart_clang_getRange>();

  /// Determine whether two ranges are equivalent.
  ///
  /// \returns non-zero if the ranges are the same, zero if they differ.
  int clang_equalRanges(
    CXSourceRange range1,
    CXSourceRange range2,
  ) {
    return _clang_equalRanges(
      range1,
      range2,
    );
  }

  late final _clang_equalRanges_ptr =
      _lookup<ffi.NativeFunction<Native_clang_equalRanges>>(
          'clang_equalRanges');
  late final _dart_clang_equalRanges _clang_equalRanges =
      _clang_equalRanges_ptr.asFunction<_dart_clang_equalRanges>();

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

  late final _clang_Range_isNull_ptr =
      _lookup<ffi.NativeFunction<Native_clang_Range_isNull>>(
          'clang_Range_isNull');
  late final _dart_clang_Range_isNull _clang_Range_isNull =
      _clang_Range_isNull_ptr.asFunction<_dart_clang_Range_isNull>();

  /// Retrieve the file, line, column, and offset represented by
  /// the given source location.
  ///
  /// If the location refers into a macro expansion, retrieves the
  /// location of the macro expansion.
  ///
  /// \param location the location within a source file that will be decomposed
  /// into its parts.
  ///
  /// \param file [out] if non-NULL, will be set to the file to which the given
  /// source location points.
  ///
  /// \param line [out] if non-NULL, will be set to the line to which the given
  /// source location points.
  ///
  /// \param column [out] if non-NULL, will be set to the column to which the given
  /// source location points.
  ///
  /// \param offset [out] if non-NULL, will be set to the offset into the
  /// buffer to which the given source location points.
  void clang_getExpansionLocation(
    CXSourceLocation location,
    ffi.Pointer<ffi.Pointer<ffi.Void>> file,
    ffi.Pointer<ffi.Uint32> line,
    ffi.Pointer<ffi.Uint32> column,
    ffi.Pointer<ffi.Uint32> offset,
  ) {
    return _clang_getExpansionLocation(
      location,
      file,
      line,
      column,
      offset,
    );
  }

  late final _clang_getExpansionLocation_ptr =
      _lookup<ffi.NativeFunction<Native_clang_getExpansionLocation>>(
          'clang_getExpansionLocation');
  late final _dart_clang_getExpansionLocation _clang_getExpansionLocation =
      _clang_getExpansionLocation_ptr
          .asFunction<_dart_clang_getExpansionLocation>();

  /// Retrieve the file, line and column represented by the given source
  /// location, as specified in a # line directive.
  ///
  /// Example: given the following source code in a file somefile.c
  ///
  /// \code
  /// #123 "dummy.c" 1
  ///
  /// static int func(void)
  /// {
  /// return 0;
  /// }
  /// \endcode
  ///
  /// the location information returned by this function would be
  ///
  /// File: dummy.c Line: 124 Column: 12
  ///
  /// whereas clang_getExpansionLocation would have returned
  ///
  /// File: somefile.c Line: 3 Column: 12
  ///
  /// \param location the location within a source file that will be decomposed
  /// into its parts.
  ///
  /// \param filename [out] if non-NULL, will be set to the filename of the
  /// source location. Note that filenames returned will be for "virtual" files,
  /// which don't necessarily exist on the machine running clang - e.g. when
  /// parsing preprocessed output obtained from a different environment. If
  /// a non-NULL value is passed in, remember to dispose of the returned value
  /// using \c clang_disposeString() once you've finished with it. For an invalid
  /// source location, an empty string is returned.
  ///
  /// \param line [out] if non-NULL, will be set to the line number of the
  /// source location. For an invalid source location, zero is returned.
  ///
  /// \param column [out] if non-NULL, will be set to the column number of the
  /// source location. For an invalid source location, zero is returned.
  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<Native_clang_getPresumedLocation>>(
          'clang_getPresumedLocation');
  late final _dart_clang_getPresumedLocation _clang_getPresumedLocation =
      _clang_getPresumedLocation_ptr
          .asFunction<_dart_clang_getPresumedLocation>();

  /// Legacy API to retrieve the file, line, column, and offset represented
  /// by the given source location.
  ///
  /// This interface has been replaced by the newer interface
  /// #clang_getExpansionLocation(). See that interface's documentation for
  /// details.
  void clang_getInstantiationLocation(
    CXSourceLocation location,
    ffi.Pointer<ffi.Pointer<ffi.Void>> file,
    ffi.Pointer<ffi.Uint32> line,
    ffi.Pointer<ffi.Uint32> column,
    ffi.Pointer<ffi.Uint32> offset,
  ) {
    return _clang_getInstantiationLocation(
      location,
      file,
      line,
      column,
      offset,
    );
  }

  late final _clang_getInstantiationLocation_ptr =
      _lookup<ffi.NativeFunction<Native_clang_getInstantiationLocation>>(
          'clang_getInstantiationLocation');
  late final _dart_clang_getInstantiationLocation
      _clang_getInstantiationLocation = _clang_getInstantiationLocation_ptr
          .asFunction<_dart_clang_getInstantiationLocation>();

  /// Retrieve the file, line, column, and offset represented by
  /// the given source location.
  ///
  /// If the location refers into a macro instantiation, return where the
  /// location was originally spelled in the source file.
  ///
  /// \param location the location within a source file that will be decomposed
  /// into its parts.
  ///
  /// \param file [out] if non-NULL, will be set to the file to which the given
  /// source location points.
  ///
  /// \param line [out] if non-NULL, will be set to the line to which the given
  /// source location points.
  ///
  /// \param column [out] if non-NULL, will be set to the column to which the given
  /// source location points.
  ///
  /// \param offset [out] if non-NULL, will be set to the offset into the
  /// buffer to which the given source location points.
  void clang_getSpellingLocation(
    CXSourceLocation location,
    ffi.Pointer<ffi.Pointer<ffi.Void>> file,
    ffi.Pointer<ffi.Uint32> line,
    ffi.Pointer<ffi.Uint32> column,
    ffi.Pointer<ffi.Uint32> offset,
  ) {
    return _clang_getSpellingLocation(
      location,
      file,
      line,
      column,
      offset,
    );
  }

  late final _clang_getSpellingLocation_ptr =
      _lookup<ffi.NativeFunction<Native_clang_getSpellingLocation>>(
          'clang_getSpellingLocation');
  late final _dart_clang_getSpellingLocation _clang_getSpellingLocation =
      _clang_getSpellingLocation_ptr
          .asFunction<_dart_clang_getSpellingLocation>();

  /// Retrieve the file, line, column, and offset represented by
  /// the given source location.
  ///
  /// If the location refers into a macro expansion, return where the macro was
  /// expanded or where the macro argument was written, if the location points at
  /// a macro argument.
  ///
  /// \param location the location within a source file that will be decomposed
  /// into its parts.
  ///
  /// \param file [out] if non-NULL, will be set to the file to which the given
  /// source location points.
  ///
  /// \param line [out] if non-NULL, will be set to the line to which the given
  /// source location points.
  ///
  /// \param column [out] if non-NULL, will be set to the column to which the given
  /// source location points.
  ///
  /// \param offset [out] if non-NULL, will be set to the offset into the
  /// buffer to which the given source location points.
  void clang_getFileLocation(
    CXSourceLocation location,
    ffi.Pointer<ffi.Pointer<ffi.Void>> file,
    ffi.Pointer<ffi.Uint32> line,
    ffi.Pointer<ffi.Uint32> column,
    ffi.Pointer<ffi.Uint32> offset,
  ) {
    return _clang_getFileLocation(
      location,
      file,
      line,
      column,
      offset,
    );
  }

  late final _clang_getFileLocation_ptr =
      _lookup<ffi.NativeFunction<Native_clang_getFileLocation>>(
          'clang_getFileLocation');
  late final _dart_clang_getFileLocation _clang_getFileLocation =
      _clang_getFileLocation_ptr.asFunction<_dart_clang_getFileLocation>();

  /// 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<Native_clang_getRangeStart>>(
          'clang_getRangeStart');
  late final _dart_clang_getRangeStart _clang_getRangeStart =
      _clang_getRangeStart_ptr.asFunction<_dart_clang_getRangeStart>();

  /// 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<Native_clang_getRangeEnd>>(
          'clang_getRangeEnd');
  late final _dart_clang_getRangeEnd _clang_getRangeEnd =
      _clang_getRangeEnd_ptr.asFunction<_dart_clang_getRangeEnd>();

  /// Retrieve all ranges that were skipped by the preprocessor.
  ///
  /// The preprocessor will skip lines when they are surrounded by an
  /// if/ifdef/ifndef directive whose condition does not evaluate to true.
  ffi.Pointer<CXSourceRangeList> clang_getSkippedRanges(
    ffi.Pointer<CXTranslationUnitImpl> tu,
    ffi.Pointer<ffi.Void> file,
  ) {
    return _clang_getSkippedRanges(
      tu,
      file,
    );
  }

  late final _clang_getSkippedRanges_ptr =
      _lookup<ffi.NativeFunction<Native_clang_getSkippedRanges>>(
          'clang_getSkippedRanges');
  late final _dart_clang_getSkippedRanges _clang_getSkippedRanges =
      _clang_getSkippedRanges_ptr.asFunction<_dart_clang_getSkippedRanges>();

  /// Retrieve all ranges from all files that were skipped by the
  /// preprocessor.
  ///
  /// The preprocessor will skip lines when they are surrounded by an
  /// if/ifdef/ifndef directive whose condition does not evaluate to true.
  ffi.Pointer<CXSourceRangeList> clang_getAllSkippedRanges(
    ffi.Pointer<CXTranslationUnitImpl> tu,
  ) {
    return _clang_getAllSkippedRanges(
      tu,
    );
  }

  late final _clang_getAllSkippedRanges_ptr =
      _lookup<ffi.NativeFunction<Native_clang_getAllSkippedRanges>>(
          'clang_getAllSkippedRanges');
  late final _dart_clang_getAllSkippedRanges _clang_getAllSkippedRanges =
      _clang_getAllSkippedRanges_ptr
          .asFunction<_dart_clang_getAllSkippedRanges>();

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

  late final _clang_disposeSourceRangeList_ptr =
      _lookup<ffi.NativeFunction<Native_clang_disposeSourceRangeList>>(
          'clang_disposeSourceRangeList');
  late final _dart_clang_disposeSourceRangeList _clang_disposeSourceRangeList =
      _clang_disposeSourceRangeList_ptr
          .asFunction<_dart_clang_disposeSourceRangeList>();

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

  late final _clang_getNumDiagnosticsInSet_ptr =
      _lookup<ffi.NativeFunction<Native_clang_getNumDiagnosticsInSet>>(
          'clang_getNumDiagnosticsInSet');
  late final _dart_clang_getNumDiagnosticsInSet _clang_getNumDiagnosticsInSet =
      _clang_getNumDiagnosticsInSet_ptr
          .asFunction<_dart_clang_getNumDiagnosticsInSet>();

  /// Retrieve a diagnostic associated with the given CXDiagnosticSet.
  ///
  /// \param Diags the CXDiagnosticSet to query.
  /// \param Index the zero-based diagnostic number to retrieve.
  ///
  /// \returns the requested diagnostic. This diagnostic must be freed
  /// via a call to \c clang_disposeDiagnostic().
  ffi.Pointer<ffi.Void> clang_getDiagnosticInSet(
    ffi.Pointer<ffi.Void> Diags,
    int Index,
  ) {
    return _clang_getDiagnosticInSet(
      Diags,
      Index,
    );
  }

  late final _clang_getDiagnosticInSet_ptr =
      _lookup<ffi.NativeFunction<Native_clang_getDiagnosticInSet>>(
          'clang_getDiagnosticInSet');
  late final _dart_clang_getDiagnosticInSet _clang_getDiagnosticInSet =
      _clang_getDiagnosticInSet_ptr
          .asFunction<_dart_clang_getDiagnosticInSet>();

  /// Deserialize a set of diagnostics from a Clang diagnostics bitcode
  /// file.
  ///
  /// \param file The name of the file to deserialize.
  /// \param error A pointer to a enum value recording if there was a problem
  /// deserializing the diagnostics.
  /// \param errorString A pointer to a CXString for recording the error string
  /// if the file was not successfully loaded.
  ///
  /// \returns A loaded CXDiagnosticSet if successful, and NULL otherwise.  These
  /// diagnostics should be released using clang_disposeDiagnosticSet().
  ffi.Pointer<ffi.Void> clang_loadDiagnostics(
    ffi.Pointer<ffi.Int8> file,
    ffi.Pointer<ffi.Int32> error,
    ffi.Pointer<CXString> errorString,
  ) {
    return _clang_loadDiagnostics(
      file,
      error,
      errorString,
    );
  }

  late final _clang_loadDiagnostics_ptr =
      _lookup<ffi.NativeFunction<Native_clang_loadDiagnostics>>(
          'clang_loadDiagnostics');
  late final _dart_clang_loadDiagnostics _clang_loadDiagnostics =
      _clang_loadDiagnostics_ptr.asFunction<_dart_clang_loadDiagnostics>();

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

  late final _clang_disposeDiagnosticSet_ptr =
      _lookup<ffi.NativeFunction<Native_clang_disposeDiagnosticSet>>(
          'clang_disposeDiagnosticSet');
  late final _dart_clang_disposeDiagnosticSet _clang_disposeDiagnosticSet =
      _clang_disposeDiagnosticSet_ptr
          .asFunction<_dart_clang_disposeDiagnosticSet>();

  /// Retrieve the child diagnostics of a CXDiagnostic.
  ///
  /// This CXDiagnosticSet does not need to be released by
  /// clang_disposeDiagnosticSet.
  ffi.Pointer<ffi.Void> clang_getChildDiagnostics(
    ffi.Pointer<ffi.Void> D,
  ) {
    return _clang_getChildDiagnostics(
      D,
    );
  }

  late final _clang_getChildDiagnostics_ptr =
      _lookup<ffi.NativeFunction<Native_clang_getChildDiagnostics>>(
          'clang_getChildDiagnostics');
  late final _dart_clang_getChildDiagnostics _clang_getChildDiagnostics =
      _clang_getChildDiagnostics_ptr
          .asFunction<_dart_clang_getChildDiagnostics>();

  /// Determine the number of diagnostics produced for the given
  /// translation unit.
  int clang_getNumDiagnostics(
    ffi.Pointer<CXTranslationUnitImpl> Unit,
  ) {
    return _clang_getNumDiagnostics(
      Unit,
    );
  }

  late final _clang_getNumDiagnostics_ptr =
      _lookup<ffi.NativeFunction<Native_clang_getNumDiagnostics>>(
          'clang_getNumDiagnostics');
  late final _dart_clang_getNumDiagnostics _clang_getNumDiagnostics =
      _clang_getNumDiagnostics_ptr.asFunction<_dart_clang_getNumDiagnostics>();

  /// Retrieve a diagnostic associated with the given translation unit.
  ///
  /// \param Unit the translation unit to query.
  /// \param Index the zero-based diagnostic number to retrieve.
  ///
  /// \returns the requested diagnostic. This diagnostic must be freed
  /// via a call to \c clang_disposeDiagnostic().
  ffi.Pointer<ffi.Void> clang_getDiagnostic(
    ffi.Pointer<CXTranslationUnitImpl> Unit,
    int Index,
  ) {
    return _clang_getDiagnostic(
      Unit,
      Index,
    );
  }

  late final _clang_getDiagnostic_ptr =
      _lookup<ffi.NativeFunction<Native_clang_getDiagnostic>>(
          'clang_getDiagnostic');
  late final _dart_clang_getDiagnostic _clang_getDiagnostic =
      _clang_getDiagnostic_ptr.asFunction<_dart_clang_getDiagnostic>();

  /// Retrieve the complete set of diagnostics associated with a
  /// translation unit.
  ///
  /// \param Unit the translation unit to query.
  ffi.Pointer<ffi.Void> clang_getDiagnosticSetFromTU(
    ffi.Pointer<CXTranslationUnitImpl> Unit,
  ) {
    return _clang_getDiagnosticSetFromTU(
      Unit,
    );
  }

  late final _clang_getDiagnosticSetFromTU_ptr =
      _lookup<ffi.NativeFunction<Native_clang_getDiagnosticSetFromTU>>(
          'clang_getDiagnosticSetFromTU');
  late final _dart_clang_getDiagnosticSetFromTU _clang_getDiagnosticSetFromTU =
      _clang_getDiagnosticSetFromTU_ptr
          .asFunction<_dart_clang_getDiagnosticSetFromTU>();

  /// Destroy a diagnostic.
  void clang_disposeDiagnostic(
    ffi.Pointer<ffi.Void> Diagnostic,
  ) {
    return _clang_disposeDiagnostic(
      Diagnostic,
    );
  }

  late final _clang_disposeDiagnostic_ptr =
      _lookup<ffi.NativeFunction<Native_clang_disposeDiagnostic>>(
          'clang_disposeDiagnostic');
  late final _dart_clang_disposeDiagnostic _clang_disposeDiagnostic =
      _clang_disposeDiagnostic_ptr.asFunction<_dart_clang_disposeDiagnostic>();

  /// Format the given diagnostic in a manner that is suitable for display.
  ///
  /// This routine will format the given diagnostic to a string, rendering
  /// the diagnostic according to the various options given. The
  /// \c clang_defaultDiagnosticDisplayOptions() function returns the set of
  /// options that most closely mimics the behavior of the clang compiler.
  ///
  /// \param Diagnostic The diagnostic to print.
  ///
  /// \param Options A set of options that control the diagnostic display,
  /// created by combining \c CXDiagnosticDisplayOptions values.
  ///
  /// \returns A new string containing for formatted diagnostic.
  CXString clang_formatDiagnostic(
    ffi.Pointer<ffi.Void> Diagnostic,
    int Options,
  ) {
    return _clang_formatDiagnostic(
      Diagnostic,
      Options,
    );
  }

  late final _clang_formatDiagnostic_ptr =
      _lookup<ffi.NativeFunction<Native_clang_formatDiagnostic>>(
          'clang_formatDiagnostic');
  late final _dart_clang_formatDiagnostic _clang_formatDiagnostic =
      _clang_formatDiagnostic_ptr.asFunction<_dart_clang_formatDiagnostic>();

  /// Retrieve the set of display options most similar to the
  /// default behavior of the clang compiler.
  ///
  /// \returns A set of display options suitable for use with \c
  /// clang_formatDiagnostic().
  int clang_defaultDiagnosticDisplayOptions() {
    return _clang_defaultDiagnosticDisplayOptions();
  }

  late final _clang_defaultDiagnosticDisplayOptions_ptr =
      _lookup<ffi.NativeFunction<Native_clang_defaultDiagnosticDisplayOptions>>(
          'clang_defaultDiagnosticDisplayOptions');
  late final _dart_clang_defaultDiagnosticDisplayOptions
      _clang_defaultDiagnosticDisplayOptions =
      _clang_defaultDiagnosticDisplayOptions_ptr
          .asFunction<_dart_clang_defaultDiagnosticDisplayOptions>();

  /// Determine the severity of the given diagnostic.
  int clang_getDiagnosticSeverity(
    ffi.Pointer<ffi.Void> arg0,
  ) {
    return _clang_getDiagnosticSeverity(
      arg0,
    );
  }

  late final _clang_getDiagnosticSeverity_ptr =
      _lookup<ffi.NativeFunction<Native_clang_getDiagnosticSeverity>>(
          'clang_getDiagnosticSeverity');
  late final _dart_clang_getDiagnosticSeverity _clang_getDiagnosticSeverity =
      _clang_getDiagnosticSeverity_ptr
          .asFunction<_dart_clang_getDiagnosticSeverity>();

  /// Retrieve the source location of the given diagnostic.
  ///
  /// This location is where Clang would print the caret ('^') when
  /// displaying the diagnostic on the command line.
  CXSourceLocation clang_getDiagnosticLocation(
    ffi.Pointer<ffi.Void> arg0,
  ) {
    return _clang_getDiagnosticLocation(
      arg0,
    );
  }

  late final _clang_getDiagnosticLocation_ptr =
      _lookup<ffi.NativeFunction<Native_clang_getDiagnosticLocation>>(
          'clang_getDiagnosticLocation');
  late final _dart_clang_getDiagnosticLocation _clang_getDiagnosticLocation =
      _clang_getDiagnosticLocation_ptr
          .asFunction<_dart_clang_getDiagnosticLocation>();

  /// Retrieve the text of the given diagnostic.
  CXString clang_getDiagnosticSpelling(
    ffi.Pointer<ffi.Void> arg0,
  ) {
    return _clang_getDiagnosticSpelling(
      arg0,
    );
  }

  late final _clang_getDiagnosticSpelling_ptr =
      _lookup<ffi.NativeFunction<Native_clang_getDiagnosticSpelling>>(
          'clang_getDiagnosticSpelling');
  late final _dart_clang_getDiagnosticSpelling _clang_getDiagnosticSpelling =
      _clang_getDiagnosticSpelling_ptr
          .asFunction<_dart_clang_getDiagnosticSpelling>();

  /// Retrieve the name of the command-line option that enabled this
  /// diagnostic.
  ///
  /// \param Diag The diagnostic to be queried.
  ///
  /// \param Disable If non-NULL, will be set to the option that disables this
  /// diagnostic (if any).
  ///
  /// \returns A string that contains the command-line option used to enable this
  /// warning, such as "-Wconversion" or "-pedantic".
  CXString clang_getDiagnosticOption(
    ffi.Pointer<ffi.Void> Diag,
    ffi.Pointer<CXString> Disable,
  ) {
    return _clang_getDiagnosticOption(
      Diag,
      Disable,
    );
  }

  late final _clang_getDiagnosticOption_ptr =
      _lookup<ffi.NativeFunction<Native_clang_getDiagnosticOption>>(
          'clang_getDiagnosticOption');
  late final _dart_clang_getDiagnosticOption _clang_getDiagnosticOption =
      _clang_getDiagnosticOption_ptr
          .asFunction<_dart_clang_getDiagnosticOption>();

  /// Retrieve the category number for this diagnostic.
  ///
  /// Diagnostics can be categorized into groups along with other, related
  /// diagnostics (e.g., diagnostics under the same warning flag). This routine
  /// retrieves the category number for the given diagnostic.
  ///
  /// \returns The number of the category that contains this diagnostic, or zero
  /// if this diagnostic is uncategorized.
  int clang_getDiagnosticCategory(
    ffi.Pointer<ffi.Void> arg0,
  ) {
    return _clang_getDiagnosticCategory(
      arg0,
    );
  }

  late final _clang_getDiagnosticCategory_ptr =
      _lookup<ffi.NativeFunction<Native_clang_getDiagnosticCategory>>(
          'clang_getDiagnosticCategory');
  late final _dart_clang_getDiagnosticCategory _clang_getDiagnosticCategory =
      _clang_getDiagnosticCategory_ptr
          .asFunction<_dart_clang_getDiagnosticCategory>();

  /// Retrieve the name of a particular diagnostic category.  This
  /// is now deprecated.  Use clang_getDiagnosticCategoryText()
  /// instead.
  ///
  /// \param Category A diagnostic category number, as returned by
  /// \c clang_getDiagnosticCategory().
  ///
  /// \returns The name of the given diagnostic category.
  CXString clang_getDiagnosticCategoryName(
    int Category,
  ) {
    return _clang_getDiagnosticCategoryName(
      Category,
    );
  }

  late final _clang_getDiagnosticCategoryName_ptr =
      _lookup<ffi.NativeFunction<Native_clang_getDiagnosticCategoryName>>(
          'clang_getDiagnosticCategoryName');
  late final _dart_clang_getDiagnosticCategoryName
      _clang_getDiagnosticCategoryName = _clang_getDiagnosticCategoryName_ptr
          .asFunction<_dart_clang_getDiagnosticCategoryName>();

  /// Retrieve the diagnostic category text for a given diagnostic.
  ///
  /// \returns The text of the given diagnostic category.
  CXString clang_getDiagnosticCategoryText(
    ffi.Pointer<ffi.Void> arg0,
  ) {
    return _clang_getDiagnosticCategoryText(
      arg0,
    );
  }

  late final _clang_getDiagnosticCategoryText_ptr =
      _lookup<ffi.NativeFunction<Native_clang_getDiagnosticCategoryText>>(
          'clang_getDiagnosticCategoryText');
  late final _dart_clang_getDiagnosticCategoryText
      _clang_getDiagnosticCategoryText = _clang_getDiagnosticCategoryText_ptr
          .asFunction<_dart_clang_getDiagnosticCategoryText>();

  /// Determine the number of source ranges associated with the given
  /// diagnostic.
  int clang_getDiagnosticNumRanges(
    ffi.Pointer<ffi.Void> arg0,
  ) {
    return _clang_getDiagnosticNumRanges(
      arg0,
    );
  }

  late final _clang_getDiagnosticNumRanges_ptr =
      _lookup<ffi.NativeFunction<Native_clang_getDiagnosticNumRanges>>(
          'clang_getDiagnosticNumRanges');
  late final _dart_clang_getDiagnosticNumRanges _clang_getDiagnosticNumRanges =
      _clang_getDiagnosticNumRanges_ptr
          .asFunction<_dart_clang_getDiagnosticNumRanges>();

  /// Retrieve a source range associated with the diagnostic.
  ///
  /// A diagnostic's source ranges highlight important elements in the source
  /// code. On the command line, Clang displays source ranges by
  /// underlining them with '~' characters.
  ///
  /// \param Diagnostic the diagnostic whose range is being extracted.
  ///
  /// \param Range the zero-based index specifying which range to
  ///
  /// \returns the requested source range.
  CXSourceRange clang_getDiagnosticRange(
    ffi.Pointer<ffi.Void> Diagnostic,
    int Range,
  ) {
    return _clang_getDiagnosticRange(
      Diagnostic,
      Range,
    );
  }

  late final _clang_getDiagnosticRange_ptr =
      _lookup<ffi.NativeFunction<Native_clang_getDiagnosticRange>>(
          'clang_getDiagnosticRange');
  late final _dart_clang_getDiagnosticRange _clang_getDiagnosticRange =
      _clang_getDiagnosticRange_ptr
          .asFunction<_dart_clang_getDiagnosticRange>();

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

  late final _clang_getDiagnosticNumFixIts_ptr =
      _lookup<ffi.NativeFunction<Native_clang_getDiagnosticNumFixIts>>(
          'clang_getDiagnosticNumFixIts');
  late final _dart_clang_getDiagnosticNumFixIts _clang_getDiagnosticNumFixIts =
      _clang_getDiagnosticNumFixIts_ptr
          .asFunction<_dart_clang_getDiagnosticNumFixIts>();

  /// Retrieve the replacement information for a given fix-it.
  ///
  /// Fix-its are described in terms of a source range whose contents
  /// should be replaced by a string. This approach generalizes over
  /// three kinds of operations: removal of source code (the range covers
  /// the code to be removed and the replacement string is empty),
  /// replacement of source code (the range covers the code to be
  /// replaced and the replacement string provides the new code), and
  /// insertion (both the start and end of the range point at the
  /// insertion location, and the replacement string provides the text to
  /// insert).
  ///
  /// \param Diagnostic The diagnostic whose fix-its are being queried.
  ///
  /// \param FixIt The zero-based index of the fix-it.
  ///
  /// \param ReplacementRange The source range whose contents will be
  /// replaced with the returned replacement string. Note that source
  /// ranges are half-open ranges [a, b), so the source code should be
  /// replaced from a and up to (but not including) b.
  ///
  /// \returns A string containing text that should be replace the source
  /// code indicated by the \c ReplacementRange.
  CXString clang_getDiagnosticFixIt(
    ffi.Pointer<ffi.Void> Diagnostic,
    int FixIt,
    ffi.Pointer<CXSourceRange> ReplacementRange,
  ) {
    return _clang_getDiagnosticFixIt(
      Diagnostic,
      FixIt,
      ReplacementRange,
    );
  }

  late final _clang_getDiagnosticFixIt_ptr =
      _lookup<ffi.NativeFunction<Native_clang_getDiagnosticFixIt>>(
          'clang_getDiagnosticFixIt');
  late final _dart_clang_getDiagnosticFixIt _clang_getDiagnosticFixIt =
      _clang_getDiagnosticFixIt_ptr
          .asFunction<_dart_clang_getDiagnosticFixIt>();

  /// Get the original translation unit source file name.
  CXString clang_getTranslationUnitSpelling(
    ffi.Pointer<CXTranslationUnitImpl> CTUnit,
  ) {
    return _clang_getTranslationUnitSpelling(
      CTUnit,
    );
  }

  late final _clang_getTranslationUnitSpelling_ptr =
      _lookup<ffi.NativeFunction<Native_clang_getTranslationUnitSpelling>>(
          'clang_getTranslationUnitSpelling');
  late final _dart_clang_getTranslationUnitSpelling
      _clang_getTranslationUnitSpelling = _clang_getTranslationUnitSpelling_ptr
          .asFunction<_dart_clang_getTranslationUnitSpelling>();

  /// Return the CXTranslationUnit for a given source file and the provided
  /// command line arguments one would pass to the compiler.
  ///
  /// Note: The 'source_filename' argument is optional.  If the caller provides a
  /// NULL pointer, the name of the source file is expected to reside in the
  /// specified command line arguments.
  ///
  /// Note: When encountered in 'clang_command_line_args', the following options
  /// are ignored:
  ///
  /// '-c'
  /// '-emit-ast'
  /// '-fsyntax-only'
  /// '-o \<output file>'  (both '-o' and '\<output file>' are ignored)
  ///
  /// \param CIdx The index object with which the translation unit will be
  /// associated.
  ///
  /// \param source_filename The name of the source file to load, or NULL if the
  /// source file is included in \p clang_command_line_args.
  ///
  /// \param num_clang_command_line_args The number of command-line arguments in
  /// \p clang_command_line_args.
  ///
  /// \param clang_command_line_args The command-line arguments that would be
  /// passed to the \c clang executable if it were being invoked out-of-process.
  /// These command-line options will be parsed and will affect how the translation
  /// unit is parsed. Note that the following options are ignored: '-c',
  /// '-emit-ast', '-fsyntax-only' (which is the default), and '-o \<output file>'.
  ///
  /// \param num_unsaved_files the number of unsaved file entries in \p
  /// unsaved_files.
  ///
  /// \param unsaved_files the files that have not yet been saved to disk
  /// but may be required for code completion, including the contents of
  /// those files.  The contents and name of these files (as specified by
  /// CXUnsavedFile) are copied when necessary, so the client only needs to
  /// guarantee their validity until the call to this function returns.
  ffi.Pointer<CXTranslationUnitImpl> clang_createTranslationUnitFromSourceFile(
    ffi.Pointer<ffi.Void> CIdx,
    ffi.Pointer<ffi.Int8> source_filename,
    int num_clang_command_line_args,
    ffi.Pointer<ffi.Pointer<ffi.Int8>> clang_command_line_args,
    int num_unsaved_files,
    ffi.Pointer<CXUnsavedFile> unsaved_files,
  ) {
    return _clang_createTranslationUnitFromSourceFile(
      CIdx,
      source_filename,
      num_clang_command_line_args,
      clang_command_line_args,
      num_unsaved_files,
      unsaved_files,
    );
  }

  late final _clang_createTranslationUnitFromSourceFile_ptr = _lookup<
          ffi.NativeFunction<Native_clang_createTranslationUnitFromSourceFile>>(
      'clang_createTranslationUnitFromSourceFile');
  late final _dart_clang_createTranslationUnitFromSourceFile
      _clang_createTranslationUnitFromSourceFile =
      _clang_createTranslationUnitFromSourceFile_ptr
          .asFunction<_dart_clang_createTranslationUnitFromSourceFile>();

  /// Same as \c clang_createTranslationUnit2, but returns
  /// the \c CXTranslationUnit instead of an error code.  In case of an error this
  /// routine returns a \c NULL \c CXTranslationUnit, without further detailed
  /// error codes.
  ffi.Pointer<CXTranslationUnitImpl> clang_createTranslationUnit(
    ffi.Pointer<ffi.Void> CIdx,
    ffi.Pointer<ffi.Int8> ast_filename,
  ) {
    return _clang_createTranslationUnit(
      CIdx,
      ast_filename,
    );
  }

  late final _clang_createTranslationUnit_ptr =
      _lookup<ffi.NativeFunction<Native_clang_createTranslationUnit>>(
          'clang_createTranslationUnit');
  late final _dart_clang_createTranslationUnit _clang_createTranslationUnit =
      _clang_createTranslationUnit_ptr
          .asFunction<_dart_clang_createTranslationUnit>();

  /// Create a translation unit from an AST file (\c -emit-ast).
  ///
  /// \param[out] out_TU A non-NULL pointer to store the created
  /// \c CXTranslationUnit.
  ///
  /// \returns Zero on success, otherwise returns an error code.
  int clang_createTranslationUnit2(
    ffi.Pointer<ffi.Void> CIdx,
    ffi.Pointer<ffi.Int8> ast_filename,
    ffi.Pointer<ffi.Pointer<CXTranslationUnitImpl>> out_TU,
  ) {
    return _clang_createTranslationUnit2(
      CIdx,
      ast_filename,
      out_TU,
    );
  }

  late final _clang_createTranslationUnit2_ptr =
      _lookup<ffi.NativeFunction<Native_clang_createTranslationUnit2>>(
          'clang_createTranslationUnit2');
  late final _dart_clang_createTranslationUnit2 _clang_createTranslationUnit2 =
      _clang_createTranslationUnit2_ptr
          .asFunction<_dart_clang_createTranslationUnit2>();

  /// Returns the set of flags that is suitable for parsing a translation
  /// unit that is being edited.
  ///
  /// The set of flags returned provide options for \c clang_parseTranslationUnit()
  /// to indicate that the translation unit is likely to be reparsed many times,
  /// either explicitly (via \c clang_reparseTranslationUnit()) or implicitly
  /// (e.g., by code completion (\c clang_codeCompletionAt())). The returned flag
  /// set contains an unspecified set of optimizations (e.g., the precompiled
  /// preamble) geared toward improving the performance of these routines. The
  /// set of optimizations enabled may change from one version to the next.
  int clang_defaultEditingTranslationUnitOptions() {
    return _clang_defaultEditingTranslationUnitOptions();
  }

  late final _clang_defaultEditingTranslationUnitOptions_ptr = _lookup<
          ffi.NativeFunction<
              Native_clang_defaultEditingTranslationUnitOptions>>(
      'clang_defaultEditingTranslationUnitOptions');
  late final _dart_clang_defaultEditingTranslationUnitOptions
      _clang_defaultEditingTranslationUnitOptions =
      _clang_defaultEditingTranslationUnitOptions_ptr
          .asFunction<_dart_clang_defaultEditingTranslationUnitOptions>();

  /// Same as \c clang_parseTranslationUnit2, but returns
  /// the \c CXTranslationUnit instead of an error code.  In case of an error this
  /// routine returns a \c NULL \c CXTranslationUnit, without further detailed
  /// error codes.
  ffi.Pointer<CXTranslationUnitImpl> clang_parseTranslationUnit(
    ffi.Pointer<ffi.Void> CIdx,
    ffi.Pointer<ffi.Int8> source_filename,
    ffi.Pointer<ffi.Pointer<ffi.Int8>> command_line_args,
    int num_command_line_args,
    ffi.Pointer<CXUnsavedFile> unsaved_files,
    int num_unsaved_files,
    int options,
  ) {
    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<Native_clang_parseTranslationUnit>>(
          'clang_parseTranslationUnit');
  late final _dart_clang_parseTranslationUnit _clang_parseTranslationUnit =
      _clang_parseTranslationUnit_ptr
          .asFunction<_dart_clang_parseTranslationUnit>();

  /// Parse the given source file and the translation unit corresponding
  /// to that file.
  ///
  /// This routine is the main entry point for the Clang C API, providing the
  /// ability to parse a source file into a translation unit that can then be
  /// queried by other functions in the API. This routine accepts a set of
  /// command-line arguments so that the compilation can be configured in the same
  /// way that the compiler is configured on the command line.
  ///
  /// \param CIdx The index object with which the translation unit will be
  /// associated.
  ///
  /// \param source_filename The name of the source file to load, or NULL if the
  /// source file is included in \c command_line_args.
  ///
  /// \param command_line_args The command-line arguments that would be
  /// passed to the \c clang executable if it were being invoked out-of-process.
  /// These command-line options will be parsed and will affect how the translation
  /// unit is parsed. Note that the following options are ignored: '-c',
  /// '-emit-ast', '-fsyntax-only' (which is the default), and '-o \<output file>'.
  ///
  /// \param num_command_line_args The number of command-line arguments in
  /// \c command_line_args.
  ///
  /// \param unsaved_files the files that have not yet been saved to disk
  /// but may be required for parsing, including the contents of
  /// those files.  The contents and name of these files (as specified by
  /// CXUnsavedFile) are copied when necessary, so the client only needs to
  /// guarantee their validity until the call to this function returns.
  ///
  /// \param num_unsaved_files the number of unsaved file entries in \p
  /// unsaved_files.
  ///
  /// \param options A bitmask of options that affects how the translation unit
  /// is managed but not its compilation. This should be a bitwise OR of the
  /// CXTranslationUnit_XXX flags.
  ///
  /// \param[out] out_TU A non-NULL pointer to store the created
  /// \c CXTranslationUnit, describing the parsed code and containing any
  /// diagnostics produced by the compiler.
  ///
  /// \returns Zero on success, otherwise returns an error code.
  int clang_parseTranslationUnit2(
    ffi.Pointer<ffi.Void> CIdx,
    ffi.Pointer<ffi.Int8> source_filename,
    ffi.Pointer<ffi.Pointer<ffi.Int8>> command_line_args,
    int num_command_line_args,
    ffi.Pointer<CXUnsavedFile> unsaved_files,
    int num_unsaved_files,
    int options,
    ffi.Pointer<ffi.Pointer<CXTranslationUnitImpl>> out_TU,
  ) {
    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<Native_clang_parseTranslationUnit2>>(
          'clang_parseTranslationUnit2');
  late final _dart_clang_parseTranslationUnit2 _clang_parseTranslationUnit2 =
      _clang_parseTranslationUnit2_ptr
          .asFunction<_dart_clang_parseTranslationUnit2>();

  /// Same as clang_parseTranslationUnit2 but requires a full command line
  /// for \c command_line_args including argv[0]. This is useful if the standard
  /// library paths are relative to the binary.
  int clang_parseTranslationUnit2FullArgv(
    ffi.Pointer<ffi.Void> CIdx,
    ffi.Pointer<ffi.Int8> source_filename,
    ffi.Pointer<ffi.Pointer<ffi.Int8>> command_line_args,
    int num_command_line_args,
    ffi.Pointer<CXUnsavedFile> unsaved_files,
    int num_unsaved_files,
    int options,
    ffi.Pointer<ffi.Pointer<CXTranslationUnitImpl>> out_TU,
  ) {
    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<Native_clang_parseTranslationUnit2FullArgv>>(
          'clang_parseTranslationUnit2FullArgv');
  late final _dart_clang_parseTranslationUnit2FullArgv
      _clang_parseTranslationUnit2FullArgv =
      _clang_parseTranslationUnit2FullArgv_ptr
          .asFunction<_dart_clang_parseTranslationUnit2FullArgv>();

  /// Returns the set of flags that is suitable for saving a translation
  /// unit.
  ///
  /// The set of flags returned provide options for
  /// \c clang_saveTranslationUnit() by default. The returned flag
  /// set contains an unspecified set of options that save translation units with
  /// the most commonly-requested data.
  int clang_defaultSaveOptions(
    ffi.Pointer<CXTranslationUnitImpl> TU,
  ) {
    return _clang_defaultSaveOptions(
      TU,
    );
  }

  late final _clang_defaultSaveOptions_ptr =
      _lookup<ffi.NativeFunction<Native_clang_defaultSaveOptions>>(
          'clang_defaultSaveOptions');
  late final _dart_clang_defaultSaveOptions _clang_defaultSaveOptions =
      _clang_defaultSaveOptions_ptr
          .asFunction<_dart_clang_defaultSaveOptions>();

  /// Saves a translation unit into a serialized representation of
  /// that translation unit on disk.
  ///
  /// Any translation unit that was parsed without error can be saved
  /// into a file. The translation unit can then be deserialized into a
  /// new \c CXTranslationUnit with \c clang_createTranslationUnit() or,
  /// if it is an incomplete translation unit that corresponds to a
  /// header, used as a precompiled header when parsing other translation
  /// units.
  ///
  /// \param TU The translation unit to save.
  ///
  /// \param FileName The file to which the translation unit will be saved.
  ///
  /// \param options A bitmask of options that affects how the translation unit
  /// is saved. This should be a bitwise OR of the
  /// CXSaveTranslationUnit_XXX flags.
  ///
  /// \returns A value that will match one of the enumerators of the CXSaveError
  /// enumeration. Zero (CXSaveError_None) indicates that the translation unit was
  /// saved successfully, while a non-zero value indicates that a problem occurred.
  int clang_saveTranslationUnit(
    ffi.Pointer<CXTranslationUnitImpl> TU,
    ffi.Pointer<ffi.Int8> FileName,
    int options,
  ) {
    return _clang_saveTranslationUnit(
      TU,
      FileName,
      options,
    );
  }

  late final _clang_saveTranslationUnit_ptr =
      _lookup<ffi.NativeFunction<Native_clang_saveTranslationUnit>>(
          'clang_saveTranslationUnit');
  late final _dart_clang_saveTranslationUnit _clang_saveTranslationUnit =
      _clang_saveTranslationUnit_ptr
          .asFunction<_dart_clang_saveTranslationUnit>();

  /// Suspend a translation unit in order to free memory associated with it.
  ///
  /// A suspended translation unit uses significantly less memory but on the other
  /// side does not support any other calls than \c clang_reparseTranslationUnit
  /// to resume it or \c clang_disposeTranslationUnit to dispose it completely.
  int clang_suspendTranslationUnit(
    ffi.Pointer<CXTranslationUnitImpl> arg0,
  ) {
    return _clang_suspendTranslationUnit(
      arg0,
    );
  }

  late final _clang_suspendTranslationUnit_ptr =
      _lookup<ffi.NativeFunction<Native_clang_suspendTranslationUnit>>(
          'clang_suspendTranslationUnit');
  late final _dart_clang_suspendTranslationUnit _clang_suspendTranslationUnit =
      _clang_suspendTranslationUnit_ptr
          .asFunction<_dart_clang_suspendTranslationUnit>();

  /// Destroy the specified CXTranslationUnit object.
  void clang_disposeTranslationUnit(
    ffi.Pointer<CXTranslationUnitImpl> arg0,
  ) {
    return _clang_disposeTranslationUnit(
      arg0,
    );
  }

  late final _clang_disposeTranslationUnit_ptr =
      _lookup<ffi.NativeFunction<Native_clang_disposeTranslationUnit>>(
          'clang_disposeTranslationUnit');
  late final _dart_clang_disposeTranslationUnit _clang_disposeTranslationUnit =
      _clang_disposeTranslationUnit_ptr
          .asFunction<_dart_clang_disposeTranslationUnit>();

  /// Returns the set of flags that is suitable for reparsing a translation
  /// unit.
  ///
  /// The set of flags returned provide options for
  /// \c clang_reparseTranslationUnit() by default. The returned flag
  /// set contains an unspecified set of optimizations geared toward common uses
  /// of reparsing. The set of optimizations enabled may change from one version
  /// to the next.
  int clang_defaultReparseOptions(
    ffi.Pointer<CXTranslationUnitImpl> TU,
  ) {
    return _clang_defaultReparseOptions(
      TU,
    );
  }

  late final _clang_defaultReparseOptions_ptr =
      _lookup<ffi.NativeFunction<Native_clang_defaultReparseOptions>>(
          'clang_defaultReparseOptions');
  late final _dart_clang_defaultReparseOptions _clang_defaultReparseOptions =
      _clang_defaultReparseOptions_ptr
          .asFunction<_dart_clang_defaultReparseOptions>();

  /// Reparse the source files that produced this translation unit.
  ///
  /// This routine can be used to re-parse the source files that originally
  /// created the given translation unit, for example because those source files
  /// have changed (either on disk or as passed via \p unsaved_files). The
  /// source code will be reparsed with the same command-line options as it
  /// was originally parsed.
  ///
  /// Reparsing a translation unit invalidates all cursors and source locations
  /// that refer into that translation unit. This makes reparsing a translation
  /// unit semantically equivalent to destroying the translation unit and then
  /// creating a new translation unit with the same command-line arguments.
  /// However, it may be more efficient to reparse a translation
  /// unit using this routine.
  ///
  /// \param TU The translation unit whose contents will be re-parsed. The
  /// translation unit must originally have been built with
  /// \c clang_createTranslationUnitFromSourceFile().
  ///
  /// \param num_unsaved_files The number of unsaved file entries in \p
  /// unsaved_files.
  ///
  /// \param unsaved_files The files that have not yet been saved to disk
  /// but may be required for parsing, including the contents of
  /// those files.  The contents and name of these files (as specified by
  /// CXUnsavedFile) are copied when necessary, so the client only needs to
  /// guarantee their validity until the call to this function returns.
  ///
  /// \param options A bitset of options composed of the flags in CXReparse_Flags.
  /// The function \c clang_defaultReparseOptions() produces a default set of
  /// options recommended for most uses, based on the translation unit.
  ///
  /// \returns 0 if the sources could be reparsed.  A non-zero error code will be
  /// returned if reparsing was impossible, such that the translation unit is
  /// invalid. In such cases, the only valid call for \c TU is
  /// \c clang_disposeTranslationUnit(TU).  The error codes returned by this
  /// routine are described by the \c CXErrorCode enum.
  int clang_reparseTranslationUnit(
    ffi.Pointer<CXTranslationUnitImpl> TU,
    int num_unsaved_files,
    ffi.Pointer<CXUnsavedFile> unsaved_files,
    int options,
  ) {
    return _clang_reparseTranslationUnit(
      TU,
      num_unsaved_files,
      unsaved_files,
      options,
    );
  }

  late final _clang_reparseTranslationUnit_ptr =
      _lookup<ffi.NativeFunction<Native_clang_reparseTranslationUnit>>(
          'clang_reparseTranslationUnit');
  late final _dart_clang_reparseTranslationUnit _clang_reparseTranslationUnit =
      _clang_reparseTranslationUnit_ptr
          .asFunction<_dart_clang_reparseTranslationUnit>();

  /// Returns the human-readable null-terminated C string that represents
  /// the name of the memory category.  This string should never be freed.
  ffi.Pointer<ffi.Int8> clang_getTUResourceUsageName(
    int kind,
  ) {
    return _clang_getTUResourceUsageName(
      kind,
    );
  }

  late final _clang_getTUResourceUsageName_ptr =
      _lookup<ffi.NativeFunction<Native_clang_getTUResourceUsageName>>(
          'clang_getTUResourceUsageName');
  late final _dart_clang_getTUResourceUsageName _clang_getTUResourceUsageName =
      _clang_getTUResourceUsageName_ptr
          .asFunction<_dart_clang_getTUResourceUsageName>();

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

  late final _clang_getCXTUResourceUsage_ptr =
      _lookup<ffi.NativeFunction<Native_clang_getCXTUResourceUsage>>(
          'clang_getCXTUResourceUsage');
  late final _dart_clang_getCXTUResourceUsage _clang_getCXTUResourceUsage =
      _clang_getCXTUResourceUsage_ptr
          .asFunction<_dart_clang_getCXTUResourceUsage>();

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

  late final _clang_disposeCXTUResourceUsage_ptr =
      _lookup<ffi.NativeFunction<Native_clang_disposeCXTUResourceUsage>>(
          'clang_disposeCXTUResourceUsage');
  late final _dart_clang_disposeCXTUResourceUsage
      _clang_disposeCXTUResourceUsage = _clang_disposeCXTUResourceUsage_ptr
          .asFunction<_dart_clang_disposeCXTUResourceUsage>();

  /// Get target information for this translation unit.
  ///
  /// The CXTargetInfo object cannot outlive the CXTranslationUnit object.
  ffi.Pointer<CXTargetInfoImpl> clang_getTranslationUnitTargetInfo(
    ffi.Pointer<CXTranslationUnitImpl> CTUnit,
  ) {
    return _clang_getTranslationUnitTargetInfo(
      CTUnit,
    );
  }

  late final _clang_getTranslationUnitTargetInfo_ptr =
      _lookup<ffi.NativeFunction<Native_clang_getTranslationUnitTargetInfo>>(
          'clang_getTranslationUnitTargetInfo');
  late final _dart_clang_getTranslationUnitTargetInfo
      _clang_getTranslationUnitTargetInfo =
      _clang_getTranslationUnitTargetInfo_ptr
          .asFunction<_dart_clang_getTranslationUnitTargetInfo>();

  /// Destroy the CXTargetInfo object.
  void clang_TargetInfo_dispose(
    ffi.Pointer<CXTargetInfoImpl> Info,
  ) {
    return _clang_TargetInfo_dispose(
      Info,
    );
  }

  late final _clang_TargetInfo_dispose_ptr =
      _lookup<ffi.NativeFunction<Native_clang_TargetInfo_dispose>>(
          'clang_TargetInfo_dispose');
  late final _dart_clang_TargetInfo_dispose _clang_TargetInfo_dispose =
      _clang_TargetInfo_dispose_ptr
          .asFunction<_dart_clang_TargetInfo_dispose>();

  /// Get the normalized target triple as a string.
  ///
  /// Returns the empty string in case of any error.
  CXString clang_TargetInfo_getTriple(
    ffi.Pointer<CXTargetInfoImpl> Info,
  ) {
    return _clang_TargetInfo_getTriple(
      Info,
    );
  }

  late final _clang_TargetInfo_getTriple_ptr =
      _lookup<ffi.NativeFunction<Native_clang_TargetInfo_getTriple>>(
          'clang_TargetInfo_getTriple');
  late final _dart_clang_TargetInfo_getTriple _clang_TargetInfo_getTriple =
      _clang_TargetInfo_getTriple_ptr
          .asFunction<_dart_clang_TargetInfo_getTriple>();

  /// Get the pointer width of the target in bits.
  ///
  /// Returns -1 in case of error.
  int clang_TargetInfo_getPointerWidth(
    ffi.Pointer<CXTargetInfoImpl> Info,
  ) {
    return _clang_TargetInfo_getPointerWidth(
      Info,
    );
  }

  late final _clang_TargetInfo_getPointerWidth_ptr =
      _lookup<ffi.NativeFunction<Native_clang_TargetInfo_getPointerWidth>>(
          'clang_TargetInfo_getPointerWidth');
  late final _dart_clang_TargetInfo_getPointerWidth
      _clang_TargetInfo_getPointerWidth = _clang_TargetInfo_getPointerWidth_ptr
          .asFunction<_dart_clang_TargetInfo_getPointerWidth>();

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

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

  /// Retrieve the cursor that represents the given translation unit.
  ///
  /// The translation unit cursor can be used to start traversing the
  /// various declarations within the given translation unit.
  CXCursor clang_getTranslationUnitCursor(
    ffi.Pointer<CXTranslationUnitImpl> arg0,
  ) {
    return _clang_getTranslationUnitCursor(
      arg0,
    );
  }

  late final _clang_getTranslationUnitCursor_ptr =
      _lookup<ffi.NativeFunction<Native_clang_getTranslationUnitCursor>>(
          'clang_getTranslationUnitCursor');
  late final _dart_clang_getTranslationUnitCursor
      _clang_getTranslationUnitCursor = _clang_getTranslationUnitCursor_ptr
          .asFunction<_dart_clang_getTranslationUnitCursor>();

  /// 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<Native_clang_equalCursors>>(
          'clang_equalCursors');
  late final _dart_clang_equalCursors _clang_equalCursors =
      _clang_equalCursors_ptr.asFunction<_dart_clang_equalCursors>();

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

  late final _clang_Cursor_isNull_ptr =
      _lookup<ffi.NativeFunction<Native_clang_Cursor_isNull>>(
          'clang_Cursor_isNull');
  late final _dart_clang_Cursor_isNull _clang_Cursor_isNull =
      _clang_Cursor_isNull_ptr.asFunction<_dart_clang_Cursor_isNull>();

  /// 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<Native_clang_hashCursor>>('clang_hashCursor');
  late final _dart_clang_hashCursor _clang_hashCursor =
      _clang_hashCursor_ptr.asFunction<_dart_clang_hashCursor>();

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

  late final _clang_getCursorKind_ptr =
      _lookup<ffi.NativeFunction<Native_clang_getCursorKind>>(
          'clang_getCursorKind');
  late final _dart_clang_getCursorKind _clang_getCursorKind =
      _clang_getCursorKind_ptr.asFunction<_dart_clang_getCursorKind>();

  /// 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<Native_clang_isDeclaration>>(
          'clang_isDeclaration');
  late final _dart_clang_isDeclaration _clang_isDeclaration =
      _clang_isDeclaration_ptr.asFunction<_dart_clang_isDeclaration>();

  /// Determine whether the given declaration is invalid.
  ///
  /// A declaration is invalid if it could not be parsed successfully.
  ///
  /// \returns non-zero if the cursor represents a declaration and it is
  /// invalid, otherwise NULL.
  int clang_isInvalidDeclaration(
    CXCursor arg0,
  ) {
    return _clang_isInvalidDeclaration(
      arg0,
    );
  }

  late final _clang_isInvalidDeclaration_ptr =
      _lookup<ffi.NativeFunction<Native_clang_isInvalidDeclaration>>(
          'clang_isInvalidDeclaration');
  late final _dart_clang_isInvalidDeclaration _clang_isInvalidDeclaration =
      _clang_isInvalidDeclaration_ptr
          .asFunction<_dart_clang_isInvalidDeclaration>();

  /// Determine whether the given cursor kind represents a simple
  /// reference.
  ///
  /// Note that other kinds of cursors (such as expressions) can also refer to
  /// other cursors. Use clang_getCursorReferenced() to determine whether a
  /// particular cursor refers to another entity.
  int clang_isReference(
    int arg0,
  ) {
    return _clang_isReference(
      arg0,
    );
  }

  late final _clang_isReference_ptr =
      _lookup<ffi.NativeFunction<Native_clang_isReference>>(
          'clang_isReference');
  late final _dart_clang_isReference _clang_isReference =
      _clang_isReference_ptr.asFunction<_dart_clang_isReference>();

  /// 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<Native_clang_isExpression>>(
          'clang_isExpression');
  late final _dart_clang_isExpression _clang_isExpression =
      _clang_isExpression_ptr.asFunction<_dart_clang_isExpression>();

  /// 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<Native_clang_isStatement>>(
          'clang_isStatement');
  late final _dart_clang_isStatement _clang_isStatement =
      _clang_isStatement_ptr.asFunction<_dart_clang_isStatement>();

  /// 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<Native_clang_isAttribute>>(
          'clang_isAttribute');
  late final _dart_clang_isAttribute _clang_isAttribute =
      _clang_isAttribute_ptr.asFunction<_dart_clang_isAttribute>();

  /// 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<Native_clang_Cursor_hasAttrs>>(
          'clang_Cursor_hasAttrs');
  late final _dart_clang_Cursor_hasAttrs _clang_Cursor_hasAttrs =
      _clang_Cursor_hasAttrs_ptr.asFunction<_dart_clang_Cursor_hasAttrs>();

  /// 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<Native_clang_isInvalid>>('clang_isInvalid');
  late final _dart_clang_isInvalid _clang_isInvalid =
      _clang_isInvalid_ptr.asFunction<_dart_clang_isInvalid>();

  /// 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<Native_clang_isTranslationUnit>>(
          'clang_isTranslationUnit');
  late final _dart_clang_isTranslationUnit _clang_isTranslationUnit =
      _clang_isTranslationUnit_ptr.asFunction<_dart_clang_isTranslationUnit>();

  /// 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<Native_clang_isPreprocessing>>(
          'clang_isPreprocessing');
  late final _dart_clang_isPreprocessing _clang_isPreprocessing =
      _clang_isPreprocessing_ptr.asFunction<_dart_clang_isPreprocessing>();

  /// 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<Native_clang_isUnexposed>>(
          'clang_isUnexposed');
  late final _dart_clang_isUnexposed _clang_isUnexposed =
      _clang_isUnexposed_ptr.asFunction<_dart_clang_isUnexposed>();

  /// 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<Native_clang_getCursorLinkage>>(
          'clang_getCursorLinkage');
  late final _dart_clang_getCursorLinkage _clang_getCursorLinkage =
      _clang_getCursorLinkage_ptr.asFunction<_dart_clang_getCursorLinkage>();

  /// Describe the visibility of the entity referred to by a cursor.
  ///
  /// This returns the default visibility if not explicitly specified by
  /// a visibility attribute. The default visibility may be changed by
  /// commandline arguments.
  ///
  /// \param cursor The cursor to query.
  ///
  /// \returns The visibility of the cursor.
  int clang_getCursorVisibility(
    CXCursor cursor,
  ) {
    return _clang_getCursorVisibility(
      cursor,
    );
  }

  late final _clang_getCursorVisibility_ptr =
      _lookup<ffi.NativeFunction<Native_clang_getCursorVisibility>>(
          'clang_getCursorVisibility');
  late final _dart_clang_getCursorVisibility _clang_getCursorVisibility =
      _clang_getCursorVisibility_ptr
          .asFunction<_dart_clang_getCursorVisibility>();

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

  late final _clang_getCursorAvailability_ptr =
      _lookup<ffi.NativeFunction<Native_clang_getCursorAvailability>>(
          'clang_getCursorAvailability');
  late final _dart_clang_getCursorAvailability _clang_getCursorAvailability =
      _clang_getCursorAvailability_ptr
          .asFunction<_dart_clang_getCursorAvailability>();

  /// Determine the availability of the entity that this cursor refers to
  /// on any platforms for which availability information is known.
  ///
  /// \param cursor The cursor to query.
  ///
  /// \param always_deprecated If non-NULL, will be set to indicate whether the
  /// entity is deprecated on all platforms.
  ///
  /// \param deprecated_message If non-NULL, will be set to the message text
  /// provided along with the unconditional deprecation of this entity. The client
  /// is responsible for deallocating this string.
  ///
  /// \param always_unavailable If non-NULL, will be set to indicate whether the
  /// entity is unavailable on all platforms.
  ///
  /// \param unavailable_message If non-NULL, will be set to the message text
  /// provided along with the unconditional unavailability of this entity. The
  /// client is responsible for deallocating this string.
  ///
  /// \param availability If non-NULL, an array of CXPlatformAvailability instances
  /// that will be populated with platform availability information, up to either
  /// the number of platforms for which availability information is available (as
  /// returned by this function) or \c availability_size, whichever is smaller.
  ///
  /// \param availability_size The number of elements available in the
  /// \c availability array.
  ///
  /// \returns The number of platforms (N) for which availability information is
  /// available (which is unrelated to \c availability_size).
  ///
  /// Note that the client is responsible for calling
  /// \c clang_disposeCXPlatformAvailability to free each of the
  /// platform-availability structures returned. There are
  /// \c min(N, availability_size) such structures.
  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<Native_clang_getCursorPlatformAvailability>>(
          'clang_getCursorPlatformAvailability');
  late final _dart_clang_getCursorPlatformAvailability
      _clang_getCursorPlatformAvailability =
      _clang_getCursorPlatformAvailability_ptr
          .asFunction<_dart_clang_getCursorPlatformAvailability>();

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

  late final _clang_disposeCXPlatformAvailability_ptr =
      _lookup<ffi.NativeFunction<Native_clang_disposeCXPlatformAvailability>>(
          'clang_disposeCXPlatformAvailability');
  late final _dart_clang_disposeCXPlatformAvailability
      _clang_disposeCXPlatformAvailability =
      _clang_disposeCXPlatformAvailability_ptr
          .asFunction<_dart_clang_disposeCXPlatformAvailability>();

  /// 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<Native_clang_getCursorLanguage>>(
          'clang_getCursorLanguage');
  late final _dart_clang_getCursorLanguage _clang_getCursorLanguage =
      _clang_getCursorLanguage_ptr.asFunction<_dart_clang_getCursorLanguage>();

  /// 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<Native_clang_getCursorTLSKind>>(
          'clang_getCursorTLSKind');
  late final _dart_clang_getCursorTLSKind _clang_getCursorTLSKind =
      _clang_getCursorTLSKind_ptr.asFunction<_dart_clang_getCursorTLSKind>();

  /// Returns the translation unit that a cursor originated from.
  ffi.Pointer<CXTranslationUnitImpl> clang_Cursor_getTranslationUnit(
    CXCursor arg0,
  ) {
    return _clang_Cursor_getTranslationUnit(
      arg0,
    );
  }

  late final _clang_Cursor_getTranslationUnit_ptr =
      _lookup<ffi.NativeFunction<Native_clang_Cursor_getTranslationUnit>>(
          'clang_Cursor_getTranslationUnit');
  late final _dart_clang_Cursor_getTranslationUnit
      _clang_Cursor_getTranslationUnit = _clang_Cursor_getTranslationUnit_ptr
          .asFunction<_dart_clang_Cursor_getTranslationUnit>();

  /// Creates an empty CXCursorSet.
  ffi.Pointer<CXCursorSetImpl> clang_createCXCursorSet() {
    return _clang_createCXCursorSet();
  }

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

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

  late final _clang_disposeCXCursorSet_ptr =
      _lookup<ffi.NativeFunction<Native_clang_disposeCXCursorSet>>(
          'clang_disposeCXCursorSet');
  late final _dart_clang_disposeCXCursorSet _clang_disposeCXCursorSet =
      _clang_disposeCXCursorSet_ptr
          .asFunction<_dart_clang_disposeCXCursorSet>();

  /// Queries a CXCursorSet to see if it contains a specific CXCursor.
  ///
  /// \returns non-zero if the set contains the specified cursor.
  int clang_CXCursorSet_contains(
    ffi.Pointer<CXCursorSetImpl> cset,
    CXCursor cursor,
  ) {
    return _clang_CXCursorSet_contains(
      cset,
      cursor,
    );
  }

  late final _clang_CXCursorSet_contains_ptr =
      _lookup<ffi.NativeFunction<Native_clang_CXCursorSet_contains>>(
          'clang_CXCursorSet_contains');
  late final _dart_clang_CXCursorSet_contains _clang_CXCursorSet_contains =
      _clang_CXCursorSet_contains_ptr
          .asFunction<_dart_clang_CXCursorSet_contains>();

  /// Inserts a CXCursor into a CXCursorSet.
  ///
  /// \returns zero if the CXCursor was already in the set, and non-zero otherwise.
  int clang_CXCursorSet_insert(
    ffi.Pointer<CXCursorSetImpl> cset,
    CXCursor cursor,
  ) {
    return _clang_CXCursorSet_insert(
      cset,
      cursor,
    );
  }

  late final _clang_CXCursorSet_insert_ptr =
      _lookup<ffi.NativeFunction<Native_clang_CXCursorSet_insert>>(
          'clang_CXCursorSet_insert');
  late final _dart_clang_CXCursorSet_insert _clang_CXCursorSet_insert =
      _clang_CXCursorSet_insert_ptr
          .asFunction<_dart_clang_CXCursorSet_insert>();

  /// Determine the semantic parent of the given cursor.
  ///
  /// The semantic parent of a cursor is the cursor that semantically contains
  /// the given \p cursor. For many declarations, the lexical and semantic parents
  /// are equivalent (the lexical parent is returned by
  /// \c clang_getCursorLexicalParent()). They diverge when declarations or
  /// definitions are provided out-of-line. For example:
  ///
  /// \code
  /// class C {
  /// void f();
  /// };
  ///
  /// void C::f() { }
  /// \endcode
  ///
  /// In the out-of-line definition of \c C::f, the semantic parent is
  /// the class \c C, of which this function is a member. The lexical parent is
  /// the place where the declaration actually occurs in the source code; in this
  /// case, the definition occurs in the translation unit. In general, the
  /// lexical parent for a given entity can change without affecting the semantics
  /// of the program, and the lexical parent of different declarations of the
  /// same entity may be different. Changing the semantic parent of a declaration,
  /// on the other hand, can have a major impact on semantics, and redeclarations
  /// of a particular entity should all have the same semantic context.
  ///
  /// In the example above, both declarations of \c C::f have \c C as their
  /// semantic context, while the lexical context of the first \c C::f is \c C
  /// and the lexical context of the second \c C::f is the translation unit.
  ///
  /// For global declarations, the semantic parent is the translation unit.
  CXCursor clang_getCursorSemanticParent(
    CXCursor cursor,
  ) {
    return _clang_getCursorSemanticParent(
      cursor,
    );
  }

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

  /// Determine the lexical parent of the given cursor.
  ///
  /// The lexical parent of a cursor is the cursor in which the given \p cursor
  /// was actually written. For many declarations, the lexical and semantic parents
  /// are equivalent (the semantic parent is returned by
  /// \c clang_getCursorSemanticParent()). They diverge when declarations or
  /// definitions are provided out-of-line. For example:
  ///
  /// \code
  /// class C {
  /// void f();
  /// };
  ///
  /// void C::f() { }
  /// \endcode
  ///
  /// In the out-of-line definition of \c C::f, the semantic parent is
  /// the class \c C, of which this function is a member. The lexical parent is
  /// the place where the declaration actually occurs in the source code; in this
  /// case, the definition occurs in the translation unit. In general, the
  /// lexical parent for a given entity can change without affecting the semantics
  /// of the program, and the lexical parent of different declarations of the
  /// same entity may be different. Changing the semantic parent of a declaration,
  /// on the other hand, can have a major impact on semantics, and redeclarations
  /// of a particular entity should all have the same semantic context.
  ///
  /// In the example above, both declarations of \c C::f have \c C as their
  /// semantic context, while the lexical context of the first \c C::f is \c C
  /// and the lexical context of the second \c C::f is the translation unit.
  ///
  /// For declarations written in the global scope, the lexical parent is
  /// the translation unit.
  CXCursor clang_getCursorLexicalParent(
    CXCursor cursor,
  ) {
    return _clang_getCursorLexicalParent(
      cursor,
    );
  }

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

  /// Determine the set of methods that are overridden by the given
  /// method.
  ///
  /// In both Objective-C and C++, a method (aka virtual member function,
  /// in C++) can override a virtual method in a base class. For
  /// Objective-C, a method is said to override any method in the class's
  /// base class, its protocols, or its categories' protocols, that has the same
  /// selector and is of the same kind (class or instance).
  /// If no such method exists, the search continues to the class's superclass,
  /// its protocols, and its categories, and so on. A method from an Objective-C
  /// implementation is considered to override the same methods as its
  /// corresponding method in the interface.
  ///
  /// For C++, a virtual member function overrides any virtual member
  /// function with the same signature that occurs in its base
  /// classes. With multiple inheritance, a virtual member function can
  /// override several virtual member functions coming from different
  /// base classes.
  ///
  /// In all cases, this function determines the immediate overridden
  /// method, rather than all of the overridden methods. For example, if
  /// a method is originally declared in a class A, then overridden in B
  /// (which in inherits from A) and also in C (which inherited from B),
  /// then the only overridden method returned from this function when
  /// invoked on C's method will be B's method. The client may then
  /// invoke this function again, given the previously-found overridden
  /// methods, to map out the complete method-override set.
  ///
  /// \param cursor A cursor representing an Objective-C or C++
  /// method. This routine will compute the set of methods that this
  /// method overrides.
  ///
  /// \param overridden A pointer whose pointee will be replaced with a
  /// pointer to an array of cursors, representing the set of overridden
  /// methods. If there are no overridden methods, the pointee will be
  /// set to NULL. The pointee must be freed via a call to
  /// \c clang_disposeOverriddenCursors().
  ///
  /// \param num_overridden A pointer to the number of overridden
  /// functions, will be set to the number of overridden functions in the
  /// array pointed to by \p overridden.
  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<Native_clang_getOverriddenCursors>>(
          'clang_getOverriddenCursors');
  late final _dart_clang_getOverriddenCursors _clang_getOverriddenCursors =
      _clang_getOverriddenCursors_ptr
          .asFunction<_dart_clang_getOverriddenCursors>();

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

  late final _clang_disposeOverriddenCursors_ptr =
      _lookup<ffi.NativeFunction<Native_clang_disposeOverriddenCursors>>(
          'clang_disposeOverriddenCursors');
  late final _dart_clang_disposeOverriddenCursors
      _clang_disposeOverriddenCursors = _clang_disposeOverriddenCursors_ptr
          .asFunction<_dart_clang_disposeOverriddenCursors>();

  /// Retrieve the file that is included by the given inclusion directive
  /// cursor.
  ffi.Pointer<ffi.Void> clang_getIncludedFile(
    CXCursor cursor,
  ) {
    return _clang_getIncludedFile(
      cursor,
    );
  }

  late final _clang_getIncludedFile_ptr =
      _lookup<ffi.NativeFunction<Native_clang_getIncludedFile>>(
          'clang_getIncludedFile');
  late final _dart_clang_getIncludedFile _clang_getIncludedFile =
      _clang_getIncludedFile_ptr.asFunction<_dart_clang_getIncludedFile>();

  /// Map a source location to the cursor that describes the entity at that
  /// location in the source code.
  ///
  /// clang_getCursor() maps an arbitrary source location within a translation
  /// unit down to the most specific cursor that describes the entity at that
  /// location. For example, given an expression \c x + y, invoking
  /// clang_getCursor() with a source location pointing to "x" will return the
  /// cursor for "x"; similarly for "y". If the cursor points anywhere between
  /// "x" or "y" (e.g., on the + or the whitespace around it), clang_getCursor()
  /// will return a cursor referring to the "+" expression.
  ///
  /// \returns a cursor representing the entity at the given source location, or
  /// a NULL cursor if no such entity can be found.
  CXCursor clang_getCursor(
    ffi.Pointer<CXTranslationUnitImpl> arg0,
    CXSourceLocation arg1,
  ) {
    return _clang_getCursor(
      arg0,
      arg1,
    );
  }

  late final _clang_getCursor_ptr =
      _lookup<ffi.NativeFunction<Native_clang_getCursor>>('clang_getCursor');
  late final _dart_clang_getCursor _clang_getCursor =
      _clang_getCursor_ptr.asFunction<_dart_clang_getCursor>();

  /// Retrieve the physical location of the source constructor referenced
  /// by the given cursor.
  ///
  /// The location of a declaration is typically the location of the name of that
  /// declaration, where the name of that declaration would occur if it is
  /// unnamed, or some keyword that introduces that particular declaration.
  /// The location of a reference is where that reference occurs within the
  /// source code.
  CXSourceLocation clang_getCursorLocation(
    CXCursor arg0,
  ) {
    return _clang_getCursorLocation(
      arg0,
    );
  }

  late final _clang_getCursorLocation_ptr =
      _lookup<ffi.NativeFunction<Native_clang_getCursorLocation>>(
          'clang_getCursorLocation');
  late final _dart_clang_getCursorLocation _clang_getCursorLocation =
      _clang_getCursorLocation_ptr.asFunction<_dart_clang_getCursorLocation>();

  /// Retrieve the physical extent of the source construct referenced by
  /// the given cursor.
  ///
  /// The extent of a cursor starts with the file/line/column pointing at the
  /// first character within the source construct that the cursor refers to and
  /// ends with the last character within that source construct. For a
  /// declaration, the extent covers the declaration itself. For a reference,
  /// the extent covers the location of the reference (e.g., where the referenced
  /// entity was actually used).
  CXSourceRange clang_getCursorExtent(
    CXCursor arg0,
  ) {
    return _clang_getCursorExtent(
      arg0,
    );
  }

  late final _clang_getCursorExtent_ptr =
      _lookup<ffi.NativeFunction<Native_clang_getCursorExtent>>(
          'clang_getCursorExtent');
  late final _dart_clang_getCursorExtent _clang_getCursorExtent =
      _clang_getCursorExtent_ptr.asFunction<_dart_clang_getCursorExtent>();

  /// 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<Native_clang_getCursorType>>(
          'clang_getCursorType');
  late final _dart_clang_getCursorType _clang_getCursorType =
      _clang_getCursorType_ptr.asFunction<_dart_clang_getCursorType>();

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

  late final _clang_getTypeSpelling_ptr =
      _lookup<ffi.NativeFunction<Native_clang_getTypeSpelling>>(
          'clang_getTypeSpelling');
  late final _dart_clang_getTypeSpelling _clang_getTypeSpelling =
      _clang_getTypeSpelling_ptr.asFunction<_dart_clang_getTypeSpelling>();

  /// Retrieve the underlying type of a typedef declaration.
  ///
  /// If the cursor does not reference a typedef declaration, an invalid type is
  /// returned.
  CXType clang_getTypedefDeclUnderlyingType(
    CXCursor C,
  ) {
    return _clang_getTypedefDeclUnderlyingType(
      C,
    );
  }

  late final _clang_getTypedefDeclUnderlyingType_ptr =
      _lookup<ffi.NativeFunction<Native_clang_getTypedefDeclUnderlyingType>>(
          'clang_getTypedefDeclUnderlyingType');
  late final _dart_clang_getTypedefDeclUnderlyingType
      _clang_getTypedefDeclUnderlyingType =
      _clang_getTypedefDeclUnderlyingType_ptr
          .asFunction<_dart_clang_getTypedefDeclUnderlyingType>();

  /// Retrieve the integer type of an enum declaration.
  ///
  /// If the cursor does not reference an enum declaration, an invalid type is
  /// returned.
  CXType clang_getEnumDeclIntegerType(
    CXCursor C,
  ) {
    return _clang_getEnumDeclIntegerType(
      C,
    );
  }

  late final _clang_getEnumDeclIntegerType_ptr =
      _lookup<ffi.NativeFunction<Native_clang_getEnumDeclIntegerType>>(
          'clang_getEnumDeclIntegerType');
  late final _dart_clang_getEnumDeclIntegerType _clang_getEnumDeclIntegerType =
      _clang_getEnumDeclIntegerType_ptr
          .asFunction<_dart_clang_getEnumDeclIntegerType>();

  /// Retrieve the integer value of an enum constant declaration as a signed
  /// long long.
  ///
  /// If the cursor does not reference an enum constant declaration, LLONG_MIN is returned.
  /// Since this is also potentially a valid constant value, the kind of the cursor
  /// must be verified before calling this function.
  int clang_getEnumConstantDeclValue(
    CXCursor C,
  ) {
    return _clang_getEnumConstantDeclValue(
      C,
    );
  }

  late final _clang_getEnumConstantDeclValue_ptr =
      _lookup<ffi.NativeFunction<Native_clang_getEnumConstantDeclValue>>(
          'clang_getEnumConstantDeclValue');
  late final _dart_clang_getEnumConstantDeclValue
      _clang_getEnumConstantDeclValue = _clang_getEnumConstantDeclValue_ptr
          .asFunction<_dart_clang_getEnumConstantDeclValue>();

  /// Retrieve the integer value of an enum constant declaration as an unsigned
  /// long long.
  ///
  /// If the cursor does not reference an enum constant declaration, ULLONG_MAX is returned.
  /// Since this is also potentially a valid constant value, the kind of the cursor
  /// must be verified before calling this function.
  int clang_getEnumConstantDeclUnsignedValue(
    CXCursor C,
  ) {
    return _clang_getEnumConstantDeclUnsignedValue(
      C,
    );
  }

  late final _clang_getEnumConstantDeclUnsignedValue_ptr = _lookup<
          ffi.NativeFunction<Native_clang_getEnumConstantDeclUnsignedValue>>(
      'clang_getEnumConstantDeclUnsignedValue');
  late final _dart_clang_getEnumConstantDeclUnsignedValue
      _clang_getEnumConstantDeclUnsignedValue =
      _clang_getEnumConstantDeclUnsignedValue_ptr
          .asFunction<_dart_clang_getEnumConstantDeclUnsignedValue>();

  /// Retrieve the bit width of a bit field declaration as an integer.
  ///
  /// If a cursor that is not a bit field declaration is passed in, -1 is returned.
  int clang_getFieldDeclBitWidth(
    CXCursor C,
  ) {
    return _clang_getFieldDeclBitWidth(
      C,
    );
  }

  late final _clang_getFieldDeclBitWidth_ptr =
      _lookup<ffi.NativeFunction<Native_clang_getFieldDeclBitWidth>>(
          'clang_getFieldDeclBitWidth');
  late final _dart_clang_getFieldDeclBitWidth _clang_getFieldDeclBitWidth =
      _clang_getFieldDeclBitWidth_ptr
          .asFunction<_dart_clang_getFieldDeclBitWidth>();

  /// Retrieve the number of non-variadic arguments associated with a given
  /// cursor.
  ///
  /// The number of arguments can be determined for calls as well as for
  /// declarations of functions or methods. For other cursors -1 is returned.
  int clang_Cursor_getNumArguments(
    CXCursor C,
  ) {
    return _clang_Cursor_getNumArguments(
      C,
    );
  }

  late final _clang_Cursor_getNumArguments_ptr =
      _lookup<ffi.NativeFunction<Native_clang_Cursor_getNumArguments>>(
          'clang_Cursor_getNumArguments');
  late final _dart_clang_Cursor_getNumArguments _clang_Cursor_getNumArguments =
      _clang_Cursor_getNumArguments_ptr
          .asFunction<_dart_clang_Cursor_getNumArguments>();

  /// Retrieve the argument cursor of a function or method.
  ///
  /// The argument cursor can be determined for calls as well as for declarations
  /// of functions or methods. For other cursors and for invalid indices, an
  /// invalid cursor is returned.
  CXCursor clang_Cursor_getArgument(
    CXCursor C,
    int i,
  ) {
    return _clang_Cursor_getArgument(
      C,
      i,
    );
  }

  late final _clang_Cursor_getArgument_ptr =
      _lookup<ffi.NativeFunction<Native_clang_Cursor_getArgument>>(
          'clang_Cursor_getArgument');
  late final _dart_clang_Cursor_getArgument _clang_Cursor_getArgument =
      _clang_Cursor_getArgument_ptr
          .asFunction<_dart_clang_Cursor_getArgument>();

  /// Returns the number of template args of a function decl representing a
  /// template specialization.
  ///
  /// If the argument cursor cannot be converted into a template function
  /// declaration, -1 is returned.
  ///
  /// For example, for the following declaration and specialization:
  /// template <typename T, int kInt, bool kBool>
  /// void foo() { ... }
  ///
  /// template <>
  /// void foo<float, -7, true>();
  ///
  /// The value 3 would be returned from this call.
  int clang_Cursor_getNumTemplateArguments(
    CXCursor C,
  ) {
    return _clang_Cursor_getNumTemplateArguments(
      C,
    );
  }

  late final _clang_Cursor_getNumTemplateArguments_ptr =
      _lookup<ffi.NativeFunction<Native_clang_Cursor_getNumTemplateArguments>>(
          'clang_Cursor_getNumTemplateArguments');
  late final _dart_clang_Cursor_getNumTemplateArguments
      _clang_Cursor_getNumTemplateArguments =
      _clang_Cursor_getNumTemplateArguments_ptr
          .asFunction<_dart_clang_Cursor_getNumTemplateArguments>();

  /// Retrieve the kind of the I'th template argument of the CXCursor C.
  ///
  /// If the argument CXCursor does not represent a FunctionDecl, an invalid
  /// template argument kind is returned.
  ///
  /// For example, for the following declaration and specialization:
  /// template <typename T, int kInt, bool kBool>
  /// void foo() { ... }
  ///
  /// template <>
  /// void foo<float, -7, true>();
  ///
  /// For I = 0, 1, and 2, Type, Integral, and Integral will be returned,
  /// respectively.
  int clang_Cursor_getTemplateArgumentKind(
    CXCursor C,
    int I,
  ) {
    return _clang_Cursor_getTemplateArgumentKind(
      C,
      I,
    );
  }

  late final _clang_Cursor_getTemplateArgumentKind_ptr =
      _lookup<ffi.NativeFunction<Native_clang_Cursor_getTemplateArgumentKind>>(
          'clang_Cursor_getTemplateArgumentKind');
  late final _dart_clang_Cursor_getTemplateArgumentKind
      _clang_Cursor_getTemplateArgumentKind =
      _clang_Cursor_getTemplateArgumentKind_ptr
          .asFunction<_dart_clang_Cursor_getTemplateArgumentKind>();

  /// Retrieve a CXType representing the type of a TemplateArgument of a
  /// function decl representing a template specialization.
  ///
  /// If the argument CXCursor does not represent a FunctionDecl whose I'th
  /// template argument has a kind of CXTemplateArgKind_Integral, an invalid type
  /// is returned.
  ///
  /// For example, for the following declaration and specialization:
  /// template <typename T, int kInt, bool kBool>
  /// void foo() { ... }
  ///
  /// template <>
  /// void foo<float, -7, true>();
  ///
  /// If called with I = 0, "float", will be returned.
  /// Invalid types will be returned for I == 1 or 2.
  CXType clang_Cursor_getTemplateArgumentType(
    CXCursor C,
    int I,
  ) {
    return _clang_Cursor_getTemplateArgumentType(
      C,
      I,
    );
  }

  late final _clang_Cursor_getTemplateArgumentType_ptr =
      _lookup<ffi.NativeFunction<Native_clang_Cursor_getTemplateArgumentType>>(
          'clang_Cursor_getTemplateArgumentType');
  late final _dart_clang_Cursor_getTemplateArgumentType
      _clang_Cursor_getTemplateArgumentType =
      _clang_Cursor_getTemplateArgumentType_ptr
          .asFunction<_dart_clang_Cursor_getTemplateArgumentType>();

  /// Retrieve the value of an Integral TemplateArgument (of a function
  /// decl representing a template specialization) as a signed long long.
  ///
  /// It is undefined to call this function on a CXCursor that does not represent a
  /// FunctionDecl or whose I'th template argument is not an integral value.
  ///
  /// For example, for the following declaration and specialization:
  /// template <typename T, int kInt, bool kBool>
  /// void foo() { ... }
  ///
  /// template <>
  /// void foo<float, -7, true>();
  ///
  /// If called with I = 1 or 2, -7 or true will be returned, respectively.
  /// For I == 0, this function's behavior is undefined.
  int clang_Cursor_getTemplateArgumentValue(
    CXCursor C,
    int I,
  ) {
    return _clang_Cursor_getTemplateArgumentValue(
      C,
      I,
    );
  }

  late final _clang_Cursor_getTemplateArgumentValue_ptr =
      _lookup<ffi.NativeFunction<Native_clang_Cursor_getTemplateArgumentValue>>(
          'clang_Cursor_getTemplateArgumentValue');
  late final _dart_clang_Cursor_getTemplateArgumentValue
      _clang_Cursor_getTemplateArgumentValue =
      _clang_Cursor_getTemplateArgumentValue_ptr
          .asFunction<_dart_clang_Cursor_getTemplateArgumentValue>();

  /// Retrieve the value of an Integral TemplateArgument (of a function
  /// decl representing a template specialization) as an unsigned long long.
  ///
  /// It is undefined to call this function on a CXCursor that does not represent a
  /// FunctionDecl or whose I'th template argument is not an integral value.
  ///
  /// For example, for the following declaration and specialization:
  /// template <typename T, int kInt, bool kBool>
  /// void foo() { ... }
  ///
  /// template <>
  /// void foo<float, 2147483649, true>();
  ///
  /// If called with I = 1 or 2, 2147483649 or true will be returned, respectively.
  /// For I == 0, this function's behavior is undefined.
  int clang_Cursor_getTemplateArgumentUnsignedValue(
    CXCursor C,
    int I,
  ) {
    return _clang_Cursor_getTemplateArgumentUnsignedValue(
      C,
      I,
    );
  }

  late final _clang_Cursor_getTemplateArgumentUnsignedValue_ptr = _lookup<
          ffi.NativeFunction<
              Native_clang_Cursor_getTemplateArgumentUnsignedValue>>(
      'clang_Cursor_getTemplateArgumentUnsignedValue');
  late final _dart_clang_Cursor_getTemplateArgumentUnsignedValue
      _clang_Cursor_getTemplateArgumentUnsignedValue =
      _clang_Cursor_getTemplateArgumentUnsignedValue_ptr
          .asFunction<_dart_clang_Cursor_getTemplateArgumentUnsignedValue>();

  /// Determine whether two CXTypes represent the same type.
  ///
  /// \returns non-zero if the CXTypes represent the same type and
  /// zero otherwise.
  int clang_equalTypes(
    CXType A,
    CXType B,
  ) {
    return _clang_equalTypes(
      A,
      B,
    );
  }

  late final _clang_equalTypes_ptr =
      _lookup<ffi.NativeFunction<Native_clang_equalTypes>>('clang_equalTypes');
  late final _dart_clang_equalTypes _clang_equalTypes =
      _clang_equalTypes_ptr.asFunction<_dart_clang_equalTypes>();

  /// Return the canonical type for a CXType.
  ///
  /// Clang's type system explicitly models typedefs and all the ways
  /// a specific type can be represented.  The canonical type is the underlying
  /// type with all the "sugar" removed.  For example, if 'T' is a typedef
  /// for 'int', the canonical type for 'T' would be 'int'.
  CXType clang_getCanonicalType(
    CXType T,
  ) {
    return _clang_getCanonicalType(
      T,
    );
  }

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

  /// 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<Native_clang_isConstQualifiedType>>(
          'clang_isConstQualifiedType');
  late final _dart_clang_isConstQualifiedType _clang_isConstQualifiedType =
      _clang_isConstQualifiedType_ptr
          .asFunction<_dart_clang_isConstQualifiedType>();

  /// 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<Native_clang_Cursor_isMacroFunctionLike>>(
          'clang_Cursor_isMacroFunctionLike');
  late final _dart_clang_Cursor_isMacroFunctionLike
      _clang_Cursor_isMacroFunctionLike = _clang_Cursor_isMacroFunctionLike_ptr
          .asFunction<_dart_clang_Cursor_isMacroFunctionLike>();

  /// 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<Native_clang_Cursor_isMacroBuiltin>>(
          'clang_Cursor_isMacroBuiltin');
  late final _dart_clang_Cursor_isMacroBuiltin _clang_Cursor_isMacroBuiltin =
      _clang_Cursor_isMacroBuiltin_ptr
          .asFunction<_dart_clang_Cursor_isMacroBuiltin>();

  /// 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<Native_clang_Cursor_isFunctionInlined>>(
          'clang_Cursor_isFunctionInlined');
  late final _dart_clang_Cursor_isFunctionInlined
      _clang_Cursor_isFunctionInlined = _clang_Cursor_isFunctionInlined_ptr
          .asFunction<_dart_clang_Cursor_isFunctionInlined>();

  /// 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<Native_clang_isVolatileQualifiedType>>(
          'clang_isVolatileQualifiedType');
  late final _dart_clang_isVolatileQualifiedType
      _clang_isVolatileQualifiedType = _clang_isVolatileQualifiedType_ptr
          .asFunction<_dart_clang_isVolatileQualifiedType>();

  /// 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<Native_clang_isRestrictQualifiedType>>(
          'clang_isRestrictQualifiedType');
  late final _dart_clang_isRestrictQualifiedType
      _clang_isRestrictQualifiedType = _clang_isRestrictQualifiedType_ptr
          .asFunction<_dart_clang_isRestrictQualifiedType>();

  /// 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<Native_clang_getAddressSpace>>(
          'clang_getAddressSpace');
  late final _dart_clang_getAddressSpace _clang_getAddressSpace =
      _clang_getAddressSpace_ptr.asFunction<_dart_clang_getAddressSpace>();

  /// 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<Native_clang_getTypedefName>>(
          'clang_getTypedefName');
  late final _dart_clang_getTypedefName _clang_getTypedefName =
      _clang_getTypedefName_ptr.asFunction<_dart_clang_getTypedefName>();

  /// 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<Native_clang_getPointeeType>>(
          'clang_getPointeeType');
  late final _dart_clang_getPointeeType _clang_getPointeeType =
      _clang_getPointeeType_ptr.asFunction<_dart_clang_getPointeeType>();

  /// 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<Native_clang_getTypeDeclaration>>(
          'clang_getTypeDeclaration');
  late final _dart_clang_getTypeDeclaration _clang_getTypeDeclaration =
      _clang_getTypeDeclaration_ptr
          .asFunction<_dart_clang_getTypeDeclaration>();

  /// 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<Native_clang_getDeclObjCTypeEncoding>>(
          'clang_getDeclObjCTypeEncoding');
  late final _dart_clang_getDeclObjCTypeEncoding
      _clang_getDeclObjCTypeEncoding = _clang_getDeclObjCTypeEncoding_ptr
          .asFunction<_dart_clang_getDeclObjCTypeEncoding>();

  /// 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<Native_clang_Type_getObjCEncoding>>(
          'clang_Type_getObjCEncoding');
  late final _dart_clang_Type_getObjCEncoding _clang_Type_getObjCEncoding =
      _clang_Type_getObjCEncoding_ptr
          .asFunction<_dart_clang_Type_getObjCEncoding>();

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

  late final _clang_getTypeKindSpelling_ptr =
      _lookup<ffi.NativeFunction<Native_clang_getTypeKindSpelling>>(
          'clang_getTypeKindSpelling');
  late final _dart_clang_getTypeKindSpelling _clang_getTypeKindSpelling =
      _clang_getTypeKindSpelling_ptr
          .asFunction<_dart_clang_getTypeKindSpelling>();

  /// Retrieve the calling convention associated with a function type.
  ///
  /// If a non-function type is passed in, CXCallingConv_Invalid is returned.
  int clang_getFunctionTypeCallingConv(
    CXType T,
  ) {
    return _clang_getFunctionTypeCallingConv(
      T,
    );
  }

  late final _clang_getFunctionTypeCallingConv_ptr =
      _lookup<ffi.NativeFunction<Native_clang_getFunctionTypeCallingConv>>(
          'clang_getFunctionTypeCallingConv');
  late final _dart_clang_getFunctionTypeCallingConv
      _clang_getFunctionTypeCallingConv = _clang_getFunctionTypeCallingConv_ptr
          .asFunction<_dart_clang_getFunctionTypeCallingConv>();

  /// Retrieve the return type associated with a function type.
  ///
  /// If a non-function type is passed in, an invalid type is returned.
  CXType clang_getResultType(
    CXType T,
  ) {
    return _clang_getResultType(
      T,
    );
  }

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

  /// Retrieve the exception specification type associated with a function type.
  /// This is a value of type CXCursor_ExceptionSpecificationKind.
  ///
  /// If a non-function type is passed in, an error code of -1 is returned.
  int clang_getExceptionSpecificationType(
    CXType T,
  ) {
    return _clang_getExceptionSpecificationType(
      T,
    );
  }

  late final _clang_getExceptionSpecificationType_ptr =
      _lookup<ffi.NativeFunction<Native_clang_getExceptionSpecificationType>>(
          'clang_getExceptionSpecificationType');
  late final _dart_clang_getExceptionSpecificationType
      _clang_getExceptionSpecificationType =
      _clang_getExceptionSpecificationType_ptr
          .asFunction<_dart_clang_getExceptionSpecificationType>();

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

  late final _clang_getNumArgTypes_ptr =
      _lookup<ffi.NativeFunction<Native_clang_getNumArgTypes>>(
          'clang_getNumArgTypes');
  late final _dart_clang_getNumArgTypes _clang_getNumArgTypes =
      _clang_getNumArgTypes_ptr.asFunction<_dart_clang_getNumArgTypes>();

  /// Retrieve the type of a parameter of a function type.
  ///
  /// If a non-function type is passed in or the function does not have enough
  /// parameters, an invalid type is returned.
  CXType clang_getArgType(
    CXType T,
    int i,
  ) {
    return _clang_getArgType(
      T,
      i,
    );
  }

  late final _clang_getArgType_ptr =
      _lookup<ffi.NativeFunction<Native_clang_getArgType>>('clang_getArgType');
  late final _dart_clang_getArgType _clang_getArgType =
      _clang_getArgType_ptr.asFunction<_dart_clang_getArgType>();

  /// Retrieves the base type of the ObjCObjectType.
  ///
  /// If the type is not an ObjC object, an invalid type is returned.
  CXType clang_Type_getObjCObjectBaseType(
    CXType T,
  ) {
    return _clang_Type_getObjCObjectBaseType(
      T,
    );
  }

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

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

  late final _clang_Type_getNumObjCProtocolRefs_ptr =
      _lookup<ffi.NativeFunction<Native_clang_Type_getNumObjCProtocolRefs>>(
          'clang_Type_getNumObjCProtocolRefs');
  late final _dart_clang_Type_getNumObjCProtocolRefs
      _clang_Type_getNumObjCProtocolRefs =
      _clang_Type_getNumObjCProtocolRefs_ptr
          .asFunction<_dart_clang_Type_getNumObjCProtocolRefs>();

  /// Retrieve the decl for a protocol reference for an ObjC object/id.
  ///
  /// If the type is not an ObjC object or there are not enough protocol
  /// references, an invalid cursor is returned.
  CXCursor clang_Type_getObjCProtocolDecl(
    CXType T,
    int i,
  ) {
    return _clang_Type_getObjCProtocolDecl(
      T,
      i,
    );
  }

  late final _clang_Type_getObjCProtocolDecl_ptr =
      _lookup<ffi.NativeFunction<Native_clang_Type_getObjCProtocolDecl>>(
          'clang_Type_getObjCProtocolDecl');
  late final _dart_clang_Type_getObjCProtocolDecl
      _clang_Type_getObjCProtocolDecl = _clang_Type_getObjCProtocolDecl_ptr
          .asFunction<_dart_clang_Type_getObjCProtocolDecl>();

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

  late final _clang_Type_getNumObjCTypeArgs_ptr =
      _lookup<ffi.NativeFunction<Native_clang_Type_getNumObjCTypeArgs>>(
          'clang_Type_getNumObjCTypeArgs');
  late final _dart_clang_Type_getNumObjCTypeArgs
      _clang_Type_getNumObjCTypeArgs = _clang_Type_getNumObjCTypeArgs_ptr
          .asFunction<_dart_clang_Type_getNumObjCTypeArgs>();

  /// Retrieve a type argument associated with an ObjC object.
  ///
  /// If the type is not an ObjC or the index is not valid,
  /// an invalid type is returned.
  CXType clang_Type_getObjCTypeArg(
    CXType T,
    int i,
  ) {
    return _clang_Type_getObjCTypeArg(
      T,
      i,
    );
  }

  late final _clang_Type_getObjCTypeArg_ptr =
      _lookup<ffi.NativeFunction<Native_clang_Type_getObjCTypeArg>>(
          'clang_Type_getObjCTypeArg');
  late final _dart_clang_Type_getObjCTypeArg _clang_Type_getObjCTypeArg =
      _clang_Type_getObjCTypeArg_ptr
          .asFunction<_dart_clang_Type_getObjCTypeArg>();

  /// 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<Native_clang_isFunctionTypeVariadic>>(
          'clang_isFunctionTypeVariadic');
  late final _dart_clang_isFunctionTypeVariadic _clang_isFunctionTypeVariadic =
      _clang_isFunctionTypeVariadic_ptr
          .asFunction<_dart_clang_isFunctionTypeVariadic>();

  /// Retrieve the return type associated with a given cursor.
  ///
  /// This only returns a valid type if the cursor refers to a function or method.
  CXType clang_getCursorResultType(
    CXCursor C,
  ) {
    return _clang_getCursorResultType(
      C,
    );
  }

  late final _clang_getCursorResultType_ptr =
      _lookup<ffi.NativeFunction<Native_clang_getCursorResultType>>(
          'clang_getCursorResultType');
  late final _dart_clang_getCursorResultType _clang_getCursorResultType =
      _clang_getCursorResultType_ptr
          .asFunction<_dart_clang_getCursorResultType>();

  /// Retrieve the exception specification type associated with a given cursor.
  /// This is a value of type CXCursor_ExceptionSpecificationKind.
  ///
  /// This only returns a valid result if the cursor refers to a function or method.
  int clang_getCursorExceptionSpecificationType(
    CXCursor C,
  ) {
    return _clang_getCursorExceptionSpecificationType(
      C,
    );
  }

  late final _clang_getCursorExceptionSpecificationType_ptr = _lookup<
          ffi.NativeFunction<Native_clang_getCursorExceptionSpecificationType>>(
      'clang_getCursorExceptionSpecificationType');
  late final _dart_clang_getCursorExceptionSpecificationType
      _clang_getCursorExceptionSpecificationType =
      _clang_getCursorExceptionSpecificationType_ptr
          .asFunction<_dart_clang_getCursorExceptionSpecificationType>();

  /// 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<Native_clang_isPODType>>('clang_isPODType');
  late final _dart_clang_isPODType _clang_isPODType =
      _clang_isPODType_ptr.asFunction<_dart_clang_isPODType>();

  /// Return the element type of an array, complex, or vector type.
  ///
  /// If a type is passed in that is not an array, complex, or vector type,
  /// an invalid type is returned.
  CXType clang_getElementType(
    CXType T,
  ) {
    return _clang_getElementType(
      T,
    );
  }

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

  /// Return the number of elements of an array or vector type.
  ///
  /// If a type is passed in that is not an array or vector type,
  /// -1 is returned.
  int clang_getNumElements(
    CXType T,
  ) {
    return _clang_getNumElements(
      T,
    );
  }

  late final _clang_getNumElements_ptr =
      _lookup<ffi.NativeFunction<Native_clang_getNumElements>>(
          'clang_getNumElements');
  late final _dart_clang_getNumElements _clang_getNumElements =
      _clang_getNumElements_ptr.asFunction<_dart_clang_getNumElements>();

  /// Return the element type of an array type.
  ///
  /// If a non-array type is passed in, an invalid type is returned.
  CXType clang_getArrayElementType(
    CXType T,
  ) {
    return _clang_getArrayElementType(
      T,
    );
  }

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

  /// Return the array size of a constant array.
  ///
  /// If a non-array type is passed in, -1 is returned.
  int clang_getArraySize(
    CXType T,
  ) {
    return _clang_getArraySize(
      T,
    );
  }

  late final _clang_getArraySize_ptr =
      _lookup<ffi.NativeFunction<Native_clang_getArraySize>>(
          'clang_getArraySize');
  late final _dart_clang_getArraySize _clang_getArraySize =
      _clang_getArraySize_ptr.asFunction<_dart_clang_getArraySize>();

  /// Retrieve the type named by the qualified-id.
  ///
  /// If a non-elaborated type is passed in, an invalid type is returned.
  CXType clang_Type_getNamedType(
    CXType T,
  ) {
    return _clang_Type_getNamedType(
      T,
    );
  }

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

  /// Determine if a typedef is 'transparent' tag.
  ///
  /// A typedef is considered 'transparent' if it shares a name and spelling
  /// location with its underlying tag type, as is the case with the NS_ENUM macro.
  ///
  /// \returns non-zero if transparent and zero otherwise.
  int clang_Type_isTransparentTagTypedef(
    CXType T,
  ) {
    return _clang_Type_isTransparentTagTypedef(
      T,
    );
  }

  late final _clang_Type_isTransparentTagTypedef_ptr =
      _lookup<ffi.NativeFunction<Native_clang_Type_isTransparentTagTypedef>>(
          'clang_Type_isTransparentTagTypedef');
  late final _dart_clang_Type_isTransparentTagTypedef
      _clang_Type_isTransparentTagTypedef =
      _clang_Type_isTransparentTagTypedef_ptr
          .asFunction<_dart_clang_Type_isTransparentTagTypedef>();

  /// 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<Native_clang_Type_getNullability>>(
          'clang_Type_getNullability');
  late final _dart_clang_Type_getNullability _clang_Type_getNullability =
      _clang_Type_getNullability_ptr
          .asFunction<_dart_clang_Type_getNullability>();

  /// Return the alignment of a type in bytes as per C++[expr.alignof]
  /// standard.
  ///
  /// If the type declaration is invalid, CXTypeLayoutError_Invalid is returned.
  /// If the type declaration is an incomplete type, CXTypeLayoutError_Incomplete
  /// is returned.
  /// If the type declaration is a dependent type, CXTypeLayoutError_Dependent is
  /// returned.
  /// If the type declaration is not a constant size type,
  /// CXTypeLayoutError_NotConstantSize is returned.
  int clang_Type_getAlignOf(
    CXType T,
  ) {
    return _clang_Type_getAlignOf(
      T,
    );
  }

  late final _clang_Type_getAlignOf_ptr =
      _lookup<ffi.NativeFunction<Native_clang_Type_getAlignOf>>(
          'clang_Type_getAlignOf');
  late final _dart_clang_Type_getAlignOf _clang_Type_getAlignOf =
      _clang_Type_getAlignOf_ptr.asFunction<_dart_clang_Type_getAlignOf>();

  /// Return the class type of an member pointer type.
  ///
  /// If a non-member-pointer type is passed in, an invalid type is returned.
  CXType clang_Type_getClassType(
    CXType T,
  ) {
    return _clang_Type_getClassType(
      T,
    );
  }

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

  /// Return the size of a type in bytes as per C++[expr.sizeof] standard.
  ///
  /// If the type declaration is invalid, CXTypeLayoutError_Invalid is returned.
  /// If the type declaration is an incomplete type, CXTypeLayoutError_Incomplete
  /// is returned.
  /// If the type declaration is a dependent type, CXTypeLayoutError_Dependent is
  /// returned.
  int clang_Type_getSizeOf(
    CXType T,
  ) {
    return _clang_Type_getSizeOf(
      T,
    );
  }

  late final _clang_Type_getSizeOf_ptr =
      _lookup<ffi.NativeFunction<Native_clang_Type_getSizeOf>>(
          'clang_Type_getSizeOf');
  late final _dart_clang_Type_getSizeOf _clang_Type_getSizeOf =
      _clang_Type_getSizeOf_ptr.asFunction<_dart_clang_Type_getSizeOf>();

  /// Return the offset of a field named S in a record of type T in bits
  /// as it would be returned by __offsetof__ as per C++11[18.2p4]
  ///
  /// If the cursor is not a record field declaration, CXTypeLayoutError_Invalid
  /// is returned.
  /// If the field's type declaration is an incomplete type,
  /// CXTypeLayoutError_Incomplete is returned.
  /// If the field's type declaration is a dependent type,
  /// CXTypeLayoutError_Dependent is returned.
  /// If the field's name S is not found,
  /// CXTypeLayoutError_InvalidFieldName is returned.
  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<Native_clang_Type_getOffsetOf>>(
          'clang_Type_getOffsetOf');
  late final _dart_clang_Type_getOffsetOf _clang_Type_getOffsetOf =
      _clang_Type_getOffsetOf_ptr.asFunction<_dart_clang_Type_getOffsetOf>();

  /// Return the type that was modified by this attributed type.
  ///
  /// If the type is not an attributed type, an invalid type is returned.
  CXType clang_Type_getModifiedType(
    CXType T,
  ) {
    return _clang_Type_getModifiedType(
      T,
    );
  }

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

  /// Return the offset of the field represented by the Cursor.
  ///
  /// If the cursor is not a field declaration, -1 is returned.
  /// If the cursor semantic parent is not a record field declaration,
  /// CXTypeLayoutError_Invalid is returned.
  /// If the field's type declaration is an incomplete type,
  /// CXTypeLayoutError_Incomplete is returned.
  /// If the field's type declaration is a dependent type,
  /// CXTypeLayoutError_Dependent is returned.
  /// If the field's name S is not found,
  /// CXTypeLayoutError_InvalidFieldName is returned.
  int clang_Cursor_getOffsetOfField(
    CXCursor C,
  ) {
    return _clang_Cursor_getOffsetOfField(
      C,
    );
  }

  late final _clang_Cursor_getOffsetOfField_ptr =
      _lookup<ffi.NativeFunction<Native_clang_Cursor_getOffsetOfField>>(
          'clang_Cursor_getOffsetOfField');
  late final _dart_clang_Cursor_getOffsetOfField
      _clang_Cursor_getOffsetOfField = _clang_Cursor_getOffsetOfField_ptr
          .asFunction<_dart_clang_Cursor_getOffsetOfField>();

  /// 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<Native_clang_Cursor_isAnonymous>>(
          'clang_Cursor_isAnonymous');
  late final _dart_clang_Cursor_isAnonymous _clang_Cursor_isAnonymous =
      _clang_Cursor_isAnonymous_ptr
          .asFunction<_dart_clang_Cursor_isAnonymous>();

  /// 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<Native_clang_Cursor_isAnonymousRecordDecl>>(
          'clang_Cursor_isAnonymousRecordDecl');
  late final _dart_clang_Cursor_isAnonymousRecordDecl
      _clang_Cursor_isAnonymousRecordDecl =
      _clang_Cursor_isAnonymousRecordDecl_ptr
          .asFunction<_dart_clang_Cursor_isAnonymousRecordDecl>();

  /// 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<Native_clang_Cursor_isInlineNamespace>>(
          'clang_Cursor_isInlineNamespace');
  late final _dart_clang_Cursor_isInlineNamespace
      _clang_Cursor_isInlineNamespace = _clang_Cursor_isInlineNamespace_ptr
          .asFunction<_dart_clang_Cursor_isInlineNamespace>();

  /// Returns the number of template arguments for given template
  /// specialization, or -1 if type \c 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<Native_clang_Type_getNumTemplateArguments>>(
          'clang_Type_getNumTemplateArguments');
  late final _dart_clang_Type_getNumTemplateArguments
      _clang_Type_getNumTemplateArguments =
      _clang_Type_getNumTemplateArguments_ptr
          .asFunction<_dart_clang_Type_getNumTemplateArguments>();

  /// Returns the type template argument of a template class specialization
  /// at given index.
  ///
  /// This function only returns template type arguments and does not handle
  /// template template arguments or variadic packs.
  CXType clang_Type_getTemplateArgumentAsType(
    CXType T,
    int i,
  ) {
    return _clang_Type_getTemplateArgumentAsType(
      T,
      i,
    );
  }

  late final _clang_Type_getTemplateArgumentAsType_ptr =
      _lookup<ffi.NativeFunction<Native_clang_Type_getTemplateArgumentAsType>>(
          'clang_Type_getTemplateArgumentAsType');
  late final _dart_clang_Type_getTemplateArgumentAsType
      _clang_Type_getTemplateArgumentAsType =
      _clang_Type_getTemplateArgumentAsType_ptr
          .asFunction<_dart_clang_Type_getTemplateArgumentAsType>();

  /// Retrieve the ref-qualifier kind of a function or method.
  ///
  /// The ref-qualifier is returned for C++ functions or methods. For other types
  /// or non-C++ declarations, CXRefQualifier_None is returned.
  int clang_Type_getCXXRefQualifier(
    CXType T,
  ) {
    return _clang_Type_getCXXRefQualifier(
      T,
    );
  }

  late final _clang_Type_getCXXRefQualifier_ptr =
      _lookup<ffi.NativeFunction<Native_clang_Type_getCXXRefQualifier>>(
          'clang_Type_getCXXRefQualifier');
  late final _dart_clang_Type_getCXXRefQualifier
      _clang_Type_getCXXRefQualifier = _clang_Type_getCXXRefQualifier_ptr
          .asFunction<_dart_clang_Type_getCXXRefQualifier>();

  /// 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<Native_clang_Cursor_isBitField>>(
          'clang_Cursor_isBitField');
  late final _dart_clang_Cursor_isBitField _clang_Cursor_isBitField =
      _clang_Cursor_isBitField_ptr.asFunction<_dart_clang_Cursor_isBitField>();

  /// 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<Native_clang_isVirtualBase>>(
          'clang_isVirtualBase');
  late final _dart_clang_isVirtualBase _clang_isVirtualBase =
      _clang_isVirtualBase_ptr.asFunction<_dart_clang_isVirtualBase>();

  /// Returns the access control level for the referenced object.
  ///
  /// If the cursor refers to a C++ declaration, its access control level within its
  /// parent scope is returned. Otherwise, if the cursor refers to a base specifier or
  /// access specifier, the specifier itself is returned.
  int clang_getCXXAccessSpecifier(
    CXCursor arg0,
  ) {
    return _clang_getCXXAccessSpecifier(
      arg0,
    );
  }

  late final _clang_getCXXAccessSpecifier_ptr =
      _lookup<ffi.NativeFunction<Native_clang_getCXXAccessSpecifier>>(
          'clang_getCXXAccessSpecifier');
  late final _dart_clang_getCXXAccessSpecifier _clang_getCXXAccessSpecifier =
      _clang_getCXXAccessSpecifier_ptr
          .asFunction<_dart_clang_getCXXAccessSpecifier>();

  /// Returns the storage class for a function or variable declaration.
  ///
  /// If the passed in Cursor is not a function or variable declaration,
  /// CX_SC_Invalid is returned else the storage class.
  int clang_Cursor_getStorageClass(
    CXCursor arg0,
  ) {
    return _clang_Cursor_getStorageClass(
      arg0,
    );
  }

  late final _clang_Cursor_getStorageClass_ptr =
      _lookup<ffi.NativeFunction<Native_clang_Cursor_getStorageClass>>(
          'clang_Cursor_getStorageClass');
  late final _dart_clang_Cursor_getStorageClass _clang_Cursor_getStorageClass =
      _clang_Cursor_getStorageClass_ptr
          .asFunction<_dart_clang_Cursor_getStorageClass>();

  /// Determine the number of overloaded declarations referenced by a
  /// \c CXCursor_OverloadedDeclRef cursor.
  ///
  /// \param cursor The cursor whose overloaded declarations are being queried.
  ///
  /// \returns The number of overloaded declarations referenced by \c cursor. If it
  /// is not a \c CXCursor_OverloadedDeclRef cursor, returns 0.
  int clang_getNumOverloadedDecls(
    CXCursor cursor,
  ) {
    return _clang_getNumOverloadedDecls(
      cursor,
    );
  }

  late final _clang_getNumOverloadedDecls_ptr =
      _lookup<ffi.NativeFunction<Native_clang_getNumOverloadedDecls>>(
          'clang_getNumOverloadedDecls');
  late final _dart_clang_getNumOverloadedDecls _clang_getNumOverloadedDecls =
      _clang_getNumOverloadedDecls_ptr
          .asFunction<_dart_clang_getNumOverloadedDecls>();

  /// Retrieve a cursor for one of the overloaded declarations referenced
  /// by a \c CXCursor_OverloadedDeclRef cursor.
  ///
  /// \param cursor The cursor whose overloaded declarations are being queried.
  ///
  /// \param index The zero-based index into the set of overloaded declarations in
  /// the cursor.
  ///
  /// \returns A cursor representing the declaration referenced by the given
  /// \c cursor at the specified \c index. If the cursor does not have an
  /// associated set of overloaded declarations, or if the index is out of bounds,
  /// returns \c clang_getNullCursor();
  CXCursor clang_getOverloadedDecl(
    CXCursor cursor,
    int index,
  ) {
    return _clang_getOverloadedDecl(
      cursor,
      index,
    );
  }

  late final _clang_getOverloadedDecl_ptr =
      _lookup<ffi.NativeFunction<Native_clang_getOverloadedDecl>>(
          'clang_getOverloadedDecl');
  late final _dart_clang_getOverloadedDecl _clang_getOverloadedDecl =
      _clang_getOverloadedDecl_ptr.asFunction<_dart_clang_getOverloadedDecl>();

  /// 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<Native_clang_getIBOutletCollectionType>>(
          'clang_getIBOutletCollectionType');
  late final _dart_clang_getIBOutletCollectionType
      _clang_getIBOutletCollectionType = _clang_getIBOutletCollectionType_ptr
          .asFunction<_dart_clang_getIBOutletCollectionType>();

  /// Visit the children of a particular cursor.
  ///
  /// This function visits all the direct children of the given cursor,
  /// invoking the given \p visitor function with the cursors of each
  /// visited child. The traversal may be recursive, if the visitor returns
  /// \c CXChildVisit_Recurse. The traversal may also be ended prematurely, if
  /// the visitor returns \c CXChildVisit_Break.
  ///
  /// \param parent the cursor whose child may be visited. All kinds of
  /// cursors can be visited, including invalid cursors (which, by
  /// definition, have no children).
  ///
  /// \param visitor the visitor function that will be invoked for each
  /// child of \p parent.
  ///
  /// \param client_data pointer data supplied by the client, which will
  /// be passed to the visitor each time it is invoked.
  ///
  /// \returns a non-zero value if the traversal was terminated
  /// prematurely by the visitor returning \c CXChildVisit_Break.
  int clang_visitChildren(
    CXCursor parent,
    ffi.Pointer<ffi.NativeFunction<CXCursorVisitor>> visitor,
    ffi.Pointer<ffi.Void> client_data,
  ) {
    return _clang_visitChildren(
      parent,
      visitor,
      client_data,
    );
  }

  late final _clang_visitChildren_ptr =
      _lookup<ffi.NativeFunction<Native_clang_visitChildren>>(
          'clang_visitChildren');
  late final _dart_clang_visitChildren _clang_visitChildren =
      _clang_visitChildren_ptr.asFunction<_dart_clang_visitChildren>();

  /// Retrieve a Unified Symbol Resolution (USR) for the entity referenced
  /// by the given cursor.
  ///
  /// A Unified Symbol Resolution (USR) is a string that identifies a particular
  /// entity (function, class, variable, etc.) within a program. USRs can be
  /// compared across translation units to determine, e.g., when references in
  /// one translation refer to an entity defined in another translation unit.
  CXString clang_getCursorUSR(
    CXCursor arg0,
  ) {
    return _clang_getCursorUSR(
      arg0,
    );
  }

  late final _clang_getCursorUSR_ptr =
      _lookup<ffi.NativeFunction<Native_clang_getCursorUSR>>(
          'clang_getCursorUSR');
  late final _dart_clang_getCursorUSR _clang_getCursorUSR =
      _clang_getCursorUSR_ptr.asFunction<_dart_clang_getCursorUSR>();

  /// 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<Native_clang_constructUSR_ObjCClass>>(
          'clang_constructUSR_ObjCClass');
  late final _dart_clang_constructUSR_ObjCClass _clang_constructUSR_ObjCClass =
      _clang_constructUSR_ObjCClass_ptr
          .asFunction<_dart_clang_constructUSR_ObjCClass>();

  /// 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<Native_clang_constructUSR_ObjCCategory>>(
          'clang_constructUSR_ObjCCategory');
  late final _dart_clang_constructUSR_ObjCCategory
      _clang_constructUSR_ObjCCategory = _clang_constructUSR_ObjCCategory_ptr
          .asFunction<_dart_clang_constructUSR_ObjCCategory>();

  /// 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<Native_clang_constructUSR_ObjCProtocol>>(
          'clang_constructUSR_ObjCProtocol');
  late final _dart_clang_constructUSR_ObjCProtocol
      _clang_constructUSR_ObjCProtocol = _clang_constructUSR_ObjCProtocol_ptr
          .asFunction<_dart_clang_constructUSR_ObjCProtocol>();

  /// 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<Native_clang_constructUSR_ObjCIvar>>(
          'clang_constructUSR_ObjCIvar');
  late final _dart_clang_constructUSR_ObjCIvar _clang_constructUSR_ObjCIvar =
      _clang_constructUSR_ObjCIvar_ptr
          .asFunction<_dart_clang_constructUSR_ObjCIvar>();

  /// 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<Native_clang_constructUSR_ObjCMethod>>(
          'clang_constructUSR_ObjCMethod');
  late final _dart_clang_constructUSR_ObjCMethod
      _clang_constructUSR_ObjCMethod = _clang_constructUSR_ObjCMethod_ptr
          .asFunction<_dart_clang_constructUSR_ObjCMethod>();

  /// 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<Native_clang_constructUSR_ObjCProperty>>(
          'clang_constructUSR_ObjCProperty');
  late final _dart_clang_constructUSR_ObjCProperty
      _clang_constructUSR_ObjCProperty = _clang_constructUSR_ObjCProperty_ptr
          .asFunction<_dart_clang_constructUSR_ObjCProperty>();

  /// 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<Native_clang_getCursorSpelling>>(
          'clang_getCursorSpelling');
  late final _dart_clang_getCursorSpelling _clang_getCursorSpelling =
      _clang_getCursorSpelling_ptr.asFunction<_dart_clang_getCursorSpelling>();

  /// Retrieve a range for a piece that forms the cursors spelling name.
  /// Most of the times there is only one range for the complete spelling but for
  /// Objective-C methods and Objective-C message expressions, there are multiple
  /// pieces for each selector identifier.
  ///
  /// \param pieceIndex the index of the spelling name piece. If this is greater
  /// than the actual number of pieces, it will return a NULL (invalid) range.
  ///
  /// \param options Reserved.
  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<Native_clang_Cursor_getSpellingNameRange>>(
          'clang_Cursor_getSpellingNameRange');
  late final _dart_clang_Cursor_getSpellingNameRange
      _clang_Cursor_getSpellingNameRange =
      _clang_Cursor_getSpellingNameRange_ptr
          .asFunction<_dart_clang_Cursor_getSpellingNameRange>();

  /// Get a property value for the given printing policy.
  int clang_PrintingPolicy_getProperty(
    ffi.Pointer<ffi.Void> Policy,
    int Property,
  ) {
    return _clang_PrintingPolicy_getProperty(
      Policy,
      Property,
    );
  }

  late final _clang_PrintingPolicy_getProperty_ptr =
      _lookup<ffi.NativeFunction<Native_clang_PrintingPolicy_getProperty>>(
          'clang_PrintingPolicy_getProperty');
  late final _dart_clang_PrintingPolicy_getProperty
      _clang_PrintingPolicy_getProperty = _clang_PrintingPolicy_getProperty_ptr
          .asFunction<_dart_clang_PrintingPolicy_getProperty>();

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

  late final _clang_PrintingPolicy_setProperty_ptr =
      _lookup<ffi.NativeFunction<Native_clang_PrintingPolicy_setProperty>>(
          'clang_PrintingPolicy_setProperty');
  late final _dart_clang_PrintingPolicy_setProperty
      _clang_PrintingPolicy_setProperty = _clang_PrintingPolicy_setProperty_ptr
          .asFunction<_dart_clang_PrintingPolicy_setProperty>();

  /// Retrieve the default policy for the cursor.
  ///
  /// The policy should be released after use with \c
  /// clang_PrintingPolicy_dispose.
  ffi.Pointer<ffi.Void> clang_getCursorPrintingPolicy(
    CXCursor arg0,
  ) {
    return _clang_getCursorPrintingPolicy(
      arg0,
    );
  }

  late final _clang_getCursorPrintingPolicy_ptr =
      _lookup<ffi.NativeFunction<Native_clang_getCursorPrintingPolicy>>(
          'clang_getCursorPrintingPolicy');
  late final _dart_clang_getCursorPrintingPolicy
      _clang_getCursorPrintingPolicy = _clang_getCursorPrintingPolicy_ptr
          .asFunction<_dart_clang_getCursorPrintingPolicy>();

  /// Release a printing policy.
  void clang_PrintingPolicy_dispose(
    ffi.Pointer<ffi.Void> Policy,
  ) {
    return _clang_PrintingPolicy_dispose(
      Policy,
    );
  }

  late final _clang_PrintingPolicy_dispose_ptr =
      _lookup<ffi.NativeFunction<Native_clang_PrintingPolicy_dispose>>(
          'clang_PrintingPolicy_dispose');
  late final _dart_clang_PrintingPolicy_dispose _clang_PrintingPolicy_dispose =
      _clang_PrintingPolicy_dispose_ptr
          .asFunction<_dart_clang_PrintingPolicy_dispose>();

  /// Pretty print declarations.
  ///
  /// \param Cursor The cursor representing a declaration.
  ///
  /// \param Policy The policy to control the entities being printed. If
  /// NULL, a default policy is used.
  ///
  /// \returns The pretty printed declaration or the empty string for
  /// other cursors.
  CXString clang_getCursorPrettyPrinted(
    CXCursor Cursor,
    ffi.Pointer<ffi.Void> Policy,
  ) {
    return _clang_getCursorPrettyPrinted(
      Cursor,
      Policy,
    );
  }

  late final _clang_getCursorPrettyPrinted_ptr =
      _lookup<ffi.NativeFunction<Native_clang_getCursorPrettyPrinted>>(
          'clang_getCursorPrettyPrinted');
  late final _dart_clang_getCursorPrettyPrinted _clang_getCursorPrettyPrinted =
      _clang_getCursorPrettyPrinted_ptr
          .asFunction<_dart_clang_getCursorPrettyPrinted>();

  /// Retrieve the display name for the entity referenced by this cursor.
  ///
  /// The display name contains extra information that helps identify the cursor,
  /// such as the parameters of a function or template or the arguments of a
  /// class template specialization.
  CXString clang_getCursorDisplayName(
    CXCursor arg0,
  ) {
    return _clang_getCursorDisplayName(
      arg0,
    );
  }

  late final _clang_getCursorDisplayName_ptr =
      _lookup<ffi.NativeFunction<Native_clang_getCursorDisplayName>>(
          'clang_getCursorDisplayName');
  late final _dart_clang_getCursorDisplayName _clang_getCursorDisplayName =
      _clang_getCursorDisplayName_ptr
          .asFunction<_dart_clang_getCursorDisplayName>();

  /// For a cursor that is a reference, retrieve a cursor representing the
  /// entity that it references.
  ///
  /// Reference cursors refer to other entities in the AST. For example, an
  /// Objective-C superclass reference cursor refers to an Objective-C class.
  /// This function produces the cursor for the Objective-C class from the
  /// cursor for the superclass reference. If the input cursor is a declaration or
  /// definition, it returns that declaration or definition unchanged.
  /// Otherwise, returns the NULL cursor.
  CXCursor clang_getCursorReferenced(
    CXCursor arg0,
  ) {
    return _clang_getCursorReferenced(
      arg0,
    );
  }

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

  /// 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.
  ///
  /// Some entities can be declared multiple times within a translation
  /// unit, but only one of those declarations can also be a
  /// definition. For example, given:
  ///
  /// \code
  /// int f(int, int);
  /// int g(int x, int y) { return f(x, y); }
  /// int f(int a, int b) { return a + b; }
  /// int f(int, int);
  /// \endcode
  ///
  /// there are three declarations of the function "f", but only the
  /// second one is a definition. The clang_getCursorDefinition()
  /// function will take any cursor pointing to a declaration of "f"
  /// (the first or fourth lines of the example) or a cursor referenced
  /// that uses "f" (the call to "f' inside "g") and will return a
  /// declaration cursor pointing to the definition (the second "f"
  /// declaration).
  ///
  /// If given a cursor for which there is no corresponding definition,
  /// e.g., because there is no definition of that entity within this
  /// translation unit, returns a NULL cursor.
  CXCursor clang_getCursorDefinition(
    CXCursor arg0,
  ) {
    return _clang_getCursorDefinition(
      arg0,
    );
  }

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

  /// 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<Native_clang_isCursorDefinition>>(
          'clang_isCursorDefinition');
  late final _dart_clang_isCursorDefinition _clang_isCursorDefinition =
      _clang_isCursorDefinition_ptr
          .asFunction<_dart_clang_isCursorDefinition>();

  /// Retrieve the canonical cursor corresponding to the given cursor.
  ///
  /// In the C family of languages, many kinds of entities can be declared several
  /// times within a single translation unit. For example, a structure type can
  /// be forward-declared (possibly multiple times) and later defined:
  ///
  /// \code
  /// struct X;
  /// struct X;
  /// struct X {
  /// int member;
  /// };
  /// \endcode
  ///
  /// The declarations and the definition of \c X are represented by three
  /// different cursors, all of which are declarations of the same underlying
  /// entity. One of these cursor is considered the "canonical" cursor, which
  /// is effectively the representative for the underlying entity. One can
  /// determine if two cursors are declarations of the same underlying entity by
  /// comparing their canonical cursors.
  ///
  /// \returns The canonical cursor for the entity referred to by the given cursor.
  CXCursor clang_getCanonicalCursor(
    CXCursor arg0,
  ) {
    return _clang_getCanonicalCursor(
      arg0,
    );
  }

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

  /// If the cursor points to a selector identifier in an Objective-C
  /// method or message expression, this returns the selector index.
  ///
  /// After getting a cursor with #clang_getCursor, this can be called to
  /// determine if the location points to a selector identifier.
  ///
  /// \returns The selector index if the cursor is an Objective-C method or message
  /// expression and the cursor is pointing to a selector identifier, or -1
  /// otherwise.
  int clang_Cursor_getObjCSelectorIndex(
    CXCursor arg0,
  ) {
    return _clang_Cursor_getObjCSelectorIndex(
      arg0,
    );
  }

  late final _clang_Cursor_getObjCSelectorIndex_ptr =
      _lookup<ffi.NativeFunction<Native_clang_Cursor_getObjCSelectorIndex>>(
          'clang_Cursor_getObjCSelectorIndex');
  late final _dart_clang_Cursor_getObjCSelectorIndex
      _clang_Cursor_getObjCSelectorIndex =
      _clang_Cursor_getObjCSelectorIndex_ptr
          .asFunction<_dart_clang_Cursor_getObjCSelectorIndex>();

  /// Given a cursor pointing to a C++ method call or an Objective-C
  /// message, returns non-zero if the method/message is "dynamic", meaning:
  ///
  /// For a C++ method: the call is virtual.
  /// For an Objective-C message: the receiver is an object instance, not 'super'
  /// or a specific class.
  ///
  /// If the method/message is "static" or the cursor does not point to a
  /// method/message, it will return zero.
  int clang_Cursor_isDynamicCall(
    CXCursor C,
  ) {
    return _clang_Cursor_isDynamicCall(
      C,
    );
  }

  late final _clang_Cursor_isDynamicCall_ptr =
      _lookup<ffi.NativeFunction<Native_clang_Cursor_isDynamicCall>>(
          'clang_Cursor_isDynamicCall');
  late final _dart_clang_Cursor_isDynamicCall _clang_Cursor_isDynamicCall =
      _clang_Cursor_isDynamicCall_ptr
          .asFunction<_dart_clang_Cursor_isDynamicCall>();

  /// 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<Native_clang_Cursor_getReceiverType>>(
          'clang_Cursor_getReceiverType');
  late final _dart_clang_Cursor_getReceiverType _clang_Cursor_getReceiverType =
      _clang_Cursor_getReceiverType_ptr
          .asFunction<_dart_clang_Cursor_getReceiverType>();

  /// Given a cursor that represents a property declaration, return the
  /// associated property attributes. The bits are formed from
  /// \c CXObjCPropertyAttrKind.
  ///
  /// \param reserved Reserved for future use, pass 0.
  int clang_Cursor_getObjCPropertyAttributes(
    CXCursor C,
    int reserved,
  ) {
    return _clang_Cursor_getObjCPropertyAttributes(
      C,
      reserved,
    );
  }

  late final _clang_Cursor_getObjCPropertyAttributes_ptr = _lookup<
          ffi.NativeFunction<Native_clang_Cursor_getObjCPropertyAttributes>>(
      'clang_Cursor_getObjCPropertyAttributes');
  late final _dart_clang_Cursor_getObjCPropertyAttributes
      _clang_Cursor_getObjCPropertyAttributes =
      _clang_Cursor_getObjCPropertyAttributes_ptr
          .asFunction<_dart_clang_Cursor_getObjCPropertyAttributes>();

  /// 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<Native_clang_Cursor_getObjCPropertyGetterName>>(
      'clang_Cursor_getObjCPropertyGetterName');
  late final _dart_clang_Cursor_getObjCPropertyGetterName
      _clang_Cursor_getObjCPropertyGetterName =
      _clang_Cursor_getObjCPropertyGetterName_ptr
          .asFunction<_dart_clang_Cursor_getObjCPropertyGetterName>();

  /// 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<Native_clang_Cursor_getObjCPropertySetterName>>(
      'clang_Cursor_getObjCPropertySetterName');
  late final _dart_clang_Cursor_getObjCPropertySetterName
      _clang_Cursor_getObjCPropertySetterName =
      _clang_Cursor_getObjCPropertySetterName_ptr
          .asFunction<_dart_clang_Cursor_getObjCPropertySetterName>();

  /// 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<Native_clang_Cursor_getObjCDeclQualifiers>>(
          'clang_Cursor_getObjCDeclQualifiers');
  late final _dart_clang_Cursor_getObjCDeclQualifiers
      _clang_Cursor_getObjCDeclQualifiers =
      _clang_Cursor_getObjCDeclQualifiers_ptr
          .asFunction<_dart_clang_Cursor_getObjCDeclQualifiers>();

  /// 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<Native_clang_Cursor_isObjCOptional>>(
          'clang_Cursor_isObjCOptional');
  late final _dart_clang_Cursor_isObjCOptional _clang_Cursor_isObjCOptional =
      _clang_Cursor_isObjCOptional_ptr
          .asFunction<_dart_clang_Cursor_isObjCOptional>();

  /// 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<Native_clang_Cursor_isVariadic>>(
          'clang_Cursor_isVariadic');
  late final _dart_clang_Cursor_isVariadic _clang_Cursor_isVariadic =
      _clang_Cursor_isVariadic_ptr.asFunction<_dart_clang_Cursor_isVariadic>();

  /// Returns non-zero if the given cursor points to a symbol marked with
  /// external_source_symbol attribute.
  ///
  /// \param language If non-NULL, and the attribute is present, will be set to
  /// the 'language' string from the attribute.
  ///
  /// \param definedIn If non-NULL, and the attribute is present, will be set to
  /// the 'definedIn' string from the attribute.
  ///
  /// \param isGenerated If non-NULL, and the attribute is present, will be set to
  /// non-zero if the 'generated_declaration' is set in the 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<Native_clang_Cursor_isExternalSymbol>>(
          'clang_Cursor_isExternalSymbol');
  late final _dart_clang_Cursor_isExternalSymbol
      _clang_Cursor_isExternalSymbol = _clang_Cursor_isExternalSymbol_ptr
          .asFunction<_dart_clang_Cursor_isExternalSymbol>();

  /// 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<Native_clang_Cursor_getCommentRange>>(
          'clang_Cursor_getCommentRange');
  late final _dart_clang_Cursor_getCommentRange _clang_Cursor_getCommentRange =
      _clang_Cursor_getCommentRange_ptr
          .asFunction<_dart_clang_Cursor_getCommentRange>();

  /// 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<Native_clang_Cursor_getRawCommentText>>(
          'clang_Cursor_getRawCommentText');
  late final _dart_clang_Cursor_getRawCommentText
      _clang_Cursor_getRawCommentText = _clang_Cursor_getRawCommentText_ptr
          .asFunction<_dart_clang_Cursor_getRawCommentText>();

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

  late final _clang_Cursor_getBriefCommentText_ptr =
      _lookup<ffi.NativeFunction<Native_clang_Cursor_getBriefCommentText>>(
          'clang_Cursor_getBriefCommentText');
  late final _dart_clang_Cursor_getBriefCommentText
      _clang_Cursor_getBriefCommentText = _clang_Cursor_getBriefCommentText_ptr
          .asFunction<_dart_clang_Cursor_getBriefCommentText>();

  /// 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<Native_clang_Cursor_getMangling>>(
          'clang_Cursor_getMangling');
  late final _dart_clang_Cursor_getMangling _clang_Cursor_getMangling =
      _clang_Cursor_getMangling_ptr
          .asFunction<_dart_clang_Cursor_getMangling>();

  /// 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<Native_clang_Cursor_getCXXManglings>>(
          'clang_Cursor_getCXXManglings');
  late final _dart_clang_Cursor_getCXXManglings _clang_Cursor_getCXXManglings =
      _clang_Cursor_getCXXManglings_ptr
          .asFunction<_dart_clang_Cursor_getCXXManglings>();

  /// 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<Native_clang_Cursor_getObjCManglings>>(
          'clang_Cursor_getObjCManglings');
  late final _dart_clang_Cursor_getObjCManglings
      _clang_Cursor_getObjCManglings = _clang_Cursor_getObjCManglings_ptr
          .asFunction<_dart_clang_Cursor_getObjCManglings>();

  /// Given a CXCursor_ModuleImportDecl cursor, return the associated module.
  ffi.Pointer<ffi.Void> clang_Cursor_getModule(
    CXCursor C,
  ) {
    return _clang_Cursor_getModule(
      C,
    );
  }

  late final _clang_Cursor_getModule_ptr =
      _lookup<ffi.NativeFunction<Native_clang_Cursor_getModule>>(
          'clang_Cursor_getModule');
  late final _dart_clang_Cursor_getModule _clang_Cursor_getModule =
      _clang_Cursor_getModule_ptr.asFunction<_dart_clang_Cursor_getModule>();

  /// Given a CXFile header file, return the module that contains it, if one
  /// exists.
  ffi.Pointer<ffi.Void> clang_getModuleForFile(
    ffi.Pointer<CXTranslationUnitImpl> arg0,
    ffi.Pointer<ffi.Void> arg1,
  ) {
    return _clang_getModuleForFile(
      arg0,
      arg1,
    );
  }

  late final _clang_getModuleForFile_ptr =
      _lookup<ffi.NativeFunction<Native_clang_getModuleForFile>>(
          'clang_getModuleForFile');
  late final _dart_clang_getModuleForFile _clang_getModuleForFile =
      _clang_getModuleForFile_ptr.asFunction<_dart_clang_getModuleForFile>();

  /// \param Module a module object.
  ///
  /// \returns the module file where the provided module object came from.
  ffi.Pointer<ffi.Void> clang_Module_getASTFile(
    ffi.Pointer<ffi.Void> Module,
  ) {
    return _clang_Module_getASTFile(
      Module,
    );
  }

  late final _clang_Module_getASTFile_ptr =
      _lookup<ffi.NativeFunction<Native_clang_Module_getASTFile>>(
          'clang_Module_getASTFile');
  late final _dart_clang_Module_getASTFile _clang_Module_getASTFile =
      _clang_Module_getASTFile_ptr.asFunction<_dart_clang_Module_getASTFile>();

  /// \param Module a module object.
  ///
  /// \returns the parent of a sub-module or NULL if the given module is top-level,
  /// e.g. for 'std.vector' it will return the 'std' module.
  ffi.Pointer<ffi.Void> clang_Module_getParent(
    ffi.Pointer<ffi.Void> Module,
  ) {
    return _clang_Module_getParent(
      Module,
    );
  }

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

  /// \param Module a module object.
  ///
  /// \returns the name of the module, e.g. for the 'std.vector' sub-module it
  /// will return "vector".
  CXString clang_Module_getName(
    ffi.Pointer<ffi.Void> Module,
  ) {
    return _clang_Module_getName(
      Module,
    );
  }

  late final _clang_Module_getName_ptr =
      _lookup<ffi.NativeFunction<Native_clang_Module_getName>>(
          'clang_Module_getName');
  late final _dart_clang_Module_getName _clang_Module_getName =
      _clang_Module_getName_ptr.asFunction<_dart_clang_Module_getName>();

  /// \param Module a module object.
  ///
  /// \returns the full name of the module, e.g. "std.vector".
  CXString clang_Module_getFullName(
    ffi.Pointer<ffi.Void> Module,
  ) {
    return _clang_Module_getFullName(
      Module,
    );
  }

  late final _clang_Module_getFullName_ptr =
      _lookup<ffi.NativeFunction<Native_clang_Module_getFullName>>(
          'clang_Module_getFullName');
  late final _dart_clang_Module_getFullName _clang_Module_getFullName =
      _clang_Module_getFullName_ptr
          .asFunction<_dart_clang_Module_getFullName>();

  /// \param Module a module object.
  ///
  /// \returns non-zero if the module is a system one.
  int clang_Module_isSystem(
    ffi.Pointer<ffi.Void> Module,
  ) {
    return _clang_Module_isSystem(
      Module,
    );
  }

  late final _clang_Module_isSystem_ptr =
      _lookup<ffi.NativeFunction<Native_clang_Module_isSystem>>(
          'clang_Module_isSystem');
  late final _dart_clang_Module_isSystem _clang_Module_isSystem =
      _clang_Module_isSystem_ptr.asFunction<_dart_clang_Module_isSystem>();

  /// \param Module a module object.
  ///
  /// \returns the number of top level headers associated with this module.
  int clang_Module_getNumTopLevelHeaders(
    ffi.Pointer<CXTranslationUnitImpl> arg0,
    ffi.Pointer<ffi.Void> Module,
  ) {
    return _clang_Module_getNumTopLevelHeaders(
      arg0,
      Module,
    );
  }

  late final _clang_Module_getNumTopLevelHeaders_ptr =
      _lookup<ffi.NativeFunction<Native_clang_Module_getNumTopLevelHeaders>>(
          'clang_Module_getNumTopLevelHeaders');
  late final _dart_clang_Module_getNumTopLevelHeaders
      _clang_Module_getNumTopLevelHeaders =
      _clang_Module_getNumTopLevelHeaders_ptr
          .asFunction<_dart_clang_Module_getNumTopLevelHeaders>();

  /// \param Module a module object.
  ///
  /// \param Index top level header index (zero-based).
  ///
  /// \returns the specified top level header associated with the module.
  ffi.Pointer<ffi.Void> clang_Module_getTopLevelHeader(
    ffi.Pointer<CXTranslationUnitImpl> arg0,
    ffi.Pointer<ffi.Void> Module,
    int Index,
  ) {
    return _clang_Module_getTopLevelHeader(
      arg0,
      Module,
      Index,
    );
  }

  late final _clang_Module_getTopLevelHeader_ptr =
      _lookup<ffi.NativeFunction<Native_clang_Module_getTopLevelHeader>>(
          'clang_Module_getTopLevelHeader');
  late final _dart_clang_Module_getTopLevelHeader
      _clang_Module_getTopLevelHeader = _clang_Module_getTopLevelHeader_ptr
          .asFunction<_dart_clang_Module_getTopLevelHeader>();

  /// 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<
              Native_clang_CXXConstructor_isConvertingConstructor>>(
      'clang_CXXConstructor_isConvertingConstructor');
  late final _dart_clang_CXXConstructor_isConvertingConstructor
      _clang_CXXConstructor_isConvertingConstructor =
      _clang_CXXConstructor_isConvertingConstructor_ptr
          .asFunction<_dart_clang_CXXConstructor_isConvertingConstructor>();

  /// 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<Native_clang_CXXConstructor_isCopyConstructor>>(
      'clang_CXXConstructor_isCopyConstructor');
  late final _dart_clang_CXXConstructor_isCopyConstructor
      _clang_CXXConstructor_isCopyConstructor =
      _clang_CXXConstructor_isCopyConstructor_ptr
          .asFunction<_dart_clang_CXXConstructor_isCopyConstructor>();

  /// 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<Native_clang_CXXConstructor_isDefaultConstructor>>(
      'clang_CXXConstructor_isDefaultConstructor');
  late final _dart_clang_CXXConstructor_isDefaultConstructor
      _clang_CXXConstructor_isDefaultConstructor =
      _clang_CXXConstructor_isDefaultConstructor_ptr
          .asFunction<_dart_clang_CXXConstructor_isDefaultConstructor>();

  /// 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<Native_clang_CXXConstructor_isMoveConstructor>>(
      'clang_CXXConstructor_isMoveConstructor');
  late final _dart_clang_CXXConstructor_isMoveConstructor
      _clang_CXXConstructor_isMoveConstructor =
      _clang_CXXConstructor_isMoveConstructor_ptr
          .asFunction<_dart_clang_CXXConstructor_isMoveConstructor>();

  /// 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<Native_clang_CXXField_isMutable>>(
          'clang_CXXField_isMutable');
  late final _dart_clang_CXXField_isMutable _clang_CXXField_isMutable =
      _clang_CXXField_isMutable_ptr
          .asFunction<_dart_clang_CXXField_isMutable>();

  /// 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<Native_clang_CXXMethod_isDefaulted>>(
          'clang_CXXMethod_isDefaulted');
  late final _dart_clang_CXXMethod_isDefaulted _clang_CXXMethod_isDefaulted =
      _clang_CXXMethod_isDefaulted_ptr
          .asFunction<_dart_clang_CXXMethod_isDefaulted>();

  /// 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<Native_clang_CXXMethod_isPureVirtual>>(
          'clang_CXXMethod_isPureVirtual');
  late final _dart_clang_CXXMethod_isPureVirtual
      _clang_CXXMethod_isPureVirtual = _clang_CXXMethod_isPureVirtual_ptr
          .asFunction<_dart_clang_CXXMethod_isPureVirtual>();

  /// 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<Native_clang_CXXMethod_isStatic>>(
          'clang_CXXMethod_isStatic');
  late final _dart_clang_CXXMethod_isStatic _clang_CXXMethod_isStatic =
      _clang_CXXMethod_isStatic_ptr
          .asFunction<_dart_clang_CXXMethod_isStatic>();

  /// 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<Native_clang_CXXMethod_isVirtual>>(
          'clang_CXXMethod_isVirtual');
  late final _dart_clang_CXXMethod_isVirtual _clang_CXXMethod_isVirtual =
      _clang_CXXMethod_isVirtual_ptr
          .asFunction<_dart_clang_CXXMethod_isVirtual>();

  /// 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<Native_clang_CXXRecord_isAbstract>>(
          'clang_CXXRecord_isAbstract');
  late final _dart_clang_CXXRecord_isAbstract _clang_CXXRecord_isAbstract =
      _clang_CXXRecord_isAbstract_ptr
          .asFunction<_dart_clang_CXXRecord_isAbstract>();

  /// 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<Native_clang_EnumDecl_isScoped>>(
          'clang_EnumDecl_isScoped');
  late final _dart_clang_EnumDecl_isScoped _clang_EnumDecl_isScoped =
      _clang_EnumDecl_isScoped_ptr.asFunction<_dart_clang_EnumDecl_isScoped>();

  /// 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<Native_clang_CXXMethod_isConst>>(
          'clang_CXXMethod_isConst');
  late final _dart_clang_CXXMethod_isConst _clang_CXXMethod_isConst =
      _clang_CXXMethod_isConst_ptr.asFunction<_dart_clang_CXXMethod_isConst>();

  /// Given a cursor that represents a template, determine
  /// the cursor kind of the specializations would be generated by instantiating
  /// the template.
  ///
  /// This routine can be used to determine what flavor of function template,
  /// class template, or class template partial specialization is stored in the
  /// cursor. For example, it can describe whether a class template cursor is
  /// declared with "struct", "class" or "union".
  ///
  /// \param C The cursor to query. This cursor should represent a template
  /// declaration.
  ///
  /// \returns The cursor kind of the specializations that would be generated
  /// by instantiating the template \p C. If \p C is not a template, returns
  /// \c CXCursor_NoDeclFound.
  int clang_getTemplateCursorKind(
    CXCursor C,
  ) {
    return _clang_getTemplateCursorKind(
      C,
    );
  }

  late final _clang_getTemplateCursorKind_ptr =
      _lookup<ffi.NativeFunction<Native_clang_getTemplateCursorKind>>(
          'clang_getTemplateCursorKind');
  late final _dart_clang_getTemplateCursorKind _clang_getTemplateCursorKind =
      _clang_getTemplateCursorKind_ptr
          .asFunction<_dart_clang_getTemplateCursorKind>();

  /// 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.
  ///
  /// This routine determines the template involved both for explicit
  /// specializations of templates and for implicit instantiations of the template,
  /// both of which are referred to as "specializations". For a class template
  /// specialization (e.g., \c std::vector<bool>), this routine will return
  /// either the primary template (\c std::vector) or, if the specialization was
  /// instantiated from a class template partial specialization, the class template
  /// partial specialization. For a class template partial specialization and a
  /// function template specialization (including instantiations), this
  /// this routine will return the specialized template.
  ///
  /// For members of a class template (e.g., member functions, member classes, or
  /// static data members), returns the specialized or instantiated member.
  /// Although not strictly "templates" in the C++ language, members of class
  /// templates have the same notions of specializations and instantiations that
  /// templates do, so this routine treats them similarly.
  ///
  /// \param C A cursor that may be a specialization of a template or a member
  /// of a template.
  ///
  /// \returns If the given cursor is a specialization or instantiation of a
  /// template or a member thereof, the template or member that it specializes or
  /// from which it was instantiated. Otherwise, returns a NULL cursor.
  CXCursor clang_getSpecializedCursorTemplate(
    CXCursor C,
  ) {
    return _clang_getSpecializedCursorTemplate(
      C,
    );
  }

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

  /// Given a cursor that references something else, return the source range
  /// covering that reference.
  ///
  /// \param C A cursor pointing to a member reference, a declaration reference, or
  /// an operator call.
  /// \param NameFlags A bitset with three independent flags:
  /// CXNameRange_WantQualifier, CXNameRange_WantTemplateArgs, and
  /// CXNameRange_WantSinglePiece.
  /// \param PieceIndex For contiguous names or when passing the flag
  /// CXNameRange_WantSinglePiece, only one piece with index 0 is
  /// available. When the CXNameRange_WantSinglePiece flag is not passed for a
  /// non-contiguous names, this index can be used to retrieve the individual
  /// pieces of the name. See also CXNameRange_WantSinglePiece.
  ///
  /// \returns The piece of the name pointed to by the given cursor. If there is no
  /// name, or if the PieceIndex is out-of-range, a null-cursor will be returned.
  CXSourceRange clang_getCursorReferenceNameRange(
    CXCursor C,
    int NameFlags,
    int PieceIndex,
  ) {
    return _clang_getCursorReferenceNameRange(
      C,
      NameFlags,
      PieceIndex,
    );
  }

  late final _clang_getCursorReferenceNameRange_ptr =
      _lookup<ffi.NativeFunction<Native_clang_getCursorReferenceNameRange>>(
          'clang_getCursorReferenceNameRange');
  late final _dart_clang_getCursorReferenceNameRange
      _clang_getCursorReferenceNameRange =
      _clang_getCursorReferenceNameRange_ptr
          .asFunction<_dart_clang_getCursorReferenceNameRange>();

  /// Get the raw lexical token starting with the given location.
  ///
  /// \param TU the translation unit whose text is being tokenized.
  ///
  /// \param Location the source location with which the token starts.
  ///
  /// \returns The token starting with the given location or NULL if no such token
  /// exist. The returned pointer must be freed with clang_disposeTokens before the
  /// translation unit is destroyed.
  ffi.Pointer<CXToken> clang_getToken(
    ffi.Pointer<CXTranslationUnitImpl> TU,
    CXSourceLocation Location,
  ) {
    return _clang_getToken(
      TU,
      Location,
    );
  }

  late final _clang_getToken_ptr =
      _lookup<ffi.NativeFunction<Native_clang_getToken>>('clang_getToken');
  late final _dart_clang_getToken _clang_getToken =
      _clang_getToken_ptr.asFunction<_dart_clang_getToken>();

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

  late final _clang_getTokenKind_ptr =
      _lookup<ffi.NativeFunction<Native_clang_getTokenKind>>(
          'clang_getTokenKind');
  late final _dart_clang_getTokenKind _clang_getTokenKind =
      _clang_getTokenKind_ptr.asFunction<_dart_clang_getTokenKind>();

  /// Determine the spelling of the given token.
  ///
  /// The spelling of a token is the textual representation of that token, e.g.,
  /// the text of an identifier or keyword.
  CXString clang_getTokenSpelling(
    ffi.Pointer<CXTranslationUnitImpl> arg0,
    CXToken arg1,
  ) {
    return _clang_getTokenSpelling(
      arg0,
      arg1,
    );
  }

  late final _clang_getTokenSpelling_ptr =
      _lookup<ffi.NativeFunction<Native_clang_getTokenSpelling>>(
          'clang_getTokenSpelling');
  late final _dart_clang_getTokenSpelling _clang_getTokenSpelling =
      _clang_getTokenSpelling_ptr.asFunction<_dart_clang_getTokenSpelling>();

  /// Retrieve the source location of the given token.
  CXSourceLocation clang_getTokenLocation(
    ffi.Pointer<CXTranslationUnitImpl> arg0,
    CXToken arg1,
  ) {
    return _clang_getTokenLocation(
      arg0,
      arg1,
    );
  }

  late final _clang_getTokenLocation_ptr =
      _lookup<ffi.NativeFunction<Native_clang_getTokenLocation>>(
          'clang_getTokenLocation');
  late final _dart_clang_getTokenLocation _clang_getTokenLocation =
      _clang_getTokenLocation_ptr.asFunction<_dart_clang_getTokenLocation>();

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

  late final _clang_getTokenExtent_ptr =
      _lookup<ffi.NativeFunction<Native_clang_getTokenExtent>>(
          'clang_getTokenExtent');
  late final _dart_clang_getTokenExtent _clang_getTokenExtent =
      _clang_getTokenExtent_ptr.asFunction<_dart_clang_getTokenExtent>();

  /// Tokenize the source code described by the given range into raw
  /// lexical tokens.
  ///
  /// \param TU the translation unit whose text is being tokenized.
  ///
  /// \param Range the source range in which text should be tokenized. All of the
  /// tokens produced by tokenization will fall within this source range,
  ///
  /// \param Tokens this pointer will be set to point to the array of tokens
  /// that occur within the given source range. The returned pointer must be
  /// freed with clang_disposeTokens() before the translation unit is destroyed.
  ///
  /// \param NumTokens will be set to the number of tokens in the \c *Tokens
  /// array.
  void clang_tokenize(
    ffi.Pointer<CXTranslationUnitImpl> 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<Native_clang_tokenize>>('clang_tokenize');
  late final _dart_clang_tokenize _clang_tokenize =
      _clang_tokenize_ptr.asFunction<_dart_clang_tokenize>();

  /// Annotate the given set of tokens by providing cursors for each token
  /// that can be mapped to a specific entity within the abstract syntax tree.
  ///
  /// This token-annotation routine is equivalent to invoking
  /// clang_getCursor() for the source locations of each of the
  /// tokens. The cursors provided are filtered, so that only those
  /// cursors that have a direct correspondence to the token are
  /// accepted. For example, given a function call \c f(x),
  /// clang_getCursor() would provide the following cursors:
  ///
  /// * when the cursor is over the 'f', a DeclRefExpr cursor referring to 'f'.
  /// * when the cursor is over the '(' or the ')', a CallExpr referring to 'f'.
  /// * when the cursor is over the 'x', a DeclRefExpr cursor referring to 'x'.
  ///
  /// Only the first and last of these cursors will occur within the
  /// annotate, since the tokens "f" and "x' directly refer to a function
  /// and a variable, respectively, but the parentheses are just a small
  /// part of the full syntax of the function call expression, which is
  /// not provided as an annotation.
  ///
  /// \param TU the translation unit that owns the given tokens.
  ///
  /// \param Tokens the set of tokens to annotate.
  ///
  /// \param NumTokens the number of tokens in \p Tokens.
  ///
  /// \param Cursors an array of \p NumTokens cursors, whose contents will be
  /// replaced with the cursors corresponding to each token.
  void clang_annotateTokens(
    ffi.Pointer<CXTranslationUnitImpl> TU,
    ffi.Pointer<CXToken> Tokens,
    int NumTokens,
    ffi.Pointer<CXCursor> Cursors,
  ) {
    return _clang_annotateTokens(
      TU,
      Tokens,
      NumTokens,
      Cursors,
    );
  }

  late final _clang_annotateTokens_ptr =
      _lookup<ffi.NativeFunction<Native_clang_annotateTokens>>(
          'clang_annotateTokens');
  late final _dart_clang_annotateTokens _clang_annotateTokens =
      _clang_annotateTokens_ptr.asFunction<_dart_clang_annotateTokens>();

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

  late final _clang_disposeTokens_ptr =
      _lookup<ffi.NativeFunction<Native_clang_disposeTokens>>(
          'clang_disposeTokens');
  late final _dart_clang_disposeTokens _clang_disposeTokens =
      _clang_disposeTokens_ptr.asFunction<_dart_clang_disposeTokens>();

  /// \defgroup CINDEX_DEBUG Debugging facilities
  ///
  /// 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<Native_clang_getCursorKindSpelling>>(
          'clang_getCursorKindSpelling');
  late final _dart_clang_getCursorKindSpelling _clang_getCursorKindSpelling =
      _clang_getCursorKindSpelling_ptr
          .asFunction<_dart_clang_getCursorKindSpelling>();

  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<Native_clang_getDefinitionSpellingAndExtent>>(
          'clang_getDefinitionSpellingAndExtent');
  late final _dart_clang_getDefinitionSpellingAndExtent
      _clang_getDefinitionSpellingAndExtent =
      _clang_getDefinitionSpellingAndExtent_ptr
          .asFunction<_dart_clang_getDefinitionSpellingAndExtent>();

  void clang_enableStackTraces() {
    return _clang_enableStackTraces();
  }

  late final _clang_enableStackTraces_ptr =
      _lookup<ffi.NativeFunction<Native_clang_enableStackTraces>>(
          'clang_enableStackTraces');
  late final _dart_clang_enableStackTraces _clang_enableStackTraces =
      _clang_enableStackTraces_ptr.asFunction<_dart_clang_enableStackTraces>();

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

  late final _clang_executeOnThread_ptr =
      _lookup<ffi.NativeFunction<Native_clang_executeOnThread>>(
          'clang_executeOnThread');
  late final _dart_clang_executeOnThread _clang_executeOnThread =
      _clang_executeOnThread_ptr.asFunction<_dart_clang_executeOnThread>();

  /// Determine the kind of a particular chunk within a completion string.
  ///
  /// \param completion_string the completion string to query.
  ///
  /// \param chunk_number the 0-based index of the chunk in the completion string.
  ///
  /// \returns the kind of the chunk at the index \c chunk_number.
  int clang_getCompletionChunkKind(
    ffi.Pointer<ffi.Void> completion_string,
    int chunk_number,
  ) {
    return _clang_getCompletionChunkKind(
      completion_string,
      chunk_number,
    );
  }

  late final _clang_getCompletionChunkKind_ptr =
      _lookup<ffi.NativeFunction<Native_clang_getCompletionChunkKind>>(
          'clang_getCompletionChunkKind');
  late final _dart_clang_getCompletionChunkKind _clang_getCompletionChunkKind =
      _clang_getCompletionChunkKind_ptr
          .asFunction<_dart_clang_getCompletionChunkKind>();

  /// Retrieve the text associated with a particular chunk within a
  /// completion string.
  ///
  /// \param completion_string the completion string to query.
  ///
  /// \param chunk_number the 0-based index of the chunk in the completion string.
  ///
  /// \returns the text associated with the chunk at index \c chunk_number.
  CXString clang_getCompletionChunkText(
    ffi.Pointer<ffi.Void> completion_string,
    int chunk_number,
  ) {
    return _clang_getCompletionChunkText(
      completion_string,
      chunk_number,
    );
  }

  late final _clang_getCompletionChunkText_ptr =
      _lookup<ffi.NativeFunction<Native_clang_getCompletionChunkText>>(
          'clang_getCompletionChunkText');
  late final _dart_clang_getCompletionChunkText _clang_getCompletionChunkText =
      _clang_getCompletionChunkText_ptr
          .asFunction<_dart_clang_getCompletionChunkText>();

  /// Retrieve the completion string associated with a particular chunk
  /// within a completion string.
  ///
  /// \param completion_string the completion string to query.
  ///
  /// \param chunk_number the 0-based index of the chunk in the completion string.
  ///
  /// \returns the completion string associated with the chunk at index
  /// \c chunk_number.
  ffi.Pointer<ffi.Void> clang_getCompletionChunkCompletionString(
    ffi.Pointer<ffi.Void> completion_string,
    int chunk_number,
  ) {
    return _clang_getCompletionChunkCompletionString(
      completion_string,
      chunk_number,
    );
  }

  late final _clang_getCompletionChunkCompletionString_ptr = _lookup<
          ffi.NativeFunction<Native_clang_getCompletionChunkCompletionString>>(
      'clang_getCompletionChunkCompletionString');
  late final _dart_clang_getCompletionChunkCompletionString
      _clang_getCompletionChunkCompletionString =
      _clang_getCompletionChunkCompletionString_ptr
          .asFunction<_dart_clang_getCompletionChunkCompletionString>();

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

  late final _clang_getNumCompletionChunks_ptr =
      _lookup<ffi.NativeFunction<Native_clang_getNumCompletionChunks>>(
          'clang_getNumCompletionChunks');
  late final _dart_clang_getNumCompletionChunks _clang_getNumCompletionChunks =
      _clang_getNumCompletionChunks_ptr
          .asFunction<_dart_clang_getNumCompletionChunks>();

  /// Determine the priority of this code completion.
  ///
  /// The priority of a code completion indicates how likely it is that this
  /// particular completion is the completion that the user will select. The
  /// priority is selected by various internal heuristics.
  ///
  /// \param completion_string The completion string to query.
  ///
  /// \returns The priority of this completion string. Smaller values indicate
  /// higher-priority (more likely) completions.
  int clang_getCompletionPriority(
    ffi.Pointer<ffi.Void> completion_string,
  ) {
    return _clang_getCompletionPriority(
      completion_string,
    );
  }

  late final _clang_getCompletionPriority_ptr =
      _lookup<ffi.NativeFunction<Native_clang_getCompletionPriority>>(
          'clang_getCompletionPriority');
  late final _dart_clang_getCompletionPriority _clang_getCompletionPriority =
      _clang_getCompletionPriority_ptr
          .asFunction<_dart_clang_getCompletionPriority>();

  /// Determine the availability of the entity that this code-completion
  /// string refers to.
  ///
  /// \param completion_string The completion string to query.
  ///
  /// \returns The availability of the completion string.
  int clang_getCompletionAvailability(
    ffi.Pointer<ffi.Void> completion_string,
  ) {
    return _clang_getCompletionAvailability(
      completion_string,
    );
  }

  late final _clang_getCompletionAvailability_ptr =
      _lookup<ffi.NativeFunction<Native_clang_getCompletionAvailability>>(
          'clang_getCompletionAvailability');
  late final _dart_clang_getCompletionAvailability
      _clang_getCompletionAvailability = _clang_getCompletionAvailability_ptr
          .asFunction<_dart_clang_getCompletionAvailability>();

  /// Retrieve the number of annotations associated with the given
  /// completion string.
  ///
  /// \param completion_string the completion string to query.
  ///
  /// \returns the number of annotations associated with the given completion
  /// string.
  int clang_getCompletionNumAnnotations(
    ffi.Pointer<ffi.Void> completion_string,
  ) {
    return _clang_getCompletionNumAnnotations(
      completion_string,
    );
  }

  late final _clang_getCompletionNumAnnotations_ptr =
      _lookup<ffi.NativeFunction<Native_clang_getCompletionNumAnnotations>>(
          'clang_getCompletionNumAnnotations');
  late final _dart_clang_getCompletionNumAnnotations
      _clang_getCompletionNumAnnotations =
      _clang_getCompletionNumAnnotations_ptr
          .asFunction<_dart_clang_getCompletionNumAnnotations>();

  /// Retrieve the annotation associated with the given completion string.
  ///
  /// \param completion_string the completion string to query.
  ///
  /// \param annotation_number the 0-based index of the annotation of the
  /// completion string.
  ///
  /// \returns annotation string associated with the completion at index
  /// \c annotation_number, or a NULL string if that annotation is not available.
  CXString clang_getCompletionAnnotation(
    ffi.Pointer<ffi.Void> completion_string,
    int annotation_number,
  ) {
    return _clang_getCompletionAnnotation(
      completion_string,
      annotation_number,
    );
  }

  late final _clang_getCompletionAnnotation_ptr =
      _lookup<ffi.NativeFunction<Native_clang_getCompletionAnnotation>>(
          'clang_getCompletionAnnotation');
  late final _dart_clang_getCompletionAnnotation
      _clang_getCompletionAnnotation = _clang_getCompletionAnnotation_ptr
          .asFunction<_dart_clang_getCompletionAnnotation>();

  /// Retrieve the parent context of the given completion string.
  ///
  /// The parent context of a completion string is the semantic parent of
  /// the declaration (if any) that the code completion represents. For example,
  /// a code completion for an Objective-C method would have the method's class
  /// or protocol as its context.
  ///
  /// \param completion_string The code completion string whose parent is
  /// being queried.
  ///
  /// \param kind DEPRECATED: always set to CXCursor_NotImplemented if non-NULL.
  ///
  /// \returns The name of the completion parent, e.g., "NSObject" if
  /// the completion string represents a method in the NSObject class.
  CXString clang_getCompletionParent(
    ffi.Pointer<ffi.Void> completion_string,
    ffi.Pointer<ffi.Int32> kind,
  ) {
    return _clang_getCompletionParent(
      completion_string,
      kind,
    );
  }

  late final _clang_getCompletionParent_ptr =
      _lookup<ffi.NativeFunction<Native_clang_getCompletionParent>>(
          'clang_getCompletionParent');
  late final _dart_clang_getCompletionParent _clang_getCompletionParent =
      _clang_getCompletionParent_ptr
          .asFunction<_dart_clang_getCompletionParent>();

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

  late final _clang_getCompletionBriefComment_ptr =
      _lookup<ffi.NativeFunction<Native_clang_getCompletionBriefComment>>(
          'clang_getCompletionBriefComment');
  late final _dart_clang_getCompletionBriefComment
      _clang_getCompletionBriefComment = _clang_getCompletionBriefComment_ptr
          .asFunction<_dart_clang_getCompletionBriefComment>();

  /// Retrieve a completion string for an arbitrary declaration or macro
  /// definition cursor.
  ///
  /// \param cursor The cursor to query.
  ///
  /// \returns A non-context-sensitive completion string for declaration and macro
  /// definition cursors, or NULL for other kinds of cursors.
  ffi.Pointer<ffi.Void> clang_getCursorCompletionString(
    CXCursor cursor,
  ) {
    return _clang_getCursorCompletionString(
      cursor,
    );
  }

  late final _clang_getCursorCompletionString_ptr =
      _lookup<ffi.NativeFunction<Native_clang_getCursorCompletionString>>(
          'clang_getCursorCompletionString');
  late final _dart_clang_getCursorCompletionString
      _clang_getCursorCompletionString = _clang_getCursorCompletionString_ptr
          .asFunction<_dart_clang_getCursorCompletionString>();

  /// Retrieve the number of fix-its for the given completion index.
  ///
  /// Calling this makes sense only if CXCodeComplete_IncludeCompletionsWithFixIts
  /// option was set.
  ///
  /// \param results The structure keeping all completion results
  ///
  /// \param completion_index The index of the completion
  ///
  /// \return The number of fix-its which must be applied before the completion at
  /// completion_index can be applied
  int clang_getCompletionNumFixIts(
    ffi.Pointer<CXCodeCompleteResults> results,
    int completion_index,
  ) {
    return _clang_getCompletionNumFixIts(
      results,
      completion_index,
    );
  }

  late final _clang_getCompletionNumFixIts_ptr =
      _lookup<ffi.NativeFunction<Native_clang_getCompletionNumFixIts>>(
          'clang_getCompletionNumFixIts');
  late final _dart_clang_getCompletionNumFixIts _clang_getCompletionNumFixIts =
      _clang_getCompletionNumFixIts_ptr
          .asFunction<_dart_clang_getCompletionNumFixIts>();

  /// Fix-its that *must* be applied before inserting the text for the
  /// corresponding completion.
  ///
  /// By default, clang_codeCompleteAt() only returns completions with empty
  /// fix-its. Extra completions with non-empty fix-its should be explicitly
  /// requested by setting CXCodeComplete_IncludeCompletionsWithFixIts.
  ///
  /// For the clients to be able to compute position of the cursor after applying
  /// fix-its, the following conditions are guaranteed to hold for
  /// replacement_range of the stored fix-its:
  /// - Ranges in the fix-its are guaranteed to never contain the completion
  /// point (or identifier under completion point, if any) inside them, except
  /// at the start or at the end of the range.
  /// - If a fix-it range starts or ends with completion point (or starts or
  /// ends after the identifier under completion point), it will contain at
  /// least one character. It allows to unambiguously recompute completion
  /// point after applying the fix-it.
  ///
  /// The intuition is that provided fix-its change code around the identifier we
  /// complete, but are not allowed to touch the identifier itself or the
  /// completion point. One example of completions with corrections are the ones
  /// replacing '.' with '->' and vice versa:
  ///
  /// std::unique_ptr<std::vector<int>> vec_ptr;
  /// In 'vec_ptr.^', one of the completions is 'push_back', it requires
  /// replacing '.' with '->'.
  /// In 'vec_ptr->^', one of the completions is 'release', it requires
  /// replacing '->' with '.'.
  ///
  /// \param results The structure keeping all completion results
  ///
  /// \param completion_index The index of the completion
  ///
  /// \param fixit_index The index of the fix-it for the completion at
  /// completion_index
  ///
  /// \param replacement_range The fix-it range that must be replaced before the
  /// completion at completion_index can be applied
  ///
  /// \returns The fix-it string that must replace the code at replacement_range
  /// before the completion at completion_index can be applied
  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<Native_clang_getCompletionFixIt>>(
          'clang_getCompletionFixIt');
  late final _dart_clang_getCompletionFixIt _clang_getCompletionFixIt =
      _clang_getCompletionFixIt_ptr
          .asFunction<_dart_clang_getCompletionFixIt>();

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

  late final _clang_defaultCodeCompleteOptions_ptr =
      _lookup<ffi.NativeFunction<Native_clang_defaultCodeCompleteOptions>>(
          'clang_defaultCodeCompleteOptions');
  late final _dart_clang_defaultCodeCompleteOptions
      _clang_defaultCodeCompleteOptions = _clang_defaultCodeCompleteOptions_ptr
          .asFunction<_dart_clang_defaultCodeCompleteOptions>();

  /// Perform code completion at a given location in a translation unit.
  ///
  /// This function performs code completion at a particular file, line, and
  /// column within source code, providing results that suggest potential
  /// code snippets based on the context of the completion. The basic model
  /// for code completion is that Clang will parse a complete source file,
  /// performing syntax checking up to the location where code-completion has
  /// been requested. At that point, a special code-completion token is passed
  /// to the parser, which recognizes this token and determines, based on the
  /// current location in the C/Objective-C/C++ grammar and the state of
  /// semantic analysis, what completions to provide. These completions are
  /// returned via a new \c CXCodeCompleteResults structure.
  ///
  /// Code completion itself is meant to be triggered by the client when the
  /// user types punctuation characters or whitespace, at which point the
  /// code-completion location will coincide with the cursor. For example, if \c p
  /// is a pointer, code-completion might be triggered after the "-" and then
  /// after the ">" in \c p->. When the code-completion location is after the ">",
  /// the completion results will provide, e.g., the members of the struct that
  /// "p" points to. The client is responsible for placing the cursor at the
  /// beginning of the token currently being typed, then filtering the results
  /// based on the contents of the token. For example, when code-completing for
  /// the expression \c p->get, the client should provide the location just after
  /// the ">" (e.g., pointing at the "g") to this code-completion hook. Then, the
  /// client can filter the results based on the current token text ("get"), only
  /// showing those results that start with "get". The intent of this interface
  /// is to separate the relatively high-latency acquisition of code-completion
  /// results from the filtering of results on a per-character basis, which must
  /// have a lower latency.
  ///
  /// \param TU The translation unit in which code-completion should
  /// occur. The source files for this translation unit need not be
  /// completely up-to-date (and the contents of those source files may
  /// be overridden via \p unsaved_files). Cursors referring into the
  /// translation unit may be invalidated by this invocation.
  ///
  /// \param complete_filename The name of the source file where code
  /// completion should be performed. This filename may be any file
  /// included in the translation unit.
  ///
  /// \param complete_line The line at which code-completion should occur.
  ///
  /// \param complete_column The column at which code-completion should occur.
  /// Note that the column should point just after the syntactic construct that
  /// initiated code completion, and not in the middle of a lexical token.
  ///
  /// \param unsaved_files the Files that have not yet been saved to disk
  /// but may be required for parsing or code completion, including the
  /// contents of those files.  The contents and name of these files (as
  /// specified by CXUnsavedFile) are copied when necessary, so the
  /// client only needs to guarantee their validity until the call to
  /// this function returns.
  ///
  /// \param num_unsaved_files The number of unsaved file entries in \p
  /// unsaved_files.
  ///
  /// \param options Extra options that control the behavior of code
  /// completion, expressed as a bitwise OR of the enumerators of the
  /// CXCodeComplete_Flags enumeration. The
  /// \c clang_defaultCodeCompleteOptions() function returns a default set
  /// of code-completion options.
  ///
  /// \returns If successful, a new \c CXCodeCompleteResults structure
  /// containing code-completion results, which should eventually be
  /// freed with \c clang_disposeCodeCompleteResults(). If code
  /// completion fails, returns NULL.
  ffi.Pointer<CXCodeCompleteResults> clang_codeCompleteAt(
    ffi.Pointer<CXTranslationUnitImpl> TU,
    ffi.Pointer<ffi.Int8> complete_filename,
    int complete_line,
    int complete_column,
    ffi.Pointer<CXUnsavedFile> unsaved_files,
    int num_unsaved_files,
    int options,
  ) {
    return _clang_codeCompleteAt(
      TU,
      complete_filename,
      complete_line,
      complete_column,
      unsaved_files,
      num_unsaved_files,
      options,
    );
  }

  late final _clang_codeCompleteAt_ptr =
      _lookup<ffi.NativeFunction<Native_clang_codeCompleteAt>>(
          'clang_codeCompleteAt');
  late final _dart_clang_codeCompleteAt _clang_codeCompleteAt =
      _clang_codeCompleteAt_ptr.asFunction<_dart_clang_codeCompleteAt>();

  /// Sort the code-completion results in case-insensitive alphabetical
  /// order.
  ///
  /// \param Results The set of results to sort.
  /// \param NumResults The number of results in \p Results.
  void clang_sortCodeCompletionResults(
    ffi.Pointer<CXCompletionResult> Results,
    int NumResults,
  ) {
    return _clang_sortCodeCompletionResults(
      Results,
      NumResults,
    );
  }

  late final _clang_sortCodeCompletionResults_ptr =
      _lookup<ffi.NativeFunction<Native_clang_sortCodeCompletionResults>>(
          'clang_sortCodeCompletionResults');
  late final _dart_clang_sortCodeCompletionResults
      _clang_sortCodeCompletionResults = _clang_sortCodeCompletionResults_ptr
          .asFunction<_dart_clang_sortCodeCompletionResults>();

  /// 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<Native_clang_disposeCodeCompleteResults>>(
          'clang_disposeCodeCompleteResults');
  late final _dart_clang_disposeCodeCompleteResults
      _clang_disposeCodeCompleteResults = _clang_disposeCodeCompleteResults_ptr
          .asFunction<_dart_clang_disposeCodeCompleteResults>();

  /// 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<Native_clang_codeCompleteGetNumDiagnostics>>(
          'clang_codeCompleteGetNumDiagnostics');
  late final _dart_clang_codeCompleteGetNumDiagnostics
      _clang_codeCompleteGetNumDiagnostics =
      _clang_codeCompleteGetNumDiagnostics_ptr
          .asFunction<_dart_clang_codeCompleteGetNumDiagnostics>();

  /// Retrieve a diagnostic associated with the given code completion.
  ///
  /// \param Results the code completion results to query.
  /// \param Index the zero-based diagnostic number to retrieve.
  ///
  /// \returns the requested diagnostic. This diagnostic must be freed
  /// via a call to \c clang_disposeDiagnostic().
  ffi.Pointer<ffi.Void> clang_codeCompleteGetDiagnostic(
    ffi.Pointer<CXCodeCompleteResults> Results,
    int Index,
  ) {
    return _clang_codeCompleteGetDiagnostic(
      Results,
      Index,
    );
  }

  late final _clang_codeCompleteGetDiagnostic_ptr =
      _lookup<ffi.NativeFunction<Native_clang_codeCompleteGetDiagnostic>>(
          'clang_codeCompleteGetDiagnostic');
  late final _dart_clang_codeCompleteGetDiagnostic
      _clang_codeCompleteGetDiagnostic = _clang_codeCompleteGetDiagnostic_ptr
          .asFunction<_dart_clang_codeCompleteGetDiagnostic>();

  /// Determines what completions are appropriate for the context
  /// the given code completion.
  ///
  /// \param Results the code completion results to query
  ///
  /// \returns the kinds of completions that are appropriate for use
  /// along with the given code completion results.
  int clang_codeCompleteGetContexts(
    ffi.Pointer<CXCodeCompleteResults> Results,
  ) {
    return _clang_codeCompleteGetContexts(
      Results,
    );
  }

  late final _clang_codeCompleteGetContexts_ptr =
      _lookup<ffi.NativeFunction<Native_clang_codeCompleteGetContexts>>(
          'clang_codeCompleteGetContexts');
  late final _dart_clang_codeCompleteGetContexts
      _clang_codeCompleteGetContexts = _clang_codeCompleteGetContexts_ptr
          .asFunction<_dart_clang_codeCompleteGetContexts>();

  /// Returns the cursor kind for the container for the current code
  /// completion context. The container is only guaranteed to be set for
  /// contexts where a container exists (i.e. member accesses or Objective-C
  /// message sends); if there is not a container, this function will return
  /// CXCursor_InvalidCode.
  ///
  /// \param Results the code completion results to query
  ///
  /// \param IsIncomplete on return, this value will be false if Clang has complete
  /// information about the container. If Clang does not have complete
  /// information, this value will be true.
  ///
  /// \returns the container kind, or CXCursor_InvalidCode if there is not a
  /// container
  int clang_codeCompleteGetContainerKind(
    ffi.Pointer<CXCodeCompleteResults> Results,
    ffi.Pointer<ffi.Uint32> IsIncomplete,
  ) {
    return _clang_codeCompleteGetContainerKind(
      Results,
      IsIncomplete,
    );
  }

  late final _clang_codeCompleteGetContainerKind_ptr =
      _lookup<ffi.NativeFunction<Native_clang_codeCompleteGetContainerKind>>(
          'clang_codeCompleteGetContainerKind');
  late final _dart_clang_codeCompleteGetContainerKind
      _clang_codeCompleteGetContainerKind =
      _clang_codeCompleteGetContainerKind_ptr
          .asFunction<_dart_clang_codeCompleteGetContainerKind>();

  /// 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.
  ///
  /// \param Results the code completion results to query
  ///
  /// \returns the USR for the container
  CXString clang_codeCompleteGetContainerUSR(
    ffi.Pointer<CXCodeCompleteResults> Results,
  ) {
    return _clang_codeCompleteGetContainerUSR(
      Results,
    );
  }

  late final _clang_codeCompleteGetContainerUSR_ptr =
      _lookup<ffi.NativeFunction<Native_clang_codeCompleteGetContainerUSR>>(
          'clang_codeCompleteGetContainerUSR');
  late final _dart_clang_codeCompleteGetContainerUSR
      _clang_codeCompleteGetContainerUSR =
      _clang_codeCompleteGetContainerUSR_ptr
          .asFunction<_dart_clang_codeCompleteGetContainerUSR>();

  /// 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.
  ///
  /// \param Results the code completion results to query
  ///
  /// \returns the selector (or partial selector) that has been entered thus far
  /// for an Objective-C message send.
  CXString clang_codeCompleteGetObjCSelector(
    ffi.Pointer<CXCodeCompleteResults> Results,
  ) {
    return _clang_codeCompleteGetObjCSelector(
      Results,
    );
  }

  late final _clang_codeCompleteGetObjCSelector_ptr =
      _lookup<ffi.NativeFunction<Native_clang_codeCompleteGetObjCSelector>>(
          'clang_codeCompleteGetObjCSelector');
  late final _dart_clang_codeCompleteGetObjCSelector
      _clang_codeCompleteGetObjCSelector =
      _clang_codeCompleteGetObjCSelector_ptr
          .asFunction<_dart_clang_codeCompleteGetObjCSelector>();

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

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

  /// Enable/disable crash recovery.
  ///
  /// \param isEnabled Flag to indicate if crash recovery is enabled.  A non-zero
  /// value enables crash recovery, while 0 disables it.
  void clang_toggleCrashRecovery(
    int isEnabled,
  ) {
    return _clang_toggleCrashRecovery(
      isEnabled,
    );
  }

  late final _clang_toggleCrashRecovery_ptr =
      _lookup<ffi.NativeFunction<Native_clang_toggleCrashRecovery>>(
          'clang_toggleCrashRecovery');
  late final _dart_clang_toggleCrashRecovery _clang_toggleCrashRecovery =
      _clang_toggleCrashRecovery_ptr
          .asFunction<_dart_clang_toggleCrashRecovery>();

  /// Visit the set of preprocessor inclusions in a translation unit.
  /// The visitor function is called with the provided data for every included
  /// file.  This does not include headers included by the PCH file (unless one
  /// is inspecting the inclusions in the PCH file itself).
  void clang_getInclusions(
    ffi.Pointer<CXTranslationUnitImpl> tu,
    ffi.Pointer<ffi.NativeFunction<CXInclusionVisitor>> visitor,
    ffi.Pointer<ffi.Void> client_data,
  ) {
    return _clang_getInclusions(
      tu,
      visitor,
      client_data,
    );
  }

  late final _clang_getInclusions_ptr =
      _lookup<ffi.NativeFunction<Native_clang_getInclusions>>(
          'clang_getInclusions');
  late final _dart_clang_getInclusions _clang_getInclusions =
      _clang_getInclusions_ptr.asFunction<_dart_clang_getInclusions>();

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

  late final _clang_Cursor_Evaluate_ptr =
      _lookup<ffi.NativeFunction<Native_clang_Cursor_Evaluate>>(
          'clang_Cursor_Evaluate');
  late final _dart_clang_Cursor_Evaluate _clang_Cursor_Evaluate =
      _clang_Cursor_Evaluate_ptr.asFunction<_dart_clang_Cursor_Evaluate>();

  /// Returns the kind of the evaluated result.
  int clang_EvalResult_getKind(
    ffi.Pointer<ffi.Void> E,
  ) {
    return _clang_EvalResult_getKind(
      E,
    );
  }

  late final _clang_EvalResult_getKind_ptr =
      _lookup<ffi.NativeFunction<Native_clang_EvalResult_getKind>>(
          'clang_EvalResult_getKind');
  late final _dart_clang_EvalResult_getKind _clang_EvalResult_getKind =
      _clang_EvalResult_getKind_ptr
          .asFunction<_dart_clang_EvalResult_getKind>();

  /// Returns the evaluation result as integer if the
  /// kind is Int.
  int clang_EvalResult_getAsInt(
    ffi.Pointer<ffi.Void> E,
  ) {
    return _clang_EvalResult_getAsInt(
      E,
    );
  }

  late final _clang_EvalResult_getAsInt_ptr =
      _lookup<ffi.NativeFunction<Native_clang_EvalResult_getAsInt>>(
          'clang_EvalResult_getAsInt');
  late final _dart_clang_EvalResult_getAsInt _clang_EvalResult_getAsInt =
      _clang_EvalResult_getAsInt_ptr
          .asFunction<_dart_clang_EvalResult_getAsInt>();

  /// Returns the evaluation result as a long long integer if the
  /// kind is Int. This prevents overflows that may happen if the result is
  /// returned with clang_EvalResult_getAsInt.
  int clang_EvalResult_getAsLongLong(
    ffi.Pointer<ffi.Void> E,
  ) {
    return _clang_EvalResult_getAsLongLong(
      E,
    );
  }

  late final _clang_EvalResult_getAsLongLong_ptr =
      _lookup<ffi.NativeFunction<Native_clang_EvalResult_getAsLongLong>>(
          'clang_EvalResult_getAsLongLong');
  late final _dart_clang_EvalResult_getAsLongLong
      _clang_EvalResult_getAsLongLong = _clang_EvalResult_getAsLongLong_ptr
          .asFunction<_dart_clang_EvalResult_getAsLongLong>();

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

  late final _clang_EvalResult_isUnsignedInt_ptr =
      _lookup<ffi.NativeFunction<Native_clang_EvalResult_isUnsignedInt>>(
          'clang_EvalResult_isUnsignedInt');
  late final _dart_clang_EvalResult_isUnsignedInt
      _clang_EvalResult_isUnsignedInt = _clang_EvalResult_isUnsignedInt_ptr
          .asFunction<_dart_clang_EvalResult_isUnsignedInt>();

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

  late final _clang_EvalResult_getAsUnsigned_ptr =
      _lookup<ffi.NativeFunction<Native_clang_EvalResult_getAsUnsigned>>(
          'clang_EvalResult_getAsUnsigned');
  late final _dart_clang_EvalResult_getAsUnsigned
      _clang_EvalResult_getAsUnsigned = _clang_EvalResult_getAsUnsigned_ptr
          .asFunction<_dart_clang_EvalResult_getAsUnsigned>();

  /// Returns the evaluation result as double if the
  /// kind is double.
  double clang_EvalResult_getAsDouble(
    ffi.Pointer<ffi.Void> E,
  ) {
    return _clang_EvalResult_getAsDouble(
      E,
    );
  }

  late final _clang_EvalResult_getAsDouble_ptr =
      _lookup<ffi.NativeFunction<Native_clang_EvalResult_getAsDouble>>(
          'clang_EvalResult_getAsDouble');
  late final _dart_clang_EvalResult_getAsDouble _clang_EvalResult_getAsDouble =
      _clang_EvalResult_getAsDouble_ptr
          .asFunction<_dart_clang_EvalResult_getAsDouble>();

  /// Returns the evaluation result as a constant string if the
  /// kind is other than Int or float. User must not free this pointer,
  /// instead call clang_EvalResult_dispose on the CXEvalResult returned
  /// by clang_Cursor_Evaluate.
  ffi.Pointer<ffi.Int8> clang_EvalResult_getAsStr(
    ffi.Pointer<ffi.Void> E,
  ) {
    return _clang_EvalResult_getAsStr(
      E,
    );
  }

  late final _clang_EvalResult_getAsStr_ptr =
      _lookup<ffi.NativeFunction<Native_clang_EvalResult_getAsStr>>(
          'clang_EvalResult_getAsStr');
  late final _dart_clang_EvalResult_getAsStr _clang_EvalResult_getAsStr =
      _clang_EvalResult_getAsStr_ptr
          .asFunction<_dart_clang_EvalResult_getAsStr>();

  /// Disposes the created Eval memory.
  void clang_EvalResult_dispose(
    ffi.Pointer<ffi.Void> E,
  ) {
    return _clang_EvalResult_dispose(
      E,
    );
  }

  late final _clang_EvalResult_dispose_ptr =
      _lookup<ffi.NativeFunction<Native_clang_EvalResult_dispose>>(
          'clang_EvalResult_dispose');
  late final _dart_clang_EvalResult_dispose _clang_EvalResult_dispose =
      _clang_EvalResult_dispose_ptr
          .asFunction<_dart_clang_EvalResult_dispose>();

  /// Retrieve a remapping.
  ///
  /// \param path the path that contains metadata about remappings.
  ///
  /// \returns the requested remapping. This remapping must be freed
  /// via a call to \c clang_remap_dispose(). Can return NULL if an error occurred.
  ffi.Pointer<ffi.Void> clang_getRemappings(
    ffi.Pointer<ffi.Int8> path,
  ) {
    return _clang_getRemappings(
      path,
    );
  }

  late final _clang_getRemappings_ptr =
      _lookup<ffi.NativeFunction<Native_clang_getRemappings>>(
          'clang_getRemappings');
  late final _dart_clang_getRemappings _clang_getRemappings =
      _clang_getRemappings_ptr.asFunction<_dart_clang_getRemappings>();

  /// Retrieve a remapping.
  ///
  /// \param filePaths pointer to an array of file paths containing remapping info.
  ///
  /// \param numFiles number of file paths.
  ///
  /// \returns the requested remapping. This remapping must be freed
  /// via a call to \c clang_remap_dispose(). Can return NULL if an error occurred.
  ffi.Pointer<ffi.Void> clang_getRemappingsFromFileList(
    ffi.Pointer<ffi.Pointer<ffi.Int8>> filePaths,
    int numFiles,
  ) {
    return _clang_getRemappingsFromFileList(
      filePaths,
      numFiles,
    );
  }

  late final _clang_getRemappingsFromFileList_ptr =
      _lookup<ffi.NativeFunction<Native_clang_getRemappingsFromFileList>>(
          'clang_getRemappingsFromFileList');
  late final _dart_clang_getRemappingsFromFileList
      _clang_getRemappingsFromFileList = _clang_getRemappingsFromFileList_ptr
          .asFunction<_dart_clang_getRemappingsFromFileList>();

  /// Determine the number of remappings.
  int clang_remap_getNumFiles(
    ffi.Pointer<ffi.Void> arg0,
  ) {
    return _clang_remap_getNumFiles(
      arg0,
    );
  }

  late final _clang_remap_getNumFiles_ptr =
      _lookup<ffi.NativeFunction<Native_clang_remap_getNumFiles>>(
          'clang_remap_getNumFiles');
  late final _dart_clang_remap_getNumFiles _clang_remap_getNumFiles =
      _clang_remap_getNumFiles_ptr.asFunction<_dart_clang_remap_getNumFiles>();

  /// Get the original and the associated filename from the remapping.
  ///
  /// \param original If non-NULL, will be set to the original filename.
  ///
  /// \param transformed If non-NULL, will be set to the filename that the original
  /// is associated with.
  void clang_remap_getFilenames(
    ffi.Pointer<ffi.Void> arg0,
    int index,
    ffi.Pointer<CXString> original,
    ffi.Pointer<CXString> transformed,
  ) {
    return _clang_remap_getFilenames(
      arg0,
      index,
      original,
      transformed,
    );
  }

  late final _clang_remap_getFilenames_ptr =
      _lookup<ffi.NativeFunction<Native_clang_remap_getFilenames>>(
          'clang_remap_getFilenames');
  late final _dart_clang_remap_getFilenames _clang_remap_getFilenames =
      _clang_remap_getFilenames_ptr
          .asFunction<_dart_clang_remap_getFilenames>();

  /// Dispose the remapping.
  void clang_remap_dispose(
    ffi.Pointer<ffi.Void> arg0,
  ) {
    return _clang_remap_dispose(
      arg0,
    );
  }

  late final _clang_remap_dispose_ptr =
      _lookup<ffi.NativeFunction<Native_clang_remap_dispose>>(
          'clang_remap_dispose');
  late final _dart_clang_remap_dispose _clang_remap_dispose =
      _clang_remap_dispose_ptr.asFunction<_dart_clang_remap_dispose>();

  /// Find references of a declaration in a specific file.
  ///
  /// \param cursor pointing to a declaration or a reference of one.
  ///
  /// \param file to search for references.
  ///
  /// \param visitor callback that will receive pairs of CXCursor/CXSourceRange for
  /// each reference found.
  /// The CXSourceRange will point inside the file; if the reference is inside
  /// a macro (and not a macro argument) the CXSourceRange will be invalid.
  ///
  /// \returns one of the CXResult enumerators.
  int clang_findReferencesInFile(
    CXCursor cursor,
    ffi.Pointer<ffi.Void> file,
    CXCursorAndRangeVisitor visitor,
  ) {
    return _clang_findReferencesInFile(
      cursor,
      file,
      visitor,
    );
  }

  late final _clang_findReferencesInFile_ptr =
      _lookup<ffi.NativeFunction<Native_clang_findReferencesInFile>>(
          'clang_findReferencesInFile');
  late final _dart_clang_findReferencesInFile _clang_findReferencesInFile =
      _clang_findReferencesInFile_ptr
          .asFunction<_dart_clang_findReferencesInFile>();

  /// Find #import/#include directives in a specific file.
  ///
  /// \param TU translation unit containing the file to query.
  ///
  /// \param file to search for #import/#include directives.
  ///
  /// \param visitor callback that will receive pairs of CXCursor/CXSourceRange for
  /// each directive found.
  ///
  /// \returns one of the CXResult enumerators.
  int clang_findIncludesInFile(
    ffi.Pointer<CXTranslationUnitImpl> TU,
    ffi.Pointer<ffi.Void> file,
    CXCursorAndRangeVisitor visitor,
  ) {
    return _clang_findIncludesInFile(
      TU,
      file,
      visitor,
    );
  }

  late final _clang_findIncludesInFile_ptr =
      _lookup<ffi.NativeFunction<Native_clang_findIncludesInFile>>(
          'clang_findIncludesInFile');
  late final _dart_clang_findIncludesInFile _clang_findIncludesInFile =
      _clang_findIncludesInFile_ptr
          .asFunction<_dart_clang_findIncludesInFile>();

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

  late final _clang_index_isEntityObjCContainerKind_ptr =
      _lookup<ffi.NativeFunction<Native_clang_index_isEntityObjCContainerKind>>(
          'clang_index_isEntityObjCContainerKind');
  late final _dart_clang_index_isEntityObjCContainerKind
      _clang_index_isEntityObjCContainerKind =
      _clang_index_isEntityObjCContainerKind_ptr
          .asFunction<_dart_clang_index_isEntityObjCContainerKind>();

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

  late final _clang_index_getObjCContainerDeclInfo_ptr =
      _lookup<ffi.NativeFunction<Native_clang_index_getObjCContainerDeclInfo>>(
          'clang_index_getObjCContainerDeclInfo');
  late final _dart_clang_index_getObjCContainerDeclInfo
      _clang_index_getObjCContainerDeclInfo =
      _clang_index_getObjCContainerDeclInfo_ptr
          .asFunction<_dart_clang_index_getObjCContainerDeclInfo>();

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

  late final _clang_index_getObjCInterfaceDeclInfo_ptr =
      _lookup<ffi.NativeFunction<Native_clang_index_getObjCInterfaceDeclInfo>>(
          'clang_index_getObjCInterfaceDeclInfo');
  late final _dart_clang_index_getObjCInterfaceDeclInfo
      _clang_index_getObjCInterfaceDeclInfo =
      _clang_index_getObjCInterfaceDeclInfo_ptr
          .asFunction<_dart_clang_index_getObjCInterfaceDeclInfo>();

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

  late final _clang_index_getObjCCategoryDeclInfo_ptr =
      _lookup<ffi.NativeFunction<Native_clang_index_getObjCCategoryDeclInfo>>(
          'clang_index_getObjCCategoryDeclInfo');
  late final _dart_clang_index_getObjCCategoryDeclInfo
      _clang_index_getObjCCategoryDeclInfo =
      _clang_index_getObjCCategoryDeclInfo_ptr
          .asFunction<_dart_clang_index_getObjCCategoryDeclInfo>();

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

  late final _clang_index_getObjCProtocolRefListInfo_ptr = _lookup<
          ffi.NativeFunction<Native_clang_index_getObjCProtocolRefListInfo>>(
      'clang_index_getObjCProtocolRefListInfo');
  late final _dart_clang_index_getObjCProtocolRefListInfo
      _clang_index_getObjCProtocolRefListInfo =
      _clang_index_getObjCProtocolRefListInfo_ptr
          .asFunction<_dart_clang_index_getObjCProtocolRefListInfo>();

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

  late final _clang_index_getObjCPropertyDeclInfo_ptr =
      _lookup<ffi.NativeFunction<Native_clang_index_getObjCPropertyDeclInfo>>(
          'clang_index_getObjCPropertyDeclInfo');
  late final _dart_clang_index_getObjCPropertyDeclInfo
      _clang_index_getObjCPropertyDeclInfo =
      _clang_index_getObjCPropertyDeclInfo_ptr
          .asFunction<_dart_clang_index_getObjCPropertyDeclInfo>();

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

  late final _clang_index_getIBOutletCollectionAttrInfo_ptr = _lookup<
          ffi.NativeFunction<Native_clang_index_getIBOutletCollectionAttrInfo>>(
      'clang_index_getIBOutletCollectionAttrInfo');
  late final _dart_clang_index_getIBOutletCollectionAttrInfo
      _clang_index_getIBOutletCollectionAttrInfo =
      _clang_index_getIBOutletCollectionAttrInfo_ptr
          .asFunction<_dart_clang_index_getIBOutletCollectionAttrInfo>();

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

  late final _clang_index_getCXXClassDeclInfo_ptr =
      _lookup<ffi.NativeFunction<Native_clang_index_getCXXClassDeclInfo>>(
          'clang_index_getCXXClassDeclInfo');
  late final _dart_clang_index_getCXXClassDeclInfo
      _clang_index_getCXXClassDeclInfo = _clang_index_getCXXClassDeclInfo_ptr
          .asFunction<_dart_clang_index_getCXXClassDeclInfo>();

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

  late final _clang_index_getClientContainer_ptr =
      _lookup<ffi.NativeFunction<Native_clang_index_getClientContainer>>(
          'clang_index_getClientContainer');
  late final _dart_clang_index_getClientContainer
      _clang_index_getClientContainer = _clang_index_getClientContainer_ptr
          .asFunction<_dart_clang_index_getClientContainer>();

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

  late final _clang_index_setClientContainer_ptr =
      _lookup<ffi.NativeFunction<Native_clang_index_setClientContainer>>(
          'clang_index_setClientContainer');
  late final _dart_clang_index_setClientContainer
      _clang_index_setClientContainer = _clang_index_setClientContainer_ptr
          .asFunction<_dart_clang_index_setClientContainer>();

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

  late final _clang_index_getClientEntity_ptr =
      _lookup<ffi.NativeFunction<Native_clang_index_getClientEntity>>(
          'clang_index_getClientEntity');
  late final _dart_clang_index_getClientEntity _clang_index_getClientEntity =
      _clang_index_getClientEntity_ptr
          .asFunction<_dart_clang_index_getClientEntity>();

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

  late final _clang_index_setClientEntity_ptr =
      _lookup<ffi.NativeFunction<Native_clang_index_setClientEntity>>(
          'clang_index_setClientEntity');
  late final _dart_clang_index_setClientEntity _clang_index_setClientEntity =
      _clang_index_setClientEntity_ptr
          .asFunction<_dart_clang_index_setClientEntity>();

  /// An indexing action/session, to be applied to one or multiple
  /// translation units.
  ///
  /// \param CIdx The index object with which the index action will be associated.
  ffi.Pointer<ffi.Void> clang_IndexAction_create(
    ffi.Pointer<ffi.Void> CIdx,
  ) {
    return _clang_IndexAction_create(
      CIdx,
    );
  }

  late final _clang_IndexAction_create_ptr =
      _lookup<ffi.NativeFunction<Native_clang_IndexAction_create>>(
          'clang_IndexAction_create');
  late final _dart_clang_IndexAction_create _clang_IndexAction_create =
      _clang_IndexAction_create_ptr
          .asFunction<_dart_clang_IndexAction_create>();

  /// Destroy the given index action.
  ///
  /// The index action must not be destroyed until all of the translation units
  /// created within that index action have been destroyed.
  void clang_IndexAction_dispose(
    ffi.Pointer<ffi.Void> arg0,
  ) {
    return _clang_IndexAction_dispose(
      arg0,
    );
  }

  late final _clang_IndexAction_dispose_ptr =
      _lookup<ffi.NativeFunction<Native_clang_IndexAction_dispose>>(
          'clang_IndexAction_dispose');
  late final _dart_clang_IndexAction_dispose _clang_IndexAction_dispose =
      _clang_IndexAction_dispose_ptr
          .asFunction<_dart_clang_IndexAction_dispose>();

  /// Index the given source file and the translation unit corresponding
  /// to that file via callbacks implemented through #IndexerCallbacks.
  ///
  /// \param client_data pointer data supplied by the client, which will
  /// be passed to the invoked callbacks.
  ///
  /// \param index_callbacks Pointer to indexing callbacks that the client
  /// implements.
  ///
  /// \param index_callbacks_size Size of #IndexerCallbacks structure that gets
  /// passed in index_callbacks.
  ///
  /// \param index_options A bitmask of options that affects how indexing is
  /// performed. This should be a bitwise OR of the CXIndexOpt_XXX flags.
  ///
  /// \param[out] out_TU pointer to store a \c CXTranslationUnit that can be
  /// reused after indexing is finished. Set to \c NULL if you do not require it.
  ///
  /// \returns 0 on success or if there were errors from which the compiler could
  /// recover.  If there is a failure from which there is no recovery, returns
  /// a non-zero \c CXErrorCode.
  ///
  /// The rest of the parameters are the same as #clang_parseTranslationUnit.
  int clang_indexSourceFile(
    ffi.Pointer<ffi.Void> arg0,
    ffi.Pointer<ffi.Void> client_data,
    ffi.Pointer<IndexerCallbacks> index_callbacks,
    int index_callbacks_size,
    int index_options,
    ffi.Pointer<ffi.Int8> source_filename,
    ffi.Pointer<ffi.Pointer<ffi.Int8>> command_line_args,
    int num_command_line_args,
    ffi.Pointer<CXUnsavedFile> unsaved_files,
    int num_unsaved_files,
    ffi.Pointer<ffi.Pointer<CXTranslationUnitImpl>> out_TU,
    int TU_options,
  ) {
    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<Native_clang_indexSourceFile>>(
          'clang_indexSourceFile');
  late final _dart_clang_indexSourceFile _clang_indexSourceFile =
      _clang_indexSourceFile_ptr.asFunction<_dart_clang_indexSourceFile>();

  /// Same as clang_indexSourceFile but requires a full command line
  /// for \c command_line_args including argv[0]. This is useful if the standard
  /// library paths are relative to the binary.
  int clang_indexSourceFileFullArgv(
    ffi.Pointer<ffi.Void> arg0,
    ffi.Pointer<ffi.Void> client_data,
    ffi.Pointer<IndexerCallbacks> index_callbacks,
    int index_callbacks_size,
    int index_options,
    ffi.Pointer<ffi.Int8> source_filename,
    ffi.Pointer<ffi.Pointer<ffi.Int8>> command_line_args,
    int num_command_line_args,
    ffi.Pointer<CXUnsavedFile> unsaved_files,
    int num_unsaved_files,
    ffi.Pointer<ffi.Pointer<CXTranslationUnitImpl>> out_TU,
    int TU_options,
  ) {
    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<Native_clang_indexSourceFileFullArgv>>(
          'clang_indexSourceFileFullArgv');
  late final _dart_clang_indexSourceFileFullArgv
      _clang_indexSourceFileFullArgv = _clang_indexSourceFileFullArgv_ptr
          .asFunction<_dart_clang_indexSourceFileFullArgv>();

  /// Index the given translation unit via callbacks implemented through
  /// #IndexerCallbacks.
  ///
  /// The order of callback invocations is not guaranteed to be the same as
  /// when indexing a source file. The high level order will be:
  ///
  /// -Preprocessor callbacks invocations
  /// -Declaration/reference callbacks invocations
  /// -Diagnostic callback invocations
  ///
  /// The parameters are the same as #clang_indexSourceFile.
  ///
  /// \returns If there is a failure from which there is no recovery, returns
  /// non-zero, otherwise returns 0.
  int clang_indexTranslationUnit(
    ffi.Pointer<ffi.Void> arg0,
    ffi.Pointer<ffi.Void> client_data,
    ffi.Pointer<IndexerCallbacks> index_callbacks,
    int index_callbacks_size,
    int index_options,
    ffi.Pointer<CXTranslationUnitImpl> arg5,
  ) {
    return _clang_indexTranslationUnit(
      arg0,
      client_data,
      index_callbacks,
      index_callbacks_size,
      index_options,
      arg5,
    );
  }

  late final _clang_indexTranslationUnit_ptr =
      _lookup<ffi.NativeFunction<Native_clang_indexTranslationUnit>>(
          'clang_indexTranslationUnit');
  late final _dart_clang_indexTranslationUnit _clang_indexTranslationUnit =
      _clang_indexTranslationUnit_ptr
          .asFunction<_dart_clang_indexTranslationUnit>();

  /// Retrieve the CXIdxFile, file, line, column, and offset represented by
  /// the given CXIdxLoc.
  ///
  /// If the location refers into a macro expansion, retrieves the
  /// location of the macro expansion and if it refers into a macro argument
  /// retrieves the location of the argument.
  void clang_indexLoc_getFileLocation(
    CXIdxLoc loc,
    ffi.Pointer<ffi.Pointer<ffi.Void>> indexFile,
    ffi.Pointer<ffi.Pointer<ffi.Void>> 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<Native_clang_indexLoc_getFileLocation>>(
          'clang_indexLoc_getFileLocation');
  late final _dart_clang_indexLoc_getFileLocation
      _clang_indexLoc_getFileLocation = _clang_indexLoc_getFileLocation_ptr
          .asFunction<_dart_clang_indexLoc_getFileLocation>();

  /// 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<Native_clang_indexLoc_getCXSourceLocation>>(
          'clang_indexLoc_getCXSourceLocation');
  late final _dart_clang_indexLoc_getCXSourceLocation
      _clang_indexLoc_getCXSourceLocation =
      _clang_indexLoc_getCXSourceLocation_ptr
          .asFunction<_dart_clang_indexLoc_getCXSourceLocation>();

  /// Visit the fields of a particular type.
  ///
  /// This function visits all the direct fields of the given cursor,
  /// invoking the given \p visitor function with the cursors of each
  /// visited field. The traversal may be ended prematurely, if
  /// the visitor returns \c CXFieldVisit_Break.
  ///
  /// \param T the record type whose field may be visited.
  ///
  /// \param visitor the visitor function that will be invoked for each
  /// field of \p T.
  ///
  /// \param client_data pointer data supplied by the client, which will
  /// be passed to the visitor each time it is invoked.
  ///
  /// \returns a non-zero value if the traversal was terminated
  /// prematurely by the visitor returning \c CXFieldVisit_Break.
  int clang_Type_visitFields(
    CXType T,
    ffi.Pointer<ffi.NativeFunction<CXFieldVisitor>> visitor,
    ffi.Pointer<ffi.Void> client_data,
  ) {
    return _clang_Type_visitFields(
      T,
      visitor,
      client_data,
    );
  }

  late final _clang_Type_visitFields_ptr =
      _lookup<ffi.NativeFunction<Native_clang_Type_visitFields>>(
          'clang_Type_visitFields');
  late final _dart_clang_Type_visitFields _clang_Type_visitFields =
      _clang_Type_visitFields_ptr.asFunction<_dart_clang_Type_visitFields>();

  late final addresses = _SymbolAddresses(this);
}

class _SymbolAddresses {
  final LibClang _library;
  _SymbolAddresses(this._library);
  ffi.Pointer<ffi.NativeFunction<Native_clang_getCString>>
      get clang_getCString => _library._clang_getCString_ptr;
  ffi.Pointer<ffi.NativeFunction<Native_clang_disposeString>>
      get clang_disposeString => _library._clang_disposeString_ptr;
  ffi.Pointer<ffi.NativeFunction<Native_clang_disposeStringSet>>
      get clang_disposeStringSet => _library._clang_disposeStringSet_ptr;
  ffi.Pointer<ffi.NativeFunction<Native_clang_createIndex>>
      get clang_createIndex => _library._clang_createIndex_ptr;
  ffi.Pointer<ffi.NativeFunction<Native_clang_disposeIndex>>
      get clang_disposeIndex => _library._clang_disposeIndex_ptr;
  ffi.Pointer<ffi.NativeFunction<Native_clang_CXIndex_setGlobalOptions>>
      get clang_CXIndex_setGlobalOptions =>
          _library._clang_CXIndex_setGlobalOptions_ptr;
  ffi.Pointer<ffi.NativeFunction<Native_clang_CXIndex_getGlobalOptions>>
      get clang_CXIndex_getGlobalOptions =>
          _library._clang_CXIndex_getGlobalOptions_ptr;
  ffi.Pointer<
          ffi.NativeFunction<
              Native_clang_CXIndex_setInvocationEmissionPathOption>>
      get clang_CXIndex_setInvocationEmissionPathOption =>
          _library._clang_CXIndex_setInvocationEmissionPathOption_ptr;
  ffi.Pointer<ffi.NativeFunction<Native_clang_getFileName>>
      get clang_getFileName => _library._clang_getFileName_ptr;
  ffi.Pointer<ffi.NativeFunction<Native_clang_getFileTime>>
      get clang_getFileTime => _library._clang_getFileTime_ptr;
  ffi.Pointer<ffi.NativeFunction<Native_clang_getFileUniqueID>>
      get clang_getFileUniqueID => _library._clang_getFileUniqueID_ptr;
  ffi.Pointer<ffi.NativeFunction<Native_clang_isFileMultipleIncludeGuarded>>
      get clang_isFileMultipleIncludeGuarded =>
          _library._clang_isFileMultipleIncludeGuarded_ptr;
  ffi.Pointer<ffi.NativeFunction<Native_clang_getFile>> get clang_getFile =>
      _library._clang_getFile_ptr;
  ffi.Pointer<ffi.NativeFunction<Native_clang_getFileContents>>
      get clang_getFileContents => _library._clang_getFileContents_ptr;
  ffi.Pointer<ffi.NativeFunction<Native_clang_File_isEqual>>
      get clang_File_isEqual => _library._clang_File_isEqual_ptr;
  ffi.Pointer<ffi.NativeFunction<Native_clang_File_tryGetRealPathName>>
      get clang_File_tryGetRealPathName =>
          _library._clang_File_tryGetRealPathName_ptr;
  ffi.Pointer<ffi.NativeFunction<Native_clang_getNullLocation>>
      get clang_getNullLocation => _library._clang_getNullLocation_ptr;
  ffi.Pointer<ffi.NativeFunction<Native_clang_equalLocations>>
      get clang_equalLocations => _library._clang_equalLocations_ptr;
  ffi.Pointer<ffi.NativeFunction<Native_clang_getLocation>>
      get clang_getLocation => _library._clang_getLocation_ptr;
  ffi.Pointer<ffi.NativeFunction<Native_clang_getLocationForOffset>>
      get clang_getLocationForOffset =>
          _library._clang_getLocationForOffset_ptr;
  ffi.Pointer<ffi.NativeFunction<Native_clang_Location_isInSystemHeader>>
      get clang_Location_isInSystemHeader =>
          _library._clang_Location_isInSystemHeader_ptr;
  ffi.Pointer<ffi.NativeFunction<Native_clang_Location_isFromMainFile>>
      get clang_Location_isFromMainFile =>
          _library._clang_Location_isFromMainFile_ptr;
  ffi.Pointer<ffi.NativeFunction<Native_clang_getNullRange>>
      get clang_getNullRange => _library._clang_getNullRange_ptr;
  ffi.Pointer<ffi.NativeFunction<Native_clang_getRange>> get clang_getRange =>
      _library._clang_getRange_ptr;
  ffi.Pointer<ffi.NativeFunction<Native_clang_equalRanges>>
      get clang_equalRanges => _library._clang_equalRanges_ptr;
  ffi.Pointer<ffi.NativeFunction<Native_clang_Range_isNull>>
      get clang_Range_isNull => _library._clang_Range_isNull_ptr;
  ffi.Pointer<ffi.NativeFunction<Native_clang_getExpansionLocation>>
      get clang_getExpansionLocation =>
          _library._clang_getExpansionLocation_ptr;
  ffi.Pointer<ffi.NativeFunction<Native_clang_getPresumedLocation>>
      get clang_getPresumedLocation => _library._clang_getPresumedLocation_ptr;
  ffi.Pointer<ffi.NativeFunction<Native_clang_getInstantiationLocation>>
      get clang_getInstantiationLocation =>
          _library._clang_getInstantiationLocation_ptr;
  ffi.Pointer<ffi.NativeFunction<Native_clang_getSpellingLocation>>
      get clang_getSpellingLocation => _library._clang_getSpellingLocation_ptr;
  ffi.Pointer<ffi.NativeFunction<Native_clang_getFileLocation>>
      get clang_getFileLocation => _library._clang_getFileLocation_ptr;
  ffi.Pointer<ffi.NativeFunction<Native_clang_getRangeStart>>
      get clang_getRangeStart => _library._clang_getRangeStart_ptr;
  ffi.Pointer<ffi.NativeFunction<Native_clang_getRangeEnd>>
      get clang_getRangeEnd => _library._clang_getRangeEnd_ptr;
  ffi.Pointer<ffi.NativeFunction<Native_clang_getSkippedRanges>>
      get clang_getSkippedRanges => _library._clang_getSkippedRanges_ptr;
  ffi.Pointer<ffi.NativeFunction<Native_clang_getAllSkippedRanges>>
      get clang_getAllSkippedRanges => _library._clang_getAllSkippedRanges_ptr;
  ffi.Pointer<ffi.NativeFunction<Native_clang_disposeSourceRangeList>>
      get clang_disposeSourceRangeList =>
          _library._clang_disposeSourceRangeList_ptr;
  ffi.Pointer<ffi.NativeFunction<Native_clang_getNumDiagnosticsInSet>>
      get clang_getNumDiagnosticsInSet =>
          _library._clang_getNumDiagnosticsInSet_ptr;
  ffi.Pointer<ffi.NativeFunction<Native_clang_getDiagnosticInSet>>
      get clang_getDiagnosticInSet => _library._clang_getDiagnosticInSet_ptr;
  ffi.Pointer<ffi.NativeFunction<Native_clang_loadDiagnostics>>
      get clang_loadDiagnostics => _library._clang_loadDiagnostics_ptr;
  ffi.Pointer<ffi.NativeFunction<Native_clang_disposeDiagnosticSet>>
      get clang_disposeDiagnosticSet =>
          _library._clang_disposeDiagnosticSet_ptr;
  ffi.Pointer<ffi.NativeFunction<Native_clang_getChildDiagnostics>>
      get clang_getChildDiagnostics => _library._clang_getChildDiagnostics_ptr;
  ffi.Pointer<ffi.NativeFunction<Native_clang_getNumDiagnostics>>
      get clang_getNumDiagnostics => _library._clang_getNumDiagnostics_ptr;
  ffi.Pointer<ffi.NativeFunction<Native_clang_getDiagnostic>>
      get clang_getDiagnostic => _library._clang_getDiagnostic_ptr;
  ffi.Pointer<ffi.NativeFunction<Native_clang_getDiagnosticSetFromTU>>
      get clang_getDiagnosticSetFromTU =>
          _library._clang_getDiagnosticSetFromTU_ptr;
  ffi.Pointer<ffi.NativeFunction<Native_clang_disposeDiagnostic>>
      get clang_disposeDiagnostic => _library._clang_disposeDiagnostic_ptr;
  ffi.Pointer<ffi.NativeFunction<Native_clang_formatDiagnostic>>
      get clang_formatDiagnostic => _library._clang_formatDiagnostic_ptr;
  ffi.Pointer<ffi.NativeFunction<Native_clang_defaultDiagnosticDisplayOptions>>
      get clang_defaultDiagnosticDisplayOptions =>
          _library._clang_defaultDiagnosticDisplayOptions_ptr;
  ffi.Pointer<ffi.NativeFunction<Native_clang_getDiagnosticSeverity>>
      get clang_getDiagnosticSeverity =>
          _library._clang_getDiagnosticSeverity_ptr;
  ffi.Pointer<ffi.NativeFunction<Native_clang_getDiagnosticLocation>>
      get clang_getDiagnosticLocation =>
          _library._clang_getDiagnosticLocation_ptr;
  ffi.Pointer<ffi.NativeFunction<Native_clang_getDiagnosticSpelling>>
      get clang_getDiagnosticSpelling =>
          _library._clang_getDiagnosticSpelling_ptr;
  ffi.Pointer<ffi.NativeFunction<Native_clang_getDiagnosticOption>>
      get clang_getDiagnosticOption => _library._clang_getDiagnosticOption_ptr;
  ffi.Pointer<ffi.NativeFunction<Native_clang_getDiagnosticCategory>>
      get clang_getDiagnosticCategory =>
          _library._clang_getDiagnosticCategory_ptr;
  ffi.Pointer<ffi.NativeFunction<Native_clang_getDiagnosticCategoryName>>
      get clang_getDiagnosticCategoryName =>
          _library._clang_getDiagnosticCategoryName_ptr;
  ffi.Pointer<ffi.NativeFunction<Native_clang_getDiagnosticCategoryText>>
      get clang_getDiagnosticCategoryText =>
          _library._clang_getDiagnosticCategoryText_ptr;
  ffi.Pointer<ffi.NativeFunction<Native_clang_getDiagnosticNumRanges>>
      get clang_getDiagnosticNumRanges =>
          _library._clang_getDiagnosticNumRanges_ptr;
  ffi.Pointer<ffi.NativeFunction<Native_clang_getDiagnosticRange>>
      get clang_getDiagnosticRange => _library._clang_getDiagnosticRange_ptr;
  ffi.Pointer<ffi.NativeFunction<Native_clang_getDiagnosticNumFixIts>>
      get clang_getDiagnosticNumFixIts =>
          _library._clang_getDiagnosticNumFixIts_ptr;
  ffi.Pointer<ffi.NativeFunction<Native_clang_getDiagnosticFixIt>>
      get clang_getDiagnosticFixIt => _library._clang_getDiagnosticFixIt_ptr;
  ffi.Pointer<ffi.NativeFunction<Native_clang_getTranslationUnitSpelling>>
      get clang_getTranslationUnitSpelling =>
          _library._clang_getTranslationUnitSpelling_ptr;
  ffi.Pointer<
          ffi.NativeFunction<Native_clang_createTranslationUnitFromSourceFile>>
      get clang_createTranslationUnitFromSourceFile =>
          _library._clang_createTranslationUnitFromSourceFile_ptr;
  ffi.Pointer<ffi.NativeFunction<Native_clang_createTranslationUnit>>
      get clang_createTranslationUnit =>
          _library._clang_createTranslationUnit_ptr;
  ffi.Pointer<ffi.NativeFunction<Native_clang_createTranslationUnit2>>
      get clang_createTranslationUnit2 =>
          _library._clang_createTranslationUnit2_ptr;
  ffi.Pointer<
          ffi.NativeFunction<Native_clang_defaultEditingTranslationUnitOptions>>
      get clang_defaultEditingTranslationUnitOptions =>
          _library._clang_defaultEditingTranslationUnitOptions_ptr;
  ffi.Pointer<ffi.NativeFunction<Native_clang_parseTranslationUnit>>
      get clang_parseTranslationUnit =>
          _library._clang_parseTranslationUnit_ptr;
  ffi.Pointer<ffi.NativeFunction<Native_clang_parseTranslationUnit2>>
      get clang_parseTranslationUnit2 =>
          _library._clang_parseTranslationUnit2_ptr;
  ffi.Pointer<ffi.NativeFunction<Native_clang_parseTranslationUnit2FullArgv>>
      get clang_parseTranslationUnit2FullArgv =>
          _library._clang_parseTranslationUnit2FullArgv_ptr;
  ffi.Pointer<ffi.NativeFunction<Native_clang_defaultSaveOptions>>
      get clang_defaultSaveOptions => _library._clang_defaultSaveOptions_ptr;
  ffi.Pointer<ffi.NativeFunction<Native_clang_saveTranslationUnit>>
      get clang_saveTranslationUnit => _library._clang_saveTranslationUnit_ptr;
  ffi.Pointer<ffi.NativeFunction<Native_clang_suspendTranslationUnit>>
      get clang_suspendTranslationUnit =>
          _library._clang_suspendTranslationUnit_ptr;
  ffi.Pointer<ffi.NativeFunction<Native_clang_disposeTranslationUnit>>
      get clang_disposeTranslationUnit =>
          _library._clang_disposeTranslationUnit_ptr;
  ffi.Pointer<ffi.NativeFunction<Native_clang_defaultReparseOptions>>
      get clang_defaultReparseOptions =>
          _library._clang_defaultReparseOptions_ptr;
  ffi.Pointer<ffi.NativeFunction<Native_clang_reparseTranslationUnit>>
      get clang_reparseTranslationUnit =>
          _library._clang_reparseTranslationUnit_ptr;
  ffi.Pointer<ffi.NativeFunction<Native_clang_getTUResourceUsageName>>
      get clang_getTUResourceUsageName =>
          _library._clang_getTUResourceUsageName_ptr;
  ffi.Pointer<ffi.NativeFunction<Native_clang_getCXTUResourceUsage>>
      get clang_getCXTUResourceUsage =>
          _library._clang_getCXTUResourceUsage_ptr;
  ffi.Pointer<ffi.NativeFunction<Native_clang_disposeCXTUResourceUsage>>
      get clang_disposeCXTUResourceUsage =>
          _library._clang_disposeCXTUResourceUsage_ptr;
  ffi.Pointer<ffi.NativeFunction<Native_clang_getTranslationUnitTargetInfo>>
      get clang_getTranslationUnitTargetInfo =>
          _library._clang_getTranslationUnitTargetInfo_ptr;
  ffi.Pointer<ffi.NativeFunction<Native_clang_TargetInfo_dispose>>
      get clang_TargetInfo_dispose => _library._clang_TargetInfo_dispose_ptr;
  ffi.Pointer<ffi.NativeFunction<Native_clang_TargetInfo_getTriple>>
      get clang_TargetInfo_getTriple =>
          _library._clang_TargetInfo_getTriple_ptr;
  ffi.Pointer<ffi.NativeFunction<Native_clang_TargetInfo_getPointerWidth>>
      get clang_TargetInfo_getPointerWidth =>
          _library._clang_TargetInfo_getPointerWidth_ptr;
  ffi.Pointer<ffi.NativeFunction<Native_clang_getNullCursor>>
      get clang_getNullCursor => _library._clang_getNullCursor_ptr;
  ffi.Pointer<ffi.NativeFunction<Native_clang_getTranslationUnitCursor>>
      get clang_getTranslationUnitCursor =>
          _library._clang_getTranslationUnitCursor_ptr;
  ffi.Pointer<ffi.NativeFunction<Native_clang_equalCursors>>
      get clang_equalCursors => _library._clang_equalCursors_ptr;
  ffi.Pointer<ffi.NativeFunction<Native_clang_Cursor_isNull>>
      get clang_Cursor_isNull => _library._clang_Cursor_isNull_ptr;
  ffi.Pointer<ffi.NativeFunction<Native_clang_hashCursor>>
      get clang_hashCursor => _library._clang_hashCursor_ptr;
  ffi.Pointer<ffi.NativeFunction<Native_clang_getCursorKind>>
      get clang_getCursorKind => _library._clang_getCursorKind_ptr;
  ffi.Pointer<ffi.NativeFunction<Native_clang_isDeclaration>>
      get clang_isDeclaration => _library._clang_isDeclaration_ptr;
  ffi.Pointer<ffi.NativeFunction<Native_clang_isInvalidDeclaration>>
      get clang_isInvalidDeclaration =>
          _library._clang_isInvalidDeclaration_ptr;
  ffi.Pointer<ffi.NativeFunction<Native_clang_isReference>>
      get clang_isReference => _library._clang_isReference_ptr;
  ffi.Pointer<ffi.NativeFunction<Native_clang_isExpression>>
      get clang_isExpression => _library._clang_isExpression_ptr;
  ffi.Pointer<ffi.NativeFunction<Native_clang_isStatement>>
      get clang_isStatement => _library._clang_isStatement_ptr;
  ffi.Pointer<ffi.NativeFunction<Native_clang_isAttribute>>
      get clang_isAttribute => _library._clang_isAttribute_ptr;
  ffi.Pointer<ffi.NativeFunction<Native_clang_Cursor_hasAttrs>>
      get clang_Cursor_hasAttrs => _library._clang_Cursor_hasAttrs_ptr;
  ffi.Pointer<ffi.NativeFunction<Native_clang_isInvalid>> get clang_isInvalid =>
      _library._clang_isInvalid_ptr;
  ffi.Pointer<ffi.NativeFunction<Native_clang_isTranslationUnit>>
      get clang_isTranslationUnit => _library._clang_isTranslationUnit_ptr;
  ffi.Pointer<ffi.NativeFunction<Native_clang_isPreprocessing>>
      get clang_isPreprocessing => _library._clang_isPreprocessing_ptr;
  ffi.Pointer<ffi.NativeFunction<Native_clang_isUnexposed>>
      get clang_isUnexposed => _library._clang_isUnexposed_ptr;
  ffi.Pointer<ffi.NativeFunction<Native_clang_getCursorLinkage>>
      get clang_getCursorLinkage => _library._clang_getCursorLinkage_ptr;
  ffi.Pointer<ffi.NativeFunction<Native_clang_getCursorVisibility>>
      get clang_getCursorVisibility => _library._clang_getCursorVisibility_ptr;
  ffi.Pointer<ffi.NativeFunction<Native_clang_getCursorAvailability>>
      get clang_getCursorAvailability =>
          _library._clang_getCursorAvailability_ptr;
  ffi.Pointer<ffi.NativeFunction<Native_clang_getCursorPlatformAvailability>>
      get clang_getCursorPlatformAvailability =>
          _library._clang_getCursorPlatformAvailability_ptr;
  ffi.Pointer<ffi.NativeFunction<Native_clang_disposeCXPlatformAvailability>>
      get clang_disposeCXPlatformAvailability =>
          _library._clang_disposeCXPlatformAvailability_ptr;
  ffi.Pointer<ffi.NativeFunction<Native_clang_getCursorLanguage>>
      get clang_getCursorLanguage => _library._clang_getCursorLanguage_ptr;
  ffi.Pointer<ffi.NativeFunction<Native_clang_getCursorTLSKind>>
      get clang_getCursorTLSKind => _library._clang_getCursorTLSKind_ptr;
  ffi.Pointer<ffi.NativeFunction<Native_clang_Cursor_getTranslationUnit>>
      get clang_Cursor_getTranslationUnit =>
          _library._clang_Cursor_getTranslationUnit_ptr;
  ffi.Pointer<ffi.NativeFunction<Native_clang_createCXCursorSet>>
      get clang_createCXCursorSet => _library._clang_createCXCursorSet_ptr;
  ffi.Pointer<ffi.NativeFunction<Native_clang_disposeCXCursorSet>>
      get clang_disposeCXCursorSet => _library._clang_disposeCXCursorSet_ptr;
  ffi.Pointer<ffi.NativeFunction<Native_clang_CXCursorSet_contains>>
      get clang_CXCursorSet_contains =>
          _library._clang_CXCursorSet_contains_ptr;
  ffi.Pointer<ffi.NativeFunction<Native_clang_CXCursorSet_insert>>
      get clang_CXCursorSet_insert => _library._clang_CXCursorSet_insert_ptr;
  ffi.Pointer<ffi.NativeFunction<Native_clang_getCursorSemanticParent>>
      get clang_getCursorSemanticParent =>
          _library._clang_getCursorSemanticParent_ptr;
  ffi.Pointer<ffi.NativeFunction<Native_clang_getCursorLexicalParent>>
      get clang_getCursorLexicalParent =>
          _library._clang_getCursorLexicalParent_ptr;
  ffi.Pointer<ffi.NativeFunction<Native_clang_getOverriddenCursors>>
      get clang_getOverriddenCursors =>
          _library._clang_getOverriddenCursors_ptr;
  ffi.Pointer<ffi.NativeFunction<Native_clang_disposeOverriddenCursors>>
      get clang_disposeOverriddenCursors =>
          _library._clang_disposeOverriddenCursors_ptr;
  ffi.Pointer<ffi.NativeFunction<Native_clang_getIncludedFile>>
      get clang_getIncludedFile => _library._clang_getIncludedFile_ptr;
  ffi.Pointer<ffi.NativeFunction<Native_clang_getCursor>> get clang_getCursor =>
      _library._clang_getCursor_ptr;
  ffi.Pointer<ffi.NativeFunction<Native_clang_getCursorLocation>>
      get clang_getCursorLocation => _library._clang_getCursorLocation_ptr;
  ffi.Pointer<ffi.NativeFunction<Native_clang_getCursorExtent>>
      get clang_getCursorExtent => _library._clang_getCursorExtent_ptr;
  ffi.Pointer<ffi.NativeFunction<Native_clang_getCursorType>>
      get clang_getCursorType => _library._clang_getCursorType_ptr;
  ffi.Pointer<ffi.NativeFunction<Native_clang_getTypeSpelling>>
      get clang_getTypeSpelling => _library._clang_getTypeSpelling_ptr;
  ffi.Pointer<ffi.NativeFunction<Native_clang_getTypedefDeclUnderlyingType>>
      get clang_getTypedefDeclUnderlyingType =>
          _library._clang_getTypedefDeclUnderlyingType_ptr;
  ffi.Pointer<ffi.NativeFunction<Native_clang_getEnumDeclIntegerType>>
      get clang_getEnumDeclIntegerType =>
          _library._clang_getEnumDeclIntegerType_ptr;
  ffi.Pointer<ffi.NativeFunction<Native_clang_getEnumConstantDeclValue>>
      get clang_getEnumConstantDeclValue =>
          _library._clang_getEnumConstantDeclValue_ptr;
  ffi.Pointer<ffi.NativeFunction<Native_clang_getEnumConstantDeclUnsignedValue>>
      get clang_getEnumConstantDeclUnsignedValue =>
          _library._clang_getEnumConstantDeclUnsignedValue_ptr;
  ffi.Pointer<ffi.NativeFunction<Native_clang_getFieldDeclBitWidth>>
      get clang_getFieldDeclBitWidth =>
          _library._clang_getFieldDeclBitWidth_ptr;
  ffi.Pointer<ffi.NativeFunction<Native_clang_Cursor_getNumArguments>>
      get clang_Cursor_getNumArguments =>
          _library._clang_Cursor_getNumArguments_ptr;
  ffi.Pointer<ffi.NativeFunction<Native_clang_Cursor_getArgument>>
      get clang_Cursor_getArgument => _library._clang_Cursor_getArgument_ptr;
  ffi.Pointer<ffi.NativeFunction<Native_clang_Cursor_getNumTemplateArguments>>
      get clang_Cursor_getNumTemplateArguments =>
          _library._clang_Cursor_getNumTemplateArguments_ptr;
  ffi.Pointer<ffi.NativeFunction<Native_clang_Cursor_getTemplateArgumentKind>>
      get clang_Cursor_getTemplateArgumentKind =>
          _library._clang_Cursor_getTemplateArgumentKind_ptr;
  ffi.Pointer<ffi.NativeFunction<Native_clang_Cursor_getTemplateArgumentType>>
      get clang_Cursor_getTemplateArgumentType =>
          _library._clang_Cursor_getTemplateArgumentType_ptr;
  ffi.Pointer<ffi.NativeFunction<Native_clang_Cursor_getTemplateArgumentValue>>
      get clang_Cursor_getTemplateArgumentValue =>
          _library._clang_Cursor_getTemplateArgumentValue_ptr;
  ffi.Pointer<
          ffi.NativeFunction<
              Native_clang_Cursor_getTemplateArgumentUnsignedValue>>
      get clang_Cursor_getTemplateArgumentUnsignedValue =>
          _library._clang_Cursor_getTemplateArgumentUnsignedValue_ptr;
  ffi.Pointer<ffi.NativeFunction<Native_clang_equalTypes>>
      get clang_equalTypes => _library._clang_equalTypes_ptr;
  ffi.Pointer<ffi.NativeFunction<Native_clang_getCanonicalType>>
      get clang_getCanonicalType => _library._clang_getCanonicalType_ptr;
  ffi.Pointer<ffi.NativeFunction<Native_clang_isConstQualifiedType>>
      get clang_isConstQualifiedType =>
          _library._clang_isConstQualifiedType_ptr;
  ffi.Pointer<ffi.NativeFunction<Native_clang_Cursor_isMacroFunctionLike>>
      get clang_Cursor_isMacroFunctionLike =>
          _library._clang_Cursor_isMacroFunctionLike_ptr;
  ffi.Pointer<ffi.NativeFunction<Native_clang_Cursor_isMacroBuiltin>>
      get clang_Cursor_isMacroBuiltin =>
          _library._clang_Cursor_isMacroBuiltin_ptr;
  ffi.Pointer<ffi.NativeFunction<Native_clang_Cursor_isFunctionInlined>>
      get clang_Cursor_isFunctionInlined =>
          _library._clang_Cursor_isFunctionInlined_ptr;
  ffi.Pointer<ffi.NativeFunction<Native_clang_isVolatileQualifiedType>>
      get clang_isVolatileQualifiedType =>
          _library._clang_isVolatileQualifiedType_ptr;
  ffi.Pointer<ffi.NativeFunction<Native_clang_isRestrictQualifiedType>>
      get clang_isRestrictQualifiedType =>
          _library._clang_isRestrictQualifiedType_ptr;
  ffi.Pointer<ffi.NativeFunction<Native_clang_getAddressSpace>>
      get clang_getAddressSpace => _library._clang_getAddressSpace_ptr;
  ffi.Pointer<ffi.NativeFunction<Native_clang_getTypedefName>>
      get clang_getTypedefName => _library._clang_getTypedefName_ptr;
  ffi.Pointer<ffi.NativeFunction<Native_clang_getPointeeType>>
      get clang_getPointeeType => _library._clang_getPointeeType_ptr;
  ffi.Pointer<ffi.NativeFunction<Native_clang_getTypeDeclaration>>
      get clang_getTypeDeclaration => _library._clang_getTypeDeclaration_ptr;
  ffi.Pointer<ffi.NativeFunction<Native_clang_getDeclObjCTypeEncoding>>
      get clang_getDeclObjCTypeEncoding =>
          _library._clang_getDeclObjCTypeEncoding_ptr;
  ffi.Pointer<ffi.NativeFunction<Native_clang_Type_getObjCEncoding>>
      get clang_Type_getObjCEncoding =>
          _library._clang_Type_getObjCEncoding_ptr;
  ffi.Pointer<ffi.NativeFunction<Native_clang_getTypeKindSpelling>>
      get clang_getTypeKindSpelling => _library._clang_getTypeKindSpelling_ptr;
  ffi.Pointer<ffi.NativeFunction<Native_clang_getFunctionTypeCallingConv>>
      get clang_getFunctionTypeCallingConv =>
          _library._clang_getFunctionTypeCallingConv_ptr;
  ffi.Pointer<ffi.NativeFunction<Native_clang_getResultType>>
      get clang_getResultType => _library._clang_getResultType_ptr;
  ffi.Pointer<ffi.NativeFunction<Native_clang_getExceptionSpecificationType>>
      get clang_getExceptionSpecificationType =>
          _library._clang_getExceptionSpecificationType_ptr;
  ffi.Pointer<ffi.NativeFunction<Native_clang_getNumArgTypes>>
      get clang_getNumArgTypes => _library._clang_getNumArgTypes_ptr;
  ffi.Pointer<ffi.NativeFunction<Native_clang_getArgType>>
      get clang_getArgType => _library._clang_getArgType_ptr;
  ffi.Pointer<ffi.NativeFunction<Native_clang_Type_getObjCObjectBaseType>>
      get clang_Type_getObjCObjectBaseType =>
          _library._clang_Type_getObjCObjectBaseType_ptr;
  ffi.Pointer<ffi.NativeFunction<Native_clang_Type_getNumObjCProtocolRefs>>
      get clang_Type_getNumObjCProtocolRefs =>
          _library._clang_Type_getNumObjCProtocolRefs_ptr;
  ffi.Pointer<ffi.NativeFunction<Native_clang_Type_getObjCProtocolDecl>>
      get clang_Type_getObjCProtocolDecl =>
          _library._clang_Type_getObjCProtocolDecl_ptr;
  ffi.Pointer<ffi.NativeFunction<Native_clang_Type_getNumObjCTypeArgs>>
      get clang_Type_getNumObjCTypeArgs =>
          _library._clang_Type_getNumObjCTypeArgs_ptr;
  ffi.Pointer<ffi.NativeFunction<Native_clang_Type_getObjCTypeArg>>
      get clang_Type_getObjCTypeArg => _library._clang_Type_getObjCTypeArg_ptr;
  ffi.Pointer<ffi.NativeFunction<Native_clang_isFunctionTypeVariadic>>
      get clang_isFunctionTypeVariadic =>
          _library._clang_isFunctionTypeVariadic_ptr;
  ffi.Pointer<ffi.NativeFunction<Native_clang_getCursorResultType>>
      get clang_getCursorResultType => _library._clang_getCursorResultType_ptr;
  ffi.Pointer<
          ffi.NativeFunction<Native_clang_getCursorExceptionSpecificationType>>
      get clang_getCursorExceptionSpecificationType =>
          _library._clang_getCursorExceptionSpecificationType_ptr;
  ffi.Pointer<ffi.NativeFunction<Native_clang_isPODType>> get clang_isPODType =>
      _library._clang_isPODType_ptr;
  ffi.Pointer<ffi.NativeFunction<Native_clang_getElementType>>
      get clang_getElementType => _library._clang_getElementType_ptr;
  ffi.Pointer<ffi.NativeFunction<Native_clang_getNumElements>>
      get clang_getNumElements => _library._clang_getNumElements_ptr;
  ffi.Pointer<ffi.NativeFunction<Native_clang_getArrayElementType>>
      get clang_getArrayElementType => _library._clang_getArrayElementType_ptr;
  ffi.Pointer<ffi.NativeFunction<Native_clang_getArraySize>>
      get clang_getArraySize => _library._clang_getArraySize_ptr;
  ffi.Pointer<ffi.NativeFunction<Native_clang_Type_getNamedType>>
      get clang_Type_getNamedType => _library._clang_Type_getNamedType_ptr;
  ffi.Pointer<ffi.NativeFunction<Native_clang_Type_isTransparentTagTypedef>>
      get clang_Type_isTransparentTagTypedef =>
          _library._clang_Type_isTransparentTagTypedef_ptr;
  ffi.Pointer<ffi.NativeFunction<Native_clang_Type_getNullability>>
      get clang_Type_getNullability => _library._clang_Type_getNullability_ptr;
  ffi.Pointer<ffi.NativeFunction<Native_clang_Type_getAlignOf>>
      get clang_Type_getAlignOf => _library._clang_Type_getAlignOf_ptr;
  ffi.Pointer<ffi.NativeFunction<Native_clang_Type_getClassType>>
      get clang_Type_getClassType => _library._clang_Type_getClassType_ptr;
  ffi.Pointer<ffi.NativeFunction<Native_clang_Type_getSizeOf>>
      get clang_Type_getSizeOf => _library._clang_Type_getSizeOf_ptr;
  ffi.Pointer<ffi.NativeFunction<Native_clang_Type_getOffsetOf>>
      get clang_Type_getOffsetOf => _library._clang_Type_getOffsetOf_ptr;
  ffi.Pointer<ffi.NativeFunction<Native_clang_Type_getModifiedType>>
      get clang_Type_getModifiedType =>
          _library._clang_Type_getModifiedType_ptr;
  ffi.Pointer<ffi.NativeFunction<Native_clang_Cursor_getOffsetOfField>>
      get clang_Cursor_getOffsetOfField =>
          _library._clang_Cursor_getOffsetOfField_ptr;
  ffi.Pointer<ffi.NativeFunction<Native_clang_Cursor_isAnonymous>>
      get clang_Cursor_isAnonymous => _library._clang_Cursor_isAnonymous_ptr;
  ffi.Pointer<ffi.NativeFunction<Native_clang_Cursor_isAnonymousRecordDecl>>
      get clang_Cursor_isAnonymousRecordDecl =>
          _library._clang_Cursor_isAnonymousRecordDecl_ptr;
  ffi.Pointer<ffi.NativeFunction<Native_clang_Cursor_isInlineNamespace>>
      get clang_Cursor_isInlineNamespace =>
          _library._clang_Cursor_isInlineNamespace_ptr;
  ffi.Pointer<ffi.NativeFunction<Native_clang_Type_getNumTemplateArguments>>
      get clang_Type_getNumTemplateArguments =>
          _library._clang_Type_getNumTemplateArguments_ptr;
  ffi.Pointer<ffi.NativeFunction<Native_clang_Type_getTemplateArgumentAsType>>
      get clang_Type_getTemplateArgumentAsType =>
          _library._clang_Type_getTemplateArgumentAsType_ptr;
  ffi.Pointer<ffi.NativeFunction<Native_clang_Type_getCXXRefQualifier>>
      get clang_Type_getCXXRefQualifier =>
          _library._clang_Type_getCXXRefQualifier_ptr;
  ffi.Pointer<ffi.NativeFunction<Native_clang_Cursor_isBitField>>
      get clang_Cursor_isBitField => _library._clang_Cursor_isBitField_ptr;
  ffi.Pointer<ffi.NativeFunction<Native_clang_isVirtualBase>>
      get clang_isVirtualBase => _library._clang_isVirtualBase_ptr;
  ffi.Pointer<ffi.NativeFunction<Native_clang_getCXXAccessSpecifier>>
      get clang_getCXXAccessSpecifier =>
          _library._clang_getCXXAccessSpecifier_ptr;
  ffi.Pointer<ffi.NativeFunction<Native_clang_Cursor_getStorageClass>>
      get clang_Cursor_getStorageClass =>
          _library._clang_Cursor_getStorageClass_ptr;
  ffi.Pointer<ffi.NativeFunction<Native_clang_getNumOverloadedDecls>>
      get clang_getNumOverloadedDecls =>
          _library._clang_getNumOverloadedDecls_ptr;
  ffi.Pointer<ffi.NativeFunction<Native_clang_getOverloadedDecl>>
      get clang_getOverloadedDecl => _library._clang_getOverloadedDecl_ptr;
  ffi.Pointer<ffi.NativeFunction<Native_clang_getIBOutletCollectionType>>
      get clang_getIBOutletCollectionType =>
          _library._clang_getIBOutletCollectionType_ptr;
  ffi.Pointer<ffi.NativeFunction<Native_clang_visitChildren>>
      get clang_visitChildren => _library._clang_visitChildren_ptr;
  ffi.Pointer<ffi.NativeFunction<Native_clang_getCursorUSR>>
      get clang_getCursorUSR => _library._clang_getCursorUSR_ptr;
  ffi.Pointer<ffi.NativeFunction<Native_clang_constructUSR_ObjCClass>>
      get clang_constructUSR_ObjCClass =>
          _library._clang_constructUSR_ObjCClass_ptr;
  ffi.Pointer<ffi.NativeFunction<Native_clang_constructUSR_ObjCCategory>>
      get clang_constructUSR_ObjCCategory =>
          _library._clang_constructUSR_ObjCCategory_ptr;
  ffi.Pointer<ffi.NativeFunction<Native_clang_constructUSR_ObjCProtocol>>
      get clang_constructUSR_ObjCProtocol =>
          _library._clang_constructUSR_ObjCProtocol_ptr;
  ffi.Pointer<ffi.NativeFunction<Native_clang_constructUSR_ObjCIvar>>
      get clang_constructUSR_ObjCIvar =>
          _library._clang_constructUSR_ObjCIvar_ptr;
  ffi.Pointer<ffi.NativeFunction<Native_clang_constructUSR_ObjCMethod>>
      get clang_constructUSR_ObjCMethod =>
          _library._clang_constructUSR_ObjCMethod_ptr;
  ffi.Pointer<ffi.NativeFunction<Native_clang_constructUSR_ObjCProperty>>
      get clang_constructUSR_ObjCProperty =>
          _library._clang_constructUSR_ObjCProperty_ptr;
  ffi.Pointer<ffi.NativeFunction<Native_clang_getCursorSpelling>>
      get clang_getCursorSpelling => _library._clang_getCursorSpelling_ptr;
  ffi.Pointer<ffi.NativeFunction<Native_clang_Cursor_getSpellingNameRange>>
      get clang_Cursor_getSpellingNameRange =>
          _library._clang_Cursor_getSpellingNameRange_ptr;
  ffi.Pointer<ffi.NativeFunction<Native_clang_PrintingPolicy_getProperty>>
      get clang_PrintingPolicy_getProperty =>
          _library._clang_PrintingPolicy_getProperty_ptr;
  ffi.Pointer<ffi.NativeFunction<Native_clang_PrintingPolicy_setProperty>>
      get clang_PrintingPolicy_setProperty =>
          _library._clang_PrintingPolicy_setProperty_ptr;
  ffi.Pointer<ffi.NativeFunction<Native_clang_getCursorPrintingPolicy>>
      get clang_getCursorPrintingPolicy =>
          _library._clang_getCursorPrintingPolicy_ptr;
  ffi.Pointer<ffi.NativeFunction<Native_clang_PrintingPolicy_dispose>>
      get clang_PrintingPolicy_dispose =>
          _library._clang_PrintingPolicy_dispose_ptr;
  ffi.Pointer<ffi.NativeFunction<Native_clang_getCursorPrettyPrinted>>
      get clang_getCursorPrettyPrinted =>
          _library._clang_getCursorPrettyPrinted_ptr;
  ffi.Pointer<ffi.NativeFunction<Native_clang_getCursorDisplayName>>
      get clang_getCursorDisplayName =>
          _library._clang_getCursorDisplayName_ptr;
  ffi.Pointer<ffi.NativeFunction<Native_clang_getCursorReferenced>>
      get clang_getCursorReferenced => _library._clang_getCursorReferenced_ptr;
  ffi.Pointer<ffi.NativeFunction<Native_clang_getCursorDefinition>>
      get clang_getCursorDefinition => _library._clang_getCursorDefinition_ptr;
  ffi.Pointer<ffi.NativeFunction<Native_clang_isCursorDefinition>>
      get clang_isCursorDefinition => _library._clang_isCursorDefinition_ptr;
  ffi.Pointer<ffi.NativeFunction<Native_clang_getCanonicalCursor>>
      get clang_getCanonicalCursor => _library._clang_getCanonicalCursor_ptr;
  ffi.Pointer<ffi.NativeFunction<Native_clang_Cursor_getObjCSelectorIndex>>
      get clang_Cursor_getObjCSelectorIndex =>
          _library._clang_Cursor_getObjCSelectorIndex_ptr;
  ffi.Pointer<ffi.NativeFunction<Native_clang_Cursor_isDynamicCall>>
      get clang_Cursor_isDynamicCall =>
          _library._clang_Cursor_isDynamicCall_ptr;
  ffi.Pointer<ffi.NativeFunction<Native_clang_Cursor_getReceiverType>>
      get clang_Cursor_getReceiverType =>
          _library._clang_Cursor_getReceiverType_ptr;
  ffi.Pointer<ffi.NativeFunction<Native_clang_Cursor_getObjCPropertyAttributes>>
      get clang_Cursor_getObjCPropertyAttributes =>
          _library._clang_Cursor_getObjCPropertyAttributes_ptr;
  ffi.Pointer<ffi.NativeFunction<Native_clang_Cursor_getObjCPropertyGetterName>>
      get clang_Cursor_getObjCPropertyGetterName =>
          _library._clang_Cursor_getObjCPropertyGetterName_ptr;
  ffi.Pointer<ffi.NativeFunction<Native_clang_Cursor_getObjCPropertySetterName>>
      get clang_Cursor_getObjCPropertySetterName =>
          _library._clang_Cursor_getObjCPropertySetterName_ptr;
  ffi.Pointer<ffi.NativeFunction<Native_clang_Cursor_getObjCDeclQualifiers>>
      get clang_Cursor_getObjCDeclQualifiers =>
          _library._clang_Cursor_getObjCDeclQualifiers_ptr;
  ffi.Pointer<ffi.NativeFunction<Native_clang_Cursor_isObjCOptional>>
      get clang_Cursor_isObjCOptional =>
          _library._clang_Cursor_isObjCOptional_ptr;
  ffi.Pointer<ffi.NativeFunction<Native_clang_Cursor_isVariadic>>
      get clang_Cursor_isVariadic => _library._clang_Cursor_isVariadic_ptr;
  ffi.Pointer<ffi.NativeFunction<Native_clang_Cursor_isExternalSymbol>>
      get clang_Cursor_isExternalSymbol =>
          _library._clang_Cursor_isExternalSymbol_ptr;
  ffi.Pointer<ffi.NativeFunction<Native_clang_Cursor_getCommentRange>>
      get clang_Cursor_getCommentRange =>
          _library._clang_Cursor_getCommentRange_ptr;
  ffi.Pointer<ffi.NativeFunction<Native_clang_Cursor_getRawCommentText>>
      get clang_Cursor_getRawCommentText =>
          _library._clang_Cursor_getRawCommentText_ptr;
  ffi.Pointer<ffi.NativeFunction<Native_clang_Cursor_getBriefCommentText>>
      get clang_Cursor_getBriefCommentText =>
          _library._clang_Cursor_getBriefCommentText_ptr;
  ffi.Pointer<ffi.NativeFunction<Native_clang_Cursor_getMangling>>
      get clang_Cursor_getMangling => _library._clang_Cursor_getMangling_ptr;
  ffi.Pointer<ffi.NativeFunction<Native_clang_Cursor_getCXXManglings>>
      get clang_Cursor_getCXXManglings =>
          _library._clang_Cursor_getCXXManglings_ptr;
  ffi.Pointer<ffi.NativeFunction<Native_clang_Cursor_getObjCManglings>>
      get clang_Cursor_getObjCManglings =>
          _library._clang_Cursor_getObjCManglings_ptr;
  ffi.Pointer<ffi.NativeFunction<Native_clang_Cursor_getModule>>
      get clang_Cursor_getModule => _library._clang_Cursor_getModule_ptr;
  ffi.Pointer<ffi.NativeFunction<Native_clang_getModuleForFile>>
      get clang_getModuleForFile => _library._clang_getModuleForFile_ptr;
  ffi.Pointer<ffi.NativeFunction<Native_clang_Module_getASTFile>>
      get clang_Module_getASTFile => _library._clang_Module_getASTFile_ptr;
  ffi.Pointer<ffi.NativeFunction<Native_clang_Module_getParent>>
      get clang_Module_getParent => _library._clang_Module_getParent_ptr;
  ffi.Pointer<ffi.NativeFunction<Native_clang_Module_getName>>
      get clang_Module_getName => _library._clang_Module_getName_ptr;
  ffi.Pointer<ffi.NativeFunction<Native_clang_Module_getFullName>>
      get clang_Module_getFullName => _library._clang_Module_getFullName_ptr;
  ffi.Pointer<ffi.NativeFunction<Native_clang_Module_isSystem>>
      get clang_Module_isSystem => _library._clang_Module_isSystem_ptr;
  ffi.Pointer<ffi.NativeFunction<Native_clang_Module_getNumTopLevelHeaders>>
      get clang_Module_getNumTopLevelHeaders =>
          _library._clang_Module_getNumTopLevelHeaders_ptr;
  ffi.Pointer<ffi.NativeFunction<Native_clang_Module_getTopLevelHeader>>
      get clang_Module_getTopLevelHeader =>
          _library._clang_Module_getTopLevelHeader_ptr;
  ffi.Pointer<
          ffi.NativeFunction<
              Native_clang_CXXConstructor_isConvertingConstructor>>
      get clang_CXXConstructor_isConvertingConstructor =>
          _library._clang_CXXConstructor_isConvertingConstructor_ptr;
  ffi.Pointer<ffi.NativeFunction<Native_clang_CXXConstructor_isCopyConstructor>>
      get clang_CXXConstructor_isCopyConstructor =>
          _library._clang_CXXConstructor_isCopyConstructor_ptr;
  ffi.Pointer<
          ffi.NativeFunction<Native_clang_CXXConstructor_isDefaultConstructor>>
      get clang_CXXConstructor_isDefaultConstructor =>
          _library._clang_CXXConstructor_isDefaultConstructor_ptr;
  ffi.Pointer<ffi.NativeFunction<Native_clang_CXXConstructor_isMoveConstructor>>
      get clang_CXXConstructor_isMoveConstructor =>
          _library._clang_CXXConstructor_isMoveConstructor_ptr;
  ffi.Pointer<ffi.NativeFunction<Native_clang_CXXField_isMutable>>
      get clang_CXXField_isMutable => _library._clang_CXXField_isMutable_ptr;
  ffi.Pointer<ffi.NativeFunction<Native_clang_CXXMethod_isDefaulted>>
      get clang_CXXMethod_isDefaulted =>
          _library._clang_CXXMethod_isDefaulted_ptr;
  ffi.Pointer<ffi.NativeFunction<Native_clang_CXXMethod_isPureVirtual>>
      get clang_CXXMethod_isPureVirtual =>
          _library._clang_CXXMethod_isPureVirtual_ptr;
  ffi.Pointer<ffi.NativeFunction<Native_clang_CXXMethod_isStatic>>
      get clang_CXXMethod_isStatic => _library._clang_CXXMethod_isStatic_ptr;
  ffi.Pointer<ffi.NativeFunction<Native_clang_CXXMethod_isVirtual>>
      get clang_CXXMethod_isVirtual => _library._clang_CXXMethod_isVirtual_ptr;
  ffi.Pointer<ffi.NativeFunction<Native_clang_CXXRecord_isAbstract>>
      get clang_CXXRecord_isAbstract =>
          _library._clang_CXXRecord_isAbstract_ptr;
  ffi.Pointer<ffi.NativeFunction<Native_clang_EnumDecl_isScoped>>
      get clang_EnumDecl_isScoped => _library._clang_EnumDecl_isScoped_ptr;
  ffi.Pointer<ffi.NativeFunction<Native_clang_CXXMethod_isConst>>
      get clang_CXXMethod_isConst => _library._clang_CXXMethod_isConst_ptr;
  ffi.Pointer<ffi.NativeFunction<Native_clang_getTemplateCursorKind>>
      get clang_getTemplateCursorKind =>
          _library._clang_getTemplateCursorKind_ptr;
  ffi.Pointer<ffi.NativeFunction<Native_clang_getSpecializedCursorTemplate>>
      get clang_getSpecializedCursorTemplate =>
          _library._clang_getSpecializedCursorTemplate_ptr;
  ffi.Pointer<ffi.NativeFunction<Native_clang_getCursorReferenceNameRange>>
      get clang_getCursorReferenceNameRange =>
          _library._clang_getCursorReferenceNameRange_ptr;
  ffi.Pointer<ffi.NativeFunction<Native_clang_getToken>> get clang_getToken =>
      _library._clang_getToken_ptr;
  ffi.Pointer<ffi.NativeFunction<Native_clang_getTokenKind>>
      get clang_getTokenKind => _library._clang_getTokenKind_ptr;
  ffi.Pointer<ffi.NativeFunction<Native_clang_getTokenSpelling>>
      get clang_getTokenSpelling => _library._clang_getTokenSpelling_ptr;
  ffi.Pointer<ffi.NativeFunction<Native_clang_getTokenLocation>>
      get clang_getTokenLocation => _library._clang_getTokenLocation_ptr;
  ffi.Pointer<ffi.NativeFunction<Native_clang_getTokenExtent>>
      get clang_getTokenExtent => _library._clang_getTokenExtent_ptr;
  ffi.Pointer<ffi.NativeFunction<Native_clang_tokenize>> get clang_tokenize =>
      _library._clang_tokenize_ptr;
  ffi.Pointer<ffi.NativeFunction<Native_clang_annotateTokens>>
      get clang_annotateTokens => _library._clang_annotateTokens_ptr;
  ffi.Pointer<ffi.NativeFunction<Native_clang_disposeTokens>>
      get clang_disposeTokens => _library._clang_disposeTokens_ptr;
  ffi.Pointer<ffi.NativeFunction<Native_clang_getCursorKindSpelling>>
      get clang_getCursorKindSpelling =>
          _library._clang_getCursorKindSpelling_ptr;
  ffi.Pointer<ffi.NativeFunction<Native_clang_getDefinitionSpellingAndExtent>>
      get clang_getDefinitionSpellingAndExtent =>
          _library._clang_getDefinitionSpellingAndExtent_ptr;
  ffi.Pointer<ffi.NativeFunction<Native_clang_enableStackTraces>>
      get clang_enableStackTraces => _library._clang_enableStackTraces_ptr;
  ffi.Pointer<ffi.NativeFunction<Native_clang_executeOnThread>>
      get clang_executeOnThread => _library._clang_executeOnThread_ptr;
  ffi.Pointer<ffi.NativeFunction<Native_clang_getCompletionChunkKind>>
      get clang_getCompletionChunkKind =>
          _library._clang_getCompletionChunkKind_ptr;
  ffi.Pointer<ffi.NativeFunction<Native_clang_getCompletionChunkText>>
      get clang_getCompletionChunkText =>
          _library._clang_getCompletionChunkText_ptr;
  ffi.Pointer<
          ffi.NativeFunction<Native_clang_getCompletionChunkCompletionString>>
      get clang_getCompletionChunkCompletionString =>
          _library._clang_getCompletionChunkCompletionString_ptr;
  ffi.Pointer<ffi.NativeFunction<Native_clang_getNumCompletionChunks>>
      get clang_getNumCompletionChunks =>
          _library._clang_getNumCompletionChunks_ptr;
  ffi.Pointer<ffi.NativeFunction<Native_clang_getCompletionPriority>>
      get clang_getCompletionPriority =>
          _library._clang_getCompletionPriority_ptr;
  ffi.Pointer<ffi.NativeFunction<Native_clang_getCompletionAvailability>>
      get clang_getCompletionAvailability =>
          _library._clang_getCompletionAvailability_ptr;
  ffi.Pointer<ffi.NativeFunction<Native_clang_getCompletionNumAnnotations>>
      get clang_getCompletionNumAnnotations =>
          _library._clang_getCompletionNumAnnotations_ptr;
  ffi.Pointer<ffi.NativeFunction<Native_clang_getCompletionAnnotation>>
      get clang_getCompletionAnnotation =>
          _library._clang_getCompletionAnnotation_ptr;
  ffi.Pointer<ffi.NativeFunction<Native_clang_getCompletionParent>>
      get clang_getCompletionParent => _library._clang_getCompletionParent_ptr;
  ffi.Pointer<ffi.NativeFunction<Native_clang_getCompletionBriefComment>>
      get clang_getCompletionBriefComment =>
          _library._clang_getCompletionBriefComment_ptr;
  ffi.Pointer<ffi.NativeFunction<Native_clang_getCursorCompletionString>>
      get clang_getCursorCompletionString =>
          _library._clang_getCursorCompletionString_ptr;
  ffi.Pointer<ffi.NativeFunction<Native_clang_getCompletionNumFixIts>>
      get clang_getCompletionNumFixIts =>
          _library._clang_getCompletionNumFixIts_ptr;
  ffi.Pointer<ffi.NativeFunction<Native_clang_getCompletionFixIt>>
      get clang_getCompletionFixIt => _library._clang_getCompletionFixIt_ptr;
  ffi.Pointer<ffi.NativeFunction<Native_clang_defaultCodeCompleteOptions>>
      get clang_defaultCodeCompleteOptions =>
          _library._clang_defaultCodeCompleteOptions_ptr;
  ffi.Pointer<ffi.NativeFunction<Native_clang_codeCompleteAt>>
      get clang_codeCompleteAt => _library._clang_codeCompleteAt_ptr;
  ffi.Pointer<ffi.NativeFunction<Native_clang_sortCodeCompletionResults>>
      get clang_sortCodeCompletionResults =>
          _library._clang_sortCodeCompletionResults_ptr;
  ffi.Pointer<ffi.NativeFunction<Native_clang_disposeCodeCompleteResults>>
      get clang_disposeCodeCompleteResults =>
          _library._clang_disposeCodeCompleteResults_ptr;
  ffi.Pointer<ffi.NativeFunction<Native_clang_codeCompleteGetNumDiagnostics>>
      get clang_codeCompleteGetNumDiagnostics =>
          _library._clang_codeCompleteGetNumDiagnostics_ptr;
  ffi.Pointer<ffi.NativeFunction<Native_clang_codeCompleteGetDiagnostic>>
      get clang_codeCompleteGetDiagnostic =>
          _library._clang_codeCompleteGetDiagnostic_ptr;
  ffi.Pointer<ffi.NativeFunction<Native_clang_codeCompleteGetContexts>>
      get clang_codeCompleteGetContexts =>
          _library._clang_codeCompleteGetContexts_ptr;
  ffi.Pointer<ffi.NativeFunction<Native_clang_codeCompleteGetContainerKind>>
      get clang_codeCompleteGetContainerKind =>
          _library._clang_codeCompleteGetContainerKind_ptr;
  ffi.Pointer<ffi.NativeFunction<Native_clang_codeCompleteGetContainerUSR>>
      get clang_codeCompleteGetContainerUSR =>
          _library._clang_codeCompleteGetContainerUSR_ptr;
  ffi.Pointer<ffi.NativeFunction<Native_clang_codeCompleteGetObjCSelector>>
      get clang_codeCompleteGetObjCSelector =>
          _library._clang_codeCompleteGetObjCSelector_ptr;
  ffi.Pointer<ffi.NativeFunction<Native_clang_getClangVersion>>
      get clang_getClangVersion => _library._clang_getClangVersion_ptr;
  ffi.Pointer<ffi.NativeFunction<Native_clang_toggleCrashRecovery>>
      get clang_toggleCrashRecovery => _library._clang_toggleCrashRecovery_ptr;
  ffi.Pointer<ffi.NativeFunction<Native_clang_getInclusions>>
      get clang_getInclusions => _library._clang_getInclusions_ptr;
  ffi.Pointer<ffi.NativeFunction<Native_clang_Cursor_Evaluate>>
      get clang_Cursor_Evaluate => _library._clang_Cursor_Evaluate_ptr;
  ffi.Pointer<ffi.NativeFunction<Native_clang_EvalResult_getKind>>
      get clang_EvalResult_getKind => _library._clang_EvalResult_getKind_ptr;
  ffi.Pointer<ffi.NativeFunction<Native_clang_EvalResult_getAsInt>>
      get clang_EvalResult_getAsInt => _library._clang_EvalResult_getAsInt_ptr;
  ffi.Pointer<ffi.NativeFunction<Native_clang_EvalResult_getAsLongLong>>
      get clang_EvalResult_getAsLongLong =>
          _library._clang_EvalResult_getAsLongLong_ptr;
  ffi.Pointer<ffi.NativeFunction<Native_clang_EvalResult_isUnsignedInt>>
      get clang_EvalResult_isUnsignedInt =>
          _library._clang_EvalResult_isUnsignedInt_ptr;
  ffi.Pointer<ffi.NativeFunction<Native_clang_EvalResult_getAsUnsigned>>
      get clang_EvalResult_getAsUnsigned =>
          _library._clang_EvalResult_getAsUnsigned_ptr;
  ffi.Pointer<ffi.NativeFunction<Native_clang_EvalResult_getAsDouble>>
      get clang_EvalResult_getAsDouble =>
          _library._clang_EvalResult_getAsDouble_ptr;
  ffi.Pointer<ffi.NativeFunction<Native_clang_EvalResult_getAsStr>>
      get clang_EvalResult_getAsStr => _library._clang_EvalResult_getAsStr_ptr;
  ffi.Pointer<ffi.NativeFunction<Native_clang_EvalResult_dispose>>
      get clang_EvalResult_dispose => _library._clang_EvalResult_dispose_ptr;
  ffi.Pointer<ffi.NativeFunction<Native_clang_getRemappings>>
      get clang_getRemappings => _library._clang_getRemappings_ptr;
  ffi.Pointer<ffi.NativeFunction<Native_clang_getRemappingsFromFileList>>
      get clang_getRemappingsFromFileList =>
          _library._clang_getRemappingsFromFileList_ptr;
  ffi.Pointer<ffi.NativeFunction<Native_clang_remap_getNumFiles>>
      get clang_remap_getNumFiles => _library._clang_remap_getNumFiles_ptr;
  ffi.Pointer<ffi.NativeFunction<Native_clang_remap_getFilenames>>
      get clang_remap_getFilenames => _library._clang_remap_getFilenames_ptr;
  ffi.Pointer<ffi.NativeFunction<Native_clang_remap_dispose>>
      get clang_remap_dispose => _library._clang_remap_dispose_ptr;
  ffi.Pointer<ffi.NativeFunction<Native_clang_findReferencesInFile>>
      get clang_findReferencesInFile =>
          _library._clang_findReferencesInFile_ptr;
  ffi.Pointer<ffi.NativeFunction<Native_clang_findIncludesInFile>>
      get clang_findIncludesInFile => _library._clang_findIncludesInFile_ptr;
  ffi.Pointer<ffi.NativeFunction<Native_clang_index_isEntityObjCContainerKind>>
      get clang_index_isEntityObjCContainerKind =>
          _library._clang_index_isEntityObjCContainerKind_ptr;
  ffi.Pointer<ffi.NativeFunction<Native_clang_index_getObjCContainerDeclInfo>>
      get clang_index_getObjCContainerDeclInfo =>
          _library._clang_index_getObjCContainerDeclInfo_ptr;
  ffi.Pointer<ffi.NativeFunction<Native_clang_index_getObjCInterfaceDeclInfo>>
      get clang_index_getObjCInterfaceDeclInfo =>
          _library._clang_index_getObjCInterfaceDeclInfo_ptr;
  ffi.Pointer<ffi.NativeFunction<Native_clang_index_getObjCCategoryDeclInfo>>
      get clang_index_getObjCCategoryDeclInfo =>
          _library._clang_index_getObjCCategoryDeclInfo_ptr;
  ffi.Pointer<ffi.NativeFunction<Native_clang_index_getObjCProtocolRefListInfo>>
      get clang_index_getObjCProtocolRefListInfo =>
          _library._clang_index_getObjCProtocolRefListInfo_ptr;
  ffi.Pointer<ffi.NativeFunction<Native_clang_index_getObjCPropertyDeclInfo>>
      get clang_index_getObjCPropertyDeclInfo =>
          _library._clang_index_getObjCPropertyDeclInfo_ptr;
  ffi.Pointer<
          ffi.NativeFunction<Native_clang_index_getIBOutletCollectionAttrInfo>>
      get clang_index_getIBOutletCollectionAttrInfo =>
          _library._clang_index_getIBOutletCollectionAttrInfo_ptr;
  ffi.Pointer<ffi.NativeFunction<Native_clang_index_getCXXClassDeclInfo>>
      get clang_index_getCXXClassDeclInfo =>
          _library._clang_index_getCXXClassDeclInfo_ptr;
  ffi.Pointer<ffi.NativeFunction<Native_clang_index_getClientContainer>>
      get clang_index_getClientContainer =>
          _library._clang_index_getClientContainer_ptr;
  ffi.Pointer<ffi.NativeFunction<Native_clang_index_setClientContainer>>
      get clang_index_setClientContainer =>
          _library._clang_index_setClientContainer_ptr;
  ffi.Pointer<ffi.NativeFunction<Native_clang_index_getClientEntity>>
      get clang_index_getClientEntity =>
          _library._clang_index_getClientEntity_ptr;
  ffi.Pointer<ffi.NativeFunction<Native_clang_index_setClientEntity>>
      get clang_index_setClientEntity =>
          _library._clang_index_setClientEntity_ptr;
  ffi.Pointer<ffi.NativeFunction<Native_clang_IndexAction_create>>
      get clang_IndexAction_create => _library._clang_IndexAction_create_ptr;
  ffi.Pointer<ffi.NativeFunction<Native_clang_IndexAction_dispose>>
      get clang_IndexAction_dispose => _library._clang_IndexAction_dispose_ptr;
  ffi.Pointer<ffi.NativeFunction<Native_clang_indexSourceFile>>
      get clang_indexSourceFile => _library._clang_indexSourceFile_ptr;
  ffi.Pointer<ffi.NativeFunction<Native_clang_indexSourceFileFullArgv>>
      get clang_indexSourceFileFullArgv =>
          _library._clang_indexSourceFileFullArgv_ptr;
  ffi.Pointer<ffi.NativeFunction<Native_clang_indexTranslationUnit>>
      get clang_indexTranslationUnit =>
          _library._clang_indexTranslationUnit_ptr;
  ffi.Pointer<ffi.NativeFunction<Native_clang_indexLoc_getFileLocation>>
      get clang_indexLoc_getFileLocation =>
          _library._clang_indexLoc_getFileLocation_ptr;
  ffi.Pointer<ffi.NativeFunction<Native_clang_indexLoc_getCXSourceLocation>>
      get clang_indexLoc_getCXSourceLocation =>
          _library._clang_indexLoc_getCXSourceLocation_ptr;
  ffi.Pointer<ffi.NativeFunction<Native_clang_Type_visitFields>>
      get clang_Type_visitFields => _library._clang_Type_visitFields_ptr;
}

/// A character string.
///
/// The \c CXString type is used to return strings from the interface when
/// the ownership of that string might differ from one call to the next.
/// Use \c clang_getCString() to retrieve the string data and, once finished
/// with the string data, call \c clang_disposeString() to free the string.
class CXString extends ffi.Struct {
  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 CXTargetInfoImpl extends ffi.Opaque {}

class CXTranslationUnitImpl extends ffi.Opaque {}

/// Provides the contents of a file that has not yet been saved to disk.
///
/// Each CXUnsavedFile instance provides the name of a file on the
/// system along with the current contents of that file that have not
/// yet been saved to disk.
class CXUnsavedFile extends ffi.Struct {
  /// The file whose contents have not yet been saved.
  ///
  /// This file must already exist in the file system.
  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 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;
}

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.
  ///
  /// Affects #clang_indexSourceFile, #clang_indexTranslationUnit,
  /// #clang_parseTranslationUnit, #clang_saveTranslationUnit.
  static const int CXGlobalOpt_ThreadBackgroundPriorityForIndexing = 1;

  /// Used to indicate that threads that libclang creates for editing
  /// purposes should use background priority.
  ///
  /// Affects #clang_reparseTranslationUnit, #clang_codeCompleteAt,
  /// #clang_annotateTokens
  static const int CXGlobalOpt_ThreadBackgroundPriorityForEditing = 2;

  /// Used to indicate that all threads that libclang creates should use
  /// background priority.
  static const int CXGlobalOpt_ThreadBackgroundPriorityForAll = 3;
}

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

/// Identifies a specific source location within a translation
/// unit.
///
/// Use clang_getExpansionLocation() or clang_getSpellingLocation()
/// to map a source location to a particular file, line, and column.
class CXSourceLocation extends ffi.Struct {
  @ffi.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.
///
/// Use clang_getRangeStart() and clang_getRangeEnd() to retrieve the
/// starting and end locations from a source range, respectively.
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 \c ranges array.
  @ffi.Uint32()
  external int count;

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

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;
}

/// A cursor representing some element in the abstract syntax tree for
/// a translation unit.
///
/// The cursor abstraction unifies the different kinds of entities in a
/// program--declaration, statements, expressions, references to declarations,
/// etc.--under a single "cursor" abstraction with a common set of operations.
/// Common operation for a cursor include: getting the physical location in
/// a source file where the cursor points, getting the name associated with a
/// cursor, and retrieving cursors for any child nodes of a particular cursor.
///
/// Cursors can be produced in two specific ways.
/// clang_getTranslationUnitCursor() produces a cursor for a translation unit,
/// from which one can use clang_visitChildren() to explore the rest of the
/// translation unit. clang_getCursor() maps from a physical source location
/// to the entity that resides at that location, allowing one to map from the
/// source code into the AST.
class CXCursor extends ffi.Struct {
  @ffi.Int32()
  external int kind;

  @ffi.Int32()
  external int xdata;

  @ffi.Array.multi([3])
  external ffi.Array<ffi.Pointer<ffi.Void>> data;
}

/// 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.
  ///
  /// Possible values are "ios" or "macos".
  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;
}

class CXCursorSetImpl extends ffi.Opaque {}

/// 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.
  ///
  /// E.g., struct S, or via a qualified name, e.g., N::M::type, or both.
  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;
}

/// 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 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.
  ///
  /// The cursor kind will be a macro, keyword, or a declaration (one of the
  /// *Decl cursor kinds), describing the entity that the completion is
  /// referring to.
  ///
  /// \todo In the future, we would like to provide a full cursor, to allow
  /// the client to extract additional information from declaration.
  @ffi.Int32()
  external int CursorKind;

  /// The code-completion string that describes how to insert this
  /// code-completion result into the editing buffer.
  external ffi.Pointer<ffi.Void> CompletionString;
}

/// Contains the results of code-completion.
///
/// This data structure contains the results of code completion, as
/// produced by \c clang_codeCompleteAt(). Its contents must be freed by
/// \c clang_disposeCodeCompleteResults.
class CXCodeCompleteResults extends ffi.Struct {
  /// The code-completion results.
  external ffi.Pointer<CXCompletionResult> Results;

  /// The number of code-completion results stored in the
  /// \c Results array.
  @ffi.Uint32()
  external int NumResults;
}

class CXCursorAndRangeVisitor extends ffi.Struct {
  external ffi.Pointer<ffi.Void> context;

  external ffi.Pointer<ffi.NativeFunction<_typedefC_2>> visit;
}

/// 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 ffi.Pointer<ffi.Void> 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 ffi.Pointer<ffi.Void> file;

  /// The imported module or NULL if the AST file is a PCH.
  external ffi.Pointer<ffi.Void> 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;
}

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;
}

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;
}

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.
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:
  ///
  /// \code
  /// Foo *var;
  /// \endcode
  ///
  /// The parent of reference of type 'Foo' is the variable 'var'.
  /// For references inside statement bodies of functions/methods,
  /// the parentEntity will be the function/method.
  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<_typedefC_3>> abortQuery;

  /// Called at the end of indexing; passes the complete diagnostic set.
  external ffi.Pointer<ffi.NativeFunction<_typedefC_4>> diagnostic;

  external ffi.Pointer<ffi.NativeFunction<_typedefC_5>> enteredMainFile;

  /// Called when a file gets \#included/\#imported.
  external ffi.Pointer<ffi.NativeFunction<_typedefC_6>> ppIncludedFile;

  /// Called when a AST file (PCH or module) gets imported.
  ///
  /// AST files will not get indexed (there will not be callbacks to index all
  /// the entities in an AST file). The recommended action is that, if the AST
  /// file is not already indexed, to initiate a new indexing job specific to
  /// the AST file.
  external ffi.Pointer<ffi.NativeFunction<_typedefC_7>> importedASTFile;

  /// Called at the beginning of indexing a translation unit.
  external ffi.Pointer<ffi.NativeFunction<_typedefC_8>> startedTranslationUnit;

  external ffi.Pointer<ffi.NativeFunction<_typedefC_9>> indexDeclaration;

  /// Called to index a reference of an entity.
  external ffi.Pointer<ffi.NativeFunction<_typedefC_10>> indexEntityReference;
}

const int CINDEX_VERSION_MAJOR = 0;

const int CINDEX_VERSION_MINOR = 59;

const int CINDEX_VERSION = 59;

const String CINDEX_VERSION_STRING = '0.59';

typedef Native_clang_getCString = ffi.Pointer<ffi.Int8> Function(
  CXString string,
);

typedef _dart_clang_getCString = ffi.Pointer<ffi.Int8> Function(
  CXString string,
);

typedef Native_clang_disposeString = ffi.Void Function(
  CXString string,
);

typedef _dart_clang_disposeString = void Function(
  CXString string,
);

typedef Native_clang_disposeStringSet = ffi.Void Function(
  ffi.Pointer<CXStringSet> set_1,
);

typedef _dart_clang_disposeStringSet = void Function(
  ffi.Pointer<CXStringSet> set_1,
);

typedef Native_clang_createIndex = ffi.Pointer<ffi.Void> Function(
  ffi.Int32 excludeDeclarationsFromPCH,
  ffi.Int32 displayDiagnostics,
);

typedef _dart_clang_createIndex = ffi.Pointer<ffi.Void> Function(
  int excludeDeclarationsFromPCH,
  int displayDiagnostics,
);

typedef Native_clang_disposeIndex = ffi.Void Function(
  ffi.Pointer<ffi.Void> index,
);

typedef _dart_clang_disposeIndex = void Function(
  ffi.Pointer<ffi.Void> index,
);

typedef Native_clang_CXIndex_setGlobalOptions = ffi.Void Function(
  ffi.Pointer<ffi.Void> arg0,
  ffi.Uint32 options,
);

typedef _dart_clang_CXIndex_setGlobalOptions = void Function(
  ffi.Pointer<ffi.Void> arg0,
  int options,
);

typedef Native_clang_CXIndex_getGlobalOptions = ffi.Uint32 Function(
  ffi.Pointer<ffi.Void> arg0,
);

typedef _dart_clang_CXIndex_getGlobalOptions = int Function(
  ffi.Pointer<ffi.Void> arg0,
);

typedef Native_clang_CXIndex_setInvocationEmissionPathOption = ffi.Void
    Function(
  ffi.Pointer<ffi.Void> arg0,
  ffi.Pointer<ffi.Int8> Path,
);

typedef _dart_clang_CXIndex_setInvocationEmissionPathOption = void Function(
  ffi.Pointer<ffi.Void> arg0,
  ffi.Pointer<ffi.Int8> Path,
);

typedef Native_clang_getFileName = CXString Function(
  ffi.Pointer<ffi.Void> SFile,
);

typedef _dart_clang_getFileName = CXString Function(
  ffi.Pointer<ffi.Void> SFile,
);

typedef Native_clang_getFileTime = ffi.Int64 Function(
  ffi.Pointer<ffi.Void> SFile,
);

typedef _dart_clang_getFileTime = int Function(
  ffi.Pointer<ffi.Void> SFile,
);

typedef Native_clang_getFileUniqueID = ffi.Int32 Function(
  ffi.Pointer<ffi.Void> file,
  ffi.Pointer<CXFileUniqueID> outID,
);

typedef _dart_clang_getFileUniqueID = int Function(
  ffi.Pointer<ffi.Void> file,
  ffi.Pointer<CXFileUniqueID> outID,
);

typedef Native_clang_isFileMultipleIncludeGuarded = ffi.Uint32 Function(
  ffi.Pointer<CXTranslationUnitImpl> tu,
  ffi.Pointer<ffi.Void> file,
);

typedef _dart_clang_isFileMultipleIncludeGuarded = int Function(
  ffi.Pointer<CXTranslationUnitImpl> tu,
  ffi.Pointer<ffi.Void> file,
);

typedef Native_clang_getFile = ffi.Pointer<ffi.Void> Function(
  ffi.Pointer<CXTranslationUnitImpl> tu,
  ffi.Pointer<ffi.Int8> file_name,
);

typedef _dart_clang_getFile = ffi.Pointer<ffi.Void> Function(
  ffi.Pointer<CXTranslationUnitImpl> tu,
  ffi.Pointer<ffi.Int8> file_name,
);

typedef Native_clang_getFileContents = ffi.Pointer<ffi.Int8> Function(
  ffi.Pointer<CXTranslationUnitImpl> tu,
  ffi.Pointer<ffi.Void> file,
  ffi.Pointer<ffi.Uint64> size,
);

typedef _dart_clang_getFileContents = ffi.Pointer<ffi.Int8> Function(
  ffi.Pointer<CXTranslationUnitImpl> tu,
  ffi.Pointer<ffi.Void> file,
  ffi.Pointer<ffi.Uint64> size,
);

typedef Native_clang_File_isEqual = ffi.Int32 Function(
  ffi.Pointer<ffi.Void> file1,
  ffi.Pointer<ffi.Void> file2,
);

typedef _dart_clang_File_isEqual = int Function(
  ffi.Pointer<ffi.Void> file1,
  ffi.Pointer<ffi.Void> file2,
);

typedef Native_clang_File_tryGetRealPathName = CXString Function(
  ffi.Pointer<ffi.Void> file,
);

typedef _dart_clang_File_tryGetRealPathName = CXString Function(
  ffi.Pointer<ffi.Void> file,
);

typedef Native_clang_getNullLocation = CXSourceLocation Function();

typedef _dart_clang_getNullLocation = CXSourceLocation Function();

typedef Native_clang_equalLocations = ffi.Uint32 Function(
  CXSourceLocation loc1,
  CXSourceLocation loc2,
);

typedef _dart_clang_equalLocations = int Function(
  CXSourceLocation loc1,
  CXSourceLocation loc2,
);

typedef Native_clang_getLocation = CXSourceLocation Function(
  ffi.Pointer<CXTranslationUnitImpl> tu,
  ffi.Pointer<ffi.Void> file,
  ffi.Uint32 line,
  ffi.Uint32 column,
);

typedef _dart_clang_getLocation = CXSourceLocation Function(
  ffi.Pointer<CXTranslationUnitImpl> tu,
  ffi.Pointer<ffi.Void> file,
  int line,
  int column,
);

typedef Native_clang_getLocationForOffset = CXSourceLocation Function(
  ffi.Pointer<CXTranslationUnitImpl> tu,
  ffi.Pointer<ffi.Void> file,
  ffi.Uint32 offset,
);

typedef _dart_clang_getLocationForOffset = CXSourceLocation Function(
  ffi.Pointer<CXTranslationUnitImpl> tu,
  ffi.Pointer<ffi.Void> file,
  int offset,
);

typedef Native_clang_Location_isInSystemHeader = ffi.Int32 Function(
  CXSourceLocation location,
);

typedef _dart_clang_Location_isInSystemHeader = int Function(
  CXSourceLocation location,
);

typedef Native_clang_Location_isFromMainFile = ffi.Int32 Function(
  CXSourceLocation location,
);

typedef _dart_clang_Location_isFromMainFile = int Function(
  CXSourceLocation location,
);

typedef Native_clang_getNullRange = CXSourceRange Function();

typedef _dart_clang_getNullRange = CXSourceRange Function();

typedef Native_clang_getRange = CXSourceRange Function(
  CXSourceLocation begin,
  CXSourceLocation end,
);

typedef _dart_clang_getRange = CXSourceRange Function(
  CXSourceLocation begin,
  CXSourceLocation end,
);

typedef Native_clang_equalRanges = ffi.Uint32 Function(
  CXSourceRange range1,
  CXSourceRange range2,
);

typedef _dart_clang_equalRanges = int Function(
  CXSourceRange range1,
  CXSourceRange range2,
);

typedef Native_clang_Range_isNull = ffi.Int32 Function(
  CXSourceRange range,
);

typedef _dart_clang_Range_isNull = int Function(
  CXSourceRange range,
);

typedef Native_clang_getExpansionLocation = ffi.Void Function(
  CXSourceLocation location,
  ffi.Pointer<ffi.Pointer<ffi.Void>> file,
  ffi.Pointer<ffi.Uint32> line,
  ffi.Pointer<ffi.Uint32> column,
  ffi.Pointer<ffi.Uint32> offset,
);

typedef _dart_clang_getExpansionLocation = void Function(
  CXSourceLocation location,
  ffi.Pointer<ffi.Pointer<ffi.Void>> file,
  ffi.Pointer<ffi.Uint32> line,
  ffi.Pointer<ffi.Uint32> column,
  ffi.Pointer<ffi.Uint32> offset,
);

typedef Native_clang_getPresumedLocation = ffi.Void Function(
  CXSourceLocation location,
  ffi.Pointer<CXString> filename,
  ffi.Pointer<ffi.Uint32> line,
  ffi.Pointer<ffi.Uint32> column,
);

typedef _dart_clang_getPresumedLocation = void Function(
  CXSourceLocation location,
  ffi.Pointer<CXString> filename,
  ffi.Pointer<ffi.Uint32> line,
  ffi.Pointer<ffi.Uint32> column,
);

typedef Native_clang_getInstantiationLocation = ffi.Void Function(
  CXSourceLocation location,
  ffi.Pointer<ffi.Pointer<ffi.Void>> file,
  ffi.Pointer<ffi.Uint32> line,
  ffi.Pointer<ffi.Uint32> column,
  ffi.Pointer<ffi.Uint32> offset,
);

typedef _dart_clang_getInstantiationLocation = void Function(
  CXSourceLocation location,
  ffi.Pointer<ffi.Pointer<ffi.Void>> file,
  ffi.Pointer<ffi.Uint32> line,
  ffi.Pointer<ffi.Uint32> column,
  ffi.Pointer<ffi.Uint32> offset,
);

typedef Native_clang_getSpellingLocation = ffi.Void Function(
  CXSourceLocation location,
  ffi.Pointer<ffi.Pointer<ffi.Void>> file,
  ffi.Pointer<ffi.Uint32> line,
  ffi.Pointer<ffi.Uint32> column,
  ffi.Pointer<ffi.Uint32> offset,
);

typedef _dart_clang_getSpellingLocation = void Function(
  CXSourceLocation location,
  ffi.Pointer<ffi.Pointer<ffi.Void>> file,
  ffi.Pointer<ffi.Uint32> line,
  ffi.Pointer<ffi.Uint32> column,
  ffi.Pointer<ffi.Uint32> offset,
);

typedef Native_clang_getFileLocation = ffi.Void Function(
  CXSourceLocation location,
  ffi.Pointer<ffi.Pointer<ffi.Void>> file,
  ffi.Pointer<ffi.Uint32> line,
  ffi.Pointer<ffi.Uint32> column,
  ffi.Pointer<ffi.Uint32> offset,
);

typedef _dart_clang_getFileLocation = void Function(
  CXSourceLocation location,
  ffi.Pointer<ffi.Pointer<ffi.Void>> file,
  ffi.Pointer<ffi.Uint32> line,
  ffi.Pointer<ffi.Uint32> column,
  ffi.Pointer<ffi.Uint32> offset,
);

typedef Native_clang_getRangeStart = CXSourceLocation Function(
  CXSourceRange range,
);

typedef _dart_clang_getRangeStart = CXSourceLocation Function(
  CXSourceRange range,
);

typedef Native_clang_getRangeEnd = CXSourceLocation Function(
  CXSourceRange range,
);

typedef _dart_clang_getRangeEnd = CXSourceLocation Function(
  CXSourceRange range,
);

typedef Native_clang_getSkippedRanges = ffi.Pointer<CXSourceRangeList> Function(
  ffi.Pointer<CXTranslationUnitImpl> tu,
  ffi.Pointer<ffi.Void> file,
);

typedef _dart_clang_getSkippedRanges = ffi.Pointer<CXSourceRangeList> Function(
  ffi.Pointer<CXTranslationUnitImpl> tu,
  ffi.Pointer<ffi.Void> file,
);

typedef Native_clang_getAllSkippedRanges = ffi.Pointer<CXSourceRangeList>
    Function(
  ffi.Pointer<CXTranslationUnitImpl> tu,
);

typedef _dart_clang_getAllSkippedRanges = ffi.Pointer<CXSourceRangeList>
    Function(
  ffi.Pointer<CXTranslationUnitImpl> tu,
);

typedef Native_clang_disposeSourceRangeList = ffi.Void Function(
  ffi.Pointer<CXSourceRangeList> ranges,
);

typedef _dart_clang_disposeSourceRangeList = void Function(
  ffi.Pointer<CXSourceRangeList> ranges,
);

typedef Native_clang_getNumDiagnosticsInSet = ffi.Uint32 Function(
  ffi.Pointer<ffi.Void> Diags,
);

typedef _dart_clang_getNumDiagnosticsInSet = int Function(
  ffi.Pointer<ffi.Void> Diags,
);

typedef Native_clang_getDiagnosticInSet = ffi.Pointer<ffi.Void> Function(
  ffi.Pointer<ffi.Void> Diags,
  ffi.Uint32 Index,
);

typedef _dart_clang_getDiagnosticInSet = ffi.Pointer<ffi.Void> Function(
  ffi.Pointer<ffi.Void> Diags,
  int Index,
);

typedef Native_clang_loadDiagnostics = ffi.Pointer<ffi.Void> Function(
  ffi.Pointer<ffi.Int8> file,
  ffi.Pointer<ffi.Int32> error,
  ffi.Pointer<CXString> errorString,
);

typedef _dart_clang_loadDiagnostics = ffi.Pointer<ffi.Void> Function(
  ffi.Pointer<ffi.Int8> file,
  ffi.Pointer<ffi.Int32> error,
  ffi.Pointer<CXString> errorString,
);

typedef Native_clang_disposeDiagnosticSet = ffi.Void Function(
  ffi.Pointer<ffi.Void> Diags,
);

typedef _dart_clang_disposeDiagnosticSet = void Function(
  ffi.Pointer<ffi.Void> Diags,
);

typedef Native_clang_getChildDiagnostics = ffi.Pointer<ffi.Void> Function(
  ffi.Pointer<ffi.Void> D,
);

typedef _dart_clang_getChildDiagnostics = ffi.Pointer<ffi.Void> Function(
  ffi.Pointer<ffi.Void> D,
);

typedef Native_clang_getNumDiagnostics = ffi.Uint32 Function(
  ffi.Pointer<CXTranslationUnitImpl> Unit,
);

typedef _dart_clang_getNumDiagnostics = int Function(
  ffi.Pointer<CXTranslationUnitImpl> Unit,
);

typedef Native_clang_getDiagnostic = ffi.Pointer<ffi.Void> Function(
  ffi.Pointer<CXTranslationUnitImpl> Unit,
  ffi.Uint32 Index,
);

typedef _dart_clang_getDiagnostic = ffi.Pointer<ffi.Void> Function(
  ffi.Pointer<CXTranslationUnitImpl> Unit,
  int Index,
);

typedef Native_clang_getDiagnosticSetFromTU = ffi.Pointer<ffi.Void> Function(
  ffi.Pointer<CXTranslationUnitImpl> Unit,
);

typedef _dart_clang_getDiagnosticSetFromTU = ffi.Pointer<ffi.Void> Function(
  ffi.Pointer<CXTranslationUnitImpl> Unit,
);

typedef Native_clang_disposeDiagnostic = ffi.Void Function(
  ffi.Pointer<ffi.Void> Diagnostic,
);

typedef _dart_clang_disposeDiagnostic = void Function(
  ffi.Pointer<ffi.Void> Diagnostic,
);

typedef Native_clang_formatDiagnostic = CXString Function(
  ffi.Pointer<ffi.Void> Diagnostic,
  ffi.Uint32 Options,
);

typedef _dart_clang_formatDiagnostic = CXString Function(
  ffi.Pointer<ffi.Void> Diagnostic,
  int Options,
);

typedef Native_clang_defaultDiagnosticDisplayOptions = ffi.Uint32 Function();

typedef _dart_clang_defaultDiagnosticDisplayOptions = int Function();

typedef Native_clang_getDiagnosticSeverity = ffi.Int32 Function(
  ffi.Pointer<ffi.Void> arg0,
);

typedef _dart_clang_getDiagnosticSeverity = int Function(
  ffi.Pointer<ffi.Void> arg0,
);

typedef Native_clang_getDiagnosticLocation = CXSourceLocation Function(
  ffi.Pointer<ffi.Void> arg0,
);

typedef _dart_clang_getDiagnosticLocation = CXSourceLocation Function(
  ffi.Pointer<ffi.Void> arg0,
);

typedef Native_clang_getDiagnosticSpelling = CXString Function(
  ffi.Pointer<ffi.Void> arg0,
);

typedef _dart_clang_getDiagnosticSpelling = CXString Function(
  ffi.Pointer<ffi.Void> arg0,
);

typedef Native_clang_getDiagnosticOption = CXString Function(
  ffi.Pointer<ffi.Void> Diag,
  ffi.Pointer<CXString> Disable,
);

typedef _dart_clang_getDiagnosticOption = CXString Function(
  ffi.Pointer<ffi.Void> Diag,
  ffi.Pointer<CXString> Disable,
);

typedef Native_clang_getDiagnosticCategory = ffi.Uint32 Function(
  ffi.Pointer<ffi.Void> arg0,
);

typedef _dart_clang_getDiagnosticCategory = int Function(
  ffi.Pointer<ffi.Void> arg0,
);

typedef Native_clang_getDiagnosticCategoryName = CXString Function(
  ffi.Uint32 Category,
);

typedef _dart_clang_getDiagnosticCategoryName = CXString Function(
  int Category,
);

typedef Native_clang_getDiagnosticCategoryText = CXString Function(
  ffi.Pointer<ffi.Void> arg0,
);

typedef _dart_clang_getDiagnosticCategoryText = CXString Function(
  ffi.Pointer<ffi.Void> arg0,
);

typedef Native_clang_getDiagnosticNumRanges = ffi.Uint32 Function(
  ffi.Pointer<ffi.Void> arg0,
);

typedef _dart_clang_getDiagnosticNumRanges = int Function(
  ffi.Pointer<ffi.Void> arg0,
);

typedef Native_clang_getDiagnosticRange = CXSourceRange Function(
  ffi.Pointer<ffi.Void> Diagnostic,
  ffi.Uint32 Range,
);

typedef _dart_clang_getDiagnosticRange = CXSourceRange Function(
  ffi.Pointer<ffi.Void> Diagnostic,
  int Range,
);

typedef Native_clang_getDiagnosticNumFixIts = ffi.Uint32 Function(
  ffi.Pointer<ffi.Void> Diagnostic,
);

typedef _dart_clang_getDiagnosticNumFixIts = int Function(
  ffi.Pointer<ffi.Void> Diagnostic,
);

typedef Native_clang_getDiagnosticFixIt = CXString Function(
  ffi.Pointer<ffi.Void> Diagnostic,
  ffi.Uint32 FixIt,
  ffi.Pointer<CXSourceRange> ReplacementRange,
);

typedef _dart_clang_getDiagnosticFixIt = CXString Function(
  ffi.Pointer<ffi.Void> Diagnostic,
  int FixIt,
  ffi.Pointer<CXSourceRange> ReplacementRange,
);

typedef Native_clang_getTranslationUnitSpelling = CXString Function(
  ffi.Pointer<CXTranslationUnitImpl> CTUnit,
);

typedef _dart_clang_getTranslationUnitSpelling = CXString Function(
  ffi.Pointer<CXTranslationUnitImpl> CTUnit,
);

typedef Native_clang_createTranslationUnitFromSourceFile
    = ffi.Pointer<CXTranslationUnitImpl> Function(
  ffi.Pointer<ffi.Void> CIdx,
  ffi.Pointer<ffi.Int8> source_filename,
  ffi.Int32 num_clang_command_line_args,
  ffi.Pointer<ffi.Pointer<ffi.Int8>> clang_command_line_args,
  ffi.Uint32 num_unsaved_files,
  ffi.Pointer<CXUnsavedFile> unsaved_files,
);

typedef _dart_clang_createTranslationUnitFromSourceFile
    = ffi.Pointer<CXTranslationUnitImpl> Function(
  ffi.Pointer<ffi.Void> CIdx,
  ffi.Pointer<ffi.Int8> source_filename,
  int num_clang_command_line_args,
  ffi.Pointer<ffi.Pointer<ffi.Int8>> clang_command_line_args,
  int num_unsaved_files,
  ffi.Pointer<CXUnsavedFile> unsaved_files,
);

typedef Native_clang_createTranslationUnit = ffi.Pointer<CXTranslationUnitImpl>
    Function(
  ffi.Pointer<ffi.Void> CIdx,
  ffi.Pointer<ffi.Int8> ast_filename,
);

typedef _dart_clang_createTranslationUnit = ffi.Pointer<CXTranslationUnitImpl>
    Function(
  ffi.Pointer<ffi.Void> CIdx,
  ffi.Pointer<ffi.Int8> ast_filename,
);

typedef Native_clang_createTranslationUnit2 = ffi.Int32 Function(
  ffi.Pointer<ffi.Void> CIdx,
  ffi.Pointer<ffi.Int8> ast_filename,
  ffi.Pointer<ffi.Pointer<CXTranslationUnitImpl>> out_TU,
);

typedef _dart_clang_createTranslationUnit2 = int Function(
  ffi.Pointer<ffi.Void> CIdx,
  ffi.Pointer<ffi.Int8> ast_filename,
  ffi.Pointer<ffi.Pointer<CXTranslationUnitImpl>> out_TU,
);

typedef Native_clang_defaultEditingTranslationUnitOptions = ffi.Uint32
    Function();

typedef _dart_clang_defaultEditingTranslationUnitOptions = int Function();

typedef Native_clang_parseTranslationUnit = ffi.Pointer<CXTranslationUnitImpl>
    Function(
  ffi.Pointer<ffi.Void> CIdx,
  ffi.Pointer<ffi.Int8> source_filename,
  ffi.Pointer<ffi.Pointer<ffi.Int8>> command_line_args,
  ffi.Int32 num_command_line_args,
  ffi.Pointer<CXUnsavedFile> unsaved_files,
  ffi.Uint32 num_unsaved_files,
  ffi.Uint32 options,
);

typedef _dart_clang_parseTranslationUnit = ffi.Pointer<CXTranslationUnitImpl>
    Function(
  ffi.Pointer<ffi.Void> CIdx,
  ffi.Pointer<ffi.Int8> source_filename,
  ffi.Pointer<ffi.Pointer<ffi.Int8>> command_line_args,
  int num_command_line_args,
  ffi.Pointer<CXUnsavedFile> unsaved_files,
  int num_unsaved_files,
  int options,
);

typedef Native_clang_parseTranslationUnit2 = ffi.Int32 Function(
  ffi.Pointer<ffi.Void> CIdx,
  ffi.Pointer<ffi.Int8> source_filename,
  ffi.Pointer<ffi.Pointer<ffi.Int8>> command_line_args,
  ffi.Int32 num_command_line_args,
  ffi.Pointer<CXUnsavedFile> unsaved_files,
  ffi.Uint32 num_unsaved_files,
  ffi.Uint32 options,
  ffi.Pointer<ffi.Pointer<CXTranslationUnitImpl>> out_TU,
);

typedef _dart_clang_parseTranslationUnit2 = int Function(
  ffi.Pointer<ffi.Void> CIdx,
  ffi.Pointer<ffi.Int8> source_filename,
  ffi.Pointer<ffi.Pointer<ffi.Int8>> command_line_args,
  int num_command_line_args,
  ffi.Pointer<CXUnsavedFile> unsaved_files,
  int num_unsaved_files,
  int options,
  ffi.Pointer<ffi.Pointer<CXTranslationUnitImpl>> out_TU,
);

typedef Native_clang_parseTranslationUnit2FullArgv = ffi.Int32 Function(
  ffi.Pointer<ffi.Void> CIdx,
  ffi.Pointer<ffi.Int8> source_filename,
  ffi.Pointer<ffi.Pointer<ffi.Int8>> command_line_args,
  ffi.Int32 num_command_line_args,
  ffi.Pointer<CXUnsavedFile> unsaved_files,
  ffi.Uint32 num_unsaved_files,
  ffi.Uint32 options,
  ffi.Pointer<ffi.Pointer<CXTranslationUnitImpl>> out_TU,
);

typedef _dart_clang_parseTranslationUnit2FullArgv = int Function(
  ffi.Pointer<ffi.Void> CIdx,
  ffi.Pointer<ffi.Int8> source_filename,
  ffi.Pointer<ffi.Pointer<ffi.Int8>> command_line_args,
  int num_command_line_args,
  ffi.Pointer<CXUnsavedFile> unsaved_files,
  int num_unsaved_files,
  int options,
  ffi.Pointer<ffi.Pointer<CXTranslationUnitImpl>> out_TU,
);

typedef Native_clang_defaultSaveOptions = ffi.Uint32 Function(
  ffi.Pointer<CXTranslationUnitImpl> TU,
);

typedef _dart_clang_defaultSaveOptions = int Function(
  ffi.Pointer<CXTranslationUnitImpl> TU,
);

typedef Native_clang_saveTranslationUnit = ffi.Int32 Function(
  ffi.Pointer<CXTranslationUnitImpl> TU,
  ffi.Pointer<ffi.Int8> FileName,
  ffi.Uint32 options,
);

typedef _dart_clang_saveTranslationUnit = int Function(
  ffi.Pointer<CXTranslationUnitImpl> TU,
  ffi.Pointer<ffi.Int8> FileName,
  int options,
);

typedef Native_clang_suspendTranslationUnit = ffi.Uint32 Function(
  ffi.Pointer<CXTranslationUnitImpl> arg0,
);

typedef _dart_clang_suspendTranslationUnit = int Function(
  ffi.Pointer<CXTranslationUnitImpl> arg0,
);

typedef Native_clang_disposeTranslationUnit = ffi.Void Function(
  ffi.Pointer<CXTranslationUnitImpl> arg0,
);

typedef _dart_clang_disposeTranslationUnit = void Function(
  ffi.Pointer<CXTranslationUnitImpl> arg0,
);

typedef Native_clang_defaultReparseOptions = ffi.Uint32 Function(
  ffi.Pointer<CXTranslationUnitImpl> TU,
);

typedef _dart_clang_defaultReparseOptions = int Function(
  ffi.Pointer<CXTranslationUnitImpl> TU,
);

typedef Native_clang_reparseTranslationUnit = ffi.Int32 Function(
  ffi.Pointer<CXTranslationUnitImpl> TU,
  ffi.Uint32 num_unsaved_files,
  ffi.Pointer<CXUnsavedFile> unsaved_files,
  ffi.Uint32 options,
);

typedef _dart_clang_reparseTranslationUnit = int Function(
  ffi.Pointer<CXTranslationUnitImpl> TU,
  int num_unsaved_files,
  ffi.Pointer<CXUnsavedFile> unsaved_files,
  int options,
);

typedef Native_clang_getTUResourceUsageName = ffi.Pointer<ffi.Int8> Function(
  ffi.Int32 kind,
);

typedef _dart_clang_getTUResourceUsageName = ffi.Pointer<ffi.Int8> Function(
  int kind,
);

typedef Native_clang_getCXTUResourceUsage = CXTUResourceUsage Function(
  ffi.Pointer<CXTranslationUnitImpl> TU,
);

typedef _dart_clang_getCXTUResourceUsage = CXTUResourceUsage Function(
  ffi.Pointer<CXTranslationUnitImpl> TU,
);

typedef Native_clang_disposeCXTUResourceUsage = ffi.Void Function(
  CXTUResourceUsage usage,
);

typedef _dart_clang_disposeCXTUResourceUsage = void Function(
  CXTUResourceUsage usage,
);

typedef Native_clang_getTranslationUnitTargetInfo
    = ffi.Pointer<CXTargetInfoImpl> Function(
  ffi.Pointer<CXTranslationUnitImpl> CTUnit,
);

typedef _dart_clang_getTranslationUnitTargetInfo = ffi.Pointer<CXTargetInfoImpl>
    Function(
  ffi.Pointer<CXTranslationUnitImpl> CTUnit,
);

typedef Native_clang_TargetInfo_dispose = ffi.Void Function(
  ffi.Pointer<CXTargetInfoImpl> Info,
);

typedef _dart_clang_TargetInfo_dispose = void Function(
  ffi.Pointer<CXTargetInfoImpl> Info,
);

typedef Native_clang_TargetInfo_getTriple = CXString Function(
  ffi.Pointer<CXTargetInfoImpl> Info,
);

typedef _dart_clang_TargetInfo_getTriple = CXString Function(
  ffi.Pointer<CXTargetInfoImpl> Info,
);

typedef Native_clang_TargetInfo_getPointerWidth = ffi.Int32 Function(
  ffi.Pointer<CXTargetInfoImpl> Info,
);

typedef _dart_clang_TargetInfo_getPointerWidth = int Function(
  ffi.Pointer<CXTargetInfoImpl> Info,
);

typedef Native_clang_getNullCursor = CXCursor Function();

typedef _dart_clang_getNullCursor = CXCursor Function();

typedef Native_clang_getTranslationUnitCursor = CXCursor Function(
  ffi.Pointer<CXTranslationUnitImpl> arg0,
);

typedef _dart_clang_getTranslationUnitCursor = CXCursor Function(
  ffi.Pointer<CXTranslationUnitImpl> arg0,
);

typedef Native_clang_equalCursors = ffi.Uint32 Function(
  CXCursor arg0,
  CXCursor arg1,
);

typedef _dart_clang_equalCursors = int Function(
  CXCursor arg0,
  CXCursor arg1,
);

typedef Native_clang_Cursor_isNull = ffi.Int32 Function(
  CXCursor cursor,
);

typedef _dart_clang_Cursor_isNull = int Function(
  CXCursor cursor,
);

typedef Native_clang_hashCursor = ffi.Uint32 Function(
  CXCursor arg0,
);

typedef _dart_clang_hashCursor = int Function(
  CXCursor arg0,
);

typedef Native_clang_getCursorKind = ffi.Int32 Function(
  CXCursor arg0,
);

typedef _dart_clang_getCursorKind = int Function(
  CXCursor arg0,
);

typedef Native_clang_isDeclaration = ffi.Uint32 Function(
  ffi.Int32 arg0,
);

typedef _dart_clang_isDeclaration = int Function(
  int arg0,
);

typedef Native_clang_isInvalidDeclaration = ffi.Uint32 Function(
  CXCursor arg0,
);

typedef _dart_clang_isInvalidDeclaration = int Function(
  CXCursor arg0,
);

typedef Native_clang_isReference = ffi.Uint32 Function(
  ffi.Int32 arg0,
);

typedef _dart_clang_isReference = int Function(
  int arg0,
);

typedef Native_clang_isExpression = ffi.Uint32 Function(
  ffi.Int32 arg0,
);

typedef _dart_clang_isExpression = int Function(
  int arg0,
);

typedef Native_clang_isStatement = ffi.Uint32 Function(
  ffi.Int32 arg0,
);

typedef _dart_clang_isStatement = int Function(
  int arg0,
);

typedef Native_clang_isAttribute = ffi.Uint32 Function(
  ffi.Int32 arg0,
);

typedef _dart_clang_isAttribute = int Function(
  int arg0,
);

typedef Native_clang_Cursor_hasAttrs = ffi.Uint32 Function(
  CXCursor C,
);

typedef _dart_clang_Cursor_hasAttrs = int Function(
  CXCursor C,
);

typedef Native_clang_isInvalid = ffi.Uint32 Function(
  ffi.Int32 arg0,
);

typedef _dart_clang_isInvalid = int Function(
  int arg0,
);

typedef Native_clang_isTranslationUnit = ffi.Uint32 Function(
  ffi.Int32 arg0,
);

typedef _dart_clang_isTranslationUnit = int Function(
  int arg0,
);

typedef Native_clang_isPreprocessing = ffi.Uint32 Function(
  ffi.Int32 arg0,
);

typedef _dart_clang_isPreprocessing = int Function(
  int arg0,
);

typedef Native_clang_isUnexposed = ffi.Uint32 Function(
  ffi.Int32 arg0,
);

typedef _dart_clang_isUnexposed = int Function(
  int arg0,
);

typedef Native_clang_getCursorLinkage = ffi.Int32 Function(
  CXCursor cursor,
);

typedef _dart_clang_getCursorLinkage = int Function(
  CXCursor cursor,
);

typedef Native_clang_getCursorVisibility = ffi.Int32 Function(
  CXCursor cursor,
);

typedef _dart_clang_getCursorVisibility = int Function(
  CXCursor cursor,
);

typedef Native_clang_getCursorAvailability = ffi.Int32 Function(
  CXCursor cursor,
);

typedef _dart_clang_getCursorAvailability = int Function(
  CXCursor cursor,
);

typedef Native_clang_getCursorPlatformAvailability = ffi.Int32 Function(
  CXCursor cursor,
  ffi.Pointer<ffi.Int32> always_deprecated,
  ffi.Pointer<CXString> deprecated_message,
  ffi.Pointer<ffi.Int32> always_unavailable,
  ffi.Pointer<CXString> unavailable_message,
  ffi.Pointer<CXPlatformAvailability> availability,
  ffi.Int32 availability_size,
);

typedef _dart_clang_getCursorPlatformAvailability = int Function(
  CXCursor cursor,
  ffi.Pointer<ffi.Int32> always_deprecated,
  ffi.Pointer<CXString> deprecated_message,
  ffi.Pointer<ffi.Int32> always_unavailable,
  ffi.Pointer<CXString> unavailable_message,
  ffi.Pointer<CXPlatformAvailability> availability,
  int availability_size,
);

typedef Native_clang_disposeCXPlatformAvailability = ffi.Void Function(
  ffi.Pointer<CXPlatformAvailability> availability,
);

typedef _dart_clang_disposeCXPlatformAvailability = void Function(
  ffi.Pointer<CXPlatformAvailability> availability,
);

typedef Native_clang_getCursorLanguage = ffi.Int32 Function(
  CXCursor cursor,
);

typedef _dart_clang_getCursorLanguage = int Function(
  CXCursor cursor,
);

typedef Native_clang_getCursorTLSKind = ffi.Int32 Function(
  CXCursor cursor,
);

typedef _dart_clang_getCursorTLSKind = int Function(
  CXCursor cursor,
);

typedef Native_clang_Cursor_getTranslationUnit
    = ffi.Pointer<CXTranslationUnitImpl> Function(
  CXCursor arg0,
);

typedef _dart_clang_Cursor_getTranslationUnit
    = ffi.Pointer<CXTranslationUnitImpl> Function(
  CXCursor arg0,
);

typedef Native_clang_createCXCursorSet = ffi.Pointer<CXCursorSetImpl>
    Function();

typedef _dart_clang_createCXCursorSet = ffi.Pointer<CXCursorSetImpl> Function();

typedef Native_clang_disposeCXCursorSet = ffi.Void Function(
  ffi.Pointer<CXCursorSetImpl> cset,
);

typedef _dart_clang_disposeCXCursorSet = void Function(
  ffi.Pointer<CXCursorSetImpl> cset,
);

typedef Native_clang_CXCursorSet_contains = ffi.Uint32 Function(
  ffi.Pointer<CXCursorSetImpl> cset,
  CXCursor cursor,
);

typedef _dart_clang_CXCursorSet_contains = int Function(
  ffi.Pointer<CXCursorSetImpl> cset,
  CXCursor cursor,
);

typedef Native_clang_CXCursorSet_insert = ffi.Uint32 Function(
  ffi.Pointer<CXCursorSetImpl> cset,
  CXCursor cursor,
);

typedef _dart_clang_CXCursorSet_insert = int Function(
  ffi.Pointer<CXCursorSetImpl> cset,
  CXCursor cursor,
);

typedef Native_clang_getCursorSemanticParent = CXCursor Function(
  CXCursor cursor,
);

typedef _dart_clang_getCursorSemanticParent = CXCursor Function(
  CXCursor cursor,
);

typedef Native_clang_getCursorLexicalParent = CXCursor Function(
  CXCursor cursor,
);

typedef _dart_clang_getCursorLexicalParent = CXCursor Function(
  CXCursor cursor,
);

typedef Native_clang_getOverriddenCursors = ffi.Void Function(
  CXCursor cursor,
  ffi.Pointer<ffi.Pointer<CXCursor>> overridden,
  ffi.Pointer<ffi.Uint32> num_overridden,
);

typedef _dart_clang_getOverriddenCursors = void Function(
  CXCursor cursor,
  ffi.Pointer<ffi.Pointer<CXCursor>> overridden,
  ffi.Pointer<ffi.Uint32> num_overridden,
);

typedef Native_clang_disposeOverriddenCursors = ffi.Void Function(
  ffi.Pointer<CXCursor> overridden,
);

typedef _dart_clang_disposeOverriddenCursors = void Function(
  ffi.Pointer<CXCursor> overridden,
);

typedef Native_clang_getIncludedFile = ffi.Pointer<ffi.Void> Function(
  CXCursor cursor,
);

typedef _dart_clang_getIncludedFile = ffi.Pointer<ffi.Void> Function(
  CXCursor cursor,
);

typedef Native_clang_getCursor = CXCursor Function(
  ffi.Pointer<CXTranslationUnitImpl> arg0,
  CXSourceLocation arg1,
);

typedef _dart_clang_getCursor = CXCursor Function(
  ffi.Pointer<CXTranslationUnitImpl> arg0,
  CXSourceLocation arg1,
);

typedef Native_clang_getCursorLocation = CXSourceLocation Function(
  CXCursor arg0,
);

typedef _dart_clang_getCursorLocation = CXSourceLocation Function(
  CXCursor arg0,
);

typedef Native_clang_getCursorExtent = CXSourceRange Function(
  CXCursor arg0,
);

typedef _dart_clang_getCursorExtent = CXSourceRange Function(
  CXCursor arg0,
);

typedef Native_clang_getCursorType = CXType Function(
  CXCursor C,
);

typedef _dart_clang_getCursorType = CXType Function(
  CXCursor C,
);

typedef Native_clang_getTypeSpelling = CXString Function(
  CXType CT,
);

typedef _dart_clang_getTypeSpelling = CXString Function(
  CXType CT,
);

typedef Native_clang_getTypedefDeclUnderlyingType = CXType Function(
  CXCursor C,
);

typedef _dart_clang_getTypedefDeclUnderlyingType = CXType Function(
  CXCursor C,
);

typedef Native_clang_getEnumDeclIntegerType = CXType Function(
  CXCursor C,
);

typedef _dart_clang_getEnumDeclIntegerType = CXType Function(
  CXCursor C,
);

typedef Native_clang_getEnumConstantDeclValue = ffi.Int64 Function(
  CXCursor C,
);

typedef _dart_clang_getEnumConstantDeclValue = int Function(
  CXCursor C,
);

typedef Native_clang_getEnumConstantDeclUnsignedValue = ffi.Uint64 Function(
  CXCursor C,
);

typedef _dart_clang_getEnumConstantDeclUnsignedValue = int Function(
  CXCursor C,
);

typedef Native_clang_getFieldDeclBitWidth = ffi.Int32 Function(
  CXCursor C,
);

typedef _dart_clang_getFieldDeclBitWidth = int Function(
  CXCursor C,
);

typedef Native_clang_Cursor_getNumArguments = ffi.Int32 Function(
  CXCursor C,
);

typedef _dart_clang_Cursor_getNumArguments = int Function(
  CXCursor C,
);

typedef Native_clang_Cursor_getArgument = CXCursor Function(
  CXCursor C,
  ffi.Uint32 i,
);

typedef _dart_clang_Cursor_getArgument = CXCursor Function(
  CXCursor C,
  int i,
);

typedef Native_clang_Cursor_getNumTemplateArguments = ffi.Int32 Function(
  CXCursor C,
);

typedef _dart_clang_Cursor_getNumTemplateArguments = int Function(
  CXCursor C,
);

typedef Native_clang_Cursor_getTemplateArgumentKind = ffi.Int32 Function(
  CXCursor C,
  ffi.Uint32 I,
);

typedef _dart_clang_Cursor_getTemplateArgumentKind = int Function(
  CXCursor C,
  int I,
);

typedef Native_clang_Cursor_getTemplateArgumentType = CXType Function(
  CXCursor C,
  ffi.Uint32 I,
);

typedef _dart_clang_Cursor_getTemplateArgumentType = CXType Function(
  CXCursor C,
  int I,
);

typedef Native_clang_Cursor_getTemplateArgumentValue = ffi.Int64 Function(
  CXCursor C,
  ffi.Uint32 I,
);

typedef _dart_clang_Cursor_getTemplateArgumentValue = int Function(
  CXCursor C,
  int I,
);

typedef Native_clang_Cursor_getTemplateArgumentUnsignedValue = ffi.Uint64
    Function(
  CXCursor C,
  ffi.Uint32 I,
);

typedef _dart_clang_Cursor_getTemplateArgumentUnsignedValue = int Function(
  CXCursor C,
  int I,
);

typedef Native_clang_equalTypes = ffi.Uint32 Function(
  CXType A,
  CXType B,
);

typedef _dart_clang_equalTypes = int Function(
  CXType A,
  CXType B,
);

typedef Native_clang_getCanonicalType = CXType Function(
  CXType T,
);

typedef _dart_clang_getCanonicalType = CXType Function(
  CXType T,
);

typedef Native_clang_isConstQualifiedType = ffi.Uint32 Function(
  CXType T,
);

typedef _dart_clang_isConstQualifiedType = int Function(
  CXType T,
);

typedef Native_clang_Cursor_isMacroFunctionLike = ffi.Uint32 Function(
  CXCursor C,
);

typedef _dart_clang_Cursor_isMacroFunctionLike = int Function(
  CXCursor C,
);

typedef Native_clang_Cursor_isMacroBuiltin = ffi.Uint32 Function(
  CXCursor C,
);

typedef _dart_clang_Cursor_isMacroBuiltin = int Function(
  CXCursor C,
);

typedef Native_clang_Cursor_isFunctionInlined = ffi.Uint32 Function(
  CXCursor C,
);

typedef _dart_clang_Cursor_isFunctionInlined = int Function(
  CXCursor C,
);

typedef Native_clang_isVolatileQualifiedType = ffi.Uint32 Function(
  CXType T,
);

typedef _dart_clang_isVolatileQualifiedType = int Function(
  CXType T,
);

typedef Native_clang_isRestrictQualifiedType = ffi.Uint32 Function(
  CXType T,
);

typedef _dart_clang_isRestrictQualifiedType = int Function(
  CXType T,
);

typedef Native_clang_getAddressSpace = ffi.Uint32 Function(
  CXType T,
);

typedef _dart_clang_getAddressSpace = int Function(
  CXType T,
);

typedef Native_clang_getTypedefName = CXString Function(
  CXType CT,
);

typedef _dart_clang_getTypedefName = CXString Function(
  CXType CT,
);

typedef Native_clang_getPointeeType = CXType Function(
  CXType T,
);

typedef _dart_clang_getPointeeType = CXType Function(
  CXType T,
);

typedef Native_clang_getTypeDeclaration = CXCursor Function(
  CXType T,
);

typedef _dart_clang_getTypeDeclaration = CXCursor Function(
  CXType T,
);

typedef Native_clang_getDeclObjCTypeEncoding = CXString Function(
  CXCursor C,
);

typedef _dart_clang_getDeclObjCTypeEncoding = CXString Function(
  CXCursor C,
);

typedef Native_clang_Type_getObjCEncoding = CXString Function(
  CXType type,
);

typedef _dart_clang_Type_getObjCEncoding = CXString Function(
  CXType type,
);

typedef Native_clang_getTypeKindSpelling = CXString Function(
  ffi.Int32 K,
);

typedef _dart_clang_getTypeKindSpelling = CXString Function(
  int K,
);

typedef Native_clang_getFunctionTypeCallingConv = ffi.Int32 Function(
  CXType T,
);

typedef _dart_clang_getFunctionTypeCallingConv = int Function(
  CXType T,
);

typedef Native_clang_getResultType = CXType Function(
  CXType T,
);

typedef _dart_clang_getResultType = CXType Function(
  CXType T,
);

typedef Native_clang_getExceptionSpecificationType = ffi.Int32 Function(
  CXType T,
);

typedef _dart_clang_getExceptionSpecificationType = int Function(
  CXType T,
);

typedef Native_clang_getNumArgTypes = ffi.Int32 Function(
  CXType T,
);

typedef _dart_clang_getNumArgTypes = int Function(
  CXType T,
);

typedef Native_clang_getArgType = CXType Function(
  CXType T,
  ffi.Uint32 i,
);

typedef _dart_clang_getArgType = CXType Function(
  CXType T,
  int i,
);

typedef Native_clang_Type_getObjCObjectBaseType = CXType Function(
  CXType T,
);

typedef _dart_clang_Type_getObjCObjectBaseType = CXType Function(
  CXType T,
);

typedef Native_clang_Type_getNumObjCProtocolRefs = ffi.Uint32 Function(
  CXType T,
);

typedef _dart_clang_Type_getNumObjCProtocolRefs = int Function(
  CXType T,
);

typedef Native_clang_Type_getObjCProtocolDecl = CXCursor Function(
  CXType T,
  ffi.Uint32 i,
);

typedef _dart_clang_Type_getObjCProtocolDecl = CXCursor Function(
  CXType T,
  int i,
);

typedef Native_clang_Type_getNumObjCTypeArgs = ffi.Uint32 Function(
  CXType T,
);

typedef _dart_clang_Type_getNumObjCTypeArgs = int Function(
  CXType T,
);

typedef Native_clang_Type_getObjCTypeArg = CXType Function(
  CXType T,
  ffi.Uint32 i,
);

typedef _dart_clang_Type_getObjCTypeArg = CXType Function(
  CXType T,
  int i,
);

typedef Native_clang_isFunctionTypeVariadic = ffi.Uint32 Function(
  CXType T,
);

typedef _dart_clang_isFunctionTypeVariadic = int Function(
  CXType T,
);

typedef Native_clang_getCursorResultType = CXType Function(
  CXCursor C,
);

typedef _dart_clang_getCursorResultType = CXType Function(
  CXCursor C,
);

typedef Native_clang_getCursorExceptionSpecificationType = ffi.Int32 Function(
  CXCursor C,
);

typedef _dart_clang_getCursorExceptionSpecificationType = int Function(
  CXCursor C,
);

typedef Native_clang_isPODType = ffi.Uint32 Function(
  CXType T,
);

typedef _dart_clang_isPODType = int Function(
  CXType T,
);

typedef Native_clang_getElementType = CXType Function(
  CXType T,
);

typedef _dart_clang_getElementType = CXType Function(
  CXType T,
);

typedef Native_clang_getNumElements = ffi.Int64 Function(
  CXType T,
);

typedef _dart_clang_getNumElements = int Function(
  CXType T,
);

typedef Native_clang_getArrayElementType = CXType Function(
  CXType T,
);

typedef _dart_clang_getArrayElementType = CXType Function(
  CXType T,
);

typedef Native_clang_getArraySize = ffi.Int64 Function(
  CXType T,
);

typedef _dart_clang_getArraySize = int Function(
  CXType T,
);

typedef Native_clang_Type_getNamedType = CXType Function(
  CXType T,
);

typedef _dart_clang_Type_getNamedType = CXType Function(
  CXType T,
);

typedef Native_clang_Type_isTransparentTagTypedef = ffi.Uint32 Function(
  CXType T,
);

typedef _dart_clang_Type_isTransparentTagTypedef = int Function(
  CXType T,
);

typedef Native_clang_Type_getNullability = ffi.Int32 Function(
  CXType T,
);

typedef _dart_clang_Type_getNullability = int Function(
  CXType T,
);

typedef Native_clang_Type_getAlignOf = ffi.Int64 Function(
  CXType T,
);

typedef _dart_clang_Type_getAlignOf = int Function(
  CXType T,
);

typedef Native_clang_Type_getClassType = CXType Function(
  CXType T,
);

typedef _dart_clang_Type_getClassType = CXType Function(
  CXType T,
);

typedef Native_clang_Type_getSizeOf = ffi.Int64 Function(
  CXType T,
);

typedef _dart_clang_Type_getSizeOf = int Function(
  CXType T,
);

typedef Native_clang_Type_getOffsetOf = ffi.Int64 Function(
  CXType T,
  ffi.Pointer<ffi.Int8> S,
);

typedef _dart_clang_Type_getOffsetOf = int Function(
  CXType T,
  ffi.Pointer<ffi.Int8> S,
);

typedef Native_clang_Type_getModifiedType = CXType Function(
  CXType T,
);

typedef _dart_clang_Type_getModifiedType = CXType Function(
  CXType T,
);

typedef Native_clang_Cursor_getOffsetOfField = ffi.Int64 Function(
  CXCursor C,
);

typedef _dart_clang_Cursor_getOffsetOfField = int Function(
  CXCursor C,
);

typedef Native_clang_Cursor_isAnonymous = ffi.Uint32 Function(
  CXCursor C,
);

typedef _dart_clang_Cursor_isAnonymous = int Function(
  CXCursor C,
);

typedef Native_clang_Cursor_isAnonymousRecordDecl = ffi.Uint32 Function(
  CXCursor C,
);

typedef _dart_clang_Cursor_isAnonymousRecordDecl = int Function(
  CXCursor C,
);

typedef Native_clang_Cursor_isInlineNamespace = ffi.Uint32 Function(
  CXCursor C,
);

typedef _dart_clang_Cursor_isInlineNamespace = int Function(
  CXCursor C,
);

typedef Native_clang_Type_getNumTemplateArguments = ffi.Int32 Function(
  CXType T,
);

typedef _dart_clang_Type_getNumTemplateArguments = int Function(
  CXType T,
);

typedef Native_clang_Type_getTemplateArgumentAsType = CXType Function(
  CXType T,
  ffi.Uint32 i,
);

typedef _dart_clang_Type_getTemplateArgumentAsType = CXType Function(
  CXType T,
  int i,
);

typedef Native_clang_Type_getCXXRefQualifier = ffi.Int32 Function(
  CXType T,
);

typedef _dart_clang_Type_getCXXRefQualifier = int Function(
  CXType T,
);

typedef Native_clang_Cursor_isBitField = ffi.Uint32 Function(
  CXCursor C,
);

typedef _dart_clang_Cursor_isBitField = int Function(
  CXCursor C,
);

typedef Native_clang_isVirtualBase = ffi.Uint32 Function(
  CXCursor arg0,
);

typedef _dart_clang_isVirtualBase = int Function(
  CXCursor arg0,
);

typedef Native_clang_getCXXAccessSpecifier = ffi.Int32 Function(
  CXCursor arg0,
);

typedef _dart_clang_getCXXAccessSpecifier = int Function(
  CXCursor arg0,
);

typedef Native_clang_Cursor_getStorageClass = ffi.Int32 Function(
  CXCursor arg0,
);

typedef _dart_clang_Cursor_getStorageClass = int Function(
  CXCursor arg0,
);

typedef Native_clang_getNumOverloadedDecls = ffi.Uint32 Function(
  CXCursor cursor,
);

typedef _dart_clang_getNumOverloadedDecls = int Function(
  CXCursor cursor,
);

typedef Native_clang_getOverloadedDecl = CXCursor Function(
  CXCursor cursor,
  ffi.Uint32 index,
);

typedef _dart_clang_getOverloadedDecl = CXCursor Function(
  CXCursor cursor,
  int index,
);

typedef Native_clang_getIBOutletCollectionType = CXType Function(
  CXCursor arg0,
);

typedef _dart_clang_getIBOutletCollectionType = CXType Function(
  CXCursor arg0,
);

typedef CXCursorVisitor = ffi.Int32 Function(
  CXCursor,
  CXCursor,
  ffi.Pointer<ffi.Void>,
);

typedef Native_clang_visitChildren = ffi.Uint32 Function(
  CXCursor parent,
  ffi.Pointer<ffi.NativeFunction<CXCursorVisitor>> visitor,
  ffi.Pointer<ffi.Void> client_data,
);

typedef _dart_clang_visitChildren = int Function(
  CXCursor parent,
  ffi.Pointer<ffi.NativeFunction<CXCursorVisitor>> visitor,
  ffi.Pointer<ffi.Void> client_data,
);

typedef Native_clang_getCursorUSR = CXString Function(
  CXCursor arg0,
);

typedef _dart_clang_getCursorUSR = CXString Function(
  CXCursor arg0,
);

typedef Native_clang_constructUSR_ObjCClass = CXString Function(
  ffi.Pointer<ffi.Int8> class_name,
);

typedef _dart_clang_constructUSR_ObjCClass = CXString Function(
  ffi.Pointer<ffi.Int8> class_name,
);

typedef Native_clang_constructUSR_ObjCCategory = CXString Function(
  ffi.Pointer<ffi.Int8> class_name,
  ffi.Pointer<ffi.Int8> category_name,
);

typedef _dart_clang_constructUSR_ObjCCategory = CXString Function(
  ffi.Pointer<ffi.Int8> class_name,
  ffi.Pointer<ffi.Int8> category_name,
);

typedef Native_clang_constructUSR_ObjCProtocol = CXString Function(
  ffi.Pointer<ffi.Int8> protocol_name,
);

typedef _dart_clang_constructUSR_ObjCProtocol = CXString Function(
  ffi.Pointer<ffi.Int8> protocol_name,
);

typedef Native_clang_constructUSR_ObjCIvar = CXString Function(
  ffi.Pointer<ffi.Int8> name,
  CXString classUSR,
);

typedef _dart_clang_constructUSR_ObjCIvar = CXString Function(
  ffi.Pointer<ffi.Int8> name,
  CXString classUSR,
);

typedef Native_clang_constructUSR_ObjCMethod = CXString Function(
  ffi.Pointer<ffi.Int8> name,
  ffi.Uint32 isInstanceMethod,
  CXString classUSR,
);

typedef _dart_clang_constructUSR_ObjCMethod = CXString Function(
  ffi.Pointer<ffi.Int8> name,
  int isInstanceMethod,
  CXString classUSR,
);

typedef Native_clang_constructUSR_ObjCProperty = CXString Function(
  ffi.Pointer<ffi.Int8> property,
  CXString classUSR,
);

typedef _dart_clang_constructUSR_ObjCProperty = CXString Function(
  ffi.Pointer<ffi.Int8> property,
  CXString classUSR,
);

typedef Native_clang_getCursorSpelling = CXString Function(
  CXCursor arg0,
);

typedef _dart_clang_getCursorSpelling = CXString Function(
  CXCursor arg0,
);

typedef Native_clang_Cursor_getSpellingNameRange = CXSourceRange Function(
  CXCursor arg0,
  ffi.Uint32 pieceIndex,
  ffi.Uint32 options,
);

typedef _dart_clang_Cursor_getSpellingNameRange = CXSourceRange Function(
  CXCursor arg0,
  int pieceIndex,
  int options,
);

typedef Native_clang_PrintingPolicy_getProperty = ffi.Uint32 Function(
  ffi.Pointer<ffi.Void> Policy,
  ffi.Int32 Property,
);

typedef _dart_clang_PrintingPolicy_getProperty = int Function(
  ffi.Pointer<ffi.Void> Policy,
  int Property,
);

typedef Native_clang_PrintingPolicy_setProperty = ffi.Void Function(
  ffi.Pointer<ffi.Void> Policy,
  ffi.Int32 Property,
  ffi.Uint32 Value,
);

typedef _dart_clang_PrintingPolicy_setProperty = void Function(
  ffi.Pointer<ffi.Void> Policy,
  int Property,
  int Value,
);

typedef Native_clang_getCursorPrintingPolicy = ffi.Pointer<ffi.Void> Function(
  CXCursor arg0,
);

typedef _dart_clang_getCursorPrintingPolicy = ffi.Pointer<ffi.Void> Function(
  CXCursor arg0,
);

typedef Native_clang_PrintingPolicy_dispose = ffi.Void Function(
  ffi.Pointer<ffi.Void> Policy,
);

typedef _dart_clang_PrintingPolicy_dispose = void Function(
  ffi.Pointer<ffi.Void> Policy,
);

typedef Native_clang_getCursorPrettyPrinted = CXString Function(
  CXCursor Cursor,
  ffi.Pointer<ffi.Void> Policy,
);

typedef _dart_clang_getCursorPrettyPrinted = CXString Function(
  CXCursor Cursor,
  ffi.Pointer<ffi.Void> Policy,
);

typedef Native_clang_getCursorDisplayName = CXString Function(
  CXCursor arg0,
);

typedef _dart_clang_getCursorDisplayName = CXString Function(
  CXCursor arg0,
);

typedef Native_clang_getCursorReferenced = CXCursor Function(
  CXCursor arg0,
);

typedef _dart_clang_getCursorReferenced = CXCursor Function(
  CXCursor arg0,
);

typedef Native_clang_getCursorDefinition = CXCursor Function(
  CXCursor arg0,
);

typedef _dart_clang_getCursorDefinition = CXCursor Function(
  CXCursor arg0,
);

typedef Native_clang_isCursorDefinition = ffi.Uint32 Function(
  CXCursor arg0,
);

typedef _dart_clang_isCursorDefinition = int Function(
  CXCursor arg0,
);

typedef Native_clang_getCanonicalCursor = CXCursor Function(
  CXCursor arg0,
);

typedef _dart_clang_getCanonicalCursor = CXCursor Function(
  CXCursor arg0,
);

typedef Native_clang_Cursor_getObjCSelectorIndex = ffi.Int32 Function(
  CXCursor arg0,
);

typedef _dart_clang_Cursor_getObjCSelectorIndex = int Function(
  CXCursor arg0,
);

typedef Native_clang_Cursor_isDynamicCall = ffi.Int32 Function(
  CXCursor C,
);

typedef _dart_clang_Cursor_isDynamicCall = int Function(
  CXCursor C,
);

typedef Native_clang_Cursor_getReceiverType = CXType Function(
  CXCursor C,
);

typedef _dart_clang_Cursor_getReceiverType = CXType Function(
  CXCursor C,
);

typedef Native_clang_Cursor_getObjCPropertyAttributes = ffi.Uint32 Function(
  CXCursor C,
  ffi.Uint32 reserved,
);

typedef _dart_clang_Cursor_getObjCPropertyAttributes = int Function(
  CXCursor C,
  int reserved,
);

typedef Native_clang_Cursor_getObjCPropertyGetterName = CXString Function(
  CXCursor C,
);

typedef _dart_clang_Cursor_getObjCPropertyGetterName = CXString Function(
  CXCursor C,
);

typedef Native_clang_Cursor_getObjCPropertySetterName = CXString Function(
  CXCursor C,
);

typedef _dart_clang_Cursor_getObjCPropertySetterName = CXString Function(
  CXCursor C,
);

typedef Native_clang_Cursor_getObjCDeclQualifiers = ffi.Uint32 Function(
  CXCursor C,
);

typedef _dart_clang_Cursor_getObjCDeclQualifiers = int Function(
  CXCursor C,
);

typedef Native_clang_Cursor_isObjCOptional = ffi.Uint32 Function(
  CXCursor C,
);

typedef _dart_clang_Cursor_isObjCOptional = int Function(
  CXCursor C,
);

typedef Native_clang_Cursor_isVariadic = ffi.Uint32 Function(
  CXCursor C,
);

typedef _dart_clang_Cursor_isVariadic = int Function(
  CXCursor C,
);

typedef Native_clang_Cursor_isExternalSymbol = ffi.Uint32 Function(
  CXCursor C,
  ffi.Pointer<CXString> language,
  ffi.Pointer<CXString> definedIn,
  ffi.Pointer<ffi.Uint32> isGenerated,
);

typedef _dart_clang_Cursor_isExternalSymbol = int Function(
  CXCursor C,
  ffi.Pointer<CXString> language,
  ffi.Pointer<CXString> definedIn,
  ffi.Pointer<ffi.Uint32> isGenerated,
);

typedef Native_clang_Cursor_getCommentRange = CXSourceRange Function(
  CXCursor C,
);

typedef _dart_clang_Cursor_getCommentRange = CXSourceRange Function(
  CXCursor C,
);

typedef Native_clang_Cursor_getRawCommentText = CXString Function(
  CXCursor C,
);

typedef _dart_clang_Cursor_getRawCommentText = CXString Function(
  CXCursor C,
);

typedef Native_clang_Cursor_getBriefCommentText = CXString Function(
  CXCursor C,
);

typedef _dart_clang_Cursor_getBriefCommentText = CXString Function(
  CXCursor C,
);

typedef Native_clang_Cursor_getMangling = CXString Function(
  CXCursor arg0,
);

typedef _dart_clang_Cursor_getMangling = CXString Function(
  CXCursor arg0,
);

typedef Native_clang_Cursor_getCXXManglings = ffi.Pointer<CXStringSet> Function(
  CXCursor arg0,
);

typedef _dart_clang_Cursor_getCXXManglings = ffi.Pointer<CXStringSet> Function(
  CXCursor arg0,
);

typedef Native_clang_Cursor_getObjCManglings = ffi.Pointer<CXStringSet>
    Function(
  CXCursor arg0,
);

typedef _dart_clang_Cursor_getObjCManglings = ffi.Pointer<CXStringSet> Function(
  CXCursor arg0,
);

typedef Native_clang_Cursor_getModule = ffi.Pointer<ffi.Void> Function(
  CXCursor C,
);

typedef _dart_clang_Cursor_getModule = ffi.Pointer<ffi.Void> Function(
  CXCursor C,
);

typedef Native_clang_getModuleForFile = ffi.Pointer<ffi.Void> Function(
  ffi.Pointer<CXTranslationUnitImpl> arg0,
  ffi.Pointer<ffi.Void> arg1,
);

typedef _dart_clang_getModuleForFile = ffi.Pointer<ffi.Void> Function(
  ffi.Pointer<CXTranslationUnitImpl> arg0,
  ffi.Pointer<ffi.Void> arg1,
);

typedef Native_clang_Module_getASTFile = ffi.Pointer<ffi.Void> Function(
  ffi.Pointer<ffi.Void> Module,
);

typedef _dart_clang_Module_getASTFile = ffi.Pointer<ffi.Void> Function(
  ffi.Pointer<ffi.Void> Module,
);

typedef Native_clang_Module_getParent = ffi.Pointer<ffi.Void> Function(
  ffi.Pointer<ffi.Void> Module,
);

typedef _dart_clang_Module_getParent = ffi.Pointer<ffi.Void> Function(
  ffi.Pointer<ffi.Void> Module,
);

typedef Native_clang_Module_getName = CXString Function(
  ffi.Pointer<ffi.Void> Module,
);

typedef _dart_clang_Module_getName = CXString Function(
  ffi.Pointer<ffi.Void> Module,
);

typedef Native_clang_Module_getFullName = CXString Function(
  ffi.Pointer<ffi.Void> Module,
);

typedef _dart_clang_Module_getFullName = CXString Function(
  ffi.Pointer<ffi.Void> Module,
);

typedef Native_clang_Module_isSystem = ffi.Int32 Function(
  ffi.Pointer<ffi.Void> Module,
);

typedef _dart_clang_Module_isSystem = int Function(
  ffi.Pointer<ffi.Void> Module,
);

typedef Native_clang_Module_getNumTopLevelHeaders = ffi.Uint32 Function(
  ffi.Pointer<CXTranslationUnitImpl> arg0,
  ffi.Pointer<ffi.Void> Module,
);

typedef _dart_clang_Module_getNumTopLevelHeaders = int Function(
  ffi.Pointer<CXTranslationUnitImpl> arg0,
  ffi.Pointer<ffi.Void> Module,
);

typedef Native_clang_Module_getTopLevelHeader = ffi.Pointer<ffi.Void> Function(
  ffi.Pointer<CXTranslationUnitImpl> arg0,
  ffi.Pointer<ffi.Void> Module,
  ffi.Uint32 Index,
);

typedef _dart_clang_Module_getTopLevelHeader = ffi.Pointer<ffi.Void> Function(
  ffi.Pointer<CXTranslationUnitImpl> arg0,
  ffi.Pointer<ffi.Void> Module,
  int Index,
);

typedef Native_clang_CXXConstructor_isConvertingConstructor = ffi.Uint32
    Function(
  CXCursor C,
);

typedef _dart_clang_CXXConstructor_isConvertingConstructor = int Function(
  CXCursor C,
);

typedef Native_clang_CXXConstructor_isCopyConstructor = ffi.Uint32 Function(
  CXCursor C,
);

typedef _dart_clang_CXXConstructor_isCopyConstructor = int Function(
  CXCursor C,
);

typedef Native_clang_CXXConstructor_isDefaultConstructor = ffi.Uint32 Function(
  CXCursor C,
);

typedef _dart_clang_CXXConstructor_isDefaultConstructor = int Function(
  CXCursor C,
);

typedef Native_clang_CXXConstructor_isMoveConstructor = ffi.Uint32 Function(
  CXCursor C,
);

typedef _dart_clang_CXXConstructor_isMoveConstructor = int Function(
  CXCursor C,
);

typedef Native_clang_CXXField_isMutable = ffi.Uint32 Function(
  CXCursor C,
);

typedef _dart_clang_CXXField_isMutable = int Function(
  CXCursor C,
);

typedef Native_clang_CXXMethod_isDefaulted = ffi.Uint32 Function(
  CXCursor C,
);

typedef _dart_clang_CXXMethod_isDefaulted = int Function(
  CXCursor C,
);

typedef Native_clang_CXXMethod_isPureVirtual = ffi.Uint32 Function(
  CXCursor C,
);

typedef _dart_clang_CXXMethod_isPureVirtual = int Function(
  CXCursor C,
);

typedef Native_clang_CXXMethod_isStatic = ffi.Uint32 Function(
  CXCursor C,
);

typedef _dart_clang_CXXMethod_isStatic = int Function(
  CXCursor C,
);

typedef Native_clang_CXXMethod_isVirtual = ffi.Uint32 Function(
  CXCursor C,
);

typedef _dart_clang_CXXMethod_isVirtual = int Function(
  CXCursor C,
);

typedef Native_clang_CXXRecord_isAbstract = ffi.Uint32 Function(
  CXCursor C,
);

typedef _dart_clang_CXXRecord_isAbstract = int Function(
  CXCursor C,
);

typedef Native_clang_EnumDecl_isScoped = ffi.Uint32 Function(
  CXCursor C,
);

typedef _dart_clang_EnumDecl_isScoped = int Function(
  CXCursor C,
);

typedef Native_clang_CXXMethod_isConst = ffi.Uint32 Function(
  CXCursor C,
);

typedef _dart_clang_CXXMethod_isConst = int Function(
  CXCursor C,
);

typedef Native_clang_getTemplateCursorKind = ffi.Int32 Function(
  CXCursor C,
);

typedef _dart_clang_getTemplateCursorKind = int Function(
  CXCursor C,
);

typedef Native_clang_getSpecializedCursorTemplate = CXCursor Function(
  CXCursor C,
);

typedef _dart_clang_getSpecializedCursorTemplate = CXCursor Function(
  CXCursor C,
);

typedef Native_clang_getCursorReferenceNameRange = CXSourceRange Function(
  CXCursor C,
  ffi.Uint32 NameFlags,
  ffi.Uint32 PieceIndex,
);

typedef _dart_clang_getCursorReferenceNameRange = CXSourceRange Function(
  CXCursor C,
  int NameFlags,
  int PieceIndex,
);

typedef Native_clang_getToken = ffi.Pointer<CXToken> Function(
  ffi.Pointer<CXTranslationUnitImpl> TU,
  CXSourceLocation Location,
);

typedef _dart_clang_getToken = ffi.Pointer<CXToken> Function(
  ffi.Pointer<CXTranslationUnitImpl> TU,
  CXSourceLocation Location,
);

typedef Native_clang_getTokenKind = ffi.Int32 Function(
  CXToken arg0,
);

typedef _dart_clang_getTokenKind = int Function(
  CXToken arg0,
);

typedef Native_clang_getTokenSpelling = CXString Function(
  ffi.Pointer<CXTranslationUnitImpl> arg0,
  CXToken arg1,
);

typedef _dart_clang_getTokenSpelling = CXString Function(
  ffi.Pointer<CXTranslationUnitImpl> arg0,
  CXToken arg1,
);

typedef Native_clang_getTokenLocation = CXSourceLocation Function(
  ffi.Pointer<CXTranslationUnitImpl> arg0,
  CXToken arg1,
);

typedef _dart_clang_getTokenLocation = CXSourceLocation Function(
  ffi.Pointer<CXTranslationUnitImpl> arg0,
  CXToken arg1,
);

typedef Native_clang_getTokenExtent = CXSourceRange Function(
  ffi.Pointer<CXTranslationUnitImpl> arg0,
  CXToken arg1,
);

typedef _dart_clang_getTokenExtent = CXSourceRange Function(
  ffi.Pointer<CXTranslationUnitImpl> arg0,
  CXToken arg1,
);

typedef Native_clang_tokenize = ffi.Void Function(
  ffi.Pointer<CXTranslationUnitImpl> TU,
  CXSourceRange Range,
  ffi.Pointer<ffi.Pointer<CXToken>> Tokens,
  ffi.Pointer<ffi.Uint32> NumTokens,
);

typedef _dart_clang_tokenize = void Function(
  ffi.Pointer<CXTranslationUnitImpl> TU,
  CXSourceRange Range,
  ffi.Pointer<ffi.Pointer<CXToken>> Tokens,
  ffi.Pointer<ffi.Uint32> NumTokens,
);

typedef Native_clang_annotateTokens = ffi.Void Function(
  ffi.Pointer<CXTranslationUnitImpl> TU,
  ffi.Pointer<CXToken> Tokens,
  ffi.Uint32 NumTokens,
  ffi.Pointer<CXCursor> Cursors,
);

typedef _dart_clang_annotateTokens = void Function(
  ffi.Pointer<CXTranslationUnitImpl> TU,
  ffi.Pointer<CXToken> Tokens,
  int NumTokens,
  ffi.Pointer<CXCursor> Cursors,
);

typedef Native_clang_disposeTokens = ffi.Void Function(
  ffi.Pointer<CXTranslationUnitImpl> TU,
  ffi.Pointer<CXToken> Tokens,
  ffi.Uint32 NumTokens,
);

typedef _dart_clang_disposeTokens = void Function(
  ffi.Pointer<CXTranslationUnitImpl> TU,
  ffi.Pointer<CXToken> Tokens,
  int NumTokens,
);

typedef Native_clang_getCursorKindSpelling = CXString Function(
  ffi.Int32 Kind,
);

typedef _dart_clang_getCursorKindSpelling = CXString Function(
  int Kind,
);

typedef Native_clang_getDefinitionSpellingAndExtent = ffi.Void Function(
  CXCursor arg0,
  ffi.Pointer<ffi.Pointer<ffi.Int8>> startBuf,
  ffi.Pointer<ffi.Pointer<ffi.Int8>> endBuf,
  ffi.Pointer<ffi.Uint32> startLine,
  ffi.Pointer<ffi.Uint32> startColumn,
  ffi.Pointer<ffi.Uint32> endLine,
  ffi.Pointer<ffi.Uint32> endColumn,
);

typedef _dart_clang_getDefinitionSpellingAndExtent = void Function(
  CXCursor arg0,
  ffi.Pointer<ffi.Pointer<ffi.Int8>> startBuf,
  ffi.Pointer<ffi.Pointer<ffi.Int8>> endBuf,
  ffi.Pointer<ffi.Uint32> startLine,
  ffi.Pointer<ffi.Uint32> startColumn,
  ffi.Pointer<ffi.Uint32> endLine,
  ffi.Pointer<ffi.Uint32> endColumn,
);

typedef Native_clang_enableStackTraces = ffi.Void Function();

typedef _dart_clang_enableStackTraces = void Function();

typedef _typedefC_1 = ffi.Void Function(
  ffi.Pointer<ffi.Void>,
);

typedef Native_clang_executeOnThread = ffi.Void Function(
  ffi.Pointer<ffi.NativeFunction<_typedefC_1>> fn,
  ffi.Pointer<ffi.Void> user_data,
  ffi.Uint32 stack_size,
);

typedef _dart_clang_executeOnThread = void Function(
  ffi.Pointer<ffi.NativeFunction<_typedefC_1>> fn,
  ffi.Pointer<ffi.Void> user_data,
  int stack_size,
);

typedef Native_clang_getCompletionChunkKind = ffi.Int32 Function(
  ffi.Pointer<ffi.Void> completion_string,
  ffi.Uint32 chunk_number,
);

typedef _dart_clang_getCompletionChunkKind = int Function(
  ffi.Pointer<ffi.Void> completion_string,
  int chunk_number,
);

typedef Native_clang_getCompletionChunkText = CXString Function(
  ffi.Pointer<ffi.Void> completion_string,
  ffi.Uint32 chunk_number,
);

typedef _dart_clang_getCompletionChunkText = CXString Function(
  ffi.Pointer<ffi.Void> completion_string,
  int chunk_number,
);

typedef Native_clang_getCompletionChunkCompletionString = ffi.Pointer<ffi.Void>
    Function(
  ffi.Pointer<ffi.Void> completion_string,
  ffi.Uint32 chunk_number,
);

typedef _dart_clang_getCompletionChunkCompletionString = ffi.Pointer<ffi.Void>
    Function(
  ffi.Pointer<ffi.Void> completion_string,
  int chunk_number,
);

typedef Native_clang_getNumCompletionChunks = ffi.Uint32 Function(
  ffi.Pointer<ffi.Void> completion_string,
);

typedef _dart_clang_getNumCompletionChunks = int Function(
  ffi.Pointer<ffi.Void> completion_string,
);

typedef Native_clang_getCompletionPriority = ffi.Uint32 Function(
  ffi.Pointer<ffi.Void> completion_string,
);

typedef _dart_clang_getCompletionPriority = int Function(
  ffi.Pointer<ffi.Void> completion_string,
);

typedef Native_clang_getCompletionAvailability = ffi.Int32 Function(
  ffi.Pointer<ffi.Void> completion_string,
);

typedef _dart_clang_getCompletionAvailability = int Function(
  ffi.Pointer<ffi.Void> completion_string,
);

typedef Native_clang_getCompletionNumAnnotations = ffi.Uint32 Function(
  ffi.Pointer<ffi.Void> completion_string,
);

typedef _dart_clang_getCompletionNumAnnotations = int Function(
  ffi.Pointer<ffi.Void> completion_string,
);

typedef Native_clang_getCompletionAnnotation = CXString Function(
  ffi.Pointer<ffi.Void> completion_string,
  ffi.Uint32 annotation_number,
);

typedef _dart_clang_getCompletionAnnotation = CXString Function(
  ffi.Pointer<ffi.Void> completion_string,
  int annotation_number,
);

typedef Native_clang_getCompletionParent = CXString Function(
  ffi.Pointer<ffi.Void> completion_string,
  ffi.Pointer<ffi.Int32> kind,
);

typedef _dart_clang_getCompletionParent = CXString Function(
  ffi.Pointer<ffi.Void> completion_string,
  ffi.Pointer<ffi.Int32> kind,
);

typedef Native_clang_getCompletionBriefComment = CXString Function(
  ffi.Pointer<ffi.Void> completion_string,
);

typedef _dart_clang_getCompletionBriefComment = CXString Function(
  ffi.Pointer<ffi.Void> completion_string,
);

typedef Native_clang_getCursorCompletionString = ffi.Pointer<ffi.Void> Function(
  CXCursor cursor,
);

typedef _dart_clang_getCursorCompletionString = ffi.Pointer<ffi.Void> Function(
  CXCursor cursor,
);

typedef Native_clang_getCompletionNumFixIts = ffi.Uint32 Function(
  ffi.Pointer<CXCodeCompleteResults> results,
  ffi.Uint32 completion_index,
);

typedef _dart_clang_getCompletionNumFixIts = int Function(
  ffi.Pointer<CXCodeCompleteResults> results,
  int completion_index,
);

typedef Native_clang_getCompletionFixIt = CXString Function(
  ffi.Pointer<CXCodeCompleteResults> results,
  ffi.Uint32 completion_index,
  ffi.Uint32 fixit_index,
  ffi.Pointer<CXSourceRange> replacement_range,
);

typedef _dart_clang_getCompletionFixIt = CXString Function(
  ffi.Pointer<CXCodeCompleteResults> results,
  int completion_index,
  int fixit_index,
  ffi.Pointer<CXSourceRange> replacement_range,
);

typedef Native_clang_defaultCodeCompleteOptions = ffi.Uint32 Function();

typedef _dart_clang_defaultCodeCompleteOptions = int Function();

typedef Native_clang_codeCompleteAt = ffi.Pointer<CXCodeCompleteResults>
    Function(
  ffi.Pointer<CXTranslationUnitImpl> TU,
  ffi.Pointer<ffi.Int8> complete_filename,
  ffi.Uint32 complete_line,
  ffi.Uint32 complete_column,
  ffi.Pointer<CXUnsavedFile> unsaved_files,
  ffi.Uint32 num_unsaved_files,
  ffi.Uint32 options,
);

typedef _dart_clang_codeCompleteAt = ffi.Pointer<CXCodeCompleteResults>
    Function(
  ffi.Pointer<CXTranslationUnitImpl> TU,
  ffi.Pointer<ffi.Int8> complete_filename,
  int complete_line,
  int complete_column,
  ffi.Pointer<CXUnsavedFile> unsaved_files,
  int num_unsaved_files,
  int options,
);

typedef Native_clang_sortCodeCompletionResults = ffi.Void Function(
  ffi.Pointer<CXCompletionResult> Results,
  ffi.Uint32 NumResults,
);

typedef _dart_clang_sortCodeCompletionResults = void Function(
  ffi.Pointer<CXCompletionResult> Results,
  int NumResults,
);

typedef Native_clang_disposeCodeCompleteResults = ffi.Void Function(
  ffi.Pointer<CXCodeCompleteResults> Results,
);

typedef _dart_clang_disposeCodeCompleteResults = void Function(
  ffi.Pointer<CXCodeCompleteResults> Results,
);

typedef Native_clang_codeCompleteGetNumDiagnostics = ffi.Uint32 Function(
  ffi.Pointer<CXCodeCompleteResults> Results,
);

typedef _dart_clang_codeCompleteGetNumDiagnostics = int Function(
  ffi.Pointer<CXCodeCompleteResults> Results,
);

typedef Native_clang_codeCompleteGetDiagnostic = ffi.Pointer<ffi.Void> Function(
  ffi.Pointer<CXCodeCompleteResults> Results,
  ffi.Uint32 Index,
);

typedef _dart_clang_codeCompleteGetDiagnostic = ffi.Pointer<ffi.Void> Function(
  ffi.Pointer<CXCodeCompleteResults> Results,
  int Index,
);

typedef Native_clang_codeCompleteGetContexts = ffi.Uint64 Function(
  ffi.Pointer<CXCodeCompleteResults> Results,
);

typedef _dart_clang_codeCompleteGetContexts = int Function(
  ffi.Pointer<CXCodeCompleteResults> Results,
);

typedef Native_clang_codeCompleteGetContainerKind = ffi.Int32 Function(
  ffi.Pointer<CXCodeCompleteResults> Results,
  ffi.Pointer<ffi.Uint32> IsIncomplete,
);

typedef _dart_clang_codeCompleteGetContainerKind = int Function(
  ffi.Pointer<CXCodeCompleteResults> Results,
  ffi.Pointer<ffi.Uint32> IsIncomplete,
);

typedef Native_clang_codeCompleteGetContainerUSR = CXString Function(
  ffi.Pointer<CXCodeCompleteResults> Results,
);

typedef _dart_clang_codeCompleteGetContainerUSR = CXString Function(
  ffi.Pointer<CXCodeCompleteResults> Results,
);

typedef Native_clang_codeCompleteGetObjCSelector = CXString Function(
  ffi.Pointer<CXCodeCompleteResults> Results,
);

typedef _dart_clang_codeCompleteGetObjCSelector = CXString Function(
  ffi.Pointer<CXCodeCompleteResults> Results,
);

typedef Native_clang_getClangVersion = CXString Function();

typedef _dart_clang_getClangVersion = CXString Function();

typedef Native_clang_toggleCrashRecovery = ffi.Void Function(
  ffi.Uint32 isEnabled,
);

typedef _dart_clang_toggleCrashRecovery = void Function(
  int isEnabled,
);

typedef CXInclusionVisitor = ffi.Void Function(
  ffi.Pointer<ffi.Void>,
  ffi.Pointer<CXSourceLocation>,
  ffi.Uint32,
  ffi.Pointer<ffi.Void>,
);

typedef Native_clang_getInclusions = ffi.Void Function(
  ffi.Pointer<CXTranslationUnitImpl> tu,
  ffi.Pointer<ffi.NativeFunction<CXInclusionVisitor>> visitor,
  ffi.Pointer<ffi.Void> client_data,
);

typedef _dart_clang_getInclusions = void Function(
  ffi.Pointer<CXTranslationUnitImpl> tu,
  ffi.Pointer<ffi.NativeFunction<CXInclusionVisitor>> visitor,
  ffi.Pointer<ffi.Void> client_data,
);

typedef Native_clang_Cursor_Evaluate = ffi.Pointer<ffi.Void> Function(
  CXCursor C,
);

typedef _dart_clang_Cursor_Evaluate = ffi.Pointer<ffi.Void> Function(
  CXCursor C,
);

typedef Native_clang_EvalResult_getKind = ffi.Int32 Function(
  ffi.Pointer<ffi.Void> E,
);

typedef _dart_clang_EvalResult_getKind = int Function(
  ffi.Pointer<ffi.Void> E,
);

typedef Native_clang_EvalResult_getAsInt = ffi.Int32 Function(
  ffi.Pointer<ffi.Void> E,
);

typedef _dart_clang_EvalResult_getAsInt = int Function(
  ffi.Pointer<ffi.Void> E,
);

typedef Native_clang_EvalResult_getAsLongLong = ffi.Int64 Function(
  ffi.Pointer<ffi.Void> E,
);

typedef _dart_clang_EvalResult_getAsLongLong = int Function(
  ffi.Pointer<ffi.Void> E,
);

typedef Native_clang_EvalResult_isUnsignedInt = ffi.Uint32 Function(
  ffi.Pointer<ffi.Void> E,
);

typedef _dart_clang_EvalResult_isUnsignedInt = int Function(
  ffi.Pointer<ffi.Void> E,
);

typedef Native_clang_EvalResult_getAsUnsigned = ffi.Uint64 Function(
  ffi.Pointer<ffi.Void> E,
);

typedef _dart_clang_EvalResult_getAsUnsigned = int Function(
  ffi.Pointer<ffi.Void> E,
);

typedef Native_clang_EvalResult_getAsDouble = ffi.Double Function(
  ffi.Pointer<ffi.Void> E,
);

typedef _dart_clang_EvalResult_getAsDouble = double Function(
  ffi.Pointer<ffi.Void> E,
);

typedef Native_clang_EvalResult_getAsStr = ffi.Pointer<ffi.Int8> Function(
  ffi.Pointer<ffi.Void> E,
);

typedef _dart_clang_EvalResult_getAsStr = ffi.Pointer<ffi.Int8> Function(
  ffi.Pointer<ffi.Void> E,
);

typedef Native_clang_EvalResult_dispose = ffi.Void Function(
  ffi.Pointer<ffi.Void> E,
);

typedef _dart_clang_EvalResult_dispose = void Function(
  ffi.Pointer<ffi.Void> E,
);

typedef Native_clang_getRemappings = ffi.Pointer<ffi.Void> Function(
  ffi.Pointer<ffi.Int8> path,
);

typedef _dart_clang_getRemappings = ffi.Pointer<ffi.Void> Function(
  ffi.Pointer<ffi.Int8> path,
);

typedef Native_clang_getRemappingsFromFileList = ffi.Pointer<ffi.Void> Function(
  ffi.Pointer<ffi.Pointer<ffi.Int8>> filePaths,
  ffi.Uint32 numFiles,
);

typedef _dart_clang_getRemappingsFromFileList = ffi.Pointer<ffi.Void> Function(
  ffi.Pointer<ffi.Pointer<ffi.Int8>> filePaths,
  int numFiles,
);

typedef Native_clang_remap_getNumFiles = ffi.Uint32 Function(
  ffi.Pointer<ffi.Void> arg0,
);

typedef _dart_clang_remap_getNumFiles = int Function(
  ffi.Pointer<ffi.Void> arg0,
);

typedef Native_clang_remap_getFilenames = ffi.Void Function(
  ffi.Pointer<ffi.Void> arg0,
  ffi.Uint32 index,
  ffi.Pointer<CXString> original,
  ffi.Pointer<CXString> transformed,
);

typedef _dart_clang_remap_getFilenames = void Function(
  ffi.Pointer<ffi.Void> arg0,
  int index,
  ffi.Pointer<CXString> original,
  ffi.Pointer<CXString> transformed,
);

typedef Native_clang_remap_dispose = ffi.Void Function(
  ffi.Pointer<ffi.Void> arg0,
);

typedef _dart_clang_remap_dispose = void Function(
  ffi.Pointer<ffi.Void> arg0,
);

typedef Native_clang_findReferencesInFile = ffi.Int32 Function(
  CXCursor cursor,
  ffi.Pointer<ffi.Void> file,
  CXCursorAndRangeVisitor visitor,
);

typedef _dart_clang_findReferencesInFile = int Function(
  CXCursor cursor,
  ffi.Pointer<ffi.Void> file,
  CXCursorAndRangeVisitor visitor,
);

typedef Native_clang_findIncludesInFile = ffi.Int32 Function(
  ffi.Pointer<CXTranslationUnitImpl> TU,
  ffi.Pointer<ffi.Void> file,
  CXCursorAndRangeVisitor visitor,
);

typedef _dart_clang_findIncludesInFile = int Function(
  ffi.Pointer<CXTranslationUnitImpl> TU,
  ffi.Pointer<ffi.Void> file,
  CXCursorAndRangeVisitor visitor,
);

typedef Native_clang_index_isEntityObjCContainerKind = ffi.Int32 Function(
  ffi.Int32 arg0,
);

typedef _dart_clang_index_isEntityObjCContainerKind = int Function(
  int arg0,
);

typedef Native_clang_index_getObjCContainerDeclInfo
    = ffi.Pointer<CXIdxObjCContainerDeclInfo> Function(
  ffi.Pointer<CXIdxDeclInfo> arg0,
);

typedef _dart_clang_index_getObjCContainerDeclInfo
    = ffi.Pointer<CXIdxObjCContainerDeclInfo> Function(
  ffi.Pointer<CXIdxDeclInfo> arg0,
);

typedef Native_clang_index_getObjCInterfaceDeclInfo
    = ffi.Pointer<CXIdxObjCInterfaceDeclInfo> Function(
  ffi.Pointer<CXIdxDeclInfo> arg0,
);

typedef _dart_clang_index_getObjCInterfaceDeclInfo
    = ffi.Pointer<CXIdxObjCInterfaceDeclInfo> Function(
  ffi.Pointer<CXIdxDeclInfo> arg0,
);

typedef Native_clang_index_getObjCCategoryDeclInfo
    = ffi.Pointer<CXIdxObjCCategoryDeclInfo> Function(
  ffi.Pointer<CXIdxDeclInfo> arg0,
);

typedef _dart_clang_index_getObjCCategoryDeclInfo
    = ffi.Pointer<CXIdxObjCCategoryDeclInfo> Function(
  ffi.Pointer<CXIdxDeclInfo> arg0,
);

typedef Native_clang_index_getObjCProtocolRefListInfo
    = ffi.Pointer<CXIdxObjCProtocolRefListInfo> Function(
  ffi.Pointer<CXIdxDeclInfo> arg0,
);

typedef _dart_clang_index_getObjCProtocolRefListInfo
    = ffi.Pointer<CXIdxObjCProtocolRefListInfo> Function(
  ffi.Pointer<CXIdxDeclInfo> arg0,
);

typedef Native_clang_index_getObjCPropertyDeclInfo
    = ffi.Pointer<CXIdxObjCPropertyDeclInfo> Function(
  ffi.Pointer<CXIdxDeclInfo> arg0,
);

typedef _dart_clang_index_getObjCPropertyDeclInfo
    = ffi.Pointer<CXIdxObjCPropertyDeclInfo> Function(
  ffi.Pointer<CXIdxDeclInfo> arg0,
);

typedef Native_clang_index_getIBOutletCollectionAttrInfo
    = ffi.Pointer<CXIdxIBOutletCollectionAttrInfo> Function(
  ffi.Pointer<CXIdxAttrInfo> arg0,
);

typedef _dart_clang_index_getIBOutletCollectionAttrInfo
    = ffi.Pointer<CXIdxIBOutletCollectionAttrInfo> Function(
  ffi.Pointer<CXIdxAttrInfo> arg0,
);

typedef Native_clang_index_getCXXClassDeclInfo
    = ffi.Pointer<CXIdxCXXClassDeclInfo> Function(
  ffi.Pointer<CXIdxDeclInfo> arg0,
);

typedef _dart_clang_index_getCXXClassDeclInfo
    = ffi.Pointer<CXIdxCXXClassDeclInfo> Function(
  ffi.Pointer<CXIdxDeclInfo> arg0,
);

typedef Native_clang_index_getClientContainer = ffi.Pointer<ffi.Void> Function(
  ffi.Pointer<CXIdxContainerInfo> arg0,
);

typedef _dart_clang_index_getClientContainer = ffi.Pointer<ffi.Void> Function(
  ffi.Pointer<CXIdxContainerInfo> arg0,
);

typedef Native_clang_index_setClientContainer = ffi.Void Function(
  ffi.Pointer<CXIdxContainerInfo> arg0,
  ffi.Pointer<ffi.Void> arg1,
);

typedef _dart_clang_index_setClientContainer = void Function(
  ffi.Pointer<CXIdxContainerInfo> arg0,
  ffi.Pointer<ffi.Void> arg1,
);

typedef Native_clang_index_getClientEntity = ffi.Pointer<ffi.Void> Function(
  ffi.Pointer<CXIdxEntityInfo> arg0,
);

typedef _dart_clang_index_getClientEntity = ffi.Pointer<ffi.Void> Function(
  ffi.Pointer<CXIdxEntityInfo> arg0,
);

typedef Native_clang_index_setClientEntity = ffi.Void Function(
  ffi.Pointer<CXIdxEntityInfo> arg0,
  ffi.Pointer<ffi.Void> arg1,
);

typedef _dart_clang_index_setClientEntity = void Function(
  ffi.Pointer<CXIdxEntityInfo> arg0,
  ffi.Pointer<ffi.Void> arg1,
);

typedef Native_clang_IndexAction_create = ffi.Pointer<ffi.Void> Function(
  ffi.Pointer<ffi.Void> CIdx,
);

typedef _dart_clang_IndexAction_create = ffi.Pointer<ffi.Void> Function(
  ffi.Pointer<ffi.Void> CIdx,
);

typedef Native_clang_IndexAction_dispose = ffi.Void Function(
  ffi.Pointer<ffi.Void> arg0,
);

typedef _dart_clang_IndexAction_dispose = void Function(
  ffi.Pointer<ffi.Void> arg0,
);

typedef Native_clang_indexSourceFile = ffi.Int32 Function(
  ffi.Pointer<ffi.Void> arg0,
  ffi.Pointer<ffi.Void> client_data,
  ffi.Pointer<IndexerCallbacks> index_callbacks,
  ffi.Uint32 index_callbacks_size,
  ffi.Uint32 index_options,
  ffi.Pointer<ffi.Int8> source_filename,
  ffi.Pointer<ffi.Pointer<ffi.Int8>> command_line_args,
  ffi.Int32 num_command_line_args,
  ffi.Pointer<CXUnsavedFile> unsaved_files,
  ffi.Uint32 num_unsaved_files,
  ffi.Pointer<ffi.Pointer<CXTranslationUnitImpl>> out_TU,
  ffi.Uint32 TU_options,
);

typedef _dart_clang_indexSourceFile = int Function(
  ffi.Pointer<ffi.Void> arg0,
  ffi.Pointer<ffi.Void> client_data,
  ffi.Pointer<IndexerCallbacks> index_callbacks,
  int index_callbacks_size,
  int index_options,
  ffi.Pointer<ffi.Int8> source_filename,
  ffi.Pointer<ffi.Pointer<ffi.Int8>> command_line_args,
  int num_command_line_args,
  ffi.Pointer<CXUnsavedFile> unsaved_files,
  int num_unsaved_files,
  ffi.Pointer<ffi.Pointer<CXTranslationUnitImpl>> out_TU,
  int TU_options,
);

typedef Native_clang_indexSourceFileFullArgv = ffi.Int32 Function(
  ffi.Pointer<ffi.Void> arg0,
  ffi.Pointer<ffi.Void> client_data,
  ffi.Pointer<IndexerCallbacks> index_callbacks,
  ffi.Uint32 index_callbacks_size,
  ffi.Uint32 index_options,
  ffi.Pointer<ffi.Int8> source_filename,
  ffi.Pointer<ffi.Pointer<ffi.Int8>> command_line_args,
  ffi.Int32 num_command_line_args,
  ffi.Pointer<CXUnsavedFile> unsaved_files,
  ffi.Uint32 num_unsaved_files,
  ffi.Pointer<ffi.Pointer<CXTranslationUnitImpl>> out_TU,
  ffi.Uint32 TU_options,
);

typedef _dart_clang_indexSourceFileFullArgv = int Function(
  ffi.Pointer<ffi.Void> arg0,
  ffi.Pointer<ffi.Void> client_data,
  ffi.Pointer<IndexerCallbacks> index_callbacks,
  int index_callbacks_size,
  int index_options,
  ffi.Pointer<ffi.Int8> source_filename,
  ffi.Pointer<ffi.Pointer<ffi.Int8>> command_line_args,
  int num_command_line_args,
  ffi.Pointer<CXUnsavedFile> unsaved_files,
  int num_unsaved_files,
  ffi.Pointer<ffi.Pointer<CXTranslationUnitImpl>> out_TU,
  int TU_options,
);

typedef Native_clang_indexTranslationUnit = ffi.Int32 Function(
  ffi.Pointer<ffi.Void> arg0,
  ffi.Pointer<ffi.Void> client_data,
  ffi.Pointer<IndexerCallbacks> index_callbacks,
  ffi.Uint32 index_callbacks_size,
  ffi.Uint32 index_options,
  ffi.Pointer<CXTranslationUnitImpl> arg5,
);

typedef _dart_clang_indexTranslationUnit = int Function(
  ffi.Pointer<ffi.Void> arg0,
  ffi.Pointer<ffi.Void> client_data,
  ffi.Pointer<IndexerCallbacks> index_callbacks,
  int index_callbacks_size,
  int index_options,
  ffi.Pointer<CXTranslationUnitImpl> arg5,
);

typedef Native_clang_indexLoc_getFileLocation = ffi.Void Function(
  CXIdxLoc loc,
  ffi.Pointer<ffi.Pointer<ffi.Void>> indexFile,
  ffi.Pointer<ffi.Pointer<ffi.Void>> file,
  ffi.Pointer<ffi.Uint32> line,
  ffi.Pointer<ffi.Uint32> column,
  ffi.Pointer<ffi.Uint32> offset,
);

typedef _dart_clang_indexLoc_getFileLocation = void Function(
  CXIdxLoc loc,
  ffi.Pointer<ffi.Pointer<ffi.Void>> indexFile,
  ffi.Pointer<ffi.Pointer<ffi.Void>> file,
  ffi.Pointer<ffi.Uint32> line,
  ffi.Pointer<ffi.Uint32> column,
  ffi.Pointer<ffi.Uint32> offset,
);

typedef Native_clang_indexLoc_getCXSourceLocation = CXSourceLocation Function(
  CXIdxLoc loc,
);

typedef _dart_clang_indexLoc_getCXSourceLocation = CXSourceLocation Function(
  CXIdxLoc loc,
);

typedef CXFieldVisitor = ffi.Int32 Function(
  CXCursor,
  ffi.Pointer<ffi.Void>,
);

typedef Native_clang_Type_visitFields = ffi.Uint32 Function(
  CXType T,
  ffi.Pointer<ffi.NativeFunction<CXFieldVisitor>> visitor,
  ffi.Pointer<ffi.Void> client_data,
);

typedef _dart_clang_Type_visitFields = int Function(
  CXType T,
  ffi.Pointer<ffi.NativeFunction<CXFieldVisitor>> visitor,
  ffi.Pointer<ffi.Void> client_data,
);

typedef _typedefC_2 = ffi.Int32 Function(
  ffi.Pointer<ffi.Void>,
  CXCursor,
  CXSourceRange,
);

typedef _typedefC_3 = ffi.Int32 Function(
  ffi.Pointer<ffi.Void>,
  ffi.Pointer<ffi.Void>,
);

typedef _typedefC_4 = ffi.Void Function(
  ffi.Pointer<ffi.Void>,
  ffi.Pointer<ffi.Void>,
  ffi.Pointer<ffi.Void>,
);

typedef _typedefC_5 = ffi.Pointer<ffi.Void> Function(
  ffi.Pointer<ffi.Void>,
  ffi.Pointer<ffi.Void>,
  ffi.Pointer<ffi.Void>,
);

typedef _typedefC_6 = ffi.Pointer<ffi.Void> Function(
  ffi.Pointer<ffi.Void>,
  ffi.Pointer<CXIdxIncludedFileInfo>,
);

typedef _typedefC_7 = ffi.Pointer<ffi.Void> Function(
  ffi.Pointer<ffi.Void>,
  ffi.Pointer<CXIdxImportedASTFileInfo>,
);

typedef _typedefC_8 = ffi.Pointer<ffi.Void> Function(
  ffi.Pointer<ffi.Void>,
  ffi.Pointer<ffi.Void>,
);

typedef _typedefC_9 = ffi.Void Function(
  ffi.Pointer<ffi.Void>,
  ffi.Pointer<CXIdxDeclInfo>,
);

typedef _typedefC_10 = ffi.Void Function(
  ffi.Pointer<ffi.Void>,
  ffi.Pointer<CXIdxEntityRefInfo>,
);
