11 #include "llvm/ADT/StringExtras.h"
12 #include "llvm/Support/VirtualFileSystem.h"
19 std::lock_guard<std::mutex> Lock(Mutex);
21 auto It = Drafts.find(File);
22 if (It == Drafts.end())
29 std::lock_guard<std::mutex> Lock(Mutex);
30 std::vector<Path> ResultVector;
32 for (
auto DraftIt = Drafts.begin(); DraftIt != Drafts.end(); DraftIt++)
33 ResultVector.push_back(std::string(DraftIt->getKey()));
40 if (S.empty() || !llvm::isDigit(S.back())) {
45 auto I = S.rbegin(),
E = S.rend();
47 if (I ==
E || !llvm::isDigit(*I)) {
49 S.insert(I.base(),
'1');
62 llvm::StringRef SpecifiedVersion) {
63 if (!SpecifiedVersion.empty()) {
65 if (SpecifiedVersion.compare_numeric(
D.Version) <= 0)
66 log(
"File version went from {0} to {1}",
D.Version, SpecifiedVersion);
67 D.Version = SpecifiedVersion.str();
75 llvm::StringRef Contents) {
76 std::lock_guard<std::mutex> Lock(Mutex);
78 auto &
D = Drafts[File];
81 D.D.Contents = std::make_shared<std::string>(Contents);
86 std::lock_guard<std::mutex> Lock(Mutex);
95 class SharedStringBuffer :
public llvm::MemoryBuffer {
96 const std::shared_ptr<const std::string> BufferContents;
97 const std::string
Name;
100 BufferKind getBufferKind()
const override {
101 return MemoryBuffer::MemoryBuffer_Malloc;
104 StringRef getBufferIdentifier()
const override {
return Name; }
106 SharedStringBuffer(std::shared_ptr<const std::string> Data, StringRef Name)
107 : BufferContents(std::move(Data)),
Name(
Name) {
108 assert(BufferContents &&
"Can't create from empty shared_ptr");
109 MemoryBuffer::init(BufferContents->c_str(),
110 BufferContents->c_str() + BufferContents->size(),
117 auto MemFS = llvm::makeIntrusiveRefCnt<llvm::vfs::InMemoryFileSystem>();
118 std::lock_guard<std::mutex> Guard(Mutex);
119 for (
const auto &
Draft : Drafts)
120 MemFS->addFile(
Draft.getKey(),
Draft.getValue().MTime,
121 std::make_unique<SharedStringBuffer>(