1c3a73023SKadir Cetinkaya //===- GuessTargetAndModeCompilationDatabase.cpp --------------------------===// 2c3a73023SKadir Cetinkaya // 3c3a73023SKadir Cetinkaya // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4c3a73023SKadir Cetinkaya // See https://llvm.org/LICENSE.txt for license information. 5c3a73023SKadir Cetinkaya // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6c3a73023SKadir Cetinkaya // 7c3a73023SKadir Cetinkaya //===----------------------------------------------------------------------===// 8c3a73023SKadir Cetinkaya 9c3a73023SKadir Cetinkaya #include "clang/Tooling/CompilationDatabase.h" 10c3a73023SKadir Cetinkaya #include "clang/Tooling/Tooling.h" 11c3a73023SKadir Cetinkaya #include <memory> 12c3a73023SKadir Cetinkaya 13c3a73023SKadir Cetinkaya namespace clang { 14c3a73023SKadir Cetinkaya namespace tooling { 15c3a73023SKadir Cetinkaya 16c3a73023SKadir Cetinkaya namespace { 17c3a73023SKadir Cetinkaya class TargetAndModeAdderDatabase : public CompilationDatabase { 18c3a73023SKadir Cetinkaya public: TargetAndModeAdderDatabase(std::unique_ptr<CompilationDatabase> Base)19c3a73023SKadir Cetinkaya TargetAndModeAdderDatabase(std::unique_ptr<CompilationDatabase> Base) 20c3a73023SKadir Cetinkaya : Base(std::move(Base)) { 21c3a73023SKadir Cetinkaya assert(this->Base != nullptr); 22c3a73023SKadir Cetinkaya } 23c3a73023SKadir Cetinkaya getAllFiles() const24c3a73023SKadir Cetinkaya std::vector<std::string> getAllFiles() const override { 25c3a73023SKadir Cetinkaya return Base->getAllFiles(); 26c3a73023SKadir Cetinkaya } 27c3a73023SKadir Cetinkaya getAllCompileCommands() const28c3a73023SKadir Cetinkaya std::vector<CompileCommand> getAllCompileCommands() const override { 29c3a73023SKadir Cetinkaya return addTargetAndMode(Base->getAllCompileCommands()); 30c3a73023SKadir Cetinkaya } 31c3a73023SKadir Cetinkaya 32c3a73023SKadir Cetinkaya std::vector<CompileCommand> getCompileCommands(StringRef FilePath) const33c3a73023SKadir Cetinkaya getCompileCommands(StringRef FilePath) const override { 34c3a73023SKadir Cetinkaya return addTargetAndMode(Base->getCompileCommands(FilePath)); 35c3a73023SKadir Cetinkaya } 36c3a73023SKadir Cetinkaya 37c3a73023SKadir Cetinkaya private: 38c3a73023SKadir Cetinkaya std::vector<CompileCommand> addTargetAndMode(std::vector<CompileCommand> Cmds) const39c3a73023SKadir Cetinkaya addTargetAndMode(std::vector<CompileCommand> Cmds) const { 40c3a73023SKadir Cetinkaya for (auto &Cmd : Cmds) { 41c3a73023SKadir Cetinkaya if (Cmd.CommandLine.empty()) 42c3a73023SKadir Cetinkaya continue; 43c3a73023SKadir Cetinkaya addTargetAndModeForProgramName(Cmd.CommandLine, Cmd.CommandLine.front()); 44c3a73023SKadir Cetinkaya } 45c3a73023SKadir Cetinkaya return Cmds; 46c3a73023SKadir Cetinkaya } 47c3a73023SKadir Cetinkaya std::unique_ptr<CompilationDatabase> Base; 48c3a73023SKadir Cetinkaya }; 49c3a73023SKadir Cetinkaya } // namespace 50c3a73023SKadir Cetinkaya 51c3a73023SKadir Cetinkaya std::unique_ptr<CompilationDatabase> inferTargetAndDriverMode(std::unique_ptr<CompilationDatabase> Base)52c3a73023SKadir CetinkayainferTargetAndDriverMode(std::unique_ptr<CompilationDatabase> Base) { 53*2b3d49b6SJonas Devlieghere return std::make_unique<TargetAndModeAdderDatabase>(std::move(Base)); 54c3a73023SKadir Cetinkaya } 55c3a73023SKadir Cetinkaya 56c3a73023SKadir Cetinkaya } // namespace tooling 57c3a73023SKadir Cetinkaya } // namespace clang 58