Skip to content

Commit c98b4de

Browse files
committed
chore: visit replaces Visitor
1 parent 1db5cf5 commit c98b4de

File tree

7 files changed

+106
-391
lines changed

7 files changed

+106
-391
lines changed

include/mrdox/Corpus.hpp

+21-30
Original file line numberDiff line numberDiff line change
@@ -90,33 +90,6 @@ class MRDOX_VISIBLE
9090

9191
//--------------------------------------------
9292

93-
/** Base class used to visit elements of the corpus.
94-
*/
95-
struct Visitor
96-
{
97-
MRDOX_DECL virtual ~Visitor() noexcept;
98-
99-
MRDOX_DECL virtual bool visit(NamespaceInfo const&);
100-
MRDOX_DECL virtual bool visit(RecordInfo const&);
101-
MRDOX_DECL virtual bool visit(FunctionInfo const&);
102-
MRDOX_DECL virtual bool visit(TypedefInfo const&);
103-
MRDOX_DECL virtual bool visit(EnumInfo const&);
104-
MRDOX_DECL virtual bool visit(VariableInfo const&);
105-
MRDOX_DECL virtual bool visit(FieldInfo const&);
106-
MRDOX_DECL virtual bool visit(SpecializationInfo const&);
107-
};
108-
109-
/** Traverse the symbol, list, or its children.
110-
*/
111-
/** @{ */
112-
MRDOX_DECL bool traverse(Visitor&, Info const& I) const;
113-
MRDOX_DECL bool traverse(Visitor&, NamespaceInfo const& I) const;
114-
MRDOX_DECL bool traverse(Visitor&, RecordInfo const& I) const;
115-
MRDOX_DECL bool traverse(Visitor&, SpecializationInfo const& I) const;
116-
MRDOX_DECL bool traverse(Visitor&, SymbolID id) const;
117-
MRDOX_DECL bool traverse(Visitor&, std::vector<SymbolID> const& R) const;
118-
/** @} */
119-
12093
template<class F, class... Args>
12194
void traverse(
12295
NamespaceInfo const& I,
@@ -127,6 +100,11 @@ class MRDOX_VISIBLE
127100
RecordInfo const& I,
128101
F&& f, Args&&... args) const;
129102

103+
template<class F, class... Args>
104+
void traverse(
105+
SpecializationInfo const& I,
106+
F&& f, Args&&... args) const;
107+
130108
//--------------------------------------------
131109

132110
// KRYSTIAN NOTE: temporary
@@ -169,6 +147,9 @@ traverse(
169147
for(auto const& id : I.Members)
170148
visit(get(id), std::forward<F>(f),
171149
std::forward<Args>(args)...);
150+
for(auto const& id : I.Specializations)
151+
visit(get(id), std::forward<F>(f),
152+
std::forward<Args>(args)...);
172153
}
173154

174155
template<class F, class... Args>
@@ -181,14 +162,24 @@ traverse(
181162
for(auto const& id : I.Members)
182163
visit(get(id), std::forward<F>(f),
183164
std::forward<Args>(args)...);
184-
for(auto const& id : I.Friends)
185-
visit(get(id), std::forward<F>(f),
186-
std::forward<Args>(args)...);
187165
for(auto const& id : I.Specializations)
188166
visit(get(id), std::forward<F>(f),
189167
std::forward<Args>(args)...);
190168
}
191169

170+
template<class F, class... Args>
171+
void
172+
Corpus::
173+
traverse(
174+
SpecializationInfo const& I,
175+
F&& f, Args&&... args) const
176+
{
177+
for(auto const& J : I.Members)
178+
visit(get(J.Specialized),
179+
std::forward<F>(f),
180+
std::forward<Args>(args)...);
181+
}
182+
192183
} // mrdox
193184
} // clang
194185

source/-XML/XMLWriter.cpp

+38-97
Original file line numberDiff line numberDiff line change
@@ -148,8 +148,7 @@ build()
148148
if(options_.index || options_.safe_names)
149149
writeIndex();
150150

151-
if(! corpus_.traverse(*this, SymbolID::zero))
152-
return formatError("visitation aborted");
151+
visit(corpus_.globalNamespace(), *this);
153152

154153
if(options_.prolog)
155154
os_ << "</mrdox>\n";
@@ -192,85 +191,41 @@ writeIndex()
192191

193192
//------------------------------------------------
194193

195-
bool
196-
XMLWriter::
197-
visit(
198-
NamespaceInfo const& I)
199-
{
200-
tags_.open(namespaceTagName, {
201-
{ "name", I.Name },
202-
{ I.id }
203-
});
204-
205-
writeJavadoc(I.javadoc);
206-
207-
if(! corpus_.traverse(*this, I))
208-
return false;
209-
210-
tags_.close(namespaceTagName);
211-
212-
return true;
213-
}
214-
215-
bool
216-
XMLWriter::
217-
visit(
218-
RecordInfo const& I)
219-
{
220-
return writeRecord(I);
221-
}
222-
223-
bool
224-
XMLWriter::
225-
visit(
226-
FunctionInfo const& I)
227-
{
228-
return writeFunction(I);
229-
}
230-
231-
bool
232-
XMLWriter::
233-
visit(
234-
TypedefInfo const& I)
235-
{
236-
return writeTypedef(I);
237-
}
238-
239-
bool
240-
XMLWriter::
241-
visit(
242-
EnumInfo const& I)
243-
{
244-
return writeEnum(I);
245-
}
246-
247-
bool
248-
XMLWriter::
249-
visit(
250-
FieldInfo const& I)
251-
{
252-
return writeField(I);
253-
}
254-
255-
bool
256-
XMLWriter::
257-
visit(
258-
VariableInfo const& I)
259-
{
260-
return writeVar(I);
261-
}
262-
263-
bool
194+
template<class T>
195+
void
264196
XMLWriter::
265-
visit(
266-
SpecializationInfo const& I)
197+
operator()(
198+
T const& I)
267199
{
268-
return writeSpecialization(I);
200+
if constexpr(T::isNamespace())
201+
{
202+
tags_.open(namespaceTagName, {
203+
{ "name", I.Name },
204+
{ I.id }
205+
});
206+
writeJavadoc(I.javadoc);
207+
corpus_.traverse(I, *this);
208+
tags_.close(namespaceTagName);
209+
}
210+
if constexpr(T::isRecord())
211+
writeRecord(I);
212+
if constexpr(T::isFunction())
213+
writeFunction(I);
214+
if constexpr(T::isEnum())
215+
writeEnum(I);
216+
if constexpr(T::isTypedef())
217+
writeTypedef(I);
218+
if constexpr(T::isField())
219+
writeField(I);
220+
if constexpr(T::isVariable())
221+
writeVar(I);
222+
if constexpr(T::isSpecialization())
223+
writeSpecialization(I);
269224
}
270225

