xref: /llvm-project/clang/lib/Tooling/ExpandResponseFilesCompilationDatabase.cpp (revision d60d3455eb2b375d026a4aa74c4ba0c38f5d323c)
145ef055dSKadir Cetinkaya //===- ExpandResponseFileCompilationDataBase.cpp --------------------------===//
245ef055dSKadir Cetinkaya //
345ef055dSKadir Cetinkaya // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
445ef055dSKadir Cetinkaya // See https://llvm.org/LICENSE.txt for license information.
545ef055dSKadir Cetinkaya // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
645ef055dSKadir Cetinkaya //
745ef055dSKadir Cetinkaya //===----------------------------------------------------------------------===//
845ef055dSKadir Cetinkaya 
945ef055dSKadir Cetinkaya #include "clang/Tooling/CompilationDatabase.h"
10*d60d3455SDmitry Polukhin #include "clang/Tooling/Tooling.h"
11b3b37783SKadir Cetinkaya #include "llvm/ADT/StringRef.h"
1245ef055dSKadir Cetinkaya #include "llvm/Support/CommandLine.h"
1345ef055dSKadir Cetinkaya #include "llvm/Support/ConvertUTF.h"
1445ef055dSKadir Cetinkaya #include "llvm/Support/ErrorOr.h"
1545ef055dSKadir Cetinkaya #include "llvm/Support/MemoryBuffer.h"
1645ef055dSKadir Cetinkaya #include "llvm/Support/Path.h"
1745ef055dSKadir Cetinkaya #include "llvm/Support/StringSaver.h"
18d768bf99SArchibald Elliott #include "llvm/TargetParser/Host.h"
1962c7f035SArchibald Elliott #include "llvm/TargetParser/Triple.h"
2045ef055dSKadir Cetinkaya 
2145ef055dSKadir Cetinkaya namespace clang {
2245ef055dSKadir Cetinkaya namespace tooling {
2345ef055dSKadir Cetinkaya namespace {
2445ef055dSKadir Cetinkaya 
2545ef055dSKadir Cetinkaya class ExpandResponseFilesDatabase : public CompilationDatabase {
2645ef055dSKadir Cetinkaya public:
ExpandResponseFilesDatabase(std::unique_ptr<CompilationDatabase> Base,llvm::cl::TokenizerCallback Tokenizer,llvm::IntrusiveRefCntPtr<llvm::vfs::FileSystem> FS)2745ef055dSKadir Cetinkaya   ExpandResponseFilesDatabase(
2845ef055dSKadir Cetinkaya       std::unique_ptr<CompilationDatabase> Base,
2945ef055dSKadir Cetinkaya       llvm::cl::TokenizerCallback Tokenizer,
3045ef055dSKadir Cetinkaya       llvm::IntrusiveRefCntPtr<llvm::vfs::FileSystem> FS)
3145ef055dSKadir Cetinkaya       : Base(std::move(Base)), Tokenizer(Tokenizer), FS(std::move(FS)) {
3245ef055dSKadir Cetinkaya     assert(this->Base != nullptr);
3345ef055dSKadir Cetinkaya     assert(this->Tokenizer != nullptr);
3445ef055dSKadir Cetinkaya     assert(this->FS != nullptr);
3545ef055dSKadir Cetinkaya   }
3645ef055dSKadir Cetinkaya 
getAllFiles() const3745ef055dSKadir Cetinkaya   std::vector<std::string> getAllFiles() const override {
3845ef055dSKadir Cetinkaya     return Base->getAllFiles();
3945ef055dSKadir Cetinkaya   }
4045ef055dSKadir Cetinkaya 
4145ef055dSKadir Cetinkaya   std::vector<CompileCommand>
getCompileCommands(StringRef FilePath) const4245ef055dSKadir Cetinkaya   getCompileCommands(StringRef FilePath) const override {
4345ef055dSKadir Cetinkaya     return expand(Base->getCompileCommands(FilePath));
4445ef055dSKadir Cetinkaya   }
4545ef055dSKadir Cetinkaya 
getAllCompileCommands() const4645ef055dSKadir Cetinkaya   std::vector<CompileCommand> getAllCompileCommands() const override {
4745ef055dSKadir Cetinkaya     return expand(Base->getAllCompileCommands());
4845ef055dSKadir Cetinkaya   }
4945ef055dSKadir Cetinkaya 
5045ef055dSKadir Cetinkaya private:
expand(std::vector<CompileCommand> Cmds) const5145ef055dSKadir Cetinkaya   std::vector<CompileCommand> expand(std::vector<CompileCommand> Cmds) const {
52*d60d3455SDmitry Polukhin     for (auto &Cmd : Cmds)
53*d60d3455SDmitry Polukhin       tooling::addExpandedResponseFiles(Cmd.CommandLine, Cmd.Directory,
54*d60d3455SDmitry Polukhin                                         Tokenizer, *FS);
5545ef055dSKadir Cetinkaya     return Cmds;
5645ef055dSKadir Cetinkaya   }
5745ef055dSKadir Cetinkaya 
5845ef055dSKadir Cetinkaya private:
5945ef055dSKadir Cetinkaya   std::unique_ptr<CompilationDatabase> Base;
6045ef055dSKadir Cetinkaya   llvm::cl::TokenizerCallback Tokenizer;
6145ef055dSKadir Cetinkaya   llvm::IntrusiveRefCntPtr<llvm::vfs::FileSystem> FS;
6245ef055dSKadir Cetinkaya };
6345ef055dSKadir Cetinkaya 
6445ef055dSKadir Cetinkaya } // namespace
6545ef055dSKadir Cetinkaya 
6645ef055dSKadir Cetinkaya std::unique_ptr<CompilationDatabase>
expandResponseFiles(std::unique_ptr<CompilationDatabase> Base,llvm::IntrusiveRefCntPtr<llvm::vfs::FileSystem> FS)6745ef055dSKadir Cetinkaya expandResponseFiles(std::unique_ptr<CompilationDatabase> Base,
6845ef055dSKadir Cetinkaya                     llvm::IntrusiveRefCntPtr<llvm::vfs::FileSystem> FS) {
6945ef055dSKadir Cetinkaya   auto Tokenizer = llvm::Triple(llvm::sys::getProcessTriple()).isOSWindows()
7045ef055dSKadir Cetinkaya                        ? llvm::cl::TokenizeWindowsCommandLine
7145ef055dSKadir Cetinkaya                        : llvm::cl::TokenizeGNUCommandLine;
7245ef055dSKadir Cetinkaya   return std::make_unique<ExpandResponseFilesDatabase>(
7345ef055dSKadir Cetinkaya       std::move(Base), Tokenizer, std::move(FS));
7445ef055dSKadir Cetinkaya }
7545ef055dSKadir Cetinkaya 
7645ef055dSKadir Cetinkaya } // namespace tooling
7745ef055dSKadir Cetinkaya } // namespace clang
78