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: } _______________________________________________ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
