@@ -181,6 +181,8 @@ const char InvalidEnumValueError::ID = '\0';
181181void InvalidEnumValueError::anchor () {}
182182const char ConformanceXRefError::ID = ' \0 ' ;
183183void ConformanceXRefError::anchor () {}
184+ const char InavalidAvailabilityDomainError::ID = ' \0 ' ;
185+ void InavalidAvailabilityDomainError::anchor () {}
184186
185187// / Skips a single record in the bitstream.
186188// /
@@ -5720,35 +5722,79 @@ ModuleFile::getDeclChecked(
57205722 return declOrOffset;
57215723}
57225724
5725+ static std::optional<AvailabilityDomainKind>
5726+ decodeDomainKind (uint8_t kind) {
5727+ switch (kind) {
5728+ case static_cast <uint8_t >(AvailabilityDomainKind::Universal):
5729+ return AvailabilityDomainKind::Universal;
5730+ case static_cast <uint8_t >(AvailabilityDomainKind::SwiftLanguage):
5731+ return AvailabilityDomainKind::SwiftLanguage;
5732+ case static_cast <uint8_t >(AvailabilityDomainKind::PackageDescription):
5733+ return AvailabilityDomainKind::PackageDescription;
5734+ case static_cast <uint8_t >(AvailabilityDomainKind::Embedded):
5735+ return AvailabilityDomainKind::Embedded;
5736+ case static_cast <uint8_t >(AvailabilityDomainKind::Platform):
5737+ return AvailabilityDomainKind::Platform;
5738+ case static_cast <uint8_t >(AvailabilityDomainKind::Custom):
5739+ return AvailabilityDomainKind::Custom;
5740+ default :
5741+ return std::nullopt ;
5742+ }
5743+ }
5744+
5745+ static std::optional<AvailabilityDomain>
5746+ decodeAvailabilityDomain (AvailabilityDomainKind domainKind,
5747+ PlatformKind platformKind, Decl *decl,
5748+ const ASTContext &ctx) {
5749+ switch (domainKind) {
5750+ case AvailabilityDomainKind::Universal:
5751+ return AvailabilityDomain::forUniversal ();
5752+ case AvailabilityDomainKind::SwiftLanguage:
5753+ return AvailabilityDomain::forSwiftLanguage ();
5754+ case AvailabilityDomainKind::PackageDescription:
5755+ return AvailabilityDomain::forPackageDescription ();
5756+ case AvailabilityDomainKind::Embedded:
5757+ return AvailabilityDomain::forEmbedded ();
5758+ case AvailabilityDomainKind::Platform:
5759+ return AvailabilityDomain::forPlatform (platformKind);
5760+ case AvailabilityDomainKind::Custom:
5761+ return AvailabilityDomain::forCustom (decl, ctx);
5762+ }
5763+ }
5764+
57235765Expected<AvailableAttr *>
57245766DeclDeserializer::readAvailable_DECL_ATTR (SmallVectorImpl<uint64_t > &scratch,
57255767 StringRef blobData) {
57265768 bool isImplicit;
57275769 bool isUnavailable;
57285770 bool isDeprecated;
57295771 bool isNoAsync;
5730- bool isPackageDescriptionVersionSpecific;
57315772 bool isSPI;
5732- bool isForEmbedded;
5773+ uint8_t rawDomainKind;
5774+ unsigned rawPlatform;
5775+ DeclID domainDeclID;
57335776 DEF_VER_TUPLE_PIECES (Introduced);
57345777 DEF_VER_TUPLE_PIECES (Deprecated);
57355778 DEF_VER_TUPLE_PIECES (Obsoleted);
5736- unsigned rawPlatform, messageSize, renameSize;
5779+ unsigned messageSize, renameSize;
57375780
57385781 // Decode the record, pulling the version tuple information.
57395782 serialization::decls_block::AvailableDeclAttrLayout::readRecord (
5740- scratch, isImplicit, isUnavailable, isDeprecated, isNoAsync,
5741- isPackageDescriptionVersionSpecific, isSPI, isForEmbedded ,
5783+ scratch, isImplicit, isUnavailable, isDeprecated, isNoAsync, isSPI,
5784+ rawDomainKind, rawPlatform, domainDeclID ,
57425785 LIST_VER_TUPLE_PIECES (Introduced), LIST_VER_TUPLE_PIECES (Deprecated),
5743- LIST_VER_TUPLE_PIECES (Obsoleted), rawPlatform, messageSize,
5744- renameSize);
5786+ LIST_VER_TUPLE_PIECES (Obsoleted), messageSize, renameSize);
5787+
5788+ auto maybeDomainKind = decodeDomainKind (rawDomainKind);
5789+ if (!maybeDomainKind)
5790+ return llvm::make_error<InvalidEnumValueError>(rawDomainKind, " AvailabilityDomainKind" );
57455791
57465792 auto maybePlatform = platformFromUnsigned (rawPlatform);
57475793 if (!maybePlatform.has_value ())
57485794 return llvm::make_error<InvalidEnumValueError>(rawPlatform, " PlatformKind" );
57495795
5750- PlatformKind platform = maybePlatform. value () ;
5751-
5796+ AvailabilityDomainKind domainKind = *maybeDomainKind ;
5797+ PlatformKind platform = *maybePlatform;
57525798 StringRef message = blobData.substr (0 , messageSize);
57535799 blobData = blobData.substr (messageSize);
57545800 StringRef rename = blobData.substr (0 , renameSize);
@@ -5767,23 +5813,19 @@ DeclDeserializer::readAvailable_DECL_ATTR(SmallVectorImpl<uint64_t> &scratch,
57675813 else
57685814 kind = AvailableAttr::Kind::Default;
57695815
5770- AvailabilityDomain domain;
5771- if (platform != PlatformKind::none) {
5772- domain = AvailabilityDomain::forPlatform (platform);
5773- } else if (!Introduced.empty () || !Deprecated.empty () || !Obsoleted.empty ()) {
5774- domain = isPackageDescriptionVersionSpecific
5775- ? AvailabilityDomain::forPackageDescription ()
5776- : AvailabilityDomain::forSwiftLanguage ();
5777- } else if (isForEmbedded) {
5778- domain = AvailabilityDomain::forEmbedded ();
5779- } else {
5780- domain = AvailabilityDomain::forUniversal ();
5816+ Decl *domainDecl = nullptr ;
5817+ if (domainDeclID) {
5818+ SET_OR_RETURN_ERROR (domainDecl, MF.getDeclChecked (domainDeclID));
57815819 }
57825820
5821+ auto domain = decodeAvailabilityDomain (domainKind, platform, domainDecl, ctx);
5822+ if (!domain)
5823+ return llvm::make_error<InavalidAvailabilityDomainError>();
5824+
57835825 auto attr = new (ctx)
5784- AvailableAttr (SourceLoc (), SourceRange (), domain, SourceLoc (), kind, message, rename ,
5785- Introduced, SourceRange (), Deprecated , SourceRange (),
5786- Obsoleted, SourceRange (), isImplicit, isSPI);
5826+ AvailableAttr (SourceLoc (), SourceRange (), * domain, SourceLoc (), kind,
5827+ message, rename, Introduced , SourceRange (), Deprecated ,
5828+ SourceRange (), Obsoleted, SourceRange (), isImplicit, isSPI);
57875829 return attr;
57885830}
57895831
0 commit comments