Skip to content

Commit 65767e2

Browse files
committed
base-members
1 parent d785504 commit 65767e2

18 files changed

+1692
-745
lines changed

src/lib/CorpusImpl.cpp

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1004,13 +1004,6 @@ qualifiedName(
10041004
void
10051005
CorpusImpl::finalize()
10061006
{
1007-
// Finalizing record interfaces
1008-
{
1009-
report::debug(" - Finalizing records");
1010-
RecordsFinalizer finalizer(*this);
1011-
finalizer.build();
1012-
}
1013-
10141007
report::info("Finalizing corpus");
10151008

10161009
{
@@ -1026,6 +1019,13 @@ CorpusImpl::finalize()
10261019
finalizer.build();
10271020
}
10281021

1022+
// Finalizing record interfaces
1023+
{
1024+
report::debug(" - Finalizing records");
1025+
RecordsFinalizer finalizer(*this);
1026+
finalizer.build();
1027+
}
1028+
10291029
if (config->overloads)
10301030
{
10311031
report::debug(" - Finalizing overloads");

src/lib/Metadata/Finalizers/BaseMembersFinalizer.cpp

Lines changed: 31 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -15,9 +15,19 @@
1515

1616
namespace clang::mrdocs {
1717

18-
void
19-
BaseMembersFinalizer::
20-
inheritBaseMembers(RecordInfo& I, RecordInfo const& B, AccessKind const A)
18+
namespace {
19+
bool
20+
shouldCopy(Config const& config, Info const& M)
21+
{
22+
if (config->inheritBaseMembers == PublicSettings::BaseMemberInheritance::CopyDependencies)
23+
{
24+
return M.Extraction == ExtractionMode::Dependency;
25+
}
26+
return config->inheritBaseMembers == PublicSettings::BaseMemberInheritance::CopyAll;
27+
}
28+
29+
AccessKind
30+
effectiveAccess(AccessKind const declaredAccess, AccessKind const A)
2131
{
2232
if (A == AccessKind::Public)
2333
{
@@ -26,71 +36,43 @@ inheritBaseMembers(RecordInfo& I, RecordInfo const& B, AccessKind const A)
2636
// members of the derived class and all protected members of the base
2737
// class are accessible as protected members of the derived class.
2838
// Private members of the base are never accessible unless friended.
29-
inheritBaseMembers(I.id, I.Interface.Public, B.Interface.Public);
30-
inheritBaseMembers(I.id, I.Interface.Protected, B.Interface.Protected);
39+
return declaredAccess;
3140
}
3241
else if (A == AccessKind::Protected)
3342
{
3443
// When a class uses protected member access specifier to derive from a
3544
// base, all public and protected members of the base class are
3645
// accessible as protected members of the derived class (private members
3746
// of the base are never accessible unless friended).
38-
inheritBaseMembers(I.id, I.Interface.Protected, B.Interface.Public);
39-
inheritBaseMembers(I.id, I.Interface.Protected, B.Interface.Protected);
47+
return AccessKind::Protected;
4048
}
41-
else if (A == AccessKind::Private && corpus_.config->extractPrivate)
49+
else if (A == AccessKind::Private)
4250
{
4351
// When a class uses private member access specifier to derive from a
4452
// base, all public and protected members of the base class are
4553
// accessible as private members of the derived class (private members
4654
// of the base are never accessible unless friended).
47-
inheritBaseMembers(I.id, I.Interface.Private, B.Interface.Public);
48-
inheritBaseMembers(I.id, I.Interface.Private, B.Interface.Protected);
55+
return AccessKind::Private;
4956
}
50-
}
5157

52-
void
53-
BaseMembersFinalizer::
54-
inheritBaseMembers(
55-
SymbolID const& derivedId,
56-
RecordTranche& derived,
57-
RecordTranche const& base)
58-
{
59-
inheritBaseMembers(derivedId, derived.NamespaceAliases, base.NamespaceAliases);
60-
inheritBaseMembers(derivedId, derived.Typedefs, base.Typedefs);
61-
inheritBaseMembers(derivedId, derived.Records, base.Records);
62-
inheritBaseMembers(derivedId, derived.Enums, base.Enums);
63-
inheritBaseMembers(derivedId, derived.Functions, base.Functions);
64-
inheritBaseMembers(derivedId, derived.StaticFunctions, base.StaticFunctions);
65-
inheritBaseMembers(derivedId, derived.Variables, base.Variables);
66-
inheritBaseMembers(derivedId, derived.StaticVariables, base.StaticVariables);
67-
inheritBaseMembers(derivedId, derived.Concepts, base.Concepts);
68-
inheritBaseMembers(derivedId, derived.Guides, base.Guides);
69-
}
70-
71-
namespace {
72-
bool
73-
shouldCopy(Config const& config, Info const& M)
74-
{
75-
if (config->inheritBaseMembers == PublicSettings::BaseMemberInheritance::CopyDependencies)
76-
{
77-
return M.Extraction == ExtractionMode::Dependency;
78-
}
79-
return config->inheritBaseMembers == PublicSettings::BaseMemberInheritance::CopyAll;
58+
return AccessKind::None;
8059
}
8160
}
8261

83-
void
62+
void
8463
BaseMembersFinalizer::
85-
inheritBaseMembers(
86-
SymbolID const& derivedId,
87-
std::vector<SymbolID>& derived,
88-
std::vector<SymbolID> const& base)
64+
inheritBaseMembers(RecordInfo& I, RecordInfo const& B, AccessKind const A)
8965
{
90-
for (SymbolID const& otherID: base)
66+
SymbolID const& derivedId = I.id;
67+
std::vector<MemberInfo>& derived = I.Members;
68+
std::vector<MemberInfo> const& base = B.Members;
69+
70+
for (auto const& other: base)
9171
{
72+
SymbolID const& otherID = other.id;
73+
9274
// Find the info from the base class
93-
MRDOCS_CHECK_OR_CONTINUE(!contains(derived, otherID));
75+
MRDOCS_CHECK_OR_CONTINUE(!std::ranges::contains(derived, otherID, &MemberInfo::id));
9476
Info* otherInfoPtr = corpus_.find(otherID);
9577
MRDOCS_CHECK_OR_CONTINUE(otherInfoPtr);
9678
Info& otherInfo = *otherInfoPtr;
@@ -123,7 +105,7 @@ inheritBaseMembers(
123105
// For other kinds of members, it's a shadow if the names
124106
// are the same
125107
return info.Name == otherInfo.Name;
126-
});
108+
}, &MemberInfo::id);
127109
MRDOCS_CHECK_OR_CONTINUE(shadowIt == derived.end());
128110

129111
// Not a shadow, so inherit the base member
@@ -137,7 +119,7 @@ inheritBaseMembers(
137119
// extraction mode to be regular, but that is controversial.
138120
if (otherInfo.Extraction != ExtractionMode::Dependency)
139121
{
140-
derived.push_back(otherID);
122+
derived.emplace_back(effectiveAccess(other.EffectiveAccess, A), other.Kind, otherID);
141123
}
142124
}
143125
else
@@ -152,7 +134,7 @@ inheritBaseMembers(
152134
otherCopy->id = SymbolID::createFromString(
153135
std::format("{}-{}", toBase16Str(otherCopy->Parent),
154136
toBase16Str(otherInfo.id)));
155-
derived.push_back(otherCopy->id);
137+
derived.emplace_back(effectiveAccess(other.EffectiveAccess, A), other.Kind, otherCopy->id);
156138
// Get the extraction mode from the derived class
157139
if (otherCopy->Extraction == ExtractionMode::Dependency)
158140
{

src/lib/Metadata/Finalizers/BaseMembersFinalizer.hpp

Lines changed: 0 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -32,18 +32,6 @@ class BaseMembersFinalizer
3232
void
3333
inheritBaseMembers(RecordInfo& I, RecordInfo const& B, AccessKind A);
3434

35-
void
36-
inheritBaseMembers(
37-
SymbolID const& derivedId,
38-
RecordTranche& derived,
39-
RecordTranche const& base);
40-
41-
void
42-
inheritBaseMembers(
43-
SymbolID const& derivedId,
44-
std::vector<SymbolID>& derived,
45-
std::vector<SymbolID> const& base);
46-
4735
void
4836
finalizeRecords(std::vector<SymbolID> const& ids);
4937

test-files/golden-tests/config/inherit-base-members/copy-dependencies.adoc

Lines changed: 92 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -337,8 +337,6 @@ class derived
337337
| This function should be inherited by derived classes&period;
338338
| link:#base-do_base_shadowed[`do&lowbar;base&lowbar;shadowed`]
339339
| This function should shadow the excluded&lowbar;base function&period;
340-
| link:#base-do_derived_shadowed[`do&lowbar;derived&lowbar;shadowed`]
341-
| This function should be shadowed by derived classes&period;
342340
| link:#derived-do_excluded_inherited[`do&lowbar;excluded&lowbar;inherited`]
343341
| This function should be inherited by derived classes&period;
344342
| link:#derived-do_shadowed[`do&lowbar;shadowed`]
@@ -450,10 +448,36 @@ class private&lowbar;derived
450448
|===
451449
| Name
452450
| Description
451+
| link:#base_base-base_base_inherited[`base&lowbar;base&lowbar;inherited`]
452+
| This function should be indirectly inherited by derived classes&period;
453+
| link:#base-base_inherited[`base&lowbar;inherited`]
454+
| This function should be inherited by derived classes&period;
455+
| link:#base-base_shadowed[`base&lowbar;shadowed`]
456+
| This function should shadow the excluded&lowbar;base function&period;
453457
| link:#private_derived-derived_shadowed[`derived&lowbar;shadowed`]
454458
| This function should shadow the base class function&period;
459+
| link:#base_base-do_base_base_inherited[`do&lowbar;base&lowbar;base&lowbar;inherited`]
460+
| This function should be indirectly inherited by derived classes&period;
455461
| link:#private_derived-do_derived_shadowed[`do&lowbar;derived&lowbar;shadowed`]
456462
| This function should shadow the base class function&period;
463+
| link:#private_derived-excluded_inherited[`excluded&lowbar;inherited`]
464+
| This function should be inherited by derived classes&period;
465+
|===
466+
467+
=== Protected Member Functions
468+
469+
[cols=2]
470+
|===
471+
| Name
472+
| Description
473+
| link:#base-do_base_inherited[`do&lowbar;base&lowbar;inherited`]
474+
| This function should be inherited by derived classes&period;
475+
| link:#base-do_base_shadowed[`do&lowbar;base&lowbar;shadowed`]
476+
| This function should shadow the excluded&lowbar;base function&period;
477+
| link:#private_derived-do_excluded_inherited[`do&lowbar;excluded&lowbar;inherited`]
478+
| This function should be inherited by derived classes&period;
479+
| link:#private_derived-do_shadowed[`do&lowbar;shadowed`]
480+
| This function should be shadowed by derived classes&period;
457481
|===
458482

459483
[#private_derived-derived_shadowed]
@@ -494,6 +518,51 @@ do&lowbar;derived&lowbar;shadowed();
494518

495519
A class that uses private inheritance only
496520

521+
[#private_derived-excluded_inherited]
522+
== link:#private_derived[private&lowbar;derived]::excluded&lowbar;inherited
523+
524+
This function should be inherited by derived classes&period;
525+
526+
=== Synopsis
527+
528+
Declared in `&lt;copy&hyphen;dependencies&period;cpp&gt;`
529+
530+
[source,cpp,subs="verbatim,replacements,macros,-callouts"]
531+
----
532+
excluded&lowbar;base&
533+
excluded&lowbar;inherited();
534+
----
535+
536+
[#private_derived-do_excluded_inherited]
537+
== link:#private_derived[private&lowbar;derived]::do&lowbar;excluded&lowbar;inherited
538+
539+
This function should be inherited by derived classes&period;
540+
541+
=== Synopsis
542+
543+
Declared in `&lt;copy&hyphen;dependencies&period;cpp&gt;`
544+
545+
[source,cpp,subs="verbatim,replacements,macros,-callouts"]
546+
----
547+
excluded&lowbar;base&
548+
do&lowbar;excluded&lowbar;inherited();
549+
----
550+
551+
[#private_derived-do_shadowed]
552+
== link:#private_derived[private&lowbar;derived]::do&lowbar;shadowed
553+
554+
This function should be shadowed by derived classes&period;
555+
556+
=== Synopsis
557+
558+
Declared in `&lt;copy&hyphen;dependencies&period;cpp&gt;`
559+
560+
[source,cpp,subs="verbatim,replacements,macros,-callouts"]
561+
----
562+
excluded&lowbar;base&
563+
do&lowbar;shadowed();
564+
----
565+
497566
[#protected_derived]
498567
== protected&lowbar;derived
499568

@@ -528,10 +597,20 @@ class protected&lowbar;derived
528597
|===
529598
| Name
530599
| Description
600+
| link:#base_base-base_base_inherited[`base&lowbar;base&lowbar;inherited`]
601+
| This function should be indirectly inherited by derived classes&period;
602+
| link:#base-base_inherited[`base&lowbar;inherited`]
603+
| This function should be inherited by derived classes&period;
604+
| link:#base-base_shadowed[`base&lowbar;shadowed`]
605+
| This function should shadow the excluded&lowbar;base function&period;
531606
| link:#protected_derived-derived_shadowed[`derived&lowbar;shadowed`]
532607
| This function should shadow the base class function&period;
608+
| link:#base_base-do_base_base_inherited[`do&lowbar;base&lowbar;base&lowbar;inherited`]
609+
| This function should be indirectly inherited by derived classes&period;
533610
| link:#protected_derived-do_derived_shadowed[`do&lowbar;derived&lowbar;shadowed`]
534611
| This function should shadow the base class function&period;
612+
| link:#protected_derived-excluded_inherited[`excluded&lowbar;inherited`]
613+
| This function should be inherited by derived classes&period;
535614
|===
536615

537616
=== Protected Member Functions
@@ -540,28 +619,14 @@ class protected&lowbar;derived
540619
|===
541620
| Name
542621
| Description
543-
| link:#base_base-base_base_inherited[`base&lowbar;base&lowbar;inherited`]
544-
| This function should be indirectly inherited by derived classes&period;
545-
| link:#base-base_inherited[`base&lowbar;inherited`]
546-
| This function should be inherited by derived classes&period;
547-
| link:#base-base_shadowed[`base&lowbar;shadowed`]
548-
| This function should shadow the excluded&lowbar;base function&period;
549-
| link:#base-derived_shadowed[`derived&lowbar;shadowed`]
550-
| This function should be shadowed by derived classes&period;
551-
| link:#base_base-do_base_base_inherited[`do&lowbar;base&lowbar;base&lowbar;inherited`]
552-
| This function should be indirectly inherited by derived classes&period;
553622
| link:#base-do_base_inherited[`do&lowbar;base&lowbar;inherited`]
554623
| This function should be inherited by derived classes&period;
555624
| link:#base-do_base_shadowed[`do&lowbar;base&lowbar;shadowed`]
556625
| This function should shadow the excluded&lowbar;base function&period;
557-
| link:#base-do_derived_shadowed[`do&lowbar;derived&lowbar;shadowed`]
558-
| This function should be shadowed by derived classes&period;
559626
| link:#protected_derived-do_excluded_inherited[`do&lowbar;excluded&lowbar;inherited`]
560627
| This function should be inherited by derived classes&period;
561628
| link:#protected_derived-do_shadowed[`do&lowbar;shadowed`]
562629
| This function should be shadowed by derived classes&period;
563-
| link:#protected_derived-excluded_inherited[`excluded&lowbar;inherited`]
564-
| This function should be inherited by derived classes&period;
565630
|===
566631

567632
[#protected_derived-derived_shadowed]
@@ -602,8 +667,8 @@ do&lowbar;derived&lowbar;shadowed();
602667

603668
A class that should inherit functions as protected&period;
604669

605-
[#protected_derived-do_excluded_inherited]
606-
== link:#protected_derived[protected&lowbar;derived]::do&lowbar;excluded&lowbar;inherited
670+
[#protected_derived-excluded_inherited]
671+
== link:#protected_derived[protected&lowbar;derived]::excluded&lowbar;inherited
607672

608673
This function should be inherited by derived classes&period;
609674

@@ -614,13 +679,13 @@ Declared in `&lt;copy&hyphen;dependencies&period;cpp&gt;`
614679
[source,cpp,subs="verbatim,replacements,macros,-callouts"]
615680
----
616681
excluded&lowbar;base&
617-
do&lowbar;excluded&lowbar;inherited();
682+
excluded&lowbar;inherited();
618683
----
619684

620-
[#protected_derived-do_shadowed]
621-
== link:#protected_derived[protected&lowbar;derived]::do&lowbar;shadowed
685+
[#protected_derived-do_excluded_inherited]
686+
== link:#protected_derived[protected&lowbar;derived]::do&lowbar;excluded&lowbar;inherited
622687

623-
This function should be shadowed by derived classes&period;
688+
This function should be inherited by derived classes&period;
624689

625690
=== Synopsis
626691

@@ -629,13 +694,13 @@ Declared in `&lt;copy&hyphen;dependencies&period;cpp&gt;`
629694
[source,cpp,subs="verbatim,replacements,macros,-callouts"]
630695
----
631696
excluded&lowbar;base&
632-
do&lowbar;shadowed();
697+
do&lowbar;excluded&lowbar;inherited();
633698
----
634699

635-
[#protected_derived-excluded_inherited]
636-
== link:#protected_derived[protected&lowbar;derived]::excluded&lowbar;inherited
700+
[#protected_derived-do_shadowed]
701+
== link:#protected_derived[protected&lowbar;derived]::do&lowbar;shadowed
637702

638-
This function should be inherited by derived classes&period;
703+
This function should be shadowed by derived classes&period;
639704

640705
=== Synopsis
641706

@@ -644,7 +709,7 @@ Declared in `&lt;copy&hyphen;dependencies&period;cpp&gt;`
644709
[source,cpp,subs="verbatim,replacements,macros,-callouts"]
645710
----
646711
excluded&lowbar;base&
647-
excluded&lowbar;inherited();
712+
do&lowbar;shadowed();
648713
----
649714

650715

0 commit comments

Comments
 (0)