122989816SDimitry Andric //===- GuessTargetAndModeCompilationDatabase.cpp --------------------------===// 222989816SDimitry Andric // 322989816SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 422989816SDimitry Andric // See https://llvm.org/LICENSE.txt for license information. 522989816SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 622989816SDimitry Andric // 722989816SDimitry Andric //===----------------------------------------------------------------------===// 822989816SDimitry Andric 922989816SDimitry Andric #include "clang/Tooling/CompilationDatabase.h" 1022989816SDimitry Andric #include "clang/Tooling/Tooling.h" 1122989816SDimitry Andric #include <memory> 1222989816SDimitry Andric 1322989816SDimitry Andric namespace clang { 1422989816SDimitry Andric namespace tooling { 1522989816SDimitry Andric 1622989816SDimitry Andric namespace { 1722989816SDimitry Andric class TargetAndModeAdderDatabase : public CompilationDatabase { 1822989816SDimitry Andric public: TargetAndModeAdderDatabase(std::unique_ptr<CompilationDatabase> Base)1922989816SDimitry Andric TargetAndModeAdderDatabase(std::unique_ptr<CompilationDatabase> Base) 2022989816SDimitry Andric : Base(std::move(Base)) { 2122989816SDimitry Andric assert(this->Base != nullptr); 2222989816SDimitry Andric } 2322989816SDimitry Andric getAllFiles() const2422989816SDimitry Andric std::vector<std::string> getAllFiles() const override { 2522989816SDimitry Andric return Base->getAllFiles(); 2622989816SDimitry Andric } 2722989816SDimitry Andric getAllCompileCommands() const2822989816SDimitry Andric std::vector<CompileCommand> getAllCompileCommands() const override { 2922989816SDimitry Andric return addTargetAndMode(Base->getAllCompileCommands()); 3022989816SDimitry Andric } 3122989816SDimitry Andric 3222989816SDimitry Andric std::vector<CompileCommand> getCompileCommands(StringRef FilePath) const3322989816SDimitry Andric getCompileCommands(StringRef FilePath) const override { 3422989816SDimitry Andric return addTargetAndMode(Base->getCompileCommands(FilePath)); 3522989816SDimitry Andric } 3622989816SDimitry Andric 3722989816SDimitry Andric private: 3822989816SDimitry Andric std::vector<CompileCommand> addTargetAndMode(std::vector<CompileCommand> Cmds) const3922989816SDimitry Andric addTargetAndMode(std::vector<CompileCommand> Cmds) const { 4022989816SDimitry Andric for (auto &Cmd : Cmds) { 4122989816SDimitry Andric if (Cmd.CommandLine.empty()) 4222989816SDimitry Andric continue; 4322989816SDimitry Andric addTargetAndModeForProgramName(Cmd.CommandLine, Cmd.CommandLine.front()); 4422989816SDimitry Andric } 4522989816SDimitry Andric return Cmds; 4622989816SDimitry Andric } 4722989816SDimitry Andric std::unique_ptr<CompilationDatabase> Base; 4822989816SDimitry Andric }; 4922989816SDimitry Andric } // namespace 5022989816SDimitry Andric 5122989816SDimitry Andric std::unique_ptr<CompilationDatabase> inferTargetAndDriverMode(std::unique_ptr<CompilationDatabase> Base)5222989816SDimitry AndricinferTargetAndDriverMode(std::unique_ptr<CompilationDatabase> Base) { 53519fc96cSDimitry Andric return std::make_unique<TargetAndModeAdderDatabase>(std::move(Base)); 5422989816SDimitry Andric } 5522989816SDimitry Andric 5622989816SDimitry Andric } // namespace tooling 5722989816SDimitry Andric } // namespace clang 58