https://github.com/evelez7 created 
https://github.com/llvm/llvm-project/pull/209071

Focus is shifting to the Mustache-backed Markdown generator which is now called 
by `--format=md`. Any potential gaps in functionality are documented in #201945.

>From f7581bfdb9ef9586d65f1a0b3dbbe39390af99b5 Mon Sep 17 00:00:00 2001
From: Erick Velez <[email protected]>
Date: Sun, 12 Jul 2026 18:47:21 -0700
Subject: [PATCH] [clang-doc] Remove deprecated Markdown generator

Focus is shifting to the Mustache-backed Markdown generator which is now
called by `--format=md`. Any potential gaps in functionality are
documented in #201945.
---
 clang-tools-extra/clang-doc/CMakeLists.txt    |   1 -
 clang-tools-extra/clang-doc/Generators.cpp    |   2 -
 clang-tools-extra/clang-doc/Generators.h      |   1 -
 clang-tools-extra/clang-doc/JSONGenerator.cpp |   2 +-
 clang-tools-extra/clang-doc/MDGenerator.cpp   | 660 +++---------------
 .../clang-doc/MDMustacheGenerator.cpp         | 121 ----
 clang-tools-extra/clang-doc/Representation.h  |   2 +-
 .../clang-doc/tool/ClangDocMain.cpp           |  29 +-
 .../clang-doc/basic-project.mustache.test     |   2 +-
 .../test/clang-doc/basic-project.test         | 127 +---
 .../test/clang-doc/md/array-type.cpp          |   5 +-
 .../test/clang-doc/md/builtin_types.cpp       |  36 +-
 .../md/class-partial-specialization.cpp       |   5 +-
 .../test/clang-doc/md/comments-in-macros.cpp  |  15 +-
 clang-tools-extra/test/clang-doc/md/enum.cpp  | 114 +--
 .../clang-doc/md/function-pointer-type.cpp    |   5 +-
 .../md/member-function-pointer-type.cpp       |   5 +-
 .../test/clang-doc/md/namespace.cpp           | 144 +---
 .../md/nested-pointer-qualifiers.cpp          |   3 -
 .../test/clang-doc/md/templates.cpp           |  28 +-
 .../unittests/clang-doc/CMakeLists.txt        |   1 -
 .../unittests/clang-doc/MDGeneratorTest.cpp   | 428 ------------
 22 files changed, 158 insertions(+), 1578 deletions(-)
 delete mode 100644 clang-tools-extra/clang-doc/MDMustacheGenerator.cpp
 delete mode 100644 clang-tools-extra/unittests/clang-doc/MDGeneratorTest.cpp

diff --git a/clang-tools-extra/clang-doc/CMakeLists.txt 
b/clang-tools-extra/clang-doc/CMakeLists.txt
index 438888c1e5e13..f4d86e8830a6b 100644
--- a/clang-tools-extra/clang-doc/CMakeLists.txt
+++ b/clang-tools-extra/clang-doc/CMakeLists.txt
@@ -18,7 +18,6 @@ add_clang_library(clangDoc STATIC
   Serialize.cpp
   YAMLGenerator.cpp
   JSONGenerator.cpp
-  MDMustacheGenerator.cpp
 
   DEPENDS
   omp_gen
diff --git a/clang-tools-extra/clang-doc/Generators.cpp 
b/clang-tools-extra/clang-doc/Generators.cpp
index 5ff1a5c0a4eb2..c0933f06c1789 100644
--- a/clang-tools-extra/clang-doc/Generators.cpp
+++ b/clang-tools-extra/clang-doc/Generators.cpp
@@ -252,7 +252,5 @@ void Generator::addInfoToIndex(Index &Idx, const doc::Info 
*Info) {
 [[maybe_unused]] static int MDGeneratorAnchorDest = MDGeneratorAnchorSource;
 [[maybe_unused]] static int HTMLGeneratorAnchorDest = 
HTMLGeneratorAnchorSource;
 [[maybe_unused]] static int JSONGeneratorAnchorDest = 
JSONGeneratorAnchorSource;
-[[maybe_unused]] static int MDMustacheGeneratorAnchorDest =
-    MDMustacheGeneratorAnchorSource;
 } // namespace doc
 } // namespace clang
diff --git a/clang-tools-extra/clang-doc/Generators.h 
b/clang-tools-extra/clang-doc/Generators.h
index fc7fdb515ee4f..7b2d5c7f97f5e 100644
--- a/clang-tools-extra/clang-doc/Generators.h
+++ b/clang-tools-extra/clang-doc/Generators.h
@@ -144,7 +144,6 @@ extern volatile int YAMLGeneratorAnchorSource;
 extern volatile int MDGeneratorAnchorSource;
 extern volatile int HTMLGeneratorAnchorSource;
 extern volatile int JSONGeneratorAnchorSource;
-extern volatile int MDMustacheGeneratorAnchorSource;
 
 } // namespace doc
 } // namespace clang
diff --git a/clang-tools-extra/clang-doc/JSONGenerator.cpp 
b/clang-tools-extra/clang-doc/JSONGenerator.cpp
index 1a15618b14bf4..58995c249bd21 100644
--- a/clang-tools-extra/clang-doc/JSONGenerator.cpp
+++ b/clang-tools-extra/clang-doc/JSONGenerator.cpp
@@ -1023,7 +1023,7 @@ Error JSONGenerator::generateDocumentation(StringRef 
RootDir,
     Info->DocumentationFileName = internString(FileName);
   }
 
