[clang-tools-extra] a9006ad - [Clang-doc] Display enum comments in HTML (#183085)
via cfe-commits
cfe-commits at lists.llvm.org
Wed Mar 11 08:35:33 PDT 2026
Author: Samrudh Nelli
Date: 2026-03-11T08:35:28-07:00
New Revision: a9006ada05d00e1be779f85110ce7eb6d47e6923
URL: https://github.com/llvm/llvm-project/commit/a9006ada05d00e1be779f85110ce7eb6d47e6923
DIFF: https://github.com/llvm/llvm-project/commit/a9006ada05d00e1be779f85110ce7eb6d47e6923.diff
LOG: [Clang-doc] Display enum comments in HTML (#183085)
Currently comments of enum variables are not displayed in HTML.
Add support to display the comments.
Added:
clang-tools-extra/test/clang-doc/json/enum.cpp
Modified:
clang-tools-extra/clang-doc/JSONGenerator.cpp
clang-tools-extra/clang-doc/assets/clang-doc-mustache.css
clang-tools-extra/clang-doc/assets/enum-template.mustache
clang-tools-extra/test/clang-doc/enum.cpp
Removed:
################################################################################
diff --git a/clang-tools-extra/clang-doc/JSONGenerator.cpp b/clang-tools-extra/clang-doc/JSONGenerator.cpp
index d710078993403..e768d25e38971 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;
@@ -375,6 +376,32 @@ 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())
+ 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, DescriptionObj);
+ // 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(DescriptionObj, TextCommentsArray, "ParagraphComments");
+ }
+ }
+ Obj["Description"] = std::move(DescriptionObj);
+ if (!Key.empty())
+ Obj[Key] = true;
+}
+
void JSONGenerator::serializeCommonAttributes(const Info &I,
json::Object &Obj) {
insertNonEmpty("Name", I.Name, Obj);
@@ -393,25 +420,7 @@ void JSONGenerator::serializeCommonAttributes(const Info &I,
Obj["Namespace"].getAsArray()->push_back(NS.Name);
}
- 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");
- }
- }
- 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) {
@@ -592,6 +601,8 @@ void JSONGenerator::serializeInfo(const EnumValueInfo &I, Object &Obj) {
Obj["ValueExpr"] = I.ValueExpr;
else
Obj["Value"] = I.Value;
+
+ serializeDescription(I.Description, Obj, "HasEnumMemberComments");
}
void JSONGenerator::serializeInfo(const EnumInfo &I, json::Object &Obj) {
@@ -607,8 +618,15 @@ void JSONGenerator::serializeInfo(const EnumInfo &I, json::Object &Obj) {
Obj["BaseType"] = BaseTypeVal;
}
- if (!I.Members.empty())
+ 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) {
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 d88f88cc30cee..60429dc6df9d3 100644
--- a/clang-tools-extra/clang-doc/assets/enum-template.mustache
+++ b/clang-tools-extra/clang-doc/assets/enum-template.mustache
@@ -15,6 +15,9 @@
<tr>
<th>Name</th>
<th>Value</th>
+ {{#HasComments}}
+ <th>Comments</th>
+ {{/HasComments}}
</tr>
{{#Members}}
<tr>
@@ -26,6 +29,25 @@
{{^Value}}
<td>{{ValueExpr}}</td>
{{/Value}}
+ {{#HasComments}}
+ <td>{{#HasEnumMemberComments}}
+ {{#Description}}
+ {{#BriefComments}}
+ {{#.}}
+ <p class="paragraph-container">{{TextComment}}</p>
+ {{/.}}
+ {{/BriefComments}}
+ {{#ParagraphComments}}
+ <p class="paragraph-container">
+ {{#.}}
+ {{TextComment}}<br>
+ {{/.}}
+ </p>
+ {{/ParagraphComments}}
+ {{/Description}}
+ {{/HasEnumMemberComments}}
+ {{^HasEnumMemberComments}} -- {{/HasEnumMemberComments}}</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..eec2bcb9f82e6 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
@@ -57,18 +56,34 @@ 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>
+// 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>
+// 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>
+// 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>
// HTML-INDEX-NEXT: </table>
@@ -77,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-62]] of file {{.*}}clang-tools-extra{{[\/]}}test{{[\/]}}clang-doc{{[\/]}}enum.cpp</p>
// HTML-INDEX-NEXT: </div>
// MD-MUSTACHE-INDEX: ## Enums
@@ -119,18 +134,34 @@ 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>
+// 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>
+// 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>
+// 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>
// HTML-INDEX-NEXT: </table>
@@ -139,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-64]] of file {{.*}}clang-tools-extra{{[\/]}}test{{[\/]}}clang-doc{{[\/]}}enum.cpp</p>
// HTML-INDEX-NEXT: </div>
typedef unsigned char uint8_t;
@@ -149,9 +180,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 |
@@ -170,18 +210,36 @@ 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>
+// 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>
+// 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>
+// 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>
// HTML-INDEX-NEXT: </table>
@@ -190,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-44]] 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>
/**
@@ -216,10 +274,16 @@ 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>
+// 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>
// HTML-INDEX-NEXT: </table>
@@ -228,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-32]] 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 {
@@ -241,9 +305,9 @@ 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
};
};
@@ -265,18 +329,34 @@ 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>
+// 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>
+// 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>
+// 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>
// HTML-PERM-NEXT: </table>
@@ -285,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-47]] 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>
@@ -319,18 +399,34 @@ 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>
+// 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>
+// 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>
+// 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>
// HTML-ANIMAL-NEXT: </table>
@@ -339,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-57]] of file {{.*}}enum.cpp</p>
// HTML-ANIMAL-NEXT: </div>
// HTML-ANIMAL-NEXT: </section>
@@ -372,7 +468,7 @@ enum Car {
Sedan, ///< Comment 1
SUV, ///< Comment 2
- Pickup, ///< Comment 3
+ Pickup,
Hatchback ///< Comment 4
};
} // namespace Vehicles
@@ -396,22 +492,39 @@ 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>
+// 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>
+// 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> -- </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>
+// 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>
// HTML-VEHICLES-NEXT: </table>
@@ -420,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-55]] 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
diff --git a/clang-tools-extra/test/clang-doc/json/enum.cpp b/clang-tools-extra/test/clang-doc/json/enum.cpp
new file mode 100644
index 0000000000000..442de78a03d77
--- /dev/null
+++ b/clang-tools-extra/test/clang-doc/json/enum.cpp
@@ -0,0 +1,201 @@
+// RUN: rm -rf %t && mkdir -p %t
+// RUN: clang-doc --output=%t --format=json --executor=standalone %s
+// RUN: FileCheck %s < %t/json/GlobalNamespace/index.json --check-prefix=JSON-INDEX
+// RUN: FileCheck %s < %t/json/Vehicles/index.json --check-prefix=JSON-VEHICLES-INDEX
+
+typedef unsigned char uint8_t;
+/**
+ * @brief Specify the size
+ */
+enum Size : uint8_t {
+ /// A pearl.
+ /// Pearls are quite small.
+ ///
+ /// Pearls are used in jewelry.
+ Small,
+
+ /// @brief A tennis ball.
+ Medium,
+
+ /// A football.
+ Large
+};
+
+// JSON-INDEX-LABEL: {
+// JSON-INDEX-NEXT: "DocumentationFileName": "index",
+// JSON-INDEX-NEXT: "Enums": [
+// JSON-INDEX-NEXT: {
+// JSON-INDEX-NEXT: "BaseType": {
+// JSON-INDEX-NEXT: "Name": "uint8_t",
+// JSON-INDEX-NEXT: "QualName": "uint8_t",
+// JSON-INDEX-NEXT: "USR": "0000000000000000000000000000000000000000"
+// JSON-INDEX-NEXT: },
+// JSON-INDEX-NEXT: "Description": {
+// JSON-INDEX-NEXT: "BriefComments": [
+// JSON-INDEX-NEXT: [
+// JSON-INDEX-NEXT: {
+// JSON-INDEX-NEXT: "TextComment": "Specify the size"
+// JSON-INDEX-NEXT: }
+// JSON-INDEX-NEXT: ]
+// JSON-INDEX-NEXT: ],
+// JSON-INDEX-NEXT: "HasBriefComments": true
+// JSON-INDEX-NEXT: },
+// JSON-INDEX-NEXT: "End": true,
+// JSON-INDEX-NEXT: "HasComments": true,
+// JSON-INDEX-NEXT: "InfoType": "enum",
+// JSON-INDEX-NEXT: "Location": {
+// JSON-INDEX-NEXT: "Filename": "{{.*}}enum.cpp",
+// JSON-INDEX-NEXT: "LineNumber": [[@LINE-38]]
+// JSON-INDEX-NEXT: },
+// JSON-INDEX-NEXT: "Members": [
+// JSON-INDEX-NEXT: {
+// JSON-INDEX-NEXT: "Description": {
+// JSON-INDEX-NEXT: "HasParagraphComments": true,
+// JSON-INDEX-NEXT: "ParagraphComments": [
+// JSON-INDEX-NEXT: [
+// JSON-INDEX-NEXT: {
+// JSON-INDEX-NEXT: "TextComment": "A pearl."
+// JSON-INDEX-NEXT: },
+// JSON-INDEX-NEXT: {
+// JSON-INDEX-NEXT: "TextComment": "Pearls are quite small."
+// JSON-INDEX-NEXT: }
+// JSON-INDEX-NEXT: ],
+// JSON-INDEX-NEXT: [
+// JSON-INDEX-NEXT: {
+// JSON-INDEX-NEXT: "TextComment": "Pearls are used in jewelry."
+// JSON-INDEX-NEXT: }
+// JSON-INDEX-NEXT: ]
+// JSON-INDEX-NEXT: ]
+// JSON-INDEX-NEXT: },
+// JSON-INDEX-NEXT: "HasEnumMemberComments": true,
+// JSON-INDEX-NEXT: "Name": "Small",
+// JSON-INDEX-NEXT: "Value": "0"
+// JSON-INDEX-NEXT: },
+// JSON-INDEX-NEXT: {
+// JSON-INDEX-NEXT: "Description": {
+// JSON-INDEX-NEXT: "BriefComments": [
+// JSON-INDEX-NEXT: [
+// JSON-INDEX-NEXT: {
+// JSON-INDEX-NEXT: "TextComment": "A tennis ball."
+// JSON-INDEX-NEXT: }
+// JSON-INDEX-NEXT: ]
+// JSON-INDEX-NEXT: ],
+// JSON-INDEX-NEXT: "HasBriefComments": true
+// JSON-INDEX-NEXT: },
+// JSON-INDEX-NEXT: "HasEnumMemberComments": true,
+// JSON-INDEX-NEXT: "Name": "Medium",
+// JSON-INDEX-NEXT: "Value": "1"
+// JSON-INDEX-NEXT: },
+// JSON-INDEX-NEXT: {
+// JSON-INDEX-NEXT: "Description": {
+// JSON-INDEX-NEXT: "HasParagraphComments": true,
+// JSON-INDEX-NEXT: "ParagraphComments": [
+// JSON-INDEX-NEXT: [
+// JSON-INDEX-NEXT: {
+// JSON-INDEX-NEXT: "TextComment": "A football."
+// JSON-INDEX-NEXT: }
+// JSON-INDEX-NEXT: ]
+// JSON-INDEX-NEXT: ]
+// JSON-INDEX-NEXT: },
+// JSON-INDEX-NEXT: "End": true,
+// JSON-INDEX-NEXT: "HasEnumMemberComments": true,
+// JSON-INDEX-NEXT: "Name": "Large",
+// JSON-INDEX-NEXT: "Value": "2"
+// JSON-INDEX-NEXT: }
+// JSON-INDEX-NEXT: ],
+// JSON-INDEX-NEXT: "Name": "Size",
+// JSON-INDEX-NEXT: "Scoped": false,
+// JSON-INDEX-NEXT: "USR": "{{[0-9A-F]*}}"
+// JSON-INDEX-NEXT: }
+
+namespace Vehicles {
+/**
+ * @brief specify type of car
+ */
+enum Car {
+ Sedan, ///< Comment 1
+ SUV, ///< Comment 2
+ Pickup,
+ Hatchback ///< Comment 4
+};
+} // namespace Vehicles
+
+// JSON-VEHICLES-INDEX-LABEL: "DocumentationFileName": "index",
+// JSON-VEHICLES-INDEX-NEXT: "Enums": [
+// JSON-VEHICLES-INDEX-NEXT: {
+// JSON-VEHICLES-INDEX-NEXT: "Description": {
+// JSON-VEHICLES-INDEX-NEXT: "BriefComments": [
+// JSON-VEHICLES-INDEX-NEXT: [
+// JSON-VEHICLES-INDEX-NEXT: {
+// JSON-VEHICLES-INDEX-NEXT: "TextComment": "specify type of car"
+// JSON-VEHICLES-INDEX-NEXT: }
+// JSON-VEHICLES-INDEX-NEXT: ]
+// JSON-VEHICLES-INDEX-NEXT: ],
+// JSON-VEHICLES-INDEX-NEXT: "HasBriefComments": true
+// JSON-VEHICLES-INDEX-NEXT: },
+// JSON-VEHICLES-INDEX-NEXT: "End": true,
+// JSON-VEHICLES-INDEX-NEXT: "HasComments": true,
+// JSON-VEHICLES-INDEX-NEXT: "InfoType": "enum",
+// JSON-VEHICLES-INDEX-NEXT: "Location": {
+// JSON-VEHICLES-INDEX-NEXT: "Filename": "{{.*}}enum.cpp",
+// JSON-VEHICLES-INDEX-NEXT: "LineNumber": [[@LINE-26]]
+// JSON-VEHICLES-INDEX-NEXT: },
+// JSON-VEHICLES-INDEX-NEXT: "Members": [
+// JSON-VEHICLES-INDEX-NEXT: {
+// JSON-VEHICLES-INDEX-NEXT: "Description": {
+// JSON-VEHICLES-INDEX-NEXT: "HasParagraphComments": true,
+// JSON-VEHICLES-INDEX-NEXT: "ParagraphComments": [
+// JSON-VEHICLES-INDEX-NEXT: [
+// JSON-VEHICLES-INDEX-NEXT: {
+// JSON-VEHICLES-INDEX-NEXT: "TextComment": "Comment 1"
+// JSON-VEHICLES-INDEX-NEXT: }
+// JSON-VEHICLES-INDEX-NEXT: ]
+// JSON-VEHICLES-INDEX-NEXT: ]
+// JSON-VEHICLES-INDEX-NEXT: },
+// JSON-VEHICLES-INDEX-NEXT: "HasEnumMemberComments": true,
+// JSON-VEHICLES-INDEX-NEXT: "Name": "Sedan",
+// JSON-VEHICLES-INDEX-NEXT: "Value": "0"
+// JSON-VEHICLES-INDEX-NEXT: },
+// JSON-VEHICLES-INDEX-NEXT: {
+// JSON-VEHICLES-INDEX-NEXT: "Description": {
+// JSON-VEHICLES-INDEX-NEXT: "HasParagraphComments": true,
+// JSON-VEHICLES-INDEX-NEXT: "ParagraphComments": [
+// JSON-VEHICLES-INDEX-NEXT: [
+// JSON-VEHICLES-INDEX-NEXT: {
+// JSON-VEHICLES-INDEX-NEXT: "TextComment": "Comment 2"
+// JSON-VEHICLES-INDEX-NEXT: }
+// JSON-VEHICLES-INDEX-NEXT: ]
+// JSON-VEHICLES-INDEX-NEXT: ]
+// JSON-VEHICLES-INDEX-NEXT: },
+// JSON-VEHICLES-INDEX-NEXT: "HasEnumMemberComments": true,
+// JSON-VEHICLES-INDEX-NEXT: "Name": "SUV",
+// JSON-VEHICLES-INDEX-NEXT: "Value": "1"
+// JSON-VEHICLES-INDEX-NEXT: },
+// JSON-VEHICLES-INDEX-NEXT: {
+// JSON-VEHICLES-INDEX-NEXT: "Name": "Pickup",
+// JSON-VEHICLES-INDEX-NEXT: "Value": "2"
+// JSON-VEHICLES-INDEX-NEXT: },
+// JSON-VEHICLES-INDEX-NEXT: {
+// JSON-VEHICLES-INDEX-NEXT: "Description": {
+// JSON-VEHICLES-INDEX-NEXT: "HasParagraphComments": true,
+// JSON-VEHICLES-INDEX-NEXT: "ParagraphComments": [
+// JSON-VEHICLES-INDEX-NEXT: [
+// JSON-VEHICLES-INDEX-NEXT: {
+// JSON-VEHICLES-INDEX-NEXT: "TextComment": "Comment 4"
+// JSON-VEHICLES-INDEX-NEXT: }
+// JSON-VEHICLES-INDEX-NEXT: ]
+// JSON-VEHICLES-INDEX-NEXT: ]
+// JSON-VEHICLES-INDEX-NEXT: },
+// JSON-VEHICLES-INDEX-NEXT: "End": true,
+// JSON-VEHICLES-INDEX-NEXT: "HasEnumMemberComments": true,
+// JSON-VEHICLES-INDEX-NEXT: "Name": "Hatchback",
+// JSON-VEHICLES-INDEX-NEXT: "Value": "3"
+// JSON-VEHICLES-INDEX-NEXT: }
+// JSON-VEHICLES-INDEX-NEXT: ],
+// JSON-VEHICLES-INDEX-NEXT: "Name": "Car",
+// JSON-VEHICLES-INDEX-NEXT: "Namespace": [
+// JSON-VEHICLES-INDEX-NEXT: "Vehicles"
+// JSON-VEHICLES-INDEX-NEXT: ],
+// JSON-VEHICLES-INDEX-NEXT: "Scoped": false,
+// JSON-VEHICLES-INDEX-NEXT: "USR": "{{[0-9A-F]*}}"
+// JSON-VEHICLES-INDEX-NEXT: }
More information about the cfe-commits
mailing list