Skip to content

Commit 9094337

Browse files
vinniefalcosdkrystian
authored andcommitted
feat: doc::Heading
1 parent ae14717 commit 9094337

19 files changed

+301
-91
lines changed

include/mrdox/Metadata/Javadoc.hpp

+91-4
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
#include <mrdox/Support/Error.hpp>
1818
#include <memory>
1919
#include <string>
20+
#include <type_traits>
2021
#include <utility>
2122
#include <vector>
2223

@@ -38,14 +39,15 @@ using List = std::vector<std::unique_ptr<T>>;
3839
enum class Kind
3940
{
4041
text = 1, // needed by bitstream
41-
styled,
42-
paragraph,
43-
brief,
4442
admonition,
43+
brief,
4544
code,
45+
heading,
46+
paragraph,
4647
param,
48+
returns,
49+
styled,
4750
tparam,
48-
returns
4951
};
5052

5153
/** A text style.
@@ -209,6 +211,31 @@ struct Block : Node
209211
}
210212
};
211213

214+
/** A manually specified section heading.
215+
*/
216+
struct Heading : Block
217+
{
218+
static constexpr Kind static_kind = Kind::heading;
219+
220+
String string;
221+
222+
Heading(
223+
String string_ = String())
224+
: Block(Kind::heading)
225+
, string(std::move(string_))
226+
{
227+
}
228+
229+
bool operator==(const Heading&)
230+
const noexcept = default;
231+
232+
bool equals(const Node& other) const noexcept override
233+
{
234+
return kind == other.kind &&
235+
*this == static_cast<const Heading&>(other);
236+
}
237+
};
238+
212239
/** A sequence of text nodes.
213240
*/
214241
struct Paragraph : Block
@@ -383,8 +410,68 @@ struct Returns : Paragraph
383410
}
384411
};
385412

413+
//------------------------------------------------
414+
415+
template<class F, class... Args>
416+
constexpr
417+
auto
418+
visit(
419+
Node const& node,
420+
F&& f, Args&&... args)
421+
{
422+
switch(node.kind)
423+
{
424+
case Kind::admonition:
425+
return f(static_cast<Admonition const&>(node),
426+
std::forward<Args>(args)...);
427+
case Kind::brief:
428+
return f(static_cast<Brief const&>(node),
429+
std::forward<Args>(args)...);
430+
case Kind::code:
431+
return f(static_cast<Code const&>(node),
432+
std::forward<Args>(args)...);
433+
case Kind::heading:
434+
return f(static_cast<Heading const&>(node),
435+
std::forward<Args>(args)...);
436+
case Kind::paragraph:
437+
return f(static_cast<Paragraph const&>(node),
438+
std::forward<Args>(args)...);
439+
case Kind::param:
440+
return f(static_cast<Param const&>(node),
441+
std::forward<Args>(args)...);
442+
case Kind::returns:
443+
return f(static_cast<Returns const&>(node),
444+
std::forward<Args>(args)...);
445+
case Kind::styled:
446+
return f(static_cast<StyledText const&>(node),
447+
std::forward<Args>(args)...);
448+
case Kind::text:
449+
return f(static_cast<Text const&>(node),
450+
std::forward<Args>(args)...);
451+
case Kind::tparam:
452+
return f(static_cast<TParam const&>(node),
453+
std::forward<Args>(args)...);
454+
default:
455+
MRDOX_UNREACHABLE();
456+
}
457+
}
458+
459+
template<class F, class T, class... Args>
460+
requires std::derived_from<T, Node>
461+
void traverse(
462+
std::vector<std::unique_ptr<T>> const& list,
463+
F&& f, Args&&... args)
464+
{
465+
for(auto const& node : list)
466+
visit(*node,
467+
std::forward<F>(f),
468+
std::forward<Args>(args)...);
469+
}
470+
386471
} // doc
387472

473+
//------------------------------------------------
474+
388475
/** A processed Doxygen-style comment attached to a declaration.
389476
*/
390477
struct MRDOX_VISIBLE

source/-XML/XMLWriter.cpp

+11
Original file line numberDiff line numberDiff line change
@@ -607,6 +607,9 @@ writeNode(
607607
case doc::Kind::styled:
608608
writeStyledText(static_cast<doc::StyledText const&>(node));
609609
break;
610+
case doc::Kind::heading:
611+
writeHeading(static_cast<doc::Heading const&>(node));
612+
break;
610613
case doc::Kind::paragraph:
611614
writeParagraph(static_cast<doc::Paragraph const&>(node));
612615
break;
@@ -663,6 +666,14 @@ writeStyledText(
663666
tags_.write(toString(node.style), node.string);
664667
}
665668

669+
void
670+
XMLWriter::
671+
writeHeading(
672+
doc::Heading const& heading)
673+
{
674+
tags_.write("head", heading.string);
675+
}
676+
666677
void
667678
XMLWriter::
668679
writeParagraph(

source/-XML/XMLWriter.hpp

+1
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,7 @@ class XMLWriter
8787
void writeBrief(doc::Paragraph const& node);
8888
void writeText(doc::Text const& node);
8989
void writeStyledText(doc::StyledText const& node);
90+
void writeHeading(doc::Heading const& node);
9091
void writeParagraph(doc::Paragraph const& node, llvm::StringRef tag = "");
9192
void writeAdmonition(doc::Admonition const& node);
9293
void writeCode(doc::Code const& node);

source/AST/AnyBlock.hpp

+6
Original file line numberDiff line numberDiff line change
@@ -111,6 +111,9 @@ class JavadocNodesBlock
111111
case doc::Kind::styled:
112112
nodes.emplace_back(std::make_unique<doc::StyledText>());
113113
return Error::success();
114+
case doc::Kind::heading:
115+
nodes.emplace_back(std::make_unique<doc::Heading>());
116+
return Error::success();
114117
case doc::Kind::paragraph:
115118
nodes.emplace_back(std::make_unique<doc::Paragraph>());
116119
return Error::success();
@@ -154,6 +157,9 @@ class JavadocNodesBlock
154157
switch(auto node = nodes.back().get();
155158
node->kind)
156159
{
160+
case doc::Kind::heading:
161+
static_cast<doc::Heading*>(node)->string = Blob.str();
162+
return Error::success();
157163
case doc::Kind::text:
158164
case doc::Kind::styled:
159165
static_cast<doc::Text*>(

source/AST/BitcodeWriter.cpp

+6
Original file line numberDiff line numberDiff line change
@@ -868,6 +868,12 @@ emitBlock(
868868
emitRecord(J.string, JAVADOC_NODE_STRING);
869869
break;
870870
}
871+
case doc::Kind::heading:
872+
{
873+
auto const& J = static_cast<doc::Heading const&>(I);
874+
emitRecord(J.string, JAVADOC_NODE_STRING);
875+
break;
876+
}
871877
case doc::Kind::paragraph:
872878
{
873879
auto const& J = static_cast<doc::Paragraph const&>(I);

0 commit comments

Comments
 (0)