# Copyright (c) 2020, the Dart project authors. Please see the AUTHORS file
# for details. All rights reserved. Use of this source code is governed by a
# BSD-style license that can be found in the LICENSE file.

# Config file for generating the libclang bindings used by this package.

# ===================== GENERATING BINDINGS =====================
#    cd to project's root, and run -
#    dart run ffigen --config tool/libclang_config.yaml
# ===============================================================

name: Clang
description: Holds bindings to LibClang.
output: 'lib/src/header_parser/clang_bindings/clang_bindings.dart'
compiler-opts:
  - '-Ithird_party/libclang/include'
  - '-Wno-nullability-completeness'
headers:
  entry-points:
    - 'third_party/libclang/include/clang-c/Index.h'
  include-directives:
    - '**wrapper.c'
    - '**Index.h'
    - '**CXString.h'

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

enums:
  include:
    - CXChildVisitResult
    - CXCursorKind
    - CXTypeKind
    - CXDiagnosticDisplayOptions
    - CXTranslationUnit_Flags
    - CXEvalResultKind

structs:
  include:
    - CXCursor
    - CXType
    - CXSourceLocation
    - CXString
    - CXTranslationUnitImpl
    - CXUnsavedFile
    - CXSourceRange

functions:
  include:
    - clang_createIndex
    - clang_disposeIndex
    - clang_getNumDiagnostics
    - clang_getDiagnostic
    - clang_disposeDiagnostic
    - clang_parseTranslationUnit
    - clang_disposeTranslationUnit
    - clang_EvalResult_getKind
    - clang_EvalResult_getAsInt
    - clang_EvalResult_getAsLongLong
    - clang_EvalResult_getAsDouble
    - clang_EvalResult_getAsStr
    - clang_EvalResult_dispose
    - clang_getCString
    - clang_disposeString
    - clang_getCursorKind
    - clang_getCursorKindSpelling
    - clang_getCursorType
    - clang_getTypeSpelling
    - clang_getTypeKindSpelling
    - clang_getResultType
    - clang_getTypedefName
    - clang_getPointeeType
    - clang_getCanonicalType
    - clang_Type_getNamedType
    - clang_Type_getAlignOf
    - clang_getTypeDeclaration
    - clang_getTypedefDeclUnderlyingType
    - clang_getCursorSpelling
    - clang_getTranslationUnitCursor
    - clang_formatDiagnostic
    - clang_visitChildren
    - clang_Cursor_getNumArguments
    - clang_Cursor_getArgument
    - clang_getNumArgTypes
    - clang_getArgType
    - clang_getEnumConstantDeclValue
    - clang_equalRanges
    - clang_Cursor_getCommentRange
    - clang_Cursor_getRawCommentText
    - clang_Cursor_getBriefCommentText
    - clang_getCursorLocation
    - clang_getFileLocation
    - clang_getFileName
    - clang_getNumElements
    - clang_getArrayElementType
    - clang_Cursor_isMacroFunctionLike
    - clang_Cursor_isMacroBuiltin
    - clang_Cursor_Evaluate
    - clang_Cursor_isAnonymous
    - clang_Cursor_isAnonymousRecordDecl
    - clang_getCursorUSR
    - clang_getFieldDeclBitWidth
    - clang_Cursor_isFunctionInlined
    - clang_getCursorDefinition
    - clang_Cursor_isNull
    - clang_Cursor_hasAttrs
