From 2b90a0227fa436780f0cbd69cb0d0ea733e12470 Mon Sep 17 00:00:00 2001 From: Vinnie Falco Date: Tue, 20 Jun 2023 05:56:50 -0700 Subject: [PATCH] feat: enum dom and adoc work --- .../generator/asciidoc/partials/enum.adoc.hbs | 9 ++++ include/mrdox/Metadata/Enum.hpp | 1 - source/-XML/XMLWriter.cpp | 22 ++++++++-- source/-adoc/Builder.cpp | 37 +++++----------- source/-adoc/Builder.hpp | 6 +-- source/AST/ASTVisitor.cpp | 7 ++- source/AST/AnyBlock.hpp | 23 +++++++++- source/AST/BitcodeWriter.cpp | 1 + test-files/adoc/test.cpp | 4 ++ test-files/adoc/test.xml | 43 +++++++++++++++++-- 10 files changed, 111 insertions(+), 42 deletions(-) diff --git a/addons/generator/asciidoc/partials/enum.adoc.hbs b/addons/generator/asciidoc/partials/enum.adoc.hbs index ebe236972..fe3b1ce8f 100644 --- a/addons/generator/asciidoc/partials/enum.adoc.hbs +++ b/addons/generator/asciidoc/partials/enum.adoc.hbs @@ -28,5 +28,14 @@ enum {{name}}; === Description {{symbol.doc.description}} +{{/if}} + +{{#if symbol.members}} +{{#each symbol.members}} +{{#if doc.description}} +==== {{name}} +{{doc.description}} +{{/if}} +{{/each}} {{/if}} diff --git a/include/mrdox/Metadata/Enum.hpp b/include/mrdox/Metadata/Enum.hpp index edaa3d5ac..39ea315bc 100644 --- a/include/mrdox/Metadata/Enum.hpp +++ b/include/mrdox/Metadata/Enum.hpp @@ -24,7 +24,6 @@ namespace clang { namespace mrdox { -// FIXME: this does not store javadocs... // Information for a single possible value of an enumeration. struct EnumValueInfo { diff --git a/source/-XML/XMLWriter.cpp b/source/-XML/XMLWriter.cpp index ffa18b273..411ac91c4 100644 --- a/source/-XML/XMLWriter.cpp +++ b/source/-XML/XMLWriter.cpp @@ -285,11 +285,25 @@ writeEnum( writeSourceInfo(I); - for(auto const& v : I.Members) - tags_.write("value", {}, { - { "name", v.Name }, - { "value", v.Value }, + for(auto const& V : I.Members) + { + if(! V.javadoc) + { + tags_.write("value", {}, { + { "name", V.Name }, + { "value", V.Value }, + }); + } + else + { + tags_.open("value", { + { "name", V.Name }, + { "value", V.Value } }); + writeJavadoc(V.javadoc); + tags_.close("value"); + } + } writeJavadoc(I.javadoc); diff --git a/source/-adoc/Builder.cpp b/source/-adoc/Builder.cpp index 3fa1e0e54..ec918ca08 100644 --- a/source/-adoc/Builder.cpp +++ b/source/-adoc/Builder.cpp @@ -206,41 +206,26 @@ createContext( })); } +template Expected Builder:: -operator()(NamespaceInfo const& I) +operator()(T const& I) { return callTemplate( "single-symbol.adoc.hbs", createContext(I.id)); } -Expected -Builder:: -operator()(RecordInfo const& I) -{ - return callTemplate( - "single-symbol.adoc.hbs", - createContext(I.id)); -} - -Expected -Builder:: -operator()(FunctionInfo const& I) -{ - return callTemplate( - "single-symbol.adoc.hbs", - createContext(I.id)); -} +#define DEFINE(T) template Expected \ + Builder::operator()(T const&) -Expected -Builder:: -operator()(EnumInfo const& I) -{ - return callTemplate( - "single-symbol.adoc.hbs", - createContext(I.id)); -} +DEFINE(NamespaceInfo); +DEFINE(RecordInfo); +DEFINE(FunctionInfo); +DEFINE(EnumInfo); +DEFINE(TypedefInfo); +DEFINE(VariableInfo); +DEFINE(FieldInfo); } // adoc } // mrdox diff --git a/source/-adoc/Builder.hpp b/source/-adoc/Builder.hpp index b26d327cb..0ca5034b6 100644 --- a/source/-adoc/Builder.hpp +++ b/source/-adoc/Builder.hpp @@ -49,10 +49,8 @@ class Builder dom::ObjectPtr getSymbol(SymbolID const& id); dom::ObjectPtr createContext(SymbolID const& id); - Expected operator()(NamespaceInfo const&); - Expected operator()(RecordInfo const&); - Expected operator()(FunctionInfo const&); - Expected operator()(EnumInfo const&); + template + Expected operator()(T const&); }; } // adoc diff --git a/source/AST/ASTVisitor.cpp b/source/AST/ASTVisitor.cpp index de0238b13..934e9bb72 100644 --- a/source/AST/ASTVisitor.cpp +++ b/source/AST/ASTVisitor.cpp @@ -576,7 +576,12 @@ parseEnumerators( SmallString<16> ValueStr; E->getInitVal().toString(ValueStr); - I.Members.emplace_back(E->getNameAsString(), ValueStr.str(), ValueExpr); + + I.Members.emplace_back( + E->getNameAsString(), + ValueStr.str(), + ValueExpr); + parseRawComment(I.Members.back().javadoc, E); } } diff --git a/source/AST/AnyBlock.hpp b/source/AST/AnyBlock.hpp index 8b46dcb80..4e38b6c0f 100644 --- a/source/AST/AnyBlock.hpp +++ b/source/AST/AnyBlock.hpp @@ -932,11 +932,14 @@ class TypedefBlock class EnumValueBlock : public BitcodeReader::AnyBlock { EnumValueInfo& I_; + BitcodeReader& br_; public: EnumValueBlock( - EnumValueInfo& I) noexcept + EnumValueInfo& I, + BitcodeReader& br) noexcept : I_(I) + , br_(br) { } @@ -956,6 +959,22 @@ class EnumValueBlock : public BitcodeReader::AnyBlock return AnyBlock::parseRecord(R, ID, Blob); } } + + Error + readSubBlock( + unsigned ID) override + { + switch(ID) + { + case BI_JAVADOC_BLOCK_ID: + { + JavadocBlock B(I_.javadoc, br_); + return br_.readBlock(B, ID); + } + default: + return AnyBlock::readSubBlock(ID); + } + } }; class EnumBlock @@ -997,7 +1016,7 @@ class EnumBlock case BI_ENUM_VALUE_BLOCK_ID: { I->Members.emplace_back(); - EnumValueBlock B(I->Members.back()); + EnumValueBlock B(I->Members.back(), br_); return br_.readBlock(B, ID); } default: diff --git a/source/AST/BitcodeWriter.cpp b/source/AST/BitcodeWriter.cpp index 106214c54..048c41c3d 100644 --- a/source/AST/BitcodeWriter.cpp +++ b/source/AST/BitcodeWriter.cpp @@ -788,6 +788,7 @@ emitBlock( emitRecord(I.Name, ENUM_VALUE_NAME); emitRecord(I.Value, ENUM_VALUE_VALUE); emitRecord(I.ValueExpr, ENUM_VALUE_EXPR); + emitBlock(I.javadoc); } void diff --git a/test-files/adoc/test.cpp b/test-files/adoc/test.cpp index c28d7958f..0fe52e350 100644 --- a/test-files/adoc/test.cpp +++ b/test-files/adoc/test.cpp @@ -1,5 +1,9 @@ struct T {}; +/** This is an enum + + Good enum. +*/ enum E { /** hmm diff --git a/test-files/adoc/test.xml b/test-files/adoc/test.xml index 348615c68..5912fda68 100644 --- a/test-files/adoc/test.xml +++ b/test-files/adoc/test.xml @@ -5,9 +5,44 @@ - - - - + + + + + + hmm + + + + + + + hmm + + + + + + + hmm + + + + + + + hmm + + + + + + This is an enum + + + Good enum. + + +