diff options
author | Ben Hamilton <benhamilton@google.com> | 2017-11-16 19:34:08 +0000 |
---|---|---|
committer | Ben Hamilton <benhamilton@google.com> | 2017-11-16 19:34:08 +0000 |
commit | 78381016785a3fc4b6304c8040198c9cdd0564d9 (patch) | |
tree | 1e94a84e62094fe1bdca9346b40abe1abd9a38f2 /clang/lib/Basic/VirtualFileSystem.cpp | |
parent | 4ca69bdac60db56a79d2eeb3cc62ced23f3f1d64 (diff) | |
download | llvm-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.cpp | 12 |
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; } |