Serialization: Encode custom availability domains.

When serializing `@available` attributes, if the attribute applies to a custom
domain include enough information to deserialize the reference to that domain.

Resolves rdar://138441265.
This commit is contained in:
Allan Shortlidge
2025-04-06 18:44:40 -07:00
parent 0a81283d34
commit 1cd636d9b3
15 changed files with 277 additions and 97 deletions

View File

@@ -3130,7 +3130,26 @@ class Serializer::DeclSerializer : public DeclVisitor<DeclSerializer> {
!theAttr->getParsedAttr()->hasCachedRenamedDecl());
auto domain = theAttr->getDomain();
// FIXME: [availability] Serialize domain and kind directly.
auto getDomainKind = [](AvailabilityDomain domain) -> AvailabilityDomainKind {
switch (domain.getKind()) {
case AvailabilityDomain::Kind::Universal:
return AvailabilityDomainKind::Universal;
case AvailabilityDomain::Kind::SwiftLanguage:
return AvailabilityDomainKind::SwiftLanguage;
case AvailabilityDomain::Kind::PackageDescription:
return AvailabilityDomainKind::PackageDescription;
case AvailabilityDomain::Kind::Embedded:
return AvailabilityDomainKind::Embedded;
case AvailabilityDomain::Kind::Platform:
return AvailabilityDomainKind::Platform;
case AvailabilityDomain::Kind::Custom:
return AvailabilityDomainKind::Custom;
}
};
auto domainKind = getDomainKind(domain);
const Decl *domainDecl = domain.getDecl();
llvm::SmallString<32> blob;
blob.append(theAttr->getMessage());
blob.append(theAttr->getRename());
@@ -3141,13 +3160,13 @@ class Serializer::DeclSerializer : public DeclVisitor<DeclSerializer> {
theAttr->isUnconditionallyUnavailable(),
theAttr->isUnconditionallyDeprecated(),
theAttr->isNoAsync(),
domain.isPackageDescription(),
theAttr->isSPI(),
domain.isEmbedded(),
static_cast<uint8_t>(domainKind),
static_cast<unsigned>(domain.getPlatformKind()),
S.addDeclRef(domainDecl),
LIST_VER_TUPLE_PIECES(Introduced),
LIST_VER_TUPLE_PIECES(Deprecated),
LIST_VER_TUPLE_PIECES(Obsoleted),
static_cast<unsigned>(domain.getPlatformKind()),
theAttr->getMessage().size(),
theAttr->getRename().size(),
blob);