llvmbot wrote:

<!--LLVM PR SUMMARY COMMENT-->

@llvm/pr-subscribers-clang-tools-extra

Author: Erick Velez (evelez7)

<details>
<summary>Changes</summary>

By default all JSON is serialized "pretty" with whitespace. This patch
adds an option to serialize JSON without whitespace. This trims the size
of the JSON folder for clang from around 1.3 GB to 785 MB.


---
Full diff: https://github.com/llvm/llvm-project/pull/190822.diff


5 Files Affected:

- (modified) clang-tools-extra/clang-doc/JSONGenerator.cpp (+8-2) 
- (modified) clang-tools-extra/clang-doc/Representation.cpp (+7-9) 
- (modified) clang-tools-extra/clang-doc/Representation.h (+2-1) 
- (modified) clang-tools-extra/clang-doc/tool/ClangDocMain.cpp (+5-1) 
- (added) clang-tools-extra/test/clang-doc/compact.cpp (+10) 


``````````diff
diff --git a/clang-tools-extra/clang-doc/JSONGenerator.cpp 
b/clang-tools-extra/clang-doc/JSONGenerator.cpp
index 8db7eaafcfb30..f0b10bfd280e4 100644
--- a/clang-tools-extra/clang-doc/JSONGenerator.cpp
+++ b/clang-tools-extra/clang-doc/JSONGenerator.cpp
@@ -915,7 +915,10 @@ Error JSONGenerator::serializeIndex(StringRef RootDir) {
   raw_fd_ostream RootOS(IndexFilePath, FileErr, sys::fs::OF_Text);
   if (FileErr)
     return createFileError("cannot open file " + IndexFilePath, FileErr);
-  RootOS << llvm::formatv("{0:2}", ObjVal);
+  if (CDCtx->CompactJSON)
+    RootOS << llvm::formatv("{0}", ObjVal);
+  else
+    RootOS << llvm::formatv("{0:2}", ObjVal);
   return Error::success();
 }
 
@@ -1018,7 +1021,10 @@ Error JSONGenerator::generateDocForInfo(Info *I, 
raw_ostream &OS,
   case InfoType::IT_default:
     return createStringError(inconvertibleErrorCode(), "unexpected info type");
   }
-  OS << llvm::formatv("{0:2}", llvm::json::Value(std::move(Obj)));
+  if (CDCtx.CompactJSON)
+    OS << llvm::formatv("{0}", llvm::json::Value(std::move(Obj)));
+  else
+    OS << llvm::formatv("{0:2}", llvm::json::Value(std::move(Obj)));
   return Error::success();
 }
 
diff --git a/clang-tools-extra/clang-doc/Representation.cpp 
b/clang-tools-extra/clang-doc/Representation.cpp
index 1535fcc71df66..fbbb818e3d5ae 100644
--- a/clang-tools-extra/clang-doc/Representation.cpp
+++ b/clang-tools-extra/clang-doc/Representation.cpp
@@ -498,18 +498,16 @@ void Index::sort() {
     C.sort();
 }
 
-ClangDocContext::ClangDocContext(tooling::ExecutionContext *ECtx,
-                                 StringRef ProjectName, bool PublicOnly,
-                                 StringRef OutDirectory, StringRef SourceRoot,
-                                 StringRef RepositoryUrl,
-                                 StringRef RepositoryLinePrefix, StringRef 
Base,
-                                 std::vector<std::string> UserStylesheets,
-                                 clang::DiagnosticsEngine &Diags,
-                                 OutputFormatTy Format, bool FTimeTrace)
+ClangDocContext::ClangDocContext(
+    tooling::ExecutionContext *ECtx, StringRef ProjectName, bool PublicOnly,
+    StringRef OutDirectory, StringRef SourceRoot, StringRef RepositoryUrl,
+    StringRef RepositoryLinePrefix, StringRef Base,
+    std::vector<std::string> UserStylesheets, clang::DiagnosticsEngine &Diags,
+    OutputFormatTy Format, bool FTimeTrace, bool CompactJSON)
     : ECtx(ECtx), ProjectName(ProjectName), OutDirectory(OutDirectory),
       SourceRoot(std::string(SourceRoot)), UserStylesheets(UserStylesheets),
       Base(Base), Diags(Diags), Format(Format), PublicOnly(PublicOnly),
