set(LLVM_LINK_COMPONENTS
  Option
  FrontendOpenMP
  Support
  )

add_subdirectory(Core)
add_subdirectory(Inclusions)
add_subdirectory(Refactoring)
add_subdirectory(ASTDiff)
add_subdirectory(DumpTool)
add_subdirectory(Syntax)
add_subdirectory(DependencyScanning)
add_subdirectory(Transformer)

# Replace the last lib component of the current binary directory with include
string(FIND ${CMAKE_CURRENT_BINARY_DIR} "/lib/" PATH_LIB_START REVERSE)
if(PATH_LIB_START EQUAL -1)
  message(FATAL_ERROR "Couldn't find lib component in binary directory")
endif()
math(EXPR PATH_LIB_END "${PATH_LIB_START}+5")
string(SUBSTRING ${CMAKE_CURRENT_BINARY_DIR} 0 ${PATH_LIB_START} PATH_HEAD)
string(SUBSTRING ${CMAKE_CURRENT_BINARY_DIR} ${PATH_LIB_END} -1 PATH_TAIL)
string(CONCAT BINARY_INCLUDE_DIR ${PATH_HEAD} "/include/clang/" ${PATH_TAIL})

if (NOT Python3_EXECUTABLE
    OR WIN32
    OR APPLE
    OR GENERATOR_IS_MULTI_CONFIG
    OR NOT LLVM_NATIVE_ARCH IN_LIST LLVM_TARGETS_TO_BUILD
    OR NOT X86 IN_LIST LLVM_TARGETS_TO_BUILD
    )
  file(GENERATE OUTPUT ${BINARY_INCLUDE_DIR}/NodeIntrospection.inc
    CONTENT "
namespace clang {
namespace tooling {

NodeLocationAccessors NodeIntrospection::GetLocations(clang::Stmt const *) {
  return {};
}
NodeLocationAccessors NodeIntrospection::GetLocations(clang::Decl const *) {
  return {};
}
NodeLocationAccessors NodeIntrospection::GetLocations(
    clang::CXXCtorInitializer const *) {
  return {};
}
NodeLocationAccessors NodeIntrospection::GetLocations(
    clang::NestedNameSpecifierLoc const*) {
  return {};
}
NodeLocationAccessors NodeIntrospection::GetLocations(
    clang::TemplateArgumentLoc const*) {
  return {};
}
NodeLocationAccessors NodeIntrospection::GetLocations(
    clang::CXXBaseSpecifier const*) {
  return {};
}
NodeLocationAccessors
NodeIntrospection::GetLocations(clang::DynTypedNode const &) {
  return {};
}
} // namespace tooling
} // namespace clang
"
    )
    set(CLANG_TOOLING_BUILD_AST_INTROSPECTION "OFF" CACHE BOOL "")
else()
  # The generation of ASTNodeAPI.json takes a long time in a
  # Debug build due to parsing AST.h. Disable the processing
  # but setting CLANG_TOOLING_BUILD_AST_INTROSPECTION as an
  # internal hidden setting to override.
  # When the processing is disabled, a trivial/empty JSON
  # file is generated by clang-ast-dump and generate_cxx_src_locs.py
  # generates the same API, but with a trivial implementation.
  option(CLANG_TOOLING_BUILD_AST_INTROSPECTION "Enable AST introspection" TRUE)

  set(skip_expensive_processing $<OR:$<CONFIG:Debug>,$<NOT:$<BOOL:${CLANG_TOOLING_BUILD_AST_INTROSPECTION}>>>)

  set(implicitDirs)
  foreach(implicitDir ${CMAKE_CXX_IMPLICIT_INCLUDE_DIRECTORIES})
    list(APPEND implicitDirs -I ${implicitDir})
  endforeach()

  add_custom_command(
      COMMENT Generate ASTNodeAPI.json
      OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/ASTNodeAPI.json
      DEPENDS clang-ast-dump clang-resource-headers
      COMMAND
      $<TARGET_FILE:clang-ast-dump>
        # Skip this in debug mode because parsing AST.h is too slow
        --skip-processing=${skip_expensive_processing}
        -I ${CMAKE_BINARY_DIR}/lib/clang/${CLANG_VERSION}/include
        -I ${CMAKE_SOURCE_DIR}/../clang/include
        -I ${CMAKE_BINARY_DIR}/tools/clang/include
        -I ${CMAKE_BINARY_DIR}/include
        -I ${CMAKE_SOURCE_DIR}/include
        ${implicitDirs}
        --json-output-path ${CMAKE_CURRENT_BINARY_DIR}/ASTNodeAPI.json
  )

  add_custom_target(run-ast-api-dump-tool
      DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/ASTNodeAPI.json
  )

  add_custom_command(
      COMMENT Generate NodeIntrospection.inc
      OUTPUT ${BINARY_INCLUDE_DIR}/NodeIntrospection.inc
      DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/ASTNodeAPI.json
        ${CMAKE_CURRENT_SOURCE_DIR}/DumpTool/generate_cxx_src_locs.py
      COMMAND
      ${Python3_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/DumpTool/generate_cxx_src_locs.py
        --json-input-path ${CMAKE_CURRENT_BINARY_DIR}/ASTNodeAPI.json
        --output-file NodeIntrospection.inc
        --empty-implementation ${skip_expensive_processing}
      COMMAND
      ${CMAKE_COMMAND} -E copy_if_different
        ${CMAKE_CURRENT_BINARY_DIR}/NodeIntrospection.inc
        ${BINARY_INCLUDE_DIR}/NodeIntrospection.inc
  )

  add_custom_target(run-ast-api-generate-tool
      DEPENDS
      ${BINARY_INCLUDE_DIR}/NodeIntrospection.inc
  )
endif()

add_clang_library(clangTooling
  AllTUsExecution.cpp
  ArgumentsAdjusters.cpp
  CommonOptionsParser.cpp
  CompilationDatabase.cpp
  Execution.cpp
  ExpandResponseFilesCompilationDatabase.cpp
  FileMatchTrie.cpp
  FixIt.cpp
  GuessTargetAndModeCompilationDatabase.cpp
  InterpolatingCompilationDatabase.cpp
  JSONCompilationDatabase.cpp
  Refactoring.cpp
  RefactoringCallbacks.cpp
  StandaloneExecution.cpp
  NodeIntrospection.cpp
  ${BINARY_INCLUDE_DIR}/NodeIntrospection.inc
  Tooling.cpp

  DEPENDS
  ClangDriverOptions
  omp_gen

  LINK_LIBS
  clangAST
  clangASTMatchers
  clangBasic
  clangDriver
  clangFormat
  clangFrontend
  clangLex
  clangRewrite
  clangSerialization
  clangToolingCore
  )
