Skip to content

Commit 22ac9ec

Browse files
committed
feat: add EnumeratorInfo and FriendInfo
1 parent 6c6d641 commit 22ac9ec

Some content is hidden

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

63 files changed

+1111
-634
lines changed

include/mrdocs/Corpus.hpp

+17
Original file line numberDiff line numberDiff line change
@@ -111,6 +111,11 @@ class MRDOCS_VISIBLE
111111
RecordInfo const& I,
112112
F&& f, Args&&... args) const;
113113

114+
template<class F, class... Args>
115+
void traverse(
116+
EnumInfo const& I,
117+
F&& f, Args&&... args) const;
118+
114119
template<class F, class... Args>
115120
void traverse(
116121
SpecializationInfo const& I,
@@ -178,6 +183,18 @@ traverse(
178183
std::forward<Args>(args)...);
179184
}
180185

186+
template<class F, class... Args>
187+
void
188+
Corpus::
189+
traverse(
190+
EnumInfo const& I,
191+
F&& f, Args&&... args) const
192+
{
193+
for(auto const& id : I.Members)
194+
visit(get(id), std::forward<F>(f),
195+
std::forward<Args>(args)...);
196+
}
197+
181198
template<class F, class... Args>
182199
void
183200
Corpus::

include/mrdocs/Metadata.hpp

+2
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,10 @@
1818
// metadata extracted from AST
1919

2020
#include <mrdocs/Metadata/Enum.hpp>
21+
#include <mrdocs/Metadata/Enumerator.hpp>
2122
#include <mrdocs/Metadata/Expression.hpp>
2223
#include <mrdocs/Metadata/Field.hpp>
24+
#include <mrdocs/Metadata/Friend.hpp>
2325
#include <mrdocs/Metadata/Function.hpp>
2426
#include <mrdocs/Metadata/Info.hpp>
2527
#include <mrdocs/Metadata/Interface.hpp>

include/mrdocs/Metadata/Enum.hpp

