Skip to content

Commit c54f1db

Browse files
committed
base class references evaluate extraction mode
#feat
1 parent 24570e8 commit c54f1db

File tree

4 files changed

+31
-14
lines changed

4 files changed

+31
-14
lines changed

docs/mrdocs.schema.json

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -160,12 +160,12 @@
160160
},
161161
"inherit-base-members": {
162162
"default": "copy-dependencies",
163-
"description": "Determine how derived classes inherit members of base classes. When set to `never`, derived classes do not inherit members of base classes and only the relationship is stored. When set to `reference`, derived classes list members of base classes but references are still linked to the base class. When set to `copy`, a copy is created for each base symbol as if it was declared in the derived class. If the base class is a dependency, the extraction mode is copied from the new parent. When set to `copy-dependencies`, a reference is created by default and a copy is created when the base class is a dependency.",
163+
"description": "Determine how derived classes inherit members of base classes. When set to `never`, derived classes do not inherit members of base classes and only the relationship is stored. When set to `reference`, derived classes list members of base classes but references are still linked to the base class. When set to `copy-dependencies`, a reference is created by default and a copy is created when the base class is a dependency. When set to `copy-all`, a copy is created for each base symbol as if it was declared in the derived class. If the base class is a dependency, the extraction mode is copied from the new parent.",
164164
"enum": [
165165
"never",
166166
"reference",
167-
"copy",
168-
"copy-dependencies"
167+
"copy-dependencies",
168+
"copy-all"
169169
],
170170
"title": "Determine how derived classes inherit base members"
171171
},

src/lib/Lib/ConfigOptions.json

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -181,13 +181,13 @@
181181
{
182182
"name": "inherit-base-members",
183183
"brief": "Determine how derived classes inherit base members",
184-
"details": "Determine how derived classes inherit members of base classes. When set to `never`, derived classes do not inherit members of base classes and only the relationship is stored. When set to `reference`, derived classes list members of base classes but references are still linked to the base class. When set to `copy`, a copy is created for each base symbol as if it was declared in the derived class. If the base class is a dependency, the extraction mode is copied from the new parent. When set to `copy-dependencies`, a reference is created by default and a copy is created when the base class is a dependency.",
184+
"details": "Determine how derived classes inherit members of base classes. When set to `never`, derived classes do not inherit members of base classes and only the relationship is stored. When set to `reference`, derived classes list members of base classes but references are still linked to the base class. When set to `copy-dependencies`, a reference is created by default and a copy is created when the base class is a dependency. When set to `copy-all`, a copy is created for each base symbol as if it was declared in the derived class. If the base class is a dependency, the extraction mode is copied from the new parent.",
185185
"type": "enum",
186186
"values": [
187187
"never",
188188
"reference",
189-
"copy",
190-
"copy-dependencies"
189+
"copy-dependencies",
190+
"copy-all"
191191
],
192192
"default": "copy-dependencies"
193193
},

src/lib/Metadata/Finalizers/BaseMembersFinalizer.cpp

Lines changed: 24 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,19 @@ inheritBaseMembers(
7878
inheritBaseMembers(derivedId, derived.Friends, base.Friends);
7979
}
8080

81+
namespace {
82+
bool
83+
shouldCopy(Config const& config, Info const& M)
84+
{
85+
86+
if (config->inheritBaseMembers == PublicSettings::BaseMemberInheritance::CopyDependencies)
87+
{
88+
return M.Extraction == ExtractionMode::Dependency;
89+
}
90+
return config->inheritBaseMembers == PublicSettings::BaseMemberInheritance::CopyAll;
91+
}
92+
}
93+
8194
void
8295
BaseMembersFinalizer::
8396
inheritBaseMembers(
@@ -122,15 +135,19 @@ inheritBaseMembers(
122135
});
123136
MRDOCS_CHECK_OR_CONTINUE(shadowIt == derived.end());
124137

125-
bool const copyMember =
126-
config_->inheritBaseMembers == PublicSettings::BaseMemberInheritance::CopyDependencies ?
127-
otherInfo.Extraction == ExtractionMode::Dependency :
128-
config_->inheritBaseMembers == PublicSettings::BaseMemberInheritance::Copy;
129-
130138
// Not a shadow, so inherit the base member
131-
if (!copyMember)
139+
if (!shouldCopy(config_, otherInfo))
132140
{
133-
derived.push_back(otherID);
141+
// When it's a dependency, we don't create a reference to
142+
// the member because the reference would be invalid.
143+
// The user can use `copy-dependencies` or `copy` to
144+
// copy the dependencies.
145+
// There could be another option that forces the symbol
146+
// extraction mode to be regular, but that is controversial.
147+
if (otherInfo.Extraction != ExtractionMode::Dependency)
148+
{
149+
derived.push_back(otherID);
150+
}
134151
}
135152
else
136153
{

util/generate-config-info.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@ def get_valid_enum_categories():
6565
valid_enum_cats = {
6666
'generator': ["adoc", "html", "xml"],
6767
'log-level': ["trace", "debug", "info", "warn", "error", "fatal"],
68-
'base-member-inheritance': ["never", "reference", "copy", "copy-dependencies"]
68+
'base-member-inheritance': ["never", "reference", "copy-dependencies", "copy-all"]
6969
}
7070
return valid_enum_cats
7171

0 commit comments

Comments
 (0)