Skip to content

Commit 1fed5e5

Browse files
committed
feat(lib): all base classes implement node kind inc pattern
This pattern defines a single source of truth for all derived types in a family of classes. Thus, conversions with the `as_` and `is_` functions are limited to valid derived classes.
1 parent ba7f6e5 commit 1fed5e5

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

41 files changed

+397
-149
lines changed

include/mrdocs/Metadata/Expression.hpp

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,16 @@ struct ExprInfo
2525
/** The expression, as written */
2626
std::string Written;
2727

28+
ExprInfo& asExpr() noexcept
29+
{
30+
return *this;
31+
}
32+
33+
ExprInfo const& asExpr() const noexcept
34+
{
35+
return *this;
36+
}
37+
2838
auto operator<=>(ExprInfo const&) const = default;
2939
};
3040

@@ -49,18 +59,15 @@ struct ConstantExprInfo
4959

5060
auto operator<=>(ConstantExprInfo const&) const = default;
5161

52-
static_assert(std::integral<type>,
53-
"expression type must be integral");
62+
static_assert(std::integral<type>, "expression type must be integral");
5463
};
5564

5665
template <class T>
5766
static void merge(
5867
ConstantExprInfo<T>& I,
5968
ConstantExprInfo<T>&& Other)
6069
{
61-
merge(
62-
dynamic_cast<ExprInfo&>(I),
63-
dynamic_cast<ExprInfo&&>(Other));
70+
merge(I.asExpr(), std::move(Other.asExpr()));
6471
if (!I.Value)
6572
{
6673
I.Value = std::move(Other.Value);

include/mrdocs/Metadata/Info/Concept.hpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ tag_invoke(
6464
ConceptInfo const& I,
6565
DomCorpus const* domCorpus)
6666
{
67-
tag_invoke(t, io, dynamic_cast<Info const&>(I), domCorpus);
67+
tag_invoke(t, io, I.asInfo(), domCorpus);
6868
io.map("template", I.Template);
6969
if (!I.Constraint.Written.empty())
7070
{

include/mrdocs/Metadata/Info/Enum.hpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,7 @@ tag_invoke(
8787
EnumInfo const& I,
8888
DomCorpus const* domCorpus)
8989
{
90-
tag_invoke(t, io, dynamic_cast<Info const&>(I), domCorpus);
90+
tag_invoke(t, io, I.asInfo(), domCorpus);
9191
io.map("type", I.UnderlyingType);
9292
io.map("isScoped", I.Scoped);
9393
io.map("constants", dom::LazyArray(I.Constants, domCorpus));

include/mrdocs/Metadata/Info/EnumConstant.hpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ tag_invoke(
5353
EnumConstantInfo const& I,
5454
DomCorpus const* domCorpus)
5555
{
56-
tag_invoke(t, io, dynamic_cast<Info const&>(I), domCorpus);
56+
tag_invoke(t, io, I.asInfo(), domCorpus);
5757
if (!I.Initializer.Written.empty())
5858
{
5959
io.map("initializer", I.Initializer.Written);

include/mrdocs/Metadata/Info/Function.hpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -107,7 +107,7 @@ tag_invoke(
107107
FunctionInfo const& I,
108108
DomCorpus const* domCorpus)
109109
{
110-
tag_invoke(t, io, dynamic_cast<Info const&>(I), domCorpus);
110+
tag_invoke(t, io, I.asInfo(), domCorpus);
111111
io.map("isVariadic", I.IsVariadic);
112112
io.map("isVirtual", I.IsVirtual);
113113
io.map("isVirtualAsWritten", I.IsVirtualAsWritten);

include/mrdocs/Metadata/Info/Guide.hpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,7 @@ tag_invoke(
7575
GuideInfo const& I,
7676
DomCorpus const* domCorpus)
7777
{
78-
tag_invoke(t, io, dynamic_cast<Info const&>(I), domCorpus);
78+
tag_invoke(t, io, I.asInfo(), domCorpus);
7979
io.map("params", dom::LazyArray(I.Params, domCorpus));
8080
io.map("deduced", I.Deduced);
8181
io.map("template", I.Template);

include/mrdocs/Metadata/Info/Namespace.hpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -155,7 +155,7 @@ tag_invoke(
155155
NamespaceInfo const& I,
156156
DomCorpus const* domCorpus)
157157
{
158-
tag_invoke(t, io, dynamic_cast<Info const&>(I), domCorpus);
158+
tag_invoke(t, io, I.asInfo(), domCorpus);
159159
io.map("isInline", I.IsInline);
160160
io.map("isAnonymous", I.IsAnonymous);
161161
io.map("members", I.Members);

include/mrdocs/Metadata/Info/NamespaceAlias.hpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ tag_invoke(
5757
NamespaceAliasInfo const& I,
5858
DomCorpus const* domCorpus)
5959
{
60-
tag_invoke(t, io, dynamic_cast<Info const&>(I), domCorpus);
60+
tag_invoke(t, io, I.asInfo(), domCorpus);
6161
io.map("aliasedSymbol", I.AliasedSymbol);
6262
}
6363

include/mrdocs/Metadata/Info/Overloads.hpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,7 @@ tag_invoke(
7979
OverloadsInfo const& I,
8080
DomCorpus const* domCorpus)
8181
{
82-
tag_invoke(t, io, dynamic_cast<Info const&>(I), domCorpus);
82+
tag_invoke(t, io, I.asInfo(), domCorpus);
8383
io.map("class", I.Class);
8484
io.map("overloadedOperator", I.OverloadedOperator);
8585
io.map("members", dom::LazyArray(I.Members, domCorpus));

include/mrdocs/Metadata/Info/Record.hpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -114,7 +114,7 @@ tag_invoke(
114114
RecordInfo const& I,
115115
DomCorpus const* domCorpus)
116116
{
117-
tag_invoke(t, io, dynamic_cast<Info const&>(I), domCorpus);
117+
tag_invoke(t, io, I.asInfo(), domCorpus);
118118
io.map("tag", I.KeyKind);
119119
io.map("defaultAccess", getDefaultAccessString(I.KeyKind));
120120
io.map("isFinal", I.IsFinal);

0 commit comments

Comments
 (0)