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