[Serialization] Add a "unavailable" bit to conditional substitution record

A step towards supporting different opaque result type produced by a
`if #unavailable` block.
This commit is contained in:
Pavel Yaskevich
2022-07-06 10:43:02 -07:00
committed by Pavel Yaskevich
parent 0fdba62bd8
commit 8185db433a
4 changed files with 62 additions and 22 deletions

View File

@@ -3945,17 +3945,19 @@ public:
S.DeclTypeAbbrCodes[ConditionalSubstitutionLayout::Code];
for (const auto *subs :
opaqueDecl->getConditionallyAvailableSubstitutions().drop_back()) {
SmallVector<IdentifierID, 4> conditions;
for (const auto &condition : subs->getAvailability()) {
auto lowerEndpoint = condition.getLowerEndpoint();
conditions.push_back(
S.addUniquedStringRef(lowerEndpoint.getAsString()));
}
ConditionalSubstitutionLayout::emitRecord(
S.Out, S.ScratchRecord, abbrCode,
S.addSubstitutionMapRef(subs->getSubstitutions()), conditions);
S.addSubstitutionMapRef(subs->getSubstitutions()));
unsigned condAbbrCode =
S.DeclTypeAbbrCodes[ConditionalSubstitutionConditionLayout::Code];
for (const auto &condition : subs->getAvailability()) {
ENCODE_VER_TUPLE(osVersion, llvm::Optional<llvm::VersionTuple>(
condition.getLowerEndpoint()));
ConditionalSubstitutionConditionLayout::emitRecord(
S.Out, S.ScratchRecord, condAbbrCode, /*isUnavailable=*/false,
LIST_VER_TUPLE_PIECES(osVersion));
}
}
}
}
@@ -5134,6 +5136,7 @@ void Serializer::writeAllDeclsAndTypes() {
registerDeclTypeAbbr<XRefLayout>();
registerDeclTypeAbbr<ConditionalSubstitutionLayout>();
registerDeclTypeAbbr<ConditionalSubstitutionConditionLayout>();
#define DECL_ATTR(X, NAME, ...) \
registerDeclTypeAbbr<NAME##DeclAttrLayout>();