[clang-tools-extra] [Clang-doc] Display enum comments in HTML (PR #183085)

Samrudh Nelli via cfe-commits cfe-commits at lists.llvm.org
Tue Mar 10 13:51:17 PDT 2026


https://github.com/SamrudhNelli updated https://github.com/llvm/llvm-project/pull/183085

>From decb0de454f90ea04c7fdbfc6ba77ed06dd496ec Mon Sep 17 00:00:00 2001
From: Samrudh Nelli <samrudhnelli at gmail.com>
Date: Tue, 24 Feb 2026 21:10:19 +0530
Subject: [PATCH 01/39] [Clang-doc] Display enum comments and member values in
 html/md

---
 clang-tools-extra/clang-doc/JSONGenerator.cpp | 16 ++++++++++
 clang-tools-extra/clang-doc/MDGenerator.cpp   | 30 +++++++++++++++++--
 .../clang-doc/assets/enum-template.mustache   |  2 ++
 3 files changed, 46 insertions(+), 2 deletions(-)

diff --git a/clang-tools-extra/clang-doc/JSONGenerator.cpp b/clang-tools-extra/clang-doc/JSONGenerator.cpp
index d710078993403..0e35990d0017d 100644
--- a/clang-tools-extra/clang-doc/JSONGenerator.cpp
+++ b/clang-tools-extra/clang-doc/JSONGenerator.cpp
@@ -592,6 +592,22 @@ void JSONGenerator::serializeInfo(const EnumValueInfo &I, Object &Obj) {
     Obj["ValueExpr"] = I.ValueExpr;
   else
     Obj["Value"] = I.Value;
+  if (!I.Description.empty()) {
+    json::Value CommentsArray = Array();
+    auto &CommentsArrayRef = *CommentsArray.getAsArray();
+    Object TempObj, ChildJson;
+    for (const auto &Child : I.Description) {
+      for (const auto &CI : Child.Children) {
+        ChildJson = serializeComment(*CI, TempObj);
+        if (!ChildJson.empty()) {
+          CommentsArrayRef.push_back(std::move(ChildJson));
+        }
+      }
+    }
+    if (!CommentsArrayRef.empty()) {
+      Obj["Description"] = CommentsArray;
+    }
+  }
 }
 
 void JSONGenerator::serializeInfo(const EnumInfo &I, json::Object &Obj) {
diff --git a/clang-tools-extra/clang-doc/MDGenerator.cpp b/clang-tools-extra/clang-doc/MDGenerator.cpp
index 60a880d211884..779a660e1550d 100644
--- a/clang-tools-extra/clang-doc/MDGenerator.cpp
+++ b/clang-tools-extra/clang-doc/MDGenerator.cpp
@@ -67,6 +67,23 @@ static void writeSourceFileRef(const ClangDocContext &CDCtx, const Location &L,
   OS << "\n\n";
 }
 
+static std::string genRawText(const std::vector<CommentInfo> &Comments) {
+  std::string Result;
+  std::queue<const CommentInfo *> Q;
+  for (const auto &CI : Comments)
+    Q.push(&CI);
+  const CommentInfo *Comment;
+  while (Q.size()) {
+    Comment = Q.front();
+    Q.pop();
+    if (!Comment->Text.empty())
+      Result += Comment->Text;
+    for (const auto &CI : Comment->Children)
+      Q.push(CI.get());
+  }
+  return Result;
+}
+
 static void maybeWriteSourceFileRef(llvm::raw_ostream &OS,
                                     const ClangDocContext &CDCtx,
                                     const std::optional<Location> &DefLoc) {
@@ -165,11 +182,20 @@ static void genMarkdown(const ClangDocContext &CDCtx, const EnumInfo &I,
   }
   OS << "|\n\n" << "--\n\n";
 
+  OS << "| Name | Value | Comments |\n\n";
   std::string Buffer;
   llvm::raw_string_ostream Members(Buffer);
   if (!I.Members.empty())
-    for (const auto &N : I.Members)
-      Members << "| " << N.Name << " |\n";
+    for (const auto &N : I.Members) {
+      Members << "| " << N.Name << " ";
+      if (!N.Value.empty())
+        Members << "| " << N.Value << " ";
+      std::string RawComment = genRawText(N.Description);
+      RawComment.erase(0, RawComment.find_first_not_of(" \t\r\n"));
+      RawComment.erase(RawComment.find_last_not_of(" \t\r\n") + 1);
+      Members << "| " << (RawComment.empty() ? "--" : RawComment) << " ";
+      Members << "|\n";
+    }
   writeLine(Members.str(), OS);
 
   maybeWriteSourceFileRef(OS, CDCtx, I.DefLoc);
diff --git a/clang-tools-extra/clang-doc/assets/enum-template.mustache b/clang-tools-extra/clang-doc/assets/enum-template.mustache
index d88f88cc30cee..940a6e2c91575 100644
--- a/clang-tools-extra/clang-doc/assets/enum-template.mustache
+++ b/clang-tools-extra/clang-doc/assets/enum-template.mustache
@@ -15,6 +15,7 @@
             <tr>
                 <th>Name</th>
                 <th>Value</th>
+                <th>Comments</th>
             </tr>
             {{#Members}}
             <tr>
@@ -26,6 +27,7 @@
                 {{^Value}}
                 <td>{{ValueExpr}}</td>
                 {{/Value}}
+                <td>{{#Description}}{{>Comments}}{{/Description}}{{^Description}} -- {{/Description}}</td>
             </tr>
             {{/Members}}
         </tbody>

>From e5c900ee8ed3952ec48a22f1675e9162795eb02a Mon Sep 17 00:00:00 2001
From: Samrudh Nelli <samrudhnelli at gmail.com>
Date: Wed, 25 Feb 2026 16:32:53 +0530
Subject: [PATCH 02/39] display the comment column only if atleast any one
 member has comments

---
 clang-tools-extra/clang-doc/JSONGenerator.cpp | 33 ++++++++++++++++++-
 clang-tools-extra/clang-doc/MDGenerator.cpp   | 22 ++++++++++---
 .../clang-doc/assets/enum-template.mustache   |  4 +--
 3 files changed, 51 insertions(+), 8 deletions(-)

diff --git a/clang-tools-extra/clang-doc/JSONGenerator.cpp b/clang-tools-extra/clang-doc/JSONGenerator.cpp
index 0e35990d0017d..ce420ea50271c 100644
--- a/clang-tools-extra/clang-doc/JSONGenerator.cpp
+++ b/clang-tools-extra/clang-doc/JSONGenerator.cpp
@@ -78,6 +78,29 @@ class JSONGenerator : public Generator {
 
 const char *JSONGenerator::Format = "json";
 
+static void serializeInfo(const ConstraintInfo &I, Object &Obj);
+static void serializeInfo(const RecordInfo &I, Object &Obj,
+                          const std::optional<StringRef> &RepositoryUrl,
+                          const std::optional<StringRef> &RepositoryLinePrefix);
+
+static void serializeReference(const Reference &Ref, Object &ReferenceObj);
+
+template <typename Container, typename SerializationFunc>
+static void serializeArray(
+    const Container &Records, Object &Obj, const StringRef Key,
+    SerializationFunc SerializeInfo, const StringRef EndKey = "End",
+    function_ref<void(Object &)> UpdateJson = [](Object &Obj) {});
+
+// Convenience lambda to pass to serializeArray.
+// If a serializeInfo needs a RepositoryUrl, create a local lambda that captures
+// the optional.
+static auto SerializeInfoLambda = [](const auto &Info, Object &Object) {
+  serializeInfo(Info, Object);
+};
+static auto SerializeReferenceLambda = [](const auto &Ref, Object &Object) {
+  serializeReference(Ref, Object);
+};
+
 static void insertNonEmpty(StringRef Key, StringRef Value, Object &Obj) {
   if (!Value.empty())
     Obj[Key] = Value;
@@ -624,7 +647,15 @@ void JSONGenerator::serializeInfo(const EnumInfo &I, json::Object &Obj) {
   }
 
   if (!I.Members.empty())
-    serializeArray(I.Members, Obj, "Members", serializeInfoLambda());
+    serializeArray(I.Members, Obj, "Members", SerializeInfoLambda, "End",
+                   [&I](Object &JsonObj) {
+                     for (const auto &Member : I.Members) {
+                       if (!Member.Description.empty()) {
+                         JsonObj["HasComments"] = true;
+                         break;
+                       }
+                     }
+                   });
 }
 
 void JSONGenerator::serializeInfo(const TypedefInfo &I, json::Object &Obj) {
diff --git a/clang-tools-extra/clang-doc/MDGenerator.cpp b/clang-tools-extra/clang-doc/MDGenerator.cpp
index 779a660e1550d..c42e41cda0c7f 100644
--- a/clang-tools-extra/clang-doc/MDGenerator.cpp
+++ b/clang-tools-extra/clang-doc/MDGenerator.cpp
@@ -182,7 +182,17 @@ static void genMarkdown(const ClangDocContext &CDCtx, const EnumInfo &I,
   }
   OS << "|\n\n" << "--\n\n";
 
-  OS << "| Name | Value | Comments |\n\n";
+  OS << "| Name | Value |";
+  bool HasComments = false;
+  for (const auto &Member : I.Members) {
+    if (!Member.Description.empty()) {
+      HasComments = true;
+      break;
+    }
+  }
+  if (HasComments)
+    OS << " Comments |";
+  OS << "\n\n";
   std::string Buffer;
   llvm::raw_string_ostream Members(Buffer);
   if (!I.Members.empty())
@@ -190,10 +200,12 @@ static void genMarkdown(const ClangDocContext &CDCtx, const EnumInfo &I,
       Members << "| " << N.Name << " ";
       if (!N.Value.empty())
         Members << "| " << N.Value << " ";
-      std::string RawComment = genRawText(N.Description);
-      RawComment.erase(0, RawComment.find_first_not_of(" \t\r\n"));
-      RawComment.erase(RawComment.find_last_not_of(" \t\r\n") + 1);
-      Members << "| " << (RawComment.empty() ? "--" : RawComment) << " ";
+      if (HasComments) {
+        std::string RawComment = genRawText(N.Description);
+        RawComment.erase(0, RawComment.find_first_not_of(" \t\r\n"));
+        RawComment.erase(RawComment.find_last_not_of(" \t\r\n") + 1);
+        Members << "| " << (RawComment.empty() ? "--" : RawComment) << " ";
+      }
       Members << "|\n";
     }
   writeLine(Members.str(), OS);
diff --git a/clang-tools-extra/clang-doc/assets/enum-template.mustache b/clang-tools-extra/clang-doc/assets/enum-template.mustache
index 940a6e2c91575..73538d36979f9 100644
--- a/clang-tools-extra/clang-doc/assets/enum-template.mustache
+++ b/clang-tools-extra/clang-doc/assets/enum-template.mustache
@@ -15,7 +15,7 @@
             <tr>
                 <th>Name</th>
                 <th>Value</th>
-                <th>Comments</th>
+                {{#HasComments}}<th>Comments</th>{{/HasComments}}
             </tr>
             {{#Members}}
             <tr>
@@ -27,7 +27,7 @@
                 {{^Value}}
                 <td>{{ValueExpr}}</td>
                 {{/Value}}
-                <td>{{#Description}}{{>Comments}}{{/Description}}{{^Description}} -- {{/Description}}</td>
+                {{#HasComments}}<td>{{#Description}}{{>Comments}}{{/Description}}{{^Description}} -- {{/Description}}</td>{{/HasComments}}
             </tr>
             {{/Members}}
         </tbody>

>From f8b69d881a0774a567e1ea966e56ef3549083baf Mon Sep 17 00:00:00 2001
From: Samrudh Nelli <samrudhnelli at gmail.com>
Date: Wed, 25 Feb 2026 17:00:02 +0530
Subject: [PATCH 03/39] update tests

---
 clang-tools-extra/clang-doc/MDGenerator.cpp   | 25 ++++++++++---------
 .../clang-doc/assets/enum-template.mustache   |  4 ++-
 clang-tools-extra/test/clang-doc/enum.cpp     | 14 ++++++++---
 .../test/clang-doc/mustache-index.cpp         |  2 +-
 .../unittests/clang-doc/MDGeneratorTest.cpp   |  4 ++-
 5 files changed, 31 insertions(+), 18 deletions(-)

diff --git a/clang-tools-extra/clang-doc/MDGenerator.cpp b/clang-tools-extra/clang-doc/MDGenerator.cpp
index c42e41cda0c7f..744ceed5d4138 100644
--- a/clang-tools-extra/clang-doc/MDGenerator.cpp
+++ b/clang-tools-extra/clang-doc/MDGenerator.cpp
@@ -182,20 +182,20 @@ static void genMarkdown(const ClangDocContext &CDCtx, const EnumInfo &I,
   }
   OS << "|\n\n" << "--\n\n";
 
-  OS << "| Name | Value |";
-  bool HasComments = false;
-  for (const auto &Member : I.Members) {
-    if (!Member.Description.empty()) {
-      HasComments = true;
-      break;
-    }
-  }
-  if (HasComments)
-    OS << " Comments |";
-  OS << "\n\n";
   std::string Buffer;
   llvm::raw_string_ostream Members(Buffer);
-  if (!I.Members.empty())
+  if (!I.Members.empty()) {
+    OS << "| Name | Value |";
+    bool HasComments = false;
+    for (const auto &Member : I.Members) {
+      if (!Member.Description.empty()) {
+        HasComments = true;
+        break;
+      }
+    }
+    if (HasComments)
+      OS << " Comments |";
+    OS << "\n\n";
     for (const auto &N : I.Members) {
       Members << "| " << N.Name << " ";
       if (!N.Value.empty())
@@ -208,6 +208,7 @@ static void genMarkdown(const ClangDocContext &CDCtx, const EnumInfo &I,
       }
       Members << "|\n";
     }
+  }
   writeLine(Members.str(), OS);
 
   maybeWriteSourceFileRef(OS, CDCtx, I.DefLoc);
diff --git a/clang-tools-extra/clang-doc/assets/enum-template.mustache b/clang-tools-extra/clang-doc/assets/enum-template.mustache
index 73538d36979f9..93d128d449470 100644
--- a/clang-tools-extra/clang-doc/assets/enum-template.mustache
+++ b/clang-tools-extra/clang-doc/assets/enum-template.mustache
@@ -27,7 +27,9 @@
                 {{^Value}}
                 <td>{{ValueExpr}}</td>
                 {{/Value}}
-                {{#HasComments}}<td>{{#Description}}{{>Comments}}{{/Description}}{{^Description}} -- {{/Description}}</td>{{/HasComments}}
+                {{#HasComments}}
+                <td>{{#Description}}{{>Comments}}{{/Description}}{{^Description}} -- {{/Description}}</td>
+                {{/HasComments}}
             </tr>
             {{/Members}}
         </tbody>
diff --git a/clang-tools-extra/test/clang-doc/enum.cpp b/clang-tools-extra/test/clang-doc/enum.cpp
index c5f939550320d..6736816b95988 100644
--- a/clang-tools-extra/test/clang-doc/enum.cpp
+++ b/clang-tools-extra/test/clang-doc/enum.cpp
@@ -319,18 +319,25 @@ class Animals {
 // HTML-ANIMAL-NEXT:                 <tr>
 // HTML-ANIMAL-NEXT:                     <th>Name</th>
 // HTML-ANIMAL-NEXT:                     <th>Value</th>
+// HTML-ANIMAL-NEXT:                     <th>Comments</th>
 // HTML-ANIMAL-NEXT:                 </tr>
 // HTML-ANIMAL-NEXT:                 <tr>
 // HTML-ANIMAL-NEXT:                     <td>Dog</td>
 // HTML-ANIMAL-NEXT:                     <td>0</td>
+// HTML-ANIMAL-NEXT:                     <td> Man's best friend
+// HTML-ANIMAL-NEXT:                     </td>
 // HTML-ANIMAL-NEXT:                 </tr>
 // HTML-ANIMAL-NEXT:                 <tr>
 // HTML-ANIMAL-NEXT:                     <td>Cat</td>
 // HTML-ANIMAL-NEXT:                     <td>1</td>
+// HTML-ANIMAL-NEXT:                     <td>  Man's other best friend
+// HTML-ANIMAL-NEXT:                     </td>
 // HTML-ANIMAL-NEXT:                 </tr>
 // HTML-ANIMAL-NEXT:                 <tr>
 // HTML-ANIMAL-NEXT:                     <td>Iguana</td>
 // HTML-ANIMAL-NEXT:                     <td>2</td>
+// HTML-ANIMAL-NEXT:                     <td> A lizard
+// HTML-ANIMAL-NEXT:                     </td>
 // HTML-ANIMAL-NEXT:                 </tr>
 // HTML-ANIMAL-NEXT:             </tbody>
 // HTML-ANIMAL-NEXT:         </table>
@@ -347,9 +354,10 @@ class Animals {
 // MD-ANIMAL: ## Enums
 // MD-ANIMAL: | enum AnimalType |
 // MD-ANIMAL: --
-// MD-ANIMAL: | Dog |
-// MD-ANIMAL: | Cat |
-// MD-ANIMAL: | Iguana |
+// MD-ANIMAL: | Name | Value | Comments |
+// 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: **brief** specify what animal the class is
 
 // MD-MUSTACHE-ANIMAL: # class Animals
diff --git a/clang-tools-extra/test/clang-doc/mustache-index.cpp b/clang-tools-extra/test/clang-doc/mustache-index.cpp
index 6e308ada51a45..7c4c65894fc6e 100644
--- a/clang-tools-extra/test/clang-doc/mustache-index.cpp
+++ b/clang-tools-extra/test/clang-doc/mustache-index.cpp
@@ -39,7 +39,7 @@ class Foo;
 // CHECK-NEXT:                      <tr>
 // CHECK-NEXT:                          <th>Name</th>
 // CHECK-NEXT:                          <th>Value</th>
-// CHECK-NEXT:                      </tr>
+// CHECK:                           </tr>
 // CHECK-NEXT:                      <tr>
 // CHECK-NEXT:                          <td>RED</td>
 // CHECK-NEXT:                          <td>0</td>
diff --git a/clang-tools-extra/unittests/clang-doc/MDGeneratorTest.cpp b/clang-tools-extra/unittests/clang-doc/MDGeneratorTest.cpp
index da22d00835126..063c8f4cefc54 100644
--- a/clang-tools-extra/unittests/clang-doc/MDGeneratorTest.cpp
+++ b/clang-tools-extra/unittests/clang-doc/MDGeneratorTest.cpp
@@ -199,7 +199,9 @@ TEST_F(MDGeneratorTest, emitEnumMD) {
 
 --
 
-| X |
+| Name | Value |
+
+| X | 0 |
 
 
 *Defined at test.cpp#10*

>From 03cfefe147a373eaf3797ba528834a207b537de4 Mon Sep 17 00:00:00 2001
From: Samrudh Nelli <samrudhnelli at gmail.com>
Date: Thu, 26 Feb 2026 01:55:41 +0530
Subject: [PATCH 04/39] update /test/clang-doc/enum.cpp

---
 clang-tools-extra/test/clang-doc/enum.cpp | 104 ++++++++++++++++------
 1 file changed, 75 insertions(+), 29 deletions(-)

diff --git a/clang-tools-extra/test/clang-doc/enum.cpp b/clang-tools-extra/test/clang-doc/enum.cpp
index 6736816b95988..2977bb27059e9 100644
--- a/clang-tools-extra/test/clang-doc/enum.cpp
+++ b/clang-tools-extra/test/clang-doc/enum.cpp
@@ -18,7 +18,6 @@
 // RUN: FileCheck %s < %t/Vehicles/index.md --check-prefix=MD-VEHICLES-LINE
 // RUN: FileCheck %s < %t/Vehicles/index.md --check-prefix=MD-VEHICLES
 
-// COM: FIXME: Add enum value comments to template
 
 // RUN: clang-doc --format=md_mustache --doxygen --output=%t --executor=standalone %s
 // RUN: FileCheck %s < %t/md/GlobalNamespace/index.md --check-prefix=MD-MUSTACHE-INDEX-LINE
@@ -43,9 +42,10 @@ enum Color {
 // MD-INDEX: ## Enums
 // MD-INDEX: | enum Color |
 // MD-INDEX: --
-// MD-INDEX: | Red |
-// MD-INDEX: | Green |
-// MD-INDEX: | Blue |
+// MD-INDEX: | Name | Value | Comments |
+// MD-INDEX: | Red | 0 | Comment 1 |
+// MD-INDEX: | Green | 1 | Comment 2 |
+// MD-INDEX: | Blue | 2 | Comment 3 |
 // MD-INDEX: **brief** For specifying RGB colors
 
 // HTML-INDEX-LABEL:  <div id="{{([0-9A-F]{40})}}" class="delimiter-container">
@@ -57,18 +57,25 @@ enum Color {
 // HTML-INDEX-NEXT:             <tr>
 // HTML-INDEX-NEXT:                 <th>Name</th>
 // HTML-INDEX-NEXT:                 <th>Value</th>
+// HTML-INDEX-NEXT:                 <th>Comments</th>
 // HTML-INDEX-NEXT:             </tr>
 // HTML-INDEX-NEXT:             <tr>
 // HTML-INDEX-NEXT:                 <td>Red</td>
 // HTML-INDEX-NEXT:                 <td>0</td>
+// HTML-INDEX-NEXT:                 <td> Comment 1
+// HTML-INDEX-NEXT:                 </td>
 // HTML-INDEX-NEXT:             </tr>
 // HTML-INDEX-NEXT:             <tr>
 // HTML-INDEX-NEXT:                 <td>Green</td>
 // HTML-INDEX-NEXT:                 <td>1</td>
+// HTML-INDEX-NEXT:                 <td> Comment 2
+// HTML-INDEX-NEXT:                 </td>
 // HTML-INDEX-NEXT:             </tr>
 // HTML-INDEX-NEXT:             <tr>
 // HTML-INDEX-NEXT:                 <td>Blue</td>
 // HTML-INDEX-NEXT:                 <td>2</td>
+// HTML-INDEX-NEXT:                 <td> Comment 3
+// HTML-INDEX-NEXT:                 </td>
 // HTML-INDEX-NEXT:             </tr>
 // HTML-INDEX-NEXT:         </tbody>
 // HTML-INDEX-NEXT:     </table>
@@ -105,9 +112,10 @@ enum class Shapes {
 };
 // MD-INDEX: | enum class Shapes |
 // MD-INDEX: --
-// MD-INDEX: | Circle |
-// MD-INDEX: | Rectangle |
-// MD-INDEX: | Triangle |
+// MD-INDEX: | Name | Value | Comments |
+// MD-INDEX: | Circle | 0 | Comment 1 |
+// MD-INDEX: | Rectangle | 1 | Comment 2 |
+// MD-INDEX: | Triangle | 2 | Comment 3 |
 // MD-INDEX: **brief** Shape Types
 
 // HTML-INDEX-LABEL:  <div id="{{([0-9A-F]{40})}}" class="delimiter-container">
@@ -119,18 +127,25 @@ enum class Shapes {
 // HTML-INDEX-NEXT:             <tr>
 // HTML-INDEX-NEXT:                 <th>Name</th>
 // HTML-INDEX-NEXT:                 <th>Value</th>
+// HTML-INDEX-NEXT:                 <th>Comments</th>
 // HTML-INDEX-NEXT:             </tr>
 // HTML-INDEX-NEXT:             <tr>
 // HTML-INDEX-NEXT:                 <td>Circle</td>
 // HTML-INDEX-NEXT:                 <td>0</td>
+// HTML-INDEX-NEXT:                 <td> Comment 1
+// HTML-INDEX-NEXT:                 </td>
 // HTML-INDEX-NEXT:             </tr>
 // HTML-INDEX-NEXT:             <tr>
 // HTML-INDEX-NEXT:                 <td>Rectangle</td>
 // HTML-INDEX-NEXT:                 <td>1</td>
+// HTML-INDEX-NEXT:                 <td> Comment 2
+// HTML-INDEX-NEXT:                 </td>
 // HTML-INDEX-NEXT:             </tr>
 // HTML-INDEX-NEXT:             <tr>
 // HTML-INDEX-NEXT:                 <td>Triangle</td>
 // HTML-INDEX-NEXT:                 <td>2</td>
+// HTML-INDEX-NEXT:                 <td> Comment 3
+// HTML-INDEX-NEXT:                 </td>
 // HTML-INDEX-NEXT:             </tr>
 // HTML-INDEX-NEXT:         </tbody>
 // HTML-INDEX-NEXT:     </table>
@@ -156,9 +171,10 @@ enum Size : uint8_t {
 
 // MD-INDEX: | enum Size : uint8_t |
 // MD-INDEX: --
-// MD-INDEX: | Small |
-// MD-INDEX: | Medium |
-// MD-INDEX: | Large |
+// MD-INDEX: | Name | Value | Comments |
+// MD-INDEX: | Small | 0 | A pearl |
+// MD-INDEX: | Medium | 1 | A tennis ball |
+// MD-INDEX: | Large | 2 | A football |
 // MD-INDEX: **brief** Specify the size
 
 // HTML-INDEX-LABEL:   <div id="{{([0-9A-F]{40})}}" class="delimiter-container">
@@ -170,18 +186,25 @@ enum Size : uint8_t {
 // HTML-INDEX-NEXT:             <tr>
 // HTML-INDEX-NEXT:                 <th>Name</th>
 // HTML-INDEX-NEXT:                 <th>Value</th>
+// HTML-INDEX-NEXT:                 <th>Comments</th>
 // HTML-INDEX-NEXT:             </tr>
 // HTML-INDEX-NEXT:             <tr>
 // HTML-INDEX-NEXT:                 <td>Small</td>
 // HTML-INDEX-NEXT:                 <td>0</td>
+// HTML-INDEX-NEXT:                 <td> A pearl
+// HTML-INDEX-NEXT:                 </td>
 // HTML-INDEX-NEXT:             </tr>
 // HTML-INDEX-NEXT:             <tr>
 // HTML-INDEX-NEXT:                 <td>Medium</td>
 // HTML-INDEX-NEXT:                 <td>1</td>
+// HTML-INDEX-NEXT:                 <td> A tennis ball
+// HTML-INDEX-NEXT:                 </td>
 // HTML-INDEX-NEXT:             </tr>
 // HTML-INDEX-NEXT:             <tr>
 // HTML-INDEX-NEXT:                 <td>Large</td>
 // HTML-INDEX-NEXT:                 <td>2</td>
+// HTML-INDEX-NEXT:                 <td> A football
+// HTML-INDEX-NEXT:                 </td>
 // HTML-INDEX-NEXT:             </tr>
 // HTML-INDEX-NEXT:         </tbody>
 // HTML-INDEX-NEXT:     </table>
@@ -190,7 +213,7 @@ enum Size : uint8_t {
 // HTML-INDEX-NEXT:           <p>Specify the size</p>
 // HTML-INDEX-NEXT:       </div>
 // HTML-INDEX-NEXT:     </div>
-// HTML-INDEX-NEXT:     <p>Defined at line [[@LINE-44]] of file {{.*}}clang-tools-extra{{[\/]}}test{{[\/]}}clang-doc{{[\/]}}enum.cpp</p>
+// HTML-INDEX-NEXT:     <p>Defined at line [[@LINE-52]] of file {{.*}}clang-tools-extra{{[\/]}}test{{[\/]}}clang-doc{{[\/]}}enum.cpp</p>
 // HTML-INDEX-NEXT:   </div>
 
 /**
@@ -204,7 +227,8 @@ enum : long long {
 
 // MD-INDEX: | enum (unnamed) : long long |
 // MD-INDEX: --
-// MD-INDEX: | BigVal |
+// MD-INDEX: | Name | Value | Comments |
+// MD-INDEX: | BigVal | 999999999999 | A very large value |
 // MD-INDEX: **brief** Very long number
 
 // HTML-INDEX-LABEL:  <div id="{{([0-9A-F]{40})}}" class="delimiter-container">
@@ -216,10 +240,13 @@ enum : long long {
 // HTML-INDEX-NEXT:             <tr>
 // HTML-INDEX-NEXT:                 <th>Name</th>
 // HTML-INDEX-NEXT:                 <th>Value</th>
+// HTML-INDEX-NEXT:                 <th>Comments</th>
 // HTML-INDEX-NEXT:             </tr>
 // HTML-INDEX-NEXT:             <tr>
 // HTML-INDEX-NEXT:                 <td>BigVal</td>
 // HTML-INDEX-NEXT:                 <td>999999999999</td>
+// HTML-INDEX-NEXT:                 <td> A very large value
+// HTML-INDEX-NEXT:                 </td>
 // HTML-INDEX-NEXT:             </tr>
 // HTML-INDEX-NEXT:         </tbody>
 // HTML-INDEX-NEXT:     </table>
@@ -228,7 +255,7 @@ enum : long long {
 // HTML-INDEX-NEXT:           <p>Very long number</p>
 // HTML-INDEX-NEXT:       </div>
 // HTML-INDEX-NEXT:     </div>
-// HTML-INDEX-NEXT:     <p>Defined at line [[@LINE-32]] of file {{.*}}clang-tools-extra{{[\/]}}test{{[\/]}}clang-doc{{[\/]}}enum.cpp</p>
+// HTML-INDEX-NEXT:     <p>Defined at line [[@LINE-36]] of file {{.*}}clang-tools-extra{{[\/]}}test{{[\/]}}clang-doc{{[\/]}}enum.cpp</p>
 // HTML-INDEX-NEXT:   </div>
 
 class FilePermissions {
@@ -241,17 +268,18 @@ class FilePermissions {
   enum {
   // MD-PERM-LINE: *Defined at {{.*}}clang-tools-extra{{[\/]}}test{{[\/]}}clang-doc{{[\/]}}enum.cpp#[[@LINE-1]]*
   // HTML-PERM-LINE: <p>Defined at line [[@LINE-2]] of file {{.*}}clang-tools-extra{{[\/]}}test{{[\/]}}clang-doc{{[\/]}}enum.cpp</p>
-    Read    = 1,     ///> Permission to READ r
-    Write   = 2,     ///> Permission to WRITE w
-    Execute = 4      ///> Permission to EXECUTE x
+    Read    = 1,     ///< Permission to READ r
+    Write   = 2,     ///< Permission to WRITE w
+    Execute = 4      ///< Permission to EXECUTE x
   };
 };
 
 // MD-PERM: | enum (unnamed) |
 // MD-PERM: --
-// MD-PERM: | Read |
-// MD-PERM: | Write |
-// MD-PERM: | Execute |
+// MD-PERM: | Name | Value | Comments |
+// 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
 
 // HTML-PERM-LABEL:  <section id="Enums" class="section-container">
@@ -265,18 +293,25 @@ class FilePermissions {
 // HTML-PERM-NEXT:               <tr>
 // HTML-PERM-NEXT:                   <th>Name</th>
 // HTML-PERM-NEXT:                   <th>Value</th>
+// HTML-PERM-NEXT:                   <th>Comments</th>
 // HTML-PERM-NEXT:               </tr>
 // HTML-PERM-NEXT:               <tr>
 // HTML-PERM-NEXT:                   <td>Read</td>
 // HTML-PERM-NEXT:                   <td>1</td>
+// HTML-PERM-NEXT:                   <td> Permission to READ r
+// HTML-PERM-NEXT:                   </td>
 // HTML-PERM-NEXT:               </tr>
 // HTML-PERM-NEXT:               <tr>
 // HTML-PERM-NEXT:                   <td>Write</td>
 // HTML-PERM-NEXT:                   <td>2</td>
+// HTML-PERM-NEXT:                   <td> Permission to WRITE w
+// HTML-PERM-NEXT:                   </td>
 // HTML-PERM-NEXT:               </tr>
 // HTML-PERM-NEXT:               <tr>
 // HTML-PERM-NEXT:                   <td>Execute</td>
 // HTML-PERM-NEXT:                   <td>4</td>
+// HTML-PERM-NEXT:                   <td> Permission to EXECUTE x
+// HTML-PERM-NEXT:                   </td>
 // HTML-PERM-NEXT:               </tr>
 // HTML-PERM-NEXT:           </tbody>
 // HTML-PERM-NEXT:       </table>
@@ -285,7 +320,7 @@ class FilePermissions {
 // HTML-PERM-NEXT:             <p>File permission flags</p>
 // HTML-PERM-NEXT:         </div>
 // HTML-PERM-NEXT:       </div>
-// HTML-PERM-NEXT:         <p>Defined at line [[@LINE-47]] of file {{.*}}clang-tools-extra{{[\/]}}test{{[\/]}}clang-doc{{[\/]}}enum.cpp</p>
+// HTML-PERM-NEXT:         <p>Defined at line [[@LINE-55]] of file {{.*}}clang-tools-extra{{[\/]}}test{{[\/]}}clang-doc{{[\/]}}enum.cpp</p>
 // HTML-PERM-NEXT:     </div>
 // HTML-PERM-NEXT:   </section>
 
@@ -389,10 +424,11 @@ enum Car {
 // MD-VEHICLES: ## Enums
 // MD-VEHICLES: | enum Car |
 // MD-VEHICLES: --
-// MD-VEHICLES: | Sedan |
-// MD-VEHICLES: | SUV |
-// MD-VEHICLES: | Pickup |
-// MD-VEHICLES: | Hatchback |
+// MD-VEHICLES: | Name | Value | Comments |
+// MD-VEHICLES: | Sedan | 0 | Comment 1 |
+// MD-VEHICLES: | SUV | 1 | Comment 2 |
+// MD-VEHICLES: | Pickup | 2 | Comment 3 |
+// MD-VEHICLES: | Hatchback | 3 | Comment 4 |
 // MD-VEHICLES: **brief** specify type of car
 
 // HTML-VEHICLES-LABEL:   <div id="{{([0-9A-F]{40})}}" class="delimiter-container">
@@ -404,22 +440,31 @@ enum Car {
 // HTML-VEHICLES-NEXT:              <tr>
 // HTML-VEHICLES-NEXT:                  <th>Name</th>
 // HTML-VEHICLES-NEXT:                  <th>Value</th>
+// HTML-VEHICLES-NEXT:                  <th>Comments</th>
 // HTML-VEHICLES-NEXT:              </tr>
 // HTML-VEHICLES-NEXT:              <tr>
 // HTML-VEHICLES-NEXT:                  <td>Sedan</td>
 // HTML-VEHICLES-NEXT:                  <td>0</td>
+// HTML-VEHICLES-NEXT:                  <td> Comment 1
+// HTML-VEHICLES-NEXT:                  </td>
 // HTML-VEHICLES-NEXT:              </tr>
 // HTML-VEHICLES-NEXT:              <tr>
 // HTML-VEHICLES-NEXT:                  <td>SUV</td>
 // HTML-VEHICLES-NEXT:                  <td>1</td>
+// HTML-VEHICLES-NEXT:                  <td> Comment 2
+// HTML-VEHICLES-NEXT:                  </td>
 // HTML-VEHICLES-NEXT:              </tr>
 // HTML-VEHICLES-NEXT:              <tr>
 // HTML-VEHICLES-NEXT:                  <td>Pickup</td>
 // HTML-VEHICLES-NEXT:                  <td>2</td>
+// HTML-VEHICLES-NEXT:                  <td> Comment 3
+// HTML-VEHICLES-NEXT:                  </td>
 // HTML-VEHICLES-NEXT:              </tr>
 // HTML-VEHICLES-NEXT:              <tr>
 // HTML-VEHICLES-NEXT:                  <td>Hatchback</td>
 // HTML-VEHICLES-NEXT:                  <td>3</td>
+// HTML-VEHICLES-NEXT:                  <td> Comment 4
+// HTML-VEHICLES-NEXT:                  </td>
 // HTML-VEHICLES-NEXT:              </tr>
 // HTML-VEHICLES-NEXT:          </tbody>
 // HTML-VEHICLES-NEXT:      </table>
@@ -449,9 +494,10 @@ enum ColorUserSpecified {
 
 // MD-INDEX: | enum ColorUserSpecified |
 // MD-INDEX: --
-// MD-INDEX: | RedUserSpecified |
-// MD-INDEX: | GreenUserSpecified |
-// MD-INDEX: | BlueUserSpecified |
+// MD-INDEX: | Name | Value |
+// MD-INDEX: | RedUserSpecified | 65 |
+// MD-INDEX: | GreenUserSpecified | 2 |
+// MD-INDEX: | BlueUserSpecified | 67 |
 
 // HTML-INDEX-LABEL:  <div id="{{([0-9A-F]{40})}}" class="delimiter-container">
 // HTML-INDEX-NEXT:     <div>
@@ -462,7 +508,7 @@ enum ColorUserSpecified {
 // HTML-INDEX-NEXT:             <tr>
 // HTML-INDEX-NEXT:                 <th>Name</th>
 // HTML-INDEX-NEXT:                 <th>Value</th>
-// HTML-INDEX-NEXT:             </tr>
+// HTML-INDEX:                  </tr>
 // HTML-INDEX-NEXT:             <tr>
 // HTML-INDEX-NEXT:                 <td>RedUserSpecified</td>
 // HTML-INDEX-NEXT:                 <td>'A'</td>
@@ -477,7 +523,7 @@ enum ColorUserSpecified {
 // HTML-INDEX-NEXT:             </tr>
 // HTML-INDEX-NEXT:         </tbody>
 // HTML-INDEX-NEXT:     </table>
-// HTML-INDEX-NEXT:     <p>Defined at line [[@LINE-36]] of file {{.*}}clang-tools-extra{{[\/]}}test{{[\/]}}clang-doc{{[\/]}}enum.cpp</p>
+// HTML-INDEX-NEXT:     <p>Defined at line [[@LINE-37]] of file {{.*}}clang-tools-extra{{[\/]}}test{{[\/]}}clang-doc{{[\/]}}enum.cpp</p>
 // HTML-INDEX-NEXT:   </div>
 
 // MD-MUSTACHE-INDEX: | enum ColorUserSpecified |

>From 9eed093de612232d23512d107ddbc1b7dfcb06a3 Mon Sep 17 00:00:00 2001
From: Samrudh Nelli <samrudhnelli at gmail.com>
Date: Thu, 26 Feb 2026 21:35:36 +0530
Subject: [PATCH 05/39] remove header Name | Value | Comments, implement format
 suggestions

---
 clang-tools-extra/clang-doc/JSONGenerator.cpp | 28 +++++++++----------
 clang-tools-extra/clang-doc/MDGenerator.cpp   |  7 ++---
 .../clang-doc/assets/enum-template.mustache   |  4 ++-
 clang-tools-extra/test/clang-doc/enum.cpp     | 16 +++--------
 .../unittests/clang-doc/MDGeneratorTest.cpp   |  2 --
 5 files changed, 22 insertions(+), 35 deletions(-)

diff --git a/clang-tools-extra/clang-doc/JSONGenerator.cpp b/clang-tools-extra/clang-doc/JSONGenerator.cpp
index ce420ea50271c..7143027abf509 100644
--- a/clang-tools-extra/clang-doc/JSONGenerator.cpp
+++ b/clang-tools-extra/clang-doc/JSONGenerator.cpp
@@ -615,22 +615,20 @@ void JSONGenerator::serializeInfo(const EnumValueInfo &I, Object &Obj) {
     Obj["ValueExpr"] = I.ValueExpr;
   else
     Obj["Value"] = I.Value;
-  if (!I.Description.empty()) {
-    json::Value CommentsArray = Array();
-    auto &CommentsArrayRef = *CommentsArray.getAsArray();
-    Object TempObj, ChildJson;
-    for (const auto &Child : I.Description) {
-      for (const auto &CI : Child.Children) {
-        ChildJson = serializeComment(*CI, TempObj);
-        if (!ChildJson.empty()) {
-          CommentsArrayRef.push_back(std::move(ChildJson));
-        }
-      }
-    }
-    if (!CommentsArrayRef.empty()) {
-      Obj["Description"] = CommentsArray;
-    }
+
+  if (I.Description.empty())
+    return;
+
+  json::Value CommentsArray = Array();
+  auto &CommentsArrayRef = *CommentsArray.getAsArray();
+  Object TempObj;
+  for (const auto &Child : I.Description) {
+    for (const auto &CI : Child.Children)
+      if(Object ChildJson = serializeComment(*CI, TempObj); !ChildJson.empty())
+        CommentsArrayRef.push_back(std::move(ChildJson));
   }
+  if (!CommentsArrayRef.empty())
+    Obj["Description"] = CommentsArray;
 }
 
 void JSONGenerator::serializeInfo(const EnumInfo &I, json::Object &Obj) {
diff --git a/clang-tools-extra/clang-doc/MDGenerator.cpp b/clang-tools-extra/clang-doc/MDGenerator.cpp
index 744ceed5d4138..d6c89cec31a81 100644
--- a/clang-tools-extra/clang-doc/MDGenerator.cpp
+++ b/clang-tools-extra/clang-doc/MDGenerator.cpp
@@ -69,6 +69,7 @@ static void writeSourceFileRef(const ClangDocContext &CDCtx, const Location &L,
 
 static std::string genRawText(const std::vector<CommentInfo> &Comments) {
   std::string Result;
+  llvm::raw_string_ostream OS(Result);
   std::queue<const CommentInfo *> Q;
   for (const auto &CI : Comments)
     Q.push(&CI);
@@ -77,7 +78,7 @@ static std::string genRawText(const std::vector<CommentInfo> &Comments) {
     Comment = Q.front();
     Q.pop();
     if (!Comment->Text.empty())
-      Result += Comment->Text;
+      OS << Comment->Text;
     for (const auto &CI : Comment->Children)
       Q.push(CI.get());
   }
@@ -185,7 +186,6 @@ static void genMarkdown(const ClangDocContext &CDCtx, const EnumInfo &I,
   std::string Buffer;
   llvm::raw_string_ostream Members(Buffer);
   if (!I.Members.empty()) {
-    OS << "| Name | Value |";
     bool HasComments = false;
     for (const auto &Member : I.Members) {
       if (!Member.Description.empty()) {
@@ -193,9 +193,6 @@ static void genMarkdown(const ClangDocContext &CDCtx, const EnumInfo &I,
         break;
       }
     }
-    if (HasComments)
-      OS << " Comments |";
-    OS << "\n\n";
     for (const auto &N : I.Members) {
       Members << "| " << N.Name << " ";
       if (!N.Value.empty())
diff --git a/clang-tools-extra/clang-doc/assets/enum-template.mustache b/clang-tools-extra/clang-doc/assets/enum-template.mustache
index 93d128d449470..f39d176bed4f8 100644
--- a/clang-tools-extra/clang-doc/assets/enum-template.mustache
+++ b/clang-tools-extra/clang-doc/assets/enum-template.mustache
@@ -15,7 +15,9 @@
             <tr>
                 <th>Name</th>
                 <th>Value</th>
-                {{#HasComments}}<th>Comments</th>{{/HasComments}}
+                {{#HasComments}}
+                <th>Comments</th>
+                {{/HasComments}}
             </tr>
             {{#Members}}
             <tr>
diff --git a/clang-tools-extra/test/clang-doc/enum.cpp b/clang-tools-extra/test/clang-doc/enum.cpp
index 2977bb27059e9..ffdb4d36f74b0 100644
--- a/clang-tools-extra/test/clang-doc/enum.cpp
+++ b/clang-tools-extra/test/clang-doc/enum.cpp
@@ -42,7 +42,6 @@ enum Color {
 // MD-INDEX: ## Enums
 // MD-INDEX: | enum Color |
 // MD-INDEX: --
-// MD-INDEX: | Name | Value | Comments |
 // MD-INDEX: | Red | 0 | Comment 1 |
 // MD-INDEX: | Green | 1 | Comment 2 |
 // MD-INDEX: | Blue | 2 | Comment 3 |
@@ -112,7 +111,6 @@ enum class Shapes {
 };
 // MD-INDEX: | enum class Shapes |
 // MD-INDEX: --
-// MD-INDEX: | Name | Value | Comments |
 // MD-INDEX: | Circle | 0 | Comment 1 |
 // MD-INDEX: | Rectangle | 1 | Comment 2 |
 // MD-INDEX: | Triangle | 2 | Comment 3 |
@@ -171,7 +169,6 @@ enum Size : uint8_t {
 
 // MD-INDEX: | enum Size : uint8_t |
 // MD-INDEX: --
-// MD-INDEX: | Name | Value | Comments |
 // MD-INDEX: | Small | 0 | A pearl |
 // MD-INDEX: | Medium | 1 | A tennis ball |
 // MD-INDEX: | Large | 2 | A football |
@@ -213,7 +210,7 @@ enum Size : uint8_t {
 // HTML-INDEX-NEXT:           <p>Specify the size</p>
 // HTML-INDEX-NEXT:       </div>
 // HTML-INDEX-NEXT:     </div>
-// HTML-INDEX-NEXT:     <p>Defined at line [[@LINE-52]] of file {{.*}}clang-tools-extra{{[\/]}}test{{[\/]}}clang-doc{{[\/]}}enum.cpp</p>
+// HTML-INDEX-NEXT:     <p>Defined at line [[@LINE-51]] of file {{.*}}clang-tools-extra{{[\/]}}test{{[\/]}}clang-doc{{[\/]}}enum.cpp</p>
 // HTML-INDEX-NEXT:   </div>
 
 /**
@@ -227,7 +224,6 @@ enum : long long {
 
 // MD-INDEX: | enum (unnamed) : long long |
 // MD-INDEX: --
-// MD-INDEX: | Name | Value | Comments |
 // MD-INDEX: | BigVal | 999999999999 | A very large value |
 // MD-INDEX: **brief** Very long number
 
@@ -255,7 +251,7 @@ enum : long long {
 // HTML-INDEX-NEXT:           <p>Very long number</p>
 // HTML-INDEX-NEXT:       </div>
 // HTML-INDEX-NEXT:     </div>
-// HTML-INDEX-NEXT:     <p>Defined at line [[@LINE-36]] of file {{.*}}clang-tools-extra{{[\/]}}test{{[\/]}}clang-doc{{[\/]}}enum.cpp</p>
+// HTML-INDEX-NEXT:     <p>Defined at line [[@LINE-35]] of file {{.*}}clang-tools-extra{{[\/]}}test{{[\/]}}clang-doc{{[\/]}}enum.cpp</p>
 // HTML-INDEX-NEXT:   </div>
 
 class FilePermissions {
@@ -276,7 +272,6 @@ class FilePermissions {
 
 // MD-PERM: | enum (unnamed) |
 // MD-PERM: --
-// MD-PERM: | Name | Value | Comments |
 // MD-PERM: | Read | 1 | Permission to READ r |
 // MD-PERM: | Write | 2 | Permission to WRITE w |
 // MD-PERM: | Execute | 4 | Permission to EXECUTE x |
@@ -320,7 +315,7 @@ class FilePermissions {
 // HTML-PERM-NEXT:             <p>File permission flags</p>
 // HTML-PERM-NEXT:         </div>
 // HTML-PERM-NEXT:       </div>
-// HTML-PERM-NEXT:         <p>Defined at line [[@LINE-55]] of file {{.*}}clang-tools-extra{{[\/]}}test{{[\/]}}clang-doc{{[\/]}}enum.cpp</p>
+// HTML-PERM-NEXT:         <p>Defined at line [[@LINE-54]] of file {{.*}}clang-tools-extra{{[\/]}}test{{[\/]}}clang-doc{{[\/]}}enum.cpp</p>
 // HTML-PERM-NEXT:     </div>
 // HTML-PERM-NEXT:   </section>
 
@@ -389,7 +384,6 @@ class Animals {
 // MD-ANIMAL: ## Enums
 // MD-ANIMAL: | enum AnimalType |
 // MD-ANIMAL: --
-// MD-ANIMAL: | Name | Value | Comments |
 // MD-ANIMAL: | Dog | 0 | Man's best friend |
 // MD-ANIMAL: | Cat | 1 | Man's other best friend |
 // MD-ANIMAL: | Iguana | 2 | A lizard |
@@ -424,7 +418,6 @@ enum Car {
 // MD-VEHICLES: ## Enums
 // MD-VEHICLES: | enum Car |
 // MD-VEHICLES: --
-// MD-VEHICLES: | Name | Value | Comments |
 // MD-VEHICLES: | Sedan | 0 | Comment 1 |
 // MD-VEHICLES: | SUV | 1 | Comment 2 |
 // MD-VEHICLES: | Pickup | 2 | Comment 3 |
@@ -494,7 +487,6 @@ enum ColorUserSpecified {
 
 // MD-INDEX: | enum ColorUserSpecified |
 // MD-INDEX: --
-// MD-INDEX: | Name | Value |
 // MD-INDEX: | RedUserSpecified | 65 |
 // MD-INDEX: | GreenUserSpecified | 2 |
 // MD-INDEX: | BlueUserSpecified | 67 |
@@ -523,7 +515,7 @@ enum ColorUserSpecified {
 // HTML-INDEX-NEXT:             </tr>
 // HTML-INDEX-NEXT:         </tbody>
 // HTML-INDEX-NEXT:     </table>
-// HTML-INDEX-NEXT:     <p>Defined at line [[@LINE-37]] of file {{.*}}clang-tools-extra{{[\/]}}test{{[\/]}}clang-doc{{[\/]}}enum.cpp</p>
+// HTML-INDEX-NEXT:     <p>Defined at line [[@LINE-36]] of file {{.*}}clang-tools-extra{{[\/]}}test{{[\/]}}clang-doc{{[\/]}}enum.cpp</p>
 // HTML-INDEX-NEXT:   </div>
 
 // MD-MUSTACHE-INDEX: | enum ColorUserSpecified |
diff --git a/clang-tools-extra/unittests/clang-doc/MDGeneratorTest.cpp b/clang-tools-extra/unittests/clang-doc/MDGeneratorTest.cpp
index 063c8f4cefc54..d0d4bf3b6f08f 100644
--- a/clang-tools-extra/unittests/clang-doc/MDGeneratorTest.cpp
+++ b/clang-tools-extra/unittests/clang-doc/MDGeneratorTest.cpp
@@ -199,8 +199,6 @@ TEST_F(MDGeneratorTest, emitEnumMD) {
 
 --
 
-| Name | Value |
-
 | X | 0 |
 
 

>From 1d2be055fad8b96ae7e55f24424482bfa8dbb3de Mon Sep 17 00:00:00 2001
From: Samrudh Nelli <samrudhnelli at gmail.com>
Date: Fri, 27 Feb 2026 18:44:27 +0530
Subject: [PATCH 06/39] split display in md into another PR, use -CHECK-NEXT
 instead of -CHECK

---
 clang-tools-extra/clang-doc/JSONGenerator.cpp |  3 +-
 clang-tools-extra/clang-doc/MDGenerator.cpp   | 42 ++--------------
 .../clang-doc/assets/enum-template.mustache   |  6 +--
 clang-tools-extra/test/clang-doc/enum.cpp     | 48 +++++++++----------
 4 files changed, 31 insertions(+), 68 deletions(-)

diff --git a/clang-tools-extra/clang-doc/JSONGenerator.cpp b/clang-tools-extra/clang-doc/JSONGenerator.cpp
index 7143027abf509..a454137929d2b 100644
--- a/clang-tools-extra/clang-doc/JSONGenerator.cpp
+++ b/clang-tools-extra/clang-doc/JSONGenerator.cpp
@@ -1,5 +1,6 @@
 #include "Generators.h"
 #include "clang/Basic/Specifiers.h"
+#include "llvm/ADT/StringRef.h"
 #include "llvm/Support/JSON.h"
 
 using namespace llvm;
@@ -624,7 +625,7 @@ void JSONGenerator::serializeInfo(const EnumValueInfo &I, Object &Obj) {
   Object TempObj;
   for (const auto &Child : I.Description) {
     for (const auto &CI : Child.Children)
-      if(Object ChildJson = serializeComment(*CI, TempObj); !ChildJson.empty())
+      if (Object ChildJson = serializeComment(*CI, TempObj); !ChildJson.empty())
         CommentsArrayRef.push_back(std::move(ChildJson));
   }
   if (!CommentsArrayRef.empty())
diff --git a/clang-tools-extra/clang-doc/MDGenerator.cpp b/clang-tools-extra/clang-doc/MDGenerator.cpp
index d6c89cec31a81..60a880d211884 100644
--- a/clang-tools-extra/clang-doc/MDGenerator.cpp
+++ b/clang-tools-extra/clang-doc/MDGenerator.cpp
@@ -67,24 +67,6 @@ static void writeSourceFileRef(const ClangDocContext &CDCtx, const Location &L,
   OS << "\n\n";
 }
 
-static std::string genRawText(const std::vector<CommentInfo> &Comments) {
-  std::string Result;
-  llvm::raw_string_ostream OS(Result);
-  std::queue<const CommentInfo *> Q;
-  for (const auto &CI : Comments)
-    Q.push(&CI);
-  const CommentInfo *Comment;
-  while (Q.size()) {
-    Comment = Q.front();
-    Q.pop();
-    if (!Comment->Text.empty())
-      OS << Comment->Text;
-    for (const auto &CI : Comment->Children)
-      Q.push(CI.get());
-  }
-  return Result;
-}
-
 static void maybeWriteSourceFileRef(llvm::raw_ostream &OS,
                                     const ClangDocContext &CDCtx,
                                     const std::optional<Location> &DefLoc) {
@@ -185,27 +167,9 @@ static void genMarkdown(const ClangDocContext &CDCtx, const EnumInfo &I,
 
   std::string Buffer;
   llvm::raw_string_ostream Members(Buffer);
-  if (!I.Members.empty()) {
-    bool HasComments = false;
-    for (const auto &Member : I.Members) {
-      if (!Member.Description.empty()) {
-        HasComments = true;
-        break;
-      }
-    }
-    for (const auto &N : I.Members) {
-      Members << "| " << N.Name << " ";
-      if (!N.Value.empty())
-        Members << "| " << N.Value << " ";
-      if (HasComments) {
-        std::string RawComment = genRawText(N.Description);
-        RawComment.erase(0, RawComment.find_first_not_of(" \t\r\n"));
-        RawComment.erase(RawComment.find_last_not_of(" \t\r\n") + 1);
-        Members << "| " << (RawComment.empty() ? "--" : RawComment) << " ";
-      }
-      Members << "|\n";
-    }
-  }
+  if (!I.Members.empty())
+    for (const auto &N : I.Members)
+      Members << "| " << N.Name << " |\n";
   writeLine(Members.str(), OS);
 
   maybeWriteSourceFileRef(OS, CDCtx, I.DefLoc);
diff --git a/clang-tools-extra/clang-doc/assets/enum-template.mustache b/clang-tools-extra/clang-doc/assets/enum-template.mustache
index f39d176bed4f8..da7f6e67510ef 100644
--- a/clang-tools-extra/clang-doc/assets/enum-template.mustache
+++ b/clang-tools-extra/clang-doc/assets/enum-template.mustache
@@ -14,10 +14,8 @@
         <tbody>
             <tr>
                 <th>Name</th>
-                <th>Value</th>
-                {{#HasComments}}
-                <th>Comments</th>
-                {{/HasComments}}
+                <th>Value</th>{{#HasComments}}
+                <th>Comments</th>{{/HasComments}}
             </tr>
             {{#Members}}
             <tr>
diff --git a/clang-tools-extra/test/clang-doc/enum.cpp b/clang-tools-extra/test/clang-doc/enum.cpp
index ffdb4d36f74b0..b7fd8a5887715 100644
--- a/clang-tools-extra/test/clang-doc/enum.cpp
+++ b/clang-tools-extra/test/clang-doc/enum.cpp
@@ -42,9 +42,9 @@ enum Color {
 // MD-INDEX: ## Enums
 // MD-INDEX: | enum Color |
 // MD-INDEX: --
-// MD-INDEX: | Red | 0 | Comment 1 |
-// MD-INDEX: | Green | 1 | Comment 2 |
-// MD-INDEX: | Blue | 2 | Comment 3 |
+// MD-INDEX: | Red |
+// MD-INDEX: | Green |
+// MD-INDEX: | Blue |
 // MD-INDEX: **brief** For specifying RGB colors
 
 // HTML-INDEX-LABEL:  <div id="{{([0-9A-F]{40})}}" class="delimiter-container">
@@ -111,9 +111,9 @@ enum class Shapes {
 };
 // MD-INDEX: | enum class Shapes |
 // MD-INDEX: --
-// MD-INDEX: | Circle | 0 | Comment 1 |
-// MD-INDEX: | Rectangle | 1 | Comment 2 |
-// MD-INDEX: | Triangle | 2 | Comment 3 |
+// MD-INDEX: | Circle |
+// MD-INDEX: | Rectangle |
+// MD-INDEX: | Triangle |
 // MD-INDEX: **brief** Shape Types
 
 // HTML-INDEX-LABEL:  <div id="{{([0-9A-F]{40})}}" class="delimiter-container">
@@ -169,9 +169,9 @@ enum Size : uint8_t {
 
 // MD-INDEX: | enum Size : uint8_t |
 // MD-INDEX: --
-// MD-INDEX: | Small | 0 | A pearl |
-// MD-INDEX: | Medium | 1 | A tennis ball |
-// MD-INDEX: | Large | 2 | A football |
+// MD-INDEX: | Small |
+// MD-INDEX: | Medium |
+// MD-INDEX: | Large |
 // MD-INDEX: **brief** Specify the size
 
 // HTML-INDEX-LABEL:   <div id="{{([0-9A-F]{40})}}" class="delimiter-container">
@@ -224,7 +224,7 @@ enum : long long {
 
 // MD-INDEX: | enum (unnamed) : long long |
 // MD-INDEX: --
-// MD-INDEX: | BigVal | 999999999999 | A very large value |
+// MD-INDEX: | BigVal |
 // MD-INDEX: **brief** Very long number
 
 // HTML-INDEX-LABEL:  <div id="{{([0-9A-F]{40})}}" class="delimiter-container">
@@ -272,9 +272,9 @@ class FilePermissions {
 
 // MD-PERM: | enum (unnamed) |
 // 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: | Read |
+// MD-PERM: | Write |
+// MD-PERM: | Execute |
 // MD-PERM: **brief** File permission flags
 
 // HTML-PERM-LABEL:  <section id="Enums" class="section-container">
@@ -384,9 +384,9 @@ class Animals {
 // MD-ANIMAL: ## Enums
 // MD-ANIMAL: | enum AnimalType |
 // 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: | Dog |
+// MD-ANIMAL: | Cat |
+// MD-ANIMAL: | Iguana |
 // MD-ANIMAL: **brief** specify what animal the class is
 
 // MD-MUSTACHE-ANIMAL: # class Animals
@@ -418,10 +418,10 @@ enum Car {
 // MD-VEHICLES: ## Enums
 // MD-VEHICLES: | enum Car |
 // MD-VEHICLES: --
-// MD-VEHICLES: | Sedan | 0 | Comment 1 |
-// MD-VEHICLES: | SUV | 1 | Comment 2 |
-// MD-VEHICLES: | Pickup | 2 | Comment 3 |
-// MD-VEHICLES: | Hatchback | 3 | Comment 4 |
+// MD-VEHICLES: | Sedan |
+// MD-VEHICLES: | SUV |
+// MD-VEHICLES: | Pickup |
+// MD-VEHICLES: | Hatchback |
 // MD-VEHICLES: **brief** specify type of car
 
 // HTML-VEHICLES-LABEL:   <div id="{{([0-9A-F]{40})}}" class="delimiter-container">
@@ -487,9 +487,9 @@ enum ColorUserSpecified {
 
 // MD-INDEX: | enum ColorUserSpecified |
 // MD-INDEX: --
-// MD-INDEX: | RedUserSpecified | 65 |
-// MD-INDEX: | GreenUserSpecified | 2 |
-// MD-INDEX: | BlueUserSpecified | 67 |
+// MD-INDEX: | RedUserSpecified |
+// MD-INDEX: | GreenUserSpecified |
+// MD-INDEX: | BlueUserSpecified |
 
 // HTML-INDEX-LABEL:  <div id="{{([0-9A-F]{40})}}" class="delimiter-container">
 // HTML-INDEX-NEXT:     <div>
@@ -500,7 +500,7 @@ enum ColorUserSpecified {
 // HTML-INDEX-NEXT:             <tr>
 // HTML-INDEX-NEXT:                 <th>Name</th>
 // HTML-INDEX-NEXT:                 <th>Value</th>
-// HTML-INDEX:                  </tr>
+// HTML-INDEX-NEXT:             </tr>
 // HTML-INDEX-NEXT:             <tr>
 // HTML-INDEX-NEXT:                 <td>RedUserSpecified</td>
 // HTML-INDEX-NEXT:                 <td>'A'</td>

>From 7728bcc2f1bd36417d02427b53e65046555b9a3b Mon Sep 17 00:00:00 2001
From: Samrudh Nelli <samrudhnelli at gmail.com>
Date: Fri, 27 Feb 2026 19:01:16 +0530
Subject: [PATCH 07/39] fix unittests

---
 clang-tools-extra/unittests/clang-doc/MDGeneratorTest.cpp | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/clang-tools-extra/unittests/clang-doc/MDGeneratorTest.cpp b/clang-tools-extra/unittests/clang-doc/MDGeneratorTest.cpp
index d0d4bf3b6f08f..da22d00835126 100644
--- a/clang-tools-extra/unittests/clang-doc/MDGeneratorTest.cpp
+++ b/clang-tools-extra/unittests/clang-doc/MDGeneratorTest.cpp
@@ -199,7 +199,7 @@ TEST_F(MDGeneratorTest, emitEnumMD) {
 
 --
 
-| X | 0 |
+| X |
 
 
 *Defined at test.cpp#10*

>From c069ee7378ca3970b6a9597d39b508a6595a1911 Mon Sep 17 00:00:00 2001
From: Samrudh Nelli <samrudhnelli at gmail.com>
Date: Mon, 2 Mar 2026 13:09:52 +0530
Subject: [PATCH 08/39] Handle richer processing of comments, update the tests
 and template

---
 clang-tools-extra/clang-doc/JSONGenerator.cpp |  22 ++--
 .../clang-doc/assets/enum-template.mustache   |   6 +-
 clang-tools-extra/test/clang-doc/enum.cpp     | 107 +++++++++++++-----
 3 files changed, 98 insertions(+), 37 deletions(-)

diff --git a/clang-tools-extra/clang-doc/JSONGenerator.cpp b/clang-tools-extra/clang-doc/JSONGenerator.cpp
index a454137929d2b..9dc2b1c30dd26 100644
--- a/clang-tools-extra/clang-doc/JSONGenerator.cpp
+++ b/clang-tools-extra/clang-doc/JSONGenerator.cpp
@@ -620,16 +620,20 @@ void JSONGenerator::serializeInfo(const EnumValueInfo &I, Object &Obj) {
   if (I.Description.empty())
     return;
 
-  json::Value CommentsArray = Array();
-  auto &CommentsArrayRef = *CommentsArray.getAsArray();
-  Object TempObj;
-  for (const auto &Child : I.Description) {
-    for (const auto &CI : Child.Children)
-      if (Object ChildJson = serializeComment(*CI, TempObj); !ChildJson.empty())
-        CommentsArrayRef.push_back(std::move(ChildJson));
+  Object Description = Object();
+  auto &Comments = I.Description.at(0).Children;
+  for (const auto &CommentInfo : Comments) {
+    json::Value Comment = serializeComment(*CommentInfo, Description);
+    if (auto *ParagraphComment = Comment.getAsObject();
+        ParagraphComment->get("ParagraphComment")) {
+      auto TextCommentsArray = extractTextComments(ParagraphComment);
+      if (TextCommentsArray.kind() == json::Value::Null ||
+          TextCommentsArray.getAsArray()->empty())
+        continue;
+      insertComment(Description, TextCommentsArray, "ParagraphComments");
+    }
   }
-  if (!CommentsArrayRef.empty())
-    Obj["Description"] = CommentsArray;
+  Obj["Description"] = std::move(Description);
 }
 
 void JSONGenerator::serializeInfo(const EnumInfo &I, json::Object &Obj) {
diff --git a/clang-tools-extra/clang-doc/assets/enum-template.mustache b/clang-tools-extra/clang-doc/assets/enum-template.mustache
index da7f6e67510ef..f39d176bed4f8 100644
--- a/clang-tools-extra/clang-doc/assets/enum-template.mustache
+++ b/clang-tools-extra/clang-doc/assets/enum-template.mustache
@@ -14,8 +14,10 @@
         <tbody>
             <tr>
                 <th>Name</th>
-                <th>Value</th>{{#HasComments}}
-                <th>Comments</th>{{/HasComments}}
+                <th>Value</th>
+                {{#HasComments}}
+                <th>Comments</th>
+                {{/HasComments}}
             </tr>
             {{#Members}}
             <tr>
diff --git a/clang-tools-extra/test/clang-doc/enum.cpp b/clang-tools-extra/test/clang-doc/enum.cpp
index b7fd8a5887715..46d905034002e 100644
--- a/clang-tools-extra/test/clang-doc/enum.cpp
+++ b/clang-tools-extra/test/clang-doc/enum.cpp
@@ -1,8 +1,10 @@
 // RUN: rm -rf %t && mkdir -p %t
 // RUN: clang-doc --format=html --doxygen --output=%t --executor=standalone %s
 // RUN: clang-doc --format=md --doxygen --output=%t --executor=standalone %s
+// RUN: clang-doc --format=json --doxygen --output=%t --executor=standalone %s
 // RUN: FileCheck %s < %t/html/GlobalNamespace/index.html --check-prefix=HTML-INDEX-LINE
 // RUN: FileCheck %s < %t/html/GlobalNamespace/index.html --check-prefix=HTML-INDEX
+// RUN: FileCheck %s < %t/json/GlobalNamespace/index.json --check-prefix=JSON-INDEX
 // RUN: FileCheck %s < %t/html/GlobalNamespace/_ZTV7Animals.html --check-prefix=HTML-ANIMAL-LINE
 // RUN: FileCheck %s < %t/html/GlobalNamespace/_ZTV7Animals.html --check-prefix=HTML-ANIMAL
 // RUN: FileCheck %s < %t/html/GlobalNamespace/_ZTV15FilePermissions.html --check-prefix=HTML-PERM-LINE
@@ -61,19 +63,25 @@ enum Color {
 // HTML-INDEX-NEXT:             <tr>
 // HTML-INDEX-NEXT:                 <td>Red</td>
 // HTML-INDEX-NEXT:                 <td>0</td>
-// HTML-INDEX-NEXT:                 <td> Comment 1
+// HTML-INDEX-NEXT:                 <td><div class="nested-delimiter-container">
+// HTML-INDEX-NEXT:                       <p> Comment 1</p>
+// HTML-INDEX-NEXT:                     </div>
 // HTML-INDEX-NEXT:                 </td>
 // HTML-INDEX-NEXT:             </tr>
 // HTML-INDEX-NEXT:             <tr>
 // HTML-INDEX-NEXT:                 <td>Green</td>
 // HTML-INDEX-NEXT:                 <td>1</td>
-// HTML-INDEX-NEXT:                 <td> Comment 2
+// HTML-INDEX-NEXT:                 <td><div class="nested-delimiter-container">
+// HTML-INDEX-NEXT:                       <p> Comment 2</p>
+// HTML-INDEX-NEXT:                     </div>
 // HTML-INDEX-NEXT:                 </td>
 // HTML-INDEX-NEXT:             </tr>
 // HTML-INDEX-NEXT:             <tr>
 // HTML-INDEX-NEXT:                 <td>Blue</td>
 // HTML-INDEX-NEXT:                 <td>2</td>
-// HTML-INDEX-NEXT:                 <td> Comment 3
+// HTML-INDEX-NEXT:                 <td><div class="nested-delimiter-container">
+// HTML-INDEX-NEXT:                       <p> Comment 3</p>
+// HTML-INDEX-NEXT:                     </div>
 // HTML-INDEX-NEXT:                 </td>
 // HTML-INDEX-NEXT:             </tr>
 // HTML-INDEX-NEXT:         </tbody>
@@ -130,19 +138,25 @@ enum class Shapes {
 // HTML-INDEX-NEXT:             <tr>
 // HTML-INDEX-NEXT:                 <td>Circle</td>
 // HTML-INDEX-NEXT:                 <td>0</td>
-// HTML-INDEX-NEXT:                 <td> Comment 1
+// HTML-INDEX-NEXT:                 <td><div class="nested-delimiter-container">
+// HTML-INDEX-NEXT:                       <p> Comment 1</p>
+// HTML-INDEX-NEXT:                     </div>
 // HTML-INDEX-NEXT:                 </td>
 // HTML-INDEX-NEXT:             </tr>
 // HTML-INDEX-NEXT:             <tr>
 // HTML-INDEX-NEXT:                 <td>Rectangle</td>
 // HTML-INDEX-NEXT:                 <td>1</td>
-// HTML-INDEX-NEXT:                 <td> Comment 2
+// HTML-INDEX-NEXT:                 <td><div class="nested-delimiter-container">
+// HTML-INDEX-NEXT:                       <p> Comment 2</p>
+// HTML-INDEX-NEXT:                     </div>
 // HTML-INDEX-NEXT:                 </td>
 // HTML-INDEX-NEXT:             </tr>
 // HTML-INDEX-NEXT:             <tr>
 // HTML-INDEX-NEXT:                 <td>Triangle</td>
 // HTML-INDEX-NEXT:                 <td>2</td>
-// HTML-INDEX-NEXT:                 <td> Comment 3
+// HTML-INDEX-NEXT:                 <td><div class="nested-delimiter-container">
+// HTML-INDEX-NEXT:                       <p> Comment 3</p>
+// HTML-INDEX-NEXT:                     </div>
 // HTML-INDEX-NEXT:                 </td>
 // HTML-INDEX-NEXT:             </tr>
 // HTML-INDEX-NEXT:         </tbody>
@@ -162,9 +176,18 @@ typedef unsigned char uint8_t;
 enum Size : uint8_t {
   // MD-INDEX-LINE: *Defined at {{.*}}clang-tools-extra{{[\/]}}test{{[\/]}}clang-doc{{[\/]}}enum.cpp#[[@LINE-1]]*
   // HTML-INDEX-LINE: <p>Defined at line [[@LINE-2]] of file {{.*}}clang-tools-extra{{[\/]}}test{{[\/]}}clang-doc{{[\/]}}enum.cpp</p>
-  Small,   ///< A pearl
-  Medium,  ///< A tennis ball
-  Large    ///< A football
+
+  /// A pearl.
+  /// Pearls are quite small.
+  ///
+  /// Pearls are used in jewelry.
+  Small,
+
+  /// @brief A tennis ball.
+  Medium,
+
+  /// A football.
+  Large
 };
 
 // MD-INDEX: | enum Size : uint8_t |
@@ -188,19 +211,29 @@ enum Size : uint8_t {
 // HTML-INDEX-NEXT:             <tr>
 // HTML-INDEX-NEXT:                 <td>Small</td>
 // HTML-INDEX-NEXT:                 <td>0</td>
-// HTML-INDEX-NEXT:                 <td> A pearl
+// HTML-INDEX-NEXT:                 <td><div class="nested-delimiter-container">
+// HTML-INDEX-NEXT:                       <p> A pearl.</p>
+// HTML-INDEX-NEXT:                       <p> Pearls are quite small.</p>
+// HTML-INDEX-NEXT:                     </div>
+// HTML-INDEX-NEXT:                     <div class="nested-delimiter-container">
+// HTML-INDEX-NEXT:                       <p>  Pearls are used in jewelry.</p>
+// HTML-INDEX-NEXT:                     </div>
 // HTML-INDEX-NEXT:                 </td>
 // HTML-INDEX-NEXT:             </tr>
 // HTML-INDEX-NEXT:             <tr>
 // HTML-INDEX-NEXT:                 <td>Medium</td>
 // HTML-INDEX-NEXT:                 <td>1</td>
-// HTML-INDEX-NEXT:                 <td> A tennis ball
+// HTML-INDEX-NEXT:                 <td><div class="nested-delimiter-container">
+// HTML-INDEX-NEXT:                       <p> A tennis ball.</p>
+// HTML-INDEX-NEXT:                     </div>
 // HTML-INDEX-NEXT:                 </td>
 // HTML-INDEX-NEXT:             </tr>
 // HTML-INDEX-NEXT:             <tr>
 // HTML-INDEX-NEXT:                 <td>Large</td>
 // HTML-INDEX-NEXT:                 <td>2</td>
-// HTML-INDEX-NEXT:                 <td> A football
+// HTML-INDEX-NEXT:                 <td><div class="nested-delimiter-container">
+// HTML-INDEX-NEXT:                       <p> A football.</p>
+// HTML-INDEX-NEXT:                     </div>
 // HTML-INDEX-NEXT:                 </td>
 // HTML-INDEX-NEXT:             </tr>
 // HTML-INDEX-NEXT:         </tbody>
@@ -210,7 +243,7 @@ enum Size : uint8_t {
 // HTML-INDEX-NEXT:           <p>Specify the size</p>
 // HTML-INDEX-NEXT:       </div>
 // HTML-INDEX-NEXT:     </div>
-// HTML-INDEX-NEXT:     <p>Defined at line [[@LINE-51]] of file {{.*}}clang-tools-extra{{[\/]}}test{{[\/]}}clang-doc{{[\/]}}enum.cpp</p>
+// HTML-INDEX-NEXT:     <p>Defined at line [[@LINE-70]] of file {{.*}}clang-tools-extra{{[\/]}}test{{[\/]}}clang-doc{{[\/]}}enum.cpp</p>
 // HTML-INDEX-NEXT:   </div>
 
 /**
@@ -241,7 +274,9 @@ enum : long long {
 // HTML-INDEX-NEXT:             <tr>
 // HTML-INDEX-NEXT:                 <td>BigVal</td>
 // HTML-INDEX-NEXT:                 <td>999999999999</td>
-// HTML-INDEX-NEXT:                 <td> A very large value
+// HTML-INDEX-NEXT:                 <td><div class="nested-delimiter-container">
+// HTML-INDEX-NEXT:                       <p> A very large value</p>
+// HTML-INDEX-NEXT:                     </div>
 // HTML-INDEX-NEXT:                 </td>
 // HTML-INDEX-NEXT:             </tr>
 // HTML-INDEX-NEXT:         </tbody>
@@ -251,7 +286,7 @@ enum : long long {
 // HTML-INDEX-NEXT:           <p>Very long number</p>
 // HTML-INDEX-NEXT:       </div>
 // HTML-INDEX-NEXT:     </div>
-// HTML-INDEX-NEXT:     <p>Defined at line [[@LINE-35]] of file {{.*}}clang-tools-extra{{[\/]}}test{{[\/]}}clang-doc{{[\/]}}enum.cpp</p>
+// HTML-INDEX-NEXT:     <p>Defined at line [[@LINE-37]] of file {{.*}}clang-tools-extra{{[\/]}}test{{[\/]}}clang-doc{{[\/]}}enum.cpp</p>
 // HTML-INDEX-NEXT:   </div>
 
 class FilePermissions {
@@ -293,19 +328,25 @@ class FilePermissions {
 // HTML-PERM-NEXT:               <tr>
 // HTML-PERM-NEXT:                   <td>Read</td>
 // HTML-PERM-NEXT:                   <td>1</td>
-// HTML-PERM-NEXT:                   <td> Permission to READ r
+// HTML-PERM-NEXT:                   <td><div class="nested-delimiter-container">
+// HTML-PERM-NEXT:                         <p> Permission to READ r</p>
+// HTML-PERM-NEXT:                       </div>
 // HTML-PERM-NEXT:                   </td>
 // HTML-PERM-NEXT:               </tr>
 // HTML-PERM-NEXT:               <tr>
 // HTML-PERM-NEXT:                   <td>Write</td>
 // HTML-PERM-NEXT:                   <td>2</td>
-// HTML-PERM-NEXT:                   <td> Permission to WRITE w
+// HTML-PERM-NEXT:                   <td><div class="nested-delimiter-container">
+// HTML-PERM-NEXT:                         <p> Permission to WRITE w</p>
+// HTML-PERM-NEXT:                       </div>
 // HTML-PERM-NEXT:                   </td>
 // HTML-PERM-NEXT:               </tr>
 // HTML-PERM-NEXT:               <tr>
 // HTML-PERM-NEXT:                   <td>Execute</td>
 // HTML-PERM-NEXT:                   <td>4</td>
-// HTML-PERM-NEXT:                   <td> Permission to EXECUTE x
+// HTML-PERM-NEXT:                   <td><div class="nested-delimiter-container">
+// HTML-PERM-NEXT:                         <p> Permission to EXECUTE x</p>
+// HTML-PERM-NEXT:                       </div>
 // HTML-PERM-NEXT:                   </td>
 // HTML-PERM-NEXT:               </tr>
 // HTML-PERM-NEXT:           </tbody>
@@ -315,7 +356,7 @@ class FilePermissions {
 // HTML-PERM-NEXT:             <p>File permission flags</p>
 // HTML-PERM-NEXT:         </div>
 // HTML-PERM-NEXT:       </div>
-// HTML-PERM-NEXT:         <p>Defined at line [[@LINE-54]] of file {{.*}}clang-tools-extra{{[\/]}}test{{[\/]}}clang-doc{{[\/]}}enum.cpp</p>
+// HTML-PERM-NEXT:         <p>Defined at line [[@LINE-60]] of file {{.*}}clang-tools-extra{{[\/]}}test{{[\/]}}clang-doc{{[\/]}}enum.cpp</p>
 // HTML-PERM-NEXT:     </div>
 // HTML-PERM-NEXT:   </section>
 
@@ -354,19 +395,25 @@ class Animals {
 // HTML-ANIMAL-NEXT:                 <tr>
 // HTML-ANIMAL-NEXT:                     <td>Dog</td>
 // HTML-ANIMAL-NEXT:                     <td>0</td>
-// HTML-ANIMAL-NEXT:                     <td> Man's best friend
+// HTML-ANIMAL-NEXT:                     <td><div class="nested-delimiter-container">
+// HTML-ANIMAL-NEXT:                           <p> Man's best friend</p>
+// HTML-ANIMAL-NEXT:                         </div>
 // HTML-ANIMAL-NEXT:                     </td>
 // HTML-ANIMAL-NEXT:                 </tr>
 // HTML-ANIMAL-NEXT:                 <tr>
 // HTML-ANIMAL-NEXT:                     <td>Cat</td>
 // HTML-ANIMAL-NEXT:                     <td>1</td>
-// HTML-ANIMAL-NEXT:                     <td>  Man's other best friend
+// HTML-ANIMAL-NEXT:                     <td><div class="nested-delimiter-container">
+// HTML-ANIMAL-NEXT:                           <p> Man's other best friend</p>
+// HTML-ANIMAL-NEXT:                         </div>
 // HTML-ANIMAL-NEXT:                     </td>
 // HTML-ANIMAL-NEXT:                 </tr>
 // HTML-ANIMAL-NEXT:                 <tr>
 // HTML-ANIMAL-NEXT:                     <td>Iguana</td>
 // HTML-ANIMAL-NEXT:                     <td>2</td>
-// HTML-ANIMAL-NEXT:                     <td> A lizard
+// HTML-ANIMAL-NEXT:                     <td><div class="nested-delimiter-container">
+// HTML-ANIMAL-NEXT:                           <p> A lizard</p>
+// HTML-ANIMAL-NEXT:                         </div>
 // HTML-ANIMAL-NEXT:                     </td>
 // HTML-ANIMAL-NEXT:                 </tr>
 // HTML-ANIMAL-NEXT:             </tbody>
@@ -438,25 +485,33 @@ enum Car {
 // HTML-VEHICLES-NEXT:              <tr>
 // HTML-VEHICLES-NEXT:                  <td>Sedan</td>
 // HTML-VEHICLES-NEXT:                  <td>0</td>
-// HTML-VEHICLES-NEXT:                  <td> Comment 1
+// HTML-VEHICLES-NEXT:                  <td><div class="nested-delimiter-container">
+// HTML-VEHICLES-NEXT:                        <p> Comment 1</p>
+// HTML-VEHICLES-NEXT:                      </div>
 // HTML-VEHICLES-NEXT:                  </td>
 // HTML-VEHICLES-NEXT:              </tr>
 // HTML-VEHICLES-NEXT:              <tr>
 // HTML-VEHICLES-NEXT:                  <td>SUV</td>
 // HTML-VEHICLES-NEXT:                  <td>1</td>
-// HTML-VEHICLES-NEXT:                  <td> Comment 2
+// HTML-VEHICLES-NEXT:                  <td><div class="nested-delimiter-container">
+// HTML-VEHICLES-NEXT:                        <p> Comment 2</p>
+// HTML-VEHICLES-NEXT:                      </div>
 // HTML-VEHICLES-NEXT:                  </td>
 // HTML-VEHICLES-NEXT:              </tr>
 // HTML-VEHICLES-NEXT:              <tr>
 // HTML-VEHICLES-NEXT:                  <td>Pickup</td>
 // HTML-VEHICLES-NEXT:                  <td>2</td>
-// HTML-VEHICLES-NEXT:                  <td> Comment 3
+// HTML-VEHICLES-NEXT:                  <td><div class="nested-delimiter-container">
+// HTML-VEHICLES-NEXT:                        <p> Comment 3</p>
+// HTML-VEHICLES-NEXT:                      </div>
 // HTML-VEHICLES-NEXT:                  </td>
 // HTML-VEHICLES-NEXT:              </tr>
 // HTML-VEHICLES-NEXT:              <tr>
 // HTML-VEHICLES-NEXT:                  <td>Hatchback</td>
 // HTML-VEHICLES-NEXT:                  <td>3</td>
-// HTML-VEHICLES-NEXT:                  <td> Comment 4
+// HTML-VEHICLES-NEXT:                  <td><div class="nested-delimiter-container">
+// HTML-VEHICLES-NEXT:                        <p> Comment 4</p>
+// HTML-VEHICLES-NEXT:                      </div>
 // HTML-VEHICLES-NEXT:                  </td>
 // HTML-VEHICLES-NEXT:              </tr>
 // HTML-VEHICLES-NEXT:          </tbody>

>From ccac0ecacc676d7446c9a56ef9091386876549a5 Mon Sep 17 00:00:00 2001
From: Samrudh Nelli <samrudhnelli at gmail.com>
Date: Mon, 2 Mar 2026 13:40:22 +0530
Subject: [PATCH 09/39] remove unused header file

---
 clang-tools-extra/clang-doc/JSONGenerator.cpp | 1 -
 1 file changed, 1 deletion(-)

diff --git a/clang-tools-extra/clang-doc/JSONGenerator.cpp b/clang-tools-extra/clang-doc/JSONGenerator.cpp
index 9dc2b1c30dd26..e388c82105292 100644
--- a/clang-tools-extra/clang-doc/JSONGenerator.cpp
+++ b/clang-tools-extra/clang-doc/JSONGenerator.cpp
@@ -1,6 +1,5 @@
 #include "Generators.h"
 #include "clang/Basic/Specifiers.h"
-#include "llvm/ADT/StringRef.h"
 #include "llvm/Support/JSON.h"
 
 using namespace llvm;

>From aa6531dea5f955b38d9a541ab06d3df239c48cb7 Mon Sep 17 00:00:00 2001
From: Samrudh Nelli <samrudhnelli at gmail.com>
Date: Mon, 2 Mar 2026 13:47:52 +0530
Subject: [PATCH 10/39] use -NEXT in
 clang-tools-extra/test/clang-doc/mustache-index.cpp

---
 clang-tools-extra/test/clang-doc/mustache-index.cpp | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/clang-tools-extra/test/clang-doc/mustache-index.cpp b/clang-tools-extra/test/clang-doc/mustache-index.cpp
index 7c4c65894fc6e..6e308ada51a45 100644
--- a/clang-tools-extra/test/clang-doc/mustache-index.cpp
+++ b/clang-tools-extra/test/clang-doc/mustache-index.cpp
@@ -39,7 +39,7 @@ class Foo;
 // CHECK-NEXT:                      <tr>
 // CHECK-NEXT:                          <th>Name</th>
 // CHECK-NEXT:                          <th>Value</th>
-// CHECK:                           </tr>
+// CHECK-NEXT:                      </tr>
 // CHECK-NEXT:                      <tr>
 // CHECK-NEXT:                          <td>RED</td>
 // CHECK-NEXT:                          <td>0</td>

>From a0efab03ceb6de6439b15ddeb5dc354d03a1f15f Mon Sep 17 00:00:00 2001
From: Samrudh Nelli <samrudhnelli at gmail.com>
Date: Mon, 2 Mar 2026 22:54:00 +0530
Subject: [PATCH 11/39] revert usage of lambda for setting HasComments

---
 clang-tools-extra/clang-doc/JSONGenerator.cpp | 19 +++++++++----------
 1 file changed, 9 insertions(+), 10 deletions(-)

diff --git a/clang-tools-extra/clang-doc/JSONGenerator.cpp b/clang-tools-extra/clang-doc/JSONGenerator.cpp
index e388c82105292..0894e68e36981 100644
--- a/clang-tools-extra/clang-doc/JSONGenerator.cpp
+++ b/clang-tools-extra/clang-doc/JSONGenerator.cpp
@@ -648,16 +648,15 @@ void JSONGenerator::serializeInfo(const EnumInfo &I, json::Object &Obj) {
     Obj["BaseType"] = BaseTypeVal;
   }
 
-  if (!I.Members.empty())
-    serializeArray(I.Members, Obj, "Members", SerializeInfoLambda, "End",
-                   [&I](Object &JsonObj) {
-                     for (const auto &Member : I.Members) {
-                       if (!Member.Description.empty()) {
-                         JsonObj["HasComments"] = true;
-                         break;
-                       }
-                     }
-                   });
+  if (!I.Members.empty()) {
+    for (const auto &Member : I.Members) {
+      if (!Member.Description.empty()) {
+        Obj["HasComments"] = true;
+        break;
+      }
+    }
+    serializeArray(I.Members, Obj, "Members", SerializeInfoLambda);
+  }
 }
 
 void JSONGenerator::serializeInfo(const TypedefInfo &I, json::Object &Obj) {

>From 6419f5b2e9a8fed7825e6d92bafd328e263ab3a7 Mon Sep 17 00:00:00 2001
From: Samrudh Nelli <samrudhnelli at gmail.com>
Date: Mon, 2 Mar 2026 23:15:36 +0530
Subject: [PATCH 12/39] remove the leading whitespace

---
 clang-tools-extra/test/clang-doc/enum.cpp | 56 +++++++++++------------
 1 file changed, 28 insertions(+), 28 deletions(-)

diff --git a/clang-tools-extra/test/clang-doc/enum.cpp b/clang-tools-extra/test/clang-doc/enum.cpp
index 46d905034002e..4efac91944518 100644
--- a/clang-tools-extra/test/clang-doc/enum.cpp
+++ b/clang-tools-extra/test/clang-doc/enum.cpp
@@ -47,7 +47,7 @@ enum Color {
 // MD-INDEX: | Red |
 // MD-INDEX: | Green |
 // MD-INDEX: | Blue |
-// MD-INDEX: **brief** For specifying RGB colors
+// MD-INDEX: **brief**For specifying RGB colors
 
 // HTML-INDEX-LABEL:  <div id="{{([0-9A-F]{40})}}" class="delimiter-container">
 // HTML-INDEX-NEXT:     <div>
@@ -64,7 +64,7 @@ enum Color {
 // HTML-INDEX-NEXT:                 <td>Red</td>
 // HTML-INDEX-NEXT:                 <td>0</td>
 // HTML-INDEX-NEXT:                 <td><div class="nested-delimiter-container">
-// HTML-INDEX-NEXT:                       <p> Comment 1</p>
+// HTML-INDEX-NEXT:                       <p>Comment 1</p>
 // HTML-INDEX-NEXT:                     </div>
 // HTML-INDEX-NEXT:                 </td>
 // HTML-INDEX-NEXT:             </tr>
@@ -72,7 +72,7 @@ enum Color {
 // HTML-INDEX-NEXT:                 <td>Green</td>
 // HTML-INDEX-NEXT:                 <td>1</td>
 // HTML-INDEX-NEXT:                 <td><div class="nested-delimiter-container">
-// HTML-INDEX-NEXT:                       <p> Comment 2</p>
+// HTML-INDEX-NEXT:                       <p>Comment 2</p>
 // HTML-INDEX-NEXT:                     </div>
 // HTML-INDEX-NEXT:                 </td>
 // HTML-INDEX-NEXT:             </tr>
@@ -80,7 +80,7 @@ enum Color {
 // HTML-INDEX-NEXT:                 <td>Blue</td>
 // HTML-INDEX-NEXT:                 <td>2</td>
 // HTML-INDEX-NEXT:                 <td><div class="nested-delimiter-container">
-// HTML-INDEX-NEXT:                       <p> Comment 3</p>
+// HTML-INDEX-NEXT:                       <p>Comment 3</p>
 // HTML-INDEX-NEXT:                     </div>
 // HTML-INDEX-NEXT:                 </td>
 // HTML-INDEX-NEXT:             </tr>
@@ -122,7 +122,7 @@ enum class Shapes {
 // MD-INDEX: | Circle |
 // MD-INDEX: | Rectangle |
 // MD-INDEX: | Triangle |
-// MD-INDEX: **brief** Shape Types
+// MD-INDEX: **brief**Shape Types
 
 // HTML-INDEX-LABEL:  <div id="{{([0-9A-F]{40})}}" class="delimiter-container">
 // HTML-INDEX-NEXT:     <div>
@@ -139,7 +139,7 @@ enum class Shapes {
 // HTML-INDEX-NEXT:                 <td>Circle</td>
 // HTML-INDEX-NEXT:                 <td>0</td>
 // HTML-INDEX-NEXT:                 <td><div class="nested-delimiter-container">
-// HTML-INDEX-NEXT:                       <p> Comment 1</p>
+// HTML-INDEX-NEXT:                       <p>Comment 1</p>
 // HTML-INDEX-NEXT:                     </div>
 // HTML-INDEX-NEXT:                 </td>
 // HTML-INDEX-NEXT:             </tr>
@@ -147,7 +147,7 @@ enum class Shapes {
 // HTML-INDEX-NEXT:                 <td>Rectangle</td>
 // HTML-INDEX-NEXT:                 <td>1</td>
 // HTML-INDEX-NEXT:                 <td><div class="nested-delimiter-container">
-// HTML-INDEX-NEXT:                       <p> Comment 2</p>
+// HTML-INDEX-NEXT:                       <p>Comment 2</p>
 // HTML-INDEX-NEXT:                     </div>
 // HTML-INDEX-NEXT:                 </td>
 // HTML-INDEX-NEXT:             </tr>
@@ -155,7 +155,7 @@ enum class Shapes {
 // HTML-INDEX-NEXT:                 <td>Triangle</td>
 // HTML-INDEX-NEXT:                 <td>2</td>
 // HTML-INDEX-NEXT:                 <td><div class="nested-delimiter-container">
-// HTML-INDEX-NEXT:                       <p> Comment 3</p>
+// HTML-INDEX-NEXT:                       <p>Comment 3</p>
 // HTML-INDEX-NEXT:                     </div>
 // HTML-INDEX-NEXT:                 </td>
 // HTML-INDEX-NEXT:             </tr>
@@ -195,7 +195,7 @@ enum Size : uint8_t {
 // MD-INDEX: | Small |
 // MD-INDEX: | Medium |
 // MD-INDEX: | Large |
-// MD-INDEX: **brief** Specify the size
+// MD-INDEX: **brief**Specify the size
 
 // HTML-INDEX-LABEL:   <div id="{{([0-9A-F]{40})}}" class="delimiter-container">
 // HTML-INDEX-NEXT:     <div>
@@ -212,11 +212,11 @@ enum Size : uint8_t {
 // HTML-INDEX-NEXT:                 <td>Small</td>
 // HTML-INDEX-NEXT:                 <td>0</td>
 // HTML-INDEX-NEXT:                 <td><div class="nested-delimiter-container">
-// HTML-INDEX-NEXT:                       <p> A pearl.</p>
-// HTML-INDEX-NEXT:                       <p> Pearls are quite small.</p>
+// HTML-INDEX-NEXT:                       <p>A pearl.</p>
+// HTML-INDEX-NEXT:                       <p>Pearls are quite small.</p>
 // HTML-INDEX-NEXT:                     </div>
 // HTML-INDEX-NEXT:                     <div class="nested-delimiter-container">
-// HTML-INDEX-NEXT:                       <p>  Pearls are used in jewelry.</p>
+// HTML-INDEX-NEXT:                       <p>Pearls are used in jewelry.</p>
 // HTML-INDEX-NEXT:                     </div>
 // HTML-INDEX-NEXT:                 </td>
 // HTML-INDEX-NEXT:             </tr>
@@ -224,7 +224,7 @@ enum Size : uint8_t {
 // HTML-INDEX-NEXT:                 <td>Medium</td>
 // HTML-INDEX-NEXT:                 <td>1</td>
 // HTML-INDEX-NEXT:                 <td><div class="nested-delimiter-container">
-// HTML-INDEX-NEXT:                       <p> A tennis ball.</p>
+// HTML-INDEX-NEXT:                       <p>A tennis ball.</p>
 // HTML-INDEX-NEXT:                     </div>
 // HTML-INDEX-NEXT:                 </td>
 // HTML-INDEX-NEXT:             </tr>
@@ -232,7 +232,7 @@ enum Size : uint8_t {
 // HTML-INDEX-NEXT:                 <td>Large</td>
 // HTML-INDEX-NEXT:                 <td>2</td>
 // HTML-INDEX-NEXT:                 <td><div class="nested-delimiter-container">
-// HTML-INDEX-NEXT:                       <p> A football.</p>
+// HTML-INDEX-NEXT:                       <p>A football.</p>
 // HTML-INDEX-NEXT:                     </div>
 // HTML-INDEX-NEXT:                 </td>
 // HTML-INDEX-NEXT:             </tr>
@@ -258,7 +258,7 @@ enum : long long {
 // MD-INDEX: | enum (unnamed) : long long |
 // MD-INDEX: --
 // MD-INDEX: | BigVal |
-// MD-INDEX: **brief** Very long number
+// MD-INDEX: **brief**Very long number
 
 // HTML-INDEX-LABEL:  <div id="{{([0-9A-F]{40})}}" class="delimiter-container">
 // HTML-INDEX-NEXT:     <div>
@@ -275,7 +275,7 @@ enum : long long {
 // HTML-INDEX-NEXT:                 <td>BigVal</td>
 // HTML-INDEX-NEXT:                 <td>999999999999</td>
 // HTML-INDEX-NEXT:                 <td><div class="nested-delimiter-container">
-// HTML-INDEX-NEXT:                       <p> A very large value</p>
+// HTML-INDEX-NEXT:                       <p>A very large value</p>
 // HTML-INDEX-NEXT:                     </div>
 // HTML-INDEX-NEXT:                 </td>
 // HTML-INDEX-NEXT:             </tr>
@@ -310,7 +310,7 @@ class FilePermissions {
 // MD-PERM: | Read |
 // MD-PERM: | Write |
 // MD-PERM: | Execute |
-// MD-PERM: **brief** File permission flags
+// MD-PERM: **brief**File permission flags
 
 // HTML-PERM-LABEL:  <section id="Enums" class="section-container">
 // HTML-PERM-NEXT:     <h2>Enumerations</h2>
@@ -329,7 +329,7 @@ class FilePermissions {
 // HTML-PERM-NEXT:                   <td>Read</td>
 // HTML-PERM-NEXT:                   <td>1</td>
 // HTML-PERM-NEXT:                   <td><div class="nested-delimiter-container">
-// HTML-PERM-NEXT:                         <p> Permission to READ r</p>
+// HTML-PERM-NEXT:                         <p>Permission to READ r</p>
 // HTML-PERM-NEXT:                       </div>
 // HTML-PERM-NEXT:                   </td>
 // HTML-PERM-NEXT:               </tr>
@@ -337,7 +337,7 @@ class FilePermissions {
 // HTML-PERM-NEXT:                   <td>Write</td>
 // HTML-PERM-NEXT:                   <td>2</td>
 // HTML-PERM-NEXT:                   <td><div class="nested-delimiter-container">
-// HTML-PERM-NEXT:                         <p> Permission to WRITE w</p>
+// HTML-PERM-NEXT:                         <p>Permission to WRITE w</p>
 // HTML-PERM-NEXT:                       </div>
 // HTML-PERM-NEXT:                   </td>
 // HTML-PERM-NEXT:               </tr>
@@ -345,7 +345,7 @@ class FilePermissions {
 // HTML-PERM-NEXT:                   <td>Execute</td>
 // HTML-PERM-NEXT:                   <td>4</td>
 // HTML-PERM-NEXT:                   <td><div class="nested-delimiter-container">
-// HTML-PERM-NEXT:                         <p> Permission to EXECUTE x</p>
+// HTML-PERM-NEXT:                         <p>Permission to EXECUTE x</p>
 // HTML-PERM-NEXT:                       </div>
 // HTML-PERM-NEXT:                   </td>
 // HTML-PERM-NEXT:               </tr>
@@ -396,7 +396,7 @@ class Animals {
 // HTML-ANIMAL-NEXT:                     <td>Dog</td>
 // HTML-ANIMAL-NEXT:                     <td>0</td>
 // HTML-ANIMAL-NEXT:                     <td><div class="nested-delimiter-container">
-// HTML-ANIMAL-NEXT:                           <p> Man's best friend</p>
+// HTML-ANIMAL-NEXT:                           <p>Man's best friend</p>
 // HTML-ANIMAL-NEXT:                         </div>
 // HTML-ANIMAL-NEXT:                     </td>
 // HTML-ANIMAL-NEXT:                 </tr>
@@ -404,7 +404,7 @@ class Animals {
 // HTML-ANIMAL-NEXT:                     <td>Cat</td>
 // HTML-ANIMAL-NEXT:                     <td>1</td>
 // HTML-ANIMAL-NEXT:                     <td><div class="nested-delimiter-container">
-// HTML-ANIMAL-NEXT:                           <p> Man's other best friend</p>
+// HTML-ANIMAL-NEXT:                           <p>Man's other best friend</p>
 // HTML-ANIMAL-NEXT:                         </div>
 // HTML-ANIMAL-NEXT:                     </td>
 // HTML-ANIMAL-NEXT:                 </tr>
@@ -412,7 +412,7 @@ class Animals {
 // HTML-ANIMAL-NEXT:                     <td>Iguana</td>
 // HTML-ANIMAL-NEXT:                     <td>2</td>
 // HTML-ANIMAL-NEXT:                     <td><div class="nested-delimiter-container">
-// HTML-ANIMAL-NEXT:                           <p> A lizard</p>
+// HTML-ANIMAL-NEXT:                           <p>A lizard</p>
 // HTML-ANIMAL-NEXT:                         </div>
 // HTML-ANIMAL-NEXT:                     </td>
 // HTML-ANIMAL-NEXT:                 </tr>
@@ -469,7 +469,7 @@ enum Car {
 // MD-VEHICLES: | SUV |
 // MD-VEHICLES: | Pickup |
 // MD-VEHICLES: | Hatchback |
-// MD-VEHICLES: **brief** specify type of car
+// MD-VEHICLES: **brief**specify type of car
 
 // HTML-VEHICLES-LABEL:   <div id="{{([0-9A-F]{40})}}" class="delimiter-container">
 // HTML-VEHICLES-NEXT:      <div>
@@ -486,7 +486,7 @@ enum Car {
 // HTML-VEHICLES-NEXT:                  <td>Sedan</td>
 // HTML-VEHICLES-NEXT:                  <td>0</td>
 // HTML-VEHICLES-NEXT:                  <td><div class="nested-delimiter-container">
-// HTML-VEHICLES-NEXT:                        <p> Comment 1</p>
+// HTML-VEHICLES-NEXT:                        <p>Comment 1</p>
 // HTML-VEHICLES-NEXT:                      </div>
 // HTML-VEHICLES-NEXT:                  </td>
 // HTML-VEHICLES-NEXT:              </tr>
@@ -494,7 +494,7 @@ enum Car {
 // HTML-VEHICLES-NEXT:                  <td>SUV</td>
 // HTML-VEHICLES-NEXT:                  <td>1</td>
 // HTML-VEHICLES-NEXT:                  <td><div class="nested-delimiter-container">
-// HTML-VEHICLES-NEXT:                        <p> Comment 2</p>
+// HTML-VEHICLES-NEXT:                        <p>Comment 2</p>
 // HTML-VEHICLES-NEXT:                      </div>
 // HTML-VEHICLES-NEXT:                  </td>
 // HTML-VEHICLES-NEXT:              </tr>
@@ -502,7 +502,7 @@ enum Car {
 // HTML-VEHICLES-NEXT:                  <td>Pickup</td>
 // HTML-VEHICLES-NEXT:                  <td>2</td>
 // HTML-VEHICLES-NEXT:                  <td><div class="nested-delimiter-container">
-// HTML-VEHICLES-NEXT:                        <p> Comment 3</p>
+// HTML-VEHICLES-NEXT:                        <p>Comment 3</p>
 // HTML-VEHICLES-NEXT:                      </div>
 // HTML-VEHICLES-NEXT:                  </td>
 // HTML-VEHICLES-NEXT:              </tr>
@@ -510,7 +510,7 @@ enum Car {
 // HTML-VEHICLES-NEXT:                  <td>Hatchback</td>
 // HTML-VEHICLES-NEXT:                  <td>3</td>
 // HTML-VEHICLES-NEXT:                  <td><div class="nested-delimiter-container">
-// HTML-VEHICLES-NEXT:                        <p> Comment 4</p>
+// HTML-VEHICLES-NEXT:                        <p>Comment 4</p>
 // HTML-VEHICLES-NEXT:                      </div>
 // HTML-VEHICLES-NEXT:                  </td>
 // HTML-VEHICLES-NEXT:              </tr>

>From 6a25b383581a7f12705cbaf11f45c8591746c854 Mon Sep 17 00:00:00 2001
From: Samrudh Nelli <samrudhnelli at gmail.com>
Date: Tue, 3 Mar 2026 00:45:58 +0530
Subject: [PATCH 13/39] fix the tests

---
 clang-tools-extra/test/clang-doc/enum.cpp | 12 ++++++------
 1 file changed, 6 insertions(+), 6 deletions(-)

diff --git a/clang-tools-extra/test/clang-doc/enum.cpp b/clang-tools-extra/test/clang-doc/enum.cpp
index 4efac91944518..ac42043d7bb4f 100644
--- a/clang-tools-extra/test/clang-doc/enum.cpp
+++ b/clang-tools-extra/test/clang-doc/enum.cpp
@@ -47,7 +47,7 @@ enum Color {
 // MD-INDEX: | Red |
 // MD-INDEX: | Green |
 // MD-INDEX: | Blue |
-// MD-INDEX: **brief**For specifying RGB colors
+// MD-INDEX: **brief** For specifying RGB colors
 
 // HTML-INDEX-LABEL:  <div id="{{([0-9A-F]{40})}}" class="delimiter-container">
 // HTML-INDEX-NEXT:     <div>
@@ -122,7 +122,7 @@ enum class Shapes {
 // MD-INDEX: | Circle |
 // MD-INDEX: | Rectangle |
 // MD-INDEX: | Triangle |
-// MD-INDEX: **brief**Shape Types
+// MD-INDEX: **brief** Shape Types
 
 // HTML-INDEX-LABEL:  <div id="{{([0-9A-F]{40})}}" class="delimiter-container">
 // HTML-INDEX-NEXT:     <div>
@@ -195,7 +195,7 @@ enum Size : uint8_t {
 // MD-INDEX: | Small |
 // MD-INDEX: | Medium |
 // MD-INDEX: | Large |
-// MD-INDEX: **brief**Specify the size
+// MD-INDEX: **brief** Specify the size
 
 // HTML-INDEX-LABEL:   <div id="{{([0-9A-F]{40})}}" class="delimiter-container">
 // HTML-INDEX-NEXT:     <div>
@@ -258,7 +258,7 @@ enum : long long {
 // MD-INDEX: | enum (unnamed) : long long |
 // MD-INDEX: --
 // MD-INDEX: | BigVal |
-// MD-INDEX: **brief**Very long number
+// MD-INDEX: **brief** Very long number
 
 // HTML-INDEX-LABEL:  <div id="{{([0-9A-F]{40})}}" class="delimiter-container">
 // HTML-INDEX-NEXT:     <div>
@@ -310,7 +310,7 @@ class FilePermissions {
 // MD-PERM: | Read |
 // MD-PERM: | Write |
 // MD-PERM: | Execute |
-// MD-PERM: **brief**File permission flags
+// MD-PERM: **brief** File permission flags
 
 // HTML-PERM-LABEL:  <section id="Enums" class="section-container">
 // HTML-PERM-NEXT:     <h2>Enumerations</h2>
@@ -469,7 +469,7 @@ enum Car {
 // MD-VEHICLES: | SUV |
 // MD-VEHICLES: | Pickup |
 // MD-VEHICLES: | Hatchback |
-// MD-VEHICLES: **brief**specify type of car
+// MD-VEHICLES: **brief** specify type of car
 
 // HTML-VEHICLES-LABEL:   <div id="{{([0-9A-F]{40})}}" class="delimiter-container">
 // HTML-VEHICLES-NEXT:      <div>

>From 30d0eb1addf424f985168e1ff08be6755c60c359 Mon Sep 17 00:00:00 2001
From: Samrudh Nelli <samrudhnelli at gmail.com>
Date: Tue, 3 Mar 2026 00:59:56 +0530
Subject: [PATCH 14/39] add a TODO, cleanup json test

---
 clang-tools-extra/clang-doc/Serialize.cpp | 3 ++-
 clang-tools-extra/test/clang-doc/enum.cpp | 2 --
 2 files changed, 2 insertions(+), 3 deletions(-)

diff --git a/clang-tools-extra/clang-doc/Serialize.cpp b/clang-tools-extra/clang-doc/Serialize.cpp
index 14c8fcca25abd..76ef5eb03dda7 100644
--- a/clang-tools-extra/clang-doc/Serialize.cpp
+++ b/clang-tools-extra/clang-doc/Serialize.cpp
@@ -239,7 +239,8 @@ void ClangDocCommentVisitor::parseComment(const comments::Comment *C) {
 
 void ClangDocCommentVisitor::visitTextComment(const TextComment *C) {
   if (!isWhitespaceOnly(C->getText()))
-    CurrentCI.Text = C->getText().trim();
+    CurrentCI.Text = C->getText().trim(); // TODO: Trim the comments before
+                                          // parsing them into the AST.
 }
 
 void ClangDocCommentVisitor::visitInlineCommandComment(
diff --git a/clang-tools-extra/test/clang-doc/enum.cpp b/clang-tools-extra/test/clang-doc/enum.cpp
index ac42043d7bb4f..06c0d93f2227b 100644
--- a/clang-tools-extra/test/clang-doc/enum.cpp
+++ b/clang-tools-extra/test/clang-doc/enum.cpp
@@ -1,10 +1,8 @@
 // RUN: rm -rf %t && mkdir -p %t
 // RUN: clang-doc --format=html --doxygen --output=%t --executor=standalone %s
 // RUN: clang-doc --format=md --doxygen --output=%t --executor=standalone %s
-// RUN: clang-doc --format=json --doxygen --output=%t --executor=standalone %s
 // RUN: FileCheck %s < %t/html/GlobalNamespace/index.html --check-prefix=HTML-INDEX-LINE
 // RUN: FileCheck %s < %t/html/GlobalNamespace/index.html --check-prefix=HTML-INDEX
-// RUN: FileCheck %s < %t/json/GlobalNamespace/index.json --check-prefix=JSON-INDEX
 // RUN: FileCheck %s < %t/html/GlobalNamespace/_ZTV7Animals.html --check-prefix=HTML-ANIMAL-LINE
 // RUN: FileCheck %s < %t/html/GlobalNamespace/_ZTV7Animals.html --check-prefix=HTML-ANIMAL
 // RUN: FileCheck %s < %t/html/GlobalNamespace/_ZTV15FilePermissions.html --check-prefix=HTML-PERM-LINE

>From 55af2f4691a3ff7e921de07b0fbe6760dc2e3b92 Mon Sep 17 00:00:00 2001
From: Samrudh Nelli <samrudhnelli at gmail.com>
Date: Tue, 3 Mar 2026 12:12:19 +0530
Subject: [PATCH 15/39] use <p> instead of <div> for paragraph comments

---
 .../assets/comment-template.mustache          |   6 +-
 .../clang-doc/basic-project.mustache.test     |  24 ++--
 clang-tools-extra/test/clang-doc/enum.cpp     | 122 +++++++++---------
 .../test/clang-doc/namespace.cpp              |  18 +--
 .../test/clang-doc/templates.cpp              |  18 +--
 5 files changed, 94 insertions(+), 94 deletions(-)

diff --git a/clang-tools-extra/clang-doc/assets/comment-template.mustache b/clang-tools-extra/clang-doc/assets/comment-template.mustache
index 8a23279470da0..6f27a6f5a5d09 100644
--- a/clang-tools-extra/clang-doc/assets/comment-template.mustache
+++ b/clang-tools-extra/clang-doc/assets/comment-template.mustache
@@ -13,11 +13,11 @@
 </div>
 {{/BriefComments}}
 {{#ParagraphComments}}
-<div class="nested-delimiter-container">
+<p class="nested-delimiter-container">
     {{#.}}
-    <p>{{TextComment}}</p>
+    {{TextComment}}<br>
     {{/.}}
-</div>
+</p>
 {{/ParagraphComments}}
 {{#ParagraphComment}}
 {{#Children}}
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 0b190caeed8f5..31392733aaafd 100644
--- a/clang-tools-extra/test/clang-doc/basic-project.mustache.test
+++ b/clang-tools-extra/test/clang-doc/basic-project.mustache.test
@@ -65,9 +65,9 @@ HTML-SHAPE-NEXT:                     <div class="doc-card">
 HTML-SHAPE-NEXT:                         <div class="nested-delimiter-container">
 HTML-SHAPE-NEXT:                             <p>Abstract base class for shapes.</p>
 HTML-SHAPE-NEXT:                         </div>
-HTML-SHAPE-NEXT:                         <div class="nested-delimiter-container">
-HTML-SHAPE-NEXT:                             <p>Provides a common interface for different types of shapes.</p>
-HTML-SHAPE-NEXT:                         </div>
+HTML-SHAPE-NEXT:                         <p class="nested-delimiter-container">
+HTML-SHAPE-NEXT:                             Provides a common interface for different types of shapes.<br>
+HTML-SHAPE-NEXT:                         </p>
 HTML-SHAPE-NEXT:                     </div>
 HTML-SHAPE-NEXT:                 </div>
 HTML-SHAPE-NEXT:             </section>
@@ -185,9 +185,9 @@ HTML-CALC-NEXT:                     <div class="doc-card">
 HTML-CALC-NEXT:                         <div class="nested-delimiter-container">
 HTML-CALC-NEXT:                             <p>A simple calculator class.</p>
 HTML-CALC-NEXT:                         </div>
-HTML-CALC-NEXT:                         <div class="nested-delimiter-container">
-HTML-CALC-NEXT:                             <p>Provides basic arithmetic operations.</p>
-HTML-CALC-NEXT:                         </div>
+HTML-CALC-NEXT:                         <p class="nested-delimiter-container">
+HTML-CALC-NEXT:                             Provides basic arithmetic operations.<br>
+HTML-CALC-NEXT:                         </p>
 HTML-CALC-NEXT:                     </div>
 HTML-CALC-NEXT:                 </div>
 HTML-CALC-NEXT:            </section>
@@ -370,9 +370,9 @@ HTML-RECTANGLE-NEXT:                     <div class="doc-card">
 HTML-RECTANGLE-NEXT:                         <div class="nested-delimiter-container">
 HTML-RECTANGLE-NEXT:                             <p>Rectangle class derived from Shape.</p>
 HTML-RECTANGLE-NEXT:                         </div>
-HTML-RECTANGLE-NEXT:                         <div class="nested-delimiter-container">
-HTML-RECTANGLE-NEXT:                             <p>Represents a rectangle with a given width and height.</p>
-HTML-RECTANGLE-NEXT:                         </div>
+HTML-RECTANGLE-NEXT:                         <p class="nested-delimiter-container">
+HTML-RECTANGLE-NEXT:                             Represents a rectangle with a given width and height.<br>
+HTML-RECTANGLE-NEXT:                         </p>
 HTML-RECTANGLE-NEXT:                     </div>
 HTML-RECTANGLE-NEXT:                 </div>
 HTML-RECTANGLE-NEXT:             </section>
@@ -476,9 +476,9 @@ HTML-CIRCLE-NEXT:                     <div class="doc-card">
 HTML-CIRCLE-NEXT:                         <div class="nested-delimiter-container">
 HTML-CIRCLE-NEXT:                             <p>Circle class derived from Shape.</p>
 HTML-CIRCLE-NEXT:                         </div>
-HTML-CIRCLE-NEXT:                         <div class="nested-delimiter-container">
-HTML-CIRCLE-NEXT:                             <p>Represents a circle with a given radius.</p>
-HTML-CIRCLE-NEXT:                         </div>
+HTML-CIRCLE-NEXT:                         <p class="nested-delimiter-container">
+HTML-CIRCLE-NEXT:                             Represents a circle with a given radius.<br>
+HTML-CIRCLE-NEXT:                         </p>
 HTML-CIRCLE-NEXT:                     </div>
 HTML-CIRCLE-NEXT:                 </div>
 HTML-CIRCLE-NEXT:             </section>
diff --git a/clang-tools-extra/test/clang-doc/enum.cpp b/clang-tools-extra/test/clang-doc/enum.cpp
index 06c0d93f2227b..ae2ceb9194bea 100644
--- a/clang-tools-extra/test/clang-doc/enum.cpp
+++ b/clang-tools-extra/test/clang-doc/enum.cpp
@@ -61,25 +61,25 @@ enum Color {
 // HTML-INDEX-NEXT:             <tr>
 // HTML-INDEX-NEXT:                 <td>Red</td>
 // HTML-INDEX-NEXT:                 <td>0</td>
-// HTML-INDEX-NEXT:                 <td><div class="nested-delimiter-container">
-// HTML-INDEX-NEXT:                       <p>Comment 1</p>
-// HTML-INDEX-NEXT:                     </div>
+// HTML-INDEX-NEXT:                 <td><p class="nested-delimiter-container">
+// HTML-INDEX-NEXT:                       Comment 1<br>
+// HTML-INDEX-NEXT:                     </p>
 // HTML-INDEX-NEXT:                 </td>
 // HTML-INDEX-NEXT:             </tr>
 // HTML-INDEX-NEXT:             <tr>
 // HTML-INDEX-NEXT:                 <td>Green</td>
 // HTML-INDEX-NEXT:                 <td>1</td>
-// HTML-INDEX-NEXT:                 <td><div class="nested-delimiter-container">
-// HTML-INDEX-NEXT:                       <p>Comment 2</p>
-// HTML-INDEX-NEXT:                     </div>
+// HTML-INDEX-NEXT:                 <td><p class="nested-delimiter-container">
+// HTML-INDEX-NEXT:                       Comment 2<br>
+// HTML-INDEX-NEXT:                     </p>
 // HTML-INDEX-NEXT:                 </td>
 // HTML-INDEX-NEXT:             </tr>
 // HTML-INDEX-NEXT:             <tr>
 // HTML-INDEX-NEXT:                 <td>Blue</td>
 // HTML-INDEX-NEXT:                 <td>2</td>
-// HTML-INDEX-NEXT:                 <td><div class="nested-delimiter-container">
-// HTML-INDEX-NEXT:                       <p>Comment 3</p>
-// HTML-INDEX-NEXT:                     </div>
+// HTML-INDEX-NEXT:                 <td><p class="nested-delimiter-container">
+// HTML-INDEX-NEXT:                       Comment 3<br>
+// HTML-INDEX-NEXT:                     </p>
 // HTML-INDEX-NEXT:                 </td>
 // HTML-INDEX-NEXT:             </tr>
 // HTML-INDEX-NEXT:         </tbody>
@@ -136,25 +136,25 @@ enum class Shapes {
 // HTML-INDEX-NEXT:             <tr>
 // HTML-INDEX-NEXT:                 <td>Circle</td>
 // HTML-INDEX-NEXT:                 <td>0</td>
-// HTML-INDEX-NEXT:                 <td><div class="nested-delimiter-container">
-// HTML-INDEX-NEXT:                       <p>Comment 1</p>
-// HTML-INDEX-NEXT:                     </div>
+// HTML-INDEX-NEXT:                 <td><p class="nested-delimiter-container">
+// HTML-INDEX-NEXT:                       Comment 1<br>
+// HTML-INDEX-NEXT:                     </p>
 // HTML-INDEX-NEXT:                 </td>
 // HTML-INDEX-NEXT:             </tr>
 // HTML-INDEX-NEXT:             <tr>
 // HTML-INDEX-NEXT:                 <td>Rectangle</td>
 // HTML-INDEX-NEXT:                 <td>1</td>
-// HTML-INDEX-NEXT:                 <td><div class="nested-delimiter-container">
-// HTML-INDEX-NEXT:                       <p>Comment 2</p>
-// HTML-INDEX-NEXT:                     </div>
+// HTML-INDEX-NEXT:                 <td><p class="nested-delimiter-container">
+// HTML-INDEX-NEXT:                       Comment 2<br>
+// HTML-INDEX-NEXT:                     </p>
 // HTML-INDEX-NEXT:                 </td>
 // HTML-INDEX-NEXT:             </tr>
 // HTML-INDEX-NEXT:             <tr>
 // HTML-INDEX-NEXT:                 <td>Triangle</td>
 // HTML-INDEX-NEXT:                 <td>2</td>
-// HTML-INDEX-NEXT:                 <td><div class="nested-delimiter-container">
-// HTML-INDEX-NEXT:                       <p>Comment 3</p>
-// HTML-INDEX-NEXT:                     </div>
+// HTML-INDEX-NEXT:                 <td><p class="nested-delimiter-container">
+// HTML-INDEX-NEXT:                       Comment 3<br>
+// HTML-INDEX-NEXT:                     </p>
 // HTML-INDEX-NEXT:                 </td>
 // HTML-INDEX-NEXT:             </tr>
 // HTML-INDEX-NEXT:         </tbody>
@@ -209,13 +209,13 @@ enum Size : uint8_t {
 // HTML-INDEX-NEXT:             <tr>
 // HTML-INDEX-NEXT:                 <td>Small</td>
 // HTML-INDEX-NEXT:                 <td>0</td>
-// HTML-INDEX-NEXT:                 <td><div class="nested-delimiter-container">
-// HTML-INDEX-NEXT:                       <p>A pearl.</p>
-// HTML-INDEX-NEXT:                       <p>Pearls are quite small.</p>
-// HTML-INDEX-NEXT:                     </div>
-// HTML-INDEX-NEXT:                     <div class="nested-delimiter-container">
-// HTML-INDEX-NEXT:                       <p>Pearls are used in jewelry.</p>
-// HTML-INDEX-NEXT:                     </div>
+// HTML-INDEX-NEXT:                 <td><p class="nested-delimiter-container">
+// HTML-INDEX-NEXT:                       A pearl.<br>
+// HTML-INDEX-NEXT:                       Pearls are quite small.<br>
+// HTML-INDEX-NEXT:                     </p>
+// HTML-INDEX-NEXT:                     <p class="nested-delimiter-container">
+// HTML-INDEX-NEXT:                       Pearls are used in jewelry.<br>
+// HTML-INDEX-NEXT:                     </p>
 // HTML-INDEX-NEXT:                 </td>
 // HTML-INDEX-NEXT:             </tr>
 // HTML-INDEX-NEXT:             <tr>
@@ -229,9 +229,9 @@ enum Size : uint8_t {
 // HTML-INDEX-NEXT:             <tr>
 // HTML-INDEX-NEXT:                 <td>Large</td>
 // HTML-INDEX-NEXT:                 <td>2</td>
-// HTML-INDEX-NEXT:                 <td><div class="nested-delimiter-container">
-// HTML-INDEX-NEXT:                       <p>A football.</p>
-// HTML-INDEX-NEXT:                     </div>
+// HTML-INDEX-NEXT:                 <td><p class="nested-delimiter-container">
+// HTML-INDEX-NEXT:                       A football.<br>
+// HTML-INDEX-NEXT:                     </p>
 // HTML-INDEX-NEXT:                 </td>
 // HTML-INDEX-NEXT:             </tr>
 // HTML-INDEX-NEXT:         </tbody>
@@ -272,9 +272,9 @@ enum : long long {
 // HTML-INDEX-NEXT:             <tr>
 // HTML-INDEX-NEXT:                 <td>BigVal</td>
 // HTML-INDEX-NEXT:                 <td>999999999999</td>
-// HTML-INDEX-NEXT:                 <td><div class="nested-delimiter-container">
-// HTML-INDEX-NEXT:                       <p>A very large value</p>
-// HTML-INDEX-NEXT:                     </div>
+// HTML-INDEX-NEXT:                 <td><p class="nested-delimiter-container">
+// HTML-INDEX-NEXT:                       A very large value<br>
+// HTML-INDEX-NEXT:                     </p>
 // HTML-INDEX-NEXT:                 </td>
 // HTML-INDEX-NEXT:             </tr>
 // HTML-INDEX-NEXT:         </tbody>
@@ -326,25 +326,25 @@ class FilePermissions {
 // HTML-PERM-NEXT:               <tr>
 // HTML-PERM-NEXT:                   <td>Read</td>
 // HTML-PERM-NEXT:                   <td>1</td>
-// HTML-PERM-NEXT:                   <td><div class="nested-delimiter-container">
-// HTML-PERM-NEXT:                         <p>Permission to READ r</p>
-// HTML-PERM-NEXT:                       </div>
+// HTML-PERM-NEXT:                   <td><p class="nested-delimiter-container">
+// HTML-PERM-NEXT:                         Permission to READ r<br>
+// HTML-PERM-NEXT:                       </p>
 // HTML-PERM-NEXT:                   </td>
 // HTML-PERM-NEXT:               </tr>
 // HTML-PERM-NEXT:               <tr>
 // HTML-PERM-NEXT:                   <td>Write</td>
 // HTML-PERM-NEXT:                   <td>2</td>
-// HTML-PERM-NEXT:                   <td><div class="nested-delimiter-container">
-// HTML-PERM-NEXT:                         <p>Permission to WRITE w</p>
-// HTML-PERM-NEXT:                       </div>
+// HTML-PERM-NEXT:                   <td><p class="nested-delimiter-container">
+// HTML-PERM-NEXT:                         Permission to WRITE w<br>
+// HTML-PERM-NEXT:                       </p>
 // HTML-PERM-NEXT:                   </td>
 // HTML-PERM-NEXT:               </tr>
 // HTML-PERM-NEXT:               <tr>
 // HTML-PERM-NEXT:                   <td>Execute</td>
 // HTML-PERM-NEXT:                   <td>4</td>
-// HTML-PERM-NEXT:                   <td><div class="nested-delimiter-container">
-// HTML-PERM-NEXT:                         <p>Permission to EXECUTE x</p>
-// HTML-PERM-NEXT:                       </div>
+// HTML-PERM-NEXT:                   <td><p class="nested-delimiter-container">
+// HTML-PERM-NEXT:                         Permission to EXECUTE x<br>
+// HTML-PERM-NEXT:                       </p>
 // HTML-PERM-NEXT:                   </td>
 // HTML-PERM-NEXT:               </tr>
 // HTML-PERM-NEXT:           </tbody>
@@ -393,25 +393,25 @@ class Animals {
 // HTML-ANIMAL-NEXT:                 <tr>
 // HTML-ANIMAL-NEXT:                     <td>Dog</td>
 // HTML-ANIMAL-NEXT:                     <td>0</td>
-// HTML-ANIMAL-NEXT:                     <td><div class="nested-delimiter-container">
-// HTML-ANIMAL-NEXT:                           <p>Man's best friend</p>
-// HTML-ANIMAL-NEXT:                         </div>
+// HTML-ANIMAL-NEXT:                     <td><p class="nested-delimiter-container">
+// HTML-ANIMAL-NEXT:                           Man's best friend<br>
+// HTML-ANIMAL-NEXT:                         </p>
 // HTML-ANIMAL-NEXT:                     </td>
 // HTML-ANIMAL-NEXT:                 </tr>
 // HTML-ANIMAL-NEXT:                 <tr>
 // HTML-ANIMAL-NEXT:                     <td>Cat</td>
 // HTML-ANIMAL-NEXT:                     <td>1</td>
-// HTML-ANIMAL-NEXT:                     <td><div class="nested-delimiter-container">
-// HTML-ANIMAL-NEXT:                           <p>Man's other best friend</p>
-// HTML-ANIMAL-NEXT:                         </div>
+// HTML-ANIMAL-NEXT:                     <td><p class="nested-delimiter-container">
+// HTML-ANIMAL-NEXT:                           Man's other best friend<br>
+// HTML-ANIMAL-NEXT:                         </p>
 // HTML-ANIMAL-NEXT:                     </td>
 // HTML-ANIMAL-NEXT:                 </tr>
 // HTML-ANIMAL-NEXT:                 <tr>
 // HTML-ANIMAL-NEXT:                     <td>Iguana</td>
 // HTML-ANIMAL-NEXT:                     <td>2</td>
-// HTML-ANIMAL-NEXT:                     <td><div class="nested-delimiter-container">
-// HTML-ANIMAL-NEXT:                           <p>A lizard</p>
-// HTML-ANIMAL-NEXT:                         </div>
+// HTML-ANIMAL-NEXT:                     <td><p class="nested-delimiter-container">
+// HTML-ANIMAL-NEXT:                           A lizard<br>
+// HTML-ANIMAL-NEXT:                         </p>
 // HTML-ANIMAL-NEXT:                     </td>
 // HTML-ANIMAL-NEXT:                 </tr>
 // HTML-ANIMAL-NEXT:             </tbody>
@@ -483,33 +483,33 @@ enum Car {
 // HTML-VEHICLES-NEXT:              <tr>
 // HTML-VEHICLES-NEXT:                  <td>Sedan</td>
 // HTML-VEHICLES-NEXT:                  <td>0</td>
-// HTML-VEHICLES-NEXT:                  <td><div class="nested-delimiter-container">
-// HTML-VEHICLES-NEXT:                        <p>Comment 1</p>
-// HTML-VEHICLES-NEXT:                      </div>
+// HTML-VEHICLES-NEXT:                  <td><p class="nested-delimiter-container">
+// HTML-VEHICLES-NEXT:                        Comment 1<br>
+// HTML-VEHICLES-NEXT:                      </p>
 // HTML-VEHICLES-NEXT:                  </td>
 // HTML-VEHICLES-NEXT:              </tr>
 // HTML-VEHICLES-NEXT:              <tr>
 // HTML-VEHICLES-NEXT:                  <td>SUV</td>
 // HTML-VEHICLES-NEXT:                  <td>1</td>
-// HTML-VEHICLES-NEXT:                  <td><div class="nested-delimiter-container">
-// HTML-VEHICLES-NEXT:                        <p>Comment 2</p>
-// HTML-VEHICLES-NEXT:                      </div>
+// HTML-VEHICLES-NEXT:                  <td><p class="nested-delimiter-container">
+// HTML-VEHICLES-NEXT:                        Comment 2<br>
+// HTML-VEHICLES-NEXT:                      </p>
 // HTML-VEHICLES-NEXT:                  </td>
 // HTML-VEHICLES-NEXT:              </tr>
 // HTML-VEHICLES-NEXT:              <tr>
 // HTML-VEHICLES-NEXT:                  <td>Pickup</td>
 // HTML-VEHICLES-NEXT:                  <td>2</td>
-// HTML-VEHICLES-NEXT:                  <td><div class="nested-delimiter-container">
-// HTML-VEHICLES-NEXT:                        <p>Comment 3</p>
-// HTML-VEHICLES-NEXT:                      </div>
+// HTML-VEHICLES-NEXT:                  <td><p class="nested-delimiter-container">
+// HTML-VEHICLES-NEXT:                        Comment 3<br>
+// HTML-VEHICLES-NEXT:                      </p>
 // HTML-VEHICLES-NEXT:                  </td>
 // HTML-VEHICLES-NEXT:              </tr>
 // HTML-VEHICLES-NEXT:              <tr>
 // HTML-VEHICLES-NEXT:                  <td>Hatchback</td>
 // HTML-VEHICLES-NEXT:                  <td>3</td>
-// HTML-VEHICLES-NEXT:                  <td><div class="nested-delimiter-container">
-// HTML-VEHICLES-NEXT:                        <p>Comment 4</p>
-// HTML-VEHICLES-NEXT:                      </div>
+// HTML-VEHICLES-NEXT:                  <td><p class="nested-delimiter-container">
+// HTML-VEHICLES-NEXT:                        Comment 4<br>
+// HTML-VEHICLES-NEXT:                      </p>
 // HTML-VEHICLES-NEXT:                  </td>
 // HTML-VEHICLES-NEXT:              </tr>
 // HTML-VEHICLES-NEXT:          </tbody>
diff --git a/clang-tools-extra/test/clang-doc/namespace.cpp b/clang-tools-extra/test/clang-doc/namespace.cpp
index e39fbacb62638..58198dc9e2334 100644
--- a/clang-tools-extra/test/clang-doc/namespace.cpp
+++ b/clang-tools-extra/test/clang-doc/namespace.cpp
@@ -195,9 +195,9 @@ class ClassInNestedNamespace {};
 // HTML-NESTED-INDEX:     </ul>
 // HTML-NESTED-INDEX:         <pre><code class="language-cpp code-clang-doc">void functionInNestedNamespace ()</code></pre>
 // HTML-NESTED-INDEX:         <div class="doc-card">
-// HTML-NESTED-INDEX:             <div class="nested-delimiter-container">
-// HTML-NESTED-INDEX:                 <p>Function in NestedNamespace</p>
-// HTML-NESTED-INDEX:             </div>
+// HTML-NESTED-INDEX:             <p class="nested-delimiter-container">
+// HTML-NESTED-INDEX:                 Function in NestedNamespace<br>
+// HTML-NESTED-INDEX:             </p>
 // HTML-NESTED-INDEX:         </div>
 // HTML-NESTED-INDEX:         <p>Defined at line [[@LINE-56]] of file {{.*}}namespace.cpp</p>
 // HTML-NESTED-INDEX:     </div>
@@ -240,9 +240,9 @@ class ClassInNestedNamespace {};
 // HTML-PRIMARY-INDEX:          </ul>
 // HTML-PRIMARY-INDEX:          <pre><code class="language-cpp code-clang-doc">void functionInPrimaryNamespace ()</code></pre>
 // HTML-PRIMARY-INDEX:          <div class="doc-card">
-// HTML-PRIMARY-INDEX:              <div class="nested-delimiter-container">
-// HTML-PRIMARY-INDEX:                  <p>Function in PrimaryNamespace</p>
-// HTML-PRIMARY-INDEX:              </div>
+// HTML-PRIMARY-INDEX:              <p class="nested-delimiter-container">
+// HTML-PRIMARY-INDEX:                  Function in PrimaryNamespace<br>
+// HTML-PRIMARY-INDEX:              </p>
 // HTML-PRIMARY-INDEX:          </div>
 // HTML-PRIMARY-INDEX:          <p>Defined at line [[@LINE-130]] of file {{.*}}clang-tools-extra{{[\/]}}test{{[\/]}}clang-doc{{[\/]}}namespace.cpp</p>
 // HTML-PRIMARY-INDEX:      </div>
@@ -320,9 +320,9 @@ class ClassInAnotherNamespace {};
 // HTML-ANOTHER-INDEX:     </ul>
 // HTML-ANOTHER-INDEX:         <pre><code class="language-cpp code-clang-doc">void functionInAnotherNamespace ()</code></pre>
 // HTML-ANOTHER-INDEX:         <div class="doc-card">
-// HTML-ANOTHER-INDEX:             <div class="nested-delimiter-container">
-// HTML-ANOTHER-INDEX:                 <p>Function in AnotherNamespace</p>
-// HTML-ANOTHER-INDEX:             </div>
+// HTML-ANOTHER-INDEX:             <p class="nested-delimiter-container">
+// HTML-ANOTHER-INDEX:                 Function in AnotherNamespace<br>
+// HTML-ANOTHER-INDEX:             </p>
 // HTML-ANOTHER-INDEX:         </div>
 // HTML-ANOTHER-INDEX:         <p>Defined at line [[@LINE-55]] of file {{.*}}clang-tools-extra{{[\/]}}test{{[\/]}}clang-doc{{[\/]}}namespace.cpp</p>
 // HTML-ANOTHER-INDEX:     </div>
diff --git a/clang-tools-extra/test/clang-doc/templates.cpp b/clang-tools-extra/test/clang-doc/templates.cpp
index 86af599472894..bfaeab87ab049 100644
--- a/clang-tools-extra/test/clang-doc/templates.cpp
+++ b/clang-tools-extra/test/clang-doc/templates.cpp
@@ -387,12 +387,12 @@ struct tuple {};
 // HTML-STRUCT-NEXT:           <h1 class="hero__title-large">struct tuple</h1>
 // HTML-STRUCT-NEXT:           <p>Defined at line [[# @LINE - 6]] of file {{.*}}templates.cpp</p>
 // HTML-STRUCT-NEXT:           <div class="doc-card">
-// HTML-STRUCT-NEXT:               <div class="nested-delimiter-container">
-// HTML-STRUCT-NEXT:                   <p>A Tuple type</p>
-// HTML-STRUCT-NEXT:               </div>
-// HTML-STRUCT-NEXT:               <div class="nested-delimiter-container">
-// HTML-STRUCT-NEXT:                   <p>Does Tuple things.</p>
-// HTML-STRUCT-NEXT:               </div>
+// HTML-STRUCT-NEXT:               <p class="nested-delimiter-container">
+// HTML-STRUCT-NEXT:                   A Tuple type<br>
+// HTML-STRUCT-NEXT:               </p>
+// HTML-STRUCT-NEXT:               <p class="nested-delimiter-container">
+// HTML-STRUCT-NEXT:                   Does Tuple things.<br>
+// HTML-STRUCT-NEXT:               </p>
 // HTML-STRUCT-NEXT:           </div>
 // HTML-STRUCT-NEXT:       </div>
 // HTML-STRUCT-NEXT:   </section>
@@ -471,9 +471,9 @@ tuple<int, int, bool> func_with_tuple_param(tuple<int, int, bool> t) { return t;
 
 // HTML:           <pre><code class="language-cpp code-clang-doc">tuple<int, int, bool> func_with_tuple_param (tuple<int, int, bool> t)</code></pre>
 // HTML-NEXT:      <div class="doc-card">
-// HTML-NEXT:          <div class="nested-delimiter-container">
-// HTML-NEXT:              <p>A function with a tuple parameter</p>
-// HTML-NEXT:          </div>
+// HTML-NEXT:          <p class="nested-delimiter-container">
+// HTML-NEXT:              A function with a tuple parameter<br>
+// HTML-NEXT:          </p>
 // HTML-NEXT:          <div class="nested-delimiter-container">
 // HTML-NEXT:              <h3>Parameters</h3>
 // HTML-NEXT:              <div>

>From 68a80579732a953febdde53d38b24c662d4b07db Mon Sep 17 00:00:00 2001
From: Samrudh Nelli <samrudhnelli at gmail.com>
Date: Fri, 6 Mar 2026 22:34:45 +0530
Subject: [PATCH 16/39] Revert "use <p> instead of <div> for paragraph
 comments"

This reverts commit 059c2bf21bbd6a1e865040be823390284aae23b0.
---
 .../assets/comment-template.mustache          |   6 +-
 .../clang-doc/basic-project.mustache.test     |  24 ++--
 clang-tools-extra/test/clang-doc/enum.cpp     | 122 +++++++++---------
 .../test/clang-doc/namespace.cpp              |  18 +--
 .../test/clang-doc/templates.cpp              |  18 +--
 5 files changed, 94 insertions(+), 94 deletions(-)

diff --git a/clang-tools-extra/clang-doc/assets/comment-template.mustache b/clang-tools-extra/clang-doc/assets/comment-template.mustache
index 6f27a6f5a5d09..8a23279470da0 100644
--- a/clang-tools-extra/clang-doc/assets/comment-template.mustache
+++ b/clang-tools-extra/clang-doc/assets/comment-template.mustache
@@ -13,11 +13,11 @@
 </div>
 {{/BriefComments}}
 {{#ParagraphComments}}
-<p class="nested-delimiter-container">
+<div class="nested-delimiter-container">
     {{#.}}
-    {{TextComment}}<br>
+    <p>{{TextComment}}</p>
     {{/.}}
-</p>
+</div>
 {{/ParagraphComments}}
 {{#ParagraphComment}}
 {{#Children}}
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 31392733aaafd..0b190caeed8f5 100644
--- a/clang-tools-extra/test/clang-doc/basic-project.mustache.test
+++ b/clang-tools-extra/test/clang-doc/basic-project.mustache.test
@@ -65,9 +65,9 @@ HTML-SHAPE-NEXT:                     <div class="doc-card">
 HTML-SHAPE-NEXT:                         <div class="nested-delimiter-container">
 HTML-SHAPE-NEXT:                             <p>Abstract base class for shapes.</p>
 HTML-SHAPE-NEXT:                         </div>
-HTML-SHAPE-NEXT:                         <p class="nested-delimiter-container">
-HTML-SHAPE-NEXT:                             Provides a common interface for different types of shapes.<br>
-HTML-SHAPE-NEXT:                         </p>
+HTML-SHAPE-NEXT:                         <div class="nested-delimiter-container">
+HTML-SHAPE-NEXT:                             <p>Provides a common interface for different types of shapes.</p>
+HTML-SHAPE-NEXT:                         </div>
 HTML-SHAPE-NEXT:                     </div>
 HTML-SHAPE-NEXT:                 </div>
 HTML-SHAPE-NEXT:             </section>
@@ -185,9 +185,9 @@ HTML-CALC-NEXT:                     <div class="doc-card">
 HTML-CALC-NEXT:                         <div class="nested-delimiter-container">
 HTML-CALC-NEXT:                             <p>A simple calculator class.</p>
 HTML-CALC-NEXT:                         </div>
-HTML-CALC-NEXT:                         <p class="nested-delimiter-container">
-HTML-CALC-NEXT:                             Provides basic arithmetic operations.<br>
-HTML-CALC-NEXT:                         </p>
+HTML-CALC-NEXT:                         <div class="nested-delimiter-container">
+HTML-CALC-NEXT:                             <p>Provides basic arithmetic operations.</p>
+HTML-CALC-NEXT:                         </div>
 HTML-CALC-NEXT:                     </div>
 HTML-CALC-NEXT:                 </div>
 HTML-CALC-NEXT:            </section>
@@ -370,9 +370,9 @@ HTML-RECTANGLE-NEXT:                     <div class="doc-card">
 HTML-RECTANGLE-NEXT:                         <div class="nested-delimiter-container">
 HTML-RECTANGLE-NEXT:                             <p>Rectangle class derived from Shape.</p>
 HTML-RECTANGLE-NEXT:                         </div>
-HTML-RECTANGLE-NEXT:                         <p class="nested-delimiter-container">
-HTML-RECTANGLE-NEXT:                             Represents a rectangle with a given width and height.<br>
-HTML-RECTANGLE-NEXT:                         </p>
+HTML-RECTANGLE-NEXT:                         <div class="nested-delimiter-container">
+HTML-RECTANGLE-NEXT:                             <p>Represents a rectangle with a given width and height.</p>
+HTML-RECTANGLE-NEXT:                         </div>
 HTML-RECTANGLE-NEXT:                     </div>
 HTML-RECTANGLE-NEXT:                 </div>
 HTML-RECTANGLE-NEXT:             </section>
@@ -476,9 +476,9 @@ HTML-CIRCLE-NEXT:                     <div class="doc-card">
 HTML-CIRCLE-NEXT:                         <div class="nested-delimiter-container">
 HTML-CIRCLE-NEXT:                             <p>Circle class derived from Shape.</p>
 HTML-CIRCLE-NEXT:                         </div>
-HTML-CIRCLE-NEXT:                         <p class="nested-delimiter-container">
-HTML-CIRCLE-NEXT:                             Represents a circle with a given radius.<br>
-HTML-CIRCLE-NEXT:                         </p>
+HTML-CIRCLE-NEXT:                         <div class="nested-delimiter-container">
+HTML-CIRCLE-NEXT:                             <p>Represents a circle with a given radius.</p>
+HTML-CIRCLE-NEXT:                         </div>
 HTML-CIRCLE-NEXT:                     </div>
 HTML-CIRCLE-NEXT:                 </div>
 HTML-CIRCLE-NEXT:             </section>
diff --git a/clang-tools-extra/test/clang-doc/enum.cpp b/clang-tools-extra/test/clang-doc/enum.cpp
index ae2ceb9194bea..06c0d93f2227b 100644
--- a/clang-tools-extra/test/clang-doc/enum.cpp
+++ b/clang-tools-extra/test/clang-doc/enum.cpp
@@ -61,25 +61,25 @@ enum Color {
 // HTML-INDEX-NEXT:             <tr>
 // HTML-INDEX-NEXT:                 <td>Red</td>
 // HTML-INDEX-NEXT:                 <td>0</td>
-// HTML-INDEX-NEXT:                 <td><p class="nested-delimiter-container">
-// HTML-INDEX-NEXT:                       Comment 1<br>
-// HTML-INDEX-NEXT:                     </p>
+// HTML-INDEX-NEXT:                 <td><div class="nested-delimiter-container">
+// HTML-INDEX-NEXT:                       <p>Comment 1</p>
+// HTML-INDEX-NEXT:                     </div>
 // HTML-INDEX-NEXT:                 </td>
 // HTML-INDEX-NEXT:             </tr>
 // HTML-INDEX-NEXT:             <tr>
 // HTML-INDEX-NEXT:                 <td>Green</td>
 // HTML-INDEX-NEXT:                 <td>1</td>
-// HTML-INDEX-NEXT:                 <td><p class="nested-delimiter-container">
-// HTML-INDEX-NEXT:                       Comment 2<br>
-// HTML-INDEX-NEXT:                     </p>
+// HTML-INDEX-NEXT:                 <td><div class="nested-delimiter-container">
+// HTML-INDEX-NEXT:                       <p>Comment 2</p>
+// HTML-INDEX-NEXT:                     </div>
 // HTML-INDEX-NEXT:                 </td>
 // HTML-INDEX-NEXT:             </tr>
 // HTML-INDEX-NEXT:             <tr>
 // HTML-INDEX-NEXT:                 <td>Blue</td>
 // HTML-INDEX-NEXT:                 <td>2</td>
-// HTML-INDEX-NEXT:                 <td><p class="nested-delimiter-container">
-// HTML-INDEX-NEXT:                       Comment 3<br>
-// HTML-INDEX-NEXT:                     </p>
+// HTML-INDEX-NEXT:                 <td><div class="nested-delimiter-container">
+// HTML-INDEX-NEXT:                       <p>Comment 3</p>
+// HTML-INDEX-NEXT:                     </div>
 // HTML-INDEX-NEXT:                 </td>
 // HTML-INDEX-NEXT:             </tr>
 // HTML-INDEX-NEXT:         </tbody>
@@ -136,25 +136,25 @@ enum class Shapes {
 // HTML-INDEX-NEXT:             <tr>
 // HTML-INDEX-NEXT:                 <td>Circle</td>
 // HTML-INDEX-NEXT:                 <td>0</td>
-// HTML-INDEX-NEXT:                 <td><p class="nested-delimiter-container">
-// HTML-INDEX-NEXT:                       Comment 1<br>
-// HTML-INDEX-NEXT:                     </p>
+// HTML-INDEX-NEXT:                 <td><div class="nested-delimiter-container">
+// HTML-INDEX-NEXT:                       <p>Comment 1</p>
+// HTML-INDEX-NEXT:                     </div>
 // HTML-INDEX-NEXT:                 </td>
 // HTML-INDEX-NEXT:             </tr>
 // HTML-INDEX-NEXT:             <tr>
 // HTML-INDEX-NEXT:                 <td>Rectangle</td>
 // HTML-INDEX-NEXT:                 <td>1</td>
-// HTML-INDEX-NEXT:                 <td><p class="nested-delimiter-container">
-// HTML-INDEX-NEXT:                       Comment 2<br>
-// HTML-INDEX-NEXT:                     </p>
+// HTML-INDEX-NEXT:                 <td><div class="nested-delimiter-container">
+// HTML-INDEX-NEXT:                       <p>Comment 2</p>
+// HTML-INDEX-NEXT:                     </div>
 // HTML-INDEX-NEXT:                 </td>
 // HTML-INDEX-NEXT:             </tr>
 // HTML-INDEX-NEXT:             <tr>
 // HTML-INDEX-NEXT:                 <td>Triangle</td>
 // HTML-INDEX-NEXT:                 <td>2</td>
-// HTML-INDEX-NEXT:                 <td><p class="nested-delimiter-container">
-// HTML-INDEX-NEXT:                       Comment 3<br>
-// HTML-INDEX-NEXT:                     </p>
+// HTML-INDEX-NEXT:                 <td><div class="nested-delimiter-container">
+// HTML-INDEX-NEXT:                       <p>Comment 3</p>
+// HTML-INDEX-NEXT:                     </div>
 // HTML-INDEX-NEXT:                 </td>
 // HTML-INDEX-NEXT:             </tr>
 // HTML-INDEX-NEXT:         </tbody>
@@ -209,13 +209,13 @@ enum Size : uint8_t {
 // HTML-INDEX-NEXT:             <tr>
 // HTML-INDEX-NEXT:                 <td>Small</td>
 // HTML-INDEX-NEXT:                 <td>0</td>
-// HTML-INDEX-NEXT:                 <td><p class="nested-delimiter-container">
-// HTML-INDEX-NEXT:                       A pearl.<br>
-// HTML-INDEX-NEXT:                       Pearls are quite small.<br>
-// HTML-INDEX-NEXT:                     </p>
-// HTML-INDEX-NEXT:                     <p class="nested-delimiter-container">
-// HTML-INDEX-NEXT:                       Pearls are used in jewelry.<br>
-// HTML-INDEX-NEXT:                     </p>
+// HTML-INDEX-NEXT:                 <td><div class="nested-delimiter-container">
+// HTML-INDEX-NEXT:                       <p>A pearl.</p>
+// HTML-INDEX-NEXT:                       <p>Pearls are quite small.</p>
+// HTML-INDEX-NEXT:                     </div>
+// HTML-INDEX-NEXT:                     <div class="nested-delimiter-container">
+// HTML-INDEX-NEXT:                       <p>Pearls are used in jewelry.</p>
+// HTML-INDEX-NEXT:                     </div>
 // HTML-INDEX-NEXT:                 </td>
 // HTML-INDEX-NEXT:             </tr>
 // HTML-INDEX-NEXT:             <tr>
@@ -229,9 +229,9 @@ enum Size : uint8_t {
 // HTML-INDEX-NEXT:             <tr>
 // HTML-INDEX-NEXT:                 <td>Large</td>
 // HTML-INDEX-NEXT:                 <td>2</td>
-// HTML-INDEX-NEXT:                 <td><p class="nested-delimiter-container">
-// HTML-INDEX-NEXT:                       A football.<br>
-// HTML-INDEX-NEXT:                     </p>
+// HTML-INDEX-NEXT:                 <td><div class="nested-delimiter-container">
+// HTML-INDEX-NEXT:                       <p>A football.</p>
+// HTML-INDEX-NEXT:                     </div>
 // HTML-INDEX-NEXT:                 </td>
 // HTML-INDEX-NEXT:             </tr>
 // HTML-INDEX-NEXT:         </tbody>
@@ -272,9 +272,9 @@ enum : long long {
 // HTML-INDEX-NEXT:             <tr>
 // HTML-INDEX-NEXT:                 <td>BigVal</td>
 // HTML-INDEX-NEXT:                 <td>999999999999</td>
-// HTML-INDEX-NEXT:                 <td><p class="nested-delimiter-container">
-// HTML-INDEX-NEXT:                       A very large value<br>
-// HTML-INDEX-NEXT:                     </p>
+// HTML-INDEX-NEXT:                 <td><div class="nested-delimiter-container">
+// HTML-INDEX-NEXT:                       <p>A very large value</p>
+// HTML-INDEX-NEXT:                     </div>
 // HTML-INDEX-NEXT:                 </td>
 // HTML-INDEX-NEXT:             </tr>
 // HTML-INDEX-NEXT:         </tbody>
@@ -326,25 +326,25 @@ class FilePermissions {
 // HTML-PERM-NEXT:               <tr>
 // HTML-PERM-NEXT:                   <td>Read</td>
 // HTML-PERM-NEXT:                   <td>1</td>
-// HTML-PERM-NEXT:                   <td><p class="nested-delimiter-container">
-// HTML-PERM-NEXT:                         Permission to READ r<br>
-// HTML-PERM-NEXT:                       </p>
+// HTML-PERM-NEXT:                   <td><div class="nested-delimiter-container">
+// HTML-PERM-NEXT:                         <p>Permission to READ r</p>
+// HTML-PERM-NEXT:                       </div>
 // HTML-PERM-NEXT:                   </td>
 // HTML-PERM-NEXT:               </tr>
 // HTML-PERM-NEXT:               <tr>
 // HTML-PERM-NEXT:                   <td>Write</td>
 // HTML-PERM-NEXT:                   <td>2</td>
-// HTML-PERM-NEXT:                   <td><p class="nested-delimiter-container">
-// HTML-PERM-NEXT:                         Permission to WRITE w<br>
-// HTML-PERM-NEXT:                       </p>
+// HTML-PERM-NEXT:                   <td><div class="nested-delimiter-container">
+// HTML-PERM-NEXT:                         <p>Permission to WRITE w</p>
+// HTML-PERM-NEXT:                       </div>
 // HTML-PERM-NEXT:                   </td>
 // HTML-PERM-NEXT:               </tr>
 // HTML-PERM-NEXT:               <tr>
 // HTML-PERM-NEXT:                   <td>Execute</td>
 // HTML-PERM-NEXT:                   <td>4</td>
-// HTML-PERM-NEXT:                   <td><p class="nested-delimiter-container">
-// HTML-PERM-NEXT:                         Permission to EXECUTE x<br>
-// HTML-PERM-NEXT:                       </p>
+// HTML-PERM-NEXT:                   <td><div class="nested-delimiter-container">
+// HTML-PERM-NEXT:                         <p>Permission to EXECUTE x</p>
+// HTML-PERM-NEXT:                       </div>
 // HTML-PERM-NEXT:                   </td>
 // HTML-PERM-NEXT:               </tr>
 // HTML-PERM-NEXT:           </tbody>
@@ -393,25 +393,25 @@ class Animals {
 // HTML-ANIMAL-NEXT:                 <tr>
 // HTML-ANIMAL-NEXT:                     <td>Dog</td>
 // HTML-ANIMAL-NEXT:                     <td>0</td>
-// HTML-ANIMAL-NEXT:                     <td><p class="nested-delimiter-container">
-// HTML-ANIMAL-NEXT:                           Man's best friend<br>
-// HTML-ANIMAL-NEXT:                         </p>
+// HTML-ANIMAL-NEXT:                     <td><div class="nested-delimiter-container">
+// HTML-ANIMAL-NEXT:                           <p>Man's best friend</p>
+// HTML-ANIMAL-NEXT:                         </div>
 // HTML-ANIMAL-NEXT:                     </td>
 // HTML-ANIMAL-NEXT:                 </tr>
 // HTML-ANIMAL-NEXT:                 <tr>
 // HTML-ANIMAL-NEXT:                     <td>Cat</td>
 // HTML-ANIMAL-NEXT:                     <td>1</td>
-// HTML-ANIMAL-NEXT:                     <td><p class="nested-delimiter-container">
-// HTML-ANIMAL-NEXT:                           Man's other best friend<br>
-// HTML-ANIMAL-NEXT:                         </p>
+// HTML-ANIMAL-NEXT:                     <td><div class="nested-delimiter-container">
+// HTML-ANIMAL-NEXT:                           <p>Man's other best friend</p>
+// HTML-ANIMAL-NEXT:                         </div>
 // HTML-ANIMAL-NEXT:                     </td>
 // HTML-ANIMAL-NEXT:                 </tr>
 // HTML-ANIMAL-NEXT:                 <tr>
 // HTML-ANIMAL-NEXT:                     <td>Iguana</td>
 // HTML-ANIMAL-NEXT:                     <td>2</td>
-// HTML-ANIMAL-NEXT:                     <td><p class="nested-delimiter-container">
-// HTML-ANIMAL-NEXT:                           A lizard<br>
-// HTML-ANIMAL-NEXT:                         </p>
+// HTML-ANIMAL-NEXT:                     <td><div class="nested-delimiter-container">
+// HTML-ANIMAL-NEXT:                           <p>A lizard</p>
+// HTML-ANIMAL-NEXT:                         </div>
 // HTML-ANIMAL-NEXT:                     </td>
 // HTML-ANIMAL-NEXT:                 </tr>
 // HTML-ANIMAL-NEXT:             </tbody>
@@ -483,33 +483,33 @@ enum Car {
 // HTML-VEHICLES-NEXT:              <tr>
 // HTML-VEHICLES-NEXT:                  <td>Sedan</td>
 // HTML-VEHICLES-NEXT:                  <td>0</td>
-// HTML-VEHICLES-NEXT:                  <td><p class="nested-delimiter-container">
-// HTML-VEHICLES-NEXT:                        Comment 1<br>
-// HTML-VEHICLES-NEXT:                      </p>
+// HTML-VEHICLES-NEXT:                  <td><div class="nested-delimiter-container">
+// HTML-VEHICLES-NEXT:                        <p>Comment 1</p>
+// HTML-VEHICLES-NEXT:                      </div>
 // HTML-VEHICLES-NEXT:                  </td>
 // HTML-VEHICLES-NEXT:              </tr>
 // HTML-VEHICLES-NEXT:              <tr>
 // HTML-VEHICLES-NEXT:                  <td>SUV</td>
 // HTML-VEHICLES-NEXT:                  <td>1</td>
-// HTML-VEHICLES-NEXT:                  <td><p class="nested-delimiter-container">
-// HTML-VEHICLES-NEXT:                        Comment 2<br>
-// HTML-VEHICLES-NEXT:                      </p>
+// HTML-VEHICLES-NEXT:                  <td><div class="nested-delimiter-container">
+// HTML-VEHICLES-NEXT:                        <p>Comment 2</p>
+// HTML-VEHICLES-NEXT:                      </div>
 // HTML-VEHICLES-NEXT:                  </td>
 // HTML-VEHICLES-NEXT:              </tr>
 // HTML-VEHICLES-NEXT:              <tr>
 // HTML-VEHICLES-NEXT:                  <td>Pickup</td>
 // HTML-VEHICLES-NEXT:                  <td>2</td>
-// HTML-VEHICLES-NEXT:                  <td><p class="nested-delimiter-container">
-// HTML-VEHICLES-NEXT:                        Comment 3<br>
-// HTML-VEHICLES-NEXT:                      </p>
+// HTML-VEHICLES-NEXT:                  <td><div class="nested-delimiter-container">
+// HTML-VEHICLES-NEXT:                        <p>Comment 3</p>
+// HTML-VEHICLES-NEXT:                      </div>
 // HTML-VEHICLES-NEXT:                  </td>
 // HTML-VEHICLES-NEXT:              </tr>
 // HTML-VEHICLES-NEXT:              <tr>
 // HTML-VEHICLES-NEXT:                  <td>Hatchback</td>
 // HTML-VEHICLES-NEXT:                  <td>3</td>
-// HTML-VEHICLES-NEXT:                  <td><p class="nested-delimiter-container">
-// HTML-VEHICLES-NEXT:                        Comment 4<br>
-// HTML-VEHICLES-NEXT:                      </p>
+// HTML-VEHICLES-NEXT:                  <td><div class="nested-delimiter-container">
+// HTML-VEHICLES-NEXT:                        <p>Comment 4</p>
+// HTML-VEHICLES-NEXT:                      </div>
 // HTML-VEHICLES-NEXT:                  </td>
 // HTML-VEHICLES-NEXT:              </tr>
 // HTML-VEHICLES-NEXT:          </tbody>
diff --git a/clang-tools-extra/test/clang-doc/namespace.cpp b/clang-tools-extra/test/clang-doc/namespace.cpp
index 58198dc9e2334..e39fbacb62638 100644
--- a/clang-tools-extra/test/clang-doc/namespace.cpp
+++ b/clang-tools-extra/test/clang-doc/namespace.cpp
@@ -195,9 +195,9 @@ class ClassInNestedNamespace {};
 // HTML-NESTED-INDEX:     </ul>
 // HTML-NESTED-INDEX:         <pre><code class="language-cpp code-clang-doc">void functionInNestedNamespace ()</code></pre>
 // HTML-NESTED-INDEX:         <div class="doc-card">
-// HTML-NESTED-INDEX:             <p class="nested-delimiter-container">
-// HTML-NESTED-INDEX:                 Function in NestedNamespace<br>
-// HTML-NESTED-INDEX:             </p>
+// HTML-NESTED-INDEX:             <div class="nested-delimiter-container">
+// HTML-NESTED-INDEX:                 <p>Function in NestedNamespace</p>
+// HTML-NESTED-INDEX:             </div>
 // HTML-NESTED-INDEX:         </div>
 // HTML-NESTED-INDEX:         <p>Defined at line [[@LINE-56]] of file {{.*}}namespace.cpp</p>
 // HTML-NESTED-INDEX:     </div>
@@ -240,9 +240,9 @@ class ClassInNestedNamespace {};
 // HTML-PRIMARY-INDEX:          </ul>
 // HTML-PRIMARY-INDEX:          <pre><code class="language-cpp code-clang-doc">void functionInPrimaryNamespace ()</code></pre>
 // HTML-PRIMARY-INDEX:          <div class="doc-card">
-// HTML-PRIMARY-INDEX:              <p class="nested-delimiter-container">
-// HTML-PRIMARY-INDEX:                  Function in PrimaryNamespace<br>
-// HTML-PRIMARY-INDEX:              </p>
+// HTML-PRIMARY-INDEX:              <div class="nested-delimiter-container">
+// HTML-PRIMARY-INDEX:                  <p>Function in PrimaryNamespace</p>
+// HTML-PRIMARY-INDEX:              </div>
 // HTML-PRIMARY-INDEX:          </div>
 // HTML-PRIMARY-INDEX:          <p>Defined at line [[@LINE-130]] of file {{.*}}clang-tools-extra{{[\/]}}test{{[\/]}}clang-doc{{[\/]}}namespace.cpp</p>
 // HTML-PRIMARY-INDEX:      </div>
@@ -320,9 +320,9 @@ class ClassInAnotherNamespace {};
 // HTML-ANOTHER-INDEX:     </ul>
 // HTML-ANOTHER-INDEX:         <pre><code class="language-cpp code-clang-doc">void functionInAnotherNamespace ()</code></pre>
 // HTML-ANOTHER-INDEX:         <div class="doc-card">
-// HTML-ANOTHER-INDEX:             <p class="nested-delimiter-container">
-// HTML-ANOTHER-INDEX:                 Function in AnotherNamespace<br>
-// HTML-ANOTHER-INDEX:             </p>
+// HTML-ANOTHER-INDEX:             <div class="nested-delimiter-container">
+// HTML-ANOTHER-INDEX:                 <p>Function in AnotherNamespace</p>
+// HTML-ANOTHER-INDEX:             </div>
 // HTML-ANOTHER-INDEX:         </div>
 // HTML-ANOTHER-INDEX:         <p>Defined at line [[@LINE-55]] of file {{.*}}clang-tools-extra{{[\/]}}test{{[\/]}}clang-doc{{[\/]}}namespace.cpp</p>
 // HTML-ANOTHER-INDEX:     </div>
diff --git a/clang-tools-extra/test/clang-doc/templates.cpp b/clang-tools-extra/test/clang-doc/templates.cpp
index bfaeab87ab049..86af599472894 100644
--- a/clang-tools-extra/test/clang-doc/templates.cpp
+++ b/clang-tools-extra/test/clang-doc/templates.cpp
@@ -387,12 +387,12 @@ struct tuple {};
 // HTML-STRUCT-NEXT:           <h1 class="hero__title-large">struct tuple</h1>
 // HTML-STRUCT-NEXT:           <p>Defined at line [[# @LINE - 6]] of file {{.*}}templates.cpp</p>
 // HTML-STRUCT-NEXT:           <div class="doc-card">
-// HTML-STRUCT-NEXT:               <p class="nested-delimiter-container">
-// HTML-STRUCT-NEXT:                   A Tuple type<br>
-// HTML-STRUCT-NEXT:               </p>
-// HTML-STRUCT-NEXT:               <p class="nested-delimiter-container">
-// HTML-STRUCT-NEXT:                   Does Tuple things.<br>
-// HTML-STRUCT-NEXT:               </p>
+// HTML-STRUCT-NEXT:               <div class="nested-delimiter-container">
+// HTML-STRUCT-NEXT:                   <p>A Tuple type</p>
+// HTML-STRUCT-NEXT:               </div>
+// HTML-STRUCT-NEXT:               <div class="nested-delimiter-container">
+// HTML-STRUCT-NEXT:                   <p>Does Tuple things.</p>
+// HTML-STRUCT-NEXT:               </div>
 // HTML-STRUCT-NEXT:           </div>
 // HTML-STRUCT-NEXT:       </div>
 // HTML-STRUCT-NEXT:   </section>
@@ -471,9 +471,9 @@ tuple<int, int, bool> func_with_tuple_param(tuple<int, int, bool> t) { return t;
 
 // HTML:           <pre><code class="language-cpp code-clang-doc">tuple<int, int, bool> func_with_tuple_param (tuple<int, int, bool> t)</code></pre>
 // HTML-NEXT:      <div class="doc-card">
-// HTML-NEXT:          <p class="nested-delimiter-container">
-// HTML-NEXT:              A function with a tuple parameter<br>
-// HTML-NEXT:          </p>
+// HTML-NEXT:          <div class="nested-delimiter-container">
+// HTML-NEXT:              <p>A function with a tuple parameter</p>
+// HTML-NEXT:          </div>
 // HTML-NEXT:          <div class="nested-delimiter-container">
 // HTML-NEXT:              <h3>Parameters</h3>
 // HTML-NEXT:              <div>

>From 617b89a950934382edfab59bbd4a50dfe912fa9e Mon Sep 17 00:00:00 2001
From: Samrudh Nelli <samrudhnelli at gmail.com>
Date: Fri, 6 Mar 2026 23:38:31 +0530
Subject: [PATCH 17/39] handle comments in enum-template.mustache rather than
 editing comment-template.mustache

---
 .../clang-doc/assets/clang-doc-mustache.css   |  10 +-
 .../clang-doc/assets/enum-template.mustache   |  22 ++-
 clang-tools-extra/test/clang-doc/enum.cpp     | 160 ++++++++++--------
 3 files changed, 119 insertions(+), 73 deletions(-)

diff --git a/clang-tools-extra/clang-doc/assets/clang-doc-mustache.css b/clang-tools-extra/clang-doc/assets/clang-doc-mustache.css
index 7402d66628ebe..09130d0507df9 100644
--- a/clang-tools-extra/clang-doc/assets/clang-doc-mustache.css
+++ b/clang-tools-extra/clang-doc/assets/clang-doc-mustache.css
@@ -536,4 +536,12 @@ a, a:visited, a:hover, a:active {
 
 .param-container {
     display: block;
-}
\ No newline at end of file
+}
+
+.paragraph-container {
+    margin-bottom: 1rem;
+}
+
+.paragraph-container:last-of-type {
+    margin-bottom: 0rem;
+}
diff --git a/clang-tools-extra/clang-doc/assets/enum-template.mustache b/clang-tools-extra/clang-doc/assets/enum-template.mustache
index f39d176bed4f8..00ec31d9c7807 100644
--- a/clang-tools-extra/clang-doc/assets/enum-template.mustache
+++ b/clang-tools-extra/clang-doc/assets/enum-template.mustache
@@ -30,7 +30,27 @@
                 <td>{{ValueExpr}}</td>
                 {{/Value}}
                 {{#HasComments}}
-                <td>{{#Description}}{{>Comments}}{{/Description}}{{^Description}} -- {{/Description}}</td>
+                <td>{{#Description}}
+                        {{#BriefComments}}
+                            {{#.}}
+                            <p class="paragraph-container">{{TextComment}}</p>
+                            {{/.}}
+                        {{/BriefComments}}
+                        {{#ParagraphComments}}
+                        <p class="paragraph-container">
+                            {{#.}}
+                            {{TextComment}}<br>
+                            {{/.}}
+                        </p>
+                        {{/ParagraphComments}}
+                        {{#ParagraphComment}}
+                            <p>
+                            {{#Children}}
+                            {{TextComment}}
+                            {{/Children}}
+                            </p>
+                        {{/ParagraphComment}}
+                    {{/Description}}{{^Description}} -- {{/Description}}</td>
                 {{/HasComments}}
             </tr>
             {{/Members}}
diff --git a/clang-tools-extra/test/clang-doc/enum.cpp b/clang-tools-extra/test/clang-doc/enum.cpp
index 06c0d93f2227b..4012975d9d1ec 100644
--- a/clang-tools-extra/test/clang-doc/enum.cpp
+++ b/clang-tools-extra/test/clang-doc/enum.cpp
@@ -61,25 +61,28 @@ enum Color {
 // HTML-INDEX-NEXT:             <tr>
 // HTML-INDEX-NEXT:                 <td>Red</td>
 // HTML-INDEX-NEXT:                 <td>0</td>
-// HTML-INDEX-NEXT:                 <td><div class="nested-delimiter-container">
-// HTML-INDEX-NEXT:                       <p>Comment 1</p>
-// HTML-INDEX-NEXT:                     </div>
+// HTML-INDEX-NEXT:                 <td>
+// HTML-INDEX-NEXT:                   <p class="paragraph-container">
+// HTML-INDEX-NEXT:                       Comment 1<br>
+// HTML-INDEX-NEXT:                   </p>
 // HTML-INDEX-NEXT:                 </td>
 // HTML-INDEX-NEXT:             </tr>
 // HTML-INDEX-NEXT:             <tr>
 // HTML-INDEX-NEXT:                 <td>Green</td>
 // HTML-INDEX-NEXT:                 <td>1</td>
-// HTML-INDEX-NEXT:                 <td><div class="nested-delimiter-container">
-// HTML-INDEX-NEXT:                       <p>Comment 2</p>
-// HTML-INDEX-NEXT:                     </div>
+// HTML-INDEX-NEXT:                 <td>
+// HTML-INDEX-NEXT:                   <p class="paragraph-container">
+// HTML-INDEX-NEXT:                       Comment 2<br>
+// HTML-INDEX-NEXT:                   </p>
 // HTML-INDEX-NEXT:                 </td>
 // HTML-INDEX-NEXT:             </tr>
 // HTML-INDEX-NEXT:             <tr>
 // HTML-INDEX-NEXT:                 <td>Blue</td>
 // HTML-INDEX-NEXT:                 <td>2</td>
-// HTML-INDEX-NEXT:                 <td><div class="nested-delimiter-container">
-// HTML-INDEX-NEXT:                       <p>Comment 3</p>
-// HTML-INDEX-NEXT:                     </div>
+// HTML-INDEX-NEXT:                 <td>
+// HTML-INDEX-NEXT:                   <p class="paragraph-container">
+// HTML-INDEX-NEXT:                       Comment 3<br>
+// HTML-INDEX-NEXT:                   </p>
 // HTML-INDEX-NEXT:                 </td>
 // HTML-INDEX-NEXT:             </tr>
 // HTML-INDEX-NEXT:         </tbody>
@@ -89,7 +92,7 @@ enum Color {
 // HTML-INDEX-NEXT:           <p>For specifying RGB colors</p>
 // HTML-INDEX-NEXT:       </div>
 // HTML-INDEX-NEXT:     </div>
-// HTML-INDEX-NEXT:     <p>Defined at line [[@LINE-46]] of file {{.*}}clang-tools-extra{{[\/]}}test{{[\/]}}clang-doc{{[\/]}}enum.cpp</p>
+// HTML-INDEX-NEXT:     <p>Defined at line [[@LINE-61]] of file {{.*}}clang-tools-extra{{[\/]}}test{{[\/]}}clang-doc{{[\/]}}enum.cpp</p>
 // HTML-INDEX-NEXT:   </div>
 
 // MD-MUSTACHE-INDEX: ## Enums
@@ -136,25 +139,28 @@ enum class Shapes {
 // HTML-INDEX-NEXT:             <tr>
 // HTML-INDEX-NEXT:                 <td>Circle</td>
 // HTML-INDEX-NEXT:                 <td>0</td>
-// HTML-INDEX-NEXT:                 <td><div class="nested-delimiter-container">
-// HTML-INDEX-NEXT:                       <p>Comment 1</p>
-// HTML-INDEX-NEXT:                     </div>
+// HTML-INDEX-NEXT:                 <td>
+// HTML-INDEX-NEXT:                   <p class="paragraph-container">
+// HTML-INDEX-NEXT:                       Comment 1<br>
+// HTML-INDEX-NEXT:                   </p>
 // HTML-INDEX-NEXT:                 </td>
 // HTML-INDEX-NEXT:             </tr>
 // HTML-INDEX-NEXT:             <tr>
 // HTML-INDEX-NEXT:                 <td>Rectangle</td>
 // HTML-INDEX-NEXT:                 <td>1</td>
-// HTML-INDEX-NEXT:                 <td><div class="nested-delimiter-container">
-// HTML-INDEX-NEXT:                       <p>Comment 2</p>
-// HTML-INDEX-NEXT:                     </div>
+// HTML-INDEX-NEXT:                 <td>
+// HTML-INDEX-NEXT:                   <p class="paragraph-container">
+// HTML-INDEX-NEXT:                       Comment 2<br>
+// HTML-INDEX-NEXT:                   </p>
 // HTML-INDEX-NEXT:                 </td>
 // HTML-INDEX-NEXT:             </tr>
 // HTML-INDEX-NEXT:             <tr>
 // HTML-INDEX-NEXT:                 <td>Triangle</td>
 // HTML-INDEX-NEXT:                 <td>2</td>
-// HTML-INDEX-NEXT:                 <td><div class="nested-delimiter-container">
-// HTML-INDEX-NEXT:                       <p>Comment 3</p>
-// HTML-INDEX-NEXT:                     </div>
+// HTML-INDEX-NEXT:                 <td>
+// HTML-INDEX-NEXT:                   <p class="paragraph-container">
+// HTML-INDEX-NEXT:                       Comment 3<br>
+// HTML-INDEX-NEXT:                   </p>
 // HTML-INDEX-NEXT:                 </td>
 // HTML-INDEX-NEXT:             </tr>
 // HTML-INDEX-NEXT:         </tbody>
@@ -164,7 +170,7 @@ enum class Shapes {
 // HTML-INDEX-NEXT:           <p>Shape Types</p>
 // HTML-INDEX-NEXT:       </div>
 // HTML-INDEX-NEXT:     </div>
-// HTML-INDEX-NEXT:     <p>Defined at line [[@LINE-48]] of file {{.*}}clang-tools-extra{{[\/]}}test{{[\/]}}clang-doc{{[\/]}}enum.cpp</p>
+// HTML-INDEX-NEXT:     <p>Defined at line [[@LINE-63]] of file {{.*}}clang-tools-extra{{[\/]}}test{{[\/]}}clang-doc{{[\/]}}enum.cpp</p>
 // HTML-INDEX-NEXT:   </div>
 
 typedef unsigned char uint8_t;
@@ -209,29 +215,30 @@ enum Size : uint8_t {
 // HTML-INDEX-NEXT:             <tr>
 // HTML-INDEX-NEXT:                 <td>Small</td>
 // HTML-INDEX-NEXT:                 <td>0</td>
-// HTML-INDEX-NEXT:                 <td><div class="nested-delimiter-container">
-// HTML-INDEX-NEXT:                       <p>A pearl.</p>
-// HTML-INDEX-NEXT:                       <p>Pearls are quite small.</p>
-// HTML-INDEX-NEXT:                     </div>
-// HTML-INDEX-NEXT:                     <div class="nested-delimiter-container">
-// HTML-INDEX-NEXT:                       <p>Pearls are used in jewelry.</p>
-// HTML-INDEX-NEXT:                     </div>
+// HTML-INDEX-NEXT:                 <td>
+// HTML-INDEX-NEXT:                   <p class="paragraph-container">
+// HTML-INDEX-NEXT:                       A pearl.<br>
+// HTML-INDEX-NEXT:                       Pearls are quite small.<br>
+// HTML-INDEX-NEXT:                   </p>
+// HTML-INDEX-NEXT:                   <p class="paragraph-container">
+// HTML-INDEX-NEXT:                       Pearls are used in jewelry.<br>
+// HTML-INDEX-NEXT:                   </p>
 // HTML-INDEX-NEXT:                 </td>
 // HTML-INDEX-NEXT:             </tr>
 // HTML-INDEX-NEXT:             <tr>
 // HTML-INDEX-NEXT:                 <td>Medium</td>
 // HTML-INDEX-NEXT:                 <td>1</td>
-// HTML-INDEX-NEXT:                 <td><div class="nested-delimiter-container">
-// HTML-INDEX-NEXT:                       <p>A tennis ball.</p>
-// HTML-INDEX-NEXT:                     </div>
+// HTML-INDEX-NEXT:                 <td>
+// HTML-INDEX-NEXT:                   <p class="paragraph-container">A tennis ball.</p>
 // HTML-INDEX-NEXT:                 </td>
 // HTML-INDEX-NEXT:             </tr>
 // HTML-INDEX-NEXT:             <tr>
 // HTML-INDEX-NEXT:                 <td>Large</td>
 // HTML-INDEX-NEXT:                 <td>2</td>
-// HTML-INDEX-NEXT:                 <td><div class="nested-delimiter-container">
-// HTML-INDEX-NEXT:                       <p>A football.</p>
-// HTML-INDEX-NEXT:                     </div>
+// HTML-INDEX-NEXT:                 <td>
+// HTML-INDEX-NEXT:                   <p class="paragraph-container">
+// HTML-INDEX-NEXT:                       A football.<br>
+// HTML-INDEX-NEXT:                   </p>
 // HTML-INDEX-NEXT:                 </td>
 // HTML-INDEX-NEXT:             </tr>
 // HTML-INDEX-NEXT:         </tbody>
@@ -241,7 +248,7 @@ enum Size : uint8_t {
 // HTML-INDEX-NEXT:           <p>Specify the size</p>
 // HTML-INDEX-NEXT:       </div>
 // HTML-INDEX-NEXT:     </div>
-// HTML-INDEX-NEXT:     <p>Defined at line [[@LINE-70]] of file {{.*}}clang-tools-extra{{[\/]}}test{{[\/]}}clang-doc{{[\/]}}enum.cpp</p>
+// HTML-INDEX-NEXT:     <p>Defined at line [[@LINE-71]] of file {{.*}}clang-tools-extra{{[\/]}}test{{[\/]}}clang-doc{{[\/]}}enum.cpp</p>
 // HTML-INDEX-NEXT:   </div>
 
 /**
@@ -272,9 +279,10 @@ enum : long long {
 // HTML-INDEX-NEXT:             <tr>
 // HTML-INDEX-NEXT:                 <td>BigVal</td>
 // HTML-INDEX-NEXT:                 <td>999999999999</td>
-// HTML-INDEX-NEXT:                 <td><div class="nested-delimiter-container">
-// HTML-INDEX-NEXT:                       <p>A very large value</p>
-// HTML-INDEX-NEXT:                     </div>
+// HTML-INDEX-NEXT:                 <td>
+// HTML-INDEX-NEXT:                   <p class="paragraph-container">
+// HTML-INDEX-NEXT:                       A very large value<br>
+// HTML-INDEX-NEXT:                   </p>
 // HTML-INDEX-NEXT:                 </td>
 // HTML-INDEX-NEXT:             </tr>
 // HTML-INDEX-NEXT:         </tbody>
@@ -284,7 +292,7 @@ enum : long long {
 // HTML-INDEX-NEXT:           <p>Very long number</p>
 // HTML-INDEX-NEXT:       </div>
 // HTML-INDEX-NEXT:     </div>
-// HTML-INDEX-NEXT:     <p>Defined at line [[@LINE-37]] of file {{.*}}clang-tools-extra{{[\/]}}test{{[\/]}}clang-doc{{[\/]}}enum.cpp</p>
+// HTML-INDEX-NEXT:     <p>Defined at line [[@LINE-38]] of file {{.*}}clang-tools-extra{{[\/]}}test{{[\/]}}clang-doc{{[\/]}}enum.cpp</p>
 // HTML-INDEX-NEXT:   </div>
 
 class FilePermissions {
@@ -326,25 +334,28 @@ class FilePermissions {
 // HTML-PERM-NEXT:               <tr>
 // HTML-PERM-NEXT:                   <td>Read</td>
 // HTML-PERM-NEXT:                   <td>1</td>
-// HTML-PERM-NEXT:                   <td><div class="nested-delimiter-container">
-// HTML-PERM-NEXT:                         <p>Permission to READ r</p>
-// HTML-PERM-NEXT:                       </div>
+// HTML-PERM-NEXT:                   <td>
+// HTML-PERM-NEXT:                     <p class="paragraph-container">
+// HTML-PERM-NEXT:                         Permission to READ r<br>
+// HTML-PERM-NEXT:                     </p>
 // HTML-PERM-NEXT:                   </td>
 // HTML-PERM-NEXT:               </tr>
 // HTML-PERM-NEXT:               <tr>
 // HTML-PERM-NEXT:                   <td>Write</td>
 // HTML-PERM-NEXT:                   <td>2</td>
-// HTML-PERM-NEXT:                   <td><div class="nested-delimiter-container">
-// HTML-PERM-NEXT:                         <p>Permission to WRITE w</p>
-// HTML-PERM-NEXT:                       </div>
+// HTML-PERM-NEXT:                  <td>
+// HTML-PERM-NEXT:                     <p class="paragraph-container">
+// HTML-PERM-NEXT:                         Permission to WRITE w<br>
+// HTML-PERM-NEXT:                     </p>
 // HTML-PERM-NEXT:                   </td>
 // HTML-PERM-NEXT:               </tr>
 // HTML-PERM-NEXT:               <tr>
 // HTML-PERM-NEXT:                   <td>Execute</td>
 // HTML-PERM-NEXT:                   <td>4</td>
-// HTML-PERM-NEXT:                   <td><div class="nested-delimiter-container">
-// HTML-PERM-NEXT:                         <p>Permission to EXECUTE x</p>
-// HTML-PERM-NEXT:                       </div>
+// HTML-PERM-NEXT:                   <td>
+// HTML-PERM-NEXT:                     <p class="paragraph-container">
+// HTML-PERM-NEXT:                         Permission to EXECUTE x<br>
+// HTML-PERM-NEXT:                     </p>
 // HTML-PERM-NEXT:                   </td>
 // HTML-PERM-NEXT:               </tr>
 // HTML-PERM-NEXT:           </tbody>
@@ -354,7 +365,7 @@ class FilePermissions {
 // HTML-PERM-NEXT:             <p>File permission flags</p>
 // HTML-PERM-NEXT:         </div>
 // HTML-PERM-NEXT:       </div>
-// HTML-PERM-NEXT:         <p>Defined at line [[@LINE-60]] of file {{.*}}clang-tools-extra{{[\/]}}test{{[\/]}}clang-doc{{[\/]}}enum.cpp</p>
+// HTML-PERM-NEXT:         <p>Defined at line [[@LINE-63]] of file {{.*}}clang-tools-extra{{[\/]}}test{{[\/]}}clang-doc{{[\/]}}enum.cpp</p>
 // HTML-PERM-NEXT:     </div>
 // HTML-PERM-NEXT:   </section>
 
@@ -393,25 +404,28 @@ class Animals {
 // HTML-ANIMAL-NEXT:                 <tr>
 // HTML-ANIMAL-NEXT:                     <td>Dog</td>
 // HTML-ANIMAL-NEXT:                     <td>0</td>
-// HTML-ANIMAL-NEXT:                     <td><div class="nested-delimiter-container">
-// HTML-ANIMAL-NEXT:                           <p>Man's best friend</p>
-// HTML-ANIMAL-NEXT:                         </div>
+// HTML-ANIMAL-NEXT:                     <td>
+// HTML-ANIMAL-NEXT:                       <p class="paragraph-container">
+// HTML-ANIMAL-NEXT:                           Man's best friend<br>
+// HTML-ANIMAL-NEXT:                       </p>
 // HTML-ANIMAL-NEXT:                     </td>
 // HTML-ANIMAL-NEXT:                 </tr>
 // HTML-ANIMAL-NEXT:                 <tr>
 // HTML-ANIMAL-NEXT:                     <td>Cat</td>
 // HTML-ANIMAL-NEXT:                     <td>1</td>
-// HTML-ANIMAL-NEXT:                     <td><div class="nested-delimiter-container">
-// HTML-ANIMAL-NEXT:                           <p>Man's other best friend</p>
-// HTML-ANIMAL-NEXT:                         </div>
+// HTML-ANIMAL-NEXT:                     <td>
+// HTML-ANIMAL-NEXT:                       <p class="paragraph-container">
+// HTML-ANIMAL-NEXT:                           Man's other best friend<br>
+// HTML-ANIMAL-NEXT:                       </p>
 // HTML-ANIMAL-NEXT:                     </td>
 // HTML-ANIMAL-NEXT:                 </tr>
 // HTML-ANIMAL-NEXT:                 <tr>
 // HTML-ANIMAL-NEXT:                     <td>Iguana</td>
 // HTML-ANIMAL-NEXT:                     <td>2</td>
-// HTML-ANIMAL-NEXT:                     <td><div class="nested-delimiter-container">
-// HTML-ANIMAL-NEXT:                           <p>A lizard</p>
-// HTML-ANIMAL-NEXT:                         </div>
+// HTML-ANIMAL-NEXT:                     <td>
+// HTML-ANIMAL-NEXT:                       <p class="paragraph-container">
+// HTML-ANIMAL-NEXT:                           A lizard<br>
+// HTML-ANIMAL-NEXT:                       </p>
 // HTML-ANIMAL-NEXT:                     </td>
 // HTML-ANIMAL-NEXT:                 </tr>
 // HTML-ANIMAL-NEXT:             </tbody>
@@ -421,7 +435,7 @@ class Animals {
 // HTML-ANIMAL-NEXT:                 <p>specify what animal the class is</p>
 // HTML-ANIMAL-NEXT:             </div>
 // HTML-ANIMAL-NEXT:         </div>
-// HTML-ANIMAL-NEXT:         <p>Defined at line [[@LINE-41]] of file {{.*}}enum.cpp</p>
+// HTML-ANIMAL-NEXT:         <p>Defined at line [[@LINE-56]] of file {{.*}}enum.cpp</p>
 // HTML-ANIMAL-NEXT:      </div>
 // HTML-ANIMAL-NEXT:    </section>
 
@@ -483,33 +497,37 @@ enum Car {
 // HTML-VEHICLES-NEXT:              <tr>
 // HTML-VEHICLES-NEXT:                  <td>Sedan</td>
 // HTML-VEHICLES-NEXT:                  <td>0</td>
-// HTML-VEHICLES-NEXT:                  <td><div class="nested-delimiter-container">
-// HTML-VEHICLES-NEXT:                        <p>Comment 1</p>
-// HTML-VEHICLES-NEXT:                      </div>
+// HTML-VEHICLES-NEXT:                  <td>
+// HTML-VEHICLES-NEXT:                    <p class="paragraph-container">
+// HTML-VEHICLES-NEXT:                        Comment 1<br>
+// HTML-VEHICLES-NEXT:                    </p>
 // HTML-VEHICLES-NEXT:                  </td>
 // HTML-VEHICLES-NEXT:              </tr>
 // HTML-VEHICLES-NEXT:              <tr>
 // HTML-VEHICLES-NEXT:                  <td>SUV</td>
 // HTML-VEHICLES-NEXT:                  <td>1</td>
-// HTML-VEHICLES-NEXT:                  <td><div class="nested-delimiter-container">
-// HTML-VEHICLES-NEXT:                        <p>Comment 2</p>
-// HTML-VEHICLES-NEXT:                      </div>
+// HTML-VEHICLES-NEXT:                  <td>
+// HTML-VEHICLES-NEXT:                    <p class="paragraph-container">
+// HTML-VEHICLES-NEXT:                        Comment 2<br>
+// HTML-VEHICLES-NEXT:                    </p>
 // HTML-VEHICLES-NEXT:                  </td>
 // HTML-VEHICLES-NEXT:              </tr>
 // HTML-VEHICLES-NEXT:              <tr>
 // HTML-VEHICLES-NEXT:                  <td>Pickup</td>
 // HTML-VEHICLES-NEXT:                  <td>2</td>
-// HTML-VEHICLES-NEXT:                  <td><div class="nested-delimiter-container">
-// HTML-VEHICLES-NEXT:                        <p>Comment 3</p>
-// HTML-VEHICLES-NEXT:                      </div>
+// HTML-VEHICLES-NEXT:                  <td>
+// HTML-VEHICLES-NEXT:                    <p class="paragraph-container">
+// HTML-VEHICLES-NEXT:                        Comment 3<br>
+// HTML-VEHICLES-NEXT:                    </p>
 // HTML-VEHICLES-NEXT:                  </td>
 // HTML-VEHICLES-NEXT:              </tr>
 // HTML-VEHICLES-NEXT:              <tr>
 // HTML-VEHICLES-NEXT:                  <td>Hatchback</td>
 // HTML-VEHICLES-NEXT:                  <td>3</td>
-// HTML-VEHICLES-NEXT:                  <td><div class="nested-delimiter-container">
-// HTML-VEHICLES-NEXT:                        <p>Comment 4</p>
-// HTML-VEHICLES-NEXT:                      </div>
+// HTML-VEHICLES-NEXT:                  <td>
+// HTML-VEHICLES-NEXT:                    <p class="paragraph-container">
+// HTML-VEHICLES-NEXT:                        Comment 4<br>
+// HTML-VEHICLES-NEXT:                    </p>
 // HTML-VEHICLES-NEXT:                  </td>
 // HTML-VEHICLES-NEXT:              </tr>
 // HTML-VEHICLES-NEXT:          </tbody>
@@ -519,7 +537,7 @@ enum Car {
 // HTML-VEHICLES-NEXT:           <p>specify type of car</p>
 // HTML-VEHICLES-NEXT:        </div>
 // HTML-VEHICLES-NEXT:      </div>
-// HTML-VEHICLES-NEXT:      <p>Defined at line [[@LINE-55]] of file {{.*}}clang-tools-extra{{[\/]}}test{{[\/]}}clang-doc{{[\/]}}enum.cpp</p>
+// HTML-VEHICLES-NEXT:      <p>Defined at line [[@LINE-75]] of file {{.*}}clang-tools-extra{{[\/]}}test{{[\/]}}clang-doc{{[\/]}}enum.cpp</p>
 // HTML-VEHICLES-NEXT:    </div>
 
 // MD-MUSTACHE-VEHICLES: # namespace Vehicles

>From ad908eaf192f0414eb73001d2e8e53524cb8d778 Mon Sep 17 00:00:00 2001
From: Samrudh Nelli <samrudhnelli at gmail.com>
Date: Sat, 7 Mar 2026 00:34:50 +0530
Subject: [PATCH 18/39] remove TODO for now

---
 clang-tools-extra/clang-doc/Serialize.cpp | 3 +--
 1 file changed, 1 insertion(+), 2 deletions(-)

diff --git a/clang-tools-extra/clang-doc/Serialize.cpp b/clang-tools-extra/clang-doc/Serialize.cpp
index 76ef5eb03dda7..14c8fcca25abd 100644
--- a/clang-tools-extra/clang-doc/Serialize.cpp
+++ b/clang-tools-extra/clang-doc/Serialize.cpp
@@ -239,8 +239,7 @@ void ClangDocCommentVisitor::parseComment(const comments::Comment *C) {
 
 void ClangDocCommentVisitor::visitTextComment(const TextComment *C) {
   if (!isWhitespaceOnly(C->getText()))
-    CurrentCI.Text = C->getText().trim(); // TODO: Trim the comments before
-                                          // parsing them into the AST.
+    CurrentCI.Text = C->getText().trim();
 }
 
 void ClangDocCommentVisitor::visitInlineCommandComment(

>From 15ab49b487b01e24deb26983161e032410950d16 Mon Sep 17 00:00:00 2001
From: Samrudh Nelli <samrudhnelli at gmail.com>
Date: Tue, 10 Mar 2026 15:57:04 +0530
Subject: [PATCH 19/39] Revert "add a TODO, cleanup json test"

This reverts commit ca953e6827bbbe35efdf361f1db572c322a72ac3.
---
 clang-tools-extra/test/clang-doc/enum.cpp | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/clang-tools-extra/test/clang-doc/enum.cpp b/clang-tools-extra/test/clang-doc/enum.cpp
index 4012975d9d1ec..ce6955da9dd56 100644
--- a/clang-tools-extra/test/clang-doc/enum.cpp
+++ b/clang-tools-extra/test/clang-doc/enum.cpp
@@ -1,8 +1,10 @@
 // RUN: rm -rf %t && mkdir -p %t
 // RUN: clang-doc --format=html --doxygen --output=%t --executor=standalone %s
 // RUN: clang-doc --format=md --doxygen --output=%t --executor=standalone %s
+// RUN: clang-doc --format=json --doxygen --output=%t --executor=standalone %s
 // RUN: FileCheck %s < %t/html/GlobalNamespace/index.html --check-prefix=HTML-INDEX-LINE
 // RUN: FileCheck %s < %t/html/GlobalNamespace/index.html --check-prefix=HTML-INDEX
+// RUN: FileCheck %s < %t/json/GlobalNamespace/index.json --check-prefix=JSON-INDEX
 // RUN: FileCheck %s < %t/html/GlobalNamespace/_ZTV7Animals.html --check-prefix=HTML-ANIMAL-LINE
 // RUN: FileCheck %s < %t/html/GlobalNamespace/_ZTV7Animals.html --check-prefix=HTML-ANIMAL
 // RUN: FileCheck %s < %t/html/GlobalNamespace/_ZTV15FilePermissions.html --check-prefix=HTML-PERM-LINE

>From 4695ec9312488ac2340f6912bfef5e4de359c588 Mon Sep 17 00:00:00 2001
From: Samrudh Nelli <samrudhnelli at gmail.com>
Date: Tue, 10 Mar 2026 15:57:35 +0530
Subject: [PATCH 20/39] Revert "fix the tests"

This reverts commit ed1ca334c0dd28c54b2da601badc29c809c84dae.
---
 clang-tools-extra/clang-doc/MDGenerator.cpp   |  4 +-
 clang-tools-extra/clang-doc/Serialize.cpp     |  2 +-
 .../clang-doc/basic-project.mustache.test     | 66 +++++++++----------
 .../test/clang-doc/basic-project.test         |  2 +-
 .../test/clang-doc/comments-in-macros.cpp     |  2 +-
 clang-tools-extra/test/clang-doc/enum.cpp     | 14 ++--
 .../test/clang-doc/json/class.cpp             | 10 +--
 .../clang-doc/json/compound-constraints.cpp   |  8 +--
 .../test/clang-doc/json/concept.cpp           |  2 +-
 .../test/clang-doc/namespace.cpp              |  6 +-
 .../test/clang-doc/templates.cpp              | 10 +--
 .../test/clang-doc/typedef-alias.cpp          |  6 +-
 .../unittests/clang-doc/MDGeneratorTest.cpp   |  6 +-
 13 files changed, 69 insertions(+), 69 deletions(-)

diff --git a/clang-tools-extra/clang-doc/MDGenerator.cpp b/clang-tools-extra/clang-doc/MDGenerator.cpp
index 60a880d211884..dee3c21f72a38 100644
--- a/clang-tools-extra/clang-doc/MDGenerator.cpp
+++ b/clang-tools-extra/clang-doc/MDGenerator.cpp
@@ -88,7 +88,7 @@ static void writeDescription(const CommentInfo &I, raw_ostream &OS) {
     break;
 
   case CommentKind::CK_BlockCommandComment:
-    OS << genEmphasis(I.Name) << " ";
+    OS << genEmphasis(I.Name);
     for (const auto &Child : I.Children)
       writeDescription(*Child, OS);
     break;
@@ -100,7 +100,7 @@ static void writeDescription(const CommentInfo &I, raw_ostream &OS) {
   case CommentKind::CK_ParamCommandComment:
   case CommentKind::CK_TParamCommandComment: {
     std::string Direction = I.Explicit ? (" " + I.Direction).str() : "";
-    OS << genEmphasis(I.ParamName) << I.Text << Direction << " ";
+    OS << genEmphasis(I.ParamName) << I.Text << Direction;
     for (const auto &Child : I.Children)
       writeDescription(*Child, OS);
     break;
diff --git a/clang-tools-extra/clang-doc/Serialize.cpp b/clang-tools-extra/clang-doc/Serialize.cpp
index 14c8fcca25abd..05f7a1eb896ff 100644
--- a/clang-tools-extra/clang-doc/Serialize.cpp
+++ b/clang-tools-extra/clang-doc/Serialize.cpp
@@ -239,7 +239,7 @@ void ClangDocCommentVisitor::parseComment(const comments::Comment *C) {
 
 void ClangDocCommentVisitor::visitTextComment(const TextComment *C) {
   if (!isWhitespaceOnly(C->getText()))
-    CurrentCI.Text = C->getText().trim();
+    CurrentCI.Text = C->getText().trim().str();
 }
 
 void ClangDocCommentVisitor::visitInlineCommandComment(
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 0b190caeed8f5..c94008f7bdf36 100644
--- a/clang-tools-extra/test/clang-doc/basic-project.mustache.test
+++ b/clang-tools-extra/test/clang-doc/basic-project.mustache.test
@@ -63,10 +63,10 @@ HTML-SHAPE-NEXT:                     <h1 class="hero__title-large">class Shape</
 HTML-SHAPE-NEXT:                     <p>Defined at line {{[0-9]+}} of file {{.*}}include{{[\/]}}Shape.h</p>
 HTML-SHAPE-NEXT:                     <div class="doc-card">
 HTML-SHAPE-NEXT:                         <div class="nested-delimiter-container">
-HTML-SHAPE-NEXT:                             <p>Abstract base class for shapes.</p>
+HTML-SHAPE-NEXT:                             <p> Abstract base class for shapes.</p>
 HTML-SHAPE-NEXT:                         </div>
 HTML-SHAPE-NEXT:                         <div class="nested-delimiter-container">
-HTML-SHAPE-NEXT:                             <p>Provides a common interface for different types of shapes.</p>
+HTML-SHAPE-NEXT:                             <p> Provides a common interface for different types of shapes.</p>
 HTML-SHAPE-NEXT:                         </div>
 HTML-SHAPE-NEXT:                     </div>
 HTML-SHAPE-NEXT:                 </div>
@@ -77,11 +77,11 @@ HTML-SHAPE-LABEL:                       <div id="{{([0-9A-F]{40})}}" class="deli
 HTML-SHAPE-NEXT:                             <pre><code class="language-cpp code-clang-doc">double area ()</code></pre>
 HTML-SHAPE-NEXT:                             <div class="doc-card">
 HTML-SHAPE-NEXT:                                 <div class="nested-delimiter-container">
-HTML-SHAPE-NEXT:                                     <p>Calculates the area of the shape.</p>
+HTML-SHAPE-NEXT:                                     <p> Calculates the area of the shape.</p>
 HTML-SHAPE-NEXT:                                 </div>
 HTML-SHAPE-NEXT:                                 <div class="nested-delimiter-container">
 HTML-SHAPE-NEXT:                                     <h3>Returns</h3>
-HTML-SHAPE-NEXT:                                     <p>double The area of the shape.</p>
+HTML-SHAPE-NEXT:                                     <p> double The area of the shape.</p>
 HTML-SHAPE-NEXT:                                 </div>
 HTML-SHAPE-NEXT:                             </div>
 HTML-SHAPE-NEXT:                         </div>
@@ -89,11 +89,11 @@ HTML-SHAPE-LABEL:                        <div id="{{([0-9A-F]{40})}}" class="del
 HTML-SHAPE-NEXT:                             <pre><code class="language-cpp code-clang-doc">double perimeter ()</code></pre>
 HTML-SHAPE-NEXT:                             <div class="doc-card">
 HTML-SHAPE-NEXT:                                 <div class="nested-delimiter-container">
-HTML-SHAPE-NEXT:                                     <p>Calculates the perimeter of the shape.</p>
+HTML-SHAPE-NEXT:                                     <p> Calculates the perimeter of the shape.</p>
 HTML-SHAPE-NEXT:                                 </div>
 HTML-SHAPE-NEXT:                                 <div class="nested-delimiter-container">
 HTML-SHAPE-NEXT:                                     <h3>Returns</h3>
-HTML-SHAPE-NEXT:                                     <p>double The perimeter of the shape.</p>
+HTML-SHAPE-NEXT:                                     <p> double The perimeter of the shape.</p>
 HTML-SHAPE-NEXT:                                 </div>
 HTML-SHAPE-NEXT:                             </div>
 HTML-SHAPE-NEXT:                         </div>
@@ -101,7 +101,7 @@ HTML-SHAPE-LABEL:                        <div id="{{([0-9A-F]{40})}}" class="del
 HTML-SHAPE-NEXT:                             <pre><code class="language-cpp code-clang-doc">void ~Shape ()</code></pre>
 HTML-SHAPE-NEXT:                             <div class="doc-card">
 HTML-SHAPE-NEXT:                                 <div class="nested-delimiter-container">
-HTML-SHAPE-NEXT:                                     <p>Virtual destructor.</p>
+HTML-SHAPE-NEXT:                                     <p> Virtual destructor.</p>
 HTML-SHAPE-NEXT:                                 </div>
 HTML-SHAPE-NEXT:                             </div>
 HTML-SHAPE-NEXT:                         <p>Defined at line {{[0-9]+}} of file {{.*}}include{{[/\\]}}Shape.h</p>
@@ -183,10 +183,10 @@ HTML-CALC-NEXT:                     <h1 class="hero__title-large">class Calculat
 HTML-CALC-NEXT:                     <p>Defined at line {{[0-9]+}} of file {{.*}}include{{[/\\]}}Calculator.h</p>
 HTML-CALC-NEXT:                     <div class="doc-card">
 HTML-CALC-NEXT:                         <div class="nested-delimiter-container">
-HTML-CALC-NEXT:                             <p>A simple calculator class.</p>
+HTML-CALC-NEXT:                             <p> A simple calculator class.</p>
 HTML-CALC-NEXT:                         </div>
 HTML-CALC-NEXT:                         <div class="nested-delimiter-container">
-HTML-CALC-NEXT:                             <p>Provides basic arithmetic operations.</p>
+HTML-CALC-NEXT:                             <p> Provides basic arithmetic operations.</p>
 HTML-CALC-NEXT:                         </div>
 HTML-CALC-NEXT:                     </div>
 HTML-CALC-NEXT:                 </div>
@@ -208,7 +208,7 @@ HTML-CALC-LABEL:                <div id="{{([0-9A-F]{40})}}" class="delimiter-co
 HTML-CALC-NEXT:                     <pre><code class="language-cpp code-clang-doc">int add (int a, int b)</code></pre>
 HTML-CALC-NEXT:                     <div class="doc-card">
 HTML-CALC-NEXT:                         <div class="nested-delimiter-container">
-HTML-CALC-NEXT:                             <p>Adds two integers.</p>
+HTML-CALC-NEXT:                             <p> Adds two integers.</p>
 HTML-CALC-NEXT:                         </div>
 HTML-CALC-NEXT:                         <div class="nested-delimiter-container">
 HTML-CALC-NEXT:                             <h3>Parameters</h3>
@@ -221,14 +221,14 @@ HTML-CALC-NEXT:                             </div>
 HTML-CALC-NEXT:                         </div>
 HTML-CALC-NEXT:                         <div class="nested-delimiter-container">
 HTML-CALC-NEXT:                             <h3>Returns</h3>
-HTML-CALC-NEXT:                             <p>int The sum of a and b.</p>
+HTML-CALC-NEXT:                             <p> int The sum of a and b.</p>
 HTML-CALC-NEXT:                         </div>
 HTML-CALC-NEXT:                     </div>
 HTML-CALC-LABEL:                <div id="{{([0-9A-F]{40})}}" class="delimiter-container">
 HTML-CALC-NEXT:                     <pre><code class="language-cpp code-clang-doc">int subtract (int a, int b)</code></pre>
 HTML-CALC-NEXT:                     <div class="doc-card">
 HTML-CALC-NEXT:                         <div class="nested-delimiter-container">
-HTML-CALC-NEXT:                             <p>Subtracts the second integer from the first.</p>
+HTML-CALC-NEXT:                             <p> Subtracts the second integer from the first.</p>
 HTML-CALC-NEXT:                         </div>
 HTML-CALC-NEXT:                         <div class="nested-delimiter-container">
 HTML-CALC-NEXT:                             <h3>Parameters</h3>
@@ -241,14 +241,14 @@ HTML-CALC-NEXT:                             </div>
 HTML-CALC-NEXT:                         </div>
 HTML-CALC-NEXT:                         <div class="nested-delimiter-container">
 HTML-CALC-NEXT:                             <h3>Returns</h3>
-HTML-CALC-NEXT:                             <p>int The result of a - b.</p>
+HTML-CALC-NEXT:                             <p> int The result of a - b.</p>
 HTML-CALC-NEXT:                         </div>
 HTML-CALC-NEXT:                     </div>
 HTML-CALC-LABEL:                <div id="{{([0-9A-F]{40})}}" class="delimiter-container">
 HTML-CALC-NEXT:                     <pre><code class="language-cpp code-clang-doc">int multiply (int a, int b)</code></pre>
 HTML-CALC-NEXT:                     <div class="doc-card">
 HTML-CALC-NEXT:                         <div class="nested-delimiter-container">
-HTML-CALC-NEXT:                             <p>Multiplies two integers.</p>
+HTML-CALC-NEXT:                             <p> Multiplies two integers.</p>
 HTML-CALC-NEXT:                         </div>
 HTML-CALC-NEXT:                         <div class="nested-delimiter-container">
 HTML-CALC-NEXT:                             <h3>Parameters</h3>
@@ -261,14 +261,14 @@ HTML-CALC-NEXT:                             </div>
 HTML-CALC-NEXT:                         </div>
 HTML-CALC-NEXT:                         <div class="nested-delimiter-container">
 HTML-CALC-NEXT:                             <h3>Returns</h3>
-HTML-CALC-NEXT:                             <p>int The product of a and b.</p>
+HTML-CALC-NEXT:                             <p> int The product of a and b.</p>
 HTML-CALC-NEXT:                         </div>
 HTML-CALC-NEXT:                     </div>
 HTML-CALC-LABEL:                <div id="{{([0-9A-F]{40})}}" class="delimiter-container">
 HTML-CALC-NEXT:                     <pre><code class="language-cpp code-clang-doc">double divide (int a, int b)</code></pre>
 HTML-CALC-NEXT:                     <div class="doc-card">
 HTML-CALC-NEXT:                         <div class="nested-delimiter-container">
-HTML-CALC-NEXT:                             <p>Divides the first integer by the second.</p>
+HTML-CALC-NEXT:                             <p> Divides the first integer by the second.</p>
 HTML-CALC-NEXT:                         </div>
 HTML-CALC-NEXT:                         <div class="nested-delimiter-container">
 HTML-CALC-NEXT:                             <h3>Parameters</h3>
@@ -281,7 +281,7 @@ HTML-CALC-NEXT:                             </div>
 HTML-CALC-NEXT:                         </div>
 HTML-CALC-NEXT:                         <div class="nested-delimiter-container">
 HTML-CALC-NEXT:                             <h3>Returns</h3>
-HTML-CALC-NEXT:                             <p>double The result of a / b.</p>
+HTML-CALC-NEXT:                             <p> double The result of a / b.</p>
 HTML-CALC-NEXT:                         </div>
 HTML-CALC-NEXT:                         <div class="nested-delimiter-container">
 HTML-CALC-NEXT:                             <h3>Throws</h3>
@@ -294,7 +294,7 @@ HTML-CALC-LABEL:                <div id="{{([0-9A-F]{40})}}" class="delimiter-co
 HTML-CALC-NEXT:                     <pre><code class="language-cpp code-clang-doc">int mod (int a, int b)</code></pre>
 HTML-CALC-NEXT:                     <div class="doc-card">
 HTML-CALC-NEXT:                         <div class="nested-delimiter-container">
-HTML-CALC-NEXT:                             <p>Performs the mod operation on integers.</p>
+HTML-CALC-NEXT:                             <p> Performs the mod operation on integers.</p>
 HTML-CALC-NEXT:                         </div>
 HTML-CALC-NEXT:                         <div class="nested-delimiter-container">
 HTML-CALC-NEXT:                             <h3>Parameters</h3>
@@ -307,7 +307,7 @@ HTML-CALC-NEXT:                             </div>
 HTML-CALC-NEXT:                         </div>
 HTML-CALC-NEXT:                         <div class="nested-delimiter-container">
 HTML-CALC-NEXT:                             <h3>Returns</h3>
-HTML-CALC-NEXT:                             <p>The result of a % b.</p>
+HTML-CALC-NEXT:                             <p> The result of a % b.</p>
 HTML-CALC-NEXT:                         </div>
 HTML-CALC-NEXT:                     </div>
 HTML-CALC-NEXT:                 <p>Defined at line {{[0-9]+}} of file {{.*}}include{{[/\\]}}Calculator.h</p>
@@ -368,10 +368,10 @@ HTML-RECTANGLE-NEXT:                     <h1 class="hero__title-large">class Rec
 HTML-RECTANGLE-NEXT:                     <p>Defined at line {{[0-9]+}} of file {{.*}}include{{[/\\]}}Rectangle.h</p>
 HTML-RECTANGLE-NEXT:                     <div class="doc-card">
 HTML-RECTANGLE-NEXT:                         <div class="nested-delimiter-container">
-HTML-RECTANGLE-NEXT:                             <p>Rectangle class derived from Shape.</p>
+HTML-RECTANGLE-NEXT:                             <p> Rectangle class derived from Shape.</p>
 HTML-RECTANGLE-NEXT:                         </div>
 HTML-RECTANGLE-NEXT:                         <div class="nested-delimiter-container">
-HTML-RECTANGLE-NEXT:                             <p>Represents a rectangle with a given width and height.</p>
+HTML-RECTANGLE-NEXT:                             <p> Represents a rectangle with a given width and height.</p>
 HTML-RECTANGLE-NEXT:                         </div>
 HTML-RECTANGLE-NEXT:                     </div>
 HTML-RECTANGLE-NEXT:                 </div>
@@ -382,7 +382,7 @@ HTML-RECTANGLE-LABEL:                <div id="{{([0-9A-F]{40})}}" class="delimit
 HTML-RECTANGLE-NEXT:                     <pre><code class="language-cpp code-clang-doc">void Rectangle (double width, double height)</code></pre>
 HTML-RECTANGLE-NEXT:                     <div class="doc-card">
 HTML-RECTANGLE-NEXT:                         <div class="nested-delimiter-container">
-HTML-RECTANGLE-NEXT:                             <p>Constructs a new Rectangle object.</p>
+HTML-RECTANGLE-NEXT:                             <p> Constructs a new Rectangle object.</p>
 HTML-RECTANGLE-NEXT:                         </div>
 HTML-RECTANGLE-NEXT:                         <div class="nested-delimiter-container">
 HTML-RECTANGLE-NEXT:                             <h3>Parameters</h3>
@@ -398,22 +398,22 @@ HTML-RECTANGLE-LABEL:                <div id="{{([0-9A-F]{40})}}" class="delimit
 HTML-RECTANGLE-NEXT:                     <pre><code class="language-cpp code-clang-doc">double area ()</code></pre>
 HTML-RECTANGLE-NEXT:                     <div class="doc-card">
 HTML-RECTANGLE-NEXT:                         <div class="nested-delimiter-container">
-HTML-RECTANGLE-NEXT:                             <p>Calculates the area of the rectangle.</p>
+HTML-RECTANGLE-NEXT:                             <p> Calculates the area of the rectangle.</p>
 HTML-RECTANGLE-NEXT:                         </div>
 HTML-RECTANGLE-NEXT:                         <div class="nested-delimiter-container">
 HTML-RECTANGLE-NEXT:                             <h3>Returns</h3>
-HTML-RECTANGLE-NEXT:                             <p>double The area of the rectangle.</p>
+HTML-RECTANGLE-NEXT:                             <p> double The area of the rectangle.</p>
 HTML-RECTANGLE-NEXT:                         </div>
 HTML-RECTANGLE-NEXT:                     </div>
 HTML-RECTANGLE-LABEL:                <div id="{{([0-9A-F]{40})}}" class="delimiter-container">
 HTML-RECTANGLE-NEXT:                     <pre><code class="language-cpp code-clang-doc">double perimeter ()</code></pre>
 HTML-RECTANGLE-NEXT:                     <div class="doc-card">
 HTML-RECTANGLE-NEXT:                         <div class="nested-delimiter-container">
-HTML-RECTANGLE-NEXT:                             <p>Calculates the perimeter of the rectangle.</p>
+HTML-RECTANGLE-NEXT:                             <p> Calculates the perimeter of the rectangle.</p>
 HTML-RECTANGLE-NEXT:                         </div>
 HTML-RECTANGLE-NEXT:                         <div class="nested-delimiter-container">
 HTML-RECTANGLE-NEXT:                             <h3>Returns</h3>
-HTML-RECTANGLE-NEXT:                             <p>double The perimeter of the rectangle.</p>
+HTML-RECTANGLE-NEXT:                             <p> double The perimeter of the rectangle.</p>
 HTML-RECTANGLE-NEXT:                         </div>
 HTML-RECTANGLE-NEXT:                     </div>
 HTML-RECTANGLE-NEXT:                 <p>Defined at line {{[0-9]+}} of file {{.*}}src{{[/\\]}}Rectangle.cpp</p>
@@ -474,10 +474,10 @@ HTML-CIRCLE-NEXT:                     <h1 class="hero__title-large">class Circle
 HTML-CIRCLE-NEXT:                     <p>Defined at line {{[0-9]+}} of file {{.*}}include{{[/\\]}}Circle.h</p>
 HTML-CIRCLE-NEXT:                     <div class="doc-card">
 HTML-CIRCLE-NEXT:                         <div class="nested-delimiter-container">
-HTML-CIRCLE-NEXT:                             <p>Circle class derived from Shape.</p>
+HTML-CIRCLE-NEXT:                             <p> Circle class derived from Shape.</p>
 HTML-CIRCLE-NEXT:                         </div>
 HTML-CIRCLE-NEXT:                         <div class="nested-delimiter-container">
-HTML-CIRCLE-NEXT:                             <p>Represents a circle with a given radius.</p>
+HTML-CIRCLE-NEXT:                             <p> Represents a circle with a given radius.</p>
 HTML-CIRCLE-NEXT:                         </div>
 HTML-CIRCLE-NEXT:                     </div>
 HTML-CIRCLE-NEXT:                 </div>
@@ -488,7 +488,7 @@ HTML-CIRCLE-LABEL:                <div id="{{([0-9A-F]{40})}}" class="delimiter-
 HTML-CIRCLE-NEXT:                     <pre><code class="language-cpp code-clang-doc">void Circle (double radius)</code></pre>
 HTML-CIRCLE-NEXT:                     <div class="doc-card">
 HTML-CIRCLE-NEXT:                         <div class="nested-delimiter-container">
-HTML-CIRCLE-NEXT:                             <p>Constructs a new Circle object.</p>
+HTML-CIRCLE-NEXT:                             <p> Constructs a new Circle object.</p>
 HTML-CIRCLE-NEXT:                         </div>
 HTML-CIRCLE-NEXT:                         <div class="nested-delimiter-container">
 HTML-CIRCLE-NEXT:                             <h3>Parameters</h3>
@@ -501,22 +501,22 @@ HTML-CIRCLE-LABEL:                <div id="{{([0-9A-F]{40})}}" class="delimiter-
 HTML-CIRCLE-NEXT:                     <pre><code class="language-cpp code-clang-doc">double area ()</code></pre>
 HTML-CIRCLE-NEXT:                     <div class="doc-card">
 HTML-CIRCLE-NEXT:                         <div class="nested-delimiter-container">
-HTML-CIRCLE-NEXT:                             <p>Calculates the area of the circle.</p>
+HTML-CIRCLE-NEXT:                             <p> Calculates the area of the circle.</p>
 HTML-CIRCLE-NEXT:                         </div>
 HTML-CIRCLE-NEXT:                         <div class="nested-delimiter-container">
 HTML-CIRCLE-NEXT:                             <h3>Returns</h3>
-HTML-CIRCLE-NEXT:                             <p>double The area of the circle.</p>
+HTML-CIRCLE-NEXT:                             <p> double The area of the circle.</p>
 HTML-CIRCLE-NEXT:                         </div>
 HTML-CIRCLE-NEXT:                     </div>
 HTML-CIRCLE-LABEL:                <div id="{{([0-9A-F]{40})}}" class="delimiter-container">
 HTML-CIRCLE-NEXT:                     <pre><code class="language-cpp code-clang-doc">double perimeter ()</code></pre>
 HTML-CIRCLE-NEXT:                     <div class="doc-card">
 HTML-CIRCLE-NEXT:                         <div class="nested-delimiter-container">
-HTML-CIRCLE-NEXT:                             <p>Calculates the perimeter of the circle.</p>
+HTML-CIRCLE-NEXT:                             <p> Calculates the perimeter of the circle.</p>
 HTML-CIRCLE-NEXT:                         </div>
 HTML-CIRCLE-NEXT:                         <div class="nested-delimiter-container">
 HTML-CIRCLE-NEXT:                             <h3>Returns</h3>
-HTML-CIRCLE-NEXT:                             <p>double The perimeter of the circle.</p>
+HTML-CIRCLE-NEXT:                             <p> double The perimeter of the circle.</p>
 HTML-CIRCLE-NEXT:                         </div>
 HTML-CIRCLE-NEXT:                             <h3>Code</h3>
 HTML-CIRCLE-NEXT:                             <div>
diff --git a/clang-tools-extra/test/clang-doc/basic-project.test b/clang-tools-extra/test/clang-doc/basic-project.test
index 057091102f122..9220dc6974508 100644
--- a/clang-tools-extra/test/clang-doc/basic-project.test
+++ b/clang-tools-extra/test/clang-doc/basic-project.test
@@ -92,7 +92,7 @@
 // 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: **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*
diff --git a/clang-tools-extra/test/clang-doc/comments-in-macros.cpp b/clang-tools-extra/test/clang-doc/comments-in-macros.cpp
index 7200800e82acc..20bbf4cd087c0 100644
--- a/clang-tools-extra/test/clang-doc/comments-in-macros.cpp
+++ b/clang-tools-extra/test/clang-doc/comments-in-macros.cpp
@@ -30,7 +30,7 @@
 // HTML-MYCLASS: <pre><code class="language-cpp code-clang-doc">int Add (int a, int b)</code></pre>
 // HTML-MYCLASS: <div class="doc-card">
 // HTML-MYCLASS:     <div class="nested-delimiter-container">
-// HTML-MYCLASS:         <p>Declare a method to calculate the sum of two numbers</p>
+// HTML-MYCLASS:         <p> Declare a method to calculate the sum of two numbers</p>
 // HTML-MYCLASS:     </div>
 
 class MyClass {
diff --git a/clang-tools-extra/test/clang-doc/enum.cpp b/clang-tools-extra/test/clang-doc/enum.cpp
index ce6955da9dd56..efcb58c967501 100644
--- a/clang-tools-extra/test/clang-doc/enum.cpp
+++ b/clang-tools-extra/test/clang-doc/enum.cpp
@@ -47,7 +47,7 @@ enum Color {
 // MD-INDEX: | Red |
 // MD-INDEX: | Green |
 // MD-INDEX: | Blue |
-// MD-INDEX: **brief** For specifying RGB colors
+// MD-INDEX: **brief**For specifying RGB colors
 
 // HTML-INDEX-LABEL:  <div id="{{([0-9A-F]{40})}}" class="delimiter-container">
 // HTML-INDEX-NEXT:     <div>
@@ -125,7 +125,7 @@ enum class Shapes {
 // MD-INDEX: | Circle |
 // MD-INDEX: | Rectangle |
 // MD-INDEX: | Triangle |
-// MD-INDEX: **brief** Shape Types
+// MD-INDEX: **brief**Shape Types
 
 // HTML-INDEX-LABEL:  <div id="{{([0-9A-F]{40})}}" class="delimiter-container">
 // HTML-INDEX-NEXT:     <div>
@@ -201,7 +201,7 @@ enum Size : uint8_t {
 // MD-INDEX: | Small |
 // MD-INDEX: | Medium |
 // MD-INDEX: | Large |
-// MD-INDEX: **brief** Specify the size
+// MD-INDEX: **brief**Specify the size
 
 // HTML-INDEX-LABEL:   <div id="{{([0-9A-F]{40})}}" class="delimiter-container">
 // HTML-INDEX-NEXT:     <div>
@@ -265,7 +265,7 @@ enum : long long {
 // MD-INDEX: | enum (unnamed) : long long |
 // MD-INDEX: --
 // MD-INDEX: | BigVal |
-// MD-INDEX: **brief** Very long number
+// MD-INDEX: **brief**Very long number
 
 // HTML-INDEX-LABEL:  <div id="{{([0-9A-F]{40})}}" class="delimiter-container">
 // HTML-INDEX-NEXT:     <div>
@@ -318,7 +318,7 @@ class FilePermissions {
 // MD-PERM: | Read |
 // MD-PERM: | Write |
 // MD-PERM: | Execute |
-// MD-PERM: **brief** File permission flags
+// MD-PERM: **brief**File permission flags
 
 // HTML-PERM-LABEL:  <section id="Enums" class="section-container">
 // HTML-PERM-NEXT:     <h2>Enumerations</h2>
@@ -448,7 +448,7 @@ class Animals {
 // MD-ANIMAL: | Dog |
 // MD-ANIMAL: | Cat |
 // MD-ANIMAL: | Iguana |
-// MD-ANIMAL: **brief** specify what animal the class is
+// MD-ANIMAL: **brief**specify what animal the class is
 
 // MD-MUSTACHE-ANIMAL: # class Animals
 // MD-MUSTACHE-ANIMAL: ## Enums
@@ -483,7 +483,7 @@ enum Car {
 // MD-VEHICLES: | SUV |
 // MD-VEHICLES: | Pickup |
 // MD-VEHICLES: | Hatchback |
-// MD-VEHICLES: **brief** specify type of car
+// MD-VEHICLES: **brief**specify type of car
 
 // HTML-VEHICLES-LABEL:   <div id="{{([0-9A-F]{40})}}" class="delimiter-container">
 // HTML-VEHICLES-NEXT:      <div>
diff --git a/clang-tools-extra/test/clang-doc/json/class.cpp b/clang-tools-extra/test/clang-doc/json/class.cpp
index 85f1508529f21..3bb9f5e6ec6bb 100644
--- a/clang-tools-extra/test/clang-doc/json/class.cpp
+++ b/clang-tools-extra/test/clang-doc/json/class.cpp
@@ -52,16 +52,16 @@ struct MyClass {
 // CHECK-NEXT:      "BriefComments": [
 // CHECK-NEXT:        [
 // CHECK-NEXT:          {
-// CHECK-NEXT:            "TextComment": "This is a brief description."
+// CHECK-NEXT:            "TextComment": " This is a brief description."
 // CHECK:           "HasBriefComments": true,
 // CHECK-NEXT:      "HasParagraphComments": true,
 // CHECK-NEXT:      "ParagraphComments": [
 // CHECK-NEXT:        [
 // CHECK-NEXT:          {
-// CHECK-NEXT:            "TextComment": "This is a nice class."
+// CHECK-NEXT:            "TextComment": " This is a nice class."
 // CHECK-NEXT:          },
 // CHECK-NEXT:          {
-// CHECK-NEXT:            "TextComment": "It has some nice methods and fields."
+// CHECK-NEXT:            "TextComment": " It has some nice methods and fields."
 // CHECK-NEXT:          }
 // CHECK:         "DocumentationFileName": "_ZTV7MyClass",
 // CHECK:         "Enums": [
@@ -103,7 +103,7 @@ struct MyClass {
 // CHECK-NEXT:          "ParagraphComments": [
 // CHECK-NEXT:            [
 // CHECK-NEXT:              {
-// CHECK-NEXT:                "TextComment": "This is a function template friend."
+// CHECK-NEXT:                "TextComment": " This is a function template friend."
 // CHECK-NEXT:              }
 // CHECK-NEXT:            ]
 // CHECK-NEXT:          ]
@@ -149,7 +149,7 @@ struct MyClass {
 // CHECK-NEXT:          "ParagraphComments": [
 // CHECK-NEXT:            [
 // CHECK-NEXT:              {
-// CHECK-NEXT:                "TextComment": "This is a struct friend."
+// CHECK-NEXT:                "TextComment": " This is a struct friend."
 // CHECK-NEXT:              }
 // CHECK-NEXT:            ]
 // CHECK-NEXT:          ]
diff --git a/clang-tools-extra/test/clang-doc/json/compound-constraints.cpp b/clang-tools-extra/test/clang-doc/json/compound-constraints.cpp
index 97fe50b719792..a34be9753f80e 100644
--- a/clang-tools-extra/test/clang-doc/json/compound-constraints.cpp
+++ b/clang-tools-extra/test/clang-doc/json/compound-constraints.cpp
@@ -149,7 +149,7 @@ template<typename T> requires (Incrementable<T> && Decrementable<T>) || PreIncre
 // CHECK-HTML-NEXT:             <pre><code class="language-cpp code-clang-doc">template <typename T> Incrementable requires (T a) { a++; }</code></pre> 
 // CHECK-HTML-NEXT:         </div>
 // CHECK-HTML-NEXT:         <div class="nested-delimiter-container">
-// CHECK-HTML-NEXT:             <p>Concept for an incrementable value</p>
+// CHECK-HTML-NEXT:             <p> Concept for an incrementable value</p>
 // CHECK-HTML-NEXT:         </div>
 // CHECK-HTML-NEXT:         <h3>Template Parameters</h3>
 // CHECK-HTML-NEXT:         <div class="nested-delimiter-container">
@@ -164,7 +164,7 @@ template<typename T> requires (Incrementable<T> && Decrementable<T>) || PreIncre
 // CHECK-HTML-NEXT:             <pre><code class="language-cpp code-clang-doc">template <typename T> Decrementable requires (T a) { a--; }</code></pre> 
 // CHECK-HTML-NEXT:         </div>
 // CHECK-HTML-NEXT:         <div class="nested-delimiter-container">
-// CHECK-HTML-NEXT:             <p>Concept for a decrementable value</p>
+// CHECK-HTML-NEXT:             <p> Concept for a decrementable value</p>
 // CHECK-HTML-NEXT:         </div>
 // CHECK-HTML-NEXT:         <h3>Template Parameters</h3>
 // CHECK-HTML-NEXT:         <div class="nested-delimiter-container">
@@ -179,7 +179,7 @@ template<typename T> requires (Incrementable<T> && Decrementable<T>) || PreIncre
 // CHECK-HTML-NEXT:             <pre><code class="language-cpp code-clang-doc">template <typename T> PreIncrementable requires (T a) { ++a; }</code></pre> 
 // CHECK-HTML-NEXT:         </div>
 // CHECK-HTML-NEXT:         <div class="nested-delimiter-container">
-// CHECK-HTML-NEXT:             <p>Concept for a pre-incrementable value</p>
+// CHECK-HTML-NEXT:             <p> Concept for a pre-incrementable value</p>
 // CHECK-HTML-NEXT:         </div>
 // CHECK-HTML-NEXT:         <h3>Template Parameters</h3>
 // CHECK-HTML-NEXT:         <div class="nested-delimiter-container">
@@ -194,7 +194,7 @@ template<typename T> requires (Incrementable<T> && Decrementable<T>) || PreIncre
 // CHECK-HTML-NEXT:             <pre><code class="language-cpp code-clang-doc">template <typename T> PreDecrementable requires (T a) { --a; }</code></pre> 
 // CHECK-HTML-NEXT:         </div>
 // CHECK-HTML-NEXT:         <div class="nested-delimiter-container">
-// CHECK-HTML-NEXT:             <p>Concept for a -pre-decrementable value</p>
+// CHECK-HTML-NEXT:             <p> Concept for a -pre-decrementable value</p>
 // CHECK-HTML-NEXT:         </div>
 // CHECK-HTML-NEXT:         <h3>Template Parameters</h3>
 // CHECK-HTML-NEXT:         <div class="nested-delimiter-container">
diff --git a/clang-tools-extra/test/clang-doc/json/concept.cpp b/clang-tools-extra/test/clang-doc/json/concept.cpp
index 764f173bb03bc..70d20be1096e8 100644
--- a/clang-tools-extra/test/clang-doc/json/concept.cpp
+++ b/clang-tools-extra/test/clang-doc/json/concept.cpp
@@ -18,7 +18,7 @@ concept Incrementable = requires(T x) {
 // CHECK-NEXT:        "ParagraphComments": [
 // CHECK-NEXT:          [
 // CHECK-NEXT:            {
-// CHECK-NEXT:              "TextComment": "Requires that T suports post and pre-incrementing."
+// CHECK-NEXT:              "TextComment": " Requires that T suports post and pre-incrementing."
 // CHECK:             "End": true,
 // CHECK-NEXT:        "InfoType": "concept",
 // CHECK-NEXT:        "IsType": true,
diff --git a/clang-tools-extra/test/clang-doc/namespace.cpp b/clang-tools-extra/test/clang-doc/namespace.cpp
index e39fbacb62638..1d7337d60f69c 100644
--- a/clang-tools-extra/test/clang-doc/namespace.cpp
+++ b/clang-tools-extra/test/clang-doc/namespace.cpp
@@ -196,7 +196,7 @@ class ClassInNestedNamespace {};
 // HTML-NESTED-INDEX:         <pre><code class="language-cpp code-clang-doc">void functionInNestedNamespace ()</code></pre>
 // HTML-NESTED-INDEX:         <div class="doc-card">
 // HTML-NESTED-INDEX:             <div class="nested-delimiter-container">
-// HTML-NESTED-INDEX:                 <p>Function in NestedNamespace</p>
+// HTML-NESTED-INDEX:                 <p> Function in NestedNamespace</p>
 // HTML-NESTED-INDEX:             </div>
 // HTML-NESTED-INDEX:         </div>
 // HTML-NESTED-INDEX:         <p>Defined at line [[@LINE-56]] of file {{.*}}namespace.cpp</p>
@@ -241,7 +241,7 @@ class ClassInNestedNamespace {};
 // HTML-PRIMARY-INDEX:          <pre><code class="language-cpp code-clang-doc">void functionInPrimaryNamespace ()</code></pre>
 // HTML-PRIMARY-INDEX:          <div class="doc-card">
 // HTML-PRIMARY-INDEX:              <div class="nested-delimiter-container">
-// HTML-PRIMARY-INDEX:                  <p>Function in PrimaryNamespace</p>
+// HTML-PRIMARY-INDEX:                  <p> Function in PrimaryNamespace</p>
 // HTML-PRIMARY-INDEX:              </div>
 // HTML-PRIMARY-INDEX:          </div>
 // HTML-PRIMARY-INDEX:          <p>Defined at line [[@LINE-130]] of file {{.*}}clang-tools-extra{{[\/]}}test{{[\/]}}clang-doc{{[\/]}}namespace.cpp</p>
@@ -321,7 +321,7 @@ class ClassInAnotherNamespace {};
 // HTML-ANOTHER-INDEX:         <pre><code class="language-cpp code-clang-doc">void functionInAnotherNamespace ()</code></pre>
 // HTML-ANOTHER-INDEX:         <div class="doc-card">
 // HTML-ANOTHER-INDEX:             <div class="nested-delimiter-container">
-// HTML-ANOTHER-INDEX:                 <p>Function in AnotherNamespace</p>
+// HTML-ANOTHER-INDEX:                 <p> Function in AnotherNamespace</p>
 // HTML-ANOTHER-INDEX:             </div>
 // HTML-ANOTHER-INDEX:         </div>
 // HTML-ANOTHER-INDEX:         <p>Defined at line [[@LINE-55]] of file {{.*}}clang-tools-extra{{[\/]}}test{{[\/]}}clang-doc{{[\/]}}namespace.cpp</p>
diff --git a/clang-tools-extra/test/clang-doc/templates.cpp b/clang-tools-extra/test/clang-doc/templates.cpp
index 86af599472894..e7b003670fbf6 100644
--- a/clang-tools-extra/test/clang-doc/templates.cpp
+++ b/clang-tools-extra/test/clang-doc/templates.cpp
@@ -388,10 +388,10 @@ struct tuple {};
 // HTML-STRUCT-NEXT:           <p>Defined at line [[# @LINE - 6]] of file {{.*}}templates.cpp</p>
 // HTML-STRUCT-NEXT:           <div class="doc-card">
 // HTML-STRUCT-NEXT:               <div class="nested-delimiter-container">
-// HTML-STRUCT-NEXT:                   <p>A Tuple type</p>
+// HTML-STRUCT-NEXT:                   <p> A Tuple type</p>
 // HTML-STRUCT-NEXT:               </div>
 // HTML-STRUCT-NEXT:               <div class="nested-delimiter-container">
-// HTML-STRUCT-NEXT:                   <p>Does Tuple things.</p>
+// HTML-STRUCT-NEXT:                   <p> Does Tuple things.</p>
 // HTML-STRUCT-NEXT:               </div>
 // HTML-STRUCT-NEXT:           </div>
 // HTML-STRUCT-NEXT:       </div>
@@ -410,7 +410,7 @@ tuple<int, int, bool> func_with_tuple_param(tuple<int, int, bool> t) { return t;
 // YAML-NEXT:          - Kind:            ParagraphComment
 // YAML-NEXT:            Children:
 // YAML-NEXT:              - Kind:            TextComment
-// YAML-NEXT:                Text:            'A function with a tuple parameter'
+// YAML-NEXT:                Text:            ' A function with a tuple parameter'
 // YAML-NEXT:          - Kind:            ParagraphComment
 // YAML-NEXT:            Children:
 // YAML-NEXT:              - Kind:            TextComment
@@ -421,7 +421,7 @@ tuple<int, int, bool> func_with_tuple_param(tuple<int, int, bool> t) { return t;
 // YAML-NEXT:              - Kind:            ParagraphComment
 // YAML-NEXT:                Children:
 // YAML-NEXT:                  - Kind:            TextComment
-// YAML-NEXT:                    Text:            'The input to func_with_tuple_param'
+// YAML-NEXT:                    Text:            ' The input to func_with_tuple_param'
 // YAML-NEXT:    DefLocation:
 // YAML-NEXT:      LineNumber:      [[# @LINE - 23]]
 // YAML-NEXT:      Filename:
@@ -472,7 +472,7 @@ tuple<int, int, bool> func_with_tuple_param(tuple<int, int, bool> t) { return t;
 // HTML:           <pre><code class="language-cpp code-clang-doc">tuple<int, int, bool> func_with_tuple_param (tuple<int, int, bool> t)</code></pre>
 // HTML-NEXT:      <div class="doc-card">
 // HTML-NEXT:          <div class="nested-delimiter-container">
-// HTML-NEXT:              <p>A function with a tuple parameter</p>
+// HTML-NEXT:              <p> A function with a tuple parameter</p>
 // HTML-NEXT:          </div>
 // HTML-NEXT:          <div class="nested-delimiter-container">
 // HTML-NEXT:              <h3>Parameters</h3>
diff --git a/clang-tools-extra/test/clang-doc/typedef-alias.cpp b/clang-tools-extra/test/clang-doc/typedef-alias.cpp
index c4dad4c25f2e0..f5b4afd7ff6a8 100644
--- a/clang-tools-extra/test/clang-doc/typedef-alias.cpp
+++ b/clang-tools-extra/test/clang-doc/typedef-alias.cpp
@@ -41,14 +41,14 @@ using IntVec = Vector<int>;
 // HTML-GLOBAL-NEXT:     <div id="{{([0-9A-F]{40})}}" class="delimiter-container">
 // HTML-GLOBAL-NEXT:         <pre><code class="language-cpp code-clang-doc">using u_long = unsigned long</code></pre>
 // HTML-GLOBAL-NEXT:         <div class="nested-delimiter-container">
-// HTML-GLOBAL-NEXT:             <p>This is u_long</p>
+// HTML-GLOBAL-NEXT:             <p> This is u_long</p>
 // HTML-GLOBAL-NEXT:         </div>
 // HTML-GLOBAL-NEXT:         <p>Defined at line 8 of file {{.*}}typedef-alias.cpp</p>
 // HTML-GLOBAL-NEXT:     </div>
 // HTML-GLOBAL-NEXT:     <div id="{{([0-9A-F]{40})}}" class="delimiter-container">
 // HTML-GLOBAL-NEXT:         <pre><code class="language-cpp code-clang-doc">typedef IntPtr int *</code></pre>
 // HTML-GLOBAL-NEXT:         <div class="nested-delimiter-container">
-// HTML-GLOBAL-NEXT:             <p>This is IntPtr</p>
+// HTML-GLOBAL-NEXT:             <p> This is IntPtr</p>
 // HTML-GLOBAL-NEXT:         </div>
 // HTML-GLOBAL-NEXT:         <p>Defined at line 11 of file {{.*}}typedef-alias.cpp</p>
 // HTML-GLOBAL-NEXT:     </div>
@@ -75,7 +75,7 @@ using IntVec = Vector<int>;
 // HTML-VECTOR-NEXT:     <div id="{{([0-9A-F]{40})}}" class="delimiter-container">
 // HTML-VECTOR-NEXT:         <pre><code class="language-cpp code-clang-doc">using Ptr = IntPtr</code></pre>
 // HTML-VECTOR-NEXT:         <div class="nested-delimiter-container">
-// HTML-VECTOR-NEXT:             <p>This is a Ptr</p>
+// HTML-VECTOR-NEXT:             <p> This is a Ptr</p>
 // HTML-VECTOR-NEXT:         </div>
 // HTML-VECTOR-NEXT:         <p>Defined at line 16 of file {{.*}}typedef-alias.cpp</p>
 // HTML-VECTOR-NEXT:     </div>
diff --git a/clang-tools-extra/unittests/clang-doc/MDGeneratorTest.cpp b/clang-tools-extra/unittests/clang-doc/MDGeneratorTest.cpp
index da22d00835126..5fed8f4db4809 100644
--- a/clang-tools-extra/unittests/clang-doc/MDGeneratorTest.cpp
+++ b/clang-tools-extra/unittests/clang-doc/MDGeneratorTest.cpp
@@ -290,7 +290,7 @@ TEST_F(MDGeneratorTest, emitCommentMD) {
   ParamOut->Children.back()->Children.emplace_back(allocatePtr<CommentInfo>());
   ParamOut->Children.back()->Children.back()->Kind =
       CommentKind::CK_TextComment;
-  ParamOut->Children.back()->Children.back()->Text = "is a parameter.";
+  ParamOut->Children.back()->Children.back()->Text = " is a parameter.";
 
   Top.Children.emplace_back(allocatePtr<CommentInfo>());
   CommentInfo *ParamIn = Top.Children.back().get();
@@ -301,7 +301,7 @@ TEST_F(MDGeneratorTest, emitCommentMD) {
   ParamIn->Children.back()->Kind = CommentKind::CK_ParagraphComment;
   ParamIn->Children.back()->Children.emplace_back(allocatePtr<CommentInfo>());
   ParamIn->Children.back()->Children.back()->Kind = CommentKind::CK_TextComment;
-  ParamIn->Children.back()->Children.back()->Text = "is a parameter.";
+  ParamIn->Children.back()->Children.back()->Text = " is a parameter.";
   ParamIn->Children.back()->Children.emplace_back(
       std::make_unique<CommentInfo>());
   ParamIn->Children.back()->Children.back()->Kind = CommentKind::CK_TextComment;
@@ -352,7 +352,7 @@ TEST_F(MDGeneratorTest, emitCommentMD) {
 
 **J** is a parameter.
 
-**return** void
+**return**void
 
 )raw";
 

>From b33b04a7515ef88500013f12cdac4439a1bb2fbc Mon Sep 17 00:00:00 2001
From: Samrudh Nelli <samrudhnelli at gmail.com>
Date: Tue, 10 Mar 2026 15:58:52 +0530
Subject: [PATCH 21/39] Revert "remove the leading whitespace"

This reverts commit eaf02b3d334be01295c1ff27b83462c188d7c91a.
---
 clang-tools-extra/clang-doc/Serialize.cpp |  6 ++---
 clang-tools-extra/test/clang-doc/enum.cpp | 28 +++++++++++------------
 2 files changed, 17 insertions(+), 17 deletions(-)

diff --git a/clang-tools-extra/clang-doc/Serialize.cpp b/clang-tools-extra/clang-doc/Serialize.cpp
index 05f7a1eb896ff..7b09c1ea29b50 100644
--- a/clang-tools-extra/clang-doc/Serialize.cpp
+++ b/clang-tools-extra/clang-doc/Serialize.cpp
@@ -239,14 +239,14 @@ void ClangDocCommentVisitor::parseComment(const comments::Comment *C) {
 
 void ClangDocCommentVisitor::visitTextComment(const TextComment *C) {
   if (!isWhitespaceOnly(C->getText()))
-    CurrentCI.Text = C->getText().trim().str();
+    CurrentCI.Text = C->getText();
 }
 
 void ClangDocCommentVisitor::visitInlineCommandComment(
     const InlineCommandComment *C) {
   CurrentCI.Name = getCommandName(C->getCommandID());
   for (unsigned I = 0, E = C->getNumArgs(); I != E; ++I)
-    CurrentCI.Args.push_back(C->getArgText(I).trim());
+    CurrentCI.Args.push_back(C->getArgText(I));
 }
 
 void ClangDocCommentVisitor::visitHTMLStartTagComment(
@@ -270,7 +270,7 @@ void ClangDocCommentVisitor::visitBlockCommandComment(
     const BlockCommandComment *C) {
   CurrentCI.Name = getCommandName(C->getCommandID());
   for (unsigned I = 0, E = C->getNumArgs(); I < E; ++I)
-    CurrentCI.Args.push_back(C->getArgText(I).trim());
+    CurrentCI.Args.push_back(C->getArgText(I));
 }
 
 void ClangDocCommentVisitor::visitParamCommandComment(
diff --git a/clang-tools-extra/test/clang-doc/enum.cpp b/clang-tools-extra/test/clang-doc/enum.cpp
index efcb58c967501..e48c66e7240cf 100644
--- a/clang-tools-extra/test/clang-doc/enum.cpp
+++ b/clang-tools-extra/test/clang-doc/enum.cpp
@@ -47,7 +47,7 @@ enum Color {
 // MD-INDEX: | Red |
 // MD-INDEX: | Green |
 // MD-INDEX: | Blue |
-// MD-INDEX: **brief**For specifying RGB colors
+// MD-INDEX: **brief** For specifying RGB colors
 
 // HTML-INDEX-LABEL:  <div id="{{([0-9A-F]{40})}}" class="delimiter-container">
 // HTML-INDEX-NEXT:     <div>
@@ -91,7 +91,7 @@ enum Color {
 // HTML-INDEX-NEXT:     </table>
 // HTML-INDEX-NEXT:     <div class="doc-card">
 // HTML-INDEX-NEXT:       <div class="nested-delimiter-container">
-// HTML-INDEX-NEXT:           <p>For specifying RGB colors</p>
+// HTML-INDEX-NEXT:           <p> For specifying RGB colors</p>
 // HTML-INDEX-NEXT:       </div>
 // HTML-INDEX-NEXT:     </div>
 // HTML-INDEX-NEXT:     <p>Defined at line [[@LINE-61]] of file {{.*}}clang-tools-extra{{[\/]}}test{{[\/]}}clang-doc{{[\/]}}enum.cpp</p>
@@ -125,7 +125,7 @@ enum class Shapes {
 // MD-INDEX: | Circle |
 // MD-INDEX: | Rectangle |
 // MD-INDEX: | Triangle |
-// MD-INDEX: **brief**Shape Types
+// MD-INDEX: **brief** Shape Types
 
 // HTML-INDEX-LABEL:  <div id="{{([0-9A-F]{40})}}" class="delimiter-container">
 // HTML-INDEX-NEXT:     <div>
@@ -169,7 +169,7 @@ enum class Shapes {
 // HTML-INDEX-NEXT:     </table>
 // HTML-INDEX-NEXT:     <div class="doc-card">
 // HTML-INDEX-NEXT:       <div class="nested-delimiter-container">
-// HTML-INDEX-NEXT:           <p>Shape Types</p>
+// HTML-INDEX-NEXT:           <p> Shape Types</p>
 // HTML-INDEX-NEXT:       </div>
 // HTML-INDEX-NEXT:     </div>
 // HTML-INDEX-NEXT:     <p>Defined at line [[@LINE-63]] of file {{.*}}clang-tools-extra{{[\/]}}test{{[\/]}}clang-doc{{[\/]}}enum.cpp</p>
@@ -201,7 +201,7 @@ enum Size : uint8_t {
 // MD-INDEX: | Small |
 // MD-INDEX: | Medium |
 // MD-INDEX: | Large |
-// MD-INDEX: **brief**Specify the size
+// MD-INDEX: **brief** Specify the size
 
 // HTML-INDEX-LABEL:   <div id="{{([0-9A-F]{40})}}" class="delimiter-container">
 // HTML-INDEX-NEXT:     <div>
@@ -247,7 +247,7 @@ enum Size : uint8_t {
 // HTML-INDEX-NEXT:     </table>
 // HTML-INDEX-NEXT:     <div class="doc-card">
 // HTML-INDEX-NEXT:       <div class="nested-delimiter-container">
-// HTML-INDEX-NEXT:           <p>Specify the size</p>
+// HTML-INDEX-NEXT:           <p> Specify the size</p>
 // HTML-INDEX-NEXT:       </div>
 // HTML-INDEX-NEXT:     </div>
 // HTML-INDEX-NEXT:     <p>Defined at line [[@LINE-71]] of file {{.*}}clang-tools-extra{{[\/]}}test{{[\/]}}clang-doc{{[\/]}}enum.cpp</p>
@@ -265,7 +265,7 @@ enum : long long {
 // MD-INDEX: | enum (unnamed) : long long |
 // MD-INDEX: --
 // MD-INDEX: | BigVal |
-// MD-INDEX: **brief**Very long number
+// MD-INDEX: **brief** Very long number
 
 // HTML-INDEX-LABEL:  <div id="{{([0-9A-F]{40})}}" class="delimiter-container">
 // HTML-INDEX-NEXT:     <div>
@@ -291,7 +291,7 @@ enum : long long {
 // HTML-INDEX-NEXT:     </table>
 // HTML-INDEX-NEXT:     <div class="doc-card">
 // HTML-INDEX-NEXT:       <div class="nested-delimiter-container">
-// HTML-INDEX-NEXT:           <p>Very long number</p>
+// HTML-INDEX-NEXT:           <p> Very long number</p>
 // HTML-INDEX-NEXT:       </div>
 // HTML-INDEX-NEXT:     </div>
 // HTML-INDEX-NEXT:     <p>Defined at line [[@LINE-38]] of file {{.*}}clang-tools-extra{{[\/]}}test{{[\/]}}clang-doc{{[\/]}}enum.cpp</p>
@@ -318,7 +318,7 @@ class FilePermissions {
 // MD-PERM: | Read |
 // MD-PERM: | Write |
 // MD-PERM: | Execute |
-// MD-PERM: **brief**File permission flags
+// MD-PERM: **brief** File permission flags
 
 // HTML-PERM-LABEL:  <section id="Enums" class="section-container">
 // HTML-PERM-NEXT:     <h2>Enumerations</h2>
@@ -364,7 +364,7 @@ class FilePermissions {
 // HTML-PERM-NEXT:       </table>
 // HTML-PERM-NEXT:       <div class="doc-card">
 // HTML-PERM-NEXT:         <div class="nested-delimiter-container">
-// HTML-PERM-NEXT:             <p>File permission flags</p>
+// HTML-PERM-NEXT:             <p> File permission flags</p>
 // HTML-PERM-NEXT:         </div>
 // HTML-PERM-NEXT:       </div>
 // HTML-PERM-NEXT:         <p>Defined at line [[@LINE-63]] of file {{.*}}clang-tools-extra{{[\/]}}test{{[\/]}}clang-doc{{[\/]}}enum.cpp</p>
@@ -434,7 +434,7 @@ class Animals {
 // HTML-ANIMAL-NEXT:         </table>
 // HTML-ANIMAL-NEXT:         <div class="doc-card">
 // HTML-ANIMAL-NEXT:             <div class="nested-delimiter-container">
-// HTML-ANIMAL-NEXT:                 <p>specify what animal the class is</p>
+// HTML-ANIMAL-NEXT:                 <p> specify what animal the class is</p>
 // HTML-ANIMAL-NEXT:             </div>
 // HTML-ANIMAL-NEXT:         </div>
 // HTML-ANIMAL-NEXT:         <p>Defined at line [[@LINE-56]] of file {{.*}}enum.cpp</p>
@@ -448,7 +448,7 @@ class Animals {
 // MD-ANIMAL: | Dog |
 // MD-ANIMAL: | Cat |
 // MD-ANIMAL: | Iguana |
-// MD-ANIMAL: **brief**specify what animal the class is
+// MD-ANIMAL: **brief** specify what animal the class is
 
 // MD-MUSTACHE-ANIMAL: # class Animals
 // MD-MUSTACHE-ANIMAL: ## Enums
@@ -483,7 +483,7 @@ enum Car {
 // MD-VEHICLES: | SUV |
 // MD-VEHICLES: | Pickup |
 // MD-VEHICLES: | Hatchback |
-// MD-VEHICLES: **brief**specify type of car
+// MD-VEHICLES: **brief** specify type of car
 
 // HTML-VEHICLES-LABEL:   <div id="{{([0-9A-F]{40})}}" class="delimiter-container">
 // HTML-VEHICLES-NEXT:      <div>
@@ -536,7 +536,7 @@ enum Car {
 // HTML-VEHICLES-NEXT:      </table>
 // HTML-VEHICLES-NEXT:      <div class="doc-card">
 // HTML-VEHICLES-NEXT:        <div class="nested-delimiter-container">
-// HTML-VEHICLES-NEXT:           <p>specify type of car</p>
+// HTML-VEHICLES-NEXT:           <p> specify type of car</p>
 // HTML-VEHICLES-NEXT:        </div>
 // HTML-VEHICLES-NEXT:      </div>
 // HTML-VEHICLES-NEXT:      <p>Defined at line [[@LINE-75]] of file {{.*}}clang-tools-extra{{[\/]}}test{{[\/]}}clang-doc{{[\/]}}enum.cpp</p>

>From 3aa1850dfa9233e2e9dc7b7c85a04bab0ed16d79 Mon Sep 17 00:00:00 2001
From: Samrudh Nelli <samrudhnelli at gmail.com>
Date: Tue, 10 Mar 2026 16:03:35 +0530
Subject: [PATCH 22/39] add function serializeDescription()

---
 clang-tools-extra/clang-doc/JSONGenerator.cpp | 48 ++++++++-----------
 clang-tools-extra/test/clang-doc/enum.cpp     |  2 +-
 2 files changed, 22 insertions(+), 28 deletions(-)

diff --git a/clang-tools-extra/clang-doc/JSONGenerator.cpp b/clang-tools-extra/clang-doc/JSONGenerator.cpp
index 0894e68e36981..25d2644040873 100644
--- a/clang-tools-extra/clang-doc/JSONGenerator.cpp
+++ b/clang-tools-extra/clang-doc/JSONGenerator.cpp
@@ -1,5 +1,6 @@
 #include "Generators.h"
 #include "clang/Basic/Specifiers.h"
+#include "llvm/ADT/ArrayRef.h"
 #include "llvm/Support/JSON.h"
 
 using namespace llvm;
@@ -398,6 +399,24 @@ void JSONGenerator::generateContext(const Info &I, Object &Obj) {
   Obj["HasContexts"] = true;
 }
 
+static void serializeDescription(llvm::ArrayRef<CommentInfo> Description, json::Object &Obj) {
+  // Skip straight to the FullComment's children
+  auto &Comments = Description.front().Children;
+  for (const auto &CommentInfo : Comments) {
+    json::Value Comment = serializeComment(*CommentInfo, Obj);
+    // if a ParagraphComment is returned, then it is a top-level comment that
+    // needs to be inserted manually.
+    if (auto *ParagraphComment = Comment.getAsObject();
+        ParagraphComment->get("ParagraphComment")) {
+      auto TextCommentsArray = extractTextComments(ParagraphComment);
+      if (TextCommentsArray.kind() == json::Value::Null ||
+          TextCommentsArray.getAsArray()->empty())
+        continue;
+      insertComment(Obj, TextCommentsArray, "ParagraphComments");
+    }
+  }
+}
+
 void JSONGenerator::serializeCommonAttributes(const Info &I,
                                               json::Object &Obj) {
   insertNonEmpty("Name", I.Name, Obj);
@@ -418,21 +437,7 @@ void JSONGenerator::serializeCommonAttributes(const Info &I,
 
   if (!I.Description.empty()) {
     Object Description = Object();
-    // Skip straight to the FullComment's children
-    auto &Comments = I.Description.at(0).Children;
-    for (const auto &CommentInfo : Comments) {
-      json::Value Comment = serializeComment(*CommentInfo, Description);
-      // if a ParagraphComment is returned, then it is a top-level comment that
-      // needs to be inserted manually.
-      if (auto *ParagraphComment = Comment.getAsObject();
-          ParagraphComment->get("ParagraphComment")) {
-        auto TextCommentsArray = extractTextComments(ParagraphComment);
-        if (TextCommentsArray.kind() == json::Value::Null ||
-            TextCommentsArray.getAsArray()->empty())
-          continue;
-        insertComment(Description, TextCommentsArray, "ParagraphComments");
-      }
-    }
+    serializeDescription(I.Description, Description);
     Obj["Description"] = std::move(Description);
   }
 
@@ -620,18 +625,7 @@ void JSONGenerator::serializeInfo(const EnumValueInfo &I, Object &Obj) {
     return;
 
   Object Description = Object();
-  auto &Comments = I.Description.at(0).Children;
-  for (const auto &CommentInfo : Comments) {
-    json::Value Comment = serializeComment(*CommentInfo, Description);
-    if (auto *ParagraphComment = Comment.getAsObject();
-        ParagraphComment->get("ParagraphComment")) {
-      auto TextCommentsArray = extractTextComments(ParagraphComment);
-      if (TextCommentsArray.kind() == json::Value::Null ||
-          TextCommentsArray.getAsArray()->empty())
-        continue;
-      insertComment(Description, TextCommentsArray, "ParagraphComments");
-    }
-  }
+  serializeDescription(I.Description, Description);
   Obj["Description"] = std::move(Description);
 }
 
diff --git a/clang-tools-extra/test/clang-doc/enum.cpp b/clang-tools-extra/test/clang-doc/enum.cpp
index e48c66e7240cf..14aa2237a5110 100644
--- a/clang-tools-extra/test/clang-doc/enum.cpp
+++ b/clang-tools-extra/test/clang-doc/enum.cpp
@@ -231,7 +231,7 @@ enum Size : uint8_t {
 // HTML-INDEX-NEXT:                 <td>Medium</td>
 // HTML-INDEX-NEXT:                 <td>1</td>
 // HTML-INDEX-NEXT:                 <td>
-// HTML-INDEX-NEXT:                   <p class="paragraph-container">A tennis ball.</p>
+// HTML-INDEX-NEXT:                   <p class="paragraph-container"> A tennis ball.</p>
 // HTML-INDEX-NEXT:                 </td>
 // HTML-INDEX-NEXT:             </tr>
 // HTML-INDEX-NEXT:             <tr>

>From 824131a89b53503a6797b9aef5f5d667d9e7b9d7 Mon Sep 17 00:00:00 2001
From: Samrudh Nelli <samrudhnelli at gmail.com>
Date: Tue, 10 Mar 2026 16:08:19 +0530
Subject: [PATCH 23/39] update enum-template.mustache

---
 clang-tools-extra/clang-doc/assets/enum-template.mustache | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/clang-tools-extra/clang-doc/assets/enum-template.mustache b/clang-tools-extra/clang-doc/assets/enum-template.mustache
index 00ec31d9c7807..113708aeac328 100644
--- a/clang-tools-extra/clang-doc/assets/enum-template.mustache
+++ b/clang-tools-extra/clang-doc/assets/enum-template.mustache
@@ -50,7 +50,8 @@
                             {{/Children}}
                             </p>
                         {{/ParagraphComment}}
-                    {{/Description}}{{^Description}} -- {{/Description}}</td>
+                    {{/Description}}
+                    {{^Description}} -- {{/Description}}</td>
                 {{/HasComments}}
             </tr>
             {{/Members}}

>From 4a6ce6750b676202e16257ec9e8cb36635684ea6 Mon Sep 17 00:00:00 2001
From: Samrudh Nelli <samrudhnelli at gmail.com>
Date: Tue, 10 Mar 2026 16:18:56 +0530
Subject: [PATCH 24/39] remove json test

---
 clang-tools-extra/test/clang-doc/enum.cpp | 2 --
 1 file changed, 2 deletions(-)

diff --git a/clang-tools-extra/test/clang-doc/enum.cpp b/clang-tools-extra/test/clang-doc/enum.cpp
index 14aa2237a5110..8e4f898aea95d 100644
--- a/clang-tools-extra/test/clang-doc/enum.cpp
+++ b/clang-tools-extra/test/clang-doc/enum.cpp
@@ -1,10 +1,8 @@
 // RUN: rm -rf %t && mkdir -p %t
 // RUN: clang-doc --format=html --doxygen --output=%t --executor=standalone %s
 // RUN: clang-doc --format=md --doxygen --output=%t --executor=standalone %s
-// RUN: clang-doc --format=json --doxygen --output=%t --executor=standalone %s
 // RUN: FileCheck %s < %t/html/GlobalNamespace/index.html --check-prefix=HTML-INDEX-LINE
 // RUN: FileCheck %s < %t/html/GlobalNamespace/index.html --check-prefix=HTML-INDEX
-// RUN: FileCheck %s < %t/json/GlobalNamespace/index.json --check-prefix=JSON-INDEX
 // RUN: FileCheck %s < %t/html/GlobalNamespace/_ZTV7Animals.html --check-prefix=HTML-ANIMAL-LINE
 // RUN: FileCheck %s < %t/html/GlobalNamespace/_ZTV7Animals.html --check-prefix=HTML-ANIMAL
 // RUN: FileCheck %s < %t/html/GlobalNamespace/_ZTV15FilePermissions.html --check-prefix=HTML-PERM-LINE

>From 45497b2bc80726d4243b4bb38af019533f189900 Mon Sep 17 00:00:00 2001
From: Samrudh Nelli <samrudhnelli at gmail.com>
Date: Tue, 10 Mar 2026 22:08:47 +0530
Subject: [PATCH 25/39] Implement suggestions

---
 clang-tools-extra/clang-doc/JSONGenerator.cpp | 26 +++++++++----------
 .../clang-doc/assets/enum-template.mustache   |  6 +++--
 clang-tools-extra/test/clang-doc/enum.cpp     | 10 +++----
 3 files changed, 19 insertions(+), 23 deletions(-)

diff --git a/clang-tools-extra/clang-doc/JSONGenerator.cpp b/clang-tools-extra/clang-doc/JSONGenerator.cpp
index 25d2644040873..39a78a43d5e47 100644
--- a/clang-tools-extra/clang-doc/JSONGenerator.cpp
+++ b/clang-tools-extra/clang-doc/JSONGenerator.cpp
@@ -399,11 +399,15 @@ void JSONGenerator::generateContext(const Info &I, Object &Obj) {
   Obj["HasContexts"] = true;
 }
 
-static void serializeDescription(llvm::ArrayRef<CommentInfo> Description, json::Object &Obj) {
+static void serializeDescription(llvm::ArrayRef<CommentInfo> Description, json::Object &Obj, StringRef Key = "") {
+  if(Description.empty())
+    return;
+
   // Skip straight to the FullComment's children
   auto &Comments = Description.front().Children;
+  Object DescriptionObj = Object();
   for (const auto &CommentInfo : Comments) {
-    json::Value Comment = serializeComment(*CommentInfo, Obj);
+    json::Value Comment = serializeComment(*CommentInfo, DescriptionObj);
     // if a ParagraphComment is returned, then it is a top-level comment that
     // needs to be inserted manually.
     if (auto *ParagraphComment = Comment.getAsObject();
@@ -412,9 +416,12 @@ static void serializeDescription(llvm::ArrayRef<CommentInfo> Description, json::
       if (TextCommentsArray.kind() == json::Value::Null ||
           TextCommentsArray.getAsArray()->empty())
         continue;
-      insertComment(Obj, TextCommentsArray, "ParagraphComments");
+      insertComment(DescriptionObj, TextCommentsArray, "ParagraphComments");
     }
   }
+  Obj["Description"] = std::move(DescriptionObj);
+  if (!Key.empty())
+    Obj[Key] = true;
 }
 
 void JSONGenerator::serializeCommonAttributes(const Info &I,
@@ -435,11 +442,7 @@ void JSONGenerator::serializeCommonAttributes(const Info &I,
       Obj["Namespace"].getAsArray()->push_back(NS.Name);
   }
 
-  if (!I.Description.empty()) {
-    Object Description = Object();
-    serializeDescription(I.Description, Description);
-    Obj["Description"] = std::move(Description);
-  }
+  serializeDescription(I.Description, Obj);
 
   // Namespaces aren't SymbolInfos, so they dont have a DefLoc
   if (I.IT != InfoType::IT_namespace) {
@@ -621,12 +624,7 @@ void JSONGenerator::serializeInfo(const EnumValueInfo &I, Object &Obj) {
   else
     Obj["Value"] = I.Value;
 
-  if (I.Description.empty())
-    return;
-
-  Object Description = Object();
-  serializeDescription(I.Description, Description);
-  Obj["Description"] = std::move(Description);
+  serializeDescription(I.Description, Obj, "HasMemberComment");
 }
 
 void JSONGenerator::serializeInfo(const EnumInfo &I, json::Object &Obj) {
diff --git a/clang-tools-extra/clang-doc/assets/enum-template.mustache b/clang-tools-extra/clang-doc/assets/enum-template.mustache
index 113708aeac328..0d5ac2fe1cb26 100644
--- a/clang-tools-extra/clang-doc/assets/enum-template.mustache
+++ b/clang-tools-extra/clang-doc/assets/enum-template.mustache
@@ -30,7 +30,8 @@
                 <td>{{ValueExpr}}</td>
                 {{/Value}}
                 {{#HasComments}}
-                <td>{{#Description}}
+                <td>{{#HasMemberComment}}
+                    {{#Description}}
                         {{#BriefComments}}
                             {{#.}}
                             <p class="paragraph-container">{{TextComment}}</p>
@@ -51,7 +52,8 @@
                             </p>
                         {{/ParagraphComment}}
                     {{/Description}}
-                    {{^Description}} -- {{/Description}}</td>
+                    {{/HasMemberComment}}
+                    {{^HasMemberComment}} -- {{/HasMemberComment}}</td>
                 {{/HasComments}}
             </tr>
             {{/Members}}
diff --git a/clang-tools-extra/test/clang-doc/enum.cpp b/clang-tools-extra/test/clang-doc/enum.cpp
index 8e4f898aea95d..219617af23f0d 100644
--- a/clang-tools-extra/test/clang-doc/enum.cpp
+++ b/clang-tools-extra/test/clang-doc/enum.cpp
@@ -468,7 +468,7 @@ enum Car {
 
   Sedan,    ///< Comment 1
   SUV,      ///< Comment 2
-  Pickup,   ///< Comment 3
+  Pickup,
   Hatchback ///< Comment 4
 };
 } // namespace Vehicles
@@ -515,11 +515,7 @@ enum Car {
 // HTML-VEHICLES-NEXT:              <tr>
 // HTML-VEHICLES-NEXT:                  <td>Pickup</td>
 // HTML-VEHICLES-NEXT:                  <td>2</td>
-// HTML-VEHICLES-NEXT:                  <td>
-// HTML-VEHICLES-NEXT:                    <p class="paragraph-container">
-// HTML-VEHICLES-NEXT:                        Comment 3<br>
-// HTML-VEHICLES-NEXT:                    </p>
-// HTML-VEHICLES-NEXT:                  </td>
+// HTML-VEHICLES-NEXT:                  <td> -- </td>
 // HTML-VEHICLES-NEXT:              </tr>
 // HTML-VEHICLES-NEXT:              <tr>
 // HTML-VEHICLES-NEXT:                  <td>Hatchback</td>
@@ -537,7 +533,7 @@ enum Car {
 // HTML-VEHICLES-NEXT:           <p> specify type of car</p>
 // HTML-VEHICLES-NEXT:        </div>
 // HTML-VEHICLES-NEXT:      </div>
-// HTML-VEHICLES-NEXT:      <p>Defined at line [[@LINE-75]] of file {{.*}}clang-tools-extra{{[\/]}}test{{[\/]}}clang-doc{{[\/]}}enum.cpp</p>
+// HTML-VEHICLES-NEXT:      <p>Defined at line [[@LINE-71]] of file {{.*}}clang-tools-extra{{[\/]}}test{{[\/]}}clang-doc{{[\/]}}enum.cpp</p>
 // HTML-VEHICLES-NEXT:    </div>
 
 // MD-MUSTACHE-VEHICLES: # namespace Vehicles

>From f8783bc1d8abfd6b1e8c0e83509949ed64ee4c55 Mon Sep 17 00:00:00 2001
From: Samrudh Nelli <samrudhnelli at gmail.com>
Date: Tue, 10 Mar 2026 23:01:23 +0530
Subject: [PATCH 26/39] rename HasMemberComment to HasEnumMemberComments

---
 clang-tools-extra/clang-doc/JSONGenerator.cpp             | 2 +-
 clang-tools-extra/clang-doc/assets/enum-template.mustache | 6 +++---
 2 files changed, 4 insertions(+), 4 deletions(-)

diff --git a/clang-tools-extra/clang-doc/JSONGenerator.cpp b/clang-tools-extra/clang-doc/JSONGenerator.cpp
index 39a78a43d5e47..b1546b55fb578 100644
--- a/clang-tools-extra/clang-doc/JSONGenerator.cpp
+++ b/clang-tools-extra/clang-doc/JSONGenerator.cpp
@@ -624,7 +624,7 @@ void JSONGenerator::serializeInfo(const EnumValueInfo &I, Object &Obj) {
   else
     Obj["Value"] = I.Value;
 
-  serializeDescription(I.Description, Obj, "HasMemberComment");
+  serializeDescription(I.Description, Obj, "HasEnumMemberComments");
 }
 
 void JSONGenerator::serializeInfo(const EnumInfo &I, json::Object &Obj) {
diff --git a/clang-tools-extra/clang-doc/assets/enum-template.mustache b/clang-tools-extra/clang-doc/assets/enum-template.mustache
index 0d5ac2fe1cb26..7c3751bb896c3 100644
--- a/clang-tools-extra/clang-doc/assets/enum-template.mustache
+++ b/clang-tools-extra/clang-doc/assets/enum-template.mustache
@@ -30,7 +30,7 @@
                 <td>{{ValueExpr}}</td>
                 {{/Value}}
                 {{#HasComments}}
-                <td>{{#HasMemberComment}}
+                <td>{{#HasEnumMemberComments}}
                     {{#Description}}
                         {{#BriefComments}}
                             {{#.}}
@@ -52,8 +52,8 @@
                             </p>
                         {{/ParagraphComment}}
                     {{/Description}}
-                    {{/HasMemberComment}}
-                    {{^HasMemberComment}} -- {{/HasMemberComment}}</td>
+                    {{/HasEnumMemberComments}}
+                    {{^HasEnumMemberComments}} -- {{/HasEnumMemberComments}}</td>
                 {{/HasComments}}
             </tr>
             {{/Members}}

>From 64ab71de95a6c2fd4133a57606406b6de1c33c24 Mon Sep 17 00:00:00 2001
From: Samrudh Nelli <samrudhnelli at gmail.com>
Date: Tue, 10 Mar 2026 23:05:16 +0530
Subject: [PATCH 27/39] remove unused {{#ParagraphComment}} block

---
 clang-tools-extra/clang-doc/assets/enum-template.mustache | 7 -------
 1 file changed, 7 deletions(-)

diff --git a/clang-tools-extra/clang-doc/assets/enum-template.mustache b/clang-tools-extra/clang-doc/assets/enum-template.mustache
index 7c3751bb896c3..60429dc6df9d3 100644
--- a/clang-tools-extra/clang-doc/assets/enum-template.mustache
+++ b/clang-tools-extra/clang-doc/assets/enum-template.mustache
@@ -44,13 +44,6 @@
                             {{/.}}
                         </p>
                         {{/ParagraphComments}}
-                        {{#ParagraphComment}}
-                            <p>
-                            {{#Children}}
-                            {{TextComment}}
-                            {{/Children}}
-                            </p>
-                        {{/ParagraphComment}}
                     {{/Description}}
                     {{/HasEnumMemberComments}}
                     {{^HasEnumMemberComments}} -- {{/HasEnumMemberComments}}</td>

>From 61dc10868365909d06d12ec9e70bca0cdf86759a Mon Sep 17 00:00:00 2001
From: Samrudh Nelli <samrudhnelli at gmail.com>
Date: Tue, 10 Mar 2026 23:38:18 +0530
Subject: [PATCH 28/39] clang-format the code

---
 clang-tools-extra/clang-doc/JSONGenerator.cpp | 5 +++--
 1 file changed, 3 insertions(+), 2 deletions(-)

diff --git a/clang-tools-extra/clang-doc/JSONGenerator.cpp b/clang-tools-extra/clang-doc/JSONGenerator.cpp
index b1546b55fb578..2c565751920e7 100644
--- a/clang-tools-extra/clang-doc/JSONGenerator.cpp
+++ b/clang-tools-extra/clang-doc/JSONGenerator.cpp
@@ -399,8 +399,9 @@ void JSONGenerator::generateContext(const Info &I, Object &Obj) {
   Obj["HasContexts"] = true;
 }
 
-static void serializeDescription(llvm::ArrayRef<CommentInfo> Description, json::Object &Obj, StringRef Key = "") {
-  if(Description.empty())
+static void serializeDescription(llvm::ArrayRef<CommentInfo> Description,
+                                 json::Object &Obj, StringRef Key = "") {
+  if (Description.empty())
     return;
 
   // Skip straight to the FullComment's children

>From f10abc5a939522bfce484242e431215cfed3e100 Mon Sep 17 00:00:00 2001
From: Samrudh Nelli <samrudhnelli at gmail.com>
Date: Wed, 11 Mar 2026 00:02:53 +0530
Subject: [PATCH 29/39] update -LINE tests

---
 clang-tools-extra/test/clang-doc/enum.cpp | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)

diff --git a/clang-tools-extra/test/clang-doc/enum.cpp b/clang-tools-extra/test/clang-doc/enum.cpp
index 219617af23f0d..22b05a240f6aa 100644
--- a/clang-tools-extra/test/clang-doc/enum.cpp
+++ b/clang-tools-extra/test/clang-doc/enum.cpp
@@ -92,7 +92,7 @@ enum Color {
 // HTML-INDEX-NEXT:           <p> For specifying RGB colors</p>
 // HTML-INDEX-NEXT:       </div>
 // HTML-INDEX-NEXT:     </div>
-// HTML-INDEX-NEXT:     <p>Defined at line [[@LINE-61]] of file {{.*}}clang-tools-extra{{[\/]}}test{{[\/]}}clang-doc{{[\/]}}enum.cpp</p>
+// HTML-INDEX-NEXT:     <p>Defined at line [[@LINE-62]] of file {{.*}}clang-tools-extra{{[\/]}}test{{[\/]}}clang-doc{{[\/]}}enum.cpp</p>
 // HTML-INDEX-NEXT:   </div>
 
 // MD-MUSTACHE-INDEX: ## Enums
@@ -170,7 +170,7 @@ enum class Shapes {
 // HTML-INDEX-NEXT:           <p> Shape Types</p>
 // HTML-INDEX-NEXT:       </div>
 // HTML-INDEX-NEXT:     </div>
-// HTML-INDEX-NEXT:     <p>Defined at line [[@LINE-63]] of file {{.*}}clang-tools-extra{{[\/]}}test{{[\/]}}clang-doc{{[\/]}}enum.cpp</p>
+// HTML-INDEX-NEXT:     <p>Defined at line [[@LINE-64]] of file {{.*}}clang-tools-extra{{[\/]}}test{{[\/]}}clang-doc{{[\/]}}enum.cpp</p>
 // HTML-INDEX-NEXT:   </div>
 
 typedef unsigned char uint8_t;
@@ -435,7 +435,7 @@ class Animals {
 // HTML-ANIMAL-NEXT:                 <p> specify what animal the class is</p>
 // HTML-ANIMAL-NEXT:             </div>
 // HTML-ANIMAL-NEXT:         </div>
-// HTML-ANIMAL-NEXT:         <p>Defined at line [[@LINE-56]] of file {{.*}}enum.cpp</p>
+// HTML-ANIMAL-NEXT:         <p>Defined at line [[@LINE-57]] of file {{.*}}enum.cpp</p>
 // HTML-ANIMAL-NEXT:      </div>
 // HTML-ANIMAL-NEXT:    </section>
 
@@ -533,7 +533,7 @@ enum Car {
 // HTML-VEHICLES-NEXT:           <p> specify type of car</p>
 // HTML-VEHICLES-NEXT:        </div>
 // HTML-VEHICLES-NEXT:      </div>
-// HTML-VEHICLES-NEXT:      <p>Defined at line [[@LINE-71]] of file {{.*}}clang-tools-extra{{[\/]}}test{{[\/]}}clang-doc{{[\/]}}enum.cpp</p>
+// HTML-VEHICLES-NEXT:      <p>Defined at line [[@LINE-72]] of file {{.*}}clang-tools-extra{{[\/]}}test{{[\/]}}clang-doc{{[\/]}}enum.cpp</p>
 // HTML-VEHICLES-NEXT:    </div>
 
 // MD-MUSTACHE-VEHICLES: # namespace Vehicles

>From f710a411388e049e17dac5fd05392015052a6511 Mon Sep 17 00:00:00 2001
From: Samrudh Nelli <samrudhnelli at gmail.com>
Date: Wed, 11 Mar 2026 00:40:12 +0530
Subject: [PATCH 30/39] fix CI error

---
 clang-tools-extra/clang-doc/JSONGenerator.cpp | 23 -------------------
 1 file changed, 23 deletions(-)

diff --git a/clang-tools-extra/clang-doc/JSONGenerator.cpp b/clang-tools-extra/clang-doc/JSONGenerator.cpp
index 2c565751920e7..3d5a5cb576019 100644
--- a/clang-tools-extra/clang-doc/JSONGenerator.cpp
+++ b/clang-tools-extra/clang-doc/JSONGenerator.cpp
@@ -79,29 +79,6 @@ class JSONGenerator : public Generator {
 
 const char *JSONGenerator::Format = "json";
 
-static void serializeInfo(const ConstraintInfo &I, Object &Obj);
-static void serializeInfo(const RecordInfo &I, Object &Obj,
-                          const std::optional<StringRef> &RepositoryUrl,
-                          const std::optional<StringRef> &RepositoryLinePrefix);
-
-static void serializeReference(const Reference &Ref, Object &ReferenceObj);
-
-template <typename Container, typename SerializationFunc>
-static void serializeArray(
-    const Container &Records, Object &Obj, const StringRef Key,
-    SerializationFunc SerializeInfo, const StringRef EndKey = "End",
-    function_ref<void(Object &)> UpdateJson = [](Object &Obj) {});
-
-// Convenience lambda to pass to serializeArray.
-// If a serializeInfo needs a RepositoryUrl, create a local lambda that captures
-// the optional.
-static auto SerializeInfoLambda = [](const auto &Info, Object &Object) {
-  serializeInfo(Info, Object);
-};
-static auto SerializeReferenceLambda = [](const auto &Ref, Object &Object) {
-  serializeReference(Ref, Object);
-};
-
 static void insertNonEmpty(StringRef Key, StringRef Value, Object &Obj) {
   if (!Value.empty())
     Obj[Key] = Value;

>From bc533b8011513e40f5cba3b7fd49d2996d3a8181 Mon Sep 17 00:00:00 2001
From: Samrudh Nelli <samrudhnelli at gmail.com>
Date: Wed, 11 Mar 2026 00:56:42 +0530
Subject: [PATCH 31/39] revert .trim() changes

---
 clang-tools-extra/clang-doc/MDGenerator.cpp | 4 ++--
 clang-tools-extra/clang-doc/Serialize.cpp   | 6 +++---
 2 files changed, 5 insertions(+), 5 deletions(-)

diff --git a/clang-tools-extra/clang-doc/MDGenerator.cpp b/clang-tools-extra/clang-doc/MDGenerator.cpp
index dee3c21f72a38..60a880d211884 100644
--- a/clang-tools-extra/clang-doc/MDGenerator.cpp
+++ b/clang-tools-extra/clang-doc/MDGenerator.cpp
@@ -88,7 +88,7 @@ static void writeDescription(const CommentInfo &I, raw_ostream &OS) {
     break;
 
   case CommentKind::CK_BlockCommandComment:
-    OS << genEmphasis(I.Name);
+    OS << genEmphasis(I.Name) << " ";
     for (const auto &Child : I.Children)
       writeDescription(*Child, OS);
     break;
@@ -100,7 +100,7 @@ static void writeDescription(const CommentInfo &I, raw_ostream &OS) {
   case CommentKind::CK_ParamCommandComment:
   case CommentKind::CK_TParamCommandComment: {
     std::string Direction = I.Explicit ? (" " + I.Direction).str() : "";
-    OS << genEmphasis(I.ParamName) << I.Text << Direction;
+    OS << genEmphasis(I.ParamName) << I.Text << Direction << " ";
     for (const auto &Child : I.Children)
       writeDescription(*Child, OS);
     break;
diff --git a/clang-tools-extra/clang-doc/Serialize.cpp b/clang-tools-extra/clang-doc/Serialize.cpp
index 7b09c1ea29b50..7287ef301c0a6 100644
--- a/clang-tools-extra/clang-doc/Serialize.cpp
+++ b/clang-tools-extra/clang-doc/Serialize.cpp
@@ -239,14 +239,14 @@ void ClangDocCommentVisitor::parseComment(const comments::Comment *C) {
 
 void ClangDocCommentVisitor::visitTextComment(const TextComment *C) {
   if (!isWhitespaceOnly(C->getText()))
-    CurrentCI.Text = C->getText();
+    CurrentCI.Text = C->getText().trim();
 }
 
 void ClangDocCommentVisitor::visitInlineCommandComment(
     const InlineCommandComment *C) {
   CurrentCI.Name = getCommandName(C->getCommandID());
   for (unsigned I = 0, E = C->getNumArgs(); I != E; ++I)
-    CurrentCI.Args.push_back(C->getArgText(I));
+    CurrentCI.Args.push_back(C->getArgText(I)).trim();
 }
 
 void ClangDocCommentVisitor::visitHTMLStartTagComment(
@@ -270,7 +270,7 @@ void ClangDocCommentVisitor::visitBlockCommandComment(
     const BlockCommandComment *C) {
   CurrentCI.Name = getCommandName(C->getCommandID());
   for (unsigned I = 0, E = C->getNumArgs(); I < E; ++I)
-    CurrentCI.Args.push_back(C->getArgText(I));
+    CurrentCI.Args.push_back(C->getArgText(I)).trim()
 }
 
 void ClangDocCommentVisitor::visitParamCommandComment(

>From 5e54038dd584ae5e8c2ee8d1b4727c9dfb83ddd5 Mon Sep 17 00:00:00 2001
From: Samrudh Nelli <samrudhnelli at gmail.com>
Date: Wed, 11 Mar 2026 00:58:35 +0530
Subject: [PATCH 32/39] fix .trim()

---
 clang-tools-extra/clang-doc/Serialize.cpp | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/clang-tools-extra/clang-doc/Serialize.cpp b/clang-tools-extra/clang-doc/Serialize.cpp
index 7287ef301c0a6..14c8fcca25abd 100644
--- a/clang-tools-extra/clang-doc/Serialize.cpp
+++ b/clang-tools-extra/clang-doc/Serialize.cpp
@@ -246,7 +246,7 @@ void ClangDocCommentVisitor::visitInlineCommandComment(
     const InlineCommandComment *C) {
   CurrentCI.Name = getCommandName(C->getCommandID());
   for (unsigned I = 0, E = C->getNumArgs(); I != E; ++I)
-    CurrentCI.Args.push_back(C->getArgText(I)).trim();
+    CurrentCI.Args.push_back(C->getArgText(I).trim());
 }
 
 void ClangDocCommentVisitor::visitHTMLStartTagComment(
@@ -270,7 +270,7 @@ void ClangDocCommentVisitor::visitBlockCommandComment(
     const BlockCommandComment *C) {
   CurrentCI.Name = getCommandName(C->getCommandID());
   for (unsigned I = 0, E = C->getNumArgs(); I < E; ++I)
-    CurrentCI.Args.push_back(C->getArgText(I)).trim()
+    CurrentCI.Args.push_back(C->getArgText(I).trim());
 }
 
 void ClangDocCommentVisitor::visitParamCommandComment(

>From 191977dc8930826883de1fbec8f56c387f2cc2fa Mon Sep 17 00:00:00 2001
From: Samrudh Nelli <samrudhnelli at gmail.com>
Date: Tue, 10 Mar 2026 21:04:52 +0530
Subject: [PATCH 33/39] [Clang-doc] Trim comments after parsing them from the
 AST (#185528)

Currently many comments parsed from the AST contain leading spaces.
Trim the leading and trailing spaces before using them in clang-doc.
---
 .../clang-doc/basic-project.mustache.test     | 66 +++++++++----------
 .../test/clang-doc/basic-project.test         |  2 +-
 .../test/clang-doc/comments-in-macros.cpp     |  2 +-
 clang-tools-extra/test/clang-doc/enum.cpp     | 14 ++--
 .../test/clang-doc/json/class.cpp             | 10 +--
 .../clang-doc/json/compound-constraints.cpp   |  8 +--
 .../test/clang-doc/json/concept.cpp           |  2 +-
 .../test/clang-doc/namespace.cpp              |  6 +-
 .../test/clang-doc/templates.cpp              | 10 +--
 .../test/clang-doc/typedef-alias.cpp          |  6 +-
 .../unittests/clang-doc/MDGeneratorTest.cpp   |  4 +-
 11 files changed, 65 insertions(+), 65 deletions(-)

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 c94008f7bdf36..0b190caeed8f5 100644
--- a/clang-tools-extra/test/clang-doc/basic-project.mustache.test
+++ b/clang-tools-extra/test/clang-doc/basic-project.mustache.test
@@ -63,10 +63,10 @@ HTML-SHAPE-NEXT:                     <h1 class="hero__title-large">class Shape</
 HTML-SHAPE-NEXT:                     <p>Defined at line {{[0-9]+}} of file {{.*}}include{{[\/]}}Shape.h</p>
 HTML-SHAPE-NEXT:                     <div class="doc-card">
 HTML-SHAPE-NEXT:                         <div class="nested-delimiter-container">
-HTML-SHAPE-NEXT:                             <p> Abstract base class for shapes.</p>
+HTML-SHAPE-NEXT:                             <p>Abstract base class for shapes.</p>
 HTML-SHAPE-NEXT:                         </div>
 HTML-SHAPE-NEXT:                         <div class="nested-delimiter-container">
-HTML-SHAPE-NEXT:                             <p> Provides a common interface for different types of shapes.</p>
+HTML-SHAPE-NEXT:                             <p>Provides a common interface for different types of shapes.</p>
 HTML-SHAPE-NEXT:                         </div>
 HTML-SHAPE-NEXT:                     </div>
 HTML-SHAPE-NEXT:                 </div>
@@ -77,11 +77,11 @@ HTML-SHAPE-LABEL:                       <div id="{{([0-9A-F]{40})}}" class="deli
 HTML-SHAPE-NEXT:                             <pre><code class="language-cpp code-clang-doc">double area ()</code></pre>
 HTML-SHAPE-NEXT:                             <div class="doc-card">
 HTML-SHAPE-NEXT:                                 <div class="nested-delimiter-container">
-HTML-SHAPE-NEXT:                                     <p> Calculates the area of the shape.</p>
+HTML-SHAPE-NEXT:                                     <p>Calculates the area of the shape.</p>
 HTML-SHAPE-NEXT:                                 </div>
 HTML-SHAPE-NEXT:                                 <div class="nested-delimiter-container">
 HTML-SHAPE-NEXT:                                     <h3>Returns</h3>
-HTML-SHAPE-NEXT:                                     <p> double The area of the shape.</p>
+HTML-SHAPE-NEXT:                                     <p>double The area of the shape.</p>
 HTML-SHAPE-NEXT:                                 </div>
 HTML-SHAPE-NEXT:                             </div>
 HTML-SHAPE-NEXT:                         </div>
@@ -89,11 +89,11 @@ HTML-SHAPE-LABEL:                        <div id="{{([0-9A-F]{40})}}" class="del
 HTML-SHAPE-NEXT:                             <pre><code class="language-cpp code-clang-doc">double perimeter ()</code></pre>
 HTML-SHAPE-NEXT:                             <div class="doc-card">
 HTML-SHAPE-NEXT:                                 <div class="nested-delimiter-container">
-HTML-SHAPE-NEXT:                                     <p> Calculates the perimeter of the shape.</p>
+HTML-SHAPE-NEXT:                                     <p>Calculates the perimeter of the shape.</p>
 HTML-SHAPE-NEXT:                                 </div>
 HTML-SHAPE-NEXT:                                 <div class="nested-delimiter-container">
 HTML-SHAPE-NEXT:                                     <h3>Returns</h3>
-HTML-SHAPE-NEXT:                                     <p> double The perimeter of the shape.</p>
+HTML-SHAPE-NEXT:                                     <p>double The perimeter of the shape.</p>
 HTML-SHAPE-NEXT:                                 </div>
 HTML-SHAPE-NEXT:                             </div>
 HTML-SHAPE-NEXT:                         </div>
@@ -101,7 +101,7 @@ HTML-SHAPE-LABEL:                        <div id="{{([0-9A-F]{40})}}" class="del
 HTML-SHAPE-NEXT:                             <pre><code class="language-cpp code-clang-doc">void ~Shape ()</code></pre>
 HTML-SHAPE-NEXT:                             <div class="doc-card">
 HTML-SHAPE-NEXT:                                 <div class="nested-delimiter-container">
-HTML-SHAPE-NEXT:                                     <p> Virtual destructor.</p>
+HTML-SHAPE-NEXT:                                     <p>Virtual destructor.</p>
 HTML-SHAPE-NEXT:                                 </div>
 HTML-SHAPE-NEXT:                             </div>
 HTML-SHAPE-NEXT:                         <p>Defined at line {{[0-9]+}} of file {{.*}}include{{[/\\]}}Shape.h</p>
@@ -183,10 +183,10 @@ HTML-CALC-NEXT:                     <h1 class="hero__title-large">class Calculat
 HTML-CALC-NEXT:                     <p>Defined at line {{[0-9]+}} of file {{.*}}include{{[/\\]}}Calculator.h</p>
 HTML-CALC-NEXT:                     <div class="doc-card">
 HTML-CALC-NEXT:                         <div class="nested-delimiter-container">
-HTML-CALC-NEXT:                             <p> A simple calculator class.</p>
+HTML-CALC-NEXT:                             <p>A simple calculator class.</p>
 HTML-CALC-NEXT:                         </div>
 HTML-CALC-NEXT:                         <div class="nested-delimiter-container">
-HTML-CALC-NEXT:                             <p> Provides basic arithmetic operations.</p>
+HTML-CALC-NEXT:                             <p>Provides basic arithmetic operations.</p>
 HTML-CALC-NEXT:                         </div>
 HTML-CALC-NEXT:                     </div>
 HTML-CALC-NEXT:                 </div>
@@ -208,7 +208,7 @@ HTML-CALC-LABEL:                <div id="{{([0-9A-F]{40})}}" class="delimiter-co
 HTML-CALC-NEXT:                     <pre><code class="language-cpp code-clang-doc">int add (int a, int b)</code></pre>
 HTML-CALC-NEXT:                     <div class="doc-card">
 HTML-CALC-NEXT:                         <div class="nested-delimiter-container">
-HTML-CALC-NEXT:                             <p> Adds two integers.</p>
+HTML-CALC-NEXT:                             <p>Adds two integers.</p>
 HTML-CALC-NEXT:                         </div>
 HTML-CALC-NEXT:                         <div class="nested-delimiter-container">
 HTML-CALC-NEXT:                             <h3>Parameters</h3>
@@ -221,14 +221,14 @@ HTML-CALC-NEXT:                             </div>
 HTML-CALC-NEXT:                         </div>
 HTML-CALC-NEXT:                         <div class="nested-delimiter-container">
 HTML-CALC-NEXT:                             <h3>Returns</h3>
-HTML-CALC-NEXT:                             <p> int The sum of a and b.</p>
+HTML-CALC-NEXT:                             <p>int The sum of a and b.</p>
 HTML-CALC-NEXT:                         </div>
 HTML-CALC-NEXT:                     </div>
 HTML-CALC-LABEL:                <div id="{{([0-9A-F]{40})}}" class="delimiter-container">
 HTML-CALC-NEXT:                     <pre><code class="language-cpp code-clang-doc">int subtract (int a, int b)</code></pre>
 HTML-CALC-NEXT:                     <div class="doc-card">
 HTML-CALC-NEXT:                         <div class="nested-delimiter-container">
-HTML-CALC-NEXT:                             <p> Subtracts the second integer from the first.</p>
+HTML-CALC-NEXT:                             <p>Subtracts the second integer from the first.</p>
 HTML-CALC-NEXT:                         </div>
 HTML-CALC-NEXT:                         <div class="nested-delimiter-container">
 HTML-CALC-NEXT:                             <h3>Parameters</h3>
@@ -241,14 +241,14 @@ HTML-CALC-NEXT:                             </div>
 HTML-CALC-NEXT:                         </div>
 HTML-CALC-NEXT:                         <div class="nested-delimiter-container">
 HTML-CALC-NEXT:                             <h3>Returns</h3>
-HTML-CALC-NEXT:                             <p> int The result of a - b.</p>
+HTML-CALC-NEXT:                             <p>int The result of a - b.</p>
 HTML-CALC-NEXT:                         </div>
 HTML-CALC-NEXT:                     </div>
 HTML-CALC-LABEL:                <div id="{{([0-9A-F]{40})}}" class="delimiter-container">
 HTML-CALC-NEXT:                     <pre><code class="language-cpp code-clang-doc">int multiply (int a, int b)</code></pre>
 HTML-CALC-NEXT:                     <div class="doc-card">
 HTML-CALC-NEXT:                         <div class="nested-delimiter-container">
-HTML-CALC-NEXT:                             <p> Multiplies two integers.</p>
+HTML-CALC-NEXT:                             <p>Multiplies two integers.</p>
 HTML-CALC-NEXT:                         </div>
 HTML-CALC-NEXT:                         <div class="nested-delimiter-container">
 HTML-CALC-NEXT:                             <h3>Parameters</h3>
@@ -261,14 +261,14 @@ HTML-CALC-NEXT:                             </div>
 HTML-CALC-NEXT:                         </div>
 HTML-CALC-NEXT:                         <div class="nested-delimiter-container">
 HTML-CALC-NEXT:                             <h3>Returns</h3>
-HTML-CALC-NEXT:                             <p> int The product of a and b.</p>
+HTML-CALC-NEXT:                             <p>int The product of a and b.</p>
 HTML-CALC-NEXT:                         </div>
 HTML-CALC-NEXT:                     </div>
 HTML-CALC-LABEL:                <div id="{{([0-9A-F]{40})}}" class="delimiter-container">
 HTML-CALC-NEXT:                     <pre><code class="language-cpp code-clang-doc">double divide (int a, int b)</code></pre>
 HTML-CALC-NEXT:                     <div class="doc-card">
 HTML-CALC-NEXT:                         <div class="nested-delimiter-container">
-HTML-CALC-NEXT:                             <p> Divides the first integer by the second.</p>
+HTML-CALC-NEXT:                             <p>Divides the first integer by the second.</p>
 HTML-CALC-NEXT:                         </div>
 HTML-CALC-NEXT:                         <div class="nested-delimiter-container">
 HTML-CALC-NEXT:                             <h3>Parameters</h3>
@@ -281,7 +281,7 @@ HTML-CALC-NEXT:                             </div>
 HTML-CALC-NEXT:                         </div>
 HTML-CALC-NEXT:                         <div class="nested-delimiter-container">
 HTML-CALC-NEXT:                             <h3>Returns</h3>
-HTML-CALC-NEXT:                             <p> double The result of a / b.</p>
+HTML-CALC-NEXT:                             <p>double The result of a / b.</p>
 HTML-CALC-NEXT:                         </div>
 HTML-CALC-NEXT:                         <div class="nested-delimiter-container">
 HTML-CALC-NEXT:                             <h3>Throws</h3>
@@ -294,7 +294,7 @@ HTML-CALC-LABEL:                <div id="{{([0-9A-F]{40})}}" class="delimiter-co
 HTML-CALC-NEXT:                     <pre><code class="language-cpp code-clang-doc">int mod (int a, int b)</code></pre>
 HTML-CALC-NEXT:                     <div class="doc-card">
 HTML-CALC-NEXT:                         <div class="nested-delimiter-container">
-HTML-CALC-NEXT:                             <p> Performs the mod operation on integers.</p>
+HTML-CALC-NEXT:                             <p>Performs the mod operation on integers.</p>
 HTML-CALC-NEXT:                         </div>
 HTML-CALC-NEXT:                         <div class="nested-delimiter-container">
 HTML-CALC-NEXT:                             <h3>Parameters</h3>
@@ -307,7 +307,7 @@ HTML-CALC-NEXT:                             </div>
 HTML-CALC-NEXT:                         </div>
 HTML-CALC-NEXT:                         <div class="nested-delimiter-container">
 HTML-CALC-NEXT:                             <h3>Returns</h3>
-HTML-CALC-NEXT:                             <p> The result of a % b.</p>
+HTML-CALC-NEXT:                             <p>The result of a % b.</p>
 HTML-CALC-NEXT:                         </div>
 HTML-CALC-NEXT:                     </div>
 HTML-CALC-NEXT:                 <p>Defined at line {{[0-9]+}} of file {{.*}}include{{[/\\]}}Calculator.h</p>
@@ -368,10 +368,10 @@ HTML-RECTANGLE-NEXT:                     <h1 class="hero__title-large">class Rec
 HTML-RECTANGLE-NEXT:                     <p>Defined at line {{[0-9]+}} of file {{.*}}include{{[/\\]}}Rectangle.h</p>
 HTML-RECTANGLE-NEXT:                     <div class="doc-card">
 HTML-RECTANGLE-NEXT:                         <div class="nested-delimiter-container">
-HTML-RECTANGLE-NEXT:                             <p> Rectangle class derived from Shape.</p>
+HTML-RECTANGLE-NEXT:                             <p>Rectangle class derived from Shape.</p>
 HTML-RECTANGLE-NEXT:                         </div>
 HTML-RECTANGLE-NEXT:                         <div class="nested-delimiter-container">
-HTML-RECTANGLE-NEXT:                             <p> Represents a rectangle with a given width and height.</p>
+HTML-RECTANGLE-NEXT:                             <p>Represents a rectangle with a given width and height.</p>
 HTML-RECTANGLE-NEXT:                         </div>
 HTML-RECTANGLE-NEXT:                     </div>
 HTML-RECTANGLE-NEXT:                 </div>
@@ -382,7 +382,7 @@ HTML-RECTANGLE-LABEL:                <div id="{{([0-9A-F]{40})}}" class="delimit
 HTML-RECTANGLE-NEXT:                     <pre><code class="language-cpp code-clang-doc">void Rectangle (double width, double height)</code></pre>
 HTML-RECTANGLE-NEXT:                     <div class="doc-card">
 HTML-RECTANGLE-NEXT:                         <div class="nested-delimiter-container">
-HTML-RECTANGLE-NEXT:                             <p> Constructs a new Rectangle object.</p>
+HTML-RECTANGLE-NEXT:                             <p>Constructs a new Rectangle object.</p>
 HTML-RECTANGLE-NEXT:                         </div>
 HTML-RECTANGLE-NEXT:                         <div class="nested-delimiter-container">
 HTML-RECTANGLE-NEXT:                             <h3>Parameters</h3>
@@ -398,22 +398,22 @@ HTML-RECTANGLE-LABEL:                <div id="{{([0-9A-F]{40})}}" class="delimit
 HTML-RECTANGLE-NEXT:                     <pre><code class="language-cpp code-clang-doc">double area ()</code></pre>
 HTML-RECTANGLE-NEXT:                     <div class="doc-card">
 HTML-RECTANGLE-NEXT:                         <div class="nested-delimiter-container">
-HTML-RECTANGLE-NEXT:                             <p> Calculates the area of the rectangle.</p>
+HTML-RECTANGLE-NEXT:                             <p>Calculates the area of the rectangle.</p>
 HTML-RECTANGLE-NEXT:                         </div>
 HTML-RECTANGLE-NEXT:                         <div class="nested-delimiter-container">
 HTML-RECTANGLE-NEXT:                             <h3>Returns</h3>
-HTML-RECTANGLE-NEXT:                             <p> double The area of the rectangle.</p>
+HTML-RECTANGLE-NEXT:                             <p>double The area of the rectangle.</p>
 HTML-RECTANGLE-NEXT:                         </div>
 HTML-RECTANGLE-NEXT:                     </div>
 HTML-RECTANGLE-LABEL:                <div id="{{([0-9A-F]{40})}}" class="delimiter-container">
 HTML-RECTANGLE-NEXT:                     <pre><code class="language-cpp code-clang-doc">double perimeter ()</code></pre>
 HTML-RECTANGLE-NEXT:                     <div class="doc-card">
 HTML-RECTANGLE-NEXT:                         <div class="nested-delimiter-container">
-HTML-RECTANGLE-NEXT:                             <p> Calculates the perimeter of the rectangle.</p>
+HTML-RECTANGLE-NEXT:                             <p>Calculates the perimeter of the rectangle.</p>
 HTML-RECTANGLE-NEXT:                         </div>
 HTML-RECTANGLE-NEXT:                         <div class="nested-delimiter-container">
 HTML-RECTANGLE-NEXT:                             <h3>Returns</h3>
-HTML-RECTANGLE-NEXT:                             <p> double The perimeter of the rectangle.</p>
+HTML-RECTANGLE-NEXT:                             <p>double The perimeter of the rectangle.</p>
 HTML-RECTANGLE-NEXT:                         </div>
 HTML-RECTANGLE-NEXT:                     </div>
 HTML-RECTANGLE-NEXT:                 <p>Defined at line {{[0-9]+}} of file {{.*}}src{{[/\\]}}Rectangle.cpp</p>
@@ -474,10 +474,10 @@ HTML-CIRCLE-NEXT:                     <h1 class="hero__title-large">class Circle
 HTML-CIRCLE-NEXT:                     <p>Defined at line {{[0-9]+}} of file {{.*}}include{{[/\\]}}Circle.h</p>
 HTML-CIRCLE-NEXT:                     <div class="doc-card">
 HTML-CIRCLE-NEXT:                         <div class="nested-delimiter-container">
-HTML-CIRCLE-NEXT:                             <p> Circle class derived from Shape.</p>
+HTML-CIRCLE-NEXT:                             <p>Circle class derived from Shape.</p>
 HTML-CIRCLE-NEXT:                         </div>
 HTML-CIRCLE-NEXT:                         <div class="nested-delimiter-container">
-HTML-CIRCLE-NEXT:                             <p> Represents a circle with a given radius.</p>
+HTML-CIRCLE-NEXT:                             <p>Represents a circle with a given radius.</p>
 HTML-CIRCLE-NEXT:                         </div>
 HTML-CIRCLE-NEXT:                     </div>
 HTML-CIRCLE-NEXT:                 </div>
@@ -488,7 +488,7 @@ HTML-CIRCLE-LABEL:                <div id="{{([0-9A-F]{40})}}" class="delimiter-
 HTML-CIRCLE-NEXT:                     <pre><code class="language-cpp code-clang-doc">void Circle (double radius)</code></pre>
 HTML-CIRCLE-NEXT:                     <div class="doc-card">
 HTML-CIRCLE-NEXT:                         <div class="nested-delimiter-container">
-HTML-CIRCLE-NEXT:                             <p> Constructs a new Circle object.</p>
+HTML-CIRCLE-NEXT:                             <p>Constructs a new Circle object.</p>
 HTML-CIRCLE-NEXT:                         </div>
 HTML-CIRCLE-NEXT:                         <div class="nested-delimiter-container">
 HTML-CIRCLE-NEXT:                             <h3>Parameters</h3>
@@ -501,22 +501,22 @@ HTML-CIRCLE-LABEL:                <div id="{{([0-9A-F]{40})}}" class="delimiter-
 HTML-CIRCLE-NEXT:                     <pre><code class="language-cpp code-clang-doc">double area ()</code></pre>
 HTML-CIRCLE-NEXT:                     <div class="doc-card">
 HTML-CIRCLE-NEXT:                         <div class="nested-delimiter-container">
-HTML-CIRCLE-NEXT:                             <p> Calculates the area of the circle.</p>
+HTML-CIRCLE-NEXT:                             <p>Calculates the area of the circle.</p>
 HTML-CIRCLE-NEXT:                         </div>
 HTML-CIRCLE-NEXT:                         <div class="nested-delimiter-container">
 HTML-CIRCLE-NEXT:                             <h3>Returns</h3>
-HTML-CIRCLE-NEXT:                             <p> double The area of the circle.</p>
+HTML-CIRCLE-NEXT:                             <p>double The area of the circle.</p>
 HTML-CIRCLE-NEXT:                         </div>
 HTML-CIRCLE-NEXT:                     </div>
 HTML-CIRCLE-LABEL:                <div id="{{([0-9A-F]{40})}}" class="delimiter-container">
 HTML-CIRCLE-NEXT:                     <pre><code class="language-cpp code-clang-doc">double perimeter ()</code></pre>
 HTML-CIRCLE-NEXT:                     <div class="doc-card">
 HTML-CIRCLE-NEXT:                         <div class="nested-delimiter-container">
-HTML-CIRCLE-NEXT:                             <p> Calculates the perimeter of the circle.</p>
+HTML-CIRCLE-NEXT:                             <p>Calculates the perimeter of the circle.</p>
 HTML-CIRCLE-NEXT:                         </div>
 HTML-CIRCLE-NEXT:                         <div class="nested-delimiter-container">
 HTML-CIRCLE-NEXT:                             <h3>Returns</h3>
-HTML-CIRCLE-NEXT:                             <p> double The perimeter of the circle.</p>
+HTML-CIRCLE-NEXT:                             <p>double The perimeter of the circle.</p>
 HTML-CIRCLE-NEXT:                         </div>
 HTML-CIRCLE-NEXT:                             <h3>Code</h3>
 HTML-CIRCLE-NEXT:                             <div>
diff --git a/clang-tools-extra/test/clang-doc/basic-project.test b/clang-tools-extra/test/clang-doc/basic-project.test
index 9220dc6974508..057091102f122 100644
--- a/clang-tools-extra/test/clang-doc/basic-project.test
+++ b/clang-tools-extra/test/clang-doc/basic-project.test
@@ -92,7 +92,7 @@
 // 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: **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*
diff --git a/clang-tools-extra/test/clang-doc/comments-in-macros.cpp b/clang-tools-extra/test/clang-doc/comments-in-macros.cpp
index 20bbf4cd087c0..7200800e82acc 100644
--- a/clang-tools-extra/test/clang-doc/comments-in-macros.cpp
+++ b/clang-tools-extra/test/clang-doc/comments-in-macros.cpp
@@ -30,7 +30,7 @@
 // HTML-MYCLASS: <pre><code class="language-cpp code-clang-doc">int Add (int a, int b)</code></pre>
 // HTML-MYCLASS: <div class="doc-card">
 // HTML-MYCLASS:     <div class="nested-delimiter-container">
-// HTML-MYCLASS:         <p> Declare a method to calculate the sum of two numbers</p>
+// HTML-MYCLASS:         <p>Declare a method to calculate the sum of two numbers</p>
 // HTML-MYCLASS:     </div>
 
 class MyClass {
diff --git a/clang-tools-extra/test/clang-doc/enum.cpp b/clang-tools-extra/test/clang-doc/enum.cpp
index 22b05a240f6aa..070bf89f3e262 100644
--- a/clang-tools-extra/test/clang-doc/enum.cpp
+++ b/clang-tools-extra/test/clang-doc/enum.cpp
@@ -89,7 +89,7 @@ enum Color {
 // HTML-INDEX-NEXT:     </table>
 // HTML-INDEX-NEXT:     <div class="doc-card">
 // HTML-INDEX-NEXT:       <div class="nested-delimiter-container">
-// HTML-INDEX-NEXT:           <p> For specifying RGB colors</p>
+// HTML-INDEX-NEXT:           <p>For specifying RGB colors</p>
 // HTML-INDEX-NEXT:       </div>
 // HTML-INDEX-NEXT:     </div>
 // HTML-INDEX-NEXT:     <p>Defined at line [[@LINE-62]] of file {{.*}}clang-tools-extra{{[\/]}}test{{[\/]}}clang-doc{{[\/]}}enum.cpp</p>
@@ -167,7 +167,7 @@ enum class Shapes {
 // HTML-INDEX-NEXT:     </table>
 // HTML-INDEX-NEXT:     <div class="doc-card">
 // HTML-INDEX-NEXT:       <div class="nested-delimiter-container">
-// HTML-INDEX-NEXT:           <p> Shape Types</p>
+// HTML-INDEX-NEXT:           <p>Shape Types</p>
 // HTML-INDEX-NEXT:       </div>
 // HTML-INDEX-NEXT:     </div>
 // HTML-INDEX-NEXT:     <p>Defined at line [[@LINE-64]] of file {{.*}}clang-tools-extra{{[\/]}}test{{[\/]}}clang-doc{{[\/]}}enum.cpp</p>
@@ -245,7 +245,7 @@ enum Size : uint8_t {
 // HTML-INDEX-NEXT:     </table>
 // HTML-INDEX-NEXT:     <div class="doc-card">
 // HTML-INDEX-NEXT:       <div class="nested-delimiter-container">
-// HTML-INDEX-NEXT:           <p> Specify the size</p>
+// HTML-INDEX-NEXT:           <p>Specify the size</p>
 // HTML-INDEX-NEXT:       </div>
 // HTML-INDEX-NEXT:     </div>
 // HTML-INDEX-NEXT:     <p>Defined at line [[@LINE-71]] of file {{.*}}clang-tools-extra{{[\/]}}test{{[\/]}}clang-doc{{[\/]}}enum.cpp</p>
@@ -289,7 +289,7 @@ enum : long long {
 // HTML-INDEX-NEXT:     </table>
 // HTML-INDEX-NEXT:     <div class="doc-card">
 // HTML-INDEX-NEXT:       <div class="nested-delimiter-container">
-// HTML-INDEX-NEXT:           <p> Very long number</p>
+// HTML-INDEX-NEXT:           <p>Very long number</p>
 // HTML-INDEX-NEXT:       </div>
 // HTML-INDEX-NEXT:     </div>
 // HTML-INDEX-NEXT:     <p>Defined at line [[@LINE-38]] of file {{.*}}clang-tools-extra{{[\/]}}test{{[\/]}}clang-doc{{[\/]}}enum.cpp</p>
@@ -362,7 +362,7 @@ class FilePermissions {
 // HTML-PERM-NEXT:       </table>
 // HTML-PERM-NEXT:       <div class="doc-card">
 // HTML-PERM-NEXT:         <div class="nested-delimiter-container">
-// HTML-PERM-NEXT:             <p> File permission flags</p>
+// HTML-PERM-NEXT:             <p>File permission flags</p>
 // HTML-PERM-NEXT:         </div>
 // HTML-PERM-NEXT:       </div>
 // HTML-PERM-NEXT:         <p>Defined at line [[@LINE-63]] of file {{.*}}clang-tools-extra{{[\/]}}test{{[\/]}}clang-doc{{[\/]}}enum.cpp</p>
@@ -432,7 +432,7 @@ class Animals {
 // HTML-ANIMAL-NEXT:         </table>
 // HTML-ANIMAL-NEXT:         <div class="doc-card">
 // HTML-ANIMAL-NEXT:             <div class="nested-delimiter-container">
-// HTML-ANIMAL-NEXT:                 <p> specify what animal the class is</p>
+// HTML-ANIMAL-NEXT:                 <p>specify what animal the class is</p>
 // HTML-ANIMAL-NEXT:             </div>
 // HTML-ANIMAL-NEXT:         </div>
 // HTML-ANIMAL-NEXT:         <p>Defined at line [[@LINE-57]] of file {{.*}}enum.cpp</p>
@@ -530,7 +530,7 @@ enum Car {
 // HTML-VEHICLES-NEXT:      </table>
 // HTML-VEHICLES-NEXT:      <div class="doc-card">
 // HTML-VEHICLES-NEXT:        <div class="nested-delimiter-container">
-// HTML-VEHICLES-NEXT:           <p> specify type of car</p>
+// HTML-VEHICLES-NEXT:           <p>specify type of car</p>
 // HTML-VEHICLES-NEXT:        </div>
 // HTML-VEHICLES-NEXT:      </div>
 // HTML-VEHICLES-NEXT:      <p>Defined at line [[@LINE-72]] of file {{.*}}clang-tools-extra{{[\/]}}test{{[\/]}}clang-doc{{[\/]}}enum.cpp</p>
diff --git a/clang-tools-extra/test/clang-doc/json/class.cpp b/clang-tools-extra/test/clang-doc/json/class.cpp
index 3bb9f5e6ec6bb..85f1508529f21 100644
--- a/clang-tools-extra/test/clang-doc/json/class.cpp
+++ b/clang-tools-extra/test/clang-doc/json/class.cpp
@@ -52,16 +52,16 @@ struct MyClass {
 // CHECK-NEXT:      "BriefComments": [
 // CHECK-NEXT:        [
 // CHECK-NEXT:          {
-// CHECK-NEXT:            "TextComment": " This is a brief description."
+// CHECK-NEXT:            "TextComment": "This is a brief description."
 // CHECK:           "HasBriefComments": true,
 // CHECK-NEXT:      "HasParagraphComments": true,
 // CHECK-NEXT:      "ParagraphComments": [
 // CHECK-NEXT:        [
 // CHECK-NEXT:          {
-// CHECK-NEXT:            "TextComment": " This is a nice class."
+// CHECK-NEXT:            "TextComment": "This is a nice class."
 // CHECK-NEXT:          },
 // CHECK-NEXT:          {
-// CHECK-NEXT:            "TextComment": " It has some nice methods and fields."
+// CHECK-NEXT:            "TextComment": "It has some nice methods and fields."
 // CHECK-NEXT:          }
 // CHECK:         "DocumentationFileName": "_ZTV7MyClass",
 // CHECK:         "Enums": [
@@ -103,7 +103,7 @@ struct MyClass {
 // CHECK-NEXT:          "ParagraphComments": [
 // CHECK-NEXT:            [
 // CHECK-NEXT:              {
-// CHECK-NEXT:                "TextComment": " This is a function template friend."
+// CHECK-NEXT:                "TextComment": "This is a function template friend."
 // CHECK-NEXT:              }
 // CHECK-NEXT:            ]
 // CHECK-NEXT:          ]
@@ -149,7 +149,7 @@ struct MyClass {
 // CHECK-NEXT:          "ParagraphComments": [
 // CHECK-NEXT:            [
 // CHECK-NEXT:              {
-// CHECK-NEXT:                "TextComment": " This is a struct friend."
+// CHECK-NEXT:                "TextComment": "This is a struct friend."
 // CHECK-NEXT:              }
 // CHECK-NEXT:            ]
 // CHECK-NEXT:          ]
diff --git a/clang-tools-extra/test/clang-doc/json/compound-constraints.cpp b/clang-tools-extra/test/clang-doc/json/compound-constraints.cpp
index a34be9753f80e..97fe50b719792 100644
--- a/clang-tools-extra/test/clang-doc/json/compound-constraints.cpp
+++ b/clang-tools-extra/test/clang-doc/json/compound-constraints.cpp
@@ -149,7 +149,7 @@ template<typename T> requires (Incrementable<T> && Decrementable<T>) || PreIncre
 // CHECK-HTML-NEXT:             <pre><code class="language-cpp code-clang-doc">template <typename T> Incrementable requires (T a) { a++; }</code></pre> 
 // CHECK-HTML-NEXT:         </div>
 // CHECK-HTML-NEXT:         <div class="nested-delimiter-container">
-// CHECK-HTML-NEXT:             <p> Concept for an incrementable value</p>
+// CHECK-HTML-NEXT:             <p>Concept for an incrementable value</p>
 // CHECK-HTML-NEXT:         </div>
 // CHECK-HTML-NEXT:         <h3>Template Parameters</h3>
 // CHECK-HTML-NEXT:         <div class="nested-delimiter-container">
@@ -164,7 +164,7 @@ template<typename T> requires (Incrementable<T> && Decrementable<T>) || PreIncre
 // CHECK-HTML-NEXT:             <pre><code class="language-cpp code-clang-doc">template <typename T> Decrementable requires (T a) { a--; }</code></pre> 
 // CHECK-HTML-NEXT:         </div>
 // CHECK-HTML-NEXT:         <div class="nested-delimiter-container">
-// CHECK-HTML-NEXT:             <p> Concept for a decrementable value</p>
+// CHECK-HTML-NEXT:             <p>Concept for a decrementable value</p>
 // CHECK-HTML-NEXT:         </div>
 // CHECK-HTML-NEXT:         <h3>Template Parameters</h3>
 // CHECK-HTML-NEXT:         <div class="nested-delimiter-container">
@@ -179,7 +179,7 @@ template<typename T> requires (Incrementable<T> && Decrementable<T>) || PreIncre
 // CHECK-HTML-NEXT:             <pre><code class="language-cpp code-clang-doc">template <typename T> PreIncrementable requires (T a) { ++a; }</code></pre> 
 // CHECK-HTML-NEXT:         </div>
 // CHECK-HTML-NEXT:         <div class="nested-delimiter-container">
-// CHECK-HTML-NEXT:             <p> Concept for a pre-incrementable value</p>
+// CHECK-HTML-NEXT:             <p>Concept for a pre-incrementable value</p>
 // CHECK-HTML-NEXT:         </div>
 // CHECK-HTML-NEXT:         <h3>Template Parameters</h3>
 // CHECK-HTML-NEXT:         <div class="nested-delimiter-container">
@@ -194,7 +194,7 @@ template<typename T> requires (Incrementable<T> && Decrementable<T>) || PreIncre
 // CHECK-HTML-NEXT:             <pre><code class="language-cpp code-clang-doc">template <typename T> PreDecrementable requires (T a) { --a; }</code></pre> 
 // CHECK-HTML-NEXT:         </div>
 // CHECK-HTML-NEXT:         <div class="nested-delimiter-container">
-// CHECK-HTML-NEXT:             <p> Concept for a -pre-decrementable value</p>
+// CHECK-HTML-NEXT:             <p>Concept for a -pre-decrementable value</p>
 // CHECK-HTML-NEXT:         </div>
 // CHECK-HTML-NEXT:         <h3>Template Parameters</h3>
 // CHECK-HTML-NEXT:         <div class="nested-delimiter-container">
diff --git a/clang-tools-extra/test/clang-doc/json/concept.cpp b/clang-tools-extra/test/clang-doc/json/concept.cpp
index 70d20be1096e8..764f173bb03bc 100644
--- a/clang-tools-extra/test/clang-doc/json/concept.cpp
+++ b/clang-tools-extra/test/clang-doc/json/concept.cpp
@@ -18,7 +18,7 @@ concept Incrementable = requires(T x) {
 // CHECK-NEXT:        "ParagraphComments": [
 // CHECK-NEXT:          [
 // CHECK-NEXT:            {
-// CHECK-NEXT:              "TextComment": " Requires that T suports post and pre-incrementing."
+// CHECK-NEXT:              "TextComment": "Requires that T suports post and pre-incrementing."
 // CHECK:             "End": true,
 // CHECK-NEXT:        "InfoType": "concept",
 // CHECK-NEXT:        "IsType": true,
diff --git a/clang-tools-extra/test/clang-doc/namespace.cpp b/clang-tools-extra/test/clang-doc/namespace.cpp
index 1d7337d60f69c..e39fbacb62638 100644
--- a/clang-tools-extra/test/clang-doc/namespace.cpp
+++ b/clang-tools-extra/test/clang-doc/namespace.cpp
@@ -196,7 +196,7 @@ class ClassInNestedNamespace {};
 // HTML-NESTED-INDEX:         <pre><code class="language-cpp code-clang-doc">void functionInNestedNamespace ()</code></pre>
 // HTML-NESTED-INDEX:         <div class="doc-card">
 // HTML-NESTED-INDEX:             <div class="nested-delimiter-container">
-// HTML-NESTED-INDEX:                 <p> Function in NestedNamespace</p>
+// HTML-NESTED-INDEX:                 <p>Function in NestedNamespace</p>
 // HTML-NESTED-INDEX:             </div>
 // HTML-NESTED-INDEX:         </div>
 // HTML-NESTED-INDEX:         <p>Defined at line [[@LINE-56]] of file {{.*}}namespace.cpp</p>
@@ -241,7 +241,7 @@ class ClassInNestedNamespace {};
 // HTML-PRIMARY-INDEX:          <pre><code class="language-cpp code-clang-doc">void functionInPrimaryNamespace ()</code></pre>
 // HTML-PRIMARY-INDEX:          <div class="doc-card">
 // HTML-PRIMARY-INDEX:              <div class="nested-delimiter-container">
-// HTML-PRIMARY-INDEX:                  <p> Function in PrimaryNamespace</p>
+// HTML-PRIMARY-INDEX:                  <p>Function in PrimaryNamespace</p>
 // HTML-PRIMARY-INDEX:              </div>
 // HTML-PRIMARY-INDEX:          </div>
 // HTML-PRIMARY-INDEX:          <p>Defined at line [[@LINE-130]] of file {{.*}}clang-tools-extra{{[\/]}}test{{[\/]}}clang-doc{{[\/]}}namespace.cpp</p>
@@ -321,7 +321,7 @@ class ClassInAnotherNamespace {};
 // HTML-ANOTHER-INDEX:         <pre><code class="language-cpp code-clang-doc">void functionInAnotherNamespace ()</code></pre>
 // HTML-ANOTHER-INDEX:         <div class="doc-card">
 // HTML-ANOTHER-INDEX:             <div class="nested-delimiter-container">
-// HTML-ANOTHER-INDEX:                 <p> Function in AnotherNamespace</p>
+// HTML-ANOTHER-INDEX:                 <p>Function in AnotherNamespace</p>
 // HTML-ANOTHER-INDEX:             </div>
 // HTML-ANOTHER-INDEX:         </div>
 // HTML-ANOTHER-INDEX:         <p>Defined at line [[@LINE-55]] of file {{.*}}clang-tools-extra{{[\/]}}test{{[\/]}}clang-doc{{[\/]}}namespace.cpp</p>
diff --git a/clang-tools-extra/test/clang-doc/templates.cpp b/clang-tools-extra/test/clang-doc/templates.cpp
index e7b003670fbf6..86af599472894 100644
--- a/clang-tools-extra/test/clang-doc/templates.cpp
+++ b/clang-tools-extra/test/clang-doc/templates.cpp
@@ -388,10 +388,10 @@ struct tuple {};
 // HTML-STRUCT-NEXT:           <p>Defined at line [[# @LINE - 6]] of file {{.*}}templates.cpp</p>
 // HTML-STRUCT-NEXT:           <div class="doc-card">
 // HTML-STRUCT-NEXT:               <div class="nested-delimiter-container">
-// HTML-STRUCT-NEXT:                   <p> A Tuple type</p>
+// HTML-STRUCT-NEXT:                   <p>A Tuple type</p>
 // HTML-STRUCT-NEXT:               </div>
 // HTML-STRUCT-NEXT:               <div class="nested-delimiter-container">
-// HTML-STRUCT-NEXT:                   <p> Does Tuple things.</p>
+// HTML-STRUCT-NEXT:                   <p>Does Tuple things.</p>
 // HTML-STRUCT-NEXT:               </div>
 // HTML-STRUCT-NEXT:           </div>
 // HTML-STRUCT-NEXT:       </div>
@@ -410,7 +410,7 @@ tuple<int, int, bool> func_with_tuple_param(tuple<int, int, bool> t) { return t;
 // YAML-NEXT:          - Kind:            ParagraphComment
 // YAML-NEXT:            Children:
 // YAML-NEXT:              - Kind:            TextComment
-// YAML-NEXT:                Text:            ' A function with a tuple parameter'
+// YAML-NEXT:                Text:            'A function with a tuple parameter'
 // YAML-NEXT:          - Kind:            ParagraphComment
 // YAML-NEXT:            Children:
 // YAML-NEXT:              - Kind:            TextComment
@@ -421,7 +421,7 @@ tuple<int, int, bool> func_with_tuple_param(tuple<int, int, bool> t) { return t;
 // YAML-NEXT:              - Kind:            ParagraphComment
 // YAML-NEXT:                Children:
 // YAML-NEXT:                  - Kind:            TextComment
-// YAML-NEXT:                    Text:            ' The input to func_with_tuple_param'
+// YAML-NEXT:                    Text:            'The input to func_with_tuple_param'
 // YAML-NEXT:    DefLocation:
 // YAML-NEXT:      LineNumber:      [[# @LINE - 23]]
 // YAML-NEXT:      Filename:
@@ -472,7 +472,7 @@ tuple<int, int, bool> func_with_tuple_param(tuple<int, int, bool> t) { return t;
 // HTML:           <pre><code class="language-cpp code-clang-doc">tuple<int, int, bool> func_with_tuple_param (tuple<int, int, bool> t)</code></pre>
 // HTML-NEXT:      <div class="doc-card">
 // HTML-NEXT:          <div class="nested-delimiter-container">
-// HTML-NEXT:              <p> A function with a tuple parameter</p>
+// HTML-NEXT:              <p>A function with a tuple parameter</p>
 // HTML-NEXT:          </div>
 // HTML-NEXT:          <div class="nested-delimiter-container">
 // HTML-NEXT:              <h3>Parameters</h3>
diff --git a/clang-tools-extra/test/clang-doc/typedef-alias.cpp b/clang-tools-extra/test/clang-doc/typedef-alias.cpp
index f5b4afd7ff6a8..c4dad4c25f2e0 100644
--- a/clang-tools-extra/test/clang-doc/typedef-alias.cpp
+++ b/clang-tools-extra/test/clang-doc/typedef-alias.cpp
@@ -41,14 +41,14 @@ using IntVec = Vector<int>;
 // HTML-GLOBAL-NEXT:     <div id="{{([0-9A-F]{40})}}" class="delimiter-container">
 // HTML-GLOBAL-NEXT:         <pre><code class="language-cpp code-clang-doc">using u_long = unsigned long</code></pre>
 // HTML-GLOBAL-NEXT:         <div class="nested-delimiter-container">
-// HTML-GLOBAL-NEXT:             <p> This is u_long</p>
+// HTML-GLOBAL-NEXT:             <p>This is u_long</p>
 // HTML-GLOBAL-NEXT:         </div>
 // HTML-GLOBAL-NEXT:         <p>Defined at line 8 of file {{.*}}typedef-alias.cpp</p>
 // HTML-GLOBAL-NEXT:     </div>
 // HTML-GLOBAL-NEXT:     <div id="{{([0-9A-F]{40})}}" class="delimiter-container">
 // HTML-GLOBAL-NEXT:         <pre><code class="language-cpp code-clang-doc">typedef IntPtr int *</code></pre>
 // HTML-GLOBAL-NEXT:         <div class="nested-delimiter-container">
-// HTML-GLOBAL-NEXT:             <p> This is IntPtr</p>
+// HTML-GLOBAL-NEXT:             <p>This is IntPtr</p>
 // HTML-GLOBAL-NEXT:         </div>
 // HTML-GLOBAL-NEXT:         <p>Defined at line 11 of file {{.*}}typedef-alias.cpp</p>
 // HTML-GLOBAL-NEXT:     </div>
@@ -75,7 +75,7 @@ using IntVec = Vector<int>;
 // HTML-VECTOR-NEXT:     <div id="{{([0-9A-F]{40})}}" class="delimiter-container">
 // HTML-VECTOR-NEXT:         <pre><code class="language-cpp code-clang-doc">using Ptr = IntPtr</code></pre>
 // HTML-VECTOR-NEXT:         <div class="nested-delimiter-container">
-// HTML-VECTOR-NEXT:             <p> This is a Ptr</p>
+// HTML-VECTOR-NEXT:             <p>This is a Ptr</p>
 // HTML-VECTOR-NEXT:         </div>
 // HTML-VECTOR-NEXT:         <p>Defined at line 16 of file {{.*}}typedef-alias.cpp</p>
 // HTML-VECTOR-NEXT:     </div>
diff --git a/clang-tools-extra/unittests/clang-doc/MDGeneratorTest.cpp b/clang-tools-extra/unittests/clang-doc/MDGeneratorTest.cpp
index 5fed8f4db4809..54df1c6093b2a 100644
--- a/clang-tools-extra/unittests/clang-doc/MDGeneratorTest.cpp
+++ b/clang-tools-extra/unittests/clang-doc/MDGeneratorTest.cpp
@@ -290,7 +290,7 @@ TEST_F(MDGeneratorTest, emitCommentMD) {
   ParamOut->Children.back()->Children.emplace_back(allocatePtr<CommentInfo>());
   ParamOut->Children.back()->Children.back()->Kind =
       CommentKind::CK_TextComment;
-  ParamOut->Children.back()->Children.back()->Text = " is a parameter.";
+  ParamOut->Children.back()->Children.back()->Text = "is a parameter.";
 
   Top.Children.emplace_back(allocatePtr<CommentInfo>());
   CommentInfo *ParamIn = Top.Children.back().get();
@@ -352,7 +352,7 @@ TEST_F(MDGeneratorTest, emitCommentMD) {
 
 **J** is a parameter.
 
-**return**void
+**return** void
 
 )raw";
 

>From 95d863612921ac71e3f9fa095fa7db63080e49c9 Mon Sep 17 00:00:00 2001
From: Samrudh Nelli <samrudhnelli at gmail.com>
Date: Wed, 11 Mar 2026 01:05:14 +0530
Subject: [PATCH 34/39] revert commits

---
 clang-tools-extra/unittests/clang-doc/MDGeneratorTest.cpp | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/clang-tools-extra/unittests/clang-doc/MDGeneratorTest.cpp b/clang-tools-extra/unittests/clang-doc/MDGeneratorTest.cpp
index 54df1c6093b2a..da22d00835126 100644
--- a/clang-tools-extra/unittests/clang-doc/MDGeneratorTest.cpp
+++ b/clang-tools-extra/unittests/clang-doc/MDGeneratorTest.cpp
@@ -301,7 +301,7 @@ TEST_F(MDGeneratorTest, emitCommentMD) {
   ParamIn->Children.back()->Kind = CommentKind::CK_ParagraphComment;
   ParamIn->Children.back()->Children.emplace_back(allocatePtr<CommentInfo>());
   ParamIn->Children.back()->Children.back()->Kind = CommentKind::CK_TextComment;
-  ParamIn->Children.back()->Children.back()->Text = " is a parameter.";
+  ParamIn->Children.back()->Children.back()->Text = "is a parameter.";
   ParamIn->Children.back()->Children.emplace_back(
       std::make_unique<CommentInfo>());
   ParamIn->Children.back()->Children.back()->Kind = CommentKind::CK_TextComment;

>From a8fe8940b1118b7289c32c8ba193bdf5c2519659 Mon Sep 17 00:00:00 2001
From: Samrudh Nelli <samrudhnelli at gmail.com>
Date: Wed, 11 Mar 2026 01:22:02 +0530
Subject: [PATCH 35/39] fix CI error

---
 clang-tools-extra/clang-doc/JSONGenerator.cpp | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/clang-tools-extra/clang-doc/JSONGenerator.cpp b/clang-tools-extra/clang-doc/JSONGenerator.cpp
index 3d5a5cb576019..e768d25e38971 100644
--- a/clang-tools-extra/clang-doc/JSONGenerator.cpp
+++ b/clang-tools-extra/clang-doc/JSONGenerator.cpp
@@ -625,7 +625,7 @@ void JSONGenerator::serializeInfo(const EnumInfo &I, json::Object &Obj) {
         break;
       }
     }
-    serializeArray(I.Members, Obj, "Members", SerializeInfoLambda);
+    serializeArray(I.Members, Obj, "Members", serializeInfoLambda());
   }
 }
 

>From dfedff6e1fcb1cb804a06da6875fbbd9e35470ba Mon Sep 17 00:00:00 2001
From: Samrudh Nelli <samrudhnelli at gmail.com>
Date: Wed, 11 Mar 2026 01:26:18 +0530
Subject: [PATCH 36/39] fix test broken due to .trim()

---
 clang-tools-extra/test/clang-doc/enum.cpp | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/clang-tools-extra/test/clang-doc/enum.cpp b/clang-tools-extra/test/clang-doc/enum.cpp
index 070bf89f3e262..eec2bcb9f82e6 100644
--- a/clang-tools-extra/test/clang-doc/enum.cpp
+++ b/clang-tools-extra/test/clang-doc/enum.cpp
@@ -229,7 +229,7 @@ enum Size : uint8_t {
 // HTML-INDEX-NEXT:                 <td>Medium</td>
 // HTML-INDEX-NEXT:                 <td>1</td>
 // HTML-INDEX-NEXT:                 <td>
-// HTML-INDEX-NEXT:                   <p class="paragraph-container"> A tennis ball.</p>
+// HTML-INDEX-NEXT:                   <p class="paragraph-container">A tennis ball.</p>
 // HTML-INDEX-NEXT:                 </td>
 // HTML-INDEX-NEXT:             </tr>
 // HTML-INDEX-NEXT:             <tr>

>From c96a782b645d46a710acd9f3da917b6e8310879f Mon Sep 17 00:00:00 2001
From: Samrudh Nelli <samrudhnelli at gmail.com>
Date: Wed, 11 Mar 2026 01:54:13 +0530
Subject: [PATCH 37/39] add JSON tests for enums

The JSON was provided to an LLM, with the test format to generate the
tests
---
 .../test/clang-doc/json/enum.cpp              | 192 ++++++++++++++++++
 1 file changed, 192 insertions(+)
 create mode 100644 clang-tools-extra/test/clang-doc/json/enum.cpp

diff --git a/clang-tools-extra/test/clang-doc/json/enum.cpp b/clang-tools-extra/test/clang-doc/json/enum.cpp
new file mode 100644
index 0000000000000..47c8858b1e6dd
--- /dev/null
+++ b/clang-tools-extra/test/clang-doc/json/enum.cpp
@@ -0,0 +1,192 @@
+// RUN: rm -rf %t && mkdir -p %t
+// RUN: clang-doc --output=%t --format=json --executor=standalone %s
+// RUN: FileCheck %s < %t/json/GlobalNamespace/index.json --check-prefix=JSON-INDEX
+// RUN: FileCheck %s < %t/json/Vehicles/index.json --check-prefix=JSON-VEHICLES-INDEX
+
+typedef unsigned char uint8_t;
+/**
+ * @brief Specify the size
+ */
+enum Size : uint8_t {
+  /// A pearl.
+  /// Pearls are quite small.
+  ///
+  /// Pearls are used in jewelry.
+  Small,
+
+  /// @brief A tennis ball.
+  Medium,
+
+  /// A football.
+  Large
+};
+
+// JSON-INDEX-LABEL: {
+// JSON-INDEX-NEXT:    "BaseType": {
+// JSON-INDEX-NEXT:      "Name": "uint8_t",
+// JSON-INDEX-NEXT:      "QualName": "uint8_t",
+// JSON-INDEX-NEXT:      "USR": "0000000000000000000000000000000000000000"
+// JSON-INDEX-NEXT:    },
+// JSON-INDEX-NEXT:    "Description": {
+// JSON-INDEX-NEXT:      "BriefComments": [
+// JSON-INDEX-NEXT:        [
+// JSON-INDEX-NEXT:          {
+// JSON-INDEX-NEXT:            "TextComment": " Specify the size"
+// JSON-INDEX-NEXT:          }
+// JSON-INDEX-NEXT:        ]
+// JSON-INDEX-NEXT:      ],
+// JSON-INDEX-NEXT:      "HasBriefComments": true
+// JSON-INDEX-NEXT:    },
+// JSON-INDEX-NEXT:    "HasComments": true,
+// JSON-INDEX-NEXT:    "InfoType": "enum",
+// JSON-INDEX-NEXT:    "Location": {
+// JSON-INDEX-NEXT:      "Filename": "{{.*}}repronum.cpp",
+// JSON-INDEX-NEXT:      "LineNumber": 26
+// JSON-INDEX-NEXT:    },
+// JSON-INDEX-NEXT:    "Members": [
+// JSON-INDEX-NEXT:      {
+// JSON-INDEX-NEXT:        "Description": {
+// JSON-INDEX-NEXT:          "HasParagraphComments": true,
+// JSON-INDEX-NEXT:          "ParagraphComments": [
+// JSON-INDEX-NEXT:            [
+// JSON-INDEX-NEXT:              {
+// JSON-INDEX-NEXT:                "TextComment": " Pearls are quite small."
+// JSON-INDEX-NEXT:              }
+// JSON-INDEX-NEXT:            ],
+// JSON-INDEX-NEXT:            [
+// JSON-INDEX-NEXT:              {
+// JSON-INDEX-NEXT:                "TextComment": " Pearls are used in jewelry."
+// JSON-INDEX-NEXT:              }
+// JSON-INDEX-NEXT:            ]
+// JSON-INDEX-NEXT:          ]
+// JSON-INDEX-NEXT:        },
+// JSON-INDEX-NEXT:        "HasEnumMemberComments": true,
+// JSON-INDEX-NEXT:        "Name": "Small",
+// JSON-INDEX-NEXT:        "Value": "0"
+// JSON-INDEX-NEXT:      },
+// JSON-INDEX-NEXT:      {
+// JSON-INDEX-NEXT:        "Description": {
+// JSON-INDEX-NEXT:          "BriefComments": [
+// JSON-INDEX-NEXT:            [
+// JSON-INDEX-NEXT:              {
+// JSON-INDEX-NEXT:                "TextComment": " A tennis ball."
+// JSON-INDEX-NEXT:              }
+// JSON-INDEX-NEXT:            ]
+// JSON-INDEX-NEXT:          ],
+// JSON-INDEX-NEXT:          "HasBriefComments": true
+// JSON-INDEX-NEXT:        },
+// JSON-INDEX-NEXT:        "HasEnumMemberComments": true,
+// JSON-INDEX-NEXT:        "Name": "Medium",
+// JSON-INDEX-NEXT:        "Value": "1"
+// JSON-INDEX-NEXT:      },
+// JSON-INDEX-NEXT:      {
+// JSON-INDEX-NEXT:        "Description": {
+// JSON-INDEX-NEXT:          "HasParagraphComments": true,
+// JSON-INDEX-NEXT:          "ParagraphComments": [
+// JSON-INDEX-NEXT:            [
+// JSON-INDEX-NEXT:              {
+// JSON-INDEX-NEXT:                "TextComment": " A football."
+// JSON-INDEX-NEXT:              }
+// JSON-INDEX-NEXT:            ]
+// JSON-INDEX-NEXT:          ]
+// JSON-INDEX-NEXT:        },
+// JSON-INDEX-NEXT:        "End": true,
+// JSON-INDEX-NEXT:        "HasEnumMemberComments": true,
+// JSON-INDEX-NEXT:        "Name": "Large",
+// JSON-INDEX-NEXT:        "Value": "2"
+// JSON-INDEX-NEXT:      }
+// JSON-INDEX-NEXT:    ],
+// JSON-INDEX-NEXT:    "Name": "Size",
+// JSON-INDEX-NEXT:    "Scoped": false,
+// JSON-INDEX-NEXT:    "USR": "{{[0-9A-F]*}}"
+// JSON-INDEX-NEXT:  }
+
+namespace Vehicles {
+/**
+ * @brief specify type of car
+ */
+enum Car {
+  Sedan,    ///< Comment 1
+  SUV,      ///< Comment 2
+  Pickup,
+  Hatchback ///< Comment 4
+};
+} // namespace Vehicles
+
+// JSON-VEHICLES-INDEX-LABEL: {
+// JSON-VEHICLES-INDEX-NEXT:    "Description": {
+// JSON-VEHICLES-INDEX-NEXT:      "BriefComments": [
+// JSON-VEHICLES-INDEX-NEXT:        [
+// JSON-VEHICLES-INDEX-NEXT:          {
+// JSON-VEHICLES-INDEX-NEXT:            "TextComment": " specify type of car"
+// JSON-VEHICLES-INDEX-NEXT:          }
+// JSON-VEHICLES-INDEX-NEXT:        ]
+// JSON-VEHICLES-INDEX-NEXT:      ],
+// JSON-VEHICLES-INDEX-NEXT:      "HasBriefComments": true
+// JSON-VEHICLES-INDEX-NEXT:    },
+// JSON-VEHICLES-INDEX-NEXT:    "End": true,
+// JSON-VEHICLES-INDEX-NEXT:    "HasComments": true,
+// JSON-VEHICLES-INDEX-NEXT:    "InfoType": "enum",
+// JSON-VEHICLES-INDEX-NEXT:    "Location": {
+// JSON-VEHICLES-INDEX-NEXT:      "Filename": "{{.*}}repronum.cpp",
+// JSON-VEHICLES-INDEX-NEXT:      "LineNumber": 70
+// JSON-VEHICLES-INDEX-NEXT:    },
+// JSON-VEHICLES-INDEX-NEXT:    "Members": [
+// JSON-VEHICLES-INDEX-NEXT:      {
+// JSON-VEHICLES-INDEX-NEXT:        "Description": {
+// JSON-VEHICLES-INDEX-NEXT:          "HasParagraphComments": true,
+// JSON-VEHICLES-INDEX-NEXT:          "ParagraphComments": [
+// JSON-VEHICLES-INDEX-NEXT:            [
+// JSON-VEHICLES-INDEX-NEXT:              {
+// JSON-VEHICLES-INDEX-NEXT:                "TextComment": " Comment 1"
+// JSON-VEHICLES-INDEX-NEXT:              }
+// JSON-VEHICLES-INDEX-NEXT:            ]
+// JSON-VEHICLES-INDEX-NEXT:          ]
+// JSON-VEHICLES-INDEX-NEXT:        },
+// JSON-VEHICLES-INDEX-NEXT:        "HasEnumMemberComments": true,
+// JSON-VEHICLES-INDEX-NEXT:        "Name": "Sedan",
+// JSON-VEHICLES-INDEX-NEXT:        "Value": "0"
+// JSON-VEHICLES-INDEX-NEXT:      },
+// JSON-VEHICLES-INDEX-NEXT:      {
+// JSON-VEHICLES-INDEX-NEXT:        "Description": {
+// JSON-VEHICLES-INDEX-NEXT:          "HasParagraphComments": true,
+// JSON-VEHICLES-INDEX-NEXT:          "ParagraphComments": [
+// JSON-VEHICLES-INDEX-NEXT:            [
+// JSON-VEHICLES-INDEX-NEXT:              {
+// JSON-VEHICLES-INDEX-NEXT:                "TextComment": " Comment 2"
+// JSON-VEHICLES-INDEX-NEXT:              }
+// JSON-VEHICLES-INDEX-NEXT:            ]
+// JSON-VEHICLES-INDEX-NEXT:          ]
+// JSON-VEHICLES-INDEX-NEXT:        },
+// JSON-VEHICLES-INDEX-NEXT:        "HasEnumMemberComments": true,
+// JSON-VEHICLES-INDEX-NEXT:        "Name": "SUV",
+// JSON-VEHICLES-INDEX-NEXT:        "Value": "1"
+// JSON-VEHICLES-INDEX-NEXT:      },
+// JSON-VEHICLES-INDEX-NEXT:      {
+// JSON-VEHICLES-INDEX-NEXT:        "Name": "Pickup",
+// JSON-VEHICLES-INDEX-NEXT:        "Value": "2"
+// JSON-VEHICLES-INDEX-NEXT:      },
+// JSON-VEHICLES-INDEX-NEXT:      {
+// JSON-VEHICLES-INDEX-NEXT:        "Description": {
+// JSON-VEHICLES-INDEX-NEXT:          "HasParagraphComments": true,
+// JSON-VEHICLES-INDEX-NEXT:          "ParagraphComments": [
+// JSON-VEHICLES-INDEX-NEXT:            [
+// JSON-VEHICLES-INDEX-NEXT:              {
+// JSON-VEHICLES-INDEX-NEXT:                "TextComment": " Comment 4"
+// JSON-VEHICLES-INDEX-NEXT:              }
+// JSON-VEHICLES-INDEX-NEXT:            ]
+// JSON-VEHICLES-INDEX-NEXT:          ]
+// JSON-VEHICLES-INDEX-NEXT:        },
+// JSON-VEHICLES-INDEX-NEXT:        "End": true,
+// JSON-VEHICLES-INDEX-NEXT:        "HasEnumMemberComments": true,
+// JSON-VEHICLES-INDEX-NEXT:        "Name": "Hatchback",
+// JSON-VEHICLES-INDEX-NEXT:        "Value": "3"
+// JSON-VEHICLES-INDEX-NEXT:      }
+// JSON-VEHICLES-INDEX-NEXT:    ],
+// JSON-VEHICLES-INDEX-NEXT:    "Name": "Car",
+// JSON-VEHICLES-INDEX-NEXT:    "Namespace": [
+// JSON-VEHICLES-INDEX-NEXT:      "Vehicles"
+// JSON-VEHICLES-INDEX-NEXT:    ],
+// JSON-VEHICLES-INDEX-NEXT:    "Scoped": false,
+// JSON-VEHICLES-INDEX-NEXT:    "USR": "{{[0-9A-F]*}}"
+// JSON-VEHICLES-INDEX-NEXT:  }

>From 048d285eeca0070b925e34143912ce4080a2a4e8 Mon Sep 17 00:00:00 2001
From: Samrudh Nelli <samrudhnelli at gmail.com>
Date: Wed, 11 Mar 2026 02:18:29 +0530
Subject: [PATCH 38/39] fix json tests

---
 .../test/clang-doc/json/enum.cpp              | 270 +++++++++---------
 1 file changed, 138 insertions(+), 132 deletions(-)

diff --git a/clang-tools-extra/test/clang-doc/json/enum.cpp b/clang-tools-extra/test/clang-doc/json/enum.cpp
index 47c8858b1e6dd..495caaee1a8a6 100644
--- a/clang-tools-extra/test/clang-doc/json/enum.cpp
+++ b/clang-tools-extra/test/clang-doc/json/enum.cpp
@@ -22,84 +22,87 @@ enum Size : uint8_t {
 };
 
 // JSON-INDEX-LABEL: {
-// JSON-INDEX-NEXT:    "BaseType": {
-// JSON-INDEX-NEXT:      "Name": "uint8_t",
-// JSON-INDEX-NEXT:      "QualName": "uint8_t",
-// JSON-INDEX-NEXT:      "USR": "0000000000000000000000000000000000000000"
-// JSON-INDEX-NEXT:    },
-// JSON-INDEX-NEXT:    "Description": {
-// JSON-INDEX-NEXT:      "BriefComments": [
-// JSON-INDEX-NEXT:        [
-// JSON-INDEX-NEXT:          {
-// JSON-INDEX-NEXT:            "TextComment": " Specify the size"
-// JSON-INDEX-NEXT:          }
-// JSON-INDEX-NEXT:        ]
-// JSON-INDEX-NEXT:      ],
-// JSON-INDEX-NEXT:      "HasBriefComments": true
-// JSON-INDEX-NEXT:    },
-// JSON-INDEX-NEXT:    "HasComments": true,
-// JSON-INDEX-NEXT:    "InfoType": "enum",
-// JSON-INDEX-NEXT:    "Location": {
-// JSON-INDEX-NEXT:      "Filename": "{{.*}}repronum.cpp",
-// JSON-INDEX-NEXT:      "LineNumber": 26
-// JSON-INDEX-NEXT:    },
-// JSON-INDEX-NEXT:    "Members": [
+// JSON-INDEX-NEXT:    "DocumentationFileName": "index",
+// JSON-INDEX-NEXT:    "Enums": [
 // JSON-INDEX-NEXT:      {
-// JSON-INDEX-NEXT:        "Description": {
-// JSON-INDEX-NEXT:          "HasParagraphComments": true,
-// JSON-INDEX-NEXT:          "ParagraphComments": [
-// JSON-INDEX-NEXT:            [
-// JSON-INDEX-NEXT:              {
-// JSON-INDEX-NEXT:                "TextComment": " Pearls are quite small."
-// JSON-INDEX-NEXT:              }
-// JSON-INDEX-NEXT:            ],
-// JSON-INDEX-NEXT:            [
-// JSON-INDEX-NEXT:              {
-// JSON-INDEX-NEXT:                "TextComment": " Pearls are used in jewelry."
-// JSON-INDEX-NEXT:              }
-// JSON-INDEX-NEXT:            ]
-// JSON-INDEX-NEXT:          ]
+// JSON-INDEX-NEXT:        "BaseType": {
+// JSON-INDEX-NEXT:          "Name": "uint8_t",
+// JSON-INDEX-NEXT:          "QualName": "uint8_t",
+// JSON-INDEX-NEXT:          "USR": "0000000000000000000000000000000000000000"
 // JSON-INDEX-NEXT:        },
-// JSON-INDEX-NEXT:        "HasEnumMemberComments": true,
-// JSON-INDEX-NEXT:        "Name": "Small",
-// JSON-INDEX-NEXT:        "Value": "0"
-// JSON-INDEX-NEXT:      },
-// JSON-INDEX-NEXT:      {
 // JSON-INDEX-NEXT:        "Description": {
 // JSON-INDEX-NEXT:          "BriefComments": [
 // JSON-INDEX-NEXT:            [
 // JSON-INDEX-NEXT:              {
-// JSON-INDEX-NEXT:                "TextComment": " A tennis ball."
+// JSON-INDEX-NEXT:                "TextComment": " Specify the size"
 // JSON-INDEX-NEXT:              }
 // JSON-INDEX-NEXT:            ]
 // JSON-INDEX-NEXT:          ],
 // JSON-INDEX-NEXT:          "HasBriefComments": true
 // JSON-INDEX-NEXT:        },
-// JSON-INDEX-NEXT:        "HasEnumMemberComments": true,
-// JSON-INDEX-NEXT:        "Name": "Medium",
-// JSON-INDEX-NEXT:        "Value": "1"
-// JSON-INDEX-NEXT:      },
-// JSON-INDEX-NEXT:      {
-// JSON-INDEX-NEXT:        "Description": {
-// JSON-INDEX-NEXT:          "HasParagraphComments": true,
-// JSON-INDEX-NEXT:          "ParagraphComments": [
-// JSON-INDEX-NEXT:            [
-// JSON-INDEX-NEXT:              {
-// JSON-INDEX-NEXT:                "TextComment": " A football."
-// JSON-INDEX-NEXT:              }
-// JSON-INDEX-NEXT:            ]
-// JSON-INDEX-NEXT:          ]
+// JSON-INDEX-NEXT:        "HasComments": true,
+// JSON-INDEX-NEXT:        "InfoType": "enum",
+// JSON-INDEX-NEXT:        "Location": {
+// JSON-INDEX-NEXT:          "Filename": "{{.*}}enum.cpp",
+// JSON-INDEX-NEXT:          "LineNumber": 10
 // JSON-INDEX-NEXT:        },
-// JSON-INDEX-NEXT:        "End": true,
-// JSON-INDEX-NEXT:        "HasEnumMemberComments": true,
-// JSON-INDEX-NEXT:        "Name": "Large",
-// JSON-INDEX-NEXT:        "Value": "2"
+// JSON-INDEX-NEXT:        "Members": [
+// JSON-INDEX-NEXT:          {
+// JSON-INDEX-NEXT:            "Description": {
+// JSON-INDEX-NEXT:              "HasParagraphComments": true,
+// JSON-INDEX-NEXT:              "ParagraphComments": [
+// JSON-INDEX-NEXT:                [
+// JSON-INDEX-NEXT:                  {
+// JSON-INDEX-NEXT:                    "TextComment": " Pearls are quite small."
+// JSON-INDEX-NEXT:                  }
+// JSON-INDEX-NEXT:                ],
+// JSON-INDEX-NEXT:                [
+// JSON-INDEX-NEXT:                  {
+// JSON-INDEX-NEXT:                    "TextComment": " Pearls are used in jewelry."
+// JSON-INDEX-NEXT:                  }
+// JSON-INDEX-NEXT:                ]
+// JSON-INDEX-NEXT:              ]
+// JSON-INDEX-NEXT:            },
+// JSON-INDEX-NEXT:            "HasEnumMemberComments": true,
+// JSON-INDEX-NEXT:            "Name": "Small",
+// JSON-INDEX-NEXT:            "Value": "0"
+// JSON-INDEX-NEXT:          },
+// JSON-INDEX-NEXT:          {
+// JSON-INDEX-NEXT:            "Description": {
+// JSON-INDEX-NEXT:              "BriefComments": [
+// JSON-INDEX-NEXT:                [
+// JSON-INDEX-NEXT:                  {
+// JSON-INDEX-NEXT:                    "TextComment": " A tennis ball."
+// JSON-INDEX-NEXT:                  }
+// JSON-INDEX-NEXT:                ]
+// JSON-INDEX-NEXT:              ],
+// JSON-INDEX-NEXT:              "HasBriefComments": true
+// JSON-INDEX-NEXT:            },
+// JSON-INDEX-NEXT:            "HasEnumMemberComments": true,
+// JSON-INDEX-NEXT:            "Name": "Medium",
+// JSON-INDEX-NEXT:            "Value": "1"
+// JSON-INDEX-NEXT:          },
+// JSON-INDEX-NEXT:          {
+// JSON-INDEX-NEXT:            "Description": {
+// JSON-INDEX-NEXT:              "HasParagraphComments": true,
+// JSON-INDEX-NEXT:              "ParagraphComments": [
+// JSON-INDEX-NEXT:                [
+// JSON-INDEX-NEXT:                  {
+// JSON-INDEX-NEXT:                    "TextComment": " A football."
+// JSON-INDEX-NEXT:                  }
+// JSON-INDEX-NEXT:                ]
+// JSON-INDEX-NEXT:              ]
+// JSON-INDEX-NEXT:            },
+// JSON-INDEX-NEXT:            "End": true,
+// JSON-INDEX-NEXT:            "HasEnumMemberComments": true,
+// JSON-INDEX-NEXT:            "Name": "Large",
+// JSON-INDEX-NEXT:            "Value": "2"
+// JSON-INDEX-NEXT:          }
+// JSON-INDEX-NEXT:        ],
+// JSON-INDEX-NEXT:        "Name": "Size",
+// JSON-INDEX-NEXT:        "Scoped": false,
+// JSON-INDEX-NEXT:        "USR": "{{[0-9A-F]*}}"
 // JSON-INDEX-NEXT:      }
-// JSON-INDEX-NEXT:    ],
-// JSON-INDEX-NEXT:    "Name": "Size",
-// JSON-INDEX-NEXT:    "Scoped": false,
-// JSON-INDEX-NEXT:    "USR": "{{[0-9A-F]*}}"
-// JSON-INDEX-NEXT:  }
 
 namespace Vehicles {
 /**
@@ -113,80 +116,83 @@ enum Car {
 };
 } // namespace Vehicles
 
-// JSON-VEHICLES-INDEX-LABEL: {
-// JSON-VEHICLES-INDEX-NEXT:    "Description": {
-// JSON-VEHICLES-INDEX-NEXT:      "BriefComments": [
-// JSON-VEHICLES-INDEX-NEXT:        [
-// JSON-VEHICLES-INDEX-NEXT:          {
-// JSON-VEHICLES-INDEX-NEXT:            "TextComment": " specify type of car"
-// JSON-VEHICLES-INDEX-NEXT:          }
-// JSON-VEHICLES-INDEX-NEXT:        ]
-// JSON-VEHICLES-INDEX-NEXT:      ],
-// JSON-VEHICLES-INDEX-NEXT:      "HasBriefComments": true
-// JSON-VEHICLES-INDEX-NEXT:    },
-// JSON-VEHICLES-INDEX-NEXT:    "End": true,
-// JSON-VEHICLES-INDEX-NEXT:    "HasComments": true,
-// JSON-VEHICLES-INDEX-NEXT:    "InfoType": "enum",
-// JSON-VEHICLES-INDEX-NEXT:    "Location": {
-// JSON-VEHICLES-INDEX-NEXT:      "Filename": "{{.*}}repronum.cpp",
-// JSON-VEHICLES-INDEX-NEXT:      "LineNumber": 70
-// JSON-VEHICLES-INDEX-NEXT:    },
-// JSON-VEHICLES-INDEX-NEXT:    "Members": [
+// JSON-VEHICLES-INDEX-NEXT:    "DocumentationFileName": "index",
+// JSON-VEHICLES-INDEX-NEXT:    "Enums": [
 // JSON-VEHICLES-INDEX-NEXT:      {
 // JSON-VEHICLES-INDEX-NEXT:        "Description": {
-// JSON-VEHICLES-INDEX-NEXT:          "HasParagraphComments": true,
-// JSON-VEHICLES-INDEX-NEXT:          "ParagraphComments": [
-// JSON-VEHICLES-INDEX-NEXT:            [
-// JSON-VEHICLES-INDEX-NEXT:              {
-// JSON-VEHICLES-INDEX-NEXT:                "TextComment": " Comment 1"
-// JSON-VEHICLES-INDEX-NEXT:              }
-// JSON-VEHICLES-INDEX-NEXT:            ]
-// JSON-VEHICLES-INDEX-NEXT:          ]
-// JSON-VEHICLES-INDEX-NEXT:        },
-// JSON-VEHICLES-INDEX-NEXT:        "HasEnumMemberComments": true,
-// JSON-VEHICLES-INDEX-NEXT:        "Name": "Sedan",
-// JSON-VEHICLES-INDEX-NEXT:        "Value": "0"
-// JSON-VEHICLES-INDEX-NEXT:      },
-// JSON-VEHICLES-INDEX-NEXT:      {
 // JSON-VEHICLES-INDEX-NEXT:        "Description": {
-// JSON-VEHICLES-INDEX-NEXT:          "HasParagraphComments": true,
-// JSON-VEHICLES-INDEX-NEXT:          "ParagraphComments": [
+// JSON-VEHICLES-INDEX-NEXT:          "BriefComments": [
 // JSON-VEHICLES-INDEX-NEXT:            [
 // JSON-VEHICLES-INDEX-NEXT:              {
-// JSON-VEHICLES-INDEX-NEXT:                "TextComment": " Comment 2"
+// JSON-VEHICLES-INDEX-NEXT:                "TextComment": " specify type of car"
 // JSON-VEHICLES-INDEX-NEXT:              }
 // JSON-VEHICLES-INDEX-NEXT:            ]
-// JSON-VEHICLES-INDEX-NEXT:          ]
-// JSON-VEHICLES-INDEX-NEXT:        },
-// JSON-VEHICLES-INDEX-NEXT:        "HasEnumMemberComments": true,
-// JSON-VEHICLES-INDEX-NEXT:        "Name": "SUV",
-// JSON-VEHICLES-INDEX-NEXT:        "Value": "1"
-// JSON-VEHICLES-INDEX-NEXT:      },
-// JSON-VEHICLES-INDEX-NEXT:      {
-// JSON-VEHICLES-INDEX-NEXT:        "Name": "Pickup",
-// JSON-VEHICLES-INDEX-NEXT:        "Value": "2"
-// JSON-VEHICLES-INDEX-NEXT:      },
-// JSON-VEHICLES-INDEX-NEXT:      {
-// JSON-VEHICLES-INDEX-NEXT:        "Description": {
-// JSON-VEHICLES-INDEX-NEXT:          "HasParagraphComments": true,
-// JSON-VEHICLES-INDEX-NEXT:          "ParagraphComments": [
-// JSON-VEHICLES-INDEX-NEXT:            [
-// JSON-VEHICLES-INDEX-NEXT:              {
-// JSON-VEHICLES-INDEX-NEXT:                "TextComment": " Comment 4"
-// JSON-VEHICLES-INDEX-NEXT:              }
-// JSON-VEHICLES-INDEX-NEXT:            ]
-// JSON-VEHICLES-INDEX-NEXT:          ]
+// JSON-VEHICLES-INDEX-NEXT:          ],
+// JSON-VEHICLES-INDEX-NEXT:          "HasBriefComments": true
 // JSON-VEHICLES-INDEX-NEXT:        },
 // JSON-VEHICLES-INDEX-NEXT:        "End": true,
-// JSON-VEHICLES-INDEX-NEXT:        "HasEnumMemberComments": true,
-// JSON-VEHICLES-INDEX-NEXT:        "Name": "Hatchback",
-// JSON-VEHICLES-INDEX-NEXT:        "Value": "3"
+// JSON-VEHICLES-INDEX-NEXT:        "HasComments": true,
+// JSON-VEHICLES-INDEX-NEXT:        "InfoType": "enum",
+// JSON-VEHICLES-INDEX-NEXT:        "Location": {
+// JSON-VEHICLES-INDEX-NEXT:          "Filename": "{{.*}}enum.cpp",
+// JSON-VEHICLES-INDEX-NEXT:          "LineNumber": 111
+// JSON-VEHICLES-INDEX-NEXT:        },
+// JSON-VEHICLES-INDEX-NEXT:        "Members": [
+// JSON-VEHICLES-INDEX-NEXT:          {
+// JSON-VEHICLES-INDEX-NEXT:            "Description": {
+// JSON-VEHICLES-INDEX-NEXT:              "HasParagraphComments": true,
+// JSON-VEHICLES-INDEX-NEXT:              "ParagraphComments": [
+// JSON-VEHICLES-INDEX-NEXT:                [
+// JSON-VEHICLES-INDEX-NEXT:                  {
+// JSON-VEHICLES-INDEX-NEXT:                    "TextComment": " Comment 1"
+// JSON-VEHICLES-INDEX-NEXT:                  }
+// JSON-VEHICLES-INDEX-NEXT:                ]
+// JSON-VEHICLES-INDEX-NEXT:              ]
+// JSON-VEHICLES-INDEX-NEXT:            },
+// JSON-VEHICLES-INDEX-NEXT:            "HasEnumMemberComments": true,
+// JSON-VEHICLES-INDEX-NEXT:            "Name": "Sedan",
+// JSON-VEHICLES-INDEX-NEXT:            "Value": "0"
+// JSON-VEHICLES-INDEX-NEXT:          },
+// JSON-VEHICLES-INDEX-NEXT:          {
+// JSON-VEHICLES-INDEX-NEXT:            "Description": {
+// JSON-VEHICLES-INDEX-NEXT:              "HasParagraphComments": true,
+// JSON-VEHICLES-INDEX-NEXT:              "ParagraphComments": [
+// JSON-VEHICLES-INDEX-NEXT:                [
+// JSON-VEHICLES-INDEX-NEXT:                  {
+// JSON-VEHICLES-INDEX-NEXT:                    "TextComment": " Comment 2"
+// JSON-VEHICLES-INDEX-NEXT:                  }
+// JSON-VEHICLES-INDEX-NEXT:                ]
+// JSON-VEHICLES-INDEX-NEXT:              ]
+// JSON-VEHICLES-INDEX-NEXT:            },
+// JSON-VEHICLES-INDEX-NEXT:            "HasEnumMemberComments": true,
+// JSON-VEHICLES-INDEX-NEXT:            "Name": "SUV",
+// JSON-VEHICLES-INDEX-NEXT:            "Value": "1"
+// JSON-VEHICLES-INDEX-NEXT:          },
+// JSON-VEHICLES-INDEX-NEXT:          {
+// JSON-VEHICLES-INDEX-NEXT:            "Name": "Pickup",
+// JSON-VEHICLES-INDEX-NEXT:            "Value": "2"
+// JSON-VEHICLES-INDEX-NEXT:          },
+// JSON-VEHICLES-INDEX-NEXT:          {
+// JSON-VEHICLES-INDEX-NEXT:            "Description": {
+// JSON-VEHICLES-INDEX-NEXT:              "HasParagraphComments": true,
+// JSON-VEHICLES-INDEX-NEXT:              "ParagraphComments": [
+// JSON-VEHICLES-INDEX-NEXT:                [
+// JSON-VEHICLES-INDEX-NEXT:                  {
+// JSON-VEHICLES-INDEX-NEXT:                    "TextComment": " Comment 4"
+// JSON-VEHICLES-INDEX-NEXT:                  }
+// JSON-VEHICLES-INDEX-NEXT:                ]
+// JSON-VEHICLES-INDEX-NEXT:              ]
+// JSON-VEHICLES-INDEX-NEXT:            },
+// JSON-VEHICLES-INDEX-NEXT:            "End": true,
+// JSON-VEHICLES-INDEX-NEXT:            "HasEnumMemberComments": true,
+// JSON-VEHICLES-INDEX-NEXT:            "Name": "Hatchback",
+// JSON-VEHICLES-INDEX-NEXT:            "Value": "3"
+// JSON-VEHICLES-INDEX-NEXT:          }
+// JSON-VEHICLES-INDEX-NEXT:        ],
+// JSON-VEHICLES-INDEX-NEXT:        "Name": "Car",
+// JSON-VEHICLES-INDEX-NEXT:        "Namespace": [
+// JSON-VEHICLES-INDEX-NEXT:          "Vehicles"
+// JSON-VEHICLES-INDEX-NEXT:        ],
+// JSON-VEHICLES-INDEX-NEXT:        "Scoped": false,
+// JSON-VEHICLES-INDEX-NEXT:        "USR": "{{[0-9A-F]*}}"
 // JSON-VEHICLES-INDEX-NEXT:      }
-// JSON-VEHICLES-INDEX-NEXT:    ],
-// JSON-VEHICLES-INDEX-NEXT:    "Name": "Car",
-// JSON-VEHICLES-INDEX-NEXT:    "Namespace": [
-// JSON-VEHICLES-INDEX-NEXT:      "Vehicles"
-// JSON-VEHICLES-INDEX-NEXT:    ],
-// JSON-VEHICLES-INDEX-NEXT:    "Scoped": false,
-// JSON-VEHICLES-INDEX-NEXT:    "USR": "{{[0-9A-F]*}}"
-// JSON-VEHICLES-INDEX-NEXT:  }

>From 86f8f090ddbac580dafa19923ded34cd799d78f8 Mon Sep 17 00:00:00 2001
From: Samrudh Nelli <samrudhnelli at gmail.com>
Date: Wed, 11 Mar 2026 02:20:38 +0530
Subject: [PATCH 39/39] fix json test

---
 clang-tools-extra/test/clang-doc/json/enum.cpp | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/clang-tools-extra/test/clang-doc/json/enum.cpp b/clang-tools-extra/test/clang-doc/json/enum.cpp
index 495caaee1a8a6..d60e9468738e3 100644
--- a/clang-tools-extra/test/clang-doc/json/enum.cpp
+++ b/clang-tools-extra/test/clang-doc/json/enum.cpp
@@ -116,7 +116,7 @@ enum Car {
 };
 } // namespace Vehicles
 
-// JSON-VEHICLES-INDEX-NEXT:    "DocumentationFileName": "index",
+// JSON-VEHICLES-INDEX-LABEL:   "DocumentationFileName": "index",
 // JSON-VEHICLES-INDEX-NEXT:    "Enums": [
 // JSON-VEHICLES-INDEX-NEXT:      {
 // JSON-VEHICLES-INDEX-NEXT:        "Description": {



More information about the cfe-commits mailing list