From 759465ee34c0c0118fbd21cad87de17bb3be13e0 Mon Sep 17 00:00:00 2001 From: Jan Korous Date: Tue, 12 May 2020 14:42:22 -0700 Subject: [PATCH] [YAMLVFSWriter] Fix for delimiters Differential Revision: https://reviews.llvm.org/D79809 --- llvm/lib/Support/VirtualFileSystem.cpp | 27 ++++++++++++------- .../Support/VirtualFileSystemTest.cpp | 6 ++--- 2 files changed, 20 insertions(+), 13 deletions(-) diff --git a/llvm/lib/Support/VirtualFileSystem.cpp b/llvm/lib/Support/VirtualFileSystem.cpp index e71b92b0718e7..5b757c9ea80db 100644 --- a/llvm/lib/Support/VirtualFileSystem.cpp +++ b/llvm/lib/Support/VirtualFileSystem.cpp @@ -2027,10 +2027,10 @@ void JSONWriter::write(ArrayRef Entries, if (!Entries.empty()) { const YAMLVFSEntry &Entry = Entries.front(); - bool first_entry_is_directory = Entry.IsDirectory; - StringRef Dir = - first_entry_is_directory ? Entry.VPath : path::parent_path(Entry.VPath); - startDirectory(Dir); + + startDirectory( + Entry.IsDirectory ? Entry.VPath : path::parent_path(Entry.VPath) + ); StringRef RPath = Entry.RPath; if (UseOverlayRelative) { @@ -2040,24 +2040,31 @@ void JSONWriter::write(ArrayRef Entries, RPath = RPath.slice(OverlayDirLen, RPath.size()); } - if (!first_entry_is_directory) + bool IsCurrentDirEmpty = true; + if (!Entry.IsDirectory) { writeEntry(path::filename(Entry.VPath), RPath); + IsCurrentDirEmpty = false; + } for (const auto &Entry : Entries.slice(1)) { StringRef Dir = Entry.IsDirectory ? Entry.VPath : path::parent_path(Entry.VPath); if (Dir == DirStack.back()) { - if (!first_entry_is_directory) { + if (!IsCurrentDirEmpty) { OS << ",\n"; - first_entry_is_directory = false; } } else { + bool IsDirPoppedFromStack = false; while (!DirStack.empty() && !containedIn(DirStack.back(), Dir)) { OS << "\n"; endDirectory(); + IsDirPoppedFromStack = true; + } + if (IsDirPoppedFromStack || !IsCurrentDirEmpty) { + OS << ",\n"; } - OS << ",\n"; startDirectory(Dir); + IsCurrentDirEmpty = true; } StringRef RPath = Entry.RPath; if (UseOverlayRelative) { @@ -2066,8 +2073,10 @@ void JSONWriter::write(ArrayRef Entries, "Overlay dir must be contained in RPath"); RPath = RPath.slice(OverlayDirLen, RPath.size()); } - if (!Entry.IsDirectory) + if (!Entry.IsDirectory) { writeEntry(path::filename(Entry.VPath), RPath); + IsCurrentDirEmpty = false; + } } while (!DirStack.empty()) { diff --git a/llvm/unittests/Support/VirtualFileSystemTest.cpp b/llvm/unittests/Support/VirtualFileSystemTest.cpp index 5e314f7bd8b40..85e7093514b3a 100644 --- a/llvm/unittests/Support/VirtualFileSystemTest.cpp +++ b/llvm/unittests/Support/VirtualFileSystemTest.cpp @@ -2267,8 +2267,7 @@ TEST_F(VFSFromYAMLTest, YAMLVFSWriterTest2) { IntrusiveRefCntPtr Lower(new ErrorDummyFileSystem()); IntrusiveRefCntPtr FS = getFromYAMLRawString(Buffer, Lower); - // FIXME: Missing comma separator between file entries. - EXPECT_FALSE(FS.get() != nullptr); + EXPECT_TRUE(FS.get() != nullptr); } TEST_F(VFSFromYAMLTest, YAMLVFSWriterTest3) { @@ -2301,8 +2300,7 @@ TEST_F(VFSFromYAMLTest, YAMLVFSWriterTest3) { IntrusiveRefCntPtr Lower(new ErrorDummyFileSystem()); IntrusiveRefCntPtr FS = getFromYAMLRawString(Buffer, Lower); - // FIXME: Spurious comma separator before first file entry in directory. - EXPECT_FALSE(FS.get() != nullptr); + EXPECT_TRUE(FS.get() != nullptr); } TEST_F(VFSFromYAMLTest, YAMLVFSWriterTestHandleDirs) {