Skip to content

Commit bbc08f1

Browse files
committed
feat: overload sets
1 parent a0c9d1d commit bbc08f1

39 files changed

+991
-601
lines changed

include/mrdocs/Corpus.hpp

+172-8
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
66
//
77
// Copyright (c) 2023 Vinnie Falco ([email protected])
8+
// Copyright (c) 2023 Krystian Stasiowski ([email protected])
89
//
910
// Official repository: https://github.com/cppalliance/mrdocs
1011
//
@@ -101,6 +102,8 @@ class MRDOCS_VISIBLE
101102

102103
//--------------------------------------------
103104

105+
// KRYSTIAN FIXME: this could just be a single
106+
// overload constrained with std::derived_from<ScopeInfo>
104107
template<class F, class... Args>
105108
void traverse(
106109
NamespaceInfo const& I,
@@ -121,6 +124,36 @@ class MRDOCS_VISIBLE
121124
SpecializationInfo const& I,
122125
F&& f, Args&&... args) const;
123126

127+
template<class F, class... Args>
128+
void traverse(
129+
OverloadSet const& OS,
130+
F&& f, Args&&... args) const;
131+
132+
template<class F, class... Args>
133+
void traverseOverloads(
134+
ScopeInfo const& S,
135+
F&& f, Args&&... args) const;
136+
137+
template<class F, class... Args>
138+
void traverseOverloads(
139+
RecordInfo const& I,
140+
F&& f, Args&&... args) const;
141+
142+
template<class F, class... Args>
143+
void traverseOverloads(
144+
NamespaceInfo const& I,
145+
F&& f, Args&&... args) const;
146+
147+
template<class F, class... Args>
148+
void traverseOverloads(
149+
EnumInfo const& I,
150+
F&& f, Args&&... args) const;
151+
152+
template<class F, class... Args>
153+
void traverseOverloads(
154+
SpecializationInfo const& I,
155+
F&& f, Args&&... args) const;
156+
124157
//--------------------------------------------
125158

126159
// KRYSTIAN NOTE: temporary
@@ -163,9 +196,6 @@ traverse(
163196
for(auto const& id : I.Members)
164197
visit(get(id), std::forward<F>(f),
165198
std::forward<Args>(args)...);
166-
for(auto const& id : I.Specializations)
167-
visit(get(id), std::forward<F>(f),
168-
std::forward<Args>(args)...);
169199
}
170200

171201
template<class F, class... Args>
@@ -178,7 +208,16 @@ traverse(
178208
for(auto const& id : I.Members)
179209
visit(get(id), std::forward<F>(f),
180210
std::forward<Args>(args)...);
181-
for(auto const& id : I.Specializations)
211+
}
212+
213+
template<class F, class... Args>
214+
void
215+
Corpus::
216+
traverse(
217+
EnumInfo const& I,
218+
F&& f, Args&&... args) const
219+
{
220+
for(auto const& id : I.Members)
182221
visit(get(id), std::forward<F>(f),
183222
std::forward<Args>(args)...);
184223
}
@@ -187,7 +226,7 @@ template<class F, class... Args>
187226
void
188227
Corpus::
189228
traverse(
190-
EnumInfo const& I,
229+
SpecializationInfo const& I,
191230
F&& f, Args&&... args) const
192231
{
193232
for(auto const& id : I.Members)
@@ -199,13 +238,138 @@ template<class F, class... Args>
199238
void
200239
Corpus::
201240
traverse(
241+
OverloadSet const& OS,
242+
F&& f, Args&&... args) const
243+
{
244+
for(auto const& id : OS.Members)
245+
visit(get(id), std::forward<F>(f),
246+
std::forward<Args>(args)...);
247+
}
248+
249+
template<class F, class... Args>
250+
void
251+
Corpus::
252+
traverseOverloads(
253+
ScopeInfo const& S,
254+
F&& f, Args&&... args) const
255+
{
256+
for(const SymbolID& id : S.Members)
257+
{
258+
const Info& member = get(id);
259+
const auto& lookup = S.Lookups.at(member.Name);
260+
if(lookup.size() == 1 || member.Name.empty())
261+
{
262+
visit(member, std::forward<F>(f),
263+
std::forward<Args>(args)...);
264+
}
265+
else if(lookup.front() == id)
266+
{
267+
OverloadSet overloads(member.Name,
268+
member.Namespace.front(), lookup);
269+
visit(overloads, std::forward<F>(f),
270+
std::forward<Args>(args)...);
271+
}
272+
}
273+
}
274+
275+
template<class F, class... Args>
276+
void
277+
Corpus::
278+
traverseOverloads(
279+
RecordInfo const& I,
280+
F&& f, Args&&... args) const
281+
{
282+
for(const SymbolID& id : I.Members)
283+
{
284+
const Info& member = get(id);
285+
const auto& lookup = I.Lookups.at(member.Name);
286+
if(lookup.size() == 1 || member.Name.empty())
287+
{
288+
visit(member, std::forward<F>(f),
289+
std::forward<Args>(args)...);
290+
}
291+
else if(lookup.front() == id)
292+
{
293+
OverloadSet overloads(member.Name, I.id, lookup);
294+
visit(overloads, std::forward<F>(f),
295+
std::forward<Args>(args)...);
296+
}
297+
}
298+
}
299+
300+
template<class F, class... Args>
301+
void
302+
Corpus::
303+
traverseOverloads(
304+
NamespaceInfo const& I,
305+
F&& f, Args&&... args) const
306+
{
307+
for(const SymbolID& id : I.Members)
308+
{
309+
const Info& member = get(id);
310+
const auto& lookup = I.Lookups.at(member.Name);
311+
if(lookup.size() == 1 || member.Name.empty())
312+
{
313+
visit(member, std::forward<F>(f),
314+
std::forward<Args>(args)...);
315+
}
316+
else if(lookup.front() == id)
317+
{
318+
OverloadSet overloads(member.Name, I.id, lookup);
319+
visit(overloads, std::forward<F>(f),
320+
std::forward<Args>(args)...);
321+
}
322+
}
323+
}
324+
325+
template<class F, class... Args>
326+
void
327+
Corpus::
328+
traverseOverloads(
329+
EnumInfo const& I,
330+
F&& f, Args&&... args) const
331+
{
332+
for(const SymbolID& id : I.Members)
333+
{
334+
const Info& member = get(id);
335+
const auto& lookup = I.Lookups.at(member.Name);
336+
if(lookup.size() == 1 || member.Name.empty())
337+
{
338+
visit(member, std::forward<F>(f),
339+
std::forward<Args>(args)...);
340+
}
341+
else if(lookup.front() == id)
342+
{
343+
OverloadSet overloads(member.Name, I.id, lookup);
344+
visit(overloads, std::forward<F>(f),
345+
std::forward<Args>(args)...);
346+
}
347+
}
348+
}
349+
350+
template<class F, class... Args>
351+
void
352+
Corpus::
353+
traverseOverloads(
202354
SpecializationInfo const& I,
203355
F&& f, Args&&... args) const
204356
{
205-
for(auto const& J : I.Members)
206-
visit(get(J.Specialized),
207-
std::forward<F>(f),
357+
for(const SymbolID& id : I.Members)
358+
{
359+
const Info& member = get(id);
360+
const auto& lookup = I.Lookups.at(member.Name);
361+
if(lookup.size() == 1 || member.Name.empty())
362+
{
363+
visit(member, std::forward<F>(f),
364+
std::forward<Args>(args)...);
365+
}
366+
else if(lookup.front() == id)
367+
{
368+
OverloadSet overloads(member.Name, I.id, lookup);
369+
visit(overloads, std::forward<F>(f),
208370
std::forward<Args>(args)...);
371+
}
372+
}
209373
}
210374

211375
class Corpus::iterator

include/mrdocs/Metadata/DomMetadata.hpp

+20
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
55
//
66
// Copyright (c) 2023 Vinnie Falco ([email protected])
7+
// Copyright (c) 2023 Krystian Stasiowski ([email protected])
78
//
89
// Official repository: https://github.com/cppalliance/mrdocs
910
//
@@ -53,6 +54,14 @@ class MRDOCS_DECL
5354
*/
5455
Corpus const& getCorpus() const;
5556

57+
/** Returns the Corpus associated with the Dom.
58+
*/
59+
Corpus const& operator*() const;
60+
61+
/** Returns the Corpus associated with the Dom.
62+
*/
63+
Corpus const* operator->() const;
64+
5665
/** Construct a Dom object representing the given symbol.
5766
5867
This function is called internally when a `dom::Object`
@@ -84,6 +93,17 @@ class MRDOCS_DECL
8493
dom::Value
8594
getJavadoc(
8695
Javadoc const& jd) const;
96+
97+
/** Return a Dom value representing an overload set.
98+
99+
A @ref Generator should override this member
100+
and return suitable @ref dom::Value representing
101+
the overload set.
102+
*/
103+
virtual
104+
dom::Object
105+
getOverloads(
106+
OverloadSet const& os) const;
87107
};
88108

89109
} // mrdocs

