[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 12:52:38 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/35] [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/35] 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/35] 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/35] 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/35] 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/35] 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/35] 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/35] 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/35] 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/35] 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/35] 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/35] 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/35] 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/35] 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/35] 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/35] 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/35] 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/35] 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/35] 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/35] 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/35] 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/35] 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/35] 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/35] 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/35] 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/35] 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/35] 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/35] 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/35] 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/35] 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/35] 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/35] 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/35] [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/35] 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/35] 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());
}
}
More information about the cfe-commits
mailing list