11 #include "llvm/ADT/STLExtras.h" 12 #include "llvm/ADT/SmallString.h" 13 #include "llvm/ADT/StringRef.h" 14 #include "llvm/Support/Path.h" 15 #include "llvm/Support/VirtualFileSystem.h" 24 class VolatileFileSystem :
public llvm::vfs::ProxyFileSystem {
26 explicit VolatileFileSystem(llvm::IntrusiveRefCntPtr<FileSystem> FS)
27 : ProxyFileSystem(std::move(FS)) {}
29 llvm::ErrorOr<std::unique_ptr<llvm::vfs::File>>
30 openFileForRead(
const llvm::Twine &InPath)
override {
31 llvm::SmallString<128>
Path;
32 InPath.toVector(Path);
34 auto File = getUnderlyingFS().openFileForRead(Path);
39 llvm::StringRef
FileName = llvm::sys::path::filename(Path);
40 if (FileName.startswith(
"preamble-") && FileName.endswith(
".pch"))
42 return std::unique_ptr<VolatileFile>(
new VolatileFile(std::move(*
File)));
46 class VolatileFile :
public llvm::vfs::File {
48 VolatileFile(std::unique_ptr<llvm::vfs::File> Wrapped)
49 : Wrapped(std::move(Wrapped)) {
50 assert(this->Wrapped);
53 virtual llvm::ErrorOr<std::unique_ptr<llvm::MemoryBuffer>>
54 getBuffer(
const llvm::Twine &
Name, int64_t FileSize,
55 bool RequiresNullTerminator,
bool )
override {
56 return Wrapped->getBuffer(Name, FileSize, RequiresNullTerminator,
60 llvm::ErrorOr<llvm::vfs::Status> status()
override {
61 return Wrapped->status();
63 llvm::ErrorOr<std::string> getName()
override {
return Wrapped->getName(); }
64 std::error_code close()
override {
return Wrapped->close(); }
67 std::unique_ptr<File> Wrapped;
72 llvm::IntrusiveRefCntPtr<llvm::vfs::FileSystem>
78 return new VolatileFileSystem(llvm::vfs::getRealFileSystem());
80 return llvm::vfs::getRealFileSystem();
std::string Path
A typedef to represent a file path.
static constexpr llvm::StringLiteral Name
===– Representation.cpp - ClangDoc Representation --------—*- C++ -*-===//
llvm::IntrusiveRefCntPtr< llvm::vfs::FileSystem > getFileSystem() const override
Called by ClangdServer to obtain a vfs::FileSystem to be used for parsing.