271226
//------------------------------------------------
272227

273-
bool
228+
void
274229
XMLWriter::
275230
writeEnum(
276231
EnumInfo const& I)
@@ -313,10 +268,9 @@ writeEnum(
313268
writeJavadoc(I.javadoc);
314269

315270
tags_.close(enumTagName);
316-
return true;
317271
}
318272

319-
bool
273+
void
320274
XMLWriter::
321275
writeFunction(
322276
FunctionInfo const& I)
@@ -344,10 +298,9 @@ writeFunction(
344298
tags_.close(functionTagName);
345299

346300
closeTemplate(I.Template);
347-
return true;
348301
}
349302

350-
bool
303+
void
351304
XMLWriter::
352305
writeRecord(
353306
RecordInfo const& I)
@@ -383,17 +336,14 @@ writeRecord(
383336

384337
writeJavadoc(I.javadoc);
385338

386-
if(! corpus_.traverse(*this, I))
387-
return false;
339+
corpus_.traverse(I, *this);
388340

389341
tags_.close(tagName);
390342

391343
closeTemplate(I.Template);
392-
393-
return true;
394344
}
395345

396-
bool
346+
void
397347
XMLWriter::
398348
writeTypedef(
399349
TypedefInfo const& I)
@@ -420,11 +370,9 @@ writeTypedef(
420370
tags_.close(tag);
421371

422372
closeTemplate(I.Template);
423-
424-
return true;
425373
}
426374

427-
bool
375+
void
428376
XMLWriter::
429377
writeField(
430378
const FieldInfo& I)
@@ -445,11 +393,9 @@ writeField(
445393
writeJavadoc(I.javadoc);
446394

447395
tags_.close(dataMemberTagName);
448-
449-
return true;
450396
}
451397

452-
bool
398+
void
453399
XMLWriter::
454400
writeVar(
455401
VariableInfo const& I)
@@ -473,8 +419,6 @@ writeVar(
473419
tags_.close(varTagName);
474420

475421
closeTemplate(I.Template);
476-
477-
return true;
478422
}
479423

480424
//------------------------------------------------
@@ -537,7 +481,7 @@ closeTemplate(
537481
tags_.close(templateTagName);
538482
}
539483

540-
bool
484+
void
541485
XMLWriter::
542486
writeSpecialization(
543487
const SpecializationInfo& I)
@@ -550,12 +494,9 @@ writeSpecialization(
550494
for(const TArg& targ : I.Args)
551495
writeTemplateArg(targ, tags_);
552496

553-
if(! corpus_.traverse(*this, I))
554-
return false;
497+
corpus_.traverse(I, *this);
555498

556499
tags_.close(specializationTagName);
557-
558-
return true;
559500
}
560501

561502
//------------------------------------------------

source/-XML/XMLWriter.hpp

+10-18
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,6 @@ class jit_indenter;
2828
/** A writer which outputs XML.
2929
*/
3030
class XMLWriter
31-
: public Corpus::Visitor
3231
{
3332
template<class T>
3433
friend struct llvm::yaml::MappingTraits;
@@ -55,25 +54,18 @@ class XMLWriter
5554

5655
Error build();
5756

58-
private:
5957
void writeIndex();
6058

61-
bool visit(NamespaceInfo const&) override;
62-
bool visit(RecordInfo const&) override;
63-
bool visit(FunctionInfo const&) override;
64-
bool visit(TypedefInfo const&) override;
65-
bool visit(EnumInfo const&) override;
66-
bool visit(VariableInfo const&) override;
67-
bool visit(SpecializationInfo const&) override;
68-
bool visit(FieldInfo const&) override;
69-
70-
bool writeEnum(EnumInfo const&);
71-
bool writeFunction(FunctionInfo const&);
72-
bool writeRecord(RecordInfo const&);
73-
bool writeTypedef(TypedefInfo const&);
74-
bool writeField(FieldInfo const&);
75-
bool writeVar(VariableInfo const&);
76-
bool writeSpecialization(const SpecializationInfo&);
59+
template<class T>
60+
void operator()(T const&);
61+
62+
void writeRecord(RecordInfo const&);
63+
void writeFunction(FunctionInfo const&);
64+
void writeEnum(EnumInfo const&);
65+
void writeField(FieldInfo const&);
66+
void writeTypedef(TypedefInfo const&);
67+
void writeVar(VariableInfo const&);
68+
void writeSpecialization(const SpecializationInfo&);
7769

7870
void writeSourceInfo(SourceInfo const& I);
7971
void writeLocation(Location const& loc, bool def = false);

0 commit comments

Comments
 (0)