+2-28
Original file line numberDiff line numberDiff line change
@@ -25,30 +25,6 @@
2525
namespace clang {
2626
namespace mrdocs {
2727

28-
// Information for a single possible value of an enumeration.
29-
struct EnumValueInfo
30-
{
31-
std::string Name;
32-
33-
/** The initializer expression, if any */
34-
ConstantExprInfo<std::uint64_t> Initializer;
35-
36-
/** The documentation for the value, if any.
37-
*/
38-
std::unique_ptr<Javadoc> javadoc;
39-
40-
//--------------------------------------------
41-
42-
explicit
43-
EnumValueInfo(
44-
std::string_view Name = "")
45-
: Name(Name)
46-
{
47-
}
48-
};
49-
50-
//------------------------------------------------
51-
5228
// TODO: Expand to allow for documenting templating.
5329
// Info for types.
5430
struct EnumInfo
@@ -64,13 +40,11 @@ struct EnumInfo
6440
std::unique_ptr<TypeInfo> UnderlyingType;
6541

6642
// Enumeration members.
67-
std::vector<EnumValueInfo> Members;
43+
std::vector<SymbolID> Members;
6844

6945
//--------------------------------------------
7046

71-
explicit
72-
EnumInfo(
73-
SymbolID ID = SymbolID::invalid)
47+
explicit EnumInfo(SymbolID ID) noexcept
7448
: IsInfo(ID)
7549
{
7650
}
+45
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
//
2+
// Licensed under the Apache License v2.0 with LLVM Exceptions.
3+
// See https://llvm.org/LICENSE.txt for license information.
4+
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
5+
//
6+
// Copyright (c) 2023 Krystian Stasiowski ([email protected])
7+
//
8+
// Official repository: https://github.com/cppalliance/mrdocs
9+
//
10+
11+
#ifndef MRDOCS_API_METADATA_ENUMERATOR_HPP
12+
#define MRDOCS_API_METADATA_ENUMERATOR_HPP
13+
14+
#include <mrdocs/Platform.hpp>
15+
#include <mrdocs/Metadata/Expression.hpp>
16+
#include <mrdocs/Metadata/Info.hpp>
17+
#include <mrdocs/Metadata/Source.hpp>
18+
#include <mrdocs/Metadata/Type.hpp>
19+
#include <utility>
20+
21+
namespace clang {
22+
namespace mrdocs {
23+
24+
/** Info for enumerators.
25+
*/
26+
struct EnumeratorInfo
27+
: IsInfo<InfoKind::Enumerator>
28+
, SourceInfo
29+
{
30+
/** The initializer expression, if any
31+
*/
32+
ConstantExprInfo<std::uint64_t> Initializer;
33+
34+
//--------------------------------------------
35+
36+
explicit EnumeratorInfo(SymbolID ID) noexcept
37+
: IsInfo(ID)
38+
{
39+
}
40+
};
41+
42+
} // mrdocs
43+
} // clang
44+
45+
#endif

include/mrdocs/Metadata/Field.hpp

+1-3
Original file line numberDiff line numberDiff line change
@@ -64,9 +64,7 @@ struct FieldInfo
6464

6565
//--------------------------------------------
6666

67-
explicit
68-
FieldInfo(
69-
SymbolID ID = SymbolID::invalid) noexcept
67+
explicit FieldInfo(SymbolID ID) noexcept
7068
: IsInfo(ID)
7169
{
7270
}

include/mrdocs/Metadata/Friend.hpp

+48
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
//
2+
// Licensed under the Apache License v2.0 with LLVM Exceptions.
3+
// See https://llvm.org/LICENSE.txt for license information.
4+
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
5+
//
6+
// Copyright (c) 2023 Krystian Stasiowski ([email protected])
7+
//
8+
// Official repository: https://github.com/cppalliance/mrdocs
9+
//
10+
11+
#ifndef MRDOCS_API_METADATA_FRIEND_HPP
12+
#define MRDOCS_API_METADATA_FRIEND_HPP
13+
14+
#include <mrdocs/Platform.hpp>
15+
#include <mrdocs/Metadata/Info.hpp>
16+
#include <mrdocs/Metadata/Source.hpp>
17+
#include <mrdocs/Metadata/Type.hpp>
18+
#include <utility>
19+
20+
namespace clang {
21+
namespace mrdocs {
22+
23+
/** Info for friend declarations.
24+
*/
25+
struct FriendInfo
26+
: IsInfo<InfoKind::Friend>
27+
, SourceInfo
28+
{
29+
/** Befriended symbol.
30+
*/
31+
SymbolID FriendSymbol = SymbolID::invalid;
32+
33+
/** Befriended type.
34+
*/
35+
std::unique_ptr<TypeInfo> FriendType;
36+
37+
//--------------------------------------------
38+
39+
explicit FriendInfo(SymbolID ID) noexcept
40+
: IsInfo(ID)
41+
{
42+
}
43+
};
44+
45+
} // mrdocs
46+
} // clang
47+
48+
#endif

include/mrdocs/Metadata/Function.hpp

+1-3
Original file line numberDiff line numberDiff line change
@@ -159,9 +159,7 @@ struct FunctionInfo
159159

160160
//--------------------------------------------
161161

162-
explicit
163-
FunctionInfo(
164-
SymbolID ID = SymbolID::invalid)
162+
explicit FunctionInfo(SymbolID ID) noexcept
165163
: IsInfo(ID)
166164
{
167165
}

include/mrdocs/Metadata/Info.hpp

+17-18
Original file line numberDiff line numberDiff line change
@@ -35,19 +35,23 @@ struct FieldInfo;
3535
struct TypedefInfo;
3636
struct VariableInfo;
3737
struct SpecializationInfo;
38+
struct FriendInfo;
39+
struct EnumeratorInfo;
3840

3941
/** Info variant discriminator
4042
*/
4143
enum class InfoKind
4244
{
43-
Namespace = 0,
45+
Namespace = 1, // for bitstream
4446
Record,
4547
Function,
4648
Enum,
4749
Typedef,
4850
Variable,
4951
Field,
50-
Specialization
52+
Specialization,
53+
Friend,
54+
Enumerator
5155
};
5256

5357
MRDOCS_DECL dom::String toString(InfoKind kind) noexcept;
@@ -59,7 +63,7 @@ struct MRDOCS_VISIBLE
5963
{
6064
/** The unique identifier for this symbol.
6165
*/
62-
SymbolID id = SymbolID::invalid;
66+
SymbolID id;
6367

6468
/** The unqualified name.
6569
*/
@@ -91,7 +95,7 @@ struct MRDOCS_VISIBLE
9195
conditions for extraction, but was extracted due to it being used
9296
by a primary `Info`.
9397
*/
94-
bool Implicit = true;
98+
bool Implicit = false;
9599

96100
/** In-order List of parent namespaces.
97101
*/
@@ -110,20 +114,12 @@ struct MRDOCS_VISIBLE
110114
explicit
111115
Info(
112116
InfoKind kind,
113-
SymbolID ID = SymbolID::invalid) noexcept
117+
SymbolID ID) noexcept
114118
: id(ID)
115119
, Kind(kind)
116120
{
117121
}
118122

119-
//
120-
// Observers
121-
//
122-
123-
MRDOCS_DECL
124-
std::string
125-
extractName() const;
126-
127123
constexpr bool isNamespace() const noexcept { return Kind == InfoKind::Namespace; }
128124
constexpr bool isRecord() const noexcept { return Kind == InfoKind::Record; }
129125
constexpr bool isFunction() const noexcept { return Kind == InfoKind::Function; }
@@ -132,6 +128,8 @@ struct MRDOCS_VISIBLE
132128
constexpr bool isVariable() const noexcept { return Kind == InfoKind::Variable; }
133129
constexpr bool isField() const noexcept { return Kind == InfoKind::Field; }
134130
constexpr bool isSpecialization() const noexcept { return Kind == InfoKind::Specialization; }
131+
constexpr bool isFriend() const noexcept { return Kind == InfoKind::Friend; }
132+
constexpr bool isEnumerator() const noexcept { return Kind == InfoKind::Enumerator; }
135133
};
136134

137135
//------------------------------------------------
@@ -157,13 +155,10 @@ struct IsInfo : Info
157155
static constexpr bool isVariable() noexcept { return K == InfoKind::Variable; }
158156
static constexpr bool isField() noexcept { return K == InfoKind::Field; }
159157
static constexpr bool isSpecialization() noexcept { return K == InfoKind::Specialization; }
158+
static constexpr bool isFriend() noexcept { return K == InfoKind::Friend; }
159+
static constexpr bool isEnumerator() noexcept { return K == InfoKind::Enumerator; }
160160

161161
protected:
162-
constexpr IsInfo()
163-
: Info(K)
164-
{
165-
}
166-
167162
constexpr explicit IsInfo(SymbolID ID)
168163
: Info(K, ID)
169164
{
@@ -204,6 +199,10 @@ visit(
204199
return visitor.template visit<FieldInfo>();
205200
case InfoKind::Specialization:
206201
return visitor.template visit<SpecializationInfo>();
202+
case InfoKind::Friend:
203+
return visitor.template visit<FriendInfo>();
204+
case InfoKind::Enumerator:
205+
return visitor.template visit<EnumeratorInfo>();
207206
default:
208207
MRDOCS_UNREACHABLE();
209208
}

include/mrdocs/Metadata/Interface.hpp

+2
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ class Interface
3939
std::span<FieldInfo const*> Data;
4040
std::span<FunctionInfo const*> StaticFunctions;
4141
std::span<VariableInfo const*> StaticData;
42+
std::span<FriendInfo const*> Friends;
4243
};
4344

4445
Corpus const& corpus;
@@ -74,6 +75,7 @@ class Interface
7475
std::vector<FieldInfo const*> data_;
7576
std::vector<FunctionInfo const*> staticfuncs_;
7677
std::vector<VariableInfo const*> staticdata_;
78+
std::vector<FriendInfo const*> friends_;
7779
};
7880

