https://github.com/SamrudhNelli updated https://github.com/llvm/llvm-project/pull/183085
>From 7e5abbeac7c100a07854af63402fcdaae740fa1e Mon Sep 17 00:00:00 2001 From: Samrudh Nelli <[email protected]> Date: Tue, 24 Feb 2026 21:10:19 +0530 Subject: [PATCH 01/12] [Clang-doc] Display enum comments and member values in html/md --- clang-tools-extra/clang-doc/JSONGenerator.cpp | 16 ++++++++++ clang-tools-extra/clang-doc/MDGenerator.cpp | 30 +++++++++++++++++-- .../clang-doc/assets/enum-template.mustache | 2 ++ 3 files changed, 46 insertions(+), 2 deletions(-) diff --git a/clang-tools-extra/clang-doc/JSONGenerator.cpp b/clang-tools-extra/clang-doc/JSONGenerator.cpp index 5051e7e6e690d..65a9a6bb94e04 100644 --- a/clang-tools-extra/clang-doc/JSONGenerator.cpp +++ b/clang-tools-extra/clang-doc/JSONGenerator.cpp @@ -554,6 +554,22 @@ static void serializeInfo(const EnumValueInfo &I, Object &Obj) { Obj["ValueExpr"] = I.ValueExpr; else Obj["Value"] = I.Value; + if (!I.Description.empty()) { + json::Value CommentsArray = Array(); + auto &CommentsArrayRef = *CommentsArray.getAsArray(); + Object TempObj, ChildJson; + for (const auto &Child : I.Description) { + for (const auto &CI : Child.Children) { + ChildJson = serializeComment(*CI, TempObj); + if (!ChildJson.empty()) { + CommentsArrayRef.push_back(std::move(ChildJson)); + } + } + } + if (!CommentsArrayRef.empty()) { + Obj["Description"] = CommentsArray; + } + } } static void serializeInfo(const EnumInfo &I, json::Object &Obj, diff --git a/clang-tools-extra/clang-doc/MDGenerator.cpp b/clang-tools-extra/clang-doc/MDGenerator.cpp index fcb75af80f9e9..7c01ae820b286 100644 --- a/clang-tools-extra/clang-doc/MDGenerator.cpp +++ b/clang-tools-extra/clang-doc/MDGenerator.cpp @@ -67,6 +67,23 @@ static void writeSourceFileRef(const ClangDocContext &CDCtx, const Location &L, OS << "\n\n"; } +static std::string genRawText(const std::vector<CommentInfo> &Comments) { + std::string Result; + std::queue<const CommentInfo *> Q; + for (const auto &CI : Comments) + Q.push(&CI); + const CommentInfo *Comment; + while (Q.size()) { + Comment = Q.front(); + Q.pop(); + if (!Comment->Text.empty()) + Result += Comment->Text; + for (const auto &CI : Comment->Children) + Q.push(CI.get()); + } + return Result; +} + static void maybeWriteSourceFileRef(llvm::raw_ostream &OS, const ClangDocContext &CDCtx, const std::optional<Location> &DefLoc) { @@ -162,11 +179,20 @@ static void genMarkdown(const ClangDocContext &CDCtx, const EnumInfo &I, writeLine("| enum " + I.Name + " |", OS); writeLine("--", OS); + OS << "| Name | Value | Comments |\n\n"; std::string Buffer; llvm::raw_string_ostream Members(Buffer); if (!I.Members.empty()) - for (const auto &N : I.Members) - Members << "| " << N.Name << " |\n"; + for (const auto &N : I.Members) { + Members << "| " << N.Name << " "; + if (!N.Value.empty()) + Members << "| " << N.Value << " "; + std::string RawComment = genRawText(N.Description); + RawComment.erase(0, RawComment.find_first_not_of(" \t\r\n")); + RawComment.erase(RawComment.find_last_not_of(" \t\r\n") + 1); + Members << "| " << (RawComment.empty() ? "--" : RawComment) << " "; + Members << "|\n"; + } writeLine(Members.str(), OS); maybeWriteSourceFileRef(OS, CDCtx, I.DefLoc); diff --git a/clang-tools-extra/clang-doc/assets/enum-template.mustache b/clang-tools-extra/clang-doc/assets/enum-template.mustache index 7434b7bfce347..783aaf9d2193f 100644 --- a/clang-tools-extra/clang-doc/assets/enum-template.mustache +++ b/clang-tools-extra/clang-doc/assets/enum-template.mustache @@ -15,6 +15,7 @@ <tr> <th>Name</th> <th>Value</th> + <th>Comments</th> </tr> {{#Members}} <tr> @@ -26,6 +27,7 @@ {{^Value}} <td>{{ValueExpr}}</td> {{/Value}} + <td>{{#Description}}{{>Comments}}{{/Description}}{{^Description}} -- {{/Description}}</td> </tr> {{/Members}} </tbody> >From 213d9741b87e73a16d28203b28601b7d48653e52 Mon Sep 17 00:00:00 2001 From: Samrudh Nelli <[email protected]> Date: Wed, 25 Feb 2026 16:32:53 +0530 Subject: [PATCH 02/12] display the comment column only if atleast any one member has comments --- clang-tools-extra/clang-doc/JSONGenerator.cpp | 24 +++++++++++++------ clang-tools-extra/clang-doc/MDGenerator.cpp | 22 +++++++++++++---- .../clang-doc/assets/enum-template.mustache | 4 ++-- 3 files changed, 36 insertions(+), 14 deletions(-) diff --git a/clang-tools-extra/clang-doc/JSONGenerator.cpp b/clang-tools-extra/clang-doc/JSONGenerator.cpp index 65a9a6bb94e04..4acb2cfd4f4f1 100644 --- a/clang-tools-extra/clang-doc/JSONGenerator.cpp +++ b/clang-tools-extra/clang-doc/JSONGenerator.cpp @@ -34,9 +34,10 @@ static void serializeInfo(const RecordInfo &I, Object &Obj, static void serializeReference(const Reference &Ref, Object &ReferenceObj); template <typename Container, typename SerializationFunc> -static void serializeArray(const Container &Records, Object &Obj, - const std::string &Key, - SerializationFunc SerializeInfo); +static void serializeArray( + const Container &Records, Object &Obj, const StringRef Key, + SerializationFunc SerializeInfo, const StringRef EndKey = "End", + function_ref<void(Object &)> UpdateJson = [](Object &Obj) {}); // Convenience lambda to pass to serializeArray. // If a serializeInfo needs a RepositoryUrl, create a local lambda that captures @@ -442,9 +443,9 @@ serializeCommonChildren(const ScopeChildren &Children, json::Object &Obj, } template <typename Container, typename SerializationFunc> -static void serializeArray(const Container &Records, Object &Obj, - const std::string &Key, - SerializationFunc SerializeInfo) { +static void serializeArray(const Container &Records, Object &Obj, StringRef Key, + SerializationFunc SerializeInfo, StringRef EndKey, + function_ref<void(Object &)> UpdateJson) { json::Value RecordsArray = Array(); auto &RecordsArrayRef = *RecordsArray.getAsArray(); RecordsArrayRef.reserve(Records.size()); @@ -457,6 +458,7 @@ static void serializeArray(const Container &Records, Object &Obj, RecordsArrayRef.push_back(ItemVal); } Obj[Key] = RecordsArray; + UpdateJson(Obj); } static void serializeInfo(const ConstraintInfo &I, Object &Obj) { @@ -588,7 +590,15 @@ static void serializeInfo(const EnumInfo &I, json::Object &Obj, } if (!I.Members.empty()) - serializeArray(I.Members, Obj, "Members", SerializeInfoLambda); + serializeArray(I.Members, Obj, "Members", SerializeInfoLambda, "End", + [&I](Object &JsonObj) { + for (const auto &Member : I.Members) { + if (!Member.Description.empty()) { + JsonObj["HasComments"] = true; + break; + } + } + }); } static void diff --git a/clang-tools-extra/clang-doc/MDGenerator.cpp b/clang-tools-extra/clang-doc/MDGenerator.cpp index 7c01ae820b286..f1a8dbcc344c1 100644 --- a/clang-tools-extra/clang-doc/MDGenerator.cpp +++ b/clang-tools-extra/clang-doc/MDGenerator.cpp @@ -179,7 +179,17 @@ static void genMarkdown(const ClangDocContext &CDCtx, const EnumInfo &I, writeLine("| enum " + I.Name + " |", OS); writeLine("--", OS); - OS << "| Name | Value | Comments |\n\n"; + OS << "| Name | Value |"; + bool HasComments = false; + for (const auto &Member : I.Members) { + if (!Member.Description.empty()) { + HasComments = true; + break; + } + } + if (HasComments) + OS << " Comments |"; + OS << "\n\n"; std::string Buffer; llvm::raw_string_ostream Members(Buffer); if (!I.Members.empty()) @@ -187,10 +197,12 @@ static void genMarkdown(const ClangDocContext &CDCtx, const EnumInfo &I, Members << "| " << N.Name << " "; if (!N.Value.empty()) Members << "| " << N.Value << " "; - std::string RawComment = genRawText(N.Description); - RawComment.erase(0, RawComment.find_first_not_of(" \t\r\n")); - RawComment.erase(RawComment.find_last_not_of(" \t\r\n") + 1); - Members << "| " << (RawComment.empty() ? "--" : RawComment) << " "; + if (HasComments) { + std::string RawComment = genRawText(N.Description); + RawComment.erase(0, RawComment.find_first_not_of(" \t\r\n")); + RawComment.erase(RawComment.find_last_not_of(" \t\r\n") + 1); + Members << "| " << (RawComment.empty() ? "--" : RawComment) << " "; + } Members << "|\n"; } writeLine(Members.str(), OS); diff --git a/clang-tools-extra/clang-doc/assets/enum-template.mustache b/clang-tools-extra/clang-doc/assets/enum-template.mustache index 783aaf9d2193f..09e107c4850d2 100644 --- a/clang-tools-extra/clang-doc/assets/enum-template.mustache +++ b/clang-tools-extra/clang-doc/assets/enum-template.mustache @@ -15,7 +15,7 @@ <tr> <th>Name</th> <th>Value</th> - <th>Comments</th> + {{#HasComments}}<th>Comments</th>{{/HasComments}} </tr> {{#Members}} <tr> @@ -27,7 +27,7 @@ {{^Value}} <td>{{ValueExpr}}</td> {{/Value}} - <td>{{#Description}}{{>Comments}}{{/Description}}{{^Description}} -- {{/Description}}</td> + {{#HasComments}}<td>{{#Description}}{{>Comments}}{{/Description}}{{^Description}} -- {{/Description}}</td>{{/HasComments}} </tr> {{/Members}} </tbody> >From e18391da14b56d2dbda68ab8d20c3668ec19a127 Mon Sep 17 00:00:00 2001 From: Samrudh Nelli <[email protected]> Date: Wed, 25 Feb 2026 17:00:02 +0530 Subject: [PATCH 03/12] update tests --- clang-tools-extra/clang-doc/MDGenerator.cpp | 25 ++++++++++--------- .../clang-doc/assets/enum-template.mustache | 4 ++- clang-tools-extra/test/clang-doc/enum.cpp | 14 ++++++++--- .../test/clang-doc/mustache-index.cpp | 2 +- .../unittests/clang-doc/MDGeneratorTest.cpp | 4 ++- 5 files changed, 31 insertions(+), 18 deletions(-) diff --git a/clang-tools-extra/clang-doc/MDGenerator.cpp b/clang-tools-extra/clang-doc/MDGenerator.cpp index f1a8dbcc344c1..f9010caf0bb6c 100644 --- a/clang-tools-extra/clang-doc/MDGenerator.cpp +++ b/clang-tools-extra/clang-doc/MDGenerator.cpp @@ -179,20 +179,20 @@ static void genMarkdown(const ClangDocContext &CDCtx, const EnumInfo &I, writeLine("| enum " + I.Name + " |", OS); writeLine("--", OS); - OS << "| Name | Value |"; - bool HasComments = false; - for (const auto &Member : I.Members) { - if (!Member.Description.empty()) { - HasComments = true; - break; - } - } - if (HasComments) - OS << " Comments |"; - OS << "\n\n"; std::string Buffer; llvm::raw_string_ostream Members(Buffer); - if (!I.Members.empty()) + if (!I.Members.empty()) { + OS << "| Name | Value |"; + bool HasComments = false; + for (const auto &Member : I.Members) { + if (!Member.Description.empty()) { + HasComments = true; + break; + } + } + if (HasComments) + OS << " Comments |"; + OS << "\n\n"; for (const auto &N : I.Members) { Members << "| " << N.Name << " "; if (!N.Value.empty()) @@ -205,6 +205,7 @@ static void genMarkdown(const ClangDocContext &CDCtx, const EnumInfo &I, } Members << "|\n"; } + } writeLine(Members.str(), OS); maybeWriteSourceFileRef(OS, CDCtx, I.DefLoc); diff --git a/clang-tools-extra/clang-doc/assets/enum-template.mustache b/clang-tools-extra/clang-doc/assets/enum-template.mustache index 09e107c4850d2..559cc69845884 100644 --- a/clang-tools-extra/clang-doc/assets/enum-template.mustache +++ b/clang-tools-extra/clang-doc/assets/enum-template.mustache @@ -27,7 +27,9 @@ {{^Value}} <td>{{ValueExpr}}</td> {{/Value}} - {{#HasComments}}<td>{{#Description}}{{>Comments}}{{/Description}}{{^Description}} -- {{/Description}}</td>{{/HasComments}} + {{#HasComments}} + <td>{{#Description}}{{>Comments}}{{/Description}}{{^Description}} -- {{/Description}}</td> + {{/HasComments}} </tr> {{/Members}} </tbody> diff --git a/clang-tools-extra/test/clang-doc/enum.cpp b/clang-tools-extra/test/clang-doc/enum.cpp index 6e11bbf065f25..7020e221abd32 100644 --- a/clang-tools-extra/test/clang-doc/enum.cpp +++ b/clang-tools-extra/test/clang-doc/enum.cpp @@ -133,18 +133,25 @@ class Animals { // HTML-ANIMAL-NEXT: <tr> // HTML-ANIMAL-NEXT: <th>Name</th> // HTML-ANIMAL-NEXT: <th>Value</th> +// HTML-ANIMAL-NEXT: <th>Comments</th> // HTML-ANIMAL-NEXT: </tr> // HTML-ANIMAL-NEXT: <tr> // HTML-ANIMAL-NEXT: <td>Dog</td> // HTML-ANIMAL-NEXT: <td>0</td> +// HTML-ANIMAL-NEXT: <td> Man's best friend +// HTML-ANIMAL-NEXT: </td> // HTML-ANIMAL-NEXT: </tr> // HTML-ANIMAL-NEXT: <tr> // HTML-ANIMAL-NEXT: <td>Cat</td> // HTML-ANIMAL-NEXT: <td>1</td> +// HTML-ANIMAL-NEXT: <td> Man's other best friend +// HTML-ANIMAL-NEXT: </td> // HTML-ANIMAL-NEXT: </tr> // HTML-ANIMAL-NEXT: <tr> // HTML-ANIMAL-NEXT: <td>Iguana</td> // HTML-ANIMAL-NEXT: <td>2</td> +// HTML-ANIMAL-NEXT: <td> A lizard +// HTML-ANIMAL-NEXT: </td> // HTML-ANIMAL-NEXT: </tr> // HTML-ANIMAL-NEXT: </tbody> // HTML-ANIMAL-NEXT: </table> @@ -161,9 +168,10 @@ class Animals { // MD-ANIMAL: ## Enums // MD-ANIMAL: | enum AnimalType | // MD-ANIMAL: -- -// MD-ANIMAL: | Dog | -// MD-ANIMAL: | Cat | -// MD-ANIMAL: | Iguana | +// MD-ANIMAL: | Name | Value | Comments | +// MD-ANIMAL: | Dog | 0 | Man's best friend | +// MD-ANIMAL: | Cat | 1 | Man's other best friend | +// MD-ANIMAL: | Iguana | 2 | A lizard | // MD-ANIMAL: **brief** specify what animal the class is namespace Vehicles { diff --git a/clang-tools-extra/test/clang-doc/mustache-index.cpp b/clang-tools-extra/test/clang-doc/mustache-index.cpp index 6e308ada51a45..7c4c65894fc6e 100644 --- a/clang-tools-extra/test/clang-doc/mustache-index.cpp +++ b/clang-tools-extra/test/clang-doc/mustache-index.cpp @@ -39,7 +39,7 @@ class Foo; // CHECK-NEXT: <tr> // CHECK-NEXT: <th>Name</th> // CHECK-NEXT: <th>Value</th> -// CHECK-NEXT: </tr> +// CHECK: </tr> // CHECK-NEXT: <tr> // CHECK-NEXT: <td>RED</td> // CHECK-NEXT: <td>0</td> diff --git a/clang-tools-extra/unittests/clang-doc/MDGeneratorTest.cpp b/clang-tools-extra/unittests/clang-doc/MDGeneratorTest.cpp index b44b09b28e90f..8bb30bb7db6cc 100644 --- a/clang-tools-extra/unittests/clang-doc/MDGeneratorTest.cpp +++ b/clang-tools-extra/unittests/clang-doc/MDGeneratorTest.cpp @@ -199,7 +199,9 @@ TEST_F(MDGeneratorTest, emitEnumMD) { -- -| X | +| Name | Value | + +| X | 0 | *Defined at test.cpp#10* >From 22bef04b09f8c8019973e1646fdf79564eb6cf5c Mon Sep 17 00:00:00 2001 From: Samrudh Nelli <[email protected]> Date: Thu, 26 Feb 2026 01:55:41 +0530 Subject: [PATCH 04/12] update /test/clang-doc/enum.cpp --- clang-tools-extra/test/clang-doc/enum.cpp | 112 +++++++++++++++------- 1 file changed, 79 insertions(+), 33 deletions(-) diff --git a/clang-tools-extra/test/clang-doc/enum.cpp b/clang-tools-extra/test/clang-doc/enum.cpp index 49469ad8aa514..7a2d9c0baf930 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 /** * @brief For specifying RGB colors @@ -34,9 +33,10 @@ enum Color { // MD-INDEX: ## Enums // MD-INDEX: | enum Color | // MD-INDEX: -- -// MD-INDEX: | Red | -// MD-INDEX: | Green | -// MD-INDEX: | Blue | +// MD-INDEX: | Name | Value | Comments | +// MD-INDEX: | Red | 0 | Comment 1 | +// MD-INDEX: | Green | 1 | Comment 2 | +// MD-INDEX: | Blue | 2 | Comment 3 | // MD-INDEX: **brief** For specifying RGB colors // HTML-INDEX-LABEL: <div id="{{([0-9A-F]{40})}}" class="delimiter-container"> @@ -48,18 +48,25 @@ enum Color { // HTML-INDEX-NEXT: <tr> // HTML-INDEX-NEXT: <th>Name</th> // HTML-INDEX-NEXT: <th>Value</th> +// HTML-INDEX-NEXT: <th>Comments</th> // HTML-INDEX-NEXT: </tr> // HTML-INDEX-NEXT: <tr> // HTML-INDEX-NEXT: <td>Red</td> // HTML-INDEX-NEXT: <td>0</td> +// HTML-INDEX-NEXT: <td> Comment 1 +// HTML-INDEX-NEXT: </td> // HTML-INDEX-NEXT: </tr> // HTML-INDEX-NEXT: <tr> // HTML-INDEX-NEXT: <td>Green</td> // HTML-INDEX-NEXT: <td>1</td> +// HTML-INDEX-NEXT: <td> Comment 2 +// HTML-INDEX-NEXT: </td> // HTML-INDEX-NEXT: </tr> // HTML-INDEX-NEXT: <tr> // HTML-INDEX-NEXT: <td>Blue</td> // HTML-INDEX-NEXT: <td>2</td> +// HTML-INDEX-NEXT: <td> Comment 3 +// HTML-INDEX-NEXT: </td> // HTML-INDEX-NEXT: </tr> // HTML-INDEX-NEXT: </tbody> // HTML-INDEX-NEXT: </table> @@ -68,7 +75,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-45]] of file {{.*}}clang-tools-extra{{[\/]}}test{{[\/]}}clang-doc{{[\/]}}enum.cpp</p> +// HTML-INDEX-NEXT: <p>Defined at line [[@LINE-53]] of file {{.*}}clang-tools-extra{{[\/]}}test{{[\/]}}clang-doc{{[\/]}}enum.cpp</p> // HTML-INDEX-NEXT: </div> /** @@ -87,9 +94,10 @@ enum class Shapes { }; // MD-INDEX: | enum class Shapes | // MD-INDEX: -- -// MD-INDEX: | Circle | -// MD-INDEX: | Rectangle | -// MD-INDEX: | Triangle | +// MD-INDEX: | Name | Value | Comments | +// MD-INDEX: | Circle | 0 | Comment 1 | +// MD-INDEX: | Rectangle | 1 | Comment 2 | +// MD-INDEX: | Triangle | 2 | Comment 3 | // MD-INDEX: **brief** Shape Types // HTML-INDEX-LABEL: <div id="{{([0-9A-F]{40})}}" class="delimiter-container"> @@ -101,18 +109,25 @@ enum class Shapes { // HTML-INDEX-NEXT: <tr> // HTML-INDEX-NEXT: <th>Name</th> // HTML-INDEX-NEXT: <th>Value</th> +// HTML-INDEX-NEXT: <th>Comments</th> // HTML-INDEX-NEXT: </tr> // HTML-INDEX-NEXT: <tr> // HTML-INDEX-NEXT: <td>Circle</td> // HTML-INDEX-NEXT: <td>0</td> +// HTML-INDEX-NEXT: <td> Comment 1 +// HTML-INDEX-NEXT: </td> // HTML-INDEX-NEXT: </tr> // HTML-INDEX-NEXT: <tr> // HTML-INDEX-NEXT: <td>Rectangle</td> // HTML-INDEX-NEXT: <td>1</td> +// HTML-INDEX-NEXT: <td> Comment 2 +// HTML-INDEX-NEXT: </td> // HTML-INDEX-NEXT: </tr> // HTML-INDEX-NEXT: <tr> // HTML-INDEX-NEXT: <td>Triangle</td> // HTML-INDEX-NEXT: <td>2</td> +// HTML-INDEX-NEXT: <td> Comment 3 +// HTML-INDEX-NEXT: </td> // HTML-INDEX-NEXT: </tr> // HTML-INDEX-NEXT: </tbody> // HTML-INDEX-NEXT: </table> @@ -121,7 +136,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-55]] of file {{.*}}clang-tools-extra{{[\/]}}test{{[\/]}}clang-doc{{[\/]}}enum.cpp</p> // HTML-INDEX-NEXT: </div> typedef unsigned char uint8_t; @@ -138,9 +153,10 @@ enum Size : uint8_t { // MD-INDEX: | enum Size : uint8_t | // MD-INDEX: -- -// MD-INDEX: | Small | -// MD-INDEX: | Medium | -// MD-INDEX: | Large | +// MD-INDEX: | Name | Value | Comments | +// MD-INDEX: | Small | 0 | A pearl | +// MD-INDEX: | Medium | 1 | A tennis ball | +// MD-INDEX: | Large | 2 | A football | // MD-INDEX: **brief** Specify the size // HTML-INDEX-LABEL: <div id="{{([0-9A-F]{40})}}" class="delimiter-container"> @@ -152,18 +168,25 @@ enum Size : uint8_t { // HTML-INDEX-NEXT: <tr> // HTML-INDEX-NEXT: <th>Name</th> // HTML-INDEX-NEXT: <th>Value</th> +// HTML-INDEX-NEXT: <th>Comments</th> // HTML-INDEX-NEXT: </tr> // HTML-INDEX-NEXT: <tr> // HTML-INDEX-NEXT: <td>Small</td> // HTML-INDEX-NEXT: <td>0</td> +// HTML-INDEX-NEXT: <td> A pearl +// HTML-INDEX-NEXT: </td> // HTML-INDEX-NEXT: </tr> // HTML-INDEX-NEXT: <tr> // HTML-INDEX-NEXT: <td>Medium</td> // HTML-INDEX-NEXT: <td>1</td> +// HTML-INDEX-NEXT: <td> A tennis ball +// HTML-INDEX-NEXT: </td> // HTML-INDEX-NEXT: </tr> // HTML-INDEX-NEXT: <tr> // HTML-INDEX-NEXT: <td>Large</td> // HTML-INDEX-NEXT: <td>2</td> +// HTML-INDEX-NEXT: <td> A football +// HTML-INDEX-NEXT: </td> // HTML-INDEX-NEXT: </tr> // HTML-INDEX-NEXT: </tbody> // HTML-INDEX-NEXT: </table> @@ -172,7 +195,7 @@ enum Size : uint8_t { // HTML-INDEX-NEXT: <p> Specify the size</p> // HTML-INDEX-NEXT: </div> // HTML-INDEX-NEXT: </div> -// HTML-INDEX-NEXT: <p>Defined at line [[@LINE-44]] of file {{.*}}clang-tools-extra{{[\/]}}test{{[\/]}}clang-doc{{[\/]}}enum.cpp</p> +// HTML-INDEX-NEXT: <p>Defined at line [[@LINE-52]] of file {{.*}}clang-tools-extra{{[\/]}}test{{[\/]}}clang-doc{{[\/]}}enum.cpp</p> // HTML-INDEX-NEXT: </div> /** @@ -186,7 +209,8 @@ enum : long long { // MD-INDEX: | enum (unnamed) : long long | // MD-INDEX: -- -// MD-INDEX: | BigVal | +// MD-INDEX: | Name | Value | Comments | +// MD-INDEX: | BigVal | 999999999999 | A very large value | // MD-INDEX: **brief** Very long number // HTML-INDEX-LABEL: <div id="{{([0-9A-F]{40})}}" class="delimiter-container"> @@ -198,10 +222,13 @@ enum : long long { // HTML-INDEX-NEXT: <tr> // HTML-INDEX-NEXT: <th>Name</th> // HTML-INDEX-NEXT: <th>Value</th> +// HTML-INDEX-NEXT: <th>Comments</th> // HTML-INDEX-NEXT: </tr> // HTML-INDEX-NEXT: <tr> // HTML-INDEX-NEXT: <td>BigVal</td> // HTML-INDEX-NEXT: <td>999999999999</td> +// HTML-INDEX-NEXT: <td> A very large value +// HTML-INDEX-NEXT: </td> // HTML-INDEX-NEXT: </tr> // HTML-INDEX-NEXT: </tbody> // HTML-INDEX-NEXT: </table> @@ -210,7 +237,7 @@ enum : long long { // HTML-INDEX-NEXT: <p> Very long number</p> // HTML-INDEX-NEXT: </div> // HTML-INDEX-NEXT: </div> -// HTML-INDEX-NEXT: <p>Defined at line [[@LINE-32]] of file {{.*}}clang-tools-extra{{[\/]}}test{{[\/]}}clang-doc{{[\/]}}enum.cpp</p> +// HTML-INDEX-NEXT: <p>Defined at line [[@LINE-36]] of file {{.*}}clang-tools-extra{{[\/]}}test{{[\/]}}clang-doc{{[\/]}}enum.cpp</p> // HTML-INDEX-NEXT: </div> class FilePermissions { @@ -223,17 +250,18 @@ class FilePermissions { enum { // MD-PERM-LINE: *Defined at {{.*}}clang-tools-extra{{[\/]}}test{{[\/]}}clang-doc{{[\/]}}enum.cpp#[[@LINE-1]]* // HTML-PERM-LINE: <p>Defined at line [[@LINE-2]] of file {{.*}}clang-tools-extra{{[\/]}}test{{[\/]}}clang-doc{{[\/]}}enum.cpp</p> - Read = 1, ///> Permission to READ r - Write = 2, ///> Permission to WRITE w - Execute = 4 ///> Permission to EXECUTE x + Read = 1, ///< Permission to READ r + Write = 2, ///< Permission to WRITE w + Execute = 4 ///< Permission to EXECUTE x }; }; // MD-PERM: | enum (unnamed) | // MD-PERM: -- -// MD-PERM: | Read | -// MD-PERM: | Write | -// MD-PERM: | Execute | +// MD-PERM: | Name | Value | Comments | +// MD-PERM: | Read | 1 | Permission to READ r | +// MD-PERM: | Write | 2 | Permission to WRITE w | +// MD-PERM: | Execute | 4 | Permission to EXECUTE x | // MD-PERM: **brief** File permission flags // HTML-PERM-LABEL: <section id="Enums" class="section-container"> @@ -247,18 +275,25 @@ class FilePermissions { // HTML-PERM-NEXT: <tr> // HTML-PERM-NEXT: <th>Name</th> // HTML-PERM-NEXT: <th>Value</th> +// HTML-PERM-NEXT: <th>Comments</th> // HTML-PERM-NEXT: </tr> // HTML-PERM-NEXT: <tr> // HTML-PERM-NEXT: <td>Read</td> // HTML-PERM-NEXT: <td>1</td> +// HTML-PERM-NEXT: <td> Permission to READ r +// HTML-PERM-NEXT: </td> // HTML-PERM-NEXT: </tr> // HTML-PERM-NEXT: <tr> // HTML-PERM-NEXT: <td>Write</td> // HTML-PERM-NEXT: <td>2</td> +// HTML-PERM-NEXT: <td> Permission to WRITE w +// HTML-PERM-NEXT: </td> // HTML-PERM-NEXT: </tr> // HTML-PERM-NEXT: <tr> // HTML-PERM-NEXT: <td>Execute</td> // HTML-PERM-NEXT: <td>4</td> +// HTML-PERM-NEXT: <td> Permission to EXECUTE x +// HTML-PERM-NEXT: </td> // HTML-PERM-NEXT: </tr> // HTML-PERM-NEXT: </tbody> // HTML-PERM-NEXT: </table> @@ -267,7 +302,7 @@ class FilePermissions { // HTML-PERM-NEXT: <p> File permission flags</p> // HTML-PERM-NEXT: </div> // HTML-PERM-NEXT: </div> -// HTML-PERM-NEXT: <p>Defined at line [[@LINE-47]] of file {{.*}}clang-tools-extra{{[\/]}}test{{[\/]}}clang-doc{{[\/]}}enum.cpp</p> +// HTML-PERM-NEXT: <p>Defined at line [[@LINE-55]] of file {{.*}}clang-tools-extra{{[\/]}}test{{[\/]}}clang-doc{{[\/]}}enum.cpp</p> // HTML-PERM-NEXT: </div> // HTML-PERM-NEXT: </section> @@ -326,7 +361,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-40]] of file {{.*}}enum.cpp</p> +// HTML-ANIMAL-NEXT: <p>Defined at line [[@LINE-47]] of file {{.*}}enum.cpp</p> // HTML-ANIMAL-NEXT: </div> // HTML-ANIMAL-NEXT: </section> @@ -359,10 +394,11 @@ enum Car { // MD-VEHICLES: ## Enums // MD-VEHICLES: | enum Car | // MD-VEHICLES: -- -// MD-VEHICLES: | Sedan | -// MD-VEHICLES: | SUV | -// MD-VEHICLES: | Pickup | -// MD-VEHICLES: | Hatchback | +// MD-VEHICLES: | Name | Value | Comments | +// MD-VEHICLES: | Sedan | 0 | Comment 1 | +// MD-VEHICLES: | SUV | 1 | Comment 2 | +// MD-VEHICLES: | Pickup | 2 | Comment 3 | +// MD-VEHICLES: | Hatchback | 3 | Comment 4 | // MD-VEHICLES: **brief** specify type of car // HTML-VEHICLES-LABEL: <div id="{{([0-9A-F]{40})}}" class="delimiter-container"> @@ -374,22 +410,31 @@ enum Car { // HTML-VEHICLES-NEXT: <tr> // HTML-VEHICLES-NEXT: <th>Name</th> // HTML-VEHICLES-NEXT: <th>Value</th> +// HTML-VEHICLES-NEXT: <th>Comments</th> // HTML-VEHICLES-NEXT: </tr> // HTML-VEHICLES-NEXT: <tr> // HTML-VEHICLES-NEXT: <td>Sedan</td> // HTML-VEHICLES-NEXT: <td>0</td> +// HTML-VEHICLES-NEXT: <td> Comment 1 +// HTML-VEHICLES-NEXT: </td> // HTML-VEHICLES-NEXT: </tr> // HTML-VEHICLES-NEXT: <tr> // HTML-VEHICLES-NEXT: <td>SUV</td> // HTML-VEHICLES-NEXT: <td>1</td> +// HTML-VEHICLES-NEXT: <td> Comment 2 +// HTML-VEHICLES-NEXT: </td> // HTML-VEHICLES-NEXT: </tr> // HTML-VEHICLES-NEXT: <tr> // HTML-VEHICLES-NEXT: <td>Pickup</td> // HTML-VEHICLES-NEXT: <td>2</td> +// HTML-VEHICLES-NEXT: <td> Comment 3 +// HTML-VEHICLES-NEXT: </td> // HTML-VEHICLES-NEXT: </tr> // HTML-VEHICLES-NEXT: <tr> // HTML-VEHICLES-NEXT: <td>Hatchback</td> // HTML-VEHICLES-NEXT: <td>3</td> +// HTML-VEHICLES-NEXT: <td> Comment 4 +// HTML-VEHICLES-NEXT: </td> // HTML-VEHICLES-NEXT: </tr> // HTML-VEHICLES-NEXT: </tbody> // HTML-VEHICLES-NEXT: </table> @@ -398,7 +443,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-54]] of file {{.*}}clang-tools-extra{{[\/]}}test{{[\/]}}clang-doc{{[\/]}}enum.cpp</p> +// HTML-VEHICLES-NEXT: <p>Defined at line [[@LINE-64]] of file {{.*}}clang-tools-extra{{[\/]}}test{{[\/]}}clang-doc{{[\/]}}enum.cpp</p> // HTML-VEHICLES-NEXT: </div> enum ColorUserSpecified { @@ -409,9 +454,10 @@ enum ColorUserSpecified { // MD-INDEX: | enum ColorUserSpecified | // MD-INDEX: -- -// MD-INDEX: | RedUserSpecified | -// MD-INDEX: | GreenUserSpecified | -// MD-INDEX: | BlueUserSpecified | +// MD-INDEX: | Name | Value | +// MD-INDEX: | RedUserSpecified | 65 | +// MD-INDEX: | GreenUserSpecified | 2 | +// MD-INDEX: | BlueUserSpecified | 67 | // HTML-INDEX-LABEL: <div id="{{([0-9A-F]{40})}}" class="delimiter-container"> // HTML-INDEX-NEXT: <div> @@ -422,7 +468,7 @@ enum ColorUserSpecified { // HTML-INDEX-NEXT: <tr> // HTML-INDEX-NEXT: <th>Name</th> // HTML-INDEX-NEXT: <th>Value</th> -// HTML-INDEX-NEXT: </tr> +// HTML-INDEX: </tr> // HTML-INDEX-NEXT: <tr> // HTML-INDEX-NEXT: <td>RedUserSpecified</td> // HTML-INDEX-NEXT: <td>'A'</td> @@ -437,5 +483,5 @@ enum ColorUserSpecified { // HTML-INDEX-NEXT: </tr> // HTML-INDEX-NEXT: </tbody> // HTML-INDEX-NEXT: </table> -// HTML-INDEX-NEXT: <p>Defined at line [[@LINE-36]] of file {{.*}}clang-tools-extra{{[\/]}}test{{[\/]}}clang-doc{{[\/]}}enum.cpp</p> +// HTML-INDEX-NEXT: <p>Defined at line [[@LINE-37]] of file {{.*}}clang-tools-extra{{[\/]}}test{{[\/]}}clang-doc{{[\/]}}enum.cpp</p> // HTML-INDEX-NEXT: </div> >From 9dd7f772d886c752f03a89f3fdb3b86121049539 Mon Sep 17 00:00:00 2001 From: Samrudh Nelli <[email protected]> Date: Thu, 26 Feb 2026 21:35:36 +0530 Subject: [PATCH 05/12] remove header Name | Value | Comments, implement format suggestions --- clang-tools-extra/clang-doc/JSONGenerator.cpp | 28 +++++++++---------- clang-tools-extra/clang-doc/MDGenerator.cpp | 7 ++--- .../clang-doc/assets/enum-template.mustache | 4 ++- clang-tools-extra/test/clang-doc/enum.cpp | 22 +++++---------- .../unittests/clang-doc/MDGeneratorTest.cpp | 2 -- 5 files changed, 25 insertions(+), 38 deletions(-) diff --git a/clang-tools-extra/clang-doc/JSONGenerator.cpp b/clang-tools-extra/clang-doc/JSONGenerator.cpp index 3dd467614aa21..62fe4f821e349 100644 --- a/clang-tools-extra/clang-doc/JSONGenerator.cpp +++ b/clang-tools-extra/clang-doc/JSONGenerator.cpp @@ -565,22 +565,20 @@ static void serializeInfo(const EnumValueInfo &I, Object &Obj) { Obj["ValueExpr"] = I.ValueExpr; else Obj["Value"] = I.Value; - if (!I.Description.empty()) { - json::Value CommentsArray = Array(); - auto &CommentsArrayRef = *CommentsArray.getAsArray(); - Object TempObj, ChildJson; - for (const auto &Child : I.Description) { - for (const auto &CI : Child.Children) { - ChildJson = serializeComment(*CI, TempObj); - if (!ChildJson.empty()) { - CommentsArrayRef.push_back(std::move(ChildJson)); - } - } - } - if (!CommentsArrayRef.empty()) { - Obj["Description"] = CommentsArray; - } + + if (I.Description.empty()) + return; + + json::Value CommentsArray = Array(); + auto &CommentsArrayRef = *CommentsArray.getAsArray(); + Object TempObj; + for (const auto &Child : I.Description) { + for (const auto &CI : Child.Children) + if(Object ChildJson = serializeComment(*CI, TempObj); !ChildJson.empty()) + CommentsArrayRef.push_back(std::move(ChildJson)); } + if (!CommentsArrayRef.empty()) + Obj["Description"] = CommentsArray; } static void serializeInfo(const EnumInfo &I, json::Object &Obj, diff --git a/clang-tools-extra/clang-doc/MDGenerator.cpp b/clang-tools-extra/clang-doc/MDGenerator.cpp index d8ffb432a03f1..a5e387b15d9f6 100644 --- a/clang-tools-extra/clang-doc/MDGenerator.cpp +++ b/clang-tools-extra/clang-doc/MDGenerator.cpp @@ -69,6 +69,7 @@ static void writeSourceFileRef(const ClangDocContext &CDCtx, const Location &L, static std::string genRawText(const std::vector<CommentInfo> &Comments) { std::string Result; + llvm::raw_string_ostream OS(Result); std::queue<const CommentInfo *> Q; for (const auto &CI : Comments) Q.push(&CI); @@ -77,7 +78,7 @@ static std::string genRawText(const std::vector<CommentInfo> &Comments) { Comment = Q.front(); Q.pop(); if (!Comment->Text.empty()) - Result += Comment->Text; + OS << Comment->Text; for (const auto &CI : Comment->Children) Q.push(CI.get()); } @@ -185,7 +186,6 @@ static void genMarkdown(const ClangDocContext &CDCtx, const EnumInfo &I, std::string Buffer; llvm::raw_string_ostream Members(Buffer); if (!I.Members.empty()) { - OS << "| Name | Value |"; bool HasComments = false; for (const auto &Member : I.Members) { if (!Member.Description.empty()) { @@ -193,9 +193,6 @@ static void genMarkdown(const ClangDocContext &CDCtx, const EnumInfo &I, break; } } - if (HasComments) - OS << " Comments |"; - OS << "\n\n"; for (const auto &N : I.Members) { Members << "| " << N.Name << " "; if (!N.Value.empty()) diff --git a/clang-tools-extra/clang-doc/assets/enum-template.mustache b/clang-tools-extra/clang-doc/assets/enum-template.mustache index 93d128d449470..f39d176bed4f8 100644 --- a/clang-tools-extra/clang-doc/assets/enum-template.mustache +++ b/clang-tools-extra/clang-doc/assets/enum-template.mustache @@ -15,7 +15,9 @@ <tr> <th>Name</th> <th>Value</th> - {{#HasComments}}<th>Comments</th>{{/HasComments}} + {{#HasComments}} + <th>Comments</th> + {{/HasComments}} </tr> {{#Members}} <tr> diff --git a/clang-tools-extra/test/clang-doc/enum.cpp b/clang-tools-extra/test/clang-doc/enum.cpp index 7a2d9c0baf930..1a5086078cbec 100644 --- a/clang-tools-extra/test/clang-doc/enum.cpp +++ b/clang-tools-extra/test/clang-doc/enum.cpp @@ -33,7 +33,6 @@ enum Color { // MD-INDEX: ## Enums // MD-INDEX: | enum Color | // MD-INDEX: -- -// MD-INDEX: | Name | Value | Comments | // MD-INDEX: | Red | 0 | Comment 1 | // MD-INDEX: | Green | 1 | Comment 2 | // MD-INDEX: | Blue | 2 | Comment 3 | @@ -75,7 +74,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-53]] of file {{.*}}clang-tools-extra{{[\/]}}test{{[\/]}}clang-doc{{[\/]}}enum.cpp</p> +// HTML-INDEX-NEXT: <p>Defined at line [[@LINE-52]] of file {{.*}}clang-tools-extra{{[\/]}}test{{[\/]}}clang-doc{{[\/]}}enum.cpp</p> // HTML-INDEX-NEXT: </div> /** @@ -94,7 +93,6 @@ enum class Shapes { }; // MD-INDEX: | enum class Shapes | // MD-INDEX: -- -// MD-INDEX: | Name | Value | Comments | // MD-INDEX: | Circle | 0 | Comment 1 | // MD-INDEX: | Rectangle | 1 | Comment 2 | // MD-INDEX: | Triangle | 2 | Comment 3 | @@ -136,7 +134,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-55]] of file {{.*}}clang-tools-extra{{[\/]}}test{{[\/]}}clang-doc{{[\/]}}enum.cpp</p> +// HTML-INDEX-NEXT: <p>Defined at line [[@LINE-54]] of file {{.*}}clang-tools-extra{{[\/]}}test{{[\/]}}clang-doc{{[\/]}}enum.cpp</p> // HTML-INDEX-NEXT: </div> typedef unsigned char uint8_t; @@ -153,7 +151,6 @@ enum Size : uint8_t { // MD-INDEX: | enum Size : uint8_t | // MD-INDEX: -- -// MD-INDEX: | Name | Value | Comments | // MD-INDEX: | Small | 0 | A pearl | // MD-INDEX: | Medium | 1 | A tennis ball | // MD-INDEX: | Large | 2 | A football | @@ -195,7 +192,7 @@ enum Size : uint8_t { // HTML-INDEX-NEXT: <p> Specify the size</p> // HTML-INDEX-NEXT: </div> // HTML-INDEX-NEXT: </div> -// HTML-INDEX-NEXT: <p>Defined at line [[@LINE-52]] of file {{.*}}clang-tools-extra{{[\/]}}test{{[\/]}}clang-doc{{[\/]}}enum.cpp</p> +// HTML-INDEX-NEXT: <p>Defined at line [[@LINE-51]] of file {{.*}}clang-tools-extra{{[\/]}}test{{[\/]}}clang-doc{{[\/]}}enum.cpp</p> // HTML-INDEX-NEXT: </div> /** @@ -209,7 +206,6 @@ enum : long long { // MD-INDEX: | enum (unnamed) : long long | // MD-INDEX: -- -// MD-INDEX: | Name | Value | Comments | // MD-INDEX: | BigVal | 999999999999 | A very large value | // MD-INDEX: **brief** Very long number @@ -237,7 +233,7 @@ enum : long long { // HTML-INDEX-NEXT: <p> Very long number</p> // HTML-INDEX-NEXT: </div> // HTML-INDEX-NEXT: </div> -// HTML-INDEX-NEXT: <p>Defined at line [[@LINE-36]] of file {{.*}}clang-tools-extra{{[\/]}}test{{[\/]}}clang-doc{{[\/]}}enum.cpp</p> +// HTML-INDEX-NEXT: <p>Defined at line [[@LINE-35]] of file {{.*}}clang-tools-extra{{[\/]}}test{{[\/]}}clang-doc{{[\/]}}enum.cpp</p> // HTML-INDEX-NEXT: </div> class FilePermissions { @@ -258,7 +254,6 @@ class FilePermissions { // MD-PERM: | enum (unnamed) | // MD-PERM: -- -// MD-PERM: | Name | Value | Comments | // MD-PERM: | Read | 1 | Permission to READ r | // MD-PERM: | Write | 2 | Permission to WRITE w | // MD-PERM: | Execute | 4 | Permission to EXECUTE x | @@ -302,7 +297,7 @@ class FilePermissions { // HTML-PERM-NEXT: <p> File permission flags</p> // HTML-PERM-NEXT: </div> // HTML-PERM-NEXT: </div> -// HTML-PERM-NEXT: <p>Defined at line [[@LINE-55]] of file {{.*}}clang-tools-extra{{[\/]}}test{{[\/]}}clang-doc{{[\/]}}enum.cpp</p> +// HTML-PERM-NEXT: <p>Defined at line [[@LINE-54]] of file {{.*}}clang-tools-extra{{[\/]}}test{{[\/]}}clang-doc{{[\/]}}enum.cpp</p> // HTML-PERM-NEXT: </div> // HTML-PERM-NEXT: </section> @@ -369,7 +364,6 @@ class Animals { // MD-ANIMAL: ## Enums // MD-ANIMAL: | enum AnimalType | // MD-ANIMAL: -- -// MD-ANIMAL: | Name | Value | Comments | // MD-ANIMAL: | Dog | 0 | Man's best friend | // MD-ANIMAL: | Cat | 1 | Man's other best friend | // MD-ANIMAL: | Iguana | 2 | A lizard | @@ -394,7 +388,6 @@ enum Car { // MD-VEHICLES: ## Enums // MD-VEHICLES: | enum Car | // MD-VEHICLES: -- -// MD-VEHICLES: | Name | Value | Comments | // MD-VEHICLES: | Sedan | 0 | Comment 1 | // MD-VEHICLES: | SUV | 1 | Comment 2 | // MD-VEHICLES: | Pickup | 2 | Comment 3 | @@ -443,7 +436,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-64]] of file {{.*}}clang-tools-extra{{[\/]}}test{{[\/]}}clang-doc{{[\/]}}enum.cpp</p> +// HTML-VEHICLES-NEXT: <p>Defined at line [[@LINE-63]] of file {{.*}}clang-tools-extra{{[\/]}}test{{[\/]}}clang-doc{{[\/]}}enum.cpp</p> // HTML-VEHICLES-NEXT: </div> enum ColorUserSpecified { @@ -454,7 +447,6 @@ enum ColorUserSpecified { // MD-INDEX: | enum ColorUserSpecified | // MD-INDEX: -- -// MD-INDEX: | Name | Value | // MD-INDEX: | RedUserSpecified | 65 | // MD-INDEX: | GreenUserSpecified | 2 | // MD-INDEX: | BlueUserSpecified | 67 | @@ -483,5 +475,5 @@ enum ColorUserSpecified { // HTML-INDEX-NEXT: </tr> // HTML-INDEX-NEXT: </tbody> // HTML-INDEX-NEXT: </table> -// HTML-INDEX-NEXT: <p>Defined at line [[@LINE-37]] of file {{.*}}clang-tools-extra{{[\/]}}test{{[\/]}}clang-doc{{[\/]}}enum.cpp</p> +// HTML-INDEX-NEXT: <p>Defined at line [[@LINE-36]] of file {{.*}}clang-tools-extra{{[\/]}}test{{[\/]}}clang-doc{{[\/]}}enum.cpp</p> // HTML-INDEX-NEXT: </div> diff --git a/clang-tools-extra/unittests/clang-doc/MDGeneratorTest.cpp b/clang-tools-extra/unittests/clang-doc/MDGeneratorTest.cpp index 8bb30bb7db6cc..b6d02974020a1 100644 --- a/clang-tools-extra/unittests/clang-doc/MDGeneratorTest.cpp +++ b/clang-tools-extra/unittests/clang-doc/MDGeneratorTest.cpp @@ -199,8 +199,6 @@ TEST_F(MDGeneratorTest, emitEnumMD) { -- -| Name | Value | - | X | 0 | >From 3d0d253518102242c9865c053c9277a56b8e8bf3 Mon Sep 17 00:00:00 2001 From: Samrudh Nelli <[email protected]> Date: Fri, 27 Feb 2026 18:44:27 +0530 Subject: [PATCH 06/12] split display in md into another PR, use -CHECK-NEXT instead of -CHECK --- clang-tools-extra/clang-doc/JSONGenerator.cpp | 3 +- clang-tools-extra/clang-doc/MDGenerator.cpp | 42 ++-------------- .../clang-doc/assets/enum-template.mustache | 6 +-- clang-tools-extra/test/clang-doc/enum.cpp | 48 +++++++++---------- 4 files changed, 31 insertions(+), 68 deletions(-) diff --git a/clang-tools-extra/clang-doc/JSONGenerator.cpp b/clang-tools-extra/clang-doc/JSONGenerator.cpp index 62fe4f821e349..561306d5af353 100644 --- a/clang-tools-extra/clang-doc/JSONGenerator.cpp +++ b/clang-tools-extra/clang-doc/JSONGenerator.cpp @@ -1,5 +1,6 @@ #include "Generators.h" #include "clang/Basic/Specifiers.h" +#include "llvm/ADT/StringRef.h" #include "llvm/Support/JSON.h" using namespace llvm; @@ -574,7 +575,7 @@ static void serializeInfo(const EnumValueInfo &I, Object &Obj) { Object TempObj; for (const auto &Child : I.Description) { for (const auto &CI : Child.Children) - if(Object ChildJson = serializeComment(*CI, TempObj); !ChildJson.empty()) + if (Object ChildJson = serializeComment(*CI, TempObj); !ChildJson.empty()) CommentsArrayRef.push_back(std::move(ChildJson)); } if (!CommentsArrayRef.empty()) diff --git a/clang-tools-extra/clang-doc/MDGenerator.cpp b/clang-tools-extra/clang-doc/MDGenerator.cpp index a5e387b15d9f6..851b4e084ef23 100644 --- a/clang-tools-extra/clang-doc/MDGenerator.cpp +++ b/clang-tools-extra/clang-doc/MDGenerator.cpp @@ -67,24 +67,6 @@ static void writeSourceFileRef(const ClangDocContext &CDCtx, const Location &L, OS << "\n\n"; } -static std::string genRawText(const std::vector<CommentInfo> &Comments) { - std::string Result; - llvm::raw_string_ostream OS(Result); - std::queue<const CommentInfo *> Q; - for (const auto &CI : Comments) - Q.push(&CI); - const CommentInfo *Comment; - while (Q.size()) { - Comment = Q.front(); - Q.pop(); - if (!Comment->Text.empty()) - OS << Comment->Text; - for (const auto &CI : Comment->Children) - Q.push(CI.get()); - } - return Result; -} - static void maybeWriteSourceFileRef(llvm::raw_ostream &OS, const ClangDocContext &CDCtx, const std::optional<Location> &DefLoc) { @@ -185,27 +167,9 @@ static void genMarkdown(const ClangDocContext &CDCtx, const EnumInfo &I, std::string Buffer; llvm::raw_string_ostream Members(Buffer); - if (!I.Members.empty()) { - bool HasComments = false; - for (const auto &Member : I.Members) { - if (!Member.Description.empty()) { - HasComments = true; - break; - } - } - for (const auto &N : I.Members) { - Members << "| " << N.Name << " "; - if (!N.Value.empty()) - Members << "| " << N.Value << " "; - if (HasComments) { - std::string RawComment = genRawText(N.Description); - RawComment.erase(0, RawComment.find_first_not_of(" \t\r\n")); - RawComment.erase(RawComment.find_last_not_of(" \t\r\n") + 1); - Members << "| " << (RawComment.empty() ? "--" : RawComment) << " "; - } - Members << "|\n"; - } - } + if (!I.Members.empty()) + for (const auto &N : I.Members) + Members << "| " << N.Name << " |\n"; writeLine(Members.str(), OS); maybeWriteSourceFileRef(OS, CDCtx, I.DefLoc); diff --git a/clang-tools-extra/clang-doc/assets/enum-template.mustache b/clang-tools-extra/clang-doc/assets/enum-template.mustache index f39d176bed4f8..da7f6e67510ef 100644 --- a/clang-tools-extra/clang-doc/assets/enum-template.mustache +++ b/clang-tools-extra/clang-doc/assets/enum-template.mustache @@ -14,10 +14,8 @@ <tbody> <tr> <th>Name</th> - <th>Value</th> - {{#HasComments}} - <th>Comments</th> - {{/HasComments}} + <th>Value</th>{{#HasComments}} + <th>Comments</th>{{/HasComments}} </tr> {{#Members}} <tr> diff --git a/clang-tools-extra/test/clang-doc/enum.cpp b/clang-tools-extra/test/clang-doc/enum.cpp index 1a5086078cbec..4624f6cc8daa7 100644 --- a/clang-tools-extra/test/clang-doc/enum.cpp +++ b/clang-tools-extra/test/clang-doc/enum.cpp @@ -33,9 +33,9 @@ enum Color { // MD-INDEX: ## Enums // MD-INDEX: | enum Color | // MD-INDEX: -- -// MD-INDEX: | Red | 0 | Comment 1 | -// MD-INDEX: | Green | 1 | Comment 2 | -// MD-INDEX: | Blue | 2 | Comment 3 | +// MD-INDEX: | Red | +// MD-INDEX: | Green | +// MD-INDEX: | Blue | // MD-INDEX: **brief** For specifying RGB colors // HTML-INDEX-LABEL: <div id="{{([0-9A-F]{40})}}" class="delimiter-container"> @@ -93,9 +93,9 @@ enum class Shapes { }; // MD-INDEX: | enum class Shapes | // MD-INDEX: -- -// MD-INDEX: | Circle | 0 | Comment 1 | -// MD-INDEX: | Rectangle | 1 | Comment 2 | -// MD-INDEX: | Triangle | 2 | Comment 3 | +// MD-INDEX: | Circle | +// MD-INDEX: | Rectangle | +// MD-INDEX: | Triangle | // MD-INDEX: **brief** Shape Types // HTML-INDEX-LABEL: <div id="{{([0-9A-F]{40})}}" class="delimiter-container"> @@ -151,9 +151,9 @@ enum Size : uint8_t { // MD-INDEX: | enum Size : uint8_t | // MD-INDEX: -- -// MD-INDEX: | Small | 0 | A pearl | -// MD-INDEX: | Medium | 1 | A tennis ball | -// MD-INDEX: | Large | 2 | A football | +// MD-INDEX: | Small | +// MD-INDEX: | Medium | +// MD-INDEX: | Large | // MD-INDEX: **brief** Specify the size // HTML-INDEX-LABEL: <div id="{{([0-9A-F]{40})}}" class="delimiter-container"> @@ -206,7 +206,7 @@ enum : long long { // MD-INDEX: | enum (unnamed) : long long | // MD-INDEX: -- -// MD-INDEX: | BigVal | 999999999999 | A very large value | +// MD-INDEX: | BigVal | // MD-INDEX: **brief** Very long number // HTML-INDEX-LABEL: <div id="{{([0-9A-F]{40})}}" class="delimiter-container"> @@ -254,9 +254,9 @@ class FilePermissions { // MD-PERM: | enum (unnamed) | // MD-PERM: -- -// MD-PERM: | Read | 1 | Permission to READ r | -// MD-PERM: | Write | 2 | Permission to WRITE w | -// MD-PERM: | Execute | 4 | Permission to EXECUTE x | +// MD-PERM: | Read | +// MD-PERM: | Write | +// MD-PERM: | Execute | // MD-PERM: **brief** File permission flags // HTML-PERM-LABEL: <section id="Enums" class="section-container"> @@ -364,9 +364,9 @@ class Animals { // MD-ANIMAL: ## Enums // MD-ANIMAL: | enum AnimalType | // MD-ANIMAL: -- -// MD-ANIMAL: | Dog | 0 | Man's best friend | -// MD-ANIMAL: | Cat | 1 | Man's other best friend | -// MD-ANIMAL: | Iguana | 2 | A lizard | +// MD-ANIMAL: | Dog | +// MD-ANIMAL: | Cat | +// MD-ANIMAL: | Iguana | // MD-ANIMAL: **brief** specify what animal the class is namespace Vehicles { @@ -388,10 +388,10 @@ enum Car { // MD-VEHICLES: ## Enums // MD-VEHICLES: | enum Car | // MD-VEHICLES: -- -// MD-VEHICLES: | Sedan | 0 | Comment 1 | -// MD-VEHICLES: | SUV | 1 | Comment 2 | -// MD-VEHICLES: | Pickup | 2 | Comment 3 | -// MD-VEHICLES: | Hatchback | 3 | Comment 4 | +// MD-VEHICLES: | Sedan | +// MD-VEHICLES: | SUV | +// MD-VEHICLES: | Pickup | +// MD-VEHICLES: | Hatchback | // MD-VEHICLES: **brief** specify type of car // HTML-VEHICLES-LABEL: <div id="{{([0-9A-F]{40})}}" class="delimiter-container"> @@ -447,9 +447,9 @@ enum ColorUserSpecified { // MD-INDEX: | enum ColorUserSpecified | // MD-INDEX: -- -// MD-INDEX: | RedUserSpecified | 65 | -// MD-INDEX: | GreenUserSpecified | 2 | -// MD-INDEX: | BlueUserSpecified | 67 | +// MD-INDEX: | RedUserSpecified | +// MD-INDEX: | GreenUserSpecified | +// MD-INDEX: | BlueUserSpecified | // HTML-INDEX-LABEL: <div id="{{([0-9A-F]{40})}}" class="delimiter-container"> // HTML-INDEX-NEXT: <div> @@ -460,7 +460,7 @@ enum ColorUserSpecified { // HTML-INDEX-NEXT: <tr> // HTML-INDEX-NEXT: <th>Name</th> // HTML-INDEX-NEXT: <th>Value</th> -// HTML-INDEX: </tr> +// HTML-INDEX-NEXT: </tr> // HTML-INDEX-NEXT: <tr> // HTML-INDEX-NEXT: <td>RedUserSpecified</td> // HTML-INDEX-NEXT: <td>'A'</td> >From 1872456591e6a8f44894baa772f033b60c813ec2 Mon Sep 17 00:00:00 2001 From: Samrudh Nelli <[email protected]> Date: Fri, 27 Feb 2026 19:01:16 +0530 Subject: [PATCH 07/12] fix unittests --- clang-tools-extra/unittests/clang-doc/MDGeneratorTest.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/clang-tools-extra/unittests/clang-doc/MDGeneratorTest.cpp b/clang-tools-extra/unittests/clang-doc/MDGeneratorTest.cpp index b6d02974020a1..b44b09b28e90f 100644 --- a/clang-tools-extra/unittests/clang-doc/MDGeneratorTest.cpp +++ b/clang-tools-extra/unittests/clang-doc/MDGeneratorTest.cpp @@ -199,7 +199,7 @@ TEST_F(MDGeneratorTest, emitEnumMD) { -- -| X | 0 | +| X | *Defined at test.cpp#10* >From 8085ea1f77fbc8b0bfb69c3f692ca079cda36db4 Mon Sep 17 00:00:00 2001 From: Samrudh Nelli <[email protected]> Date: Mon, 2 Mar 2026 13:09:52 +0530 Subject: [PATCH 08/12] Handle richer processing of comments, update the tests and template --- clang-tools-extra/clang-doc/JSONGenerator.cpp | 24 ++-- .../clang-doc/assets/enum-template.mustache | 6 +- clang-tools-extra/test/clang-doc/enum.cpp | 117 +++++++++++++----- 3 files changed, 105 insertions(+), 42 deletions(-) diff --git a/clang-tools-extra/clang-doc/JSONGenerator.cpp b/clang-tools-extra/clang-doc/JSONGenerator.cpp index 561306d5af353..85e4a47e1e127 100644 --- a/clang-tools-extra/clang-doc/JSONGenerator.cpp +++ b/clang-tools-extra/clang-doc/JSONGenerator.cpp @@ -570,16 +570,20 @@ static void serializeInfo(const EnumValueInfo &I, Object &Obj) { if (I.Description.empty()) return; - json::Value CommentsArray = Array(); - auto &CommentsArrayRef = *CommentsArray.getAsArray(); - Object TempObj; - for (const auto &Child : I.Description) { - for (const auto &CI : Child.Children) - if (Object ChildJson = serializeComment(*CI, TempObj); !ChildJson.empty()) - CommentsArrayRef.push_back(std::move(ChildJson)); - } - if (!CommentsArrayRef.empty()) - Obj["Description"] = CommentsArray; + Object Description = Object(); + auto &Comments = I.Description.at(0).Children; + for (const auto &CommentInfo : Comments) { + json::Value Comment = serializeComment(*CommentInfo, Description); + if (auto *ParagraphComment = Comment.getAsObject(); + ParagraphComment->get("ParagraphComment")) { + auto TextCommentsArray = extractTextComments(ParagraphComment); + if (TextCommentsArray.kind() == json::Value::Null || + TextCommentsArray.getAsArray()->empty()) + continue; + insertComment(Description, TextCommentsArray, "ParagraphComments"); + } + } + Obj["Description"] = std::move(Description); } static void serializeInfo(const EnumInfo &I, json::Object &Obj, diff --git a/clang-tools-extra/clang-doc/assets/enum-template.mustache b/clang-tools-extra/clang-doc/assets/enum-template.mustache index da7f6e67510ef..f39d176bed4f8 100644 --- a/clang-tools-extra/clang-doc/assets/enum-template.mustache +++ b/clang-tools-extra/clang-doc/assets/enum-template.mustache @@ -14,8 +14,10 @@ <tbody> <tr> <th>Name</th> - <th>Value</th>{{#HasComments}} - <th>Comments</th>{{/HasComments}} + <th>Value</th> + {{#HasComments}} + <th>Comments</th> + {{/HasComments}} </tr> {{#Members}} <tr> diff --git a/clang-tools-extra/test/clang-doc/enum.cpp b/clang-tools-extra/test/clang-doc/enum.cpp index 4624f6cc8daa7..6489667b5d1bd 100644 --- a/clang-tools-extra/test/clang-doc/enum.cpp +++ b/clang-tools-extra/test/clang-doc/enum.cpp @@ -1,8 +1,10 @@ // RUN: rm -rf %t && mkdir -p %t // RUN: clang-doc --format=html --doxygen --output=%t --executor=standalone %s // RUN: clang-doc --format=md --doxygen --output=%t --executor=standalone %s +// RUN: clang-doc --format=json --doxygen --output=%t --executor=standalone %s // RUN: FileCheck %s < %t/html/GlobalNamespace/index.html --check-prefix=HTML-INDEX-LINE // RUN: FileCheck %s < %t/html/GlobalNamespace/index.html --check-prefix=HTML-INDEX +// RUN: FileCheck %s < %t/json/GlobalNamespace/index.json --check-prefix=JSON-INDEX // RUN: FileCheck %s < %t/html/GlobalNamespace/_ZTV7Animals.html --check-prefix=HTML-ANIMAL-LINE // RUN: FileCheck %s < %t/html/GlobalNamespace/_ZTV7Animals.html --check-prefix=HTML-ANIMAL // RUN: FileCheck %s < %t/html/GlobalNamespace/_ZTV15FilePermissions.html --check-prefix=HTML-PERM-LINE @@ -52,19 +54,25 @@ enum Color { // HTML-INDEX-NEXT: <tr> // HTML-INDEX-NEXT: <td>Red</td> // HTML-INDEX-NEXT: <td>0</td> -// HTML-INDEX-NEXT: <td> Comment 1 +// HTML-INDEX-NEXT: <td><div class="nested-delimiter-container"> +// HTML-INDEX-NEXT: <p> Comment 1</p> +// HTML-INDEX-NEXT: </div> // HTML-INDEX-NEXT: </td> // HTML-INDEX-NEXT: </tr> // HTML-INDEX-NEXT: <tr> // HTML-INDEX-NEXT: <td>Green</td> // HTML-INDEX-NEXT: <td>1</td> -// HTML-INDEX-NEXT: <td> Comment 2 +// HTML-INDEX-NEXT: <td><div class="nested-delimiter-container"> +// HTML-INDEX-NEXT: <p> Comment 2</p> +// HTML-INDEX-NEXT: </div> // HTML-INDEX-NEXT: </td> // HTML-INDEX-NEXT: </tr> // HTML-INDEX-NEXT: <tr> // HTML-INDEX-NEXT: <td>Blue</td> // HTML-INDEX-NEXT: <td>2</td> -// HTML-INDEX-NEXT: <td> Comment 3 +// HTML-INDEX-NEXT: <td><div class="nested-delimiter-container"> +// HTML-INDEX-NEXT: <p> Comment 3</p> +// HTML-INDEX-NEXT: </div> // HTML-INDEX-NEXT: </td> // HTML-INDEX-NEXT: </tr> // HTML-INDEX-NEXT: </tbody> @@ -74,9 +82,11 @@ 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-52]] of file {{.*}}clang-tools-extra{{[\/]}}test{{[\/]}}clang-doc{{[\/]}}enum.cpp</p> +// HTML-INDEX-NEXT: <p>Defined at line [[@LINE-58]] of file {{.*}}clang-tools-extra{{[\/]}}test{{[\/]}}clang-doc{{[\/]}}enum.cpp</p> // HTML-INDEX-NEXT: </div> +// JSON-INDEX: "TextComment": " Comment 1" + /** * @brief Shape Types */ @@ -112,19 +122,25 @@ enum class Shapes { // HTML-INDEX-NEXT: <tr> // HTML-INDEX-NEXT: <td>Circle</td> // HTML-INDEX-NEXT: <td>0</td> -// HTML-INDEX-NEXT: <td> Comment 1 +// HTML-INDEX-NEXT: <td><div class="nested-delimiter-container"> +// HTML-INDEX-NEXT: <p> Comment 1</p> +// HTML-INDEX-NEXT: </div> // HTML-INDEX-NEXT: </td> // HTML-INDEX-NEXT: </tr> // HTML-INDEX-NEXT: <tr> // HTML-INDEX-NEXT: <td>Rectangle</td> // HTML-INDEX-NEXT: <td>1</td> -// HTML-INDEX-NEXT: <td> Comment 2 +// HTML-INDEX-NEXT: <td><div class="nested-delimiter-container"> +// HTML-INDEX-NEXT: <p> Comment 2</p> +// HTML-INDEX-NEXT: </div> // HTML-INDEX-NEXT: </td> // HTML-INDEX-NEXT: </tr> // HTML-INDEX-NEXT: <tr> // HTML-INDEX-NEXT: <td>Triangle</td> // HTML-INDEX-NEXT: <td>2</td> -// HTML-INDEX-NEXT: <td> Comment 3 +// HTML-INDEX-NEXT: <td><div class="nested-delimiter-container"> +// HTML-INDEX-NEXT: <p> Comment 3</p> +// HTML-INDEX-NEXT: </div> // HTML-INDEX-NEXT: </td> // HTML-INDEX-NEXT: </tr> // HTML-INDEX-NEXT: </tbody> @@ -134,7 +150,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-54]] of file {{.*}}clang-tools-extra{{[\/]}}test{{[\/]}}clang-doc{{[\/]}}enum.cpp</p> +// HTML-INDEX-NEXT: <p>Defined at line [[@LINE-60]] of file {{.*}}clang-tools-extra{{[\/]}}test{{[\/]}}clang-doc{{[\/]}}enum.cpp</p> // HTML-INDEX-NEXT: </div> typedef unsigned char uint8_t; @@ -144,9 +160,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,19 +195,29 @@ enum Size : uint8_t { // HTML-INDEX-NEXT: <tr> // HTML-INDEX-NEXT: <td>Small</td> // HTML-INDEX-NEXT: <td>0</td> -// HTML-INDEX-NEXT: <td> A pearl +// HTML-INDEX-NEXT: <td><div class="nested-delimiter-container"> +// HTML-INDEX-NEXT: <p> A pearl.</p> +// HTML-INDEX-NEXT: <p> Pearls are quite small.</p> +// HTML-INDEX-NEXT: </div> +// HTML-INDEX-NEXT: <div class="nested-delimiter-container"> +// HTML-INDEX-NEXT: <p> Pearls are used in jewelry.</p> +// HTML-INDEX-NEXT: </div> // HTML-INDEX-NEXT: </td> // HTML-INDEX-NEXT: </tr> // HTML-INDEX-NEXT: <tr> // HTML-INDEX-NEXT: <td>Medium</td> // HTML-INDEX-NEXT: <td>1</td> -// HTML-INDEX-NEXT: <td> A tennis ball +// HTML-INDEX-NEXT: <td><div class="nested-delimiter-container"> +// HTML-INDEX-NEXT: <p> A tennis ball.</p> +// HTML-INDEX-NEXT: </div> // HTML-INDEX-NEXT: </td> // HTML-INDEX-NEXT: </tr> // HTML-INDEX-NEXT: <tr> // HTML-INDEX-NEXT: <td>Large</td> // HTML-INDEX-NEXT: <td>2</td> -// HTML-INDEX-NEXT: <td> A football +// HTML-INDEX-NEXT: <td><div class="nested-delimiter-container"> +// HTML-INDEX-NEXT: <p> A football.</p> +// HTML-INDEX-NEXT: </div> // HTML-INDEX-NEXT: </td> // HTML-INDEX-NEXT: </tr> // HTML-INDEX-NEXT: </tbody> @@ -192,7 +227,7 @@ enum Size : uint8_t { // HTML-INDEX-NEXT: <p> Specify the size</p> // HTML-INDEX-NEXT: </div> // HTML-INDEX-NEXT: </div> -// HTML-INDEX-NEXT: <p>Defined at line [[@LINE-51]] of file {{.*}}clang-tools-extra{{[\/]}}test{{[\/]}}clang-doc{{[\/]}}enum.cpp</p> +// HTML-INDEX-NEXT: <p>Defined at line [[@LINE-70]] of file {{.*}}clang-tools-extra{{[\/]}}test{{[\/]}}clang-doc{{[\/]}}enum.cpp</p> // HTML-INDEX-NEXT: </div> /** @@ -223,7 +258,9 @@ enum : long long { // HTML-INDEX-NEXT: <tr> // HTML-INDEX-NEXT: <td>BigVal</td> // HTML-INDEX-NEXT: <td>999999999999</td> -// HTML-INDEX-NEXT: <td> A very large value +// HTML-INDEX-NEXT: <td><div class="nested-delimiter-container"> +// HTML-INDEX-NEXT: <p> A very large value</p> +// HTML-INDEX-NEXT: </div> // HTML-INDEX-NEXT: </td> // HTML-INDEX-NEXT: </tr> // HTML-INDEX-NEXT: </tbody> @@ -233,7 +270,7 @@ enum : long long { // HTML-INDEX-NEXT: <p> Very long number</p> // HTML-INDEX-NEXT: </div> // HTML-INDEX-NEXT: </div> -// HTML-INDEX-NEXT: <p>Defined at line [[@LINE-35]] of file {{.*}}clang-tools-extra{{[\/]}}test{{[\/]}}clang-doc{{[\/]}}enum.cpp</p> +// HTML-INDEX-NEXT: <p>Defined at line [[@LINE-37]] of file {{.*}}clang-tools-extra{{[\/]}}test{{[\/]}}clang-doc{{[\/]}}enum.cpp</p> // HTML-INDEX-NEXT: </div> class FilePermissions { @@ -275,19 +312,25 @@ class FilePermissions { // HTML-PERM-NEXT: <tr> // HTML-PERM-NEXT: <td>Read</td> // HTML-PERM-NEXT: <td>1</td> -// HTML-PERM-NEXT: <td> Permission to READ r +// HTML-PERM-NEXT: <td><div class="nested-delimiter-container"> +// HTML-PERM-NEXT: <p> Permission to READ r</p> +// HTML-PERM-NEXT: </div> // HTML-PERM-NEXT: </td> // HTML-PERM-NEXT: </tr> // HTML-PERM-NEXT: <tr> // HTML-PERM-NEXT: <td>Write</td> // HTML-PERM-NEXT: <td>2</td> -// HTML-PERM-NEXT: <td> Permission to WRITE w +// HTML-PERM-NEXT: <td><div class="nested-delimiter-container"> +// HTML-PERM-NEXT: <p> Permission to WRITE w</p> +// HTML-PERM-NEXT: </div> // HTML-PERM-NEXT: </td> // HTML-PERM-NEXT: </tr> // HTML-PERM-NEXT: <tr> // HTML-PERM-NEXT: <td>Execute</td> // HTML-PERM-NEXT: <td>4</td> -// HTML-PERM-NEXT: <td> Permission to EXECUTE x +// HTML-PERM-NEXT: <td><div class="nested-delimiter-container"> +// HTML-PERM-NEXT: <p> Permission to EXECUTE x</p> +// HTML-PERM-NEXT: </div> // HTML-PERM-NEXT: </td> // HTML-PERM-NEXT: </tr> // HTML-PERM-NEXT: </tbody> @@ -297,7 +340,7 @@ class FilePermissions { // HTML-PERM-NEXT: <p> File permission flags</p> // HTML-PERM-NEXT: </div> // HTML-PERM-NEXT: </div> -// HTML-PERM-NEXT: <p>Defined at line [[@LINE-54]] of file {{.*}}clang-tools-extra{{[\/]}}test{{[\/]}}clang-doc{{[\/]}}enum.cpp</p> +// HTML-PERM-NEXT: <p>Defined at line [[@LINE-60]] of file {{.*}}clang-tools-extra{{[\/]}}test{{[\/]}}clang-doc{{[\/]}}enum.cpp</p> // HTML-PERM-NEXT: </div> // HTML-PERM-NEXT: </section> @@ -334,19 +377,25 @@ class Animals { // HTML-ANIMAL-NEXT: <tr> // HTML-ANIMAL-NEXT: <td>Dog</td> // HTML-ANIMAL-NEXT: <td>0</td> -// HTML-ANIMAL-NEXT: <td> Man's best friend +// HTML-ANIMAL-NEXT: <td><div class="nested-delimiter-container"> +// HTML-ANIMAL-NEXT: <p> Man's best friend</p> +// HTML-ANIMAL-NEXT: </div> // HTML-ANIMAL-NEXT: </td> // HTML-ANIMAL-NEXT: </tr> // HTML-ANIMAL-NEXT: <tr> // HTML-ANIMAL-NEXT: <td>Cat</td> // HTML-ANIMAL-NEXT: <td>1</td> -// HTML-ANIMAL-NEXT: <td> Man's other best friend +// HTML-ANIMAL-NEXT: <td><div class="nested-delimiter-container"> +// HTML-ANIMAL-NEXT: <p> Man's other best friend</p> +// HTML-ANIMAL-NEXT: </div> // HTML-ANIMAL-NEXT: </td> // HTML-ANIMAL-NEXT: </tr> // HTML-ANIMAL-NEXT: <tr> // HTML-ANIMAL-NEXT: <td>Iguana</td> // HTML-ANIMAL-NEXT: <td>2</td> -// HTML-ANIMAL-NEXT: <td> A lizard +// HTML-ANIMAL-NEXT: <td><div class="nested-delimiter-container"> +// HTML-ANIMAL-NEXT: <p> A lizard</p> +// HTML-ANIMAL-NEXT: </div> // HTML-ANIMAL-NEXT: </td> // HTML-ANIMAL-NEXT: </tr> // HTML-ANIMAL-NEXT: </tbody> @@ -356,7 +405,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-47]] of file {{.*}}enum.cpp</p> +// HTML-ANIMAL-NEXT: <p>Defined at line [[@LINE-53]] of file {{.*}}enum.cpp</p> // HTML-ANIMAL-NEXT: </div> // HTML-ANIMAL-NEXT: </section> @@ -408,25 +457,33 @@ enum Car { // HTML-VEHICLES-NEXT: <tr> // HTML-VEHICLES-NEXT: <td>Sedan</td> // HTML-VEHICLES-NEXT: <td>0</td> -// HTML-VEHICLES-NEXT: <td> Comment 1 +// HTML-VEHICLES-NEXT: <td><div class="nested-delimiter-container"> +// HTML-VEHICLES-NEXT: <p> Comment 1</p> +// HTML-VEHICLES-NEXT: </div> // HTML-VEHICLES-NEXT: </td> // HTML-VEHICLES-NEXT: </tr> // HTML-VEHICLES-NEXT: <tr> // HTML-VEHICLES-NEXT: <td>SUV</td> // HTML-VEHICLES-NEXT: <td>1</td> -// HTML-VEHICLES-NEXT: <td> Comment 2 +// HTML-VEHICLES-NEXT: <td><div class="nested-delimiter-container"> +// HTML-VEHICLES-NEXT: <p> Comment 2</p> +// HTML-VEHICLES-NEXT: </div> // HTML-VEHICLES-NEXT: </td> // HTML-VEHICLES-NEXT: </tr> // HTML-VEHICLES-NEXT: <tr> // HTML-VEHICLES-NEXT: <td>Pickup</td> // HTML-VEHICLES-NEXT: <td>2</td> -// HTML-VEHICLES-NEXT: <td> Comment 3 +// HTML-VEHICLES-NEXT: <td><div class="nested-delimiter-container"> +// HTML-VEHICLES-NEXT: <p> Comment 3</p> +// HTML-VEHICLES-NEXT: </div> // HTML-VEHICLES-NEXT: </td> // HTML-VEHICLES-NEXT: </tr> // HTML-VEHICLES-NEXT: <tr> // HTML-VEHICLES-NEXT: <td>Hatchback</td> // HTML-VEHICLES-NEXT: <td>3</td> -// HTML-VEHICLES-NEXT: <td> Comment 4 +// HTML-VEHICLES-NEXT: <td><div class="nested-delimiter-container"> +// HTML-VEHICLES-NEXT: <p> Comment 4</p> +// HTML-VEHICLES-NEXT: </div> // HTML-VEHICLES-NEXT: </td> // HTML-VEHICLES-NEXT: </tr> // HTML-VEHICLES-NEXT: </tbody> @@ -436,7 +493,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-63]] of file {{.*}}clang-tools-extra{{[\/]}}test{{[\/]}}clang-doc{{[\/]}}enum.cpp</p> +// HTML-VEHICLES-NEXT: <p>Defined at line [[@LINE-71]] of file {{.*}}clang-tools-extra{{[\/]}}test{{[\/]}}clang-doc{{[\/]}}enum.cpp</p> // HTML-VEHICLES-NEXT: </div> enum ColorUserSpecified { >From b7ef4af55a7fdcacb8c0d7af623350eed5d00bf4 Mon Sep 17 00:00:00 2001 From: Samrudh Nelli <[email protected]> Date: Mon, 2 Mar 2026 13:40:22 +0530 Subject: [PATCH 09/12] remove unused header file --- clang-tools-extra/clang-doc/JSONGenerator.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/clang-tools-extra/clang-doc/JSONGenerator.cpp b/clang-tools-extra/clang-doc/JSONGenerator.cpp index 85e4a47e1e127..96b7df0d15775 100644 --- a/clang-tools-extra/clang-doc/JSONGenerator.cpp +++ b/clang-tools-extra/clang-doc/JSONGenerator.cpp @@ -1,6 +1,5 @@ #include "Generators.h" #include "clang/Basic/Specifiers.h" -#include "llvm/ADT/StringRef.h" #include "llvm/Support/JSON.h" using namespace llvm; >From 4284881ddd646cdbcd04129ae363d94c9eb65436 Mon Sep 17 00:00:00 2001 From: Samrudh Nelli <[email protected]> Date: Mon, 2 Mar 2026 13:47:52 +0530 Subject: [PATCH 10/12] use -NEXT in clang-tools-extra/test/clang-doc/mustache-index.cpp --- clang-tools-extra/test/clang-doc/mustache-index.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/clang-tools-extra/test/clang-doc/mustache-index.cpp b/clang-tools-extra/test/clang-doc/mustache-index.cpp index 7c4c65894fc6e..6e308ada51a45 100644 --- a/clang-tools-extra/test/clang-doc/mustache-index.cpp +++ b/clang-tools-extra/test/clang-doc/mustache-index.cpp @@ -39,7 +39,7 @@ class Foo; // CHECK-NEXT: <tr> // CHECK-NEXT: <th>Name</th> // CHECK-NEXT: <th>Value</th> -// CHECK: </tr> +// CHECK-NEXT: </tr> // CHECK-NEXT: <tr> // CHECK-NEXT: <td>RED</td> // CHECK-NEXT: <td>0</td> >From 3eb4e6322732989aa4423ec9b30588e683b50e7d Mon Sep 17 00:00:00 2001 From: Samrudh Nelli <[email protected]> Date: Mon, 2 Mar 2026 22:54:00 +0530 Subject: [PATCH 11/12] revert usage of lambda for setting HasComments --- clang-tools-extra/clang-doc/JSONGenerator.cpp | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/clang-tools-extra/clang-doc/JSONGenerator.cpp b/clang-tools-extra/clang-doc/JSONGenerator.cpp index 96b7df0d15775..d6b333bd67a21 100644 --- a/clang-tools-extra/clang-doc/JSONGenerator.cpp +++ b/clang-tools-extra/clang-doc/JSONGenerator.cpp @@ -600,16 +600,15 @@ static void serializeInfo(const EnumInfo &I, json::Object &Obj, Obj["BaseType"] = BaseTypeVal; } - if (!I.Members.empty()) - serializeArray(I.Members, Obj, "Members", SerializeInfoLambda, "End", - [&I](Object &JsonObj) { - for (const auto &Member : I.Members) { - if (!Member.Description.empty()) { - JsonObj["HasComments"] = true; - break; - } - } - }); + if (!I.Members.empty()) { + for (const auto &Member : I.Members) { + if (!Member.Description.empty()) { + Obj["HasComments"] = true; + break; + } + } + serializeArray(I.Members, Obj, "Members", SerializeInfoLambda); + } } static void >From eaf02b3d334be01295c1ff27b83462c188d7c91a Mon Sep 17 00:00:00 2001 From: Samrudh Nelli <[email protected]> Date: Mon, 2 Mar 2026 23:15:36 +0530 Subject: [PATCH 12/12] remove the leading whitespace --- clang-tools-extra/clang-doc/Serialize.cpp | 6 +- clang-tools-extra/test/clang-doc/enum.cpp | 74 +++++++++++------------ 2 files changed, 40 insertions(+), 40 deletions(-) diff --git a/clang-tools-extra/clang-doc/Serialize.cpp b/clang-tools-extra/clang-doc/Serialize.cpp index f07187132cc07..c0a3c08a9855a 100644 --- a/clang-tools-extra/clang-doc/Serialize.cpp +++ b/clang-tools-extra/clang-doc/Serialize.cpp @@ -249,14 +249,14 @@ void ClangDocCommentVisitor::parseComment(const comments::Comment *C) { void ClangDocCommentVisitor::visitTextComment(const TextComment *C) { if (!isWhitespaceOnly(C->getText())) - CurrentCI.Text = C->getText(); + CurrentCI.Text = C->getText().trim().str(); } void ClangDocCommentVisitor::visitInlineCommandComment( const InlineCommandComment *C) { CurrentCI.Name = getCommandName(C->getCommandID()); for (unsigned I = 0, E = C->getNumArgs(); I != E; ++I) - CurrentCI.Args.push_back(C->getArgText(I)); + CurrentCI.Args.push_back(C->getArgText(I).trim()); } void ClangDocCommentVisitor::visitHTMLStartTagComment( @@ -280,7 +280,7 @@ void ClangDocCommentVisitor::visitBlockCommandComment( const BlockCommandComment *C) { CurrentCI.Name = getCommandName(C->getCommandID()); for (unsigned I = 0, E = C->getNumArgs(); I < E; ++I) - CurrentCI.Args.push_back(C->getArgText(I)); + CurrentCI.Args.push_back(C->getArgText(I).trim()); } void ClangDocCommentVisitor::visitParamCommandComment( diff --git a/clang-tools-extra/test/clang-doc/enum.cpp b/clang-tools-extra/test/clang-doc/enum.cpp index 6489667b5d1bd..2367cb8e2c2f1 100644 --- a/clang-tools-extra/test/clang-doc/enum.cpp +++ b/clang-tools-extra/test/clang-doc/enum.cpp @@ -38,7 +38,7 @@ enum Color { // MD-INDEX: | Red | // MD-INDEX: | Green | // MD-INDEX: | Blue | -// MD-INDEX: **brief** For specifying RGB colors +// MD-INDEX: **brief**For specifying RGB colors // HTML-INDEX-LABEL: <div id="{{([0-9A-F]{40})}}" class="delimiter-container"> // HTML-INDEX-NEXT: <div> @@ -55,7 +55,7 @@ enum Color { // HTML-INDEX-NEXT: <td>Red</td> // HTML-INDEX-NEXT: <td>0</td> // HTML-INDEX-NEXT: <td><div class="nested-delimiter-container"> -// HTML-INDEX-NEXT: <p> Comment 1</p> +// HTML-INDEX-NEXT: <p>Comment 1</p> // HTML-INDEX-NEXT: </div> // HTML-INDEX-NEXT: </td> // HTML-INDEX-NEXT: </tr> @@ -63,7 +63,7 @@ enum Color { // HTML-INDEX-NEXT: <td>Green</td> // HTML-INDEX-NEXT: <td>1</td> // HTML-INDEX-NEXT: <td><div class="nested-delimiter-container"> -// HTML-INDEX-NEXT: <p> Comment 2</p> +// HTML-INDEX-NEXT: <p>Comment 2</p> // HTML-INDEX-NEXT: </div> // HTML-INDEX-NEXT: </td> // HTML-INDEX-NEXT: </tr> @@ -71,7 +71,7 @@ enum Color { // HTML-INDEX-NEXT: <td>Blue</td> // HTML-INDEX-NEXT: <td>2</td> // HTML-INDEX-NEXT: <td><div class="nested-delimiter-container"> -// HTML-INDEX-NEXT: <p> Comment 3</p> +// HTML-INDEX-NEXT: <p>Comment 3</p> // HTML-INDEX-NEXT: </div> // HTML-INDEX-NEXT: </td> // HTML-INDEX-NEXT: </tr> @@ -79,13 +79,13 @@ enum Color { // HTML-INDEX-NEXT: </table> // HTML-INDEX-NEXT: <div class="doc-card"> // HTML-INDEX-NEXT: <div class="nested-delimiter-container"> -// HTML-INDEX-NEXT: <p> For specifying RGB colors</p> +// HTML-INDEX-NEXT: <p>For specifying RGB colors</p> // HTML-INDEX-NEXT: </div> // HTML-INDEX-NEXT: </div> // HTML-INDEX-NEXT: <p>Defined at line [[@LINE-58]] of file {{.*}}clang-tools-extra{{[\/]}}test{{[\/]}}clang-doc{{[\/]}}enum.cpp</p> // HTML-INDEX-NEXT: </div> -// JSON-INDEX: "TextComment": " Comment 1" +// JSON-INDEX: "TextComment": "Comment 1" /** * @brief Shape Types @@ -106,7 +106,7 @@ enum class Shapes { // MD-INDEX: | Circle | // MD-INDEX: | Rectangle | // MD-INDEX: | Triangle | -// MD-INDEX: **brief** Shape Types +// MD-INDEX: **brief**Shape Types // HTML-INDEX-LABEL: <div id="{{([0-9A-F]{40})}}" class="delimiter-container"> // HTML-INDEX-NEXT: <div> @@ -123,7 +123,7 @@ enum class Shapes { // HTML-INDEX-NEXT: <td>Circle</td> // HTML-INDEX-NEXT: <td>0</td> // HTML-INDEX-NEXT: <td><div class="nested-delimiter-container"> -// HTML-INDEX-NEXT: <p> Comment 1</p> +// HTML-INDEX-NEXT: <p>Comment 1</p> // HTML-INDEX-NEXT: </div> // HTML-INDEX-NEXT: </td> // HTML-INDEX-NEXT: </tr> @@ -131,7 +131,7 @@ enum class Shapes { // HTML-INDEX-NEXT: <td>Rectangle</td> // HTML-INDEX-NEXT: <td>1</td> // HTML-INDEX-NEXT: <td><div class="nested-delimiter-container"> -// HTML-INDEX-NEXT: <p> Comment 2</p> +// HTML-INDEX-NEXT: <p>Comment 2</p> // HTML-INDEX-NEXT: </div> // HTML-INDEX-NEXT: </td> // HTML-INDEX-NEXT: </tr> @@ -139,7 +139,7 @@ enum class Shapes { // HTML-INDEX-NEXT: <td>Triangle</td> // HTML-INDEX-NEXT: <td>2</td> // HTML-INDEX-NEXT: <td><div class="nested-delimiter-container"> -// HTML-INDEX-NEXT: <p> Comment 3</p> +// HTML-INDEX-NEXT: <p>Comment 3</p> // HTML-INDEX-NEXT: </div> // HTML-INDEX-NEXT: </td> // HTML-INDEX-NEXT: </tr> @@ -147,7 +147,7 @@ enum class Shapes { // HTML-INDEX-NEXT: </table> // HTML-INDEX-NEXT: <div class="doc-card"> // HTML-INDEX-NEXT: <div class="nested-delimiter-container"> -// HTML-INDEX-NEXT: <p> Shape Types</p> +// HTML-INDEX-NEXT: <p>Shape Types</p> // HTML-INDEX-NEXT: </div> // HTML-INDEX-NEXT: </div> // HTML-INDEX-NEXT: <p>Defined at line [[@LINE-60]] of file {{.*}}clang-tools-extra{{[\/]}}test{{[\/]}}clang-doc{{[\/]}}enum.cpp</p> @@ -179,7 +179,7 @@ enum Size : uint8_t { // MD-INDEX: | Small | // MD-INDEX: | Medium | // MD-INDEX: | Large | -// MD-INDEX: **brief** Specify the size +// MD-INDEX: **brief**Specify the size // HTML-INDEX-LABEL: <div id="{{([0-9A-F]{40})}}" class="delimiter-container"> // HTML-INDEX-NEXT: <div> @@ -196,11 +196,11 @@ enum Size : uint8_t { // HTML-INDEX-NEXT: <td>Small</td> // HTML-INDEX-NEXT: <td>0</td> // HTML-INDEX-NEXT: <td><div class="nested-delimiter-container"> -// HTML-INDEX-NEXT: <p> A pearl.</p> -// HTML-INDEX-NEXT: <p> Pearls are quite small.</p> +// HTML-INDEX-NEXT: <p>A pearl.</p> +// HTML-INDEX-NEXT: <p>Pearls are quite small.</p> // HTML-INDEX-NEXT: </div> // HTML-INDEX-NEXT: <div class="nested-delimiter-container"> -// HTML-INDEX-NEXT: <p> Pearls are used in jewelry.</p> +// HTML-INDEX-NEXT: <p>Pearls are used in jewelry.</p> // HTML-INDEX-NEXT: </div> // HTML-INDEX-NEXT: </td> // HTML-INDEX-NEXT: </tr> @@ -208,7 +208,7 @@ enum Size : uint8_t { // HTML-INDEX-NEXT: <td>Medium</td> // HTML-INDEX-NEXT: <td>1</td> // HTML-INDEX-NEXT: <td><div class="nested-delimiter-container"> -// HTML-INDEX-NEXT: <p> A tennis ball.</p> +// HTML-INDEX-NEXT: <p>A tennis ball.</p> // HTML-INDEX-NEXT: </div> // HTML-INDEX-NEXT: </td> // HTML-INDEX-NEXT: </tr> @@ -216,7 +216,7 @@ enum Size : uint8_t { // HTML-INDEX-NEXT: <td>Large</td> // HTML-INDEX-NEXT: <td>2</td> // HTML-INDEX-NEXT: <td><div class="nested-delimiter-container"> -// HTML-INDEX-NEXT: <p> A football.</p> +// HTML-INDEX-NEXT: <p>A football.</p> // HTML-INDEX-NEXT: </div> // HTML-INDEX-NEXT: </td> // HTML-INDEX-NEXT: </tr> @@ -224,7 +224,7 @@ enum Size : uint8_t { // HTML-INDEX-NEXT: </table> // HTML-INDEX-NEXT: <div class="doc-card"> // HTML-INDEX-NEXT: <div class="nested-delimiter-container"> -// HTML-INDEX-NEXT: <p> Specify the size</p> +// HTML-INDEX-NEXT: <p>Specify the size</p> // HTML-INDEX-NEXT: </div> // HTML-INDEX-NEXT: </div> // HTML-INDEX-NEXT: <p>Defined at line [[@LINE-70]] of file {{.*}}clang-tools-extra{{[\/]}}test{{[\/]}}clang-doc{{[\/]}}enum.cpp</p> @@ -242,7 +242,7 @@ enum : long long { // MD-INDEX: | enum (unnamed) : long long | // MD-INDEX: -- // MD-INDEX: | BigVal | -// MD-INDEX: **brief** Very long number +// MD-INDEX: **brief**Very long number // HTML-INDEX-LABEL: <div id="{{([0-9A-F]{40})}}" class="delimiter-container"> // HTML-INDEX-NEXT: <div> @@ -259,7 +259,7 @@ enum : long long { // HTML-INDEX-NEXT: <td>BigVal</td> // HTML-INDEX-NEXT: <td>999999999999</td> // HTML-INDEX-NEXT: <td><div class="nested-delimiter-container"> -// HTML-INDEX-NEXT: <p> A very large value</p> +// HTML-INDEX-NEXT: <p>A very large value</p> // HTML-INDEX-NEXT: </div> // HTML-INDEX-NEXT: </td> // HTML-INDEX-NEXT: </tr> @@ -267,7 +267,7 @@ enum : long long { // HTML-INDEX-NEXT: </table> // HTML-INDEX-NEXT: <div class="doc-card"> // HTML-INDEX-NEXT: <div class="nested-delimiter-container"> -// HTML-INDEX-NEXT: <p> Very long number</p> +// HTML-INDEX-NEXT: <p>Very long number</p> // HTML-INDEX-NEXT: </div> // HTML-INDEX-NEXT: </div> // HTML-INDEX-NEXT: <p>Defined at line [[@LINE-37]] of file {{.*}}clang-tools-extra{{[\/]}}test{{[\/]}}clang-doc{{[\/]}}enum.cpp</p> @@ -294,7 +294,7 @@ class FilePermissions { // MD-PERM: | Read | // MD-PERM: | Write | // MD-PERM: | Execute | -// MD-PERM: **brief** File permission flags +// MD-PERM: **brief**File permission flags // HTML-PERM-LABEL: <section id="Enums" class="section-container"> // HTML-PERM-NEXT: <h2>Enumerations</h2> @@ -313,7 +313,7 @@ class FilePermissions { // HTML-PERM-NEXT: <td>Read</td> // HTML-PERM-NEXT: <td>1</td> // HTML-PERM-NEXT: <td><div class="nested-delimiter-container"> -// HTML-PERM-NEXT: <p> Permission to READ r</p> +// HTML-PERM-NEXT: <p>Permission to READ r</p> // HTML-PERM-NEXT: </div> // HTML-PERM-NEXT: </td> // HTML-PERM-NEXT: </tr> @@ -321,7 +321,7 @@ class FilePermissions { // HTML-PERM-NEXT: <td>Write</td> // HTML-PERM-NEXT: <td>2</td> // HTML-PERM-NEXT: <td><div class="nested-delimiter-container"> -// HTML-PERM-NEXT: <p> Permission to WRITE w</p> +// HTML-PERM-NEXT: <p>Permission to WRITE w</p> // HTML-PERM-NEXT: </div> // HTML-PERM-NEXT: </td> // HTML-PERM-NEXT: </tr> @@ -329,7 +329,7 @@ class FilePermissions { // HTML-PERM-NEXT: <td>Execute</td> // HTML-PERM-NEXT: <td>4</td> // HTML-PERM-NEXT: <td><div class="nested-delimiter-container"> -// HTML-PERM-NEXT: <p> Permission to EXECUTE x</p> +// HTML-PERM-NEXT: <p>Permission to EXECUTE x</p> // HTML-PERM-NEXT: </div> // HTML-PERM-NEXT: </td> // HTML-PERM-NEXT: </tr> @@ -337,7 +337,7 @@ class FilePermissions { // HTML-PERM-NEXT: </table> // HTML-PERM-NEXT: <div class="doc-card"> // HTML-PERM-NEXT: <div class="nested-delimiter-container"> -// HTML-PERM-NEXT: <p> File permission flags</p> +// HTML-PERM-NEXT: <p>File permission flags</p> // HTML-PERM-NEXT: </div> // HTML-PERM-NEXT: </div> // HTML-PERM-NEXT: <p>Defined at line [[@LINE-60]] of file {{.*}}clang-tools-extra{{[\/]}}test{{[\/]}}clang-doc{{[\/]}}enum.cpp</p> @@ -378,7 +378,7 @@ class Animals { // HTML-ANIMAL-NEXT: <td>Dog</td> // HTML-ANIMAL-NEXT: <td>0</td> // HTML-ANIMAL-NEXT: <td><div class="nested-delimiter-container"> -// HTML-ANIMAL-NEXT: <p> Man's best friend</p> +// HTML-ANIMAL-NEXT: <p>Man's best friend</p> // HTML-ANIMAL-NEXT: </div> // HTML-ANIMAL-NEXT: </td> // HTML-ANIMAL-NEXT: </tr> @@ -386,7 +386,7 @@ class Animals { // HTML-ANIMAL-NEXT: <td>Cat</td> // HTML-ANIMAL-NEXT: <td>1</td> // HTML-ANIMAL-NEXT: <td><div class="nested-delimiter-container"> -// HTML-ANIMAL-NEXT: <p> Man's other best friend</p> +// HTML-ANIMAL-NEXT: <p>Man's other best friend</p> // HTML-ANIMAL-NEXT: </div> // HTML-ANIMAL-NEXT: </td> // HTML-ANIMAL-NEXT: </tr> @@ -394,7 +394,7 @@ class Animals { // HTML-ANIMAL-NEXT: <td>Iguana</td> // HTML-ANIMAL-NEXT: <td>2</td> // HTML-ANIMAL-NEXT: <td><div class="nested-delimiter-container"> -// HTML-ANIMAL-NEXT: <p> A lizard</p> +// HTML-ANIMAL-NEXT: <p>A lizard</p> // HTML-ANIMAL-NEXT: </div> // HTML-ANIMAL-NEXT: </td> // HTML-ANIMAL-NEXT: </tr> @@ -402,7 +402,7 @@ class Animals { // HTML-ANIMAL-NEXT: </table> // HTML-ANIMAL-NEXT: <div class="doc-card"> // HTML-ANIMAL-NEXT: <div class="nested-delimiter-container"> -// HTML-ANIMAL-NEXT: <p> specify what animal the class is</p> +// HTML-ANIMAL-NEXT: <p>specify what animal the class is</p> // HTML-ANIMAL-NEXT: </div> // HTML-ANIMAL-NEXT: </div> // HTML-ANIMAL-NEXT: <p>Defined at line [[@LINE-53]] of file {{.*}}enum.cpp</p> @@ -416,7 +416,7 @@ class Animals { // MD-ANIMAL: | Dog | // MD-ANIMAL: | Cat | // MD-ANIMAL: | Iguana | -// MD-ANIMAL: **brief** specify what animal the class is +// MD-ANIMAL: **brief**specify what animal the class is namespace Vehicles { /** @@ -441,7 +441,7 @@ enum Car { // MD-VEHICLES: | SUV | // MD-VEHICLES: | Pickup | // MD-VEHICLES: | Hatchback | -// MD-VEHICLES: **brief** specify type of car +// MD-VEHICLES: **brief**specify type of car // HTML-VEHICLES-LABEL: <div id="{{([0-9A-F]{40})}}" class="delimiter-container"> // HTML-VEHICLES-NEXT: <div> @@ -458,7 +458,7 @@ enum Car { // HTML-VEHICLES-NEXT: <td>Sedan</td> // HTML-VEHICLES-NEXT: <td>0</td> // HTML-VEHICLES-NEXT: <td><div class="nested-delimiter-container"> -// HTML-VEHICLES-NEXT: <p> Comment 1</p> +// HTML-VEHICLES-NEXT: <p>Comment 1</p> // HTML-VEHICLES-NEXT: </div> // HTML-VEHICLES-NEXT: </td> // HTML-VEHICLES-NEXT: </tr> @@ -466,7 +466,7 @@ enum Car { // HTML-VEHICLES-NEXT: <td>SUV</td> // HTML-VEHICLES-NEXT: <td>1</td> // HTML-VEHICLES-NEXT: <td><div class="nested-delimiter-container"> -// HTML-VEHICLES-NEXT: <p> Comment 2</p> +// HTML-VEHICLES-NEXT: <p>Comment 2</p> // HTML-VEHICLES-NEXT: </div> // HTML-VEHICLES-NEXT: </td> // HTML-VEHICLES-NEXT: </tr> @@ -474,7 +474,7 @@ enum Car { // HTML-VEHICLES-NEXT: <td>Pickup</td> // HTML-VEHICLES-NEXT: <td>2</td> // HTML-VEHICLES-NEXT: <td><div class="nested-delimiter-container"> -// HTML-VEHICLES-NEXT: <p> Comment 3</p> +// HTML-VEHICLES-NEXT: <p>Comment 3</p> // HTML-VEHICLES-NEXT: </div> // HTML-VEHICLES-NEXT: </td> // HTML-VEHICLES-NEXT: </tr> @@ -482,7 +482,7 @@ enum Car { // HTML-VEHICLES-NEXT: <td>Hatchback</td> // HTML-VEHICLES-NEXT: <td>3</td> // HTML-VEHICLES-NEXT: <td><div class="nested-delimiter-container"> -// HTML-VEHICLES-NEXT: <p> Comment 4</p> +// HTML-VEHICLES-NEXT: <p>Comment 4</p> // HTML-VEHICLES-NEXT: </div> // HTML-VEHICLES-NEXT: </td> // HTML-VEHICLES-NEXT: </tr> @@ -490,7 +490,7 @@ enum Car { // HTML-VEHICLES-NEXT: </table> // HTML-VEHICLES-NEXT: <div class="doc-card"> // HTML-VEHICLES-NEXT: <div class="nested-delimiter-container"> -// HTML-VEHICLES-NEXT: <p> specify type of car</p> +// HTML-VEHICLES-NEXT: <p>specify type of car</p> // HTML-VEHICLES-NEXT: </div> // HTML-VEHICLES-NEXT: </div> // HTML-VEHICLES-NEXT: <p>Defined at line [[@LINE-71]] of file {{.*}}clang-tools-extra{{[\/]}}test{{[\/]}}clang-doc{{[\/]}}enum.cpp</p> _______________________________________________ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
