//===- CompilationDatabase.h ------------------------------------*- C++ -*-===// // // 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 // //===----------------------------------------------------------------------===// // // This file provides an interface and multiple implementations for // CompilationDatabases. // // While C++ refactoring and analysis tools are not compilers, and thus // don't run as part of the build system, they need the exact information // of a build in order to be able to correctly understand the C++ code of // the project. This information is provided via the CompilationDatabase // interface. // // To create a CompilationDatabase from a build directory one can call // CompilationDatabase::loadFromDirectory(), which deduces the correct // compilation database from the root of the build tree. // // See the concrete subclasses of CompilationDatabase for currently supported // formats. // //===----------------------------------------------------------------------===// #ifndef LLVM_CLANG_TOOLING_COMPILATIONDATABASE_H #define LLVM_CLANG_TOOLING_COMPILATIONDATABASE_H #include "clang/Basic/LLVM.h" #include "llvm/ADT/ArrayRef.h" #include "llvm/ADT/StringRef.h" #include "llvm/ADT/Twine.h" #include "llvm/Support/VirtualFileSystem.h" #include <memory> #include <string> #include <utility> #include <vector> namespace clang { namespace tooling { /// Specifies the working directory and command of a compilation. struct CompileCommand { … }; /// Interface for compilation databases. /// /// A compilation database allows the user to retrieve compile command lines /// for the files in a project. /// /// Many implementations are enumerable, allowing all command lines to be /// retrieved. These can be used to run clang tools over a subset of the files /// in a project. class CompilationDatabase { … }; /// A compilation database that returns a single compile command line. /// /// Useful when we want a tool to behave more like a compiler invocation. /// This compilation database is not enumerable: getAllFiles() returns {}. class FixedCompilationDatabase : public CompilationDatabase { … }; /// Transforms a compile command so that it applies the same configuration to /// a different file. Most args are left intact, but tweaks may be needed /// to certain flags (-x, -std etc). /// /// The output command will always end in {"--", Filename}. tooling::CompileCommand transferCompileCommand(tooling::CompileCommand, StringRef Filename); /// Returns a wrapped CompilationDatabase that defers to the provided one, /// but getCompileCommands() will infer commands for unknown files. /// The return value of getAllFiles() or getAllCompileCommands() is unchanged. /// See InterpolatingCompilationDatabase.cpp for details on heuristics. std::unique_ptr<CompilationDatabase> inferMissingCompileCommands(std::unique_ptr<CompilationDatabase>); /// Returns a wrapped CompilationDatabase that will add -target and -mode flags /// to commandline when they can be deduced from argv[0] of commandline returned /// by underlying database. std::unique_ptr<CompilationDatabase> inferTargetAndDriverMode(std::unique_ptr<CompilationDatabase> Base); /// Returns a wrapped CompilationDatabase that will expand all rsp(response) /// files on commandline returned by underlying database. std::unique_ptr<CompilationDatabase> expandResponseFiles(std::unique_ptr<CompilationDatabase> Base, llvm::IntrusiveRefCntPtr<llvm::vfs::FileSystem> FS); } // namespace tooling } // namespace clang #endif // LLVM_CLANG_TOOLING_COMPILATIONDATABASE_H