diff options
author | Reid Kleckner <rnk@google.com> | 2018-07-26 23:21:51 +0000 |
---|---|---|
committer | Reid Kleckner <rnk@google.com> | 2018-07-26 23:21:51 +0000 |
commit | 4d23f45a11325dfc03a9904cfc1e354c54f06081 (patch) | |
tree | 3e5a4ecca161edc58b1a8c2f278a6b982c42d572 /clang/lib/Basic/VirtualFileSystem.cpp | |
parent | 4a83f0abd8177396493968332031085ff217c6d5 (diff) | |
download | bcm5719-llvm-4d23f45a11325dfc03a9904cfc1e354c54f06081.tar.gz bcm5719-llvm-4d23f45a11325dfc03a9904cfc1e354c54f06081.zip |
Revert r338057 "[VirtualFileSystem] InMemoryFileSystem::status: Return a Status with the requested name"
This broke clang/test/PCH/case-insensitive-include.c on Windows.
llvm-svn: 338084
Diffstat (limited to 'clang/lib/Basic/VirtualFileSystem.cpp')
-rw-r--r-- | clang/lib/Basic/VirtualFileSystem.cpp | 65 |
1 files changed, 14 insertions, 51 deletions
diff --git a/clang/lib/Basic/VirtualFileSystem.cpp b/clang/lib/Basic/VirtualFileSystem.cpp index a7b8b024a47..bcfcbdbb901 100644 --- a/clang/lib/Basic/VirtualFileSystem.cpp +++ b/clang/lib/Basic/VirtualFileSystem.cpp @@ -474,28 +474,12 @@ class InMemoryNode { Status Stat; InMemoryNodeKind Kind; -protected: - /// Return Stat. This should only be used for internal/debugging use. When - /// clients wants the Status of this node, they should use - /// \p getStatus(StringRef). - const Status &getStatus() const { return Stat; } - public: InMemoryNode(Status Stat, InMemoryNodeKind Kind) : Stat(std::move(Stat)), Kind(Kind) {} virtual ~InMemoryNode() = default; - /// Return the \p Status for this node. \p RequestedName should be the name - /// through which the caller referred to this node. It will override - /// \p Status::Name in the return value, to mimic the behavior of \p RealFile. - Status getStatus(StringRef RequestedName) const { - return Status::copyWithNewName(Stat, RequestedName); - } - - /// Get the filename of this node (the name without the directory part). - StringRef getFileName() const { - return llvm::sys::path::filename(Stat.getName()); - } + const Status &getStatus() const { return Stat; } InMemoryNodeKind getKind() const { return Kind; } virtual std::string toString(unsigned Indent) const = 0; }; @@ -520,21 +504,14 @@ public: } }; -/// Adapt a InMemoryFile for VFS' File interface. The goal is to make -/// \p InMemoryFileAdaptor mimic as much as possible the behavior of -/// \p RealFile. +/// Adapt a InMemoryFile for VFS' File interface. class InMemoryFileAdaptor : public File { InMemoryFile &Node; - /// The name to use when returning a Status for this file. - std::string RequestedName; public: - explicit InMemoryFileAdaptor(InMemoryFile &Node, std::string RequestedName) - : Node(Node), RequestedName(std::move(RequestedName)) {} + explicit InMemoryFileAdaptor(InMemoryFile &Node) : Node(Node) {} - llvm::ErrorOr<Status> status() override { - return Node.getStatus(RequestedName); - } + llvm::ErrorOr<Status> status() override { return Node.getStatus(); } llvm::ErrorOr<std::unique_ptr<llvm::MemoryBuffer>> getBuffer(const Twine &Name, int64_t FileSize, bool RequiresNullTerminator, @@ -734,7 +711,7 @@ lookupInMemoryNode(const InMemoryFileSystem &FS, detail::InMemoryDirectory *Dir, llvm::ErrorOr<Status> InMemoryFileSystem::status(const Twine &Path) { auto Node = lookupInMemoryNode(*this, Root.get(), Path); if (Node) - return (*Node)->getStatus(Path.str()); + return (*Node)->getStatus(); return Node.getError(); } @@ -747,8 +724,7 @@ InMemoryFileSystem::openFileForRead(const Twine &Path) { // When we have a file provide a heap-allocated wrapper for the memory buffer // to match the ownership semantics for File. if (auto *F = dyn_cast<detail::InMemoryFile>(*Node)) - return std::unique_ptr<File>( - new detail::InMemoryFileAdaptor(*F, Path.str())); + return std::unique_ptr<File>(new detail::InMemoryFileAdaptor(*F)); // FIXME: errc::not_a_file? return make_error_code(llvm::errc::invalid_argument); @@ -760,33 +736,21 @@ namespace { class InMemoryDirIterator : public clang::vfs::detail::DirIterImpl { detail::InMemoryDirectory::const_iterator I; detail::InMemoryDirectory::const_iterator E; - std::string RequestedDirName; - - void setCurrentEntry() { - if (I != E) { - SmallString<256> Path(RequestedDirName); - llvm::sys::path::append(Path, I->second->getFileName()); - CurrentEntry = I->second->getStatus(Path); - } else { - // When we're at the end, make CurrentEntry invalid and DirIterImpl will - // do the rest. - CurrentEntry = Status(); - } - } public: InMemoryDirIterator() = default; - explicit InMemoryDirIterator(detail::InMemoryDirectory &Dir, - std::string RequestedDirName) - : I(Dir.begin()), E(Dir.end()), - RequestedDirName(std::move(RequestedDirName)) { - setCurrentEntry(); + explicit InMemoryDirIterator(detail::InMemoryDirectory &Dir) + : I(Dir.begin()), E(Dir.end()) { + if (I != E) + CurrentEntry = I->second->getStatus(); } std::error_code increment() override { ++I; - setCurrentEntry(); + // When we're at the end, make CurrentEntry invalid and DirIterImpl will do + // the rest. + CurrentEntry = I != E ? I->second->getStatus() : Status(); return {}; } }; @@ -802,8 +766,7 @@ directory_iterator InMemoryFileSystem::dir_begin(const Twine &Dir, } if (auto *DirNode = dyn_cast<detail::InMemoryDirectory>(*Node)) - return directory_iterator( - std::make_shared<InMemoryDirIterator>(*DirNode, Dir.str())); + return directory_iterator(std::make_shared<InMemoryDirIterator>(*DirNode)); EC = make_error_code(llvm::errc::not_a_directory); return directory_iterator(std::make_shared<InMemoryDirIterator>()); |