forked from OSchip/llvm-project
[VFS] Add level() method to vfs::recursive_directory_iterator
Unlike sys::fs::recursive_directory_iterator, vfs::recursive_directory_iterator does not implement the level() method, which tells how deep in the directory tree the current iterator is. This is needed in the vfs::recursive_directory_iterator so that future improvements to the crash reproducer will be able to properly access header for umbrellas when looking into the VFS. rdar://problem/25880368 llvm-svn: 269520
This commit is contained in:
parent
eeae751429
commit
32b2897af6
|
@ -176,6 +176,11 @@ public:
|
||||||
bool operator!=(const recursive_directory_iterator &RHS) const {
|
bool operator!=(const recursive_directory_iterator &RHS) const {
|
||||||
return !(*this == RHS);
|
return !(*this == RHS);
|
||||||
}
|
}
|
||||||
|
/// \brief Gets the current level. Starting path is at level 0.
|
||||||
|
int level() const {
|
||||||
|
assert(State->size() && "Cannot get level without any iteration state");
|
||||||
|
return State->size()-1;
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
/// \brief The virtual file system interface.
|
/// \brief The virtual file system interface.
|
||||||
|
|
|
@ -1122,3 +1122,45 @@ TEST_F(VFSFromYAMLTest, DirectoryIterationSameDirMultipleEntries) {
|
||||||
checkContents(O->dir_begin("//root/baz/", EC),
|
checkContents(O->dir_begin("//root/baz/", EC),
|
||||||
{"//root/baz/x", "//root/baz/y"});
|
{"//root/baz/x", "//root/baz/y"});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TEST_F(VFSFromYAMLTest, RecursiveDirectoryIterationLevel) {
|
||||||
|
|
||||||
|
IntrusiveRefCntPtr<DummyFileSystem> Lower(new DummyFileSystem());
|
||||||
|
Lower->addDirectory("//root/a");
|
||||||
|
Lower->addDirectory("//root/a/b");
|
||||||
|
Lower->addDirectory("//root/a/b/c");
|
||||||
|
Lower->addRegularFile("//root/a/b/c/file");
|
||||||
|
IntrusiveRefCntPtr<vfs::FileSystem> FS = getFromYAMLString(
|
||||||
|
"{ 'use-external-names': false,\n"
|
||||||
|
" 'roots': [\n"
|
||||||
|
"{\n"
|
||||||
|
" 'type': 'directory',\n"
|
||||||
|
" 'name': '//root/a/b/c/',\n"
|
||||||
|
" 'contents': [ {\n"
|
||||||
|
" 'type': 'file',\n"
|
||||||
|
" 'name': 'file',\n"
|
||||||
|
" 'external-contents': '//root/a/b/c/file'\n"
|
||||||
|
" }\n"
|
||||||
|
" ]\n"
|
||||||
|
"},\n"
|
||||||
|
"]\n"
|
||||||
|
"}",
|
||||||
|
Lower);
|
||||||
|
ASSERT_TRUE(FS.get() != nullptr);
|
||||||
|
|
||||||
|
IntrusiveRefCntPtr<vfs::OverlayFileSystem> O(
|
||||||
|
new vfs::OverlayFileSystem(Lower));
|
||||||
|
O->pushOverlay(FS);
|
||||||
|
|
||||||
|
std::error_code EC;
|
||||||
|
|
||||||
|
// Test recursive_directory_iterator level()
|
||||||
|
vfs::recursive_directory_iterator I = vfs::recursive_directory_iterator(
|
||||||
|
*O, "//root", EC), E;
|
||||||
|
ASSERT_FALSE(EC);
|
||||||
|
for (int l = 0; I != E; I.increment(EC), ++l) {
|
||||||
|
ASSERT_FALSE(EC);
|
||||||
|
EXPECT_EQ(I.level(), l);
|
||||||
|
}
|
||||||
|
EXPECT_EQ(I, E);
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue