Skip to content

Commit cbd7c14

Browse files
sdkrystianvinniefalco
authored andcommitted
chore: refactor DomTemplate
1 parent a2613b8 commit cbd7c14

File tree

3 files changed

+105
-179
lines changed

3 files changed

+105
-179
lines changed

include/mrdox/Metadata/Template.hpp

+8
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,10 @@ enum class TParamKind : int
3535
Template
3636
};
3737

38+
MRDOX_DECL
39+
std::string_view
40+
toString(TParamKind kind);
41+
3842
struct TParam;
3943

4044
struct TypeTParam
@@ -205,6 +209,10 @@ enum class TemplateSpecKind
205209
Partial
206210
};
207211

212+
MRDOX_DECL
213+
std::string_view
214+
toString(TemplateSpecKind kind);
215+
208216
/** Information pertaining to templates and specializations thereof.
209217
*/
210218
struct TemplateInfo

source/Dom/DomMetadata.cpp

+64-179
Original file line numberDiff line numberDiff line change
@@ -241,36 +241,16 @@ domCreate(
241241
*/
242242
class DomParam : public dom::Object
243243
{
244-
Param const* I_;
245-
Corpus const& corpus_;
246-
247244
public:
248245
DomParam(
249246
Param const& I,
250247
Corpus const& corpus) noexcept
251-
: I_(&I)
252-
, corpus_(corpus)
253-
{
254-
}
255-
256-
dom::Value get(std::string_view key) const override
257-
{
258-
if(key == "name")
259-
return dom::nonEmptyString(I_->Name);
260-
if(key == "type")
261-
return dom::create<DomTypeInfo>(I_->Type, corpus_);
262-
if(key == "default")
263-
return dom::nonEmptyString(I_->Default);
264-
return nullptr;
265-
}
266-
267-
std::vector<std::string_view> props() const override
248+
: Object({
249+
{"name", dom::nonEmptyString(I.Name)},
250+
{"type", dom::create<DomTypeInfo>(I.Type, corpus)},
251+
{"default", dom::nonEmptyString(I.Default)}
252+
})
268253
{
269-
return {
270-
"name",
271-
"type",
272-
"default"
273-
};
274254
}
275255
};
276256

@@ -312,61 +292,22 @@ class DomParamArray : public dom::Array
312292

313293
class DomTParam : public dom::Object
314294
{
315-
TParam const* I_;
316-
Corpus const& corpus_;
317-
318295
public:
319-
DomTParam(
296+
DomTParam(
320297
TParam const& I,
321-
Corpus const& corpus) noexcept
322-
: I_(&I)
323-
, corpus_(corpus)
324-
{
325-
}
326-
327-
dom::Value get(std::string_view key) const override;
328-
329-
std::vector<std::string_view> props() const override
330-
{
331-
return {
332-
"kind",
333-
"name",
334-
"is-pack",
335-
"default",
336-
// only for NonTypeTParam
337-
"type",
338-
// only for TemplateTParam
339-
"params"
340-
};
341-
}
298+
Corpus const& corpus) noexcept;
342299
};
343300

344301
class DomTArg : public dom::Object
345302
{
346-
TArg const* I_;
347-
Corpus const& corpus_;
348-
349303
public:
350304
DomTArg(
351305
TArg const& I,
352306
Corpus const& corpus) noexcept
353-
: I_(&I)
354-
, corpus_(corpus)
355-
{
356-
}
357-
358-
dom::Value get(std::string_view key) const override
359-
{
360-
if(key == "value")
361-
return dom::nonEmptyString(I_->Value);
362-
return nullptr;
363-
}
364-
365-
std::vector<std::string_view> props() const override
307+
: Object({
308+
{"value", dom::nonEmptyString(I.Value)}
309+
})
366310
{
367-
return {
368-
"value"
369-
};
370311
}
371312
};
372313

@@ -430,137 +371,81 @@ class DomTArgArray : public dom::Array
430371
}
431372
};
432373

433-
class MRDOX_DECL
434-
DomTemplate : public dom::Object
374+
class DomTemplate : public dom::Object
435375
{
436-
TemplateInfo const* I_;
437-
Info const* Primary_;
438-
Corpus const& corpus_;
439-
440376
public:
441377
DomTemplate(
442378
TemplateInfo const& I,
443379
Corpus const& corpus) noexcept
444-
: I_(&I)
445-
, corpus_(corpus)
446-
{
447-
if(I_->Primary)
448-
Primary_ = corpus_.find(*I_->Primary);
449-
else
450-
Primary_ = nullptr;
451-
}
452-
453-
dom::Value get(std::string_view key) const override
454-
{
455-
if(key == "kind")
456-
{
457-
switch(I_->specializationKind())
458-
{
459-
case TemplateSpecKind::Primary:
460-
return "primary";
461-
case TemplateSpecKind::Explicit:
462-
return "explicit";
463-
case TemplateSpecKind::Partial:
464-
return "partial";
465-
default:
466-
MRDOX_UNREACHABLE();
467-
}
468-
}
469-
if(key == "primary")
470-
{
471-
if(Primary_)
472-
return domCreateInfo(*Primary_, corpus_);
473-
return nullptr;
474-
}
475-
if(key == "params")
476-
return dom::create<DomTParamArray>(
477-
I_->Params, corpus_);
478-
if(key == "args")
479-
return dom::create<DomTArgArray>(
480-
I_->Args, corpus_);
481-
return nullptr;
482-
}
483-
484-
std::vector<std::string_view> props() const override
380+
: Object({
381+
{"kind", toString(I.specializationKind())},
382+
{"primary", I.Primary ?
383+
domCreateInfo(*I.Primary, corpus) :
384+
nullptr},
385+
{"params", dom::create<DomTParamArray>(
386+
I.Params, corpus)},
387+
{"args", dom::create<DomTArgArray>(
388+
I.Args, corpus)}
389+
})
485390
{
486-
return {
487-
"params",
488-
"args",
489-
"kind",
490-
"primary"
491-
};
492391
}
493392
};
494393

495-
// These are here for circular references
496-
394+
static
497395
dom::Value
498-
DomTParam::
499-
get(std::string_view key) const
396+
getTParamDefault(
397+
TParam const& I,
398+
Corpus const& corpus)
500399
{
501-
if(key == "kind")
400+
switch(I.Kind)
502401
{
503-
switch(I_->Kind)
504-
{
505-
case TParamKind::Type:
506-
return "type";
507-
case TParamKind::NonType:
508-
return "non-type";
509-
case TParamKind::Template:
510-
return "template";
511-
default:
512-
MRDOX_UNREACHABLE();
513-
}
514-
}
515-
if(key == "name")
516-
return dom::nonEmptyString(I_->Name);
517-
if(key == "is-pack")
518-
return I_->IsParameterPack;
519-
if(key == "type")
402+
case TParamKind::Type:
520403
{
521-
if(I_->Kind != TParamKind::NonType)
404+
const auto& P = I.get<TypeTParam>();
405+
if(! P.Default)
522406
return nullptr;
523407
return dom::create<DomTypeInfo>(
524-
I_->get<NonTypeTParam>().Type, corpus_);
408+
*P.Default, corpus);
525409
}
526-
if(key == "params")
410+
case TParamKind::NonType:
527411
{
528-
if(I_->Kind != TParamKind::Template)
412+
const auto& P = I.get<NonTypeTParam>();
413+
if(! P.Default)
529414
return nullptr;
530-
return dom::create<DomTParamArray>(
531-
I_->get<TemplateTParam>().Params, corpus_);
415+
return *P.Default;
532416
}
533-
if(key == "default")
417+
case TParamKind::Template:
534418
{
535-
switch(I_->Kind)
536-
{
537-
case TParamKind::Type:
538-
{
539-
const auto& P = I_->get<TypeTParam>();
540-
if(! P.Default)
541-
return nullptr;
542-
return dom::create<DomTypeInfo>(
543-
*P.Default, corpus_);
544-
}
545-
case TParamKind::NonType:
546-
{
547-
const auto& P = I_->get<NonTypeTParam>();
548-
if(! P.Default)
549-
return nullptr;
550-
return *P.Default;
551-
}
552-
case TParamKind::Template:
553-
{
554-
const auto& P = I_->get<TemplateTParam>();
555-
if(! P.Default)
556-
return nullptr;
557-
return *P.Default;
558-
}
559-
default:
560-
MRDOX_UNREACHABLE();
561-
}
419+
const auto& P = I.get<TemplateTParam>();
420+
if(! P.Default)
421+
return nullptr;
422+
return *P.Default;
562423
}
563-
return nullptr;
424+
default:
425+
MRDOX_UNREACHABLE();
426+
}
427+
}
428+
429+
// this is here for circular references
430+
DomTParam::
431+
DomTParam(
432+
TParam const& I,
433+
Corpus const& corpus) noexcept
434+
: Object({
435+
{"kind", toString(I.Kind)},
436+
{"name", dom::nonEmptyString(I.Name)},
437+
{"is-pack", I.IsParameterPack},
438+
{"type", I.Kind == TParamKind::NonType ?
439+
dom::create<DomTypeInfo>(
440+
I.get<NonTypeTParam>().Type, corpus) :
441+
dom::Value()},
442+
{"params", I.Kind == TParamKind::Template ?
443+
dom::create<DomTParamArray>(
444+
I.get<TemplateTParam>().Params, corpus) :
445+
dom::Value()},
446+
{"default", getTParamDefault(I, corpus)}
447+
})
448+
{
564449
}
565450

566451
static

source/Metadata/Templates.cpp

+33
Original file line numberDiff line numberDiff line change
@@ -94,5 +94,38 @@ TArg(
9494
{
9595
}
9696

97+
std::string_view
98+
toString(TParamKind kind)
99+
{
100+
switch(kind)
101+
{
102+
case TParamKind::Type:
103+
return "type";
104+
case TParamKind::NonType:
105+
return "non-type";
106+
case TParamKind::Template:
107+
return "template";
108+
default:
109+
// kind should never be None
110+
MRDOX_UNREACHABLE();
111+
}
112+
}
113+
114+
std::string_view
115+
toString(TemplateSpecKind kind)
116+
{
117+
switch(kind)
118+
{
119+
case TemplateSpecKind::Primary:
120+
return "primary";
121+
case TemplateSpecKind::Explicit:
122+
return "explicit";
123+
case TemplateSpecKind::Partial:
124+
return "partial";
125+
default:
126+
MRDOX_UNREACHABLE();
127+
}
128+
}
129+
97130
} // mrdox
98131
} // clang

0 commit comments

Comments
 (0)