================
@@ -132,404 +135,74 @@ Error MustacheHTMLGenerator::generateDocs(
       return Err;
   }
 
-  // Track which directories we already tried to create.
-  StringSet<> CreatedDirs;
-  // Collect all output by file name and create the necessary directories.
-  StringMap<std::vector<doc::Info *>> FileToInfos;
-  for (const auto &Group : Infos) {
-    llvm::TimeTraceScope TS("setup directories");
-    doc::Info *Info = Group.getValue().get();
-
-    SmallString<128> Path;
-    sys::path::native(RootDir, Path);
-    sys::path::append(Path, Info->getRelativeFilePath(""));
-    if (!CreatedDirs.contains(Path)) {
-      if (std::error_code EC = sys::fs::create_directories(Path))
-        return createStringError(EC, "failed to create directory '%s'.",
-                                 Path.c_str());
-      CreatedDirs.insert(Path);
-    }
+  {
+    llvm::TimeTraceScope TS("Generate JSON for Mustache");
+    if (auto JSONGenerator = findGeneratorByName("json")) {
+      if (Error Err = JSONGenerator.get()->generateDocs(
+              RootDir, std::move(Infos), CDCtx))
+        return Err;
+    } else
+      return JSONGenerator.takeError();
+  }
 
-    sys::path::append(Path, Info->getFileBaseName() + ".html");
-    FileToInfos[Path].push_back(Info);
+  StringMap<json::Value> JSONFileMap;
+  {
+    llvm::TimeTraceScope TS("Iterate JSON files");
+    std::error_code EC;
+    sys::fs::directory_iterator JSONIter(RootDir, EC);
+    std::vector<json::Value> JSONFiles;
+    JSONFiles.reserve(Infos.size());
+    if (EC)
+      return createStringError("Failed to create directory iterator.");
+
+    while (JSONIter != sys::fs::directory_iterator()) {
+      if (EC)
+        return createStringError(EC, "Failed to iterate directory");
+
+      auto Path = StringRef(JSONIter->path());
+      if (!Path.ends_with(".json")) {
+        JSONIter.increment(EC);
+        continue;
+      }
+
+      auto File = MemoryBuffer::getFile(Path);
+      if ((EC = File.getError()))
+        continue;
+
+      auto Parsed = json::parse((*File)->getBuffer());
+      if (!Parsed)
+        return Parsed.takeError();
+      JSONFileMap.try_emplace(Path, *Parsed);
----------------
evelez7 wrote:

> can you split the generation so that you serialize the json files and then 
> ingest them for mustache separately?

Do you mean keeping them in memory instead of writing to disk? I thought about 
adding that as a command line option in case someone also wants the JSON output 
anyways. I've been using it to debug.

> Is there any reason to keep them around or in memory? I'd guess we'd want to 
> convert these to HTML more or less serially (or in fixed size batches).

Yeah my first thought was to immediately delete an in-memory file once its 
processed to cut down on memory as we move through such a large amount of 
files. I'm not sure if this is better in batches for vectors. I also noticed 
that we don't do batches for file output. Would that make a difference with 
this volume of files?

Typing this out, a major improvement would be just linking the JSON and 
Mustache generators tighter by allowing an in-memory JSON object to be 
immediately passed to Mustache.

https://github.com/llvm/llvm-project/pull/149006
_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to