Skip to content

Commit e749144

Browse files
committed
feat: make the reflection consumers public
The five private headers from src/lib/Support/Reflection/ are consolidated into a single public include/mrdocs/Support/Reflection.hpp. Shared type traits (is_optional, is_vector) move to the existing Support/TypeTraits.hpp. The tag_invoke overloads from the centralized Reflection.cpp are distributed into per-type .cpp files. The src/lib/Support/Reflection/ directory is deleted entirely.
1 parent 8f5391b commit e749144

36 files changed

Lines changed: 1207 additions & 1373 deletions

include/mrdocs/Support/Reflection.hpp

Lines changed: 672 additions & 0 deletions
Large diffs are not rendered by default.

include/mrdocs/Support/TypeTraits.hpp

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,11 +12,35 @@
1212
#ifndef MRDOCS_API_SUPPORT_TYPETRAITS_HPP
1313
#define MRDOCS_API_SUPPORT_TYPETRAITS_HPP
1414

15+
#include <mrdocs/ADT/Optional.hpp>
1516
#include <type_traits>
17+
#include <vector>
1618

1719

1820
namespace mrdocs {
1921

22+
namespace detail {
23+
24+
template <typename T>
25+
struct is_optional : std::false_type {};
26+
27+
template <typename T>
28+
struct is_optional<Optional<T>> : std::true_type {};
29+
30+
template <typename T>
31+
inline constexpr bool is_optional_v = is_optional<T>::value;
32+
33+
template <typename T>
34+
struct is_vector : std::false_type {};
35+
36+
template <typename T, typename A>
37+
struct is_vector<std::vector<T, A>> : std::true_type {};
38+
39+
template <typename T>
40+
inline constexpr bool is_vector_v = is_vector<T>::value;
41+
42+
} // namespace detail
43+
2044
/** Return the value as its underlying type.
2145
2246
@param value The enum value to convert

src/lib/AST/ASTVisitor.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,9 +20,9 @@
2020
#include <lib/Diagnostics.hpp>
2121
#include <lib/Support/Path.hpp>
2222
#include <lib/Support/Radix.hpp>
23-
#include <lib/Support/Reflection/MergeReflectedType.hpp>
2423
#include <mrdocs/Metadata.hpp>
2524
#include <mrdocs/Support/Algorithm.hpp>
25+
#include <mrdocs/Support/Reflection.hpp>
2626
#include <mrdocs/Support/ScopeExit.hpp>
2727
#include <clang/AST/AST.h>
2828
#include <clang/AST/Attr.h>

src/lib/CorpusImpl.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,12 +22,12 @@
2222
#include <lib/Metadata/Finalizers/NamespacesFinalizer.hpp>
2323
#include <lib/Metadata/Finalizers/OverloadsFinalizer.hpp>
2424
#include <lib/Metadata/Finalizers/SortMembersFinalizer.hpp>
25-
#include <lib/Support/Reflection/EnumToString.hpp>
2625
#include <lib/Support/Chrono.hpp>
2726
#include <lib/Support/Report.hpp>
2827
#include <mrdocs/Metadata.hpp>
2928
#include <mrdocs/Support/Algorithm.hpp>
3029
#include <mrdocs/Support/Error.hpp>
30+
#include <mrdocs/Support/Reflection.hpp>
3131
#include <mrdocs/Support/ThreadPool.hpp>
3232
#include <chrono>
3333

src/lib/Gen/xml/XMLWriter.cpp

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,7 @@
1616
#include <mrdocs/Metadata/Type.hpp>
1717
#include <mrdocs/Metadata/Template.hpp>
1818
#include <mrdocs/Metadata/DocComment.hpp>
19-
#include <lib/Support/Reflection/EnumToString.hpp>
20-
#include <lib/Support/Reflection/ReadableTypeName.hpp>
19+
#include <mrdocs/Support/Reflection.hpp>
2120
#include <string>
2221
#include <string_view>
2322
#include <type_traits>

src/lib/Metadata/DocComment.cpp

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
#include <mrdocs/Metadata/DocComment.hpp>
1616
#include <mrdocs/Metadata/DocComment/Inline/Parts.hpp>
1717
#include <mrdocs/Metadata/DomCorpus.hpp>
18+
#include <mrdocs/Support/Reflection.hpp>
1819
#include <llvm/Support/Error.h>
1920
#include <llvm/Support/Path.h>
2021
#include <format>
@@ -180,5 +181,52 @@ append(DocComment&& other)
180181
});
181182
}
182183

184+
template <typename IO>
185+
void
186+
tag_invoke(
187+
dom::LazyObjectMapTag,
188+
IO& io,
189+
DocComment const& I,
190+
DomCorpus const* domCorpus)
191+
{
192+
addMetaObject<DocComment>(io);
193+
194+
describe::for_each(describe::describe_members<DocComment>{}, [&](auto D)
195+
{
196+
constexpr std::string_view name = D.name;
197+
198+
if constexpr (name == "Document")
199+
{
200+
io.defer("description", [&I, domCorpus]
201+
{
202+
return dom::LazyArray(I.Document, domCorpus);
203+
});
204+
}
205+
else if constexpr (name == "brief")
206+
{
207+
if (I.brief && !I.brief->children.empty())
208+
{
209+
io.map("brief", I.brief);
210+
}
211+
}
212+
else
213+
{
214+
io.defer(D.name, [&I, domCorpus, ptr = D.pointer]
215+
{
216+
return dom::LazyArray(I.*ptr, domCorpus);
217+
});
218+
}
219+
});
220+
}
221+
222+
template
223+
void
224+
tag_invoke<LazyObjectIOType>(
225+
dom::LazyObjectMapTag,
226+
LazyObjectIOType&,
227+
DocComment const&,
228+
DomCorpus const*
229+
);
230+
183231
} // mrdocs
184232

src/lib/Metadata/DocComment/Inline.cpp

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,9 @@
1111
//
1212

1313
#include <mrdocs/Metadata/DocComment/Inline.hpp>
14+
#include <mrdocs/Metadata/DocComment/Inline/ImageInline.hpp>
1415
#include <mrdocs/Support/Algorithm.hpp>
16+
#include <mrdocs/Support/Reflection.hpp>
1517

1618
namespace mrdocs::doc {
1719

@@ -83,5 +85,23 @@ isEmpty(Polymorphic<Inline> const& el)
8385
});
8486
}
8587

88+
template <typename IO>
89+
void
90+
tag_invoke(
91+
dom::LazyObjectMapTag,
92+
IO& io,
93+
ImageInline const& I,
94+
DomCorpus const* domCorpus)
95+
{
96+
mrdocs::mapReflectedType<true>(io, I, domCorpus);
97+
}
98+
99+
template
100+
void
101+
tag_invoke<mrdocs::LazyObjectIOType>(
102+
dom::LazyObjectMapTag,
103+
mrdocs::LazyObjectIOType&,
104+
ImageInline const&,
105+
mrdocs::DomCorpus const*);
86106

87107
} // mrdocs::doc

src/lib/Metadata/Info.cpp

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
//
77
// Copyright (c) 2023 Vinnie Falco (vinnie.falco@gmail.com)
88
// Copyright (c) 2024 Alan de Freitas (alandefreitas@gmail.com)
9+
// Copyright (c) 2025 Gennaro Prota (gennaro.prota@gmail.com)
910
//
1011
// Official repository: https://github.com/cppalliance/mrdocs
1112
//
@@ -16,6 +17,7 @@
1617
#include <mrdocs/Metadata.hpp>
1718
#include <mrdocs/Metadata/DomCorpus.hpp>
1819
#include <mrdocs/Metadata/Symbol/Record.hpp>
20+
#include <mrdocs/Support/Reflection.hpp>
1921
#include <mrdocs/Support/String.hpp>
2022
#include <clang/AST/Type.h>
2123
#include <llvm/ADT/STLExtras.h>
@@ -37,4 +39,42 @@ toString(SymbolKind const kind) noexcept
3739
}
3840
}
3941

42+
template <typename IO>
43+
void
44+
tag_invoke(
45+
dom::LazyObjectMapTag,
46+
IO& io,
47+
Symbol const& I,
48+
DomCorpus const* domCorpus)
49+
{
50+
MRDOCS_ASSERT(domCorpus);
51+
mapReflectedType<false>(io, I, domCorpus);
52+
io.map("class", std::string("symbol"));
53+
io.map("isRegular", I.Extraction == ExtractionMode::Regular);
54+
io.map("isSeeBelow", I.Extraction == ExtractionMode::SeeBelow);
55+
io.map("isImplementationDefined", I.Extraction == ExtractionMode::ImplementationDefined);
56+
io.map("isDependency", I.Extraction == ExtractionMode::Dependency);
57+
}
58+
59+
template
60+
void
61+
tag_invoke<LazyObjectIOType>(
62+
dom::LazyObjectMapTag,
63+
LazyObjectIOType&,
64+
Symbol const&,
65+
DomCorpus const*);
66+
67+
inline void
68+
tag_invoke(
69+
dom::ValueFromTag,
70+
dom::Value& v,
71+
Optional<DocComment> const& opt,
72+
DomCorpus const* domCorpus)
73+
{
74+
if (opt)
75+
{
76+
v = dom::LazyObject(*opt, domCorpus);
77+
}
78+
}
79+
4080
} // mrdocs

src/lib/Metadata/Name.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,11 +10,11 @@
1010
// Official repository: https://github.com/cppalliance/mrdocs
1111
//
1212

13-
#include <lib/Support/Reflection/MapReflectedType.hpp>
1413
#include <mrdocs/Dom/LazyArray.hpp>
1514
#include <mrdocs/Dom/LazyObject.hpp>
1615
#include <mrdocs/Metadata/DomCorpus.hpp>
1716
#include <mrdocs/Metadata/Name.hpp>
17+
#include <mrdocs/Support/Reflection.hpp>
1818
#include <span>
1919

2020
namespace mrdocs {

src/lib/Metadata/Source.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,12 +10,12 @@
1010
// Official repository: https://github.com/cppalliance/mrdocs
1111
//
1212

13-
#include <lib/Support/Reflection/MapReflectedType.hpp>
1413
#include <mrdocs/Dom/LazyArray.hpp>
1514
#include <mrdocs/Dom/LazyObject.hpp>
1615
#include <mrdocs/Metadata/Symbol/FileKind.hpp>
1716
#include <mrdocs/Metadata/Symbol/Location.hpp>
1817
#include <mrdocs/Metadata/Symbol/Source.hpp>
18+
#include <mrdocs/Support/Reflection.hpp>
1919
#include <llvm/ADT/STLExtras.h>
2020
#include <ranges>
2121

0 commit comments

Comments
 (0)