Skip to content

Commit e822361

Browse files
committed
fix
1 parent b0f4891 commit e822361

File tree

2 files changed

+33
-23
lines changed

2 files changed

+33
-23
lines changed

src/lib/Metadata/Finalizers/BaseMembersFinalizer.cpp

Lines changed: 26 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -30,53 +30,57 @@ inheritBaseMembers(
3030
RecordInterface const& base,
3131
AccessKind const A)
3232
{
33+
auto&& members = allMembers(derived);
34+
3335
if (A == AccessKind::Public)
3436
{
3537
// When a class uses public member access specifier to derive from a
3638
// base, all public members of the base class are accessible as public
3739
// members of the derived class and all protected members of the base
3840
// class are accessible as protected members of the derived class.
3941
// Private members of the base are never accessible unless friended.
40-
inheritBaseMembers(derivedId, derived.Public, base.Public);
41-
inheritBaseMembers(derivedId, derived.Protected, base.Protected);
42+
inheritBaseMembers(derivedId, derived.Public, base.Public, members);
43+
inheritBaseMembers(derivedId, derived.Protected, base.Protected, members);
4244
}
4345
else if (A == AccessKind::Protected)
4446
{
4547
// When a class uses protected member access specifier to derive from a
4648
// base, all public and protected members of the base class are
4749
// accessible as protected members of the derived class (private members
4850
// of the base are never accessible unless friended).
49-
inheritBaseMembers(derivedId, derived.Protected, base.Public);
50-
inheritBaseMembers(derivedId, derived.Protected, base.Protected);
51+
inheritBaseMembers(derivedId, derived.Protected, base.Public, members);
52+
inheritBaseMembers(derivedId, derived.Protected, base.Protected, members);
5153
}
5254
else if (A == AccessKind::Private && corpus_.config->extractPrivate)
5355
{
5456
// When a class uses private member access specifier to derive from a
5557
// base, all public and protected members of the base class are
5658
// accessible as private members of the derived class (private members
5759
// of the base are never accessible unless friended).
58-
inheritBaseMembers(derivedId, derived.Private, base.Public);
59-
inheritBaseMembers(derivedId, derived.Private, base.Protected);
60+
inheritBaseMembers(derivedId, derived.Private, base.Public, members);
61+
inheritBaseMembers(derivedId, derived.Private, base.Protected, members);
6062
}
6163
}
6264

65+
template <std::ranges::range Range>
6366
void
6467
BaseMembersFinalizer::
6568
inheritBaseMembers(
6669
SymbolID const& derivedId,
6770
RecordTranche& derived,
68-
RecordTranche const& base)
71+
RecordTranche const& base,
72+
Range allMembers)
6973
{
70-
inheritBaseMembers(derivedId, derived.NamespaceAliases, base.NamespaceAliases);
71-
inheritBaseMembers(derivedId, derived.Typedefs, base.Typedefs);
72-
inheritBaseMembers(derivedId, derived.Records, base.Records);
73-
inheritBaseMembers(derivedId, derived.Enums, base.Enums);
74-
inheritBaseMembers(derivedId, derived.Functions, base.Functions);
75-
inheritBaseMembers(derivedId, derived.StaticFunctions, base.StaticFunctions);
76-
inheritBaseMembers(derivedId, derived.Variables, base.Variables);
77-
inheritBaseMembers(derivedId, derived.StaticVariables, base.StaticVariables);
78-
inheritBaseMembers(derivedId, derived.Concepts, base.Concepts);
79-
inheritBaseMembers(derivedId, derived.Guides, base.Guides);
74+
inheritBaseMembers(derivedId, derived.NamespaceAliases, base.NamespaceAliases, allMembers);
75+
inheritBaseMembers(derivedId, derived.Typedefs, base.Typedefs, allMembers);
76+
inheritBaseMembers(derivedId, derived.Records, base.Records, allMembers);
77+
inheritBaseMembers(derivedId, derived.Enums, base.Enums, allMembers);
78+
inheritBaseMembers(derivedId, derived.Functions, base.Functions, allMembers);
79+
inheritBaseMembers(derivedId, derived.StaticFunctions, base.StaticFunctions, allMembers);
80+
inheritBaseMembers(derivedId, derived.Variables, base.Variables, allMembers);
81+
inheritBaseMembers(derivedId, derived.StaticVariables, base.StaticVariables, allMembers);
82+
inheritBaseMembers(derivedId, derived.Concepts, base.Concepts, allMembers);
83+
inheritBaseMembers(derivedId, derived.Guides, base.Guides, allMembers);
8084
}
8185

8286
namespace {
@@ -91,12 +95,14 @@ shouldCopy(Config const& config, Info const& M)
9195
}
9296
}
9397

98+
template <std::ranges::range Range>
9499
void
95100
BaseMembersFinalizer::
96101
inheritBaseMembers(
97102
SymbolID const& derivedId,
98103
std::vector<SymbolID>& derived,
99-
std::vector<SymbolID> const& base)
104+
std::vector<SymbolID> const& base,
105+
Range allMembers)
100106
{
101107
for (SymbolID const& otherID: base)
102108
{
@@ -116,7 +122,7 @@ inheritBaseMembers(
116122

117123
// Check if derived class has a member that shadows the base member
118124
auto shadowIt = std::ranges::find_if(
119-
derived,
125+
allMembers,
120126
[&](SymbolID const& id)
121127
{
122128
Info* infoPtr = corpus_.find(id);
@@ -135,7 +141,7 @@ inheritBaseMembers(
135141
// are the same
136142
return info.Name == otherInfo.Name;
137143
});
138-
MRDOCS_CHECK_OR_CONTINUE(shadowIt == derived.end());
144+
MRDOCS_CHECK_OR_CONTINUE(shadowIt == allMembers.end());
139145

140146
// Not a shadow, so inherit the base member
141147
if (!shouldCopy(corpus_.config, otherInfo))

src/lib/Metadata/Finalizers/BaseMembersFinalizer.hpp

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -38,18 +38,22 @@ class BaseMembersFinalizer
3838
RecordInterface& derived,
3939
RecordInterface const& base,
4040
AccessKind A);
41-
41+
42+
template <std::ranges::range Range>
4243
void
4344
inheritBaseMembers(
4445
SymbolID const& derivedId,
4546
RecordTranche& derived,
46-
RecordTranche const& base);
47+
RecordTranche const& base,
48+
Range allMembers);
4749

50+
template <std::ranges::range Range>
4851
void
4952
inheritBaseMembers(
5053
SymbolID const& derivedId,
5154
std::vector<SymbolID>& derived,
52-
std::vector<SymbolID> const& base);
55+
std::vector<SymbolID> const& base,
56+
Range allMembers);
5357

5458
void
5559
finalizeRecords(std::vector<SymbolID> const& ids);

0 commit comments

Comments
 (0)