-  if (CDCtx.Format == OutputFormatTy::md_mustache) {
+  if (CDCtx.Format == OutputFormatTy::md) {
     Markdown = true;
     if (auto Err = serializeAllFiles(CDCtx, RootDir))
       return Err;
diff --git a/clang-tools-extra/clang-doc/MDGenerator.cpp 
b/clang-tools-extra/clang-doc/MDGenerator.cpp
index 2129880c890f4..f496f1fc44f9d 100644
--- a/clang-tools-extra/clang-doc/MDGenerator.cpp
+++ b/clang-tools-extra/clang-doc/MDGenerator.cpp
@@ -1,615 +1,119 @@
-//===-- MDGenerator.cpp - Markdown Generator --------------------*- C++ 
-*-===//
+//===----------------------------------------------------------------------===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM 
Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
 //
 
//===----------------------------------------------------------------------===//
+///
+/// \file
+/// This file contains the implementation of the MDGenerator, which
+/// generates documentation in Markdown format using Mustache templates. It
+/// defines how the structured data in Info objects is mapped to template
+/// tags to produce readable markdown documents.
+///
+//===----------------------------------------------------------------------===//
 
 #include "Generators.h"
-#include "Representation.h"
-#include "llvm/ADT/ArrayRef.h"
-#include "llvm/ADT/StringRef.h"
-#include "llvm/Support/FileSystem.h"
-#include "llvm/Support/FormatVariadic.h"
-#include "llvm/Support/Path.h"
-#include "llvm/Support/raw_ostream.h"
-#include <string>
 
 using namespace llvm;
 using namespace clang::doc;
 
-// Markdown generation
-
-static std::string genItalic(const Twine &Text) {
-  return "*" + Text.str() + "*";
-}
-
-static std::string genEmphasis(const Twine &Text) {
-  return "**" + Text.str() + "**";
-}
-
-static std::string genReferenceList(llvm::ArrayRef<Reference> Refs) {
-  std::string Buffer;
-  llvm::raw_string_ostream Stream(Buffer);
-  for (const auto &R : Refs) {
-    if (&R != Refs.begin())
-      Stream << ", ";
-    Stream << R.Name;
-  }
-  return Stream.str();
-}
-
-static void writeLine(const Twine &Text, raw_ostream &OS) {
-  OS << Text << "\n\n";
-}
-
-static void writeNewLine(raw_ostream &OS) { OS << "\n\n"; }
-
-static void writeHeader(const Twine &Text, unsigned int Num, raw_ostream &OS) {
-  OS << std::string(Num, '#') + " " + Text << "\n\n";
-}
+static std::unique_ptr<MustacheTemplateFile> RecordTemplate = nullptr;
 
-static void writeSourceFileRef(const ClangDocContext &CDCtx, const Location &L,
-                               raw_ostream &OS) {
+static std::unique_ptr<MustacheTemplateFile> NamespaceTemplate = nullptr;
 
-  if (!CDCtx.RepositoryUrl) {
-    OS << "*Defined at " << L.Filename << "#"
-       << std::to_string(L.StartLineNumber) << "*";
-  } else {
+static std::unique_ptr<MustacheTemplateFile> AllFilesTemplate = nullptr;
 
-    OS << formatv("*Defined at [#{0}{1}{2}](#{0}{1}{3})*",
-                  CDCtx.RepositoryLinePrefix.value_or(""), L.StartLineNumber,
-                  L.Filename, *CDCtx.RepositoryUrl);
-  }
-  OS << "\n\n";
-}
-
-/// Writer for writing comments to a table cell in MD.
-///
-/// The writer traverses the comments recursively and outputs the
-/// comments into a stream.
-/// The formatter inserts single/double line breaks to retain the comment
-/// structure.
-///
-/// Usage :
-/// Initialize an object with a llvm::raw_ostream to output into.
-/// Call the write(C) function with an array of Comments 'C'.
-class TableCommentWriter {
-public:
-  explicit TableCommentWriter(llvm::raw_ostream &OS) : OS(OS) {}
-
-  void write(const DocList<CommentInfo> &Comments) {
-    for (const auto &C : Comments)
-      writeTableSafeComment(C);
-
-    if (!Started)
-      OS << "--";
-  }
-
-private:
-  /// This function inserts breaks into the stream.
-  ///
-  /// We add a double break in between paragraphs.
-  /// Inside a paragraph, a single break between lines is maintained.
-  void insertSeparator() {
-    if (!Started)
-      return;
-    if (NeedsParagraphBreak) {
-      OS << "<br><br>";
-      NeedsParagraphBreak = false;
-    } else {
-      OS << "<br>";
-    }
-  }
-
-  /// This function processes every comment and its children recursively.
-  void writeTableSafeComment(const CommentInfo &I) {
-    switch (I.Kind) {
-    case CommentKind::CK_FullComment:
-      for (const auto &Child : I.Children)
-        writeTableSafeComment(Child);
-      break;
-
-    case CommentKind::CK_ParagraphComment:
-      for (const auto &Child : I.Children)
-        writeTableSafeComment(Child);
-      // Next content after a paragraph needs a break
-      NeedsParagraphBreak = true;
-      break;
-
-    case CommentKind::CK_TextComment:
-      if (!I.Text.empty()) {
-        insertSeparator();
-        OS << I.Text;
-        Started = true;
-      }
-      break;
-
-    // Handle other comment types (BlockCommand, InlineCommand, etc.)
-    default:
-      for (const auto &Child : I.Children)
-        writeTableSafeComment(Child);
-      break;
-    }
-  }
-
-  llvm::raw_ostream &OS;
-  bool Started = false;
-  bool NeedsParagraphBreak = false;
-};
-
-static void maybeWriteSourceFileRef(llvm::raw_ostream &OS,
-                                    const ClangDocContext &CDCtx,
-                                    const std::optional<Location> &DefLoc) {
-  if (DefLoc)
-    writeSourceFileRef(CDCtx, *DefLoc, OS);
-}
-
-static void writeDescription(const CommentInfo &I, raw_ostream &OS) {
-  switch (I.Kind) {
-  case CommentKind::CK_FullComment:
-    for (const auto &Child : I.Children)
-      writeDescription(Child, OS);
-    break;
-
-  case CommentKind::CK_ParagraphComment:
-    for (const auto &Child : I.Children)
-      writeDescription(Child, OS);
-    writeNewLine(OS);
-    break;
-
-  case CommentKind::CK_BlockCommandComment:
-    OS << genEmphasis(I.Name) << " ";
-    for (const auto &Child : I.Children)
-      writeDescription(Child, OS);
-    break;
-
-  case CommentKind::CK_InlineCommandComment:
-    OS << genEmphasis(I.Name) << " " << I.Text;
-    break;
-
-  case CommentKind::CK_ParamCommandComment:
-  case CommentKind::CK_TParamCommandComment: {
-    std::string Direction = I.Explicit ? (" " + I.Direction).str() : "";
-    OS << genEmphasis(I.ParamName) << I.Text << Direction << " ";
-    for (const auto &Child : I.Children)
-      writeDescription(Child, OS);
-    break;
-  }
-
-  case CommentKind::CK_VerbatimBlockComment:
-    for (const auto &Child : I.Children)
-      writeDescription(Child, OS);
-    break;
-
-  case CommentKind::CK_VerbatimBlockLineComment:
-  case CommentKind::CK_VerbatimLineComment:
-    OS << I.Text;
-    writeNewLine(OS);
-    break;
-
-  case CommentKind::CK_HTMLStartTagComment: {
-    if (I.AttrKeys.size() != I.AttrValues.size())
-      return;
-    std::string Buffer;
-    llvm::raw_string_ostream Attrs(Buffer);
-    for (unsigned Idx = 0; Idx < I.AttrKeys.size(); ++Idx)
-      Attrs << " \"" << I.AttrKeys[Idx] << "=" << I.AttrValues[Idx] << "\"";
-
-    std::string CloseTag = I.SelfClosing ? "/>" : ">";
-    writeLine("<" + I.Name + Attrs.str() + CloseTag, OS);
-    break;
-  }
-
-  case CommentKind::CK_HTMLEndTagComment:
-    writeLine("</" + I.Name + ">", OS);
-    break;
-
-  case CommentKind::CK_TextComment:
-    OS << I.Text;
-    break;
-
-  case CommentKind::CK_Unknown:
-    OS << "Unknown comment kind: " << static_cast<int>(I.Kind) << ".\n\n";
-    break;
-  }
-}
-
-static void writeNameLink(const StringRef &CurrentPath, const Reference &R,
-                          llvm::raw_ostream &OS) {
-  llvm::SmallString<64> Path = R.getRelativeFilePath(CurrentPath);
-  // Paths in Markdown use POSIX separators.
-  llvm::sys::path::native(Path, llvm::sys::path::Style::posix);
-  llvm::sys::path::append(Path, llvm::sys::path::Style::posix,
-                          R.getFileBaseName() + ".md");
-  OS << "[" << R.Name << "](" << Path << ")";
-}
-
-static void genMarkdown(const ClangDocContext &CDCtx, const EnumInfo &I,
-                        llvm::raw_ostream &OS) {
-  OS << "| enum ";
-  if (I.Scoped)
-    OS << "class ";
-  OS << (I.Name.empty() ? "(unnamed)" : StringRef(I.Name)) << " ";
-  if (I.BaseType && !I.BaseType->Type.QualName.empty()) {
-    OS << ": " << I.BaseType->Type.QualName << " ";
-  }
-  OS << "|\n\n";
-
-  OS << "| Name | Value |";
-  if (!I.Members.empty()) {
-    bool HasComments = false;
-    for (const auto &Member : I.Members) {
-      if (!Member.Description.empty()) {
-        HasComments = true;
-        OS << " Comments |";
-        break;
-      }
-    }
-    OS << "\n|---|---|";
-    if (HasComments)
-      OS << "---|";
-    OS << "\n";
-    for (const auto &N : I.Members) {
-      OS << "| " << N.Name << " ";
-      if (!N.Value.empty())
-        OS << "| " << N.Value << " ";
-      if (HasComments) {
-        OS << "| ";
-        TableCommentWriter CommentWriter(OS);
-        CommentWriter.write(N.Description);
-        OS << " ";
-      }
-      OS << "|\n";
-    }
-  }
-  OS << "\n";
-
-  maybeWriteSourceFileRef(OS, CDCtx, I.DefLoc);
-
-  for (const auto &C : I.Description)
-    writeDescription(C, OS);
-}
-
-static void genMarkdown(const ClangDocContext &CDCtx, const FunctionInfo &I,
-                        llvm::raw_ostream &OS) {
-  std::string Buffer;
-  llvm::raw_string_ostream Stream(Buffer);
-  bool First = true;
-  for (const auto &N : I.Params) {
-    if (!First)
-      Stream << ", ";
-    Stream << N.Type.QualName + " " + N.Name;
-    First = false;
-  }
-  writeHeader(I.Name, 3, OS);
-  StringRef Access = getAccessSpelling(I.Access);
-  writeLine(genItalic(Twine(Access) + (!Access.empty() ? " " : "") +
-                      (I.IsStatic ? "static " : "") +
-                      I.ReturnType.Type.QualName.str() + " " + I.Name.str() +
-                      "(" + Twine(Stream.str()) + ")"),
-            OS);
-
-  maybeWriteSourceFileRef(OS, CDCtx, I.DefLoc);
-
-  for (const auto &C : I.Description)
-    writeDescription(C, OS);
-}
-
-static void genMarkdown(const ClangDocContext &CDCtx, const NamespaceInfo &I,
-                        llvm::raw_ostream &OS) {
-  if (I.Name == "")
-    writeHeader("Global Namespace", 1, OS);
-  else
-    writeHeader("namespace " + I.Name, 1, OS);
-  writeNewLine(OS);
-
-  if (!I.Description.empty()) {
-    for (const auto &C : I.Description)
-      writeDescription(C, OS);
-    writeNewLine(OS);
-  }
-
-  llvm::SmallString<64> BasePath = I.getRelativeFilePath("");
-
-  if (!I.Children.Namespaces.empty()) {
-    writeHeader("Namespaces", 2, OS);
-    for (const auto &R : I.Children.Namespaces) {
-      OS << "* ";
-      writeNameLink(BasePath, R, OS);
-      OS << "\n";
-    }
-    writeNewLine(OS);
-  }
-
-  if (!I.Children.Records.empty()) {
-    writeHeader("Records", 2, OS);
-    for (const auto &R : I.Children.Records) {
-      OS << "* ";
-      writeNameLink(BasePath, R, OS);
-      OS << "\n";
-    }
-    writeNewLine(OS);
-  }
-
-  if (!I.Children.Functions.empty()) {
-    writeHeader("Functions", 2, OS);
-    for (const auto &F : I.Children.Functions)
-      genMarkdown(CDCtx, F, OS);
-    writeNewLine(OS);
-  }
-  if (!I.Children.Enums.empty()) {
-    writeHeader("Enums", 2, OS);
-    for (const auto &E : I.Children.Enums)
-      genMarkdown(CDCtx, E, OS);
-    writeNewLine(OS);
-  }
-}
-
-static void genMarkdown(const ClangDocContext &CDCtx, const RecordInfo &I,
-                        llvm::raw_ostream &OS) {
-  writeHeader(getTagType(I.TagType) + " " + I.Name, 1, OS);
-
-  maybeWriteSourceFileRef(OS, CDCtx, I.DefLoc);
-
-  if (!I.Description.empty()) {
-    for (const auto &C : I.Description)
-      writeDescription(C, OS);
-    writeNewLine(OS);
-  }
-
-  std::string Parents = genReferenceList(I.Parents);
-  std::string VParents = genReferenceList(I.VirtualParents);
-  if (!Parents.empty() || !VParents.empty()) {
-    if (Parents.empty())
-      writeLine("Inherits from " + VParents, OS);
-    else if (VParents.empty())
-      writeLine("Inherits from " + Parents, OS);
-    else
-      writeLine("Inherits from " + Parents + ", " + VParents, OS);
-    writeNewLine(OS);
-  }
-
-  if (!I.Members.empty()) {
-    writeHeader("Members", 2, OS);
-    for (const auto &Member : I.Members) {
-      StringRef Access = getAccessSpelling(Member.Access);
-      writeLine(Twine(Access) + (Access.empty() ? "" : " ") +
-                    (Member.IsStatic ? "static " : "") +
-                    Member.Type.Name.str() + " " + Member.Name.str(),
-                OS);
-    }
-    writeNewLine(OS);
-  }
-
-  if (!I.Children.Records.empty()) {
-    writeHeader("Records", 2, OS);
-    for (const auto &R : I.Children.Records)
-      writeLine(R->Name, OS);
-    writeNewLine(OS);
-  }
-  if (!I.Children.Functions.empty()) {
-    writeHeader("Functions", 2, OS);
-    for (const auto &F : I.Children.Functions)
-      genMarkdown(CDCtx, F, OS);
-    writeNewLine(OS);
-  }
-  if (!I.Children.Enums.empty()) {
-    writeHeader("Enums", 2, OS);
-    for (const auto &E : I.Children.Enums)
-      genMarkdown(CDCtx, E, OS);
-    writeNewLine(OS);
-  }
-}
-
-static void genMarkdown(const ClangDocContext &CDCtx, const TypedefInfo &I,
-                        llvm::raw_ostream &OS) {
-  // TODO support typedefs in markdown.
-}
-
-static void serializeReference(llvm::raw_fd_ostream &OS, const Index &I,
-                               int Level) {
-  // Write out the heading level starting at ##
-  OS << "##" << std::string(Level, '#') << " ";
-  writeNameLink("", I, OS);
-  OS << "\n";
-}
-
-static llvm::Error serializeIndex(ClangDocContext &CDCtx) {
-  std::error_code FileErr;
-  llvm::SmallString<128> FilePath;
-  llvm::sys::path::native(CDCtx.OutDirectory, FilePath);
-  llvm::sys::path::append(FilePath, "all_files.md");
-  llvm::raw_fd_ostream OS(FilePath, FileErr, llvm::sys::fs::OF_Text);
-  if (FileErr)
-    return llvm::createStringError(llvm::inconvertibleErrorCode(),
-                                   "error creating index file: " +
-                                       FileErr.message());
-
-  CDCtx.Idx.sort();
-  OS << "# All Files";
-  if (!CDCtx.ProjectName.empty())
-    OS << " for " << CDCtx.ProjectName;
-  OS << "\n\n";
-
-  std::vector<const Index *> Children = CDCtx.Idx.getSortedChildren();
-  for (const auto *C : Children)
-    serializeReference(OS, *C, 0);
-
-  return llvm::Error::success();
-}
-
-static llvm::Error genIndex(ClangDocContext &CDCtx) {
-  std::error_code FileErr;
-  llvm::SmallString<128> FilePath;
-  llvm::sys::path::native(CDCtx.OutDirectory, FilePath);
-  llvm::sys::path::append(FilePath, "index.md");
-  llvm::raw_fd_ostream OS(FilePath, FileErr, llvm::sys::fs::OF_Text);
-  if (FileErr)
-    return llvm::createStringError(llvm::inconvertibleErrorCode(),
-                                   "error creating index file: " +
-                                       FileErr.message());
-  CDCtx.Idx.sort();
-  OS << "# " << CDCtx.ProjectName << " C/C++ Reference\n\n";
-  std::vector<const Index *> Children = CDCtx.Idx.getSortedChildren();
-  for (const auto *C : Children) {
-    if (!C->Children.empty()) {
-      const char *Type;
-      switch (C->RefType) {
-      case InfoType::IT_namespace:
-        Type = "Namespace";
-        break;
-      case InfoType::IT_record:
-        Type = "Type";
-        break;
-      case InfoType::IT_enum:
-        Type = "Enum";
-        break;
-      case InfoType::IT_function:
-        Type = "Function";
-        break;
-      case InfoType::IT_typedef:
-        Type = "Typedef";
-        break;
-      case InfoType::IT_concept:
-        Type = "Concept";
-        break;
-      case InfoType::IT_variable:
-        Type = "Variable";
-        break;
-      case InfoType::IT_friend:
-        Type = "Friend";
-        break;
-      case InfoType::IT_default:
-        Type = "Other";
-      }
-      OS << "* " << Type << ": [" << C->Name << "](";
-      if (!C->Path.empty())
-        OS << C->Path << "/";
-      OS << C->Name << ")\n";
-    }
-  }
-  return llvm::Error::success();
-}
+static std::unique_ptr<MustacheTemplateFile> IndexTemplate = nullptr;
 
 namespace {
-/// Generator for Markdown documentation.
-class MDGenerator : public Generator {
-public:
-  static StringRef Format;
-
-  llvm::Error generateDocumentation(StringRef RootDir,
-                                    llvm::StringMap<Info *> Infos,
-                                    const ClangDocContext &CDCtx,
-                                    std::string DirName) override;
-  llvm::Error createResources(ClangDocContext &CDCtx) override;
-  llvm::Error generateDocForInfo(Info *I, llvm::raw_ostream &OS,
-                                 const ClangDocContext &CDCtx) override;
+struct MDGenerator : public MustacheGenerator {
+  static const char *Format;
+  Error generateDocumentation(StringRef RootDir, StringMap<Info *> Infos,
+                              const ClangDocContext &CDCtx,
+                              std::string DirName) override;
+  Error setupTemplateFiles(const ClangDocContext &CDCtx) override;
+  Error generateDocForJSON(json::Value &JSON, raw_fd_ostream &OS,
+                           const ClangDocContext &CDCtx,
+                           StringRef ObjectTypeStr,
+                           StringRef RelativeRootPath) override;
+  // This generator doesn't need this function, but it inherits from the
+  // original generator interface.
+  Error generateDocForInfo(Info *I, llvm::raw_ostream &OS,
+                           const ClangDocContext &CDCtx) override;
 };
 } // namespace
 
-StringRef MDGenerator::Format = "md";
-
-llvm::Error MDGenerator::generateDocumentation(StringRef RootDir,
-                                               llvm::StringMap<Info *> Infos,
-                                               const ClangDocContext &CDCtx,
-                                               std::string DirName) {
-  // Track which directories we already tried to create.
-  llvm::StringSet<> CreatedDirs;
-
-  // Collect all output by file name and create the necessary directories.
-  llvm::StringMap<std::vector<Info *>> FileToInfos;
-  for (const auto &Group : Infos) {
-    Info *Info = Group.getValue();
-
-    llvm::SmallString<128> Path;
-    llvm::sys::path::native(RootDir, Path);
-    llvm::sys::path::append(Path, Info->getRelativeFilePath(""));
-    if (!CreatedDirs.contains(Path)) {
-      if (std::error_code Err = llvm::sys::fs::create_directories(Path);
-          Err != std::error_code()) {
-        return llvm::createStringError(Err, "Failed to create directory '%s'.",
-                                       Path.c_str());
-      }
-      CreatedDirs.insert(Path);
-    }
-
-    llvm::sys::path::append(Path, Info->getFileBaseName() + ".md");
-    FileToInfos[Path].push_back(Info);
-  }
+Error MDGenerator::setupTemplateFiles(const ClangDocContext &CDCtx) {
+  std::string ClassFilePath = CDCtx.MustacheTemplates.lookup("class-template");
+  std::string NamespaceFilePath =
+      CDCtx.MustacheTemplates.lookup("namespace-template");
+  std::string AllFilesPath = CDCtx.MustacheTemplates.lookup("all-files");
+  std::string IndexFilePath = CDCtx.MustacheTemplates.lookup("index");
+  std::string CommentsFilePath = CDCtx.MustacheTemplates.lookup("comments");
+  std::vector<std::pair<StringRef, StringRef>> Partials = {
+      {"Comments", CommentsFilePath}};
+
+  if (Error Err = setupTemplate(RecordTemplate, ClassFilePath, Partials))
+    return Err;
+  if (Error Err = setupTemplate(NamespaceTemplate, NamespaceFilePath, 
Partials))
+    return Err;
+  if (Error Err = setupTemplate(AllFilesTemplate, AllFilesPath, Partials))
+    return Err;
+  if (Error Err = setupTemplate(IndexTemplate, IndexFilePath, Partials))
+    return Err;
 
-  for (const auto &Group : FileToInfos) {
-    std::error_code FileErr;
-    llvm::raw_fd_ostream InfoOS(Group.getKey(), FileErr,
-                                llvm::sys::fs::OF_Text);
-    if (FileErr) {
-      return llvm::createStringError(FileErr, "Error opening file '%s'",
-                                     Group.getKey().str().c_str());
-    }
+  // Override the default HTML Mustache escape characters. We don't need to
+  // override `<` here.
+  static const DenseMap<char, std::string> EscapeChars;
+  RecordTemplate->setEscapeCharacters(EscapeChars);
+  NamespaceTemplate->setEscapeCharacters(EscapeChars);
+  AllFilesTemplate->setEscapeCharacters(EscapeChars);
+  IndexTemplate->setEscapeCharacters(EscapeChars);
 
-    for (const auto &Info : Group.getValue()) {
-      if (llvm::Error Err = generateDocForInfo(Info, InfoOS, CDCtx)) {
-        return Err;
-      }
-    }
-  }
+  return Error::success();
+}
 
-  return llvm::Error::success();
+Error MDGenerator::generateDocumentation(
+    StringRef RootDir, StringMap<Info *> Infos,
+    const clang::doc::ClangDocContext &CDCtx, std::string Dirname) {
+  return MustacheGenerator::generateDocumentation(RootDir, std::move(Infos),
+                                                  CDCtx, "md");
 }
 
-llvm::Error MDGenerator::generateDocForInfo(Info *I, llvm::raw_ostream &OS,
-                                            const ClangDocContext &CDCtx) {
-  switch (I->IT) {
-  case InfoType::IT_namespace:
-    genMarkdown(CDCtx, *cast<NamespaceInfo>(I), OS);
-    break;
-  case InfoType::IT_record:
-    genMarkdown(CDCtx, *cast<RecordInfo>(I), OS);
-    break;
-  case InfoType::IT_enum:
-    genMarkdown(CDCtx, *cast<EnumInfo>(I), OS);
-    break;
-  case InfoType::IT_function:
-    genMarkdown(CDCtx, *cast<FunctionInfo>(I), OS);
-    break;
-  case InfoType::IT_typedef:
-    genMarkdown(CDCtx, *cast<TypedefInfo>(I), OS);
-    break;
-  case InfoType::IT_concept:
-  case InfoType::IT_variable:
-  case InfoType::IT_friend:
-    break;
-  case InfoType::IT_default:
-    return createStringError(llvm::inconvertibleErrorCode(),
-                             "unexpected InfoType");
+Error MDGenerator::generateDocForJSON(json::Value &JSON, raw_fd_ostream &OS,
+                                      const ClangDocContext &CDCtx,
+                                      StringRef ObjTypeStr,
+                                      StringRef RelativeRootPath) {
+  if (ObjTypeStr == "record") {
+    assert(RecordTemplate && "RecordTemplate is nullptr.");
+    RecordTemplate->render(JSON, OS);
+  } else if (ObjTypeStr == "namespace") {
+    assert(NamespaceTemplate && "NamespaceTemplate is nullptr.");
+    NamespaceTemplate->render(JSON, OS);
+  } else if (ObjTypeStr == "all_files") {
+    assert(AllFilesTemplate && "AllFilesTemplate is nullptr.");
+    AllFilesTemplate->render(JSON, OS);
+  } else if (ObjTypeStr == "index") {
+    assert(IndexTemplate && "IndexTemplate is nullptr");
+    IndexTemplate->render(JSON, OS);
   }
-  return llvm::Error::success();
+  return Error::success();
 }
 
-llvm::Error MDGenerator::createResources(ClangDocContext &CDCtx) {
-  // Write an all_files.md
-  auto Err = serializeIndex(CDCtx);
-  if (Err)
-    return Err;
-
-  // Generate the index page.
-  Err = genIndex(CDCtx);
-  if (Err)
-    return Err;
-
-  return llvm::Error::success();
+Error MDGenerator::generateDocForInfo(Info *I, raw_ostream &OS,
+                                      const ClangDocContext &CDCtx) {
+  return Error::success();
 }
 
+const char *MDGenerator::Format = "md";
+
 static GeneratorRegistry::Add<MDGenerator> MD(MDGenerator::Format,
-                                              "Generator for MD output.");
+                                              "Generator for Markdown 
output.");
 
 namespace clang {
 namespace doc {
-
-// This anchor is used to force the linker to link in the generated object
-// file and thus register the generator.
 volatile int MDGeneratorAnchorSource = 0;
-
 } // namespace doc
 } // namespace clang
diff --git a/clang-tools-extra/clang-doc/MDMustacheGenerator.cpp 
b/clang-tools-extra/clang-doc/MDMustacheGenerator.cpp
deleted file mode 100644
index d2fd065a9453f..0000000000000
--- a/clang-tools-extra/clang-doc/MDMustacheGenerator.cpp
+++ /dev/null
@@ -1,121 +0,0 @@
-//===----------------------------------------------------------------------===//
-//
-// Part of the LLVM Project, under the Apache License v2.0 with LLVM 
Exceptions.
-// See https://llvm.org/LICENSE.txt for license information.
-// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
-//
-//===----------------------------------------------------------------------===//
-///
-/// \file
-/// This file contains the implementation of the MDMustacheGenerator, which
-/// generates documentation in Markdown format using Mustache templates. It
-/// defines how the structured data in Info objects is mapped to template
-/// tags to produce readable markdown documents.
-///
-//===----------------------------------------------------------------------===//
-
-#include "Generators.h"
-
-using namespace llvm;
-using namespace clang::doc;
-
-static std::unique_ptr<MustacheTemplateFile> RecordTemplate = nullptr;
-
-static std::unique_ptr<MustacheTemplateFile> NamespaceTemplate = nullptr;
-
-static std::unique_ptr<MustacheTemplateFile> AllFilesTemplate = nullptr;
-
-static std::unique_ptr<MustacheTemplateFile> IndexTemplate = nullptr;
-
-namespace {
-struct MDMustacheGenerator : public MustacheGenerator {
-  static const char *Format;
-  Error generateDocumentation(StringRef RootDir, StringMap<Info *> Infos,
-                              const ClangDocContext &CDCtx,
-                              std::string DirName) override;
-  Error setupTemplateFiles(const ClangDocContext &CDCtx) override;
-  Error generateDocForJSON(json::Value &JSON, raw_fd_ostream &OS,
-                           const ClangDocContext &CDCtx,
-                           StringRef ObjectTypeStr,
-                           StringRef RelativeRootPath) override;
-  // This generator doesn't need this function, but it inherits from the
-  // original generator interface.
-  Error generateDocForInfo(Info *I, llvm::raw_ostream &OS,
-                           const ClangDocContext &CDCtx) override;
-};
-} // namespace
-
-Error MDMustacheGenerator::setupTemplateFiles(const ClangDocContext &CDCtx) {
-  std::string ClassFilePath = CDCtx.MustacheTemplates.lookup("class-template");
-  std::string NamespaceFilePath =
-      CDCtx.MustacheTemplates.lookup("namespace-template");
-  std::string AllFilesPath = CDCtx.MustacheTemplates.lookup("all-files");
-  std::string IndexFilePath = CDCtx.MustacheTemplates.lookup("index");
-  std::string CommentsFilePath = CDCtx.MustacheTemplates.lookup("comments");
-  std::vector<std::pair<StringRef, StringRef>> Partials = {
-      {"Comments", CommentsFilePath}};
-
-  if (Error Err = setupTemplate(RecordTemplate, ClassFilePath, Partials))
-    return Err;
-  if (Error Err = setupTemplate(NamespaceTemplate, NamespaceFilePath, 
Partials))
-    return Err;
-  if (Error Err = setupTemplate(AllFilesTemplate, AllFilesPath, Partials))
-    return Err;
-  if (Error Err = setupTemplate(IndexTemplate, IndexFilePath, Partials))
-    return Err;
-
-  // Override the default HTML Mustache escape characters. We don't need to
-  // override `<` here.
-  static const DenseMap<char, std::string> EscapeChars;
-  RecordTemplate->setEscapeCharacters(EscapeChars);
-  NamespaceTemplate->setEscapeCharacters(EscapeChars);
-  AllFilesTemplate->setEscapeCharacters(EscapeChars);
-  IndexTemplate->setEscapeCharacters(EscapeChars);
-
-  return Error::success();
-}
-
-Error MDMustacheGenerator::generateDocumentation(
-    StringRef RootDir, StringMap<Info *> Infos,
-    const clang::doc::ClangDocContext &CDCtx, std::string Dirname) {
-  return MustacheGenerator::generateDocumentation(RootDir, std::move(Infos),
-                                                  CDCtx, "md");
-}
-
-Error MDMustacheGenerator::generateDocForJSON(json::Value &JSON,
-                                              raw_fd_ostream &OS,
-                                              const ClangDocContext &CDCtx,
-                                              StringRef ObjTypeStr,
-                                              StringRef RelativeRootPath) {
-  if (ObjTypeStr == "record") {
-    assert(RecordTemplate && "RecordTemplate is nullptr.");
-    RecordTemplate->render(JSON, OS);
-  } else if (ObjTypeStr == "namespace") {
-    assert(NamespaceTemplate && "NamespaceTemplate is nullptr.");
-    NamespaceTemplate->render(JSON, OS);
-  } else if (ObjTypeStr == "all_files") {
-    assert(AllFilesTemplate && "AllFilesTemplate is nullptr.");
-    AllFilesTemplate->render(JSON, OS);
-  } else if (ObjTypeStr == "index") {
-    assert(IndexTemplate && "IndexTemplate is nullptr");
-    IndexTemplate->render(JSON, OS);
-  }
-  return Error::success();
-}
-
-Error MDMustacheGenerator::generateDocForInfo(Info *I, raw_ostream &OS,
-                                              const ClangDocContext &CDCtx) {
-  return Error::success();
-}
-
-const char *MDMustacheGenerator::Format = "md_mustache";
-
-static GeneratorRegistry::Add<MDMustacheGenerator>
-    MDMustache(MDMustacheGenerator::Format,
-               "Generator for mustache Markdown output.");
-
-namespace clang {
-namespace doc {
-volatile int MDMustacheGeneratorAnchorSource = 0;
-} // namespace doc
-} // namespace clang
diff --git a/clang-tools-extra/clang-doc/Representation.h 
b/clang-tools-extra/clang-doc/Representation.h
index e3ad7fa3f375d..3a7a6deb3d0a3 100644
--- a/clang-tools-extra/clang-doc/Representation.h
+++ b/clang-tools-extra/clang-doc/Representation.h
@@ -225,7 +225,7 @@ enum class CommentKind {
   CK_Unknown
 };
 
-enum OutputFormatTy { md, yaml, html, json, md_mustache };
+enum OutputFormatTy { md, yaml, html, json };
 
 CommentKind stringToCommentKind(llvm::StringRef KindStr);
 llvm::StringRef commentKindToString(CommentKind Kind);
diff --git a/clang-tools-extra/clang-doc/tool/ClangDocMain.cpp 
b/clang-tools-extra/clang-doc/tool/ClangDocMain.cpp
index 38002f5111a9f..c3e61e26612aa 100644
--- a/clang-tools-extra/clang-doc/tool/ClangDocMain.cpp
+++ b/clang-tools-extra/clang-doc/tool/ClangDocMain.cpp
@@ -117,19 +117,18 @@ static llvm::cl::opt<bool>
     Pretty("pretty-json", llvm::cl::desc("Serialize JSON with whitespace."),
            llvm::cl::cat(ClangDocCategory));
 
-static llvm::cl::opt<OutputFormatTy> FormatEnum(
-    "format", llvm::cl::desc("Format for outputted docs."),
-    llvm::cl::values(clEnumValN(OutputFormatTy::yaml, "yaml",
-                                "Documentation in YAML format."),
-                     clEnumValN(OutputFormatTy::md, "md",
-                                "Documentation in MD format."),
-                     clEnumValN(OutputFormatTy::html, "html",
-                                "Documentation in HTML format."),
-                     clEnumValN(OutputFormatTy::json, "json",
-                                "Documentation in JSON format"),
-                     clEnumValN(OutputFormatTy::md_mustache, "md_mustache",
-                                "Documentation in MD format.")),
-    llvm::cl::init(OutputFormatTy::yaml), llvm::cl::cat(ClangDocCategory));
+static llvm::cl::opt<OutputFormatTy>
+    FormatEnum("format", llvm::cl::desc("Format for outputted docs."),
+               llvm::cl::values(clEnumValN(OutputFormatTy::yaml, "yaml",
+                                           "Documentation in YAML format."),
+                                clEnumValN(OutputFormatTy::md, "md",
+                                           "Documentation in MD format."),
+                                clEnumValN(OutputFormatTy::html, "html",
+                                           "Documentation in HTML format."),
+                                clEnumValN(OutputFormatTy::json, "json",
+                                           "Documentation in JSON format")),
+               llvm::cl::init(OutputFormatTy::yaml),
+               llvm::cl::cat(ClangDocCategory));
 
 static llvm::ExitOnError ExitOnErr;
 
@@ -143,8 +142,6 @@ static llvm::StringRef getFormatString() {
     return "html";
   case OutputFormatTy::json:
     return "json";
-  case OutputFormatTy::md_mustache:
-    return "md_mustache";
   }
   llvm_unreachable("Unknown OutputFormatTy");
 }
@@ -313,7 +310,7 @@ Example usage for a project using a compile commands 
database:
 
     if (Format == "html")
       ExitOnErr(getHtmlFiles(argv[0], CDCtx));
-    else if (Format == "md_mustache")
+    else if (Format == "md")
       ExitOnErr(getMdFiles(argv[0], CDCtx));
 
     llvm::timeTraceProfilerBegin("Executor Launch", "total runtime");
diff --git a/clang-tools-extra/test/clang-doc/basic-project.mustache.test 
b/clang-tools-extra/test/clang-doc/basic-project.mustache.test
index 543a6111bea77..d97f526f06efb 100644
--- a/clang-tools-extra/test/clang-doc/basic-project.mustache.test
+++ b/clang-tools-extra/test/clang-doc/basic-project.mustache.test
@@ -7,7 +7,7 @@
 // RUN: FileCheck %s 
-input-file=%t/docs/html/GlobalNamespace/_ZTV9Rectangle.html 
-check-prefix=HTML-RECTANGLE
 // RUN: FileCheck %s -input-file=%t/docs/html/GlobalNamespace/_ZTV6Circle.html 
-check-prefix=HTML-CIRCLE
 
-// RUN: clang-doc --format=md_mustache --output=%t/docs --executor=all-TUs 
%t/build/compile_commands.json
+// RUN: clang-doc --format=md --output=%t/docs --executor=all-TUs 
%t/build/compile_commands.json
 // RUN: FileCheck %s -input-file=%t/docs/md/all_files.md 
-check-prefixes=MD-ALL-FILES
 // RUN: FileCheck %s -input-file=%t/docs/md/index.md -check-prefixes=MD-INDEX
 // RUN: FileCheck %s -input-file=%t/docs/md/GlobalNamespace/_ZTV5Shape.md 
-check-prefixes=MD-SHAPE
diff --git a/clang-tools-extra/test/clang-doc/basic-project.test 
b/clang-tools-extra/test/clang-doc/basic-project.test
index bd895f3f0ade8..c71565fa24d60 100644
--- a/clang-tools-extra/test/clang-doc/basic-project.test
+++ b/clang-tools-extra/test/clang-doc/basic-project.test
@@ -1,13 +1,7 @@
 // RUN: rm -rf %t && mkdir -p %t/docs %t/build
 // RUN: sed 's|$test_dir|%/S|g' %S/Inputs/basic-project/database_template.json 
> %t/build/compile_commands.json
 
-// RUN: clang-doc --format=md --output=%t/docs --executor=all-TUs 
%t/build/compile_commands.json
-// RUN: FileCheck %s -input-file=%t/docs/all_files.md 
-check-prefixes=MD-ALL-FILES
-// RUN: FileCheck %s -input-file=%t/docs/index.md -check-prefixes=MD-INDEX
-// RUN: FileCheck %s -input-file=%t/docs/GlobalNamespace/Shape.md 
-check-prefixes=MD-SHAPE
-// RUN: FileCheck %s -input-file=%t/docs/GlobalNamespace/Calculator.md 
-check-prefixes=MD-CALC
-// RUN: FileCheck %s -input-file=%t/docs/GlobalNamespace/Rectangle.md 
-check-prefixes=MD-RECTANGLE
-// RUN: FileCheck %s -input-file=%t/docs/GlobalNamespace/Circle.md 
-check-prefixes=MD-CIRCLE
+// RUN: clang-doc --format=json --output=%t/docs --executor=all-TUs 
%t/build/compile_commands.json
 
 // JSON-INDEX: async function LoadIndex() {
 // JSON-INDEX-NEXT: return{
@@ -55,122 +49,3 @@
 // JSON-INDEX-NEXT:   ]
 // JSON-INDEX-NEXT: };
 // JSON-INDEX-NEXT: }
-
-// MD-CALC: # class Calculator
-// MD-CALC: *Defined at .{{[\/]}}include{{[\/]}}Calculator.h#8*
-// MD-CALC: **brief** A simple calculator class.
-// MD-CALC:  Provides basic arithmetic operations.
-// MD-CALC: ## Members
-// MD-CALC: public int public_val
-// MD-CALC: public static const int static_val
-// MD-CALC: ## Functions
-// MD-CALC: ### add
-// MD-CALC: *public int add(int a, int b)*
-// MD-CALC: *Defined at .{{[\/]}}src{{[\/]}}Calculator.cpp#3*
-// MD-CALC: **brief** Adds two integers.
-// MD-CALC: **a** First integer.
-// MD-CALC: **b** Second integer.
-// MD-CALC: **return** int The sum of a and b.
-// MD-CALC: ### subtract
-// MD-CALC: *public int subtract(int a, int b)*
-// MD-CALC: *Defined at .{{[\/]}}src{{[\/]}}Calculator.cpp#5*
-// MD-CALC: **brief** Subtracts the second integer from the first.
-// MD-CALC: **a** First integer.
-// MD-CALC: **b** Second integer.
-// MD-CALC: **return** int The result of a - b.
-// MD-CALC: ### multiply
-// MD-CALC: *public int multiply(int a, int b)*
-// MD-CALC: *Defined at .{{[\/]}}src{{[\/]}}Calculator.cpp#7*
-// MD-CALC: **brief** Multiplies two integers.
-// MD-CALC: **a** First integer.
-// MD-CALC: **b** Second integer.
-// MD-CALC: **return** int The product of a and b.
-// MD-CALC: ### divide
-// MD-CALC: *public double divide(int a, int b)*
-// MD-CALC: *Defined at .{{[\/]}}src{{[\/]}}Calculator.cpp#9*
-// MD-CALC: **brief** Divides the first integer by the second.
-// MD-CALC: **a** First integer.
-// MD-CALC: **b** Second integer.
-// MD-CALC: **return** double The result of a / b.
-// MD-CALC: **throw** if b is zero.
-// MD-CALC: ### mod
-// MD-CALC: *public static int mod(int a, int b)*
-// MD-CALC: *Defined at ./include{{[\/]}}Calculator.h#54*
-// MD-CALC: **brief** Performs the mod operation on integers.
-// MD-CALC: **a** First integer.
-// MD-CALC: **b** Second integer.
-// MD-CALC: **return** The result of a % b.
-
-// MD-CIRCLE: # class Circle
-// MD-CIRCLE: *Defined at .{{[\/]}}include{{[\/]}}Circle.h#10*
-// MD-CIRCLE: **brief** Circle class derived from Shape.
-// MD-CIRCLE:  Represents a circle with a given radius.
-// MD-CIRCLE: Inherits from Shape
-// MD-CIRCLE: ## Members
-// MD-CIRCLE: private double radius_
-// MD-CIRCLE: ## Functions
-// MD-CIRCLE: ### Circle
-// MD-CIRCLE: *public void Circle(double radius)*
-// MD-CIRCLE: *Defined at .{{[\/]}}src{{[\/]}}Circle.cpp#3*
-// MD-CIRCLE: **brief** Constructs a new Circle object.
-// MD-CIRCLE: **radius** Radius of the circle.
-// MD-CIRCLE: ### area
-// MD-CIRCLE: *public double area()*
-// MD-CIRCLE: *Defined at .{{[\/]}}src{{[\/]}}Circle.cpp#5*
-// MD-CIRCLE: **brief** Calculates the area of the circle.
-// MD-CIRCLE: **return** double The area of the circle.
-// MD-CIRCLE: ### perimeter
-// MD-CIRCLE: *public double perimeter()*
-// MD-CIRCLE: *Defined at .{{[\/]}}src{{[\/]}}Circle.cpp#7*
-// MD-CIRCLE: **brief** Calculates the perimeter of the circle.
-// MD-CIRCLE: **return** double The perimeter of the circle.
-
-// MD-RECTANGLE: # class Rectangle
-// MD-RECTANGLE: *Defined at .{{[\/]}}include{{[\/]}}Rectangle.h#10*
-// MD-RECTANGLE: **brief** Rectangle class derived from Shape.
-// MD-RECTANGLE:  Represents a rectangle with a given width and height.
-// MD-RECTANGLE: Inherits from Shape
-// MD-RECTANGLE: ## Members
-// MD-RECTANGLE: private double width_
-// MD-RECTANGLE: private double height_
-// MD-RECTANGLE: ## Functions
-// MD-RECTANGLE: ### Rectangle
-// MD-RECTANGLE: *public void Rectangle(double width, double height)*
-// MD-RECTANGLE: *Defined at .{{[\/]}}src{{[\/]}}Rectangle.cpp#3*
-// MD-RECTANGLE: **brief** Constructs a new Rectangle object.
-// MD-RECTANGLE: **width** Width of the rectangle.
-// MD-RECTANGLE: **height** Height of the rectangle.
-// MD-RECTANGLE: ### area
-// MD-RECTANGLE: *public double area()*
-// MD-RECTANGLE: *Defined at .{{[\/]}}src{{[\/]}}Rectangle.cpp#6*
-// MD-RECTANGLE: **brief** Calculates the area of the rectangle.
-// MD-RECTANGLE: **return** double The area of the rectangle.
-// MD-RECTANGLE: ### perimeter
-// MD-RECTANGLE: *public double perimeter()*
-// MD-RECTANGLE: *Defined at .{{[\/]}}src{{[\/]}}Rectangle.cpp#8*
-// MD-RECTANGLE: **brief** Calculates the perimeter of the rectangle.
-// MD-RECTANGLE: **return** double The perimeter of the rectangle.
-
-// MD-SHAPE: # class Shape
-// MD-SHAPE: *Defined at .{{[\/]}}include{{[\/]}}Shape.h#8*
-// MD-SHAPE: **brief** Abstract base class for shapes.
-// MD-SHAPE:  Provides a common interface for different types of shapes.
-// MD-SHAPE: ## Functions
-// MD-SHAPE: ### area
-// MD-SHAPE: *public double area()*
-// MD-SHAPE: **brief** Calculates the area of the shape.
-// MD-SHAPE: **return** double The area of the shape.
-// MD-SHAPE: ### perimeter
-// MD-SHAPE: *public double perimeter()*
-// MD-SHAPE: **brief** Calculates the perimeter of the shape.
-// MD-SHAPE: **return** double The perimeter of the shape.
-// MD-SHAPE: ### ~Shape
-// MD-SHAPE: *public void ~Shape()*
-// MD-SHAPE: *Defined at .{{[\/]}}include{{[\/]}}Shape.h#13*
-// MD-SHAPE: **brief** Virtual destructor.
-
-// MD-ALL-FILES: # All Files
-// MD-ALL-FILES: ## [GlobalNamespace](GlobalNamespace{{[\/]}}index.md)
-
-// MD-INDEX: #  C/C++ Reference
-// MD-INDEX: * Namespace: [GlobalNamespace](GlobalNamespace)
diff --git a/clang-tools-extra/test/clang-doc/md/array-type.cpp 
b/clang-tools-extra/test/clang-doc/md/array-type.cpp
index 3fda12a9d6015..a70d464c38ec2 100644
--- a/clang-tools-extra/test/clang-doc/md/array-type.cpp
+++ b/clang-tools-extra/test/clang-doc/md/array-type.cpp
@@ -1,8 +1,5 @@
 // RUN: rm -rf %t && mkdir -p %t
 // RUN: clang-doc --output=%t --format=md --executor=standalone 
%S/../Inputs/array-type.cpp
-// RUN: FileCheck %s --check-prefix=MD < %t/GlobalNamespace/index.md
-// RUN: clang-doc --output=%t --format=md_mustache --executor=standalone 
%S/../Inputs/array-type.cpp
-// RUN: FileCheck %s --check-prefix=MD-MUSTACHE < 
%t/md/GlobalNamespace/index.md
+// RUN: FileCheck %s --check-prefix=MD < %t/md/GlobalNamespace/index.md
 
 // MD: *void qux(int (&)[5] arr)*
-// MD-MUSTACHE: *void qux(int (&)[5] arr)*
diff --git a/clang-tools-extra/test/clang-doc/md/builtin_types.cpp 
b/clang-tools-extra/test/clang-doc/md/builtin_types.cpp
index 45c690acc7d86..973a49f1353f8 100644
--- a/clang-tools-extra/test/clang-doc/md/builtin_types.cpp
+++ b/clang-tools-extra/test/clang-doc/md/builtin_types.cpp
@@ -1,60 +1,30 @@
-// RUN: rm -rf %t
-// RUN: mkdir -p %t/yaml %t/md %t/md_mustache
-// RUN: clang-doc --doxygen --executor=standalone 
%S/../Inputs/builtin_types.cpp -output=%t/md --format=md
-// RUN: FileCheck %s < %t/md/GlobalNamespace/index.md  --check-prefix=MD
-// RUN: clang-doc --doxygen --executor=standalone 
%S/../Inputs/builtin_types.cpp -output=%t/md_mustache --format=md_mustache
-// RUN: FileCheck %s < %t/md_mustache/md/GlobalNamespace/index.md  
--check-prefix=MD-MUSTACHE
+// RUN: rm -rf %t && mkdir -p %t
+// RUN: clang-doc --doxygen --executor=standalone 
%S/../Inputs/builtin_types.cpp --output=%t --format=md
+// RUN: FileCheck %s < %t/md/GlobalNamespace/index.md --check-prefix=MD
 
 // MD: # Global Namespace
 // MD: ## Functions
 
-// MD-MUSTACHE: # Global Namespace
-// MD-MUSTACHE: ## Functions
-
 // MD: ### b
 // MD: *bool b()*
 
-// MD-MUSTACHE: ### b
-// MD-MUSTACHE: *bool b()*
-
 // MD: ### c
 // MD: *char c()*
 
-// MD-MUSTACHE: ### c
-// MD-MUSTACHE: *char c()*
-
 // MD: ### d
 // MD: *double d()*
 
-// MD-MUSTACHE: ### d
-// MD-MUSTACHE: *double d()*
-
 // MD: ### f
 // MD: *float f()*
 
-// MD-MUSTACHE: ### f
-// MD-MUSTACHE: *float f()*
-
 // MD: ### i
 // MD: *int i()*
 
-// MD-MUSTACHE: ### i
-// MD-MUSTACHE: *int i()*
-
 // MD: ### l
 // MD: *long l()*
 
-// MD-MUSTACHE: ### l
-// MD-MUSTACHE: *long l()*
-
 // MD: ### ll
 // MD: *long long ll()*
 
-// MD-MUSTACHE: ### ll
-// MD-MUSTACHE: *long long ll()*
-
 // MD: ### s
 // MD: *short s()*
-
-// MD-MUSTACHE: ### s
-// MD-MUSTACHE: *short s()*
diff --git 
a/clang-tools-extra/test/clang-doc/md/class-partial-specialization.cpp 
b/clang-tools-extra/test/clang-doc/md/class-partial-specialization.cpp
index 01ebca3f3064a..bdddca8045802 100644
--- a/clang-tools-extra/test/clang-doc/md/class-partial-specialization.cpp
+++ b/clang-tools-extra/test/clang-doc/md/class-partial-specialization.cpp
@@ -1,8 +1,5 @@
 // RUN: rm -rf %t && mkdir -p %t
 // RUN: clang-doc --output=%t --format=md --executor=standalone 
%S/../Inputs/class-partial-specialization.cpp
-// RUN: FileCheck %s --check-prefix=MD < %t/GlobalNamespace/MyClass.md
-// RUN: clang-doc --output=%t --format=md_mustache --executor=standalone 
%S/../Inputs/class-partial-specialization.cpp
-// RUN: FileCheck %s --check-prefix=MD-MUSTACHE < 
%t/md/GlobalNamespace/_ZTV7MyClassIPT_E.md
+// RUN: FileCheck %s --check-prefix=MD < 
%t/md/GlobalNamespace/_ZTV7MyClassIPT_E.md
 
 // MD: # struct MyClass
-// MD-MUSTACHE: # struct MyClass
diff --git a/clang-tools-extra/test/clang-doc/md/comments-in-macros.cpp 
b/clang-tools-extra/test/clang-doc/md/comments-in-macros.cpp
index d544dff7c361a..33cb71627da42 100644
--- a/clang-tools-extra/test/clang-doc/md/comments-in-macros.cpp
+++ b/clang-tools-extra/test/clang-doc/md/comments-in-macros.cpp
@@ -1,18 +1,11 @@
 // RUN: rm -rf %t && mkdir -p %t
-// RUN: clang-doc --format=md --doxygen --output=%t --executor=standalone 
%S/../Inputs/comments-in-macros.cpp
-// RUN: clang-doc --format=md_mustache --doxygen --output=%t 
--executor=standalone %S/../Inputs/comments-in-macros.cpp
-// RUN: FileCheck %s < %t/GlobalNamespace/MyClass.md 
--check-prefix=MD-MYCLASS-LINE
-// RUN: FileCheck %s < %t/GlobalNamespace/MyClass.md --check-prefix=MD-MYCLASS
-// RUN: FileCheck %s < %t/md/GlobalNamespace/_ZTV7MyClass.md 
--check-prefix=MD-MUSTACHE-MYCLASS-LINE
-// RUN: FileCheck %s < %t/md/GlobalNamespace/_ZTV7MyClass.md 
--check-prefix=MD-MUSTACHE-MYCLASS
+// RUN: clang-doc --format=md -doxygen --output=%t --executor=standalone 
%S/../Inputs/comments-in-macros.cpp
+// RUN: FileCheck %s < %t/md/GlobalNamespace/_ZTV7MyClass.md 
--check-prefix=MD-MYCLASS-LINE
+// RUN: FileCheck %s < %t/md/GlobalNamespace/_ZTV7MyClass.md 
--check-prefix=MD-MYCLASS
+
 
 // MD-MYCLASS: ### Add
 // MD-MYCLASS: *public int Add(int a, int b)*
 // MD-MYCLASS: **brief** Declare a method to calculate the sum of two numbers
 
-// MD-MUSTACHE-MYCLASS: ### Add
-// MD-MUSTACHE-MYCLASS: *public int Add(int a, int b)*
-// MD-MUSTACHE-MYCLASS: **brief** Declare a method to calculate the sum of two 
numbers
-
 // MD-MYCLASS-LINE: *Defined at {{.*}}comments-in-macros.cpp#7*
-// MD-MUSTACHE-MYCLASS-LINE: *Defined at {{.*}}comments-in-macros.cpp#7*
diff --git a/clang-tools-extra/test/clang-doc/md/enum.cpp 
b/clang-tools-extra/test/clang-doc/md/enum.cpp
index f2ad31755173e..1550e66ff1c96 100644
--- a/clang-tools-extra/test/clang-doc/md/enum.cpp
+++ b/clang-tools-extra/test/clang-doc/md/enum.cpp
@@ -1,110 +1,38 @@
 // RUN: rm -rf %t && mkdir -p %t
-// RUN: clang-doc --format=md --doxygen --output=%t --executor=standalone 
%S/../Inputs/enum.cpp
-// RUN: clang-doc --format=md_mustache --pretty-json --doxygen --output=%t 
--executor=standalone %S/../Inputs/enum.cpp
-// RUN: FileCheck %s < %t/GlobalNamespace/index.md --check-prefix=MD-INDEX
-// RUN: FileCheck %s < %t/GlobalNamespace/Animals.md --check-prefix=MD-ANIMAL
-// RUN: FileCheck %s < %t/GlobalNamespace/FilePermissions.md 
--check-prefix=MD-PERM
-// RUN: FileCheck %s < %t/Vehicles/index.md --check-prefix=MD-VEHICLES
-// RUN: FileCheck %s < %t/md/GlobalNamespace/index.md 
--check-prefix=MD-MUSTACHE-INDEX
-// RUN: FileCheck %s < %t/md/GlobalNamespace/_ZTV7Animals.md 
--check-prefix=MD-MUSTACHE-ANIMAL
-// RUN: FileCheck %s < %t/md/Vehicles/index.md 
--check-prefix=MD-MUSTACHE-VEHICLES
+// RUN: clang-doc --format=md --pretty-json --doxygen --output=%t 
--executor=standalone %S/../Inputs/enum.cpp
+// RUN: FileCheck %s < %t/md/GlobalNamespace/index.md --check-prefix=MD-INDEX
+// RUN: FileCheck %s < %t/md/GlobalNamespace/_ZTV7Animals.md 
--check-prefix=MD-ANIMAL
+// RUN: FileCheck %s < %t/md/Vehicles/index.md --check-prefix=MD-VEHICLES
 
 // MD-INDEX: ## Enums
 // MD-INDEX: | enum Color |
-// MD-INDEX: | Name | Value | Comments |
-// MD-INDEX: |---|---|---|
-// MD-INDEX: | Red | 0 | Comment 1 |
-// MD-INDEX: | Green | 1 | Comment 2 |
-// MD-INDEX: | Blue | 2 | Comment 3 |
+// MD-INDEX: --
+// MD-INDEX: | Red |
+// MD-INDEX: | Green |
+// MD-INDEX: | Blue |
 // MD-INDEX: **brief** For specifying RGB colors
 
-// MD-MUSTACHE-INDEX: ## Enums
-// MD-MUSTACHE-INDEX: | enum Color |
-// MD-MUSTACHE-INDEX: --
-// MD-MUSTACHE-INDEX: | Red |
-// MD-MUSTACHE-INDEX: | Green |
-// MD-MUSTACHE-INDEX: | Blue |
-// MD-MUSTACHE-INDEX: **brief** For specifying RGB colors
-
-// MD-INDEX: | enum class Shapes |
-// MD-INDEX: | Name | Value | Comments |
-// MD-INDEX: |---|---|---|
-// MD-INDEX: | Circle | 0 | Comment 1 |
-// MD-INDEX: | Rectangle | 1 | Comment 2 |
-// MD-INDEX: | Triangle | 2 | Comment 3 |
-// MD-INDEX: **brief** Shape Types
-
-// MD-INDEX: | enum Size : uint8_t |
-// MD-INDEX: | Name | Value | Comments |
-// MD-INDEX: |---|---|---|
-// MD-INDEX: | Small | 0 | A pearl.<br>Pearls are quite small.<br><br>Pearls 
are used in jewelry. |
-// MD-INDEX: | Medium | 1 | A tennis ball. |
-// MD-INDEX: | Large | 2 | A football. |
-// MD-INDEX: **brief** Specify the size
-
-// MD-INDEX: | enum (unnamed) : long long |
-// MD-INDEX: | Name | Value | Comments |
-// MD-INDEX: |---|---|---|
-// MD-INDEX: | BigVal | 999999999999 | A very large value |
-// MD-INDEX: **brief** Very long number
-
 // MD-INDEX: | enum ColorUserSpecified |
-// MD-INDEX: | Name | Value |
-// MD-INDEX: |---|---|
-// MD-INDEX: | RedUserSpecified | 65 |
-// MD-INDEX: | GreenUserSpecified | 2 |
-// MD-INDEX: | BlueUserSpecified | 67 |
-
-// MD-MUSTACHE-INDEX: | enum ColorUserSpecified |
-// MD-MUSTACHE-INDEX: --
-// MD-MUSTACHE-INDEX: | RedUserSpecified |
-// MD-MUSTACHE-INDEX: | GreenUserSpecified |
-// MD-MUSTACHE-INDEX: | BlueUserSpecified |
-
-// MD-PERM: | enum (unnamed) |
-// MD-PERM: | Name | Value | Comments |
-// MD-PERM: |---|---|---|
-// MD-PERM: | Read | 1 | Permission to READ r |
-// MD-PERM: | Write | 2 | Permission to WRITE w |
-// MD-PERM: | Execute | 4 | Permission to EXECUTE x |
-// MD-PERM: **brief** File permission flags
+// MD-INDEX: --
+// MD-INDEX: | RedUserSpecified |
+// MD-INDEX: | GreenUserSpecified |
+// MD-INDEX: | BlueUserSpecified |
 
 // MD-ANIMAL: # class Animals
 // MD-ANIMAL: ## Enums
 // MD-ANIMAL: | enum AnimalType |
-// MD-ANIMAL: | Name | Value | Comments |
-// MD-ANIMAL: |---|---|---|
-// MD-ANIMAL: | Dog | 0 | Man's best friend |
-// MD-ANIMAL: | Cat | 1 | Man's other best friend |
-// MD-ANIMAL: | Iguana | 2 | A lizard |
+// MD-ANIMAL: --
+// MD-ANIMAL: | Dog |
+// MD-ANIMAL: | Cat |
+// MD-ANIMAL: | Iguana |
 // MD-ANIMAL: **brief** specify what animal the class is
 
-// MD-MUSTACHE-ANIMAL: # class Animals
-// MD-MUSTACHE-ANIMAL: ## Enums
-// MD-MUSTACHE-ANIMAL: | enum AnimalType |
-// MD-MUSTACHE-ANIMAL: --
-// MD-MUSTACHE-ANIMAL: | Dog |
-// MD-MUSTACHE-ANIMAL: | Cat |
-// MD-MUSTACHE-ANIMAL: | Iguana |
-// MD-MUSTACHE-ANIMAL: **brief** specify what animal the class is
-
 // MD-VEHICLES: # namespace Vehicles
 // MD-VEHICLES: ## Enums
 // MD-VEHICLES: | enum Car |
-// MD-VEHICLES: | Name | Value | Comments |
-// MD-VEHICLES: |---|---|---|
-// MD-VEHICLES: | Sedan | 0 | Comment 1 |
-// MD-VEHICLES: | SUV | 1 | Comment 2 |
-// MD-VEHICLES: | Pickup | 2 | -- |
-// MD-VEHICLES: | Hatchback | 3 | Comment 4 |
+// MD-VEHICLES: --
+// MD-VEHICLES: | Sedan |
+// MD-VEHICLES: | SUV |
+// MD-VEHICLES: | Pickup |
+// MD-VEHICLES: | Hatchback |
 // MD-VEHICLES: **brief** specify type of car
-
-// MD-MUSTACHE-VEHICLES: # namespace Vehicles
-// MD-MUSTACHE-VEHICLES: ## Enums
-// MD-MUSTACHE-VEHICLES: | enum Car |
-// MD-MUSTACHE-VEHICLES: --
-// MD-MUSTACHE-VEHICLES: | Sedan |
-// MD-MUSTACHE-VEHICLES: | SUV |
-// MD-MUSTACHE-VEHICLES: | Pickup |
-// MD-MUSTACHE-VEHICLES: | Hatchback |
-// MD-MUSTACHE-VEHICLES: **brief** specify type of car
diff --git a/clang-tools-extra/test/clang-doc/md/function-pointer-type.cpp 
b/clang-tools-extra/test/clang-doc/md/function-pointer-type.cpp
index 2983adb00893f..de1f60c3d9b85 100644
--- a/clang-tools-extra/test/clang-doc/md/function-pointer-type.cpp
+++ b/clang-tools-extra/test/clang-doc/md/function-pointer-type.cpp
@@ -1,8 +1,5 @@
 // RUN: rm -rf %t && mkdir -p %t
 // RUN: clang-doc --output=%t --format=md --executor=standalone 
%S/../Inputs/function-pointer-type.cpp
-// RUN: FileCheck %s --check-prefix=MD < %t/GlobalNamespace/index.md
-// RUN: clang-doc --output=%t --format=md_mustache --executor=standalone 
%S/../Inputs/function-pointer-type.cpp
-// RUN: FileCheck %s --check-prefix=MD-MUSTACHE < 
%t/md/GlobalNamespace/index.md
+// RUN: FileCheck %s --check-prefix=MD < %t/md/GlobalNamespace/index.md
 
 // MD: *void bar(void (*)(int) fn)*
-// MD-MUSTACHE: *void bar(void (*)(int) fn)*
diff --git 
a/clang-tools-extra/test/clang-doc/md/member-function-pointer-type.cpp 
b/clang-tools-extra/test/clang-doc/md/member-function-pointer-type.cpp
index a84467f8d9c2c..588b9beeecc99 100644
--- a/clang-tools-extra/test/clang-doc/md/member-function-pointer-type.cpp
+++ b/clang-tools-extra/test/clang-doc/md/member-function-pointer-type.cpp
@@ -1,8 +1,5 @@
 // RUN: rm -rf %t && mkdir -p %t
 // RUN: clang-doc --output=%t --format=md --executor=standalone 
%S/../Inputs/member-function-pointer-type.cpp
-// RUN: FileCheck %s --check-prefix=MD < %t/GlobalNamespace/index.md
-// RUN: clang-doc --output=%t --format=md_mustache --executor=standalone 
%S/../Inputs/member-function-pointer-type.cpp
-// RUN: FileCheck %s --check-prefix=MD-MUSTACHE < 
%t/md/GlobalNamespace/index.md
+// RUN: FileCheck %s --check-prefix=MD < %t/md/GlobalNamespace/index.md
 
 // MD: *void baz(void (Class::*)(int) fn)*
-// MD-MUSTACHE: *void baz(void (Class::*)(int) fn)*
diff --git a/clang-tools-extra/test/clang-doc/md/namespace.cpp 
b/clang-tools-extra/test/clang-doc/md/namespace.cpp
index 8a89eda6a6d50..a9dd6880290f6 100644
--- a/clang-tools-extra/test/clang-doc/md/namespace.cpp
+++ b/clang-tools-extra/test/clang-doc/md/namespace.cpp
@@ -1,94 +1,53 @@
 // RUN: rm -rf %t && mkdir -p %t
 // RUN: clang-doc --format=md --output=%t --executor=standalone 
%S/../Inputs/namespace-html-md.cpp
-// RUN: FileCheck %s < %t/@nonymous_namespace/AnonClass.md 
-check-prefix=MD-ANON-CLASS-LINE
-// RUN: FileCheck %s < %t/@nonymous_namespace/AnonClass.md 
-check-prefix=MD-ANON-CLASS
-// RUN: FileCheck %s < %t/@nonymous_namespace/index.md 
-check-prefix=MD-ANON-INDEX-LINE
-// RUN: FileCheck %s < %t/@nonymous_namespace/index.md 
-check-prefix=MD-ANON-INDEX
-// RUN: FileCheck %s < %t/AnotherNamespace/ClassInAnotherNamespace.md 
-check-prefix=MD-ANOTHER-CLASS-LINE
-// RUN: FileCheck %s < %t/AnotherNamespace/ClassInAnotherNamespace.md 
-check-prefix=MD-ANOTHER-CLASS
-// RUN: FileCheck %s < %t/AnotherNamespace/index.md 
-check-prefix=MD-ANOTHER-INDEX-LINE
-// RUN: FileCheck %s < %t/AnotherNamespace/index.md 
-check-prefix=MD-ANOTHER-INDEX
-// RUN: FileCheck %s < 
%t/PrimaryNamespace/NestedNamespace/ClassInNestedNamespace.md 
-check-prefix=MD-NESTED-CLASS-LINE
-// RUN: FileCheck %s < 
%t/PrimaryNamespace/NestedNamespace/ClassInNestedNamespace.md 
-check-prefix=MD-NESTED-CLASS
-// RUN: FileCheck %s < %t/PrimaryNamespace/NestedNamespace/index.md 
-check-prefix=MD-NESTED-INDEX-LINE
-// RUN: FileCheck %s < %t/PrimaryNamespace/NestedNamespace/index.md 
-check-prefix=MD-NESTED-INDEX
-// RUN: FileCheck %s < %t/PrimaryNamespace/index.md 
-check-prefix=MD-PRIMARY-INDEX-LINE
-// RUN: FileCheck %s < %t/PrimaryNamespace/index.md 
-check-prefix=MD-PRIMARY-INDEX
-// RUN: FileCheck %s < %t/PrimaryNamespace/ClassInPrimaryNamespace.md 
-check-prefix=MD-PRIMARY-CLASS-LINE
-// RUN: FileCheck %s < %t/PrimaryNamespace/ClassInPrimaryNamespace.md 
-check-prefix=MD-PRIMARY-CLASS
-// RUN: FileCheck %s < %t/GlobalNamespace/index.md 
-check-prefix=MD-GLOBAL-INDEX
-// RUN: FileCheck %s < %t/all_files.md -check-prefix=MD-ALL-FILES
-// RUN: FileCheck %s < %t/index.md -check-prefix=MD-INDEX
-// RUN: clang-doc --format=md_mustache --output=%t --executor=standalone 
%S/../Inputs/namespace-html-md.cpp
-// RUN: FileCheck %s < 
%t/md/@nonymous_namespace/_ZTVN12_GLOBAL__N_19AnonClassE.md 
-check-prefix=MD-MUSTACHE-ANON-CLASS-LINE
-// RUN: FileCheck %s < 
%t/md/@nonymous_namespace/_ZTVN12_GLOBAL__N_19AnonClassE.md 
-check-prefix=MD-MUSTACHE-ANON-CLASS
-// RUN: FileCheck %s < %t/md/@nonymous_namespace/index.md 
-check-prefix=MD-MUSTACHE-ANON-INDEX-LINE
-// RUN: FileCheck %s < %t/md/@nonymous_namespace/index.md 
-check-prefix=MD-MUSTACHE-ANON-INDEX
-// RUN: FileCheck %s < 
%t/md/AnotherNamespace/_ZTVN16AnotherNamespace23ClassInAnotherNamespaceE.md 
-check-prefix=MD-MUSTACHE-ANOTHER-CLASS-LINE
-// RUN: FileCheck %s < 
%t/md/AnotherNamespace/_ZTVN16AnotherNamespace23ClassInAnotherNamespaceE.md 
-check-prefix=MD-MUSTACHE-ANOTHER-CLASS
-// RUN: FileCheck %s < %t/md/AnotherNamespace/index.md 
-check-prefix=MD-MUSTACHE-ANOTHER-INDEX-LINE
-// RUN: FileCheck %s < %t/md/AnotherNamespace/index.md 
-check-prefix=MD-MUSTACHE-ANOTHER-INDEX
-// RUN: FileCheck %s < 
%t/md/PrimaryNamespace/NestedNamespace/_ZTVN16PrimaryNamespace15NestedNamespace22ClassInNestedNamespaceE.md
 -check-prefix=MD-MUSTACHE-NESTED-CLASS-LINE
-// RUN: FileCheck %s < 
%t/md/PrimaryNamespace/NestedNamespace/_ZTVN16PrimaryNamespace15NestedNamespace22ClassInNestedNamespaceE.md
 -check-prefix=MD-MUSTACHE-NESTED-CLASS
-// RUN: FileCheck %s < %t/md/PrimaryNamespace/NestedNamespace/index.md 
-check-prefix=MD-MUSTACHE-NESTED-INDEX-LINE
-// RUN: FileCheck %s < %t/md/PrimaryNamespace/NestedNamespace/index.md 
-check-prefix=MD-MUSTACHE-NESTED-INDEX
-// RUN: FileCheck %s < %t/md/PrimaryNamespace/index.md 
-check-prefix=MD-MUSTACHE-PRIMARY-INDEX-LINE
-// RUN: FileCheck %s < %t/md/PrimaryNamespace/index.md 
-check-prefix=MD-MUSTACHE-PRIMARY-INDEX
-// RUN: FileCheck %s < 
%t/md/PrimaryNamespace/_ZTVN16PrimaryNamespace23ClassInPrimaryNamespaceE.md 
-check-prefix=MD-MUSTACHE-PRIMARY-CLASS-LINE
-// RUN: FileCheck %s < 
%t/md/PrimaryNamespace/_ZTVN16PrimaryNamespace23ClassInPrimaryNamespaceE.md 
-check-prefix=MD-MUSTACHE-PRIMARY-CLASS
-// RUN: FileCheck %s < %t/md/GlobalNamespace/index.md 
-check-prefix=MD-MUSTACHE-GLOBAL-INDEX
-// RUN: FileCheck %s < %t/md/all_files.md -check-prefix=MD-MUSTACHE-ALL-FILES
-// RUN: FileCheck %s < %t/md/index.md -check-prefix=MD-MUSTACHE-INDEX
+// RUN: FileCheck %s < 
%t/md/@nonymous_namespace/_ZTVN12_GLOBAL__N_19AnonClassE.md 
-check-prefix=MD-ANON-CLASS-LINE
+// RUN: FileCheck %s < 
%t/md/@nonymous_namespace/_ZTVN12_GLOBAL__N_19AnonClassE.md 
-check-prefix=MD-ANON-CLASS
+// RUN: FileCheck %s < %t/md/@nonymous_namespace/index.md 
-check-prefix=MD-ANON-INDEX-LINE
+// RUN: FileCheck %s < %t/md/@nonymous_namespace/index.md 
-check-prefix=MD-ANON-INDEX
+// RUN: FileCheck %s < 
%t/md/AnotherNamespace/_ZTVN16AnotherNamespace23ClassInAnotherNamespaceE.md 
-check-prefix=MD-ANOTHER-CLASS-LINE
+// RUN: FileCheck %s < 
%t/md/AnotherNamespace/_ZTVN16AnotherNamespace23ClassInAnotherNamespaceE.md 
-check-prefix=MD-ANOTHER-CLASS
+// RUN: FileCheck %s < %t/md/AnotherNamespace/index.md 
-check-prefix=MD-ANOTHER-INDEX-LINE
+// RUN: FileCheck %s < %t/md/AnotherNamespace/index.md 
-check-prefix=MD-ANOTHER-INDEX
+// RUN: FileCheck %s < 
%t/md/PrimaryNamespace/NestedNamespace/_ZTVN16PrimaryNamespace15NestedNamespace22ClassInNestedNamespaceE.md
 -check-prefix=MD-NESTED-CLASS-LINE
+// RUN: FileCheck %s < 
%t/md/PrimaryNamespace/NestedNamespace/_ZTVN16PrimaryNamespace15NestedNamespace22ClassInNestedNamespaceE.md
 -check-prefix=MD-NESTED-CLASS
+// RUN: FileCheck %s < %t/md/PrimaryNamespace/NestedNamespace/index.md 
-check-prefix=MD-NESTED-INDEX-LINE
+// RUN: FileCheck %s < %t/md/PrimaryNamespace/NestedNamespace/index.md 
-check-prefix=MD-NESTED-INDEX
+// RUN: FileCheck %s < %t/md/PrimaryNamespace/index.md 
-check-prefix=MD-PRIMARY-INDEX-LINE
+// RUN: FileCheck %s < %t/md/PrimaryNamespace/index.md 
-check-prefix=MD-PRIMARY-INDEX
+// RUN: FileCheck %s < 
%t/md/PrimaryNamespace/_ZTVN16PrimaryNamespace23ClassInPrimaryNamespaceE.md 
-check-prefix=MD-PRIMARY-CLASS-LINE
+// RUN: FileCheck %s < 
%t/md/PrimaryNamespace/_ZTVN16PrimaryNamespace23ClassInPrimaryNamespaceE.md 
-check-prefix=MD-PRIMARY-CLASS
+// RUN: FileCheck %s < %t/md/GlobalNamespace/index.md 
-check-prefix=MD-GLOBAL-INDEX
+// RUN: FileCheck %s < %t/md/all_files.md -check-prefix=MD-ALL-FILES
+// RUN: FileCheck %s < %t/md/index.md -check-prefix=MD-INDEX
 
 // MD-ANON-INDEX-LINE: *Defined at {{.*}}namespace-html-md.cpp#3*
-// MD-MUSTACHE-ANON-INDEX-LINE: *Defined at {{.*}}namespace-html-md.cpp#3*
 
 // MD-ANON-CLASS-LINE: *Defined at {{.*}}namespace-html-md.cpp#4*
-// MD-MUSTACHE-ANON-CLASS-LINE: *Defined at {{.*}}namespace-html-md.cpp#4*
 
 // MD-ANON-CLASS: # class AnonClass
-// MD-MUSTACHE-ANON-CLASS: # class AnonClass
 
 // MD-ANON-INDEX: # namespace @nonymous_namespace
-// MD-ANON-INDEX:  Anonymous Namespace
+// MD-ANON-INDEX: Anonymous Namespace
 // MD-ANON-INDEX: ## Records
 // MD-ANON-INDEX: * [AnonClass](AnonClass.md)
 // MD-ANON-INDEX: ## Functions
 // MD-ANON-INDEX: ### anonFunction
 // MD-ANON-INDEX: *void anonFunction()*
 
-// MD-MUSTACHE-ANON-INDEX: # namespace @nonymous_namespace
-// MD-MUSTACHE-ANON-INDEX: Anonymous Namespace
-// MD-MUSTACHE-ANON-INDEX: ## Records
-// MD-MUSTACHE-ANON-INDEX: * [AnonClass](AnonClass.md)
-// MD-MUSTACHE-ANON-INDEX: ## Functions
-// MD-MUSTACHE-ANON-INDEX: ### anonFunction
-// MD-MUSTACHE-ANON-INDEX: *void anonFunction()*
-
 // MD-PRIMARY-INDEX-LINE: *Defined at {{.*}}namespace-html-md.cpp#10*
-// MD-MUSTACHE-PRIMARY-INDEX-LINE: *Defined at {{.*}}namespace-html-md.cpp#10*
 
 // MD-PRIMARY-CLASS-LINE: *Defined at {{.*}}namespace-html-md.cpp#12*
-// MD-MUSTACHE-PRIMARY-CLASS-LINE: *Defined at {{.*}}namespace-html-md.cpp#12*
 
 // MD-PRIMARY-CLASS: # class ClassInPrimaryNamespace
 // MD-PRIMARY-CLASS: Class in PrimaryNamespace
 
-// MD-MUSTACHE-PRIMARY-CLASS: # class ClassInPrimaryNamespace
-// MD-MUSTACHE-PRIMARY-CLASS: Class in PrimaryNamespace
-
 // MD-NESTED-INDEX-LINE: *Defined at {{.*}}namespace-html-md.cpp#17*
-// MD-MUSTACHE-NESTED-INDEX-LINE: *Defined at {{.*}}namespace-html-md.cpp#17*
 
 // MD-NESTED-CLASS-LINE: *Defined at {{.*}}namespace-html-md.cpp#19*
-// MD-MUSTACHE-NESTED-CLASS-LINE: *Defined at {{.*}}namespace-html-md.cpp#19*
 
 // MD-NESTED-CLASS: # class ClassInNestedNamespace
 // MD-NESTED-CLASS: Class in NestedNamespace
 
-// MD-MUSTACHE-NESTED-CLASS: # class ClassInNestedNamespace
-// MD-MUSTACHE-NESTED-CLASS: Class in NestedNamespace
-
 // MD-NESTED-INDEX: # namespace NestedNamespace
 // MD-NESTED-INDEX: Nested namespace
 // MD-NESTED-INDEX: ## Records
@@ -98,17 +57,8 @@
 // MD-NESTED-INDEX: *void functionInNestedNamespace()*
 // MD-NESTED-INDEX: Function in NestedNamespace
 
-// MD-MUSTACHE-NESTED-INDEX: # namespace NestedNamespace
-// MD-MUSTACHE-NESTED-INDEX: Nested namespace
-// MD-MUSTACHE-NESTED-INDEX: ## Records
-// MD-MUSTACHE-NESTED-INDEX: * 
[ClassInNestedNamespace](ClassInNestedNamespace.md)
-// MD-MUSTACHE-NESTED-INDEX: ## Functions
-// MD-MUSTACHE-NESTED-INDEX: ### functionInNestedNamespace
-// MD-MUSTACHE-NESTED-INDEX: *void functionInNestedNamespace()*
-// MD-MUSTACHE-NESTED-INDEX: Function in NestedNamespace
-
 // MD-PRIMARY-INDEX: # namespace PrimaryNamespace
-// MD-PRIMARY-INDEX:  Primary Namespace
+// MD-PRIMARY-INDEX: Primary Namespace
 // MD-PRIMARY-INDEX: ## Namespaces
 // MD-PRIMARY-INDEX: * [NestedNamespace](NestedNamespace{{[\/]}}index.md)
 // MD-PRIMARY-INDEX: ## Records
@@ -116,30 +66,14 @@
 // MD-PRIMARY-INDEX: ## Functions
 // MD-PRIMARY-INDEX: ### functionInPrimaryNamespace
 // MD-PRIMARY-INDEX: *void functionInPrimaryNamespace()*
-// MD-PRIMARY-INDEX:  Function in PrimaryNamespace
-
-// MD-MUSTACHE-PRIMARY-INDEX: # namespace PrimaryNamespace
-// MD-MUSTACHE-PRIMARY-INDEX: Primary Namespace
-// MD-MUSTACHE-PRIMARY-INDEX: ## Namespaces
-// MD-MUSTACHE-PRIMARY-INDEX: * 
[NestedNamespace](NestedNamespace{{[\/]}}index.md)
-// MD-MUSTACHE-PRIMARY-INDEX: ## Records
-// MD-MUSTACHE-PRIMARY-INDEX: * 
[ClassInPrimaryNamespace](ClassInPrimaryNamespace.md)
-// MD-MUSTACHE-PRIMARY-INDEX: ## Functions
-// MD-MUSTACHE-PRIMARY-INDEX: ### functionInPrimaryNamespace
-// MD-MUSTACHE-PRIMARY-INDEX: *void functionInPrimaryNamespace()*
-// MD-MUSTACHE-PRIMARY-INDEX: Function in PrimaryNamespace
+// MD-PRIMARY-INDEX: Function in PrimaryNamespace
 
 // MD-ANOTHER-INDEX-LINE: *Defined at {{.*}}namespace-html-md.cpp#26*
-// MD-MUSTACHE-ANOTHER-INDEX-LINE: *Defined at {{.*}}namespace-html-md.cpp#26*
 
 // MD-ANOTHER-CLASS-LINE: *Defined at {{.*}}namespace-html-md.cpp#28*
-// MD-MUSTACHE-ANOTHER-CLASS-LINE: *Defined at {{.*}}namespace-html-md.cpp#28*
 
 // MD-ANOTHER-CLASS: # class ClassInAnotherNamespace
-// MD-ANOTHER-CLASS:  Class in AnotherNamespace
-
-// MD-MUSTACHE-ANOTHER-CLASS: # class ClassInAnotherNamespace
-// MD-MUSTACHE-ANOTHER-CLASS: Class in AnotherNamespace
+// MD-ANOTHER-CLASS: Class in AnotherNamespace
 
 // MD-ANOTHER-INDEX: # namespace AnotherNamespace
 // MD-ANOTHER-INDEX: AnotherNamespace
@@ -150,26 +84,11 @@
 // MD-ANOTHER-INDEX: *void functionInAnotherNamespace()*
 // MD-ANOTHER-INDEX: Function in AnotherNamespace
 
-// MD-MUSTACHE-ANOTHER-INDEX: # namespace AnotherNamespace
-// MD-MUSTACHE-ANOTHER-INDEX: AnotherNamespace
-// MD-MUSTACHE-ANOTHER-INDEX: ## Records
-// MD-MUSTACHE-ANOTHER-INDEX: * 
[ClassInAnotherNamespace](ClassInAnotherNamespace.md)
-// MD-MUSTACHE-ANOTHER-INDEX: ## Functions
-// MD-MUSTACHE-ANOTHER-INDEX: ### functionInAnotherNamespace
-// MD-MUSTACHE-ANOTHER-INDEX: *void functionInAnotherNamespace()*
-// MD-MUSTACHE-ANOTHER-INDEX: Function in AnotherNamespace
-
 // MD-GLOBAL-INDEX: # Global Namespace
 // MD-GLOBAL-INDEX: ## Namespaces
-// MD-GLOBAL-INDEX: * 
[@nonymous_namespace](..{{[\/]}}@nonymous_namespace{{[\/]}}index.md)
-// MD-GLOBAL-INDEX: * 
[AnotherNamespace](..{{[\/]}}AnotherNamespace{{[\/]}}index.md)
-// MD-GLOBAL-INDEX: * 
[PrimaryNamespace](..{{[\/]}}PrimaryNamespace{{[\/]}}index.md)
-
-// MD-MUSTACHE-GLOBAL-INDEX: # Global Namespace
-// MD-MUSTACHE-GLOBAL-INDEX: ## Namespaces
-// MD-MUSTACHE-GLOBAL-INDEX: * 
[@nonymous_namespace]({{.*}}{{[\/]}}@nonymous_namespace{{[\/]}}index.md)
-// MD-MUSTACHE-GLOBAL-INDEX: * 
[AnotherNamespace]({{.*}}{{[\/]}}AnotherNamespace{{[\/]}}index.md)
-// MD-MUSTACHE-GLOBAL-INDEX: * 
[PrimaryNamespace]({{.*}}{{[\/]}}PrimaryNamespace{{[\/]}}index.md)
+// MD-GLOBAL-INDEX: * 
[@nonymous_namespace]({{.*}}{{[\/]}}@nonymous_namespace{{[\/]}}index.md)
+// MD-GLOBAL-INDEX: * 
[AnotherNamespace]({{.*}}{{[\/]}}AnotherNamespace{{[\/]}}index.md)
+// MD-GLOBAL-INDEX: * 
[PrimaryNamespace]({{.*}}{{[\/]}}PrimaryNamespace{{[\/]}}index.md)
 
 // MD-ALL-FILES: # All Files
 // MD-ALL-FILES: ## [@nonymous_namespace](@nonymous_namespace{{[\/]}}index.md)
@@ -177,18 +96,7 @@
 // MD-ALL-FILES: ## [GlobalNamespace](GlobalNamespace{{[\/]}}index.md)
 // MD-ALL-FILES: ## [PrimaryNamespace](PrimaryNamespace{{[\/]}}index.md)
 
-// MD-MUSTACHE-ALL-FILES: # All Files
-// MD-MUSTACHE-ALL-FILES: ## 
[@nonymous_namespace](@nonymous_namespace{{[\/]}}index.md)
-// MD-MUSTACHE-ALL-FILES: ## 
[AnotherNamespace](AnotherNamespace{{[\/]}}index.md)
-// MD-MUSTACHE-ALL-FILES: ## [GlobalNamespace](GlobalNamespace{{[\/]}}index.md)
-// MD-MUSTACHE-ALL-FILES: ## 
[PrimaryNamespace](PrimaryNamespace{{[\/]}}index.md)
-
 // MD-INDEX: #  C/C++ Reference
 // MD-INDEX: * Namespace: [@nonymous_namespace](@nonymous_namespace)
 // MD-INDEX: * Namespace: [AnotherNamespace](AnotherNamespace)
 // MD-INDEX: * Namespace: [PrimaryNamespace](PrimaryNamespace)
-
-// MD-MUSTACHE-INDEX: #  C/C++ Reference
-// MD-MUSTACHE-INDEX: * Namespace: [@nonymous_namespace](@nonymous_namespace)
-// MD-MUSTACHE-INDEX: * Namespace: [AnotherNamespace](AnotherNamespace)
-// MD-MUSTACHE-INDEX: * Namespace: [PrimaryNamespace](PrimaryNamespace)
diff --git a/clang-tools-extra/test/clang-doc/md/nested-pointer-qualifiers.cpp 
b/clang-tools-extra/test/clang-doc/md/nested-pointer-qualifiers.cpp
index b2db895ba1e4f..2552177cefbc4 100644
--- a/clang-tools-extra/test/clang-doc/md/nested-pointer-qualifiers.cpp
+++ b/clang-tools-extra/test/clang-doc/md/nested-pointer-qualifiers.cpp
@@ -1,8 +1,5 @@
 // RUN: rm -rf %t && mkdir -p %t
 // RUN: clang-doc --output=%t --format=md --executor=standalone 
%S/../Inputs/nested-pointer-qualifiers.cpp
-// RUN: FileCheck %s --check-prefix=MD < %t/GlobalNamespace/index.md
-// RUN: clang-doc --output=%t --format=md_mustache --executor=standalone 
%S/../Inputs/nested-pointer-qualifiers.cpp
 // RUN: FileCheck %s --check-prefix=MD-MUSTACHE < 
%t/md/GlobalNamespace/index.md
 
-// MD: *void foo(const int *const * ptr)*
 // MD-MUSTACHE: *void foo(const int *const * ptr)*
diff --git a/clang-tools-extra/test/clang-doc/md/templates.cpp 
b/clang-tools-extra/test/clang-doc/md/templates.cpp
index 7b6d3b613fc04..68884ba34338b 100644
--- a/clang-tools-extra/test/clang-doc/md/templates.cpp
+++ b/clang-tools-extra/test/clang-doc/md/templates.cpp
@@ -1,49 +1,23 @@
 // RUN: rm -rf %t && mkdir -p %t
 // RUN: clang-doc --doxygen --executor=standalone %S/../Inputs/templates.cpp 
-output=%t/docs --format=md
-// RUN: FileCheck %s --check-prefix=MD < %t/docs/GlobalNamespace/index.md
-// RUN: clang-doc --doxygen --executor=standalone %S/../Inputs/templates.cpp 
-output=%t/docs --format=md_mustache
-// RUN: FileCheck %s --check-prefix=MD-MUSTACHE < 
%t/docs/md/GlobalNamespace/index.md
+// RUN: FileCheck %s --check-prefix=MD < %t/docs/md/GlobalNamespace/index.md
 
 // MD: # Global Namespace
 // MD: ## Functions
 
-// MD-MUSTACHE: # Global Namespace
-// MD-MUSTACHE: ## Functions
-
 // MD: ### ParamPackFunction
 // MD: *void ParamPackFunction(T... args)*
 
-// MD-MUSTACHE: ### ParamPackFunction
-// MD-MUSTACHE: *void ParamPackFunction(T... args)*
-
 // MD: ### function
 // MD: *void function(T x)*
 // MD: *Defined at {{.*}}templates.cpp#3*
 
-// MD-MUSTACHE: ### function
-// MD-MUSTACHE: *void function(T x)*
-// MD-MUSTACHE: *Defined at {{.*}}templates.cpp#3*
-
-// MD: ### longFunction
-// MD: *void longFunction(A a, B b, C c, D d, E e)*
-// MD: *Defined at {{.*}}templates.cpp#6*
-
 // MD: ### function
 // MD: *void function(bool x)*
 // MD: *Defined at {{.*}}templates.cpp#8*
 
-// MD-MUSTACHE: ### function
-// MD-MUSTACHE: *void function(bool x)*
-// MD-MUSTACHE: *Defined at {{.*}}templates.cpp#8*
-
 // MD: ### func_with_tuple_param
 // MD: *tuple<int, int, bool> func_with_tuple_param(tuple<int, int, bool> t)*
 // MD: *Defined at {{.*}}templates.cpp#18*
 // MD:  A function with a tuple parameter
 // MD: **t** The input to func_with_tuple_param
-
-// MD-MUSTACHE: ### func_with_tuple_param
-// MD-MUSTACHE: *tuple<int, int, bool> func_with_tuple_param(tuple<int, int, 
bool> t)*
-// MD-MUSTACHE: *Defined at {{.*}}templates.cpp#18*
-// MD-MUSTACHE:  A function with a tuple parameter
-// MD-MUSTACHE: **t** The input to func_with_tuple_param
diff --git a/clang-tools-extra/unittests/clang-doc/CMakeLists.txt 
b/clang-tools-extra/unittests/clang-doc/CMakeLists.txt
index 97a26f0e24d09..d1fe314b59190 100644
--- a/clang-tools-extra/unittests/clang-doc/CMakeLists.txt
+++ b/clang-tools-extra/unittests/clang-doc/CMakeLists.txt
@@ -26,7 +26,6 @@ add_extra_unittest(ClangDocTests
   ClangDocTest.cpp
   GeneratorTest.cpp
   HTMLGeneratorTest.cpp
-  MDGeneratorTest.cpp
   MergeTest.cpp
   SerializeTest.cpp
   YAMLGeneratorTest.cpp
diff --git a/clang-tools-extra/unittests/clang-doc/MDGeneratorTest.cpp 
b/clang-tools-extra/unittests/clang-doc/MDGeneratorTest.cpp
deleted file mode 100644
index b4257cf65475d..0000000000000
--- a/clang-tools-extra/unittests/clang-doc/MDGeneratorTest.cpp
+++ /dev/null
@@ -1,428 +0,0 @@
-//===-- clang-doc/MDGeneratorTest.cpp 
-------------------------------------===//
-//
-// Part of the LLVM Project, under the Apache License v2.0 with LLVM 
Exceptions.
-// See https://llvm.org/LICENSE.txt for license information.
-// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
-//
-//===----------------------------------------------------------------------===//
-
-#include "ClangDocTest.h"
-#include "Generators.h"
-#include "Representation.h"
-#include "gtest/gtest.h"
-
-namespace clang {
-namespace doc {
-
-static std::unique_ptr<Generator> getMDGenerator() {
-  auto G = doc::findGeneratorByName("md");
-  if (!G)
-    return nullptr;
-  return std::move(G.get());
-}
-
-class MDGeneratorTest : public ClangDocContextTest {};
-
-TEST_F(MDGeneratorTest, emitNamespaceMD) {
-  NamespaceInfo I;
-  I.Name = "Namespace";
-  Reference Ns[] = {Reference(EmptySID, "A", InfoType::IT_namespace)};
-  I.Namespace = llvm::ArrayRef(Ns);
-
-  Reference NewNamespace(EmptySID, "ChildNamespace", InfoType::IT_namespace);
-  InfoNode<Reference> NewNamespaceNode(&NewNamespace);
-  I.Children.Namespaces.push_back(NewNamespaceNode);
-
-  Reference ChildStruct(EmptySID, "ChildStruct", InfoType::IT_record);
-  InfoNode<Reference> ChildStructNode(&ChildStruct);
-  I.Children.Records.push_back(ChildStructNode);
-
-  FunctionInfo F;
-  F.Name = "OneFunction";
-  F.Access = AccessSpecifier::AS_none;
-  InfoNode<FunctionInfo> FNode(&F);
-  I.Children.Functions.push_back(FNode);
-
-  EnumInfo E;
-  E.Name = "OneEnum";
-  InfoNode<EnumInfo> ENode(&E);
-  I.Children.Enums.push_back(ENode);
-
-  auto G = getMDGenerator();
-  assert(G);
-  std::string Buffer;
-  llvm::raw_string_ostream Actual(Buffer);
-  auto Err = G->generateDocForInfo(&I, Actual, getClangDocContext());
-  assert(!Err);
-  std::string Expected = R"raw(# namespace Namespace
-
-
-
-## Namespaces
-
-* [ChildNamespace](../ChildNamespace/index.md)
-
-
-## Records
-
-* [ChildStruct](../ChildStruct.md)
-
-
-## Functions
-
-### OneFunction
-
-* OneFunction()*
-
-
-
-## Enums
-
-| enum OneEnum |
-
-| Name | Value |
-
-
-)raw";
-  EXPECT_EQ(Expected, Actual.str());
-}
-
-TEST_F(MDGeneratorTest, emitRecordMD) {
-  RecordInfo I;
-  I.Name = "r";
-  Reference Ns[] = {Reference(EmptySID, "A", InfoType::IT_namespace)};
-  I.Namespace = llvm::ArrayRef(Ns);
-
-  I.DefLoc = Location(10, 10, "test.cpp");
-  Location Loc1(12, 12, "test.cpp");
-  InfoNode<Location> Loc1Node(&Loc1);
-  I.Loc.push_back(Loc1Node);
-
-  MemberTypeInfo M[] = {
-      MemberTypeInfo(TypeInfo("int"), "X", AccessSpecifier::AS_private)};
-  I.Members = llvm::ArrayRef(M);
-  I.TagType = TagTypeKind::Class;
-  Reference Parents[] = {Reference(EmptySID, "F", InfoType::IT_record)};
-  I.Parents = llvm::ArrayRef(Parents);
-  Reference VParents[] = {Reference(EmptySID, "G", InfoType::IT_record)};
-  I.VirtualParents = llvm::ArrayRef(VParents);
-
-  Reference ChildStruct(EmptySID, "ChildStruct", InfoType::IT_record);
-  InfoNode<Reference> ChildStructNode(&ChildStruct);
-  I.Children.Records.push_back(ChildStructNode);
-  FunctionInfo F;
-  F.Name = "OneFunction";
-  InfoNode<FunctionInfo> FNode(&F);
-  I.Children.Functions.push_back(FNode);
-
-  EnumInfo E;
-  E.Name = "OneEnum";
-  InfoNode<EnumInfo> ENode(&E);
-  I.Children.Enums.push_back(ENode);
-
-  auto G = getMDGenerator();
-  assert(G);
-  std::string Buffer;
-  llvm::raw_string_ostream Actual(Buffer);
-  auto Err = G->generateDocForInfo(&I, Actual, getClangDocContext());
-  assert(!Err);
-  std::string Expected = R"raw(# class r
-
-*Defined at test.cpp#10*
-
-Inherits from F, G
-
-
-
-## Members
-
-private int X
-
-
-
-## Records
-
-ChildStruct
-
-
-
-## Functions
-
-### OneFunction
-
-*public  OneFunction()*
-
-
-
-## Enums
-
-| enum OneEnum |
-
-| Name | Value |
-
-
-)raw";
-  EXPECT_EQ(Expected, Actual.str());
-}
-
-TEST_F(MDGeneratorTest, emitFunctionMD) {
-  FunctionInfo I;
-  I.Name = "f";
-  Reference Ns[] = {Reference(EmptySID, "A", InfoType::IT_namespace)};
-  I.Namespace = llvm::ArrayRef(Ns);
-
-  I.DefLoc = Location(10, 10, "test.cpp");
-  Location Loc1(12, 12, "test.cpp");
-  InfoNode<Location> Loc1Node(&Loc1);
-  I.Loc.push_back(Loc1Node);
-
-  I.Access = AccessSpecifier::AS_none;
-
-  I.ReturnType = TypeInfo("void");
-  FieldTypeInfo P[] = {FieldTypeInfo(TypeInfo("int"), "P")};
-  I.Params = llvm::ArrayRef(P);
-  I.IsMethod = true;
-  I.Parent = Reference(EmptySID, "Parent", InfoType::IT_record);
-
-  auto G = getMDGenerator();
-  assert(G);
-  std::string Buffer;
-  llvm::raw_string_ostream Actual(Buffer);
-  auto Err = G->generateDocForInfo(&I, Actual, getClangDocContext());
-  assert(!Err);
-  std::string Expected = R"raw(### f
-
-*void f(int P)*
-
-*Defined at test.cpp#10*
-
-)raw";
-
-  EXPECT_EQ(Expected, Actual.str());
-}
-
-TEST_F(MDGeneratorTest, emitEnumMD) {
-  EnumInfo I;
-  I.Name = "e";
-  Reference Ns[] = {Reference(EmptySID, "A", InfoType::IT_namespace)};
-  I.Namespace = llvm::ArrayRef(Ns);
-
-  I.DefLoc = Location(10, 10, "test.cpp");
-  Location Loc1(12, 12, "test.cpp");
-  InfoNode<Location> Loc1Node(&Loc1);
-  I.Loc.push_back(Loc1Node);
-
-  EnumValueInfo EV[] = {EnumValueInfo("X")};
-  I.Members = llvm::ArrayRef(EV);
-  I.Scoped = true;
-
-  auto G = getMDGenerator();
-  assert(G);
-  std::string Buffer;
-  llvm::raw_string_ostream Actual(Buffer);
-  auto Err = G->generateDocForInfo(&I, Actual, getClangDocContext());
-  assert(!Err);
-  std::string Expected = R"raw(| enum class e |
-
-| Name | Value |
-|---|---|
-| X | 0 |
-
-*Defined at test.cpp#10*
-
-)raw";
-
-  EXPECT_EQ(Expected, Actual.str());
-}
-
-TEST_F(MDGeneratorTest, emitCommentMD) {
-  FunctionInfo I;
-  I.Name = "f";
-
-  I.DefLoc = Location(10, 10, "test.cpp");
-  I.ReturnType = TypeInfo("void");
-  FieldTypeInfo PI[] = {FieldTypeInfo(TypeInfo("int"), "I"),
-                        FieldTypeInfo(TypeInfo("int"), "J")};
-  I.Params = llvm::ArrayRef(PI);
-  I.Access = AccessSpecifier::AS_none;
-
-  CommentInfo Top;
-  Top.Kind = CommentKind::CK_FullComment;
-
-  llvm::SmallVector<CommentInfo, 8> TopChildren;
-
-  // BlankLine
-  CommentInfo BlankLine;
-  BlankLine.Kind = CommentKind::CK_ParagraphComment;
-  CommentInfo BlankText;
-  BlankText.Kind = CommentKind::CK_TextComment;
-  CommentInfo BlankChildren[] = {std::move(BlankText)};
-  BlankLine.Children = BlankChildren;
-  TopChildren.push_back(std::move(BlankLine));
-
-  // Brief
-  CommentInfo Brief;
-  Brief.Kind = CommentKind::CK_ParagraphComment;
-  CommentInfo BriefText;
-  BriefText.Kind = CommentKind::CK_TextComment;
-  BriefText.Name = "ParagraphComment";
-  BriefText.Text = " Brief description.";
-  CommentInfo BriefChildren[] = {std::move(BriefText)};
-  Brief.Children = BriefChildren;
-  TopChildren.push_back(std::move(Brief));
-
-  // Extended
-  CommentInfo Extended;
-  Extended.Kind = CommentKind::CK_ParagraphComment;
-  CommentInfo ExtText1;
-  ExtText1.Kind = CommentKind::CK_TextComment;
-  ExtText1.Text = " Extended description that";
-  CommentInfo ExtText2;
-  ExtText2.Kind = CommentKind::CK_TextComment;
-  ExtText2.Text = " continues onto the next line.";
-  CommentInfo ExtChildren[] = {std::move(ExtText1), std::move(ExtText2)};
-  Extended.Children = ExtChildren;
-  TopChildren.push_back(std::move(Extended));
-
-  // HTML
-  CommentInfo HTML;
-  HTML.Kind = CommentKind::CK_ParagraphComment;
-  CommentInfo HtmlText1;
-  HtmlText1.Kind = CommentKind::CK_TextComment;
-  CommentInfo HtmlStart;
-  HtmlStart.Kind = CommentKind::CK_HTMLStartTagComment;
-  HtmlStart.Name = "ul";
-  StringRef Keys[] = {"class"};
-  StringRef Values[] = {"test"};
-  HtmlStart.AttrKeys = Keys;
-  HtmlStart.AttrValues = Values;
-  CommentInfo HtmlStartLi;
-  HtmlStartLi.Kind = CommentKind::CK_HTMLStartTagComment;
-  HtmlStartLi.Name = "li";
-  CommentInfo HtmlText2;
-  HtmlText2.Kind = CommentKind::CK_TextComment;
-  HtmlText2.Text = " Testing.";
-  CommentInfo HtmlEnd;
-  HtmlEnd.Kind = CommentKind::CK_HTMLEndTagComment;
-  HtmlEnd.Name = "ul";
-  HtmlEnd.SelfClosing = true;
-  CommentInfo HtmlChildren[] = {std::move(HtmlText1), std::move(HtmlStart),
-                                std::move(HtmlStartLi), std::move(HtmlText2),
-                                std::move(HtmlEnd)};
-  HTML.Children = HtmlChildren;
-  TopChildren.push_back(std::move(HTML));
-
-  // Verbatim
-  CommentInfo Verbatim;
-  Verbatim.Kind = CommentKind::CK_VerbatimBlockComment;
-  Verbatim.Name = "verbatim";
-  Verbatim.CloseName = "endverbatim";
-  CommentInfo VerbLine;
-  VerbLine.Kind = CommentKind::CK_VerbatimBlockLineComment;
-  VerbLine.Text = " The description continues.";
-  CommentInfo VerbChildren[] = {std::move(VerbLine)};
-  Verbatim.Children = VerbChildren;
-  TopChildren.push_back(std::move(Verbatim));
-
-  // ParamOut
-  CommentInfo ParamOut;
-  ParamOut.Kind = CommentKind::CK_ParamCommandComment;
-  ParamOut.Direction = "[out]";
-  ParamOut.ParamName = "I";
-  ParamOut.Explicit = true;
-  CommentInfo ParamOutPara;
-  ParamOutPara.Kind = CommentKind::CK_ParagraphComment;
-  CommentInfo ParamOutText1;
-  ParamOutText1.Kind = CommentKind::CK_TextComment;
-  CommentInfo ParamOutText2;
-  ParamOutText2.Kind = CommentKind::CK_TextComment;
-  ParamOutText2.Text = "is a parameter.";
-  CommentInfo ParamOutParaChildren[] = {std::move(ParamOutText1),
-                                        std::move(ParamOutText2)};
-  ParamOutPara.Children = ParamOutParaChildren;
-  CommentInfo ParamOutChildren[] = {std::move(ParamOutPara)};
-  ParamOut.Children = ParamOutChildren;
-  TopChildren.push_back(std::move(ParamOut));
-
-  // ParamIn
-  CommentInfo ParamIn;
-  ParamIn.Kind = CommentKind::CK_ParamCommandComment;
-  ParamIn.Direction = "[in]";
-  ParamIn.ParamName = "J";
-  CommentInfo ParamInPara;
-  ParamInPara.Kind = CommentKind::CK_ParagraphComment;
-  CommentInfo ParamInText1;
-  ParamInText1.Kind = CommentKind::CK_TextComment;
-  ParamInText1.Text = "is a parameter.";
-  CommentInfo ParamInText2;
-  ParamInText2.Kind = CommentKind::CK_TextComment;
-  CommentInfo ParamInParaChildren[] = {std::move(ParamInText1),
-                                       std::move(ParamInText2)};
-  ParamInPara.Children = ParamInParaChildren;
-  CommentInfo ParamInChildren[] = {std::move(ParamInPara)};
-  ParamIn.Children = ParamInChildren;
-  TopChildren.push_back(std::move(ParamIn));
-
-  // Return
-  CommentInfo Return;
-  Return.Kind = CommentKind::CK_BlockCommandComment;
-  Return.Name = "return";
-  Return.Explicit = true;
-  CommentInfo ReturnPara;
-  ReturnPara.Kind = CommentKind::CK_ParagraphComment;
-  CommentInfo ReturnText1;
-  ReturnText1.Kind = CommentKind::CK_TextComment;
-  ReturnText1.Text = "void";
-  CommentInfo ReturnParaChildren[] = {std::move(ReturnText1)};
-  ReturnPara.Children = ReturnParaChildren;
-  CommentInfo ReturnChildren[] = {std::move(ReturnPara)};
-  Return.Children = ReturnChildren;
-  TopChildren.push_back(std::move(Return));
-
-  Top.Children = TopChildren;
-
-  InfoNode<CommentInfo> TopNode(&Top);
-  I.Description.push_back(TopNode);
-
-  auto G = getMDGenerator();
-  assert(G);
-  std::string Buffer;
-  llvm::raw_string_ostream Actual(Buffer);
-  auto Err = G->generateDocForInfo(&I, Actual, getClangDocContext());
-  assert(!Err);
-  std::string Expected =
-      R"raw(### f
-
-*void f(int I, int J)*
-
-*Defined at test.cpp#10*
-
-
-
- Brief description.
-
- Extended description that continues onto the next line.
-
-<ul "class=test">
-
-<li>
-
- Testing.</ul>
-
-
-
- The description continues.
-
-**I** [out] is a parameter.
-
-**J** is a parameter.
-
-**return** void
-
-)raw";
-
-  EXPECT_EQ(Expected, Actual.str());
-}
-
-} // namespace doc
-} // namespace clang

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

Reply via email to