aboutsummaryrefslogtreecommitdiff
path: root/clang/lib/Basic/VirtualFileSystem.cpp
diff options
context:
space:
mode:
authorBen Hamilton <benhamilton@google.com>2017-11-16 19:34:08 +0000
committerBen Hamilton <benhamilton@google.com>2017-11-16 19:34:08 +0000
commit78381016785a3fc4b6304c8040198c9cdd0564d9 (patch)
tree1e94a84e62094fe1bdca9346b40abe1abd9a38f2 /clang/lib/Basic/VirtualFileSystem.cpp
parent4ca69bdac60db56a79d2eeb3cc62ced23f3f1d64 (diff)
downloadllvm-78381016785a3fc4b6304c8040198c9cdd0564d9.zip
llvm-78381016785a3fc4b6304c8040198c9cdd0564d9.tar.gz
llvm-78381016785a3fc4b6304c8040198c9cdd0564d9.tar.bz2
[VirtualFileSystem] Support creating directories then adding files inside
Summary: In https://reviews.llvm.org/D39572 , I added support for specifying `Type` when invoking `InMemoryFileSystem::addFile()`. However, I didn't account for the fact that when `Type` is `directory_file`, we need to construct an `InMemoryDirectory`, not an `InMemoryFile`, or else clients cannot create files inside that directory. This diff fixes the bug and adds a test. Test Plan: New test added. Ran test with: % make -j12 check-clang-tools Reviewers: bkramer, hokein Reviewed By: bkramer Subscribers: cfe-commits Differential Revision: https://reviews.llvm.org/D40140 llvm-svn: 318445
Diffstat (limited to 'clang/lib/Basic/VirtualFileSystem.cpp')
-rw-r--r--clang/lib/Basic/VirtualFileSystem.cpp12
1 files changed, 9 insertions, 3 deletions
diff --git a/clang/lib/Basic/VirtualFileSystem.cpp b/clang/lib/Basic/VirtualFileSystem.cpp
index fd000196..9d44597 100644
--- a/clang/lib/Basic/VirtualFileSystem.cpp
+++ b/clang/lib/Basic/VirtualFileSystem.cpp
@@ -527,13 +527,19 @@ bool InMemoryFileSystem::addFile(const Twine &P, time_t ModificationTime,
++I;
if (!Node) {
if (I == E) {
- // End of the path, create a new file.
+ // End of the path, create a new file or directory.
Status Stat(P.str(), getNextVirtualUniqueID(),
llvm::sys::toTimePoint(ModificationTime), ResolvedUser,
ResolvedGroup, Buffer->getBufferSize(), ResolvedType,
ResolvedPerms);
- Dir->addChild(Name, llvm::make_unique<detail::InMemoryFile>(
- std::move(Stat), std::move(Buffer)));
+ std::unique_ptr<detail::InMemoryNode> Child;
+ if (ResolvedType == sys::fs::file_type::directory_file) {
+ Child.reset(new detail::InMemoryDirectory(std::move(Stat)));
+ } else {
+ Child.reset(new detail::InMemoryFile(std::move(Stat),
+ std::move(Buffer)));
+ }
+ Dir->addChild(Name, std::move(Child));
return true;
}