include/mrdocs/Metadata/Enum.hpp

+2-3
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
#include <mrdocs/Platform.hpp>
1616
#include <mrdocs/Metadata/Expression.hpp>
1717
#include <mrdocs/Metadata/Javadoc.hpp>
18+
#include <mrdocs/Metadata/Scope.hpp>
1819
#include <mrdocs/Metadata/Source.hpp>
1920
#include <mrdocs/Metadata/Type.hpp>
2021
#include <optional>
@@ -30,6 +31,7 @@ namespace mrdocs {
3031
struct EnumInfo
3132
: IsInfo<InfoKind::Enum>
3233
, SourceInfo
34+
, ScopeInfo
3335
{
3436
// Indicates whether this enum is scoped (e.g. enum class).
3537
bool Scoped = false;
@@ -39,9 +41,6 @@ struct EnumInfo
3941
// this will be "short".
4042
std::unique_ptr<TypeInfo> UnderlyingType;
4143

42-
// Enumeration members.
43-
std::vector<SymbolID> Members;
44-
4544
//--------------------------------------------
4645

4746
explicit EnumInfo(SymbolID ID) noexcept

include/mrdocs/Metadata/Interface.hpp

+3
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,9 @@ class Interface
5656
*/
5757
Tranche Private;
5858

59+
ScopeInfo Overloads;
60+
ScopeInfo StaticOverloads;
61+
5962
MRDOCS_DECL
6063
friend
6164
Interface

include/mrdocs/Metadata/Namespace.hpp

+3-4
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,9 @@
1313
#define MRDOCS_API_METADATA_NAMESPACE_HPP
1414

1515
#include <mrdocs/Platform.hpp>
16-
#include <mrdocs/Metadata/Info.hpp>
1716
#include <mrdocs/ADT/BitField.hpp>
17+
#include <mrdocs/Metadata/Info.hpp>
18+
#include <mrdocs/Metadata/Scope.hpp>
1819
#include <vector>
1920

2021
namespace clang {
@@ -32,10 +33,8 @@ union NamespaceFlags
3233
*/
3334
struct NamespaceInfo
3435
: IsInfo<InfoKind::Namespace>
36+
, ScopeInfo
3537
{
36-
std::vector<SymbolID> Members;
37-
std::vector<SymbolID> Specializations;
38-
3938
NamespaceFlags specs;
4039

4140
//--------------------------------------------

0 commit comments

Comments
 (0)