@@ -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// /
@@ -5727,35 +5729,79 @@ ModuleFile::getDeclChecked(
57275729 return declOrOffset;
57285730}
57295731
5732+ static std::optional<AvailabilityDomainKind>
5733+ decodeDomainKind (uint8_t kind) {
5734+ switch (kind) {
5735+ case static_cast <uint8_t >(AvailabilityDomainKind::Universal):
5736+ return AvailabilityDomainKind::Universal;
5737+ case static_cast <uint8_t >(AvailabilityDomainKind::SwiftLanguage):
5738+ return AvailabilityDomainKind::SwiftLanguage;
5739+ case static_cast <uint8_t >(AvailabilityDomainKind::PackageDescription):
5740+ return AvailabilityDomainKind::PackageDescription;
5741+ case static_cast <uint8_t >(AvailabilityDomainKind::Embedded):
5742+ return AvailabilityDomainKind::Embedded;
5743+ case static_cast <uint8_t >(AvailabilityDomainKind::Platform):
5744+ return AvailabilityDomainKind::Platform;
5745+ case static_cast <uint8_t >(AvailabilityDomainKind::Custom):
5746+ return AvailabilityDomainKind::Custom;
5747+ default :
5748+ return std::nullopt ;
5749+ }
5750+ }
5751+
5752+ static std::optional<AvailabilityDomain>
5753+ decodeAvailabilityDomain (AvailabilityDomainKind domainKind,
5754+ PlatformKind platformKind, Decl *decl,
5755+ const ASTContext &ctx) {
5756+ switch (domainKind) {
5757+ case AvailabilityDomainKind::Universal:
5758+ return AvailabilityDomain::forUniversal ();
5759+ case AvailabilityDomainKind::SwiftLanguage:
5760+ return AvailabilityDomain::forSwiftLanguage ();
5761+ case AvailabilityDomainKind::PackageDescription:
5762+ return AvailabilityDomain::forPackageDescription ();
5763+ case AvailabilityDomainKind::Embedded:
5764+ return AvailabilityDomain::forEmbedded ();
5765+ case AvailabilityDomainKind::Platform:
5766+ return AvailabilityDomain::forPlatform (platformKind);
5767+ case AvailabilityDomainKind::Custom:
5768+ return AvailabilityDomain::forCustom (decl, ctx);
5769+ }
5770+ }
5771+
57305772Expected<AvailableAttr *>
57315773DeclDeserializer::readAvailable_DECL_ATTR (SmallVectorImpl<uint64_t > &scratch,
57325774 StringRef blobData) {
57335775 bool isImplicit;
57345776 bool isUnavailable;
57355777 bool isDeprecated;
57365778 bool isNoAsync;
5737- bool isPackageDescriptionVersionSpecific;
57385779 bool isSPI;
5739- bool isForEmbedded;
5780+ uint8_t rawDomainKind;
5781+ unsigned rawPlatform;
5782+ DeclID domainDeclID;
57405783 DEF_VER_TUPLE_PIECES (Introduced);
57415784 DEF_VER_TUPLE_PIECES (Deprecated);
57425785 DEF_VER_TUPLE_PIECES (Obsoleted);
5743- unsigned rawPlatform, messageSize, renameSize;
5786+ unsigned messageSize, renameSize;
57445787
57455788 // Decode the record, pulling the version tuple information.
57465789 serialization::decls_block::AvailableDeclAttrLayout::readRecord (
5747- scratch, isImplicit, isUnavailable, isDeprecated, isNoAsync,
5748- isPackageDescriptionVersionSpecific, isSPI, isForEmbedded ,
5790+ scratch, isImplicit, isUnavailable, isDeprecated, isNoAsync, isSPI,
5791+ rawDomainKind, rawPlatform, domainDeclID ,
57495792 LIST_VER_TUPLE_PIECES (Introduced), LIST_VER_TUPLE_PIECES (Deprecated),
5750- LIST_VER_TUPLE_PIECES (Obsoleted), rawPlatform, messageSize,
5751- renameSize);
5793+ LIST_VER_TUPLE_PIECES (Obsoleted), messageSize, renameSize);
5794+
5795+ auto maybeDomainKind = decodeDomainKind (rawDomainKind);
5796+ if (!maybeDomainKind)
5797+ return llvm::make_error<InvalidEnumValueError>(rawDomainKind, " AvailabilityDomainKind" );
57525798
57535799 auto maybePlatform = platformFromUnsigned (rawPlatform);
57545800 if (!maybePlatform.has_value ())
57555801 return llvm::make_error<InvalidEnumValueError>(rawPlatform, " PlatformKind" );
57565802
5757- PlatformKind platform = maybePlatform. value () ;
5758-
5803+ AvailabilityDomainKind domainKind = *maybeDomainKind ;
5804+ PlatformKind platform = *maybePlatform;
57595805 StringRef message = blobData.substr (0 , messageSize);
57605806 blobData = blobData.substr (messageSize);
57615807 StringRef rename = blobData.substr (0 , renameSize);
@@ -5774,23 +5820,19 @@ DeclDeserializer::readAvailable_DECL_ATTR(SmallVectorImpl<uint64_t> &scratch,
57745820 else
57755821 kind = AvailableAttr::Kind::Default;
57765822
5777- AvailabilityDomain domain;
5778- if (platform != PlatformKind::none) {
5779- domain = AvailabilityDomain::forPlatform (platform);
5780- } else if (!Introduced.empty () || !Deprecated.empty () || !Obsoleted.empty ()) {
5781- domain = isPackageDescriptionVersionSpecific
5782- ? AvailabilityDomain::forPackageDescription ()
5783- : AvailabilityDomain::forSwiftLanguage ();
5784- } else if (isForEmbedded) {
5785- domain = AvailabilityDomain::forEmbedded ();
5786- } else {
5787- domain = AvailabilityDomain::forUniversal ();
5823+ Decl *domainDecl = nullptr ;
5824+ if (domainDeclID) {
5825+ SET_OR_RETURN_ERROR (domainDecl, MF.getDeclChecked (domainDeclID));
57885826 }
57895827
5828+ auto domain = decodeAvailabilityDomain (domainKind, platform, domainDecl, ctx);
5829+ if (!domain)
5830+ return llvm::make_error<InavalidAvailabilityDomainError>();
5831+
57905832 auto attr = new (ctx)
5791- AvailableAttr (SourceLoc (), SourceRange (), domain, SourceLoc (), kind, message, rename ,
5792- Introduced, SourceRange (), Deprecated , SourceRange (),
5793- Obsoleted, SourceRange (), isImplicit, isSPI);
5833+ AvailableAttr (SourceLoc (), SourceRange (), * domain, SourceLoc (), kind,
5834+ message, rename, Introduced , SourceRange (), Deprecated ,
5835+ SourceRange (), Obsoleted, SourceRange (), isImplicit, isSPI);
57945836 return attr;
57955837}
57965838
0 commit comments