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&#39;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&#39;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:      }


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

Reply via email to