Skip to content

Commit 2a21b06

Browse files
sdkrystianalandefreitas
authored andcommitted
feat: add Info::Implicit flag
1 parent 80f9eae commit 2a21b06

File tree

7 files changed

+35
-15
lines changed

7 files changed

+35
-15
lines changed

include/mrdox/Metadata/Info.hpp

+13
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,19 @@ struct MRDOX_VISIBLE
8080
*/
8181
AccessKind Access = AccessKind::None;
8282

83+
/** Implicitly extracted flag.
84+
85+
This flag distinguishes primary `Info` from `Info` dependencies.
86+
87+
A primary `Info` is one which was extracted during AST traversal
88+
because it satisfied all configured conditions to be extracted.
89+
90+
An `Info` dependency is one which does not meet the configured
91+
conditions for extraction, but was extracted due to it being used
92+
by a primary `Info`.
93+
*/
94+
bool Implicit = true;
95+
8396
/** In-order List of parent namespaces.
8497
*/
8598
std::vector<SymbolID> Namespace;

src/lib/AST/ASTVisitor.cpp

+11-14
Original file line numberDiff line numberDiff line change
@@ -186,26 +186,22 @@ class ASTVisitor
186186
return nullptr;
187187
}
188188

189-
template<typename InfoTy>
190-
InfoTy&
191-
createInfo(const SymbolID& id)
192-
{
193-
auto [it, inserted] = info_.emplace(
194-
std::make_unique<InfoTy>(id));
195-
MRDOX_ASSERT(inserted);
196-
return static_cast<InfoTy&>(*it->get());
197-
}
198-
199189
template<typename InfoTy>
200190
std::pair<InfoTy&, bool>
201191
getOrCreateInfo(const SymbolID& id)
202192
{
203-
if(Info* info = getInfo(id))
193+
Info* info = getInfo(id);
194+
bool created = false;
195+
if(! info)
204196
{
205-
MRDOX_ASSERT(info->Kind == InfoTy::kind_id);
206-
return {static_cast<InfoTy&>(*info), false};
197+
auto [it, inserted] = info_.emplace(
198+
std::make_unique<InfoTy>(id));
199+
info = it->get();
200+
created = true;
207201
}
208-
return {createInfo<InfoTy>(id), true};
202+
MRDOX_ASSERT(info->Kind == InfoTy::kind_id);
203+
info->Implicit &= forceExtract_;
204+
return {static_cast<InfoTy&>(*info), created};
209205
}
210206

211207
Info&
@@ -1971,6 +1967,7 @@ class ASTVisitor
19711967
if(Info* parent = getInfo(parent_id))
19721968
{
19731969
MRDOX_ASSERT(parent->isRecord());
1970+
parent->Implicit &= forceExtract_;
19741971
static_cast<RecordInfo*>(parent)->Friends.emplace_back(I.id);
19751972
}
19761973

src/lib/AST/AnyBlock.hpp

+5
Original file line numberDiff line numberDiff line change
@@ -289,6 +289,9 @@ class InfoPartBlock
289289
: br_(br)
290290
, I(I)
291291
{
292+
// we have to clear Info::Implicit here
293+
// because bitstream elides zero values
294+
I.Implicit = false;
292295
}
293296

294297
Error
@@ -301,6 +304,8 @@ class InfoPartBlock
301304
return decodeRecord(R, I.id, Blob);
302305
case INFO_PART_ACCESS:
303306
return decodeRecord(R, I.Access, Blob);
307+
case INFO_PART_IMPLICIT:
308+
return decodeRecord(R, I.Implicit, Blob);
304309
case INFO_PART_NAME:
305310
return decodeRecord(R, I.Name, Blob);
306311
case INFO_PART_PARENTS:

src/lib/AST/BitcodeIDs.hpp

+1
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,7 @@ enum RecordID
8787

8888
INFO_PART_ID,
8989
INFO_PART_ACCESS,
90+
INFO_PART_IMPLICIT,
9091
INFO_PART_NAME,
9192
INFO_PART_PARENTS,
9293
SOURCE_INFO_DEFLOC,

src/lib/AST/BitcodeWriter.cpp

+3-1
Original file line numberDiff line numberDiff line change
@@ -267,6 +267,7 @@ RecordIDNameMap = []()
267267
{FUNCTION_PARAM_DEFAULT, {"Default", &StringAbbrev}},
268268
{INFO_PART_ACCESS, {"InfoAccess", &Integer32Abbrev}},
269269
{INFO_PART_ID, {"InfoID", &SymbolIDAbbrev}},
270+
{INFO_PART_IMPLICIT, {"InfoImplicit", &BoolAbbrev}},
270271
{INFO_PART_NAME, {"InfoName", &StringAbbrev}},
271272
{INFO_PART_PARENTS, {"InfoParents", &SymbolIDsAbbrev}},
272273
{JAVADOC_NODE_ADMONISH, {"JavadocNodeAdmonish", &Integer32Abbrev}},
@@ -325,7 +326,7 @@ RecordsByBlock{
325326
{BI_VERSION_BLOCK_ID, {VERSION}},
326327
// Info part
327328
{BI_INFO_PART_ID,
328-
{INFO_PART_ID, INFO_PART_ACCESS,
329+
{INFO_PART_ID, INFO_PART_ACCESS, INFO_PART_IMPLICIT,
329330
INFO_PART_NAME, INFO_PART_PARENTS}},
330331
// SourceInfo
331332
{BI_SOURCE_INFO_ID,
@@ -756,6 +757,7 @@ emitInfoPart(
756757
StreamSubBlockGuard Block(Stream, BI_INFO_PART_ID);
757758
emitRecord(I.id, INFO_PART_ID);
758759
emitRecord(I.Access, INFO_PART_ACCESS);
760+
emitRecord(I.Implicit, INFO_PART_IMPLICIT);
759761
emitRecord(I.Name, INFO_PART_NAME);
760762
emitRecord(I.Namespace, INFO_PART_PARENTS);
761763
emitBlock(I.javadoc);

src/lib/Metadata/DomMetadata.cpp

+1
Original file line numberDiff line numberDiff line change
@@ -655,6 +655,7 @@ DomInfo<T>::construct() const
655655
{ "id", toBase16(I_.id) },
656656
{ "kind", toString(I_.Kind) },
657657
{ "access", toString(I_.Access) },
658+
{ "implicit", I_.Implicit },
658659
{ "name", I_.Name },
659660
{ "namespace", dom::newArray<DomSymbolArray>(
660661
I_.Namespace, domCorpus_) },

src/lib/Metadata/Reduce.cpp

+1
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,7 @@ void mergeInfo(Info& I, Info&& Other)
8383
I.Namespace = std::move(Other.Namespace);
8484
if(I.Access == AccessKind::None)
8585
I.Access = Other.Access;
86+
I.Implicit &= Other.Implicit;
8687
// append javadocs
8788
if(! I.javadoc)
8889
I.javadoc = std::move(Other.javadoc);

0 commit comments

Comments
 (0)