xref: /src/contrib/llvm-project/clang/lib/Tooling/GuessTargetAndModeCompilationDatabase.cpp (revision a7dea1671b87c07d2d266f836bfa8b58efc7c134)
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 Andric inferTargetAndDriverMode(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