7981
//------------------------------------------------

include/mrdocs/Metadata/Namespace.hpp

+1-3
Original file line numberDiff line numberDiff line change
@@ -40,9 +40,7 @@ struct NamespaceInfo
4040

4141
//--------------------------------------------
4242

43-
explicit
44-
NamespaceInfo(
45-
SymbolID ID = SymbolID::invalid)
43+
explicit NamespaceInfo(SymbolID ID) noexcept
4644
: IsInfo(ID)
4745
{
4846
}

include/mrdocs/Metadata/Record.hpp

+1-7
Original file line numberDiff line numberDiff line change
@@ -97,10 +97,6 @@ struct RecordInfo
9797
*/
9898
std::vector<BaseInfo> Bases;
9999

100-
/** List of friend functions.
101-
*/
102-
std::vector<SymbolID> Friends;
103-
104100
/** Record members
105101
*/
106102
std::vector<SymbolID> Members;
@@ -111,9 +107,7 @@ struct RecordInfo
111107

112108
//--------------------------------------------
113109

114-
explicit
115-
RecordInfo(
116-
SymbolID ID = SymbolID::invalid)
110+
explicit RecordInfo(SymbolID ID) noexcept
117111
: IsInfo(ID)
118112
{
119113
}

include/mrdocs/Metadata/Specialization.hpp

+1-3
Original file line numberDiff line numberDiff line change
@@ -63,9 +63,7 @@ struct SpecializationInfo
6363
*/
6464
std::vector<SpecializedMember> Members;
6565

66-
explicit
67-
SpecializationInfo(
68-
SymbolID ID = SymbolID::invalid)
66+
explicit SpecializationInfo(SymbolID ID) noexcept
6967
: IsInfo(ID)
7068
{
7169
}

include/mrdocs/Metadata/Typedef.hpp

+1-3
Original file line numberDiff line numberDiff line change
@@ -39,9 +39,7 @@ struct TypedefInfo
3939

4040
//--------------------------------------------
4141

42-
explicit
43-
TypedefInfo(
44-
SymbolID ID = SymbolID::invalid)
42+
explicit TypedefInfo(SymbolID ID) noexcept
4543
: IsInfo(ID)
4644
{
4745
}

include/mrdocs/Metadata/Variable.hpp

+1-3
Original file line numberDiff line numberDiff line change
@@ -50,9 +50,7 @@ struct VariableInfo
5050

5151
//--------------------------------------------
5252

53-
explicit
54-
VariableInfo(
55-
SymbolID ID = SymbolID::invalid) noexcept
53+
explicit VariableInfo(SymbolID ID) noexcept
5654
: IsInfo(ID)
5755
{
5856
}

0 commit comments

Comments
 (0)