10 #include "llvm/ADT/StringRef.h"
11 #include "llvm/ADT/Triple.h"
12 #include "llvm/Support/CommandLine.h"
13 #include "llvm/Support/ConvertUTF.h"
14 #include "llvm/Support/ErrorOr.h"
15 #include "llvm/Support/Host.h"
16 #include "llvm/Support/MemoryBuffer.h"
17 #include "llvm/Support/Path.h"
18 #include "llvm/Support/StringSaver.h"
24 class ExpandResponseFilesDatabase :
public CompilationDatabase {
26 ExpandResponseFilesDatabase(
27 std::unique_ptr<CompilationDatabase>
Base,
28 llvm::cl::TokenizerCallback Tokenizer,
31 assert(this->Base !=
nullptr);
32 assert(this->Tokenizer !=
nullptr);
33 assert(this->FS !=
nullptr);
36 std::vector<std::string> getAllFiles()
const override {
37 return Base->getAllFiles();
40 std::vector<CompileCommand>
41 getCompileCommands(StringRef FilePath)
const override {
42 return expand(
Base->getCompileCommands(FilePath));
45 std::vector<CompileCommand> getAllCompileCommands()
const override {
46 return expand(
Base->getAllCompileCommands());
50 std::vector<CompileCommand> expand(std::vector<CompileCommand> Cmds)
const {
51 for (
auto &
Cmd : Cmds) {
52 bool SeenRSPFile =
false;
54 Argv.reserve(
Cmd.CommandLine.size());
55 for (
auto &Arg :
Cmd.CommandLine) {
56 Argv.push_back(Arg.c_str());
58 SeenRSPFile |= Arg.front() ==
'@';
62 llvm::BumpPtrAllocator Alloc;
63 llvm::StringSaver Saver(Alloc);
64 llvm::cl::ExpandResponseFiles(Saver, Tokenizer, Argv,
false,
false,
false,
65 llvm::StringRef(
Cmd.Directory), *FS);
67 std::vector<std::string> ExpandedArgv(Argv.begin(), Argv.end());
68 Cmd.CommandLine = std::move(ExpandedArgv);
74 std::unique_ptr<CompilationDatabase>
Base;
75 llvm::cl::TokenizerCallback Tokenizer;
81 std::unique_ptr<CompilationDatabase>
84 auto Tokenizer = llvm::Triple(llvm::sys::getProcessTriple()).isOSWindows()
85 ? llvm::cl::TokenizeWindowsCommandLine
86 : llvm::cl::TokenizeGNUCommandLine;
87 return std::make_unique<ExpandResponseFilesDatabase>(
88 std::move(
Base), Tokenizer, std::move(FS));