https://github.com/SamrudhNelli created https://github.com/llvm/llvm-project/pull/183754
Display comments and values using Github Flavoured Markdown, contrary to the common mark, since it helps easily create a table. >From 41b5950dec84174686847b8d884667cee041dd44 Mon Sep 17 00:00:00 2001 From: Samrudh Nelli <[email protected]> Date: Tue, 24 Feb 2026 01:05:44 +0530 Subject: [PATCH 1/2] [clang-doc] Display enum type along with enum name in HTML view (#181347) Displays enum type along with name. For named variables Previous output : enum XYZ Current output : enum XYZ : unsigned int For unnamed variables Previous output : enum Current output : enum : unsigned int Fixes #166652 --- clang-tools-extra/clang-doc/MDGenerator.cpp | 11 +- clang-tools-extra/clang-doc/Serialize.cpp | 4 +- .../clang-doc/assets/enum-template.mustache | 2 +- clang-tools-extra/test/clang-doc/enum.cpp | 385 +++++++++++++----- 4 files changed, 291 insertions(+), 111 deletions(-) diff --git a/clang-tools-extra/clang-doc/MDGenerator.cpp b/clang-tools-extra/clang-doc/MDGenerator.cpp index fcb75af80f9e9..851b4e084ef23 100644 --- a/clang-tools-extra/clang-doc/MDGenerator.cpp +++ b/clang-tools-extra/clang-doc/MDGenerator.cpp @@ -156,11 +156,14 @@ static void writeNameLink(const StringRef &CurrentPath, const Reference &R, static void genMarkdown(const ClangDocContext &CDCtx, const EnumInfo &I, llvm::raw_ostream &OS) { + OS << "| enum "; if (I.Scoped) - writeLine("| enum class " + I.Name + " |", OS); - else - writeLine("| enum " + I.Name + " |", OS); - writeLine("--", OS); + OS << "class "; + OS << (I.Name.empty() ? "(unnamed)" : StringRef(I.Name)) << " "; + if (I.BaseType && !I.BaseType->Type.QualName.empty()) { + OS << ": " << I.BaseType->Type.QualName << " "; + } + OS << "|\n\n" << "--\n\n"; std::string Buffer; llvm::raw_string_ostream Members(Buffer); diff --git a/clang-tools-extra/clang-doc/Serialize.cpp b/clang-tools-extra/clang-doc/Serialize.cpp index 39c0cb378b0f5..f07187132cc07 100644 --- a/clang-tools-extra/clang-doc/Serialize.cpp +++ b/clang-tools-extra/clang-doc/Serialize.cpp @@ -1207,8 +1207,8 @@ emitInfo(const EnumDecl *D, const FullComment *FC, Location Loc, return {}; Enum.Scoped = D->isScoped(); - if (D->isFixed()) { - auto Name = D->getIntegerType().getAsString(); + if (const TypeSourceInfo *TSI = D->getIntegerTypeSourceInfo()) { + auto Name = TSI->getType().getAsString(); Enum.BaseType = TypeInfo(Name, Name); } parseEnumerators(Enum, D); diff --git a/clang-tools-extra/clang-doc/assets/enum-template.mustache b/clang-tools-extra/clang-doc/assets/enum-template.mustache index 7434b7bfce347..d88f88cc30cee 100644 --- a/clang-tools-extra/clang-doc/assets/enum-template.mustache +++ b/clang-tools-extra/clang-doc/assets/enum-template.mustache @@ -7,7 +7,7 @@ }} <div id="{{USR}}" class="delimiter-container"> <div> - <pre><code class="language-cpp code-clang-doc">enum {{Name}}</code></pre> + <pre><code class="language-cpp code-clang-doc">enum {{#Scoped}}class {{/Scoped}}{{Name}}{{^Name}}(unnamed){{/Name}}{{#BaseType}} : {{QualName}}{{/BaseType}}</code></pre> </div> {{! Enum Values }} <table class="table-wrapper"> diff --git a/clang-tools-extra/test/clang-doc/enum.cpp b/clang-tools-extra/test/clang-doc/enum.cpp index 6e11bbf065f25..00815ff468780 100644 --- a/clang-tools-extra/test/clang-doc/enum.cpp +++ b/clang-tools-extra/test/clang-doc/enum.cpp @@ -5,12 +5,16 @@ // RUN: FileCheck %s < %t/html/GlobalNamespace/index.html --check-prefix=HTML-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 +// RUN: FileCheck %s < %t/html/GlobalNamespace/_ZTV15FilePermissions.html --check-prefix=HTML-PERM // RUN: FileCheck %s < %t/html/Vehicles/index.html --check-prefix=HTML-VEHICLES-LINE // RUN: FileCheck %s < %t/html/Vehicles/index.html --check-prefix=HTML-VEHICLES // RUN: FileCheck %s < %t/GlobalNamespace/index.md --check-prefix=MD-INDEX-LINE // RUN: FileCheck %s < %t/GlobalNamespace/index.md --check-prefix=MD-INDEX // RUN: FileCheck %s < %t/GlobalNamespace/Animals.md --check-prefix=MD-ANIMAL-LINE // RUN: FileCheck %s < %t/GlobalNamespace/Animals.md --check-prefix=MD-ANIMAL +// RUN: FileCheck %s < %t/GlobalNamespace/FilePermissions.md --check-prefix=MD-PERM-LINE +// RUN: FileCheck %s < %t/GlobalNamespace/FilePermissions.md --check-prefix=MD-PERM // RUN: FileCheck %s < %t/Vehicles/index.md --check-prefix=MD-VEHICLES-LINE // RUN: FileCheck %s < %t/Vehicles/index.md --check-prefix=MD-VEHICLES @@ -35,29 +39,37 @@ enum Color { // MD-INDEX: | Blue | // MD-INDEX: **brief** For specifying RGB colors -// HTML-INDEX: <div> -// HTML-INDEX: <pre><code class="language-cpp code-clang-doc">enum Color</code></pre> -// HTML-INDEX: </div> -// HTML-INDEX: <table class="table-wrapper"> -// HTML-INDEX: <tbody> -// HTML-INDEX: <tr> -// HTML-INDEX: <th>Name</th> -// HTML-INDEX: <th>Value</th> -// HTML-INDEX: </tr> -// HTML-INDEX: <tr> -// HTML-INDEX: <td>Red</td> -// HTML-INDEX: <td>0</td> -// HTML-INDEX: </tr> -// HTML-INDEX: <tr> -// HTML-INDEX: <td>Green</td> -// HTML-INDEX: <td>1</td> -// HTML-INDEX: </tr> -// HTML-INDEX: <tr> -// HTML-INDEX: <td>Blue</td> -// HTML-INDEX: <td>2</td> -// HTML-INDEX: </tr> -// HTML-INDEX: </tbody> -// HTML-INDEX: </table> +// HTML-INDEX-LABEL: <div id="{{([0-9A-F]{40})}}" class="delimiter-container"> +// HTML-INDEX-NEXT: <div> +// HTML-INDEX-NEXT: <pre><code class="language-cpp code-clang-doc">enum Color</code></pre> +// HTML-INDEX-NEXT: </div> +// HTML-INDEX-NEXT: <table class="table-wrapper"> +// HTML-INDEX-NEXT: <tbody> +// HTML-INDEX-NEXT: <tr> +// HTML-INDEX-NEXT: <th>Name</th> +// HTML-INDEX-NEXT: <th>Value</th> +// HTML-INDEX-NEXT: </tr> +// HTML-INDEX-NEXT: <tr> +// HTML-INDEX-NEXT: <td>Red</td> +// HTML-INDEX-NEXT: <td>0</td> +// HTML-INDEX-NEXT: </tr> +// HTML-INDEX-NEXT: <tr> +// HTML-INDEX-NEXT: <td>Green</td> +// HTML-INDEX-NEXT: <td>1</td> +// HTML-INDEX-NEXT: </tr> +// HTML-INDEX-NEXT: <tr> +// HTML-INDEX-NEXT: <td>Blue</td> +// HTML-INDEX-NEXT: <td>2</td> +// HTML-INDEX-NEXT: </tr> +// HTML-INDEX-NEXT: </tbody> +// 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: </div> +// HTML-INDEX-NEXT: </div> +// HTML-INDEX-NEXT: <p>Defined at line [[@LINE-45]] of file {{.*}}clang-tools-extra{{[\/]}}test{{[\/]}}clang-doc{{[\/]}}enum.cpp</p> +// HTML-INDEX-NEXT: </div> /** * @brief Shape Types @@ -80,30 +92,184 @@ enum class Shapes { // MD-INDEX: | Triangle | // MD-INDEX: **brief** Shape Types -// COM: FIXME: Serialize "enum class" in template -// HTML-INDEX: <div> -// HTML-INDEX: <pre><code class="language-cpp code-clang-doc">enum Shapes</code></pre> -// HTML-INDEX: </div> -// HTML-INDEX: <table class="table-wrapper"> -// HTML-INDEX: <tbody> -// HTML-INDEX: <tr> -// HTML-INDEX: <th>Name</th> -// HTML-INDEX: <th>Value</th> -// HTML-INDEX: </tr> -// HTML-INDEX: <tr> -// HTML-INDEX: <td>Circle</td> -// HTML-INDEX: <td>0</td> -// HTML-INDEX: </tr> -// HTML-INDEX: <tr> -// HTML-INDEX: <td>Rectangle</td> -// HTML-INDEX: <td>1</td> -// HTML-INDEX: </tr> -// HTML-INDEX: <tr> -// HTML-INDEX: <td>Triangle</td> -// HTML-INDEX: <td>2</td> -// HTML-INDEX: </tr> -// HTML-INDEX: </tbody> -// HTML-INDEX: </table> +// HTML-INDEX-LABEL: <div id="{{([0-9A-F]{40})}}" class="delimiter-container"> +// HTML-INDEX-NEXT: <div> +// HTML-INDEX-NEXT: <pre><code class="language-cpp code-clang-doc">enum class Shapes</code></pre> +// HTML-INDEX-NEXT: </div> +// HTML-INDEX-NEXT: <table class="table-wrapper"> +// HTML-INDEX-NEXT: <tbody> +// HTML-INDEX-NEXT: <tr> +// HTML-INDEX-NEXT: <th>Name</th> +// HTML-INDEX-NEXT: <th>Value</th> +// HTML-INDEX-NEXT: </tr> +// HTML-INDEX-NEXT: <tr> +// HTML-INDEX-NEXT: <td>Circle</td> +// HTML-INDEX-NEXT: <td>0</td> +// HTML-INDEX-NEXT: </tr> +// HTML-INDEX-NEXT: <tr> +// HTML-INDEX-NEXT: <td>Rectangle</td> +// HTML-INDEX-NEXT: <td>1</td> +// HTML-INDEX-NEXT: </tr> +// HTML-INDEX-NEXT: <tr> +// HTML-INDEX-NEXT: <td>Triangle</td> +// HTML-INDEX-NEXT: <td>2</td> +// HTML-INDEX-NEXT: </tr> +// HTML-INDEX-NEXT: </tbody> +// 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: </div> +// HTML-INDEX-NEXT: </div> +// HTML-INDEX-NEXT: <p>Defined at line [[@LINE-47]] of file {{.*}}clang-tools-extra{{[\/]}}test{{[\/]}}clang-doc{{[\/]}}enum.cpp</p> +// HTML-INDEX-NEXT: </div> + +typedef unsigned char uint8_t; +/** + * @brief Specify the size + */ +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 +}; + +// MD-INDEX: | enum Size : uint8_t | +// MD-INDEX: -- +// 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"> +// HTML-INDEX-NEXT: <div> +// HTML-INDEX-NEXT: <pre><code class="language-cpp code-clang-doc">enum Size : uint8_t</code></pre> +// HTML-INDEX-NEXT: </div> +// HTML-INDEX-NEXT: <table class="table-wrapper"> +// HTML-INDEX-NEXT: <tbody> +// HTML-INDEX-NEXT: <tr> +// HTML-INDEX-NEXT: <th>Name</th> +// HTML-INDEX-NEXT: <th>Value</th> +// HTML-INDEX-NEXT: </tr> +// HTML-INDEX-NEXT: <tr> +// HTML-INDEX-NEXT: <td>Small</td> +// HTML-INDEX-NEXT: <td>0</td> +// HTML-INDEX-NEXT: </tr> +// HTML-INDEX-NEXT: <tr> +// HTML-INDEX-NEXT: <td>Medium</td> +// HTML-INDEX-NEXT: <td>1</td> +// HTML-INDEX-NEXT: </tr> +// HTML-INDEX-NEXT: <tr> +// HTML-INDEX-NEXT: <td>Large</td> +// HTML-INDEX-NEXT: <td>2</td> +// HTML-INDEX-NEXT: </tr> +// HTML-INDEX-NEXT: </tbody> +// 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: </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: </div> + +/** + * @brief Very long number + */ +enum : long long { + // 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> + BigVal = 999999999999 ///< A very large value +}; + +// MD-INDEX: | enum (unnamed) : long long | +// MD-INDEX: -- +// MD-INDEX: | BigVal | +// MD-INDEX: **brief** Very long number + +// HTML-INDEX-LABEL: <div id="{{([0-9A-F]{40})}}" class="delimiter-container"> +// HTML-INDEX-NEXT: <div> +// HTML-INDEX-NEXT: <pre><code class="language-cpp code-clang-doc">enum (unnamed) : long long</code></pre> +// HTML-INDEX-NEXT: </div> +// HTML-INDEX-NEXT: <table class="table-wrapper"> +// HTML-INDEX-NEXT: <tbody> +// HTML-INDEX-NEXT: <tr> +// HTML-INDEX-NEXT: <th>Name</th> +// HTML-INDEX-NEXT: <th>Value</th> +// HTML-INDEX-NEXT: </tr> +// HTML-INDEX-NEXT: <tr> +// HTML-INDEX-NEXT: <td>BigVal</td> +// HTML-INDEX-NEXT: <td>999999999999</td> +// HTML-INDEX-NEXT: </tr> +// HTML-INDEX-NEXT: </tbody> +// 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: </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: </div> + +class FilePermissions { +// 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> +public: + /** + * @brief File permission flags + */ + 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 + }; +}; + +// MD-PERM: | enum (unnamed) | +// MD-PERM: -- +// MD-PERM: | Read | +// MD-PERM: | Write | +// MD-PERM: | Execute | +// MD-PERM: **brief** File permission flags + +// HTML-PERM-LABEL: <section id="Enums" class="section-container"> +// HTML-PERM-NEXT: <h2>Enumerations</h2> +// HTML-PERM-NEXT: <div id="{{([0-9A-F]{40})}}" class="delimiter-container"> +// HTML-PERM-NEXT: <div> +// HTML-PERM-NEXT: <pre><code class="language-cpp code-clang-doc">enum (unnamed)</code></pre> +// HTML-PERM-NEXT: </div> +// HTML-PERM-NEXT: <table class="table-wrapper"> +// HTML-PERM-NEXT: <tbody> +// HTML-PERM-NEXT: <tr> +// HTML-PERM-NEXT: <th>Name</th> +// HTML-PERM-NEXT: <th>Value</th> +// HTML-PERM-NEXT: </tr> +// HTML-PERM-NEXT: <tr> +// HTML-PERM-NEXT: <td>Read</td> +// HTML-PERM-NEXT: <td>1</td> +// HTML-PERM-NEXT: </tr> +// HTML-PERM-NEXT: <tr> +// HTML-PERM-NEXT: <td>Write</td> +// HTML-PERM-NEXT: <td>2</td> +// HTML-PERM-NEXT: </tr> +// HTML-PERM-NEXT: <tr> +// HTML-PERM-NEXT: <td>Execute</td> +// HTML-PERM-NEXT: <td>4</td> +// HTML-PERM-NEXT: </tr> +// HTML-PERM-NEXT: </tbody> +// 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: </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: </div> +// HTML-PERM-NEXT: </section> // COM: FIXME: Add enums declared inside of classes to class template class Animals { @@ -122,11 +288,11 @@ class Animals { }; }; -// HTML-ANIMAL: <section id="Enums" class="section-container"> -// HTML-ANIMAL-NEXT: <h2>Enumerations</h2> -// HTML-ANIMAL-NEXT: <div id="{{([0-9A-F]{40})}}" class="delimiter-container"> +// HTML-ANIMAL-LABEL: <section id="Enums" class="section-container"> +// HTML-ANIMAL-NEXT: <h2>Enumerations</h2> +// HTML-ANIMAL-NEXT: <div id="{{([0-9A-F]{40})}}" class="delimiter-container"> // HTML-ANIMAL-NEXT: <div> -// HTML-ANIMAL-NEXT: <pre><code class="language-cpp code-clang-doc">enum AnimalType</code></pre> +// HTML-ANIMAL-NEXT: <pre><code class="language-cpp code-clang-doc">enum AnimalType</code></pre> // HTML-ANIMAL-NEXT: </div> // HTML-ANIMAL-NEXT: <table class="table-wrapper"> // HTML-ANIMAL-NEXT: <tbody> @@ -153,9 +319,9 @@ 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 116 of file {{.*}}enum.cpp</p> -// HTML-ANIMAL-NEXT: </div> -// HTML-ANIMAL-NEXT: </section> +// HTML-ANIMAL-NEXT: <p>Defined at line [[@LINE-40]] of file {{.*}}enum.cpp</p> +// HTML-ANIMAL-NEXT: </div> +// HTML-ANIMAL-NEXT: </section> // MD-ANIMAL: # class Animals // MD-ANIMAL: ## Enums @@ -191,33 +357,41 @@ enum Car { // MD-VEHICLES: | Hatchback | // MD-VEHICLES: **brief** specify type of car -// HTML-VEHICLES: <div> -// HTML-VEHICLES: <pre><code class="language-cpp code-clang-doc">enum Car</code></pre> -// HTML-VEHICLES: </div> -// HTML-VEHICLES: <table class="table-wrapper"> -// HTML-VEHICLES: <tbody> -// HTML-VEHICLES: <tr> -// HTML-VEHICLES: <th>Name</th> -// HTML-VEHICLES: <th>Value</th> -// HTML-VEHICLES: </tr> -// HTML-VEHICLES: <tr> -// HTML-VEHICLES: <td>Sedan</td> -// HTML-VEHICLES: <td>0</td> -// HTML-VEHICLES: </tr> -// HTML-VEHICLES: <tr> -// HTML-VEHICLES: <td>SUV</td> -// HTML-VEHICLES: <td>1</td> -// HTML-VEHICLES: </tr> -// HTML-VEHICLES: <tr> -// HTML-VEHICLES: <td>Pickup</td> -// HTML-VEHICLES: <td>2</td> -// HTML-VEHICLES: </tr> -// HTML-VEHICLES: <tr> -// HTML-VEHICLES: <td>Hatchback</td> -// HTML-VEHICLES: <td>3</td> -// HTML-VEHICLES: </tr> -// HTML-VEHICLES: </tbody> -// HTML-VEHICLES: </table> +// HTML-VEHICLES-LABEL: <div id="{{([0-9A-F]{40})}}" class="delimiter-container"> +// HTML-VEHICLES-NEXT: <div> +// HTML-VEHICLES-NEXT: <pre><code class="language-cpp code-clang-doc">enum Car</code></pre> +// HTML-VEHICLES-NEXT: </div> +// HTML-VEHICLES-NEXT: <table class="table-wrapper"> +// HTML-VEHICLES-NEXT: <tbody> +// HTML-VEHICLES-NEXT: <tr> +// HTML-VEHICLES-NEXT: <th>Name</th> +// HTML-VEHICLES-NEXT: <th>Value</th> +// HTML-VEHICLES-NEXT: </tr> +// HTML-VEHICLES-NEXT: <tr> +// HTML-VEHICLES-NEXT: <td>Sedan</td> +// HTML-VEHICLES-NEXT: <td>0</td> +// HTML-VEHICLES-NEXT: </tr> +// HTML-VEHICLES-NEXT: <tr> +// HTML-VEHICLES-NEXT: <td>SUV</td> +// HTML-VEHICLES-NEXT: <td>1</td> +// HTML-VEHICLES-NEXT: </tr> +// HTML-VEHICLES-NEXT: <tr> +// HTML-VEHICLES-NEXT: <td>Pickup</td> +// HTML-VEHICLES-NEXT: <td>2</td> +// HTML-VEHICLES-NEXT: </tr> +// HTML-VEHICLES-NEXT: <tr> +// HTML-VEHICLES-NEXT: <td>Hatchback</td> +// HTML-VEHICLES-NEXT: <td>3</td> +// HTML-VEHICLES-NEXT: </tr> +// HTML-VEHICLES-NEXT: </tbody> +// 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: </div> +// HTML-VEHICLES-NEXT: </div> +// HTML-VEHICLES-NEXT: <p>Defined at line [[@LINE-54]] of file {{.*}}clang-tools-extra{{[\/]}}test{{[\/]}}clang-doc{{[\/]}}enum.cpp</p> +// HTML-VEHICLES-NEXT: </div> enum ColorUserSpecified { RedUserSpecified = 'A', @@ -231,26 +405,29 @@ enum ColorUserSpecified { // MD-INDEX: | GreenUserSpecified | // MD-INDEX: | BlueUserSpecified | -// HTML-INDEX: <div> -// HTML-INDEX: <pre><code class="language-cpp code-clang-doc">enum ColorUserSpecified</code></pre> -// HTML-INDEX: </div> -// HTML-INDEX: <table class="table-wrapper"> -// HTML-INDEX: <tbody> -// HTML-INDEX: <tr> -// HTML-INDEX: <th>Name</th> -// HTML-INDEX: <th>Value</th> -// HTML-INDEX: </tr> -// HTML-INDEX: <tr> -// HTML-INDEX: <td>RedUserSpecified</td> -// HTML-INDEX: <td>'A'</td> -// HTML-INDEX: </tr> -// HTML-INDEX: <tr> -// HTML-INDEX: <td>GreenUserSpecified</td> -// HTML-INDEX: <td>2</td> -// HTML-INDEX: </tr> -// HTML-INDEX: <tr> -// HTML-INDEX: <td>BlueUserSpecified</td> -// HTML-INDEX: <td>'C'</td> -// HTML-INDEX: </tr> -// HTML-INDEX: </tbody> -// HTML-INDEX: </table> +// HTML-INDEX-LABEL: <div id="{{([0-9A-F]{40})}}" class="delimiter-container"> +// HTML-INDEX-NEXT: <div> +// HTML-INDEX-NEXT: <pre><code class="language-cpp code-clang-doc">enum ColorUserSpecified</code></pre> +// HTML-INDEX-NEXT: </div> +// HTML-INDEX-NEXT: <table class="table-wrapper"> +// HTML-INDEX-NEXT: <tbody> +// HTML-INDEX-NEXT: <tr> +// HTML-INDEX-NEXT: <th>Name</th> +// HTML-INDEX-NEXT: <th>Value</th> +// HTML-INDEX-NEXT: </tr> +// HTML-INDEX-NEXT: <tr> +// HTML-INDEX-NEXT: <td>RedUserSpecified</td> +// HTML-INDEX-NEXT: <td>'A'</td> +// HTML-INDEX-NEXT: </tr> +// HTML-INDEX-NEXT: <tr> +// HTML-INDEX-NEXT: <td>GreenUserSpecified</td> +// HTML-INDEX-NEXT: <td>2</td> +// HTML-INDEX-NEXT: </tr> +// HTML-INDEX-NEXT: <tr> +// HTML-INDEX-NEXT: <td>BlueUserSpecified</td> +// HTML-INDEX-NEXT: <td>'C'</td> +// 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: </div> >From f01e99c8692435817da96059281184cd48f79327 Mon Sep 17 00:00:00 2001 From: Samrudh Nelli <[email protected]> Date: Fri, 27 Feb 2026 21:07:37 +0530 Subject: [PATCH 2/2] display in a table format --- clang-tools-extra/clang-doc/MDGenerator.cpp | 55 +++++++++++++++++++-- clang-tools-extra/test/clang-doc/enum.cpp | 49 +++++++++--------- 2 files changed, 76 insertions(+), 28 deletions(-) diff --git a/clang-tools-extra/clang-doc/MDGenerator.cpp b/clang-tools-extra/clang-doc/MDGenerator.cpp index 851b4e084ef23..665c86bfa2016 100644 --- a/clang-tools-extra/clang-doc/MDGenerator.cpp +++ b/clang-tools-extra/clang-doc/MDGenerator.cpp @@ -67,6 +67,30 @@ 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; + bool First = true; + while (Q.size()) { + Comment = Q.front(); + Q.pop(); + if (!Comment->Text.empty()) + { + if (!First) + OS << "<br>"; + OS << Comment->Text; + First = false; + } + 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) { @@ -163,13 +187,36 @@ static void genMarkdown(const ClangDocContext &CDCtx, const EnumInfo &I, if (I.BaseType && !I.BaseType->Type.QualName.empty()) { OS << ": " << I.BaseType->Type.QualName << " "; } - OS << "|\n\n" << "--\n\n"; + OS << "|\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"; + Members << "| Name | Value |"; + if (!I.Members.empty()) { + bool HasComments = false; + for (const auto &Member : I.Members) { + if (!Member.Description.empty()) { + HasComments = true; + Members << " Comments |"; + break; + } + } + Members << "\n"; + Members << "|:-:|:-:|"; + if (HasComments) + Members << ":-:|"; + Members << "\n"; + for (const auto &N : I.Members) { + Members << "| " << N.Name << " "; + if (!N.Value.empty()) + Members << "| " << N.Value << " "; + if (HasComments) { + std::string RawComment = StringRef(genRawText(N.Description)).trim().str(); + Members << "| " << (RawComment.empty() ? "--" : RawComment) << " "; + } + Members << "|\n"; + } + } writeLine(Members.str(), OS); maybeWriteSourceFileRef(OS, CDCtx, I.DefLoc); diff --git a/clang-tools-extra/test/clang-doc/enum.cpp b/clang-tools-extra/test/clang-doc/enum.cpp index 00815ff468780..8cd3b88de52c4 100644 --- a/clang-tools-extra/test/clang-doc/enum.cpp +++ b/clang-tools-extra/test/clang-doc/enum.cpp @@ -34,9 +34,9 @@ enum Color { // MD-INDEX: ## Enums // MD-INDEX: | enum Color | // MD-INDEX: -- -// MD-INDEX: | Red | -// MD-INDEX: | Green | -// MD-INDEX: | Blue | +// MD-INDEX: | Red | 0 | Comment 1 | +// MD-INDEX: | Green | Comment 2 | +// MD-INDEX: | Blue | Comment 3 | // MD-INDEX: **brief** For specifying RGB colors // HTML-INDEX-LABEL: <div id="{{([0-9A-F]{40})}}" class="delimiter-container"> @@ -85,11 +85,12 @@ enum class Shapes { /// Comment 3 Triangle }; + // MD-INDEX: | enum class Shapes | // MD-INDEX: -- -// MD-INDEX: | Circle | -// MD-INDEX: | Rectangle | -// MD-INDEX: | Triangle | +// 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"> @@ -121,7 +122,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-47]] of file {{.*}}clang-tools-extra{{[\/]}}test{{[\/]}}clang-doc{{[\/]}}enum.cpp</p> +// HTML-INDEX-NEXT: <p>Defined at line [[@LINE-48]] of file {{.*}}clang-tools-extra{{[\/]}}test{{[\/]}}clang-doc{{[\/]}}enum.cpp</p> // HTML-INDEX-NEXT: </div> typedef unsigned char uint8_t; @@ -138,9 +139,9 @@ enum Size : uint8_t { // MD-INDEX: | enum Size : uint8_t | // MD-INDEX: -- -// MD-INDEX: | Small | -// MD-INDEX: | Medium | -// MD-INDEX: | Large | +// 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"> @@ -186,7 +187,7 @@ enum : long long { // MD-INDEX: | enum (unnamed) : long long | // MD-INDEX: -- -// MD-INDEX: | BigVal | +// 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"> @@ -231,9 +232,9 @@ class FilePermissions { // MD-PERM: | enum (unnamed) | // MD-PERM: -- -// MD-PERM: | Read | -// MD-PERM: | Write | -// MD-PERM: | Execute | +// 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"> @@ -327,9 +328,9 @@ class Animals { // MD-ANIMAL: ## Enums // MD-ANIMAL: | enum AnimalType | // MD-ANIMAL: -- -// MD-ANIMAL: | Dog | -// MD-ANIMAL: | Cat | -// MD-ANIMAL: | Iguana | +// 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 namespace Vehicles { @@ -351,10 +352,10 @@ 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: | 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"> @@ -401,9 +402,9 @@ enum ColorUserSpecified { // MD-INDEX: | enum ColorUserSpecified | // MD-INDEX: -- -// MD-INDEX: | RedUserSpecified | -// MD-INDEX: | GreenUserSpecified | -// MD-INDEX: | BlueUserSpecified | +// 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> _______________________________________________ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