-      FTimeTrace(FTimeTrace) {
+      FTimeTrace(FTimeTrace), CompactJSON(CompactJSON) {
   llvm::SmallString<128> SourceRootDir(SourceRoot);
   if (SourceRoot.empty())
     // If no SourceRoot was provided the current path is used as the default
diff --git a/clang-tools-extra/clang-doc/Representation.h 
b/clang-tools-extra/clang-doc/Representation.h
index aa298f99db1ea..bc7baf132bff5 100644
--- a/clang-tools-extra/clang-doc/Representation.h
+++ b/clang-tools-extra/clang-doc/Representation.h
@@ -727,7 +727,7 @@ struct ClangDocContext {
                   StringRef RepositoryUrl, StringRef RepositoryCodeLinePrefix,
                   StringRef Base, std::vector<std::string> UserStylesheets,
                   clang::DiagnosticsEngine &Diags, OutputFormatTy Format,
-                  bool FTimeTrace = false);
+                  bool FTimeTrace = false, bool CompactJSON = false);
   tooling::ExecutionContext *ECtx;
   std::string ProjectName;  // Name of project clang-doc is documenting.
   std::string OutDirectory; // Directory for outputting generated files.
@@ -755,6 +755,7 @@ struct ClangDocContext {
   int Granularity; // Granularity of ftime trace
   bool PublicOnly; // Indicates if only public declarations are documented.
   bool FTimeTrace; // Indicates if ftime trace is turned on
+  bool CompactJSON; // Indicates if JSON is emitted without whitespace.
 };
 
 // Ensure arena allocated types remain safe to allocate in the arena.
diff --git a/clang-tools-extra/clang-doc/tool/ClangDocMain.cpp 
b/clang-tools-extra/clang-doc/tool/ClangDocMain.cpp
index f627ee5887528..13a33fe1474b0 100644
--- a/clang-tools-extra/clang-doc/tool/ClangDocMain.cpp
+++ b/clang-tools-extra/clang-doc/tool/ClangDocMain.cpp
@@ -50,6 +50,10 @@ using clang::doc::OutputFormatTy;
 static llvm::cl::extrahelp CommonHelp(CommonOptionsParser::HelpMessage);
 static llvm::cl::OptionCategory ClangDocCategory("clang-doc options");
 
+static llvm::cl::opt<bool>
+    CompactJSON("compact", llvm::cl::desc("Serialize JSON without 
whitespace."),
+                llvm::cl::cat(ClangDocCategory));
+
 static llvm::cl::opt<std::string>
     ProjectName("project-name", llvm::cl::desc("Name of project."),
                 llvm::cl::cat(ClangDocCategory));
@@ -309,7 +313,7 @@ Example usage for a project using a compile commands 
database:
         Executor->getExecutionContext(), ProjectName, PublicOnly, OutDirectory,
         SourceRoot, RepositoryUrl, RepositoryCodeLinePrefix, BaseDirectory,
         {UserStylesheets.begin(), UserStylesheets.end()}, Diags, FormatEnum,
-        FTimeTrace);
+        FTimeTrace, CompactJSON);
 
     if (Format == "html")
       ExitOnErr(getHtmlFiles(argv[0], CDCtx));
diff --git a/clang-tools-extra/test/clang-doc/compact.cpp 
b/clang-tools-extra/test/clang-doc/compact.cpp
new file mode 100644
index 0000000000000..399ab12205001
--- /dev/null
+++ b/clang-tools-extra/test/clang-doc/compact.cpp
@@ -0,0 +1,10 @@
+// RUN: rm -rf %t && mkdir -p %t
+// RUN: clang-doc --compact --doxygen --output=%t --format=json 
--executor=standalone %s
+// RUN: FileCheck %s < %t/json/GlobalNamespace/_ZTV3Foo.json 
--check-prefix=CLASS
+// RUN: FileCheck %s < %t/json/index.json --check-prefix=INDEX
+
+class Foo {};
+
+// CLASS: 
{"Contexts":[{"DocumentationFileName":"index","End":true,"Name":"Global 
Namespace","QualName":"GlobalNamespace","RelativePath":"{{.*}}","USR":"0000000000000000000000000000000000000000"}],"DocumentationFileName":"_ZTV3Foo","HasContexts":true,"InfoType":"record","IsTypedef":false,"Location":{"Filename":"/home/erick/code/llvm/clang-tools-extra/test/clang-doc/compact.cpp","LineNumber":6},"MangledName":"_ZTV3Foo","Name":"Foo","Namespace":["GlobalNamespace"],"Path":"GlobalNamespace","TagType":"class","USR":"{{([0-9A-F]{40})}}"}
+
+// INDEX: 
{"Index":[{"Name":"GlobalNamespace","QualName":"GlobalNamespace","Type":"namespace","USR":"0000000000000000000000000000000000000000"}]}

``````````

</details>


https://github.com/llvm/llvm-project/pull/190822
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to