@@ -48,6 +48,12 @@ class HTMLTag {
4848 TAG_SPAN,
4949 TAG_TITLE,
5050 TAG_UL,
51+ TAG_TABLE,
52+ TAG_THEAD,
53+ TAG_TBODY,
54+ TAG_TR,
55+ TAG_TD,
56+ TAG_TH
5157 };
5258
5359 HTMLTag () = default ;
@@ -133,6 +139,12 @@ bool HTMLTag::isSelfClosing() const {
133139 case HTMLTag::TAG_SPAN:
134140 case HTMLTag::TAG_TITLE:
135141 case HTMLTag::TAG_UL:
142+ case HTMLTag::TAG_TABLE:
143+ case HTMLTag::TAG_THEAD:
144+ case HTMLTag::TAG_TBODY:
145+ case HTMLTag::TAG_TR:
146+ case HTMLTag::TAG_TD:
147+ case HTMLTag::TAG_TH:
136148 return false ;
137149 }
138150 llvm_unreachable (" Unhandled HTMLTag::TagType" );
@@ -174,6 +186,18 @@ StringRef HTMLTag::toString() const {
174186 return " title" ;
175187 case HTMLTag::TAG_UL:
176188 return " ul" ;
189+ case HTMLTag::TAG_TABLE:
190+ return " table" ;
191+ case HTMLTag::TAG_THEAD:
192+ return " thead" ;
193+ case HTMLTag::TAG_TBODY:
194+ return " tbody" ;
195+ case HTMLTag::TAG_TR:
196+ return " tr" ;
197+ case HTMLTag::TAG_TD:
198+ return " td" ;
199+ case HTMLTag::TAG_TH:
200+ return " th" ;
177201 }
178202 llvm_unreachable (" Unhandled HTMLTag::TagType" );
179203}
@@ -377,10 +401,27 @@ genEnumMembersBlock(const llvm::SmallVector<EnumValueInfo, 4> &Members) {
377401 if (Members.empty ())
378402 return nullptr ;
379403
380- auto List = std::make_unique<TagNode>(HTMLTag::TAG_UL);
381- for (const auto &M : Members)
382- List->Children .emplace_back (
383- std::make_unique<TagNode>(HTMLTag::TAG_LI, M.Name ));
404+ auto List = std::make_unique<TagNode>(HTMLTag::TAG_TBODY);
405+
406+ for (const auto &M : Members) {
407+ auto TRNode = std::make_unique<TagNode>(HTMLTag::TAG_TR);
408+ TRNode->Children .emplace_back (
409+ std::make_unique<TagNode>(HTMLTag::TAG_TD, M.Name ));
410+ // Use user supplied value if it exists, otherwise use the value
411+ if (!M.ValueExpr .empty ()) {
412+ TRNode->Children .emplace_back (
413+ std::make_unique<TagNode>(HTMLTag::TAG_TD, M.ValueExpr ));
414+ } else {
415+ TRNode->Children .emplace_back (
416+ std::make_unique<TagNode>(HTMLTag::TAG_TD, M.Value ));
417+ }
418+ if (!M.Description .empty ()) {
419+ auto TD = std::make_unique<TagNode>(HTMLTag::TAG_TD);
420+ TD->Children .emplace_back (genHTML (M.Description ));
421+ TRNode->Children .emplace_back (std::move (TD));
422+ }
423+ List->Children .emplace_back (std::move (TRNode));
424+ }
384425 return List;
385426}
386427
@@ -624,7 +665,7 @@ static std::unique_ptr<HTMLNode> genHTML(const CommentInfo &I) {
624665 }
625666 return std::move (FullComment);
626667 }
627-
668+
628669 if (I.Kind == " ParagraphComment" ) {
629670 auto ParagraphComment = std::make_unique<TagNode>(HTMLTag::TAG_P);
630671 for (const auto &Child : I.Children ) {
@@ -658,22 +699,36 @@ static std::vector<std::unique_ptr<TagNode>>
658699genHTML (const EnumInfo &I, const ClangDocContext &CDCtx) {
659700 std::vector<std::unique_ptr<TagNode>> Out;
660701 std::string EnumType = I.Scoped ? " enum class " : " enum " ;
661-
662- Out.emplace_back (
663- std::make_unique<TagNode>(HTMLTag::TAG_H3, EnumType + I.Name ));
664- Out.back ()->Attributes .emplace_back (" id" ,
665- llvm::toHex (llvm::toStringRef (I.USR )));
666-
667- std::unique_ptr<TagNode> Node = genEnumMembersBlock (I.Members );
668- if (Node)
669- Out.emplace_back (std::move (Node));
702+ // Determine if enum members have comments attached
703+ bool HasComments = std::any_of (
704+ I.Members .begin (), I.Members .end (),
705+ [](const EnumValueInfo &M) { return !M.Description .empty (); });
706+ std::unique_ptr<TagNode> Table =
707+ std::make_unique<TagNode>(HTMLTag::TAG_TABLE);
708+ std::unique_ptr<TagNode> THead =
709+ std::make_unique<TagNode>(HTMLTag::TAG_THEAD);
710+ std::unique_ptr<TagNode> TRow = std::make_unique<TagNode>(HTMLTag::TAG_TR);
711+ std::unique_ptr<TagNode> TD =
712+ std::make_unique<TagNode>(HTMLTag::TAG_TH, EnumType + I.Name );
713+ // Span 3 columns if enum has comments
714+ TD->Attributes .emplace_back (" colspan" , HasComments ? " 3" : " 2" );
715+
716+ Table->Attributes .emplace_back (" id" , llvm::toHex (llvm::toStringRef (I.USR )));
717+ TRow->Children .emplace_back (std::move (TD));
718+ THead->Children .emplace_back (std::move (TRow));
719+ Table->Children .emplace_back (std::move (THead));
720+
721+ if (std::unique_ptr<TagNode> Node = genEnumMembersBlock (I.Members ))
722+ Table->Children .emplace_back (std::move (Node));
723+
724+ Out.emplace_back (std::move (Table));
670725
671726 if (I.DefLoc ) {
672727 if (!CDCtx.RepositoryUrl )
673728 Out.emplace_back (writeFileDefinition (*I.DefLoc ));
674729 else
675- Out.emplace_back (writeFileDefinition (
676- *I.DefLoc , StringRef{*CDCtx.RepositoryUrl }));
730+ Out.emplace_back (
731+ writeFileDefinition ( *I.DefLoc , StringRef{*CDCtx.RepositoryUrl }));
677732 }
678733
679734 std::string Description;
0 commit comments