From 759465ee34c0c0118fbd21cad87de17bb3be13e0 Mon Sep 17 00:00:00 2001 From: Jan Korous Date: Tue, 12 May 2020 14:42:22 -0700 Subject: [YAMLVFSWriter] Fix for delimiters Differential Revision: https://reviews.llvm.org/D79809 --- llvm/lib/Support/VirtualFileSystem.cpp | 27 ++++++++++++++++++--------- 1 file changed, 18 insertions(+), 9 deletions(-) (limited to 'llvm/lib/Support/VirtualFileSystem.cpp') diff --git a/llvm/lib/Support/VirtualFileSystem.cpp b/llvm/lib/Support/VirtualFileSystem.cpp index e71b92b0718e..5b757c9ea80d 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()) { -- cgit v1.2.3