xref: /llvm-project/clang/lib/Tooling/GuessTargetAndModeCompilationDatabase.cpp (revision 2b3d49b610bd2a45884115edcb21110bfa325f51)
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 Cetinkaya inferTargetAndDriverMode(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